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' }) ); } }