142 lines
4.2 KiB
JavaScript
142 lines
4.2 KiB
JavaScript
import { LightningElement, api } from 'lwc';
|
|
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
|
|
import getDocGenPreview from '@salesforce/apex/CLMAdminService.getDocGenPreview';
|
|
import listAccountSettings from '@salesforce/apex/CLMAdminService.listAccountSettings';
|
|
import listLetterSettings from '@salesforce/apex/CLMAdminService.listLetterSettings';
|
|
|
|
export default class ClmRequestPreview extends LightningElement {
|
|
@api recordId;
|
|
@api objectApiName;
|
|
|
|
accountCode = '';
|
|
letterCode = '';
|
|
accountOptions = [];
|
|
letterOptions = [];
|
|
preview;
|
|
isBusy = false;
|
|
message = '';
|
|
messageVariant = 'info';
|
|
|
|
connectedCallback() {
|
|
this.initialize();
|
|
}
|
|
|
|
get hasPreview() {
|
|
return Boolean(this.preview);
|
|
}
|
|
|
|
get resultClass() {
|
|
return `result result-${this.messageVariant}`;
|
|
}
|
|
|
|
async initialize(forceReload = false) {
|
|
if (!this.recordId) {
|
|
return;
|
|
}
|
|
|
|
this.isBusy = true;
|
|
this.clearMessage();
|
|
|
|
try {
|
|
const accounts = await listAccountSettings();
|
|
this.accountOptions = (accounts || []).map((account) => ({
|
|
label: account.accountDisplayName,
|
|
value: account.accountCode
|
|
}));
|
|
|
|
if ((!this.accountCode || forceReload) && this.accountOptions.length > 0) {
|
|
this.accountCode = this.accountOptions[0].value;
|
|
}
|
|
|
|
await this.loadLetterOptions(forceReload);
|
|
await this.loadPreview();
|
|
} catch (error) {
|
|
this.handleError(error, 'Unable to initialize CLM preview');
|
|
} finally {
|
|
this.isBusy = false;
|
|
}
|
|
}
|
|
|
|
async loadLetterOptions(forceReload) {
|
|
const letters = await listLetterSettings({ accountCode: this.accountCode });
|
|
this.letterOptions = (letters || []).map((letter) => ({
|
|
label: letter.letterDisplayName,
|
|
value: letter.letterCode
|
|
}));
|
|
|
|
const hasExistingSelection = this.letterOptions.some((letter) => letter.value === this.letterCode);
|
|
if (!hasExistingSelection || forceReload || !this.letterCode) {
|
|
const defaultLetter = (letters || []).find((letter) => letter.isDefault);
|
|
this.letterCode = defaultLetter
|
|
? defaultLetter.letterCode
|
|
: this.letterOptions.length > 0
|
|
? this.letterOptions[0].value
|
|
: '';
|
|
}
|
|
}
|
|
|
|
async loadPreview() {
|
|
if (!this.recordId) {
|
|
this.showMessage('No record context — place this component on a record page.', 'warning');
|
|
return;
|
|
}
|
|
this.preview = await getDocGenPreview({
|
|
appraiserCaseId: this.recordId,
|
|
accountCode: this.accountCode,
|
|
letterCode: this.letterCode
|
|
});
|
|
this.showMessage('Preview loaded.', 'success');
|
|
}
|
|
|
|
async handleAccountChange(event) {
|
|
this.accountCode = event.detail.value;
|
|
await this.refreshAll(true);
|
|
}
|
|
|
|
async handleLetterChange(event) {
|
|
this.letterCode = event.detail.value;
|
|
await this.refreshAll(false);
|
|
}
|
|
|
|
async refreshAll(forceReloadLetters) {
|
|
this.isBusy = true;
|
|
this.clearMessage();
|
|
|
|
try {
|
|
if (forceReloadLetters) {
|
|
await this.loadLetterOptions(true);
|
|
}
|
|
await this.loadPreview();
|
|
} catch (error) {
|
|
this.handleError(error, 'Unable to refresh CLM preview');
|
|
} finally {
|
|
this.isBusy = false;
|
|
}
|
|
}
|
|
|
|
clearMessage() {
|
|
this.message = '';
|
|
this.messageVariant = 'info';
|
|
}
|
|
|
|
showMessage(message, variant) {
|
|
this.message = message;
|
|
this.messageVariant = variant;
|
|
}
|
|
|
|
handleError(error, title) {
|
|
const bodyMessage = error && error.body ? error.body.message : null;
|
|
const directMessage = error ? error.message : null;
|
|
const message = bodyMessage || directMessage || 'Unknown error';
|
|
|
|
this.showMessage(message, 'error');
|
|
this.dispatchEvent(
|
|
new ShowToastEvent({
|
|
title,
|
|
message,
|
|
variant: 'error'
|
|
})
|
|
);
|
|
}
|
|
}
|