salesforce-appraiser-review.../force-app/main/default/lwc/clmRequestPreview/clmRequestPreview.js

138 lines
4.0 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() {
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'
})
);
}
}