cat-documents-ng 1.0.52 → 1.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"cat-documents-ng.mjs","sources":["../../../projects/cat-document-lib/src/Shared/constant/SHARED.ts","../../../projects/cat-document-lib/src/Shared/constant/ERROR.ts","../../../projects/cat-document-lib/src/Shared/constant/URLS.ts","../../../projects/cat-document-lib/src/lib/document/state/document.state.ts","../../../projects/cat-document-lib/src/lib/document/state/document.store.ts","../../../projects/cat-document-lib/src/Shared/services/app-config.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-http.service.ts","../../../projects/cat-document-lib/src/lib/document/state/document.query.ts","../../../projects/cat-document-lib/src/lib/document/services/document-menu.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document.service.ts","../../../projects/cat-document-lib/src/lib/document/state/document.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload.service.ts","../../../projects/cat-document-lib/src/lib/document/services/file-format.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload-business.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload-form.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload-data.service.ts","../../../projects/cat-document-lib/src/lib/document/components/document-upload/document-upload.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-upload/document-upload.component.html","../../../projects/cat-document-lib/src/Shared/services/session.service.ts","../../../projects/cat-document-lib/src/lib/document/components/request-document/request-document.component.ts","../../../projects/cat-document-lib/src/lib/document/components/request-document/request-document.component.html","../../../projects/cat-document-lib/src/lib/document/services/status-calculator.service.ts","../../../projects/cat-document-lib/src/lib/document/components/document-status/document-status.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-status/document-status.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-search/document-search.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-search/document-search.component.html","../../../projects/cat-document-lib/src/Shared/components/confirmation-dialog/confirmation-dialog.component.ts","../../../projects/cat-document-lib/src/Shared/components/confirmation-dialog/confirmation-dialog.component.html","../../../projects/cat-document-lib/src/lib/document/components/sidebar/sidebar.component.ts","../../../projects/cat-document-lib/src/lib/document/components/sidebar/sidebar.component.html","../../../projects/cat-document-lib/src/lib/document/components/folder-container/folder-container.component.ts","../../../projects/cat-document-lib/src/lib/document/components/folder-container/folder-container.component.html","../../../projects/cat-document-lib/src/lib/document/services/document-table-builder.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-list.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-scroll.service.ts","../../../projects/cat-document-lib/src/Shared/components/table-primary/table-primary.component.ts","../../../projects/cat-document-lib/src/Shared/components/table-primary/table-primary.component.html","../../../projects/cat-document-lib/src/lib/document/services/document-viewer.service.ts","../../../projects/cat-document-lib/src/lib/document/constant/DOCUMENT_HISTORY.ts","../../../projects/cat-document-lib/src/lib/document/services/document-history-style.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-history.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-actions.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-history-ai.service.ts","../../../projects/cat-document-lib/src/lib/document/directives/permission.directive.ts","../../../projects/cat-document-lib/src/lib/document/components/document-ai-chat/document-ai-chat.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-ai-chat/document-ai-chat.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-history/document-history.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-history/document-history.component.html","../../../projects/cat-document-lib/src/lib/document/services/excel-parser.service.ts","../../../projects/cat-document-lib/src/lib/document/services/csv-parser.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-zoom.service.ts","../../../projects/cat-document-lib/src/lib/document/components/document-zoom-controls/document-zoom-controls.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-zoom-controls/document-zoom-controls.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-content-viewer/document-content-viewer.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-content-viewer/document-content-viewer.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-actions/document-actions.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-actions/document-actions.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-viewer/document-viewer.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-viewer/document-viewer.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-list/document-list.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-list/document-list.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-container/document-container.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-container/document-container.component.html","../../../projects/cat-document-lib/src/lib/document/components/folder-block/folder-block.component.ts","../../../projects/cat-document-lib/src/lib/document/components/folder-block/folder-block.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-list-item/document-list-item.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-list-item/document-list-item.component.html","../../../projects/cat-document-lib/src/Shared/services/global-error.handler.ts","../../../projects/cat-document-lib/src/lib/document/directives/document.directive.ts","../../../projects/cat-document-lib/src/lib/document/components/linked-document/linked-document.component.ts","../../../projects/cat-document-lib/src/lib/document/components/linked-document/linked-document.component.html","../../../projects/cat-document-lib/src/lib/document/components/documents-menu/documents-menu.component.ts","../../../projects/cat-document-lib/src/lib/document/components/documents-menu/documents-menu.component.html","../../../projects/cat-document-lib/src/lib/document/services/user-list.service.ts","../../../projects/cat-document-lib/src/lib/document/components/user-list/user-list.component.ts","../../../projects/cat-document-lib/src/lib/document/components/user-list/user-list.component.html","../../../projects/cat-document-lib/src/Shared/shared.module.ts","../../../projects/cat-document-lib/src/lib/document/services/document-content-type.service.ts","../../../projects/cat-document-lib/src/lib/document/document.module.ts","../../../projects/cat-document-lib/src/lib/document/services/eml-parser.service.ts","../../../projects/cat-document-lib/src/public-api.ts","../../../projects/cat-document-lib/src/cat-documents-ng.ts"],"sourcesContent":["/**\r\n * The `SHARED` class contains shared constants used across the application.\r\n * These constants are related to document statuses and other shared data.\r\n */\r\nexport class SHARED {\r\n\r\n /**\r\n * Represents the info.\r\n */\r\n static UNKNOWN_USER = 'Unknown User'\r\n /**\r\n * Represents the info.\r\n */\r\n static ACTIONS = 'actions'\r\n /**\r\n * Represents the info.\r\n */\r\n static VISIBLE = 'visible'\r\n /**\r\n * Represents the info.\r\n */\r\n static HIDDEN = 'hidden'\r\n\r\n static NO_DOCUMENTS_FOUND = 'No documents found'\r\n static DOCUMENT_TYPES_DELETE = 'DocumentTypes-DELETE'\r\n static SUCCESS_MESSAGE = 'Document Saved Successfully'\r\n /**\r\n * Represents the info.\r\n */\r\n static APPLICATION_DOCS = 'Application Docs'\r\n /**\r\n * Represents the info.\r\n */\r\n static INFO = 'info'\r\n /**\r\n * Represents the success.\r\n */\r\n static SUCCESS = 'success'\r\n /**\r\n * Represents the warning.\r\n */\r\n static WARNING = 'warning'\r\n /**\r\n * Represents the warning.\r\n */\r\n static DANGER = 'danger'\r\n /**\r\n * Represents the stores userData.\r\n */\r\n static SESSIONKEY = 'userData';\r\n /**\r\n * Represents the count of missing files.\r\n */\r\n static MISSINGCOUNT = 2;\r\n\r\n /**\r\n * Represents the count of pending files.\r\n */\r\n static PENDINGCOUNT = 3;\r\n\r\n /**\r\n * Represents an empty string.\r\n */\r\n static EMPTY = \"\";\r\n /**\r\n * Represents an empty string.\r\n */\r\n static STRING = \"string\";\r\n\r\n /**\r\n * Represents an true.\r\n * @static\r\n * @type {boolean}\r\n */\r\n static TRUE: boolean = true;\r\n\r\n\r\n /**\r\n * Represents an false.\r\n * @static\r\n * @type {boolean}\r\n */\r\n static FALSE: boolean = false;\r\n\r\n /**\r\n * Represents an INITIAL_COUNT.\r\n */\r\n static INITIAL_COUNT = 0\r\n /**\r\n * Represents an INITIAL_VALUE.\r\n */\r\n static INITIAL_VALUE = 0\r\n\r\n /**\r\n * Represents the constant value for one (1).\r\n * @static\r\n * @type {number}\r\n */\r\n static ONE: number = 1\r\n\r\n /**\r\n * Represents the constant value for two (2).\r\n * @static\r\n * @type {number}\r\n */\r\n static TWO: number = 2\r\n\r\n /**\r\n * Represents the constant value for ten (10).\r\n * @static\r\n * @type {number}\r\n */\r\n static TEN: number = 10\r\n\r\n /**\r\n * Represents the constant string value 'files' used for file-related operations.\r\n * @static\r\n * @type {string}\r\n */\r\n static FILE: string = 'file';\r\n\r\n static MSG = 'msg'\r\n static EML = 'eml'\r\n\r\n /**\r\n * Query parameter for menu item filter.\r\n * @static\r\n * @type {string}\r\n */\r\n static MENU_ITEM_PARAM: string = 'menuItem';\r\n\r\n /**\r\n * Query parameter for user ID filter.\r\n * @static\r\n * @type {string}\r\n */\r\n static USER_ID_PARAM: string = 'userId';\r\n\r\n /**\r\n * Query parameter for status filter.\r\n * @static\r\n * @type {string}\r\n */\r\n static STATUS_PARAM: string = 'status';\r\n\r\n /**\r\n * Represents the array of file size units ('B', 'KB', 'MB') used for file size formatting.\r\n * @static\r\n * @type {string[]}\r\n */\r\n static FILE_SIZE_UNITS: string[] = ['B', 'KB', 'MB'];\r\n\r\n /**\r\n * Show SEVERITY value.\r\n * @static\r\n * @type {'error'}\r\n */\r\n static SEVERITY: string = 'error'\r\n /**\r\n * Show SEVERITY value.\r\n * @static\r\n * @type {'error'}\r\n */\r\n static SUCCESS_SEVERITY: string = 'success'\r\n\r\n /**\r\n * Show upload summery if it's failed.\r\n * @static\r\n * @type {'Upload Failed'}\r\n */\r\n static UPLOAD_SUMMERY: string = 'Upload Failed'\r\n\r\n /**\r\n * Show upload summery if it's success.\r\n * @static\r\n * @type {'Document uploaded successfully.'}\r\n */\r\n static UPLOAD_SUCCESS: string = 'Document uploaded successfully.'\r\n\r\n /**\r\n * Represent empty array.\r\n * @static\r\n * @type {{}}\r\n */\r\n static EMPTY_ARRAY = []\r\n\r\n /**\r\n * Represent contextId.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONTEXT_ID: string = 'contextId'\r\n\r\n /**\r\n * Represent contextId.\r\n * @static\r\n * @type {string}\r\n */\r\n static CATEGORY: string = 'category'\r\n\r\n /**\r\n * Represent fileSize.\r\n * @static\r\n * @type {string}\r\n */\r\n static FILE_SIZE: string = 'fileSize'\r\n /**\r\n * Represent documentName.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_NAME: string = 'documentName'\r\n /**\r\n * Represent documentTypeId.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_TYPE_ID: string = 'documentTypeId'\r\n /**\r\n * Represent blob.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT: string = 'document';\r\n /**\r\n * Config `name` for documents AI chat (Configs API). When `data.enabled` is true, the AI control and sidebar show.\r\n * Matches the host app pattern used for `document` tab and `mortgageChatbot` visibility.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_CHATBOT: string = 'docIntelligence';\r\n /**\r\n * Represent none.\r\n * @static\r\n * @type {string}\r\n */\r\n static NONE: string = 'none';\r\n\r\n /**\r\n * Represent upload summery.\r\n * @static\r\n * @type {string}\r\n */\r\n static UPLOAD_ERROR_SUMMERY: string = 'Form Data Missing'\r\n\r\n /**\r\n * Represent upload error details.\r\n * @static\r\n * @type {string}\r\n */\r\n static UPLOAD_ERROR_DETAILS: string = 'Required form data is missing. Please ensure the document and all required fields are provided.'\r\n\r\n /**\r\n * Represents the message prefix for a successful document name update.\r\n * @static\r\n * @type {string}\r\n */\r\n static UPDATE_DOCUMENT_NAME: string = 'Document name updated for ID:'\r\n static WIDTH = '500px'\r\n static BASEZINDEX = 1000\r\n static DOCX = 'docx'\r\n static DOC = 'doc'\r\n static CSV = 'csv'\r\n static CLOSE_ICON = 'pi pi-times'\r\n static SAVE = 'Save'\r\n static UPLOAD_PROGRESS_100 = 100\r\n static UPLOAD_PROGRESS_10 = 10\r\n static APPLICANT = 'Applicant'\r\n static APPLICANT_LOWERCASE = 'applicant'\r\n static APPLICATION_LOWERCASE = 'application'\r\n static DOCUMENT_LOWERCASE = 'document'\r\n static USER_LOWERCASE = 'user'\r\n static CATAGORIES = 'catagories'\r\n static DOCUMENTS = 'Documents'\r\n static UPLOAD_FAILED = 'Upload failed'\r\n static USER_LIST = 'userList'\r\n static HYPEN = '-'\r\n static CATEGORIES = 'categories'\r\n static UNSAVED_CHANGES_MESSAGE = 'You have unsaved changes. Are you sure you want to leave?'\r\n static UNSAVED_CHANGES_HEADER = 'Unsaved Changes'\r\n static DOCUMENT_DELETED_SUCCESSFULLY = 'Document deleted successfully'\r\n static UNSAVED_CHANGES_ICON = 'pi pi-exclamation-triangle'\r\n static REMOVE = 'Remove'\r\n static YES = 'Yes'\r\n static NO = 'No'\r\n static CANCEL = 'Cancel'\r\n static DELETE = 'Delete'\r\n static DELETE_CONFIRMATION_HEADER = 'Delete Confirmation'\r\n static VALUATION_REPORT_DELETE_MESSAGE = 'The deletion of the valuation document will remove all valuation related alerts. New alerts will only be created when a new valuation report is added. Do you want to continue?'\r\n static VALUATION_REPORT = 'valuation report'\r\n static DELETE_BUTTON_STYLE_CLASS = 'btn-danger'\r\n static ACCEPT_ICON = 'pi pi-check'\r\n static REJECT_ICON = 'pi pi-times'\r\n static ACCEPT_BUTTON_STYLE_CLASS = 'p-button-danger'\r\n static REJECT_BUTTON_STYLE_CLASS = 'p-button-secondary'\r\n static NO_DATA_FOUND = 'No data found'\r\n static BORDERS = ['top', 'bottom', 'left', 'right']\r\n static FILE_TYPES = [\r\n 'xlsx', 'xls', 'doc', 'docx', 'pdf', 'jpg', 'jpeg',\r\n 'odt', 'csv', 'png', 'msg', 'eml'\r\n ];\r\n static COMMA = ',';\r\n static TEAM_LEADER = 'TeamLeader';\r\n static UNDERWRITER_USER = 'Underwriter User';\r\n static INITIAL_REQUEST = 'Initial Request'\r\n static ERROR_PARSING_SHEET_DATA = 'Error parsing sheet data'\r\n static REFRESH_TRIGGER = 'refreshTrigger'\r\n static PDF_TYPE = 'application/pdf'\r\n\r\n // MIME Type Constants\r\n static EXCEL_XLSX_MIME_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n static EXCEL_XLS_MIME_TYPE = 'application/vnd.ms-excel'\r\n static OCTET_STREAM = 'application/octet-stream'\r\n static WORD_DOCX_MIME_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\r\n static WORD_DOC_MIME_TYPE = 'application/msword'\r\n static CSV_MIME_TYPE = 'text/csv'\r\n static EMAIL_RFC822_MIME_TYPE = 'message/rfc822'\r\n static EMAIL_OUTLOOK_MIME_TYPE = 'application/vnd.ms-outlook'\r\n static OPEN_DOCUMENT_MIME_TYPE = 'application/vnd.oasis.opendocument.text'\r\n\r\n static ICON_FILE_WORD = 'pi pi-file-word'\r\n static ICON_ENVELOPE = 'pi pi-envelope'\r\n static PDF_DOCUMENT = 'PDF Document'\r\n static IMAGE = 'Image'\r\n static EXCEL_SPREADSHEET = 'Excel Spreadsheet'\r\n static WORD_DOCUMENT = 'Word Document'\r\n static CSV_FILE = 'CSV File'\r\n static EMAIL_MESSAGE = 'Email Message'\r\n static OPEN_DOCUMENT = 'OpenDocument'\r\n static NO_DATA_AVAILABLE = 'No data available'\r\n static ERROR_PARSING_EXCEL_FILE = 'Unable to parse Excel file'\r\n static ERROR_PARSING_EXCEL_FILE_STRUCTURE = 'Unable to parse Excel file structure'\r\n static NAME_UPDATE_ACTION = 'nameUpdate'\r\n static REQUESTED = 'requested'\r\n static ACCEPTED = 'accepted'\r\n static UPLOADED = 'uploaded'\r\n static REJECTED = 'rejected'\r\n static Menu = [\r\n {\r\n label: 'Applicant',\r\n // expanded: true,\r\n // disabled: true,\r\n // separator: true,\r\n items: [\r\n {\r\n label: 'Identity',\r\n icon: 'ri-id-card-line',\r\n badge: \"2/5\"\r\n },\r\n {\r\n label: 'Income',\r\n icon: 'ri-money-pound-circle-line',\r\n badge: \"2/5\"\r\n },\r\n {\r\n label: 'Affordability',\r\n icon: 'ri-calculator-line',\r\n badge: \"2/8\"\r\n },\r\n {\r\n label: 'Cradit conduct',\r\n icon: 'ri-calendar-event-fill',\r\n badge: \"2/4\"\r\n },\r\n {\r\n label: 'KYC',\r\n icon: 'ri-calendar-event-fill',\r\n badge: \"2/4\"\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Welcome Call',\r\n icon: 'ri-calendar-event-fill'\r\n },\r\n {\r\n label: 'Gatehouse Bank Exposure',\r\n badge: \"2/4\",\r\n icon: 'ri-calendar-event-fill'\r\n }\r\n ]\r\n },\r\n {\r\n label: 'Application',\r\n // expanded: true,\r\n // disabled: true,\r\n // separator: true,\r\n items: [\r\n {\r\n badge: \"2/4\",\r\n label: 'Deposit',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Direct Debit',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n label: 'Property',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Completions',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Summary',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'System Documents',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Ad Hoc',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Miscellaneous',\r\n icon: 'ri-mail-open-line'\r\n }\r\n ]\r\n }\r\n ];\r\n static APPLICATION = 'Application'\r\n static APPLICANTS = 'Applicants'\r\n static EMPTY_SPACE = ' '\r\n\r\n static COLORS = ['orange', 'blue', 'green', 'grey', 'purple']\r\n\r\n static COLOR_MAP = {\r\n 'orange': '#f97316',\r\n 'blue': '#3b82f6',\r\n 'green': '#10b981',\r\n 'grey': '#6b7280',\r\n 'purple': '#8b5cf6'\r\n }\r\n static DEFAULT_COLOR = '#3b82f6'\r\n static STATUS_WITH_DASH = 'status-'\r\n static ICON_WITH_DASH = 'icon-'\r\n static SEARCH_KEY = 'searchKey'\r\n static APPROVED = 'approved'\r\n static PENDING = 'Pending'\r\n static DOT = '.'\r\n static PDF = 'PDF'\r\n static PDF2 = 'pdf'\r\n static PENDING_STATUS = 'pending'\r\n static EVENT_REQUESTED = 'event-requested'\r\n static EVENT_ACCEPTED = 'event-accepted'\r\n static EVENT_REJECTED = 'event-rejected'\r\n static EVENT_DEFAULT = 'event-default'\r\n static ICON_REQUESTED = 'icon-requested'\r\n static ICON_ACCEPTED = 'icon-accepted'\r\n static ICON_REJECTED = 'icon-rejected'\r\n static ICON_DEFAULT = 'icon-default'\r\n static ICON_CHECK_CIRCLE = 'pi pi-check-circle'\r\n static ICON_FOLDER_PLUS = 'pi pi-folder-plus'\r\n static ICON_TIMES = 'pi pi-times'\r\n static ICON_FILE = 'pi pi-file'\r\n // File extension constants\r\n static JPG = 'JPG'\r\n static PNG = 'PNG'\r\n static XLSX = 'xlsx'\r\n static XLS = 'xls'\r\n // Status constants\r\n static APPROVED_STATUS = 'approved'\r\n static ALERT_STATUS = 'alert'\r\n static UPLOADED_STATUS = 'uploaded'\r\n static REVIEWING_STATUS = 'reviewing'\r\n static REJECTED_STATUS = 'rejected'\r\n static REQUESTED_STATUS = 'document requested'\r\n\r\n // Status class constants\r\n static STATUS_PENDING_CLASS = 'status-pending'\r\n static STATUS_APPROVED_CLASS = 'status-approved'\r\n static STATUS_ALERT_CLASS = 'status-alert'\r\n static STATUS_UPLOADED_CLASS = 'status-uploaded'\r\n static STATUS_REVIEWING_CLASS = 'status-reviewing'\r\n static STATUS_REJECTED_CLASS = 'status-rejected'\r\n\r\n // Icon constants\r\n static ICON_CHECK = 'pi pi-check'\r\n static ICON_EXCLAMATION_TRIANGLE = 'pi pi-exclamation-triangle'\r\n static ICON_CLOUD_UPLOAD = 'pi pi-cloud-upload'\r\n static ICON_EYE = 'pi pi-eye'\r\n static ICON_CLOCK = 'pi pi-clock'\r\n\r\n // File type icons\r\n static ICON_FILE_PDF = 'pi pi-file-pdf'\r\n static ICON_IMAGE = 'pi pi-image'\r\n static ICON_FILE_EXCEL = 'pi pi-file-excel'\r\n static ICON_DELETE = 'ri-delete-bin-6-line'\r\n\r\n // Cell type constants\r\n static CELL_TYPE_DOCUMENT = 'document'\r\n static CELL_TYPE_STATUS = 'status'\r\n static CELL_TYPE_ACTIONS = 'actions'\r\n static CELL_TYPE_TEXT = 'text'\r\n\r\n /**\r\n * Document table columns configuration\r\n * @static\r\n * @type {Array<{field: string, header: string, type: 'text' | 'status' | 'document' | 'actions', width: string}>}\r\n */\r\n static DOCUMENT_TABLE_COLUMNS: Array<{\r\n field: string;\r\n header: string;\r\n type: 'text' | 'status' | 'document' | 'actions';\r\n width: string;\r\n }> = [\r\n {\r\n field: 'docName',\r\n header: 'Document',\r\n type: 'document',\r\n width: '35%'\r\n },\r\n {\r\n field: 'status',\r\n header: 'Status',\r\n type: 'status',\r\n width: '15%'\r\n },\r\n {\r\n field: 'notes',\r\n header: 'Notes',\r\n type: 'text',\r\n width: '15%'\r\n },\r\n {\r\n field: 'uploadedOn',\r\n header: 'Uploaded',\r\n type: 'text',\r\n width: '20%'\r\n },\r\n {\r\n field: 'actions',\r\n header: 'Actions',\r\n type: 'actions',\r\n width: '15%'\r\n }\r\n ];\r\n\r\n static DOCUMENT_REQUESTED = 'document-requested';\r\n static DOCUMENT_UPLOADED = 'document-uploaded';\r\n static DOCUMENT_REJECTED = 'document-rejected';\r\n static DOCUMENT_ACCEPTED = 'document-accepted';\r\n\r\n // Document Actions Constants\r\n static ACCEPT_ACTION = 'accept';\r\n static REJECT_ACTION = 'reject';\r\n static DELETE_ACTION = 'delete';\r\n\r\n static ACCEPT_CONFIRM_HEADER = 'Accept confirm';\r\n static REJECT_CONFIRM_HEADER = 'Reject Confirm';\r\n\r\n static ACCEPT_NOTE_LABEL = 'Write a note for Acceptance';\r\n static REJECT_NOTE_LABEL = 'Write a note for rejection';\r\n\r\n static ACCEPT_NOTE_PLACEHOLDER = 'Write a note for Acceptance';\r\n static REJECT_NOTE_PLACEHOLDER = 'Write a note for rejection';\r\n\r\n static CANCEL_BUTTON_LABEL = 'Cancel';\r\n static ACCEPT_BUTTON_LABEL = 'Accept';\r\n static REJECT_BUTTON_LABEL = 'Reject';\r\n\r\n static DOCUMENT_ACCEPTED_MESSAGE = 'Document accepted successfully';\r\n static DOCUMENT_REJECTED_MESSAGE = 'Document rejected successfully';\r\n static DOCUMENT_UPDATE_ERROR_MESSAGE = 'Failed to update document. Please try again.';\r\n\r\n static STATUS_APPROVED = 'Approved';\r\n static STATUS_REJECTED = 'Rejected';\r\n\r\n // Document Status Constants\r\n static STATUS_PENDING = 'pending';\r\n static STATUS_ACCEPTED = 'accepted';\r\n static STATUS_REJECTED_LOWERCASE = 'rejected';\r\n static STATUS_DECLINED = 'declined';\r\n\r\n // Document Card CSS Classes\r\n static CARD_PENDING = 'pending-card';\r\n static CARD_ACCEPTED = 'accepted-card';\r\n static CARD_REJECTED = 'rejected-card';\r\n\r\n // Document Button CSS Classes\r\n static BUTTON_SECONDARY_REJECT = 'secondary-reject';\r\n static BUTTON_PRIMARY_REJECT = 'primary-reject';\r\n static BUTTON_DEFAULT_REJECT = 'default-reject';\r\n static BUTTON_PRIMARY_ACCEPT = 'primary-accept';\r\n static BUTTON_SECONDARY_ACCEPT = 'secondary-accept';\r\n static BUTTON_DEFAULT_ACCEPT = 'default-accept';\r\n\r\n // Document Action Button Labels\r\n static BUTTON_LABEL_REJECT = 'Reject';\r\n static BUTTON_LABEL_REJECTED = 'Rejected';\r\n static BUTTON_LABEL_ACCEPT = 'Accept';\r\n static BUTTON_LABEL_ACCEPTED = 'Accepted';\r\n\r\n // Document Upload Validation Messages\r\n static VALIDATION_NO_APPLICANT_SELECTED = 'No Applicant Selected';\r\n static VALIDATION_NO_APPLICANT_DETAIL = 'Please select an applicant.';\r\n static VALIDATION_NO_CATEGORY_SELECTED = 'No Category Selected';\r\n static VALIDATION_NO_CATEGORY_DETAIL = 'Please select a category.';\r\n static VALIDATION_NO_DOCUMENT_TYPE_SELECTED = 'No Document Type Selected';\r\n static VALIDATION_NO_DOCUMENT_TYPE_DETAIL = 'Please select a document type.';\r\n static VALIDATION_NO_DOCUMENTS_UPLOADED = 'No Documents Uploaded';\r\n static VALIDATION_NO_DOCUMENTS_DETAIL = 'Please upload at least one document.';\r\n static VALIDATION_FORM_INCOMPLETE = 'Form Incomplete';\r\n static VALIDATION_FORM_INCOMPLETE_DETAIL = 'Please complete all required fields and upload at least one document.';\r\n static VALIDATION_MISSING_REQUIRED_DATA = 'Missing Required Data';\r\n\r\n // Document Upload Assignment Type Messages\r\n static VALIDATION_SELECT_ASSIGNMENT_TYPE = 'Please select an assignment type (Applicant or Application)';\r\n static VALIDATION_SELECT_CATEGORY = 'Please select a document category';\r\n static VALIDATION_SELECT_DOCUMENT_TYPE = 'Please select a document type';\r\n static VALIDATION_UPLOAD_AT_LEAST_ONE = 'Please upload at least one document';\r\n static VALIDATION_WAIT_FOR_UPLOAD = 'Please wait for all files to finish uploading';\r\n static VALIDATION_SELECT_APPLICANT = 'Please select an applicant';\r\n static VALIDATION_ALL_FIELDS_COMPLETED = 'All required fields are completed';\r\n static VALIDATION_OPTIONS_NOT_LOADED = 'Document options are not loaded yet';\r\n static CONTENT_TYPE: string = 'contentType'\r\n static DOCUMENT_URL: string = 'documentUrl'\r\n static DOC_VIEWER_WRAPPER: string = '.doc-viewer-wrapper'\r\n static CSV_TABLE_CONTAINER: string = '.csv-table-container'\r\n static DOCX_CONTAINER: string = '.docx-container'\r\n static PDF_CONTAINER: string = '.pdf-container'\r\n static IMAGE_CONTAINER: string = '.image-container'\r\n static WHEEL_CAPTURE_OVERLAY: string = '.wheel-capture-overlay'\r\n static DOCUMENT_CONTENT_VIEWER_CONTAINER: string = '.document-content-viewer-container'\r\n static EXCEL_ZOOM_WRAPPER: string = '.excel-zoom-wrapper ngx-doc-viewer'\r\n static DOC_ZOOM_WRAPPER: string = '.doc-viewer-wrapper'\r\n static CSV_ZOOM_WRAPPER: string = '.csv-table-container'\r\n static ERROR_PARSING_CSV_FILE: string = 'Error parsing CSV file'\r\n static ERROR_LOADING_CSV_FILE: string = 'Error loading CSV file'\r\n static ERROR_PARSING_CSV_DATA: string = 'Error parsing CSV data'\r\n static ERROR_PARSING_EMAIL_FILE: string = 'Error parsing email file'\r\n static ERROR_LOADING_EMAIL_FILE: string = 'Error loading email file'\r\n static SMOOTH_SCROLL: ScrollBehavior = 'smooth'\r\n static SUMMARY_PROMPT: string = 'Give me a clear, bullet-point summary of the key information in this document.'\r\n static INSIGHTS_PROMPT: string = 'What are the key insights and takeaways from this document? Provide a concise summary of the main points and any important details.'\r\n\r\n\r\n\r\n\r\n}\r\n\r\n/**\r\n * `DUMMYDOCUMENTLIST` is a mock list of document objects used for testing and development purposes.\r\n * Each document includes an ID, file name, status, and document URL.\r\n */\r\nexport const DUMMYDOCUMENTLIST = [\r\n {\r\n _id: 1,\r\n fileName: 'Document 1',\r\n status: 'pending',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n {\r\n _id: 2,\r\n fileName: 'Document 2',\r\n status: 'verified',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n {\r\n _id: 3,\r\n fileName: 'Document 3',\r\n status: 'sentReminder',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n {\r\n _id: 4,\r\n fileName: 'Document 4',\r\n status: 'pending',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n];\r\n\r\n/**\r\n * `FOLDERPANEL` is a mock list of folder data representing various folders in the application.\r\n * Each folder contains an ID, file count, text description, missing files count, and pending files count.\r\n */\r\nexport const USERLIST = [\r\n {\r\n _id : \"1\",\r\n username: \"John Smith\",\r\n approveDocumentCount: 15,\r\n pendingDocumentCount: 3\r\n },\r\n {\r\n _id : \"2\",\r\n username: \"Sarah Johnson\",\r\n approveDocumentCount: 8,\r\n pendingDocumentCount: 7\r\n },\r\n {\r\n _id : \"3\",\r\n username: \"Michael Brown\",\r\n approveDocumentCount: 22,\r\n pendingDocumentCount: 1\r\n },\r\n {\r\n _id : \"4\",\r\n username: \"Emily Davis\",\r\n approveDocumentCount: 12,\r\n pendingDocumentCount: 5\r\n }\r\n];\r\n\r\nexport const SAMPLE_STATUS_DATA = [\r\n {\r\n status: \"Approved\",\r\n count: 4,\r\n color: \"#10b981\",\r\n icon: \"pi pi-check\"\r\n },\r\n {\r\n status: \"Pending\",\r\n count: 5,\r\n color: \"#6b7280\",\r\n icon: \"pi pi-clock\"\r\n },\r\n {\r\n status: \"Reviewing\",\r\n count: 1,\r\n color: \"#f59e0b\",\r\n icon: \"pi pi-eye\"\r\n },\r\n {\r\n status: \"Rejected\",\r\n count: 2,\r\n color: \"#ef4444\",\r\n icon: \"pi pi-times\"\r\n },\r\n {\r\n status: \"Alert\",\r\n count: 12,\r\n color: \"#dc2626\",\r\n icon: \"pi pi-exclamation-circle\"\r\n }\r\n];\r\n\r\n/**\r\n * Dummy data for sumaery.\r\n * @type {{}}\r\n */\r\nexport const DUMMYSUMMARY = [\r\n {\r\n status: 'Valuation report requested on 10th Oct 2024',\r\n date: '15/10/2020 10:30',\r\n icon: 'pi pi-shopping-cart',\r\n color: '#9C27B0',\r\n image: 'game-controller.jpg',\r\n },\r\n {\r\n status: 'Valuation report received on 13th Oct 2024',\r\n date: '15/10/2020 14:00',\r\n icon: 'pi pi-cog',\r\n color: '#673AB7',\r\n },\r\n {\r\n status: 'Waiting for Valuation Report to be accepted',\r\n date: '15/10/2020 16:15',\r\n icon: 'pi pi-shopping-cart',\r\n color: '#FF9800',\r\n },\r\n];\r\n\r\n/**\r\n * Dummy data for list box.\r\n * @type {{}}\r\n */\r\nexport const COUNTRIES = [\r\n { name: 'Any Word', code: 'NY', checked: false },\r\n { name: 'Case Sensitive', code: 'RM', checked: false },\r\n { name: 'Wildcard Search', code: 'LDN', checked: false },\r\n { name: 'Whole Word Only', code: 'IST', checked: false },\r\n];\r\n\r\n/**\r\n * Default supported image types.\r\n * @type {{}}\r\n */\r\nexport const SUPPORTED_IMAGE_TYPES = [\r\n 'PNG',\r\n 'png',\r\n 'jpeg',\r\n 'jpg',\r\n 'gif',\r\n 'bmp',\r\n 'tiff',\r\n 'webp',\r\n];\r\n\r\n/**\r\n * @constant {Array<{label: string, value: string, files: string[]}>} DOCUMENTTYPES\r\n * An array of document type objects containing labels, values, and associated files.\r\n */\r\n\r\nexport const DOCUMENTTYPES = [\r\n {\r\n label: \"BankStatement\",\r\n value: \"bank_statement\",\r\n },\r\n {\r\n label: \"Payslip\",\r\n value: \"payslip\",\r\n },\r\n {\r\n label: \"Selfie\",\r\n value: \"selfie\",\r\n },\r\n {\r\n label: \"Other\",\r\n value: \"other\",\r\n }\r\n];\r\n\r\nexport const DocumentAlertList = [\r\n { status: 'Pending', isAlert: true, alertMessage: 'The name on the payslip does not match either the driver name or the policyholder name.' },\r\n { status: 'Verified', isAlert: false, alertMessage: 'Document is verified successfully.' },\r\n];\r\n\r\nexport const OPEN_DOCUMENT_EXTENSIONS = ['odt', 'ods', 'odp'];\r\n\r\n/**\r\n * Dummy data for document sections with detailed document lists.\r\n * Based on the document management interface structure.\r\n * @type {Array<{header: string, description: string, pendingDocument: number, approvedDocument: number, list: Array<{documentName: string, documentType: string, documentUrl: string, status: string, applicantName: string, uploadedTime: string}>}>}\r\n */\r\nexport const DUMMY_DOCUMENT_SECTIONS = [\r\n {\r\n header: \"Identity\",\r\n description: \"Personal identification documents required for verification\",\r\n pendingDocument: 1,\r\n approvedDocument: 1,\r\n list: [\r\n {\r\n documentName: \"passport_emilia_wilson_2025.pdf\",\r\n documentType: \"Passport\",\r\n documentUrl: \"https://example.com/documents/passport_emilia_wilson_2025.pdf\",\r\n status: \"Pending\",\r\n applicantName: \"Charlotte Anderson\",\r\n uploadedTime: \"28 May 2025\"\r\n },\r\n {\r\n documentName: \"driving_license_benjamin_mitchell_2025.jpg\",\r\n documentType: \"Driving License\",\r\n documentUrl: \"https://example.com/documents/driving_license_benjamin_mitchell_2025.jpg\",\r\n status: \"Approved\",\r\n applicantName: \"Benjamin Mitchell\",\r\n uploadedTime: \"27 May 2025\"\r\n },\r\n {\r\n documentName: \"british_gas_bill_may_2025.pdf\",\r\n documentType: \"Utility Bill\",\r\n documentUrl: \"https://example.com/documents/british_gas_bill_may_2025.pdf\",\r\n status: \"Alert\",\r\n applicantName: \"Sophia Reynolds\",\r\n uploadedTime: \"26 May 2025\"\r\n },\r\n {\r\n documentName: \"council_tax_oliver_thompson_2025_2026.pdf\",\r\n documentType: \"Council Tax Bill\",\r\n documentUrl: \"https://example.com/documents/council_tax_oliver_thompson_2025_2026.pdf\",\r\n status: \"Uploaded\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"30 May 2025\"\r\n },\r\n {\r\n documentName: \"certified_id_oliver_thompson_2025.pdf\",\r\n documentType: \"Certified ID\",\r\n documentUrl: \"https://example.com/documents/certified_id_oliver_thompson_2025.pdf\",\r\n status: \"Reviewing\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n },\r\n {\r\n documentName: \"proof_of_address_oliver_thompson_2025.pdf\",\r\n documentType: \"Proof of Address\",\r\n documentUrl: \"https://example.com/documents/proof_of_address_oliver_thompson_2025.pdf\",\r\n status: \"Rejected\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n }\r\n ]\r\n },\r\n {\r\n header: \"Income\",\r\n description: \"Personal Income documents required for verification\",\r\n pendingDocument: 1,\r\n approvedDocument: 1,\r\n list: [\r\n {\r\n documentName: \"passport_emilia_wilson_2025.pdf\",\r\n documentType: \"Passport\",\r\n documentUrl: \"https://example.com/documents/passport_emilia_wilson_2025.pdf\",\r\n status: \"Pending\",\r\n applicantName: \"Charlotte Anderson\",\r\n uploadedTime: \"28 May 2025\"\r\n },\r\n {\r\n documentName: \"driving_license_benjamin_mitchell_2025.jpg\",\r\n documentType: \"Driving License\",\r\n documentUrl: \"https://example.com/documents/driving_license_benjamin_mitchell_2025.jpg\",\r\n status: \"Approved\",\r\n applicantName: \"Benjamin Mitchell\",\r\n uploadedTime: \"27 May 2025\"\r\n },\r\n {\r\n documentName: \"british_gas_bill_may_2025.pdf\",\r\n documentType: \"Utility Bill\",\r\n documentUrl: \"https://example.com/documents/british_gas_bill_may_2025.pdf\",\r\n status: \"Alert\",\r\n applicantName: \"Sophia Reynolds\",\r\n uploadedTime: \"26 May 2025\"\r\n },\r\n {\r\n documentName: \"council_tax_oliver_thompson_2025_2026.pdf\",\r\n documentType: \"Council Tax Bill\",\r\n documentUrl: \"https://example.com/documents/council_tax_oliver_thompson_2025_2026.pdf\",\r\n status: \"Uploaded\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"30 May 2025\"\r\n },\r\n {\r\n documentName: \"certified_id_oliver_thompson_2025.pdf\",\r\n documentType: \"Certified ID\",\r\n documentUrl: \"https://example.com/documents/certified_id_oliver_thompson_2025.pdf\",\r\n status: \"Reviewing\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n },\r\n {\r\n documentName: \"proof_of_address_oliver_thompson_2025.pdf\",\r\n documentType: \"Proof of Address\",\r\n documentUrl: \"https://example.com/documents/proof_of_address_oliver_thompson_2025.pdf\",\r\n status: \"Rejected\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n }\r\n ]\r\n }\r\n];\r\n","/**\r\n * A utility class containing common error messages.\r\n * @class ERRORS\r\n */\r\nexport class ERRORS {\r\n /**\r\n * Error message for invalid recipient.\r\n * @static\r\n * @type {string}\r\n */\r\n static INVALID_RECIPIENT = \"Invalid recipient: The recipient cannot be empty.\";\r\n \r\n static NO_VALUE_FOUND = \"No value found\";\r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_FETCHING_DOCUMENTS = \"Error fetching documents:\";\r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_FETCHING_FOLDERS = \"Error fetching folders:\";\r\n \r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_ALLDOCUMENT_MISSING = \"allDocumentTypes is missing in the response:\";\r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_DOCUMENT_TYPES = \"Error fetching document types:\";\r\n\r\n static ERROR_DOCUMENT_CATAGORY = 'Error fetching document categories:'\r\n static NO_DOCUMENT_URL = 'No document URL provided for download'\r\n static DOWNLOAD_FAIL = 'Download failed:'\r\n static ERROR_DELETING_DOCUMENT = 'Error deleting document:'\r\n static ERROR_RECEIVING_DOCUMENT_LIST = 'Error receiving document list response:'\r\n static CONTEXT_ID_REQUIRED = 'Context ID is required to fetch status data'\r\n static ERROR_FETCHING_STATUS_DATA = 'Error fetching status data:'\r\n static ERROR_FETCHING_USER_LIST = 'Error fetching user list with filters:'\r\n static ERROR_FETCHING_DOCUMENT_LIST = 'Error fetching document list:'\r\n static ERROR_FETCHING_DOCUMENT_CATEGORIES = 'Error fetching document categories:'\r\n static ERROR_FETCHING_DOCUMENTS_BY_STATUS = 'Error fetching documents by status:'\r\n static ERROR_FETCHING_DOCUMENTS_BY_CATEGORY = 'Error fetching documents by category:'\r\n static ERROR_CALLING_API_WITH_SELECTION = 'Error calling API with selection:'\r\n static ERROR_FILE_NAME_INVALID_CHARACTERS = 'File name contains invalid characters (< > : \" / \\\\ | ? *)'\r\n static ERROR_FILE_NAME_EMPTY = 'File name cannot be empty'\r\n static ERROR_QUESTION_GENERATION = 'Question cannot be generated.'\r\n}\r\n","/**\r\n * Class that holds the URLs used throughout the application.\r\n * These URLs are typically used for making API requests and accessing various resources.\r\n * @class URLS\r\n * @typedef {URLS}\r\n */\r\nexport class URLS {\r\n /**\r\n * The URL to fetch the application configuration file.\r\n * This JSON file typically contains settings and options for the application.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONFIGFILEURL = \"assets/config/api.config.json\";\r\n\r\n /**\r\n * QW Configs collection path (same as host `getApiConfig` / `RecordService`).\r\n * Full URL: `{catQwUrl}{CONFIGS}`.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONFIGS = 'Configs';\r\n\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_UPLOAD_FILE = \"documents/uploadFile\";\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_UPLOAD = \"Documents\";\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENTS = \"documents\";\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENTS_CATAGORIES = \"documents/getAllCategoriesByApplicationId\";\r\n\r\n /**\r\n * The query parameter to pass a context ID in API requests.\r\n * Used to specify the context for certain API calls, such as filtering or scoping the request.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONTEXT = \"?contextId=\";\r\n\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_TYPES = \"documentTypes\";\r\n static ALIAS_NAME = 'documents/updateAliasNameByDocumentId/';\r\n /**\r\n * The URL endpoint for getting categories by source (Applicant/Application).\r\n * Used to fetch document categories based on the selected source.\r\n * @static\r\n * @type {string}\r\n */\r\n static GET_CATEGORIES_BY_SOURCE = \"documentTypes/getAllCategoriesBySource/\";\r\n /**\r\n * The URL endpoint for getting document types by category ID.\r\n * Used to fetch document types based on the selected category.\r\n * @static\r\n * @type {string}\r\n */\r\n static GET_DOCUMENT_TYPES_BY_CATEGORY = \"documentTypes/getAllDocumentTypesByCategoryId/\";\r\n /**\r\n * The URL endpoint for saving document upload data.\r\n * Used to save the complete document upload information.\r\n * @static\r\n * @type {string}\r\n */\r\n static SAVE_DOCUMENT_UPLOAD = \"documents/create\";\r\n /**\r\n * The query parameter to pass a context ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static FOLDERS = \"/folders?contextId=\";\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static ALERT_BY_DOCUMENT_ID = \"alerts?documentId=\";\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static PARENT_DOCUMENT_TYPE_ID = \"parentDocumentType?parentDocumentTypeId=\";\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static USERLIST = \"documents/getContextIdListByApplicationId/\";\r\n\r\n /**\r\n * The URL endpoint for getting document status count by context ID.\r\n * Used to fetch status data with applicationId, contextId, and category parameters.\r\n * @static\r\n * @type {string}\r\n */\r\n static STATUS_DOCUMENT_COUNT = \"documents/getStatusDocumentCountByContextId/\";\r\n\r\n /**\r\n * The query parameter to pass a context ID in API requests.\r\n * Used to specify the context for certain API calls, such as filtering or scoping the request.\r\n * @static\r\n * @type {string}\r\n */\r\n \r\n static CONTEXT_ID = \"&contextId=\";\r\n static GETALL = \"documents/getAllByContextId\";\r\n static DOCUMENT_LIST = \"list\";\r\n static DOCUMENT_HISTORY = \"documents/getDocumentHistoryByDocumentId/\";\r\n static DELETE_DOCUMENT = \"documents/deleteDocumentByDocumentId/\";\r\n static UPDATE_DOCUMENT_STATUS = \"documents/updateDocumentStatusByDocumentId/\";\r\n static DOCUMENT_REQUEST = \"documents/requestDocument\";\r\n static VALUATION_REPORT = \"valuationReport/\";\r\n static CONVERT_TO_PDF = \"documents/convert-email-to-pdf\";\r\n static BROKER_DOCUMENT_CATAGORIES = \"documentTypes/getAllCategoriesForBrokerBySource/\"\r\n static BROKER_DOCUMENT_TYPES = \"documentTypes/getAllDocumentTypesForBrokerByCategoryId/\"\r\n static AI_QUESTION = \"question/\";\r\n}\r\n","import { EntityState } from '@datorama/akita';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { DocumentAlertModel } from '../models/document-alert.model';\r\nimport { FolderBlockModel } from '../models/folder.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { Message } from 'primeng/api';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\n\r\n/**\r\n * Represents the state of the documents in the application.\r\n * This interface extends Akita's `EntityState` to include additional properties\r\n * for managing document-specific data, such as `records`, `filteredRecords` and `folderId`.\r\n * @interface DocumentState\r\n * @property {any[]} records - A collection of records related to documents.\r\n * @property {any[]} filteredRecords - A collection of filteredRecords related to documents.\r\n * @property {string | null} folderId - The ID of the currently selected folder, or `null` if no folder is selected.\r\n * @property {boolean} isDialogOpen - A flag indicating whether a dialog is open.\r\n */\r\nexport interface DocumentState extends EntityState<DocumentModel, string> {\r\n records: DocumentModel[];\r\n folderId: string | null;\r\n isDialogOpen: boolean;\r\n filteredRecords:DocumentModel[];\r\n dropdownOptions: DocumentTypeModel[];\r\n uploadedDocumentFiles: DocumentModel[];\r\n parentDocumentTypeId: string | null;\r\n documentAlert:DocumentAlertModel\r\n folders:FolderBlockModel[]\r\n messages: Message[]\r\n documentList : DocumentModel[]\r\n documentCategories: DocumentCategory[];\r\n selectedMenuItem: string | null; // Stores the _id of the selected menu item, not the label\r\n selectedUserId: string | null;\r\n selectedStatus: string | null;\r\n searchKey: string | null; // Search term for filtering documents\r\n showUserList: boolean;\r\n currentDocument: DocumentModel | null;\r\n userList: UserListModel[];\r\n statusData: StatusDataModel[];\r\n documentListResponse: DocumentListResponse[] | null;\r\n \r\n // Document Viewer State\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n}\r\n\r\n/**\r\n * Creates the initial state for the `DocumentState` store.\r\n * This function provides default values for all properties in the `DocumentState` interface,\r\n * ensuring the store starts with a consistent initial structure.\r\n * @returns {DocumentState} The initial state of the document store.\r\n */\r\nexport function createInitialState(): DocumentState {\r\n return {\r\n records: [],\r\n filteredRecords: [],\r\n folderId: null,\r\n isDialogOpen: false,\r\n dropdownOptions: [], \r\n uploadedDocumentFiles: [],\r\n parentDocumentTypeId: null,\r\n documentAlert: {_id:''},\r\n folders:[],\r\n messages:[],\r\n documentList : [],\r\n documentCategories: [],\r\n selectedMenuItem: null,\r\n selectedUserId: null,\r\n selectedStatus: null,\r\n searchKey: null,\r\n showUserList: true,\r\n currentDocument: null,\r\n userList: [],\r\n statusData: [],\r\n documentListResponse: null,\r\n \r\n // Document Viewer State\r\n selectedDocument: undefined,\r\n documentHistory: [],\r\n showDocumentHistory: false,\r\n isActionLoading: false,\r\n documentStatus: 'pending' as 'pending',\r\n documentIsUploaded: false,\r\n alertData: null,\r\n deleteError: null,\r\n deleteSuccess: false\r\n };\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { EntityStore, StoreConfig } from '@datorama/akita';\r\nimport { createInitialState, DocumentState } from './document.state';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { Message } from 'primeng/api';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\n\r\n/**\r\n * Store that manages the state of documents in the application.\r\n * The `DocumentStore` class extends Akita's `EntityStore` to manage the entity state for documents.\r\n * It uses the `createInitialState` function to initialize the store with default values and \r\n * is configured with the name `'documents'`.\r\n * @augments EntityStore<DocumentState>\r\n */\r\n@Injectable({ providedIn: 'root' })\r\n@StoreConfig({ name: 'documents' })\r\nexport class DocumentStore extends EntityStore<DocumentState> {\r\n /**\r\n * Creates an instance of `DocumentStore` with the initial state of the documents.\r\n */\r\n constructor() {\r\n super(createInitialState());\r\n }\r\n \r\n setUploadedDocumentFiles(files: any[]) {\r\n this.update({ uploadedDocumentFiles: files });\r\n }\r\n\r\n setFolders(folders: any) {\r\n this.update({ folders: folders });\r\n }\r\n \r\n setDocumentTypes(documentType: any) {\r\n this.update({ uploadedDocumentFiles: documentType });\r\n }\r\n\r\n setDocumentAlert(documentAlert: any) { \r\n this.update({ documentAlert : documentAlert });\r\n }\r\n\r\n setParentDocumentTypeId(parentDocumentTypeId: string) {\r\n this.update({ parentDocumentTypeId });\r\n }\r\n \r\n setMessage(message: Message[]) {\r\n this.update({ messages : message });\r\n }\r\n\r\n setDocumentList(documents: DocumentModel[]) {\r\n this.update({ documents : documents });\r\n }\r\n\r\n setDocumentCategories(categories: DocumentCategory[]) {\r\n this.update({ documentCategories: categories });\r\n }\r\n\r\n // New methods for selection state management\r\n setSelectedMenuItem(menuItem: string | null) {\r\n this.update({ selectedMenuItem: menuItem });\r\n }\r\n\r\n setSelectedUserId(userId: string | null) {\r\n this.update({ selectedUserId: userId });\r\n }\r\n\r\n setSelectedStatus(status: string | null) {\r\n this.update({ selectedStatus: status });\r\n }\r\n\r\n setSearchKey(searchKey: string | null) {\r\n this.update({ searchKey: searchKey });\r\n }\r\n\r\n // Method to update all selection properties at once\r\n setSelectionState(menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null = null) {\r\n this.update({ \r\n selectedMenuItem: menuItem,\r\n selectedUserId: userId,\r\n selectedStatus: status,\r\n searchKey: searchKey\r\n });\r\n }\r\n\r\n // Method to clear all selection state\r\n clearSelectionState() {\r\n this.update({\r\n selectedMenuItem: null,\r\n selectedUserId: null,\r\n selectedStatus: null,\r\n searchKey: null,\r\n showUserList: true\r\n });\r\n }\r\n\r\n // Method to control user list visibility\r\n setShowUserList(show: boolean) {\r\n this.update({ showUserList: show });\r\n }\r\n\r\n // Method to set the current document\r\n setCurrentDocument(document: DocumentModel | null) {\r\n this.update({ currentDocument: document });\r\n }\r\n\r\n // Method to set the user list\r\n setUserList(userList: UserListModel[]) {\r\n this.update({ userList: userList });\r\n }\r\n\r\n // Method to set the status data\r\n setStatusData(statusData: StatusDataModel[]) {\r\n this.update({ statusData: statusData });\r\n }\r\n\r\n // Method to set the document list response\r\n setDocumentListResponse(response: DocumentListResponse[] | null) {\r\n this.update({ documentListResponse: response });\r\n }\r\n\r\n // Document Viewer State Management Methods\r\n setSelectedDocument(document: DocumentListItem | undefined) {\r\n this.update({ selectedDocument: document });\r\n }\r\n\r\n setDocumentHistory(history: DocumentHistorySection[]) {\r\n this.update({ documentHistory: history });\r\n }\r\n\r\n setShowDocumentHistory(show: boolean) {\r\n this.update({ showDocumentHistory: show });\r\n }\r\n\r\n setIsActionLoading(loading: boolean) {\r\n this.update({ isActionLoading: loading });\r\n }\r\n\r\n setDocumentStatus(status: 'pending' | 'accepted' | 'rejected') {\r\n this.update({ documentStatus: status });\r\n }\r\n\r\n setDocumentIsUploaded(uploaded: boolean) {\r\n this.update({ documentIsUploaded: uploaded });\r\n }\r\n\r\n setAlertData(alertData: any) {\r\n this.update({ alertData: alertData });\r\n }\r\n\r\n setDeleteError(error: any) {\r\n this.update({ deleteError: error });\r\n }\r\n\r\n setDeleteSuccess(success: boolean) {\r\n this.update({ deleteSuccess: success });\r\n }\r\n\r\n // Method to update all document viewer state at once\r\n updateDocumentViewerState(\r\n document?: DocumentListItem,\r\n history?: DocumentHistorySection[],\r\n showHistory?: boolean,\r\n loading?: boolean,\r\n status?: 'pending' | 'accepted' | 'rejected',\r\n uploaded?: boolean,\r\n alertData?: any\r\n ) {\r\n const updates: Partial<DocumentState> = {};\r\n \r\n if (document !== undefined) updates.selectedDocument = document;\r\n if (history !== undefined) updates.documentHistory = history;\r\n if (showHistory !== undefined) updates.showDocumentHistory = showHistory;\r\n if (loading !== undefined) updates.isActionLoading = loading;\r\n if (status !== undefined) updates.documentStatus = status;\r\n if (uploaded !== undefined) updates.documentIsUploaded = uploaded;\r\n if (alertData !== undefined) updates.alertData = alertData;\r\n \r\n this.update(updates);\r\n }\r\n\r\n // Method to clear document viewer state\r\n clearDocumentViewerState() {\r\n this.update({\r\n selectedDocument: undefined,\r\n documentHistory: [],\r\n showDocumentHistory: false,\r\n isActionLoading: false,\r\n documentStatus: 'pending' as 'pending',\r\n documentIsUploaded: false,\r\n alertData: null,\r\n deleteError: null,\r\n deleteSuccess: false\r\n });\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { URLS } from '../constant/URLS';\r\n\r\n/**\r\n * Service that handles loading and providing configuration settings for the application.\r\n * It fetches configuration data from a remote server and exposes various configuration options.\r\n * @class AppConfigService\r\n * @typedef {AppConfigService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppConfigService {\r\n\r\n /**\r\n * Holds the configuration data loaded from the server.\r\n * @private\r\n * @type {*}\r\n */\r\n private appConfig: any;\r\n\r\n /**\r\n * Creates an instance of AppConfigService.\r\n * Initializes the HttpClient for making HTTP requests.\r\n * @class\r\n * @param {HttpClient} http - The HttpClient service used for making HTTP requests.\r\n */\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Loads the application configuration from the server by making an HTTP request to the configuration URL.\r\n * This method retrieves the configuration data and assigns it to the appConfig property.\r\n * @async\r\n * @returns {*} Resolves when configuration is loaded successfully.\r\n */\r\n async loadAppConfig() {\r\n try {\r\n this.appConfig = await firstValueFrom(this.http.get(URLS.CONFIGFILEURL));\r\n } catch (error) {\r\n throw new Error(\"Api url is missing.\")\r\n }\r\n }\r\n \r\n\r\n /**\r\n * Returns the base URL for the API from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get apiBaseUrl() {\r\n return this.appConfig?.documentApiUrl;\r\n }\r\n\r\n /**\r\n * QW API base URL (typically ends with `/api/`), used for Configs and other QW endpoints.\r\n * @readonly\r\n * @type {string | undefined}\r\n */\r\n get catQwUrl(): string | undefined {\r\n return this.appConfig?.catQwUrl;\r\n }\r\n\r\n /**\r\n * Returns the local server API URL from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get localServerApi() {\r\n return this.appConfig?.localServerApi;\r\n }\r\n\r\n /**\r\n * Returns the document intelligence API base URL from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get documentIntelligenceApiUrl() {\r\n return this.appConfig?.documentIntelligenceApiUrl;\r\n }\r\n\r\n /**\r\n * Returns the visibility options from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get visibilityOptions() {\r\n return this.appConfig?.visibilityOption;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { catchError, EMPTY, Observable, of, tap, throwError } from 'rxjs';\r\nimport { URLS } from '../../../Shared/constant/URLS';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { AppConfigService } from '../../../Shared/services/app-config.service';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { DocumentAlertModel } from '../models/document-alert.model';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { FolderBlockModel } from '../models/folder.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\n\r\nexport interface AiQuestionResponse {\r\n success: boolean;\r\n document_id: string;\r\n question: string;\r\n answer: string;\r\n question_number: number;\r\n token_optimized: boolean;\r\n}\r\n\r\n/**\r\n * Service for making HTTP requests related to documents.\r\n * Authentication is handled automatically by the HTTP interceptor in the main project.\r\n * @class DocumentHttpService\r\n * @typedef {DocumentHttpService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class DocumentHttpService {\r\n /**\r\n * Creates an instance of DocumentService.\r\n * @param {DocumentStore} documentStore - Store managing the state of documents.\r\n * @param {HttpClient} http - Angular HTTP client for making API requests.\r\n * @param {AppConfigService} appConfigService - Service for retrieving application configuration, such as API base URL.\r\n */\r\n constructor(\r\n public documentStore: DocumentStore,\r\n private http: HttpClient,\r\n public appConfigService: AppConfigService\r\n ) { }\r\n\r\n /**\r\n * Get api url from appConfigService.\r\n * @readonly\r\n * @type {string}\r\n */\r\n get apiUrl(): string {\r\n return this.appConfigService.apiBaseUrl;\r\n }\r\n\r\n /**\r\n * Fetches application Configs from QW (`catQwUrl` + `Configs`), same shape as host `getApiConfig`.\r\n * Used for feature flags such as `SHARED.DOCUMENT_CHATBOT` with `data.enabled`.\r\n * @returns {Observable<any[]>} Config rows or empty array if URL missing or request fails.\r\n */\r\n getAppConfigs(): Observable<any[]> {\r\n const qw = this.appConfigService.catQwUrl;\r\n if (!qw) {\r\n return of([]);\r\n }\r\n const base = qw.endsWith('/') ? qw : `${qw}/`;\r\n return this.http.get<any[]>(`${base}${URLS.CONFIGS}`).pipe(\r\n catchError(() => of([]))\r\n );\r\n }\r\n\r\n /**\r\n * Returns base URL for document intelligence APIs.\r\n * @returns {string} Base URL for AI endpoints.\r\n */\r\n get documentIntelligenceApiUrl(): string {\r\n return this.appConfigService.documentIntelligenceApiUrl;\r\n }\r\n\r\n /**\r\n * Calls AI question endpoint for chat answers.\r\n * Uses same HttpClient as getDocumentHistoryByDocumentId; host app interceptor supplies Authorization Bearer.\r\n * @param {string} documentId - The document ID used for context.\r\n * @param {string} question - The question asked by the user.\r\n * @returns {Observable<AiQuestionResponse>} AI question answer response.\r\n */\r\n askAiQuestion(documentId: string, question: string): Observable<AiQuestionResponse> {\r\n if (!documentId || !this.documentIntelligenceApiUrl) {\r\n return throwError(() => new Error(ERRORS.ERROR_QUESTION_GENERATION));\r\n }\r\n\r\n return this.http.post<AiQuestionResponse>(\r\n `${this.documentIntelligenceApiUrl}${URLS.AI_QUESTION}${documentId}`,\r\n { question }\r\n ).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document by its path name and transforms the response for dropdown options.\r\n * Includes error handling for failed API requests.\r\n * @param {string} contextId - The context ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getFoldersData(contextId:string | undefined): Observable<FolderBlockModel[]> {\r\n if(!contextId) return EMPTY;\r\n return this.http.get<FolderBlockModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}${URLS.FOLDERS}${contextId}`).pipe(\r\n tap((folders: FolderBlockModel[]) => {\r\n this.documentStore.setFolders(folders);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document catagories by its path name.\r\n * Includes error handling for failed API requests.\r\n * @param {string} contextId - The context ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getDocumentCatagories(contextId:string): Observable<any> { \r\n return this.http.get<any>(`${this.apiUrl}${URLS.DOCUMENTS_CATAGORIES}/${contextId}` )\r\n .pipe(\r\n tap((response: any) => {\r\n if (response && response.categories) {\r\n this.documentStore.setDocumentCategories(response.categories);\r\n }\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n /**\r\n * Fetches a document by its path name and transforms the response for dropdown options.\r\n * Includes error handling for failed API requests.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n // getDocumentTypes(): Observable<DocumentTypeModel[]> {\r\n // return this.http.get<DocumentTypeModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${URLS.DOCUMENT_TYPES}`).pipe(\r\n // tap((documentTypes: DocumentTypeModel[]) => {\r\n // this.documentStore.setDocumentTypes(documentTypes);\r\n // }),\r\n // catchError((error) => {\r\n // return throwError(() => new Error(error));\r\n // })\r\n // );\r\n // }\r\n \r\n /**\r\n * Fetches a document by its path name and transforms the response for dropdown options.\r\n * @param {string} documentId - The document ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getAlertsByDocumentID(documentId:string): Observable<DocumentAlertModel> { \r\n return this.http.get<DocumentAlertModel>(`${this.apiUrl}${URLS.ALERT_BY_DOCUMENT_ID}${documentId}`).pipe(\r\n tap((documentAlert: DocumentAlertModel) => {\r\n this.documentStore.setDocumentAlert(documentAlert);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document by its folder ID and transforms the response for dropdown options.\r\n * @param {string} folderId - The folder ID to fetch the document.\r\n * @param {string} contextId - The context ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getDocumentByFolderID(folderId:string, contextId:string): Observable<DocumentModel[]> {\r\n return this.http.get<DocumentModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${URLS.PARENT_DOCUMENT_TYPE_ID}${folderId}${URLS.CONTEXT_ID}${contextId}`).pipe(\r\n tap((records: DocumentModel[]) => {\r\n this.documentStore.set(records);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates the name of a document.\r\n * This method sends an HTTP PUT request to update the document's file name using the provided document ID and payload.\r\n * In case of an error, it will return an observable that throws an Error.\r\n * @param {string} documentId - The unique identifier of the document to update.\r\n * @param {any} payload - The payload containing the updated document data (e.g., fileName).\r\n * @returns {Observable<DocumentModel>} An observable that emits the updated DocumentModel.\r\n */\r\n updateDocumentName(documentId: string, payload: any): Observable<DocumentModel> {\r\n return this.http.put<DocumentModel>(`${this.apiUrl}${URLS.ALIAS_NAME}${documentId}`, payload).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a userlist by its path name.\r\n * @param {string} contextId - The document ID to fetch the document.\r\n * @returns {Observable<UserListModel[]>} Observable that emits the user list data.\r\n */\r\n getUserListByContextId(contextId : string): Observable<UserListModel[]> {\r\n if(!contextId) return EMPTY;\r\n return this.http.get<UserListModel[]>(`${this.apiUrl}${URLS.USERLIST}${contextId}`).pipe(\r\n tap((userList: UserListModel[]) => {\r\n this.documentStore.setUserList(userList);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches document status count data by application ID with optional context ID and category parameters.\r\n * @param {string} applicationId - The application ID to fetch status data.\r\n * @param {string | null} contextId - The context ID (applicant ID) to filter by. If null, uses applicationId.\r\n * @param {string | null} categoryId - The category ID to filter by.\r\n * @returns {Observable<StatusDataModel[]>} Observable that emits the status data.\r\n */\r\n getStatusDocumentCount(applicationId: string, contextId: string | null = null, categoryId: string | null = null): Observable<StatusDataModel[]> {\r\n if(!applicationId) return EMPTY;\r\n let url = `${this.apiUrl}${URLS.STATUS_DOCUMENT_COUNT}${applicationId}`;\r\n let params = new HttpParams();\r\n const contextParam = contextId || null;\r\n if (contextParam) {\r\n params = params.set(SHARED.CONTEXT_ID, contextParam);\r\n } \r\n if (categoryId) {\r\n params = params.set(SHARED.CATEGORY, categoryId);\r\n }\r\n return this.http.get<StatusDataModel[]>(url, { params}).pipe(\r\n tap((statusData: StatusDataModel[]) => {\r\n this.documentStore.setStatusData(statusData);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Fetches documents based on selection criteria (user ID, status, and search key).\r\n * This method sends an HTTP GET request with query parameters for the selected filters.\r\n * Note: Menu item filtering has been removed - menu items are now used for navigation only.\r\n * @param {string} contextId - The context ID (applicationId or applicantId).\r\n * @param {string | null} menuItem - Reserved parameter (no longer used for filtering).\r\n * @param {string | null} userId - The selected user ID filter.\r\n * @param {string | null} status - The selected status filter.\r\n * @param {string | null} searchKey - The search key filter.\r\n * @returns {Observable<any>} An observable that emits the filtered document data.\r\n */\r\n getDocumentsBySelection(contextId: string, menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null = null): Observable<any> {\r\n let params = new HttpParams();\r\n if (userId) { params = params.set(SHARED.CONTEXT_ID, userId); }\r\n \r\n if (status) { params = params.set(SHARED.STATUS_PARAM, status); }\r\n\r\n if (searchKey) { params = params.set(SHARED.SEARCH_KEY, searchKey); }\r\n return this.http.get<any>(`${this.apiUrl}${URLS.GETALL}/${contextId}`, { params }).pipe(\r\n tap((response: any) => {\r\n if (response.documents) {\r\n this.documentStore.setDocumentList(response.documents);\r\n }\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n getDocumentHistory(documentId: string): Observable<DocumentHistorySection[]> {\r\n if (!documentId) {\r\n return of([]);\r\n }\r\n return this.http.get<DocumentHistorySection[]>(`${this.apiUrl}${URLS.DOCUMENT_HISTORY}${documentId}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches document categories by source (Applicant/Application).\r\n * @param {string} source - The source type (Applicant or Application).\r\n * @returns {Observable<DocumentCategory[]>} Observable that emits the categories.\r\n */\r\n getCategoriesBySource(source: string): Observable<DocumentCategory[]> {\r\n if (!source) return EMPTY;\r\n return this.http.get<DocumentCategory[]>(`${this.apiUrl}${URLS.GET_CATEGORIES_BY_SOURCE}${source}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /** \r\n * Fetches broker document categories by source.\r\n * @param {string} source - The source type (Broker).\r\n * @returns {Observable<DocumentCategory[]>} Observable that emits the categories.\r\n */\r\n getBrokerDocumentCatagoriesBySource(source : string):Observable<DocumentCategory[]>{\r\n if(!source) return EMPTY;\r\n return this.http.get<DocumentCategory[]>(`${this.apiUrl}${URLS.BROKER_DOCUMENT_CATAGORIES}${source}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches broker document types by category ID.\r\n * @param {string} categoryId - The category ID to fetch document types for.\r\n * @returns {Observable<DocumentTypeModel[]>} Observable that emits the document types.\r\n */\r\n\r\n getBrokerDocumentTypesByCategoryId(categoryId: string): Observable<DocumentTypeModel[]> {\r\n if (!categoryId) return EMPTY;\r\n return this.http.get<DocumentTypeModel[]>(`${this.apiUrl}${URLS.BROKER_DOCUMENT_TYPES}${categoryId}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches document types by category ID.\r\n * @param {string} categoryId - The category ID to fetch document types for.\r\n * @returns {Observable<DocumentTypeModel[]>} Observable that emits the document types.\r\n */\r\n getDocumentTypesByCategory(categoryId: string): Observable<DocumentTypeModel[]> {\r\n if (!categoryId) return EMPTY;\r\n return this.http.get<DocumentTypeModel[]>(`${this.apiUrl}${URLS.GET_DOCUMENT_TYPES_BY_CATEGORY}${categoryId}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Uploads a single file using the uploadFile API.\r\n * @param {FormData} formData - The form data containing the file and metadata.\r\n * @returns {Observable<any>} Observable that emits the upload response.\r\n */\r\n uploadFile(formData: FormData): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}`, formData).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Saves the complete document upload data.\r\n * @param {any} payload - The document upload payload containing all necessary data.\r\n * @returns {Observable<any>} Observable that emits the save response.\r\n */\r\n saveDocumentUpload(payload: any): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.SAVE_DOCUMENT_UPLOAD}`, payload).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates the status of a document by document ID\r\n * @param {string} documentId - The ID of the document to update\r\n * @param {string} status - The new status (Approved, Rejected, etc.)\r\n * @param {string} statusUpdateDescription - The description/note for the status update\r\n * @returns {Observable<any>} Observable that emits the updated document data with normalized status\r\n */\r\n updateDocumentStatus(documentId: string, status: string, statusUpdateDescription: string): Observable<any> {\r\n const payload = {\r\n statusUpdateDescription: statusUpdateDescription\r\n };\r\n return this.http.put<any>(`${this.apiUrl}${URLS.UPDATE_DOCUMENT_STATUS}${documentId}/${status}`, payload).pipe(\r\n tap((response) => {\r\n if (response && response.status) {\r\n const normalizedStatus = this.normalizeStatus(response.status);\r\n response.normalizedStatus = normalizedStatus;\r\n }\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Normalizes the status from API response to match component expectations\r\n * @param {string} status - The status from API response (Approved, Rejected, etc.)\r\n * @returns {string} Normalized status value\r\n */\r\n private normalizeStatus(status: string): string {\r\n switch (status.toLowerCase()) {\r\n case SHARED.APPROVED:\r\n return SHARED.STATUS_ACCEPTED;\r\n case SHARED.STATUS_REJECTED_LOWERCASE:\r\n return SHARED.STATUS_REJECTED_LOWERCASE;\r\n case SHARED.STATUS_PENDING:\r\n return SHARED.STATUS_PENDING;\r\n default:\r\n return status.toLowerCase();\r\n }\r\n }\r\n\r\n /**\r\n * Deletes a document by its ID and refreshes all data (categories, userlist, status, and document list)\r\n * @param {string} documentId - The ID of the document to delete\r\n * @param {string} contextId - The context ID to refresh all data\r\n * @returns {Observable<any>} Observable that emits the delete response\r\n */\r\n deleteDocument(documentId: string, contextId: string): Observable<any> {\r\n return this.http.delete<any>(`${this.apiUrl}${URLS.DELETE_DOCUMENT}${documentId}`).pipe(\r\n tap(() => {\r\n this.getDocumentCatagories(contextId).subscribe();\r\n this.getUserListByContextId(contextId).subscribe();\r\n this.getStatusDocumentCount(contextId).subscribe();\r\n this.getDocumentsBySelection(contextId, null, null, null, null).subscribe();\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Downloads an Excel file with proper authentication headers\r\n * Authentication is handled automatically by the HTTP interceptor\r\n * @param {string} documentUrl - The URL of the Excel file to download\r\n * @returns {Observable<ArrayBuffer>} Observable that emits the file data as ArrayBuffer\r\n */\r\n downloadExcelFile(documentUrl: string): Observable<ArrayBuffer> {\r\n \r\n return this.http.get(documentUrl, { \r\n responseType: 'arraybuffer'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Downloads a CSV file with proper authentication headers\r\n * Authentication is handled automatically by the HTTP interceptor\r\n * @param {string} documentUrl - The URL of the CSV file to download\r\n * @returns {Observable<string>} Observable that emits the file data as string\r\n */\r\n downloadCsvFile(documentUrl: string): Observable<string> {\r\n return this.http.get(documentUrl, {\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n \r\n /**\r\n * Downloads an email file (EML) with appropriate handling for different storage types\r\n * @param {string} documentUrl - URL of the email file\r\n * @returns {Observable<string>} Observable of file content as text\r\n */\r\n downloadEmailFile(documentUrl: string): Observable<string> {\r\n const isAzureBlobStorage = documentUrl.includes('.blob.core.windows.net');\r\n if (isAzureBlobStorage) {\r\n return this.http.get(documentUrl, {\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));\r\n })\r\n );\r\n } else {\r\n return this.http.get<string>(documentUrl).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));\r\n })\r\n );\r\n }\r\n }\r\n\r\n documentRequest(payload: any): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.DOCUMENT_REQUEST}`, payload).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Checks if valuation report data exists for the given context ID\r\n * @param {string} contextId - The context ID to check for valuation report data\r\n * @returns {Observable<any>} Observable that emits the valuation report data or empty object\r\n */\r\n getValuationReportByContextId(contextId: string): Observable<any> {\r\n if (!contextId) return EMPTY;\r\n return this.http.get<any>(`${this.apiUrl}${URLS.VALUATION_REPORT}${contextId}`).pipe(\r\n catchError((error) => {\r\n // Return empty object if no data found or error occurs\r\n return of(null);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Converts an email document to PDF format\r\n * @param {string} documentUrl - The URL of the email document to convert\r\n * @returns {Observable<Blob>} Observable that emits the PDF blob data\r\n */\r\n convertEmailToPdf(documentUrl: string): Observable<Blob> {\r\n if (!documentUrl) return EMPTY;\r\n \r\n const payload = { documentUrl: documentUrl };\r\n \r\n return this.http.post(`${this.apiUrl}${URLS.CONVERT_TO_PDF}`, payload, { \r\n responseType: 'blob'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error?.message || 'Failed to convert email to PDF'));\r\n })\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { QueryEntity } from '@datorama/akita';\r\nimport { DocumentStore } from './document.store';\r\nimport { DocumentState } from './document.state';\r\nimport { Observable } from 'rxjs';\r\nimport { Message } from 'primeng/api';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\n\r\n\r\n/**\r\n * Query service for managing document state.\r\n * This class extends Akita's `QueryEntity` to provide additional functionality for querying document data.\r\n * @class DocumentQuery\r\n * @typedef {DocumentQuery}\r\n * @augments {QueryEntity<DocumentState>}\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DocumentQuery extends QueryEntity<DocumentState> {\r\n constructor(protected override store: DocumentStore) {\r\n super(store);\r\n }\r\n\r\n /**\r\n * Selects the currently selected folder ID from the document state.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected folder ID.\r\n */\r\n getParentDocumentTypeId() : string | null {\r\n return this.getValue()['parentDocumentTypeId'];\r\n }\r\n\r\n /**\r\n * Selects the currently selected folder ID from the document state.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected folder ID.\r\n */\r\n selectParentDocumentTypeId():Observable<string | null> {\r\n return this.select((state) => state['parentDocumentTypeId']);\r\n }\r\n /**\r\n * Selects the set messages.\r\n * @returns {Observable<Message>} Observable that emits the current Message.\r\n */\r\n selectMessages():Observable<Message[]> {\r\n return this.select((state) => state.messages);\r\n }\r\n /**\r\n * Selects the set documents.\r\n * @returns {Observable<DocumentModel[]>} Observable that emits the documets.\r\n */\r\n selectDocumets():Observable<DocumentModel[]> {\r\n return this.select((state) => state.documentList);\r\n }\r\n\r\n /**\r\n * Selects the document categories.\r\n * @returns {Observable<DocumentCategory[]>} Observable that emits the document categories.\r\n */\r\n selectDocumentCategories(): Observable<DocumentCategory[]> {\r\n return this.select((state) => state.documentCategories);\r\n }\r\n\r\n // New query methods for selection state\r\n /**\r\n * Selects the currently selected menu item.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected menu item _id (not the label).\r\n */\r\n selectSelectedMenuItem(): Observable<string | null> {\r\n return this.select((state) => state.selectedMenuItem);\r\n }\r\n\r\n /**\r\n * Selects the currently selected user ID.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected user ID.\r\n */\r\n selectSelectedUserId(): Observable<string | null> {\r\n return this.select((state) => state.selectedUserId);\r\n }\r\n\r\n /**\r\n * Selects the currently selected status.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected status.\r\n */\r\n selectSelectedStatus(): Observable<string | null> {\r\n return this.select((state) => state.selectedStatus);\r\n }\r\n\r\n /**\r\n * Selects the current search key.\r\n * @returns {Observable<string | null>} Observable that emits the current search key.\r\n */\r\n selectSearchKey(): Observable<string | null> {\r\n return this.select((state) => state.searchKey);\r\n }\r\n\r\n /**\r\n * Selects all selection state properties (menu item, user ID, status, search key).\r\n * @returns {Observable<{menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null}>} Observable that emits the current selection state.\r\n * Note: menuItem is the _id of the selected menu item, not the label.\r\n */\r\n selectSelectionState(): Observable<{menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null}> {\r\n return this.select((state) => ({\r\n menuItem: state.selectedMenuItem,\r\n userId: state.selectedUserId,\r\n status: state.selectedStatus,\r\n searchKey: state.searchKey\r\n }));\r\n }\r\n\r\n /**\r\n * Gets the current selection state values (synchronous).\r\n * @returns {Object} The current selection state values.\r\n * Note: menuItem is the _id of the selected menu item, not the label.\r\n */\r\n getSelectionState(): {menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null} {\r\n const state = this.getValue();\r\n return {\r\n menuItem: state.selectedMenuItem,\r\n userId: state.selectedUserId,\r\n status: state.selectedStatus,\r\n searchKey: state.searchKey\r\n };\r\n }\r\n\r\n /**\r\n * Selects the user list visibility state.\r\n * @returns {Observable<boolean>} Observable that emits the current user list visibility.\r\n */\r\n selectShowUserList(): Observable<boolean> {\r\n return this.select((state) => state.showUserList);\r\n }\r\n\r\n /**\r\n * Gets the current user list visibility value (synchronous).\r\n * @returns {boolean} The current user list visibility.\r\n */\r\n getShowUserList(): boolean {\r\n return this.getValue().showUserList;\r\n }\r\n\r\n /**\r\n * Selects the current document.\r\n * @returns {Observable<DocumentModel | null>} Observable that emits the current document.\r\n */\r\n selectCurrentDocument(): Observable<DocumentModel | null> {\r\n return this.select((state) => state.currentDocument);\r\n }\r\n\r\n /**\r\n * Gets the current document value (synchronous).\r\n * @returns {DocumentModel | null} The current document.\r\n */\r\n getCurrentDocument(): DocumentModel | null {\r\n return this.getValue().currentDocument;\r\n }\r\n\r\n /**\r\n * Selects the user list.\r\n * @returns {Observable<UserListModel[]>} Observable that emits the user list.\r\n */\r\n selectUserList(): Observable<UserListModel[]> {\r\n return this.select((state) => state.userList);\r\n }\r\n\r\n /**\r\n * Gets the current user list value (synchronous).\r\n * @returns {UserListModel[]} The current user list.\r\n */\r\n getUserList(): UserListModel[] {\r\n return this.getValue().userList;\r\n }\r\n\r\n /**\r\n * Selects the status data.\r\n * @returns {Observable<StatusDataModel[]>} Observable that emits the status data.\r\n */\r\n selectStatusData(): Observable<StatusDataModel[]> {\r\n return this.select((state) => state.statusData);\r\n }\r\n\r\n /**\r\n * Gets the current status data value (synchronous).\r\n * @returns {StatusDataModel[]} The current status data.\r\n */\r\n getStatusData(): StatusDataModel[] {\r\n return this.getValue().statusData;\r\n }\r\n\r\n /**\r\n * Selects the document list response.\r\n * @returns {Observable<DocumentListResponse[] | null>} Observable that emits the document list response.\r\n */\r\n selectDocumentListResponse(): Observable<DocumentListResponse[] | null> {\r\n return this.select((state) => state.documentListResponse);\r\n }\r\n\r\n /**\r\n * Gets the current document list response value (synchronous).\r\n * @returns {DocumentListResponse[] | null} The current document list response.\r\n */\r\n getDocumentListResponse(): DocumentListResponse[] | null {\r\n return this.getValue().documentListResponse;\r\n }\r\n\r\n // Document Viewer State Query Methods\r\n /**\r\n * Selects the selected document for viewing.\r\n * @returns {Observable<DocumentListItem | undefined>} Observable that emits the selected document.\r\n */\r\n selectSelectedDocument(): Observable<DocumentListItem | undefined> {\r\n return this.select((state) => state.selectedDocument);\r\n }\r\n\r\n /**\r\n * Gets the current selected document value (synchronous).\r\n * @returns {DocumentListItem | undefined} The current selected document.\r\n */\r\n getSelectedDocument(): DocumentListItem | undefined {\r\n return this.getValue().selectedDocument;\r\n }\r\n\r\n /**\r\n * Selects the document history.\r\n * @returns {Observable<DocumentHistorySection[]>} Observable that emits the document history.\r\n */\r\n selectDocumentHistory(): Observable<DocumentHistorySection[]> {\r\n return this.select((state) => state.documentHistory);\r\n }\r\n\r\n /**\r\n * Gets the current document history value (synchronous).\r\n * @returns {DocumentHistorySection[]} The current document history.\r\n */\r\n getDocumentHistory(): DocumentHistorySection[] {\r\n return this.getValue().documentHistory;\r\n }\r\n\r\n /**\r\n * Selects the document history visibility state.\r\n * @returns {Observable<boolean>} Observable that emits the current document history visibility.\r\n */\r\n selectShowDocumentHistory(): Observable<boolean> {\r\n return this.select((state) => state.showDocumentHistory);\r\n }\r\n\r\n /**\r\n * Gets the current document history visibility value (synchronous).\r\n * @returns {boolean} The current document history visibility.\r\n */\r\n getShowDocumentHistory(): boolean {\r\n return this.getValue().showDocumentHistory;\r\n }\r\n\r\n /**\r\n * Selects the action loading state.\r\n * @returns {Observable<boolean>} Observable that emits the current action loading state.\r\n */\r\n selectIsActionLoading(): Observable<boolean> {\r\n return this.select((state) => state.isActionLoading);\r\n }\r\n\r\n /**\r\n * Gets the current action loading value (synchronous).\r\n * @returns {boolean} The current action loading state.\r\n */\r\n getIsActionLoading(): boolean {\r\n return this.getValue().isActionLoading;\r\n }\r\n\r\n /**\r\n * Selects the document status.\r\n * @returns {Observable<'pending' | 'accepted' | 'rejected'>} Observable that emits the current document status.\r\n */\r\n selectDocumentStatus(): Observable<'pending' | 'accepted' | 'rejected'> {\r\n return this.select((state) => state.documentStatus);\r\n }\r\n\r\n /**\r\n * Gets the current document status value (synchronous).\r\n * @returns {'pending' | 'accepted' | 'rejected'} The current document status.\r\n */\r\n getDocumentStatus(): 'pending' | 'accepted' | 'rejected' {\r\n return this.getValue().documentStatus;\r\n }\r\n\r\n /**\r\n * Selects the document uploaded state.\r\n * @returns {Observable<boolean>} Observable that emits the current document uploaded state.\r\n */\r\n selectDocumentIsUploaded(): Observable<boolean> {\r\n return this.select((state) => state.documentIsUploaded);\r\n }\r\n\r\n /**\r\n * Gets the current document uploaded value (synchronous).\r\n * @returns {boolean} The current document uploaded state.\r\n */\r\n getDocumentIsUploaded(): boolean {\r\n return this.getValue().documentIsUploaded;\r\n }\r\n\r\n /**\r\n * Selects the alert data.\r\n * @returns {Observable<any>} Observable that emits the current alert data.\r\n */\r\n selectAlertData(): Observable<any> {\r\n return this.select((state) => state.alertData);\r\n }\r\n\r\n /**\r\n * Gets the current alert data value (synchronous).\r\n * @returns {any} The current alert data.\r\n */\r\n getAlertData(): any {\r\n return this.getValue().alertData;\r\n }\r\n\r\n /**\r\n * Selects all document viewer state properties.\r\n * @returns {Observable<{selectedDocument?: DocumentListItem, documentHistory: DocumentHistorySection[], showDocumentHistory: boolean, isActionLoading: boolean, documentStatus: 'pending' | 'accepted' | 'rejected', documentIsUploaded: boolean, alertData: any, deleteError: any, deleteSuccess: boolean}>} Observable that emits the current document viewer state.\r\n */\r\n selectDocumentViewerState(): Observable<{\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n }> {\r\n return this.select((state) => ({\r\n selectedDocument: state.selectedDocument,\r\n documentHistory: state.documentHistory,\r\n showDocumentHistory: state.showDocumentHistory,\r\n isActionLoading: state.isActionLoading,\r\n documentStatus: state.documentStatus,\r\n documentIsUploaded: state.documentIsUploaded,\r\n alertData: state.alertData,\r\n deleteError: state.deleteError,\r\n deleteSuccess: state.deleteSuccess\r\n }));\r\n }\r\n\r\n /**\r\n * Gets the current document viewer state values (synchronous).\r\n * @returns {Object} The current document viewer state values.\r\n */\r\n getDocumentViewerState(): {\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n } {\r\n const state = this.getValue();\r\n return {\r\n selectedDocument: state.selectedDocument,\r\n documentHistory: state.documentHistory,\r\n showDocumentHistory: state.showDocumentHistory,\r\n isActionLoading: state.isActionLoading,\r\n documentStatus: state.documentStatus,\r\n documentIsUploaded: state.documentIsUploaded,\r\n alertData: state.alertData,\r\n deleteError: state.deleteError,\r\n deleteSuccess: state.deleteSuccess\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DocumentCategory, DocumentCategoryItem } from '../models/document-category.model';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentMenuService {\r\n\r\n constructor(private documentStore: DocumentStore) {}\r\n\r\n /**\r\n * Sorts categories alphabetically by label\r\n * @param categories - The list of document categories to sort\r\n * @returns Sorted categories array\r\n */\r\n sortCategoriesAlphabetically(categories: DocumentCategory[]): DocumentCategory[] {\r\n return [...categories].sort((a, b) => a.label.localeCompare(b.label));\r\n }\r\n\r\n /**\r\n * Sorts menu items within each category alphabetically by label\r\n * @param categories - The list of document categories to sort\r\n * @returns Categories with sorted menu items\r\n */\r\n sortMenuItemsAlphabetically(categories: DocumentCategory[]): DocumentCategory[] {\r\n return categories.map(category => ({\r\n ...category,\r\n items: category.items ? [...category.items].sort((a, b) => a.label.localeCompare(b.label)) : category.items\r\n }));\r\n }\r\n\r\n /**\r\n * Sorts both categories and their menu items alphabetically\r\n * @param categories - The list of document categories to sort\r\n * @returns Fully sorted categories array\r\n */\r\n sortCategoriesAndMenuItems(categories: DocumentCategory[]): DocumentCategory[] {\r\n const sortedCategories = this.sortCategoriesAlphabetically(categories);\r\n return this.sortMenuItemsAlphabetically(sortedCategories);\r\n }\r\n\r\n /**\r\n * Gets the category name for a given menu item _id\r\n * @param menuItemId - The _id of the menu item\r\n * @param categories - The list of document categories\r\n * @returns The category name or null if not found\r\n */\r\n getMenuItemCategory(menuItemId: string, categories: DocumentCategory[]): string | null {\r\n for (const category of categories) {\r\n if (category.items?.some((menuItem: DocumentCategoryItem) => menuItem._id === menuItemId)) {\r\n return category.label;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the menu item by its _id\r\n * @param menuItemId - The _id of the menu item\r\n * @param categories - The list of document categories\r\n * @returns The menu item or null if not found\r\n */\r\n getMenuItemById(menuItemId: string, categories: DocumentCategory[]): DocumentCategoryItem | null {\r\n for (const category of categories) {\r\n if (category.items) {\r\n const item = category.items.find((menuItem: DocumentCategoryItem) => menuItem._id === menuItemId);\r\n if (item) {\r\n return item;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Handles user list visibility based on menu item category\r\n * @param menuItemId - The _id of the menu item\r\n * @param categories - The list of document categories\r\n */\r\n handleUserListVisibility(menuItemId: string, categories: DocumentCategory[]): void {\r\n const category = this.getMenuItemCategory(menuItemId, categories);\r\n this.documentStore.setShowUserList(true);\r\n }\r\n\r\n /**\r\n * Calculates total documents for a menu item\r\n * @param item - The menu item\r\n * @returns Total number of documents\r\n */\r\n getTotalDocuments(item: DocumentCategoryItem): number {\r\n const status = item.status;\r\n // Handle both uppercase and lowercase keys\r\n const pending = status.Pending || status.pending || 0;\r\n const reviewing = status.Reviewing || status.reviewing || 0;\r\n const accepted = status.Accepted || status.approved || 0; // Note: approved maps to Accepted\r\n const rejected = status.Rejected || status.rejected || 0;\r\n \r\n return pending + reviewing + accepted + rejected;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets badge value for a menu item\r\n * @param item - The menu item\r\n * @returns Badge value string (e.g., \"2/3\")\r\n */\r\n getBadgeValue(item: DocumentCategoryItem): string {\r\n const approved = this.getApprovedDocuments(item);\r\n const total = this.getTotalDocuments(item);\r\n return `${approved}/${total}`;\r\n }\r\n\r\n /**\r\n * Gets badge severity based on status\r\n * @param item - The menu item\r\n * @returns Badge severity for PrimeNG\r\n */\r\n getBadgeSeverity(item: DocumentCategoryItem): 'success' | 'info' | 'warning' | 'danger' {\r\n const status = item.status;\r\n const total = this.getTotalDocuments(item);\r\n const pending = status.Pending || status.pending || 0;\r\n const rejected = status.Rejected || status.rejected || 0;\r\n const reviewing = status.Reviewing || status.reviewing || 0;\r\n const approved = this.getApprovedDocuments(item);\r\n \r\n if (total === 0) return 'info';\r\n if (pending > 0) return 'info';\r\n if (rejected > 0) return 'danger';\r\n if (reviewing > 0) return 'warning';\r\n if (approved === total && total > 0) return 'success';\r\n return 'warning';\r\n }\r\n\r\n /**\r\n * Checks if badge should be shown for a menu item\r\n * @param item - The menu item\r\n * @returns True if badge should be shown\r\n */\r\n shouldShowBadge(item: DocumentCategoryItem): boolean {\r\n return this.getTotalDocuments(item) > 0;\r\n }\r\n\r\n /**\r\n * Calculates approved documents for a menu item\r\n * @param item - The menu item\r\n * @returns Number of approved documents\r\n */\r\n getApprovedDocuments(item: DocumentCategoryItem): number {\r\n const status = item.status;\r\n // Handle both uppercase and lowercase keys, with approved mapping to Accepted\r\n return status.Accepted || status.approved || 0;\r\n }\r\n\r\n /**\r\n * Checks if a menu item's section is visible in the filtered document list\r\n * @param menuItemId - The ID of the menu item to check\r\n * @param documentListResponse - The filtered document list response\r\n * @returns True if the section is visible, false otherwise\r\n */\r\n isMenuItemSectionVisible(menuItemId: string, documentListResponse: DocumentListResponse[] | null, menuItemLabel?: string): boolean {\r\n if (!menuItemId || !documentListResponse || documentListResponse.length === 0) {\r\n return false;\r\n }\r\n \r\n return documentListResponse.some(category => {\r\n if (!category.label || !category.list || category.list.length === 0) {\r\n return false;\r\n }\r\n \r\n const categoryLabelLower = category.label.toLowerCase();\r\n if (menuItemLabel) {\r\n const menuItemLabelLower = menuItemLabel.toLowerCase();\r\n if (categoryLabelLower === menuItemLabelLower) {\r\n return true;\r\n }\r\n if (this.isSmartPartialMatch(menuItemLabelLower, categoryLabelLower)) {\r\n return true;\r\n }\r\n }\r\n const menuItemIdLower = menuItemId.toLowerCase();\r\n if (this.isSmartPartialMatch(menuItemIdLower, categoryLabelLower)) {\r\n return true;\r\n }\r\n \r\n return false;\r\n });\r\n }\r\n\r\n /**\r\n * Performs smart partial matching to prevent substring conflicts\r\n * @param menuLabel - The menu item label to match\r\n * @param categoryLabel - The category label to match against\r\n * @returns True if it's a valid partial match, false otherwise\r\n */\r\n private isSmartPartialMatch(menuLabel: string, categoryLabel: string): boolean {\r\n // If the category label is significantly longer than menu label, it's likely a different section\r\n if (categoryLabel.length > menuLabel.length + 3) {\r\n return false;\r\n }\r\n const menuWords = menuLabel.split(/\\s+/);\r\n const categoryWords = categoryLabel.split(/\\s+/);\r\n return menuWords.every(word => \r\n categoryWords.some(catWord => \r\n catWord.toLowerCase().startsWith(word.toLowerCase()) || \r\n word.toLowerCase().startsWith(catWord.toLowerCase())\r\n )\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Deselects a menu item if its section is not visible in the filtered document list\r\n * @param menuItemId - The ID of the menu item to check\r\n * @param documentListResponse - The filtered document list response\r\n * @param menuItemLabel - The label of the menu item (optional)\r\n * @returns True if the menu item was deselected, false otherwise\r\n */\r\n deselectMenuItemIfSectionNotVisible(menuItemId: string, documentListResponse: DocumentListResponse[] | null, menuItemLabel?: string): boolean {\r\n if (!this.isMenuItemSectionVisible(menuItemId, documentListResponse, menuItemLabel)) {\r\n this.documentStore.setSelectedMenuItem(null);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if a menu item should be selectable based on the filtered document list\r\n * @param menuItemId - The ID of the menu item to check\r\n * @param documentListResponse - The filtered document list response\r\n * @param menuItemLabel - The label of the menu item (optional)\r\n * @returns True if the menu item should be selectable, false otherwise\r\n */\r\n isMenuItemSelectable(menuItemId: string, documentListResponse: DocumentListResponse[] | null, menuItemLabel?: string): boolean {\r\n return this.isMenuItemSectionVisible(menuItemId, documentListResponse, menuItemLabel);\r\n }\r\n\r\n /**\r\n * Gets the selectability status for all menu items in categories\r\n * @param categories - The document categories containing menu items\r\n * @param documentListResponse - The filtered document list response\r\n * @returns Map of menu item IDs to their selectability status\r\n */\r\n getMenuItemsSelectabilityStatus(categories: DocumentCategory[], documentListResponse: DocumentListResponse[] | null): Map<string, boolean> {\r\n const selectabilityMap = new Map<string, boolean>();\r\n \r\n categories.forEach(category => {\r\n if (category.items) {\r\n category.items.forEach(item => {\r\n const isSelectable = this.isMenuItemSelectable(item._id, documentListResponse);\r\n selectabilityMap.set(item._id, isSelectable);\r\n });\r\n }\r\n });\r\n \r\n return selectabilityMap;\r\n }\r\n\r\n /**\r\n * Updates menu items with selectability status\r\n * @param categories - The document categories containing menu items\r\n * @param documentListResponse - The filtered document list response\r\n * @returns Updated categories with selectability information\r\n */\r\n updateMenuItemsWithSelectabilityStatus(categories: DocumentCategory[], documentListResponse: DocumentListResponse[] | null): DocumentCategory[] {\r\n return categories.map(category => ({\r\n ...category,\r\n items: category.items?.map(item => ({\r\n ...item,\r\n isSelectable: this.isMenuItemSelectable(item._id, documentListResponse, item.label)\r\n }))\r\n }));\r\n }\r\n} ","import { Injectable } from \"@angular/core\";\r\nimport { Observable, combineLatest, Subscription } from \"rxjs\";\r\nimport { DocumentModel } from \"../models/document.model\";\r\nimport { DocumentStore } from \"../state/document.store\";\r\nimport { DocumentQuery } from \"../state/document.query\";\r\nimport { DocumentHttpService } from \"./document-http.service\";\r\nimport { DocumentMenuService } from \"./document-menu.service\";\r\nimport { switchMap, debounceTime, distinctUntilChanged } from \"rxjs/operators\";\r\nimport { ERRORS } from \"../../../Shared/constant/ERROR\";\r\n\r\n/**\r\n * Service to manage the document data and selection state\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DocumentHelperService {\r\n\r\n private selectionWatcherSubscription: Subscription | null = null;\r\n\r\n constructor(\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery,\r\n private documentHttpService: DocumentHttpService,\r\n private documentMenuService: DocumentMenuService\r\n ) {\r\n // Note: initializeSelectionWatcher now requires contextId\r\n // This should be called from the component that has access to contextId\r\n }\r\n\r\n /**\r\n * Initialize watcher for selection state changes\r\n * @param contextId - The context ID to use for API calls\r\n */\r\n initializeSelectionWatcher(contextId: string): void {\r\n // Clean up any existing subscription\r\n this.cleanupSelectionWatcher();\r\n \r\n this.selectionWatcherSubscription = combineLatest([\r\n this.documentQuery.selectSelectedUserId(),\r\n this.documentQuery.selectSelectedStatus(),\r\n this.documentQuery.selectSearchKey()\r\n ]).pipe(\r\n debounceTime(300),\r\n distinctUntilChanged((prev, curr) => {\r\n const isSame = prev[0] === curr[0] && prev[1] === curr[1] && prev[2] === curr[2];\r\n return isSame;\r\n }),\r\n switchMap(([userId, status, searchKey]) => {\r\n return this.documentHttpService.getDocumentsBySelection(contextId, null, userId, status, searchKey);\r\n })\r\n ).subscribe({\r\n next: (response) => {\r\n const currentState = this.documentQuery.getSelectionState();\r\n this.documentStore.setDocumentListResponse(response);\r\n },\r\n error: (error) => {\r\n console.error(ERRORS.ERROR_CALLING_API_WITH_SELECTION, error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Initialize watcher for selection state changes with initial load\r\n * @param contextId - The context ID to use for API calls\r\n */\r\n initializeSelectionWatcherWithInitialLoad(contextId: string): void {\r\n // Clean up any existing subscription\r\n this.cleanupSelectionWatcher();\r\n \r\n // Make initial API call to load documents\r\n this.documentHttpService.getDocumentsBySelection(contextId, null, null, null, null).subscribe({\r\n next: (response) => {\r\n this.documentStore.setDocumentListResponse(response);\r\n },\r\n error: (error) => {\r\n console.error(ERRORS.ERROR_CALLING_API_WITH_SELECTION, error);\r\n }\r\n });\r\n \r\n // Initialize the selection watcher for future updates\r\n this.initializeSelectionWatcher(contextId);\r\n }\r\n\r\n /**\r\n * Clean up the selection watcher subscription\r\n */\r\n cleanupSelectionWatcher(): void {\r\n if (this.selectionWatcherSubscription) {\r\n this.selectionWatcherSubscription.unsubscribe();\r\n this.selectionWatcherSubscription = null;\r\n }\r\n }\r\n\r\n /**\r\n * Set the document data\r\n * @param document the document data\r\n */\r\n set(document: DocumentModel | null) {\r\n this.documentStore.setCurrentDocument(document);\r\n }\r\n\r\n /**\r\n * Get the document data\r\n * @returns the document data\r\n */\r\n get(): Observable<DocumentModel | null> {\r\n return this.documentQuery.selectCurrentDocument();\r\n }\r\n\r\n /**\r\n * Get the current document value synchronously\r\n * @returns the current document value\r\n */\r\n getValue(): DocumentModel | null {\r\n return this.documentQuery.getCurrentDocument();\r\n }\r\n\r\n /**\r\n * Set the selected menu item\r\n * @param menuItem the selected menu item _id (not the label)\r\n */\r\n setSelectedMenuItem(menuItem: string | null): void {\r\n this.documentStore.setSelectedMenuItem(menuItem);\r\n }\r\n\r\n /**\r\n * Set the selected user ID\r\n * @param userId the selected user ID\r\n */\r\n setSelectedUserId(userId: string | null): void {\r\n this.documentStore.setSelectedUserId(userId);\r\n }\r\n\r\n /**\r\n * Set the selected status\r\n * @param status the selected status\r\n */\r\n setSelectedStatus(status: string | null): void {\r\n this.documentStore.setSelectedStatus(status);\r\n }\r\n\r\n /**\r\n * Set the search key\r\n * @param searchKey the search term\r\n */\r\n setSearchKey(searchKey: string | null): void {\r\n this.documentStore.setSearchKey(searchKey);\r\n }\r\n\r\n /**\r\n * Set all selection state at once\r\n * @param menuItem the selected menu item _id (not the label)\r\n * @param userId the selected user ID\r\n * @param status the selected status\r\n * @param searchKey the search term\r\n */\r\n setSelectionState(menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null = null): void {\r\n this.documentStore.setSelectionState(menuItem, userId, status, searchKey);\r\n }\r\n\r\n /**\r\n * Clear all selection state\r\n */\r\n clearSelectionState(): void {\r\n this.documentStore.clearSelectionState();\r\n }\r\n\r\n /**\r\n * Set user list visibility\r\n * @param show whether to show the user list\r\n */\r\n setShowUserList(show: boolean): void {\r\n this.documentStore.setShowUserList(show);\r\n }\r\n\r\n /**\r\n * Get the current selection state\r\n * @returns observable of the current selection state\r\n */\r\n getSelectionState(): Observable<{menuItem: string | null, userId: string | null, status: string | null}> {\r\n return this.documentQuery.selectSelectionState();\r\n }\r\n\r\n /**\r\n * Get the current selection state value synchronously\r\n * @returns the current selection state value\r\n */\r\n getSelectionStateValue(): {menuItem: string | null, userId: string | null, status: string | null} {\r\n return this.documentQuery.getSelectionState();\r\n }\r\n\r\n /**\r\n * Set status data in the store\r\n * @param statusData the status data to set\r\n */\r\n setStatusData(statusData: any[]): void {\r\n this.documentStore.setStatusData(statusData);\r\n }\r\n\r\n /**\r\n * Set user list in the store\r\n * @param userList the user list to set\r\n */\r\n setUserList(userList: any[]): void {\r\n this.documentStore.setUserList(userList);\r\n }\r\n\r\n /**\r\n * Get observable for filtered documents\r\n * @returns Observable that emits filtered document responses\r\n */\r\n getFilteredDocuments(): Observable<any> {\r\n return this.documentQuery.selectDocumentListResponse();\r\n }\r\n\r\n /**\r\n * Manually trigger API call with current selection state\r\n * @param contextId - The context ID to use for the API call\r\n */\r\n refreshDocumentsWithCurrentSelection(contextId: string): void {\r\n const currentState = this.documentQuery.getSelectionState();\r\n this.documentHttpService.getDocumentsBySelection(\r\n contextId,\r\n null, // No menu item filtering\r\n currentState.userId,\r\n currentState.status,\r\n currentState.searchKey\r\n ).subscribe({\r\n next: (response) => {\r\n // Set the correct response structure - check if response has documents property\r\n const documentListResponse = response.documents || response;\r\n this.documentStore.setDocumentListResponse(documentListResponse);\r\n // Check if the selected menu item's section is still visible after filtering\r\n this.checkAndDeselectMenuItemIfSectionNotVisible(contextId);\r\n },\r\n error: (error) => {\r\n throw new Error(error)\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Force refresh documents with no filters\r\n * @param contextId - The context ID to use for the API call\r\n */\r\n refreshDocumentsWithoutFilters(contextId: string): void {\r\n this.documentHttpService.getDocumentsBySelection(\r\n contextId,\r\n null,\r\n null,\r\n null\r\n ).subscribe({\r\n next: (response) => {\r\n this.documentStore.setDocumentListResponse(response);\r\n },\r\n error: (error) => {\r\n console.error('Error in force refresh:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refresh status data for a specific context\r\n * @param contextId - The context ID to use for the API call\r\n * @param statusContextId - The status context ID (usually userId)\r\n * @param categoryId - The category ID (usually menuItem)\r\n */\r\n refreshStatusData(contextId: string, statusContextId: string | null, categoryId: string | null): void {\r\n this.documentHttpService.getStatusDocumentCount(contextId, statusContextId, categoryId).subscribe({\r\n next: (statusData) => {\r\n this.documentStore.setStatusData(statusData);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing status data:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refresh all data with current filters after accept/reject/delete operations\r\n * This includes document categories, status data, user list, and document list\r\n * \r\n * This method ensures that after a document action (accept/reject/delete):\r\n * 1. Document categories are refreshed\r\n * 2. Status counts are refreshed with current user filters\r\n * 3. User list is refreshed with current filters (if applicable)\r\n * 4. Document list is refreshed with current filters (user, status, search)\r\n * \r\n * Filter application:\r\n * - Document categories: Uses base contextId\r\n * - Status data: Uses userId as contextId (no category filtering)\r\n * - User list: Uses base contextId (can be enhanced with additional filters if API supports)\r\n * - Document list: Uses current filters (userId, status, searchKey)\r\n * \r\n * @param contextId - The context ID to use for the API calls\r\n */\r\n refreshAllDataWithCurrentFilters(contextId: string): void {\r\n const currentState = this.documentQuery.getSelectionState();\r\n const statusContextId = currentState.userId || null;\r\n \r\n // Refresh document categories\r\n this.documentHttpService.getDocumentCatagories(contextId).subscribe({\r\n next: (response) => {\r\n this.documentStore.setDocumentCategories(response);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing document categories after action:', error);\r\n }\r\n });\r\n \r\n // Refresh status data (no category filtering)\r\n this.documentHttpService.getStatusDocumentCount(contextId, statusContextId, null).subscribe({\r\n next: (statusData) => {\r\n this.documentStore.setStatusData(statusData);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing status data after action:', error);\r\n }\r\n });\r\n \r\n // Refresh user list\r\n this.documentHttpService.getUserListByContextId(contextId).subscribe({\r\n next: (userList) => {\r\n this.documentStore.setUserList(userList);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing user list after action:', error);\r\n }\r\n });\r\n this.refreshDocumentsWithCurrentSelection(contextId);\r\n }\r\n\r\n /**\r\n * Checks if the currently selected menu item's section is visible in the filtered document list\r\n * and deselects it if not visible\r\n * @param contextId - The context ID to use for API calls\r\n */\r\n checkAndDeselectMenuItemIfSectionNotVisible(contextId: string): void {\r\n const currentState = this.documentQuery.getSelectionState();\r\n const selectedMenuItem = currentState.menuItem;\r\n \r\n if (selectedMenuItem) {\r\n // Get the current document list response\r\n const documentListResponse = this.documentQuery.getDocumentListResponse();\r\n \r\n // Check if the menu item's section is visible and deselect if not\r\n const wasDeselected = this.documentMenuService.deselectMenuItemIfSectionNotVisible(\r\n selectedMenuItem, \r\n documentListResponse\r\n );\r\n \r\n // Menu item was deselected if its section is not visible\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { DocumentStore } from './document.store';\r\nimport { Observable, tap } from 'rxjs';\r\nimport { AppConfigService } from '../../../Shared/services/app-config.service';\r\nimport { URLS } from '../../../Shared/constant/URLS';\r\nimport { DocumentModel } from '../models/document.model';\r\n\r\n/**\r\n * Service for managing document-related operations.\r\n * The `DocumentService` acts as a bridge between the application and the backend API for handling document-related data.\r\n * It interacts with the `DocumentStore` for state management and uses `HttpClient` for making HTTP requests.\r\n * Creates an instance of `DocumentService`.\r\n * @param {DocumentStore} documentStore - The store that manages the state of documents.\r\n * @param {HttpClient} http - The Angular HTTP client for making API requests.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DocumentService {\r\n\r\n /**\r\n * Creates an instance of DocumentService.\r\n * @param {DocumentStore} documentStore - Store managing the state of documents.\r\n * @param {HttpClient} http - Angular HTTP client for making API requests.\r\n * @param {AppConfigService} appConfigService - Service for retrieving application configuration, such as API base URL.\r\n */\r\n constructor(\r\n public documentStore: DocumentStore,\r\n private http: HttpClient,\r\n public appConfigService: AppConfigService\r\n ) { }\r\n\r\n /**\r\n * Get api url from appConfigService.\r\n * @readonly\r\n * @type {string}\r\n */\r\n get apiUrl(): string {\r\n return this.appConfigService.apiBaseUrl;\r\n }\r\n\r\n /**\r\n * Sends a request to create a new document.\r\n * @param {*} entity - The data of the document to be created.\r\n * @returns {Observable<any>} Observable that emits the newly created document.\r\n */\r\n create(entity: any): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}`, entity).pipe(\r\n tap((newEntity: any) => this.documentStore.add(newEntity))\r\n );\r\n }\r\n\r\n /**\r\n * Fetches all documents from the backend.\r\n * @returns {Observable<DocumentModel[]>} Observable that emits an array of documents.\r\n */\r\n getAll(): Observable<DocumentModel[]> {\r\n return this.http.get<DocumentModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}`).pipe(\r\n tap((entities: DocumentModel[]) => this.documentStore.set(entities))\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document by its ID.\r\n * @param {string} id - The unique identifier of the document.\r\n * @returns {Observable<any>} Observable that emits the retrieved document.\r\n */\r\n getById(id: string): Observable<any> {\r\n return this.http.get<any>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${id}`).pipe(\r\n tap((entity: any) => this.documentStore.upsert(id, entity))\r\n );\r\n }\r\n\r\n /**\r\n * Updates an existing document by its ID.\r\n * @param {string} id - The unique identifier of the document.\r\n * @param {DocumentModel} entity - The updated data of the document.\r\n * @returns {Observable<DocumentModel>} Observable that emits the updated document.\r\n */\r\n update(id: string, entity: DocumentModel): Observable<DocumentModel> {\r\n return this.http.put<DocumentModel>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${id}`, entity).pipe(\r\n tap((updatedEntity: DocumentModel) => this.documentStore.update(id, updatedEntity))\r\n );\r\n }\r\n\r\n /**\r\n * Deletes a document by its ID.\r\n * @param {string} id - The unique identifier of the document to be deleted.\r\n * @returns {Observable<void>} Observable that completes when the document is deleted.\r\n */\r\n delete(id: string): Observable<void> {\r\n return this.http.delete<void>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}/${id}`).pipe(\r\n tap(() => this.documentStore.remove(id))\r\n );\r\n }\r\n}\r\n","import { Injectable, EventEmitter } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { DocumentService } from '../state/document.service';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { MessageService } from 'primeng/api';\r\n\r\n/**\r\n * Service for handling document uploads.\r\n * @class DocumentUploadService\r\n * @typedef {DocumentUploadService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadService {\r\n\r\n /**\r\n * Event emitter for upload completion\r\n */\r\n uploadCompleted = new EventEmitter<{file: File, response: any}>();\r\n\r\n /**\r\n * The file to upload.\r\n * @type {*}\r\n */\r\n uploadedFile: any;\r\n\r\n /**\r\n * Represent contextId\r\n * @type {string}\r\n */\r\n contextId: string = SHARED.EMPTY;\r\n\r\n /**\r\n * Represent document name\r\n * @type {string}\r\n */\r\n docName: string = SHARED.EMPTY\r\n\r\n /**\r\n * Represent document id\r\n * @type {string}\r\n */\r\n docTypeId: string = SHARED.EMPTY\r\n\r\n /**\r\n * Creates an instance of DocumentUploadService.\r\n * @param {DocumentService} documentService - Service for handling document uploads.\r\n * @param {DocumentStore} documentUploadStore - Store for managing uploaded documents.\r\n * @param {MessageService} messageService - Service for displaying messages.\r\n * @returns {void}\r\n */\r\n constructor(public documentService: DocumentService, public documentUploadStore: DocumentStore, public messageService: MessageService) { }\r\n\r\n /**\r\n * Prepares the files for upload by creating a FormData object.\r\n * This method appends each file to the FormData for submission.\r\n * @returns {Promise<any>} Promise that resolves when upload completes\r\n */\r\n handleTemplatedUpload(file: File, contextId: string): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n let formsData = this.handleCreateFormData(file, contextId)\r\n if (!formsData) {\r\n const error = new Error('Failed to create form data');\r\n this.messageService.add({severity: SHARED.SEVERITY,summary: SHARED.UPLOAD_ERROR_SUMMERY,detail: SHARED.UPLOAD_ERROR_DETAILS});\r\n reject(error);\r\n return;\r\n }\r\n this.documentService.create(formsData)\r\n .subscribe({\r\n /**\r\n * Handles the successful upload event.\r\n * Updates the list of uploaded files and emits the file ID.\r\n * @returns {void}\r\n */\r\n next: (event) => {\r\n this.documentUploadStore.setUploadedDocumentFiles(event)\r\n this.documentUploadStore.setMessage([{severity: SHARED.SUCCESS_SEVERITY,detail : SHARED.UPLOAD_SUCCESS}]);\r\n this.uploadCompleted.emit({file: file, response: event});\r\n resolve(event);\r\n },\r\n /**\r\n * Handles the error event during file upload.\r\n * Updates the progress of the file to indicate failure.\r\n * @param {any} error - The error object returned by the upload service.\r\n */\r\n error: (error) => {\r\n this.messageService.add({severity: SHARED.SEVERITY,summary: SHARED.UPLOAD_SUMMERY,detail: error?.message});\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Uploads multiple files sequentially using promises\r\n * @param files - Array of files to upload\r\n * @param contextId - The context ID for upload\r\n * @returns {Promise<any[]>} Promise that resolves with all upload responses\r\n */\r\n async uploadFilesSequentially(files: File[], contextId: string): Promise<any[]> {\r\n const results: any[] = [];\r\n \r\n for (const file of files) {\r\n try {\r\n const result = await this.handleTemplatedUpload(file, contextId);\r\n results.push(result);\r\n } catch (error) {\r\n console.error(`Failed to upload file ${file.name}:`, error);\r\n results.push({ error: true, fileName: file.name, errorMessage: error });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n\r\n /**\r\n * Alternative method to upload files sequentially with progress tracking\r\n * @param files - Array of files to upload\r\n * @param contextId - The context ID for upload\r\n * @param onProgress - Optional callback for progress updates\r\n * @returns {Promise<any[]>} Promise that resolves with all upload responses\r\n */\r\n async uploadFilesSequentiallyWithProgress(\r\n files: File[], \r\n contextId: string, \r\n onProgress?: (currentFile: File, currentIndex: number, totalFiles: number) => void\r\n ): Promise<any[]> {\r\n const results: any[] = [];\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n if (onProgress) {\r\n onProgress(file, i, files.length);\r\n }\r\n \r\n try {\r\n const result = await this.handleTemplatedUpload(file, contextId);\r\n results.push(result);\r\n } catch (error) {\r\n console.error(`Failed to upload file ${file.name}:`, error);\r\n results.push({ error: true, fileName: file.name, errorMessage: error });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n\r\n /**\r\n * Get the file and contextId\r\n * @param file - The file to upload.\r\n * @param contextId - The contextId to upload.\r\n */\r\n getUploadFileData(file: File, contextId: string) {\r\n if (file && contextId) {\r\n this.uploadedFile = file;\r\n this.contextId = contextId;\r\n }\r\n }\r\n\r\n /**\r\n * Get the document name and document type id\r\n * @param documentName - The document name to upload.\r\n * @param documentTypeId - The document type id to upload.\r\n */\r\n getDocumentNameAndType(documentTypeId: string) {\r\n if (documentTypeId && documentTypeId !== SHARED.EMPTY) {\r\n this.docTypeId = documentTypeId\r\n }\r\n }\r\n\r\n /**\r\n * Handle the creation of formdata.\r\n * @returns {*} - The formdata object.\r\n */\r\n handleCreateFormData(uploadedFile?: File, contextId?: string) {\r\n \r\n if (uploadedFile) {\r\n let formData = new FormData();\r\n formData.append(SHARED.FILE, uploadedFile, uploadedFile.name);\r\n formData.append(SHARED.CONTEXT_ID, this.contextId || contextId || SHARED.EMPTY)\r\n return formData;\r\n }else{\r\n return null;\r\n }\r\n \r\n }\r\n\r\n /**\r\n * Generic method to sort any list of objects by a specified property.\r\n * Supports fallback properties if the primary property is undefined.\r\n * @param list - Array of objects to sort\r\n * @param primaryProperty - Primary property to sort by\r\n * @param fallbackProperty - Optional fallback property if primary is undefined\r\n * @returns Sorted array\r\n */\r\n sortListByProperty<T>(list: T[], primaryProperty: keyof T, fallbackProperty?: keyof T): T[] {\r\n return list.sort((a, b) => {\r\n const valueA = a[primaryProperty] || (fallbackProperty ? a[fallbackProperty] : SHARED.EMPTY);\r\n const valueB = b[primaryProperty] || (fallbackProperty ? b[fallbackProperty] : SHARED.EMPTY);\r\n \r\n if (typeof valueA === 'string' && typeof valueB === 'string') {\r\n return valueA.localeCompare(valueB);\r\n }\r\n if (valueA < valueB) return -1;\r\n if (valueA > valueB) return 1;\r\n return 0;\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { PrimeNGConfig } from 'primeng/api';\r\n\r\n/**\r\n * Description placeholder\r\n * @class FileFormatService\r\n * @typedef {FileFormatService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FileFormatService {\r\n\r\n /**\r\n * Creates an instance of FileFormatService.\r\n * @constructor\r\n */\r\n constructor() { }\r\n\r\n /**\r\n * Description placeholder\r\n * @param {number} bytes\r\n * @param {PrimeNGConfig} config\r\n * @returns {string}\r\n */\r\n formatFileSize(bytes: number, config:PrimeNGConfig): string {\r\n const kilobyte = 1024;\r\n const decimalPlaces = SHARED.ONE;\r\n const sizes = config.translation.fileSizeTypes || SHARED.FILE_SIZE_UNITS;\r\n if (bytes < kilobyte) {\r\n return `${bytes} ${sizes[SHARED.INITIAL_COUNT]}`;\r\n } else if (bytes < kilobyte * kilobyte) {\r\n const kbSize = bytes / kilobyte;\r\n return `${parseFloat(kbSize.toFixed(decimalPlaces))} ${sizes[SHARED.ONE]}`;\r\n } else {\r\n const mbSize = bytes / (kilobyte * kilobyte);\r\n return `${parseFloat(mbSize.toFixed(decimalPlaces))} ${sizes[SHARED.TWO]}`;\r\n }\r\n }\r\n\r\n /**\r\n * Validates if a file has an allowed extension\r\n * @param fileName - The name of the file to validate\r\n * @returns True if the file extension is allowed, false otherwise\r\n */\r\n isAllowedFileType(fileName: string): boolean {\r\n const allowedExtensions = SHARED.FILE_TYPES;\r\n \r\n const fileExtension = fileName.toLowerCase().split('.').pop();\r\n return fileExtension ? allowedExtensions.includes(fileExtension) : false;\r\n }\r\n\r\n /**\r\n * Gets the list of allowed file extensions\r\n * @returns Array of allowed file extensions\r\n */\r\n getAllowedFileExtensions(): string[] {\r\n return SHARED.FILE_TYPES;\r\n }\r\n\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject, takeUntil } from 'rxjs';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { FileFormatService } from './file-format.service';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { UploadedFileResponse } from '../models/uploaded-file-response.model';\r\n\r\nexport interface UploadedFile {\r\n file: File;\r\n formattedSize?: string;\r\n progress?: number;\r\n uploadResponse?: UploadedFileResponse; // Store the upload response for later use\r\n url?: string; // Store the file URL from upload response\r\n contentType?: string;\r\n fileName?: string; // Store the file name from upload response\r\n size?: string; // Store the formatted size from upload response\r\n}\r\n\r\nexport interface DocumentUploadPayload {\r\n source: 'Applicant' | 'Application';\r\n documentTypeId: string;\r\n contextIds?: string[]; // Array of applicant IDs for multiple applicants\r\n contextId?: string; // Single context ID for Application type\r\n documents: {\r\n fileName: string;\r\n fileSize: number;\r\n uploadedFileId?: string;\r\n url?: string; // Store the file URL from upload response\r\n contentType?: string;\r\n size?: string; // Store the formatted size from upload response\r\n }[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadBusinessService {\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private documentHttpService: DocumentHttpService,\r\n private fileFormatService: FileFormatService\r\n ) {}\r\n\r\n /**\r\n * Loads applicants for a given context ID\r\n */\r\n loadApplicants(contextId: string): Observable<UserListModel[]> {\r\n return this.documentHttpService.getUserListByContextId(contextId);\r\n }\r\n\r\n /**\r\n * Loads categories based on assignment type\r\n */\r\n loadCategories(assignmentType: string): Observable<DocumentCategory[]> {\r\n return this.documentHttpService.getCategoriesBySource(assignmentType);\r\n }\r\n /**\r\n * Loads categories based on assignment type\r\n */\r\n loadBrokerCategories(assignmentType: string): Observable<DocumentCategory[]> {\r\n return this.documentHttpService.getBrokerDocumentCatagoriesBySource(assignmentType);\r\n }\r\n\r\n /**\r\n * Loads document types based on category\r\n */\r\n loadDocumentTypes(categoryId: string): Observable<DocumentTypeModel[]> {\r\n return this.documentHttpService.getDocumentTypesByCategory(categoryId);\r\n }\r\n\r\n /**\r\n * Loads broker document types based on category\r\n */\r\n loadBrokerDocumentTypes(categoryId: string): Observable<DocumentTypeModel[]> {\r\n return this.documentHttpService.getBrokerDocumentTypesByCategoryId(categoryId);\r\n }\r\n\r\n /**\r\n * Filters applicants based on assignment type\r\n */\r\n filterApplicants(applicantList: UserListModel[], assignmentType: 'Applicant' | 'Application'): UserListModel[] {\r\n if (assignmentType === SHARED.APPLICANT) {\r\n return applicantList.filter(applicant => applicant.name !== SHARED.APPLICATION_DOCS);\r\n } else {\r\n return applicantList.filter(applicant => applicant.name === SHARED.APPLICATION_DOCS);\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to validate form data and return validation result\r\n */\r\n private validateFormData(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n categoryOptions: DocumentCategory[],\r\n documentTypeOptions: DocumentTypeModel[]\r\n ): { isValid: boolean; message: string } {\r\n // Check assignment type\r\n if (!assignmentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_ASSIGNMENT_TYPE };\r\n }\r\n\r\n // Check if options are loaded\r\n if (!categoryOptions.length || !documentTypeOptions.length) {\r\n return { isValid: false, message: SHARED.VALIDATION_OPTIONS_NOT_LOADED };\r\n }\r\n\r\n // Check category\r\n if (!selectedCategory) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_CATEGORY };\r\n }\r\n\r\n // Check document type\r\n if (!selectedDocumentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_DOCUMENT_TYPE };\r\n }\r\n\r\n // Check files\r\n if (uploadedFiles.length === 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_UPLOAD_AT_LEAST_ONE };\r\n }\r\n\r\n // Check if all files are uploaded\r\n const incompleteFiles = uploadedFiles.filter(file => file.progress !== 100);\r\n if (incompleteFiles.length > 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_WAIT_FOR_UPLOAD };\r\n }\r\n\r\n // For Applicant type, check applicant selection\r\n if (assignmentType === SHARED.APPLICANT && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_APPLICANT };\r\n }\r\n\r\n return { isValid: true, message: SHARED.VALIDATION_ALL_FIELDS_COMPLETED };\r\n }\r\n\r\n /**\r\n * Validates form data\r\n */\r\n validateForm(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n categoryOptions: DocumentCategory[],\r\n documentTypeOptions: DocumentTypeModel[]\r\n ): boolean {\r\n return this.validateFormData(\r\n assignmentType,\r\n selectedCategory,\r\n selectedDocumentType,\r\n selectedApplicants,\r\n uploadedFiles,\r\n categoryOptions,\r\n documentTypeOptions\r\n ).isValid;\r\n }\r\n\r\n /**\r\n * Checks if save button should be disabled\r\n */\r\n isSaveButtonDisabled(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n isSaving: boolean\r\n ): boolean {\r\n if (isSaving) {\r\n return true;\r\n }\r\n\r\n // For button state, we only need to check if required fields are filled\r\n // We don't need to validate if options are loaded\r\n if (!assignmentType) {\r\n return true;\r\n }\r\n\r\n if (!selectedCategory) {\r\n return true;\r\n }\r\n\r\n if (!selectedDocumentType) {\r\n return true;\r\n }\r\n\r\n if (uploadedFiles.length === 0) {\r\n return true;\r\n }\r\n\r\n // Check if all files are uploaded\r\n const incompleteFiles = uploadedFiles.filter(file => file.progress !== 100);\r\n if (incompleteFiles.length > 0) {\r\n return true;\r\n }\r\n\r\n // For Applicant type, check applicant selection\r\n if (assignmentType === SHARED.APPLICANT && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return true;\r\n }\r\n\r\n return false; // Button should be enabled\r\n }\r\n\r\n /**\r\n * Validates the complete payload before save\r\n */\r\n validatePayload(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[]\r\n ): { isValid: boolean; message: string } {\r\n // Check assignment type\r\n if (!assignmentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_ASSIGNMENT_TYPE };\r\n }\r\n\r\n // Check category\r\n if (!selectedCategory) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_CATEGORY };\r\n }\r\n\r\n // Check document type\r\n if (!selectedDocumentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_DOCUMENT_TYPE };\r\n }\r\n\r\n // Check files\r\n if (uploadedFiles.length === 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_UPLOAD_AT_LEAST_ONE };\r\n }\r\n\r\n // Check if all files are uploaded\r\n const incompleteFiles = uploadedFiles.filter(file => file.progress !== 100);\r\n if (incompleteFiles.length > 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_WAIT_FOR_UPLOAD };\r\n }\r\n\r\n // For Applicant type, check applicant selection\r\n if (assignmentType === SHARED.APPLICANT && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_APPLICANT };\r\n }\r\n\r\n return { isValid: true, message: SHARED.VALIDATION_ALL_FIELDS_COMPLETED };\r\n }\r\n\r\n /**\r\n * Prepares upload payload\r\n */\r\n prepareUploadPayload(\r\n assignmentType: 'Applicant' | 'Application',\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n contextId: string\r\n ): DocumentUploadPayload {\r\n const payload: DocumentUploadPayload = {\r\n source: assignmentType,\r\n documentTypeId: selectedDocumentType,\r\n documents: uploadedFiles.map(file => ({\r\n fileName: file.file.name,\r\n fileSize: file.file.size,\r\n url: file.url,\r\n contentType: file.contentType,\r\n size: file.size,\r\n uploadedFileId: file.uploadResponse?.id || file.uploadResponse?.fileName || file.file.name\r\n }))\r\n };\r\n\r\n // For Applicant type, include the contextIds array\r\n if (assignmentType === SHARED.APPLICANT && selectedApplicants && selectedApplicants.length > 0) {\r\n payload.contextIds = selectedApplicants;\r\n } else {\r\n // For Application type, use contextId\r\n payload.contextId = contextId;\r\n }\r\n\r\n return payload;\r\n }\r\n\r\n /**\r\n * Saves document upload\r\n */\r\n saveDocumentUpload(payload: DocumentUploadPayload): Observable<any> {\r\n return this.documentHttpService.saveDocumentUpload(payload);\r\n }\r\n\r\n /**\r\n * Formats file size\r\n */\r\n formatFileSize(fileSize: number, config: any): string {\r\n return this.fileFormatService.formatFileSize(fileSize, config);\r\n }\r\n\r\n /**\r\n * Creates uploaded file object\r\n */\r\n createUploadedFile(file: File, formattedSize: string): UploadedFile {\r\n return {\r\n file,\r\n formattedSize,\r\n progress: SHARED.UPLOAD_PROGRESS_10 \r\n };\r\n }\r\n\r\n /**\r\n * Resets form data to initial state\r\n */\r\n getInitialFormState() {\r\n return {\r\n selectedAssignmentType: null,\r\n selectedApplicants: [] as string[],\r\n selectedCategory: null,\r\n selectedDocumentType: null,\r\n uploadedFiles: [] as UploadedFile[],\r\n isFormValid: false\r\n };\r\n }\r\n\r\n /**\r\n * Destroys the service\r\n */\r\n destroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { MessageService } from 'primeng/api';\r\nimport { UploadedFile } from './document-upload-business.service';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadFormService {\r\n constructor(private messageService: MessageService) {}\r\n\r\n /**\r\n * Shows error message\r\n */\r\n showErrorMessage(summary: string, detail: string): void {\r\n this.messageService.add({\r\n severity: 'error',\r\n summary,\r\n detail\r\n });\r\n }\r\n\r\n /**\r\n * Shows warning message\r\n */\r\n showWarningMessage(summary: string, detail: string): void {\r\n this.messageService.add({\r\n severity: 'warn',\r\n summary,\r\n detail\r\n });\r\n }\r\n\r\n /**\r\n * Shows success message\r\n */\r\n showSuccessMessage(summary: string, detail: string): void {\r\n this.messageService.add({\r\n severity: 'success',\r\n summary,\r\n detail\r\n });\r\n }\r\n\r\n /**\r\n * Helper method to validate required fields and show appropriate messages\r\n */\r\n private validateRequiredFieldsWithMessages(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedApplicants: string[],\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n uploadedFiles: UploadedFile[]\r\n ): { isValid: boolean; field: string | null } {\r\n if (assignmentType === 'Applicant' && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return { isValid: false, field: 'applicant' };\r\n }\r\n\r\n if (!selectedCategory) {\r\n return { isValid: false, field: 'category' };\r\n }\r\n\r\n if (!selectedDocumentType) {\r\n return { isValid: false, field: 'documentType' };\r\n }\r\n\r\n if (uploadedFiles.length === 0) {\r\n return { isValid: false, field: 'documents' };\r\n }\r\n\r\n return { isValid: true, field: null };\r\n }\r\n\r\n /**\r\n * Validates required fields for upload\r\n */\r\n validateRequiredFields(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedApplicants: string[],\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n uploadedFiles: UploadedFile[]\r\n ): boolean {\r\n const validation = this.validateRequiredFieldsWithMessages(\r\n assignmentType,\r\n selectedApplicants,\r\n selectedCategory,\r\n selectedDocumentType,\r\n uploadedFiles\r\n );\r\n\r\n if (!validation.isValid) {\r\n this.showValidationMessage(validation.field!);\r\n }\r\n\r\n return validation.isValid;\r\n }\r\n\r\n /**\r\n * Shows appropriate validation message based on the field that failed\r\n */\r\n private showValidationMessage(field: string): void {\r\n const messages: Record<string, { summary: string; detail: string }> = {\r\n applicant: { \r\n summary: SHARED.VALIDATION_NO_APPLICANT_SELECTED, \r\n detail: SHARED.VALIDATION_NO_APPLICANT_DETAIL \r\n },\r\n category: { \r\n summary: SHARED.VALIDATION_NO_CATEGORY_SELECTED, \r\n detail: SHARED.VALIDATION_NO_CATEGORY_DETAIL \r\n },\r\n documentType: { \r\n summary: SHARED.VALIDATION_NO_DOCUMENT_TYPE_SELECTED, \r\n detail: SHARED.VALIDATION_NO_DOCUMENT_TYPE_DETAIL \r\n },\r\n documents: { \r\n summary: SHARED.VALIDATION_NO_DOCUMENTS_UPLOADED, \r\n detail: SHARED.VALIDATION_NO_DOCUMENTS_DETAIL \r\n }\r\n };\r\n\r\n const message = messages[field];\r\n if (message) {\r\n this.showWarningMessage(message.summary, message.detail);\r\n }\r\n }\r\n\r\n /**\r\n * Validates form completeness\r\n */\r\n validateFormCompleteness(): boolean {\r\n this.showWarningMessage(\r\n SHARED.VALIDATION_FORM_INCOMPLETE, \r\n SHARED.VALIDATION_FORM_INCOMPLETE_DETAIL\r\n );\r\n return false;\r\n }\r\n\r\n /**\r\n * Validates context ID presence\r\n */\r\n validateContextId(contextId: string, message: string): boolean {\r\n if (!contextId) {\r\n this.showErrorMessage(SHARED.VALIDATION_MISSING_REQUIRED_DATA, message);\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject, takeUntil } from 'rxjs';\r\nimport { DocumentUploadBusinessService } from './document-upload-business.service';\r\nimport { DocumentUploadFormService } from './document-upload-form.service';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\n\r\nexport interface DataLoadingState {\r\n isLoadingApplicants: boolean;\r\n isLoadingCategories: boolean;\r\n isLoadingDocumentTypes: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadDataService {\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private businessService: DocumentUploadBusinessService,\r\n private formService: DocumentUploadFormService\r\n ) {}\r\n\r\n /**\r\n * Loads applicants and handles the response\r\n */\r\n loadApplicants(\r\n contextId: string,\r\n onSuccess: (applicants: UserListModel[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<UserListModel[]> {\r\n if (!this.formService.validateContextId(contextId, 'Context ID is required to load applicants.')) {\r\n return new Observable();\r\n }\r\n return this.businessService.loadApplicants(contextId);\r\n }\r\n\r\n /**\r\n * Loads categories and handles the response\r\n */\r\n loadCategories(\r\n assignmentType: string,\r\n onSuccess: (categories: DocumentCategory[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentCategory[]> {\r\n if (!assignmentType) {\r\n return new Observable();\r\n }\r\n return this.businessService.loadCategories(assignmentType);\r\n }\r\n /**\r\n * Loads categories and handles the response\r\n */\r\n loadBrokerCategories(\r\n assignmentType: string,\r\n onSuccess: (categories: DocumentCategory[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentCategory[]> {\r\n if (!assignmentType) {\r\n return new Observable();\r\n }\r\n return this.businessService.loadBrokerCategories(assignmentType);\r\n }\r\n\r\n /**\r\n * Loads broker document types and handles the response\r\n */\r\n loadBrokerDocumentTypes(\r\n categoryId: string,\r\n onSuccess: (documentTypes: DocumentTypeModel[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentTypeModel[]> {\r\n return this.businessService.loadBrokerDocumentTypes(categoryId);\r\n }\r\n /**\r\n * Loads document types and handles the response\r\n */\r\n loadDocumentTypes(\r\n categoryId: string,\r\n onSuccess: (documentTypes: DocumentTypeModel[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentTypeModel[]> {\r\n return this.businessService.loadDocumentTypes(categoryId);\r\n }\r\n\r\n /**\r\n * Handles applicants loaded successfully\r\n */\r\n handleApplicantsLoaded(\r\n applicants: UserListModel[],\r\n assignmentType: 'Applicant' | 'Application' | null\r\n ): UserListModel[] {\r\n return this.businessService.filterApplicants(applicants, assignmentType!);\r\n }\r\n\r\n /**\r\n * Destroys the service\r\n */\r\n destroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, Input, ViewChild, ViewEncapsulation, OnDestroy, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { FileUpload } from 'primeng/fileupload';\r\nimport { MessageService } from 'primeng/api';\r\nimport { PrimeNGConfig } from 'primeng/api';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { FileFormatService } from '../../services/file-format.service';\r\nimport { DocumentService } from '../../state/document.service';\r\nimport { DocumentUploadService } from '../../services/document-upload.service';\r\nimport { DocumentUploadBusinessService, UploadedFile } from '../../services/document-upload-business.service';\r\nimport { DocumentUploadFormService } from '../../services/document-upload-form.service';\r\nimport { DocumentUploadDataService } from '../../services/document-upload-data.service';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentTypeModel } from '../../models/document-type.model';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n/**\r\n * Component responsible for handling document uploads with templated metadata.\r\n * Provides a comprehensive interface for uploading documents with assignment types,\r\n * categories, document types, and applicant selection.\r\n */\r\n@Component({\r\n selector: 'lib-document-upload',\r\n templateUrl: './document-upload.component.html',\r\n styleUrls: ['./document-upload.component.scss'],\r\n standalone: false,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class DocumentUploadComponent implements OnInit, OnChanges, OnDestroy {\r\n /** The context ID for the document upload operation */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n\r\n /** Indicates if the document save button has been clicked */\r\n @Input() isDocumentSaveBtnClicked: boolean = false;\r\n\r\n /** Indicates if the document sidebar is closed */\r\n @Input() isDocumentSidebarClosed: boolean = false;\r\n\r\n /** Whether there are unsaved changes in the form */\r\n hasUnsavedChanges: boolean = false;\r\n /** Whether to hide the form and show only upload functionality */\r\n @Input() isFormHide: boolean = false;\r\n \r\n /** Whether to hide the multi-attachment button */\r\n @Input() isMultiAttachmentHidden: boolean = false;\r\n \r\n /** Reference to the file upload component */\r\n @ViewChild('fileUploader') fileUploader!: FileUpload;\r\n \r\n /** Event emitted when form validation state changes */\r\n @Output() onFormValidationChange = new EventEmitter<void>();\r\n \r\n /** Event emitted when upload is successful */\r\n @Output() onUploadSuccess = new EventEmitter<void>();\r\n \r\n /** Event emitted when files are uploaded (for form-hidden mode) */\r\n @Output() onFilesUploaded = new EventEmitter<UploadedFile[]>();\r\n @Output() hasUnsavedChangesChange = new EventEmitter<boolean>();\r\n \r\n /** Event emitted when a file is removed (for form-hidden mode) */\r\n @Output() onFileRemoved = new EventEmitter<{file: File, index: number}>();\r\n \r\n /** Currently selected assignment type (Applicant or Application) */\r\n selectedAssignmentType: 'Applicant' | 'Application' | null = null;\r\n \r\n /** Currently selected applicant IDs (array for multiple selection) */\r\n selectedApplicants: string[] = [];\r\n \r\n /** Currently selected document category */\r\n selectedCategory: string = SHARED.EMPTY;\r\n \r\n /** Currently selected document type */\r\n selectedDocumentType: string = SHARED.EMPTY;\r\n \r\n /** List of available applicants */\r\n applicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Filtered list of applicants based on current selection */\r\n filteredApplicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Available document categories for the selected assignment type */\r\n categoryOptions: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Available document types for the selected category */\r\n documentTypeOptions: DocumentTypeModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Array of files that have been uploaded */\r\n uploadedFiles: UploadedFile[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Map tracking upload progress for each file */\r\n fileProgress: Map<File, number> = new Map();\r\n \r\n /** Loading state for applicants data */\r\n isLoadingApplicants: boolean = false;\r\n \r\n /** Loading state for categories data */\r\n isLoadingCategories: boolean = false;\r\n \r\n /** Loading state for document types data */\r\n isLoadingDocumentTypes: boolean = false;\r\n \r\n /** Loading state for save operation */\r\n isSaving: boolean = false;\r\n \r\n /** Current form validation state */\r\n isFormValid: boolean = false;\r\n\r\n /** File size property for testing */\r\n fileSize: string = '';\r\n\r\n /** Subject for managing component lifecycle and unsubscribing from observables */\r\n private destroy$ = new Subject<void>();\r\n\r\n /**\r\n * Creates an instance of DocumentUploadComponent.\r\n * @param documentUpload - Service for handling document upload operations\r\n * @param uploadService - Service for document-related operations\r\n * @param config - PrimeNG configuration service\r\n * @param fileFormatService - Service for file format validation\r\n * @param messageService - Service for displaying messages\r\n * @param cdr - Change detector reference for manual change detection\r\n * @param businessService - Service for business logic operations\r\n * @param formService - Service for form validation and handling\r\n * @param dataService - Service for data loading operations\r\n */\r\n constructor(\r\n public documentUpload: DocumentUploadService, \r\n public uploadService: DocumentService, \r\n private config: PrimeNGConfig, \r\n public fileFormatService: FileFormatService, \r\n public messageService: MessageService, \r\n public cdr: ChangeDetectorRef,\r\n private businessService: DocumentUploadBusinessService,\r\n private formService: DocumentUploadFormService,\r\n private dataService: DocumentUploadDataService\r\n ) { }\r\n\r\n /**\r\n * Lifecycle hook called after inputs are initialized.\r\n * Ensures no stale uploads are shown when navigating back.\r\n */\r\n ngOnInit(): void {\r\n this.resetForm();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['isDocumentSaveBtnClicked'] && changes['isDocumentSaveBtnClicked'].currentValue) {\r\n this.saveDocumentUpload();\r\n }\r\n\r\n if(changes['isDocumentSidebarClosed'] && changes['isDocumentSidebarClosed'].currentValue) {\r\n if(this.isDocumentSidebarClosed) {\r\n this.resetForm();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes in assignment type selection.\r\n * Resets form selections, loads categories, and handles applicant loading.\r\n */\r\n onAssignmentTypeChange(): void {\r\n this.resetSelections();\r\n this.loadCategories();\r\n this.handleApplicantLoading();\r\n this.validateForm(); // Validate form after assignment type change\r\n this.emitFormValidationChange();\r\n }\r\n\r\n private checkForUnsavedChanges(): boolean {\r\n // Check if files are uploaded\r\n const hasFiles = Boolean(this.uploadedFiles && this.uploadedFiles.length > 0);\r\n\r\n // Check if any form fields have been changed\r\n const hasFormChanges = Boolean(\r\n (this.selectedAssignmentType && this.selectedAssignmentType !== SHARED.EMPTY) || \r\n (this.selectedApplicants && this.selectedApplicants.length > 0) || \r\n (this.selectedCategory && this.selectedCategory !== SHARED.EMPTY) || \r\n (this.selectedDocumentType && this.selectedDocumentType !== SHARED.EMPTY)\r\n );\r\n\r\n // Set and return the combined result\r\n this.hasUnsavedChanges = hasFiles || hasFormChanges;\r\n return this.hasUnsavedChanges;\r\n }\r\n\r\n /**\r\n * Handles changes in category selection.\r\n * Resets document type and loads available document types if category is selected.\r\n */\r\n onCategoryChange(): void {\r\n this.resetDocumentType();\r\n if (this.selectedCategory) this.loadDocumentTypes();\r\n this.validateForm(); // Validate form after category change\r\n this.validateAndEmit();\r\n }\r\n\r\n /**\r\n * Handles changes in document type selection.\r\n * Validates form and emits validation change event.\r\n */\r\n onDocumentTypeChange(): void { this.validateAndEmit(); }\r\n \r\n /**\r\n * Handles changes in applicant selection.\r\n * Validates form and emits validation change event.\r\n */\r\n onApplicantSelectionChange(): void { this.validateAndEmit(); }\r\n\r\n /**\r\n * Handles file selection from the file upload component.\r\n * Processes each selected file for templated upload sequentially.\r\n * @param event - Event containing the selected files\r\n */\r\n async onSelectedFiles(event: { currentFiles: File[] }): Promise<void> {\r\n const MAX_FILE_SIZE = 27262976; // 26 MB in bytes (26 * 1024 * 1024)\r\n \r\n // Filter out files with unsupported extensions\r\n const validFiles = event.currentFiles.filter(file => \r\n this.fileFormatService.isAllowedFileType(file.name)\r\n );\r\n \r\n // Filter out files that exceed size limit\r\n const sizeValidFiles = validFiles.filter(file => file.size <= MAX_FILE_SIZE);\r\n \r\n if (validFiles.length !== event.currentFiles.length) {\r\n const invalidFiles = event.currentFiles.filter(file => \r\n !this.fileFormatService.isAllowedFileType(file.name)\r\n );\r\n const invalidFileNames = invalidFiles.map(file => file.name).join(', ');\r\n this.messageService.add({\r\n severity: 'warn',\r\n summary: 'Invalid File Type',\r\n detail: `The following files have unsupported formats and will be skipped: ${invalidFileNames}`\r\n });\r\n }\r\n \r\n if (sizeValidFiles.length !== validFiles.length) {\r\n const oversizedFiles = validFiles.filter(file => file.size > MAX_FILE_SIZE);\r\n const oversizedFileNames = oversizedFiles.map(file => file.name).join(', ');\r\n const maxSizeMB = (MAX_FILE_SIZE / (1024 * 1024)).toFixed(2);\r\n this.messageService.add({\r\n severity: 'error',\r\n summary: 'File Size Exceeded',\r\n detail: `The following files exceed the maximum size limit of ${maxSizeMB} MB and will be skipped: ${oversizedFileNames}`\r\n });\r\n }\r\n \r\n if (sizeValidFiles.length > 0) {\r\n await this.processFilesSequentially(sizeValidFiles);\r\n }\r\n \r\n this.fileUploader.clear();\r\n }\r\n\r\n /**\r\n * Processes files sequentially for upload\r\n * @param files - Array of files to process\r\n */\r\n private async processFilesSequentially(files: File[]): Promise<void> {\r\n if (!this.formService.validateContextId(this.contextId, 'Context ID is required for upload.')) {\r\n return;\r\n }\r\n await this.documentUpload.uploadFilesSequentiallyWithProgress(\r\n files, \r\n this.contextId,\r\n (currentFile, currentIndex, totalFiles) => {\r\n this.fileProgress.set(currentFile, SHARED.UPLOAD_PROGRESS_10);\r\n this.setupFileUploadListener(currentFile);\r\n const formattedSize = this.businessService.formatFileSize(currentFile.size, this.config);\r\n const uploadedFile = this.businessService.createUploadedFile(currentFile, formattedSize);\r\n uploadedFile.progress = SHARED.UPLOAD_PROGRESS_10;\r\n this.uploadedFiles.push(uploadedFile);\r\n \r\n // Only validate form if not in form-hidden mode\r\n if (!this.isFormHide) {\r\n this.validateForm();\r\n }\r\n \r\n this.cdr.detectChanges();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Loads the list of applicants for the current context.\r\n * Sets loading state and handles success/error responses.\r\n */\r\n loadApplicants(): void {\r\n this.isLoadingApplicants = true;\r\n this.dataService.loadApplicants(\r\n this.contextId,\r\n (applicants) => this.handleApplicantsLoaded(applicants),\r\n (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (applicants) => this.handleApplicantsLoaded(applicants),\r\n error: (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n });\r\n }\r\n\r\n /**\r\n * Loads document categories based on the selected assignment type.\r\n * Sets loading state and handles success/error responses.\r\n */\r\n loadCategories(): void {\r\n this.isLoadingCategories = true;\r\n this.dataService.loadCategories(\r\n this.selectedAssignmentType!,\r\n (categories) => this.handleCategoriesLoaded(categories),\r\n (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (categories) => this.handleCategoriesLoaded(categories),\r\n error: (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n });\r\n }\r\n\r\n /**\r\n * Loads document types based on the selected category.\r\n * Sets loading state and handles success/error responses.\r\n */\r\n loadDocumentTypes(): void {\r\n this.isLoadingDocumentTypes = true;\r\n this.dataService.loadDocumentTypes(\r\n this.selectedCategory,\r\n (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n error: (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n });\r\n }\r\n\r\n /**\r\n * Saves the document upload with all metadata.\r\n * Validates payload and required fields before proceeding with upload.\r\n */\r\n saveDocumentUpload(): void {\r\n const payloadValidation = this.businessService.validatePayload(\r\n this.selectedAssignmentType, this.selectedCategory, this.selectedDocumentType, \r\n this.selectedApplicants, this.uploadedFiles\r\n );\r\n \r\n if (!payloadValidation.isValid) {\r\n this.formService.showWarningMessage('Incomplete Form', payloadValidation.message);\r\n return;\r\n }\r\n \r\n if (!this.formService.validateRequiredFields(\r\n this.selectedAssignmentType, this.selectedApplicants, this.selectedCategory, \r\n this.selectedDocumentType, this.uploadedFiles\r\n )) return;\r\n \r\n this.isSaving = true;\r\n this.saveDocumentMetadata();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Removes a document from the uploaded files list.\r\n * Updates progress tracking and validates form.\r\n * @param file - The file to be removed\r\n * @param index - The index of the file in the uploaded files array\r\n */\r\n handleDocumentRemove(file: File, index: number): void {\r\n this.uploadedFiles.splice(index, 1);\r\n this.fileProgress.delete(file);\r\n \r\n // Emit file removed event for form-hidden mode\r\n if (this.isFormHide) {\r\n this.onFileRemoved.emit({file, index});\r\n } else {\r\n this.validateAndEmit();\r\n }\r\n \r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Utility method for file upload component integration.\r\n * @param event - The file upload event\r\n * @param callback - Callback function to execute\r\n */\r\n choose(event: any, callback: () => void): void { callback(); }\r\n \r\n /**\r\n * Triggers the file upload dialog.\r\n */\r\n triggerFileUpload(): void { this.fileUploader.choose(); }\r\n \r\n /**\r\n * Determines if the save button should be disabled.\r\n * @returns True if the save button should be disabled, false otherwise\r\n */\r\n getSaveButtonDisabled(): boolean {\r\n const isDisabled = this.businessService.isSaveButtonDisabled(\r\n this.selectedAssignmentType, this.selectedCategory, this.selectedDocumentType,\r\n this.selectedApplicants, this.uploadedFiles, this.isSaving\r\n )\r\n return isDisabled;\r\n }\r\n\r\n /**\r\n * Gets the upload progress for a specific file.\r\n * @param file - The file to get progress for\r\n * @returns The upload progress percentage (0-100)\r\n */\r\n getProgress(file: File): number { return this.fileProgress.get(file) || 0; }\r\n\r\n /**\r\n * Checks if a file is currently uploading.\r\n * @param file - The file to check\r\n * @returns True if the file is uploading, false otherwise\r\n */\r\n isFileUploading(file: File): boolean { \r\n const progress = this.fileProgress.get(file);\r\n return progress !== undefined && progress > 0 && progress < SHARED.UPLOAD_PROGRESS_100;\r\n }\r\n \r\n /**\r\n * Checks if a file has been successfully uploaded.\r\n * @param file - The file to check\r\n * @returns True if the file is uploaded, false otherwise\r\n */\r\n isFileUploaded(file: File): boolean { return this.fileProgress.get(file) === SHARED.UPLOAD_PROGRESS_100; }\r\n \r\n /**\r\n * Checks if a file upload encountered an error.\r\n * @param file - The file to check\r\n * @returns True if the file has an error, false otherwise\r\n */\r\n isFileError(file: File): boolean { return this.fileProgress.get(file) === -1; }\r\n\r\n /**\r\n * Resets the form to its initial state.\r\n * Clears all selections, uploaded files, and progress tracking.\r\n */\r\n resetForm(): void {\r\n const initialState = this.businessService.getInitialFormState();\r\n Object.assign(this, initialState);\r\n this.fileProgress.clear();\r\n this.filteredApplicantList = [];\r\n this.categoryOptions = [];\r\n this.documentTypeOptions = [];\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Resets form selections (applicant, category, document type).\r\n * Clears document type options.\r\n */\r\n resetSelections(): void {\r\n this.selectedApplicants = [];\r\n this.selectedCategory = this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n /**\r\n * Resets document type selection and clears document type options.\r\n */\r\n resetDocumentType(): void {\r\n this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n /**\r\n * Handles applicant loading based on assignment type.\r\n * Loads applicants if type is 'Applicant', otherwise filters existing list.\r\n */\r\n handleApplicantLoading(): void {\r\n if (this.selectedAssignmentType === SHARED.APPLICANT) {\r\n this.loadApplicants();\r\n } else {\r\n this.filterApplicants();\r\n }\r\n }\r\n\r\n /**\r\n * Handles successful loading of applicants data.\r\n * Updates applicant list, filters applicants, and validates form.\r\n * @param applicants - Array of loaded applicants\r\n */\r\n handleApplicantsLoaded(applicants: UserListModel[]): void {\r\n this.applicantList = applicants;\r\n this.filterApplicants();\r\n this.isLoadingApplicants = false;\r\n this.validateForm();\r\n }\r\n\r\n /**\r\n * Handles successful loading of categories data.\r\n * Updates category options and validates form.\r\n * @param categories - Array of loaded categories\r\n */\r\n handleCategoriesLoaded(categories: DocumentCategory[]): void {\r\n this.categoryOptions = this.documentUpload.sortListByProperty(categories, 'label');\r\n this.isLoadingCategories = false;\r\n this.validateForm();\r\n }\r\n\r\n /**\r\n * Handles successful loading of document types data.\r\n * Updates document type options and validates form.\r\n * @param documentTypes - Array of loaded document types\r\n */\r\n handleDocumentTypesLoaded(documentTypes: DocumentTypeModel[]): void {\r\n this.documentTypeOptions = this.documentUpload.sortListByProperty(documentTypes, 'label', 'name');\r\n this.isLoadingDocumentTypes = false;\r\n this.validateForm();\r\n }\r\n\r\n /**\r\n * Handles successful upload completion.\r\n * Resets form and emits upload success event.\r\n * @param response - The upload response from the server\r\n */\r\n handleUploadSuccess(response: any): void {\r\n this.isSaving = false;\r\n this.resetForm();\r\n this.onUploadSuccess.emit();\r\n }\r\n\r\n /**\r\n * Handles upload error.\r\n * Resets saving state.\r\n * @param error - The error that occurred during upload\r\n */\r\n handleUploadError(error: any): void {\r\n this.isSaving = false;\r\n }\r\n\r\n /**\r\n * Filters applicants based on the selected assignment type.\r\n * Updates the filtered applicant list.\r\n */\r\n filterApplicants(): void {\r\n this.filteredApplicantList = this.dataService.handleApplicantsLoaded(\r\n this.applicantList, this.selectedAssignmentType\r\n );\r\n }\r\n\r\n /**\r\n * Validates the current form state.\r\n * Checks payload validation and emits form validation change if state changed.\r\n */\r\n validateForm(): void {\r\n const payloadValidation = this.businessService.validatePayload(\r\n this.selectedAssignmentType, this.selectedCategory, this.selectedDocumentType,\r\n this.selectedApplicants, this.uploadedFiles\r\n );\r\n \r\n const previousValidationState = this.isFormValid;\r\n this.isFormValid = payloadValidation.isValid;\r\n\r\n const hasUnsavedChanges = this.checkForUnsavedChanges();\r\n this.hasUnsavedChangesChange.emit(hasUnsavedChanges);\r\n if (previousValidationState !== this.isFormValid) {\r\n this.onFormValidationChange.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Saves document metadata to the server.\r\n * Prepares upload payload and calls business service to save.\r\n */\r\n saveDocumentMetadata(): void {\r\n const contextId = this.contextId;\r\n const payload = this.businessService.prepareUploadPayload(\r\n this.selectedAssignmentType!, this.selectedCategory, this.selectedDocumentType,\r\n this.selectedApplicants, this.uploadedFiles, contextId\r\n );\r\n\r\n this.businessService.saveDocumentUpload(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => this.handleUploadSuccess(response),\r\n error: (error) => this.handleUploadError(error)\r\n });\r\n }\r\n\r\n /**\r\n * Sets up a listener for file upload completion.\r\n * Updates progress tracking and emits validation change when upload completes.\r\n * @param file - The file to monitor for upload completion\r\n */\r\n setupFileUploadListener(file: File): void {\r\n this.documentUpload.uploadCompleted.pipe(takeUntil(this.destroy$)).subscribe(({file: uploadedFile, response}) => {\r\n if (uploadedFile === file) {\r\n this.fileProgress.set(file, SHARED.UPLOAD_PROGRESS_100);\r\n const uploadedFileObj = this.uploadedFiles.find(uf => uf.file === file);\r\n if (uploadedFileObj) {\r\n uploadedFileObj.uploadResponse = response;\r\n uploadedFileObj.progress = SHARED.UPLOAD_PROGRESS_100;\r\n uploadedFileObj.url = response?.url;\r\n uploadedFileObj.contentType = response?.contentType;\r\n }\r\n this.cdr.detectChanges();\r\n \r\n // Emit files uploaded event for form-hidden mode\r\n if (this.isFormHide) {\r\n this.onFilesUploaded.emit([...this.uploadedFiles]);\r\n } else {\r\n this.onFormValidationChange.emit();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handles errors during data loading operations.\r\n * Resets loading state and can be extended for error logging.\r\n * @param title - Error title for display\r\n * @param error - The error object\r\n * @param resetLoading - Callback to reset loading state\r\n */\r\n handleError(title: string, error: any, resetLoading: () => void): void {\r\n resetLoading();\r\n }\r\n\r\n /**\r\n * Validates form and emits validation change event.\r\n */\r\n validateAndEmit(): void {\r\n this.validateForm();\r\n this.onFormValidationChange.emit();\r\n }\r\n\r\n /**\r\n * Emits form validation change event.\r\n */\r\n emitFormValidationChange(): void {\r\n this.onFormValidationChange.emit();\r\n }\r\n\r\n /**\r\n * Formats file size for testing purposes.\r\n * @param size - The file size in bytes\r\n */\r\n formatSize(size: number): void {\r\n this.fileSize = this.businessService.formatFileSize(size, this.config);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets the accept string for the file upload component\r\n * @returns String with file extensions for the accept attribute\r\n */\r\n getFileUploadAcceptString(): string {\r\n return this.fileFormatService.getAllowedFileExtensions()\r\n .map(ext => `.${ext}`)\r\n .join(SHARED.COMMA);\r\n }\r\n\r\n /**\r\n * Gets the uploaded files data for external use (useful when form is hidden)\r\n * @returns Array of uploaded files with their metadata\r\n */\r\n getUploadedFiles(): UploadedFile[] {\r\n return [...this.uploadedFiles];\r\n }\r\n\r\n /**\r\n * Resets the upload component to its initial state (useful when form is hidden)\r\n */\r\n resetUpload(): void {\r\n this.uploadedFiles = [];\r\n this.fileProgress.clear();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Lifecycle hook that is called when component is destroyed.\r\n * Cleans up subscriptions and destroys services.\r\n */\r\n ngOnDestroy(): void {\r\n console.log(\"destroyed\")\r\n this.resetUpload()\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.businessService.destroy();\r\n this.dataService.destroy();\r\n }\r\n}\r\n\r\n","<div class=\"document-upload-container\">\r\n <!-- Assignment Section -->\r\n <div class=\"assignment-section\" *ngIf=\"!isFormHide\">\r\n <h4>Assign to Applicant(s) or Application <span class=\"text-red-500\">*</span> </h4>\r\n <div class=\"radio-group\">\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Applicant\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'applicant'\"\r\n ></p-radioButton>\r\n <label [for]=\"'applicant'\" class=\"radio-label\">Applicant(s) </label>\r\n </div>\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Application\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'application'\"\r\n ></p-radioButton>\r\n <label [for]=\"'application'\" class=\"radio-label\">Application</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Applicant Selection (only shown when Applicant is selected) -->\r\n <div class=\"applicant-section\" *ngIf=\"!isFormHide && selectedAssignmentType === 'Applicant'\">\r\n <h4>Select Applicant(s) <span class=\"text-red-500\">*</span></h4>\r\n <div class=\"grid\">\r\n <div \r\n *ngFor=\"let applicant of filteredApplicantList\" \r\n class=\"applicant-item col-12 md:col-6\"\r\n >\r\n <p-checkbox \r\n [value]=\"applicant._id\"\r\n [(ngModel)]=\"selectedApplicants\"\r\n [inputId]=\"'applicant-' + applicant._id\"\r\n (onChange)=\"onApplicantSelectionChange()\"\r\n ></p-checkbox>\r\n <label [for]=\"'applicant-' + applicant._id\" class=\"applicant-label\">\r\n {{ applicant.name }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Selection -->\r\n <div class=\"category-section\" *ngIf=\"!isFormHide\">\r\n <h4>Category <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"categoryOptions\"\r\n [(ngModel)]=\"selectedCategory\"\r\n placeholder=\"Select Category type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onCategoryChange()\"\r\n [disabled]=\"!categoryOptions.length\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div>\r\n\r\n <!-- Document Type Selection -->\r\n <div class=\"document-type-section\" *ngIf=\"!isFormHide\">\r\n <h4>Document Type <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"documentTypeOptions\"\r\n [(ngModel)]=\"selectedDocumentType\"\r\n placeholder=\"Select Document type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onDocumentTypeChange()\"\r\n [disabled]=\"!documentTypeOptions.length || !selectedCategory\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div>\r\n\r\n <!-- File Upload Section -->\r\n <div class=\"file-upload-section\">\r\n <h4>Upload Documents <span class=\"text-red-500\" *ngIf=\"!isFormHide\">*</span></h4>\r\n <div class=\"grid\">\r\n <div class=\"col-12 md:col-12\">\r\n <p-fileUpload \r\n #fileUploader \r\n [multiple]=\"true\" \r\n auto=\"true\" \r\n [accept]=\"getFileUploadAcceptString()\" \r\n maxFileSize=\"27262976\"\r\n (onSelect)=\"onSelectedFiles($event)\"\r\n >\r\n <ng-template pTemplate=\"header\" let-chooseCallback=\"chooseCallback\" let-clearCallback=\"clearCallback\">\r\n <div class=\"docHeader p-2 flex flex-wrap justify-content-between align-items-center flex-1 gap-2\">\r\n <div class=\"flex gap-2\">\r\n <p-button \r\n *ngIf=\"!isMultiAttachmentHidden\"\r\n (onClick)=\"choose($event, chooseCallback)\" \r\n icon=\"pi pi-images\" \r\n [rounded]=\"true\"\r\n [outlined]=\"true\" \r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"content\" let-removeFileCallback=\"removeFileCallback\"\r\n let-removeUploadedFileCallback=\"removeUploadedFileCallback\">\r\n <div class=\"col-12 md:col-12 p-0\">\r\n <div class=\"col-12 md:col-12 p-0\" *ngIf=\"uploadedFiles.length > 0\">\r\n <div *ngFor=\"let uploadedFile of uploadedFiles; let i = index\"\r\n class=\"m-0 flex flex-column align-items-center gap-1 mt-3\">\r\n <div class=\"col-12 md:col-12 p-0 flex documentInfo\">\r\n <div class=\"documentImage\">\r\n <img src=\"../../../../assets/images/document.png\" [alt]=\"uploadedFile.file.name\" width=\"45\" height=\"50\"\r\n class=\"object-contain\" />\r\n </div>\r\n <div class=\"flex w-full flex-column mt-2 ml-2\">\r\n <div class=\"flex justify-content-between\">\r\n <div style=\"font-weight: bold;font-size: 14px\">\r\n {{ uploadedFile.file.name }}\r\n </div>\r\n <i class=\"pi pi-times cursor-pointer\" (click)=\"handleDocumentRemove(uploadedFile.file,i)\"></i>\r\n </div>\r\n <div class=\"flex justify-content-between mt-1\">\r\n <div style=\"color: #676B89; font-size: 12px; color: green;\" class=\"pi pi-verified\"> \r\n {{ uploadedFile.formattedSize }}\r\n </div>\r\n <div class=\"white-space-nowrap\" style=\"color: #0F8BFD; font-family: 14px;\"> \r\n {{ uploadedFile.progress }} % \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-12 md:col-12 p-0\">\r\n <p-progressBar \r\n [value]=\"uploadedFile.progress ?? 0\" \r\n [showValue]=\"false\" \r\n styleClass=\"h-1/2rem md:ml-auto relative\"\r\n [ngClass]=\"{ 'exceeded-progress-bar': (uploadedFile.progress ?? 0) > 100 }\"\r\n >\r\n </p-progressBar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"empty\" let-chooseCallback=\"chooseCallback\">\r\n <div *ngIf=\"!uploadedFiles.length\" class=\"flex align-items-center justify-content-center flex-column\"\r\n (click)=\"triggerFileUpload()\">\r\n <i class=\"pi pi-cloud-upload border-2 border-circle p-5 text-8xl text-400 border-400\"></i>\r\n <p class=\"mt-4 mb-0\">Drag and drop files here to upload.</p>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"file\"> </ng-template>\r\n </p-fileUpload>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { SHARED } from '../constant/SHARED';\r\n\r\n/**\r\n * Service for managing user session details.\r\n * @class SessionService\r\n * @typedef {SessionService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SessionService {\r\n\r\n /**\r\n * Creates an instance of SessionService.\r\n * @param {Router} router - Angular Router for navigation.\r\n */\r\n constructor(public router: Router) {}\r\n\r\n /**\r\n * Retrieves the current user's role from local storage.\r\n * @returns {string | null} The user's role, or null if not found.\r\n */\r\n getUserRole(): string | null {\r\n return localStorage.getItem('role');\r\n }\r\n\r\n /**\r\n * Stores the user session data in local storage.\r\n * @param {any} data - The session data to store.\r\n */\r\n setUserSession(data: any): void {\r\n localStorage.setItem(SHARED.SESSIONKEY, JSON.stringify(data));\r\n }\r\n\r\n /**\r\n * Retrieves the stored user session data.\r\n * @returns {any | null} The parsed session data, or null if not found.\r\n */\r\n getUserSession(): any | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n return sessionData ? JSON.parse(sessionData) : null;\r\n }\r\n\r\n /**\r\n * Retrieves the user's permissions from the stored session data.\r\n * @returns {any | null} The user's permissions, or null if not found.\r\n */\r\n getUserPermissions(): any | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n if (!sessionData) return null;\r\n const parsed = JSON.parse(sessionData);\r\n // Example: { traits: [\"Applicants-get\", ...] }\r\n return parsed?.traits ?? null;\r\n }\r\n\r\n /**\r\n * Retrieves the user's traits from the stored session data (preferred).\r\n * @returns {string[] | null} Trait strings, or null if not found.\r\n */\r\n getUserTraits(): string[] | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n if (!sessionData) return null;\r\n const parsed = JSON.parse(sessionData);\r\n return Array.isArray(parsed?.traits) ? parsed.traits : null;\r\n }\r\n\r\n /**\r\n * Retrieves the session ID from the stored session data.\r\n * @returns {any | null} The session ID, or null if not found.\r\n */\r\n getSessionID(): any | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n console.log(sessionData);\r\n if (sessionData) {\r\n const sessionId = JSON.parse(sessionData);\r\n console.log(sessionId);\r\n return sessionId;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Clears all stored session data from local storage.\r\n */\r\n clearSession(): void {\r\n localStorage.clear();\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentTypeModel } from '../../models/document-type.model';\r\nimport { DocumentUploadService } from '../../services/document-upload.service';\r\nimport { DocumentUploadFormService } from '../../services/document-upload-form.service';\r\nimport { DocumentUploadDataService } from '../../services/document-upload-data.service';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { SessionService } from '../../../../Shared/services/session.service';\r\n\r\n@Component({\r\n selector: 'lib-request-document',\r\n templateUrl: './request-document.component.html',\r\n standalone: false\r\n})\r\nexport class RequestDocumentComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Input() isRequestSaveBtnClicked: boolean = false;\r\n @Input() isRequestSidebarClosed: boolean = false;\r\n\r\n @Output() onFormValidationChange = new EventEmitter<void>();\r\n @Output() onRequestSuccess = new EventEmitter<void>();\r\n @Output() onRequestError = new EventEmitter<any>();\r\n @Output() hasUnsavedChangesChange = new EventEmitter<boolean>();\r\n\r\n selectedAssignmentType: 'Applicant' | 'Application' | null = null;\r\n selectedApplicant: string = SHARED.EMPTY;\r\n selectedCategory: string = SHARED.EMPTY;\r\n selectedDocumentType: string = SHARED.EMPTY;\r\n description: string = SHARED.EMPTY;\r\n\r\n applicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n filteredApplicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n categoryOptions: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n documentTypeOptions: DocumentTypeModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n isLoadingApplicants: boolean = false;\r\n isLoadingCategories: boolean = false;\r\n isLoadingDocumentTypes: boolean = false;\r\n isSaving: boolean = false;\r\n isFormValid: boolean = false;\r\n\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n public documentUpload: DocumentUploadService,\r\n private formService: DocumentUploadFormService,\r\n private dataService: DocumentUploadDataService,\r\n private cdr: ChangeDetectorRef,\r\n private documentHttpService : DocumentHttpService,\r\n private sessionService: SessionService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.resetForm();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['isRequestSaveBtnClicked'] && changes['isRequestSaveBtnClicked'].currentValue) {\r\n this.saveRequestDocument();\r\n }\r\n if (changes['isRequestSidebarClosed'] && changes['isRequestSidebarClosed'].currentValue) {\r\n if (this.isRequestSidebarClosed) {\r\n this.resetForm();\r\n }\r\n }\r\n }\r\n\r\n onAssignmentTypeChange(): void {\r\n this.resetSelections();\r\n this.loadCategories();\r\n // Always ensure applicants are loaded; filtering will apply based on assignment type\r\n this.loadApplicants();\r\n this.validateAndEmit();\r\n this.emitUnsavedChanges();\r\n }\r\n\r\n onCategoryChange(): void {\r\n this.resetDocumentType();\r\n if (this.selectedCategory) this.loadDocumentTypes();\r\n this.validateAndEmit();\r\n this.emitUnsavedChanges();\r\n }\r\n\r\n onDocumentTypeChange(): void { this.validateAndEmit(); this.emitUnsavedChanges(); }\r\n onApplicantSelectionChange(): void { this.validateAndEmit(); this.emitUnsavedChanges(); }\r\n onDescriptionChange(): void { this.validateAndEmit(); this.emitUnsavedChanges(); }\r\n\r\n loadApplicants(): void {\r\n this.isLoadingApplicants = true;\r\n this.dataService.loadApplicants(\r\n this.contextId,\r\n (applicants) => this.handleApplicantsLoaded(applicants),\r\n (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (applicants) => {\r\n // When assignment type is not yet selected, just cache the list\r\n if (!this.selectedAssignmentType) {\r\n this.applicantList = applicants;\r\n this.filteredApplicantList = applicants;\r\n this.isLoadingApplicants = false;\r\n return;\r\n }\r\n this.handleApplicantsLoaded(applicants);\r\n },\r\n error: (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n });\r\n }\r\n\r\n loadCategories(): void {\r\n this.isLoadingCategories = true;\r\n this.dataService.loadBrokerCategories(\r\n this.selectedAssignmentType!,\r\n (categories) => this.handleCategoriesLoaded(categories),\r\n (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (categories) => this.handleCategoriesLoaded(categories),\r\n error: (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n });\r\n }\r\n\r\n loadDocumentTypes(): void {\r\n this.isLoadingDocumentTypes = true;\r\n this.dataService.loadBrokerDocumentTypes(\r\n this.selectedCategory,\r\n (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n error: (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n });\r\n }\r\n\r\n getSaveButtonDisabled(): boolean {\r\n return !this.isFormValid || this.isSaving;\r\n }\r\n\r\n saveRequestDocument(): void {\r\n if (!this.isFormValid) {\r\n this.formService.showWarningMessage('Incomplete Form', 'Please complete all required fields.');\r\n return;\r\n }\r\n if (!this.description || !this.description.trim()) {\r\n this.formService.showWarningMessage('Description Required', 'Please add a description.');\r\n return;\r\n }\r\n // build request payload expected by backend\r\n const requestedDocumentForId = this.selectedAssignmentType === SHARED.APPLICANT\r\n ? this.selectedApplicant\r\n : this.contextId;\r\n const requesterId = this.sessionService.getUserSession()?.userId;\r\n const requestPayload = {\r\n applicationId: this.contextId,\r\n // requestedDocumentForId: requestedDocumentForId,\r\n // requestedDocumentType: this.selectedDocumentType,\r\n requesterId: requesterId,\r\n // selectedAssignmentType: this.selectedAssignmentType,\r\n description: this.description.trim()\r\n };\r\n\r\n this.isSaving = true;\r\n this.documentHttpService.documentRequest(requestPayload).subscribe({\r\n next: () => {\r\n this.isSaving = false;\r\n this.onRequestSuccess.emit();\r\n this.resetForm();\r\n },\r\n error: (error) => {\r\n this.isSaving = false;\r\n this.onRequestError.emit(error);\r\n }\r\n });\r\n }\r\n\r\n resetForm(): void {\r\n this.selectedAssignmentType = null;\r\n this.selectedApplicant = SHARED.EMPTY;\r\n this.selectedCategory = SHARED.EMPTY;\r\n this.selectedDocumentType = SHARED.EMPTY;\r\n this.description = SHARED.EMPTY;\r\n this.filteredApplicantList = [];\r\n this.categoryOptions = [];\r\n this.documentTypeOptions = [];\r\n this.isSaving = false;\r\n this.isFormValid = false;\r\n this.cdr.detectChanges();\r\n this.hasUnsavedChangesChange.emit(false);\r\n }\r\n\r\n resetSelections(): void {\r\n this.selectedApplicant = this.selectedCategory = this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n resetDocumentType(): void {\r\n this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n handleApplicantLoading(): void {\r\n if (this.selectedAssignmentType === SHARED.APPLICANT) {\r\n this.loadApplicants();\r\n } else {\r\n this.filterApplicants();\r\n }\r\n }\r\n\r\n handleApplicantsLoaded(applicants: UserListModel[]): void {\r\n this.applicantList = this.documentUpload.sortListByProperty(applicants, 'name');\r\n this.filterApplicants();\r\n this.isLoadingApplicants = false;\r\n this.validateForm();\r\n }\r\n\r\n handleCategoriesLoaded(categories: DocumentCategory[]): void {\r\n this.categoryOptions = this.documentUpload.sortListByProperty(categories, 'label');\r\n this.isLoadingCategories = false;\r\n this.validateForm();\r\n }\r\n\r\n handleDocumentTypesLoaded(documentTypes: DocumentTypeModel[]): void {\r\n this.documentTypeOptions = this.documentUpload.sortListByProperty(documentTypes, 'label', 'name');\r\n this.isLoadingDocumentTypes = false;\r\n this.validateForm();\r\n }\r\n\r\n filterApplicants(): void {\r\n this.filteredApplicantList = this.dataService.handleApplicantsLoaded(\r\n this.applicantList, this.selectedAssignmentType\r\n );\r\n }\r\n\r\n validateForm(): void {\r\n // Original validation commented out - only description is required\r\n // const baseValid = Boolean(\r\n // this.selectedAssignmentType &&\r\n // this.selectedCategory &&\r\n // this.selectedDocumentType &&\r\n // this.description && this.description.trim()\r\n // );\r\n // const needsApplicant = this.selectedAssignmentType === SHARED.APPLICANT;\r\n // const hasRequiredFields = needsApplicant ? (baseValid && !!this.selectedApplicant) : baseValid;\r\n \r\n // Only description is required\r\n const hasRequiredFields = Boolean(this.description && this.description.trim());\r\n const previousState = this.isFormValid;\r\n this.isFormValid = hasRequiredFields;\r\n if (previousState !== this.isFormValid) {\r\n this.onFormValidationChange.emit();\r\n }\r\n }\r\n\r\n validateAndEmit(): void {\r\n this.validateForm();\r\n this.onFormValidationChange.emit();\r\n }\r\n\r\n /** Emits unsaved changes state based on any field being non-empty */\r\n private emitUnsavedChanges(): void {\r\n // Original validation commented out - only description matters for unsaved changes\r\n // const hasChanges = Boolean(\r\n // (this.selectedAssignmentType && this.selectedAssignmentType !== SHARED.EMPTY) ||\r\n // (this.selectedApplicant && this.selectedApplicant !== SHARED.EMPTY) ||\r\n // (this.selectedCategory && this.selectedCategory !== SHARED.EMPTY) ||\r\n // (this.selectedDocumentType && this.selectedDocumentType !== SHARED.EMPTY) ||\r\n // (this.description && this.description.trim() !== SHARED.EMPTY)\r\n // );\r\n \r\n // Only description matters for unsaved changes\r\n const hasChanges = Boolean(this.description && this.description.trim() !== SHARED.EMPTY);\r\n this.hasUnsavedChangesChange.emit(hasChanges);\r\n }\r\n\r\n handleError(_title: string, _error: any, resetLoading: () => void): void {\r\n resetLoading();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n\r\n\r\n","<div class=\"request-document-container\">\r\n <!-- Assignment Section (same structure as upload, without files) -->\r\n <!-- <div class=\"assignment-section\">\r\n <h4>Assign to Applicant(s) or Application <span class=\"text-red-500\">*</span> </h4>\r\n <div class=\"radio-group\">\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Applicant\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'req-applicant'\"\r\n ></p-radioButton>\r\n <label [for]=\"'req-applicant'\" class=\"radio-label\">Applicant(s)</label>\r\n </div>\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Application\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'req-application'\"\r\n ></p-radioButton>\r\n <label [for]=\"'req-application'\" class=\"radio-label\">Application</label>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Applicant Selection (only when Applicant is selected) -->\r\n <!-- <div class=\"applicant-section\" *ngIf=\"selectedAssignmentType === 'Applicant'\">\r\n <h4>Select Applicant(s) <span class=\"text-red-500\">*</span></h4>\r\n <div class=\"grid\">\r\n <div \r\n *ngFor=\"let applicant of filteredApplicantList\" \r\n class=\"applicant-item col-12 md:col-6\"\r\n >\r\n <p-radioButton \r\n name=\"reqSelectedApplicant\"\r\n [value]=\"applicant._id\"\r\n [(ngModel)]=\"selectedApplicant\"\r\n [inputId]=\"'req-applicant-' + applicant._id\"\r\n (onClick)=\"onApplicantSelectionChange()\"\r\n ></p-radioButton>\r\n <label [for]=\"'req-applicant-' + applicant._id\" class=\"applicant-label\">\r\n {{ applicant.name }}\r\n </label>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Category Selection -->\r\n <!-- <div class=\"category-section\">\r\n <h4>Category <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"categoryOptions\"\r\n [(ngModel)]=\"selectedCategory\"\r\n placeholder=\"Select Category type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onCategoryChange()\"\r\n [disabled]=\"!categoryOptions.length\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div> -->\r\n\r\n <!-- Document Type Selection -->\r\n <!-- <div class=\"document-type-section\">\r\n <h4>Document Type <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"documentTypeOptions\"\r\n [(ngModel)]=\"selectedDocumentType\"\r\n placeholder=\"Select Document type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onDocumentTypeChange()\"\r\n [disabled]=\"!documentTypeOptions.length || !selectedCategory\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div> -->\r\n\r\n <!-- Description Field -->\r\n <div class=\"description-section\">\r\n <h6>Description <span class=\"text-red-500\">*</span></h6>\r\n <textarea pInputTextarea [(ngModel)]=\"description\" (ngModelChange)=\"onDescriptionChange()\" rows=\"4\" placeholder=\"Add description\" class=\"w-full\"></textarea>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface StatusData {\r\n status: string;\r\n count: number;\r\n color?: string;\r\n icon?: string;\r\n _id?: string;\r\n}\r\n\r\nexport interface CalculatedStatusData extends StatusData {\r\n percentage: number;\r\n isSelected: boolean;\r\n statusClass: string;\r\n iconClass: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StatusCalculatorService {\r\n\r\n calculateTotalCount(statusData: StatusData[]): number {\r\n return statusData?.reduce((total, status) => total + (status.count ?? 0), 0) || 0;\r\n }\r\n\r\n calculateStatusDataWithPercentages(\r\n statusData: StatusData[], \r\n selectedStatus: string | null\r\n ): CalculatedStatusData[] {\r\n if (!statusData) return [];\r\n \r\n const totalCount = this.calculateTotalCount(statusData);\r\n \r\n return statusData.map((status) => {\r\n // Normalize icon for reviewing status to use eye icon consistently\r\n let normalizedIcon = status.icon;\r\n if (status.status?.toLowerCase() === SHARED.REVIEWING_STATUS) {\r\n normalizedIcon = SHARED.ICON_EYE;\r\n }\r\n \r\n return {\r\n ...status,\r\n icon: normalizedIcon,\r\n percentage: totalCount > 0 ? (status.count ?? 0) / totalCount * 100 : 0,\r\n isSelected: selectedStatus === status.status,\r\n statusClass: status.status ? SHARED.STATUS_WITH_DASH + status.status.toLowerCase() : SHARED.EMPTY,\r\n iconClass: SHARED.ICON_WITH_DASH + (status?.status?.toLowerCase() || SHARED.EMPTY)\r\n };\r\n });\r\n }\r\n} ","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { StatusDataModel } from '../../models/status-data.model';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { StatusCalculatorService, CalculatedStatusData } from '../../services/status-calculator.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\n\r\n@Component({\r\n selector: 'lib-document-status',\r\n standalone: false,\r\n templateUrl: './document-status.component.html',\r\n styleUrl: './document-status.component.scss'\r\n})\r\nexport class DocumentStatusComponent implements OnInit, OnDestroy, OnChanges {\r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Input() statusData: any;\r\n \r\n selectedStatus: string | null = null;\r\n statusDataWithPercentages: CalculatedStatusData[] = [];\r\n\r\n \r\n private subscription = new Subscription();\r\n\r\n constructor(\r\n private documentQuery: DocumentQuery,\r\n private documentService: DocumentHelperService,\r\n private statusCalculatorService: StatusCalculatorService\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['contextId'] && !changes['contextId'].firstChange) {\r\n // When contextId changes, refetch status data for the new context\r\n this.refetchStatusData();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscription.add(\r\n this.documentQuery.selectSelectedStatus().subscribe(status => {\r\n this.selectedStatus= status;\r\n this.updateCalculatedStatusData();\r\n })\r\n );\r\n\r\n this.subscription.add(\r\n this.documentQuery.selectStatusData().subscribe(statusData => {\r\n if (statusData && statusData.length > 0) {\r\n this.statusData = statusData;\r\n this.updateCalculatedStatusData();\r\n }\r\n })\r\n );\r\n\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.refetchStatusData();\r\n }\r\n }\r\n\r\n private refetchStatusData(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n const currentState = this.documentQuery.getSelectionState();\r\n const statusContextId = currentState.userId || null;\r\n const categoryId = currentState.menuItem || null;\r\n \r\n // Use the document service to refresh status data for the new context\r\n this.documentService.refreshStatusData(this.contextId, statusContextId, categoryId);\r\n }\r\n }\r\n\r\n \r\n selectStatus(status: string): void {\r\n const newStatus = this.selectedStatus === status ? null : status;\r\n this.documentService.setSelectedStatus(newStatus);\r\n }\r\n\r\n private updateCalculatedStatusData(): void {\r\n this.statusDataWithPercentages = this.statusCalculatorService.calculateStatusDataWithPercentages(\r\n this.statusData,\r\n this.selectedStatus\r\n );\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n}\r\n","<div class=\"status-summary-container\">\r\n <div class=\"status-cards\">\r\n \r\n <div \r\n *ngFor=\"let status of statusDataWithPercentages\" \r\n class=\"status-card {{ status.statusClass }}\"\r\n [class.selected]=\"status.isSelected\"\r\n (click)=\"selectStatus(status.status || '')\"\r\n >\r\n <div class=\"status-icon {{ status.iconClass }}\">\r\n <i [class]=\"status.icon\"></i>\r\n </div>\r\n <div class=\"status-info\">\r\n <div class=\"status-count\">{{ status.count }}</div>\r\n <div class=\"status-name\">{{ status.status }}</div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"progress-bar-container\">\r\n <div class=\"progress-bar\">\r\n <div \r\n *ngFor=\"let status of statusDataWithPercentages\" \r\n class=\"progress-segment\"\r\n [style.width.%]=\"status.percentage\"\r\n [style.background-color]=\"status.color\"\r\n ></div>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { Subject, takeUntil, debounceTime, distinctUntilChanged } from 'rxjs';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { DocumentQuery } from '../../state/document.query';\r\n\r\n@Component({\r\n selector: 'document-search',\r\n templateUrl: './document-search.component.html',\r\n styleUrls: ['./document-search.component.scss'],\r\n standalone: false\r\n})\r\nexport class DocumentSearchComponent implements OnInit, OnDestroy {\r\n readonly SHARED = SHARED;\r\n \r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Output() onActionClick = new EventEmitter<void>();\r\n @Output() onRequestClick = new EventEmitter<void>();\r\n \r\n searchTerm: string = SHARED.EMPTY;\r\n showActionsMenu: boolean = false;\r\n private destroy$ = new Subject<void>();\r\n private searchSubject = new Subject<string>();\r\n private hasActiveFilters: boolean = false;\r\n\r\n constructor(\r\n private documentHelperService: DocumentHelperService,\r\n private documentQuery: DocumentQuery\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.setupSearchSubscription();\r\n this.setupFilterSubscription();\r\n this.setupClickOutsideListener();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.removeClickOutsideListener();\r\n }\r\n\r\n /**\r\n * Sets up the search input subscription with debouncing\r\n */\r\n private setupSearchSubscription(): void {\r\n const searchSubject = new Subject<string>();\r\n searchSubject.pipe(\r\n takeUntil(this.destroy$),\r\n debounceTime(500),\r\n distinctUntilChanged()\r\n ).subscribe(searchTerm => {\r\n this.onSearchChange(searchTerm);\r\n });\r\n\r\n this.searchSubject = searchSubject;\r\n }\r\n\r\n /**\r\n * Sets up subscription to monitor all filter states\r\n */\r\n private setupFilterSubscription(): void {\r\n this.documentQuery.selectSelectionState().pipe(\r\n takeUntil(this.destroy$)\r\n ).subscribe(selectionState => {\r\n this.hasActiveFilters = Boolean(\r\n selectionState.searchKey ||\r\n selectionState.userId ||\r\n selectionState.status ||\r\n selectionState.menuItem\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Handles search term changes from ngModel\r\n * @param searchTerm - The search term entered by the user\r\n */\r\n onSearchInputChange(searchTerm: string): void {\r\n this.searchSubject.next(searchTerm);\r\n }\r\n\r\n /**\r\n * Handles search term changes\r\n * @param searchTerm - The search term entered by the user\r\n */\r\n private onSearchChange(searchTerm: string): void {\r\n const normalizedSearchTerm = searchTerm?.trim() || null;\r\n this.documentHelperService.setSearchKey(normalizedSearchTerm);\r\n }\r\n\r\n /**\r\n * Clears the search input\r\n */\r\n onClearSearch(): void {\r\n this.searchTerm = SHARED.EMPTY;\r\n this.documentHelperService.setSearchKey(null);\r\n }\r\n\r\n /**\r\n * Clears all filters including search, menu item, user, and status selections\r\n */\r\n onClearAllFilters(): void {\r\n this.searchTerm = SHARED.EMPTY;\r\n this.documentHelperService.clearSelectionState();\r\n }\r\n\r\n /**\r\n * Determines if the Clear All button should be visible\r\n */\r\n get shouldShowClearAll(): boolean {\r\n return this.hasActiveFilters;\r\n }\r\n\r\n /**\r\n * Toggles the actions dropdown menu\r\n */\r\n toggleActionsMenu(): void {\r\n this.showActionsMenu = !this.showActionsMenu;\r\n }\r\n\r\n /**\r\n * Handles upload document action\r\n */\r\n handleUploadDocument(): void {\r\n this.showActionsMenu = false;\r\n this.onActionClick.emit();\r\n }\r\n\r\n /**\r\n * Handles request document action\r\n */\r\n handleRequestDocument(): void {\r\n this.showActionsMenu = false;\r\n this.onRequestClick.emit();\r\n }\r\n\r\n /**\r\n * Sets up click outside listener to close dropdown\r\n */\r\n private setupClickOutsideListener(): void {\r\n document.addEventListener('click', this.handleClickOutside);\r\n }\r\n\r\n /**\r\n * Removes click outside listener\r\n */\r\n private removeClickOutsideListener(): void {\r\n document.removeEventListener('click', this.handleClickOutside);\r\n }\r\n\r\n /**\r\n * Handles clicks outside the dropdown to close it\r\n */\r\n private handleClickOutside = (event: MouseEvent): void => {\r\n const target = event.target as HTMLElement;\r\n const actionsMenu = target.closest('.actions-menu');\r\n \r\n if (!actionsMenu && this.showActionsMenu) {\r\n this.showActionsMenu = false;\r\n }\r\n }\r\n} ","<div class=\"search-container\">\r\n <div class=\"search-header\">\r\n <h2 class=\"ml-3 document-heading\">Documents</h2> \r\n </div>\r\n <div class=\"search-input-wrapper\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchTerm\"\r\n (ngModelChange)=\"onSearchInputChange($event)\"\r\n class=\"search-input\"\r\n placeholder=\"Search by document name, category, type, status or applicant name...\"\r\n [attr.aria-label]=\"'Search documents'\"\r\n />\r\n <button \r\n *ngIf=\"searchTerm\"\r\n type=\"button\"\r\n class=\"clear-button\"\r\n (click)=\"onClearSearch()\"\r\n [attr.aria-label]=\"'Clear search'\"\r\n >\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n\r\n <button \r\n *ngIf=\"shouldShowClearAll\"\r\n type=\"button\"\r\n class=\"clear-all-filters-link\"\r\n (click)=\"onClearAllFilters()\"\r\n [attr.aria-label]=\"'Clear all'\"\r\n >\r\n Clear All\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n\r\n <div class=\"filters-section\">\r\n <div class=\"actions-menu\">\r\n <button \r\n type=\"button\"\r\n class=\"actions-btn\" \r\n (click)=\"toggleActionsMenu()\" \r\n [class.active]=\"showActionsMenu\"\r\n [attr.aria-label]=\"'Open actions menu'\"\r\n [attr.aria-expanded]=\"showActionsMenu\"\r\n >\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\">\r\n <!-- <div class=\"dropdown-item\" (click)=\"handleUploadDocument()\">\r\n <i class=\"pi pi-upload\"></i>\r\n <span>Upload Document</span>\r\n </div> -->\r\n <div class=\"dropdown-item\" (click)=\"handleRequestDocument()\">\r\n <i class=\"pi pi-file\"></i>\r\n <span>Request Document</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div> ","import { Component, Input, Injectable } from '@angular/core';\r\nimport { ConfirmationService, Confirmation } from 'primeng/api';\r\n\r\nexport interface ConfirmationOptions {\r\n message: string;\r\n header?: string;\r\n icon?: string;\r\n acceptLabel?: string;\r\n rejectLabel?: string;\r\n acceptIcon?: string;\r\n rejectIcon?: string;\r\n acceptButtonClass?: string;\r\n rejectButtonClass?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n@Component({\r\n selector: 'app-confirmation-dialog',\r\n templateUrl: './confirmation-dialog.component.html',\r\n standalone: false,\r\n styleUrls: ['./confirmation-dialog.component.scss']\r\n})\r\nexport class ConfirmationDialogComponent {\r\n @Input() confirmationOptions: ConfirmationOptions = {\r\n message: 'Are you sure that you want to proceed?',\r\n header: '',\r\n icon: '',\r\n acceptLabel: 'Yes',\r\n rejectLabel: 'No',\r\n acceptIcon: 'pi pi-check',\r\n rejectIcon: 'pi pi-times',\r\n acceptButtonClass: 'btn-danger',\r\n rejectButtonClass: 'btn-secondary'\r\n };\r\n\r\n constructor(private confirmationService: ConfirmationService) {}\r\n\r\n /**\r\n * Shows the confirmation dialog with the specified options\r\n * @param options - Configuration options for the confirmation dialog\r\n * @param acceptCallback - Function to execute when user accepts\r\n * @param rejectCallback - Function to execute when user rejects\r\n */\r\n confirm(\r\n options: Partial<ConfirmationOptions>,\r\n acceptCallback: () => void,\r\n rejectCallback?: () => void\r\n ): void {\r\n const confirmation: Confirmation = {\r\n message: options.message || this.confirmationOptions.message,\r\n header: options.header || this.confirmationOptions.header,\r\n icon: options.icon || this.confirmationOptions.icon,\r\n acceptLabel: options.acceptLabel || this.confirmationOptions.acceptLabel,\r\n rejectLabel: options.rejectLabel || this.confirmationOptions.rejectLabel,\r\n acceptIcon: options.acceptIcon || this.confirmationOptions.acceptIcon,\r\n rejectIcon: options.rejectIcon || this.confirmationOptions.rejectIcon,\r\n accept: acceptCallback,\r\n reject: rejectCallback\r\n };\r\n\r\n this.confirmationService.confirm(confirmation);\r\n }\r\n\r\n\r\n /**\r\n * Static method to show a confirmation dialog (for components that don't want to inject this component)\r\n * @param confirmationService - The ConfirmationService instance\r\n * @param options - Configuration options for the confirmation dialog\r\n * @param acceptCallback - Function to execute when user accepts\r\n * @param rejectCallback - Function to execute when user rejects\r\n */\r\n static confirm(\r\n confirmationService: ConfirmationService,\r\n options: Partial<ConfirmationOptions>,\r\n acceptCallback: () => void,\r\n rejectCallback?: () => void\r\n ): void {\r\n const defaultOptions: ConfirmationOptions = {\r\n message: 'Are you sure that you want to proceed?',\r\n header: '',\r\n icon: '',\r\n acceptLabel: 'Yes',\r\n rejectLabel: 'No',\r\n acceptIcon: 'pi pi-check',\r\n rejectIcon: 'pi pi-times',\r\n acceptButtonClass: 'btn-success',\r\n rejectButtonClass: 'btn-secondary'\r\n };\r\n\r\n const confirmation: Confirmation = {\r\n message: options.message || defaultOptions.message,\r\n header: options.header || defaultOptions.header,\r\n icon: options.icon || defaultOptions.icon,\r\n acceptLabel: options.acceptLabel || defaultOptions.acceptLabel,\r\n rejectLabel: options.rejectLabel || defaultOptions.rejectLabel,\r\n acceptIcon: options.acceptIcon || defaultOptions.acceptIcon,\r\n rejectIcon: options.rejectIcon || defaultOptions.rejectIcon,\r\n accept: acceptCallback,\r\n reject: rejectCallback\r\n };\r\n\r\n confirmationService.confirm(confirmation);\r\n }\r\n\r\n /**\r\n * Static method to show a delete confirmation dialog\r\n * @param confirmationService - The ConfirmationService instance\r\n * @param itemName - Name of the item to be deleted\r\n * @param acceptCallback - Function to execute when user accepts deletion\r\n * @param rejectCallback - Function to execute when user rejects deletion\r\n */\r\n static confirmDelete(\r\n confirmationService: ConfirmationService,\r\n itemName: string,\r\n acceptCallback: () => void,\r\n rejectCallback?: () => void\r\n ): void {\r\n ConfirmationDialogComponent.confirm(\r\n confirmationService,\r\n {\r\n message: `Are you sure you want to delete \"${itemName}\"?`,\r\n header: 'Delete Confirmation',\r\n acceptLabel: 'Delete',\r\n rejectLabel: 'Cancel',\r\n acceptButtonClass: 'btn-danger'\r\n },\r\n acceptCallback,\r\n rejectCallback\r\n );\r\n }\r\n}\r\n","<!-- This component no longer renders a p-confirmDialog element -->\r\n<!-- The p-confirmDialog should be placed only once in the main app component -->\r\n<!-- This component now only provides methods to trigger confirmations via ConfirmationService -->\r\n","import { Component, Input, Output, EventEmitter, OnDestroy, HostListener } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { Subject } from 'rxjs';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { ConfirmationDialogComponent } from '../../../../Shared/components/confirmation-dialog/confirmation-dialog.component';\r\n\r\n// Interface for confirmation options\r\ninterface ConfirmationOptions {\r\n message: string;\r\n header?: string;\r\n icon?: string;\r\n acceptLabel?: string;\r\n rejectLabel?: string;\r\n acceptIcon?: string;\r\n rejectIcon?: string;\r\n acceptButtonClass?: string;\r\n rejectButtonClass?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-sidebar',\r\n templateUrl: './sidebar.component.html',\r\n styleUrls: ['./sidebar.component.scss'],\r\n standalone: false\r\n})\r\nexport class SidebarComponent implements OnDestroy {\r\n // Flag to prevent multiple confirmations\r\n private isShowingConfirmation: boolean = false;\r\n\r\n @Input() set visible(value: boolean) {\r\n this._visible = value;\r\n }\r\n \r\n get visible(): boolean {\r\n return this._visible;\r\n }\r\n \r\n private _visible: boolean = false;\r\n\r\n @Input() position: 'left' | 'right' = 'right';\r\n @Input() width: string = SHARED.WIDTH;\r\n @Input() title: string = SHARED.EMPTY;\r\n @Input() showCloseButton: boolean = true;\r\n @Input() modal: boolean = true;\r\n @Input() dismissible: boolean = true;\r\n @Input() styleClass: string = SHARED.EMPTY;\r\n @Input() appendTo: string = 'body';\r\n @Input() blockScroll: boolean = true;\r\n @Input() closeIcon: string = SHARED.CLOSE_ICON;\r\n @Input() showSaveButton: boolean = false;\r\n @Input() saveButtonText: string = SHARED.SAVE;\r\n @Input() saveButtonDisabled: boolean = false;\r\n @Input() successMessage: string = SHARED.SUCCESS_MESSAGE;\r\n @Input() errorMessage: string = SHARED.EMPTY;\r\n @Input() hasUnsavedChanges: boolean = false;\r\n\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n @Output() onShow = new EventEmitter<void>();\r\n @Output() onHide = new EventEmitter<void>();\r\n @Output() onSave = new EventEmitter<void>();\r\n @Output() onClose = new EventEmitter<void>();\r\n \r\n showSuccessMessage: boolean = false;\r\n showErrorMessage: boolean = false;\r\n private destroy$ = new Subject<void>();\r\n\r\n unsavedChangesConfirmationOptions: ConfirmationOptions = {\r\n message: SHARED.UNSAVED_CHANGES_MESSAGE,\r\n acceptLabel: SHARED.YES,\r\n rejectLabel: SHARED.NO,\r\n acceptIcon: SHARED.ACCEPT_ICON,\r\n rejectIcon: SHARED.REJECT_ICON,\r\n acceptButtonClass: SHARED.ACCEPT_BUTTON_STYLE_CLASS,\r\n rejectButtonClass: SHARED.REJECT_BUTTON_STYLE_CLASS\r\n };\r\n\r\n constructor(private confirmationService: ConfirmationService) {}\r\n\r\n /**\r\n * Handles the onHide event from PrimeNG sidebar\r\n * Only emits when actually closing, not when showing confirmation\r\n */\r\n onSidebarHide(): void {\r\n if (!this.isShowingConfirmation) {\r\n this.onHide.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the visibleChange event from PrimeNG sidebar\r\n * Intercepts automatic closing to show confirmation if needed\r\n */\r\n onVisibleChange(value: boolean): void {\r\n if (!value && this.hasUnsavedChanges && !this.isShowingConfirmation) {\r\n this._visible = true;\r\n this.showUnsavedChangesConfirmation();\r\n return;\r\n }\r\n \r\n this.visibleChange.emit(value);\r\n }\r\n\r\n /**\r\n * Opens the sidebar\r\n */\r\n open(): void {\r\n this._visible = true;\r\n this.clearMessages();\r\n this.visibleChange.emit(this._visible);\r\n this.onShow.emit();\r\n }\r\n\r\n /**\r\n * Closes the sidebar\r\n */\r\n close(): void {\r\n this._visible = false;\r\n this.clearMessages();\r\n this.visibleChange.emit(this._visible);\r\n this.onHide.emit();\r\n }\r\n\r\n /**\r\n * Handles escape key press\r\n * Shows confirmation if there are unsaved changes\r\n */\r\n @HostListener('document:keydown.escape', ['$event'])\r\n handleEscapeKey(event: KeyboardEvent): void {\r\n if (this.visible) {\r\n event.preventDefault();\r\n this.handleClose();\r\n }\r\n }\r\n\r\n /**\r\n * Handles backdrop click events\r\n * Prevents default PrimeNG behavior and shows confirmation if needed\r\n */\r\n handleBackdropClick(event: Event): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.handleClose();\r\n }\r\n\r\n /**\r\n * Handles all closing scenarios (backdrop click, escape key, close button, etc.)\r\n * This is the single entry point for all closing logic\r\n */\r\n handleClose(): void {\r\n if (this.hasUnsavedChanges && !this.isShowingConfirmation) {\r\n this.showUnsavedChangesConfirmation();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Shows confirmation dialog for unsaved changes\r\n */\r\n private showUnsavedChangesConfirmation(): void {\r\n if (this.isShowingConfirmation) {\r\n return;\r\n }\r\n this.isShowingConfirmation = true;\r\n ConfirmationDialogComponent.confirm(\r\n this.confirmationService,\r\n this.unsavedChangesConfirmationOptions,\r\n () => {\r\n this.isShowingConfirmation = false;\r\n this.close();\r\n this.onClose.emit();\r\n },\r\n () => {\r\n this.isShowingConfirmation = false;\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Shows success message and closes sidebar after delay\r\n */\r\n showSuccess(): void {\r\n this.showSuccessMessage = true;\r\n this.showErrorMessage = false;\r\n setTimeout(() => {\r\n this.close();\r\n }, 2000);\r\n }\r\n\r\n /**\r\n * Shows error message\r\n */\r\n showError(message?: string): void {\r\n this.showErrorMessage = true;\r\n this.showSuccessMessage = false;\r\n this.errorMessage = message || SHARED.EMPTY;\r\n }\r\n\r\n /**\r\n * Clears all messages\r\n */\r\n clearMessages(): void {\r\n this.showSuccessMessage = false;\r\n this.showErrorMessage = false;\r\n }\r\n\r\n /**\r\n * Checks if there are unsaved changes\r\n * @returns True if there are unsaved changes, false otherwise\r\n */\r\n checkForUnsavedChanges(): boolean {\r\n return this.hasUnsavedChanges;\r\n }\r\n\r\n /**\r\n * Lifecycle hook that is called when component is destroyed.\r\n * Cleans up subscriptions.\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","<!-- PrimeNG Sidebar with proper backdrop handling -->\r\n<div *ngIf=\"visible\" class=\"backdrop-shadow\" (click)=\"handleClose()\"></div>\r\n\r\n<p-sidebar \r\n [(visible)]=\"visible\"\r\n [position]=\"position\"\r\n [style]=\"{width: width}\"\r\n [dismissible]=\"true\"\r\n [showCloseIcon]=\"false\"\r\n [appendTo]=\"'body'\"\r\n [blockScroll]=\"blockScroll\"\r\n (visibleChange)=\"onVisibleChange($event)\"\r\n (onShow)=\"onShow.emit()\"\r\n (onHide)=\"onSidebarHide()\"\r\n>\r\n <ng-template pTemplate=\"header\" *ngIf=\"title || showCloseButton || showSaveButton\">\r\n <div class=\"sidebar-header\">\r\n <h3 *ngIf=\"title\" class=\"sidebar-title\">{{ title }}</h3>\r\n <div class=\"header-content\">\r\n <ng-content select=\"[header]\"></ng-content>\r\n \r\n <p-messages \r\n *ngIf=\"showSuccessMessage\"\r\n severity=\"success\"\r\n [closable]=\"false\"\r\n [style]=\"{'margin-bottom': '0.5rem'}\"\r\n class=\"ml-3\"\r\n >\r\n <ng-template pTemplate=\"message\">\r\n <span>{{ successMessage }}</span>\r\n </ng-template>\r\n </p-messages>\r\n \r\n <p-messages \r\n *ngIf=\"showErrorMessage\"\r\n severity=\"error\"\r\n [closable]=\"false\"\r\n [style]=\"{'margin-bottom': '0.5rem'}\"\r\n class=\"ml-3\"\r\n >\r\n <ng-template pTemplate=\"message\">\r\n <span>{{ errorMessage }}</span>\r\n </ng-template>\r\n </p-messages>\r\n\r\n <div class=\"header-actions mr-3\">\r\n <button \r\n *ngIf=\"showSaveButton\"\r\n pButton \r\n type=\"button\" \r\n [label]=\"saveButtonText\"\r\n [disabled]=\"saveButtonDisabled\"\r\n class=\"p-button-primary\"\r\n (click)=\"onSave.emit()\"\r\n ></button>\r\n\r\n <button \r\n *ngIf=\"showCloseButton\"\r\n pButton \r\n type=\"button\" \r\n icon=\"pi pi-times\"\r\n class=\"p-button-text p-button-rounded\"\r\n (click)=\"handleClose()\"\r\n ></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"content\">\r\n <div class=\"sidebar-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n </ng-template>\r\n</p-sidebar>\r\n","import { Component, Input, OnInit, OnDestroy, ViewChild } from '@angular/core';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport {SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { FolderBlockModel } from '../../models/folder.model';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { StatusDataModel } from '../../models/status-data.model';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentUploadComponent } from '../document-upload/document-upload.component';\r\nimport { RequestDocumentComponent } from '../request-document/request-document.component';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { SidebarComponent } from '../sidebar/sidebar.component';\r\n\r\n/**\r\n * The `FolderContainerComponent` is responsible for rendering a container \r\n * that displays a list of documents and associated folder panel data.\r\n * This component utilizes the `FOLDERPANEL` constant for folder panel data\r\n * and accepts a document list input of type `DocumentModel`.\r\n */\r\n@Component({\r\n selector: 'lib-folder-container',\r\n standalone: false,\r\n templateUrl: './folder-container.component.html',\r\n styleUrl: './folder-container.component.scss',\r\n animations: [\r\n trigger('slideInOut', [\r\n state('visible', style({\r\n height: '*',\r\n opacity: 1,\r\n transform: 'translateY(0)',\r\n overflow: 'hidden',\r\n marginBottom: '1rem',\r\n visibility: 'visible'\r\n })),\r\n state('hidden', style({\r\n height: '0px',\r\n opacity: 0,\r\n transform: 'translateY(-20px)',\r\n overflow: 'hidden',\r\n marginBottom: '0px',\r\n visibility: 'hidden'\r\n })),\r\n transition('visible => hidden', [\r\n animate('250ms cubic-bezier(0.4, 0.0, 0.2, 1)')\r\n ]),\r\n transition('hidden => visible', [\r\n animate('300ms cubic-bezier(0.0, 0.0, 0.2, 1)')\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class FolderContainerComponent implements OnInit {\r\n /**\r\n * A list of documents passed as input to the component.\r\n * Represents the document data to be displayed in the folder container.\r\n */\r\n @Input() documentList?: DocumentModel[];\r\n /**\r\n * A list of documents passed as input to the component.\r\n * Represents the document data to be displayed in the folder container.\r\n */\r\n @Input() folderList: FolderBlockModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The context ID for the folder container.\r\n * @type {string}\r\n */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n\r\n /**\r\n * The list of users passed as input to the component.\r\n * @type {UserListModel[]}\r\n */\r\n @Input() userList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The status data passed as input to the component.\r\n * @type {StatusDataModel[]}\r\n */\r\n @Input() statusData: StatusDataModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The document categories passed as input to the component.\r\n * @type {DocumentCategory[]}\r\n */\r\n @Input() categories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Flag to control user list visibility\r\n */\r\n showUserList: boolean = true;\r\n \r\n /**\r\n * Animation state for user list visibility\r\n */\r\n userListAnimationState: string = SHARED.VISIBLE;\r\n\r\n /**\r\n * Controls the visibility of the document upload sidebar\r\n */\r\n isDocumentUploadSidebarOpen: boolean = false;\r\n /**\r\n * Controls the visibility of the request document sidebar\r\n */\r\n isRequestDocumentSidebarOpen: boolean = false;\r\n\r\n /**\r\n * Reference to the document upload component\r\n */\r\n @ViewChild(DocumentUploadComponent) documentUploadComponent!: DocumentUploadComponent;\r\n \r\n /**\r\n * References to the sidebars\r\n */\r\n @ViewChild('uploadSidebar') uploadSidebarComponent!: SidebarComponent;\r\n @ViewChild('requestSidebar') requestSidebarComponent!: SidebarComponent;\r\n @ViewChild(RequestDocumentComponent) requestDocumentComponent!: RequestDocumentComponent;\r\n \r\n /**\r\n * Tracks whether the save button should be disabled\r\n */\r\n isSaveButtonDisabled: boolean = false;\r\n /** Tracks save button disabled for request document */\r\n isRequestSaveButtonDisabled: boolean = true;\r\n \r\n /**\r\n * Tracks whether there are unsaved changes in the document upload form\r\n */\r\n hasUnsavedChanges: boolean = false;\r\n /**\r\n * Tracks whether there are unsaved changes in the request document form\r\n */\r\n requestHasUnsavedChanges: boolean = false;\r\n \r\n constructor(private documentQuery: DocumentQuery, private documentHelperService: DocumentHelperService) {}\r\n\r\n ngOnInit(): void {\r\n this.documentQuery.selectShowUserList().subscribe(show => {\r\n this.showUserList = show;\r\n this.userListAnimationState = show ? SHARED.VISIBLE : SHARED.HIDDEN;\r\n });\r\n }\r\n\r\n /**\r\n * Called when the view is initialized to set up the save button state\r\n */\r\n ngAfterViewInit(): void {\r\n this.updateSaveButtonState();\r\n }\r\n\r\n /**\r\n * Updates the save button disabled state based on the document upload component\r\n */\r\n updateSaveButtonState(): void {\r\n if (this.documentUploadComponent) {\r\n this.isSaveButtonDisabled = this.documentUploadComponent.getSaveButtonDisabled();\r\n }\r\n }\r\n\r\n /**\r\n * Handles form validation changes from the document upload component\r\n */\r\n onFormValidationChange(): void {\r\n this.updateSaveButtonState();\r\n // Check if there are actual unsaved changes\r\n this.checkForUnsavedChanges();\r\n }\r\n\r\n /** Updates request save button disabled state */\r\n onRequestFormValidationChange(): void {\r\n if (this.requestDocumentComponent) {\r\n this.isRequestSaveButtonDisabled = this.requestDocumentComponent.getSaveButtonDisabled();\r\n }\r\n }\r\n\r\n /**\r\n * Checks if there are unsaved changes in the document upload form\r\n */\r\n private checkForUnsavedChanges(): void {\r\n if (this.documentUploadComponent) {\r\n // Check if files are uploaded or form has changes\r\n const hasFiles = Boolean(this.documentUploadComponent.uploadedFiles && this.documentUploadComponent.uploadedFiles.length > 0);\r\n const hasFormChanges = Boolean(\r\n (this.documentUploadComponent.selectedAssignmentType && this.documentUploadComponent.selectedAssignmentType !== SHARED.EMPTY) || \r\n (this.documentUploadComponent.selectedApplicants && this.documentUploadComponent.selectedApplicants.length > 0) || \r\n (this.documentUploadComponent.selectedCategory && this.documentUploadComponent.selectedCategory !== SHARED.EMPTY) || \r\n (this.documentUploadComponent.selectedDocumentType && this.documentUploadComponent.selectedDocumentType !== SHARED.EMPTY)\r\n );\r\n \r\n this.hasUnsavedChanges = hasFiles || hasFormChanges;\r\n }\r\n }\r\n\r\n /**\r\n * Opens the document upload sidebar\r\n */\r\n openDocumentUploadSidebar(): void {\r\n this.isDocumentUploadSidebarOpen = true;\r\n this.hasUnsavedChanges = false; // Reset when opening\r\n }\r\n\r\n /**\r\n * Opens the request document sidebar\r\n */\r\n openRequestDocumentSidebar(): void {\r\n this.isRequestDocumentSidebarOpen = true;\r\n }\r\n\r\n /**\r\n * Handles the document upload sidebar hide event\r\n */\r\n onDocumentUploadSidebarHide(): void {\r\n this.isDocumentUploadSidebarOpen = false;\r\n this.hasUnsavedChanges = false;\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the document upload sidebar close event (when close button is clicked or sidebar is dismissed)\r\n */\r\n onDocumentUploadSidebarClose(): void {\r\n this.isDocumentUploadSidebarOpen = false;\r\n this.hasUnsavedChanges = false;\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the document upload sidebar close with unsaved changes event\r\n */\r\n onDocumentUploadSidebarCloseWithUnsavedChanges(): void {\r\n this.isDocumentUploadSidebarOpen = false;\r\n this.hasUnsavedChanges = false;\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the request document sidebar hide event\r\n */\r\n onRequestDocumentSidebarHide(): void {\r\n this.isRequestDocumentSidebarOpen = false;\r\n this.requestHasUnsavedChanges = false;\r\n if (this.requestDocumentComponent) {\r\n this.requestDocumentComponent.resetForm();\r\n }\r\n this.isRequestSaveButtonDisabled = true;\r\n }\r\n\r\n /**\r\n * Handles the request document sidebar close with unsaved changes event\r\n */\r\n onRequestDocumentSidebarCloseWithUnsavedChanges(): void {\r\n this.isRequestDocumentSidebarOpen = false;\r\n this.requestHasUnsavedChanges = false;\r\n if (this.requestDocumentComponent) {\r\n this.requestDocumentComponent.resetForm();\r\n }\r\n this.isRequestSaveButtonDisabled = true;\r\n }\r\n\r\n /** Invoked from sidebar Save button for request document */\r\n onRequestDocumentSave(): void {\r\n if (this.requestDocumentComponent) {\r\n this.requestDocumentComponent.saveRequestDocument();\r\n this.onRequestFormValidationChange();\r\n }\r\n }\r\n\r\n /** Request success handler */\r\n onRequestDocumentSuccess(): void {\r\n this.documentHelperService.refreshAllDataWithCurrentFilters(this.contextId);\r\n if (this.requestSidebarComponent) {\r\n this.requestSidebarComponent.showSuccess();\r\n }\r\n }\r\n\r\n /** Request error handler */\r\n onRequestDocumentError(error: any): void {\r\n if (this.requestSidebarComponent) {\r\n const errorMessage = error?.message || SHARED.UPLOAD_FAILED;\r\n this.requestSidebarComponent.showError(errorMessage);\r\n }\r\n }\r\n\r\n /** Handle unsaved changes state from request form */\r\n onRequestUnsavedChange(hasChanges: boolean): void {\r\n this.requestHasUnsavedChanges = hasChanges;\r\n }\r\n\r\n /**\r\n * Handles the document upload save event\r\n */\r\n onDocumentUploadSave(): void {\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.saveDocumentUpload();\r\n this.updateSaveButtonState();\r\n }\r\n }\r\n\r\n /**\r\n * Handles successful document upload and refreshes data\r\n */\r\n onDocumentUploadSuccess(): void {\r\n this.documentHelperService.refreshAllDataWithCurrentFilters(this.contextId);\r\n this.hasUnsavedChanges = false; // Reset after successful upload\r\n if (this.uploadSidebarComponent) {\r\n this.uploadSidebarComponent.showSuccess();\r\n }\r\n }\r\n\r\n /**\r\n * Handles document upload error\r\n */\r\n onDocumentUploadError(error: any): void {\r\n if (this.uploadSidebarComponent) {\r\n const errorMessage = error?.message || SHARED.UPLOAD_FAILED;\r\n this.uploadSidebarComponent.showError(errorMessage);\r\n }\r\n }\r\n\r\n \r\n}\r\n","\r\n<document-search [contextId]=\"contextId\" (onActionClick)=\"openDocumentUploadSidebar()\" (onRequestClick)=\"openRequestDocumentSidebar()\"></document-search>\r\n<div class=\"user-list-wrapper\" [@slideInOut]=\"userListAnimationState\">\r\n <!-- <lib-user-list [userList]=\"userList\" [categories]=\"categories\"></lib-user-list> -->\r\n</div>\r\n<lib-document-status [contextId]=\"contextId\" [statusData]=\"statusData\"></lib-document-status>\r\n\r\n<!-- Document Upload Sidebar -->\r\n<lib-sidebar\r\n #uploadSidebar\r\n [(visible)]=\"isDocumentUploadSidebarOpen\"\r\n position=\"right\"\r\n width=\"600px\"\r\n title=\"Upload Documents\"\r\n [showCloseButton]=\"true\"\r\n [showSaveButton]=\"true\"\r\n [saveButtonText]=\"'Save'\"\r\n [saveButtonDisabled]=\"isSaveButtonDisabled\"\r\n [successMessage]=\"'Document Saved Successfully'\"\r\n [hasUnsavedChanges]=\"hasUnsavedChanges\"\r\n (onHide)=\"onDocumentUploadSidebarHide()\"\r\n (onSave)=\"onDocumentUploadSave()\"\r\n (onClose)=\"onDocumentUploadSidebarCloseWithUnsavedChanges()\"\r\n>\r\n <lib-document-upload \r\n [contextId]=\"contextId\" \r\n (onFormValidationChange)=\"onFormValidationChange()\" \r\n (onUploadSuccess)=\"onDocumentUploadSuccess()\"\r\n (onUploadError)=\"onDocumentUploadError($event)\"\r\n ></lib-document-upload>\r\n</lib-sidebar>\r\n\r\n<lib-sidebar\r\n #requestSidebar\r\n [(visible)]=\"isRequestDocumentSidebarOpen\"\r\n position=\"right\"\r\n width=\"600px\"\r\n title=\"Request Document\"\r\n [showCloseButton]=\"true\"\r\n [showSaveButton]=\"true\"\r\n [saveButtonText]=\"'Save'\"\r\n [successMessage]=\"'Document Requested'\"\r\n [saveButtonDisabled]=\"isRequestSaveButtonDisabled\"\r\n [hasUnsavedChanges]=\"requestHasUnsavedChanges\"\r\n (onHide)=\"onRequestDocumentSidebarHide()\"\r\n (onSave)=\"onRequestDocumentSave()\"\r\n (onClose)=\"onRequestDocumentSidebarCloseWithUnsavedChanges()\"\r\n>\r\n <lib-request-document\r\n [contextId]=\"contextId\"\r\n (onFormValidationChange)=\"onRequestFormValidationChange()\"\r\n (onRequestSuccess)=\"onRequestDocumentSuccess()\"\r\n (onRequestError)=\"onRequestDocumentError($event)\"\r\n (hasUnsavedChangesChange)=\"onRequestUnsavedChange($event)\"\r\n ></lib-request-document>\r\n</lib-sidebar>","import { Injectable } from '@angular/core';\r\nimport { DocumentListResponse, DocumentListItem } from '../models/document-list-response.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { TableData } from '../../../Shared/components/table-primary/table-primary.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentTableBuilderService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Builds a single table from document list items\r\n * @param documents Array of document list items\r\n * @returns TableData object\r\n */\r\n buildDocumentTable(documents: DocumentListItem[]): TableData {\r\n const columns = SHARED.DOCUMENT_TABLE_COLUMNS.filter(col => col.type !== SHARED.ACTIONS);\r\n \r\n return {\r\n columns: columns,\r\n data: documents\r\n };\r\n }\r\n\r\n /**\r\n * Gets completion count for a category\r\n * @param category Document category\r\n * @returns Completion string (e.g., \"2/4\")\r\n */\r\n getCompletionCount(category: DocumentListResponse): string {\r\n const total = category.list.length;\r\n const completed = category.list.filter(doc => \r\n doc.status.toLowerCase() === SHARED.APPROVED || \r\n doc.status.toLowerCase() === SHARED.UPLOADED\r\n ).length;\r\n return `${completed}/${total}`;\r\n }\r\n\r\n /**\r\n * Gets pending document count for a category\r\n * @param category Document category\r\n * @returns Number of pending documents\r\n */\r\n getPendingDocumentCount(category: DocumentListResponse): number {\r\n return category.totalDocs - category.acceptedDocs;\r\n }\r\n\r\n /**\r\n * Gets approved document count for a category\r\n * @param category Document category\r\n * @returns Number of approved documents\r\n */\r\n getApprovedDocumentCount(category: DocumentListResponse): number {\r\n return category.acceptedDocs;\r\n }\r\n\r\n /**\r\n * Transforms document model to document list item\r\n * @param documents Array of DocumentModel\r\n * @returns Array of DocumentListItem\r\n */\r\n transformDocumentModelToListItem(documents: any[]): DocumentListItem[] {\r\n return documents.map(doc => {\r\n const documentUrl: string = doc.documentUrl || doc.url || SHARED.EMPTY;\r\n const hasUrl = Boolean(documentUrl && String(documentUrl).trim().length > 0);\r\n // Backend sometimes returns placeholder rows (e.g. \"Document Request\") marked as Uploaded\r\n // even though no file URL exists. Normalize such rows to Pending so the table is accurate.\r\n const normalizedStatus = !hasUrl ? SHARED.PENDING : (doc.status || SHARED.PENDING);\r\n return {\r\n _id: doc._id || SHARED.EMPTY,\r\n fileName: doc.fileName || SHARED.EMPTY,\r\n docName: doc.docName || doc.documentName || SHARED.EMPTY,\r\n fileSize: doc.fileSize || SHARED.EMPTY,\r\n documentUrl: documentUrl,\r\n status: normalizedStatus,\r\n uploadedOn: doc.uploadedOn || doc.uploadDate || SHARED.EMPTY,\r\n ownerName: doc.ownerName || doc.applicantName || SHARED.EMPTY,\r\n contentType: doc.contentType || SHARED.EMPTY,\r\n isUploaded: hasUrl ? (doc.isUploaded || false) : false,\r\n documentType: doc.documentType || SHARED.EMPTY,\r\n aliasName: doc.aliasName || SHARED.EMPTY,\r\n notes: doc.notes || SHARED.EMPTY\r\n };\r\n });\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { Observable, of, throwError } from 'rxjs';\r\nimport { DocumentUploadService } from './document-upload.service';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { DocumentQuery } from '../state/document.query';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentTableBuilderService } from './document-table-builder.service';\r\nimport { DocumentHelperService } from './document.service';\r\nimport { DocumentListItem, DocumentListResponse } from '../models/document-list-response.model';\r\nimport { TableData } from '../../../Shared/components/table-primary/table-primary.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\nimport { Message } from 'primeng/api';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentListService {\r\n\r\n constructor(\r\n private documentUploadService: DocumentUploadService,\r\n private documentHttpService: DocumentHttpService,\r\n private documentQuery: DocumentQuery,\r\n private documentStore: DocumentStore,\r\n private documentTableBuilder: DocumentTableBuilderService,\r\n private documentHelperService: DocumentHelperService\r\n ) {}\r\n\r\n /**\r\n * Handle file upload click event\r\n */\r\n handleFileUploadClick(): void {\r\n this.documentStore.setMessage(SHARED.EMPTY_ARRAY);\r\n }\r\n\r\n /**\r\n * Handle save click to update document name\r\n */\r\n handleSaveClick(fileName: string, selectedDocument: DocumentListItem): Observable<any> {\r\n const payload = { fileName };\r\n return this.documentHttpService.updateDocumentName(selectedDocument._id, payload);\r\n }\r\n\r\n\r\n /**\r\n * Get completion count for a category\r\n */\r\n getCompletionCount(category: DocumentListResponse): string {\r\n return this.documentTableBuilder.getCompletionCount(category);\r\n }\r\n\r\n /**\r\n * Get pending document count for a category\r\n */\r\n getPendingDocumentCount(category: DocumentListResponse): number {\r\n return this.documentTableBuilder.getPendingDocumentCount(category);\r\n }\r\n\r\n /**\r\n * Get approved document count for a category\r\n */\r\n getApprovedDocumentCount(category: DocumentListResponse): number {\r\n return this.documentTableBuilder.getApprovedDocumentCount(category);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Build document categories from API response\r\n */\r\n buildDocumentCategories(documentListResponse: DocumentListResponse[] | null): {\r\n documentCategories: DocumentListResponse[];\r\n categoryTables: TableData[];\r\n categoryCompletionCounts: string[];\r\n categorySeverities: ('success' | 'info' | 'warning' | 'danger')[];\r\n } {\r\n if (!documentListResponse) {\r\n return {\r\n documentCategories: SHARED.EMPTY_ARRAY,\r\n categoryTables: SHARED.EMPTY_ARRAY,\r\n categoryCompletionCounts: SHARED.EMPTY_ARRAY,\r\n categorySeverities: SHARED.EMPTY_ARRAY\r\n };\r\n }\r\n\r\n // Handle empty response - create a default category to show \"No records found\"\r\n if (documentListResponse.length === 0) {\r\n const defaultCategory = {\r\n label: SHARED.EMPTY,\r\n categoryDescription: SHARED.NO_DOCUMENTS_FOUND,\r\n list: SHARED.EMPTY_ARRAY,\r\n totalDocs: 0,\r\n acceptedDocs: 0,\r\n completed: '0/0'\r\n };\r\n \r\n return {\r\n documentCategories: [defaultCategory],\r\n categoryTables: [this.documentTableBuilder.buildDocumentTable([])],\r\n categoryCompletionCounts: ['0/0'],\r\n categorySeverities: ['info']\r\n };\r\n }\r\n\r\n const documentCategories = [...documentListResponse];\r\n const categoryTables = documentListResponse.map(category => \r\n this.documentTableBuilder.buildDocumentTable(category.list)\r\n );\r\n const categoryCompletionCounts = documentListResponse.map(category => \r\n this.getCompletionCount(category)\r\n );\r\n \r\n // Use the same severity calculation logic as menu items for consistency\r\n const categorySeverities = documentListResponse.map(category => {\r\n // Create a status object similar to what menu items use\r\n const status = {\r\n Pending: category.list.filter(doc => doc.status.toLowerCase() === SHARED.PENDING_STATUS).length,\r\n Reviewing: category.list.filter(doc => doc.status.toLowerCase() === SHARED.REVIEWING_STATUS).length,\r\n Accepted: category.list.filter(doc => doc.status.toLowerCase() === SHARED.APPROVED_STATUS || doc.status.toLowerCase() === SHARED.UPLOADED_STATUS).length,\r\n Rejected: category.list.filter(doc => doc.status.toLowerCase() === SHARED.REJECTED_STATUS).length\r\n };\r\n \r\n // Use the same severity calculation as menu items\r\n const total = status.Pending + status.Reviewing + status.Accepted + status.Rejected;\r\n if (total === 0) return 'info';\r\n if (status.Pending > 0) return 'info';\r\n if (status.Rejected > 0) return 'danger';\r\n if (status.Reviewing > 0) return 'warning';\r\n if (status.Accepted === total && total > 0) return 'success';\r\n return 'warning';\r\n });\r\n\r\n return {\r\n documentCategories,\r\n categoryTables,\r\n categoryCompletionCounts,\r\n categorySeverities\r\n };\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handle table row click\r\n */\r\n handleTableRowClick(rowData: any): DocumentListItem {\r\n return rowData;\r\n }\r\n\r\n /**\r\n * Handle delete action\r\n */\r\n handleDeleteAction(rowData: any, contextId: string): Observable<any> {\r\n if (!rowData._id || !contextId) {\r\n return throwError(() => new Error('Missing required parameters for delete'));\r\n }\r\n\r\n return this.documentHttpService.deleteDocument(rowData._id, contextId);\r\n }\r\n\r\n /**\r\n * Refresh document list for new context\r\n */\r\n refreshDocumentListForNewContext(contextId: string): void {\r\n if (contextId && contextId !== SHARED.EMPTY) {\r\n this.documentStore.setDocumentListResponse(null);\r\n this.documentHelperService.refreshDocumentsWithoutFilters(contextId);\r\n }\r\n }\r\n\r\n /**\r\n * Refresh document list after status update\r\n */\r\n refreshDocumentList(contextId: string): void {\r\n if (contextId) {\r\n this.documentHelperService.refreshDocumentsWithCurrentSelection(contextId);\r\n }\r\n }\r\n\r\n /**\r\n * Setup subscription to document list response\r\n */\r\n setupDocumentListSubscription(): Observable<DocumentListResponse[] | null> {\r\n return this.documentQuery.selectDocumentListResponse();\r\n }\r\n\r\n /**\r\n * Refresh all data with current filters\r\n */\r\n refreshAllDataWithCurrentFilters(contextId: string): void {\r\n this.documentHelperService.refreshAllDataWithCurrentFilters(contextId);\r\n }\r\n} ","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { DocumentStore } from '../state/document.store';\r\n\r\nexport interface ScrollTarget {\r\n element: Element;\r\n menuItemId: string;\r\n}\r\n\r\n/**\r\n * Service to observe section visibility and scroll state; deselects menu item when section scrolls out of view.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentScrollService implements OnDestroy {\r\n private sectionObserver: IntersectionObserver | null = null;\r\n private currentObservedSection: Element | null = null;\r\n private isScrolling: boolean = false;\r\n /** @type {(() => void) | null} */\r\n private scrollHandler: (() => void) | null = null;\r\n private scrollTimeout: ReturnType<typeof setTimeout> | null = null;\r\n /** Pending deselect scheduled on ratio=0. Cancelled when ratio>0 so we don't deselect after a stale ratio=0. */\r\n private deselectTimeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor(private documentStore: DocumentStore) {}\r\n\r\n /**\r\n * Sets up scroll event listeners to track scrolling state.\r\n * @param {HTMLElement} containerElement - The container element to monitor for scroll events\r\n */\r\n setupScrollListeners(containerElement: HTMLElement): void {\r\n if (containerElement) {\r\n /** Scroll handler: sets isScrolling and resets after 150ms */\r\n this.scrollHandler = () => {\r\n this.isScrolling = true;\r\n if (this.scrollTimeout) clearTimeout(this.scrollTimeout);\r\n this.scrollTimeout = setTimeout(() => { this.isScrolling = false; }, 150);\r\n };\r\n containerElement.addEventListener('scroll', this.scrollHandler);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up intersection observer to deselect when the selected section scrolls out of view.\r\n * @param {Element} sectionElement - The section element to observe\r\n * @param {string} menuItemId - The ID of the selected menu item\r\n */\r\n setupSectionObserver(sectionElement: Element, menuItemId: string): void {\r\n this.cancelPendingDeselect();\r\n this.disconnectSectionObserver();\r\n setTimeout(() => {\r\n if (!menuItemId || this.isScrolling) return;\r\n this.sectionObserver = new IntersectionObserver(\r\n (entries) => this.handleIntersectionEntries(entries, menuItemId),\r\n { threshold: [0, 0.1, 0.5, 1], rootMargin: '0px' }\r\n );\r\n this.sectionObserver.observe(sectionElement);\r\n this.currentObservedSection = sectionElement;\r\n }, 1200);\r\n }\r\n\r\n /**\r\n * Handles IntersectionObserver entries: cancel pending deselect when visible, schedule deselect when ratio=0.\r\n * @param {IntersectionObserverEntry[]} entries - Observer entries\r\n * @param {string} menuItemId - Selected menu item id\r\n */\r\n private handleIntersectionEntries(entries: IntersectionObserverEntry[], menuItemId: string): void {\r\n entries.forEach(entry => {\r\n const ratio = entry.intersectionRatio;\r\n if (ratio > 0) this.cancelPendingDeselect();\r\n if (ratio === 0) {\r\n this.cancelPendingDeselect();\r\n this.deselectTimeoutId = setTimeout(() => {\r\n this.deselectTimeoutId = null;\r\n if (this.sectionObserver && menuItemId) this.documentStore.setSelectedMenuItem(null);\r\n this.disconnectSectionObserver();\r\n }, 200);\r\n }\r\n });\r\n }\r\n\r\n private cancelPendingDeselect(): void {\r\n if (this.deselectTimeoutId != null) {\r\n clearTimeout(this.deselectTimeoutId);\r\n this.deselectTimeoutId = null;\r\n }\r\n }\r\n\r\n /**\r\n * Disconnects the section observer\r\n */\r\n disconnectSectionObserver(): void {\r\n this.cancelPendingDeselect();\r\n if (this.sectionObserver) {\r\n this.sectionObserver.disconnect();\r\n this.sectionObserver = null;\r\n this.currentObservedSection = null;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the scrolling flag to true (called when starting a scroll operation)\r\n */\r\n setScrolling(): void {\r\n this.isScrolling = true;\r\n }\r\n\r\n /**\r\n * Resets the scrolling flag after a specified delay.\r\n * @param {number} [delay=1200] - Delay in milliseconds before resetting the flag\r\n */\r\n resetScrollingAfterDelay(delay: number = 1200): void {\r\n setTimeout(() => {\r\n this.isScrolling = false;\r\n }, delay);\r\n }\r\n\r\n /**\r\n * Gets the current scrolling state.\r\n * @returns {boolean} True when a scroll is in progress\r\n */\r\n get isCurrentlyScrolling(): boolean {\r\n return this.isScrolling;\r\n }\r\n\r\n /**\r\n * Cleans up all resources\r\n */\r\n ngOnDestroy(): void {\r\n this.disconnectSectionObserver();\r\n this.cleanupScrollListeners();\r\n }\r\n\r\n /**\r\n * Removes scroll event listeners.\r\n * @param {HTMLElement} [containerElement] - The container element to remove listeners from\r\n */\r\n cleanupScrollListeners(containerElement?: HTMLElement): void {\r\n if (containerElement && this.scrollHandler) {\r\n containerElement.removeEventListener('scroll', this.scrollHandler);\r\n this.scrollHandler = null;\r\n }\r\n \r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n this.scrollTimeout = null;\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { SHARED } from '../../constant/SHARED';\r\nimport { ProcessedRowData, TableData } from './table-primary.model';\r\n\r\n@Component({\r\n selector: 'lib-table-primary',\r\n standalone: false,\r\n templateUrl: './table-primary.component.html',\r\n styleUrl: './table-primary.component.scss'\r\n})\r\nexport class TablePrimaryComponent implements OnChanges {\r\n @Input() tableData: TableData = { columns: [], data: [] };\r\n @Input() showHeader: boolean = true;\r\n @Input() tableStyle: any = { 'min-width': '100%' };\r\n @Output() rowClick = new EventEmitter<any>();\r\n @Output() rowCtrlClick = new EventEmitter<any>();\r\n processedData: ProcessedRowData[] = [];\r\n \r\n // Expose SHARED constants for template use\r\n readonly SHARED = SHARED;\r\n\r\n // Computed property for visible columns (excluding actions)\r\n get visibleColumns() {\r\n return this.tableData.columns.filter(col => col.type !== SHARED.CELL_TYPE_ACTIONS);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['tableData'] && this.tableData) {\r\n this.processTableData();\r\n }\r\n }\r\n\r\n private processTableData(): void {\r\n this.processedData = this.tableData.data.map((rowData, index) => {\r\n const processedRow: ProcessedRowData = { ...rowData };\r\n if (rowData.fileName) {\r\n processedRow._fileExtension = this.getFileExtension(rowData.fileName);\r\n processedRow._isPdfFile = processedRow._fileExtension === SHARED.PDF;\r\n processedRow._isImageFile = processedRow._fileExtension === SHARED.JPG || processedRow._fileExtension === SHARED.PNG;\r\n processedRow._isExcelFile = processedRow._fileExtension === SHARED.XLSX;\r\n processedRow._isOtherFile = !processedRow._isPdfFile && !processedRow._isImageFile && !processedRow._isExcelFile;\r\n }\r\n\r\n this.tableData.columns.forEach(col => {\r\n if (col.type === SHARED.STATUS_PARAM && rowData[col.field]) {\r\n const status = rowData[col.field];\r\n processedRow._statusClass = this.getStatusClass(status);\r\n processedRow._statusIcon = this.getStatusIcon(status);\r\n }\r\n });\r\n\r\n return processedRow;\r\n });\r\n }\r\n\r\n getStatusClass(status: string): string {\r\n switch (status.toLowerCase()) {\r\n case SHARED.PENDING_STATUS:\r\n return SHARED.STATUS_PENDING_CLASS;\r\n case SHARED.APPROVED_STATUS:\r\n return SHARED.STATUS_APPROVED_CLASS;\r\n case SHARED.ALERT_STATUS:\r\n return SHARED.STATUS_ALERT_CLASS;\r\n case SHARED.UPLOADED_STATUS:\r\n return SHARED.STATUS_UPLOADED_CLASS;\r\n case SHARED.REVIEWING_STATUS:\r\n return SHARED.STATUS_REVIEWING_CLASS;\r\n case SHARED.REJECTED_STATUS:\r\n return SHARED.STATUS_REJECTED_CLASS;\r\n default:\r\n return SHARED.STATUS_PENDING_CLASS;\r\n }\r\n }\r\n\r\n getStatusIcon(status: string): string {\r\n switch (status.toLowerCase()) {\r\n case SHARED.PENDING_STATUS:\r\n return SHARED.ICON_CLOCK;\r\n case SHARED.APPROVED_STATUS:\r\n return SHARED.ICON_CHECK;\r\n case SHARED.ALERT_STATUS:\r\n return SHARED.ICON_EXCLAMATION_TRIANGLE;\r\n case SHARED.UPLOADED_STATUS:\r\n return SHARED.ICON_CLOUD_UPLOAD;\r\n case SHARED.REVIEWING_STATUS:\r\n return SHARED.ICON_EYE;\r\n case SHARED.REJECTED_STATUS:\r\n return SHARED.ICON_TIMES;\r\n default:\r\n return SHARED.ICON_CLOCK;\r\n }\r\n }\r\n\r\n getFileExtension(fileName: string): string {\r\n return fileName.split(SHARED.DOT).pop()?.toUpperCase() || SHARED.PDF;\r\n }\r\n\r\n onRowClick(event: MouseEvent, rowData: any): void {\r\n if (event.ctrlKey || event.metaKey) {\r\n this.rowCtrlClick.emit(rowData);\r\n } else {\r\n this.rowClick.emit(rowData);\r\n }\r\n }\r\n\r\n getVisibleColumnCount(): number {\r\n return this.visibleColumns.length;\r\n }\r\n\r\n /**\r\n * Formats document display name based on whether aliasName exists:\r\n * - Without aliasName: fileName on top, docName below\r\n * - With aliasName: aliasName on top, docName - fileName below\r\n * @param rowData The row data containing docName, aliasName, and fileName\r\n * @returns HTML string with proper formatting\r\n */\r\n formatDocumentDisplayName(rowData: any): string {\r\n let displayName = '';\r\n \r\n if (rowData.aliasName && rowData.aliasName.trim() !== '') {\r\n // With aliasName: aliasName on top, docName - fileName below\r\n displayName += `<span class=\"alias-name\">${rowData.aliasName}</span><br>`;\r\n \r\n if (rowData.docName && rowData.fileName) {\r\n displayName += `<span class=\"document-info\">${rowData.docName} - ${rowData.fileName}</span>`;\r\n } else if (rowData.docName) {\r\n displayName += `<span class=\"document-info\">${rowData.docName}</span>`;\r\n }\r\n } else {\r\n // Without aliasName: fileName on top, docName below\r\n if (rowData.fileName) {\r\n displayName += `<span class=\"document-info\">${rowData.fileName}</span>`;\r\n }\r\n \r\n if (rowData.docName) {\r\n if (displayName) displayName += '<br>';\r\n displayName += `<span class=\"document-info\">${rowData.docName}</span>`;\r\n }\r\n }\r\n \r\n return displayName;\r\n }\r\n}\r\n","<div class=\"table-primary\">\r\n <p-table [value]=\"processedData\" [tableStyle]=\"tableStyle\">\r\n <ng-template pTemplate=\"header\" *ngIf=\"showHeader\">\r\n <tr>\r\n <ng-container *ngFor=\"let col of visibleColumns\">\r\n <th [style.width]=\"col.width\">\r\n {{ col.header }}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData>\r\n <tr (click)=\"onRowClick($event, rowData)\" class=\"clickable-row\">\r\n <ng-container *ngFor=\"let col of visibleColumns\">\r\n <td [style.width]=\"col.width\">\r\n <!-- Document Cell -->\r\n <div *ngIf=\"col.type === SHARED.CELL_TYPE_DOCUMENT\" class=\"document-cell\">\r\n <div class=\"document-info\">\r\n <div class=\"document-icon\">\r\n <i [class]=\"SHARED.ICON_FILE_PDF\" *ngIf=\"rowData._isPdfFile\"></i>\r\n <i [class]=\"SHARED.ICON_IMAGE\" *ngIf=\"rowData._isImageFile\"></i>\r\n <i [class]=\"SHARED.ICON_FILE_EXCEL\" *ngIf=\"rowData._isExcelFile\"></i>\r\n <i [class]=\"SHARED.ICON_FILE\" *ngIf=\"rowData._isOtherFile\"></i>\r\n </div>\r\n <div class=\"document-details\">\r\n <div class=\"document-name\" [innerHTML]=\"formatDocumentDisplayName(rowData)\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Status Cell -->\r\n \r\n <div *ngIf=\"col.type === SHARED.CELL_TYPE_STATUS\" class=\"status-cell\">\r\n <span class=\"status-pill\" [ngClass]=\"rowData._statusClass\">\r\n <i [class]=\"rowData._statusIcon\"></i>\r\n {{ rowData[col.field] }}\r\n </span>\r\n </div>\r\n\r\n <!-- Actions Cell -->\r\n <div *ngIf=\"col.type === SHARED.CELL_TYPE_ACTIONS\" class=\"actions-cell\">\r\n <!-- Actions content can be added here if needed -->\r\n </div>\r\n\r\n <!-- Default Text Cell -->\r\n <div *ngIf=\"!col.type || col.type === SHARED.CELL_TYPE_TEXT\" class=\"text-cell\">\r\n {{ rowData[col.field] }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n \r\n <!-- No Records Template -->\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"getVisibleColumnCount()\" class=\"no-records-cell\">\r\n <div class=\"no-records-content\">\r\n <i class=\"pi pi-inbox\" style=\"font-size: 2rem; color: #6c757d;\"></i>\r\n <p class=\"no-records-text\">No records found</p>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { DocumentHelperService } from './document.service';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\nimport { DocumentAction } from './document-actions.service';\r\nimport { DocumentAlertList, SHARED, SUPPORTED_IMAGE_TYPES } from '../../../Shared/constant/SHARED';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentQuery } from '../state/document.query';\r\n\r\nexport interface DocumentViewerState {\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentViewerService {\r\n constructor(\r\n private documentHttpService: DocumentHttpService,\r\n private documentService: DocumentHelperService,\r\n private messageService: MessageService,\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery\r\n ) {}\r\n\r\n /**\r\n * Gets the current document viewer state as an observable\r\n */\r\n get state$(): Observable<DocumentViewerState> {\r\n return this.documentQuery.selectDocumentViewerState();\r\n }\r\n\r\n /**\r\n * Gets the current document viewer state synchronously\r\n */\r\n getCurrentState(): DocumentViewerState {\r\n return this.documentQuery.getDocumentViewerState();\r\n }\r\n\r\n /**\r\n * Updates the selected document and recalculates all computed properties\r\n * @param document The selected document\r\n */\r\n updateSelectedDocument(document: DocumentListItem, skipLoadDocumentHistory: boolean = false): void {\r\n this.documentService.set(document);\r\n const alertData = this.getAlertData(document);\r\n const documentStatus = this.calculateDocumentStatus(document);\r\n const documentIsUploaded = this.calculateIsDocumentUploaded(document);\r\n\r\n this.documentStore.updateDocumentViewerState(\r\n document,\r\n undefined, \r\n undefined,\r\n undefined,\r\n documentStatus,\r\n documentIsUploaded,\r\n alertData\r\n );\r\n\r\n if( !skipLoadDocumentHistory && document?._id ) this.loadDocumentHistory(document._id);\r\n }\r\n\r\n /**\r\n * Loads document history data\r\n * @param documentId The document ID\r\n */\r\n loadDocumentHistory(documentId: string): void {\r\n if (documentId) {\r\n this.documentHttpService.getDocumentHistory(documentId)\r\n .subscribe({\r\n next: (history) => {\r\n this.documentStore.updateDocumentViewerState(\r\n undefined,\r\n history,\r\n true\r\n );\r\n },\r\n error: (error) => {\r\n this.documentStore.updateDocumentViewerState(\r\n undefined,\r\n undefined,\r\n false\r\n );\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Determines if the given content type is an image\r\n * @param contentType The MIME type of the content\r\n * @returns True if the content type is an image\r\n */\r\n isImage(contentType?: string): boolean {\r\n return contentType ? SUPPORTED_IMAGE_TYPES.includes(contentType) : false;\r\n }\r\n\r\n /**\r\n * Handles document actions and updates status\r\n * @param action The action performed\r\n * @param contextId The context ID for API calls\r\n */\r\n handleDocumentAction(action: DocumentAction, contextId?: string): void {\r\n const currentState = this.documentQuery.getDocumentViewerState();\r\n if (!currentState.selectedDocument?._id) {\r\n console.error('No document ID available');\r\n return;\r\n }\r\n\r\n switch (action.type) {\r\n case SHARED.ACCEPT_ACTION:\r\n this.updateDocumentStatus(SHARED.STATUS_APPROVED, action.note || SHARED.DOCUMENT_ACCEPTED_MESSAGE, contextId);\r\n break;\r\n case SHARED.REJECT_ACTION:\r\n this.updateDocumentStatus(SHARED.STATUS_REJECTED, action.note || SHARED.DOCUMENT_REJECTED_MESSAGE, contextId);\r\n break;\r\n case SHARED.DELETE_ACTION:\r\n this.deleteDocument(currentState.selectedDocument._id, contextId);\r\n // Don't emit success event here - it will be emitted only on successful delete\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Updates the document status via API call and refreshes all related data\r\n * @param status The new status (Approved, Rejected)\r\n * @param description The status update description\r\n * @param contextId The context ID for API calls\r\n */\r\n private updateDocumentStatus(status: string, description: string, contextId?: string): void {\r\n const currentState = this.documentQuery.getDocumentViewerState();\r\n if (!currentState.selectedDocument?._id) {\r\n console.error('No document ID available');\r\n return;\r\n }\r\n\r\n this.documentStore.setIsActionLoading(true);\r\n\r\n this.documentHttpService.updateDocumentStatus(\r\n currentState.selectedDocument._id,\r\n status,\r\n description\r\n ).subscribe({\r\n next: (response) => {\r\n if (currentState.selectedDocument && response.status) {\r\n const normalizedStatus = response.normalizedStatus || response.status.toLowerCase();\r\n const updatedDocument = {\r\n ...currentState.selectedDocument,\r\n status: normalizedStatus\r\n };\r\n \r\n this.updateSelectedDocument(updatedDocument);\r\n }\r\n this.refreshAllData(contextId);\r\n },\r\n error: (error) => {\r\n console.error('Error updating document status:', error);\r\n },\r\n complete: () => {\r\n this.documentStore.setIsActionLoading(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Deletes a document without immediate refresh - refresh will happen when viewer is closed\r\n * @param documentId The ID of the document to delete\r\n * @param contextId The context ID for API calls\r\n */\r\n private deleteDocument(documentId: string, contextId?: string): void {\r\n if (!contextId) {\r\n console.error('No context ID available for delete operation');\r\n return;\r\n }\r\n\r\n this.documentStore.setIsActionLoading(true);\r\n\r\n this.documentHttpService.deleteDocument(documentId, contextId).subscribe({\r\n next: (res:any) => {\r\n if(res){\r\n // this.documentService.refreshAllDataWithCurrentFilters(contextId);\r\n this.documentStore.setDeleteSuccess(true);\r\n this.documentStore.clearDocumentViewerState();\r\n }\r\n },\r\n error: (error) => {\r\n this.documentStore.setIsActionLoading(false);\r\n this.documentStore.setDeleteError(error.message);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refreshes all related data after document status update\r\n * @param contextId The context ID for API calls\r\n */\r\n private refreshAllData(contextId?: string): void {\r\n if (!contextId) {\r\n console.error('No context ID available for data refresh');\r\n return;\r\n }\r\n\r\n const currentState = this.documentQuery.getDocumentViewerState();\r\n if (currentState.selectedDocument?._id) {\r\n this.loadDocumentHistory(currentState.selectedDocument._id);\r\n }\r\n\r\n // Use the same refresh method as other components for consistency\r\n this.documentService.refreshAllDataWithCurrentFilters(contextId);\r\n }\r\n\r\n /**\r\n * Gets alert data for the document\r\n * @param document The document\r\n * @returns Alert data\r\n */\r\n private getAlertData(document: DocumentListItem): any {\r\n return DocumentAlertList.find((res: any) => res.status === document?.status);\r\n }\r\n\r\n /**\r\n * Calculates the current status of the document for the actions component\r\n * @param document The document\r\n * @returns The current document status\r\n */\r\n private calculateDocumentStatus(document: DocumentListItem): 'pending' | 'accepted' | 'rejected' {\r\n if (!document) return SHARED.STATUS_PENDING as 'pending';\r\n \r\n // First check statusId from API response if available\r\n if (document.statusId) {\r\n switch (document.statusId.toLowerCase()) {\r\n case SHARED.STATUS_APPROVED.toLowerCase():\r\n return SHARED.STATUS_ACCEPTED as 'accepted';\r\n case SHARED.STATUS_REJECTED.toLowerCase():\r\n return SHARED.STATUS_REJECTED_LOWERCASE as 'rejected';\r\n case SHARED.STATUS_PENDING:\r\n return SHARED.STATUS_PENDING as 'pending';\r\n }\r\n }\r\n \r\n // Fall back to status field mapping\r\n switch (document.status?.toLowerCase()) {\r\n case SHARED.STATUS_APPROVED.toLowerCase():\r\n case SHARED.STATUS_ACCEPTED:\r\n return SHARED.STATUS_ACCEPTED as 'accepted';\r\n case SHARED.STATUS_REJECTED.toLowerCase():\r\n case SHARED.STATUS_DECLINED:\r\n return SHARED.STATUS_REJECTED_LOWERCASE as 'rejected';\r\n default:\r\n return SHARED.STATUS_PENDING as 'pending';\r\n }\r\n }\r\n\r\n /**\r\n * Calculates if the document is uploaded and ready for actions\r\n * @param document The document\r\n * @returns True if document is uploaded\r\n */\r\n private calculateIsDocumentUploaded(document: DocumentListItem): boolean {\r\n if (!document) return false;\r\n \r\n // Check if document has a URL and is not in a pending state\r\n const isPending = document.statusId?.toLowerCase() === SHARED.STATUS_PENDING || \r\n document.status?.toLowerCase() === SHARED.STATUS_PENDING;\r\n \r\n return !!(document.documentUrl && !isPending);\r\n }\r\n} ","/**\r\n * Constants for Document History labels and styling\r\n */\r\nexport const DOCUMENT_HISTORY = {\r\n // Document History Labels\r\n LABELS: {\r\n DOCUMENT_REQUESTED: 'Document Requested',\r\n DOCUMENT_UPLOADED: 'Document Uploaded',\r\n DOCUMENT_REJECTED: 'Document Rejected',\r\n DOCUMENT_ACCEPTED: 'Document Accepted'\r\n },\r\n\r\n // Icon classes for different actions\r\n ICONS: {\r\n DOCUMENT_REQUESTED: 'pi pi-file',\r\n DOCUMENT_UPLOADED: 'pi pi-cloud-upload',\r\n DOCUMENT_REJECTED: 'pi pi-times',\r\n DOCUMENT_ACCEPTED: 'pi pi-check'\r\n },\r\n\r\n // Text color classes - matching the design in the image\r\n TEXT_COLORS: {\r\n DOCUMENT_REQUESTED: 'text-gray-700', // Dark gray for better readability\r\n DOCUMENT_UPLOADED: 'text-green-700', // Dark green for uploaded\r\n DOCUMENT_REJECTED: 'text-red-700', // Dark red for rejected\r\n DOCUMENT_ACCEPTED: 'text-green-700' // Dark green for accepted\r\n },\r\n\r\n // Background color classes - matching the light gray design from image\r\n BG_COLORS: {\r\n DOCUMENT_REQUESTED: 'bg-gray-100', // Light gray like in the image\r\n DOCUMENT_UPLOADED: 'bg-green-50', // Very light green\r\n DOCUMENT_REJECTED: 'bg-red-50', // Very light red\r\n DOCUMENT_ACCEPTED: 'bg-green-50' // Very light green\r\n },\r\n\r\n // Border color classes - subtle borders\r\n BORDER_COLORS: {\r\n DOCUMENT_REQUESTED: 'border-gray-300', // Medium gray border\r\n DOCUMENT_UPLOADED: 'border-green-300', // Light green border\r\n DOCUMENT_REJECTED: 'border-red-300', // Light red border\r\n DOCUMENT_ACCEPTED: 'border-green-300' // Light green border\r\n },\r\n\r\n // Icon background color classes - matching the circular icon design\r\n ICON_BG_COLORS: {\r\n DOCUMENT_REQUESTED: 'icon-bg-blue', // Blue for requested (as shown in image)\r\n DOCUMENT_UPLOADED: 'icon-bg-green', // Green for uploaded\r\n DOCUMENT_REJECTED: 'icon-bg-red', // Red for rejected\r\n DOCUMENT_ACCEPTED: 'icon-bg-green' // Green for accepted\r\n }\r\n}; ","import { Injectable } from '@angular/core';\r\nimport { DOCUMENT_HISTORY } from '../constant/DOCUMENT_HISTORY';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\n/**\r\n * Service for handling document history styling logic\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentHistoryStyleService {\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Get the appropriate icon class based on the action label\r\n */\r\n getActionIcon(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate color class based on the action label\r\n */\r\n getActionColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate background color class based on the action label\r\n */\r\n getActionBgColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate border color class based on the action label\r\n */\r\n getActionBorderColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate icon background color class based on the action label\r\n */\r\n getActionIconBgColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Check if a section has valid content to display\r\n */\r\n checkValidContent(section: any): boolean {\r\n return section.list && section.list.length > 0 && \r\n section.list.some((item:any) => \r\n item.label || \r\n item.requestDescription || \r\n item.documentUrl || \r\n item.userName\r\n );\r\n }\r\n\r\n getAccordionClass(section: any): string {\r\n if (!section.list || section.list.length === 0) {\r\n return SHARED.DOCUMENT_REQUESTED;\r\n }\r\n\r\n const firstItem = section.list[0];\r\n const label = firstItem.label;\r\n\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return SHARED.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return SHARED.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return SHARED.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n default:\r\n return SHARED.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { DocumentHistoryItem, DocumentHistorySection } from '../models/document-history.model';\r\nimport { DocumentHistoryStyleService } from './document-history-style.service';\r\nimport { DOCUMENT_HISTORY } from '../constant/DOCUMENT_HISTORY';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\n// Extended interface for processed items with computed properties\r\ninterface ProcessedDocumentHistoryItem extends DocumentHistoryItem {\r\n actionIcon: string;\r\n actionColor: string;\r\n actionBgColor: string;\r\n actionBorderColor: string;\r\n actionIconBgColor: string;\r\n}\r\n\r\ninterface ProcessedDocumentHistorySection extends DocumentHistorySection {\r\n list: ProcessedDocumentHistoryItem[];\r\n accordionClass?: string;\r\n hasValidContent?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentHistoryService {\r\n\r\n constructor(private documentHistoryStyleService: DocumentHistoryStyleService, private http : HttpClient) {}\r\n\r\n /**\r\n * Get the CSS class for accordion styling based on the section's label\r\n */\r\n private getAccordionClass(section: ProcessedDocumentHistorySection): string {\r\n if (!section.list || section.list.length === 0) {\r\n return SHARED.DOCUMENT_REQUESTED; // Default class\r\n }\r\n\r\n const firstItem = section.list[0];\r\n const label = firstItem.label;\r\n\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return SHARED.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return SHARED.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return SHARED.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n default:\r\n return SHARED.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Check if a section has valid content to display\r\n */\r\n private checkValidContent(section: ProcessedDocumentHistorySection): boolean {\r\n return section.list && section.list.length > 0 && \r\n section.list.some(item => \r\n item.requestDescription !== SHARED.EMPTY && \r\n item.documentUrl !== SHARED.EMPTY && \r\n (item.userName !== SHARED.EMPTY && item.userName !== SHARED.UNKNOWN_USER)\r\n );\r\n }\r\n\r\n /**\r\n * Process history data to add computed properties\r\n */\r\n processHistoryData(historyData: DocumentHistorySection[]): ProcessedDocumentHistorySection[] {\r\n if (!historyData) {\r\n return SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n return historyData.map(section => {\r\n const processedSection: ProcessedDocumentHistorySection = {\r\n ...section,\r\n list: section.list.map(item => ({\r\n ...item,\r\n dateTime: item.dateTime || ERRORS.NO_VALUE_FOUND,\r\n actionIcon: this.documentHistoryStyleService.getActionIcon(item.label),\r\n actionColor: this.documentHistoryStyleService.getActionColor(item.label),\r\n actionBgColor: this.documentHistoryStyleService.getActionBgColor(item.label),\r\n actionBorderColor: this.documentHistoryStyleService.getActionBorderColor(item.label),\r\n actionIconBgColor: this.documentHistoryStyleService.getActionIconBgColor(item.label)\r\n }))\r\n };\r\n processedSection.accordionClass = this.getAccordionClass(processedSection);\r\n processedSection.hasValidContent = this.checkValidContent(processedSection);\r\n\r\n return processedSection;\r\n }).sort((a, b) => {\r\n if (a.header === SHARED.INITIAL_REQUEST) return -1;\r\n if (b.header === SHARED.INITIAL_REQUEST) return 1;\r\n return 0;\r\n }).map(section => ({\r\n ...section,\r\n list: section.list.reverse()\r\n }));\r\n }\r\n\r\n /**\r\n * Downloads a document when clicked\r\n * @param documentUrl - The URL of the document to download\r\n * @param docName - The name of the document\r\n */\r\n downloadDocument(documentUrl: string, docName?: string): void {\r\n if (!documentUrl) {\r\n console.warn(ERRORS.NO_DOCUMENT_URL);\r\n return;\r\n }\r\n this.http.get(documentUrl, { responseType: 'blob' }).subscribe({\r\n next: (blob) => {\r\n const blobUrl = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = blobUrl;\r\n a.download = docName ?? SHARED.DOCUMENT;\r\n a.style.display = SHARED.NONE;\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n window.URL.revokeObjectURL(blobUrl);\r\n },\r\n error: (err) => {\r\n console.error(ERRORS.DOWNLOAD_FAIL, err);\r\n }\r\n });\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface DocumentAction {\r\n type: typeof SHARED.REJECT_ACTION | typeof SHARED.ACCEPT_ACTION | typeof SHARED.DELETE_ACTION;\r\n note?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentActionsService {\r\n\r\n /**\r\n * Calculates the card class based on status\r\n * @param currentStatus - The current status of the document\r\n * @param statusId - The status ID from API\r\n * @returns {string} The CSS class for the card\r\n */\r\n calculateCardClass(currentStatus?: string, statusId?: string): string {\r\n // Use statusId if available, otherwise fall back to currentStatus\r\n if (statusId) {\r\n return `status-${statusId}-card`;\r\n }\r\n \r\n if (!currentStatus) {\r\n return SHARED.CARD_PENDING;\r\n }\r\n \r\n const status = currentStatus.toLowerCase();\r\n if (status === SHARED.STATUS_ACCEPTED.toLowerCase() || status === SHARED.STATUS_APPROVED.toLowerCase()) {\r\n return SHARED.CARD_ACCEPTED;\r\n } else if (status === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() || status === SHARED.STATUS_REJECTED.toLowerCase()) {\r\n return SHARED.CARD_REJECTED;\r\n } else {\r\n return SHARED.CARD_PENDING;\r\n }\r\n }\r\n\r\n /**\r\n * Calculates the reject button class based on status\r\n * @param currentStatus - The current status of the document\r\n * @param statusId - The status ID from API\r\n * @returns {string} The CSS class for the reject button\r\n */\r\n calculateRejectButtonClass(currentStatus?: string, statusId?: string): string {\r\n // Use statusId if available, otherwise fall back to currentStatus\r\n if (statusId) {\r\n return `status-${statusId}-reject`;\r\n }\r\n \r\n if (!currentStatus) {\r\n return SHARED.BUTTON_DEFAULT_REJECT;\r\n }\r\n \r\n const status = currentStatus.toLowerCase();\r\n if (status === SHARED.STATUS_ACCEPTED.toLowerCase() || status === SHARED.STATUS_APPROVED.toLowerCase()) {\r\n return SHARED.BUTTON_SECONDARY_REJECT;\r\n } else if (status === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() || status === SHARED.STATUS_REJECTED.toLowerCase()) {\r\n return SHARED.BUTTON_PRIMARY_REJECT;\r\n } else {\r\n return SHARED.BUTTON_DEFAULT_REJECT;\r\n }\r\n }\r\n\r\n /**\r\n * Calculates the accept button class based on status\r\n * @param currentStatus - The current status of the document\r\n * @param statusId - The status ID from API\r\n * @returns {string} The CSS class for the accept button\r\n */\r\n calculateAcceptButtonClass(currentStatus?: string, statusId?: string): string {\r\n // Use statusId if available, otherwise fall back to currentStatus\r\n if (statusId) {\r\n return `status-${statusId}-accept`;\r\n }\r\n \r\n if (!currentStatus) {\r\n return SHARED.BUTTON_DEFAULT_ACCEPT;\r\n }\r\n \r\n const status = currentStatus.toLowerCase();\r\n if (status === SHARED.STATUS_ACCEPTED.toLowerCase() || status === SHARED.STATUS_APPROVED.toLowerCase()) {\r\n return SHARED.BUTTON_PRIMARY_ACCEPT;\r\n } else if (status === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() || status === SHARED.STATUS_REJECTED.toLowerCase()) {\r\n return SHARED.BUTTON_SECONDARY_ACCEPT;\r\n } else {\r\n return SHARED.BUTTON_DEFAULT_ACCEPT;\r\n }\r\n }\r\n\r\n /**\r\n * Creates an accept action\r\n * @param note - The acceptance note\r\n * @returns {DocumentAction} The accept action\r\n */\r\n createAcceptAction(note: string): DocumentAction {\r\n return {\r\n type: SHARED.ACCEPT_ACTION as 'accept',\r\n note: note\r\n };\r\n }\r\n\r\n /**\r\n * Creates a reject action\r\n * @param note - The rejection note\r\n * @returns {DocumentAction} The reject action\r\n */\r\n createRejectAction(note: string): DocumentAction {\r\n return {\r\n type: SHARED.REJECT_ACTION as 'reject',\r\n note: note\r\n };\r\n }\r\n\r\n /**\r\n * Creates a delete action\r\n * @returns {DocumentAction} The delete action\r\n */\r\n createDeleteAction(): DocumentAction {\r\n return {\r\n type: SHARED.DELETE_ACTION as 'delete'\r\n };\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface AiChatMessage {\r\n role: 'user' | 'assistant';\r\n content: string;\r\n htmlContent?: string;\r\n}\r\n\r\nexport interface DocumentHistoryAiState {\r\n showAiMenu: boolean;\r\n showAiSidebar: boolean;\r\n aiSidebarHeader: 'Query';\r\n aiContent: string;\r\n aiContentHtml: string;\r\n aiLoading: boolean;\r\n aiError: string;\r\n queryText: string;\r\n queryLoading: boolean;\r\n queryMessages: AiChatMessage[];\r\n}\r\n\r\n/**\r\n * Handles AI-related document history workflows and formatting.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentHistoryAiService {\r\n /**\r\n * UI state for AI panel and query chat.\r\n */\r\n state: DocumentHistoryAiState = {\r\n showAiMenu: false,\r\n showAiSidebar: false,\r\n aiSidebarHeader: 'Query',\r\n aiContent: '',\r\n aiContentHtml: '',\r\n aiLoading: false,\r\n aiError: '',\r\n queryText: '',\r\n queryLoading: false,\r\n queryMessages: []\r\n };\r\n\r\n /**\r\n * Creates an instance of DocumentHistoryAiService.\r\n * @param {DocumentHttpService} documentHttpService - Service for AI API calls.\r\n */\r\n constructor(private documentHttpService: DocumentHttpService) {}\r\n\r\n /**\r\n * Toggles AI dropdown visibility.\r\n */\r\n toggleAiMenu(): void {\r\n this.state.showAiMenu = !this.state.showAiMenu;\r\n }\r\n\r\n /**\r\n * Closes AI dropdown menu.\r\n */\r\n closeAiMenu(): void {\r\n this.state.showAiMenu = false;\r\n }\r\n\r\n /**\r\n * Opens AI sidebar for Query panel.\r\n * @param {'Query'} section - AI section (Query only).\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n openAiPanel(section: 'Query', selectedDocument: any): void {\r\n this.initializePanel();\r\n this.resetQueryState();\r\n }\r\n\r\n /**\r\n * Sends query using current query text in state.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n sendQuery(selectedDocument: any): void {\r\n const question = (this.state.queryText || '').trim();\r\n if (!question || this.state.queryLoading) return;\r\n\r\n this.state.aiError = '';\r\n this.pushUserQuestion(question);\r\n this.askQuestionForDocument(selectedDocument, question).subscribe({\r\n next: this.handleQuestionResult.bind(this),\r\n error: this.handleQuestionRequestError.bind(this)\r\n });\r\n }\r\n\r\n /**\r\n * Sends a fixed \"Document Summary\" prompt for the current document.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n sendSummaryPrompt(selectedDocument: any): void {\r\n const prompt = SHARED.SUMMARY_PROMPT;\r\n if (this.state.queryLoading) {\r\n return;\r\n }\r\n this.state.aiError = '';\r\n this.pushUserQuestion(prompt);\r\n this.askQuestionForDocument(selectedDocument, prompt).subscribe({\r\n next: this.handleQuestionResult.bind(this),\r\n error: this.handleQuestionRequestError.bind(this)\r\n });\r\n }\r\n\r\n /**\r\n * Sends a fixed \"Document Insights\" prompt for the current document.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n sendInsightsPrompt(selectedDocument: any): void {\r\n const prompt = SHARED.INSIGHTS_PROMPT;\r\n if (this.state.queryLoading) {\r\n return;\r\n }\r\n this.state.aiError = '';\r\n this.pushUserQuestion(prompt);\r\n this.askQuestionForDocument(selectedDocument, prompt).subscribe({\r\n next: this.handleQuestionResult.bind(this),\r\n error: this.handleQuestionRequestError.bind(this)\r\n });\r\n }\r\n\r\n /**\r\n * Handles Enter key for query submission.\r\n * @param {KeyboardEvent} event - Keyboard event from query textarea.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n onQueryEnter(event: KeyboardEvent, selectedDocument: any): void {\r\n if (event.key !== 'Enter' || event.shiftKey) return;\r\n event.preventDefault();\r\n this.sendQuery(selectedDocument);\r\n }\r\n\r\n /**\r\n * Returns selected document id.\r\n * @param {any} selectedDocument - Selected document object.\r\n * @returns {string | undefined} Selected document id.\r\n */\r\n getCurrentDocumentId(selectedDocument: any): string | undefined {\r\n return selectedDocument?._id;\r\n }\r\n\r\n /**\r\n * Sends question against a document.\r\n * @param {string} documentId - Document identifier.\r\n * @param {string} question - User question.\r\n * @returns {Observable<string>} Answer text.\r\n */\r\n askQuestion(documentId: string, question: string): Observable<string> {\r\n if (!documentId) {\r\n return throwError(() => new Error('Document ID is missing.'));\r\n }\r\n\r\n return this.documentHttpService.askAiQuestion(documentId, question).pipe(\r\n map(this.extractQuestionAnswer),\r\n catchError(this.handleAskQuestionError)\r\n );\r\n }\r\n\r\n /**\r\n * Sends question and returns answer + formatted html.\r\n * @param {any} selectedDocument - Selected document object.\r\n * @param {string} question - User question.\r\n * @returns {Observable<{ answer: string; html: string }>} Answer payload.\r\n */\r\n askQuestionForDocument(selectedDocument: any, question: string): Observable<{ answer: string; html: string }> {\r\n const documentId = this.getCurrentDocumentId(selectedDocument);\r\n if (!documentId) {\r\n return throwError(() => new Error(ERRORS.NO_VALUE_FOUND));\r\n }\r\n\r\n return this.askQuestion(documentId, question).pipe(\r\n map(this.toAnswerResult.bind(this)),\r\n catchError(this.handleQuestionGenerationError)\r\n );\r\n }\r\n\r\n /**\r\n * Converts markdown-like output to presentable HTML.\r\n * @param {string} content - Raw AI response content.\r\n * @returns {string} Formatted HTML string.\r\n */\r\n formatAiContent(content: string): string {\r\n const escaped = this.escapeHtml(content || '');\r\n return this.renderMarkdownLines(escaped.split('\\n'));\r\n }\r\n\r\n /**\r\n * Extracts answer text from question API response.\r\n * @param {any} response - Question API response.\r\n * @returns {string} Answer text.\r\n */\r\n private extractQuestionAnswer(response: any): string {\r\n if (!response?.success) {\r\n throw new Error(ERRORS.ERROR_QUESTION_GENERATION);\r\n }\r\n return response.answer || 'No answer found.';\r\n }\r\n\r\n /**\r\n * Maps answer text to answer payload.\r\n * @param {string} answer - Plain answer text.\r\n * @returns {{ answer: string; html: string }} Answer payload.\r\n */\r\n private toAnswerResult(answer: string): { answer: string; html: string } {\r\n return { answer, html: this.formatAiContent(answer) };\r\n }\r\n\r\n /**\r\n * Initializes panel state for Query.\r\n */\r\n private initializePanel(): void {\r\n this.state.aiSidebarHeader = 'Query';\r\n this.state.showAiSidebar = true;\r\n this.state.showAiMenu = false;\r\n this.state.aiError = '';\r\n this.state.aiContent = '';\r\n this.state.aiContentHtml = '';\r\n }\r\n\r\n /**\r\n * Resets query-specific UI state.\r\n */\r\n private resetQueryState(): void {\r\n this.state.queryText = '';\r\n this.state.queryMessages = [];\r\n this.state.queryLoading = false;\r\n this.state.aiError = '';\r\n }\r\n\r\n /**\r\n * Adds user question into chat history and sets loading.\r\n * @param {string} question - User question text.\r\n */\r\n private pushUserQuestion(question: string): void {\r\n this.state.queryMessages.push({ role: 'user', content: question });\r\n this.state.queryText = '';\r\n this.state.queryLoading = true;\r\n }\r\n\r\n /**\r\n * Handles successful question response and updates state.\r\n * @param {{ answer: string; html: string }} result - Formatted answer result.\r\n * @param {string} result.answer - AI answer text.\r\n * @param {string} result.html - Formatted AI answer HTML.\r\n */\r\n private handleQuestionResult(result: { answer: string; html: string }): void {\r\n this.state.queryLoading = false;\r\n this.state.queryMessages.push({\r\n role: 'assistant',\r\n content: result.answer,\r\n htmlContent: result.html\r\n });\r\n }\r\n\r\n /**\r\n * Handles question request errors.\r\n * @param {Error} error - Error object.\r\n */\r\n private handleQuestionRequestError(error: Error): void {\r\n this.state.queryLoading = false;\r\n this.state.aiError = error?.message || ERRORS.ERROR_QUESTION_GENERATION;\r\n }\r\n\r\n /**\r\n * Converts ask-question request errors.\r\n * @returns {Observable<never>} Error observable.\r\n */\r\n private handleAskQuestionError(): Observable<never> {\r\n return throwError(() => new Error(ERRORS.ERROR_QUESTION_GENERATION));\r\n }\r\n\r\n /**\r\n * Converts ask-question-for-document errors.\r\n * @returns {Observable<never>} Error observable.\r\n */\r\n private handleQuestionGenerationError(): Observable<never> {\r\n return throwError(() => new Error(ERRORS.ERROR_QUESTION_GENERATION));\r\n }\r\n\r\n /**\r\n * Renders escaped lines into HTML blocks.\r\n * @param {string[]} lines - Escaped content lines.\r\n * @returns {string} Rendered HTML.\r\n */\r\n private renderMarkdownLines(lines: string[]): string {\r\n const htmlParts: string[] = [];\r\n let isInList = false;\r\n lines.forEach((rawLine) => {\r\n const line = rawLine.trim();\r\n isInList = this.pushMarkdownLine(line, htmlParts, isInList);\r\n });\r\n if (isInList) htmlParts.push('</ul>');\r\n return htmlParts.join('');\r\n }\r\n\r\n /**\r\n * Pushes one markdown line into output.\r\n * @param {string} line - Current line.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list tracking flag.\r\n */\r\n private pushMarkdownLine(line: string, htmlParts: string[], isInList: boolean): boolean {\r\n if (!line) return this.closeListIfNeeded(htmlParts, isInList);\r\n if (line.startsWith('- ')) return this.pushListLine(line, htmlParts, isInList);\r\n return this.pushParagraphLine(line, htmlParts, isInList);\r\n }\r\n\r\n /**\r\n * Closes list if it is currently open.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list flag.\r\n */\r\n private closeListIfNeeded(htmlParts: string[], isInList: boolean): boolean {\r\n if (isInList) htmlParts.push('</ul>');\r\n return false;\r\n }\r\n\r\n /**\r\n * Appends a bullet-list line.\r\n * @param {string} line - Raw markdown line.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list flag.\r\n */\r\n private pushListLine(line: string, htmlParts: string[], isInList: boolean): boolean {\r\n if (!isInList) htmlParts.push('<ul class=\"ai-markdown-list\">');\r\n htmlParts.push(`<li>${this.formatBold(line.substring(2).trim())}</li>`);\r\n return true;\r\n }\r\n\r\n /**\r\n * Appends a paragraph line.\r\n * @param {string} line - Raw markdown line.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list flag.\r\n */\r\n private pushParagraphLine(line: string, htmlParts: string[], isInList: boolean): boolean {\r\n if (isInList) htmlParts.push('</ul>');\r\n htmlParts.push(`<p>${this.formatBold(line)}</p>`);\r\n return false;\r\n }\r\n\r\n /**\r\n * Formats markdown bold markers.\r\n * @param {string} text - Input text.\r\n * @returns {string} Text with strong tags.\r\n */\r\n private formatBold(text: string): string {\r\n return text.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\r\n }\r\n\r\n /**\r\n * Escapes HTML-sensitive characters.\r\n * @param {string} text - Input text.\r\n * @returns {string} Escaped text.\r\n */\r\n private escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n }\r\n}\r\n","import { Directive, Input, ElementRef, Renderer2, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { SessionService } from '../../../Shared/services/session.service';\r\n\r\n/**\r\n * Directive to conditionally show or hide elements based on user permissions.\r\n * @class HasPermissionDirective\r\n * @typedef {HasPermissionDirective}\r\n */\r\n@Directive({\r\n selector: '[permission]',\r\n standalone: false\r\n})\r\nexport class HasPermissionDirective implements OnChanges {\r\n \r\n /**\r\n * The required permission(s) to display the element.\r\n * Accepts a single string or an array of strings.\r\n * @type {string | string[]}\r\n */\r\n @Input() permission?: string | string[];\r\n\r\n /**\r\n * Creates an instance of HasPermissionDirective.\r\n * @param {ElementRef} el - Reference to the host element.\r\n * @param {Renderer2} renderer - Angular Renderer for DOM manipulation.\r\n * @param {SessionService} sessionService - Service to retrieve user permissions.\r\n */\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n public sessionService: SessionService\r\n ) {}\r\n\r\n /**\r\n * Lifecycle hook that is called when input properties change.\r\n * @param {SimpleChanges} changes - The changes in input properties.\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['permission']) {\r\n this.checkPermission();\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the user has the required permission(s).\r\n * Hides the element if the permission is not found.\r\n */\r\n private checkPermission() {\r\n // If no permission is required (empty string, null, or undefined), show the element\r\n if (!this.permission || this.permission === '' || (Array.isArray(this.permission) && this.permission.length === 0)) {\r\n this.renderer.removeStyle(this.el.nativeElement, 'display');\r\n return;\r\n }\r\n\r\n const sessionPermsOrTraits = this.sessionService.getUserPermissions();\r\n const traitListFromSession = this.sessionService.getUserTraits?.() || null;\r\n\r\n // Support both legacy formats:\r\n // - permissions: [{ name: \"documents-deleteDocumentByDocumentId\" }, ...]\r\n // - traits: [\"documents-deleteDocumentByDocumentId\", ...]\r\n const userPermissionNames: string[] = Array.isArray(traitListFromSession)\r\n ? traitListFromSession\r\n : Array.isArray(sessionPermsOrTraits)\r\n ? sessionPermsOrTraits\r\n .map((perm: any) => (typeof perm === 'string' ? perm : perm?.name))\r\n .filter((x: any): x is string => typeof x === 'string' && x.length > 0)\r\n : [];\r\n\r\n const requiredPermissions = Array.isArray(this.permission)\r\n ? this.permission\r\n : [this.permission];\r\n\r\n const hasPermission = requiredPermissions.some(permission =>\r\n userPermissionNames.includes(permission)\r\n );\r\n\r\n if (!hasPermission) {\r\n this.renderer.setStyle(this.el.nativeElement, 'display', 'none');\r\n } else {\r\n this.renderer.removeStyle(this.el.nativeElement, 'display');\r\n }\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { DocumentHistoryAiService } from '../../services/document-history-ai.service';\r\n\r\n@Component({\r\n selector: 'document-ai-chat',\r\n standalone: false,\r\n templateUrl: './document-ai-chat.component.html',\r\n styleUrls: ['./document-ai-chat.component.scss']\r\n})\r\nexport class DocumentAiChatComponent {\r\n /**\r\n * The selected document for context in AI queries.\r\n */\r\n @Input() selectedDocument?: any;\r\n\r\n constructor(public documentHistoryAiService: DocumentHistoryAiService) { }\r\n\r\n handleSummaryPrompt() {\r\n this.documentHistoryAiService.sendSummaryPrompt(this.selectedDocument);\r\n }\r\n\r\n handleInsightsPrompt() {\r\n this.documentHistoryAiService.sendInsightsPrompt(this.selectedDocument);\r\n }\r\n\r\n handleEnter(event: KeyboardEvent) {\r\n this.documentHistoryAiService.onQueryEnter(event, this.selectedDocument);\r\n }\r\n\r\n handleSend() {\r\n this.documentHistoryAiService.sendQuery(this.selectedDocument);\r\n }\r\n}\r\n","<div class=\"chat-panel document-ai-chat-panel\">\r\n <div class=\"chat-header\">\r\n <div class=\"chat-header-content\">\r\n <div class=\"chat-header-brand\">\r\n <span class=\"chat-header-icon\"><i class=\"ri-sparkling-2-fill\"></i></span>\r\n <div class=\"chat-header-text\">\r\n <h2 class=\"chat-title\">Catura Document AI</h2>\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"chat-header-menu\" style=\"cursor: pointer;\" (click)=\"documentHistoryAiService.state.showAiSidebar = false\">\r\n <i class=\"ri-close-line\" style=\"font-size: 1.4rem;\"></i>\r\n </span>\r\n </div>\r\n\r\n <div class=\"chat-messages\">\r\n <div class=\"chat-welcome\" *ngIf=\"documentHistoryAiService.state.queryMessages.length === 0 && !documentHistoryAiService.state.queryLoading\">\r\n <div class=\"welcome-illustration\">\r\n <i class=\"ri-bubble-chart-line\"></i>\r\n </div>\r\n <h3 class=\"welcome-title\">Catura Document AI</h3>\r\n <p class=\"welcome-subtitle\">\r\n We're here to help. Ask your questions below.\r\n Your conversation is private and secure.\r\n </p>\r\n <div class=\"suggested-prompts\">\r\n <button\r\n type=\"button\"\r\n class=\"prompt-chip\"\r\n (click)=\"handleSummaryPrompt()\"\r\n >\r\n <i class=\"ri-sparkling-2-line\"></i>\r\n <span>Summarise this document</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"prompt-chip\"\r\n (click)=\"handleInsightsPrompt()\"\r\n >\r\n <i class=\"ri-sparkling-2-line\"></i>\r\n <span>Provide Insights about this document</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"documentHistoryAiService.state.queryMessages.length > 0\">\r\n <div\r\n class=\"message\"\r\n *ngFor=\"let msg of documentHistoryAiService.state.queryMessages\"\r\n [ngClass]=\"{ 'message-user': msg.role === 'user', 'message-assistant': msg.role === 'assistant' }\"\r\n >\r\n <span class=\"message-avatar\">\r\n <i [ngClass]=\"msg.role === 'user' ? 'ri-user-3-fill' : 'ri-robot-2-line'\"></i>\r\n </span>\r\n <div class=\"message-bubble\">\r\n <ng-container *ngIf=\"msg.role === 'user'\">\r\n {{ msg.content }}\r\n </ng-container>\r\n <ng-container *ngIf=\"msg.role === 'assistant'\">\r\n <div class=\"message-content ai-markdown\" [innerHTML]=\"msg.htmlContent\"></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"message message-assistant\" *ngIf=\"documentHistoryAiService.state.queryLoading\">\r\n <span class=\"message-avatar\">\r\n <i class=\"ri-robot-2-line\"></i>\r\n </span>\r\n <div class=\"message-bubble\">\r\n <span class=\"loading-dots\">\r\n <span></span><span></span><span></span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-input-area\">\r\n <div class=\"chat-input-wrapper\">\r\n <textarea\r\n class=\"chat-input\"\r\n [(ngModel)]=\"documentHistoryAiService.state.queryText\"\r\n [placeholder]=\"'Start Message...'\"\r\n [disabled]=\"documentHistoryAiService.state.queryLoading\"\r\n rows=\"1\"\r\n (keydown)=\"handleEnter($event)\"\r\n ></textarea>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"p-button p-button-primary send-btn\"\r\n (click)=\"handleSend()\"\r\n [disabled]=\"\r\n documentHistoryAiService.state.queryLoading ||\r\n !documentHistoryAiService.state.queryText?.trim()\r\n \"\r\n aria-label=\"Send\"\r\n >\r\n <i class=\"ri-send-plane-fill\"></i>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n","import { Component, Input, Output, EventEmitter, HostListener, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { DocumentHistorySection, HistoryDocument } from '../../models/document-history.model';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHistoryService } from '../../services/document-history.service';\r\nimport { DocumentViewerService } from '../../services/document-viewer.service';\r\nimport { DocumentActionsService } from '../../services/document-actions.service';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { ConfirmationDialogComponent } from '../../../../Shared/components/confirmation-dialog/confirmation-dialog.component';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentHistoryAiService } from '../../services/document-history-ai.service';\r\n\r\n// Extended interface for processed items with computed properties\r\ninterface ProcessedDocumentHistoryItem {\r\n label: string;\r\n dateTime: string;\r\n requestDescription: string;\r\n userName: string;\r\n userRole: string;\r\n documentUrl?: string;\r\n docName?: string;\r\n actionIcon: string;\r\n actionColor: string;\r\n actionBgColor: string;\r\n actionBorderColor: string;\r\n actionIconBgColor: string;\r\n}\r\n\r\ninterface ProcessedDocumentHistorySection extends DocumentHistorySection {\r\n list: ProcessedDocumentHistoryItem[];\r\n accordionClass?: string;\r\n hasValidContent?: boolean;\r\n}\r\n\r\n/**\r\n * Component for displaying document history in a timeline format.\r\n */\r\n@Component({\r\n selector: 'document-history',\r\n standalone: false,\r\n templateUrl: './document-history.component.html',\r\n styleUrls: ['./document-history.component.scss']\r\n})\r\nexport class DocumentHistoryComponent implements OnChanges, OnInit, OnDestroy {\r\n /**\r\n * Input data for document history sections\r\n */\r\n @Input() historyData: DocumentHistorySection[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Whether to show the history component\r\n */\r\n @Input() showHistory: boolean = false;\r\n\r\n /**\r\n * The context ID for API calls\r\n */\r\n @Input() contextId?: string;\r\n\r\n /**\r\n * The selected document for actions\r\n */\r\n @Input() selectedDocument?: any;\r\n\r\n /**\r\n * When true, shows the AI entry point and sidebar.\r\n * Set false to hide document intelligence UI.\r\n */\r\n @Input() isDocumentIntelligence: boolean = true;\r\n isDocumentAiFeatureEnabled = false;\r\n\r\n /**\r\n * Event emitted when delete task is requested\r\n */\r\n @Output() deleteTaskRequested = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when a document from history is selected\r\n */\r\n @Output() documentSelected = new EventEmitter<HistoryDocument>();\r\n\r\n /**\r\n * Reference to the document actions component\r\n */\r\n documentActionsComponent?: any;\r\n\r\n /**\r\n * Active accordion index for controlling expand/collapse\r\n */\r\n activeAccordionIndex: number = 0;\r\n\r\n /**\r\n * Whether the accordion is expanded\r\n */\r\n isAccordionExpanded: boolean = true;\r\n\r\n /**\r\n * Whether the actions dropdown menu is visible\r\n */\r\n showActionsMenu: boolean = false;\r\n private destroy$ = new Subject<void>();\r\n\r\n /**\r\n * Combines local input control and remote feature flag control.\r\n * @returns {boolean} True when AI menu/sidebar should be visible.\r\n */\r\n get showDocumentAiUi(): boolean {\r\n return Boolean(this.isDocumentIntelligence && this.isDocumentAiFeatureEnabled);\r\n }\r\n\r\n constructor(\r\n private documentHistoryService: DocumentHistoryService,\r\n private documentViewerService: DocumentViewerService,\r\n private documentActionsService: DocumentActionsService,\r\n private confirmationService: ConfirmationService,\r\n private documentHttpService: DocumentHttpService,\r\n public documentHistoryAiService: DocumentHistoryAiService\r\n ) { }\r\n\r\n /**\r\n * Reads Configs and enables AI only when `docIntelligence.data.enabled` is true.\r\n */\r\n ngOnInit(): void {\r\n this.documentHttpService\r\n .getAppConfigs()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((configs: any[]) => {\r\n const docIntelligenceConfig = configs?.find((item) => item?.name === SHARED.DOCUMENT_CHATBOT);\r\n this.isDocumentAiFeatureEnabled = Boolean(docIntelligenceConfig?.data?.enabled);\r\n });\r\n }\r\n\r\n /**\r\n * Handles changes to input properties\r\n * @param {SimpleChanges} changes - Changed input values.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['historyData'] && this.historyData) {\r\n this.processHistoryData();\r\n }\r\n }\r\n\r\n /**\r\n * Handle accordion open event\r\n */\r\n onAccordionOpen(): void {\r\n this.isAccordionExpanded = true;\r\n this.activeAccordionIndex = 0;\r\n }\r\n\r\n /**\r\n * Handle accordion close event\r\n */\r\n onAccordionClose(): void {\r\n this.isAccordionExpanded = false;\r\n this.activeAccordionIndex = -1;\r\n }\r\n\r\n /**\r\n * Toggle accordion state\r\n */\r\n toggleAccordion(): void {\r\n if (this.isAccordionExpanded) {\r\n this.onAccordionClose();\r\n } else {\r\n this.onAccordionOpen();\r\n }\r\n }\r\n\r\n /**\r\n * Process history data to add computed properties\r\n * @returns {any[]} Processed history sections for rendering.\r\n */\r\n get processedHistoryData(): any[] {\r\n return this._processedHistoryData;\r\n }\r\n\r\n /**\r\n * Downloads a document when clicked\r\n * @param {string} documentUrl - The URL of the document to download.\r\n * @param {string} docName - The name of the document.\r\n */\r\n downloadDocument(documentUrl: string, docName?: string): void {\r\n this.documentHistoryService.downloadDocument(documentUrl, docName);\r\n }\r\n\r\n /**\r\n * Get alert count for the alerts section\r\n * @returns {number} Alert count value.\r\n */\r\n getAlertCount(): number {\r\n // This could be enhanced to get actual alert count from a service\r\n return 3; // Placeholder value matching the image\r\n }\r\n\r\n /**\r\n * Get CSS class for event card based on action type\r\n * @param {string} label - Event label text.\r\n * @returns {string} CSS class name for event card.\r\n */\r\n getEventCardClass(label: string): string {\r\n const lowerLabel = label.toLowerCase();\r\n if (lowerLabel.includes(SHARED.REQUESTED)) {\r\n return SHARED.EVENT_REQUESTED;\r\n } else if (lowerLabel.includes(SHARED.ACCEPTED) || lowerLabel.includes(SHARED.UPLOADED)) {\r\n return SHARED.EVENT_ACCEPTED;\r\n } else if (lowerLabel.includes(SHARED.REJECTED)) {\r\n return SHARED.EVENT_REJECTED;\r\n }\r\n return SHARED.EVENT_DEFAULT;\r\n }\r\n\r\n /**\r\n * Get CSS class for event icon based on action type\r\n * @param {string} label - Event label text.\r\n * @returns {string} CSS class name for event icon.\r\n */\r\n getEventIconClass(label: string): string {\r\n const lowerLabel = label.toLowerCase();\r\n if (lowerLabel.includes(SHARED.REQUESTED)) {\r\n return SHARED.ICON_REQUESTED;\r\n } else if (lowerLabel.includes(SHARED.ACCEPTED) || lowerLabel.includes(SHARED.UPLOADED)) {\r\n return SHARED.ICON_ACCEPTED;\r\n } else if (lowerLabel.includes(SHARED.REJECTED)) {\r\n return SHARED.ICON_REJECTED;\r\n }\r\n return SHARED.ICON_DEFAULT;\r\n }\r\n\r\n /**\r\n * Get the appropriate icon for the event\r\n * @param {string} label - The event label.\r\n * @returns {string} The icon class\r\n */\r\n getEventIcon(label: string): string {\r\n const lowerLabel = label.toLowerCase();\r\n if (lowerLabel.includes(SHARED.UPLOADED)) {\r\n return SHARED.ICON_CHECK_CIRCLE;\r\n } else if (lowerLabel.includes(SHARED.REQUESTED)) {\r\n return SHARED.ICON_FOLDER_PLUS;\r\n } else if (lowerLabel.includes(SHARED.ACCEPTED) || lowerLabel.includes(SHARED.APPROVED)) {\r\n return SHARED.ICON_CHECK_CIRCLE;\r\n } else if (lowerLabel.includes(SHARED.REJECTED)) {\r\n return SHARED.ICON_TIMES;\r\n }\r\n return SHARED.ICON_FILE;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Toggle the actions dropdown menu\r\n */\r\n toggleActionsMenu(): void {\r\n this.showActionsMenu = !this.showActionsMenu;\r\n }\r\n\r\n /**\r\n * Close the actions dropdown menu\r\n */\r\n closeActionsMenu(): void {\r\n this.showActionsMenu = false;\r\n }\r\n\r\n /**\r\n * Open AI sidebar with selected section.\r\n * @param {'Query'} section - AI section (Query only).\r\n */\r\n openAiPanel(section: 'Query'): void {\r\n if (!this.showDocumentAiUi) return;\r\n this.documentHistoryAiService.openAiPanel(section, this.selectedDocument);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handle delete task action\r\n */\r\n onDeleteTask(): void {\r\n this.closeActionsMenu();\r\n if (this.selectedDocument && this.contextId) {\r\n const documentName = this.selectedDocument?.docName || 'this document';\r\n const documentId = this.selectedDocument?._id;\r\n const documentTypeName = this.selectedDocument?.documentTypeName?.toLowerCase() || '';\r\n // Check if the document is a valuation report\r\n const isValuationReport = documentTypeName.includes(SHARED.VALUATION_REPORT);\r\n if (isValuationReport && documentId) { // First check if valuation report data exists in the database\r\n this.documentHttpService.getValuationReportByContextId(this.contextId).subscribe({\r\n next: this.handleValuationReportCheckSuccess(documentId, documentName).bind(this),\r\n error: this.handleValuationReportCheckError(documentName).bind(this)\r\n });\r\n } else { this.showStandardDeleteConfirmation(documentName); // Show standard delete confirmation for other document types\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Shows standard delete confirmation dialog\r\n * @param {string} documentName - Document display name for confirmation message.\r\n * @private\r\n */\r\n private showStandardDeleteConfirmation(documentName: string): void {\r\n ConfirmationDialogComponent.confirmDelete(\r\n this.confirmationService,\r\n documentName,\r\n () => {\r\n this.performDelete();\r\n },\r\n () => {}\r\n );\r\n }\r\n\r\n /**\r\n * Handles valuation report lookup success before delete confirmation.\r\n * @param {string} documentId - Selected document id.\r\n * @param {string} documentName - Document display name.\r\n * @returns {(valuationReportData: any) => void} Callback for valuation report response.\r\n */\r\n private handleValuationReportCheckSuccess(documentId: string, documentName: string): (valuationReportData: any) => void {\r\n return (valuationReportData: any): void => {\r\n const hasValuationReportData = valuationReportData && Object.keys(valuationReportData).length > 0;\r\n const documentIdMatches = valuationReportData?.documentId === documentId;\r\n if (hasValuationReportData && documentIdMatches) {\r\n ConfirmationDialogComponent.confirm(\r\n this.confirmationService,\r\n {\r\n message: SHARED.VALUATION_REPORT_DELETE_MESSAGE,\r\n header: SHARED.DELETE_CONFIRMATION_HEADER,\r\n acceptLabel: SHARED.DELETE,\r\n rejectLabel: SHARED.CANCEL,\r\n acceptButtonClass: SHARED.DELETE_BUTTON_STYLE_CLASS\r\n },\r\n this.handleConfirmDelete.bind(this),\r\n this.handleCancelDelete.bind(this) );\r\n return;\r\n }\r\n this.showStandardDeleteConfirmation(documentName); };\r\n }\r\n\r\n /**\r\n * Handles valuation report lookup error before delete confirmation.\r\n * @param {string} documentName - Document display name.\r\n * @returns {(error: any) => void} Error callback.\r\n */\r\n private handleValuationReportCheckError(documentName: string): (error: any) => void {\r\n return (): void => {\r\n this.showStandardDeleteConfirmation(documentName);\r\n };\r\n }\r\n\r\n /**\r\n * Handles confirm action for delete dialog.\r\n */\r\n private handleConfirmDelete(): void {\r\n this.performDelete();\r\n }\r\n\r\n /**\r\n * Handles cancel action for delete dialog.\r\n */\r\n private handleCancelDelete(): void {}\r\n\r\n /**\r\n * Performs the actual delete operation\r\n * @private\r\n */\r\n private performDelete(): void {\r\n // Ensure the viewer service has the latest selected document (with _id from history)\r\n try {\r\n (this.documentViewerService as any).updateSelectedDocument?.(this.selectedDocument, true);\r\n } catch {}\r\n const deleteAction = this.documentActionsService.createDeleteAction();\r\n this.documentViewerService.handleDocumentAction(deleteAction, this.contextId);\r\n this.deleteTaskRequested.emit();\r\n }\r\n\r\n /**\r\n * Set reference to document actions component\r\n * @param {any} component - Document actions component reference.\r\n */\r\n setDocumentActionsComponent(component: any): void {\r\n this.documentActionsComponent = component;\r\n }\r\n\r\n /**\r\n * Handles document selection from history\r\n * @param {HistoryDocument} document - The selected document from history.\r\n */\r\n onDocumentClick(document: HistoryDocument): void {\r\n if (document && document.documentUrl && document.docName) {\r\n this.documentSelected.emit(document);\r\n }\r\n }\r\n\r\n /**\r\n * Processed history data with document lists\r\n */\r\n private _processedHistoryData: any[] = [];\r\n\r\n /**\r\n * Processes history data to include document lists for each item\r\n */\r\n private processHistoryData(): void {\r\n this._processedHistoryData = this.historyData.map(section => ({\r\n ...section,\r\n list: section.list.map(item => ({\r\n ...item,\r\n documentList: this.getValidDocuments(item),\r\n eventCardClass: this.getEventCardClass(item.label),\r\n eventIconClass: this.getEventIconClass(item.label),\r\n eventIcon: this.getEventIcon(item.label),\r\n shouldHide: this.shouldHideItem(item)\r\n }))\r\n }));\r\n }\r\n\r\n /**\r\n * Gets the list of valid documents for a history item\r\n * @param {any} item - The history item.\r\n * @returns {HistoryDocument[]} Array of valid documents.\r\n */\r\n private getValidDocuments(item: any): HistoryDocument[] {\r\n if (item.documents && Array.isArray(item.documents)) {\r\n return item.documents.filter((doc: HistoryDocument) =>\r\n doc && doc.docName && doc.documentUrl && doc.contentType\r\n );\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Determines if a timeline item should be hidden\r\n * @param {any} item - The history item.\r\n * @returns {boolean} True if the item should be hidden.\r\n */\r\n private shouldHideItem(item: any): boolean {\r\n return this.selectedDocument?.isUploaded &&\r\n item.label.toLowerCase().includes(SHARED.REQUESTED);\r\n }\r\n\r\n /**\r\n * Sends a query to AI chat API and appends response in chat format.\r\n */\r\n sendQuery(): void {\r\n this.documentHistoryAiService.sendQuery(this.selectedDocument);\r\n }\r\n\r\n /**\r\n * Sends query when user presses Enter (without Shift).\r\n * @param {KeyboardEvent} event - Keyboard event from textarea.\r\n */\r\n onQueryEnter(event: KeyboardEvent): void {\r\n this.documentHistoryAiService.onQueryEnter(event, this.selectedDocument);\r\n }\r\n\r\n /**\r\n * Listen for clicks outside the dropdown to close it\r\n * @param {Event} event - Click event from document.\r\n */\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClickOutside(event: Event): void {\r\n const target = event.target as HTMLElement;\r\n\r\n if (this.showActionsMenu) {\r\n const actionsMenu = target.closest('.actions-menu');\r\n if (!actionsMenu) {\r\n this.closeActionsMenu();\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Cleans up subscriptions.\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n} ","<div class=\"document-review-container\">\r\n <!-- Header Section -->\r\n <div class=\"review-header\">\r\n <div class=\"review-title-section\">\r\n <h2 class=\"review-title\">Document Review</h2>\r\n <!-- <div class=\"ai-menu\" *ngIf=\"showDocumentAiUi\">\r\n <button class=\"ai-btn\" type=\"button\" (click)=\"openAiPanel('Query')\" [class.active]=\"documentHistoryAiService.state.showAiSidebar\">\r\n <i class=\"pi pi-sparkles\"></i>\r\n <span>AI</span>\r\n </button>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"actions-menu\" *ngIf=\"selectedDocument?.isUploaded || selectedDocument?.status == 'Approved'\"> -->\r\n <!-- <div class=\"actions-menu\" *ngIf=\"(selectedDocument?.isUploaded || selectedDocument?.status == 'Approved') && !selectedDocument?.isSystemDocument\"> -->\r\n <div class=\"actions-menu\" *ngIf=\"(selectedDocument?.status !== 'Approved') && (!selectedDocument?.isSystemDocument)\">\r\n <button class=\"actions-btn\" (click)=\"toggleActionsMenu()\" [class.active]=\"showActionsMenu\">\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\" (click)=\"$event.stopPropagation()\">\r\n <!-- <div class=\"dropdown-item\" *ngIf=\"selectedDocument?.status == 'Approved' || selectedDocument?.isUploaded || selectedDocument?.status == 'Uploaded'\">\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </div> -->\r\n <div *ngIf=\"selectedDocument?.status == 'Uploaded' || selectedDocument?.status === 'Rejected' || selectedDocument?.status === 'Reviewing' || selectedDocument?.status === 'Pending'\" [permission]=\"'documents-deleteDocumentByDocumentId'\" class=\"dropdown-item\" (click)=\"onDeleteTask()\">\r\n <span>Delete Document</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Document Actions Component - Below Header -->\r\n <div class=\"document-actions-section\">\r\n <ng-content select=\"[actions-component]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Alerts Section -->\r\n <!-- <div class=\"alerts-section\">\r\n <div class=\"alert-card\">\r\n <div class=\"alert-header\">\r\n <i class=\"pi pi-exclamation-triangle alert-icon\"></i>\r\n <span class=\"alert-text\">Alerts</span>\r\n <div class=\"alert-badge\">\r\n <span class=\"alert-count\">{{ getAlertCount() }}</span>\r\n <i class=\"pi pi-chevron-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Timeline Section -->\r\n <div class=\"timeline-section\" *ngIf=\"showHistory && historyData.length > 0\">\r\n <h3 class=\"timeline-title\">Timeline</h3>\r\n <div class=\"timeline-container\">\r\n <div class=\"timeline-item\" *ngFor=\"let section of processedHistoryData\">\r\n <ng-container *ngFor=\"let item of section.list; let i = index\">\r\n <div class=\"timeline-event mb-2\" *ngIf=\"!item.shouldHide\">\r\n <div class=\"event-card\" [ngClass]=\"item.eventCardClass\">\r\n <!-- Event Header -->\r\n <div class=\"event-header\">\r\n <div class=\"event-info\">\r\n <i [class]=\"item.eventIcon\"></i>\r\n <span class=\"event-label\">{{ item.label }}</span>\r\n </div>\r\n <div class=\"event-timestamp\">{{ item.dateTime }}</div>\r\n </div>\r\n <!-- User Information -->\r\n <div class=\"event-user mb-2\">\r\n <span class=\"user-name\">{{ item.userName }}</span>\r\n <span class=\"user-role\">({{ item.userRole }})</span>\r\n </div>\r\n <!-- Event Description -->\r\n <div class=\"event-description\" *ngIf=\"item.requestDescription\">\r\n <ul class=\"event-description-list\" *ngIf=\"item.label.toLowerCase().includes('requested')\">\r\n <li class=\"event-description-item\">{{ item.requestDescription }}</li>\r\n </ul>\r\n <p *ngIf=\"!item.label.toLowerCase().includes('requested')\">{{ item.requestDescription }}</p>\r\n </div>\r\n\r\n <!-- Document Upload Cards -->\r\n <!-- Commented out child document list panel functionality -->\r\n <!-- <div class=\"document-uploads\" *ngIf=\"item.documentList && item.documentList.length > 0\">\r\n <div class=\"uploaded-documents\">\r\n <div class=\"document-card\" *ngFor=\"let doc of item.documentList\" (click)=\"onDocumentClick(doc)\">\r\n <div class=\"document-icon\">\r\n <i class=\"pi pi-file\"></i>\r\n </div>\r\n <span class=\"document-name\">{{ doc.docName }}</span>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <ng-content [select]=\"'actions-component'\"></ng-content> -->\r\n</div>\r\n\r\n<p-sidebar *ngIf=\"showDocumentAiUi\" [(visible)]=\"documentHistoryAiService.state.showAiSidebar\" position=\"right\"\r\n [style]=\"{ width: '420px' }\" styleClass=\"ai-chat-sidebar\" [dismissible]=\"true\" [showCloseIcon]=\"false\"\r\n [showHeader]=\"false\" [appendTo]=\"'body'\">\r\n\r\n <div class=\"ai-sidebar-content\">\r\n <document-ai-chat [selectedDocument]=\"selectedDocument\"></document-ai-chat>\r\n </div>\r\n</p-sidebar>","import { Injectable } from '@angular/core';\r\nimport * as XLSX from 'xlsx';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n/**\r\n * Interface for Excel cell styling information\r\n */\r\nexport interface ExcelCellStyle {\r\n backgroundColor?: string;\r\n fontColor?: string;\r\n bold?: boolean;\r\n italic?: boolean;\r\n border?: {\r\n top?: string;\r\n bottom?: string;\r\n left?: string;\r\n right?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Interface for Excel cell data with styling\r\n */\r\nexport interface ExcelCellData {\r\n value: any;\r\n style?: ExcelCellStyle;\r\n}\r\n\r\n/**\r\n * Interface for Excel row data\r\n */\r\nexport interface ExcelRowData {\r\n cells: ExcelCellData[];\r\n}\r\n\r\n/**\r\n * Interface for parsed Excel data\r\n */\r\nexport interface ParsedExcelData {\r\n sheets: string[];\r\n currentSheet: string;\r\n styledData: ExcelRowData[];\r\n tableData: any[][];\r\n hasStyling: boolean;\r\n workbook: XLSX.WorkBook;\r\n}\r\n\r\n/**\r\n * Service for parsing Excel files and extracting styling information\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExcelParserService {\r\n\r\n private workbookColors: { [key: number]: string } = {};\r\n\r\n /**\r\n * Parses Excel data from ArrayBuffer\r\n */\r\n parseExcelData(data: ArrayBuffer): ParsedExcelData | null {\r\n try {\r\n const workbook = this.createWorkbook(data);\r\n \r\n // Extract color palette from workbook\r\n this.extractWorkbookColors(workbook);\r\n \r\n const sheets = this.getSheetNames(workbook);\r\n const currentSheet = this.getFirstSheet(sheets);\r\n const styledData = this.parseSheetData(workbook, currentSheet);\r\n const tableData = this.convertToLegacyFormat(styledData);\r\n const hasStyling = this.hasWorkbookStyling(workbook);\r\n\r\n return {\r\n sheets,\r\n currentSheet,\r\n styledData,\r\n tableData,\r\n hasStyling,\r\n workbook\r\n };\r\n } catch (error) {\r\n console.error('Error parsing Excel data:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates workbook from ArrayBuffer\r\n */\r\n private createWorkbook(data: ArrayBuffer): XLSX.WorkBook {\r\n return XLSX.read(data, {\r\n type: 'array',\r\n cellStyles: true,\r\n cellDates: true,\r\n cellNF: false,\r\n cellHTML: false\r\n });\r\n }\r\n\r\n /**\r\n * Gets sheet names from workbook\r\n */\r\n private getSheetNames(workbook: XLSX.WorkBook): string[] {\r\n return workbook.SheetNames;\r\n }\r\n\r\n /**\r\n * Gets the first sheet name\r\n */\r\n private getFirstSheet(sheets: string[]): string {\r\n return sheets[0] || 'Sheet1';\r\n }\r\n\r\n /**\r\n * Parses sheet data with styling\r\n */\r\n parseSheetData(workbook: XLSX.WorkBook, sheetName: string): ExcelRowData[] {\r\n try {\r\n const worksheet = this.getWorksheet(workbook, sheetName);\r\n if (!worksheet) {\r\n return this.createNoDataRow();\r\n }\r\n\r\n const range = this.getWorksheetRange(worksheet);\r\n return this.processWorksheetRows(worksheet, range);\r\n } catch (error) {\r\n console.error('Error parsing sheet data:', error);\r\n return this.createErrorRow();\r\n }\r\n }\r\n\r\n /**\r\n * Gets worksheet from workbook\r\n */\r\n private getWorksheet(workbook: XLSX.WorkBook, sheetName: string): XLSX.WorkSheet | null {\r\n return workbook.Sheets[sheetName] || null;\r\n }\r\n\r\n /**\r\n * Gets worksheet range\r\n */\r\n private getWorksheetRange(worksheet: XLSX.WorkSheet): XLSX.Range {\r\n return XLSX.utils.decode_range(worksheet['!ref'] || 'A1');\r\n }\r\n\r\n /**\r\n * Processes worksheet rows\r\n */\r\n private processWorksheetRows(worksheet: XLSX.WorkSheet, range: XLSX.Range): ExcelRowData[] {\r\n const styledData: ExcelRowData[] = [];\r\n\r\n for (let row = range.s.r; row <= range.e.r; row++) {\r\n const rowData = this.processRow(worksheet, range, row);\r\n if (this.hasRowContent(rowData)) {\r\n styledData.push(rowData);\r\n }\r\n }\r\n\r\n return styledData;\r\n }\r\n\r\n /**\r\n * Processes a single row\r\n */\r\n private processRow(worksheet: XLSX.WorkSheet, range: XLSX.Range, rowIndex: number): ExcelRowData {\r\n const rowData: ExcelRowData = { cells: [] };\r\n\r\n for (let col = range.s.c; col <= range.e.c; col++) {\r\n const cell = this.getCell(worksheet, rowIndex, col);\r\n const cellData = this.createCellData(cell);\r\n rowData.cells.push(cellData);\r\n }\r\n\r\n return rowData;\r\n }\r\n\r\n /**\r\n * Gets cell from worksheet\r\n */\r\n private getCell(worksheet: XLSX.WorkSheet, row: number, col: number): XLSX.CellObject | null {\r\n const cellAddress = XLSX.utils.encode_cell({ r: row, c: col });\r\n return worksheet[cellAddress] || null;\r\n }\r\n\r\n /**\r\n * Creates cell data with styling\r\n */\r\n private createCellData(cell: XLSX.CellObject | null): ExcelCellData {\r\n if (!cell) {\r\n return { value: SHARED.EMPTY };\r\n }\r\n\r\n return {\r\n value: cell.v || SHARED.EMPTY,\r\n style: this.extractCellStyle(cell)\r\n };\r\n }\r\n\r\n /**\r\n * Checks if row has content\r\n */\r\n private hasRowContent(rowData: ExcelRowData): boolean {\r\n return rowData.cells.some(cell => cell.value !== SHARED.EMPTY);\r\n }\r\n\r\n /**\r\n * Creates no data row\r\n */\r\n private createNoDataRow(): ExcelRowData[] {\r\n return [{ cells: [{ value: SHARED.NO_DATA_FOUND }] }];\r\n }\r\n\r\n /**\r\n * Creates error row\r\n */\r\n private createErrorRow(): ExcelRowData[] {\r\n return [{ cells: [{ value: SHARED.ERROR_PARSING_SHEET_DATA }] }];\r\n }\r\n\r\n /**\r\n * Extracts styling from cell\r\n */\r\n extractCellStyle(cell: XLSX.CellObject): ExcelCellStyle | undefined {\r\n if (!cell.s) return undefined;\r\n\r\n const style: ExcelCellStyle = {};\r\n \r\n this.extractBackgroundColor(cell.s, style);\r\n this.extractFontColor(cell.s, style);\r\n this.extractFontFormatting(cell.s, style);\r\n this.extractBorders(cell.s, style);\r\n\r\n return Object.keys(style).length > 0 ? style : undefined;\r\n }\r\n\r\n /**\r\n * Extracts background color\r\n */\r\n private extractBackgroundColor(cellStyle: any, style: ExcelCellStyle): void {\r\n if (cellStyle.fgColor) {\r\n console.log('Found fgColor:', cellStyle.fgColor);\r\n style.backgroundColor = this.getColorValue(cellStyle.fgColor);\r\n if (style.backgroundColor) {\r\n console.log('Extracted background color from fgColor:', style.backgroundColor);\r\n }\r\n }\r\n\r\n if (!style.backgroundColor && cellStyle.bgColor) {\r\n console.log('Found bgColor:', cellStyle.bgColor);\r\n style.backgroundColor = this.getColorValue(cellStyle.bgColor);\r\n if (style.backgroundColor) {\r\n console.log('Extracted background color from bgColor:', style.backgroundColor);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Extracts font color\r\n */\r\n private extractFontColor(cellStyle: any, style: ExcelCellStyle): void {\r\n if (cellStyle.font?.color) {\r\n console.log('Found font color:', cellStyle.font.color);\r\n style.fontColor = this.getColorValue(cellStyle.font.color);\r\n if (style.fontColor) {\r\n console.log('Extracted font color:', style.fontColor);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Extracts font formatting\r\n */\r\n private extractFontFormatting(cellStyle: any, style: ExcelCellStyle): void {\r\n if (cellStyle.font?.bold) {\r\n style.bold = true;\r\n }\r\n if (cellStyle.font?.italic) {\r\n style.italic = true;\r\n }\r\n }\r\n\r\n /**\r\n * Extracts borders\r\n */\r\n private extractBorders(cellStyle: any, style: ExcelCellStyle): void {\r\n if (!cellStyle.border) return;\r\n\r\n style.border = {};\r\n const borders = ['top', 'bottom', 'left', 'right'] as const;\r\n \r\n borders.forEach(side => {\r\n const border = cellStyle.border[side];\r\n if (border?.color) {\r\n style.border![side] = this.getColorValue(border.color);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets color value from color object\r\n */\r\n private getColorValue(colorObj: any): string | undefined {\r\n \r\n if (colorObj.rgb) {\r\n const result = this.rgbToHex(colorObj.rgb);\r\n return result;\r\n }\r\n if (colorObj.theme !== undefined) {\r\n const result = this.extractThemeColor(colorObj.theme);\r\n return result;\r\n }\r\n if (colorObj.indexed !== undefined) {\r\n const result = this.extractIndexedColor(colorObj.indexed);\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Converts RGB to hex\r\n */\r\n private rgbToHex(rgb: string): string {\r\n if (!rgb) return SHARED.EMPTY;\r\n\r\n if (rgb.length === 8) {\r\n // Excel RGB format: AARRGGBB (Alpha, Red, Green, Blue)\r\n const red = parseInt(rgb.substring(2, 4), 16);\r\n const green = parseInt(rgb.substring(4, 6), 16);\r\n const blue = parseInt(rgb.substring(6, 8), 16);\r\n return `#${red.toString(16).padStart(2, '0')}${green.toString(16).padStart(2, '0')}${blue.toString(16).padStart(2, '0')}`;\r\n } else if (rgb.length === 6) {\r\n // Standard hex format: RRGGBB\r\n return `#${rgb}`;\r\n }\r\n\r\n return SHARED.EMPTY;\r\n }\r\n\r\n /**\r\n * Extracts theme color dynamically from Excel\r\n */\r\n private extractThemeColor(theme: number): string {\r\n const baseThemeColors: { [key: number]: string } = {\r\n 0: '#000000', // Black\r\n 1: '#FFFFFF', // White\r\n 2: '#FF0000', // Red\r\n 3: '#00FF00', // Green\r\n 4: '#0000FF', // Blue\r\n 5: '#FFFF00', // Yellow\r\n 6: '#FF00FF', // Magenta\r\n 7: '#00FFFF', // Cyan\r\n };\r\n \r\n return baseThemeColors[theme] || this.generateThemeColor(theme);\r\n }\r\n\r\n /**\r\n * Generates a theme color based on index (fallback)\r\n */\r\n private generateThemeColor(theme: number): string {\r\n // Generate a color based on the theme index\r\n // This is a fallback when we don't have the actual theme colors\r\n const hue = (theme * 137.508) % 360; // Golden angle approximation\r\n return `hsl(${hue}, 70%, 50%)`;\r\n }\r\n\r\n /**\r\n * Extracts indexed color dynamically from Excel\r\n */\r\n private extractIndexedColor(indexed: number): string {\r\n // Instead of hardcoded colors, we'll try to extract the actual color\r\n // from the Excel file's color palette\r\n if (this.workbookColors && this.workbookColors[indexed]) {\r\n return this.rgbToHex(this.workbookColors[indexed]);\r\n }\r\n \r\n // Fallback to a generated color if we don't have the palette\r\n return this.generateIndexedColor(indexed);\r\n }\r\n\r\n /**\r\n * Generates an indexed color based on index (fallback)\r\n */\r\n private generateIndexedColor(indexed: number): string {\r\n // Generate a color based on the indexed number\r\n // This ensures we always have a unique color for each index\r\n const hue = (indexed * 25) % 360;\r\n const saturation = 60 + (indexed % 20);\r\n const lightness = 40 + (indexed % 30);\r\n return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\r\n }\r\n\r\n /**\r\n * Extracts color palette from Excel workbook\r\n */\r\n private extractWorkbookColors(workbook: XLSX.WorkBook): void {\r\n this.workbookColors = {};\r\n \r\n // Try to extract colors from the workbook's color palette\r\n const workbookProps = workbook.Workbook as any;\r\n if (workbookProps && workbookProps.Colors) {\r\n const colors = workbookProps.Colors;\r\n if (colors.IndexedColors) {\r\n colors.IndexedColors.forEach((color: any, index: number) => {\r\n if (color.rgb) {\r\n this.workbookColors[index] = color.rgb;\r\n }\r\n });\r\n }\r\n }\r\n \r\n // Also try to extract from theme\r\n if (workbookProps && workbookProps.Theme) {\r\n const theme = workbookProps.Theme;\r\n if (theme.ThemeElements && theme.ThemeElements.ClrScheme) {\r\n const clrScheme = theme.ThemeElements.ClrScheme;\r\n // Extract theme colors if available\r\n Object.keys(clrScheme).forEach((key, index) => {\r\n const color = clrScheme[key];\r\n if (color && color.SrgbClr) {\r\n this.workbookColors[index] = color.SrgbClr.val;\r\n }\r\n });\r\n }\r\n }\r\n \r\n console.log('Extracted workbook colors:', this.workbookColors);\r\n }\r\n\r\n /**\r\n * Checks if workbook has styling\r\n */\r\n hasWorkbookStyling(workbook: XLSX.WorkBook): boolean {\r\n for (const sheetName of workbook.SheetNames) {\r\n const worksheet = workbook.Sheets[sheetName];\r\n if (worksheet && this.hasWorksheetStyling(worksheet)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if worksheet has styling\r\n */\r\n private hasWorksheetStyling(worksheet: XLSX.WorkSheet): boolean {\r\n for (const cellAddress in worksheet) {\r\n if (cellAddress.startsWith('!')) continue;\r\n const cell = worksheet[cellAddress];\r\n if (cell?.s) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Converts styled data to legacy format\r\n */\r\n convertToLegacyFormat(styledData: ExcelRowData[]): any[][] {\r\n return styledData.map(row => row.cells.map(cell => cell.value));\r\n }\r\n\r\n /**\r\n * Ensures data consistency\r\n */\r\n ensureDataConsistency(styledData: ExcelRowData[]): ExcelRowData[] {\r\n if (styledData.length === 0) {\r\n return [{ cells: [{ value: 'No data found' }] }];\r\n }\r\n\r\n const maxColumns = Math.max(...styledData.map(row => row.cells.length));\r\n const minColumns = Math.max(maxColumns, 3);\r\n\r\n return styledData.map(row => {\r\n const normalizedRow: ExcelRowData = { cells: [...row.cells] };\r\n while (normalizedRow.cells.length < minColumns) {\r\n normalizedRow.cells.push({ value: SHARED.EMPTY });\r\n }\r\n return normalizedRow;\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface CsvRowData {\r\n cells: Array<{\r\n value: string;\r\n isHeader?: boolean;\r\n style?: any;\r\n }>;\r\n}\r\n\r\nexport interface ParsedCsvData {\r\n headers: string[];\r\n rows: string[][];\r\n styledData: CsvRowData[];\r\n totalRows: number;\r\n totalColumns: number;\r\n hasHeaders: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CsvParserService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Parses CSV data from a string\r\n * @param csvContent - The CSV content as a string\r\n * @param options - Parsing options\r\n * @returns Parsed CSV data\r\n */\r\n parseCsvData(csvContent: string, options: {\r\n delimiter?: string;\r\n hasHeaders?: boolean;\r\n maxRows?: number;\r\n } = {}): ParsedCsvData {\r\n const {\r\n delimiter = ',',\r\n hasHeaders = true,\r\n maxRows = 1000\r\n } = options;\r\n\r\n try {\r\n // Split content into lines and filter out empty lines\r\n const lines = csvContent\r\n .split('\\n')\r\n .map(line => line.trim())\r\n .filter(line => line.length > 0);\r\n\r\n if (lines.length === 0) {\r\n return this.createEmptyCsvData();\r\n }\r\n\r\n // Parse each line\r\n const parsedRows: string[][] = [];\r\n let headers: string[] = [];\r\n\r\n lines.forEach((line, index) => {\r\n if (index >= maxRows) return;\r\n\r\n const row = this.parseCsvLine(line, delimiter);\r\n if (row.length > 0) {\r\n parsedRows.push(row);\r\n }\r\n });\r\n\r\n // Extract headers if specified\r\n if (hasHeaders && parsedRows.length > 0) {\r\n headers = parsedRows[0];\r\n parsedRows.splice(0, 1); // Remove header row from data\r\n } else if (parsedRows.length > 0) {\r\n // Generate default headers if none provided\r\n headers = parsedRows[0].map((_, index) => `Column ${index + 1}`);\r\n }\r\n\r\n // Create styled data for display\r\n const styledData = this.createStyledData(headers, parsedRows, hasHeaders);\r\n\r\n return {\r\n headers,\r\n rows: parsedRows,\r\n styledData,\r\n totalRows: parsedRows.length,\r\n totalColumns: headers.length,\r\n hasHeaders\r\n };\r\n\r\n } catch (error) {\r\n console.error('Error parsing CSV data:', error);\r\n return this.createEmptyCsvData();\r\n }\r\n }\r\n\r\n /**\r\n * Parses a single CSV line with proper handling of quoted fields\r\n * @param line - Single CSV line\r\n * @param delimiter - Field delimiter\r\n * @returns Array of field values\r\n */\r\n private parseCsvLine(line: string, delimiter: string): string[] {\r\n const result: string[] = [];\r\n let current = '';\r\n let inQuotes = false;\r\n let i = 0;\r\n\r\n while (i < line.length) {\r\n const char = line[i];\r\n\r\n if (char === '\"') {\r\n if (inQuotes && line[i + 1] === '\"') {\r\n // Escaped quote\r\n current += '\"';\r\n i += 2;\r\n } else {\r\n // Toggle quote state\r\n inQuotes = !inQuotes;\r\n i++;\r\n }\r\n } else if (char === delimiter && !inQuotes) {\r\n // End of field\r\n result.push(current.trim());\r\n current = '';\r\n i++;\r\n } else {\r\n current += char;\r\n i++;\r\n }\r\n }\r\n\r\n // Add the last field\r\n result.push(current.trim());\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates styled data for display in tables\r\n * @param headers - Column headers\r\n * @param rows - Data rows\r\n * @param hasHeaders - Whether the data has headers\r\n * @returns Styled data array\r\n */\r\n private createStyledData(headers: string[], rows: string[][], hasHeaders: boolean): CsvRowData[] {\r\n const styledData: CsvRowData[] = [];\r\n\r\n // Add header row if headers exist\r\n if (hasHeaders && headers.length > 0) {\r\n styledData.push({\r\n cells: headers.map(header => ({\r\n value: header,\r\n isHeader: true,\r\n style: { fontWeight: 'bold', backgroundColor: '#f8f9fa' }\r\n }))\r\n });\r\n }\r\n\r\n // Add data rows\r\n rows.forEach(row => {\r\n styledData.push({\r\n cells: row.map((cell, index) => ({\r\n value: cell || '',\r\n isHeader: false,\r\n style: {}\r\n }))\r\n });\r\n });\r\n\r\n return styledData;\r\n }\r\n\r\n /**\r\n * Creates empty CSV data structure\r\n * @returns Empty CSV data\r\n */\r\n private createEmptyCsvData(): ParsedCsvData {\r\n return {\r\n headers: [],\r\n rows: [],\r\n styledData: [],\r\n totalRows: 0,\r\n totalColumns: 0,\r\n hasHeaders: false\r\n };\r\n }\r\n\r\n /**\r\n * Validates CSV content\r\n * @param csvContent - CSV content to validate\r\n * @returns Validation result\r\n */\r\n validateCsvContent(csvContent: string): { isValid: boolean; errors: string[] } {\r\n const errors: string[] = [];\r\n\r\n if (!csvContent || csvContent.trim().length === 0) {\r\n errors.push('CSV content is empty');\r\n return { isValid: false, errors };\r\n }\r\n\r\n const lines = csvContent.split('\\n').filter(line => line.trim().length > 0);\r\n \r\n if (lines.length === 0) {\r\n errors.push('No valid lines found in CSV');\r\n return { isValid: false, errors };\r\n }\r\n\r\n // Check for consistent column count\r\n const columnCounts = lines.map(line => this.countColumns(line));\r\n const firstColumnCount = columnCounts[0];\r\n \r\n for (let i = 1; i < columnCounts.length; i++) {\r\n if (columnCounts[i] !== firstColumnCount) {\r\n errors.push(`Line ${i + 1} has ${columnCounts[i]} columns, expected ${firstColumnCount}`);\r\n }\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors\r\n };\r\n }\r\n\r\n /**\r\n * Counts columns in a CSV line\r\n * @param line - CSV line\r\n * @returns Number of columns\r\n */\r\n private countColumns(line: string): number {\r\n let count = 0;\r\n let inQuotes = false;\r\n let i = 0;\r\n\r\n while (i < line.length) {\r\n const char = line[i];\r\n\r\n if (char === '\"') {\r\n if (inQuotes && line[i + 1] === '\"') {\r\n i += 2;\r\n } else {\r\n inQuotes = !inQuotes;\r\n i++;\r\n }\r\n } else if (char === ',' && !inQuotes) {\r\n count++;\r\n i++;\r\n } else {\r\n i++;\r\n }\r\n }\r\n\r\n return count + 1; // +1 because we count delimiters, not fields\r\n }\r\n\r\n /**\r\n * Exports data to CSV format\r\n * @param data - Data to export\r\n * @param headers - Column headers\r\n * @param delimiter - Field delimiter\r\n * @returns CSV string\r\n */\r\n exportToCsv(data: string[][], headers: string[], delimiter: string = ','): string {\r\n const csvLines: string[] = [];\r\n\r\n // Add headers if provided\r\n if (headers && headers.length > 0) {\r\n csvLines.push(this.escapeCsvField(headers.join(delimiter)));\r\n }\r\n\r\n // Add data rows\r\n data.forEach(row => {\r\n const escapedRow = row.map(field => this.escapeCsvField(field));\r\n csvLines.push(escapedRow.join(delimiter));\r\n });\r\n\r\n return csvLines.join('\\n');\r\n }\r\n\r\n /**\r\n * Escapes a CSV field value\r\n * @param field - Field value to escape\r\n * @returns Escaped field value\r\n */\r\n private escapeCsvField(field: string): string {\r\n if (field.includes(',') || field.includes('\"') || field.includes('\\n') || field.includes('\\r')) {\r\n return `\"${field.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return field;\r\n }\r\n\r\n /**\r\n * Gets CSV preview (first few rows)\r\n * @param csvContent - Full CSV content\r\n * @param maxRows - Maximum number of rows to preview\r\n * @returns Preview data\r\n */\r\n getCsvPreview(csvContent: string, maxRows: number = 10): ParsedCsvData {\r\n const lines = csvContent.split('\\n').filter(line => line.trim().length > 0);\r\n const previewContent = lines.slice(0, maxRows + 1).join('\\n'); // +1 for header\r\n \r\n return this.parseCsvData(previewContent, { maxRows });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nexport interface ZoomConfig {\r\n defaultZoom: number;\r\n zoomStep: number;\r\n minZoom: number;\r\n maxZoom: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentZoomService {\r\n private readonly DEFAULT_CONFIG: ZoomConfig = {\r\n defaultZoom: 100,\r\n zoomStep: 25,\r\n minZoom: 25,\r\n maxZoom: 400\r\n };\r\n\r\n private zoomLevelSubject = new BehaviorSubject<number>(this.DEFAULT_CONFIG.defaultZoom);\r\n private config: ZoomConfig = { ...this.DEFAULT_CONFIG };\r\n\r\n /**\r\n * Gets the current zoom level as an observable\r\n */\r\n get zoomLevel$(): Observable<number> {\r\n return this.zoomLevelSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Gets the current zoom level value\r\n */\r\n get currentZoom(): number {\r\n return this.zoomLevelSubject.value;\r\n }\r\n\r\n /**\r\n * Gets the current zoom configuration\r\n */\r\n get zoomConfig(): ZoomConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Sets custom zoom configuration\r\n */\r\n setZoomConfig(config: Partial<ZoomConfig>): void {\r\n this.config = { ...this.DEFAULT_CONFIG, ...config };\r\n this.setZoom(this.config.defaultZoom);\r\n }\r\n\r\n /**\r\n * Zooms in by the configured step\r\n */\r\n zoomIn(): void {\r\n const newZoom = Math.min(\r\n this.currentZoom + this.config.zoomStep,\r\n this.config.maxZoom\r\n );\r\n this.setZoom(newZoom);\r\n }\r\n\r\n /**\r\n * Zooms out by the configured step\r\n */\r\n zoomOut(): void {\r\n const newZoom = Math.max(\r\n this.currentZoom - this.config.zoomStep,\r\n this.config.minZoom\r\n );\r\n this.setZoom(newZoom);\r\n }\r\n\r\n /**\r\n * Sets zoom to a specific level\r\n */\r\n setZoom(zoom: number): void {\r\n const clampedZoom = Math.max(\r\n this.config.minZoom,\r\n Math.min(zoom, this.config.maxZoom)\r\n );\r\n this.zoomLevelSubject.next(clampedZoom);\r\n }\r\n\r\n /**\r\n * Resets zoom to default level\r\n */\r\n resetZoom(): void {\r\n this.setZoom(this.config.defaultZoom);\r\n }\r\n\r\n /**\r\n * Handles mouse wheel zoom\r\n */\r\n handleWheelZoom(event: WheelEvent, zoomFactor: number = 0.1): void {\r\n event.preventDefault();\r\n // Only use deltaY for zoom (vertical wheel movement)\r\n const delta = event.deltaY > 0 ? -1 : 1;\r\n const zoomStep = this.config.zoomStep * zoomFactor;\r\n const newZoom = this.currentZoom + (delta * zoomStep);\r\n this.setZoom(newZoom);\r\n }\r\n\r\n /**\r\n * Applies zoom transform to an iframe element\r\n * @param iframe - The iframe element to apply zoom to\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoom(iframe: HTMLIFrameElement, zoomLevel?: number): void {\r\n const zoom = zoomLevel ?? this.currentZoom;\r\n const zoomScale = zoom / 100;\r\n\r\n if (zoom === 100) {\r\n iframe.style.transform = 'none';\r\n iframe.style.width = '100%';\r\n iframe.style.height = '100%';\r\n } else {\r\n iframe.style.transform = `scale(${zoomScale})`;\r\n iframe.style.transformOrigin = 'top left';\r\n iframe.style.width = `${100 / zoomScale}%`;\r\n iframe.style.height = `${100 / zoomScale}%`;\r\n }\r\n }\r\n\r\n /**\r\n * Applies zoom transform to multiple iframe elements\r\n * @param iframes - Array of iframe elements to apply zoom to\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomToMultiple(iframes: HTMLIFrameElement[], zoomLevel?: number): void {\r\n iframes.forEach(iframe => this.applyIframeZoom(iframe, zoomLevel));\r\n }\r\n\r\n /**\r\n * Applies zoom transform to iframes within a container element\r\n * @param container - The container element to search for iframes\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomToContainer(container: HTMLElement, zoomLevel?: number): void {\r\n const iframes = container.querySelectorAll('iframe') as NodeListOf<HTMLIFrameElement>;\r\n this.applyIframeZoomToMultiple(Array.from(iframes), zoomLevel);\r\n }\r\n\r\n /**\r\n * Applies zoom transform to iframes within multiple container elements\r\n * @param containers - Array of container elements to search for iframes\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomToContainers(containers: HTMLElement[], zoomLevel?: number): void {\r\n containers.forEach(container => this.applyIframeZoomToContainer(container, zoomLevel));\r\n }\r\n\r\n /**\r\n * Applies zoom transform to iframes by CSS selector\r\n * @param selector - CSS selector to find iframe containers\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomBySelector(selector: string, zoomLevel?: number): void {\r\n const containers = document.querySelectorAll(selector) as NodeListOf<HTMLElement>;\r\n this.applyIframeZoomToContainers(Array.from(containers), zoomLevel);\r\n }\r\n}\r\n","import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { DocumentZoomService } from '../../services/document-zoom.service';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\nimport { Subscription } from 'rxjs';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { ERRORS } from '../../../../Shared/constant/ERROR';\r\n\r\n@Component({\r\n selector: 'document-zoom-controls',\r\n templateUrl: './document-zoom-controls.component.html',\r\n styleUrls: ['./document-zoom-controls.component.scss'],\r\n standalone:false\r\n})\r\nexport class DocumentZoomControlsComponent implements OnInit, OnDestroy {\r\n @Input() selectedDocument?: DocumentListItem;\r\n @Input() contextId?: string = SHARED.EMPTY;\r\n @Input() isFormHide: boolean = false;\r\n @Output() documentNameUpdated = new EventEmitter<void>();\r\n\r\n currentZoom: number = 100;\r\n private subscription: Subscription = new Subscription();\r\n\r\n // Document name editing properties\r\n isEditingDocumentName: boolean = false;\r\n documentName: string = SHARED.EMPTY;\r\n fileNameError: string = SHARED.EMPTY;\r\n disallowedCharsRegex: RegExp = /[<>:\"\\/\\\\|?*]/;\r\n\r\n constructor(\r\n private zoomService: DocumentZoomService,\r\n private documentHttpService: DocumentHttpService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.subscription.add(\r\n this.zoomService.zoomLevel$.subscribe(zoom => {\r\n this.currentZoom = zoom;\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n get isZoomOutDisabled(): boolean {\r\n return this.currentZoom <= this.zoomService.zoomConfig.minZoom;\r\n }\r\n\r\n get isZoomInDisabled(): boolean {\r\n return this.currentZoom >= this.zoomService.zoomConfig.maxZoom;\r\n }\r\n\r\n zoomIn(): void {\r\n this.zoomService.zoomIn();\r\n }\r\n\r\n zoomOut(): void {\r\n this.zoomService.zoomOut();\r\n }\r\n\r\n resetZoom(): void {\r\n this.zoomService.resetZoom();\r\n }\r\n\r\n // Document name editing methods\r\n onDocumentNameClick(): void {\r\n // Only allow editing if the document alias is editable\r\n if (!this.selectedDocument?.isAliasEditable) {\r\n return;\r\n }\r\n \r\n this.isEditingDocumentName = true;\r\n if (this.selectedDocument?.aliasName && this.selectedDocument.aliasName.trim() !== SHARED.EMPTY) {\r\n this.documentName = this.selectedDocument.aliasName;\r\n } else if (this.selectedDocument?.docName) {\r\n const lastDotIndex = this.selectedDocument.docName.lastIndexOf('.');\r\n if (lastDotIndex !== -1) {\r\n this.documentName = this.selectedDocument.docName.substring(0, lastDotIndex);\r\n } else {\r\n this.documentName = this.selectedDocument.docName;\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n const inputElement = document.querySelector('.document-name-input') as HTMLInputElement;\r\n if (inputElement) {\r\n inputElement.focus();\r\n inputElement.select();\r\n }\r\n }, 100);\r\n }\r\n\r\n cancelDocumentNameEdit(): void {\r\n this.isEditingDocumentName = false;\r\n this.fileNameError = SHARED.EMPTY;\r\n }\r\n\r\n onDocumentNameChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.documentName = input.value;\r\n if (this.disallowedCharsRegex.test(this.documentName)) {\r\n this.fileNameError = ERRORS.ERROR_FILE_NAME_INVALID_CHARACTERS;\r\n } else if (this.documentName.trim() === SHARED.EMPTY) {\r\n this.fileNameError = ERRORS.ERROR_FILE_NAME_EMPTY;\r\n } else {\r\n this.fileNameError = SHARED.EMPTY;\r\n }\r\n }\r\n\r\n handleSaveClick(): void {\r\n if (!this.selectedDocument?._id) {\r\n return;\r\n }\r\n\r\n let hasChanged = false;\r\n if (this.selectedDocument.aliasName && this.selectedDocument.aliasName.trim() !== SHARED.EMPTY) {\r\n hasChanged = this.documentName !== this.selectedDocument.aliasName;\r\n } else if (this.selectedDocument.docName) {\r\n const docNameWithoutExtension = this.selectedDocument.docName.lastIndexOf(SHARED.DOT) !== -1 \r\n ? this.selectedDocument.docName.substring(0, this.selectedDocument.docName.lastIndexOf(SHARED.DOT))\r\n : this.selectedDocument.docName;\r\n hasChanged = this.documentName !== docNameWithoutExtension;\r\n }\r\n \r\n if (hasChanged && !this.fileNameError) {\r\n const payload = { aliasName: this.documentName };\r\n this.documentHttpService.updateDocumentName(this.selectedDocument._id, payload)\r\n .subscribe({\r\n next: (res: any) => {\r\n if (res && res.aliasName) {\r\n this.selectedDocument!.aliasName = res.aliasName;\r\n } else {\r\n this.selectedDocument!.aliasName = this.documentName;\r\n }\r\n this.isEditingDocumentName = false;\r\n this.fileNameError = SHARED.EMPTY;\r\n this.documentNameUpdated.emit();\r\n },\r\n error: (error: any) => {\r\n this.fileNameError = error.message;\r\n }\r\n });\r\n } else {\r\n this.isEditingDocumentName = false;\r\n this.fileNameError = SHARED.EMPTY;\r\n }\r\n }\r\n}\r\n","<div class=\"control-container\">\r\n <div class=\"inline-flex align-items-center justify-content-center gap-2\">\r\n <!-- Document name display with hover edit icon -->\r\n <div *ngIf=\"!isEditingDocumentName\" class=\"document-name-display\" \r\n [class.clickable-doc-name]=\"selectedDocument?.isAliasEditable\" \r\n [class.non-clickable-doc-name]=\"!selectedDocument?.isAliasEditable\"\r\n (click)=\"selectedDocument?.isAliasEditable ? onDocumentNameClick() : null\"\r\n [title]=\"selectedDocument?.isAliasEditable ? 'Click to edit document name' : 'Document name is not editable'\">\r\n <div class=\"alias-name\">\r\n {{ selectedDocument?.aliasName || selectedDocument?.docName }}\r\n <i *ngIf=\"selectedDocument?.isAliasEditable && !isFormHide\" class=\"pi pi-pencil edit-icon-small\"></i> \r\n </div>\r\n <!-- Subline: show `ownerName documentTypeName` (falls back to just type if no owner) -->\r\n <div class=\"document-name\">\r\n <ng-container [ngTemplateOutlet]=\"ownerTypeDisplay\"></ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isEditingDocumentName\" class=\"document-edit-container\">\r\n <input #fileInput type=\"text\" class=\"h-3rem file-input-wrapper document-name-input\" pInputText\r\n [(ngModel)]=\"documentName\" (input)=\"onDocumentNameChange($event)\" (keydown.escape)=\"cancelDocumentNameEdit()\"\r\n (keydown.enter)=\"handleSaveClick()\" (blur)=\"handleSaveClick()\" />\r\n <div class=\"document-name-subline\">\r\n <ng-container [ngTemplateOutlet]=\"ownerTypeDisplay\"></ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"fileNameError\" class=\"error-message-wrapper\">\r\n {{ fileNameError }}\r\n </div>\r\n </div>\r\n <div class=\"zoom-controls\">\r\n <p-button type=\"button\" icon=\"pi pi-minus\" [rounded]=\"true\" severity=\"secondary\" [outlined]=\"true\" (click)=\"zoomOut()\" [disabled]=\"isZoomOutDisabled\" title=\"Zoom Out\">\r\n </p-button>\r\n <p-button type=\"button\" icon=\"pi pi-plus\" [rounded]=\"true\" severity=\"secondary\" [outlined]=\"true\" (click)=\"zoomIn()\" [disabled]=\"isZoomInDisabled\" title=\"Zoom In\">\r\n </p-button>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Shared template for displaying Owner + Type -->\r\n<ng-template #ownerTypeDisplay>\r\n <ng-container *ngIf=\"((selectedDocument?.ownerName || '').trim()).length > 0; else onlyTypeTpl\">\r\n {{ selectedDocument?.ownerName }}<ng-container *ngIf=\"selectedDocument?.documentTypeName\"> {{ selectedDocument?.documentTypeName }}</ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #onlyTypeTpl>\r\n {{ selectedDocument?.documentTypeName }}\r\n\r\n","import {\r\n Component,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n} from '@angular/core';\r\nimport { OPEN_DOCUMENT_EXTENSIONS, SHARED, SUPPORTED_IMAGE_TYPES } from '../../../../Shared/constant/SHARED';\r\nimport { ExcelParserService, ExcelRowData, ParsedExcelData } from '../../services/excel-parser.service';\r\nimport { CsvParserService, CsvRowData, ParsedCsvData } from '../../services/csv-parser.service';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentZoomService } from '../../services/document-zoom.service';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\n\r\n/**\r\n * Component for viewing different types of document content.\r\n * Supports PDF, images, and other document formats.\r\n * @class DocumentContentViewerComponent\r\n * @typedef {DocumentContentViewerComponent}\r\n */\r\n@Component({\r\n selector: 'document-content-viewer',\r\n templateUrl: './document-content-viewer.component.html',\r\n standalone: false,\r\n styleUrl: './document-content-viewer.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class DocumentContentViewerComponent implements OnChanges, OnInit, OnDestroy {\r\n /**\r\n * The document URL to display\r\n * @type {string}\r\n */\r\n @Input() documentUrl?: string;\r\n\r\n /**\r\n * The content type of the document\r\n * @type {string}\r\n */\r\n @Input() contentType?: string;\r\n\r\n /**\r\n * The document name for display purposes\r\n * @type {string}\r\n */\r\n @Input() documentName?: string;\r\n\r\n /**\r\n * The selected document for display purposes\r\n * @type {DocumentListItem}\r\n */\r\n @Input() selectedDocument?: DocumentListItem;\r\n\r\n /**\r\n * The context ID for the document\r\n * @type {string}\r\n */\r\n @Input() contextId?: string;\r\n\r\n /**\r\n * Flag to hide form elements\r\n * @type {boolean}\r\n */\r\n @Input() isFormHide: boolean = false;\r\n /**\r\n * Excel data for display\r\n * @type {any}\r\n */\r\n excelData: any = null;\r\n\r\n /**\r\n * Parsed Excel data as table rows\r\n * @type {any[][]}\r\n */\r\n excelTableData: any[][] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Enhanced Excel data with styling information\r\n * @type {ExcelRowData[]}\r\n */\r\n excelStyledData: ExcelRowData[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Excel sheet names\r\n * @type {string[]}\r\n */\r\n excelSheets: string[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Current active sheet\r\n * @type {string}\r\n */\r\n currentSheet: string = SHARED.EMPTY;\r\n\r\n /**\r\n * Loading state for Excel files\r\n * @type {boolean}\r\n */\r\n isLoadingExcel: boolean = false;\r\n\r\n /**\r\n * Error state for Excel files\r\n * @type {string | null}\r\n */\r\n excelError: string | null = null;\r\n\r\n /**\r\n * Loading state specifically for Word documents\r\n * @type {boolean}\r\n */\r\n isLoadingWordDocument: boolean = false;\r\n\r\n /**\r\n * CSV data for display\r\n * @type {any}\r\n */\r\n csvData: any = null;\r\n\r\n /**\r\n * Parsed CSV data as table rows\r\n * @type {any[][]}\r\n */\r\n csvTableData: any[][] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Enhanced CSV data with styling information\r\n * @type {CsvRowData[]}\r\n */\r\n csvStyledData: CsvRowData[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Loading state for CSV files\r\n * @type {boolean}\r\n */\r\n isLoadingCsv: boolean = false;\r\n\r\n /**\r\n * Error state for CSV files\r\n * @type {string | null}\r\n */\r\n csvError: string | null = null;\r\n\r\n /**\r\n * Current zoom level for the document\r\n * @type {number}\r\n */\r\n currentZoom: number = 100;\r\n\r\n /**\r\n * Loading state for Email files\r\n * @type {boolean}\r\n */\r\n isLoadingEmail: boolean = false;\r\n\r\n /**\r\n * Error state for Email files\r\n * @type {string | null}\r\n */\r\n emailError: string | null = null;\r\n\r\n /**\r\n * PDF URL for converted email\r\n * @type {string | null}\r\n */\r\n emailPdfUrl: string | null = null;\r\n\r\n\r\n\r\n /**\r\n * Constructor\r\n * @param {ExcelParserService} excelParserService - Service for parsing Excel files\r\n * @param {CsvParserService} csvParserService - Service for parsing CSV files\r\n * @param {DocumentHttpService} documentHttpService - Service for making HTTP requests for Excel/CSV files\r\n * @param {DocumentZoomService} zoomService - Service for handling zoom functionality\r\n * @param {DomSanitizer} sanitizer - Service for sanitizing HTML content\r\n */\r\n constructor(\r\n private excelParserService: ExcelParserService,\r\n private csvParserService: CsvParserService,\r\n private documentHttpService: DocumentHttpService,\r\n private zoomService: DocumentZoomService,\r\n private sanitizer: DomSanitizer\r\n ) { }\r\n\r\n /**\r\n * Computed property to determine if the document is a PDF\r\n * @type {boolean}\r\n */\r\n get isPdf(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.PDF || ext === SHARED.PDF2;\r\n }\r\n\r\n\r\n /**\r\n * Computed property to determine if the document is an Excel file\r\n * @type {boolean}\r\n */\r\n get isExcel(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.XLSX || ext === SHARED.XLS;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is a Word file\r\n * @type {boolean}\r\n */\r\n get isWord(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.DOCX || ext === SHARED.DOC;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is a CSV file\r\n * @type {boolean}\r\n */\r\n get isCsv(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.CSV;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is an email file\r\n * @type {boolean}\r\n */\r\n get isEmail(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return this.contentType === SHARED.EMAIL_RFC822_MIME_TYPE ||\r\n this.contentType === SHARED.EMAIL_OUTLOOK_MIME_TYPE ||\r\n ext === SHARED.EML ||\r\n ext === SHARED.MSG;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is an OpenDocument file\r\n * @type {boolean}\r\n */\r\n get isOpenDocument(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return OPEN_DOCUMENT_EXTENSIONS.includes(ext);\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document has an unsupported content type\r\n * @type {boolean}\r\n */\r\n get isUnsupported(): boolean {\r\n return !this.isImage && !this.isPdf && !this.isExcel && !this.isWord &&\r\n !this.isCsv && !this.isEmail && !this.isOpenDocument;\r\n }\r\n\r\n /**\r\n * Computed property to get the appropriate icon for the document type\r\n * @type {string}\r\n */\r\n get documentIcon(): string {\r\n if (this.isPdf) return SHARED.ICON_FILE_PDF;\r\n if (this.isImage) return SHARED.ICON_IMAGE;\r\n if (this.isExcel) return SHARED.ICON_FILE_EXCEL;\r\n if (this.isWord) return SHARED.ICON_FILE_WORD;\r\n if (this.isCsv) return SHARED.ICON_FILE;\r\n if (this.isEmail) return SHARED.ICON_ENVELOPE;\r\n if (this.isOpenDocument) return SHARED.ICON_FILE;\r\n return SHARED.ICON_FILE;\r\n }\r\n\r\n /**\r\n * Computed property to get the display text for the document type\r\n * @type {string}\r\n */\r\n get documentTypeText(): string {\r\n if (this.isPdf) return SHARED.PDF_DOCUMENT;\r\n if (this.isImage) return SHARED.IMAGE;\r\n if (this.isExcel) return SHARED.EXCEL_SPREADSHEET;\r\n if (this.isWord) return SHARED.WORD_DOCUMENT;\r\n if (this.isCsv) return SHARED.CSV_FILE;\r\n if (this.isEmail) return SHARED.EMAIL_MESSAGE;\r\n if (this.isOpenDocument) return SHARED.OPEN_DOCUMENT;\r\n return SHARED.DOCUMENT;\r\n }\r\n\r\n /**\r\n * Safely gets the styled Excel data for display\r\n * @type {ExcelRowData[]}\r\n */\r\n get safeExcelStyledData(): ExcelRowData[] {\r\n if (!this.excelStyledData || this.excelStyledData.length === 0) {\r\n return [{ cells: [{ value: SHARED.NO_DATA_AVAILABLE }] }];\r\n }\r\n return this.excelStyledData;\r\n }\r\n\r\n /**\r\n * Safely gets the styled CSV data for display\r\n * @type {CsvRowData[]}\r\n */\r\n get safeCsvStyledData(): CsvRowData[] {\r\n if (!this.isCsvDataValid()) {\r\n return [{\r\n cells: [{\r\n value: SHARED.NO_DATA_AVAILABLE,\r\n isHeader: false,\r\n style: {}\r\n }]\r\n }];\r\n }\r\n\r\n // Ensure each row has the correct structure\r\n return this.csvStyledData.map(row => {\r\n if (!row || !row.cells || !Array.isArray(row.cells)) {\r\n return {\r\n cells: [{\r\n value: SHARED.NO_DATA_AVAILABLE,\r\n isHeader: false,\r\n style: {}\r\n }]\r\n };\r\n }\r\n return row;\r\n });\r\n }\r\n\r\n /**\r\n * Handles changes to input properties\r\n * @param {SimpleChanges} changes - The changes object\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.DOCUMENT_URL] || changes[SHARED.CONTENT_TYPE]) {\r\n if (this.isWord && this.documentUrl) {\r\n this.isLoadingWordDocument = true;\r\n }\r\n\r\n this.loadExcelData();\r\n this.loadCsvData();\r\n this.loadEmailData();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the component\r\n */\r\n ngOnInit(): void {\r\n this.loadExcelData();\r\n this.loadCsvData();\r\n this.loadEmailData();\r\n this.initializeZoom();\r\n }\r\n\r\n /**\r\n * Initializes zoom functionality\r\n */\r\n private initializeZoom(): void {\r\n this.zoomService.zoomLevel$.subscribe(zoom => {\r\n this.currentZoom = zoom;\r\n this.applyZoomTransform();\r\n });\r\n }\r\n\r\n /**\r\n * Handles mouse wheel events for zooming\r\n */\r\n @HostListener('wheel', ['$event'])\r\n onWheel(event: WheelEvent): void {\r\n this.handleWheelZoom(event);\r\n }\r\n /**\r\n * Handles wheel zoom for document viewers\r\n */\r\n handleWheelZoom(event: WheelEvent): void {\r\n const target = event.target as HTMLElement;\r\n const isOverDocumentViewer = target.closest(SHARED.DOC_VIEWER_WRAPPER) ||\r\n target.closest(SHARED.CSV_TABLE_CONTAINER) ||\r\n target.closest(SHARED.DOCX_CONTAINER) ||\r\n target.closest(SHARED.PDF_CONTAINER) ||\r\n target.closest(SHARED.IMAGE_CONTAINER) ||\r\n target.closest(SHARED.WHEEL_CAPTURE_OVERLAY) ||\r\n target.closest(SHARED.DOCUMENT_CONTENT_VIEWER_CONTAINER);\r\n\r\n if (isOverDocumentViewer) {\r\n if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\r\n if (event.ctrlKey || event.metaKey) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.zoomService.handleWheelZoom(event);\r\n }\r\n }\r\n else if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Applies zoom transform to the document viewer\r\n */\r\n private applyZoomTransform(): void {\r\n this.zoomService.applyIframeZoomBySelector(SHARED.EXCEL_ZOOM_WRAPPER);\r\n this.zoomService.applyIframeZoomBySelector(SHARED.DOC_VIEWER_WRAPPER);\r\n const csvContainer = document.querySelector(SHARED.CSV_ZOOM_WRAPPER) as HTMLElement;\r\n if (csvContainer) {\r\n const zoomScale = this.currentZoom / 100;\r\n csvContainer.style.transform = `scale(${zoomScale})`;\r\n }\r\n }\r\n\r\n /**\r\n * Downloads the document\r\n */\r\n downloadDocument(): void {\r\n if (this.documentUrl) {\r\n const link = document.createElement('a');\r\n link.href = this.documentUrl;\r\n link.download = this.documentName || 'document';\r\n link.target = '_blank';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the document in a new tab\r\n */\r\n openInNewTab(): void {\r\n if (this.documentUrl) {\r\n window.open(this.documentUrl, '_blank');\r\n }\r\n }\r\n\r\n /**\r\n * Loads Excel data for display\r\n */\r\n private loadExcelData(): void {\r\n if (this.isExcel && this.documentUrl) {\r\n this.isLoadingExcel = true;\r\n this.excelError = null;\r\n\r\n this.documentHttpService.downloadExcelFile(this.documentUrl)\r\n .subscribe({\r\n next: (data: ArrayBuffer) => {\r\n try {\r\n this.parseExcelData(data);\r\n } catch (error) {\r\n this.excelError = SHARED.ERROR_PARSING_EXCEL_FILE;\r\n }\r\n this.isLoadingExcel = false;\r\n },\r\n error: (error: any) => {\r\n console.log(error);\r\n this.isLoadingExcel = false;\r\n }\r\n });\r\n } else {\r\n this.resetExcelData();\r\n }\r\n }\r\n\r\n /**\r\n * Parses Excel data using the service\r\n * @param {ArrayBuffer} data - Excel file data\r\n */\r\n private parseExcelData(data: ArrayBuffer): void {\r\n const parsedData = this.excelParserService.parseExcelData(data);\r\n\r\n if (parsedData) {\r\n this.excelSheets = parsedData.sheets;\r\n this.currentSheet = parsedData.currentSheet;\r\n this.excelStyledData = parsedData.styledData;\r\n this.excelTableData = parsedData.tableData;\r\n this.excelStyledData = this.excelParserService.ensureDataConsistency(this.excelStyledData);\r\n this.excelTableData = this.excelParserService.convertToLegacyFormat(this.excelStyledData);\r\n\r\n this.excelData = {\r\n type: 'excel',\r\n sheets: this.excelSheets,\r\n currentSheet: this.currentSheet,\r\n tableData: this.excelTableData,\r\n styledData: this.excelStyledData,\r\n workbook: parsedData.workbook,\r\n hasStyling: parsedData.hasStyling\r\n };\r\n } else {\r\n this.excelError = SHARED.ERROR_PARSING_EXCEL_FILE_STRUCTURE;\r\n }\r\n }\r\n\r\n /**\r\n * Changes the active Excel sheet\r\n * @param {string} sheetName - Name of the sheet to activate\r\n */\r\n changeSheet(sheetName: string): void {\r\n this.currentSheet = sheetName;\r\n\r\n if (this.excelData?.workbook) {\r\n this.excelStyledData = this.excelParserService.parseSheetData(this.excelData.workbook, sheetName);\r\n this.excelStyledData = this.excelParserService.ensureDataConsistency(this.excelStyledData);\r\n this.excelTableData = this.excelParserService.convertToLegacyFormat(this.excelStyledData);\r\n }\r\n }\r\n\r\n /**\r\n * Resets Excel data to initial state\r\n */\r\n private resetExcelData(): void {\r\n this.excelData = null;\r\n this.excelTableData = SHARED.EMPTY_ARRAY;\r\n this.excelStyledData = SHARED.EMPTY_ARRAY;\r\n this.excelSheets = SHARED.EMPTY_ARRAY;\r\n this.currentSheet = SHARED.EMPTY;\r\n this.isLoadingExcel = false;\r\n this.excelError = null;\r\n }\r\n\r\n /**\r\n * Loads CSV data for display\r\n */\r\n private loadCsvData(): void {\r\n if (this.isCsv && this.documentUrl) {\r\n this.isLoadingCsv = true;\r\n this.csvError = null;\r\n\r\n this.documentHttpService.downloadCsvFile(this.documentUrl)\r\n .subscribe({\r\n next: (data: string) => {\r\n try {\r\n this.parseCsvData(data);\r\n } catch (error) {\r\n this.csvError = SHARED.ERROR_PARSING_CSV_FILE;\r\n this.resetCsvData();\r\n }\r\n this.isLoadingCsv = false;\r\n },\r\n error: (error: any) => {\r\n this.csvError = SHARED.ERROR_LOADING_CSV_FILE;\r\n this.resetCsvData();\r\n this.isLoadingCsv = false;\r\n }\r\n });\r\n } else {\r\n this.resetCsvData();\r\n }\r\n }\r\n\r\n /**\r\n * Parses CSV data using the service\r\n * @param {string} data - CSV file data\r\n */\r\n private parseCsvData(data: string): void {\r\n try {\r\n const parsedData = this.csvParserService.parseCsvData(data, {\r\n delimiter: SHARED.COMMA,\r\n hasHeaders: true,\r\n maxRows: 1000\r\n });\r\n\r\n if (parsedData && parsedData.styledData && parsedData.styledData.length > 0) {\r\n this.csvStyledData = parsedData.styledData;\r\n this.csvTableData = parsedData.rows;\r\n\r\n this.csvData = {\r\n type: 'csv',\r\n headers: parsedData.headers,\r\n rows: parsedData.rows,\r\n tableData: parsedData.rows,\r\n styledData: parsedData.styledData,\r\n totalRows: parsedData.totalRows,\r\n totalColumns: parsedData.totalColumns,\r\n hasHeaders: parsedData.hasHeaders\r\n };\r\n } else {\r\n this.csvError = SHARED.ERROR_PARSING_CSV_DATA;\r\n this.resetCsvData();\r\n }\r\n } catch (error) {\r\n this.csvError = SHARED.ERROR_PARSING_CSV_FILE;\r\n this.resetCsvData();\r\n }\r\n }\r\n\r\n /**\r\n * Resets CSV data to initial state\r\n */\r\n private resetCsvData(): void {\r\n this.csvData = null;\r\n this.csvTableData = SHARED.EMPTY_ARRAY;\r\n this.csvStyledData = SHARED.EMPTY_ARRAY;\r\n this.isLoadingCsv = false;\r\n this.csvError = null;\r\n }\r\n\r\n /**\r\n * TrackBy function for CSV cells to improve performance\r\n * @param index - Cell index\r\n * @param cell - Cell object\r\n * @returns Unique identifier for the cell\r\n */\r\n trackByCell(index: number, cell: any): any {\r\n return `${index}-${cell.value}`;\r\n }\r\n\r\n /**\r\n * Checks if CSV data is valid and ready for display\r\n * @returns {boolean} True if CSV data is valid\r\n */\r\n private isCsvDataValid(): boolean {\r\n return this.csvStyledData &&\r\n this.csvStyledData.length > 0 &&\r\n this.csvStyledData.every(row => row && row.cells && Array.isArray(row.cells));\r\n }\r\n\r\n private getFileExtension(urlOrName?: string): string {\r\n if (!urlOrName) return SHARED.EMPTY;\r\n const lastDot = urlOrName.lastIndexOf(SHARED.DOT);\r\n if (lastDot === -1) return SHARED.EMPTY;\r\n return urlOrName.substring(lastDot + 1).toLowerCase();\r\n }\r\n\r\n get isImage(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return SUPPORTED_IMAGE_TYPES.includes(ext);\r\n }\r\n\r\n /**\r\n * Loads Email data for display\r\n * Converts email to PDF and renders it\r\n */\r\n private loadEmailData(): void {\r\n if (this.isEmail && this.documentUrl) {\r\n this.isLoadingEmail = true;\r\n this.emailError = null;\r\n \r\n // Clean up previous blob URL if exists\r\n if (this.emailPdfUrl) {\r\n URL.revokeObjectURL(this.emailPdfUrl);\r\n this.emailPdfUrl = null;\r\n }\r\n\r\n // Call convert-to-pdf API\r\n this.documentHttpService.convertEmailToPdf(this.documentUrl)\r\n .subscribe({\r\n next: (pdfBlob: Blob) => {\r\n // Verify it's a PDF blob\r\n if (pdfBlob.type === 'application/pdf' || pdfBlob.size > 0) {\r\n // Create blob URL from PDF response\r\n this.emailPdfUrl = URL.createObjectURL(pdfBlob);\r\n this.emailError = null;\r\n this.isLoadingEmail = false;\r\n } else {\r\n // Invalid PDF response\r\n this.emailError = 'Invalid PDF response from server';\r\n this.isLoadingEmail = false;\r\n }\r\n },\r\n error: (error: any) => {\r\n console.error('Error converting email to PDF:', error);\r\n this.emailError = error?.message || 'Failed to convert email to PDF';\r\n this.isLoadingEmail = false;\r\n }\r\n });\r\n } else {\r\n this.resetEmailData();\r\n }\r\n }\r\n\r\n /**\r\n * Resets Email data to initial state\r\n */\r\n private resetEmailData(): void {\r\n // Clean up blob URL to prevent memory leaks\r\n if (this.emailPdfUrl) {\r\n URL.revokeObjectURL(this.emailPdfUrl);\r\n this.emailPdfUrl = null;\r\n }\r\n this.isLoadingEmail = false;\r\n this.emailError = null;\r\n }\r\n\r\n /**\r\n * Computed property to determine if email should be displayed as PDF\r\n * @type {boolean}\r\n */\r\n get isEmailAsPdf(): boolean {\r\n return this.isEmail && !!this.emailPdfUrl;\r\n }\r\n\r\n /**\r\n * Cleanup when component is destroyed\r\n */\r\n ngOnDestroy(): void {\r\n // Clean up blob URL to prevent memory leaks\r\n if (this.emailPdfUrl) {\r\n URL.revokeObjectURL(this.emailPdfUrl);\r\n this.emailPdfUrl = null;\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"document-content-viewer-container\">\r\n <!-- Preview must not require contentType: APIs often omit MIME while still returning documentUrl + filename extension. -->\r\n @if(documentUrl){\r\n <!-- Zoom Controls -->\r\n <div class=\"zoom-controls-wrapper\">\r\n <document-zoom-controls [selectedDocument]=\"selectedDocument\" [contextId]=\"contextId\" [isFormHide]=\"isFormHide\">\r\n </document-zoom-controls>\r\n </div>\r\n\r\n <!-- PDF Viewer -->\r\n @if(isPdf){\r\n <div class=\"pdf-container\">\r\n <pdf-viewer [src]=\"documentUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\r\n [zoom]=\"currentZoom / 100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\r\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\r\n style=\"width: 100%; height: 100%\"></pdf-viewer>\r\n </div>\r\n }\r\n\r\n <!-- Image Viewer -->\r\n @else if(isImage){\r\n <div class=\"image-container\">\r\n <img [src]=\"documentUrl\" [alt]=\"documentName || 'Document Image'\" class=\"document-image\"\r\n [style.transform]=\"'scale(' + (currentZoom / 100) + ')'\" [style.transform-origin]=\"'center center'\" />\r\n </div>\r\n }\r\n\r\n <!-- Excel Files -->\r\n @else if(isExcel){\r\n <div class=\"excel-container\">\r\n @if(isLoadingExcel){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading Excel file...</p>\r\n </div>\r\n </div>\r\n }@else if(excelError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading Excel File</h4>\r\n <p>{{ excelError }}</p>\r\n <div class=\"error-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(excelData){\r\n <div class=\"excel-container\">\r\n <div class=\"excel-zoom-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Word Files -->\r\n @else if(isWord){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\r\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- CSV Files -->\r\n @else if(isCsv){\r\n <div class=\"csv-container\">\r\n @if(isLoadingCsv){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading CSV file...</p>\r\n </div>\r\n </div>\r\n }@else if(csvError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading CSV File</h4>\r\n <p>{{ csvError }}</p>\r\n <div class=\"error-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(csvData){\r\n <div class=\"csv-content\">\r\n <div class=\"csv-header\">\r\n <div class=\"csv-info\">\r\n <p>{{ documentName || 'CSV File' }}</p>\r\n <span class=\"csv-stats\">\r\n {{ csvData.totalRows }} rows × {{ csvData.totalColumns }} columns\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"csv-table-container\" [style.transform-origin]=\"'center center'\" (wheel)=\"onWheel($event)\">\r\n <p-table [value]=\"safeCsvStyledData\" [tableStyle]=\"{'min-width': '100%'}\" [scrollable]=\"true\"\r\n scrollHeight=\"67vh\" class=\"csv-table\">\r\n <ng-template pTemplate=\"body\" let-row>\r\n <tr>\r\n <ng-container *ngFor=\"let cell of row.cells; trackBy: trackByCell\">\r\n <td [ngClass]=\"{'csv-header-cell': cell.isHeader}\">\r\n {{ cell.value }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Email Files -->\r\n @else if(isEmail){\r\n <div class=\"email-container\">\r\n @if(isLoadingEmail){\r\n <div class=\"loading-container text-center m-1/2\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem;\"></i>\r\n <p>Opening email...</p>\r\n </div>\r\n }\r\n @else if(isEmailAsPdf && emailPdfUrl){\r\n <!-- Render PDF when email is converted -->\r\n <pdf-viewer [src]=\"emailPdfUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\r\n [zoom]=\"currentZoom/100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\r\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\r\n style=\"width: 100%; height: 82vh;\"></pdf-viewer>\r\n }\r\n @else if(emailError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-circle\" style=\"font-size: 2rem; color: #ef4444;\"></i>\r\n <h4>Unable to Preview Email</h4>\r\n <p>{{ emailError }}</p>\r\n <div class=\"error-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- OpenDocument Files -->\r\n @else if(isOpenDocument){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:800px;\"></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Unsupported Files -->\r\n @else if(isUnsupported){\r\n <div class=\"unsupported-document-container\">\r\n <div class=\"document-preview\">\r\n <div class=\"document-icon\">\r\n <i [class]=\"documentIcon\"></i>\r\n </div>\r\n <div class=\"document-info\">\r\n <h4>Unsupported Document Type</h4>\r\n <p>{{ documentName || 'Document' }}</p>\r\n <p class=\"document-note\">This document type ({{ contentType || 'unknown' }}) is not supported for preview. Please download to\r\n view.</p>\r\n </div>\r\n <div class=\"document-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n <button type=\"button\" class=\"p-button p-button-outlined p-button-sm\" (click)=\"openInNewTab()\">\r\n <i class=\"pi pi-external-link\"></i>\r\n Open\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @else {\r\n <div class=\"no-document-container\">\r\n <div class=\"no-document-content\">\r\n <i class=\"pi pi-file-o\" style=\"font-size: 3rem; color: #6b7280;\"></i>\r\n <h4>No Document Uploaded</h4>\r\n <p>Please Upload a document to view its content.</p>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentActionsService, DocumentAction } from '../../services/document-actions.service';\r\nimport { SessionService } from '../../../../Shared/services/session.service';\r\n\r\n@Component({\r\n selector: 'document-actions',\r\n templateUrl: './document-actions.component.html',\r\n styleUrls: ['./document-actions.component.scss'],\r\n standalone: false\r\n})\r\nexport class DocumentActionsComponent implements OnChanges {\r\n readonly SHARED = SHARED;\r\n \r\n @Input() document?: any;\r\n @Input() documentId?: string;\r\n @Input() currentStatus?: string;\r\n @Input() isLoading?: boolean = false;\r\n @Input() isUploaded?: boolean = false;\r\n @Input() statusId?: string;\r\n @Output() actionPerformed = new EventEmitter<DocumentAction>();\r\n\r\n showAcceptDialog = false;\r\n showRejectDialog = false;\r\n acceptNote = SHARED.EMPTY;\r\n private _rejectNote = SHARED.EMPTY;\r\n userRole: any = SHARED.EMPTY;\r\n // Action processing flags\r\n isAccepting = false;\r\n isRejecting = false;\r\n\r\n // Computed properties for template\r\n cardClass: string = SHARED.CARD_PENDING;\r\n rejectButtonClass: string = SHARED.BUTTON_DEFAULT_REJECT;\r\n acceptButtonClass: string = SHARED.BUTTON_DEFAULT_ACCEPT;\r\n isRejectNoteEmpty: boolean = true;\r\n\r\n // Action visibility computed properties\r\n showApproveRejectActions: boolean = false;\r\n showNoActions: boolean = false;\r\n\r\n constructor(\r\n private documentActionsService: DocumentActionsService,\r\n private sessionService: SessionService\r\n ) {}\r\n\r\n get rejectNote(): string {\r\n return this._rejectNote;\r\n }\r\n\r\n set rejectNote(value: string) {\r\n this._rejectNote = value;\r\n this.updateRejectNoteEmpty();\r\n }\r\n\r\n /**\r\n * Checks if both action buttons should be disabled\r\n * @returns {boolean} True if both buttons should be disabled\r\n */\r\n get areButtonsDisabled(): boolean {\r\n return this.isDocumentApproved || this.isDocumentRejected;\r\n }\r\n\r\n /**\r\n * Checks if the document is approved (case-insensitive)\r\n * @returns {boolean} True if document is approved\r\n */\r\n get isDocumentApproved(): boolean {\r\n return this.currentStatus?.toLowerCase() === SHARED.STATUS_ACCEPTED.toLowerCase() ||\r\n this.currentStatus?.toLowerCase() === SHARED.STATUS_APPROVED.toLowerCase();\r\n }\r\n\r\n /**\r\n * Checks if the document is rejected (case-insensitive)\r\n * @returns {boolean} True if document is rejected\r\n */\r\n get isDocumentRejected(): boolean {\r\n return this.currentStatus?.toLowerCase() === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() ||\r\n this.currentStatus?.toLowerCase() === SHARED.STATUS_REJECTED.toLowerCase();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.updateComputedProperties();\r\n if (changes['isLoading'] && !this.isLoading) {\r\n this.resetActionFlags();\r\n }\r\n }\r\n\r\n /**\r\n * Updates computed properties based on currentStatus and statusId\r\n */\r\n private updateComputedProperties(): void {\r\n this.cardClass = this.documentActionsService.calculateCardClass(this.currentStatus, this.statusId);\r\n this.rejectButtonClass = this.documentActionsService.calculateRejectButtonClass(this.currentStatus, this.statusId);\r\n this.acceptButtonClass = this.documentActionsService.calculateAcceptButtonClass(this.currentStatus, this.statusId);\r\n this.updateRejectNoteEmpty();\r\n }\r\n\r\n /**\r\n * Checks if the current user is a Team Leader\r\n * @returns {boolean} True if user is Team Leader\r\n */\r\n isUserTeamLeader(): boolean {\r\n this.userRole = this.sessionService.getUserRole();\r\n return this.userRole === SHARED.TEAM_LEADER;\r\n }\r\n\r\n /**\r\n * Checks if the current user is an Underwriter\r\n * @returns {boolean} True if user is Underwriter\r\n */\r\n isUserUnderwriter(): boolean {\r\n this.userRole = this.sessionService.getUserRole();\r\n return this.userRole === SHARED.UNDERWRITER_USER;\r\n }\r\n\r\n /**\r\n * Updates the isRejectNoteEmpty property based on current rejectNote value\r\n */\r\n updateRejectNoteEmpty(): void {\r\n this.isRejectNoteEmpty = !this.rejectNote || this.rejectNote.trim() === SHARED.EMPTY;\r\n }\r\n\r\n /**\r\n * Resets the action processing flags\r\n */\r\n private resetActionFlags(): void {\r\n this.isAccepting = false;\r\n this.isRejecting = false;\r\n }\r\n\r\n onAcceptClick(): void {\r\n this.showAcceptDialog = true;\r\n }\r\n\r\n onRejectClick(): void {\r\n this.showRejectDialog = true;\r\n }\r\n\r\n\r\n\r\n onAcceptConfirm(): void {\r\n this.isAccepting = true;\r\n this.actionPerformed.emit(this.documentActionsService.createAcceptAction(this.acceptNote));\r\n this.acceptNote = SHARED.EMPTY;\r\n this.showAcceptDialog = false;\r\n }\r\n\r\n onRejectConfirm(): void {\r\n this.isRejecting = true;\r\n this.actionPerformed.emit(this.documentActionsService.createRejectAction(this.rejectNote));\r\n this.rejectNote = SHARED.EMPTY;\r\n this.showRejectDialog = false;\r\n }\r\n\r\n onCancel(): void {\r\n this.showAcceptDialog = false;\r\n this.showRejectDialog = false;\r\n this.acceptNote = SHARED.EMPTY;\r\n this.rejectNote = SHARED.EMPTY;\r\n }\r\n\r\n} ","<div class=\"document-actions-container\" *ngIf=\"document?.status !=='Pending' && !document?.isUploaded && document?.status === 'Reviewing'\">\r\n <div class=\"actions-card\" [ngClass]=\"cardClass\">\r\n <div class=\"actions-buttons\">\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn reject-btn\" [ngClass]=\"rejectButtonClass\"\r\n (click)=\"onRejectClick()\" [disabled]=\"areButtonsDisabled || isRejecting\">\r\n <i class=\"pi pi-times\" *ngIf=\"isDocumentRejected\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isRejecting\"></i>\r\n <span>{{ isDocumentRejected ? SHARED.BUTTON_LABEL_REJECTED :\r\n SHARED.BUTTON_LABEL_REJECT }}</span>\r\n </button>\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn accept-btn\" [ngClass]=\"acceptButtonClass\"\r\n (click)=\"onAcceptClick()\" [disabled]=\"areButtonsDisabled || isAccepting\">\r\n <i class=\"pi pi-check\" *ngIf=\"isDocumentApproved\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isAccepting\"></i>\r\n <span>{{ isDocumentApproved ? SHARED.BUTTON_LABEL_ACCEPTED : SHARED.BUTTON_LABEL_ACCEPT\r\n }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<p-dialog [(visible)]=\"showAcceptDialog\" [header]=\"SHARED.ACCEPT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"acceptNote\" class=\"note-label\">{{ SHARED.ACCEPT_NOTE_LABEL }}</label>\r\n <textarea id=\"acceptNote\" pInputTextarea [(ngModel)]=\"acceptNote\" [placeholder]=\"SHARED.ACCEPT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.ACCEPT_BUTTON_LABEL\" class=\"p-button-success\" (click)=\"onAcceptConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [(visible)]=\"showRejectDialog\" [header]=\"SHARED.REJECT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"rejectNote\" class=\"note-label\">{{ SHARED.REJECT_NOTE_LABEL }}</label>\r\n <textarea id=\"rejectNote\" pInputTextarea [(ngModel)]=\"rejectNote\" [placeholder]=\"SHARED.REJECT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.REJECT_BUTTON_LABEL\" class=\"p-button-danger\" [disabled]=\"isRejectNoteEmpty\"\r\n (click)=\"onRejectConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { SHARED, SUPPORTED_IMAGE_TYPES } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../../models/document-history.model';\r\nimport { DocumentAction } from '../../services/document-actions.service';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DocumentViewerService, DocumentViewerState } from '../../services/document-viewer.service';\r\nimport { DocumentStore } from '../../state/document.store';\r\n\r\n/**\r\n * Component for viewing and managing document details.\r\n * @class DocumentViewerComponent\r\n * @typedef {DocumentViewerComponent}\r\n */\r\n@Component({\r\n selector: 'document-viewer',\r\n templateUrl: './document-viewer.component.html',\r\n standalone : false,\r\n styleUrl: './document-viewer.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class DocumentViewerComponent implements OnChanges, OnDestroy {\r\n /**\r\n * Get the selected document by user.\r\n * @type {*}\r\n */\r\n @Input() selectedDocument?: DocumentListItem; // <-- Made optional to prevent undefined issues\r\n /**\r\n * Get the selected document by user.\r\n * @type {*}\r\n */\r\n @Input() documentList?: DocumentListItem[]; // <-- Made optional to prevent undefined issues\r\n /**\r\n * The context ID for API calls\r\n * @type {string}\r\n */\r\n @Input() contextId?: string;\r\n\r\n /**\r\n * Flag to hide form elements\r\n * @type {boolean}\r\n */\r\n @Input() isFormHide: boolean = false;\r\n\r\n /**\r\n * Event emitted when document status is updated to refresh the document list\r\n * @type {EventEmitter<void>}\r\n */\r\n @Output() documentStatusUpdated = new EventEmitter<{ actionType?: string }>();\r\n\r\n /**\r\n * Event emitted when a delete error occurs\r\n * @type {EventEmitter<any>}\r\n */\r\n @Output() deleteError = new EventEmitter<any>();\r\n\r\n /**\r\n * Event emitted when a delete operation succeeds\r\n * @type {EventEmitter<void>}\r\n */\r\n @Output() deleteSuccess = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when the document viewer is destroyed to trigger refresh\r\n * @type {EventEmitter<void>}\r\n */\r\n @Output() viewerDestroyed = new EventEmitter<void>();\r\n\r\n /**\r\n * Indicates whether a checkbox is selected.\r\n * @type {boolean}\r\n */\r\n checked: boolean = false;\r\n\r\n /**\r\n * Reference to the dynamic dialog used for displaying additional details.\r\n * @type {(DynamicDialogRef | undefined)}\r\n */\r\n ref: DynamicDialogRef | undefined;\r\n\r\n /**\r\n * Indicates whether the document has been verified.\r\n * @type {boolean}\r\n */\r\n isVerified: boolean = false;\r\n\r\n /**\r\n * Messages for user feedback\r\n * @type {any[]}\r\n */\r\n messages: any[] = [];\r\n\r\n /**\r\n * Current state from the service\r\n * @type {DocumentViewerState}\r\n */\r\n currentState: DocumentViewerState = {\r\n documentHistory: [],\r\n showDocumentHistory: false,\r\n isActionLoading: false,\r\n documentStatus: SHARED.STATUS_PENDING as 'pending',\r\n documentIsUploaded: false,\r\n alertData: null,\r\n deleteError: null,\r\n deleteSuccess: false\r\n };\r\n\r\n\r\n\r\n /**\r\n * Holds the subscription to manage observable cleanup.\r\n * @private\r\n * @type {Subscription}\r\n */\r\n private subscription: Subscription = new Subscription();\r\n\r\n /**\r\n * Initializes a new instance of the DocumentViewerComponent.\r\n * @param {DocumentHttpService} documentHttpService - Handle the http service.\r\n * @param {DocumentService} documentService - Handle the states.\r\n * @param {DocumentViewerService} documentViewerService - Handle the viewer business logic.\r\n */\r\n constructor(\r\n public documentHttpService : DocumentHttpService, \r\n private documentService: DocumentHelperService,\r\n private messageService: MessageService,\r\n private documentViewerService: DocumentViewerService,\r\n public documentStore: DocumentStore\r\n ) {\r\n // Subscribe to state changes from the service\r\n this.subscription.add(\r\n this.documentViewerService.state$.subscribe(state => {\r\n this.currentState = state;\r\n \r\n // Check for delete errors and emit them to parent\r\n if (state.deleteError) {\r\n this.deleteError.emit(state.deleteError);\r\n // Clear the error from state after emitting\r\n this.documentStore.setDeleteError(null);\r\n }\r\n \r\n // Check for delete success and emit to parent\r\n if (state.deleteSuccess) {\r\n this.deleteSuccess.emit();\r\n // Clear the success flag from state after emitting\r\n this.documentStore.setDeleteSuccess(false);\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches the alerts for the selected document.\r\n * @returns {void}\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['selectedDocument'] && this.selectedDocument) {\r\n this.documentViewerService.updateSelectedDocument(this.selectedDocument);\r\n }\r\n }\r\n\r\n /**\r\n * Handles document selection from template\r\n * @param document The selected document\r\n */\r\n handleSelectedDocument(document: DocumentListItem): void {\r\n this.selectedDocument = document;\r\n this.documentViewerService.updateSelectedDocument(document);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handles document actions from the actions component\r\n * @param {DocumentAction} action - The action performed\r\n */\r\n handleDocumentAction(action: DocumentAction): void {\r\n this.documentViewerService.handleDocumentAction(action, this.contextId);\r\n this.documentStatusUpdated.emit({ actionType: action.type });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n if (this.contextId) {\r\n this.refreshDocumentData();\r\n }\r\n this.viewerDestroyed.emit();\r\n }\r\n\r\n /**\r\n * Handles document name update event from content viewer\r\n */\r\n onDocumentNameUpdated(): void {\r\n this.documentStatusUpdated.emit({ actionType: SHARED.NAME_UPDATE_ACTION });\r\n }\r\n\r\n /**\r\n * Handles delete task request from history component\r\n */\r\n onDeleteTaskRequested(): void {\r\n this.documentStatusUpdated.emit({ actionType: 'delete' });\r\n }\r\n\r\n /**\r\n * Handles document selection from history component\r\n * @param document - The selected document from history\r\n */\r\n onDocumentSelected(document: any): void {\r\n if (document && document.documentUrl && document.docName) {\r\n const tempDocument: DocumentListItem = {\r\n _id: document._id,\r\n docName: document.docName,\r\n fileName: document.docName,\r\n documentUrl: document.documentUrl,\r\n contentType: document.contentType,\r\n status: this.selectedDocument?.status || '',\r\n documentTypeName:document.documentTypeName,\r\n isUploaded: this.selectedDocument?.isUploaded || false,\r\n isAliasEditable: document.isAliasEditable,\r\n parentDocumentId: document.parentDocumentId,\r\n aliasName: document.aliasName,\r\n isSystemDocument: document.isSystemDocument || false,\r\n fileSize: '0',\r\n uploadedOn: new Date().toISOString(),\r\n ownerName: 'History Document'\r\n };\r\n this.selectedDocument = tempDocument;\r\n }\r\n }\r\n\r\n /**\r\n * Refreshes document data when the viewer is closed\r\n */\r\n private refreshDocumentData(): void {\r\n this.documentStore.clearSelectionState();\r\n this.documentStore.setDocumentListResponse(null);\r\n this.documentStore.setDocumentList([]); \r\n this.documentStore.setDocumentCategories([]);\r\n this.documentStore.setUserList([]);\r\n this.documentStore.setStatusData([]);\r\n this.documentStore.setCurrentDocument(null); \r\n this.documentStore.setFolders([]);\r\n this.documentStore.setDocumentAlert(null);\r\n // Clear document viewer state including history data\r\n this.documentStore.clearDocumentViewerState();\r\n }\r\n}\r\n","<div class=\"document-viewer-container grid p-formgrid\">\r\n <div class=\"main-content col-12 md:col-12\">\r\n @if(messages.length > 0) {\r\n <p-messages [(value)]=\"messages\" [enableService]=\"false\"></p-messages>\r\n }\r\n \r\n <div class=\"content-grid col-12 md:col-12\">\r\n @if(selectedDocument){\r\n <div class=\"document-preview p-0 col-12 md:col-9\">\r\n <document-content-viewer\r\n [documentUrl]=\"selectedDocument?.documentUrl\"\r\n [contentType]=\"selectedDocument?.contentType\"\r\n [documentName]=\"selectedDocument?.docName\"\r\n [selectedDocument]=\"selectedDocument\"\r\n [contextId]=\"contextId\"\r\n [isFormHide]=\"isFormHide\"\r\n (documentNameUpdated)=\"onDocumentNameUpdated()\"\r\n ></document-content-viewer>\r\n </div>\r\n }\r\n\r\n <div class=\"sidebar col-12 md:col-3 pt-0\">\r\n <div class=\"sidebar card\">\r\n <document-history \r\n [historyData]=\"currentState.documentHistory\" \r\n [showHistory]=\"currentState.showDocumentHistory\"\r\n [contextId]=\"contextId\"\r\n [selectedDocument]=\"selectedDocument\"\r\n (deleteTaskRequested)=\"onDeleteTaskRequested()\"\r\n (documentSelected)=\"onDocumentSelected($event)\">\r\n \r\n <!-- Document Actions Component inside the history component -->\r\n <div actions-component *ngIf=\"selectedDocument?.status !=='Pending' && !selectedDocument?.isUploaded && selectedDocument?.status === 'Reviewing'\">\r\n <document-actions\r\n [document]=\"selectedDocument\"\r\n [documentId]=\"selectedDocument?._id\"\r\n [currentStatus]=\"currentState.documentStatus\"\r\n [isLoading]=\"currentState.isActionLoading\"\r\n [isUploaded]=\"currentState.documentIsUploaded\"\r\n [statusId]=\"selectedDocument?.statusId\"\r\n (actionPerformed)=\"handleDocumentAction($event)\">\r\n </document-actions>\r\n </div>\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </document-history>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","\r\nimport { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, OnDestroy, OnChanges, SimpleChanges, ElementRef, ViewChild, AfterViewInit } from '@angular/core';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentListItem, DocumentListResponse } from '../../models/document-list-response.model';\r\nimport { Subscription } from 'rxjs';\r\nimport { TableData } from '../../../../Shared/components/table-primary/table-primary.model';\r\nimport { DocumentListService } from '../../services/document-list.service';\r\nimport { Message } from 'primeng/api';\r\nimport { ERRORS } from '../../../../Shared/constant/ERROR';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentMenuService } from '../../services/document-menu.service';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentScrollService } from '../../services/document-scroll.service';\r\n\r\n\r\n/**\r\n * This component is responsible for displaying and managing a list of documents.\r\n * Provides functionality for file upload, document selection, and dialog management.\r\n * @class DocumentListComponent\r\n */\r\n@Component({\r\n selector: 'lib-document-list',\r\n standalone: false,\r\n templateUrl: './document-list.component.html',\r\n styleUrls: ['./document-list.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class DocumentListComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\r\n\r\n /**\r\n * Represents the context ID for the document list.\r\n * This value is passed from the parent component.\r\n * @type {string}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n\r\n /**\r\n * The document list response data passed from the parent component.\r\n * @type {DocumentListResponse[] | null}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() documentListResponse: DocumentListResponse[] | null = null;\r\n\r\n /**\r\n * The selected menu item ID for scrolling to specific sections\r\n * @type {string | null}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() selectedMenuItemId: string | null = null;\r\n\r\n /**\r\n * Additional navigation information for precise scrolling\r\n * @type {object | null}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n } | null = null;\r\n\r\n\r\n\r\n /**\r\n * Reference to the document categories container for scrolling\r\n */\r\n @ViewChild('documentCategoriesContainer', { static: false }) documentCategoriesContainer!: ElementRef;\r\n\r\n /**\r\n * Subscription to document list response from store\r\n */\r\n private documentListSubscription: Subscription = new Subscription();\r\n\r\n @Output() handleSelectedDocumentInNewTab = new EventEmitter<{\r\n selectedDocument: DocumentListItem;\r\n contextId: string;\r\n documentList: DocumentListItem[];\r\n }>();\r\n\r\n /**\r\n * The currently selected document.\r\n * @type {DocumentModel}\r\n * @memberof DocumentListComponent\r\n */\r\n selectedDocument!: DocumentListItem;\r\n\r\n /**\r\n * Default visibility of the sidebar.\r\n * @type {boolean}\r\n * @memberof DocumentListComponent\r\n */\r\n isSidebarVisible: boolean = SHARED.FALSE;\r\n\r\n /**\r\n * Default visibility of the messages.\r\n * @type {Message[]}\r\n * @memberof DocumentListComponent\r\n */\r\n messages: Message[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Default visibility of the dialog.\r\n * @type {boolean}\r\n * @memberof DocumentListComponent\r\n */\r\n isdialogVisible: boolean = SHARED.FALSE;\r\n\r\n /**\r\n * The list of documents to display.\r\n * This value is passed from the parent component.\r\n * @type {DocumentModel[]}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() documentList: DocumentListItem[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Available document types for selection.\r\n * @type {string[]}\r\n * @memberof DocumentListComponent\r\n */\r\n options: any[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The selected option for the document type.\r\n * @type {(string | null)}\r\n * @memberof DocumentListComponent\r\n */\r\n selectedOption: string | null = null;\r\n \r\n /**\r\n * The file name associated with the document.\r\n * It may be undefined until a file is selected or loaded.\r\n * @type {string | undefined}\r\n */\r\n fileName!: string | undefined;\r\n \r\n /**\r\n * Table data for each category\r\n */\r\n categoryTables: TableData[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Document categories from the response\r\n */\r\n documentCategories: DocumentListResponse[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Completion counts for each category\r\n */\r\n categoryCompletionCounts: string[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Severity levels for each category completion badge\r\n */\r\n categorySeverities: ('success' | 'info' | 'warning' | 'danger')[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Message to display for document deletion\r\n */\r\n deleteMessage: Message[] = SHARED.EMPTY_ARRAY;\r\n\r\n // Document name editing functionality moved to zoom controls component\r\n\r\n\r\n\r\n // Alias name functionality moved to zoom controls component\r\n\r\n @Output() handleSelectedDocument = new EventEmitter<DocumentListItem>();\r\n\r\n // Document name validation moved to zoom controls component\r\n /**\r\n * Getter to return category labels as they come from the API\r\n */\r\n get formattedCategoryLabels(): string[] {\r\n return this.documentCategories.map(category => category.label);\r\n }\r\n\r\n /**\r\n * Getter to generate safe category IDs for HTML elements\r\n */\r\n get categoryIds(): string[] {\r\n return this.documentCategories.map((category, index) => {\r\n if (category?.label) {\r\n return `section-${category.label.toLowerCase().replace(' ', '-')}`;\r\n }\r\n return `section-category-${index}`;\r\n });\r\n }\r\n\r\n /**\r\n * Creates an instance of DocumentListComponent.\r\n * @class\r\n * @param {DocumentListService} documentListService - The service responsible for document list operations.\r\n */\r\n constructor(\r\n private documentListService: DocumentListService,\r\n private documentHttpService: DocumentHttpService,\r\n private documentMenuService: DocumentMenuService,\r\n private documentStore: DocumentStore,\r\n private documentScrollService: DocumentScrollService\r\n ) {}\r\n\r\n /**\r\n * Handles changes to input properties\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.CONTEXT_ID] && !changes[SHARED.CONTEXT_ID].firstChange) {\r\n this.documentListService.refreshDocumentListForNewContext(this.contextId);\r\n }\r\n \r\n if (changes['selectedMenuItemId']) {\r\n if (this.selectedMenuItemId) {\r\n this.scrollToCategorySection(this.selectedMenuItemId);\r\n } else {\r\n // Reset to top when menu item is deselected\r\n this.resetToTop();\r\n }\r\n }\r\n\r\n if (changes['navigationInfo'] && this.navigationInfo) {\r\n this.scrollToCategorySectionWithNavigationInfo(this.navigationInfo);\r\n }\r\n\r\n // Handle document list changes due to filtering\r\n if (changes['documentListResponse'] && !changes['documentListResponse'].firstChange) {\r\n this.handleDocumentListFilteringChange();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the component by setting up document list subscription.\r\n */\r\n ngOnInit(): void {\r\n this.setupDocumentListSubscription();\r\n }\r\n\r\n /**\r\n * Called after the view is initialized\r\n */\r\n ngAfterViewInit(): void {\r\n if (this.selectedMenuItemId) {\r\n setTimeout(() => {\r\n this.scrollToCategorySection(this.selectedMenuItemId!);\r\n }, 100);\r\n }\r\n this.documentScrollService.setupScrollListeners(this.documentCategoriesContainer.nativeElement);\r\n }\r\n\r\n /**\r\n * Handles the visibility of the sidebar.\r\n * @param {boolean} isVisible - Indicates whether the sidebar should be visible or not.\r\n * @memberof DocumentListComponent\r\n */\r\n handleOpenSideBar(isVisible: boolean): void {\r\n this.isSidebarVisible = isVisible;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Builds document categories from the API response\r\n */\r\n buildDocumentCategories(): void {\r\n const result = this.documentListService.buildDocumentCategories(this.documentListResponse);\r\n this.documentCategories = result.documentCategories;\r\n this.categoryTables = result.categoryTables;\r\n this.categoryCompletionCounts = result.categoryCompletionCounts;\r\n this.categorySeverities = result.categorySeverities;\r\n \r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n * Sets up subscription to document list response from store\r\n */\r\n setupDocumentListSubscription(): void {\r\n this.documentListSubscription.add(\r\n this.documentListService.setupDocumentListSubscription().subscribe({\r\n next: (response: any) => {\r\n this.documentListResponse = response;\r\n this.buildDocumentCategories();\r\n },\r\n error: (error: any) => {\r\n console.error(ERRORS.ERROR_FETCHING_DOCUMENTS, error);\r\n }\r\n })\r\n );\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handles table row click event\r\n */\r\n handleTableRowClick(rowData: any): void {\r\n this.isdialogVisible = SHARED.TRUE;\r\n this.selectedDocument = this.documentListService.handleTableRowClick(rowData);\r\n this.handleSelectedDocument.emit(this.selectedDocument);\r\n }\r\n\r\n /**\r\n * Handles the delete action from the table component\r\n * @param {any} rowData - The row data containing the document to delete\r\n */\r\n handleDeleteAction(rowData: any): void {\r\n this.documentListService.handleDeleteAction(rowData, this.contextId)\r\n .subscribe({\r\n next: (response) => {\r\n if (this.selectedDocument && this.selectedDocument._id === rowData._id) {\r\n this.handleCloseModal();\r\n }\r\n this.documentListService.refreshAllDataWithCurrentFilters(this.contextId);\r\n },\r\n error: (error) => {\r\n this.showDeleteErrorMessage(error);\r\n }\r\n });\r\n }\r\n\r\n // Document name editing methods moved to zoom controls component\r\n\r\n /**\r\n * Closes the document viewer dialog and resets the selected document\r\n */\r\n handleCloseModal(): void {\r\n this.isdialogVisible = SHARED.FALSE;\r\n this.selectedDocument = {} as DocumentListItem;\r\n this.fileName = SHARED.EMPTY;\r\n this.documentListService.refreshAllDataWithCurrentFilters(this.contextId);\r\n }\r\n\r\n /**\r\n * Refreshes the document list after a status update\r\n * @param {boolean} isDeleteAction - Optional flag indicating if this refresh is due to a delete action\r\n */\r\n refreshDocumentList(isDeleteAction: boolean = false): void {\r\n this.documentListService.refreshDocumentList(this.contextId);\r\n if (isDeleteAction) {\r\n this.deleteMessage = [{severity: SHARED.SUCCESS_SEVERITY, detail: SHARED.DOCUMENT_DELETED_SUCCESSFULLY}];\r\n setTimeout(() => {\r\n this.deleteMessage = SHARED.EMPTY_ARRAY;\r\n this.handleCloseModal();\r\n }, 2000);\r\n }\r\n }\r\n\r\n handleTableRowCtrlClick(rowData: any): void {\r\n this.selectedDocument = this.documentListService.handleTableRowClick(rowData);\r\n this.handleSelectedDocument.emit(this.selectedDocument);\r\n this.handleSelectedDocumentInNewTab.emit({\r\n selectedDocument: this.selectedDocument,\r\n contextId: this.contextId,\r\n documentList: this.documentList\r\n });\r\n }\r\n\r\n /**\r\n * Handles document status update events from viewer\r\n * @param event - The status update event\r\n */\r\n handleDocumentStatusUpdate(event: { actionType?: string }): void {\r\n if (event.actionType === SHARED.DELETE_ACTION) {\r\n // Delete success is now handled separately via handleDeleteSuccess()\r\n // Don't call refreshDocumentList here for delete actions\r\n } else if (event.actionType === SHARED.NAME_UPDATE_ACTION) {\r\n this.handleDocumentNameUpdate();\r\n } else {\r\n this.refreshDocumentList();\r\n }\r\n }\r\n\r\n /**\r\n * Shows delete error message for 2 seconds without closing dialog\r\n * @param error - The error object from the delete operation\r\n */\r\n private showDeleteErrorMessage(error: any): void {\r\n const errorMessage = error?.error?.message || error?.message || 'Failed to delete document. Please try again.';\r\n this.deleteMessage = [{severity: 'error', detail: errorMessage}];\r\n \r\n // Clear error message after 2 seconds\r\n setTimeout(() => {\r\n this.deleteMessage = SHARED.EMPTY_ARRAY;\r\n }, 2000);\r\n }\r\n\r\n /**\r\n * Handles delete error events from the document viewer\r\n * @param error - The error object from the delete operation\r\n */\r\n handleDeleteError(error: any): void {\r\n this.showDeleteErrorMessage(error);\r\n }\r\n\r\n /**\r\n * Handles delete success events from the document viewer\r\n */\r\n handleDeleteSuccess(): void {\r\n this.refreshDocumentList(true);\r\n }\r\n\r\n /**\r\n * Handles document name update event from viewer\r\n */\r\n handleDocumentNameUpdate(): void {\r\n this.documentListService.refreshAllDataWithCurrentFilters(this.contextId);\r\n }\r\n\r\n /**\r\n * Handles the event when the document viewer is destroyed\r\n * Triggers a refresh of the document data\r\n */\r\n handleViewerDestroyed(): void {\r\n this.documentListService.refreshDocumentList(this.contextId);\r\n }\r\n\r\n /**\r\n * Scrolls to the category section that matches the selected menu item\r\n * @param menuItemId - The ID of the selected menu item\r\n */\r\n scrollToCategorySection(menuItemId: string): void {\r\n if (!this.documentCategories || !this.documentCategoriesContainer) {\r\n return;\r\n }\r\n \r\n this.documentScrollService.setScrolling();\r\n let targetCategory = this.findCategoryByMenuItemId(menuItemId);\r\n if (!targetCategory) {\r\n targetCategory = this.findCategoryByLegacyMatching(menuItemId);\r\n }\r\n if (!targetCategory) {\r\n targetCategory = this.documentCategories[0];\r\n }\r\n\r\n if (targetCategory) {\r\n const categoryIndex = this.documentCategories.findIndex(cat => cat === targetCategory);\r\n const categoryElements = this.documentCategoriesContainer.nativeElement.querySelectorAll('.category');\r\n if (categoryElements[categoryIndex]) {\r\n categoryElements[categoryIndex].scrollIntoView({\r\n behavior: SHARED.SMOOTH_SCROLL,\r\n block: 'start',\r\n inline: 'nearest'\r\n });\r\n this.highlightCategory(categoryElements[categoryIndex]);\r\n this.documentScrollService.setupSectionObserver(categoryElements[categoryIndex], this.selectedMenuItemId!);\r\n this.documentScrollService.resetScrollingAfterDelay(1200);\r\n }\r\n } \r\n }\r\n\r\n /**\r\n * Finds category by converting menuItemId to readable format and matching exactly\r\n * @param menuItemId - The menu item ID to match\r\n * @returns The matching category or null\r\n */\r\n private findCategoryByMenuItemId(menuItemId: string): DocumentListResponse | null {\r\n const readableLabel = this.convertMenuItemIdToReadableLabel(menuItemId);\r\n let targetCategory = this.documentCategories.find(category => \r\n category.label.toLowerCase() === readableLabel.toLowerCase()\r\n );\r\n \r\n if (!targetCategory) {\r\n targetCategory = this.documentCategories.find(category => {\r\n const categoryLabel = category.label.toLowerCase();\r\n const menuLabel = readableLabel.toLowerCase();\r\n return categoryLabel.includes(menuLabel) && \r\n !this.isSubstringOfLongerCategory(menuLabel, categoryLabel);\r\n });\r\n }\r\n return targetCategory || null;\r\n }\r\n\r\n /**\r\n * Converts menuItemId to readable label format\r\n * @param menuItemId - The menu item ID\r\n * @returns Readable label\r\n */\r\n private convertMenuItemIdToReadableLabel(menuItemId: string): string {\r\n // Convert kebab-case or snake_case to Title Case\r\n return menuItemId\r\n .replace(/[-_]/g, ' ')\r\n .replace(/\\b\\w/g, l => l.toUpperCase());\r\n }\r\n\r\n /**\r\n * Checks if a menu label is a substring of a longer category name\r\n * @param menuLabel - The menu label to check\r\n * @param categoryLabel - The category label to check against\r\n * @returns True if menuLabel is a substring of a longer category\r\n */\r\n private isSubstringOfLongerCategory(menuLabel: string, categoryLabel: string): boolean {\r\n // If the category is significantly longer than the menu item, it's likely a substring\r\n return categoryLabel.length > menuLabel.length + 3; // Allow some tolerance\r\n }\r\n\r\n /**\r\n * Legacy matching for backward compatibility with existing hardcoded keywords\r\n * @param menuItemId - The menu item ID\r\n * @returns The matching category or null\r\n */\r\n private findCategoryByLegacyMatching(menuItemId: string): DocumentListResponse | null {\r\n // Legacy matching for specific hardcoded keywords\r\n if (menuItemId.includes(SHARED.APPLICATION_LOWERCASE)) {\r\n return this.documentCategories.find(cat => \r\n cat.label.toLowerCase().includes(SHARED.APPLICATION_LOWERCASE)\r\n ) || null;\r\n } else if (menuItemId.includes(SHARED.APPLICANT_LOWERCASE) || menuItemId.includes(SHARED.USER_LOWERCASE)) {\r\n return this.documentCategories.find(cat => \r\n cat.label.toLowerCase().includes(SHARED.APPLICANT_LOWERCASE) || \r\n cat.label.toLowerCase().includes(SHARED.USER_LOWERCASE)\r\n ) || null;\r\n }\r\n \r\n return null;\r\n }\r\n\r\n /**\r\n * Scrolls to the category section using navigationInfo\r\n * @param navigationInfo - The navigation info object containing menuItemId\r\n */\r\n scrollToCategorySectionWithNavigationInfo(navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n }): void {\r\n if (!this.documentCategories || !this.documentCategoriesContainer) {\r\n return;\r\n }\r\n \r\n // Set scrolling flag\r\n this.documentScrollService.setScrolling();\r\n const targetCategory = this.documentCategories.find(category => \r\n category.label.toLowerCase() === navigationInfo.menuItemLabel.toLowerCase()\r\n );\r\n if (targetCategory) {\r\n const sectionId = 'section-' + targetCategory.label.toLowerCase().replace(SHARED.EMPTY_SPACE, SHARED.HYPEN);\r\n let targetElement = this.documentCategoriesContainer.nativeElement.querySelector(`#${sectionId}`);\r\n if (targetElement) {\r\n targetElement.scrollIntoView({\r\n behavior: SHARED.SMOOTH_SCROLL,\r\n block: 'start',\r\n inline: 'nearest'\r\n });\r\n this.highlightCategory(targetElement);\r\n this.documentScrollService.setupSectionObserver(targetElement, this.selectedMenuItemId!);\r\n this.documentScrollService.resetScrollingAfterDelay(1200);\r\n } else {\r\n const categoryIndex = this.documentCategories.findIndex(cat => cat === targetCategory);\r\n const categoryElements = this.documentCategoriesContainer.nativeElement.querySelectorAll('.category');\r\n if (categoryElements[categoryIndex]) {\r\n categoryElements[categoryIndex].scrollIntoView({\r\n behavior: SHARED.SMOOTH_SCROLL,\r\n block: 'start',\r\n inline: 'nearest'\r\n });\r\n this.highlightCategory(categoryElements[categoryIndex]);\r\n \r\n // Setup observer to deselect menu item when section scrolls out of view\r\n this.documentScrollService.setupSectionObserver(categoryElements[categoryIndex], this.selectedMenuItemId!);\r\n \r\n // Reset scrolling flag after smooth scroll completes\r\n this.documentScrollService.resetScrollingAfterDelay(500);\r\n }\r\n }\r\n } \r\n }\r\n\r\n /**\r\n * Adds a temporary highlight effect to the scrolled category\r\n * @param categoryElement - The DOM element of the category to highlight\r\n */\r\n highlightCategory(categoryElement: HTMLElement): void {\r\n categoryElement.classList.add('category-highlight');\r\n setTimeout(() => {\r\n categoryElement.classList.remove('category-highlight');\r\n }, 2000);\r\n }\r\n\r\n /**\r\n * Alternative scrolling method using IntersectionObserver for better performance\r\n * This method can be used as a fallback or alternative to the current approach\r\n * @param navigationInfo - The navigation info object\r\n */\r\n scrollToCategorySectionWithIntersectionObserver(navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n }): void {\r\n if (!this.documentCategories || !this.documentCategoriesContainer) {\r\n return;\r\n }\r\n const targetCategory = this.documentCategories.find(category => \r\n category.label.toLowerCase() === navigationInfo.menuItemLabel.toLowerCase()\r\n );\r\n if (!targetCategory) {\r\n return;\r\n }\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting && entry.target.id === `section-${targetCategory.label.toLowerCase().replace(SHARED.EMPTY_SPACE, SHARED.HYPEN)}`) {\r\n entry.target.scrollIntoView({behavior: SHARED.SMOOTH_SCROLL as ScrollBehavior,block: 'start'});\r\n this.highlightCategory(entry.target as HTMLElement);\r\n observer.disconnect();\r\n this.documentScrollService.setupSectionObserver(entry.target, this.selectedMenuItemId!);\r\n }\r\n });\r\n }, {threshold: 0.1,rootMargin: '0px 0px -100px 0px'});\r\n const categoryElements = this.documentCategoriesContainer.nativeElement.querySelectorAll('.category');\r\n categoryElements.forEach((element: Element) => {\r\n observer.observe(element);\r\n });\r\n setTimeout(() => {\r\n observer.disconnect();\r\n this.scrollToCategorySectionWithNavigationInfo(navigationInfo);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Resets the document list to the top when menu item is deselected\r\n */\r\n private resetToTop(): void {\r\n if (this.documentCategoriesContainer) {\r\n this.documentCategoriesContainer.nativeElement.scrollTo({\r\n top: 0,\r\n behavior: SHARED.SMOOTH_SCROLL\r\n });\r\n }\r\n this.documentScrollService.disconnectSectionObserver();\r\n }\r\n\r\n /**\r\n * Handles changes in document list due to filtering\r\n * Checks if the selected menu item's section is still visible and deselects if not\r\n */\r\n private handleDocumentListFilteringChange(): void {\r\n if (this.selectedMenuItemId && this.documentCategories) {\r\n // If no categories are available (all filtered out), deselect the menu item\r\n if (this.documentCategories.length === 0) {\r\n this.deselectMenuItemAndReset();\r\n return;\r\n }\r\n \r\n // Use the document menu service to check visibility\r\n const isSectionVisible = this.documentMenuService.isMenuItemSectionVisible(\r\n this.selectedMenuItemId, \r\n this.documentListResponse\r\n );\r\n \r\n if (!isSectionVisible) {\r\n this.deselectMenuItemAndReset();\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Deselects the current menu item and resets the view\r\n */\r\n private deselectMenuItemAndReset(): void {\r\n this.selectedMenuItemId = null;\r\n this.documentStore.setSelectedMenuItem(null);\r\n this.resetToTop();\r\n }\r\n\r\n /**\r\n * Cleanup subscriptions on component destroy\r\n */\r\n ngOnDestroy(): void {\r\n this.documentListSubscription.unsubscribe();\r\n this.documentScrollService.disconnectSectionObserver();\r\n if (this.documentCategoriesContainer) {\r\n this.documentScrollService.cleanupScrollListeners(this.documentCategoriesContainer.nativeElement);\r\n }\r\n }\r\n}\r\n","<div class=\"document-viewer\">\r\n <p-dialog [(visible)]=\"isdialogVisible\" [modal]=\"true\" appendTo=\"body\" [style]=\"{ width: '100vw', height: '100vh', minHeight: '100vh' }\"\r\n class=\"w-full h-full document-dailog-wrapper\" [draggable]=\"false\" [closable]=\"true\" (onHide)=\"handleCloseModal()\">\r\n <p-messages [(value)]=\"deleteMessage\" [enableService]=\"false\" [closable]=\"false\" />\r\n \r\n <document-viewer [selectedDocument]=\"selectedDocument\" [documentList]=\"documentList\" [contextId]=\"contextId\" \r\n (documentStatusUpdated)=\"handleDocumentStatusUpdate($event)\"\r\n (viewerDestroyed)=\"handleViewerDestroyed()\"\r\n (deleteError)=\"handleDeleteError($event)\"\r\n (deleteSuccess)=\"handleDeleteSuccess()\">\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"w-full flex align-items-center justify-content-between\">\r\n <input type=\"text\" class=\"w-full border-none bg-white h-3rem file-input-wrapper\" pInputText\r\n [(ngModel)]=\"fileName\" />\r\n\r\n </div>\r\n </ng-template>\r\n <ng-content></ng-content>\r\n </document-viewer>\r\n </p-dialog>\r\n</div>\r\n\r\n<div class=\"document-categories-container\" #documentCategoriesContainer>\r\n <div class=\"category\" *ngFor=\"let category of documentCategories; let i = index\"\r\n [id]=\"categoryIds[i]\">\r\n <div class=\"category-header\" *ngIf=\"documentCategories[i]?.list?.length\">\r\n <div class=\"category-title\" *ngIf=\"formattedCategoryLabels[i] || category.categoryDescription\">\r\n <h3 *ngIf=\"formattedCategoryLabels[i]\">{{ formattedCategoryLabels[i] }}</h3>\r\n <p class=\"category-description\" *ngIf=\"category.categoryDescription\">{{ category.categoryDescription }}</p>\r\n </div>\r\n <div class=\"completion-status\">\r\n <p-badge \r\n [severity]=\"categorySeverities[i]\" \r\n [value]=\"(((categoryCompletionCounts && categoryCompletionCounts[i]) || 0) + ' Complete')\"\r\n class=\"completion-badge\">\r\n </p-badge>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-container\">\r\n <lib-table-primary [tableData]=\"categoryTables[i]\" [tableStyle]=\"{ 'min-width': '100%' }\"\r\n (rowClick)=\"handleTableRowClick($event)\" (deleteAction)=\"handleDeleteAction($event)\" (rowCtrlClick)=\"handleTableRowCtrlClick($event)\" >\r\n </lib-table-primary>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, OnInit, OnDestroy, OnChanges, SimpleChanges, ViewChild, ElementRef, EventEmitter, Output } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentService } from '../../state/document.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { ERRORS } from '../../../../Shared/constant/ERROR';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { StatusDataModel } from '../../models/status-data.model';\r\nimport { DocumentListResponse } from '../../models/document-list-response.model';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { DocumentMenuService } from '../../services/document-menu.service';\r\n\r\n/**\r\n *This component is responsible for managing and displaying a list of documents.\r\n * @class DocumentContainerComponent\r\n * @typedef {DocumentContainerComponent}\r\n */\r\n@Component({\r\n selector: 'lib-document-container',\r\n standalone: false,\r\n templateUrl: './document-container.component.html',\r\n styleUrl: './document-container.component.scss'\r\n})\r\nexport class DocumentContainerComponent implements OnInit, OnDestroy, OnChanges {\r\n /**\r\n * The document list response data\r\n * @type {DocumentListResponse[] | null}\r\n */\r\n documentListResponse: DocumentListResponse[] | null = null;\r\n\r\n /**\r\n * Status data for the current selection\r\n * @type {StatusDataModel[]}\r\n */\r\n statusData: StatusDataModel[] = []\r\n\r\n /**\r\n * The currently selected menu item ID for scrolling\r\n */\r\n selectedMenuItemId: string | null = null;\r\n\r\n @Input() onOpenInNewTab?: (event: { selectedDocument: any, contextId: string, documentList: any[] }) => void;\r\n /**\r\n * Additional navigation information for better scrolling\r\n */\r\n navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n } | null = null;\r\n\r\n /**\r\n * Reference to the content scroll container\r\n */\r\n @ViewChild('contentScrollContainer', { static: false }) contentScrollContainer!: ElementRef;\r\n\r\n @Output() selectedDocument: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() selectedDocumentInNewTab: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n /**\r\n * Subscription to track selected menu item changes\r\n */\r\n private selectedMenuItemSubscription: Subscription = new Subscription();\r\n\r\n /**\r\n * Creates an instance of DocumentContainerComponent.\r\n * @param {DocumentHttpService} documentHttpService - Service for HTTP operations\r\n * @param {DocumentHelperService} documentHelperService - Service for document operations\r\n * @param {DocumentQuery} documentQuery - Query service for document state\r\n * @param {DocumentStore} documentStore - Store service for document state\r\n * @param {DocumentMenuService} documentMenuService - Service for menu operations\r\n */\r\n constructor(\r\n private documentHttpService: DocumentHttpService,\r\n private documentHelperService: DocumentHelperService,\r\n private documentQuery: DocumentQuery,\r\n private documentStore: DocumentStore,\r\n private documentMenuService: DocumentMenuService\r\n ) {}\r\n /**\r\n * Get contextId in input.\r\n * @type {string}\r\n */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n \r\n \r\n /**\r\n * The list of folders.\r\n * @type {Array}\r\n */\r\n applicationNumber: string = SHARED.EMPTY\r\n catagories: DocumentCategory[] = SHARED.EMPTY_ARRAY\r\n userList: UserListModel[] = SHARED.EMPTY_ARRAY\r\n \r\n\r\n /**\r\n * Holds the subscription to manage observable cleanup.\r\n * @type {Subscription}\r\n */\r\n subscription: Subscription = new Subscription();\r\n\r\n /**\r\n * Handles changes to input properties\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.CONTEXT_ID] && !changes[SHARED.CONTEXT_ID].firstChange) {\r\n this.handleContextIdChange();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the component\r\n */\r\n ngOnInit(): void {\r\n this.clearAllState();\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.initializeData();\r\n }\r\n this.setupSelectedMenuItemSubscription();\r\n }\r\n\r\n /**\r\n * Sets up subscription to track selected menu item changes\r\n */\r\n setupSelectedMenuItemSubscription(): void {\r\n this.selectedMenuItemSubscription.add(\r\n this.documentQuery.selectSelectedMenuItem().subscribe(menuItemId => {\r\n this.selectedMenuItemId = menuItemId;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Handles menu item selection events from the documents menu\r\n * @param event - The menu item selection event\r\n */\r\n onMenuItemSelected(event: {\r\n item: any;\r\n category: any;\r\n navigationInfo?: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n };\r\n }): void {\r\n if (event && event.navigationInfo) {\r\n this.navigationInfo = event.navigationInfo;\r\n // Don't set selectedMenuItemId here - let the store subscription handle it\r\n } else {\r\n this.navigationInfo = null;\r\n // Don't set selectedMenuItemId here - let the store subscription handle it\r\n this.resetContentScrollToTop();\r\n }\r\n }\r\n\r\n /**\r\n * Resets the content scroll container to the top\r\n */\r\n private resetContentScrollToTop(): void {\r\n if (this.contentScrollContainer) {\r\n this.contentScrollContainer.nativeElement.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Initialize all data with proper sequencing to avoid duplicate API calls\r\n */\r\n initializeData(): void {\r\n this.fetchDocumentCatagories();\r\n this.fetchUserListWithFilters();\r\n this.setupStatusDataSubscriptions();\r\n this.setupFilteredDocumentSubscription();\r\n this.documentHelperService.initializeSelectionWatcherWithInitialLoad(this.contextId);\r\n }\r\n\r\n /**\r\n * Clears all state (store and component) comprehensively\r\n */\r\n clearAllState(): void {\r\n this.documentStore.clearSelectionState();\r\n // Don't clear document viewer state - let the viewer handle its own cleanup\r\n this.documentStore.setDocumentListResponse(null);\r\n this.documentStore.setDocumentList([]); \r\n this.documentStore.setDocumentCategories([]);\r\n this.documentStore.setUserList([]);\r\n this.documentStore.setStatusData([]);\r\n this.documentStore.setCurrentDocument(null); \r\n this.documentStore.setFolders([]);\r\n this.documentStore.setDocumentAlert(null);\r\n this.catagories = SHARED.EMPTY_ARRAY;\r\n this.userList = SHARED.EMPTY_ARRAY;\r\n this.statusData = [];\r\n this.documentListResponse = null;\r\n this.applicationNumber = SHARED.EMPTY;\r\n this.selectedMenuItemId = null;\r\n this.navigationInfo = null;\r\n }\r\n\r\n /**\r\n * Handles contextId change by clearing all state and refetching data\r\n */\r\n handleContextIdChange(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.subscription.unsubscribe();\r\n this.subscription = new Subscription();\r\n this.documentHelperService.cleanupSelectionWatcher();\r\n this.clearAllState();\r\n this.initializeData();\r\n }\r\n }\r\n\r\n /**\r\n * Sets up subscriptions to monitor menu item and user selection changes\r\n * to trigger status data fetching and user list refreshing\r\n */\r\n setupStatusDataSubscriptions(): void {\r\n \r\n this.subscription.add(\r\n this.documentQuery.selectSelectedUserId().subscribe(userId => {\r\n this.fetchStatusData();\r\n if (this.catagories.length > 0) {\r\n this.fetchUserListWithFilters();\r\n }\r\n })\r\n );\r\n this.subscription.add(\r\n this.documentQuery.selectSelectedStatus().subscribe(status => {\r\n this.fetchStatusData();\r\n if (this.catagories.length > 0) {\r\n this.fetchUserListWithFilters();\r\n }\r\n })\r\n );\r\n this.fetchStatusData();\r\n }\r\n\r\n onDocumentSelectedInNewTab(event: { selectedDocument: any; contextId: string; documentList: any[] }): void {\r\n // Call callback first if provided (preserves user gesture chain)\r\n if (this.onOpenInNewTab && typeof this.onOpenInNewTab === 'function') {\r\n this.onOpenInNewTab(event);\r\n }\r\n this.selectedDocumentInNewTab.emit(event);\r\n }\r\n /**\r\n * Fetches status data based on current selections\r\n */\r\n fetchStatusData(): void {\r\n if (!this.contextId) {\r\n console.warn(ERRORS.CONTEXT_ID_REQUIRED);\r\n return;\r\n }\r\n\r\n const currentState = this.documentQuery.getSelectionState();\r\n const contextId = currentState.userId || null;\r\n this.documentHttpService.getStatusDocumentCount(this.contextId, contextId, null).subscribe({\r\n next: (statusData) => {\r\n this.statusData = statusData;\r\n this.documentStore.setStatusData(statusData);\r\n },\r\n error: (error) => {\r\n console.error(ERRORS.ERROR_FETCHING_STATUS_DATA, error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Fetches userlist data with current filters applied\r\n */\r\n fetchUserListWithFilters(): void {\r\n if (!this.contextId) {\r\n console.warn(ERRORS.CONTEXT_ID_REQUIRED);\r\n return;\r\n }\r\n\r\n const currentState = this.documentQuery.getSelectionState();\r\n // If the API supports filtering by menu item or status, we can add those parameters\r\n this.documentHttpService.getUserListByContextId(this.contextId).subscribe({\r\n next: (res: UserListModel[]) => {\r\n this.userList = res;\r\n this.documentStore.setUserList(res);\r\n },\r\n error: (err: any) => {\r\n console.error(ERRORS.ERROR_FETCHING_USER_LIST, err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Fetches document catagory data.\r\n */\r\n fetchDocumentCatagories(): void {\r\n const categoriesSubscription = this.documentHttpService.getDocumentCatagories(this.contextId).subscribe({\r\n next: (categories: any) => {\r\n if (categories) {\r\n this.catagories = categories.categories;\r\n this.applicationNumber = categories.applicationNumber;\r\n this.documentStore.setDocumentCategories(categories.categories);\r\n\r\n }\r\n },\r\n error: (err: any) => {\r\n console.error(ERRORS.ERROR_FETCHING_DOCUMENT_CATEGORIES, err);\r\n }\r\n });\r\n this.subscription.add(categoriesSubscription);\r\n }\r\n \r\n /**\r\n * Refetches all data when contextId changes\r\n */\r\n refetchAllDataForNewContext(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.documentStore.clearSelectionState();\r\n this.documentStore.clearDocumentViewerState();\r\n this.fetchDocumentCatagories();\r\n this.fetchUserListWithFilters();\r\n this.fetchStatusData();\r\n this.documentHelperService.initializeSelectionWatcherWithInitialLoad(this.contextId);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up subscription to listen for filtered document responses\r\n */\r\n setupFilteredDocumentSubscription(): void {\r\n this.subscription.add(\r\n this.documentQuery.selectDocumentListResponse().subscribe({\r\n next: (response: any) => {\r\n this.documentListResponse = response;\r\n },\r\n error: (error: any) => {\r\n console.error(ERRORS.ERROR_RECEIVING_DOCUMENT_LIST, error);\r\n }\r\n })\r\n );\r\n }\r\n\r\n onDocumentSelected(document: any): void {\r\n console.log('Document selected:', document);\r\n this.selectedDocument.emit(document);\r\n }\r\n\r\n /** \r\n * Unsubscribe subscription on destroy of component and clean up state.\r\n */\r\n ngOnDestroy(): void {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n if (this.selectedMenuItemSubscription) {\r\n this.selectedMenuItemSubscription.unsubscribe();\r\n }\r\n this.documentHelperService.cleanupSelectionWatcher();\r\n this.clearAllState();\r\n }\r\n}\r\n","<div class=\"grid m-0 h-full\">\r\n <!-- <div class=\"menu-panel col-12 md:col-2\">\r\n <lib-documents-menu \r\n [catagories]=\"catagories\" \r\n [applicationNumber]=\"applicationNumber\" \r\n [contextId]=\"contextId\"\r\n (menuItemSelected)=\"onMenuItemSelected($event)\">\r\n </lib-documents-menu>\r\n </div> -->\r\n \r\n <div class=\"col-12 md:col-12 p-0 h-full\" #contentScrollContainer>\r\n <div class=\"content-card\">\r\n <lib-folder-container [contextId]=\"contextId\" [userList]=\"userList\" [statusData]=\"statusData\" [categories]=\"catagories\"></lib-folder-container>\r\n </div>\r\n <div class=\"document-list-container\">\r\n <lib-document-list \r\n [contextId]=\"contextId\" \r\n [documentListResponse]=\"documentListResponse\"\r\n [selectedMenuItemId]=\"selectedMenuItemId\"\r\n [navigationInfo]=\"navigationInfo\"\r\n (handleSelectedDocumentInNewTab)=\"onDocumentSelectedInNewTab($event)\"\r\n (handleSelectedDocument)=\"onDocumentSelected($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </lib-document-list>\r\n </div>\r\n </div>\r\n <p-confirmDialog \r\n [style]=\"{width: '25vw'}\" \r\n acceptLabel=\"Yes\"\r\n rejectLabel=\"No\"\r\n appendTo=\"body\"\r\n acceptIcon=\"pi pi-check\"\r\n rejectIcon=\"pi pi-times\">\r\n </p-confirmDialog>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { FolderBlockModel } from '../../models/folder.model';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\n\r\n/**\r\n * The `FolderBlockComponent` is responsible for displaying a block of folders and\r\n * providing filtering functionality based on folder IDs.\r\n *\r\n * It uses data from the `DocumentStore` and constants from the `SHARED` configuration \r\n * to display missing and pending file counts.\r\n */\r\n@Component({\r\n selector: 'lib-folder-block',\r\n standalone: false,\r\n templateUrl: './folder-block.component.html',\r\n styleUrl: './folder-block.component.scss'\r\n})\r\nexport class FolderBlockComponent {\r\n /**\r\n * Array of folder blocks data to display.\r\n * Each folder is represented as a `FolderBlockModel`.\r\n */\r\n @Input() folderList : FolderBlockModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Number of missing files, sourced from the `SHARED` constants. */\r\n missingFileCount = SHARED.MISSINGCOUNT;\r\n\r\n /** Number of pending files, sourced from the `SHARED` constants. */\r\n pendingFileCount = SHARED.PENDINGCOUNT;\r\n\r\n /**\r\n * Injects the `DocumentStore` service to manage and access document-related state.\r\n * @param {DocumentStore} documentStore - The state management store for documents.\r\n */\r\n constructor(public documentStore: DocumentStore) {}\r\n\r\n /**\r\n * Handles the click event for filtering based on the provided folder ID.\r\n * This method validates the folder ID and returns it for further processing. \r\n * If the folder ID is not provided, an empty string is returned.\r\n * @param {string} folderBlockId - The unique identifier of the folder to filter by.\r\n * @returns {string} The validated folder ID, or an empty string if the input is invalid.\r\n */\r\n handleClickForFilter(folderBlockId: string): string {\r\n if (!folderBlockId) {\r\n return SHARED.EMPTY;\r\n }\r\n this.documentStore.setParentDocumentTypeId(folderBlockId);\r\n return folderBlockId;\r\n }\r\n \r\n}\r\n","<div class=\"card p-0 folder-info\">\r\n <div class=\"text-900 text-xl font-semibold ml-2 mb-1\">Folders</div>\r\n <div class=\"grid m-0\">\r\n <div *ngFor=\"let folder of folderList\" class=\"col-12 md:col-6 xl:col-4 container-wrapper\">\r\n <div\r\n class=\"p-3 border-1 h-full surface-border flex flex-column justify-content-between hover:surface-100 cursor-pointer border-round\"\r\n (click)=\"handleClickForFilter(folder._id)\"\r\n >\r\n <div class=\"icon\">\r\n <img src=\"../../../../assets/images/FolderImg.png\" alt=\"\" />\r\n </div>\r\n <div class=\"flex flex-column\">\r\n <span class=\"text-600 mt-2\"> {{ folder.documentCount }} Files </span>\r\n <span class=\"text-900 text-lg mt-2 mb-2 font-semibold font-medium\">\r\n {{ folder.folderName }}\r\n </span>\r\n </div>\r\n <hr />\r\n <div class=\"flex justify-content-between\">\r\n <div class=\"flex flex-column\">\r\n <span>Missing</span>\r\n <span\r\n [ngClass]=\"{\r\n 'text-pink-500': missingFileCount > 0,\r\n 'text-green-500': missingFileCount === 0\r\n }\"\r\n >\r\n {{ missingFileCount }}\r\n </span>\r\n </div>\r\n <div class=\"flex flex-column\">\r\n <span>Pending</span>\r\n <span\r\n [ngClass]=\"{\r\n 'text-yellow-500': pendingFileCount > 0,\r\n 'text-green-500': pendingFileCount === 0\r\n }\"\r\n >\r\n {{ pendingFileCount }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { DocumentModel } from '../../models/document.model';\r\n\r\n/**\r\n * DocumentListItemComponent\r\n *\r\n * This component displays individual document items within a list. \r\n * It accepts a list of documents as input and handles interactions with documents.\r\n */\r\n@Component({\r\n selector: 'lib-document-list-item',\r\n standalone: false,\r\n templateUrl: './document-list-item.component.html',\r\n styleUrls: ['./document-list-item.component.scss']\r\n})\r\nexport class DocumentListItemComponent {\r\n /**\r\n * Emit the selected document.\r\n * @type {EventEmitter<DocumentModel>}\r\n */\r\n @Output() documentClick = new EventEmitter<DocumentModel>();\r\n \r\n /**\r\n * The document to display.\r\n * @type {DocumentModel[]}\r\n */\r\n @Input() document!: DocumentModel;\r\n\r\n /**\r\n * Handles interactions with a document.\r\n * @param {DocumentModel} document - The document to be opened or interacted with.\r\n */\r\n handleOpenDocument(document: DocumentModel): void {\r\n if (!document) {\r\n console.error('Error: Document is null or undefined:', document);\r\n return;\r\n }\r\n this.documentClick.emit(document);\r\n }\r\n}\r\n","<div class=\"grid m-0\">\r\n <div\r\n class=\"col-12 flex align-items-center justify-content-between md:col-12 xl:col-12\"\r\n >\r\n <div\r\n class=\"col-5 flex cursor-pointer align-items-center pl-0\"\r\n (click)=\"handleOpenDocument(document)\"\r\n >\r\n <img src=\"../../../../assets/images/Frame.png\" alt=\"\" />\r\n <span class=\"ml-4 file-name-wrapper document-text-wrapper\">{{ document.fileName }}</span>\r\n </div>\r\n <div class=\"col-4 flex align-items-center justify-content-center\">\r\n <span\r\n [class]=\"'product-badge status-' + document.status?.toLowerCase()\"\r\n class=\"flex align-items-center justify-content-center pl-2 pr-2 pt-1 pb-1\"\r\n >\r\n <ng-container *ngIf=\"document.status?.toLowerCase() === 'pending'\">\r\n <i class=\"pi pi-clock pr-1\" style=\"font-size: 12px;\"></i>\r\n Pending\r\n </ng-container>\r\n <ng-container *ngIf=\"document.status?.toLowerCase() === 'verified'\">\r\n <i class=\"pi pi-check-circle pr-1\" style=\"font-size: 12px;\"></i>\r\n Verified\r\n </ng-container>\r\n <ng-container *ngIf=\"document.status?.toLowerCase() === 'alert'\">\r\n <i class=\"pi pi-bell pr-1\" style=\"font-size: 12px;\"></i>\r\n Alert\r\n </ng-container>\r\n </span>\r\n </div>\r\n <div class=\"document-type file-name-wrapper document-text-wrapper\">\r\n {{document.documentTypeName}}\r\n </div>\r\n </div>\r\n </div>\r\n ","import { ErrorHandler, Injectable, Injector } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\n\r\n/**\r\n * GlobalErrorHandler is a custom error handler that implements the ErrorHandler interface.\r\n * It is used to handle both HTTP errors and other types of errors globally in the application.\r\n * @class\r\n * @implements {ErrorHandler}\r\n * @decorator {Injectable}\r\n */\r\n@Injectable()\r\nexport class GlobalErrorHandler implements ErrorHandler {\r\n /**\r\n * Creates an instance of GlobalErrorHandler.\r\n * @constructor\r\n * @param {Injector} injector - The Angular injector used to get instances of services.\r\n */\r\n constructor(private injector: Injector) { }\r\n\r\n /**\r\n * Handles errors globally in the application.\r\n * \r\n * @param {any} error - The error object that needs to be handled.\r\n * @returns {void}\r\n */\r\n handleError(error: any): void {\r\n console.error('GlobalErrorHandler:', error);\r\n }\r\n}\r\n","import { Directive, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\nimport { DocumentModel } from \"../models/document.model\";\r\nimport { DocumentHelperService } from \"../services/document.service\";\r\n\r\n/**\r\n * Directive to display the document data\r\n */\r\n@Directive({\r\n selector: '[doc]',\r\n standalone: false\r\n})\r\nexport class DocumentDirective {\r\n\r\n /**\r\n * Creates an instance of DocumentDirective.\r\n * @param documentService Service to get the document data.\r\n * @param templateRef Reference to the template.\r\n * @param vcr View container reference to manage the view.\r\n */\r\n constructor(\r\n private documentService: DocumentHelperService,\r\n private templateRef: TemplateRef<any>,\r\n private vcr: ViewContainerRef\r\n ) {\r\n this.documentService.get().subscribe((document: DocumentModel | null) => {\r\n this.vcr.clear();\r\n if (document) {\r\n this.vcr.createEmbeddedView(this.templateRef, { $implicit: document });\r\n }\r\n });\r\n }\r\n}","import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\n/**\r\n * Description placeholder\r\n * @class LinkedDocumentComponent\r\n * @typedef {LinkedDocumentComponent}\r\n * @implements {OnChanges}\r\n */\r\n@Component({\r\n selector: 'app-linked-document',\r\n templateUrl: './linked-document.component.html',\r\n styleUrl: './linked-document.component.scss',\r\n standalone : false\r\n})\r\nexport class LinkedDocumentComponent {\r\n /**\r\n * Selected document for view.\r\n * @type {?DocumentModel}\r\n */\r\n @Input() selectedDocument?: DocumentListItem;\r\n /**\r\n * Whole document list.\r\n * @type {?DocumentModel[]}\r\n */\r\n @Input() documentList?: DocumentListItem[];\r\n /**\r\n * Changed selected document.\r\n * @type {*}\r\n */\r\n @Output() selectedDocumentChange = new EventEmitter<DocumentListItem>();\r\n\r\n /**\r\n * Filtered documents.\r\n * @type {DocumentModel[]}\r\n */\r\n filteredDocuments: DocumentModel[] = [];\r\n\r\n /**\r\n * Handle the click on the document.\r\n * @param {DocumentModel} document - Clicked document.\r\n */\r\n handleDocumentClick(document: DocumentListItem): void {\r\n this.selectedDocument = document;\r\n this.selectedDocumentChange.emit(this.selectedDocument);\r\n }\r\n\r\n}\r\n","<div class=\"summary-card mb-4 pb-1\">\r\n <div class=\"card p-0 mb-0\"\r\n style=\"border-bottom: 1px solid;border-color: rgba(68, 72, 109, 0.2); border-bottom-right-radius: 0px;border-bottom-left-radius: 0px; background-color: #F9fafb;\">\r\n <div class=\"p-0\">\r\n <h4 class=\"m-0 pt-3 pl-3 mb-3\" style=\"font-size: 21px; font-weight: bold; \">Linked Documents</h4>\r\n </div>\r\n </div>\r\n <div class=\"card mb-0\" style=\"border-top-right-radius: 0px;border-top-left-radius: 0px;\">\r\n @for(document of documentList; track document){\r\n <div class=\"linkedDocument documentName m-2\">\r\n <div class=\"documentName\" [class.selected]=\"document._id === selectedDocument?._id\"\r\n (click)=\"handleDocumentClick(document)\">\r\n <span class=\"pi pi-link\"></span>\r\n {{document.fileName}}\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n \r\n \r\n </div>\r\n ","import { Component, Input, OnInit, OnChanges, SimpleChanges, Output, EventEmitter, OnDestroy } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { DocumentCategory, DocumentCategoryItem } from '../../models/document-category.model';\r\nimport { DocumentMenuService } from '../../services/document-menu.service';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\n\r\ninterface MenuItemData {\r\n totalDocuments: number;\r\n approvedDocuments: number;\r\n badgeValue: string;\r\n badgeSeverity: 'success' | 'info' | 'warning' | 'danger';\r\n shouldShowBadge: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-documents-menu',\r\n standalone: false,\r\n templateUrl: './documents-menu.component.html',\r\n styleUrl: './documents-menu.component.scss'\r\n})\r\nexport class DocumentsMenuComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() catagories: DocumentCategory[] = SHARED.EMPTY_ARRAY\r\n @Input() applicationNumber : string = SHARED.EMPTY\r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Output() menuItemSelected = new EventEmitter<{\r\n item: DocumentCategoryItem; \r\n category: DocumentCategory;\r\n navigationInfo?: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n };\r\n }>();\r\n \r\n selectedMenuItem: string | null = null;\r\n selectedMenuItemId: string | null = null;\r\n\r\n // Store the categories from the store\r\n private storeCategories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n \r\n // Cache for categories to avoid repeated processing\r\n private _cachedCategories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n\r\n // Subscriptions to track for cleanup\r\n private selectedMenuItemSubscription!: Subscription;\r\n private documentCategoriesSubscription!: Subscription;\r\n private documentListResponseSubscription!: Subscription;\r\n\r\n constructor(\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery,\r\n private documentMenuService: DocumentMenuService,\r\n private documentHelperService: DocumentHelperService\r\n ) {}\r\n\r\n /**\r\n * Initialize the component\r\n * @returns {void}\r\n * @memberof DocumentsMenuComponent\r\n */\r\n ngOnInit(): void {\r\n this.selectedMenuItemSubscription = this.documentQuery.selectSelectedMenuItem().subscribe(menuItemId => {\r\n this.selectedMenuItemId = menuItemId;\r\n this.selectedMenuItem = this.findMenuItemLabelById(menuItemId);\r\n });\r\n\r\n // Subscribe to document categories from the store\r\n this.documentCategoriesSubscription = this.documentQuery.selectDocumentCategories().subscribe(categories => {\r\n if (categories && categories.length > 0) {\r\n this.storeCategories = categories;\r\n this.updateCachedCategories();\r\n this.updateMenuItemsData();\r\n }\r\n });\r\n\r\n // Subscribe to document list response to update menu item selectability\r\n this.setupDocumentListResponseSubscription();\r\n }\r\n\r\n /**\r\n * Handle changes to input properties\r\n * @param {SimpleChanges} changes - The changes to the input properties\r\n * @returns {void}\r\n * @memberof DocumentsMenuComponent\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.CATAGORIES] && this.catagories) {\r\n this.updateCachedCategories();\r\n this.updateMenuItemsData();\r\n }\r\n \r\n if (changes[SHARED.CONTEXT_ID] && !changes[SHARED.CONTEXT_ID].firstChange) {\r\n this.handleContextIdChange();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the categories to use for the menu\r\n * Priority: Store categories > Input categories\r\n * Categories maintain their original order as provided by the API\r\n */\r\n get categories(): DocumentCategory[] {\r\n return this._cachedCategories;\r\n }\r\n\r\n /**\r\n * Updates the cached categories when data changes\r\n * Maintains the original order as provided by the API\r\n */\r\n private updateCachedCategories(): void {\r\n const nextCategories = this.storeCategories.length > 0 ? this.storeCategories : this.catagories;\r\n if (!this._cachedCategories || this._cachedCategories.length === 0) {\r\n this._cachedCategories = nextCategories;\r\n return;\r\n }\r\n const previousById = new Map<string, boolean>();\r\n this._cachedCategories.forEach(category => {\r\n category.items?.forEach(item => {\r\n if ((item as any).isSelectable !== undefined) {\r\n previousById.set(item._id, (item as any).isSelectable);\r\n }\r\n });\r\n });\r\n\r\n this._cachedCategories = nextCategories.map(category => ({\r\n ...category,\r\n items: category.items?.map(item => ({\r\n ...item,\r\n isSelectable: previousById.has(item._id) ? previousById.get(item._id)! : (item as any).isSelectable\r\n }))\r\n }));\r\n }\r\n\r\n /**\r\n * Finds the label of a menu item by its _id\r\n * @param id The _id to search for\r\n * @returns The label of the menu item or null if not found\r\n */\r\n private findMenuItemLabelById(id: string | null): string | null {\r\n if (!id) return null;\r\n \r\n for (const category of this.categories) {\r\n if (category.items) {\r\n const item = category.items.find(item => item._id === id);\r\n if (item) {\r\n return item.label;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Finds the category for a menu item by its _id\r\n * @param id The _id to search for\r\n * @returns The category or null if not found\r\n */\r\n private findMenuItemCategoryById(id: string | null): DocumentCategory | null {\r\n if (!id) return null;\r\n \r\n for (const category of this.categories) {\r\n if (category.items) {\r\n const item = category.items.find(item => item._id === id);\r\n if (item) {\r\n return category;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n \r\n /**\r\n * Update menu use catagories\r\n */\r\n private updateMenuItemsData(): void {\r\n this.updateCachedCategories();\r\n \r\n this._cachedCategories.forEach(category => {\r\n if (category.items) {\r\n category.items.forEach(item => {\r\n const menuData = {\r\n totalDocuments: this.documentMenuService.getTotalDocuments(item),\r\n approvedDocuments: this.documentMenuService.getApprovedDocuments(item),\r\n badgeValue: this.documentMenuService.getBadgeValue(item),\r\n badgeSeverity: this.documentMenuService.getBadgeSeverity(item),\r\n shouldShowBadge: this.documentMenuService.shouldShowBadge(item)\r\n };\r\n (item as any).menuData = menuData;\r\n \r\n // Initialize isSelectable as true (default state)\r\n if (item.isSelectable === undefined) {\r\n item.isSelectable = true;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets up subscription to document list response to update menu item selectability\r\n */\r\n private setupDocumentListResponseSubscription(): void {\r\n this.documentListResponseSubscription = this.documentQuery.selectDocumentListResponse().subscribe(documentListResponse => {\r\n this.updateMenuItemsSelectability(documentListResponse);\r\n });\r\n }\r\n\r\n /**\r\n * Updates menu items with selectability status based on filtered document list\r\n * @param documentListResponse - The filtered document list response\r\n */\r\n private updateMenuItemsSelectability(documentListResponse: any): void {\r\n if (this._cachedCategories && this._cachedCategories.length > 0) {\r\n // Only update if we have a valid response (not null/undefined)\r\n // If response is null, keep previous selectability to avoid flicker/reset during refresh\r\n if (documentListResponse !== null && documentListResponse !== undefined) {\r\n this._cachedCategories = this.documentMenuService.updateMenuItemsWithSelectabilityStatus(\r\n this._cachedCategories, \r\n documentListResponse\r\n );\r\n } else {\r\n // Do nothing; preserve existing isSelectable values\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Handle the menu item click for navigation\r\n * @param {*} event - Event \r\n * @param {DocumentCategoryItem} item - catagory item\r\n */\r\n onMenuItemClick(event: any, item: DocumentCategoryItem): void {\r\n // Prevent selection if the menu item is not selectable\r\n if (item.isSelectable === false) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n if (this.selectedMenuItemId === item._id) {\r\n this.selectedMenuItem = null;\r\n this.selectedMenuItemId = null;\r\n this.documentStore.setSelectedMenuItem(null);\r\n this.menuItemSelected.emit({\r\n item: item, \r\n category: this.findMenuItemCategoryById(item._id)!,\r\n navigationInfo: undefined\r\n });\r\n } else {\r\n this.selectedMenuItem = item.label;\r\n this.selectedMenuItemId = item._id;\r\n this.documentStore.setSelectedMenuItem(item._id);\r\n const category = this.findMenuItemCategoryById(item._id);\r\n if (category) {\r\n this.menuItemSelected.emit({\r\n item: item, \r\n category: category,\r\n navigationInfo: {\r\n menuItemId: item._id,\r\n menuItemLabel: item.label,\r\n categoryLabel: category.label,\r\n categoryIndex: this.categories.findIndex(cat => cat === category)\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Get the selected menu item\r\n * @returns {string | null} - The selected menu item\r\n */\r\n getSelectedMenuItem(): string | null {\r\n return this.selectedMenuItem;\r\n }\r\n\r\n /**\r\n * Handles contextId changes by clearing current selection\r\n */\r\n private handleContextIdChange(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.selectedMenuItem = null;\r\n this.selectedMenuItemId = null;\r\n this.documentStore.setSelectedMenuItem(null);\r\n }\r\n }\r\n\r\n /**\r\n * Get the selected menu item id\r\n * @returns {string | null} - The selected menu item id\r\n */\r\n getSelectedMenuItemId(): string | null {\r\n return this.selectedMenuItemId;\r\n }\r\n\r\n /**\r\n * Clean up subscriptions when component is destroyed\r\n * Prevents memory leaks and ensures proper cleanup\r\n */\r\n ngOnDestroy(): void {\r\n if (this.selectedMenuItemSubscription) {\r\n this.selectedMenuItemSubscription.unsubscribe();\r\n }\r\n if (this.documentCategoriesSubscription) {\r\n this.documentCategoriesSubscription.unsubscribe();\r\n }\r\n if (this.documentListResponseSubscription) {\r\n this.documentListResponseSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<div class=\"document-sidebar-container\">\r\n <!-- Menu items are now used for navigation to specific sections, not for filtering documents -->\r\n <p-card class=\"widget-menu-wrapper h-full\">\r\n @if(applicationNumber){\r\n <div class=\"flex align-items-center justify-content-between widget-menu-header-wrapper\">\r\n <p class=\"mb-0 application-title-wrapper\">ID - {{applicationNumber}}</p>\r\n <div class=\"expand-icon-wrapper\">\r\n <i class=\"ri-arrow-left-s-line text-primary flex align-items-center justify-content-center w-full h-full\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"widget-menu-container\" >\r\n <div class=\"widget-menu-wrapper h-ful l custom-scroll\">\r\n <p-menu [model]=\"categories\" styleClass=\"w-full md:w-15rem\">\r\n <ng-template pTemplate=\"submenuheader\" let-item>\r\n <span [style]=\"{\r\n color : '#9EA0B3'\r\n }\">{{ item.label }} Documents</span>\r\n </ng-template>\r\n <ng-template pTemplate=\"item\" let-item>\r\n <a pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [class.selected-menu-item]=\"selectedMenuItemId === item._id\"\r\n [class.disabled-menu-item]=\"item.isSelectable === false\"\r\n [class.pointer-events-none]=\"item.isSelectable === false\"\r\n [style.opacity]=\"item.isSelectable === false ? '0.5' : '1'\"\r\n [style.cursor]=\"item.isSelectable === false ? 'not-allowed' : 'pointer'\"\r\n (click)=\"onMenuItemClick($event, item)\">\r\n <span [class]=\"item.icon\" class=\"text-xl\"></span>\r\n <span class=\"ml-2\">{{ item.label }}</span>\r\n <p-badge *ngIf=\"item.menuData?.shouldShowBadge\" \r\n class=\"ml-auto\" \r\n [severity]=\"item.menuData?.badgeSeverity\" \r\n [value]=\"item.menuData?.badgeValue\" />\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n </div>\r\n </div>\r\n </p-card>\r\n</div>\r\n\r\n ","import { Injectable } from '@angular/core';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED'\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentQuery } from '../state/document.query';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserListService {\r\n\r\n constructor(\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery\r\n ) { }\r\n\r\n getInitials(name: string): string {\r\n if (!name || name.trim() === SHARED.EMPTY) {\r\n return SHARED.EMPTY;\r\n }\r\n const words = name.trim().split(SHARED.EMPTY_SPACE).filter(word => word.length > SHARED.INITIAL_COUNT);\r\n if (words.length === 1) {\r\n return words[0].substring(0, 2).toUpperCase();\r\n } else if (words.length >= 2) {\r\n const firstWord = words[0];\r\n const lastWord = words[words.length - 1];\r\n return (firstWord.charAt(0) + lastWord.charAt(0)).toUpperCase();\r\n }\r\n return SHARED.EMPTY;\r\n }\r\n\r\n getColorByIndex(index: number): string {\r\n const colors = SHARED.COLORS;\r\n return colors[index % colors.length];\r\n }\r\n\r\n getColorValue(colorName: string): string {\r\n const colorMap: { [key: string]: string } = SHARED.COLOR_MAP;\r\n return colorMap[colorName] || SHARED.DEFAULT_COLOR;\r\n }\r\n\r\n processUserData(userList: UserListModel[]): UserListModel[] {\r\n return userList.map((user, index) => ({\r\n ...user,\r\n initials: this.getInitials(user.name),\r\n color: this.getColorByIndex(index)\r\n }));\r\n }\r\n\r\n /**\r\n * Filters user list based on selected menu item category\r\n * @param userList - The complete user list\r\n * @param categories - The document categories\r\n * @returns Filtered user list\r\n */\r\n filterUsersByCategory(userList: UserListModel[], categories: DocumentCategory[]): UserListModel[] {\r\n return userList;\r\n }\r\n\r\n selectUser(userId: string, userData: UserListModel[]): { selectedUser: string | undefined; name: string | undefined } {\r\n const user = userData.find(u => u._id === userId);\r\n if (user) {\r\n this.documentStore.setSelectedUserId(userId);\r\n return { selectedUser: user.name, name: user.name };\r\n }\r\n return { selectedUser: undefined, name: undefined };\r\n }\r\n\r\n unselectUser(): void {\r\n this.documentStore.setSelectedUserId(null);\r\n }\r\n\r\n isUserSelected(userId: string, userData: UserListModel[], selectedUser: string | undefined): boolean {\r\n return selectedUser === userData.find(u => u._id === userId)?.name;\r\n }\r\n} ","\r\nimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport { SHARED, USERLIST } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { UserListService } from '../../services/user-list.service';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-user-list',\r\n standalone : false,\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('slideInFromTop', [\r\n state('void', style({\r\n opacity: 0,\r\n transform: 'translateY(-10px)'\r\n })),\r\n state('*', style({\r\n opacity: 1,\r\n transform: 'translateY(0)'\r\n })),\r\n transition('void => *', [\r\n animate('300ms ease-out')\r\n ])\r\n ]),\r\n trigger('fadeIn', [\r\n state('void', style({\r\n opacity: 0,\r\n transform: 'scale(0.8)'\r\n })),\r\n state('*', style({\r\n opacity: 1,\r\n transform: 'scale(1)'\r\n })),\r\n transition('void => *', [\r\n animate('200ms ease-in-out')\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class UserListComponent implements OnInit, OnChanges {\r\n \r\n @Input() userList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n @Input() categories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n @Output() userSelected = new EventEmitter<string>();\r\n \r\n userData: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n filteredUserData: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n selectedUser: string | undefined;\r\n shouldShowContainer: boolean = true;\r\n \r\n private userListSubscription: Subscription = new Subscription();\r\n private categoriesSubscription: Subscription = new Subscription();\r\n \r\n constructor(\r\n public documentService : DocumentHelperService,\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery,\r\n private userListService: UserListService,\r\n private cdr: ChangeDetectorRef\r\n ){\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.USER_LIST] && !changes[SHARED.USER_LIST].firstChange) {\r\n this.initializeUserData();\r\n }\r\n if (changes[SHARED.CATEGORIES] && !changes[SHARED.CATEGORIES].firstChange) {\r\n this.updateFilteredUserData();\r\n }\r\n }\r\n\r\n initializeUserData(): void {\r\n if (this.userList && this.userList.length > 0) {\r\n this.userData = this.userListService.processUserData(this.userList);\r\n this.updateFilteredUserData();\r\n }\r\n }\r\n\r\n updateFilteredUserData(): void {\r\n if (this.userData.length > 0 && this.categories.length > 0) {\r\n this.filteredUserData = this.userListService.filterUsersByCategory(this.userData, this.categories);\r\n this.shouldShowContainer = true;\r\n if (this.selectedUser) {\r\n const selectedUserInFiltered = this.filteredUserData.find(user => user.name === this.selectedUser);\r\n if (!selectedUserInFiltered) {\r\n this.selectedUser = undefined;\r\n this.documentStore.setSelectedUserId(null);\r\n this.userSelected.emit(SHARED.EMPTY);\r\n }\r\n }\r\n } else {\r\n this.filteredUserData = this.userData;\r\n this.shouldShowContainer = true;\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initializeUserData();\r\n this.userListSubscription.add(\r\n this.documentQuery.selectUserList().subscribe(userList => {\r\n if (userList && userList.length > 0) {\r\n this.userList = userList;\r\n this.initializeUserData();\r\n this.cdr.markForCheck();\r\n }\r\n })\r\n );\r\n\r\n this.categoriesSubscription.add(\r\n this.documentQuery.selectDocumentCategories().subscribe(categories => {\r\n if (categories && categories.length > 0) {\r\n this.categories = categories;\r\n this.updateFilteredUserData();\r\n this.cdr.markForCheck();\r\n }\r\n })\r\n );\r\n\r\n this.userListSubscription.add(\r\n this.documentQuery.selectDocumentListResponse().subscribe(() => {\r\n const currentUserList = this.documentQuery.getUserList();\r\n if (currentUserList && currentUserList.length > 0) {\r\n this.userList = currentUserList;\r\n this.initializeUserData();\r\n this.cdr.markForCheck();\r\n }\r\n })\r\n );\r\n\r\n this.documentQuery.selectSelectedUserId().subscribe(userId => {\r\n if (userId) {\r\n const user = this.userData.find(u => u._id === userId);\r\n this.selectedUser = user ? user.name : undefined;\r\n } else {\r\n this.selectedUser = undefined;\r\n }\r\n this.cdr.markForCheck();\r\n });\r\n\r\n this.documentQuery.selectShowUserList().subscribe(show => {\r\n if (!show && this.selectedUser) {\r\n this.selectedUser = undefined;\r\n this.userSelected.emit(SHARED.EMPTY);\r\n }\r\n });\r\n }\r\n\r\n onUserSelect(username: string, id: string): void {\r\n if (this.selectedUser === username) {\r\n this.selectedUser = undefined;\r\n this.userListService.unselectUser();\r\n this.userSelected.emit(SHARED.EMPTY);\r\n } else {\r\n this.selectedUser = username;\r\n this.documentStore.setSelectedUserId(id);\r\n this.userSelected.emit(username);\r\n }\r\n }\r\n\r\n getAvatarColor(color: string | undefined): string {\r\n if (!color) {\r\n return SHARED.DEFAULT_COLOR;\r\n }\r\n return SHARED.COLOR_MAP[color as keyof typeof SHARED.COLOR_MAP] || SHARED.DEFAULT_COLOR;\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n this.userListSubscription.unsubscribe();\r\n this.categoriesSubscription.unsubscribe();\r\n }\r\n}","<div class=\"user-list-container\" [@slideInFromTop]>\r\n <div class=\"user-cards\">\r\n <div \r\n *ngFor=\"let user of filteredUserData\" \r\n class=\"user-card\"\r\n [class.selected]=\"selectedUser === user.name\"\r\n [style.border-color]=\"selectedUser === user.name ? getAvatarColor(user.color) : 'transparent'\"\r\n (click)=\"onUserSelect(user.name, user._id)\"\r\n >\r\n @if(user.name === \"Application Docs\"){\r\n <div class=\"user-avatar\" [ngClass]=\"'avatar-' + user.color\">\r\n <span class=\"initials\"><i class=\"pi pi-user\"></i></span>\r\n </div>\r\n }@else {\r\n <div class=\"user-avatar\" [ngClass]=\"'avatar-' + user.color\">\r\n <span class=\"initials\">{{ user.initials }}</span>\r\n </div>\r\n }\r\n <div class=\"user-info\">\r\n <div class=\"username\">{{ user.name }}</div>\r\n <div class=\"document-counts\">\r\n <span style=\"color : #16A34A;\"> {{ user.approved }} approved </span><span>/ {{ user.pending }} outstanding</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n <!-- Show message when filtered list is empty -->\r\n <div *ngIf=\"filteredUserData.length === 0 && shouldShowContainer\" class=\"no-users-message\" [@slideInFromTop]>\r\n <p>No users available for this category.</p>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TablePrimaryComponent } from './components/table-primary/table-primary.component';\r\nimport { TableModule } from 'primeng/table';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\r\nimport { HasPermissionDirective } from '../lib/document/directives/permission.directive';\r\nimport { ConfirmationDialogComponent } from './components/confirmation-dialog/confirmation-dialog.component';\r\nimport { ConfirmationService } from 'primeng/api';\r\n\r\n\r\n@NgModule({\r\n declarations: [TablePrimaryComponent, HasPermissionDirective, ConfirmationDialogComponent],\r\n imports: [\r\n CommonModule,\r\n TableModule,\r\n ButtonModule,\r\n RippleModule,\r\n ConfirmDialogModule\r\n ],\r\n providers: [ConfirmationService],\r\n exports : [TablePrimaryComponent, HasPermissionDirective, ConfirmationDialogComponent, ConfirmDialogModule]\r\n})\r\nexport class SharedModule { }\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Service for handling document content types and their mappings.\r\n * Supports the content types: \"xlsx\",\"xls\",\"doc\",\"docx\",\"pdf\",\"jpg\",\"jpeg\",\"odt\",\"csv\",\"png\",\"msg\",\"eml\"\r\n * @class DocumentContentTypeService\r\n * @typedef {DocumentContentTypeService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentContentTypeService {\r\n\r\n /**\r\n * Mapping of file extensions to MIME types\r\n * @type {Record<string, string>}\r\n */\r\n private readonly extensionToMimeType: Record<string, string> = {\r\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'xls': 'application/vnd.ms-excel',\r\n 'doc': 'application/msword',\r\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'pdf': 'application/pdf',\r\n 'jpg': 'image/jpeg',\r\n 'jpeg': 'image/jpeg',\r\n 'odt': 'application/vnd.oasis.opendocument.text',\r\n 'csv': 'text/csv',\r\n 'png': 'image/png',\r\n 'msg': 'application/vnd.ms-outlook',\r\n 'eml': 'message/rfc822'\r\n };\r\n\r\n /**\r\n * Mapping of MIME types to file extensions\r\n * @type {Record<string, string>}\r\n */\r\n private readonly mimeTypeToExtension: Record<string, string> = {\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\r\n 'application/vnd.ms-excel': 'xls',\r\n 'application/msword': 'doc',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\r\n 'application/pdf': 'pdf',\r\n 'image/jpeg': 'jpg',\r\n 'image/jpg': 'jpg',\r\n 'application/vnd.oasis.opendocument.text': 'odt',\r\n 'text/csv': 'csv',\r\n 'image/png': 'png',\r\n 'application/vnd.ms-outlook': 'msg',\r\n 'message/rfc822': 'eml'\r\n };\r\n\r\n /**\r\n * List of all supported file extensions\r\n * @type {string[]}\r\n */\r\n readonly supportedExtensions: string[] = [\r\n 'xlsx', 'xls', 'doc', 'docx', 'pdf', 'jpg', 'jpeg', 'odt', 'csv', 'png', 'msg', 'eml'\r\n ];\r\n\r\n /**\r\n * List of all supported MIME types\r\n * @type {string[]}\r\n */\r\n readonly supportedMimeTypes: string[] = [\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.ms-excel',\r\n 'application/msword',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/pdf',\r\n 'image/jpeg',\r\n 'image/jpg',\r\n 'application/vnd.oasis.opendocument.text',\r\n 'text/csv',\r\n 'image/png',\r\n 'application/vnd.ms-outlook',\r\n 'message/rfc822'\r\n ];\r\n\r\n /**\r\n * Gets the MIME type for a given file extension\r\n * @param {string} extension - The file extension (with or without dot)\r\n * @returns {string | undefined} The MIME type or undefined if not supported\r\n */\r\n getMimeType(extension: string): string | undefined {\r\n const cleanExtension = extension.replace('.', '').toLowerCase();\r\n return this.extensionToMimeType[cleanExtension];\r\n }\r\n\r\n /**\r\n * Gets the file extension for a given MIME type\r\n * @param {string} mimeType - The MIME type\r\n * @returns {string | undefined} The file extension or undefined if not supported\r\n */\r\n getExtension(mimeType: string): string | undefined {\r\n return this.mimeTypeToExtension[mimeType];\r\n }\r\n\r\n /**\r\n * Checks if a file extension is supported\r\n * @param {string} extension - The file extension (with or without dot)\r\n * @returns {boolean} True if the extension is supported\r\n */\r\n isExtensionSupported(extension: string): boolean {\r\n const cleanExtension = extension.replace('.', '').toLowerCase();\r\n return this.supportedExtensions.includes(cleanExtension);\r\n }\r\n\r\n /**\r\n * Checks if a MIME type is supported\r\n * @param {string} mimeType - The MIME type\r\n * @returns {boolean} True if the MIME type is supported\r\n */\r\n isMimeTypeSupported(mimeType: string): boolean {\r\n return this.supportedMimeTypes.includes(mimeType);\r\n }\r\n\r\n /**\r\n * Gets the file extension from a filename\r\n * @param {string} filename - The filename\r\n * @returns {string | undefined} The file extension or undefined if no extension found\r\n */\r\n getExtensionFromFilename(filename: string): string | undefined {\r\n if (!filename || !filename.includes('.')) {\r\n return undefined;\r\n }\r\n const parts = filename.split('.');\r\n return parts[parts.length - 1].toLowerCase();\r\n }\r\n\r\n /**\r\n * Gets the MIME type from a filename\r\n * @param {string} filename - The filename\r\n * @returns {string | undefined} The MIME type or undefined if not supported\r\n */\r\n getMimeTypeFromFilename(filename: string): string | undefined {\r\n const extension = this.getExtensionFromFilename(filename);\r\n return extension ? this.getMimeType(extension) : undefined;\r\n }\r\n\r\n /**\r\n * Validates if a file can be uploaded based on its extension\r\n * @param {string} filename - The filename to validate\r\n * @returns {boolean} True if the file can be uploaded\r\n */\r\n canUploadFile(filename: string): boolean {\r\n const extension = this.getExtensionFromFilename(filename);\r\n return extension ? this.isExtensionSupported(extension) : false;\r\n }\r\n\r\n /**\r\n * Gets a human-readable description for a content type\r\n * @param {string} contentType - The content type (MIME type or extension)\r\n * @returns {string} Human-readable description\r\n */\r\n getContentTypeDescription(contentType: string): string {\r\n // Check if it's a MIME type first\r\n if (this.isMimeTypeSupported(contentType)) {\r\n const extension = this.getExtension(contentType);\r\n return this.getExtensionDescription(extension || 'unknown');\r\n }\r\n \r\n // Check if it's an extension\r\n if (this.isExtensionSupported(contentType)) {\r\n return this.getExtensionDescription(contentType);\r\n }\r\n \r\n return 'Unknown Document Type';\r\n }\r\n\r\n /**\r\n * Gets a human-readable description for a file extension\r\n * @param {string} extension - The file extension\r\n * @returns {string} Human-readable description\r\n */\r\n private getExtensionDescription(extension: string): string {\r\n const descriptions: Record<string, string> = {\r\n 'xlsx': 'Excel Spreadsheet (XLSX)',\r\n 'xls': 'Excel Spreadsheet (XLS)',\r\n 'doc': 'Word Document (DOC)',\r\n 'docx': 'Word Document (DOCX)',\r\n 'pdf': 'PDF Document',\r\n 'jpg': 'JPEG Image',\r\n 'jpeg': 'JPEG Image',\r\n 'odt': 'OpenDocument Text',\r\n 'csv': 'CSV File',\r\n 'png': 'PNG Image',\r\n 'msg': 'Outlook Message',\r\n 'eml': 'Email Message'\r\n };\r\n \r\n return descriptions[extension] || 'Unknown File Type';\r\n }\r\n}\r\n","import { APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DocumentContainerComponent } from './components/document-container/document-container.component';\r\nimport { FolderContainerComponent } from './components/folder-container/folder-container.component';\r\nimport { FolderBlockComponent } from './components/folder-block/folder-block.component';\r\nimport { DocumentListComponent } from './components/document-list/document-list.component';\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { DocumentListItemComponent } from './components/document-list-item/document-list-item.component';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { SidebarModule } from 'primeng/sidebar';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { DocumentUploadComponent } from './components/document-upload/document-upload.component';\r\nimport { MessageService } from 'primeng/api';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';\r\nimport { ProgressBarModule } from 'primeng/progressbar';\r\nimport { BadgeModule } from 'primeng/badge';\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { TimelineModule } from 'primeng/timeline';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { InputTextareaModule } from 'primeng/inputtextarea';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DocumentViewerComponent } from './components/document-viewer/document-viewer.component';\r\nimport { DocumentHistoryComponent } from './components/document-history/document-history.component';\r\nimport { DocumentContentViewerComponent } from './components/document-content-viewer/document-content-viewer.component';\r\nimport { DocumentZoomControlsComponent } from './components/document-zoom-controls/document-zoom-controls.component';\r\nimport { PdfViewerModule } from 'ng2-pdf-viewer';\r\nimport { NgxDocViewerModule } from 'ngx-doc-viewer';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { AppConfigService } from '../../Shared/services/app-config.service';\r\nimport { GlobalErrorHandler } from '../../Shared/services/global-error.handler';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { DocumentDirective } from './directives/document.directive';\r\nimport { LinkedDocumentComponent } from './components/linked-document/linked-document.component';\r\nimport { DocumentsMenuComponent } from './components/documents-menu/documents-menu.component';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { CardModule } from 'primeng/card';\r\nimport { TableModule } from 'primeng/table';\r\nimport { UserListComponent } from './components/user-list/user-list.component';\r\nimport { DocumentStatusComponent } from './components/document-status/document-status.component';\r\nimport { DocumentActionsComponent } from './components/document-actions/document-actions.component';\r\nimport { DocumentSearchComponent } from './components/document-search/document-search.component';\r\nimport { SharedModule } from '../../Shared/shared.module';\r\nimport { DocumentActionsService } from './services/document-actions.service';\r\nimport { DocumentContentTypeService } from './services/document-content-type.service';\r\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\r\nimport { RequestDocumentComponent } from './components/request-document/request-document.component';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { MessagesModule } from 'primeng/messages';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { DocumentAiChatComponent } from './components/document-ai-chat/document-ai-chat.component';\r\n\r\n/**\r\n * @module DocumentModule\r\n * \r\n * The `DocumentModule` handles the organization and display of document and folder components \r\n * in the application. This module is designed to support features like folder containers, \r\n * document lists, and individual document items.\r\n */\r\n@NgModule({\r\n declarations: [\r\n /**\r\n * The main container for managing documents.\r\n * DocumentContainerComponent\r\n */\r\n DocumentContainerComponent,\r\n\r\n /**\r\n * A container component to manage folders.\r\n * FolderContainerComponent\r\n */\r\n FolderContainerComponent,\r\n\r\n /**\r\n * A block component that represents an individual folder.\r\n * FolderBlockComponent\r\n */\r\n FolderBlockComponent,\r\n\r\n /**\r\n * A component to display a list of documents.\r\n * DocumentListComponent\r\n */\r\n DocumentListComponent,\r\n\r\n /**\r\n * A component representing an individual item in the document list.\r\n * DocumentListItemComponent\r\n */\r\n DocumentListItemComponent,\r\n\r\n /** \r\n * A component representing to upload a file.\r\n */\r\n DocumentUploadComponent,\r\n\r\n /**\r\n * A component representing and allow you to view the document.\r\n */\r\n DocumentViewerComponent,\r\n\r\n /**\r\n * A component representing document history timeline.\r\n */\r\n DocumentHistoryComponent,\r\n\r\n /**\r\n * A reusable component for viewing different types of document content.\r\n */\r\n DocumentContentViewerComponent,\r\n\r\n /**\r\n * A component providing zoom controls for document viewing.\r\n */\r\n DocumentZoomControlsComponent,\r\n\r\n /**\r\n * A directive to show the document.\r\n */\r\n DocumentDirective,\r\n\r\n /**\r\n * A component which have linked documents.\r\n */\r\n LinkedDocumentComponent,\r\n DocumentsMenuComponent,\r\n UserListComponent,\r\n DocumentStatusComponent,\r\n DocumentActionsComponent,\r\n DocumentSearchComponent,\r\n /**\r\n * A sidebar component for content projection.\r\n */\r\n SidebarComponent,\r\n /**\r\n * A component to request a document (without upload), with description.\r\n */\r\n RequestDocumentComponent,\r\n DocumentAiChatComponent,\r\n\r\n ],\r\n imports: [\r\n /**\r\n * Angular's CommonModule is imported to access common directives like `ngIf` and `ngFor`.\r\n */\r\n CommonModule,\r\n\r\n /**\r\n * PrimeNG AccordionModule is used for creating collapsible sections in the UI.\r\n */\r\n AccordionModule,\r\n\r\n /**\r\n * HttpClientModule for the http calls\r\n */\r\n HttpClientModule,\r\n\r\n /**\r\n * PrimeNG ButtonModule is used for creating buttons in the UI.\r\n */\r\n ButtonModule,\r\n\r\n /**\r\n * PrimeNG SidebarModule is used for creating sidebars.\r\n */\r\n SidebarModule,\r\n\r\n /**\r\n * PrimeNG FileUploadModule is used for uploading file.\r\n */\r\n FileUploadModule,\r\n\r\n /**\r\n * PrimeNG ProgressBarModule is used for showing progress.\r\n */\r\n ProgressBarModule,\r\n\r\n /**\r\n * PrimeNG BadgeModule is used for showing badge value.\r\n */\r\n BadgeModule,\r\n\r\n /**\r\n * PrimeNG ListboxModule is used for showing listbox value.\r\n */\r\n ListboxModule,\r\n\r\n /**\r\n * PrimeNG CheckboxModule is used for showing checkbox value.\r\n */\r\n CheckboxModule,\r\n\r\n /**\r\n * PrimeNG RadioButtonModule is used for showing radio button values.\r\n */\r\n RadioButtonModule,\r\n\r\n /**\r\n * PrimeNG TimelineModule is used for showing timeline value.\r\n */\r\n TimelineModule,\r\n /**\r\n * PrimeNG InputTextareaModule is used for showing textarea value.\r\n */\r\n InputTextareaModule,\r\n /**\r\n * FormsModule to handle the forms.\r\n */\r\n FormsModule,\r\n /**\r\n * PdfViewerModule to handle and make visible the pdf.\r\n */\r\n PdfViewerModule,\r\n /**\r\n * NgxDocViewerModule to handle and make visible Office documents.\r\n */\r\n NgxDocViewerModule,\r\n /**\r\n * PrimeNG DialogModule is used for showing dialog.\r\n */\r\n DialogModule,\r\n /**\r\n * PrimeNG DropdownModule is used for creating dropdown menus, allowing users to select options from a list.\r\n */\r\n DropdownModule,\r\n /**\r\n * PrimeNG InputTextModule is used for creating InputTextFeilds, allowing users to enter name for a document.\r\n */\r\n InputTextModule,\r\n\r\n MenuModule,\r\n PanelMenuModule,\r\n CardModule,\r\n TableModule,\r\n SharedModule,\r\n InputTextareaModule,\r\n ToastModule,\r\n TooltipModule,\r\n MessagesModule,\r\n MessageModule\r\n\r\n ],\r\n exports: [\r\n /**\r\n * Exports the `DocumentContainerComponent` to be used in other modules.\r\n */\r\n DocumentContainerComponent,\r\n /**\r\n * Exports the `DocumentViewerComponent` to be used in other modules.\r\n */\r\n DocumentViewerComponent,\r\n\r\n /**\r\n * Exports the `DocumentContentViewerComponent` to be used in other modules.\r\n */\r\n DocumentContentViewerComponent,\r\n\r\n /**\r\n * Exports the `DocumentZoomControlsComponent` to be used in other modules.\r\n */\r\n DocumentZoomControlsComponent,\r\n /**\r\n * Exports the `DocumentActionsComponent` to be used in other modules.\r\n */\r\n DocumentActionsComponent,\r\n /**\r\n * A component to display a list of documents.\r\n * DocumentListComponent\r\n */\r\n DocumentListComponent,\r\n\r\n /**\r\n * A component for uploading documents.\r\n * DocumentUploadComponent\r\n */\r\n DocumentUploadComponent,\r\n\r\n /**\r\n * A directive to show the document.\r\n */\r\n DocumentDirective,\r\n\r\n /**\r\n * A component for searching documents.\r\n */\r\n DocumentSearchComponent,\r\n\r\n /**\r\n * A sidebar component for content projection.\r\n */\r\n SidebarComponent,\r\n RequestDocumentComponent,\r\n DocumentAiChatComponent,\r\n\r\n\r\n ],\r\n providers: [\r\n /**\r\n * Provide the messageservice to be used in other components.\r\n */\r\n MessageService,\r\n\r\n /**\r\n * Provide the DocumentActionsService to be used in other components.\r\n */\r\n DocumentActionsService,\r\n\r\n /**\r\n * Provide the DocumentContentTypeService to be used in other components.\r\n */\r\n DocumentContentTypeService,\r\n\r\n /**\r\n * Provide the ConfirmationService to be used in other components.\r\n */\r\n ConfirmationService,\r\n\r\n /**\r\n * Provide the messageservice to be used in other components.\r\n */\r\n { provide: GlobalErrorHandler, useClass: GlobalErrorHandler },\r\n /**\r\n * Initializes the application configuration by loading it from the AppConfigService\r\n * before the application starts.\r\n * This ensures that the configuration is available for the rest of the app when needed.\r\n * The configuration is loaded asynchronously using the APP_INITIALIZER.\r\n * @returns {Function} - A function that loads the configuration from the AppConfigService.\r\n */\r\n {\r\n provide: APP_INITIALIZER,\r\n /**\r\n * This useFactory is executed when the app initializes.\r\n * It calls the AppConfigService to load the configuration.\r\n * If an error occurs, it throws an error.\r\n * @param {AppConfigService} configService - The service responsible for loading the application configuration.\r\n * @returns {Function} - A function that loads the configuration from the AppConfigService.\r\n */\r\n useFactory: (configService: AppConfigService) => () =>\r\n configService.loadAppConfig().catch((error) => {\r\n throw new Error(error);\r\n }),\r\n deps: [AppConfigService],\r\n multi: true,\r\n },\r\n ]\r\n ,\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class DocumentModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\n/**\r\n * Interface for parsed email data\r\n */\r\nexport interface ParsedEmailData {\r\n from: string;\r\n to: string;\r\n cc?: string;\r\n subject: string;\r\n date: string;\r\n body: string;\r\n isHtml: boolean;\r\n attachments?: EmailAttachment[];\r\n}\r\n\r\n/**\r\n * Interface for email attachments\r\n */\r\nexport interface EmailAttachment {\r\n filename: string;\r\n contentType: string;\r\n size: number;\r\n}\r\n\r\n/**\r\n * Service for parsing EML (email message) files\r\n * Handles both plain text and HTML email content\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EmlParserService {\r\n\r\n constructor(\r\n private sanitizer: DomSanitizer,\r\n private http: HttpClient\r\n ) { }\r\n\r\n /**\r\n * Parses EML file content\r\n * @param emlContent - Raw EML file content as string\r\n * @returns Parsed email data\r\n */\r\n parseEmlData(emlContent: string): ParsedEmailData | null {\r\n try {\r\n const lines = emlContent.split(/\\r?\\n/);\r\n const headers = this.parseHeaders(lines);\r\n const body = this.parseBody(lines);\r\n\r\n return {\r\n from: this.cleanEmailAddress(headers['from'] || 'Unknown'),\r\n to: this.cleanEmailAddress(headers['to'] || 'Unknown'),\r\n cc: headers['cc'] ? this.cleanEmailAddress(headers['cc']) : undefined,\r\n subject: this.decodeHeader(headers['subject'] || 'No Subject'),\r\n date: this.formatDate(headers['date'] || ''),\r\n body: body.content,\r\n isHtml: body.isHtml,\r\n attachments: this.parseAttachments(emlContent)\r\n };\r\n } catch (error) {\r\n console.error('Error parsing EML file:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Parses email headers from EML content\r\n * @param lines - Lines of the EML file\r\n * @returns Object containing parsed headers\r\n */\r\n private parseHeaders(lines: string[]): { [key: string]: string } {\r\n const headers: { [key: string]: string } = {};\r\n let currentHeader = '';\r\n let currentValue = '';\r\n\r\n for (const line of lines) {\r\n // Empty line indicates end of headers\r\n if (line.trim() === '') {\r\n if (currentHeader) {\r\n headers[currentHeader.toLowerCase()] = currentValue.trim();\r\n }\r\n break;\r\n }\r\n\r\n // Check if line is a new header (starts without whitespace and contains ':')\r\n if (line.match(/^[\\w-]+:/) && !line.startsWith(' ') && !line.startsWith('\\t')) {\r\n // Save previous header if exists\r\n if (currentHeader) {\r\n headers[currentHeader.toLowerCase()] = currentValue.trim();\r\n }\r\n\r\n // Parse new header\r\n const colonIndex = line.indexOf(':');\r\n currentHeader = line.substring(0, colonIndex).trim();\r\n currentValue = line.substring(colonIndex + 1).trim();\r\n } else if (currentHeader && (line.startsWith(' ') || line.startsWith('\\t'))) {\r\n // Continuation of previous header (folded header)\r\n currentValue += ' ' + line.trim();\r\n }\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Parses the email body from EML content\r\n * @param lines - Lines of the EML file\r\n * @returns Object containing body content and format information\r\n */\r\n private parseBody(lines: string[]): { content: string, isHtml: boolean } {\r\n let inBody = false;\r\n let bodyLines: string[] = [];\r\n let contentType = 'text/plain';\r\n let boundary = '';\r\n let isBase64 = false;\r\n let isQuotedPrintable = false;\r\n\r\n // Find Content-Type and boundary\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n \r\n if (line.toLowerCase().startsWith('content-type:')) {\r\n contentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';\r\n \r\n // Check for multipart boundary\r\n const boundaryMatch = line.match(/boundary=\"?([^\";\\s]+)\"?/i);\r\n if (boundaryMatch) {\r\n boundary = boundaryMatch[1];\r\n }\r\n }\r\n\r\n if (line.toLowerCase().startsWith('content-transfer-encoding:')) {\r\n isBase64 = line.toLowerCase().includes('base64');\r\n isQuotedPrintable = line.toLowerCase().includes('quoted-printable');\r\n }\r\n\r\n // Empty line marks start of body\r\n if (line.trim() === '' && !inBody) {\r\n inBody = true;\r\n continue;\r\n }\r\n\r\n if (inBody) {\r\n bodyLines.push(line);\r\n }\r\n }\r\n\r\n // If multipart, extract the relevant part\r\n if (boundary) {\r\n bodyLines = this.extractMultipartBody(bodyLines.join('\\n'), boundary, contentType);\r\n }\r\n\r\n let bodyContent = bodyLines.join('\\n').trim();\r\n\r\n // Decode body if necessary\r\n if (isBase64) {\r\n try {\r\n bodyContent = atob(bodyContent.replace(/\\s/g, ''));\r\n } catch (e) {\r\n console.warn('Failed to decode base64 content');\r\n }\r\n } else if (isQuotedPrintable) {\r\n bodyContent = this.decodeQuotedPrintable(bodyContent);\r\n }\r\n\r\n // Clean up HTML if present\r\n if (contentType === 'text/html') {\r\n bodyContent = this.sanitizeHtmlContent(bodyContent);\r\n }\r\n\r\n return {\r\n content: bodyContent || 'No content available',\r\n isHtml: contentType === 'text/html'\r\n };\r\n }\r\n\r\n /**\r\n * Extracts body from multipart email\r\n * @param content - Email content\r\n * @param boundary - Multipart boundary string\r\n * @param preferredType - Preferred content type\r\n * @returns Array of body lines\r\n */\r\n private extractMultipartBody(content: string, boundary: string, preferredType: string): string[] {\r\n const parts = content.split('--' + boundary);\r\n \r\n for (const part of parts) {\r\n const lines = part.split(/\\r?\\n/);\r\n let partContentType = 'text/plain';\r\n let isBase64 = false;\r\n let isQuotedPrintable = false;\r\n let inPartBody = false;\r\n const partBodyLines: string[] = [];\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n\r\n if (line.toLowerCase().startsWith('content-type:')) {\r\n partContentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';\r\n }\r\n\r\n if (line.toLowerCase().startsWith('content-transfer-encoding:')) {\r\n isBase64 = line.toLowerCase().includes('base64');\r\n isQuotedPrintable = line.toLowerCase().includes('quoted-printable');\r\n }\r\n\r\n if (line.trim() === '' && !inPartBody) {\r\n inPartBody = true;\r\n continue;\r\n }\r\n\r\n if (inPartBody) {\r\n partBodyLines.push(line);\r\n }\r\n }\r\n\r\n // If this part matches our preferred content type, use it\r\n if (partContentType === preferredType && partBodyLines.length > 0) {\r\n let bodyContent = partBodyLines.join('\\n');\r\n\r\n if (isBase64) {\r\n try {\r\n bodyContent = atob(bodyContent.replace(/\\s/g, ''));\r\n } catch (e) {\r\n console.warn('Failed to decode base64 part');\r\n }\r\n } else if (isQuotedPrintable) {\r\n bodyContent = this.decodeQuotedPrintable(bodyContent);\r\n }\r\n\r\n return [bodyContent];\r\n }\r\n }\r\n\r\n // Fallback: return first non-empty part\r\n for (const part of parts) {\r\n const lines = part.split(/\\r?\\n/);\r\n const bodyLines = lines.filter(line => line.trim() !== '').slice(3); // Skip headers\r\n if (bodyLines.length > 0) {\r\n return bodyLines;\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Decodes quoted-printable encoded content\r\n * @param content - Quoted-printable encoded string\r\n * @returns Decoded string\r\n */\r\n private decodeQuotedPrintable(content: string): string {\r\n return content\r\n .replace(/=\\r?\\n/g, '') // Remove soft line breaks\r\n .replace(/=([0-9A-F]{2})/gi, (match, hex) => {\r\n return String.fromCharCode(parseInt(hex, 16));\r\n });\r\n }\r\n\r\n /**\r\n * Sanitizes HTML content for safe display\r\n * @param html - Raw HTML content\r\n * @returns Sanitized HTML\r\n */\r\n private sanitizeHtmlContent(html: string): string {\r\n // Basic sanitization - remove script tags and dangerous attributes\r\n let sanitized = html\r\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\r\n .replace(/on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi, '')\r\n .replace(/javascript:/gi, '');\r\n\r\n return sanitized;\r\n }\r\n\r\n /**\r\n * Parses attachment information from EML content\r\n * @param emlContent - Raw EML content\r\n * @returns Array of attachment information\r\n */\r\n private parseAttachments(emlContent: string): EmailAttachment[] {\r\n const attachments: EmailAttachment[] = [];\r\n const attachmentRegex = /Content-Disposition:\\s*attachment[^;]*;\\s*filename=\"?([^\"\\r\\n]+)\"?/gi;\r\n let match;\r\n\r\n while ((match = attachmentRegex.exec(emlContent)) !== null) {\r\n attachments.push({\r\n filename: match[1],\r\n contentType: 'application/octet-stream',\r\n size: 0\r\n });\r\n }\r\n\r\n return attachments;\r\n }\r\n\r\n /**\r\n * Cleans and formats email addresses\r\n * @param email - Raw email address string\r\n * @returns Cleaned email address\r\n */\r\n private cleanEmailAddress(email: string): string {\r\n // Remove quotes and extra whitespace\r\n let cleaned = email.replace(/['\"]/g, '').trim();\r\n \r\n // Extract email from format: \"Name <email@example.com>\"\r\n const emailMatch = cleaned.match(/<([^>]+)>/);\r\n if (emailMatch) {\r\n const name = cleaned.substring(0, cleaned.indexOf('<')).trim();\r\n const address = emailMatch[1];\r\n return name ? `${name} <${address}>` : address;\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n /**\r\n * Decodes encoded email headers (RFC 2047)\r\n * @param header - Encoded header string\r\n * @returns Decoded header string\r\n */\r\n private decodeHeader(header: string): string {\r\n // Decode RFC 2047 encoded words (=?charset?encoding?text?=)\r\n return header.replace(/=\\?([^?]+)\\?([BQ])\\?([^?]+)\\?=/gi, (match, charset, encoding, text) => {\r\n try {\r\n if (encoding.toUpperCase() === 'B') {\r\n // Base64 encoding\r\n return atob(text);\r\n } else if (encoding.toUpperCase() === 'Q') {\r\n // Quoted-printable encoding\r\n return this.decodeQuotedPrintable(text.replace(/_/g, ' '));\r\n }\r\n } catch (e) {\r\n console.warn('Failed to decode header:', match);\r\n }\r\n return match;\r\n });\r\n }\r\n\r\n /**\r\n * Formats email date to readable format\r\n * @param dateStr - Raw date string from email\r\n * @returns Formatted date string\r\n */\r\n private formatDate(dateStr: string): string {\r\n try {\r\n const date = new Date(dateStr);\r\n if (isNaN(date.getTime())) {\r\n return dateStr || 'Unknown date';\r\n }\r\n return date.toLocaleString('en-GB', {\r\n day: '2-digit',\r\n month: 'short',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n });\r\n } catch (e) {\r\n return dateStr || 'Unknown date';\r\n }\r\n }\r\n\r\n /**\r\n * Sanitizes HTML for Angular display\r\n * @param html - HTML string\r\n * @returns SafeHtml for Angular templates\r\n */\r\n getSafeHtml(html: string): SafeHtml {\r\n return this.sanitizer.sanitize(1, html) || '';\r\n }\r\n\r\n /**\r\n * Downloads and parses an EML file from a URL\r\n * @param documentUrl - URL of the EML file\r\n * @returns Observable of parsed email data\r\n */\r\n loadAndParseEmail(documentUrl: string): Observable<ParsedEmailData> {\r\n console.log('EmlParserService: Loading email from URL:', documentUrl);\r\n \r\n return this.downloadEmailFile(documentUrl).pipe(\r\n map((emlContent: string) => {\r\n console.log('EmlParserService: Email downloaded, size:', emlContent?.length || 0, 'bytes');\r\n \r\n if (!emlContent || emlContent.trim().length === 0) {\r\n throw new Error('Email file is empty or could not be loaded');\r\n }\r\n\r\n const parsedData = this.parseEmlData(emlContent);\r\n if (!parsedData) {\r\n throw new Error('Failed to parse email data');\r\n }\r\n\r\n console.log('EmlParserService: Email parsed successfully:', parsedData);\r\n return parsedData;\r\n }),\r\n catchError((error) => {\r\n console.error('EmlParserService: Error loading/parsing email:', error);\r\n return throwError(() => new Error(error.message || 'Failed to load or parse email file'));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Downloads an email file with appropriate authentication handling\r\n * @param documentUrl - URL of the email file\r\n * @returns Observable of file content as text\r\n */\r\n private downloadEmailFile(documentUrl: string): Observable<string> {\r\n // Check if it's Azure Blob Storage URL\r\n const isAzureBlobStorage = documentUrl.includes('.blob.core.windows.net');\r\n \r\n if (isAzureBlobStorage) {\r\n // For Azure Blob Storage, don't send Authorization header\r\n // The URL should contain a SAS token or the blob should be publicly accessible\r\n return this.http.get(documentUrl, {\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n console.error('Error downloading email from blob storage:', error);\r\n return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));\r\n })\r\n );\r\n } else {\r\n // For other storage types, use Bearer token authentication\r\n const Authorization = `Bearer d8764575-d713-4e31-aeb0-29ea31057461`;\r\n return this.http.get(documentUrl, {\r\n headers: new HttpHeaders({\r\n 'Authorization': Authorization\r\n }),\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n console.error('Error downloading email file:', error);\r\n return throwError(() => new Error('Failed to download email file. Please check authentication.'));\r\n })\r\n );\r\n }\r\n }\r\n}\r\n\r\n","/*\r\n * Public API Surface of cat-document-lib\r\n */\r\n\r\nexport * from './lib/document/document.module';\r\nexport * from './lib/document/components/document-container/document-container.component';\r\nexport * from './lib/document/components/document-upload/document-upload.component';\r\nexport * from './lib/document/components/document-viewer/document-viewer.component';\r\nexport * from './lib/document/components/document-content-viewer/document-content-viewer.component';\r\nexport * from './lib/document/components/document-zoom-controls/document-zoom-controls.component';\r\nexport * from './lib/document/components/document-actions/document-actions.component';\r\nexport * from './lib/document/components/document-history/document-history.component';\r\nexport * from './lib/document/components/document-list/document-list.component';\r\nexport * from './lib/document/components/document-search/document-search.component';\r\nexport * from './lib/document/components/sidebar/sidebar.component';\r\nexport * from './lib/document/components/request-document/request-document.component';\r\nexport * from './lib/document/components/document-ai-chat/document-ai-chat.component';\r\nexport * from './lib/document/models/document-history.model';\r\nexport * from './lib/document/models/uploaded-file-response.model';\r\nexport * from './lib/document/services/document-table-builder.service';\r\nexport * from './lib/document/services/document-content-type.service';\r\nexport * from './lib/document/services/document-zoom.service';\r\nexport * from './lib/document/services/eml-parser.service';\r\nexport * from './lib/document/services/excel-parser.service';\r\nexport * from './lib/document/services/csv-parser.service';\r\nexport * from './lib/document/directives/document.directive';\r\nexport * from './lib/document/directives/permission.directive';\r\nexport * from './Shared/components/confirmation-dialog/confirmation-dialog.component';\r\nexport * from './Shared/components/table-primary/table-primary.component';\r\nexport * from './Shared/components/table-primary/table-primary.model';\r\nexport * from './Shared/constant/SHARED';\r\nexport * from './Shared/shared.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.DocumentStore","i3.AppConfigService","i2.DocumentQuery","i3.DocumentHttpService","i4.DocumentMenuService","i1.DocumentService","i2.DocumentStore","i1.DocumentHttpService","i2.FileFormatService","i1.DocumentUploadBusinessService","i2.DocumentUploadFormService","i1.DocumentUploadService","i2.DocumentService","i4.FileFormatService","i5.DocumentUploadBusinessService","i6.DocumentUploadFormService","i7.DocumentUploadDataService","i8","i14","i3.DocumentUploadDataService","i4.DocumentHttpService","i5.SessionService","i1.DocumentQuery","i2.DocumentHelperService","i3.StatusCalculatorService","i4","debounceTime","distinctUntilChanged","i1.DocumentHelperService","i3","i2","i3.DocumentUploadComponent","i4.DocumentStatusComponent","i5.DocumentSearchComponent","i6.SidebarComponent","i7.RequestDocumentComponent","i2.DocumentHttpService","i3.DocumentQuery","i4.DocumentStore","i5.DocumentTableBuilderService","i6.DocumentHelperService","i5.DocumentQuery","i1.DocumentHistoryStyleService","catchError","i1.SessionService","i1.DocumentHistoryAiService","i1.DocumentHistoryService","i2.DocumentViewerService","i3.DocumentActionsService","i5.DocumentHttpService","i6.DocumentHistoryAiService","i7","i9.HasPermissionDirective","i10.DocumentAiChatComponent","i1.DocumentZoomService","i5","i6","i1.ExcelParserService","i2.CsvParserService","i4.DocumentZoomService","i9","i10","i11.DocumentZoomControlsComponent","i1.DocumentActionsService","i2.SessionService","i4.DocumentViewerService","i5.DocumentStore","i8.DocumentHistoryComponent","i9.DocumentContentViewerComponent","i10.DocumentActionsComponent","i1.DocumentListService","i3.DocumentMenuService","i5.DocumentScrollService","i11","i12","i13.TablePrimaryComponent","i14.DocumentViewerComponent","i5.DocumentMenuService","i7.FolderContainerComponent","i8.DocumentListComponent","i4.DocumentHelperService","i4.UserListService"],"mappings":"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"}
1
+ {"version":3,"file":"cat-documents-ng.mjs","sources":["../../../projects/cat-document-lib/src/Shared/constant/SHARED.ts","../../../projects/cat-document-lib/src/Shared/constant/ERROR.ts","../../../projects/cat-document-lib/src/Shared/constant/URLS.ts","../../../projects/cat-document-lib/src/lib/document/state/document.state.ts","../../../projects/cat-document-lib/src/lib/document/state/document.store.ts","../../../projects/cat-document-lib/src/Shared/services/app-config.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-http.service.ts","../../../projects/cat-document-lib/src/lib/document/state/document.query.ts","../../../projects/cat-document-lib/src/lib/document/services/document-menu.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document.service.ts","../../../projects/cat-document-lib/src/lib/document/state/document.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload.service.ts","../../../projects/cat-document-lib/src/lib/document/services/file-format.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload-business.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload-form.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-upload-data.service.ts","../../../projects/cat-document-lib/src/lib/document/components/document-upload/document-upload.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-upload/document-upload.component.html","../../../projects/cat-document-lib/src/Shared/services/session.service.ts","../../../projects/cat-document-lib/src/lib/document/components/request-document/request-document.component.ts","../../../projects/cat-document-lib/src/lib/document/components/request-document/request-document.component.html","../../../projects/cat-document-lib/src/lib/document/services/status-calculator.service.ts","../../../projects/cat-document-lib/src/lib/document/components/document-status/document-status.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-status/document-status.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-search/document-search.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-search/document-search.component.html","../../../projects/cat-document-lib/src/Shared/components/confirmation-dialog/confirmation-dialog.component.ts","../../../projects/cat-document-lib/src/Shared/components/confirmation-dialog/confirmation-dialog.component.html","../../../projects/cat-document-lib/src/lib/document/components/sidebar/sidebar.component.ts","../../../projects/cat-document-lib/src/lib/document/components/sidebar/sidebar.component.html","../../../projects/cat-document-lib/src/lib/document/components/folder-container/folder-container.component.ts","../../../projects/cat-document-lib/src/lib/document/components/folder-container/folder-container.component.html","../../../projects/cat-document-lib/src/lib/document/services/document-table-builder.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-list.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-scroll.service.ts","../../../projects/cat-document-lib/src/Shared/components/table-primary/table-primary.component.ts","../../../projects/cat-document-lib/src/Shared/components/table-primary/table-primary.component.html","../../../projects/cat-document-lib/src/lib/document/services/document-viewer.service.ts","../../../projects/cat-document-lib/src/lib/document/constant/DOCUMENT_HISTORY.ts","../../../projects/cat-document-lib/src/lib/document/services/document-history-style.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-history.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-actions.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-history-ai.service.ts","../../../projects/cat-document-lib/src/lib/document/directives/permission.directive.ts","../../../projects/cat-document-lib/src/lib/document/components/document-ai-chat/document-ai-chat.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-ai-chat/document-ai-chat.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-history/document-history.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-history/document-history.component.html","../../../projects/cat-document-lib/src/lib/document/services/excel-parser.service.ts","../../../projects/cat-document-lib/src/lib/document/services/csv-parser.service.ts","../../../projects/cat-document-lib/src/lib/document/services/document-zoom.service.ts","../../../projects/cat-document-lib/src/lib/document/components/document-zoom-controls/document-zoom-controls.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-zoom-controls/document-zoom-controls.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-content-viewer/document-content-viewer.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-content-viewer/document-content-viewer.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-actions/document-actions.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-actions/document-actions.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-viewer/document-viewer.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-viewer/document-viewer.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-list/document-list.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-list/document-list.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-container/document-container.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-container/document-container.component.html","../../../projects/cat-document-lib/src/lib/document/components/folder-block/folder-block.component.ts","../../../projects/cat-document-lib/src/lib/document/components/folder-block/folder-block.component.html","../../../projects/cat-document-lib/src/lib/document/components/document-list-item/document-list-item.component.ts","../../../projects/cat-document-lib/src/lib/document/components/document-list-item/document-list-item.component.html","../../../projects/cat-document-lib/src/Shared/services/global-error.handler.ts","../../../projects/cat-document-lib/src/lib/document/directives/document.directive.ts","../../../projects/cat-document-lib/src/lib/document/components/linked-document/linked-document.component.ts","../../../projects/cat-document-lib/src/lib/document/components/linked-document/linked-document.component.html","../../../projects/cat-document-lib/src/lib/document/components/documents-menu/documents-menu.component.ts","../../../projects/cat-document-lib/src/lib/document/components/documents-menu/documents-menu.component.html","../../../projects/cat-document-lib/src/lib/document/services/user-list.service.ts","../../../projects/cat-document-lib/src/lib/document/components/user-list/user-list.component.ts","../../../projects/cat-document-lib/src/lib/document/components/user-list/user-list.component.html","../../../projects/cat-document-lib/src/Shared/shared.module.ts","../../../projects/cat-document-lib/src/lib/document/services/document-content-type.service.ts","../../../projects/cat-document-lib/src/lib/document/document.module.ts","../../../projects/cat-document-lib/src/lib/document/services/eml-parser.service.ts","../../../projects/cat-document-lib/src/public-api.ts","../../../projects/cat-document-lib/src/cat-documents-ng.ts"],"sourcesContent":["/**\r\n * The `SHARED` class contains shared constants used across the application.\r\n * These constants are related to document statuses and other shared data.\r\n */\r\nexport class SHARED {\r\n\r\n /**\r\n * Represents the info.\r\n */\r\n static UNKNOWN_USER = 'Unknown User'\r\n /**\r\n * Represents the info.\r\n */\r\n static ACTIONS = 'actions'\r\n /**\r\n * Represents the info.\r\n */\r\n static VISIBLE = 'visible'\r\n /**\r\n * Represents the info.\r\n */\r\n static HIDDEN = 'hidden'\r\n\r\n static NO_DOCUMENTS_FOUND = 'No documents found'\r\n static DOCUMENT_TYPES_DELETE = 'DocumentTypes-DELETE'\r\n static SUCCESS_MESSAGE = 'Document Saved Successfully'\r\n /**\r\n * Represents the info.\r\n */\r\n static APPLICATION_DOCS = 'Application Docs'\r\n /**\r\n * Represents the info.\r\n */\r\n static INFO = 'info'\r\n /**\r\n * Represents the success.\r\n */\r\n static SUCCESS = 'success'\r\n /**\r\n * Represents the warning.\r\n */\r\n static WARNING = 'warning'\r\n /**\r\n * Represents the warning.\r\n */\r\n static DANGER = 'danger'\r\n /**\r\n * Represents the stores userData.\r\n */\r\n static SESSIONKEY = 'userData';\r\n /**\r\n * Represents the count of missing files.\r\n */\r\n static MISSINGCOUNT = 2;\r\n\r\n /**\r\n * Represents the count of pending files.\r\n */\r\n static PENDINGCOUNT = 3;\r\n\r\n /**\r\n * Represents an empty string.\r\n */\r\n static EMPTY = \"\";\r\n /**\r\n * Represents an empty string.\r\n */\r\n static STRING = \"string\";\r\n\r\n /**\r\n * Represents an true.\r\n * @static\r\n * @type {boolean}\r\n */\r\n static TRUE: boolean = true;\r\n\r\n\r\n /**\r\n * Represents an false.\r\n * @static\r\n * @type {boolean}\r\n */\r\n static FALSE: boolean = false;\r\n\r\n /**\r\n * Represents an INITIAL_COUNT.\r\n */\r\n static INITIAL_COUNT = 0\r\n /**\r\n * Represents an INITIAL_VALUE.\r\n */\r\n static INITIAL_VALUE = 0\r\n\r\n /**\r\n * Represents the constant value for one (1).\r\n * @static\r\n * @type {number}\r\n */\r\n static ONE: number = 1\r\n\r\n /**\r\n * Represents the constant value for two (2).\r\n * @static\r\n * @type {number}\r\n */\r\n static TWO: number = 2\r\n\r\n /**\r\n * Represents the constant value for ten (10).\r\n * @static\r\n * @type {number}\r\n */\r\n static TEN: number = 10\r\n\r\n /**\r\n * Represents the constant string value 'files' used for file-related operations.\r\n * @static\r\n * @type {string}\r\n */\r\n static FILE: string = 'file';\r\n\r\n static MSG = 'msg'\r\n static EML = 'eml'\r\n\r\n /**\r\n * Query parameter for menu item filter.\r\n * @static\r\n * @type {string}\r\n */\r\n static MENU_ITEM_PARAM: string = 'menuItem';\r\n\r\n /**\r\n * Query parameter for user ID filter.\r\n * @static\r\n * @type {string}\r\n */\r\n static USER_ID_PARAM: string = 'userId';\r\n\r\n /**\r\n * Query parameter for status filter.\r\n * @static\r\n * @type {string}\r\n */\r\n static STATUS_PARAM: string = 'status';\r\n\r\n /**\r\n * Represents the array of file size units ('B', 'KB', 'MB') used for file size formatting.\r\n * @static\r\n * @type {string[]}\r\n */\r\n static FILE_SIZE_UNITS: string[] = ['B', 'KB', 'MB'];\r\n\r\n /**\r\n * Show SEVERITY value.\r\n * @static\r\n * @type {'error'}\r\n */\r\n static SEVERITY: string = 'error'\r\n /**\r\n * Show SEVERITY value.\r\n * @static\r\n * @type {'error'}\r\n */\r\n static SUCCESS_SEVERITY: string = 'success'\r\n\r\n /**\r\n * Show upload summery if it's failed.\r\n * @static\r\n * @type {'Upload Failed'}\r\n */\r\n static UPLOAD_SUMMERY: string = 'Upload Failed'\r\n\r\n /**\r\n * Show upload summery if it's success.\r\n * @static\r\n * @type {'Document uploaded successfully.'}\r\n */\r\n static UPLOAD_SUCCESS: string = 'Document uploaded successfully.'\r\n\r\n /**\r\n * Represent empty array.\r\n * @static\r\n * @type {{}}\r\n */\r\n static EMPTY_ARRAY = []\r\n\r\n /**\r\n * Represent contextId.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONTEXT_ID: string = 'contextId'\r\n\r\n /**\r\n * Represent contextId.\r\n * @static\r\n * @type {string}\r\n */\r\n static CATEGORY: string = 'category'\r\n\r\n /**\r\n * Represent fileSize.\r\n * @static\r\n * @type {string}\r\n */\r\n static FILE_SIZE: string = 'fileSize'\r\n /**\r\n * Represent documentName.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_NAME: string = 'documentName'\r\n /**\r\n * Represent documentTypeId.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_TYPE_ID: string = 'documentTypeId'\r\n /**\r\n * Represent blob.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT: string = 'document';\r\n /**\r\n * Config `name` for documents AI chat (Configs API). When `data.enabled` is true, the AI control and sidebar show.\r\n * Matches the host app pattern used for `document` tab and `mortgageChatbot` visibility.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_CHATBOT: string = 'docIntelligence';\r\n /**\r\n * Represent none.\r\n * @static\r\n * @type {string}\r\n */\r\n static NONE: string = 'none';\r\n\r\n /**\r\n * Represent upload summery.\r\n * @static\r\n * @type {string}\r\n */\r\n static UPLOAD_ERROR_SUMMERY: string = 'Form Data Missing'\r\n\r\n /**\r\n * Represent upload error details.\r\n * @static\r\n * @type {string}\r\n */\r\n static UPLOAD_ERROR_DETAILS: string = 'Required form data is missing. Please ensure the document and all required fields are provided.'\r\n\r\n /**\r\n * Represents the message prefix for a successful document name update.\r\n * @static\r\n * @type {string}\r\n */\r\n static UPDATE_DOCUMENT_NAME: string = 'Document name updated for ID:'\r\n static WIDTH = '500px'\r\n static BASEZINDEX = 1000\r\n static DOCX = 'docx'\r\n static DOC = 'doc'\r\n static CSV = 'csv'\r\n static CLOSE_ICON = 'pi pi-times'\r\n static SAVE = 'Save'\r\n static UPLOAD_PROGRESS_100 = 100\r\n static UPLOAD_PROGRESS_10 = 10\r\n static APPLICANT = 'Applicant'\r\n static APPLICANT_LOWERCASE = 'applicant'\r\n static APPLICATION_LOWERCASE = 'application'\r\n static DOCUMENT_LOWERCASE = 'document'\r\n static USER_LOWERCASE = 'user'\r\n static CATAGORIES = 'catagories'\r\n static DOCUMENTS = 'Documents'\r\n static UPLOAD_FAILED = 'Upload failed'\r\n static USER_LIST = 'userList'\r\n static HYPEN = '-'\r\n static CATEGORIES = 'categories'\r\n static UNSAVED_CHANGES_MESSAGE = 'You have unsaved changes. Are you sure you want to leave?'\r\n static UNSAVED_CHANGES_HEADER = 'Unsaved Changes'\r\n static DOCUMENT_DELETED_SUCCESSFULLY = 'Document deleted successfully'\r\n static UNSAVED_CHANGES_ICON = 'pi pi-exclamation-triangle'\r\n static REMOVE = 'Remove'\r\n static YES = 'Yes'\r\n static NO = 'No'\r\n static CANCEL = 'Cancel'\r\n static DELETE = 'Delete'\r\n static DELETE_CONFIRMATION_HEADER = 'Delete Confirmation'\r\n static VALUATION_REPORT_DELETE_MESSAGE = 'The deletion of the valuation document will remove all valuation related alerts. New alerts will only be created when a new valuation report is added. Do you want to continue?'\r\n static VALUATION_REPORT = 'valuation report'\r\n static DELETE_BUTTON_STYLE_CLASS = 'btn-danger'\r\n static ACCEPT_ICON = 'pi pi-check'\r\n static REJECT_ICON = 'pi pi-times'\r\n static ACCEPT_BUTTON_STYLE_CLASS = 'p-button-danger'\r\n static REJECT_BUTTON_STYLE_CLASS = 'p-button-secondary'\r\n static NO_DATA_FOUND = 'No data found'\r\n static BORDERS = ['top', 'bottom', 'left', 'right']\r\n static FILE_TYPES = [\r\n 'xlsx', 'xls', 'doc', 'docx', 'pdf', 'jpg', 'jpeg',\r\n 'odt', 'csv', 'png', 'msg', 'eml'\r\n ];\r\n static COMMA = ',';\r\n static TEAM_LEADER = 'TeamLeader';\r\n static UNDERWRITER_USER = 'Underwriter User';\r\n static INITIAL_REQUEST = 'Initial Request'\r\n static ERROR_PARSING_SHEET_DATA = 'Error parsing sheet data'\r\n static REFRESH_TRIGGER = 'refreshTrigger'\r\n static PDF_TYPE = 'application/pdf'\r\n\r\n // MIME Type Constants\r\n static EXCEL_XLSX_MIME_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n static EXCEL_XLS_MIME_TYPE = 'application/vnd.ms-excel'\r\n static OCTET_STREAM = 'application/octet-stream'\r\n static WORD_DOCX_MIME_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\r\n static WORD_DOC_MIME_TYPE = 'application/msword'\r\n static CSV_MIME_TYPE = 'text/csv'\r\n static EMAIL_RFC822_MIME_TYPE = 'message/rfc822'\r\n static EMAIL_OUTLOOK_MIME_TYPE = 'application/vnd.ms-outlook'\r\n static OPEN_DOCUMENT_MIME_TYPE = 'application/vnd.oasis.opendocument.text'\r\n\r\n static ICON_FILE_WORD = 'pi pi-file-word'\r\n static ICON_ENVELOPE = 'pi pi-envelope'\r\n static PDF_DOCUMENT = 'PDF Document'\r\n static IMAGE = 'Image'\r\n static EXCEL_SPREADSHEET = 'Excel Spreadsheet'\r\n static WORD_DOCUMENT = 'Word Document'\r\n static CSV_FILE = 'CSV File'\r\n static EMAIL_MESSAGE = 'Email Message'\r\n static OPEN_DOCUMENT = 'OpenDocument'\r\n static NO_DATA_AVAILABLE = 'No data available'\r\n static ERROR_PARSING_EXCEL_FILE = 'Unable to parse Excel file'\r\n static ERROR_PARSING_EXCEL_FILE_STRUCTURE = 'Unable to parse Excel file structure'\r\n static NAME_UPDATE_ACTION = 'nameUpdate'\r\n static REQUESTED = 'requested'\r\n static ACCEPTED = 'accepted'\r\n static UPLOADED = 'uploaded'\r\n static REJECTED = 'rejected'\r\n static Menu = [\r\n {\r\n label: 'Applicant',\r\n // expanded: true,\r\n // disabled: true,\r\n // separator: true,\r\n items: [\r\n {\r\n label: 'Identity',\r\n icon: 'ri-id-card-line',\r\n badge: \"2/5\"\r\n },\r\n {\r\n label: 'Income',\r\n icon: 'ri-money-pound-circle-line',\r\n badge: \"2/5\"\r\n },\r\n {\r\n label: 'Affordability',\r\n icon: 'ri-calculator-line',\r\n badge: \"2/8\"\r\n },\r\n {\r\n label: 'Cradit conduct',\r\n icon: 'ri-calendar-event-fill',\r\n badge: \"2/4\"\r\n },\r\n {\r\n label: 'KYC',\r\n icon: 'ri-calendar-event-fill',\r\n badge: \"2/4\"\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Welcome Call',\r\n icon: 'ri-calendar-event-fill'\r\n },\r\n {\r\n label: 'Gatehouse Bank Exposure',\r\n badge: \"2/4\",\r\n icon: 'ri-calendar-event-fill'\r\n }\r\n ]\r\n },\r\n {\r\n label: 'Application',\r\n // expanded: true,\r\n // disabled: true,\r\n // separator: true,\r\n items: [\r\n {\r\n badge: \"2/4\",\r\n label: 'Deposit',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Direct Debit',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n label: 'Property',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Completions',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Summary',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'System Documents',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Ad Hoc',\r\n icon: 'ri-mail-open-line'\r\n },\r\n {\r\n badge: \"2/4\",\r\n label: 'Miscellaneous',\r\n icon: 'ri-mail-open-line'\r\n }\r\n ]\r\n }\r\n ];\r\n static APPLICATION = 'Application'\r\n static APPLICANTS = 'Applicants'\r\n static EMPTY_SPACE = ' '\r\n\r\n static COLORS = ['orange', 'blue', 'green', 'grey', 'purple']\r\n\r\n static COLOR_MAP = {\r\n 'orange': '#f97316',\r\n 'blue': '#3b82f6',\r\n 'green': '#10b981',\r\n 'grey': '#6b7280',\r\n 'purple': '#8b5cf6'\r\n }\r\n static DEFAULT_COLOR = '#3b82f6'\r\n static STATUS_WITH_DASH = 'status-'\r\n static ICON_WITH_DASH = 'icon-'\r\n static SEARCH_KEY = 'searchKey'\r\n static APPROVED = 'approved'\r\n static PENDING = 'Pending'\r\n static DOT = '.'\r\n static PDF = 'PDF'\r\n static PDF2 = 'pdf'\r\n static PENDING_STATUS = 'pending'\r\n static EVENT_REQUESTED = 'event-requested'\r\n static EVENT_ACCEPTED = 'event-accepted'\r\n static EVENT_REJECTED = 'event-rejected'\r\n static EVENT_DEFAULT = 'event-default'\r\n static ICON_REQUESTED = 'icon-requested'\r\n static ICON_ACCEPTED = 'icon-accepted'\r\n static ICON_REJECTED = 'icon-rejected'\r\n static ICON_DEFAULT = 'icon-default'\r\n static ICON_CHECK_CIRCLE = 'pi pi-check-circle'\r\n static ICON_FOLDER_PLUS = 'pi pi-folder-plus'\r\n static ICON_TIMES = 'pi pi-times'\r\n static ICON_FILE = 'pi pi-file'\r\n // File extension constants\r\n static JPG = 'JPG'\r\n static PNG = 'PNG'\r\n static XLSX = 'xlsx'\r\n static XLS = 'xls'\r\n // Status constants\r\n static APPROVED_STATUS = 'approved'\r\n static ALERT_STATUS = 'alert'\r\n static UPLOADED_STATUS = 'uploaded'\r\n static REVIEWING_STATUS = 'reviewing'\r\n static REJECTED_STATUS = 'rejected'\r\n static REQUESTED_STATUS = 'document requested'\r\n\r\n // Status class constants\r\n static STATUS_PENDING_CLASS = 'status-pending'\r\n static STATUS_APPROVED_CLASS = 'status-approved'\r\n static STATUS_ALERT_CLASS = 'status-alert'\r\n static STATUS_UPLOADED_CLASS = 'status-uploaded'\r\n static STATUS_REVIEWING_CLASS = 'status-reviewing'\r\n static STATUS_REJECTED_CLASS = 'status-rejected'\r\n\r\n // Icon constants\r\n static ICON_CHECK = 'pi pi-check'\r\n static ICON_EXCLAMATION_TRIANGLE = 'pi pi-exclamation-triangle'\r\n static ICON_CLOUD_UPLOAD = 'pi pi-cloud-upload'\r\n static ICON_EYE = 'pi pi-eye'\r\n static ICON_CLOCK = 'pi pi-clock'\r\n\r\n // File type icons\r\n static ICON_FILE_PDF = 'pi pi-file-pdf'\r\n static ICON_IMAGE = 'pi pi-image'\r\n static ICON_FILE_EXCEL = 'pi pi-file-excel'\r\n static ICON_DELETE = 'ri-delete-bin-6-line'\r\n\r\n // Cell type constants\r\n static CELL_TYPE_DOCUMENT = 'document'\r\n static CELL_TYPE_STATUS = 'status'\r\n static CELL_TYPE_ACTIONS = 'actions'\r\n static CELL_TYPE_TEXT = 'text'\r\n\r\n /**\r\n * Document table columns configuration\r\n * @static\r\n * @type {Array<{field: string, header: string, type: 'text' | 'status' | 'document' | 'actions', width: string}>}\r\n */\r\n static DOCUMENT_TABLE_COLUMNS: Array<{\r\n field: string;\r\n header: string;\r\n type: 'text' | 'status' | 'document' | 'actions';\r\n width: string;\r\n }> = [\r\n {\r\n field: 'docName',\r\n header: 'Document',\r\n type: 'document',\r\n width: '35%'\r\n },\r\n {\r\n field: 'status',\r\n header: 'Status',\r\n type: 'status',\r\n width: '15%'\r\n },\r\n {\r\n field: 'notes',\r\n header: 'Notes',\r\n type: 'text',\r\n width: '15%'\r\n },\r\n {\r\n field: 'uploadedOn',\r\n header: 'Uploaded',\r\n type: 'text',\r\n width: '20%'\r\n },\r\n {\r\n field: 'actions',\r\n header: 'Actions',\r\n type: 'actions',\r\n width: '15%'\r\n }\r\n ];\r\n\r\n static DOCUMENT_REQUESTED = 'document-requested';\r\n static DOCUMENT_UPLOADED = 'document-uploaded';\r\n static DOCUMENT_REJECTED = 'document-rejected';\r\n static DOCUMENT_ACCEPTED = 'document-accepted';\r\n\r\n // Document Actions Constants\r\n static ACCEPT_ACTION = 'accept';\r\n static REJECT_ACTION = 'reject';\r\n static DELETE_ACTION = 'delete';\r\n\r\n static ACCEPT_CONFIRM_HEADER = 'Accept confirm';\r\n static REJECT_CONFIRM_HEADER = 'Reject Confirm';\r\n\r\n static ACCEPT_NOTE_LABEL = 'Write a note for Acceptance';\r\n static REJECT_NOTE_LABEL = 'Write a note for rejection';\r\n\r\n static ACCEPT_NOTE_PLACEHOLDER = 'Write a note for Acceptance';\r\n static REJECT_NOTE_PLACEHOLDER = 'Write a note for rejection';\r\n\r\n static CANCEL_BUTTON_LABEL = 'Cancel';\r\n static ACCEPT_BUTTON_LABEL = 'Accept';\r\n static REJECT_BUTTON_LABEL = 'Reject';\r\n\r\n static DOCUMENT_ACCEPTED_MESSAGE = 'Document accepted successfully';\r\n static DOCUMENT_REJECTED_MESSAGE = 'Document rejected successfully';\r\n static DOCUMENT_UPDATE_ERROR_MESSAGE = 'Failed to update document. Please try again.';\r\n\r\n static STATUS_APPROVED = 'Approved';\r\n static STATUS_REJECTED = 'Rejected';\r\n\r\n // Document Status Constants\r\n static STATUS_PENDING = 'pending';\r\n static STATUS_ACCEPTED = 'accepted';\r\n static STATUS_REJECTED_LOWERCASE = 'rejected';\r\n static STATUS_DECLINED = 'declined';\r\n\r\n // Document Card CSS Classes\r\n static CARD_PENDING = 'pending-card';\r\n static CARD_ACCEPTED = 'accepted-card';\r\n static CARD_REJECTED = 'rejected-card';\r\n\r\n // Document Button CSS Classes\r\n static BUTTON_SECONDARY_REJECT = 'secondary-reject';\r\n static BUTTON_PRIMARY_REJECT = 'primary-reject';\r\n static BUTTON_DEFAULT_REJECT = 'default-reject';\r\n static BUTTON_PRIMARY_ACCEPT = 'primary-accept';\r\n static BUTTON_SECONDARY_ACCEPT = 'secondary-accept';\r\n static BUTTON_DEFAULT_ACCEPT = 'default-accept';\r\n\r\n // Document Action Button Labels\r\n static BUTTON_LABEL_REJECT = 'Reject';\r\n static BUTTON_LABEL_REJECTED = 'Rejected';\r\n static BUTTON_LABEL_ACCEPT = 'Accept';\r\n static BUTTON_LABEL_ACCEPTED = 'Accepted';\r\n\r\n // Document Upload Validation Messages\r\n static VALIDATION_NO_APPLICANT_SELECTED = 'No Applicant Selected';\r\n static VALIDATION_NO_APPLICANT_DETAIL = 'Please select an applicant.';\r\n static VALIDATION_NO_CATEGORY_SELECTED = 'No Category Selected';\r\n static VALIDATION_NO_CATEGORY_DETAIL = 'Please select a category.';\r\n static VALIDATION_NO_DOCUMENT_TYPE_SELECTED = 'No Document Type Selected';\r\n static VALIDATION_NO_DOCUMENT_TYPE_DETAIL = 'Please select a document type.';\r\n static VALIDATION_NO_DOCUMENTS_UPLOADED = 'No Documents Uploaded';\r\n static VALIDATION_NO_DOCUMENTS_DETAIL = 'Please upload at least one document.';\r\n static VALIDATION_FORM_INCOMPLETE = 'Form Incomplete';\r\n static VALIDATION_FORM_INCOMPLETE_DETAIL = 'Please complete all required fields and upload at least one document.';\r\n static VALIDATION_MISSING_REQUIRED_DATA = 'Missing Required Data';\r\n\r\n // Document Upload Assignment Type Messages\r\n static VALIDATION_SELECT_ASSIGNMENT_TYPE = 'Please select an assignment type (Applicant or Application)';\r\n static VALIDATION_SELECT_CATEGORY = 'Please select a document category';\r\n static VALIDATION_SELECT_DOCUMENT_TYPE = 'Please select a document type';\r\n static VALIDATION_UPLOAD_AT_LEAST_ONE = 'Please upload at least one document';\r\n static VALIDATION_WAIT_FOR_UPLOAD = 'Please wait for all files to finish uploading';\r\n static VALIDATION_SELECT_APPLICANT = 'Please select an applicant';\r\n static VALIDATION_ALL_FIELDS_COMPLETED = 'All required fields are completed';\r\n static VALIDATION_OPTIONS_NOT_LOADED = 'Document options are not loaded yet';\r\n static CONTENT_TYPE: string = 'contentType'\r\n static DOCUMENT_URL: string = 'documentUrl'\r\n static DOC_VIEWER_WRAPPER: string = '.doc-viewer-wrapper'\r\n static CSV_TABLE_CONTAINER: string = '.csv-table-container'\r\n static DOCX_CONTAINER: string = '.docx-container'\r\n static PDF_CONTAINER: string = '.pdf-container'\r\n static IMAGE_CONTAINER: string = '.image-container'\r\n static WHEEL_CAPTURE_OVERLAY: string = '.wheel-capture-overlay'\r\n static DOCUMENT_CONTENT_VIEWER_CONTAINER: string = '.document-content-viewer-container'\r\n static EXCEL_ZOOM_WRAPPER: string = '.excel-zoom-wrapper ngx-doc-viewer'\r\n static DOC_ZOOM_WRAPPER: string = '.doc-viewer-wrapper'\r\n static CSV_ZOOM_WRAPPER: string = '.csv-table-container'\r\n static ERROR_PARSING_CSV_FILE: string = 'Error parsing CSV file'\r\n static ERROR_LOADING_CSV_FILE: string = 'Error loading CSV file'\r\n static ERROR_PARSING_CSV_DATA: string = 'Error parsing CSV data'\r\n static ERROR_PARSING_EMAIL_FILE: string = 'Error parsing email file'\r\n static ERROR_LOADING_EMAIL_FILE: string = 'Error loading email file'\r\n static SMOOTH_SCROLL: ScrollBehavior = 'smooth'\r\n static SUMMARY_PROMPT: string = 'Give me a clear, bullet-point summary of the key information in this document.'\r\n static INSIGHTS_PROMPT: string = 'What are the key insights and takeaways from this document? Provide a concise summary of the main points and any important details.'\r\n\r\n\r\n\r\n\r\n}\r\n\r\n/**\r\n * `DUMMYDOCUMENTLIST` is a mock list of document objects used for testing and development purposes.\r\n * Each document includes an ID, file name, status, and document URL.\r\n */\r\nexport const DUMMYDOCUMENTLIST = [\r\n {\r\n _id: 1,\r\n fileName: 'Document 1',\r\n status: 'pending',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n {\r\n _id: 2,\r\n fileName: 'Document 2',\r\n status: 'verified',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n {\r\n _id: 3,\r\n fileName: 'Document 3',\r\n status: 'sentReminder',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n {\r\n _id: 4,\r\n fileName: 'Document 4',\r\n status: 'pending',\r\n documentUrl: 'https://vadimdez.github.io/ng2-pdf-viewer/assets/pdf-test.pdf',\r\n },\r\n];\r\n\r\n/**\r\n * `FOLDERPANEL` is a mock list of folder data representing various folders in the application.\r\n * Each folder contains an ID, file count, text description, missing files count, and pending files count.\r\n */\r\nexport const USERLIST = [\r\n {\r\n _id : \"1\",\r\n username: \"John Smith\",\r\n approveDocumentCount: 15,\r\n pendingDocumentCount: 3\r\n },\r\n {\r\n _id : \"2\",\r\n username: \"Sarah Johnson\",\r\n approveDocumentCount: 8,\r\n pendingDocumentCount: 7\r\n },\r\n {\r\n _id : \"3\",\r\n username: \"Michael Brown\",\r\n approveDocumentCount: 22,\r\n pendingDocumentCount: 1\r\n },\r\n {\r\n _id : \"4\",\r\n username: \"Emily Davis\",\r\n approveDocumentCount: 12,\r\n pendingDocumentCount: 5\r\n }\r\n];\r\n\r\nexport const SAMPLE_STATUS_DATA = [\r\n {\r\n status: \"Approved\",\r\n count: 4,\r\n color: \"#10b981\",\r\n icon: \"pi pi-check\"\r\n },\r\n {\r\n status: \"Pending\",\r\n count: 5,\r\n color: \"#6b7280\",\r\n icon: \"pi pi-clock\"\r\n },\r\n {\r\n status: \"Reviewing\",\r\n count: 1,\r\n color: \"#f59e0b\",\r\n icon: \"pi pi-eye\"\r\n },\r\n {\r\n status: \"Rejected\",\r\n count: 2,\r\n color: \"#ef4444\",\r\n icon: \"pi pi-times\"\r\n },\r\n {\r\n status: \"Alert\",\r\n count: 12,\r\n color: \"#dc2626\",\r\n icon: \"pi pi-exclamation-circle\"\r\n }\r\n];\r\n\r\n/**\r\n * Dummy data for sumaery.\r\n * @type {{}}\r\n */\r\nexport const DUMMYSUMMARY = [\r\n {\r\n status: 'Valuation report requested on 10th Oct 2024',\r\n date: '15/10/2020 10:30',\r\n icon: 'pi pi-shopping-cart',\r\n color: '#9C27B0',\r\n image: 'game-controller.jpg',\r\n },\r\n {\r\n status: 'Valuation report received on 13th Oct 2024',\r\n date: '15/10/2020 14:00',\r\n icon: 'pi pi-cog',\r\n color: '#673AB7',\r\n },\r\n {\r\n status: 'Waiting for Valuation Report to be accepted',\r\n date: '15/10/2020 16:15',\r\n icon: 'pi pi-shopping-cart',\r\n color: '#FF9800',\r\n },\r\n];\r\n\r\n/**\r\n * Dummy data for list box.\r\n * @type {{}}\r\n */\r\nexport const COUNTRIES = [\r\n { name: 'Any Word', code: 'NY', checked: false },\r\n { name: 'Case Sensitive', code: 'RM', checked: false },\r\n { name: 'Wildcard Search', code: 'LDN', checked: false },\r\n { name: 'Whole Word Only', code: 'IST', checked: false },\r\n];\r\n\r\n/**\r\n * Default supported image types.\r\n * @type {{}}\r\n */\r\nexport const SUPPORTED_IMAGE_TYPES = [\r\n 'PNG',\r\n 'png',\r\n 'jpeg',\r\n 'jpg',\r\n 'gif',\r\n 'bmp',\r\n 'tiff',\r\n 'webp',\r\n];\r\n\r\n/**\r\n * @constant {Array<{label: string, value: string, files: string[]}>} DOCUMENTTYPES\r\n * An array of document type objects containing labels, values, and associated files.\r\n */\r\n\r\nexport const DOCUMENTTYPES = [\r\n {\r\n label: \"BankStatement\",\r\n value: \"bank_statement\",\r\n },\r\n {\r\n label: \"Payslip\",\r\n value: \"payslip\",\r\n },\r\n {\r\n label: \"Selfie\",\r\n value: \"selfie\",\r\n },\r\n {\r\n label: \"Other\",\r\n value: \"other\",\r\n }\r\n];\r\n\r\nexport const DocumentAlertList = [\r\n { status: 'Pending', isAlert: true, alertMessage: 'The name on the payslip does not match either the driver name or the policyholder name.' },\r\n { status: 'Verified', isAlert: false, alertMessage: 'Document is verified successfully.' },\r\n];\r\n\r\nexport const OPEN_DOCUMENT_EXTENSIONS = ['odt', 'ods', 'odp'];\r\n\r\n/**\r\n * Dummy data for document sections with detailed document lists.\r\n * Based on the document management interface structure.\r\n * @type {Array<{header: string, description: string, pendingDocument: number, approvedDocument: number, list: Array<{documentName: string, documentType: string, documentUrl: string, status: string, applicantName: string, uploadedTime: string}>}>}\r\n */\r\nexport const DUMMY_DOCUMENT_SECTIONS = [\r\n {\r\n header: \"Identity\",\r\n description: \"Personal identification documents required for verification\",\r\n pendingDocument: 1,\r\n approvedDocument: 1,\r\n list: [\r\n {\r\n documentName: \"passport_emilia_wilson_2025.pdf\",\r\n documentType: \"Passport\",\r\n documentUrl: \"https://example.com/documents/passport_emilia_wilson_2025.pdf\",\r\n status: \"Pending\",\r\n applicantName: \"Charlotte Anderson\",\r\n uploadedTime: \"28 May 2025\"\r\n },\r\n {\r\n documentName: \"driving_license_benjamin_mitchell_2025.jpg\",\r\n documentType: \"Driving License\",\r\n documentUrl: \"https://example.com/documents/driving_license_benjamin_mitchell_2025.jpg\",\r\n status: \"Approved\",\r\n applicantName: \"Benjamin Mitchell\",\r\n uploadedTime: \"27 May 2025\"\r\n },\r\n {\r\n documentName: \"british_gas_bill_may_2025.pdf\",\r\n documentType: \"Utility Bill\",\r\n documentUrl: \"https://example.com/documents/british_gas_bill_may_2025.pdf\",\r\n status: \"Alert\",\r\n applicantName: \"Sophia Reynolds\",\r\n uploadedTime: \"26 May 2025\"\r\n },\r\n {\r\n documentName: \"council_tax_oliver_thompson_2025_2026.pdf\",\r\n documentType: \"Council Tax Bill\",\r\n documentUrl: \"https://example.com/documents/council_tax_oliver_thompson_2025_2026.pdf\",\r\n status: \"Uploaded\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"30 May 2025\"\r\n },\r\n {\r\n documentName: \"certified_id_oliver_thompson_2025.pdf\",\r\n documentType: \"Certified ID\",\r\n documentUrl: \"https://example.com/documents/certified_id_oliver_thompson_2025.pdf\",\r\n status: \"Reviewing\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n },\r\n {\r\n documentName: \"proof_of_address_oliver_thompson_2025.pdf\",\r\n documentType: \"Proof of Address\",\r\n documentUrl: \"https://example.com/documents/proof_of_address_oliver_thompson_2025.pdf\",\r\n status: \"Rejected\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n }\r\n ]\r\n },\r\n {\r\n header: \"Income\",\r\n description: \"Personal Income documents required for verification\",\r\n pendingDocument: 1,\r\n approvedDocument: 1,\r\n list: [\r\n {\r\n documentName: \"passport_emilia_wilson_2025.pdf\",\r\n documentType: \"Passport\",\r\n documentUrl: \"https://example.com/documents/passport_emilia_wilson_2025.pdf\",\r\n status: \"Pending\",\r\n applicantName: \"Charlotte Anderson\",\r\n uploadedTime: \"28 May 2025\"\r\n },\r\n {\r\n documentName: \"driving_license_benjamin_mitchell_2025.jpg\",\r\n documentType: \"Driving License\",\r\n documentUrl: \"https://example.com/documents/driving_license_benjamin_mitchell_2025.jpg\",\r\n status: \"Approved\",\r\n applicantName: \"Benjamin Mitchell\",\r\n uploadedTime: \"27 May 2025\"\r\n },\r\n {\r\n documentName: \"british_gas_bill_may_2025.pdf\",\r\n documentType: \"Utility Bill\",\r\n documentUrl: \"https://example.com/documents/british_gas_bill_may_2025.pdf\",\r\n status: \"Alert\",\r\n applicantName: \"Sophia Reynolds\",\r\n uploadedTime: \"26 May 2025\"\r\n },\r\n {\r\n documentName: \"council_tax_oliver_thompson_2025_2026.pdf\",\r\n documentType: \"Council Tax Bill\",\r\n documentUrl: \"https://example.com/documents/council_tax_oliver_thompson_2025_2026.pdf\",\r\n status: \"Uploaded\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"30 May 2025\"\r\n },\r\n {\r\n documentName: \"certified_id_oliver_thompson_2025.pdf\",\r\n documentType: \"Certified ID\",\r\n documentUrl: \"https://example.com/documents/certified_id_oliver_thompson_2025.pdf\",\r\n status: \"Reviewing\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n },\r\n {\r\n documentName: \"proof_of_address_oliver_thompson_2025.pdf\",\r\n documentType: \"Proof of Address\",\r\n documentUrl: \"https://example.com/documents/proof_of_address_oliver_thompson_2025.pdf\",\r\n status: \"Rejected\",\r\n applicantName: \"Oliver Thompson\",\r\n uploadedTime: \"02 Jun 2025\"\r\n }\r\n ]\r\n }\r\n];\r\n","/**\r\n * A utility class containing common error messages.\r\n * @class ERRORS\r\n */\r\nexport class ERRORS {\r\n /**\r\n * Error message for invalid recipient.\r\n * @static\r\n * @type {string}\r\n */\r\n static INVALID_RECIPIENT = \"Invalid recipient: The recipient cannot be empty.\";\r\n \r\n static NO_VALUE_FOUND = \"No value found\";\r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_FETCHING_DOCUMENTS = \"Error fetching documents:\";\r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_FETCHING_FOLDERS = \"Error fetching folders:\";\r\n \r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_ALLDOCUMENT_MISSING = \"allDocumentTypes is missing in the response:\";\r\n /**\r\n * Error message for invalid document.\r\n * @static\r\n * @type {string}\r\n */\r\n static ERROR_DOCUMENT_TYPES = \"Error fetching document types:\";\r\n\r\n static ERROR_DOCUMENT_CATAGORY = 'Error fetching document categories:'\r\n static NO_DOCUMENT_URL = 'No document URL provided for download'\r\n static DOWNLOAD_FAIL = 'Download failed:'\r\n static ERROR_DELETING_DOCUMENT = 'Error deleting document:'\r\n static ERROR_RECEIVING_DOCUMENT_LIST = 'Error receiving document list response:'\r\n static CONTEXT_ID_REQUIRED = 'Context ID is required to fetch status data'\r\n static ERROR_FETCHING_STATUS_DATA = 'Error fetching status data:'\r\n static ERROR_FETCHING_USER_LIST = 'Error fetching user list with filters:'\r\n static ERROR_FETCHING_DOCUMENT_LIST = 'Error fetching document list:'\r\n static ERROR_FETCHING_DOCUMENT_CATEGORIES = 'Error fetching document categories:'\r\n static ERROR_FETCHING_DOCUMENTS_BY_STATUS = 'Error fetching documents by status:'\r\n static ERROR_FETCHING_DOCUMENTS_BY_CATEGORY = 'Error fetching documents by category:'\r\n static ERROR_CALLING_API_WITH_SELECTION = 'Error calling API with selection:'\r\n static ERROR_FILE_NAME_INVALID_CHARACTERS = 'File name contains invalid characters (< > : \" / \\\\ | ? *)'\r\n static ERROR_FILE_NAME_EMPTY = 'File name cannot be empty'\r\n static ERROR_QUESTION_GENERATION = 'Question cannot be generated.'\r\n}\r\n","/**\r\n * Class that holds the URLs used throughout the application.\r\n * These URLs are typically used for making API requests and accessing various resources.\r\n * @class URLS\r\n * @typedef {URLS}\r\n */\r\nexport class URLS {\r\n /**\r\n * The URL to fetch the application configuration file.\r\n * This JSON file typically contains settings and options for the application.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONFIGFILEURL = \"assets/config/api.config.json\";\r\n\r\n /**\r\n * QW Configs collection path (same as host `getApiConfig` / `RecordService`).\r\n * Full URL: `{catQwUrl}{CONFIGS}`.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONFIGS = 'Configs';\r\n\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_UPLOAD_FILE = \"documents/uploadFile\";\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_UPLOAD = \"Documents\";\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENTS = \"documents\";\r\n /**\r\n * The URL endpoint for document uploads.\r\n * Used to send documents to the server for storage or processing.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENTS_CATAGORIES = \"documents/getAllCategoriesByApplicationId\";\r\n\r\n /**\r\n * The query parameter to pass a context ID in API requests.\r\n * Used to specify the context for certain API calls, such as filtering or scoping the request.\r\n * @static\r\n * @type {string}\r\n */\r\n static CONTEXT = \"?contextId=\";\r\n\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static DOCUMENT_TYPES = \"documentTypes\";\r\n static ALIAS_NAME = 'documents/updateAliasNameByDocumentId/';\r\n /**\r\n * The URL endpoint for getting categories by source (Applicant/Application).\r\n * Used to fetch document categories based on the selected source.\r\n * @static\r\n * @type {string}\r\n */\r\n static GET_CATEGORIES_BY_SOURCE = \"documentTypes/getAllCategoriesBySource/\";\r\n /**\r\n * The URL endpoint for getting document types by category ID.\r\n * Used to fetch document types based on the selected category.\r\n * @static\r\n * @type {string}\r\n */\r\n static GET_DOCUMENT_TYPES_BY_CATEGORY = \"documentTypes/getAllDocumentTypesByCategoryId/\";\r\n /**\r\n * The URL endpoint for saving document upload data.\r\n * Used to save the complete document upload information.\r\n * @static\r\n * @type {string}\r\n */\r\n static SAVE_DOCUMENT_UPLOAD = \"documents/create\";\r\n /**\r\n * The query parameter to pass a context ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static FOLDERS = \"/folders?contextId=\";\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static ALERT_BY_DOCUMENT_ID = \"alerts?documentId=\";\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static PARENT_DOCUMENT_TYPE_ID = \"parentDocumentType?parentDocumentTypeId=\";\r\n /**\r\n * The query parameter to pass a document ID in API requests.\r\n * @static\r\n * @type {string}\r\n */\r\n static USERLIST = \"documents/getContextIdListByApplicationId/\";\r\n\r\n /**\r\n * The URL endpoint for getting document status count by context ID.\r\n * Used to fetch status data with applicationId, contextId, and category parameters.\r\n * @static\r\n * @type {string}\r\n */\r\n static STATUS_DOCUMENT_COUNT = \"documents/getStatusDocumentCountByContextId/\";\r\n\r\n /**\r\n * The query parameter to pass a context ID in API requests.\r\n * Used to specify the context for certain API calls, such as filtering or scoping the request.\r\n * @static\r\n * @type {string}\r\n */\r\n \r\n static CONTEXT_ID = \"&contextId=\";\r\n static GETALL = \"documents/getAllByContextId\";\r\n static DOCUMENT_LIST = \"list\";\r\n static DOCUMENT_HISTORY = \"documents/getDocumentHistoryByDocumentId/\";\r\n static DELETE_DOCUMENT = \"documents/deleteDocumentByDocumentId/\";\r\n static UPDATE_DOCUMENT_STATUS = \"documents/updateDocumentStatusByDocumentId/\";\r\n static DOCUMENT_REQUEST = \"documents/requestDocument\";\r\n static VALUATION_REPORT = \"valuationReport/\";\r\n static CONVERT_TO_PDF = \"documents/convert-email-to-pdf\";\r\n static BROKER_DOCUMENT_CATAGORIES = \"documentTypes/getAllCategoriesForBrokerBySource/\"\r\n static BROKER_DOCUMENT_TYPES = \"documentTypes/getAllDocumentTypesForBrokerByCategoryId/\"\r\n static AI_QUESTION = \"question/\";\r\n}\r\n","import { EntityState } from '@datorama/akita';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { DocumentAlertModel } from '../models/document-alert.model';\r\nimport { FolderBlockModel } from '../models/folder.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { Message } from 'primeng/api';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\n\r\n/**\r\n * Represents the state of the documents in the application.\r\n * This interface extends Akita's `EntityState` to include additional properties\r\n * for managing document-specific data, such as `records`, `filteredRecords` and `folderId`.\r\n * @interface DocumentState\r\n * @property {any[]} records - A collection of records related to documents.\r\n * @property {any[]} filteredRecords - A collection of filteredRecords related to documents.\r\n * @property {string | null} folderId - The ID of the currently selected folder, or `null` if no folder is selected.\r\n * @property {boolean} isDialogOpen - A flag indicating whether a dialog is open.\r\n */\r\nexport interface DocumentState extends EntityState<DocumentModel, string> {\r\n records: DocumentModel[];\r\n folderId: string | null;\r\n isDialogOpen: boolean;\r\n filteredRecords:DocumentModel[];\r\n dropdownOptions: DocumentTypeModel[];\r\n uploadedDocumentFiles: DocumentModel[];\r\n parentDocumentTypeId: string | null;\r\n documentAlert:DocumentAlertModel\r\n folders:FolderBlockModel[]\r\n messages: Message[]\r\n documentList : DocumentModel[]\r\n documentCategories: DocumentCategory[];\r\n selectedMenuItem: string | null; // Stores the _id of the selected menu item, not the label\r\n selectedUserId: string | null;\r\n selectedStatus: string | null;\r\n searchKey: string | null; // Search term for filtering documents\r\n showUserList: boolean;\r\n currentDocument: DocumentModel | null;\r\n userList: UserListModel[];\r\n statusData: StatusDataModel[];\r\n documentListResponse: DocumentListResponse[] | null;\r\n \r\n // Document Viewer State\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n}\r\n\r\n/**\r\n * Creates the initial state for the `DocumentState` store.\r\n * This function provides default values for all properties in the `DocumentState` interface,\r\n * ensuring the store starts with a consistent initial structure.\r\n * @returns {DocumentState} The initial state of the document store.\r\n */\r\nexport function createInitialState(): DocumentState {\r\n return {\r\n records: [],\r\n filteredRecords: [],\r\n folderId: null,\r\n isDialogOpen: false,\r\n dropdownOptions: [], \r\n uploadedDocumentFiles: [],\r\n parentDocumentTypeId: null,\r\n documentAlert: {_id:''},\r\n folders:[],\r\n messages:[],\r\n documentList : [],\r\n documentCategories: [],\r\n selectedMenuItem: null,\r\n selectedUserId: null,\r\n selectedStatus: null,\r\n searchKey: null,\r\n showUserList: true,\r\n currentDocument: null,\r\n userList: [],\r\n statusData: [],\r\n documentListResponse: null,\r\n \r\n // Document Viewer State\r\n selectedDocument: undefined,\r\n documentHistory: [],\r\n showDocumentHistory: false,\r\n isActionLoading: false,\r\n documentStatus: 'pending' as 'pending',\r\n documentIsUploaded: false,\r\n alertData: null,\r\n deleteError: null,\r\n deleteSuccess: false\r\n };\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { EntityStore, StoreConfig } from '@datorama/akita';\r\nimport { createInitialState, DocumentState } from './document.state';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { Message } from 'primeng/api';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\n\r\n/**\r\n * Store that manages the state of documents in the application.\r\n * The `DocumentStore` class extends Akita's `EntityStore` to manage the entity state for documents.\r\n * It uses the `createInitialState` function to initialize the store with default values and \r\n * is configured with the name `'documents'`.\r\n * @augments EntityStore<DocumentState>\r\n */\r\n@Injectable({ providedIn: 'root' })\r\n@StoreConfig({ name: 'documents' })\r\nexport class DocumentStore extends EntityStore<DocumentState> {\r\n /**\r\n * Creates an instance of `DocumentStore` with the initial state of the documents.\r\n */\r\n constructor() {\r\n super(createInitialState());\r\n }\r\n \r\n setUploadedDocumentFiles(files: any[]) {\r\n this.update({ uploadedDocumentFiles: files });\r\n }\r\n\r\n setFolders(folders: any) {\r\n this.update({ folders: folders });\r\n }\r\n \r\n setDocumentTypes(documentType: any) {\r\n this.update({ uploadedDocumentFiles: documentType });\r\n }\r\n\r\n setDocumentAlert(documentAlert: any) { \r\n this.update({ documentAlert : documentAlert });\r\n }\r\n\r\n setParentDocumentTypeId(parentDocumentTypeId: string) {\r\n this.update({ parentDocumentTypeId });\r\n }\r\n \r\n setMessage(message: Message[]) {\r\n this.update({ messages : message });\r\n }\r\n\r\n setDocumentList(documents: DocumentModel[]) {\r\n this.update({ documents : documents });\r\n }\r\n\r\n setDocumentCategories(categories: DocumentCategory[]) {\r\n this.update({ documentCategories: categories });\r\n }\r\n\r\n // New methods for selection state management\r\n setSelectedMenuItem(menuItem: string | null) {\r\n this.update({ selectedMenuItem: menuItem });\r\n }\r\n\r\n setSelectedUserId(userId: string | null) {\r\n this.update({ selectedUserId: userId });\r\n }\r\n\r\n setSelectedStatus(status: string | null) {\r\n this.update({ selectedStatus: status });\r\n }\r\n\r\n setSearchKey(searchKey: string | null) {\r\n this.update({ searchKey: searchKey });\r\n }\r\n\r\n // Method to update all selection properties at once\r\n setSelectionState(menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null = null) {\r\n this.update({ \r\n selectedMenuItem: menuItem,\r\n selectedUserId: userId,\r\n selectedStatus: status,\r\n searchKey: searchKey\r\n });\r\n }\r\n\r\n // Method to clear all selection state\r\n clearSelectionState() {\r\n this.update({\r\n selectedMenuItem: null,\r\n selectedUserId: null,\r\n selectedStatus: null,\r\n searchKey: null,\r\n showUserList: true\r\n });\r\n }\r\n\r\n // Method to control user list visibility\r\n setShowUserList(show: boolean) {\r\n this.update({ showUserList: show });\r\n }\r\n\r\n // Method to set the current document\r\n setCurrentDocument(document: DocumentModel | null) {\r\n this.update({ currentDocument: document });\r\n }\r\n\r\n // Method to set the user list\r\n setUserList(userList: UserListModel[]) {\r\n this.update({ userList: userList });\r\n }\r\n\r\n // Method to set the status data\r\n setStatusData(statusData: StatusDataModel[]) {\r\n this.update({ statusData: statusData });\r\n }\r\n\r\n // Method to set the document list response\r\n setDocumentListResponse(response: DocumentListResponse[] | null) {\r\n this.update({ documentListResponse: response });\r\n }\r\n\r\n // Document Viewer State Management Methods\r\n setSelectedDocument(document: DocumentListItem | undefined) {\r\n this.update({ selectedDocument: document });\r\n }\r\n\r\n setDocumentHistory(history: DocumentHistorySection[]) {\r\n this.update({ documentHistory: history });\r\n }\r\n\r\n setShowDocumentHistory(show: boolean) {\r\n this.update({ showDocumentHistory: show });\r\n }\r\n\r\n setIsActionLoading(loading: boolean) {\r\n this.update({ isActionLoading: loading });\r\n }\r\n\r\n setDocumentStatus(status: 'pending' | 'accepted' | 'rejected') {\r\n this.update({ documentStatus: status });\r\n }\r\n\r\n setDocumentIsUploaded(uploaded: boolean) {\r\n this.update({ documentIsUploaded: uploaded });\r\n }\r\n\r\n setAlertData(alertData: any) {\r\n this.update({ alertData: alertData });\r\n }\r\n\r\n setDeleteError(error: any) {\r\n this.update({ deleteError: error });\r\n }\r\n\r\n setDeleteSuccess(success: boolean) {\r\n this.update({ deleteSuccess: success });\r\n }\r\n\r\n // Method to update all document viewer state at once\r\n updateDocumentViewerState(\r\n document?: DocumentListItem,\r\n history?: DocumentHistorySection[],\r\n showHistory?: boolean,\r\n loading?: boolean,\r\n status?: 'pending' | 'accepted' | 'rejected',\r\n uploaded?: boolean,\r\n alertData?: any\r\n ) {\r\n const updates: Partial<DocumentState> = {};\r\n \r\n if (document !== undefined) updates.selectedDocument = document;\r\n if (history !== undefined) updates.documentHistory = history;\r\n if (showHistory !== undefined) updates.showDocumentHistory = showHistory;\r\n if (loading !== undefined) updates.isActionLoading = loading;\r\n if (status !== undefined) updates.documentStatus = status;\r\n if (uploaded !== undefined) updates.documentIsUploaded = uploaded;\r\n if (alertData !== undefined) updates.alertData = alertData;\r\n \r\n this.update(updates);\r\n }\r\n\r\n // Method to clear document viewer state\r\n clearDocumentViewerState() {\r\n this.update({\r\n selectedDocument: undefined,\r\n documentHistory: [],\r\n showDocumentHistory: false,\r\n isActionLoading: false,\r\n documentStatus: 'pending' as 'pending',\r\n documentIsUploaded: false,\r\n alertData: null,\r\n deleteError: null,\r\n deleteSuccess: false\r\n });\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { URLS } from '../constant/URLS';\r\n\r\n/**\r\n * Service that handles loading and providing configuration settings for the application.\r\n * It fetches configuration data from a remote server and exposes various configuration options.\r\n * @class AppConfigService\r\n * @typedef {AppConfigService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppConfigService {\r\n\r\n /**\r\n * Holds the configuration data loaded from the server.\r\n * @private\r\n * @type {*}\r\n */\r\n private appConfig: any;\r\n\r\n /**\r\n * Creates an instance of AppConfigService.\r\n * Initializes the HttpClient for making HTTP requests.\r\n * @class\r\n * @param {HttpClient} http - The HttpClient service used for making HTTP requests.\r\n */\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Loads the application configuration from the server by making an HTTP request to the configuration URL.\r\n * This method retrieves the configuration data and assigns it to the appConfig property.\r\n * @async\r\n * @returns {*} Resolves when configuration is loaded successfully.\r\n */\r\n async loadAppConfig() {\r\n try {\r\n this.appConfig = await firstValueFrom(this.http.get(URLS.CONFIGFILEURL));\r\n } catch (error) {\r\n throw new Error(\"Api url is missing.\")\r\n }\r\n }\r\n \r\n\r\n /**\r\n * Returns the base URL for the API from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get apiBaseUrl() {\r\n return this.appConfig?.documentApiUrl;\r\n }\r\n\r\n /**\r\n * QW API base URL (typically ends with `/api/`), used for Configs and other QW endpoints.\r\n * @readonly\r\n * @type {string | undefined}\r\n */\r\n get catQwUrl(): string | undefined {\r\n return this.appConfig?.catQwUrl;\r\n }\r\n\r\n /**\r\n * Returns the local server API URL from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get localServerApi() {\r\n return this.appConfig?.localServerApi;\r\n }\r\n\r\n /**\r\n * Returns the document intelligence API base URL from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get documentIntelligenceApiUrl() {\r\n return this.appConfig?.documentIntelligenceApiUrl;\r\n }\r\n\r\n /**\r\n * Returns the visibility options from the loaded configuration.\r\n * @readonly\r\n * @type {*}\r\n */\r\n get visibilityOptions() {\r\n return this.appConfig?.visibilityOption;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { catchError, EMPTY, Observable, of, tap, throwError } from 'rxjs';\r\nimport { URLS } from '../../../Shared/constant/URLS';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { AppConfigService } from '../../../Shared/services/app-config.service';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { DocumentAlertModel } from '../models/document-alert.model';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { FolderBlockModel } from '../models/folder.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\n\r\nexport interface AiQuestionResponse {\r\n success: boolean;\r\n document_id: string;\r\n question: string;\r\n answer: string;\r\n question_number: number;\r\n token_optimized: boolean;\r\n}\r\n\r\n/**\r\n * Service for making HTTP requests related to documents.\r\n * Authentication is handled automatically by the HTTP interceptor in the main project.\r\n * @class DocumentHttpService\r\n * @typedef {DocumentHttpService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class DocumentHttpService {\r\n /**\r\n * Creates an instance of DocumentService.\r\n * @param {DocumentStore} documentStore - Store managing the state of documents.\r\n * @param {HttpClient} http - Angular HTTP client for making API requests.\r\n * @param {AppConfigService} appConfigService - Service for retrieving application configuration, such as API base URL.\r\n */\r\n constructor(\r\n public documentStore: DocumentStore,\r\n private http: HttpClient,\r\n public appConfigService: AppConfigService\r\n ) { }\r\n\r\n /**\r\n * Get api url from appConfigService.\r\n * @readonly\r\n * @type {string}\r\n */\r\n get apiUrl(): string {\r\n return this.appConfigService.apiBaseUrl;\r\n }\r\n\r\n /**\r\n * Fetches application Configs from QW (`catQwUrl` + `Configs`), same shape as host `getApiConfig`.\r\n * Used for feature flags such as `SHARED.DOCUMENT_CHATBOT` with `data.enabled`.\r\n * @returns {Observable<any[]>} Config rows or empty array if URL missing or request fails.\r\n */\r\n getAppConfigs(): Observable<any[]> {\r\n const qw = this.appConfigService.catQwUrl;\r\n if (!qw) {\r\n return of([]);\r\n }\r\n const base = qw.endsWith('/') ? qw : `${qw}/`;\r\n return this.http.get<any[]>(`${base}${URLS.CONFIGS}`).pipe(\r\n catchError(() => of([]))\r\n );\r\n }\r\n\r\n /**\r\n * Returns base URL for document intelligence APIs.\r\n * @returns {string} Base URL for AI endpoints.\r\n */\r\n get documentIntelligenceApiUrl(): string {\r\n return this.appConfigService.documentIntelligenceApiUrl;\r\n }\r\n\r\n /**\r\n * Calls AI question endpoint for chat answers.\r\n * Uses same HttpClient as getDocumentHistoryByDocumentId; host app interceptor supplies Authorization Bearer.\r\n * @param {string} documentId - The document ID used for context.\r\n * @param {string} question - The question asked by the user.\r\n * @returns {Observable<AiQuestionResponse>} AI question answer response.\r\n */\r\n askAiQuestion(documentId: string, question: string): Observable<AiQuestionResponse> {\r\n if (!documentId || !this.documentIntelligenceApiUrl) {\r\n return throwError(() => new Error(ERRORS.ERROR_QUESTION_GENERATION));\r\n }\r\n\r\n return this.http.post<AiQuestionResponse>(\r\n `${this.documentIntelligenceApiUrl}${URLS.AI_QUESTION}${documentId}`,\r\n { question }\r\n ).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document by its path name and transforms the response for dropdown options.\r\n * Includes error handling for failed API requests.\r\n * @param {string} contextId - The context ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getFoldersData(contextId:string | undefined): Observable<FolderBlockModel[]> {\r\n if(!contextId) return EMPTY;\r\n return this.http.get<FolderBlockModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}${URLS.FOLDERS}${contextId}`).pipe(\r\n tap((folders: FolderBlockModel[]) => {\r\n this.documentStore.setFolders(folders);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document catagories by its path name.\r\n * Includes error handling for failed API requests.\r\n * @param {string} contextId - The context ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getDocumentCatagories(contextId:string): Observable<any> { \r\n return this.http.get<any>(`${this.apiUrl}${URLS.DOCUMENTS_CATAGORIES}/${contextId}` )\r\n .pipe(\r\n tap((response: any) => {\r\n if (response && response.categories) {\r\n this.documentStore.setDocumentCategories(response.categories);\r\n }\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n /**\r\n * Fetches a document by its path name and transforms the response for dropdown options.\r\n * Includes error handling for failed API requests.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n // getDocumentTypes(): Observable<DocumentTypeModel[]> {\r\n // return this.http.get<DocumentTypeModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${URLS.DOCUMENT_TYPES}`).pipe(\r\n // tap((documentTypes: DocumentTypeModel[]) => {\r\n // this.documentStore.setDocumentTypes(documentTypes);\r\n // }),\r\n // catchError((error) => {\r\n // return throwError(() => new Error(error));\r\n // })\r\n // );\r\n // }\r\n \r\n /**\r\n * Fetches a document by its path name and transforms the response for dropdown options.\r\n * @param {string} documentId - The document ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getAlertsByDocumentID(documentId:string): Observable<DocumentAlertModel> { \r\n return this.http.get<DocumentAlertModel>(`${this.apiUrl}${URLS.ALERT_BY_DOCUMENT_ID}${documentId}`).pipe(\r\n tap((documentAlert: DocumentAlertModel) => {\r\n this.documentStore.setDocumentAlert(documentAlert);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document by its folder ID and transforms the response for dropdown options.\r\n * @param {string} folderId - The folder ID to fetch the document.\r\n * @param {string} contextId - The context ID to fetch the document.\r\n * @returns {Observable<any>} Observable that emits the transformed data for dropdown options.\r\n */\r\n getDocumentByFolderID(folderId:string, contextId:string): Observable<DocumentModel[]> {\r\n return this.http.get<DocumentModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${URLS.PARENT_DOCUMENT_TYPE_ID}${folderId}${URLS.CONTEXT_ID}${contextId}`).pipe(\r\n tap((records: DocumentModel[]) => {\r\n this.documentStore.set(records);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates the name of a document.\r\n * This method sends an HTTP PUT request to update the document's file name using the provided document ID and payload.\r\n * In case of an error, it will return an observable that throws an Error.\r\n * @param {string} documentId - The unique identifier of the document to update.\r\n * @param {any} payload - The payload containing the updated document data (e.g., fileName).\r\n * @returns {Observable<DocumentModel>} An observable that emits the updated DocumentModel.\r\n */\r\n updateDocumentName(documentId: string, payload: any): Observable<DocumentModel> {\r\n return this.http.put<DocumentModel>(`${this.apiUrl}${URLS.ALIAS_NAME}${documentId}`, payload).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a userlist by its path name.\r\n * @param {string} contextId - The document ID to fetch the document.\r\n * @returns {Observable<UserListModel[]>} Observable that emits the user list data.\r\n */\r\n getUserListByContextId(contextId : string): Observable<UserListModel[]> {\r\n if(!contextId) return EMPTY;\r\n return this.http.get<UserListModel[]>(`${this.apiUrl}${URLS.USERLIST}${contextId}`).pipe(\r\n tap((userList: UserListModel[]) => {\r\n this.documentStore.setUserList(userList);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches document status count data by application ID with optional context ID and category parameters.\r\n * @param {string} applicationId - The application ID to fetch status data.\r\n * @param {string | null} contextId - The context ID (applicant ID) to filter by. If null, uses applicationId.\r\n * @param {string | null} categoryId - The category ID to filter by.\r\n * @returns {Observable<StatusDataModel[]>} Observable that emits the status data.\r\n */\r\n getStatusDocumentCount(applicationId: string, contextId: string | null = null, categoryId: string | null = null): Observable<StatusDataModel[]> {\r\n if(!applicationId) return EMPTY;\r\n let url = `${this.apiUrl}${URLS.STATUS_DOCUMENT_COUNT}${applicationId}`;\r\n let params = new HttpParams();\r\n const contextParam = contextId || null;\r\n if (contextParam) {\r\n params = params.set(SHARED.CONTEXT_ID, contextParam);\r\n } \r\n if (categoryId) {\r\n params = params.set(SHARED.CATEGORY, categoryId);\r\n }\r\n return this.http.get<StatusDataModel[]>(url, { params}).pipe(\r\n tap((statusData: StatusDataModel[]) => {\r\n this.documentStore.setStatusData(statusData);\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Fetches documents based on selection criteria (user ID, status, and search key).\r\n * This method sends an HTTP GET request with query parameters for the selected filters.\r\n * Note: Menu item filtering has been removed - menu items are now used for navigation only.\r\n * @param {string} contextId - The context ID (applicationId or applicantId).\r\n * @param {string | null} menuItem - Reserved parameter (no longer used for filtering).\r\n * @param {string | null} userId - The selected user ID filter.\r\n * @param {string | null} status - The selected status filter.\r\n * @param {string | null} searchKey - The search key filter.\r\n * @returns {Observable<any>} An observable that emits the filtered document data.\r\n */\r\n getDocumentsBySelection(contextId: string, menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null = null): Observable<any> {\r\n let params = new HttpParams();\r\n if (userId) { params = params.set(SHARED.CONTEXT_ID, userId); }\r\n \r\n if (status) { params = params.set(SHARED.STATUS_PARAM, status); }\r\n\r\n if (searchKey) { params = params.set(SHARED.SEARCH_KEY, searchKey); }\r\n return this.http.get<any>(`${this.apiUrl}${URLS.GETALL}/${contextId}`, { params }).pipe(\r\n tap((response: any) => {\r\n if (response.documents) {\r\n this.documentStore.setDocumentList(response.documents);\r\n }\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n getDocumentHistory(documentId: string): Observable<DocumentHistorySection[]> {\r\n if (!documentId) {\r\n return of([]);\r\n }\r\n return this.http.get<DocumentHistorySection[]>(`${this.apiUrl}${URLS.DOCUMENT_HISTORY}${documentId}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches document categories by source (Applicant/Application).\r\n * @param {string} source - The source type (Applicant or Application).\r\n * @returns {Observable<DocumentCategory[]>} Observable that emits the categories.\r\n */\r\n getCategoriesBySource(source: string): Observable<DocumentCategory[]> {\r\n if (!source) return EMPTY;\r\n return this.http.get<DocumentCategory[]>(`${this.apiUrl}${URLS.GET_CATEGORIES_BY_SOURCE}${source}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /** \r\n * Fetches broker document categories by source.\r\n * @param {string} source - The source type (Broker).\r\n * @returns {Observable<DocumentCategory[]>} Observable that emits the categories.\r\n */\r\n getBrokerDocumentCatagoriesBySource(source : string):Observable<DocumentCategory[]>{\r\n if(!source) return EMPTY;\r\n return this.http.get<DocumentCategory[]>(`${this.apiUrl}${URLS.BROKER_DOCUMENT_CATAGORIES}${source}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches broker document types by category ID.\r\n * @param {string} categoryId - The category ID to fetch document types for.\r\n * @returns {Observable<DocumentTypeModel[]>} Observable that emits the document types.\r\n */\r\n\r\n getBrokerDocumentTypesByCategoryId(categoryId: string): Observable<DocumentTypeModel[]> {\r\n if (!categoryId) return EMPTY;\r\n return this.http.get<DocumentTypeModel[]>(`${this.apiUrl}${URLS.BROKER_DOCUMENT_TYPES}${categoryId}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches document types by category ID.\r\n * @param {string} categoryId - The category ID to fetch document types for.\r\n * @returns {Observable<DocumentTypeModel[]>} Observable that emits the document types.\r\n */\r\n getDocumentTypesByCategory(categoryId: string): Observable<DocumentTypeModel[]> {\r\n if (!categoryId) return EMPTY;\r\n return this.http.get<DocumentTypeModel[]>(`${this.apiUrl}${URLS.GET_DOCUMENT_TYPES_BY_CATEGORY}${categoryId}`).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Uploads a single file using the uploadFile API.\r\n * @param {FormData} formData - The form data containing the file and metadata.\r\n * @returns {Observable<any>} Observable that emits the upload response.\r\n */\r\n uploadFile(formData: FormData): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}`, formData).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Saves the complete document upload data.\r\n * @param {any} payload - The document upload payload containing all necessary data.\r\n * @returns {Observable<any>} Observable that emits the save response.\r\n */\r\n saveDocumentUpload(payload: any): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.SAVE_DOCUMENT_UPLOAD}`, payload).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates the status of a document by document ID\r\n * @param {string} documentId - The ID of the document to update\r\n * @param {string} status - The new status (Approved, Rejected, etc.)\r\n * @param {string} statusUpdateDescription - The description/note for the status update\r\n * @returns {Observable<any>} Observable that emits the updated document data with normalized status\r\n */\r\n updateDocumentStatus(documentId: string, status: string, statusUpdateDescription: string): Observable<any> {\r\n const payload = {\r\n statusUpdateDescription: statusUpdateDescription\r\n };\r\n return this.http.put<any>(`${this.apiUrl}${URLS.UPDATE_DOCUMENT_STATUS}${documentId}/${status}`, payload).pipe(\r\n tap((response) => {\r\n if (response && response.status) {\r\n const normalizedStatus = this.normalizeStatus(response.status);\r\n response.normalizedStatus = normalizedStatus;\r\n }\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Normalizes the status from API response to match component expectations\r\n * @param {string} status - The status from API response (Approved, Rejected, etc.)\r\n * @returns {string} Normalized status value\r\n */\r\n private normalizeStatus(status: string): string {\r\n switch (status.toLowerCase()) {\r\n case SHARED.APPROVED:\r\n return SHARED.STATUS_ACCEPTED;\r\n case SHARED.STATUS_REJECTED_LOWERCASE:\r\n return SHARED.STATUS_REJECTED_LOWERCASE;\r\n case SHARED.STATUS_PENDING:\r\n return SHARED.STATUS_PENDING;\r\n default:\r\n return status.toLowerCase();\r\n }\r\n }\r\n\r\n /**\r\n * Deletes a document by its ID and refreshes all data (categories, userlist, status, and document list)\r\n * @param {string} documentId - The ID of the document to delete\r\n * @param {string} contextId - The context ID to refresh all data\r\n * @returns {Observable<any>} Observable that emits the delete response\r\n */\r\n deleteDocument(documentId: string, contextId: string): Observable<any> {\r\n return this.http.delete<any>(`${this.apiUrl}${URLS.DELETE_DOCUMENT}${documentId}`).pipe(\r\n tap(() => {\r\n this.getDocumentCatagories(contextId).subscribe();\r\n this.getUserListByContextId(contextId).subscribe();\r\n this.getStatusDocumentCount(contextId).subscribe();\r\n this.getDocumentsBySelection(contextId, null, null, null, null).subscribe();\r\n }),\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Downloads an Excel file with proper authentication headers\r\n * Authentication is handled automatically by the HTTP interceptor\r\n * @param {string} documentUrl - The URL of the Excel file to download\r\n * @returns {Observable<ArrayBuffer>} Observable that emits the file data as ArrayBuffer\r\n */\r\n downloadExcelFile(documentUrl: string): Observable<ArrayBuffer> {\r\n \r\n return this.http.get(documentUrl, { \r\n responseType: 'arraybuffer'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Downloads a CSV file with proper authentication headers\r\n * Authentication is handled automatically by the HTTP interceptor\r\n * @param {string} documentUrl - The URL of the CSV file to download\r\n * @returns {Observable<string>} Observable that emits the file data as string\r\n */\r\n downloadCsvFile(documentUrl: string): Observable<string> {\r\n return this.http.get(documentUrl, {\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n \r\n /**\r\n * Downloads an email file (EML) with appropriate handling for different storage types\r\n * @param {string} documentUrl - URL of the email file\r\n * @returns {Observable<string>} Observable of file content as text\r\n */\r\n downloadEmailFile(documentUrl: string): Observable<string> {\r\n const isAzureBlobStorage = documentUrl.includes('.blob.core.windows.net');\r\n if (isAzureBlobStorage) {\r\n return this.http.get(documentUrl, {\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));\r\n })\r\n );\r\n } else {\r\n return this.http.get<string>(documentUrl).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));\r\n })\r\n );\r\n }\r\n }\r\n\r\n documentRequest(payload: any): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.DOCUMENT_REQUEST}`, payload).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Checks if valuation report data exists for the given context ID\r\n * @param {string} contextId - The context ID to check for valuation report data\r\n * @returns {Observable<any>} Observable that emits the valuation report data or empty object\r\n */\r\n getValuationReportByContextId(contextId: string): Observable<any> {\r\n if (!contextId) return EMPTY;\r\n return this.http.get<any>(`${this.apiUrl}${URLS.VALUATION_REPORT}${contextId}`).pipe(\r\n catchError((error) => {\r\n // Return empty object if no data found or error occurs\r\n return of(null);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Converts an email document to PDF format\r\n * @param {string} documentUrl - The URL of the email document to convert\r\n * @returns {Observable<Blob>} Observable that emits the PDF blob data\r\n */\r\n convertEmailToPdf(documentUrl: string): Observable<Blob> {\r\n if (!documentUrl) return EMPTY;\r\n \r\n const payload = { documentUrl: documentUrl };\r\n \r\n return this.http.post(`${this.apiUrl}${URLS.CONVERT_TO_PDF}`, payload, { \r\n responseType: 'blob'\r\n }).pipe(\r\n catchError((error) => {\r\n return throwError(() => new Error(error?.message || 'Failed to convert email to PDF'));\r\n })\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { QueryEntity } from '@datorama/akita';\r\nimport { DocumentStore } from './document.store';\r\nimport { DocumentState } from './document.state';\r\nimport { Observable } from 'rxjs';\r\nimport { Message } from 'primeng/api';\r\nimport { DocumentModel } from '../models/document.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { StatusDataModel } from '../models/status-data.model';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\n\r\n\r\n/**\r\n * Query service for managing document state.\r\n * This class extends Akita's `QueryEntity` to provide additional functionality for querying document data.\r\n * @class DocumentQuery\r\n * @typedef {DocumentQuery}\r\n * @augments {QueryEntity<DocumentState>}\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DocumentQuery extends QueryEntity<DocumentState> {\r\n constructor(protected override store: DocumentStore) {\r\n super(store);\r\n }\r\n\r\n /**\r\n * Selects the currently selected folder ID from the document state.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected folder ID.\r\n */\r\n getParentDocumentTypeId() : string | null {\r\n return this.getValue()['parentDocumentTypeId'];\r\n }\r\n\r\n /**\r\n * Selects the currently selected folder ID from the document state.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected folder ID.\r\n */\r\n selectParentDocumentTypeId():Observable<string | null> {\r\n return this.select((state) => state['parentDocumentTypeId']);\r\n }\r\n /**\r\n * Selects the set messages.\r\n * @returns {Observable<Message>} Observable that emits the current Message.\r\n */\r\n selectMessages():Observable<Message[]> {\r\n return this.select((state) => state.messages);\r\n }\r\n /**\r\n * Selects the set documents.\r\n * @returns {Observable<DocumentModel[]>} Observable that emits the documets.\r\n */\r\n selectDocumets():Observable<DocumentModel[]> {\r\n return this.select((state) => state.documentList);\r\n }\r\n\r\n /**\r\n * Selects the document categories.\r\n * @returns {Observable<DocumentCategory[]>} Observable that emits the document categories.\r\n */\r\n selectDocumentCategories(): Observable<DocumentCategory[]> {\r\n return this.select((state) => state.documentCategories);\r\n }\r\n\r\n // New query methods for selection state\r\n /**\r\n * Selects the currently selected menu item.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected menu item _id (not the label).\r\n */\r\n selectSelectedMenuItem(): Observable<string | null> {\r\n return this.select((state) => state.selectedMenuItem);\r\n }\r\n\r\n /**\r\n * Selects the currently selected user ID.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected user ID.\r\n */\r\n selectSelectedUserId(): Observable<string | null> {\r\n return this.select((state) => state.selectedUserId);\r\n }\r\n\r\n /**\r\n * Selects the currently selected status.\r\n * @returns {Observable<string | null>} Observable that emits the currently selected status.\r\n */\r\n selectSelectedStatus(): Observable<string | null> {\r\n return this.select((state) => state.selectedStatus);\r\n }\r\n\r\n /**\r\n * Selects the current search key.\r\n * @returns {Observable<string | null>} Observable that emits the current search key.\r\n */\r\n selectSearchKey(): Observable<string | null> {\r\n return this.select((state) => state.searchKey);\r\n }\r\n\r\n /**\r\n * Selects all selection state properties (menu item, user ID, status, search key).\r\n * @returns {Observable<{menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null}>} Observable that emits the current selection state.\r\n * Note: menuItem is the _id of the selected menu item, not the label.\r\n */\r\n selectSelectionState(): Observable<{menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null}> {\r\n return this.select((state) => ({\r\n menuItem: state.selectedMenuItem,\r\n userId: state.selectedUserId,\r\n status: state.selectedStatus,\r\n searchKey: state.searchKey\r\n }));\r\n }\r\n\r\n /**\r\n * Gets the current selection state values (synchronous).\r\n * @returns {Object} The current selection state values.\r\n * Note: menuItem is the _id of the selected menu item, not the label.\r\n */\r\n getSelectionState(): {menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null} {\r\n const state = this.getValue();\r\n return {\r\n menuItem: state.selectedMenuItem,\r\n userId: state.selectedUserId,\r\n status: state.selectedStatus,\r\n searchKey: state.searchKey\r\n };\r\n }\r\n\r\n /**\r\n * Selects the user list visibility state.\r\n * @returns {Observable<boolean>} Observable that emits the current user list visibility.\r\n */\r\n selectShowUserList(): Observable<boolean> {\r\n return this.select((state) => state.showUserList);\r\n }\r\n\r\n /**\r\n * Gets the current user list visibility value (synchronous).\r\n * @returns {boolean} The current user list visibility.\r\n */\r\n getShowUserList(): boolean {\r\n return this.getValue().showUserList;\r\n }\r\n\r\n /**\r\n * Selects the current document.\r\n * @returns {Observable<DocumentModel | null>} Observable that emits the current document.\r\n */\r\n selectCurrentDocument(): Observable<DocumentModel | null> {\r\n return this.select((state) => state.currentDocument);\r\n }\r\n\r\n /**\r\n * Gets the current document value (synchronous).\r\n * @returns {DocumentModel | null} The current document.\r\n */\r\n getCurrentDocument(): DocumentModel | null {\r\n return this.getValue().currentDocument;\r\n }\r\n\r\n /**\r\n * Selects the user list.\r\n * @returns {Observable<UserListModel[]>} Observable that emits the user list.\r\n */\r\n selectUserList(): Observable<UserListModel[]> {\r\n return this.select((state) => state.userList);\r\n }\r\n\r\n /**\r\n * Gets the current user list value (synchronous).\r\n * @returns {UserListModel[]} The current user list.\r\n */\r\n getUserList(): UserListModel[] {\r\n return this.getValue().userList;\r\n }\r\n\r\n /**\r\n * Selects the status data.\r\n * @returns {Observable<StatusDataModel[]>} Observable that emits the status data.\r\n */\r\n selectStatusData(): Observable<StatusDataModel[]> {\r\n return this.select((state) => state.statusData);\r\n }\r\n\r\n /**\r\n * Gets the current status data value (synchronous).\r\n * @returns {StatusDataModel[]} The current status data.\r\n */\r\n getStatusData(): StatusDataModel[] {\r\n return this.getValue().statusData;\r\n }\r\n\r\n /**\r\n * Selects the document list response.\r\n * @returns {Observable<DocumentListResponse[] | null>} Observable that emits the document list response.\r\n */\r\n selectDocumentListResponse(): Observable<DocumentListResponse[] | null> {\r\n return this.select((state) => state.documentListResponse);\r\n }\r\n\r\n /**\r\n * Gets the current document list response value (synchronous).\r\n * @returns {DocumentListResponse[] | null} The current document list response.\r\n */\r\n getDocumentListResponse(): DocumentListResponse[] | null {\r\n return this.getValue().documentListResponse;\r\n }\r\n\r\n // Document Viewer State Query Methods\r\n /**\r\n * Selects the selected document for viewing.\r\n * @returns {Observable<DocumentListItem | undefined>} Observable that emits the selected document.\r\n */\r\n selectSelectedDocument(): Observable<DocumentListItem | undefined> {\r\n return this.select((state) => state.selectedDocument);\r\n }\r\n\r\n /**\r\n * Gets the current selected document value (synchronous).\r\n * @returns {DocumentListItem | undefined} The current selected document.\r\n */\r\n getSelectedDocument(): DocumentListItem | undefined {\r\n return this.getValue().selectedDocument;\r\n }\r\n\r\n /**\r\n * Selects the document history.\r\n * @returns {Observable<DocumentHistorySection[]>} Observable that emits the document history.\r\n */\r\n selectDocumentHistory(): Observable<DocumentHistorySection[]> {\r\n return this.select((state) => state.documentHistory);\r\n }\r\n\r\n /**\r\n * Gets the current document history value (synchronous).\r\n * @returns {DocumentHistorySection[]} The current document history.\r\n */\r\n getDocumentHistory(): DocumentHistorySection[] {\r\n return this.getValue().documentHistory;\r\n }\r\n\r\n /**\r\n * Selects the document history visibility state.\r\n * @returns {Observable<boolean>} Observable that emits the current document history visibility.\r\n */\r\n selectShowDocumentHistory(): Observable<boolean> {\r\n return this.select((state) => state.showDocumentHistory);\r\n }\r\n\r\n /**\r\n * Gets the current document history visibility value (synchronous).\r\n * @returns {boolean} The current document history visibility.\r\n */\r\n getShowDocumentHistory(): boolean {\r\n return this.getValue().showDocumentHistory;\r\n }\r\n\r\n /**\r\n * Selects the action loading state.\r\n * @returns {Observable<boolean>} Observable that emits the current action loading state.\r\n */\r\n selectIsActionLoading(): Observable<boolean> {\r\n return this.select((state) => state.isActionLoading);\r\n }\r\n\r\n /**\r\n * Gets the current action loading value (synchronous).\r\n * @returns {boolean} The current action loading state.\r\n */\r\n getIsActionLoading(): boolean {\r\n return this.getValue().isActionLoading;\r\n }\r\n\r\n /**\r\n * Selects the document status.\r\n * @returns {Observable<'pending' | 'accepted' | 'rejected'>} Observable that emits the current document status.\r\n */\r\n selectDocumentStatus(): Observable<'pending' | 'accepted' | 'rejected'> {\r\n return this.select((state) => state.documentStatus);\r\n }\r\n\r\n /**\r\n * Gets the current document status value (synchronous).\r\n * @returns {'pending' | 'accepted' | 'rejected'} The current document status.\r\n */\r\n getDocumentStatus(): 'pending' | 'accepted' | 'rejected' {\r\n return this.getValue().documentStatus;\r\n }\r\n\r\n /**\r\n * Selects the document uploaded state.\r\n * @returns {Observable<boolean>} Observable that emits the current document uploaded state.\r\n */\r\n selectDocumentIsUploaded(): Observable<boolean> {\r\n return this.select((state) => state.documentIsUploaded);\r\n }\r\n\r\n /**\r\n * Gets the current document uploaded value (synchronous).\r\n * @returns {boolean} The current document uploaded state.\r\n */\r\n getDocumentIsUploaded(): boolean {\r\n return this.getValue().documentIsUploaded;\r\n }\r\n\r\n /**\r\n * Selects the alert data.\r\n * @returns {Observable<any>} Observable that emits the current alert data.\r\n */\r\n selectAlertData(): Observable<any> {\r\n return this.select((state) => state.alertData);\r\n }\r\n\r\n /**\r\n * Gets the current alert data value (synchronous).\r\n * @returns {any} The current alert data.\r\n */\r\n getAlertData(): any {\r\n return this.getValue().alertData;\r\n }\r\n\r\n /**\r\n * Selects all document viewer state properties.\r\n * @returns {Observable<{selectedDocument?: DocumentListItem, documentHistory: DocumentHistorySection[], showDocumentHistory: boolean, isActionLoading: boolean, documentStatus: 'pending' | 'accepted' | 'rejected', documentIsUploaded: boolean, alertData: any, deleteError: any, deleteSuccess: boolean}>} Observable that emits the current document viewer state.\r\n */\r\n selectDocumentViewerState(): Observable<{\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n }> {\r\n return this.select((state) => ({\r\n selectedDocument: state.selectedDocument,\r\n documentHistory: state.documentHistory,\r\n showDocumentHistory: state.showDocumentHistory,\r\n isActionLoading: state.isActionLoading,\r\n documentStatus: state.documentStatus,\r\n documentIsUploaded: state.documentIsUploaded,\r\n alertData: state.alertData,\r\n deleteError: state.deleteError,\r\n deleteSuccess: state.deleteSuccess\r\n }));\r\n }\r\n\r\n /**\r\n * Gets the current document viewer state values (synchronous).\r\n * @returns {Object} The current document viewer state values.\r\n */\r\n getDocumentViewerState(): {\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n } {\r\n const state = this.getValue();\r\n return {\r\n selectedDocument: state.selectedDocument,\r\n documentHistory: state.documentHistory,\r\n showDocumentHistory: state.showDocumentHistory,\r\n isActionLoading: state.isActionLoading,\r\n documentStatus: state.documentStatus,\r\n documentIsUploaded: state.documentIsUploaded,\r\n alertData: state.alertData,\r\n deleteError: state.deleteError,\r\n deleteSuccess: state.deleteSuccess\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DocumentCategory, DocumentCategoryItem } from '../models/document-category.model';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentListResponse } from '../models/document-list-response.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentMenuService {\r\n\r\n constructor(private documentStore: DocumentStore) {}\r\n\r\n /**\r\n * Sorts categories alphabetically by label\r\n * @param categories - The list of document categories to sort\r\n * @returns Sorted categories array\r\n */\r\n sortCategoriesAlphabetically(categories: DocumentCategory[]): DocumentCategory[] {\r\n return [...categories].sort((a, b) => a.label.localeCompare(b.label));\r\n }\r\n\r\n /**\r\n * Sorts menu items within each category alphabetically by label\r\n * @param categories - The list of document categories to sort\r\n * @returns Categories with sorted menu items\r\n */\r\n sortMenuItemsAlphabetically(categories: DocumentCategory[]): DocumentCategory[] {\r\n return categories.map(category => ({\r\n ...category,\r\n items: category.items ? [...category.items].sort((a, b) => a.label.localeCompare(b.label)) : category.items\r\n }));\r\n }\r\n\r\n /**\r\n * Sorts both categories and their menu items alphabetically\r\n * @param categories - The list of document categories to sort\r\n * @returns Fully sorted categories array\r\n */\r\n sortCategoriesAndMenuItems(categories: DocumentCategory[]): DocumentCategory[] {\r\n const sortedCategories = this.sortCategoriesAlphabetically(categories);\r\n return this.sortMenuItemsAlphabetically(sortedCategories);\r\n }\r\n\r\n /**\r\n * Gets the category name for a given menu item _id\r\n * @param menuItemId - The _id of the menu item\r\n * @param categories - The list of document categories\r\n * @returns The category name or null if not found\r\n */\r\n getMenuItemCategory(menuItemId: string, categories: DocumentCategory[]): string | null {\r\n for (const category of categories) {\r\n if (category.items?.some((menuItem: DocumentCategoryItem) => menuItem._id === menuItemId)) {\r\n return category.label;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the menu item by its _id\r\n * @param menuItemId - The _id of the menu item\r\n * @param categories - The list of document categories\r\n * @returns The menu item or null if not found\r\n */\r\n getMenuItemById(menuItemId: string, categories: DocumentCategory[]): DocumentCategoryItem | null {\r\n for (const category of categories) {\r\n if (category.items) {\r\n const item = category.items.find((menuItem: DocumentCategoryItem) => menuItem._id === menuItemId);\r\n if (item) {\r\n return item;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Handles user list visibility based on menu item category\r\n * @param menuItemId - The _id of the menu item\r\n * @param categories - The list of document categories\r\n */\r\n handleUserListVisibility(menuItemId: string, categories: DocumentCategory[]): void {\r\n const category = this.getMenuItemCategory(menuItemId, categories);\r\n this.documentStore.setShowUserList(true);\r\n }\r\n\r\n /**\r\n * Calculates total documents for a menu item\r\n * @param item - The menu item\r\n * @returns Total number of documents\r\n */\r\n getTotalDocuments(item: DocumentCategoryItem): number {\r\n const status = item.status;\r\n // Handle both uppercase and lowercase keys\r\n const pending = status.Pending || status.pending || 0;\r\n const reviewing = status.Reviewing || status.reviewing || 0;\r\n const accepted = status.Accepted || status.approved || 0; // Note: approved maps to Accepted\r\n const rejected = status.Rejected || status.rejected || 0;\r\n \r\n return pending + reviewing + accepted + rejected;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets badge value for a menu item\r\n * @param item - The menu item\r\n * @returns Badge value string (e.g., \"2/3\")\r\n */\r\n getBadgeValue(item: DocumentCategoryItem): string {\r\n const approved = this.getApprovedDocuments(item);\r\n const total = this.getTotalDocuments(item);\r\n return `${approved}/${total}`;\r\n }\r\n\r\n /**\r\n * Gets badge severity based on status\r\n * @param item - The menu item\r\n * @returns Badge severity for PrimeNG\r\n */\r\n getBadgeSeverity(item: DocumentCategoryItem): 'success' | 'info' | 'warning' | 'danger' {\r\n const status = item.status;\r\n const total = this.getTotalDocuments(item);\r\n const pending = status.Pending || status.pending || 0;\r\n const rejected = status.Rejected || status.rejected || 0;\r\n const reviewing = status.Reviewing || status.reviewing || 0;\r\n const approved = this.getApprovedDocuments(item);\r\n \r\n if (total === 0) return 'info';\r\n if (pending > 0) return 'info';\r\n if (rejected > 0) return 'danger';\r\n if (reviewing > 0) return 'warning';\r\n if (approved === total && total > 0) return 'success';\r\n return 'warning';\r\n }\r\n\r\n /**\r\n * Checks if badge should be shown for a menu item\r\n * @param item - The menu item\r\n * @returns True if badge should be shown\r\n */\r\n shouldShowBadge(item: DocumentCategoryItem): boolean {\r\n return this.getTotalDocuments(item) > 0;\r\n }\r\n\r\n /**\r\n * Calculates approved documents for a menu item\r\n * @param item - The menu item\r\n * @returns Number of approved documents\r\n */\r\n getApprovedDocuments(item: DocumentCategoryItem): number {\r\n const status = item.status;\r\n // Handle both uppercase and lowercase keys, with approved mapping to Accepted\r\n return status.Accepted || status.approved || 0;\r\n }\r\n\r\n /**\r\n * Checks if a menu item's section is visible in the filtered document list\r\n * @param menuItemId - The ID of the menu item to check\r\n * @param documentListResponse - The filtered document list response\r\n * @returns True if the section is visible, false otherwise\r\n */\r\n isMenuItemSectionVisible(menuItemId: string, documentListResponse: DocumentListResponse[] | null, menuItemLabel?: string): boolean {\r\n if (!menuItemId || !documentListResponse || documentListResponse.length === 0) {\r\n return false;\r\n }\r\n \r\n return documentListResponse.some(category => {\r\n if (!category.label || !category.list || category.list.length === 0) {\r\n return false;\r\n }\r\n \r\n const categoryLabelLower = category.label.toLowerCase();\r\n if (menuItemLabel) {\r\n const menuItemLabelLower = menuItemLabel.toLowerCase();\r\n if (categoryLabelLower === menuItemLabelLower) {\r\n return true;\r\n }\r\n if (this.isSmartPartialMatch(menuItemLabelLower, categoryLabelLower)) {\r\n return true;\r\n }\r\n }\r\n const menuItemIdLower = menuItemId.toLowerCase();\r\n if (this.isSmartPartialMatch(menuItemIdLower, categoryLabelLower)) {\r\n return true;\r\n }\r\n \r\n return false;\r\n });\r\n }\r\n\r\n /**\r\n * Performs smart partial matching to prevent substring conflicts\r\n * @param menuLabel - The menu item label to match\r\n * @param categoryLabel - The category label to match against\r\n * @returns True if it's a valid partial match, false otherwise\r\n */\r\n private isSmartPartialMatch(menuLabel: string, categoryLabel: string): boolean {\r\n // If the category label is significantly longer than menu label, it's likely a different section\r\n if (categoryLabel.length > menuLabel.length + 3) {\r\n return false;\r\n }\r\n const menuWords = menuLabel.split(/\\s+/);\r\n const categoryWords = categoryLabel.split(/\\s+/);\r\n return menuWords.every(word => \r\n categoryWords.some(catWord => \r\n catWord.toLowerCase().startsWith(word.toLowerCase()) || \r\n word.toLowerCase().startsWith(catWord.toLowerCase())\r\n )\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Deselects a menu item if its section is not visible in the filtered document list\r\n * @param menuItemId - The ID of the menu item to check\r\n * @param documentListResponse - The filtered document list response\r\n * @param menuItemLabel - The label of the menu item (optional)\r\n * @returns True if the menu item was deselected, false otherwise\r\n */\r\n deselectMenuItemIfSectionNotVisible(menuItemId: string, documentListResponse: DocumentListResponse[] | null, menuItemLabel?: string): boolean {\r\n if (!this.isMenuItemSectionVisible(menuItemId, documentListResponse, menuItemLabel)) {\r\n this.documentStore.setSelectedMenuItem(null);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if a menu item should be selectable based on the filtered document list\r\n * @param menuItemId - The ID of the menu item to check\r\n * @param documentListResponse - The filtered document list response\r\n * @param menuItemLabel - The label of the menu item (optional)\r\n * @returns True if the menu item should be selectable, false otherwise\r\n */\r\n isMenuItemSelectable(menuItemId: string, documentListResponse: DocumentListResponse[] | null, menuItemLabel?: string): boolean {\r\n return this.isMenuItemSectionVisible(menuItemId, documentListResponse, menuItemLabel);\r\n }\r\n\r\n /**\r\n * Gets the selectability status for all menu items in categories\r\n * @param categories - The document categories containing menu items\r\n * @param documentListResponse - The filtered document list response\r\n * @returns Map of menu item IDs to their selectability status\r\n */\r\n getMenuItemsSelectabilityStatus(categories: DocumentCategory[], documentListResponse: DocumentListResponse[] | null): Map<string, boolean> {\r\n const selectabilityMap = new Map<string, boolean>();\r\n \r\n categories.forEach(category => {\r\n if (category.items) {\r\n category.items.forEach(item => {\r\n const isSelectable = this.isMenuItemSelectable(item._id, documentListResponse);\r\n selectabilityMap.set(item._id, isSelectable);\r\n });\r\n }\r\n });\r\n \r\n return selectabilityMap;\r\n }\r\n\r\n /**\r\n * Updates menu items with selectability status\r\n * @param categories - The document categories containing menu items\r\n * @param documentListResponse - The filtered document list response\r\n * @returns Updated categories with selectability information\r\n */\r\n updateMenuItemsWithSelectabilityStatus(categories: DocumentCategory[], documentListResponse: DocumentListResponse[] | null): DocumentCategory[] {\r\n return categories.map(category => ({\r\n ...category,\r\n items: category.items?.map(item => ({\r\n ...item,\r\n isSelectable: this.isMenuItemSelectable(item._id, documentListResponse, item.label)\r\n }))\r\n }));\r\n }\r\n} ","import { Injectable } from \"@angular/core\";\r\nimport { Observable, combineLatest, Subscription } from \"rxjs\";\r\nimport { DocumentModel } from \"../models/document.model\";\r\nimport { DocumentStore } from \"../state/document.store\";\r\nimport { DocumentQuery } from \"../state/document.query\";\r\nimport { DocumentHttpService } from \"./document-http.service\";\r\nimport { DocumentMenuService } from \"./document-menu.service\";\r\nimport { switchMap, debounceTime, distinctUntilChanged } from \"rxjs/operators\";\r\nimport { ERRORS } from \"../../../Shared/constant/ERROR\";\r\n\r\n/**\r\n * Service to manage the document data and selection state\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DocumentHelperService {\r\n\r\n private selectionWatcherSubscription: Subscription | null = null;\r\n\r\n constructor(\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery,\r\n private documentHttpService: DocumentHttpService,\r\n private documentMenuService: DocumentMenuService\r\n ) {\r\n // Note: initializeSelectionWatcher now requires contextId\r\n // This should be called from the component that has access to contextId\r\n }\r\n\r\n /**\r\n * Initialize watcher for selection state changes\r\n * @param contextId - The context ID to use for API calls\r\n */\r\n initializeSelectionWatcher(contextId: string): void {\r\n // Clean up any existing subscription\r\n this.cleanupSelectionWatcher();\r\n \r\n this.selectionWatcherSubscription = combineLatest([\r\n this.documentQuery.selectSelectedUserId(),\r\n this.documentQuery.selectSelectedStatus(),\r\n this.documentQuery.selectSearchKey()\r\n ]).pipe(\r\n debounceTime(300),\r\n distinctUntilChanged((prev, curr) => {\r\n const isSame = prev[0] === curr[0] && prev[1] === curr[1] && prev[2] === curr[2];\r\n return isSame;\r\n }),\r\n switchMap(([userId, status, searchKey]) => {\r\n return this.documentHttpService.getDocumentsBySelection(contextId, null, userId, status, searchKey);\r\n })\r\n ).subscribe({\r\n next: (response) => {\r\n const currentState = this.documentQuery.getSelectionState();\r\n this.documentStore.setDocumentListResponse(response);\r\n },\r\n error: (error) => {\r\n console.error(ERRORS.ERROR_CALLING_API_WITH_SELECTION, error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Initialize watcher for selection state changes with initial load\r\n * @param contextId - The context ID to use for API calls\r\n */\r\n initializeSelectionWatcherWithInitialLoad(contextId: string): void {\r\n // Clean up any existing subscription\r\n this.cleanupSelectionWatcher();\r\n \r\n // Make initial API call to load documents\r\n this.documentHttpService.getDocumentsBySelection(contextId, null, null, null, null).subscribe({\r\n next: (response) => {\r\n this.documentStore.setDocumentListResponse(response);\r\n },\r\n error: (error) => {\r\n console.error(ERRORS.ERROR_CALLING_API_WITH_SELECTION, error);\r\n }\r\n });\r\n \r\n // Initialize the selection watcher for future updates\r\n this.initializeSelectionWatcher(contextId);\r\n }\r\n\r\n /**\r\n * Clean up the selection watcher subscription\r\n */\r\n cleanupSelectionWatcher(): void {\r\n if (this.selectionWatcherSubscription) {\r\n this.selectionWatcherSubscription.unsubscribe();\r\n this.selectionWatcherSubscription = null;\r\n }\r\n }\r\n\r\n /**\r\n * Set the document data\r\n * @param document the document data\r\n */\r\n set(document: DocumentModel | null) {\r\n this.documentStore.setCurrentDocument(document);\r\n }\r\n\r\n /**\r\n * Get the document data\r\n * @returns the document data\r\n */\r\n get(): Observable<DocumentModel | null> {\r\n return this.documentQuery.selectCurrentDocument();\r\n }\r\n\r\n /**\r\n * Get the current document value synchronously\r\n * @returns the current document value\r\n */\r\n getValue(): DocumentModel | null {\r\n return this.documentQuery.getCurrentDocument();\r\n }\r\n\r\n /**\r\n * Set the selected menu item\r\n * @param menuItem the selected menu item _id (not the label)\r\n */\r\n setSelectedMenuItem(menuItem: string | null): void {\r\n this.documentStore.setSelectedMenuItem(menuItem);\r\n }\r\n\r\n /**\r\n * Set the selected user ID\r\n * @param userId the selected user ID\r\n */\r\n setSelectedUserId(userId: string | null): void {\r\n this.documentStore.setSelectedUserId(userId);\r\n }\r\n\r\n /**\r\n * Set the selected status\r\n * @param status the selected status\r\n */\r\n setSelectedStatus(status: string | null): void {\r\n this.documentStore.setSelectedStatus(status);\r\n }\r\n\r\n /**\r\n * Set the search key\r\n * @param searchKey the search term\r\n */\r\n setSearchKey(searchKey: string | null): void {\r\n this.documentStore.setSearchKey(searchKey);\r\n }\r\n\r\n /**\r\n * Set all selection state at once\r\n * @param menuItem the selected menu item _id (not the label)\r\n * @param userId the selected user ID\r\n * @param status the selected status\r\n * @param searchKey the search term\r\n */\r\n setSelectionState(menuItem: string | null, userId: string | null, status: string | null, searchKey: string | null = null): void {\r\n this.documentStore.setSelectionState(menuItem, userId, status, searchKey);\r\n }\r\n\r\n /**\r\n * Clear all selection state\r\n */\r\n clearSelectionState(): void {\r\n this.documentStore.clearSelectionState();\r\n }\r\n\r\n /**\r\n * Set user list visibility\r\n * @param show whether to show the user list\r\n */\r\n setShowUserList(show: boolean): void {\r\n this.documentStore.setShowUserList(show);\r\n }\r\n\r\n /**\r\n * Get the current selection state\r\n * @returns observable of the current selection state\r\n */\r\n getSelectionState(): Observable<{menuItem: string | null, userId: string | null, status: string | null}> {\r\n return this.documentQuery.selectSelectionState();\r\n }\r\n\r\n /**\r\n * Get the current selection state value synchronously\r\n * @returns the current selection state value\r\n */\r\n getSelectionStateValue(): {menuItem: string | null, userId: string | null, status: string | null} {\r\n return this.documentQuery.getSelectionState();\r\n }\r\n\r\n /**\r\n * Set status data in the store\r\n * @param statusData the status data to set\r\n */\r\n setStatusData(statusData: any[]): void {\r\n this.documentStore.setStatusData(statusData);\r\n }\r\n\r\n /**\r\n * Set user list in the store\r\n * @param userList the user list to set\r\n */\r\n setUserList(userList: any[]): void {\r\n this.documentStore.setUserList(userList);\r\n }\r\n\r\n /**\r\n * Get observable for filtered documents\r\n * @returns Observable that emits filtered document responses\r\n */\r\n getFilteredDocuments(): Observable<any> {\r\n return this.documentQuery.selectDocumentListResponse();\r\n }\r\n\r\n /**\r\n * Manually trigger API call with current selection state\r\n * @param contextId - The context ID to use for the API call\r\n */\r\n refreshDocumentsWithCurrentSelection(contextId: string): void {\r\n const currentState = this.documentQuery.getSelectionState();\r\n this.documentHttpService.getDocumentsBySelection(\r\n contextId,\r\n null, // No menu item filtering\r\n currentState.userId,\r\n currentState.status,\r\n currentState.searchKey\r\n ).subscribe({\r\n next: (response) => {\r\n // Set the correct response structure - check if response has documents property\r\n const documentListResponse = response.documents || response;\r\n this.documentStore.setDocumentListResponse(documentListResponse);\r\n // Check if the selected menu item's section is still visible after filtering\r\n this.checkAndDeselectMenuItemIfSectionNotVisible(contextId);\r\n },\r\n error: (error) => {\r\n throw new Error(error)\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Force refresh documents with no filters\r\n * @param contextId - The context ID to use for the API call\r\n */\r\n refreshDocumentsWithoutFilters(contextId: string): void {\r\n this.documentHttpService.getDocumentsBySelection(\r\n contextId,\r\n null,\r\n null,\r\n null\r\n ).subscribe({\r\n next: (response) => {\r\n this.documentStore.setDocumentListResponse(response);\r\n },\r\n error: (error) => {\r\n console.error('Error in force refresh:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refresh status data for a specific context\r\n * @param contextId - The context ID to use for the API call\r\n * @param statusContextId - The status context ID (usually userId)\r\n * @param categoryId - The category ID (usually menuItem)\r\n */\r\n refreshStatusData(contextId: string, statusContextId: string | null, categoryId: string | null): void {\r\n this.documentHttpService.getStatusDocumentCount(contextId, statusContextId, categoryId).subscribe({\r\n next: (statusData) => {\r\n this.documentStore.setStatusData(statusData);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing status data:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refresh all data with current filters after accept/reject/delete operations\r\n * This includes document categories, status data, user list, and document list\r\n * \r\n * This method ensures that after a document action (accept/reject/delete):\r\n * 1. Document categories are refreshed\r\n * 2. Status counts are refreshed with current user filters\r\n * 3. User list is refreshed with current filters (if applicable)\r\n * 4. Document list is refreshed with current filters (user, status, search)\r\n * \r\n * Filter application:\r\n * - Document categories: Uses base contextId\r\n * - Status data: Uses userId as contextId (no category filtering)\r\n * - User list: Uses base contextId (can be enhanced with additional filters if API supports)\r\n * - Document list: Uses current filters (userId, status, searchKey)\r\n * \r\n * @param contextId - The context ID to use for the API calls\r\n */\r\n refreshAllDataWithCurrentFilters(contextId: string): void {\r\n const currentState = this.documentQuery.getSelectionState();\r\n const statusContextId = currentState.userId || null;\r\n \r\n // Refresh document categories\r\n this.documentHttpService.getDocumentCatagories(contextId).subscribe({\r\n next: (response) => {\r\n this.documentStore.setDocumentCategories(response);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing document categories after action:', error);\r\n }\r\n });\r\n \r\n // Refresh status data (no category filtering)\r\n this.documentHttpService.getStatusDocumentCount(contextId, statusContextId, null).subscribe({\r\n next: (statusData) => {\r\n this.documentStore.setStatusData(statusData);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing status data after action:', error);\r\n }\r\n });\r\n \r\n // Refresh user list\r\n this.documentHttpService.getUserListByContextId(contextId).subscribe({\r\n next: (userList) => {\r\n this.documentStore.setUserList(userList);\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing user list after action:', error);\r\n }\r\n });\r\n this.refreshDocumentsWithCurrentSelection(contextId);\r\n }\r\n\r\n /**\r\n * Checks if the currently selected menu item's section is visible in the filtered document list\r\n * and deselects it if not visible\r\n * @param contextId - The context ID to use for API calls\r\n */\r\n checkAndDeselectMenuItemIfSectionNotVisible(contextId: string): void {\r\n const currentState = this.documentQuery.getSelectionState();\r\n const selectedMenuItem = currentState.menuItem;\r\n \r\n if (selectedMenuItem) {\r\n // Get the current document list response\r\n const documentListResponse = this.documentQuery.getDocumentListResponse();\r\n \r\n // Check if the menu item's section is visible and deselect if not\r\n const wasDeselected = this.documentMenuService.deselectMenuItemIfSectionNotVisible(\r\n selectedMenuItem, \r\n documentListResponse\r\n );\r\n \r\n // Menu item was deselected if its section is not visible\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { DocumentStore } from './document.store';\r\nimport { Observable, tap } from 'rxjs';\r\nimport { AppConfigService } from '../../../Shared/services/app-config.service';\r\nimport { URLS } from '../../../Shared/constant/URLS';\r\nimport { DocumentModel } from '../models/document.model';\r\n\r\n/**\r\n * Service for managing document-related operations.\r\n * The `DocumentService` acts as a bridge between the application and the backend API for handling document-related data.\r\n * It interacts with the `DocumentStore` for state management and uses `HttpClient` for making HTTP requests.\r\n * Creates an instance of `DocumentService`.\r\n * @param {DocumentStore} documentStore - The store that manages the state of documents.\r\n * @param {HttpClient} http - The Angular HTTP client for making API requests.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DocumentService {\r\n\r\n /**\r\n * Creates an instance of DocumentService.\r\n * @param {DocumentStore} documentStore - Store managing the state of documents.\r\n * @param {HttpClient} http - Angular HTTP client for making API requests.\r\n * @param {AppConfigService} appConfigService - Service for retrieving application configuration, such as API base URL.\r\n */\r\n constructor(\r\n public documentStore: DocumentStore,\r\n private http: HttpClient,\r\n public appConfigService: AppConfigService\r\n ) { }\r\n\r\n /**\r\n * Get api url from appConfigService.\r\n * @readonly\r\n * @type {string}\r\n */\r\n get apiUrl(): string {\r\n return this.appConfigService.apiBaseUrl;\r\n }\r\n\r\n /**\r\n * Sends a request to create a new document.\r\n * @param {*} entity - The data of the document to be created.\r\n * @returns {Observable<any>} Observable that emits the newly created document.\r\n */\r\n create(entity: any): Observable<any> {\r\n return this.http.post<any>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}`, entity).pipe(\r\n tap((newEntity: any) => this.documentStore.add(newEntity))\r\n );\r\n }\r\n\r\n /**\r\n * Fetches all documents from the backend.\r\n * @returns {Observable<DocumentModel[]>} Observable that emits an array of documents.\r\n */\r\n getAll(): Observable<DocumentModel[]> {\r\n return this.http.get<DocumentModel[]>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}`).pipe(\r\n tap((entities: DocumentModel[]) => this.documentStore.set(entities))\r\n );\r\n }\r\n\r\n /**\r\n * Fetches a document by its ID.\r\n * @param {string} id - The unique identifier of the document.\r\n * @returns {Observable<any>} Observable that emits the retrieved document.\r\n */\r\n getById(id: string): Observable<any> {\r\n return this.http.get<any>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${id}`).pipe(\r\n tap((entity: any) => this.documentStore.upsert(id, entity))\r\n );\r\n }\r\n\r\n /**\r\n * Updates an existing document by its ID.\r\n * @param {string} id - The unique identifier of the document.\r\n * @param {DocumentModel} entity - The updated data of the document.\r\n * @returns {Observable<DocumentModel>} Observable that emits the updated document.\r\n */\r\n update(id: string, entity: DocumentModel): Observable<DocumentModel> {\r\n return this.http.put<DocumentModel>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${id}`, entity).pipe(\r\n tap((updatedEntity: DocumentModel) => this.documentStore.update(id, updatedEntity))\r\n );\r\n }\r\n\r\n /**\r\n * Deletes a document by its ID.\r\n * @param {string} id - The unique identifier of the document to be deleted.\r\n * @returns {Observable<void>} Observable that completes when the document is deleted.\r\n */\r\n delete(id: string): Observable<void> {\r\n return this.http.delete<void>(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}/${id}`).pipe(\r\n tap(() => this.documentStore.remove(id))\r\n );\r\n }\r\n}\r\n","import { Injectable, EventEmitter } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { DocumentService } from '../state/document.service';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { MessageService } from 'primeng/api';\r\n\r\n/**\r\n * Service for handling document uploads.\r\n * @class DocumentUploadService\r\n * @typedef {DocumentUploadService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadService {\r\n\r\n /**\r\n * Event emitter for upload completion\r\n */\r\n uploadCompleted = new EventEmitter<{file: File, response: any}>();\r\n\r\n /**\r\n * The file to upload.\r\n * @type {*}\r\n */\r\n uploadedFile: any;\r\n\r\n /**\r\n * Represent contextId\r\n * @type {string}\r\n */\r\n contextId: string = SHARED.EMPTY;\r\n\r\n /**\r\n * Represent document name\r\n * @type {string}\r\n */\r\n docName: string = SHARED.EMPTY\r\n\r\n /**\r\n * Represent document id\r\n * @type {string}\r\n */\r\n docTypeId: string = SHARED.EMPTY\r\n\r\n /**\r\n * Creates an instance of DocumentUploadService.\r\n * @param {DocumentService} documentService - Service for handling document uploads.\r\n * @param {DocumentStore} documentUploadStore - Store for managing uploaded documents.\r\n * @param {MessageService} messageService - Service for displaying messages.\r\n * @returns {void}\r\n */\r\n constructor(public documentService: DocumentService, public documentUploadStore: DocumentStore, public messageService: MessageService) { }\r\n\r\n /**\r\n * Prepares the files for upload by creating a FormData object.\r\n * This method appends each file to the FormData for submission.\r\n * @returns {Promise<any>} Promise that resolves when upload completes\r\n */\r\n handleTemplatedUpload(file: File, contextId: string): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n let formsData = this.handleCreateFormData(file, contextId)\r\n if (!formsData) {\r\n const error = new Error('Failed to create form data');\r\n this.messageService.add({severity: SHARED.SEVERITY,summary: SHARED.UPLOAD_ERROR_SUMMERY,detail: SHARED.UPLOAD_ERROR_DETAILS});\r\n reject(error);\r\n return;\r\n }\r\n this.documentService.create(formsData)\r\n .subscribe({\r\n /**\r\n * Handles the successful upload event.\r\n * Updates the list of uploaded files and emits the file ID.\r\n * @returns {void}\r\n */\r\n next: (event) => {\r\n this.documentUploadStore.setUploadedDocumentFiles(event)\r\n this.documentUploadStore.setMessage([{severity: SHARED.SUCCESS_SEVERITY,detail : SHARED.UPLOAD_SUCCESS}]);\r\n this.uploadCompleted.emit({file: file, response: event});\r\n resolve(event);\r\n },\r\n /**\r\n * Handles the error event during file upload.\r\n * Updates the progress of the file to indicate failure.\r\n * @param {any} error - The error object returned by the upload service.\r\n */\r\n error: (error) => {\r\n this.messageService.add({severity: SHARED.SEVERITY,summary: SHARED.UPLOAD_SUMMERY,detail: error?.message});\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Uploads multiple files sequentially using promises\r\n * @param files - Array of files to upload\r\n * @param contextId - The context ID for upload\r\n * @returns {Promise<any[]>} Promise that resolves with all upload responses\r\n */\r\n async uploadFilesSequentially(files: File[], contextId: string): Promise<any[]> {\r\n const results: any[] = [];\r\n \r\n for (const file of files) {\r\n try {\r\n const result = await this.handleTemplatedUpload(file, contextId);\r\n results.push(result);\r\n } catch (error) {\r\n console.error(`Failed to upload file ${file.name}:`, error);\r\n results.push({ error: true, fileName: file.name, errorMessage: error });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n\r\n /**\r\n * Alternative method to upload files sequentially with progress tracking\r\n * @param files - Array of files to upload\r\n * @param contextId - The context ID for upload\r\n * @param onProgress - Optional callback for progress updates\r\n * @returns {Promise<any[]>} Promise that resolves with all upload responses\r\n */\r\n async uploadFilesSequentiallyWithProgress(\r\n files: File[], \r\n contextId: string, \r\n onProgress?: (currentFile: File, currentIndex: number, totalFiles: number) => void\r\n ): Promise<any[]> {\r\n const results: any[] = [];\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n if (onProgress) {\r\n onProgress(file, i, files.length);\r\n }\r\n \r\n try {\r\n const result = await this.handleTemplatedUpload(file, contextId);\r\n results.push(result);\r\n } catch (error) {\r\n console.error(`Failed to upload file ${file.name}:`, error);\r\n results.push({ error: true, fileName: file.name, errorMessage: error });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n\r\n /**\r\n * Get the file and contextId\r\n * @param file - The file to upload.\r\n * @param contextId - The contextId to upload.\r\n */\r\n getUploadFileData(file: File, contextId: string) {\r\n if (file && contextId) {\r\n this.uploadedFile = file;\r\n this.contextId = contextId;\r\n }\r\n }\r\n\r\n /**\r\n * Get the document name and document type id\r\n * @param documentName - The document name to upload.\r\n * @param documentTypeId - The document type id to upload.\r\n */\r\n getDocumentNameAndType(documentTypeId: string) {\r\n if (documentTypeId && documentTypeId !== SHARED.EMPTY) {\r\n this.docTypeId = documentTypeId\r\n }\r\n }\r\n\r\n /**\r\n * Handle the creation of formdata.\r\n * @returns {*} - The formdata object.\r\n */\r\n handleCreateFormData(uploadedFile?: File, contextId?: string) {\r\n \r\n if (uploadedFile) {\r\n let formData = new FormData();\r\n formData.append(SHARED.FILE, uploadedFile, uploadedFile.name);\r\n formData.append(SHARED.CONTEXT_ID, this.contextId || contextId || SHARED.EMPTY)\r\n return formData;\r\n }else{\r\n return null;\r\n }\r\n \r\n }\r\n\r\n /**\r\n * Generic method to sort any list of objects by a specified property.\r\n * Supports fallback properties if the primary property is undefined.\r\n * @param list - Array of objects to sort\r\n * @param primaryProperty - Primary property to sort by\r\n * @param fallbackProperty - Optional fallback property if primary is undefined\r\n * @returns Sorted array\r\n */\r\n sortListByProperty<T>(list: T[], primaryProperty: keyof T, fallbackProperty?: keyof T): T[] {\r\n return list.sort((a, b) => {\r\n const valueA = a[primaryProperty] || (fallbackProperty ? a[fallbackProperty] : SHARED.EMPTY);\r\n const valueB = b[primaryProperty] || (fallbackProperty ? b[fallbackProperty] : SHARED.EMPTY);\r\n \r\n if (typeof valueA === 'string' && typeof valueB === 'string') {\r\n return valueA.localeCompare(valueB);\r\n }\r\n if (valueA < valueB) return -1;\r\n if (valueA > valueB) return 1;\r\n return 0;\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { PrimeNGConfig } from 'primeng/api';\r\n\r\n/**\r\n * Description placeholder\r\n * @class FileFormatService\r\n * @typedef {FileFormatService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FileFormatService {\r\n\r\n /**\r\n * Creates an instance of FileFormatService.\r\n * @constructor\r\n */\r\n constructor() { }\r\n\r\n /**\r\n * Description placeholder\r\n * @param {number} bytes\r\n * @param {PrimeNGConfig} config\r\n * @returns {string}\r\n */\r\n formatFileSize(bytes: number, config:PrimeNGConfig): string {\r\n const kilobyte = 1024;\r\n const decimalPlaces = SHARED.ONE;\r\n const sizes = config.translation.fileSizeTypes || SHARED.FILE_SIZE_UNITS;\r\n if (bytes < kilobyte) {\r\n return `${bytes} ${sizes[SHARED.INITIAL_COUNT]}`;\r\n } else if (bytes < kilobyte * kilobyte) {\r\n const kbSize = bytes / kilobyte;\r\n return `${parseFloat(kbSize.toFixed(decimalPlaces))} ${sizes[SHARED.ONE]}`;\r\n } else {\r\n const mbSize = bytes / (kilobyte * kilobyte);\r\n return `${parseFloat(mbSize.toFixed(decimalPlaces))} ${sizes[SHARED.TWO]}`;\r\n }\r\n }\r\n\r\n /**\r\n * Validates if a file has an allowed extension\r\n * @param fileName - The name of the file to validate\r\n * @returns True if the file extension is allowed, false otherwise\r\n */\r\n isAllowedFileType(fileName: string): boolean {\r\n const allowedExtensions = SHARED.FILE_TYPES;\r\n \r\n const fileExtension = fileName.toLowerCase().split('.').pop();\r\n return fileExtension ? allowedExtensions.includes(fileExtension) : false;\r\n }\r\n\r\n /**\r\n * Gets the list of allowed file extensions\r\n * @returns Array of allowed file extensions\r\n */\r\n getAllowedFileExtensions(): string[] {\r\n return SHARED.FILE_TYPES;\r\n }\r\n\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject, takeUntil } from 'rxjs';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { FileFormatService } from './file-format.service';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { UploadedFileResponse } from '../models/uploaded-file-response.model';\r\n\r\nexport interface UploadedFile {\r\n file: File;\r\n formattedSize?: string;\r\n progress?: number;\r\n uploadResponse?: UploadedFileResponse; // Store the upload response for later use\r\n url?: string; // Store the file URL from upload response\r\n contentType?: string;\r\n fileName?: string; // Store the file name from upload response\r\n size?: string; // Store the formatted size from upload response\r\n}\r\n\r\nexport interface DocumentUploadPayload {\r\n source: 'Applicant' | 'Application';\r\n documentTypeId: string;\r\n contextIds?: string[]; // Array of applicant IDs for multiple applicants\r\n contextId?: string; // Single context ID for Application type\r\n documents: {\r\n fileName: string;\r\n fileSize: number;\r\n uploadedFileId?: string;\r\n url?: string; // Store the file URL from upload response\r\n contentType?: string;\r\n size?: string; // Store the formatted size from upload response\r\n }[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadBusinessService {\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private documentHttpService: DocumentHttpService,\r\n private fileFormatService: FileFormatService\r\n ) {}\r\n\r\n /**\r\n * Loads applicants for a given context ID\r\n */\r\n loadApplicants(contextId: string): Observable<UserListModel[]> {\r\n return this.documentHttpService.getUserListByContextId(contextId);\r\n }\r\n\r\n /**\r\n * Loads categories based on assignment type\r\n */\r\n loadCategories(assignmentType: string): Observable<DocumentCategory[]> {\r\n return this.documentHttpService.getCategoriesBySource(assignmentType);\r\n }\r\n /**\r\n * Loads categories based on assignment type\r\n */\r\n loadBrokerCategories(assignmentType: string): Observable<DocumentCategory[]> {\r\n return this.documentHttpService.getBrokerDocumentCatagoriesBySource(assignmentType);\r\n }\r\n\r\n /**\r\n * Loads document types based on category\r\n */\r\n loadDocumentTypes(categoryId: string): Observable<DocumentTypeModel[]> {\r\n return this.documentHttpService.getDocumentTypesByCategory(categoryId);\r\n }\r\n\r\n /**\r\n * Loads broker document types based on category\r\n */\r\n loadBrokerDocumentTypes(categoryId: string): Observable<DocumentTypeModel[]> {\r\n return this.documentHttpService.getBrokerDocumentTypesByCategoryId(categoryId);\r\n }\r\n\r\n /**\r\n * Filters applicants based on assignment type\r\n */\r\n filterApplicants(applicantList: UserListModel[], assignmentType: 'Applicant' | 'Application'): UserListModel[] {\r\n if (assignmentType === SHARED.APPLICANT) {\r\n return applicantList.filter(applicant => applicant.name !== SHARED.APPLICATION_DOCS);\r\n } else {\r\n return applicantList.filter(applicant => applicant.name === SHARED.APPLICATION_DOCS);\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to validate form data and return validation result\r\n */\r\n private validateFormData(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n categoryOptions: DocumentCategory[],\r\n documentTypeOptions: DocumentTypeModel[]\r\n ): { isValid: boolean; message: string } {\r\n // Check assignment type\r\n if (!assignmentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_ASSIGNMENT_TYPE };\r\n }\r\n\r\n // Check if options are loaded\r\n if (!categoryOptions.length || !documentTypeOptions.length) {\r\n return { isValid: false, message: SHARED.VALIDATION_OPTIONS_NOT_LOADED };\r\n }\r\n\r\n // Check category\r\n if (!selectedCategory) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_CATEGORY };\r\n }\r\n\r\n // Check document type\r\n if (!selectedDocumentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_DOCUMENT_TYPE };\r\n }\r\n\r\n // Check files\r\n if (uploadedFiles.length === 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_UPLOAD_AT_LEAST_ONE };\r\n }\r\n\r\n // Check if all files are uploaded\r\n const incompleteFiles = uploadedFiles.filter(file => file.progress !== 100);\r\n if (incompleteFiles.length > 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_WAIT_FOR_UPLOAD };\r\n }\r\n\r\n // For Applicant type, check applicant selection\r\n if (assignmentType === SHARED.APPLICANT && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_APPLICANT };\r\n }\r\n\r\n return { isValid: true, message: SHARED.VALIDATION_ALL_FIELDS_COMPLETED };\r\n }\r\n\r\n /**\r\n * Validates form data\r\n */\r\n validateForm(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n categoryOptions: DocumentCategory[],\r\n documentTypeOptions: DocumentTypeModel[]\r\n ): boolean {\r\n return this.validateFormData(\r\n assignmentType,\r\n selectedCategory,\r\n selectedDocumentType,\r\n selectedApplicants,\r\n uploadedFiles,\r\n categoryOptions,\r\n documentTypeOptions\r\n ).isValid;\r\n }\r\n\r\n /**\r\n * Checks if save button should be disabled\r\n */\r\n isSaveButtonDisabled(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n isSaving: boolean\r\n ): boolean {\r\n if (isSaving) {\r\n return true;\r\n }\r\n\r\n // For button state, we only need to check if required fields are filled\r\n // We don't need to validate if options are loaded\r\n if (!assignmentType) {\r\n return true;\r\n }\r\n\r\n if (!selectedCategory) {\r\n return true;\r\n }\r\n\r\n if (!selectedDocumentType) {\r\n return true;\r\n }\r\n\r\n if (uploadedFiles.length === 0) {\r\n return true;\r\n }\r\n\r\n // Check if all files are uploaded\r\n const incompleteFiles = uploadedFiles.filter(file => file.progress !== 100);\r\n if (incompleteFiles.length > 0) {\r\n return true;\r\n }\r\n\r\n // For Applicant type, check applicant selection\r\n if (assignmentType === SHARED.APPLICANT && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return true;\r\n }\r\n\r\n return false; // Button should be enabled\r\n }\r\n\r\n /**\r\n * Validates the complete payload before save\r\n */\r\n validatePayload(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[]\r\n ): { isValid: boolean; message: string } {\r\n // Check assignment type\r\n if (!assignmentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_ASSIGNMENT_TYPE };\r\n }\r\n\r\n // Check category\r\n if (!selectedCategory) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_CATEGORY };\r\n }\r\n\r\n // Check document type\r\n if (!selectedDocumentType) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_DOCUMENT_TYPE };\r\n }\r\n\r\n // Check files\r\n if (uploadedFiles.length === 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_UPLOAD_AT_LEAST_ONE };\r\n }\r\n\r\n // Check if all files are uploaded\r\n const incompleteFiles = uploadedFiles.filter(file => file.progress !== 100);\r\n if (incompleteFiles.length > 0) {\r\n return { isValid: false, message: SHARED.VALIDATION_WAIT_FOR_UPLOAD };\r\n }\r\n\r\n // For Applicant type, check applicant selection\r\n if (assignmentType === SHARED.APPLICANT && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return { isValid: false, message: SHARED.VALIDATION_SELECT_APPLICANT };\r\n }\r\n\r\n return { isValid: true, message: SHARED.VALIDATION_ALL_FIELDS_COMPLETED };\r\n }\r\n\r\n /**\r\n * Prepares upload payload\r\n */\r\n prepareUploadPayload(\r\n assignmentType: 'Applicant' | 'Application',\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n selectedApplicants: string[],\r\n uploadedFiles: UploadedFile[],\r\n contextId: string\r\n ): DocumentUploadPayload {\r\n const payload: DocumentUploadPayload = {\r\n source: assignmentType,\r\n documentTypeId: selectedDocumentType,\r\n documents: uploadedFiles.map(file => ({\r\n fileName: file.file.name,\r\n fileSize: file.file.size,\r\n url: file.url,\r\n contentType: file.contentType,\r\n size: file.size,\r\n uploadedFileId: file.uploadResponse?.id || file.uploadResponse?.fileName || file.file.name\r\n }))\r\n };\r\n\r\n // For Applicant type, include the contextIds array\r\n if (assignmentType === SHARED.APPLICANT && selectedApplicants && selectedApplicants.length > 0) {\r\n payload.contextIds = selectedApplicants;\r\n } else {\r\n // For Application type, use contextId\r\n payload.contextId = contextId;\r\n }\r\n\r\n return payload;\r\n }\r\n\r\n /**\r\n * Saves document upload\r\n */\r\n saveDocumentUpload(payload: DocumentUploadPayload): Observable<any> {\r\n return this.documentHttpService.saveDocumentUpload(payload);\r\n }\r\n\r\n /**\r\n * Formats file size\r\n */\r\n formatFileSize(fileSize: number, config: any): string {\r\n return this.fileFormatService.formatFileSize(fileSize, config);\r\n }\r\n\r\n /**\r\n * Creates uploaded file object\r\n */\r\n createUploadedFile(file: File, formattedSize: string): UploadedFile {\r\n return {\r\n file,\r\n formattedSize,\r\n progress: SHARED.UPLOAD_PROGRESS_10 \r\n };\r\n }\r\n\r\n /**\r\n * Resets form data to initial state\r\n */\r\n getInitialFormState() {\r\n return {\r\n selectedAssignmentType: null,\r\n selectedApplicants: [] as string[],\r\n selectedCategory: null,\r\n selectedDocumentType: null,\r\n uploadedFiles: [] as UploadedFile[],\r\n isFormValid: false\r\n };\r\n }\r\n\r\n /**\r\n * Destroys the service\r\n */\r\n destroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { MessageService } from 'primeng/api';\r\nimport { UploadedFile } from './document-upload-business.service';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadFormService {\r\n constructor(private messageService: MessageService) {}\r\n\r\n /**\r\n * Shows error message\r\n */\r\n showErrorMessage(summary: string, detail: string): void {\r\n this.messageService.add({\r\n severity: 'error',\r\n summary,\r\n detail\r\n });\r\n }\r\n\r\n /**\r\n * Shows warning message\r\n */\r\n showWarningMessage(summary: string, detail: string): void {\r\n this.messageService.add({\r\n severity: 'warn',\r\n summary,\r\n detail\r\n });\r\n }\r\n\r\n /**\r\n * Shows success message\r\n */\r\n showSuccessMessage(summary: string, detail: string): void {\r\n this.messageService.add({\r\n severity: 'success',\r\n summary,\r\n detail\r\n });\r\n }\r\n\r\n /**\r\n * Helper method to validate required fields and show appropriate messages\r\n */\r\n private validateRequiredFieldsWithMessages(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedApplicants: string[],\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n uploadedFiles: UploadedFile[]\r\n ): { isValid: boolean; field: string | null } {\r\n if (assignmentType === 'Applicant' && (!selectedApplicants || selectedApplicants.length === 0)) {\r\n return { isValid: false, field: 'applicant' };\r\n }\r\n\r\n if (!selectedCategory) {\r\n return { isValid: false, field: 'category' };\r\n }\r\n\r\n if (!selectedDocumentType) {\r\n return { isValid: false, field: 'documentType' };\r\n }\r\n\r\n if (uploadedFiles.length === 0) {\r\n return { isValid: false, field: 'documents' };\r\n }\r\n\r\n return { isValid: true, field: null };\r\n }\r\n\r\n /**\r\n * Validates required fields for upload\r\n */\r\n validateRequiredFields(\r\n assignmentType: 'Applicant' | 'Application' | null,\r\n selectedApplicants: string[],\r\n selectedCategory: string,\r\n selectedDocumentType: string,\r\n uploadedFiles: UploadedFile[]\r\n ): boolean {\r\n const validation = this.validateRequiredFieldsWithMessages(\r\n assignmentType,\r\n selectedApplicants,\r\n selectedCategory,\r\n selectedDocumentType,\r\n uploadedFiles\r\n );\r\n\r\n if (!validation.isValid) {\r\n this.showValidationMessage(validation.field!);\r\n }\r\n\r\n return validation.isValid;\r\n }\r\n\r\n /**\r\n * Shows appropriate validation message based on the field that failed\r\n */\r\n private showValidationMessage(field: string): void {\r\n const messages: Record<string, { summary: string; detail: string }> = {\r\n applicant: { \r\n summary: SHARED.VALIDATION_NO_APPLICANT_SELECTED, \r\n detail: SHARED.VALIDATION_NO_APPLICANT_DETAIL \r\n },\r\n category: { \r\n summary: SHARED.VALIDATION_NO_CATEGORY_SELECTED, \r\n detail: SHARED.VALIDATION_NO_CATEGORY_DETAIL \r\n },\r\n documentType: { \r\n summary: SHARED.VALIDATION_NO_DOCUMENT_TYPE_SELECTED, \r\n detail: SHARED.VALIDATION_NO_DOCUMENT_TYPE_DETAIL \r\n },\r\n documents: { \r\n summary: SHARED.VALIDATION_NO_DOCUMENTS_UPLOADED, \r\n detail: SHARED.VALIDATION_NO_DOCUMENTS_DETAIL \r\n }\r\n };\r\n\r\n const message = messages[field];\r\n if (message) {\r\n this.showWarningMessage(message.summary, message.detail);\r\n }\r\n }\r\n\r\n /**\r\n * Validates form completeness\r\n */\r\n validateFormCompleteness(): boolean {\r\n this.showWarningMessage(\r\n SHARED.VALIDATION_FORM_INCOMPLETE, \r\n SHARED.VALIDATION_FORM_INCOMPLETE_DETAIL\r\n );\r\n return false;\r\n }\r\n\r\n /**\r\n * Validates context ID presence\r\n */\r\n validateContextId(contextId: string, message: string): boolean {\r\n if (!contextId) {\r\n this.showErrorMessage(SHARED.VALIDATION_MISSING_REQUIRED_DATA, message);\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject, takeUntil } from 'rxjs';\r\nimport { DocumentUploadBusinessService } from './document-upload-business.service';\r\nimport { DocumentUploadFormService } from './document-upload-form.service';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\nimport { DocumentTypeModel } from '../models/document-type.model';\r\n\r\nexport interface DataLoadingState {\r\n isLoadingApplicants: boolean;\r\n isLoadingCategories: boolean;\r\n isLoadingDocumentTypes: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentUploadDataService {\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private businessService: DocumentUploadBusinessService,\r\n private formService: DocumentUploadFormService\r\n ) {}\r\n\r\n /**\r\n * Loads applicants and handles the response\r\n */\r\n loadApplicants(\r\n contextId: string,\r\n onSuccess: (applicants: UserListModel[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<UserListModel[]> {\r\n if (!this.formService.validateContextId(contextId, 'Context ID is required to load applicants.')) {\r\n return new Observable();\r\n }\r\n return this.businessService.loadApplicants(contextId);\r\n }\r\n\r\n /**\r\n * Loads categories and handles the response\r\n */\r\n loadCategories(\r\n assignmentType: string,\r\n onSuccess: (categories: DocumentCategory[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentCategory[]> {\r\n if (!assignmentType) {\r\n return new Observable();\r\n }\r\n return this.businessService.loadCategories(assignmentType);\r\n }\r\n /**\r\n * Loads categories and handles the response\r\n */\r\n loadBrokerCategories(\r\n assignmentType: string,\r\n onSuccess: (categories: DocumentCategory[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentCategory[]> {\r\n if (!assignmentType) {\r\n return new Observable();\r\n }\r\n return this.businessService.loadBrokerCategories(assignmentType);\r\n }\r\n\r\n /**\r\n * Loads broker document types and handles the response\r\n */\r\n loadBrokerDocumentTypes(\r\n categoryId: string,\r\n onSuccess: (documentTypes: DocumentTypeModel[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentTypeModel[]> {\r\n return this.businessService.loadBrokerDocumentTypes(categoryId);\r\n }\r\n /**\r\n * Loads document types and handles the response\r\n */\r\n loadDocumentTypes(\r\n categoryId: string,\r\n onSuccess: (documentTypes: DocumentTypeModel[]) => void,\r\n onError: (error: any) => void\r\n ): Observable<DocumentTypeModel[]> {\r\n return this.businessService.loadDocumentTypes(categoryId);\r\n }\r\n\r\n /**\r\n * Handles applicants loaded successfully\r\n */\r\n handleApplicantsLoaded(\r\n applicants: UserListModel[],\r\n assignmentType: 'Applicant' | 'Application' | null\r\n ): UserListModel[] {\r\n return this.businessService.filterApplicants(applicants, assignmentType!);\r\n }\r\n\r\n /**\r\n * Destroys the service\r\n */\r\n destroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, Input, ViewChild, ViewEncapsulation, OnDestroy, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { FileUpload } from 'primeng/fileupload';\r\nimport { MessageService } from 'primeng/api';\r\nimport { PrimeNGConfig } from 'primeng/api';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { FileFormatService } from '../../services/file-format.service';\r\nimport { DocumentService } from '../../state/document.service';\r\nimport { DocumentUploadService } from '../../services/document-upload.service';\r\nimport { DocumentUploadBusinessService, UploadedFile } from '../../services/document-upload-business.service';\r\nimport { DocumentUploadFormService } from '../../services/document-upload-form.service';\r\nimport { DocumentUploadDataService } from '../../services/document-upload-data.service';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentTypeModel } from '../../models/document-type.model';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n/**\r\n * Component responsible for handling document uploads with templated metadata.\r\n * Provides a comprehensive interface for uploading documents with assignment types,\r\n * categories, document types, and applicant selection.\r\n */\r\n@Component({\r\n selector: 'lib-document-upload',\r\n templateUrl: './document-upload.component.html',\r\n styleUrls: ['./document-upload.component.scss'],\r\n standalone: false,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class DocumentUploadComponent implements OnInit, OnChanges, OnDestroy {\r\n /** The context ID for the document upload operation */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n\r\n /** Indicates if the document save button has been clicked */\r\n @Input() isDocumentSaveBtnClicked: boolean = false;\r\n\r\n /** Indicates if the document sidebar is closed */\r\n @Input() isDocumentSidebarClosed: boolean = false;\r\n\r\n /** Whether there are unsaved changes in the form */\r\n hasUnsavedChanges: boolean = false;\r\n /** Whether to hide the form and show only upload functionality */\r\n @Input() isFormHide: boolean = false;\r\n \r\n /** Whether to hide the multi-attachment button */\r\n @Input() isMultiAttachmentHidden: boolean = false;\r\n \r\n /** Reference to the file upload component */\r\n @ViewChild('fileUploader') fileUploader!: FileUpload;\r\n \r\n /** Event emitted when form validation state changes */\r\n @Output() onFormValidationChange = new EventEmitter<void>();\r\n \r\n /** Event emitted when upload is successful */\r\n @Output() onUploadSuccess = new EventEmitter<void>();\r\n \r\n /** Event emitted when files are uploaded (for form-hidden mode) */\r\n @Output() onFilesUploaded = new EventEmitter<UploadedFile[]>();\r\n @Output() hasUnsavedChangesChange = new EventEmitter<boolean>();\r\n \r\n /** Event emitted when a file is removed (for form-hidden mode) */\r\n @Output() onFileRemoved = new EventEmitter<{file: File, index: number}>();\r\n \r\n /** Currently selected assignment type (Applicant or Application) */\r\n selectedAssignmentType: 'Applicant' | 'Application' | null = null;\r\n \r\n /** Currently selected applicant IDs (array for multiple selection) */\r\n selectedApplicants: string[] = [];\r\n \r\n /** Currently selected document category */\r\n selectedCategory: string = SHARED.EMPTY;\r\n \r\n /** Currently selected document type */\r\n selectedDocumentType: string = SHARED.EMPTY;\r\n \r\n /** List of available applicants */\r\n applicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Filtered list of applicants based on current selection */\r\n filteredApplicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Available document categories for the selected assignment type */\r\n categoryOptions: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Available document types for the selected category */\r\n documentTypeOptions: DocumentTypeModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Array of files that have been uploaded */\r\n uploadedFiles: UploadedFile[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Map tracking upload progress for each file */\r\n fileProgress: Map<File, number> = new Map();\r\n \r\n /** Loading state for applicants data */\r\n isLoadingApplicants: boolean = false;\r\n \r\n /** Loading state for categories data */\r\n isLoadingCategories: boolean = false;\r\n \r\n /** Loading state for document types data */\r\n isLoadingDocumentTypes: boolean = false;\r\n \r\n /** Loading state for save operation */\r\n isSaving: boolean = false;\r\n \r\n /** Current form validation state */\r\n isFormValid: boolean = false;\r\n\r\n /** File size property for testing */\r\n fileSize: string = '';\r\n\r\n /** Subject for managing component lifecycle and unsubscribing from observables */\r\n private destroy$ = new Subject<void>();\r\n\r\n /**\r\n * Creates an instance of DocumentUploadComponent.\r\n * @param documentUpload - Service for handling document upload operations\r\n * @param uploadService - Service for document-related operations\r\n * @param config - PrimeNG configuration service\r\n * @param fileFormatService - Service for file format validation\r\n * @param messageService - Service for displaying messages\r\n * @param cdr - Change detector reference for manual change detection\r\n * @param businessService - Service for business logic operations\r\n * @param formService - Service for form validation and handling\r\n * @param dataService - Service for data loading operations\r\n */\r\n constructor(\r\n public documentUpload: DocumentUploadService, \r\n public uploadService: DocumentService, \r\n private config: PrimeNGConfig, \r\n public fileFormatService: FileFormatService, \r\n public messageService: MessageService, \r\n public cdr: ChangeDetectorRef,\r\n private businessService: DocumentUploadBusinessService,\r\n private formService: DocumentUploadFormService,\r\n private dataService: DocumentUploadDataService\r\n ) { }\r\n\r\n /**\r\n * Lifecycle hook called after inputs are initialized.\r\n * Ensures no stale uploads are shown when navigating back.\r\n */\r\n ngOnInit(): void {\r\n this.resetForm();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['isDocumentSaveBtnClicked'] && changes['isDocumentSaveBtnClicked'].currentValue) {\r\n this.saveDocumentUpload();\r\n }\r\n\r\n if(changes['isDocumentSidebarClosed'] && changes['isDocumentSidebarClosed'].currentValue) {\r\n if(this.isDocumentSidebarClosed) {\r\n this.resetForm();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handles changes in assignment type selection.\r\n * Resets form selections, loads categories, and handles applicant loading.\r\n */\r\n onAssignmentTypeChange(): void {\r\n this.resetSelections();\r\n this.loadCategories();\r\n this.handleApplicantLoading();\r\n this.validateForm(); // Validate form after assignment type change\r\n this.emitFormValidationChange();\r\n }\r\n\r\n private checkForUnsavedChanges(): boolean {\r\n // Check if files are uploaded\r\n const hasFiles = Boolean(this.uploadedFiles && this.uploadedFiles.length > 0);\r\n\r\n // Check if any form fields have been changed\r\n const hasFormChanges = Boolean(\r\n (this.selectedAssignmentType && this.selectedAssignmentType !== SHARED.EMPTY) || \r\n (this.selectedApplicants && this.selectedApplicants.length > 0) || \r\n (this.selectedCategory && this.selectedCategory !== SHARED.EMPTY) || \r\n (this.selectedDocumentType && this.selectedDocumentType !== SHARED.EMPTY)\r\n );\r\n\r\n // Set and return the combined result\r\n this.hasUnsavedChanges = hasFiles || hasFormChanges;\r\n return this.hasUnsavedChanges;\r\n }\r\n\r\n /**\r\n * Handles changes in category selection.\r\n * Resets document type and loads available document types if category is selected.\r\n */\r\n onCategoryChange(): void {\r\n this.resetDocumentType();\r\n if (this.selectedCategory) this.loadDocumentTypes();\r\n this.validateForm(); // Validate form after category change\r\n this.validateAndEmit();\r\n }\r\n\r\n /**\r\n * Handles changes in document type selection.\r\n * Validates form and emits validation change event.\r\n */\r\n onDocumentTypeChange(): void { this.validateAndEmit(); }\r\n \r\n /**\r\n * Handles changes in applicant selection.\r\n * Validates form and emits validation change event.\r\n */\r\n onApplicantSelectionChange(): void { this.validateAndEmit(); }\r\n\r\n /**\r\n * Handles file selection from the file upload component.\r\n * Processes each selected file for templated upload sequentially.\r\n * @param event - Event containing the selected files\r\n */\r\n async onSelectedFiles(event: { currentFiles: File[] }): Promise<void> {\r\n const MAX_FILE_SIZE = 27262976; // 26 MB in bytes (26 * 1024 * 1024)\r\n \r\n // Filter out files with unsupported extensions\r\n const validFiles = event.currentFiles.filter(file => \r\n this.fileFormatService.isAllowedFileType(file.name)\r\n );\r\n \r\n // Filter out files that exceed size limit\r\n const sizeValidFiles = validFiles.filter(file => file.size <= MAX_FILE_SIZE);\r\n \r\n if (validFiles.length !== event.currentFiles.length) {\r\n const invalidFiles = event.currentFiles.filter(file => \r\n !this.fileFormatService.isAllowedFileType(file.name)\r\n );\r\n const invalidFileNames = invalidFiles.map(file => file.name).join(', ');\r\n this.messageService.add({\r\n severity: 'warn',\r\n summary: 'Invalid File Type',\r\n detail: `The following files have unsupported formats and will be skipped: ${invalidFileNames}`\r\n });\r\n }\r\n \r\n if (sizeValidFiles.length !== validFiles.length) {\r\n const oversizedFiles = validFiles.filter(file => file.size > MAX_FILE_SIZE);\r\n const oversizedFileNames = oversizedFiles.map(file => file.name).join(', ');\r\n const maxSizeMB = (MAX_FILE_SIZE / (1024 * 1024)).toFixed(2);\r\n this.messageService.add({\r\n severity: 'error',\r\n summary: 'File Size Exceeded',\r\n detail: `The following files exceed the maximum size limit of ${maxSizeMB} MB and will be skipped: ${oversizedFileNames}`\r\n });\r\n }\r\n \r\n if (sizeValidFiles.length > 0) {\r\n await this.processFilesSequentially(sizeValidFiles);\r\n }\r\n \r\n this.fileUploader.clear();\r\n }\r\n\r\n /**\r\n * Processes files sequentially for upload\r\n * @param files - Array of files to process\r\n */\r\n private async processFilesSequentially(files: File[]): Promise<void> {\r\n if (!this.formService.validateContextId(this.contextId, 'Context ID is required for upload.')) {\r\n return;\r\n }\r\n await this.documentUpload.uploadFilesSequentiallyWithProgress(\r\n files, \r\n this.contextId,\r\n (currentFile, currentIndex, totalFiles) => {\r\n this.fileProgress.set(currentFile, SHARED.UPLOAD_PROGRESS_10);\r\n this.setupFileUploadListener(currentFile);\r\n const formattedSize = this.businessService.formatFileSize(currentFile.size, this.config);\r\n const uploadedFile = this.businessService.createUploadedFile(currentFile, formattedSize);\r\n uploadedFile.progress = SHARED.UPLOAD_PROGRESS_10;\r\n this.uploadedFiles.push(uploadedFile);\r\n \r\n // Only validate form if not in form-hidden mode\r\n if (!this.isFormHide) {\r\n this.validateForm();\r\n }\r\n \r\n this.cdr.detectChanges();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Loads the list of applicants for the current context.\r\n * Sets loading state and handles success/error responses.\r\n */\r\n loadApplicants(): void {\r\n this.isLoadingApplicants = true;\r\n this.dataService.loadApplicants(\r\n this.contextId,\r\n (applicants) => this.handleApplicantsLoaded(applicants),\r\n (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (applicants) => this.handleApplicantsLoaded(applicants),\r\n error: (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n });\r\n }\r\n\r\n /**\r\n * Loads document categories based on the selected assignment type.\r\n * Sets loading state and handles success/error responses.\r\n */\r\n loadCategories(): void {\r\n this.isLoadingCategories = true;\r\n this.dataService.loadCategories(\r\n this.selectedAssignmentType!,\r\n (categories) => this.handleCategoriesLoaded(categories),\r\n (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (categories) => this.handleCategoriesLoaded(categories),\r\n error: (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n });\r\n }\r\n\r\n /**\r\n * Loads document types based on the selected category.\r\n * Sets loading state and handles success/error responses.\r\n */\r\n loadDocumentTypes(): void {\r\n this.isLoadingDocumentTypes = true;\r\n this.dataService.loadDocumentTypes(\r\n this.selectedCategory,\r\n (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n error: (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n });\r\n }\r\n\r\n /**\r\n * Saves the document upload with all metadata.\r\n * Validates payload and required fields before proceeding with upload.\r\n */\r\n saveDocumentUpload(): void {\r\n const payloadValidation = this.businessService.validatePayload(\r\n this.selectedAssignmentType, this.selectedCategory, this.selectedDocumentType, \r\n this.selectedApplicants, this.uploadedFiles\r\n );\r\n \r\n if (!payloadValidation.isValid) {\r\n this.formService.showWarningMessage('Incomplete Form', payloadValidation.message);\r\n return;\r\n }\r\n \r\n if (!this.formService.validateRequiredFields(\r\n this.selectedAssignmentType, this.selectedApplicants, this.selectedCategory, \r\n this.selectedDocumentType, this.uploadedFiles\r\n )) return;\r\n \r\n this.isSaving = true;\r\n this.saveDocumentMetadata();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Removes a document from the uploaded files list.\r\n * Updates progress tracking and validates form.\r\n * @param file - The file to be removed\r\n * @param index - The index of the file in the uploaded files array\r\n */\r\n handleDocumentRemove(file: File, index: number): void {\r\n this.uploadedFiles.splice(index, 1);\r\n this.fileProgress.delete(file);\r\n \r\n // Emit file removed event for form-hidden mode\r\n if (this.isFormHide) {\r\n this.onFileRemoved.emit({file, index});\r\n } else {\r\n this.validateAndEmit();\r\n }\r\n \r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Utility method for file upload component integration.\r\n * @param event - The file upload event\r\n * @param callback - Callback function to execute\r\n */\r\n choose(event: any, callback: () => void): void { callback(); }\r\n \r\n /**\r\n * Triggers the file upload dialog.\r\n */\r\n triggerFileUpload(): void { this.fileUploader.choose(); }\r\n \r\n /**\r\n * Determines if the save button should be disabled.\r\n * @returns True if the save button should be disabled, false otherwise\r\n */\r\n getSaveButtonDisabled(): boolean {\r\n const isDisabled = this.businessService.isSaveButtonDisabled(\r\n this.selectedAssignmentType, this.selectedCategory, this.selectedDocumentType,\r\n this.selectedApplicants, this.uploadedFiles, this.isSaving\r\n )\r\n return isDisabled;\r\n }\r\n\r\n /**\r\n * Gets the upload progress for a specific file.\r\n * @param file - The file to get progress for\r\n * @returns The upload progress percentage (0-100)\r\n */\r\n getProgress(file: File): number { return this.fileProgress.get(file) || 0; }\r\n\r\n /**\r\n * Checks if a file is currently uploading.\r\n * @param file - The file to check\r\n * @returns True if the file is uploading, false otherwise\r\n */\r\n isFileUploading(file: File): boolean { \r\n const progress = this.fileProgress.get(file);\r\n return progress !== undefined && progress > 0 && progress < SHARED.UPLOAD_PROGRESS_100;\r\n }\r\n \r\n /**\r\n * Checks if a file has been successfully uploaded.\r\n * @param file - The file to check\r\n * @returns True if the file is uploaded, false otherwise\r\n */\r\n isFileUploaded(file: File): boolean { return this.fileProgress.get(file) === SHARED.UPLOAD_PROGRESS_100; }\r\n \r\n /**\r\n * Checks if a file upload encountered an error.\r\n * @param file - The file to check\r\n * @returns True if the file has an error, false otherwise\r\n */\r\n isFileError(file: File): boolean { return this.fileProgress.get(file) === -1; }\r\n\r\n /**\r\n * Resets the form to its initial state.\r\n * Clears all selections, uploaded files, and progress tracking.\r\n */\r\n resetForm(): void {\r\n const initialState = this.businessService.getInitialFormState();\r\n Object.assign(this, initialState);\r\n this.fileProgress.clear();\r\n this.filteredApplicantList = [];\r\n this.categoryOptions = [];\r\n this.documentTypeOptions = [];\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Resets form selections (applicant, category, document type).\r\n * Clears document type options.\r\n */\r\n resetSelections(): void {\r\n this.selectedApplicants = [];\r\n this.selectedCategory = this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n /**\r\n * Resets document type selection and clears document type options.\r\n */\r\n resetDocumentType(): void {\r\n this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n /**\r\n * Handles applicant loading based on assignment type.\r\n * Loads applicants if type is 'Applicant', otherwise filters existing list.\r\n */\r\n handleApplicantLoading(): void {\r\n if (this.selectedAssignmentType === SHARED.APPLICANT) {\r\n this.loadApplicants();\r\n } else {\r\n this.filterApplicants();\r\n }\r\n }\r\n\r\n /**\r\n * Handles successful loading of applicants data.\r\n * Updates applicant list, filters applicants, and validates form.\r\n * @param applicants - Array of loaded applicants\r\n */\r\n handleApplicantsLoaded(applicants: UserListModel[]): void {\r\n this.applicantList = applicants;\r\n this.filterApplicants();\r\n this.isLoadingApplicants = false;\r\n this.validateForm();\r\n }\r\n\r\n /**\r\n * Handles successful loading of categories data.\r\n * Updates category options and validates form.\r\n * @param categories - Array of loaded categories\r\n */\r\n handleCategoriesLoaded(categories: DocumentCategory[]): void {\r\n this.categoryOptions = this.documentUpload.sortListByProperty(categories, 'label');\r\n this.isLoadingCategories = false;\r\n this.validateForm();\r\n }\r\n\r\n /**\r\n * Handles successful loading of document types data.\r\n * Updates document type options and validates form.\r\n * @param documentTypes - Array of loaded document types\r\n */\r\n handleDocumentTypesLoaded(documentTypes: DocumentTypeModel[]): void {\r\n this.documentTypeOptions = this.documentUpload.sortListByProperty(documentTypes, 'label', 'name');\r\n this.isLoadingDocumentTypes = false;\r\n this.validateForm();\r\n }\r\n\r\n /**\r\n * Handles successful upload completion.\r\n * Resets form and emits upload success event.\r\n * @param response - The upload response from the server\r\n */\r\n handleUploadSuccess(response: any): void {\r\n this.isSaving = false;\r\n this.resetForm();\r\n this.onUploadSuccess.emit();\r\n }\r\n\r\n /**\r\n * Handles upload error.\r\n * Resets saving state.\r\n * @param error - The error that occurred during upload\r\n */\r\n handleUploadError(error: any): void {\r\n this.isSaving = false;\r\n }\r\n\r\n /**\r\n * Filters applicants based on the selected assignment type.\r\n * Updates the filtered applicant list.\r\n */\r\n filterApplicants(): void {\r\n this.filteredApplicantList = this.dataService.handleApplicantsLoaded(\r\n this.applicantList, this.selectedAssignmentType\r\n );\r\n }\r\n\r\n /**\r\n * Validates the current form state.\r\n * Checks payload validation and emits form validation change if state changed.\r\n */\r\n validateForm(): void {\r\n const payloadValidation = this.businessService.validatePayload(\r\n this.selectedAssignmentType, this.selectedCategory, this.selectedDocumentType,\r\n this.selectedApplicants, this.uploadedFiles\r\n );\r\n \r\n const previousValidationState = this.isFormValid;\r\n this.isFormValid = payloadValidation.isValid;\r\n\r\n const hasUnsavedChanges = this.checkForUnsavedChanges();\r\n this.hasUnsavedChangesChange.emit(hasUnsavedChanges);\r\n if (previousValidationState !== this.isFormValid) {\r\n this.onFormValidationChange.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Saves document metadata to the server.\r\n * Prepares upload payload and calls business service to save.\r\n */\r\n saveDocumentMetadata(): void {\r\n const contextId = this.contextId;\r\n const payload = this.businessService.prepareUploadPayload(\r\n this.selectedAssignmentType!, this.selectedCategory, this.selectedDocumentType,\r\n this.selectedApplicants, this.uploadedFiles, contextId\r\n );\r\n\r\n this.businessService.saveDocumentUpload(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => this.handleUploadSuccess(response),\r\n error: (error) => this.handleUploadError(error)\r\n });\r\n }\r\n\r\n /**\r\n * Sets up a listener for file upload completion.\r\n * Updates progress tracking and emits validation change when upload completes.\r\n * @param file - The file to monitor for upload completion\r\n */\r\n setupFileUploadListener(file: File): void {\r\n this.documentUpload.uploadCompleted.pipe(takeUntil(this.destroy$)).subscribe(({file: uploadedFile, response}) => {\r\n if (uploadedFile === file) {\r\n this.fileProgress.set(file, SHARED.UPLOAD_PROGRESS_100);\r\n const uploadedFileObj = this.uploadedFiles.find(uf => uf.file === file);\r\n if (uploadedFileObj) {\r\n uploadedFileObj.uploadResponse = response;\r\n uploadedFileObj.progress = SHARED.UPLOAD_PROGRESS_100;\r\n uploadedFileObj.url = response?.url;\r\n uploadedFileObj.contentType = response?.contentType;\r\n }\r\n this.cdr.detectChanges();\r\n \r\n // Emit files uploaded event for form-hidden mode\r\n if (this.isFormHide) {\r\n this.onFilesUploaded.emit([...this.uploadedFiles]);\r\n } else {\r\n this.onFormValidationChange.emit();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handles errors during data loading operations.\r\n * Resets loading state and can be extended for error logging.\r\n * @param title - Error title for display\r\n * @param error - The error object\r\n * @param resetLoading - Callback to reset loading state\r\n */\r\n handleError(title: string, error: any, resetLoading: () => void): void {\r\n resetLoading();\r\n }\r\n\r\n /**\r\n * Validates form and emits validation change event.\r\n */\r\n validateAndEmit(): void {\r\n this.validateForm();\r\n this.onFormValidationChange.emit();\r\n }\r\n\r\n /**\r\n * Emits form validation change event.\r\n */\r\n emitFormValidationChange(): void {\r\n this.onFormValidationChange.emit();\r\n }\r\n\r\n /**\r\n * Formats file size for testing purposes.\r\n * @param size - The file size in bytes\r\n */\r\n formatSize(size: number): void {\r\n this.fileSize = this.businessService.formatFileSize(size, this.config);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets the accept string for the file upload component\r\n * @returns String with file extensions for the accept attribute\r\n */\r\n getFileUploadAcceptString(): string {\r\n return this.fileFormatService.getAllowedFileExtensions()\r\n .map(ext => `.${ext}`)\r\n .join(SHARED.COMMA);\r\n }\r\n\r\n /**\r\n * Gets the uploaded files data for external use (useful when form is hidden)\r\n * @returns Array of uploaded files with their metadata\r\n */\r\n getUploadedFiles(): UploadedFile[] {\r\n return [...this.uploadedFiles];\r\n }\r\n\r\n /**\r\n * Resets the upload component to its initial state (useful when form is hidden)\r\n */\r\n resetUpload(): void {\r\n this.uploadedFiles = [];\r\n this.fileProgress.clear();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Lifecycle hook that is called when component is destroyed.\r\n * Cleans up subscriptions and destroys services.\r\n */\r\n ngOnDestroy(): void {\r\n console.log(\"destroyed\")\r\n this.resetUpload()\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.businessService.destroy();\r\n this.dataService.destroy();\r\n }\r\n}\r\n\r\n","<div class=\"document-upload-container\">\r\n <!-- Assignment Section -->\r\n <div class=\"assignment-section\" *ngIf=\"!isFormHide\">\r\n <h4>Assign to Applicant(s) or Application <span class=\"text-red-500\">*</span> </h4>\r\n <div class=\"radio-group\">\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Applicant\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'applicant'\"\r\n ></p-radioButton>\r\n <label [for]=\"'applicant'\" class=\"radio-label\">Applicant(s) </label>\r\n </div>\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Application\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'application'\"\r\n ></p-radioButton>\r\n <label [for]=\"'application'\" class=\"radio-label\">Application</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Applicant Selection (only shown when Applicant is selected) -->\r\n <div class=\"applicant-section\" *ngIf=\"!isFormHide && selectedAssignmentType === 'Applicant'\">\r\n <h4>Select Applicant(s) <span class=\"text-red-500\">*</span></h4>\r\n <div class=\"grid\">\r\n <div \r\n *ngFor=\"let applicant of filteredApplicantList\" \r\n class=\"applicant-item col-12 md:col-6\"\r\n >\r\n <p-checkbox \r\n [value]=\"applicant._id\"\r\n [(ngModel)]=\"selectedApplicants\"\r\n [inputId]=\"'applicant-' + applicant._id\"\r\n (onChange)=\"onApplicantSelectionChange()\"\r\n ></p-checkbox>\r\n <label [for]=\"'applicant-' + applicant._id\" class=\"applicant-label\">\r\n {{ applicant.name }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Selection -->\r\n <div class=\"category-section\" *ngIf=\"!isFormHide\">\r\n <h4>Category <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"categoryOptions\"\r\n [(ngModel)]=\"selectedCategory\"\r\n placeholder=\"Select Category type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onCategoryChange()\"\r\n [disabled]=\"!categoryOptions.length\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div>\r\n\r\n <!-- Document Type Selection -->\r\n <div class=\"document-type-section\" *ngIf=\"!isFormHide\">\r\n <h4>Document Type <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"documentTypeOptions\"\r\n [(ngModel)]=\"selectedDocumentType\"\r\n placeholder=\"Select Document type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onDocumentTypeChange()\"\r\n [disabled]=\"!documentTypeOptions.length || !selectedCategory\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div>\r\n\r\n <!-- File Upload Section -->\r\n <div class=\"file-upload-section\">\r\n <h4>Upload Documents <span class=\"text-red-500\" *ngIf=\"!isFormHide\">*</span></h4>\r\n <div class=\"grid\">\r\n <div class=\"col-12 md:col-12\">\r\n <p-fileUpload \r\n #fileUploader \r\n [multiple]=\"true\" \r\n auto=\"true\" \r\n [accept]=\"getFileUploadAcceptString()\" \r\n maxFileSize=\"27262976\"\r\n (onSelect)=\"onSelectedFiles($event)\"\r\n >\r\n <ng-template pTemplate=\"header\" let-chooseCallback=\"chooseCallback\" let-clearCallback=\"clearCallback\">\r\n <div class=\"docHeader p-2 flex flex-wrap justify-content-between align-items-center flex-1 gap-2\">\r\n <div class=\"flex gap-2\">\r\n <p-button \r\n *ngIf=\"!isMultiAttachmentHidden\"\r\n (onClick)=\"choose($event, chooseCallback)\" \r\n icon=\"pi pi-images\" \r\n [rounded]=\"true\"\r\n [outlined]=\"true\" \r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"content\" let-removeFileCallback=\"removeFileCallback\"\r\n let-removeUploadedFileCallback=\"removeUploadedFileCallback\">\r\n <div class=\"col-12 md:col-12 p-0\">\r\n <div class=\"col-12 md:col-12 p-0\" *ngIf=\"uploadedFiles.length > 0\">\r\n <div *ngFor=\"let uploadedFile of uploadedFiles; let i = index\"\r\n class=\"m-0 flex flex-column align-items-center gap-1 mt-3\">\r\n <div class=\"col-12 md:col-12 p-0 flex documentInfo\">\r\n <div class=\"documentImage\">\r\n <img src=\"../../../../assets/images/document.png\" [alt]=\"uploadedFile.file.name\" width=\"45\" height=\"50\"\r\n class=\"object-contain\" />\r\n </div>\r\n <div class=\"flex w-full flex-column mt-2 ml-2\">\r\n <div class=\"flex justify-content-between\">\r\n <div style=\"font-weight: bold;font-size: 14px\">\r\n {{ uploadedFile.file.name }}\r\n </div>\r\n <i class=\"pi pi-times cursor-pointer\" (click)=\"handleDocumentRemove(uploadedFile.file,i)\"></i>\r\n </div>\r\n <div class=\"flex justify-content-between mt-1\">\r\n <div style=\"color: #676B89; font-size: 12px; color: green;\" class=\"pi pi-verified\"> \r\n {{ uploadedFile.formattedSize }}\r\n </div>\r\n <div class=\"white-space-nowrap\" style=\"color: #0F8BFD; font-family: 14px;\"> \r\n {{ uploadedFile.progress }} % \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-12 md:col-12 p-0\">\r\n <p-progressBar \r\n [value]=\"uploadedFile.progress ?? 0\" \r\n [showValue]=\"false\" \r\n styleClass=\"h-1/2rem md:ml-auto relative\"\r\n [ngClass]=\"{ 'exceeded-progress-bar': (uploadedFile.progress ?? 0) > 100 }\"\r\n >\r\n </p-progressBar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"empty\" let-chooseCallback=\"chooseCallback\">\r\n <div *ngIf=\"!uploadedFiles.length\" class=\"flex align-items-center justify-content-center flex-column\"\r\n (click)=\"triggerFileUpload()\">\r\n <i class=\"pi pi-cloud-upload border-2 border-circle p-5 text-8xl text-400 border-400\"></i>\r\n <p class=\"mt-4 mb-0\">Drag and drop files here to upload.</p>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"file\"> </ng-template>\r\n </p-fileUpload>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { SHARED } from '../constant/SHARED';\r\n\r\n/**\r\n * Service for managing user session details.\r\n * @class SessionService\r\n * @typedef {SessionService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SessionService {\r\n\r\n /**\r\n * Creates an instance of SessionService.\r\n * @param {Router} router - Angular Router for navigation.\r\n */\r\n constructor(public router: Router) {}\r\n\r\n /**\r\n * Retrieves the current user's role from local storage.\r\n * @returns {string | null} The user's role, or null if not found.\r\n */\r\n getUserRole(): string | null {\r\n return localStorage.getItem('role');\r\n }\r\n\r\n /**\r\n * Stores the user session data in local storage.\r\n * @param {any} data - The session data to store.\r\n */\r\n setUserSession(data: any): void {\r\n localStorage.setItem(SHARED.SESSIONKEY, JSON.stringify(data));\r\n }\r\n\r\n /**\r\n * Retrieves the stored user session data.\r\n * @returns {any | null} The parsed session data, or null if not found.\r\n */\r\n getUserSession(): any | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n return sessionData ? JSON.parse(sessionData) : null;\r\n }\r\n\r\n /**\r\n * Retrieves the user's permissions from the stored session data.\r\n * @returns {any | null} The user's permissions, or null if not found.\r\n */\r\n getUserPermissions(): any | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n if (!sessionData) return null;\r\n const parsed = JSON.parse(sessionData);\r\n // Example: { traits: [\"Applicants-get\", ...] }\r\n return parsed?.traits ?? null;\r\n }\r\n\r\n /**\r\n * Retrieves the user's traits from the stored session data (preferred).\r\n * @returns {string[] | null} Trait strings, or null if not found.\r\n */\r\n getUserTraits(): string[] | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n if (!sessionData) return null;\r\n const parsed = JSON.parse(sessionData);\r\n return Array.isArray(parsed?.traits) ? parsed.traits : null;\r\n }\r\n\r\n /**\r\n * Retrieves the session ID from the stored session data.\r\n * @returns {any | null} The session ID, or null if not found.\r\n */\r\n getSessionID(): any | null {\r\n const sessionData = localStorage.getItem(SHARED.SESSIONKEY);\r\n console.log(sessionData);\r\n if (sessionData) {\r\n const sessionId = JSON.parse(sessionData);\r\n console.log(sessionId);\r\n return sessionId;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Clears all stored session data from local storage.\r\n */\r\n clearSession(): void {\r\n localStorage.clear();\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentTypeModel } from '../../models/document-type.model';\r\nimport { DocumentUploadService } from '../../services/document-upload.service';\r\nimport { DocumentUploadFormService } from '../../services/document-upload-form.service';\r\nimport { DocumentUploadDataService } from '../../services/document-upload-data.service';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { SessionService } from '../../../../Shared/services/session.service';\r\n\r\n@Component({\r\n selector: 'lib-request-document',\r\n templateUrl: './request-document.component.html',\r\n standalone: false\r\n})\r\nexport class RequestDocumentComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Input() isRequestSaveBtnClicked: boolean = false;\r\n @Input() isRequestSidebarClosed: boolean = false;\r\n\r\n @Output() onFormValidationChange = new EventEmitter<void>();\r\n @Output() onRequestSuccess = new EventEmitter<void>();\r\n @Output() onRequestError = new EventEmitter<any>();\r\n @Output() hasUnsavedChangesChange = new EventEmitter<boolean>();\r\n\r\n selectedAssignmentType: 'Applicant' | 'Application' | null = null;\r\n selectedApplicant: string = SHARED.EMPTY;\r\n selectedCategory: string = SHARED.EMPTY;\r\n selectedDocumentType: string = SHARED.EMPTY;\r\n description: string = SHARED.EMPTY;\r\n\r\n applicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n filteredApplicantList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n categoryOptions: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n documentTypeOptions: DocumentTypeModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n isLoadingApplicants: boolean = false;\r\n isLoadingCategories: boolean = false;\r\n isLoadingDocumentTypes: boolean = false;\r\n isSaving: boolean = false;\r\n isFormValid: boolean = false;\r\n\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n public documentUpload: DocumentUploadService,\r\n private formService: DocumentUploadFormService,\r\n private dataService: DocumentUploadDataService,\r\n private cdr: ChangeDetectorRef,\r\n private documentHttpService : DocumentHttpService,\r\n private sessionService: SessionService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.resetForm();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['isRequestSaveBtnClicked'] && changes['isRequestSaveBtnClicked'].currentValue) {\r\n this.saveRequestDocument();\r\n }\r\n if (changes['isRequestSidebarClosed'] && changes['isRequestSidebarClosed'].currentValue) {\r\n if (this.isRequestSidebarClosed) {\r\n this.resetForm();\r\n }\r\n }\r\n }\r\n\r\n onAssignmentTypeChange(): void {\r\n this.resetSelections();\r\n this.loadCategories();\r\n // Always ensure applicants are loaded; filtering will apply based on assignment type\r\n this.loadApplicants();\r\n this.validateAndEmit();\r\n this.emitUnsavedChanges();\r\n }\r\n\r\n onCategoryChange(): void {\r\n this.resetDocumentType();\r\n if (this.selectedCategory) this.loadDocumentTypes();\r\n this.validateAndEmit();\r\n this.emitUnsavedChanges();\r\n }\r\n\r\n onDocumentTypeChange(): void { this.validateAndEmit(); this.emitUnsavedChanges(); }\r\n onApplicantSelectionChange(): void { this.validateAndEmit(); this.emitUnsavedChanges(); }\r\n onDescriptionChange(): void { this.validateAndEmit(); this.emitUnsavedChanges(); }\r\n\r\n loadApplicants(): void {\r\n this.isLoadingApplicants = true;\r\n this.dataService.loadApplicants(\r\n this.contextId,\r\n (applicants) => this.handleApplicantsLoaded(applicants),\r\n (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (applicants) => {\r\n // When assignment type is not yet selected, just cache the list\r\n if (!this.selectedAssignmentType) {\r\n this.applicantList = applicants;\r\n this.filteredApplicantList = applicants;\r\n this.isLoadingApplicants = false;\r\n return;\r\n }\r\n this.handleApplicantsLoaded(applicants);\r\n },\r\n error: (error) => this.handleError('Failed to Load Applicants', error, () => this.isLoadingApplicants = false)\r\n });\r\n }\r\n\r\n loadCategories(): void {\r\n this.isLoadingCategories = true;\r\n this.dataService.loadBrokerCategories(\r\n this.selectedAssignmentType!,\r\n (categories) => this.handleCategoriesLoaded(categories),\r\n (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (categories) => this.handleCategoriesLoaded(categories),\r\n error: (error) => this.handleError('Failed to Load Categories', error, () => this.isLoadingCategories = false)\r\n });\r\n }\r\n\r\n loadDocumentTypes(): void {\r\n this.isLoadingDocumentTypes = true;\r\n this.dataService.loadBrokerDocumentTypes(\r\n this.selectedCategory,\r\n (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n ).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (documentTypes) => this.handleDocumentTypesLoaded(documentTypes),\r\n error: (error) => this.handleError('Failed to Load Document Types', error, () => this.isLoadingDocumentTypes = false)\r\n });\r\n }\r\n\r\n getSaveButtonDisabled(): boolean {\r\n return !this.isFormValid || this.isSaving;\r\n }\r\n\r\n saveRequestDocument(): void {\r\n if (!this.isFormValid) {\r\n this.formService.showWarningMessage('Incomplete Form', 'Please complete all required fields.');\r\n return;\r\n }\r\n if (!this.description || !this.description.trim()) {\r\n this.formService.showWarningMessage('Description Required', 'Please add a description.');\r\n return;\r\n }\r\n // build request payload expected by backend\r\n const requestedDocumentForId = this.selectedAssignmentType === SHARED.APPLICANT\r\n ? this.selectedApplicant\r\n : this.contextId;\r\n const requesterId = this.sessionService.getUserSession()?.userId;\r\n const requestPayload = {\r\n applicationId: this.contextId,\r\n // requestedDocumentForId: requestedDocumentForId,\r\n // requestedDocumentType: this.selectedDocumentType,\r\n requesterId: requesterId,\r\n // selectedAssignmentType: this.selectedAssignmentType,\r\n description: this.description.trim()\r\n };\r\n\r\n this.isSaving = true;\r\n this.documentHttpService.documentRequest(requestPayload).subscribe({\r\n next: () => {\r\n this.isSaving = false;\r\n this.onRequestSuccess.emit();\r\n this.resetForm();\r\n },\r\n error: (error) => {\r\n this.isSaving = false;\r\n this.onRequestError.emit(error);\r\n }\r\n });\r\n }\r\n\r\n resetForm(): void {\r\n this.selectedAssignmentType = null;\r\n this.selectedApplicant = SHARED.EMPTY;\r\n this.selectedCategory = SHARED.EMPTY;\r\n this.selectedDocumentType = SHARED.EMPTY;\r\n this.description = SHARED.EMPTY;\r\n this.filteredApplicantList = [];\r\n this.categoryOptions = [];\r\n this.documentTypeOptions = [];\r\n this.isSaving = false;\r\n this.isFormValid = false;\r\n this.cdr.detectChanges();\r\n this.hasUnsavedChangesChange.emit(false);\r\n }\r\n\r\n resetSelections(): void {\r\n this.selectedApplicant = this.selectedCategory = this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n resetDocumentType(): void {\r\n this.selectedDocumentType = SHARED.EMPTY;\r\n this.documentTypeOptions = SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n handleApplicantLoading(): void {\r\n if (this.selectedAssignmentType === SHARED.APPLICANT) {\r\n this.loadApplicants();\r\n } else {\r\n this.filterApplicants();\r\n }\r\n }\r\n\r\n handleApplicantsLoaded(applicants: UserListModel[]): void {\r\n this.applicantList = this.documentUpload.sortListByProperty(applicants, 'name');\r\n this.filterApplicants();\r\n this.isLoadingApplicants = false;\r\n this.validateForm();\r\n }\r\n\r\n handleCategoriesLoaded(categories: DocumentCategory[]): void {\r\n this.categoryOptions = this.documentUpload.sortListByProperty(categories, 'label');\r\n this.isLoadingCategories = false;\r\n this.validateForm();\r\n }\r\n\r\n handleDocumentTypesLoaded(documentTypes: DocumentTypeModel[]): void {\r\n this.documentTypeOptions = this.documentUpload.sortListByProperty(documentTypes, 'label', 'name');\r\n this.isLoadingDocumentTypes = false;\r\n this.validateForm();\r\n }\r\n\r\n filterApplicants(): void {\r\n this.filteredApplicantList = this.dataService.handleApplicantsLoaded(\r\n this.applicantList, this.selectedAssignmentType\r\n );\r\n }\r\n\r\n validateForm(): void {\r\n // Original validation commented out - only description is required\r\n // const baseValid = Boolean(\r\n // this.selectedAssignmentType &&\r\n // this.selectedCategory &&\r\n // this.selectedDocumentType &&\r\n // this.description && this.description.trim()\r\n // );\r\n // const needsApplicant = this.selectedAssignmentType === SHARED.APPLICANT;\r\n // const hasRequiredFields = needsApplicant ? (baseValid && !!this.selectedApplicant) : baseValid;\r\n \r\n // Only description is required\r\n const hasRequiredFields = Boolean(this.description && this.description.trim());\r\n const previousState = this.isFormValid;\r\n this.isFormValid = hasRequiredFields;\r\n if (previousState !== this.isFormValid) {\r\n this.onFormValidationChange.emit();\r\n }\r\n }\r\n\r\n validateAndEmit(): void {\r\n this.validateForm();\r\n this.onFormValidationChange.emit();\r\n }\r\n\r\n /** Emits unsaved changes state based on any field being non-empty */\r\n private emitUnsavedChanges(): void {\r\n // Original validation commented out - only description matters for unsaved changes\r\n // const hasChanges = Boolean(\r\n // (this.selectedAssignmentType && this.selectedAssignmentType !== SHARED.EMPTY) ||\r\n // (this.selectedApplicant && this.selectedApplicant !== SHARED.EMPTY) ||\r\n // (this.selectedCategory && this.selectedCategory !== SHARED.EMPTY) ||\r\n // (this.selectedDocumentType && this.selectedDocumentType !== SHARED.EMPTY) ||\r\n // (this.description && this.description.trim() !== SHARED.EMPTY)\r\n // );\r\n \r\n // Only description matters for unsaved changes\r\n const hasChanges = Boolean(this.description && this.description.trim() !== SHARED.EMPTY);\r\n this.hasUnsavedChangesChange.emit(hasChanges);\r\n }\r\n\r\n handleError(_title: string, _error: any, resetLoading: () => void): void {\r\n resetLoading();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n\r\n\r\n","<div class=\"request-document-container\">\r\n <!-- Assignment Section (same structure as upload, without files) -->\r\n <!-- <div class=\"assignment-section\">\r\n <h4>Assign to Applicant(s) or Application <span class=\"text-red-500\">*</span> </h4>\r\n <div class=\"radio-group\">\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Applicant\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'req-applicant'\"\r\n ></p-radioButton>\r\n <label [for]=\"'req-applicant'\" class=\"radio-label\">Applicant(s)</label>\r\n </div>\r\n <div class=\"radio-item\">\r\n <p-radioButton \r\n name=\"assignmentType\" \r\n value=\"Application\" \r\n [(ngModel)]=\"selectedAssignmentType\"\r\n (onClick)=\"onAssignmentTypeChange()\"\r\n [inputId]=\"'req-application'\"\r\n ></p-radioButton>\r\n <label [for]=\"'req-application'\" class=\"radio-label\">Application</label>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Applicant Selection (only when Applicant is selected) -->\r\n <!-- <div class=\"applicant-section\" *ngIf=\"selectedAssignmentType === 'Applicant'\">\r\n <h4>Select Applicant(s) <span class=\"text-red-500\">*</span></h4>\r\n <div class=\"grid\">\r\n <div \r\n *ngFor=\"let applicant of filteredApplicantList\" \r\n class=\"applicant-item col-12 md:col-6\"\r\n >\r\n <p-radioButton \r\n name=\"reqSelectedApplicant\"\r\n [value]=\"applicant._id\"\r\n [(ngModel)]=\"selectedApplicant\"\r\n [inputId]=\"'req-applicant-' + applicant._id\"\r\n (onClick)=\"onApplicantSelectionChange()\"\r\n ></p-radioButton>\r\n <label [for]=\"'req-applicant-' + applicant._id\" class=\"applicant-label\">\r\n {{ applicant.name }}\r\n </label>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Category Selection -->\r\n <!-- <div class=\"category-section\">\r\n <h4>Category <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"categoryOptions\"\r\n [(ngModel)]=\"selectedCategory\"\r\n placeholder=\"Select Category type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onCategoryChange()\"\r\n [disabled]=\"!categoryOptions.length\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div> -->\r\n\r\n <!-- Document Type Selection -->\r\n <!-- <div class=\"document-type-section\">\r\n <h4>Document Type <span class=\"text-red-500\">*</span></h4>\r\n <p-dropdown\r\n [options]=\"documentTypeOptions\"\r\n [(ngModel)]=\"selectedDocumentType\"\r\n placeholder=\"Select Document type\"\r\n optionLabel=\"label\"\r\n optionValue=\"_id\"\r\n (onChange)=\"onDocumentTypeChange()\"\r\n [disabled]=\"!documentTypeOptions.length || !selectedCategory\"\r\n class=\"w-full\"\r\n ></p-dropdown>\r\n </div> -->\r\n\r\n <!-- Description Field -->\r\n <div class=\"description-section\">\r\n <h6>Description <span class=\"text-red-500\">*</span></h6>\r\n <textarea pInputTextarea [(ngModel)]=\"description\" (ngModelChange)=\"onDescriptionChange()\" rows=\"4\" placeholder=\"Add description\" class=\"w-full\"></textarea>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface StatusData {\r\n status: string;\r\n count: number;\r\n color?: string;\r\n icon?: string;\r\n _id?: string;\r\n}\r\n\r\nexport interface CalculatedStatusData extends StatusData {\r\n percentage: number;\r\n isSelected: boolean;\r\n statusClass: string;\r\n iconClass: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StatusCalculatorService {\r\n\r\n calculateTotalCount(statusData: StatusData[]): number {\r\n return statusData?.reduce((total, status) => total + (status.count ?? 0), 0) || 0;\r\n }\r\n\r\n calculateStatusDataWithPercentages(\r\n statusData: StatusData[], \r\n selectedStatus: string | null\r\n ): CalculatedStatusData[] {\r\n if (!statusData) return [];\r\n \r\n const totalCount = this.calculateTotalCount(statusData);\r\n \r\n return statusData.map((status) => {\r\n // Normalize icon for reviewing status to use eye icon consistently\r\n let normalizedIcon = status.icon;\r\n if (status.status?.toLowerCase() === SHARED.REVIEWING_STATUS) {\r\n normalizedIcon = SHARED.ICON_EYE;\r\n }\r\n \r\n return {\r\n ...status,\r\n icon: normalizedIcon,\r\n percentage: totalCount > 0 ? (status.count ?? 0) / totalCount * 100 : 0,\r\n isSelected: selectedStatus === status.status,\r\n statusClass: status.status ? SHARED.STATUS_WITH_DASH + status.status.toLowerCase() : SHARED.EMPTY,\r\n iconClass: SHARED.ICON_WITH_DASH + (status?.status?.toLowerCase() || SHARED.EMPTY)\r\n };\r\n });\r\n }\r\n} ","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { StatusDataModel } from '../../models/status-data.model';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { StatusCalculatorService, CalculatedStatusData } from '../../services/status-calculator.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\n\r\n@Component({\r\n selector: 'lib-document-status',\r\n standalone: false,\r\n templateUrl: './document-status.component.html',\r\n styleUrl: './document-status.component.scss'\r\n})\r\nexport class DocumentStatusComponent implements OnInit, OnDestroy, OnChanges {\r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Input() statusData: any;\r\n \r\n selectedStatus: string | null = null;\r\n statusDataWithPercentages: CalculatedStatusData[] = [];\r\n\r\n \r\n private subscription = new Subscription();\r\n\r\n constructor(\r\n private documentQuery: DocumentQuery,\r\n private documentService: DocumentHelperService,\r\n private statusCalculatorService: StatusCalculatorService\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['contextId'] && !changes['contextId'].firstChange) {\r\n // When contextId changes, refetch status data for the new context\r\n this.refetchStatusData();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscription.add(\r\n this.documentQuery.selectSelectedStatus().subscribe(status => {\r\n this.selectedStatus= status;\r\n this.updateCalculatedStatusData();\r\n })\r\n );\r\n\r\n this.subscription.add(\r\n this.documentQuery.selectStatusData().subscribe(statusData => {\r\n if (statusData && statusData.length > 0) {\r\n this.statusData = statusData;\r\n this.updateCalculatedStatusData();\r\n }\r\n })\r\n );\r\n\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.refetchStatusData();\r\n }\r\n }\r\n\r\n private refetchStatusData(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n const currentState = this.documentQuery.getSelectionState();\r\n const statusContextId = currentState.userId || null;\r\n const categoryId = currentState.menuItem || null;\r\n \r\n // Use the document service to refresh status data for the new context\r\n this.documentService.refreshStatusData(this.contextId, statusContextId, categoryId);\r\n }\r\n }\r\n\r\n \r\n selectStatus(status: string): void {\r\n const newStatus = this.selectedStatus === status ? null : status;\r\n this.documentService.setSelectedStatus(newStatus);\r\n }\r\n\r\n private updateCalculatedStatusData(): void {\r\n this.statusDataWithPercentages = this.statusCalculatorService.calculateStatusDataWithPercentages(\r\n this.statusData,\r\n this.selectedStatus\r\n );\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n}\r\n","<div class=\"status-summary-container\">\r\n <div class=\"status-cards\">\r\n \r\n <div \r\n *ngFor=\"let status of statusDataWithPercentages\" \r\n class=\"status-card {{ status.statusClass }}\"\r\n [class.selected]=\"status.isSelected\"\r\n (click)=\"selectStatus(status.status || '')\"\r\n >\r\n <div class=\"status-icon {{ status.iconClass }}\">\r\n <i [class]=\"status.icon\"></i>\r\n </div>\r\n <div class=\"status-info\">\r\n <div class=\"status-count\">{{ status.count }}</div>\r\n <div class=\"status-name\">{{ status.status }}</div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"progress-bar-container\">\r\n <div class=\"progress-bar\">\r\n <div \r\n *ngFor=\"let status of statusDataWithPercentages\" \r\n class=\"progress-segment\"\r\n [style.width.%]=\"status.percentage\"\r\n [style.background-color]=\"status.color\"\r\n ></div>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { Subject, takeUntil, debounceTime, distinctUntilChanged } from 'rxjs';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { DocumentQuery } from '../../state/document.query';\r\n\r\n@Component({\r\n selector: 'document-search',\r\n templateUrl: './document-search.component.html',\r\n styleUrls: ['./document-search.component.scss'],\r\n standalone: false\r\n})\r\nexport class DocumentSearchComponent implements OnInit, OnDestroy {\r\n readonly SHARED = SHARED;\r\n \r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Output() onActionClick = new EventEmitter<void>();\r\n @Output() onRequestClick = new EventEmitter<void>();\r\n \r\n searchTerm: string = SHARED.EMPTY;\r\n showActionsMenu: boolean = false;\r\n private destroy$ = new Subject<void>();\r\n private searchSubject = new Subject<string>();\r\n private hasActiveFilters: boolean = false;\r\n\r\n constructor(\r\n private documentHelperService: DocumentHelperService,\r\n private documentQuery: DocumentQuery\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.setupSearchSubscription();\r\n this.setupFilterSubscription();\r\n this.setupClickOutsideListener();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.removeClickOutsideListener();\r\n }\r\n\r\n /**\r\n * Sets up the search input subscription with debouncing\r\n */\r\n private setupSearchSubscription(): void {\r\n const searchSubject = new Subject<string>();\r\n searchSubject.pipe(\r\n takeUntil(this.destroy$),\r\n debounceTime(500),\r\n distinctUntilChanged()\r\n ).subscribe(searchTerm => {\r\n this.onSearchChange(searchTerm);\r\n });\r\n\r\n this.searchSubject = searchSubject;\r\n }\r\n\r\n /**\r\n * Sets up subscription to monitor all filter states\r\n */\r\n private setupFilterSubscription(): void {\r\n this.documentQuery.selectSelectionState().pipe(\r\n takeUntil(this.destroy$)\r\n ).subscribe(selectionState => {\r\n this.hasActiveFilters = Boolean(\r\n selectionState.searchKey ||\r\n selectionState.userId ||\r\n selectionState.status ||\r\n selectionState.menuItem\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Handles search term changes from ngModel\r\n * @param searchTerm - The search term entered by the user\r\n */\r\n onSearchInputChange(searchTerm: string): void {\r\n this.searchSubject.next(searchTerm);\r\n }\r\n\r\n /**\r\n * Handles search term changes\r\n * @param searchTerm - The search term entered by the user\r\n */\r\n private onSearchChange(searchTerm: string): void {\r\n const normalizedSearchTerm = searchTerm?.trim() || null;\r\n this.documentHelperService.setSearchKey(normalizedSearchTerm);\r\n }\r\n\r\n /**\r\n * Clears the search input\r\n */\r\n onClearSearch(): void {\r\n this.searchTerm = SHARED.EMPTY;\r\n this.documentHelperService.setSearchKey(null);\r\n }\r\n\r\n /**\r\n * Clears all filters including search, menu item, user, and status selections\r\n */\r\n onClearAllFilters(): void {\r\n this.searchTerm = SHARED.EMPTY;\r\n this.documentHelperService.clearSelectionState();\r\n }\r\n\r\n /**\r\n * Determines if the Clear All button should be visible\r\n */\r\n get shouldShowClearAll(): boolean {\r\n return this.hasActiveFilters;\r\n }\r\n\r\n /**\r\n * Toggles the actions dropdown menu\r\n */\r\n toggleActionsMenu(): void {\r\n this.showActionsMenu = !this.showActionsMenu;\r\n }\r\n\r\n /**\r\n * Handles upload document action\r\n */\r\n handleUploadDocument(): void {\r\n this.showActionsMenu = false;\r\n this.onActionClick.emit();\r\n }\r\n\r\n /**\r\n * Handles request document action\r\n */\r\n handleRequestDocument(): void {\r\n this.showActionsMenu = false;\r\n this.onRequestClick.emit();\r\n }\r\n\r\n /**\r\n * Sets up click outside listener to close dropdown\r\n */\r\n private setupClickOutsideListener(): void {\r\n document.addEventListener('click', this.handleClickOutside);\r\n }\r\n\r\n /**\r\n * Removes click outside listener\r\n */\r\n private removeClickOutsideListener(): void {\r\n document.removeEventListener('click', this.handleClickOutside);\r\n }\r\n\r\n /**\r\n * Handles clicks outside the dropdown to close it\r\n */\r\n private handleClickOutside = (event: MouseEvent): void => {\r\n const target = event.target as HTMLElement;\r\n const actionsMenu = target.closest('.actions-menu');\r\n \r\n if (!actionsMenu && this.showActionsMenu) {\r\n this.showActionsMenu = false;\r\n }\r\n }\r\n} ","<div class=\"search-container\">\r\n <div class=\"search-header\">\r\n <h2 class=\"ml-3 document-heading\">Documents</h2> \r\n </div>\r\n <div class=\"search-input-wrapper\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchTerm\"\r\n (ngModelChange)=\"onSearchInputChange($event)\"\r\n class=\"search-input\"\r\n placeholder=\"Search by document name, category, type, status or applicant name...\"\r\n [attr.aria-label]=\"'Search documents'\"\r\n />\r\n <button \r\n *ngIf=\"searchTerm\"\r\n type=\"button\"\r\n class=\"clear-button\"\r\n (click)=\"onClearSearch()\"\r\n [attr.aria-label]=\"'Clear search'\"\r\n >\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n\r\n <button \r\n *ngIf=\"shouldShowClearAll\"\r\n type=\"button\"\r\n class=\"clear-all-filters-link\"\r\n (click)=\"onClearAllFilters()\"\r\n [attr.aria-label]=\"'Clear all'\"\r\n >\r\n Clear All\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n\r\n <div class=\"filters-section\">\r\n <div class=\"actions-menu\">\r\n <button \r\n type=\"button\"\r\n class=\"actions-btn\" \r\n (click)=\"toggleActionsMenu()\" \r\n [class.active]=\"showActionsMenu\"\r\n [attr.aria-label]=\"'Open actions menu'\"\r\n [attr.aria-expanded]=\"showActionsMenu\"\r\n >\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\">\r\n <!-- <div class=\"dropdown-item\" (click)=\"handleUploadDocument()\">\r\n <i class=\"pi pi-upload\"></i>\r\n <span>Upload Document</span>\r\n </div> -->\r\n <div class=\"dropdown-item\" (click)=\"handleRequestDocument()\">\r\n <i class=\"pi pi-file\"></i>\r\n <span>Request Document</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div> ","import { Component, Input, Injectable } from '@angular/core';\r\nimport { ConfirmationService, Confirmation } from 'primeng/api';\r\n\r\nexport interface ConfirmationOptions {\r\n message: string;\r\n header?: string;\r\n icon?: string;\r\n acceptLabel?: string;\r\n rejectLabel?: string;\r\n acceptIcon?: string;\r\n rejectIcon?: string;\r\n acceptButtonClass?: string;\r\n rejectButtonClass?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n@Component({\r\n selector: 'app-confirmation-dialog',\r\n templateUrl: './confirmation-dialog.component.html',\r\n standalone: false,\r\n styleUrls: ['./confirmation-dialog.component.scss']\r\n})\r\nexport class ConfirmationDialogComponent {\r\n @Input() confirmationOptions: ConfirmationOptions = {\r\n message: 'Are you sure that you want to proceed?',\r\n header: '',\r\n icon: '',\r\n acceptLabel: 'Yes',\r\n rejectLabel: 'No',\r\n acceptIcon: 'pi pi-check',\r\n rejectIcon: 'pi pi-times',\r\n acceptButtonClass: 'btn-danger',\r\n rejectButtonClass: 'btn-secondary'\r\n };\r\n\r\n constructor(private confirmationService: ConfirmationService) {}\r\n\r\n /**\r\n * Shows the confirmation dialog with the specified options\r\n * @param options - Configuration options for the confirmation dialog\r\n * @param acceptCallback - Function to execute when user accepts\r\n * @param rejectCallback - Function to execute when user rejects\r\n */\r\n confirm(\r\n options: Partial<ConfirmationOptions>,\r\n acceptCallback: () => void,\r\n rejectCallback?: () => void\r\n ): void {\r\n const confirmation: Confirmation = {\r\n message: options.message || this.confirmationOptions.message,\r\n header: options.header || this.confirmationOptions.header,\r\n icon: options.icon || this.confirmationOptions.icon,\r\n acceptLabel: options.acceptLabel || this.confirmationOptions.acceptLabel,\r\n rejectLabel: options.rejectLabel || this.confirmationOptions.rejectLabel,\r\n acceptIcon: options.acceptIcon || this.confirmationOptions.acceptIcon,\r\n rejectIcon: options.rejectIcon || this.confirmationOptions.rejectIcon,\r\n accept: acceptCallback,\r\n reject: rejectCallback\r\n };\r\n\r\n this.confirmationService.confirm(confirmation);\r\n }\r\n\r\n\r\n /**\r\n * Static method to show a confirmation dialog (for components that don't want to inject this component)\r\n * @param confirmationService - The ConfirmationService instance\r\n * @param options - Configuration options for the confirmation dialog\r\n * @param acceptCallback - Function to execute when user accepts\r\n * @param rejectCallback - Function to execute when user rejects\r\n */\r\n static confirm(\r\n confirmationService: ConfirmationService,\r\n options: Partial<ConfirmationOptions>,\r\n acceptCallback: () => void,\r\n rejectCallback?: () => void\r\n ): void {\r\n const defaultOptions: ConfirmationOptions = {\r\n message: 'Are you sure that you want to proceed?',\r\n header: '',\r\n icon: '',\r\n acceptLabel: 'Yes',\r\n rejectLabel: 'No',\r\n acceptIcon: 'pi pi-check',\r\n rejectIcon: 'pi pi-times',\r\n acceptButtonClass: 'btn-success',\r\n rejectButtonClass: 'btn-secondary'\r\n };\r\n\r\n const confirmation: Confirmation = {\r\n message: options.message || defaultOptions.message,\r\n header: options.header || defaultOptions.header,\r\n icon: options.icon || defaultOptions.icon,\r\n acceptLabel: options.acceptLabel || defaultOptions.acceptLabel,\r\n rejectLabel: options.rejectLabel || defaultOptions.rejectLabel,\r\n acceptIcon: options.acceptIcon || defaultOptions.acceptIcon,\r\n rejectIcon: options.rejectIcon || defaultOptions.rejectIcon,\r\n accept: acceptCallback,\r\n reject: rejectCallback\r\n };\r\n\r\n confirmationService.confirm(confirmation);\r\n }\r\n\r\n /**\r\n * Static method to show a delete confirmation dialog\r\n * @param confirmationService - The ConfirmationService instance\r\n * @param itemName - Name of the item to be deleted\r\n * @param acceptCallback - Function to execute when user accepts deletion\r\n * @param rejectCallback - Function to execute when user rejects deletion\r\n */\r\n static confirmDelete(\r\n confirmationService: ConfirmationService,\r\n itemName: string,\r\n acceptCallback: () => void,\r\n rejectCallback?: () => void\r\n ): void {\r\n ConfirmationDialogComponent.confirm(\r\n confirmationService,\r\n {\r\n message: `Are you sure you want to delete \"${itemName}\"?`,\r\n header: 'Delete Confirmation',\r\n acceptLabel: 'Delete',\r\n rejectLabel: 'Cancel',\r\n acceptButtonClass: 'btn-danger'\r\n },\r\n acceptCallback,\r\n rejectCallback\r\n );\r\n }\r\n}\r\n","<!-- This component no longer renders a p-confirmDialog element -->\r\n<!-- The p-confirmDialog should be placed only once in the main app component -->\r\n<!-- This component now only provides methods to trigger confirmations via ConfirmationService -->\r\n","import { Component, Input, Output, EventEmitter, OnDestroy, HostListener } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { Subject } from 'rxjs';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { ConfirmationDialogComponent } from '../../../../Shared/components/confirmation-dialog/confirmation-dialog.component';\r\n\r\n// Interface for confirmation options\r\ninterface ConfirmationOptions {\r\n message: string;\r\n header?: string;\r\n icon?: string;\r\n acceptLabel?: string;\r\n rejectLabel?: string;\r\n acceptIcon?: string;\r\n rejectIcon?: string;\r\n acceptButtonClass?: string;\r\n rejectButtonClass?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-sidebar',\r\n templateUrl: './sidebar.component.html',\r\n styleUrls: ['./sidebar.component.scss'],\r\n standalone: false\r\n})\r\nexport class SidebarComponent implements OnDestroy {\r\n // Flag to prevent multiple confirmations\r\n private isShowingConfirmation: boolean = false;\r\n\r\n @Input() set visible(value: boolean) {\r\n this._visible = value;\r\n }\r\n \r\n get visible(): boolean {\r\n return this._visible;\r\n }\r\n \r\n private _visible: boolean = false;\r\n\r\n @Input() position: 'left' | 'right' = 'right';\r\n @Input() width: string = SHARED.WIDTH;\r\n @Input() title: string = SHARED.EMPTY;\r\n @Input() showCloseButton: boolean = true;\r\n @Input() modal: boolean = true;\r\n @Input() dismissible: boolean = true;\r\n @Input() styleClass: string = SHARED.EMPTY;\r\n @Input() appendTo: string = 'body';\r\n @Input() blockScroll: boolean = true;\r\n @Input() closeIcon: string = SHARED.CLOSE_ICON;\r\n @Input() showSaveButton: boolean = false;\r\n @Input() saveButtonText: string = SHARED.SAVE;\r\n @Input() saveButtonDisabled: boolean = false;\r\n @Input() successMessage: string = SHARED.SUCCESS_MESSAGE;\r\n @Input() errorMessage: string = SHARED.EMPTY;\r\n @Input() hasUnsavedChanges: boolean = false;\r\n\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n @Output() onShow = new EventEmitter<void>();\r\n @Output() onHide = new EventEmitter<void>();\r\n @Output() onSave = new EventEmitter<void>();\r\n @Output() onClose = new EventEmitter<void>();\r\n \r\n showSuccessMessage: boolean = false;\r\n showErrorMessage: boolean = false;\r\n private destroy$ = new Subject<void>();\r\n\r\n unsavedChangesConfirmationOptions: ConfirmationOptions = {\r\n message: SHARED.UNSAVED_CHANGES_MESSAGE,\r\n acceptLabel: SHARED.YES,\r\n rejectLabel: SHARED.NO,\r\n acceptIcon: SHARED.ACCEPT_ICON,\r\n rejectIcon: SHARED.REJECT_ICON,\r\n acceptButtonClass: SHARED.ACCEPT_BUTTON_STYLE_CLASS,\r\n rejectButtonClass: SHARED.REJECT_BUTTON_STYLE_CLASS\r\n };\r\n\r\n constructor(private confirmationService: ConfirmationService) {}\r\n\r\n /**\r\n * Handles the onHide event from PrimeNG sidebar\r\n * Only emits when actually closing, not when showing confirmation\r\n */\r\n onSidebarHide(): void {\r\n if (!this.isShowingConfirmation) {\r\n this.onHide.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the visibleChange event from PrimeNG sidebar\r\n * Intercepts automatic closing to show confirmation if needed\r\n */\r\n onVisibleChange(value: boolean): void {\r\n if (!value && this.hasUnsavedChanges && !this.isShowingConfirmation) {\r\n this._visible = true;\r\n this.showUnsavedChangesConfirmation();\r\n return;\r\n }\r\n \r\n this.visibleChange.emit(value);\r\n }\r\n\r\n /**\r\n * Opens the sidebar\r\n */\r\n open(): void {\r\n this._visible = true;\r\n this.clearMessages();\r\n this.visibleChange.emit(this._visible);\r\n this.onShow.emit();\r\n }\r\n\r\n /**\r\n * Closes the sidebar\r\n */\r\n close(): void {\r\n this._visible = false;\r\n this.clearMessages();\r\n this.visibleChange.emit(this._visible);\r\n this.onHide.emit();\r\n }\r\n\r\n /**\r\n * Handles escape key press\r\n * Shows confirmation if there are unsaved changes\r\n */\r\n @HostListener('document:keydown.escape', ['$event'])\r\n handleEscapeKey(event: KeyboardEvent): void {\r\n if (this.visible) {\r\n event.preventDefault();\r\n this.handleClose();\r\n }\r\n }\r\n\r\n /**\r\n * Handles backdrop click events\r\n * Prevents default PrimeNG behavior and shows confirmation if needed\r\n */\r\n handleBackdropClick(event: Event): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.handleClose();\r\n }\r\n\r\n /**\r\n * Handles all closing scenarios (backdrop click, escape key, close button, etc.)\r\n * This is the single entry point for all closing logic\r\n */\r\n handleClose(): void {\r\n if (this.hasUnsavedChanges && !this.isShowingConfirmation) {\r\n this.showUnsavedChangesConfirmation();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Shows confirmation dialog for unsaved changes\r\n */\r\n private showUnsavedChangesConfirmation(): void {\r\n if (this.isShowingConfirmation) {\r\n return;\r\n }\r\n this.isShowingConfirmation = true;\r\n ConfirmationDialogComponent.confirm(\r\n this.confirmationService,\r\n this.unsavedChangesConfirmationOptions,\r\n () => {\r\n this.isShowingConfirmation = false;\r\n this.close();\r\n this.onClose.emit();\r\n },\r\n () => {\r\n this.isShowingConfirmation = false;\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Shows success message and closes sidebar after delay\r\n */\r\n showSuccess(): void {\r\n this.showSuccessMessage = true;\r\n this.showErrorMessage = false;\r\n setTimeout(() => {\r\n this.close();\r\n }, 2000);\r\n }\r\n\r\n /**\r\n * Shows error message\r\n */\r\n showError(message?: string): void {\r\n this.showErrorMessage = true;\r\n this.showSuccessMessage = false;\r\n this.errorMessage = message || SHARED.EMPTY;\r\n }\r\n\r\n /**\r\n * Clears all messages\r\n */\r\n clearMessages(): void {\r\n this.showSuccessMessage = false;\r\n this.showErrorMessage = false;\r\n }\r\n\r\n /**\r\n * Checks if there are unsaved changes\r\n * @returns True if there are unsaved changes, false otherwise\r\n */\r\n checkForUnsavedChanges(): boolean {\r\n return this.hasUnsavedChanges;\r\n }\r\n\r\n /**\r\n * Lifecycle hook that is called when component is destroyed.\r\n * Cleans up subscriptions.\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","<!-- PrimeNG Sidebar with proper backdrop handling -->\r\n<div *ngIf=\"visible\" class=\"backdrop-shadow\" (click)=\"handleClose()\"></div>\r\n\r\n<p-sidebar \r\n [(visible)]=\"visible\"\r\n [position]=\"position\"\r\n [style]=\"{width: width}\"\r\n [dismissible]=\"true\"\r\n [showCloseIcon]=\"false\"\r\n [appendTo]=\"'body'\"\r\n [blockScroll]=\"blockScroll\"\r\n (visibleChange)=\"onVisibleChange($event)\"\r\n (onShow)=\"onShow.emit()\"\r\n (onHide)=\"onSidebarHide()\"\r\n>\r\n <ng-template pTemplate=\"header\" *ngIf=\"title || showCloseButton || showSaveButton\">\r\n <div class=\"sidebar-header\">\r\n <h3 *ngIf=\"title\" class=\"sidebar-title\">{{ title }}</h3>\r\n <div class=\"header-content\">\r\n <ng-content select=\"[header]\"></ng-content>\r\n \r\n <p-messages \r\n *ngIf=\"showSuccessMessage\"\r\n severity=\"success\"\r\n [closable]=\"false\"\r\n [style]=\"{'margin-bottom': '0.5rem'}\"\r\n class=\"ml-3\"\r\n >\r\n <ng-template pTemplate=\"message\">\r\n <span>{{ successMessage }}</span>\r\n </ng-template>\r\n </p-messages>\r\n \r\n <p-messages \r\n *ngIf=\"showErrorMessage\"\r\n severity=\"error\"\r\n [closable]=\"false\"\r\n [style]=\"{'margin-bottom': '0.5rem'}\"\r\n class=\"ml-3\"\r\n >\r\n <ng-template pTemplate=\"message\">\r\n <span>{{ errorMessage }}</span>\r\n </ng-template>\r\n </p-messages>\r\n\r\n <div class=\"header-actions mr-3\">\r\n <button \r\n *ngIf=\"showSaveButton\"\r\n pButton \r\n type=\"button\" \r\n [label]=\"saveButtonText\"\r\n [disabled]=\"saveButtonDisabled\"\r\n class=\"p-button-primary\"\r\n (click)=\"onSave.emit()\"\r\n ></button>\r\n\r\n <button \r\n *ngIf=\"showCloseButton\"\r\n pButton \r\n type=\"button\" \r\n icon=\"pi pi-times\"\r\n class=\"p-button-text p-button-rounded\"\r\n (click)=\"handleClose()\"\r\n ></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"content\">\r\n <div class=\"sidebar-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n </ng-template>\r\n</p-sidebar>\r\n","import { Component, Input, OnInit, OnDestroy, ViewChild } from '@angular/core';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport {SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { FolderBlockModel } from '../../models/folder.model';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { StatusDataModel } from '../../models/status-data.model';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentUploadComponent } from '../document-upload/document-upload.component';\r\nimport { RequestDocumentComponent } from '../request-document/request-document.component';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { SidebarComponent } from '../sidebar/sidebar.component';\r\n\r\n/**\r\n * The `FolderContainerComponent` is responsible for rendering a container \r\n * that displays a list of documents and associated folder panel data.\r\n * This component utilizes the `FOLDERPANEL` constant for folder panel data\r\n * and accepts a document list input of type `DocumentModel`.\r\n */\r\n@Component({\r\n selector: 'lib-folder-container',\r\n standalone: false,\r\n templateUrl: './folder-container.component.html',\r\n styleUrl: './folder-container.component.scss',\r\n animations: [\r\n trigger('slideInOut', [\r\n state('visible', style({\r\n height: '*',\r\n opacity: 1,\r\n transform: 'translateY(0)',\r\n overflow: 'hidden',\r\n marginBottom: '1rem',\r\n visibility: 'visible'\r\n })),\r\n state('hidden', style({\r\n height: '0px',\r\n opacity: 0,\r\n transform: 'translateY(-20px)',\r\n overflow: 'hidden',\r\n marginBottom: '0px',\r\n visibility: 'hidden'\r\n })),\r\n transition('visible => hidden', [\r\n animate('250ms cubic-bezier(0.4, 0.0, 0.2, 1)')\r\n ]),\r\n transition('hidden => visible', [\r\n animate('300ms cubic-bezier(0.0, 0.0, 0.2, 1)')\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class FolderContainerComponent implements OnInit {\r\n /**\r\n * A list of documents passed as input to the component.\r\n * Represents the document data to be displayed in the folder container.\r\n */\r\n @Input() documentList?: DocumentModel[];\r\n /**\r\n * A list of documents passed as input to the component.\r\n * Represents the document data to be displayed in the folder container.\r\n */\r\n @Input() folderList: FolderBlockModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The context ID for the folder container.\r\n * @type {string}\r\n */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n\r\n /**\r\n * The list of users passed as input to the component.\r\n * @type {UserListModel[]}\r\n */\r\n @Input() userList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The status data passed as input to the component.\r\n * @type {StatusDataModel[]}\r\n */\r\n @Input() statusData: StatusDataModel[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The document categories passed as input to the component.\r\n * @type {DocumentCategory[]}\r\n */\r\n @Input() categories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Flag to control user list visibility\r\n */\r\n showUserList: boolean = true;\r\n \r\n /**\r\n * Animation state for user list visibility\r\n */\r\n userListAnimationState: string = SHARED.VISIBLE;\r\n\r\n /**\r\n * Controls the visibility of the document upload sidebar\r\n */\r\n isDocumentUploadSidebarOpen: boolean = false;\r\n /**\r\n * Controls the visibility of the request document sidebar\r\n */\r\n isRequestDocumentSidebarOpen: boolean = false;\r\n\r\n /**\r\n * Reference to the document upload component\r\n */\r\n @ViewChild(DocumentUploadComponent) documentUploadComponent!: DocumentUploadComponent;\r\n \r\n /**\r\n * References to the sidebars\r\n */\r\n @ViewChild('uploadSidebar') uploadSidebarComponent!: SidebarComponent;\r\n @ViewChild('requestSidebar') requestSidebarComponent!: SidebarComponent;\r\n @ViewChild(RequestDocumentComponent) requestDocumentComponent!: RequestDocumentComponent;\r\n \r\n /**\r\n * Tracks whether the save button should be disabled\r\n */\r\n isSaveButtonDisabled: boolean = false;\r\n /** Tracks save button disabled for request document */\r\n isRequestSaveButtonDisabled: boolean = true;\r\n \r\n /**\r\n * Tracks whether there are unsaved changes in the document upload form\r\n */\r\n hasUnsavedChanges: boolean = false;\r\n /**\r\n * Tracks whether there are unsaved changes in the request document form\r\n */\r\n requestHasUnsavedChanges: boolean = false;\r\n \r\n constructor(private documentQuery: DocumentQuery, private documentHelperService: DocumentHelperService) {}\r\n\r\n ngOnInit(): void {\r\n this.documentQuery.selectShowUserList().subscribe(show => {\r\n this.showUserList = show;\r\n this.userListAnimationState = show ? SHARED.VISIBLE : SHARED.HIDDEN;\r\n });\r\n }\r\n\r\n /**\r\n * Called when the view is initialized to set up the save button state\r\n */\r\n ngAfterViewInit(): void {\r\n this.updateSaveButtonState();\r\n }\r\n\r\n /**\r\n * Updates the save button disabled state based on the document upload component\r\n */\r\n updateSaveButtonState(): void {\r\n if (this.documentUploadComponent) {\r\n this.isSaveButtonDisabled = this.documentUploadComponent.getSaveButtonDisabled();\r\n }\r\n }\r\n\r\n /**\r\n * Handles form validation changes from the document upload component\r\n */\r\n onFormValidationChange(): void {\r\n this.updateSaveButtonState();\r\n // Check if there are actual unsaved changes\r\n this.checkForUnsavedChanges();\r\n }\r\n\r\n /** Updates request save button disabled state */\r\n onRequestFormValidationChange(): void {\r\n if (this.requestDocumentComponent) {\r\n this.isRequestSaveButtonDisabled = this.requestDocumentComponent.getSaveButtonDisabled();\r\n }\r\n }\r\n\r\n /**\r\n * Checks if there are unsaved changes in the document upload form\r\n */\r\n private checkForUnsavedChanges(): void {\r\n if (this.documentUploadComponent) {\r\n // Check if files are uploaded or form has changes\r\n const hasFiles = Boolean(this.documentUploadComponent.uploadedFiles && this.documentUploadComponent.uploadedFiles.length > 0);\r\n const hasFormChanges = Boolean(\r\n (this.documentUploadComponent.selectedAssignmentType && this.documentUploadComponent.selectedAssignmentType !== SHARED.EMPTY) || \r\n (this.documentUploadComponent.selectedApplicants && this.documentUploadComponent.selectedApplicants.length > 0) || \r\n (this.documentUploadComponent.selectedCategory && this.documentUploadComponent.selectedCategory !== SHARED.EMPTY) || \r\n (this.documentUploadComponent.selectedDocumentType && this.documentUploadComponent.selectedDocumentType !== SHARED.EMPTY)\r\n );\r\n \r\n this.hasUnsavedChanges = hasFiles || hasFormChanges;\r\n }\r\n }\r\n\r\n /**\r\n * Opens the document upload sidebar\r\n */\r\n openDocumentUploadSidebar(): void {\r\n this.isDocumentUploadSidebarOpen = true;\r\n this.hasUnsavedChanges = false; // Reset when opening\r\n }\r\n\r\n /**\r\n * Opens the request document sidebar\r\n */\r\n openRequestDocumentSidebar(): void {\r\n this.isRequestDocumentSidebarOpen = true;\r\n }\r\n\r\n /**\r\n * Handles the document upload sidebar hide event\r\n */\r\n onDocumentUploadSidebarHide(): void {\r\n this.isDocumentUploadSidebarOpen = false;\r\n this.hasUnsavedChanges = false;\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the document upload sidebar close event (when close button is clicked or sidebar is dismissed)\r\n */\r\n onDocumentUploadSidebarClose(): void {\r\n this.isDocumentUploadSidebarOpen = false;\r\n this.hasUnsavedChanges = false;\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the document upload sidebar close with unsaved changes event\r\n */\r\n onDocumentUploadSidebarCloseWithUnsavedChanges(): void {\r\n this.isDocumentUploadSidebarOpen = false;\r\n this.hasUnsavedChanges = false;\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the request document sidebar hide event\r\n */\r\n onRequestDocumentSidebarHide(): void {\r\n this.isRequestDocumentSidebarOpen = false;\r\n this.requestHasUnsavedChanges = false;\r\n if (this.requestDocumentComponent) {\r\n this.requestDocumentComponent.resetForm();\r\n }\r\n this.isRequestSaveButtonDisabled = true;\r\n }\r\n\r\n /**\r\n * Handles the request document sidebar close with unsaved changes event\r\n */\r\n onRequestDocumentSidebarCloseWithUnsavedChanges(): void {\r\n this.isRequestDocumentSidebarOpen = false;\r\n this.requestHasUnsavedChanges = false;\r\n if (this.requestDocumentComponent) {\r\n this.requestDocumentComponent.resetForm();\r\n }\r\n this.isRequestSaveButtonDisabled = true;\r\n }\r\n\r\n /** Invoked from sidebar Save button for request document */\r\n onRequestDocumentSave(): void {\r\n if (this.requestDocumentComponent) {\r\n this.requestDocumentComponent.saveRequestDocument();\r\n this.onRequestFormValidationChange();\r\n }\r\n }\r\n\r\n /** Request success handler */\r\n onRequestDocumentSuccess(): void {\r\n this.documentHelperService.refreshAllDataWithCurrentFilters(this.contextId);\r\n if (this.requestSidebarComponent) {\r\n this.requestSidebarComponent.showSuccess();\r\n }\r\n }\r\n\r\n /** Request error handler */\r\n onRequestDocumentError(error: any): void {\r\n if (this.requestSidebarComponent) {\r\n const errorMessage = error?.message || SHARED.UPLOAD_FAILED;\r\n this.requestSidebarComponent.showError(errorMessage);\r\n }\r\n }\r\n\r\n /** Handle unsaved changes state from request form */\r\n onRequestUnsavedChange(hasChanges: boolean): void {\r\n this.requestHasUnsavedChanges = hasChanges;\r\n }\r\n\r\n /**\r\n * Handles the document upload save event\r\n */\r\n onDocumentUploadSave(): void {\r\n if (this.documentUploadComponent) {\r\n this.documentUploadComponent.saveDocumentUpload();\r\n this.updateSaveButtonState();\r\n }\r\n }\r\n\r\n /**\r\n * Handles successful document upload and refreshes data\r\n */\r\n onDocumentUploadSuccess(): void {\r\n this.documentHelperService.refreshAllDataWithCurrentFilters(this.contextId);\r\n this.hasUnsavedChanges = false; // Reset after successful upload\r\n if (this.uploadSidebarComponent) {\r\n this.uploadSidebarComponent.showSuccess();\r\n }\r\n }\r\n\r\n /**\r\n * Handles document upload error\r\n */\r\n onDocumentUploadError(error: any): void {\r\n if (this.uploadSidebarComponent) {\r\n const errorMessage = error?.message || SHARED.UPLOAD_FAILED;\r\n this.uploadSidebarComponent.showError(errorMessage);\r\n }\r\n }\r\n\r\n \r\n}\r\n","\r\n<document-search [contextId]=\"contextId\" (onActionClick)=\"openDocumentUploadSidebar()\" (onRequestClick)=\"openRequestDocumentSidebar()\"></document-search>\r\n<div class=\"user-list-wrapper\" [@slideInOut]=\"userListAnimationState\">\r\n <!-- <lib-user-list [userList]=\"userList\" [categories]=\"categories\"></lib-user-list> -->\r\n</div>\r\n<lib-document-status [contextId]=\"contextId\" [statusData]=\"statusData\"></lib-document-status>\r\n\r\n<!-- Document Upload Sidebar -->\r\n<lib-sidebar\r\n #uploadSidebar\r\n [(visible)]=\"isDocumentUploadSidebarOpen\"\r\n position=\"right\"\r\n width=\"600px\"\r\n title=\"Upload Documents\"\r\n [showCloseButton]=\"true\"\r\n [showSaveButton]=\"true\"\r\n [saveButtonText]=\"'Save'\"\r\n [saveButtonDisabled]=\"isSaveButtonDisabled\"\r\n [successMessage]=\"'Document Saved Successfully'\"\r\n [hasUnsavedChanges]=\"hasUnsavedChanges\"\r\n (onHide)=\"onDocumentUploadSidebarHide()\"\r\n (onSave)=\"onDocumentUploadSave()\"\r\n (onClose)=\"onDocumentUploadSidebarCloseWithUnsavedChanges()\"\r\n>\r\n <lib-document-upload \r\n [contextId]=\"contextId\" \r\n (onFormValidationChange)=\"onFormValidationChange()\" \r\n (onUploadSuccess)=\"onDocumentUploadSuccess()\"\r\n (onUploadError)=\"onDocumentUploadError($event)\"\r\n ></lib-document-upload>\r\n</lib-sidebar>\r\n\r\n<lib-sidebar\r\n #requestSidebar\r\n [(visible)]=\"isRequestDocumentSidebarOpen\"\r\n position=\"right\"\r\n width=\"600px\"\r\n title=\"Request Document\"\r\n [showCloseButton]=\"true\"\r\n [showSaveButton]=\"true\"\r\n [saveButtonText]=\"'Save'\"\r\n [successMessage]=\"'Document Requested'\"\r\n [saveButtonDisabled]=\"isRequestSaveButtonDisabled\"\r\n [hasUnsavedChanges]=\"requestHasUnsavedChanges\"\r\n (onHide)=\"onRequestDocumentSidebarHide()\"\r\n (onSave)=\"onRequestDocumentSave()\"\r\n (onClose)=\"onRequestDocumentSidebarCloseWithUnsavedChanges()\"\r\n>\r\n <lib-request-document\r\n [contextId]=\"contextId\"\r\n (onFormValidationChange)=\"onRequestFormValidationChange()\"\r\n (onRequestSuccess)=\"onRequestDocumentSuccess()\"\r\n (onRequestError)=\"onRequestDocumentError($event)\"\r\n (hasUnsavedChangesChange)=\"onRequestUnsavedChange($event)\"\r\n ></lib-request-document>\r\n</lib-sidebar>","import { Injectable } from '@angular/core';\r\nimport { DocumentListResponse, DocumentListItem } from '../models/document-list-response.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { TableData } from '../../../Shared/components/table-primary/table-primary.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentTableBuilderService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Builds a single table from document list items\r\n * @param documents Array of document list items\r\n * @returns TableData object\r\n */\r\n buildDocumentTable(documents: DocumentListItem[]): TableData {\r\n const columns = SHARED.DOCUMENT_TABLE_COLUMNS.filter(col => col.type !== SHARED.ACTIONS);\r\n \r\n return {\r\n columns: columns,\r\n data: documents\r\n };\r\n }\r\n\r\n /**\r\n * Gets completion count for a category\r\n * @param category Document category\r\n * @returns Completion string (e.g., \"2/4\")\r\n */\r\n getCompletionCount(category: DocumentListResponse): string {\r\n const total = category.list.length;\r\n const completed = category.list.filter(doc => \r\n doc.status.toLowerCase() === SHARED.APPROVED || \r\n doc.status.toLowerCase() === SHARED.UPLOADED\r\n ).length;\r\n return `${completed}/${total}`;\r\n }\r\n\r\n /**\r\n * Gets pending document count for a category\r\n * @param category Document category\r\n * @returns Number of pending documents\r\n */\r\n getPendingDocumentCount(category: DocumentListResponse): number {\r\n return category.totalDocs - category.acceptedDocs;\r\n }\r\n\r\n /**\r\n * Gets approved document count for a category\r\n * @param category Document category\r\n * @returns Number of approved documents\r\n */\r\n getApprovedDocumentCount(category: DocumentListResponse): number {\r\n return category.acceptedDocs;\r\n }\r\n\r\n /**\r\n * Transforms document model to document list item\r\n * @param documents Array of DocumentModel\r\n * @returns Array of DocumentListItem\r\n */\r\n transformDocumentModelToListItem(documents: any[]): DocumentListItem[] {\r\n return documents.map(doc => {\r\n const documentUrl: string = doc.documentUrl || doc.url || SHARED.EMPTY;\r\n const hasUrl = Boolean(documentUrl && String(documentUrl).trim().length > 0);\r\n // Backend sometimes returns placeholder rows (e.g. \"Document Request\") marked as Uploaded\r\n // even though no file URL exists. Normalize such rows to Pending so the table is accurate.\r\n const normalizedStatus = !hasUrl ? SHARED.PENDING : (doc.status || SHARED.PENDING);\r\n return {\r\n _id: doc._id || SHARED.EMPTY,\r\n fileName: doc.fileName || SHARED.EMPTY,\r\n docName: doc.docName || doc.documentName || SHARED.EMPTY,\r\n fileSize: doc.fileSize || SHARED.EMPTY,\r\n documentUrl: documentUrl,\r\n status: normalizedStatus,\r\n uploadedOn: doc.uploadedOn || doc.uploadDate || SHARED.EMPTY,\r\n ownerName: doc.ownerName || doc.applicantName || SHARED.EMPTY,\r\n contentType: doc.contentType || SHARED.EMPTY,\r\n isUploaded: hasUrl ? (doc.isUploaded || false) : false,\r\n documentType: doc.documentType || SHARED.EMPTY,\r\n aliasName: doc.aliasName || SHARED.EMPTY,\r\n notes: doc.notes || SHARED.EMPTY\r\n };\r\n });\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { Observable, of, throwError } from 'rxjs';\r\nimport { DocumentUploadService } from './document-upload.service';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { DocumentQuery } from '../state/document.query';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentTableBuilderService } from './document-table-builder.service';\r\nimport { DocumentHelperService } from './document.service';\r\nimport { DocumentListItem, DocumentListResponse } from '../models/document-list-response.model';\r\nimport { TableData } from '../../../Shared/components/table-primary/table-primary.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\nimport { Message } from 'primeng/api';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentListService {\r\n\r\n constructor(\r\n private documentUploadService: DocumentUploadService,\r\n private documentHttpService: DocumentHttpService,\r\n private documentQuery: DocumentQuery,\r\n private documentStore: DocumentStore,\r\n private documentTableBuilder: DocumentTableBuilderService,\r\n private documentHelperService: DocumentHelperService\r\n ) {}\r\n\r\n /**\r\n * Handle file upload click event\r\n */\r\n handleFileUploadClick(): void {\r\n this.documentStore.setMessage(SHARED.EMPTY_ARRAY);\r\n }\r\n\r\n /**\r\n * Handle save click to update document name\r\n */\r\n handleSaveClick(fileName: string, selectedDocument: DocumentListItem): Observable<any> {\r\n const payload = { fileName };\r\n return this.documentHttpService.updateDocumentName(selectedDocument._id, payload);\r\n }\r\n\r\n\r\n /**\r\n * Get completion count for a category\r\n */\r\n getCompletionCount(category: DocumentListResponse): string {\r\n return this.documentTableBuilder.getCompletionCount(category);\r\n }\r\n\r\n /**\r\n * Get pending document count for a category\r\n */\r\n getPendingDocumentCount(category: DocumentListResponse): number {\r\n return this.documentTableBuilder.getPendingDocumentCount(category);\r\n }\r\n\r\n /**\r\n * Get approved document count for a category\r\n */\r\n getApprovedDocumentCount(category: DocumentListResponse): number {\r\n return this.documentTableBuilder.getApprovedDocumentCount(category);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Build document categories from API response\r\n */\r\n buildDocumentCategories(documentListResponse: DocumentListResponse[] | null): {\r\n documentCategories: DocumentListResponse[];\r\n categoryTables: TableData[];\r\n categoryCompletionCounts: string[];\r\n categorySeverities: ('success' | 'info' | 'warning' | 'danger')[];\r\n } {\r\n if (!documentListResponse) {\r\n return {\r\n documentCategories: SHARED.EMPTY_ARRAY,\r\n categoryTables: SHARED.EMPTY_ARRAY,\r\n categoryCompletionCounts: SHARED.EMPTY_ARRAY,\r\n categorySeverities: SHARED.EMPTY_ARRAY\r\n };\r\n }\r\n\r\n // Handle empty response - create a default category to show \"No records found\"\r\n if (documentListResponse.length === 0) {\r\n const defaultCategory = {\r\n label: SHARED.EMPTY,\r\n categoryDescription: SHARED.NO_DOCUMENTS_FOUND,\r\n list: SHARED.EMPTY_ARRAY,\r\n totalDocs: 0,\r\n acceptedDocs: 0,\r\n completed: '0/0'\r\n };\r\n \r\n return {\r\n documentCategories: [defaultCategory],\r\n categoryTables: [this.documentTableBuilder.buildDocumentTable([])],\r\n categoryCompletionCounts: ['0/0'],\r\n categorySeverities: ['info']\r\n };\r\n }\r\n\r\n const documentCategories = [...documentListResponse];\r\n const categoryTables = documentListResponse.map(category => \r\n this.documentTableBuilder.buildDocumentTable(category.list)\r\n );\r\n const categoryCompletionCounts = documentListResponse.map(category => \r\n this.getCompletionCount(category)\r\n );\r\n \r\n // Use the same severity calculation logic as menu items for consistency\r\n const categorySeverities = documentListResponse.map(category => {\r\n // Create a status object similar to what menu items use\r\n const status = {\r\n Pending: category.list.filter(doc => doc.status.toLowerCase() === SHARED.PENDING_STATUS).length,\r\n Reviewing: category.list.filter(doc => doc.status.toLowerCase() === SHARED.REVIEWING_STATUS).length,\r\n Accepted: category.list.filter(doc => doc.status.toLowerCase() === SHARED.APPROVED_STATUS || doc.status.toLowerCase() === SHARED.UPLOADED_STATUS).length,\r\n Rejected: category.list.filter(doc => doc.status.toLowerCase() === SHARED.REJECTED_STATUS).length\r\n };\r\n \r\n // Use the same severity calculation as menu items\r\n const total = status.Pending + status.Reviewing + status.Accepted + status.Rejected;\r\n if (total === 0) return 'info';\r\n if (status.Pending > 0) return 'info';\r\n if (status.Rejected > 0) return 'danger';\r\n if (status.Reviewing > 0) return 'warning';\r\n if (status.Accepted === total && total > 0) return 'success';\r\n return 'warning';\r\n });\r\n\r\n return {\r\n documentCategories,\r\n categoryTables,\r\n categoryCompletionCounts,\r\n categorySeverities\r\n };\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handle table row click\r\n */\r\n handleTableRowClick(rowData: any): DocumentListItem {\r\n return rowData;\r\n }\r\n\r\n /**\r\n * Handle delete action\r\n */\r\n handleDeleteAction(rowData: any, contextId: string): Observable<any> {\r\n if (!rowData._id || !contextId) {\r\n return throwError(() => new Error('Missing required parameters for delete'));\r\n }\r\n\r\n return this.documentHttpService.deleteDocument(rowData._id, contextId);\r\n }\r\n\r\n /**\r\n * Refresh document list for new context\r\n */\r\n refreshDocumentListForNewContext(contextId: string): void {\r\n if (contextId && contextId !== SHARED.EMPTY) {\r\n this.documentStore.setDocumentListResponse(null);\r\n this.documentHelperService.refreshDocumentsWithoutFilters(contextId);\r\n }\r\n }\r\n\r\n /**\r\n * Refresh document list after status update\r\n */\r\n refreshDocumentList(contextId: string): void {\r\n if (contextId) {\r\n this.documentHelperService.refreshDocumentsWithCurrentSelection(contextId);\r\n }\r\n }\r\n\r\n /**\r\n * Setup subscription to document list response\r\n */\r\n setupDocumentListSubscription(): Observable<DocumentListResponse[] | null> {\r\n return this.documentQuery.selectDocumentListResponse();\r\n }\r\n\r\n /**\r\n * Refresh all data with current filters\r\n */\r\n refreshAllDataWithCurrentFilters(contextId: string): void {\r\n this.documentHelperService.refreshAllDataWithCurrentFilters(contextId);\r\n }\r\n} ","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { DocumentStore } from '../state/document.store';\r\n\r\nexport interface ScrollTarget {\r\n element: Element;\r\n menuItemId: string;\r\n}\r\n\r\n/**\r\n * Service to observe section visibility and scroll state; deselects menu item when section scrolls out of view.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentScrollService implements OnDestroy {\r\n private sectionObserver: IntersectionObserver | null = null;\r\n private currentObservedSection: Element | null = null;\r\n private isScrolling: boolean = false;\r\n /** @type {(() => void) | null} */\r\n private scrollHandler: (() => void) | null = null;\r\n private scrollTimeout: ReturnType<typeof setTimeout> | null = null;\r\n /** Pending deselect scheduled on ratio=0. Cancelled when ratio>0 so we don't deselect after a stale ratio=0. */\r\n private deselectTimeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor(private documentStore: DocumentStore) {}\r\n\r\n /**\r\n * Sets up scroll event listeners to track scrolling state.\r\n * @param {HTMLElement} containerElement - The container element to monitor for scroll events\r\n */\r\n setupScrollListeners(containerElement: HTMLElement): void {\r\n if (containerElement) {\r\n /** Scroll handler: sets isScrolling and resets after 150ms */\r\n this.scrollHandler = () => {\r\n this.isScrolling = true;\r\n if (this.scrollTimeout) clearTimeout(this.scrollTimeout);\r\n this.scrollTimeout = setTimeout(() => { this.isScrolling = false; }, 150);\r\n };\r\n containerElement.addEventListener('scroll', this.scrollHandler);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up intersection observer to deselect when the selected section scrolls out of view.\r\n * @param {Element} sectionElement - The section element to observe\r\n * @param {string} menuItemId - The ID of the selected menu item\r\n */\r\n setupSectionObserver(sectionElement: Element, menuItemId: string): void {\r\n this.cancelPendingDeselect();\r\n this.disconnectSectionObserver();\r\n setTimeout(() => {\r\n if (!menuItemId || this.isScrolling) return;\r\n this.sectionObserver = new IntersectionObserver(\r\n (entries) => this.handleIntersectionEntries(entries, menuItemId),\r\n { threshold: [0, 0.1, 0.5, 1], rootMargin: '0px' }\r\n );\r\n this.sectionObserver.observe(sectionElement);\r\n this.currentObservedSection = sectionElement;\r\n }, 1200);\r\n }\r\n\r\n /**\r\n * Handles IntersectionObserver entries: cancel pending deselect when visible, schedule deselect when ratio=0.\r\n * @param {IntersectionObserverEntry[]} entries - Observer entries\r\n * @param {string} menuItemId - Selected menu item id\r\n */\r\n private handleIntersectionEntries(entries: IntersectionObserverEntry[], menuItemId: string): void {\r\n entries.forEach(entry => {\r\n const ratio = entry.intersectionRatio;\r\n if (ratio > 0) this.cancelPendingDeselect();\r\n if (ratio === 0) {\r\n this.cancelPendingDeselect();\r\n this.deselectTimeoutId = setTimeout(() => {\r\n this.deselectTimeoutId = null;\r\n if (this.sectionObserver && menuItemId) this.documentStore.setSelectedMenuItem(null);\r\n this.disconnectSectionObserver();\r\n }, 200);\r\n }\r\n });\r\n }\r\n\r\n private cancelPendingDeselect(): void {\r\n if (this.deselectTimeoutId != null) {\r\n clearTimeout(this.deselectTimeoutId);\r\n this.deselectTimeoutId = null;\r\n }\r\n }\r\n\r\n /**\r\n * Disconnects the section observer\r\n */\r\n disconnectSectionObserver(): void {\r\n this.cancelPendingDeselect();\r\n if (this.sectionObserver) {\r\n this.sectionObserver.disconnect();\r\n this.sectionObserver = null;\r\n this.currentObservedSection = null;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the scrolling flag to true (called when starting a scroll operation)\r\n */\r\n setScrolling(): void {\r\n this.isScrolling = true;\r\n }\r\n\r\n /**\r\n * Resets the scrolling flag after a specified delay.\r\n * @param {number} [delay=1200] - Delay in milliseconds before resetting the flag\r\n */\r\n resetScrollingAfterDelay(delay: number = 1200): void {\r\n setTimeout(() => {\r\n this.isScrolling = false;\r\n }, delay);\r\n }\r\n\r\n /**\r\n * Gets the current scrolling state.\r\n * @returns {boolean} True when a scroll is in progress\r\n */\r\n get isCurrentlyScrolling(): boolean {\r\n return this.isScrolling;\r\n }\r\n\r\n /**\r\n * Cleans up all resources\r\n */\r\n ngOnDestroy(): void {\r\n this.disconnectSectionObserver();\r\n this.cleanupScrollListeners();\r\n }\r\n\r\n /**\r\n * Removes scroll event listeners.\r\n * @param {HTMLElement} [containerElement] - The container element to remove listeners from\r\n */\r\n cleanupScrollListeners(containerElement?: HTMLElement): void {\r\n if (containerElement && this.scrollHandler) {\r\n containerElement.removeEventListener('scroll', this.scrollHandler);\r\n this.scrollHandler = null;\r\n }\r\n \r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n this.scrollTimeout = null;\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { SHARED } from '../../constant/SHARED';\r\nimport { ProcessedRowData, TableData } from './table-primary.model';\r\n\r\n@Component({\r\n selector: 'lib-table-primary',\r\n standalone: false,\r\n templateUrl: './table-primary.component.html',\r\n styleUrl: './table-primary.component.scss'\r\n})\r\nexport class TablePrimaryComponent implements OnChanges {\r\n @Input() tableData: TableData = { columns: [], data: [] };\r\n @Input() showHeader: boolean = true;\r\n @Input() tableStyle: any = { 'min-width': '100%' };\r\n @Output() rowClick = new EventEmitter<any>();\r\n @Output() rowCtrlClick = new EventEmitter<any>();\r\n processedData: ProcessedRowData[] = [];\r\n \r\n // Expose SHARED constants for template use\r\n readonly SHARED = SHARED;\r\n\r\n // Computed property for visible columns (excluding actions)\r\n get visibleColumns() {\r\n return this.tableData.columns.filter(col => col.type !== SHARED.CELL_TYPE_ACTIONS);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['tableData'] && this.tableData) {\r\n this.processTableData();\r\n }\r\n }\r\n\r\n private processTableData(): void {\r\n this.processedData = this.tableData.data.map((rowData, index) => {\r\n const processedRow: ProcessedRowData = { ...rowData };\r\n if (rowData.fileName) {\r\n processedRow._fileExtension = this.getFileExtension(rowData.fileName);\r\n processedRow._isPdfFile = processedRow._fileExtension === SHARED.PDF;\r\n processedRow._isImageFile = processedRow._fileExtension === SHARED.JPG || processedRow._fileExtension === SHARED.PNG;\r\n processedRow._isExcelFile = processedRow._fileExtension === SHARED.XLSX;\r\n processedRow._isOtherFile = !processedRow._isPdfFile && !processedRow._isImageFile && !processedRow._isExcelFile;\r\n }\r\n\r\n this.tableData.columns.forEach(col => {\r\n if (col.type === SHARED.STATUS_PARAM && rowData[col.field]) {\r\n const status = rowData[col.field];\r\n processedRow._statusClass = this.getStatusClass(status);\r\n processedRow._statusIcon = this.getStatusIcon(status);\r\n }\r\n });\r\n\r\n return processedRow;\r\n });\r\n }\r\n\r\n getStatusClass(status: string): string {\r\n switch (status.toLowerCase()) {\r\n case SHARED.PENDING_STATUS:\r\n return SHARED.STATUS_PENDING_CLASS;\r\n case SHARED.APPROVED_STATUS:\r\n return SHARED.STATUS_APPROVED_CLASS;\r\n case SHARED.ALERT_STATUS:\r\n return SHARED.STATUS_ALERT_CLASS;\r\n case SHARED.UPLOADED_STATUS:\r\n return SHARED.STATUS_UPLOADED_CLASS;\r\n case SHARED.REVIEWING_STATUS:\r\n return SHARED.STATUS_REVIEWING_CLASS;\r\n case SHARED.REJECTED_STATUS:\r\n return SHARED.STATUS_REJECTED_CLASS;\r\n default:\r\n return SHARED.STATUS_PENDING_CLASS;\r\n }\r\n }\r\n\r\n getStatusIcon(status: string): string {\r\n switch (status.toLowerCase()) {\r\n case SHARED.PENDING_STATUS:\r\n return SHARED.ICON_CLOCK;\r\n case SHARED.APPROVED_STATUS:\r\n return SHARED.ICON_CHECK;\r\n case SHARED.ALERT_STATUS:\r\n return SHARED.ICON_EXCLAMATION_TRIANGLE;\r\n case SHARED.UPLOADED_STATUS:\r\n return SHARED.ICON_CLOUD_UPLOAD;\r\n case SHARED.REVIEWING_STATUS:\r\n return SHARED.ICON_EYE;\r\n case SHARED.REJECTED_STATUS:\r\n return SHARED.ICON_TIMES;\r\n default:\r\n return SHARED.ICON_CLOCK;\r\n }\r\n }\r\n\r\n getFileExtension(fileName: string): string {\r\n return fileName.split(SHARED.DOT).pop()?.toUpperCase() || SHARED.PDF;\r\n }\r\n\r\n onRowClick(event: MouseEvent, rowData: any): void {\r\n if (event.ctrlKey || event.metaKey) {\r\n this.rowCtrlClick.emit(rowData);\r\n } else {\r\n this.rowClick.emit(rowData);\r\n }\r\n }\r\n\r\n getVisibleColumnCount(): number {\r\n return this.visibleColumns.length;\r\n }\r\n\r\n /**\r\n * Formats document display name based on whether aliasName exists:\r\n * - Without aliasName: fileName on top, docName below\r\n * - With aliasName: aliasName on top, docName - fileName below\r\n * @param rowData The row data containing docName, aliasName, and fileName\r\n * @returns HTML string with proper formatting\r\n */\r\n formatDocumentDisplayName(rowData: any): string {\r\n let displayName = '';\r\n \r\n if (rowData.aliasName && rowData.aliasName.trim() !== '') {\r\n // With aliasName: aliasName on top, docName - fileName below\r\n displayName += `<span class=\"alias-name\">${rowData.aliasName}</span><br>`;\r\n \r\n if (rowData.docName && rowData.fileName) {\r\n displayName += `<span class=\"document-info\">${rowData.docName} - ${rowData.fileName}</span>`;\r\n } else if (rowData.docName) {\r\n displayName += `<span class=\"document-info\">${rowData.docName}</span>`;\r\n }\r\n } else {\r\n // Without aliasName: fileName on top, docName below\r\n if (rowData.fileName) {\r\n displayName += `<span class=\"document-info\">${rowData.fileName}</span>`;\r\n }\r\n \r\n if (rowData.docName) {\r\n if (displayName) displayName += '<br>';\r\n displayName += `<span class=\"document-info\">${rowData.docName}</span>`;\r\n }\r\n }\r\n \r\n return displayName;\r\n }\r\n}\r\n","<div class=\"table-primary\">\r\n <p-table [value]=\"processedData\" [tableStyle]=\"tableStyle\">\r\n <ng-template pTemplate=\"header\" *ngIf=\"showHeader\">\r\n <tr>\r\n <ng-container *ngFor=\"let col of visibleColumns\">\r\n <th [style.width]=\"col.width\">\r\n {{ col.header }}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData>\r\n <tr (click)=\"onRowClick($event, rowData)\" class=\"clickable-row\">\r\n <ng-container *ngFor=\"let col of visibleColumns\">\r\n <td [style.width]=\"col.width\">\r\n <!-- Document Cell -->\r\n <div *ngIf=\"col.type === SHARED.CELL_TYPE_DOCUMENT\" class=\"document-cell\">\r\n <div class=\"document-info\">\r\n <div class=\"document-icon\">\r\n <i [class]=\"SHARED.ICON_FILE_PDF\" *ngIf=\"rowData._isPdfFile\"></i>\r\n <i [class]=\"SHARED.ICON_IMAGE\" *ngIf=\"rowData._isImageFile\"></i>\r\n <i [class]=\"SHARED.ICON_FILE_EXCEL\" *ngIf=\"rowData._isExcelFile\"></i>\r\n <i [class]=\"SHARED.ICON_FILE\" *ngIf=\"rowData._isOtherFile\"></i>\r\n </div>\r\n <div class=\"document-details\">\r\n <div class=\"document-name\" [innerHTML]=\"formatDocumentDisplayName(rowData)\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Status Cell -->\r\n \r\n <div *ngIf=\"col.type === SHARED.CELL_TYPE_STATUS\" class=\"status-cell\">\r\n <span class=\"status-pill\" [ngClass]=\"rowData._statusClass\">\r\n <i [class]=\"rowData._statusIcon\"></i>\r\n {{ rowData[col.field] }}\r\n </span>\r\n </div>\r\n\r\n <!-- Actions Cell -->\r\n <div *ngIf=\"col.type === SHARED.CELL_TYPE_ACTIONS\" class=\"actions-cell\">\r\n <!-- Actions content can be added here if needed -->\r\n </div>\r\n\r\n <!-- Default Text Cell -->\r\n <div *ngIf=\"!col.type || col.type === SHARED.CELL_TYPE_TEXT\" class=\"text-cell\">\r\n {{ rowData[col.field] }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n \r\n <!-- No Records Template -->\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"getVisibleColumnCount()\" class=\"no-records-cell\">\r\n <div class=\"no-records-content\">\r\n <i class=\"pi pi-inbox\" style=\"font-size: 2rem; color: #6c757d;\"></i>\r\n <p class=\"no-records-text\">No records found</p>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { DocumentHelperService } from './document.service';\r\nimport { DocumentListItem } from '../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../models/document-history.model';\r\nimport { DocumentAction } from './document-actions.service';\r\nimport { DocumentAlertList, SHARED, SUPPORTED_IMAGE_TYPES } from '../../../Shared/constant/SHARED';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentQuery } from '../state/document.query';\r\n\r\nexport interface DocumentViewerState {\r\n selectedDocument?: DocumentListItem;\r\n documentHistory: DocumentHistorySection[];\r\n showDocumentHistory: boolean;\r\n isActionLoading: boolean;\r\n documentStatus: 'pending' | 'accepted' | 'rejected';\r\n documentIsUploaded: boolean;\r\n alertData: any;\r\n deleteError: any;\r\n deleteSuccess: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentViewerService {\r\n constructor(\r\n private documentHttpService: DocumentHttpService,\r\n private documentService: DocumentHelperService,\r\n private messageService: MessageService,\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery\r\n ) {}\r\n\r\n /**\r\n * Gets the current document viewer state as an observable\r\n */\r\n get state$(): Observable<DocumentViewerState> {\r\n return this.documentQuery.selectDocumentViewerState();\r\n }\r\n\r\n /**\r\n * Gets the current document viewer state synchronously\r\n */\r\n getCurrentState(): DocumentViewerState {\r\n return this.documentQuery.getDocumentViewerState();\r\n }\r\n\r\n /**\r\n * Updates the selected document and recalculates all computed properties\r\n * @param document The selected document\r\n */\r\n updateSelectedDocument(document: DocumentListItem, skipLoadDocumentHistory: boolean = false): void {\r\n this.documentService.set(document);\r\n const alertData = this.getAlertData(document);\r\n const documentStatus = this.calculateDocumentStatus(document);\r\n const documentIsUploaded = this.calculateIsDocumentUploaded(document);\r\n\r\n this.documentStore.updateDocumentViewerState(\r\n document,\r\n undefined, \r\n undefined,\r\n undefined,\r\n documentStatus,\r\n documentIsUploaded,\r\n alertData\r\n );\r\n\r\n if( !skipLoadDocumentHistory && document?._id ) this.loadDocumentHistory(document._id);\r\n }\r\n\r\n /**\r\n * Loads document history data\r\n * @param documentId The document ID\r\n */\r\n loadDocumentHistory(documentId: string): void {\r\n if (documentId) {\r\n this.documentHttpService.getDocumentHistory(documentId)\r\n .subscribe({\r\n next: (history) => {\r\n this.documentStore.updateDocumentViewerState(\r\n undefined,\r\n history,\r\n true\r\n );\r\n },\r\n error: (error) => {\r\n this.documentStore.updateDocumentViewerState(\r\n undefined,\r\n undefined,\r\n false\r\n );\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Determines if the given content type is an image\r\n * @param contentType The MIME type of the content\r\n * @returns True if the content type is an image\r\n */\r\n isImage(contentType?: string): boolean {\r\n return contentType ? SUPPORTED_IMAGE_TYPES.includes(contentType) : false;\r\n }\r\n\r\n /**\r\n * Handles document actions and updates status\r\n * @param action The action performed\r\n * @param contextId The context ID for API calls\r\n */\r\n handleDocumentAction(action: DocumentAction, contextId?: string): void {\r\n const currentState = this.documentQuery.getDocumentViewerState();\r\n if (!currentState.selectedDocument?._id) {\r\n console.error('No document ID available');\r\n return;\r\n }\r\n\r\n switch (action.type) {\r\n case SHARED.ACCEPT_ACTION:\r\n this.updateDocumentStatus(SHARED.STATUS_APPROVED, action.note || SHARED.DOCUMENT_ACCEPTED_MESSAGE, contextId);\r\n break;\r\n case SHARED.REJECT_ACTION:\r\n this.updateDocumentStatus(SHARED.STATUS_REJECTED, action.note || SHARED.DOCUMENT_REJECTED_MESSAGE, contextId);\r\n break;\r\n case SHARED.DELETE_ACTION:\r\n this.deleteDocument(currentState.selectedDocument._id, contextId);\r\n // Don't emit success event here - it will be emitted only on successful delete\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Updates the document status via API call and refreshes all related data\r\n * @param status The new status (Approved, Rejected)\r\n * @param description The status update description\r\n * @param contextId The context ID for API calls\r\n */\r\n private updateDocumentStatus(status: string, description: string, contextId?: string): void {\r\n const currentState = this.documentQuery.getDocumentViewerState();\r\n if (!currentState.selectedDocument?._id) {\r\n console.error('No document ID available');\r\n return;\r\n }\r\n\r\n this.documentStore.setIsActionLoading(true);\r\n\r\n this.documentHttpService.updateDocumentStatus(\r\n currentState.selectedDocument._id,\r\n status,\r\n description\r\n ).subscribe({\r\n next: (response) => {\r\n if (currentState.selectedDocument && response.status) {\r\n const normalizedStatus = response.normalizedStatus || response.status.toLowerCase();\r\n const updatedDocument = {\r\n ...currentState.selectedDocument,\r\n status: normalizedStatus\r\n };\r\n \r\n this.updateSelectedDocument(updatedDocument);\r\n }\r\n this.refreshAllData(contextId);\r\n },\r\n error: (error) => {\r\n console.error('Error updating document status:', error);\r\n },\r\n complete: () => {\r\n this.documentStore.setIsActionLoading(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Deletes a document without immediate refresh - refresh will happen when viewer is closed\r\n * @param documentId The ID of the document to delete\r\n * @param contextId The context ID for API calls\r\n */\r\n private deleteDocument(documentId: string, contextId?: string): void {\r\n if (!contextId) {\r\n console.error('No context ID available for delete operation');\r\n return;\r\n }\r\n\r\n this.documentStore.setIsActionLoading(true);\r\n\r\n this.documentHttpService.deleteDocument(documentId, contextId).subscribe({\r\n next: (res:any) => {\r\n if(res){\r\n // this.documentService.refreshAllDataWithCurrentFilters(contextId);\r\n this.documentStore.setDeleteSuccess(true);\r\n this.documentStore.clearDocumentViewerState();\r\n }\r\n },\r\n error: (error) => {\r\n this.documentStore.setIsActionLoading(false);\r\n this.documentStore.setDeleteError(error.message);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refreshes all related data after document status update\r\n * @param contextId The context ID for API calls\r\n */\r\n private refreshAllData(contextId?: string): void {\r\n if (!contextId) {\r\n console.error('No context ID available for data refresh');\r\n return;\r\n }\r\n\r\n const currentState = this.documentQuery.getDocumentViewerState();\r\n if (currentState.selectedDocument?._id) {\r\n this.loadDocumentHistory(currentState.selectedDocument._id);\r\n }\r\n\r\n // Use the same refresh method as other components for consistency\r\n this.documentService.refreshAllDataWithCurrentFilters(contextId);\r\n }\r\n\r\n /**\r\n * Gets alert data for the document\r\n * @param document The document\r\n * @returns Alert data\r\n */\r\n private getAlertData(document: DocumentListItem): any {\r\n return DocumentAlertList.find((res: any) => res.status === document?.status);\r\n }\r\n\r\n /**\r\n * Calculates the current status of the document for the actions component\r\n * @param document The document\r\n * @returns The current document status\r\n */\r\n private calculateDocumentStatus(document: DocumentListItem): 'pending' | 'accepted' | 'rejected' {\r\n if (!document) return SHARED.STATUS_PENDING as 'pending';\r\n \r\n // First check statusId from API response if available\r\n if (document.statusId) {\r\n switch (document.statusId.toLowerCase()) {\r\n case SHARED.STATUS_APPROVED.toLowerCase():\r\n return SHARED.STATUS_ACCEPTED as 'accepted';\r\n case SHARED.STATUS_REJECTED.toLowerCase():\r\n return SHARED.STATUS_REJECTED_LOWERCASE as 'rejected';\r\n case SHARED.STATUS_PENDING:\r\n return SHARED.STATUS_PENDING as 'pending';\r\n }\r\n }\r\n \r\n // Fall back to status field mapping\r\n switch (document.status?.toLowerCase()) {\r\n case SHARED.STATUS_APPROVED.toLowerCase():\r\n case SHARED.STATUS_ACCEPTED:\r\n return SHARED.STATUS_ACCEPTED as 'accepted';\r\n case SHARED.STATUS_REJECTED.toLowerCase():\r\n case SHARED.STATUS_DECLINED:\r\n return SHARED.STATUS_REJECTED_LOWERCASE as 'rejected';\r\n default:\r\n return SHARED.STATUS_PENDING as 'pending';\r\n }\r\n }\r\n\r\n /**\r\n * Calculates if the document is uploaded and ready for actions\r\n * @param document The document\r\n * @returns True if document is uploaded\r\n */\r\n private calculateIsDocumentUploaded(document: DocumentListItem): boolean {\r\n if (!document) return false;\r\n \r\n // Check if document has a URL and is not in a pending state\r\n const isPending = document.statusId?.toLowerCase() === SHARED.STATUS_PENDING || \r\n document.status?.toLowerCase() === SHARED.STATUS_PENDING;\r\n \r\n return !!(document.documentUrl && !isPending);\r\n }\r\n} ","/**\r\n * Constants for Document History labels and styling\r\n */\r\nexport const DOCUMENT_HISTORY = {\r\n // Document History Labels\r\n LABELS: {\r\n DOCUMENT_REQUESTED: 'Document Requested',\r\n DOCUMENT_UPLOADED: 'Document Uploaded',\r\n DOCUMENT_REJECTED: 'Document Rejected',\r\n DOCUMENT_ACCEPTED: 'Document Accepted'\r\n },\r\n\r\n // Icon classes for different actions\r\n ICONS: {\r\n DOCUMENT_REQUESTED: 'pi pi-file',\r\n DOCUMENT_UPLOADED: 'pi pi-cloud-upload',\r\n DOCUMENT_REJECTED: 'pi pi-times',\r\n DOCUMENT_ACCEPTED: 'pi pi-check'\r\n },\r\n\r\n // Text color classes - matching the design in the image\r\n TEXT_COLORS: {\r\n DOCUMENT_REQUESTED: 'text-gray-700', // Dark gray for better readability\r\n DOCUMENT_UPLOADED: 'text-green-700', // Dark green for uploaded\r\n DOCUMENT_REJECTED: 'text-red-700', // Dark red for rejected\r\n DOCUMENT_ACCEPTED: 'text-green-700' // Dark green for accepted\r\n },\r\n\r\n // Background color classes - matching the light gray design from image\r\n BG_COLORS: {\r\n DOCUMENT_REQUESTED: 'bg-gray-100', // Light gray like in the image\r\n DOCUMENT_UPLOADED: 'bg-green-50', // Very light green\r\n DOCUMENT_REJECTED: 'bg-red-50', // Very light red\r\n DOCUMENT_ACCEPTED: 'bg-green-50' // Very light green\r\n },\r\n\r\n // Border color classes - subtle borders\r\n BORDER_COLORS: {\r\n DOCUMENT_REQUESTED: 'border-gray-300', // Medium gray border\r\n DOCUMENT_UPLOADED: 'border-green-300', // Light green border\r\n DOCUMENT_REJECTED: 'border-red-300', // Light red border\r\n DOCUMENT_ACCEPTED: 'border-green-300' // Light green border\r\n },\r\n\r\n // Icon background color classes - matching the circular icon design\r\n ICON_BG_COLORS: {\r\n DOCUMENT_REQUESTED: 'icon-bg-blue', // Blue for requested (as shown in image)\r\n DOCUMENT_UPLOADED: 'icon-bg-green', // Green for uploaded\r\n DOCUMENT_REJECTED: 'icon-bg-red', // Red for rejected\r\n DOCUMENT_ACCEPTED: 'icon-bg-green' // Green for accepted\r\n }\r\n}; ","import { Injectable } from '@angular/core';\r\nimport { DOCUMENT_HISTORY } from '../constant/DOCUMENT_HISTORY';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\n/**\r\n * Service for handling document history styling logic\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentHistoryStyleService {\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Get the appropriate icon class based on the action label\r\n */\r\n getActionIcon(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.ICONS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate color class based on the action label\r\n */\r\n getActionColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.TEXT_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate background color class based on the action label\r\n */\r\n getActionBgColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.BG_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate border color class based on the action label\r\n */\r\n getActionBorderColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.BORDER_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Get the appropriate icon background color class based on the action label\r\n */\r\n getActionIconBgColor(label: string): string {\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_REQUESTED;\r\n default:\r\n return DOCUMENT_HISTORY.ICON_BG_COLORS.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Check if a section has valid content to display\r\n */\r\n checkValidContent(section: any): boolean {\r\n return section.list && section.list.length > 0 && \r\n section.list.some((item:any) => \r\n item.label || \r\n item.requestDescription || \r\n item.documentUrl || \r\n item.userName\r\n );\r\n }\r\n\r\n getAccordionClass(section: any): string {\r\n if (!section.list || section.list.length === 0) {\r\n return SHARED.DOCUMENT_REQUESTED;\r\n }\r\n\r\n const firstItem = section.list[0];\r\n const label = firstItem.label;\r\n\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return SHARED.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return SHARED.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return SHARED.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n default:\r\n return SHARED.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { DocumentHistoryItem, DocumentHistorySection } from '../models/document-history.model';\r\nimport { DocumentHistoryStyleService } from './document-history-style.service';\r\nimport { DOCUMENT_HISTORY } from '../constant/DOCUMENT_HISTORY';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\n// Extended interface for processed items with computed properties\r\ninterface ProcessedDocumentHistoryItem extends DocumentHistoryItem {\r\n actionIcon: string;\r\n actionColor: string;\r\n actionBgColor: string;\r\n actionBorderColor: string;\r\n actionIconBgColor: string;\r\n}\r\n\r\ninterface ProcessedDocumentHistorySection extends DocumentHistorySection {\r\n list: ProcessedDocumentHistoryItem[];\r\n accordionClass?: string;\r\n hasValidContent?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentHistoryService {\r\n\r\n constructor(private documentHistoryStyleService: DocumentHistoryStyleService, private http : HttpClient) {}\r\n\r\n /**\r\n * Get the CSS class for accordion styling based on the section's label\r\n */\r\n private getAccordionClass(section: ProcessedDocumentHistorySection): string {\r\n if (!section.list || section.list.length === 0) {\r\n return SHARED.DOCUMENT_REQUESTED; // Default class\r\n }\r\n\r\n const firstItem = section.list[0];\r\n const label = firstItem.label;\r\n\r\n switch (label) {\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_UPLOADED:\r\n return SHARED.DOCUMENT_UPLOADED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REJECTED:\r\n return SHARED.DOCUMENT_REJECTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_ACCEPTED:\r\n return SHARED.DOCUMENT_ACCEPTED;\r\n case DOCUMENT_HISTORY.LABELS.DOCUMENT_REQUESTED:\r\n default:\r\n return SHARED.DOCUMENT_REQUESTED;\r\n }\r\n }\r\n\r\n /**\r\n * Check if a section has valid content to display\r\n */\r\n private checkValidContent(section: ProcessedDocumentHistorySection): boolean {\r\n return section.list && section.list.length > 0 && \r\n section.list.some(item => \r\n item.requestDescription !== SHARED.EMPTY && \r\n item.documentUrl !== SHARED.EMPTY && \r\n (item.userName !== SHARED.EMPTY && item.userName !== SHARED.UNKNOWN_USER)\r\n );\r\n }\r\n\r\n /**\r\n * Process history data to add computed properties\r\n */\r\n processHistoryData(historyData: DocumentHistorySection[]): ProcessedDocumentHistorySection[] {\r\n if (!historyData) {\r\n return SHARED.EMPTY_ARRAY;\r\n }\r\n\r\n return historyData.map(section => {\r\n const processedSection: ProcessedDocumentHistorySection = {\r\n ...section,\r\n list: section.list.map(item => ({\r\n ...item,\r\n dateTime: item.dateTime || ERRORS.NO_VALUE_FOUND,\r\n actionIcon: this.documentHistoryStyleService.getActionIcon(item.label),\r\n actionColor: this.documentHistoryStyleService.getActionColor(item.label),\r\n actionBgColor: this.documentHistoryStyleService.getActionBgColor(item.label),\r\n actionBorderColor: this.documentHistoryStyleService.getActionBorderColor(item.label),\r\n actionIconBgColor: this.documentHistoryStyleService.getActionIconBgColor(item.label)\r\n }))\r\n };\r\n processedSection.accordionClass = this.getAccordionClass(processedSection);\r\n processedSection.hasValidContent = this.checkValidContent(processedSection);\r\n\r\n return processedSection;\r\n }).sort((a, b) => {\r\n if (a.header === SHARED.INITIAL_REQUEST) return -1;\r\n if (b.header === SHARED.INITIAL_REQUEST) return 1;\r\n return 0;\r\n }).map(section => ({\r\n ...section,\r\n list: section.list.reverse()\r\n }));\r\n }\r\n\r\n /**\r\n * Downloads a document when clicked\r\n * @param documentUrl - The URL of the document to download\r\n * @param docName - The name of the document\r\n */\r\n downloadDocument(documentUrl: string, docName?: string): void {\r\n if (!documentUrl) {\r\n console.warn(ERRORS.NO_DOCUMENT_URL);\r\n return;\r\n }\r\n this.http.get(documentUrl, { responseType: 'blob' }).subscribe({\r\n next: (blob) => {\r\n const blobUrl = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = blobUrl;\r\n a.download = docName ?? SHARED.DOCUMENT;\r\n a.style.display = SHARED.NONE;\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n window.URL.revokeObjectURL(blobUrl);\r\n },\r\n error: (err) => {\r\n console.error(ERRORS.DOWNLOAD_FAIL, err);\r\n }\r\n });\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface DocumentAction {\r\n type: typeof SHARED.REJECT_ACTION | typeof SHARED.ACCEPT_ACTION | typeof SHARED.DELETE_ACTION;\r\n note?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentActionsService {\r\n\r\n /**\r\n * Calculates the card class based on status\r\n * @param currentStatus - The current status of the document\r\n * @param statusId - The status ID from API\r\n * @returns {string} The CSS class for the card\r\n */\r\n calculateCardClass(currentStatus?: string, statusId?: string): string {\r\n // Use statusId if available, otherwise fall back to currentStatus\r\n if (statusId) {\r\n return `status-${statusId}-card`;\r\n }\r\n \r\n if (!currentStatus) {\r\n return SHARED.CARD_PENDING;\r\n }\r\n \r\n const status = currentStatus.toLowerCase();\r\n if (status === SHARED.STATUS_ACCEPTED.toLowerCase() || status === SHARED.STATUS_APPROVED.toLowerCase()) {\r\n return SHARED.CARD_ACCEPTED;\r\n } else if (status === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() || status === SHARED.STATUS_REJECTED.toLowerCase()) {\r\n return SHARED.CARD_REJECTED;\r\n } else {\r\n return SHARED.CARD_PENDING;\r\n }\r\n }\r\n\r\n /**\r\n * Calculates the reject button class based on status\r\n * @param currentStatus - The current status of the document\r\n * @param statusId - The status ID from API\r\n * @returns {string} The CSS class for the reject button\r\n */\r\n calculateRejectButtonClass(currentStatus?: string, statusId?: string): string {\r\n // Use statusId if available, otherwise fall back to currentStatus\r\n if (statusId) {\r\n return `status-${statusId}-reject`;\r\n }\r\n \r\n if (!currentStatus) {\r\n return SHARED.BUTTON_DEFAULT_REJECT;\r\n }\r\n \r\n const status = currentStatus.toLowerCase();\r\n if (status === SHARED.STATUS_ACCEPTED.toLowerCase() || status === SHARED.STATUS_APPROVED.toLowerCase()) {\r\n return SHARED.BUTTON_SECONDARY_REJECT;\r\n } else if (status === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() || status === SHARED.STATUS_REJECTED.toLowerCase()) {\r\n return SHARED.BUTTON_PRIMARY_REJECT;\r\n } else {\r\n return SHARED.BUTTON_DEFAULT_REJECT;\r\n }\r\n }\r\n\r\n /**\r\n * Calculates the accept button class based on status\r\n * @param currentStatus - The current status of the document\r\n * @param statusId - The status ID from API\r\n * @returns {string} The CSS class for the accept button\r\n */\r\n calculateAcceptButtonClass(currentStatus?: string, statusId?: string): string {\r\n // Use statusId if available, otherwise fall back to currentStatus\r\n if (statusId) {\r\n return `status-${statusId}-accept`;\r\n }\r\n \r\n if (!currentStatus) {\r\n return SHARED.BUTTON_DEFAULT_ACCEPT;\r\n }\r\n \r\n const status = currentStatus.toLowerCase();\r\n if (status === SHARED.STATUS_ACCEPTED.toLowerCase() || status === SHARED.STATUS_APPROVED.toLowerCase()) {\r\n return SHARED.BUTTON_PRIMARY_ACCEPT;\r\n } else if (status === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() || status === SHARED.STATUS_REJECTED.toLowerCase()) {\r\n return SHARED.BUTTON_SECONDARY_ACCEPT;\r\n } else {\r\n return SHARED.BUTTON_DEFAULT_ACCEPT;\r\n }\r\n }\r\n\r\n /**\r\n * Creates an accept action\r\n * @param note - The acceptance note\r\n * @returns {DocumentAction} The accept action\r\n */\r\n createAcceptAction(note: string): DocumentAction {\r\n return {\r\n type: SHARED.ACCEPT_ACTION as 'accept',\r\n note: note\r\n };\r\n }\r\n\r\n /**\r\n * Creates a reject action\r\n * @param note - The rejection note\r\n * @returns {DocumentAction} The reject action\r\n */\r\n createRejectAction(note: string): DocumentAction {\r\n return {\r\n type: SHARED.REJECT_ACTION as 'reject',\r\n note: note\r\n };\r\n }\r\n\r\n /**\r\n * Creates a delete action\r\n * @returns {DocumentAction} The delete action\r\n */\r\n createDeleteAction(): DocumentAction {\r\n return {\r\n type: SHARED.DELETE_ACTION as 'delete'\r\n };\r\n }\r\n} ","import { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { DocumentHttpService } from './document-http.service';\r\nimport { ERRORS } from '../../../Shared/constant/ERROR';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface AiChatMessage {\r\n role: 'user' | 'assistant';\r\n content: string;\r\n htmlContent?: string;\r\n}\r\n\r\nexport interface DocumentHistoryAiState {\r\n showAiMenu: boolean;\r\n showAiSidebar: boolean;\r\n aiSidebarHeader: 'Query';\r\n aiContent: string;\r\n aiContentHtml: string;\r\n aiLoading: boolean;\r\n aiError: string;\r\n queryText: string;\r\n queryLoading: boolean;\r\n queryMessages: AiChatMessage[];\r\n}\r\n\r\n/**\r\n * Handles AI-related document history workflows and formatting.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentHistoryAiService {\r\n /**\r\n * UI state for AI panel and query chat.\r\n */\r\n state: DocumentHistoryAiState = {\r\n showAiMenu: false,\r\n showAiSidebar: false,\r\n aiSidebarHeader: 'Query',\r\n aiContent: '',\r\n aiContentHtml: '',\r\n aiLoading: false,\r\n aiError: '',\r\n queryText: '',\r\n queryLoading: false,\r\n queryMessages: []\r\n };\r\n\r\n /**\r\n * Creates an instance of DocumentHistoryAiService.\r\n * @param {DocumentHttpService} documentHttpService - Service for AI API calls.\r\n */\r\n constructor(private documentHttpService: DocumentHttpService) {}\r\n\r\n /**\r\n * Toggles AI dropdown visibility.\r\n */\r\n toggleAiMenu(): void {\r\n this.state.showAiMenu = !this.state.showAiMenu;\r\n }\r\n\r\n /**\r\n * Closes AI dropdown menu.\r\n */\r\n closeAiMenu(): void {\r\n this.state.showAiMenu = false;\r\n }\r\n\r\n /**\r\n * Opens AI sidebar for Query panel.\r\n * @param {'Query'} section - AI section (Query only).\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n openAiPanel(section: 'Query', selectedDocument: any): void {\r\n this.initializePanel();\r\n this.resetQueryState();\r\n }\r\n\r\n /**\r\n * Sends query using current query text in state.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n sendQuery(selectedDocument: any): void {\r\n const question = (this.state.queryText || '').trim();\r\n if (!question || this.state.queryLoading) return;\r\n\r\n this.state.aiError = '';\r\n this.pushUserQuestion(question);\r\n this.askQuestionForDocument(selectedDocument, question).subscribe({\r\n next: this.handleQuestionResult.bind(this),\r\n error: this.handleQuestionRequestError.bind(this)\r\n });\r\n }\r\n\r\n /**\r\n * Sends a fixed \"Document Summary\" prompt for the current document.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n sendSummaryPrompt(selectedDocument: any): void {\r\n const prompt = SHARED.SUMMARY_PROMPT;\r\n if (this.state.queryLoading) {\r\n return;\r\n }\r\n this.state.aiError = '';\r\n this.pushUserQuestion(prompt);\r\n this.askQuestionForDocument(selectedDocument, prompt).subscribe({\r\n next: this.handleQuestionResult.bind(this),\r\n error: this.handleQuestionRequestError.bind(this)\r\n });\r\n }\r\n\r\n /**\r\n * Sends a fixed \"Document Insights\" prompt for the current document.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n sendInsightsPrompt(selectedDocument: any): void {\r\n const prompt = SHARED.INSIGHTS_PROMPT;\r\n if (this.state.queryLoading) {\r\n return;\r\n }\r\n this.state.aiError = '';\r\n this.pushUserQuestion(prompt);\r\n this.askQuestionForDocument(selectedDocument, prompt).subscribe({\r\n next: this.handleQuestionResult.bind(this),\r\n error: this.handleQuestionRequestError.bind(this)\r\n });\r\n }\r\n\r\n /**\r\n * Handles Enter key for query submission.\r\n * @param {KeyboardEvent} event - Keyboard event from query textarea.\r\n * @param {any} selectedDocument - Selected document object.\r\n */\r\n onQueryEnter(event: KeyboardEvent, selectedDocument: any): void {\r\n if (event.key !== 'Enter' || event.shiftKey) return;\r\n event.preventDefault();\r\n this.sendQuery(selectedDocument);\r\n }\r\n\r\n /**\r\n * Returns selected document id.\r\n * @param {any} selectedDocument - Selected document object.\r\n * @returns {string | undefined} Selected document id.\r\n */\r\n getCurrentDocumentId(selectedDocument: any): string | undefined {\r\n return selectedDocument?._id;\r\n }\r\n\r\n /**\r\n * Sends question against a document.\r\n * @param {string} documentId - Document identifier.\r\n * @param {string} question - User question.\r\n * @returns {Observable<string>} Answer text.\r\n */\r\n askQuestion(documentId: string, question: string): Observable<string> {\r\n if (!documentId) {\r\n return throwError(() => new Error('Document ID is missing.'));\r\n }\r\n\r\n return this.documentHttpService.askAiQuestion(documentId, question).pipe(\r\n map(this.extractQuestionAnswer),\r\n catchError(this.handleAskQuestionError)\r\n );\r\n }\r\n\r\n /**\r\n * Sends question and returns answer + formatted html.\r\n * @param {any} selectedDocument - Selected document object.\r\n * @param {string} question - User question.\r\n * @returns {Observable<{ answer: string; html: string }>} Answer payload.\r\n */\r\n askQuestionForDocument(selectedDocument: any, question: string): Observable<{ answer: string; html: string }> {\r\n const documentId = this.getCurrentDocumentId(selectedDocument);\r\n if (!documentId) {\r\n return throwError(() => new Error(ERRORS.NO_VALUE_FOUND));\r\n }\r\n\r\n return this.askQuestion(documentId, question).pipe(\r\n map(this.toAnswerResult.bind(this)),\r\n catchError(this.handleQuestionGenerationError)\r\n );\r\n }\r\n\r\n /**\r\n * Converts markdown-like output to presentable HTML.\r\n * @param {string} content - Raw AI response content.\r\n * @returns {string} Formatted HTML string.\r\n */\r\n formatAiContent(content: string): string {\r\n const escaped = this.escapeHtml(content || '');\r\n return this.renderMarkdownLines(escaped.split('\\n'));\r\n }\r\n\r\n /**\r\n * Extracts answer text from question API response.\r\n * @param {any} response - Question API response.\r\n * @returns {string} Answer text.\r\n */\r\n private extractQuestionAnswer(response: any): string {\r\n if (!response?.success) {\r\n throw new Error(ERRORS.ERROR_QUESTION_GENERATION);\r\n }\r\n return response.answer || 'No answer found.';\r\n }\r\n\r\n /**\r\n * Maps answer text to answer payload.\r\n * @param {string} answer - Plain answer text.\r\n * @returns {{ answer: string; html: string }} Answer payload.\r\n */\r\n private toAnswerResult(answer: string): { answer: string; html: string } {\r\n return { answer, html: this.formatAiContent(answer) };\r\n }\r\n\r\n /**\r\n * Initializes panel state for Query.\r\n */\r\n private initializePanel(): void {\r\n this.state.aiSidebarHeader = 'Query';\r\n this.state.showAiSidebar = true;\r\n this.state.showAiMenu = false;\r\n this.state.aiError = '';\r\n this.state.aiContent = '';\r\n this.state.aiContentHtml = '';\r\n }\r\n\r\n /**\r\n * Resets query-specific UI state.\r\n */\r\n private resetQueryState(): void {\r\n this.state.queryText = '';\r\n this.state.queryMessages = [];\r\n this.state.queryLoading = false;\r\n this.state.aiError = '';\r\n }\r\n\r\n /**\r\n * Adds user question into chat history and sets loading.\r\n * @param {string} question - User question text.\r\n */\r\n private pushUserQuestion(question: string): void {\r\n this.state.queryMessages.push({ role: 'user', content: question });\r\n this.state.queryText = '';\r\n this.state.queryLoading = true;\r\n }\r\n\r\n /**\r\n * Handles successful question response and updates state.\r\n * @param {{ answer: string; html: string }} result - Formatted answer result.\r\n * @param {string} result.answer - AI answer text.\r\n * @param {string} result.html - Formatted AI answer HTML.\r\n */\r\n private handleQuestionResult(result: { answer: string; html: string }): void {\r\n this.state.queryLoading = false;\r\n this.state.queryMessages.push({\r\n role: 'assistant',\r\n content: result.answer,\r\n htmlContent: result.html\r\n });\r\n }\r\n\r\n /**\r\n * Handles question request errors.\r\n * @param {Error} error - Error object.\r\n */\r\n private handleQuestionRequestError(error: Error): void {\r\n this.state.queryLoading = false;\r\n this.state.aiError = error?.message || ERRORS.ERROR_QUESTION_GENERATION;\r\n }\r\n\r\n /**\r\n * Converts ask-question request errors.\r\n * @returns {Observable<never>} Error observable.\r\n */\r\n private handleAskQuestionError(): Observable<never> {\r\n return throwError(() => new Error(ERRORS.ERROR_QUESTION_GENERATION));\r\n }\r\n\r\n /**\r\n * Converts ask-question-for-document errors.\r\n * @returns {Observable<never>} Error observable.\r\n */\r\n private handleQuestionGenerationError(): Observable<never> {\r\n return throwError(() => new Error(ERRORS.ERROR_QUESTION_GENERATION));\r\n }\r\n\r\n /**\r\n * Renders escaped lines into HTML blocks.\r\n * @param {string[]} lines - Escaped content lines.\r\n * @returns {string} Rendered HTML.\r\n */\r\n private renderMarkdownLines(lines: string[]): string {\r\n const htmlParts: string[] = [];\r\n let isInList = false;\r\n lines.forEach((rawLine) => {\r\n const line = rawLine.trim();\r\n isInList = this.pushMarkdownLine(line, htmlParts, isInList);\r\n });\r\n if (isInList) htmlParts.push('</ul>');\r\n return htmlParts.join('');\r\n }\r\n\r\n /**\r\n * Pushes one markdown line into output.\r\n * @param {string} line - Current line.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list tracking flag.\r\n */\r\n private pushMarkdownLine(line: string, htmlParts: string[], isInList: boolean): boolean {\r\n if (!line) return this.closeListIfNeeded(htmlParts, isInList);\r\n if (line.startsWith('- ')) return this.pushListLine(line, htmlParts, isInList);\r\n return this.pushParagraphLine(line, htmlParts, isInList);\r\n }\r\n\r\n /**\r\n * Closes list if it is currently open.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list flag.\r\n */\r\n private closeListIfNeeded(htmlParts: string[], isInList: boolean): boolean {\r\n if (isInList) htmlParts.push('</ul>');\r\n return false;\r\n }\r\n\r\n /**\r\n * Appends a bullet-list line.\r\n * @param {string} line - Raw markdown line.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list flag.\r\n */\r\n private pushListLine(line: string, htmlParts: string[], isInList: boolean): boolean {\r\n if (!isInList) htmlParts.push('<ul class=\"ai-markdown-list\">');\r\n htmlParts.push(`<li>${this.formatBold(line.substring(2).trim())}</li>`);\r\n return true;\r\n }\r\n\r\n /**\r\n * Appends a paragraph line.\r\n * @param {string} line - Raw markdown line.\r\n * @param {string[]} htmlParts - Output accumulator.\r\n * @param {boolean} isInList - List tracking flag.\r\n * @returns {boolean} Updated list flag.\r\n */\r\n private pushParagraphLine(line: string, htmlParts: string[], isInList: boolean): boolean {\r\n if (isInList) htmlParts.push('</ul>');\r\n htmlParts.push(`<p>${this.formatBold(line)}</p>`);\r\n return false;\r\n }\r\n\r\n /**\r\n * Formats markdown bold markers.\r\n * @param {string} text - Input text.\r\n * @returns {string} Text with strong tags.\r\n */\r\n private formatBold(text: string): string {\r\n return text.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\r\n }\r\n\r\n /**\r\n * Escapes HTML-sensitive characters.\r\n * @param {string} text - Input text.\r\n * @returns {string} Escaped text.\r\n */\r\n private escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n }\r\n}\r\n","import { Directive, Input, ElementRef, Renderer2, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { SessionService } from '../../../Shared/services/session.service';\r\n\r\n/**\r\n * Directive to conditionally show or hide elements based on user permissions.\r\n * @class HasPermissionDirective\r\n * @typedef {HasPermissionDirective}\r\n */\r\n@Directive({\r\n selector: '[permission]',\r\n standalone: false\r\n})\r\nexport class HasPermissionDirective implements OnChanges {\r\n \r\n /**\r\n * The required permission(s) to display the element.\r\n * Accepts a single string or an array of strings.\r\n * @type {string | string[]}\r\n */\r\n @Input() permission?: string | string[];\r\n\r\n /**\r\n * Creates an instance of HasPermissionDirective.\r\n * @param {ElementRef} el - Reference to the host element.\r\n * @param {Renderer2} renderer - Angular Renderer for DOM manipulation.\r\n * @param {SessionService} sessionService - Service to retrieve user permissions.\r\n */\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n public sessionService: SessionService\r\n ) {}\r\n\r\n /**\r\n * Lifecycle hook that is called when input properties change.\r\n * @param {SimpleChanges} changes - The changes in input properties.\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['permission']) {\r\n this.checkPermission();\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the user has the required permission(s).\r\n * Hides the element if the permission is not found.\r\n */\r\n private checkPermission() {\r\n // If no permission is required (empty string, null, or undefined), show the element\r\n if (!this.permission || this.permission === '' || (Array.isArray(this.permission) && this.permission.length === 0)) {\r\n this.renderer.removeStyle(this.el.nativeElement, 'display');\r\n return;\r\n }\r\n\r\n const sessionPermsOrTraits = this.sessionService.getUserPermissions();\r\n const traitListFromSession = this.sessionService.getUserTraits?.() || null;\r\n\r\n // Support both legacy formats:\r\n // - permissions: [{ name: \"documents-deleteDocumentByDocumentId\" }, ...]\r\n // - traits: [\"documents-deleteDocumentByDocumentId\", ...]\r\n const userPermissionNames: string[] = Array.isArray(traitListFromSession)\r\n ? traitListFromSession\r\n : Array.isArray(sessionPermsOrTraits)\r\n ? sessionPermsOrTraits\r\n .map((perm: any) => (typeof perm === 'string' ? perm : perm?.name))\r\n .filter((x: any): x is string => typeof x === 'string' && x.length > 0)\r\n : [];\r\n\r\n const requiredPermissions = Array.isArray(this.permission)\r\n ? this.permission\r\n : [this.permission];\r\n\r\n const hasPermission = requiredPermissions.some(permission =>\r\n userPermissionNames.includes(permission)\r\n );\r\n\r\n if (!hasPermission) {\r\n this.renderer.setStyle(this.el.nativeElement, 'display', 'none');\r\n } else {\r\n this.renderer.removeStyle(this.el.nativeElement, 'display');\r\n }\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { DocumentHistoryAiService } from '../../services/document-history-ai.service';\r\n\r\n@Component({\r\n selector: 'document-ai-chat',\r\n standalone: false,\r\n templateUrl: './document-ai-chat.component.html',\r\n styleUrls: ['./document-ai-chat.component.scss']\r\n})\r\nexport class DocumentAiChatComponent {\r\n /**\r\n * The selected document for context in AI queries.\r\n */\r\n @Input() selectedDocument?: any;\r\n\r\n constructor(public documentHistoryAiService: DocumentHistoryAiService) { }\r\n\r\n handleSummaryPrompt() {\r\n this.documentHistoryAiService.sendSummaryPrompt(this.selectedDocument);\r\n }\r\n\r\n handleInsightsPrompt() {\r\n this.documentHistoryAiService.sendInsightsPrompt(this.selectedDocument);\r\n }\r\n\r\n handleEnter(event: KeyboardEvent) {\r\n this.documentHistoryAiService.onQueryEnter(event, this.selectedDocument);\r\n }\r\n\r\n handleSend() {\r\n this.documentHistoryAiService.sendQuery(this.selectedDocument);\r\n }\r\n}\r\n","<div class=\"chat-panel document-ai-chat-panel\">\r\n <div class=\"chat-header\">\r\n <div class=\"chat-header-content\">\r\n <div class=\"chat-header-brand\">\r\n <span class=\"chat-header-icon\"><i class=\"ri-sparkling-2-fill\"></i></span>\r\n <div class=\"chat-header-text\">\r\n <h2 class=\"chat-title\">Catura Document AI</h2>\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"chat-header-menu\" style=\"cursor: pointer;\" (click)=\"documentHistoryAiService.state.showAiSidebar = false\">\r\n <i class=\"ri-close-line\" style=\"font-size: 1.4rem;\"></i>\r\n </span>\r\n </div>\r\n\r\n <div class=\"chat-messages\">\r\n <div class=\"chat-welcome\" *ngIf=\"documentHistoryAiService.state.queryMessages.length === 0 && !documentHistoryAiService.state.queryLoading\">\r\n <div class=\"welcome-illustration\">\r\n <i class=\"ri-bubble-chart-line\"></i>\r\n </div>\r\n <h3 class=\"welcome-title\">Catura Document AI</h3>\r\n <p class=\"welcome-subtitle\">\r\n We're here to help. Ask your questions below.\r\n Your conversation is private and secure.\r\n </p>\r\n <div class=\"suggested-prompts\">\r\n <button\r\n type=\"button\"\r\n class=\"prompt-chip\"\r\n (click)=\"handleSummaryPrompt()\"\r\n >\r\n <i class=\"ri-sparkling-2-line\"></i>\r\n <span>Summarise this document</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"prompt-chip\"\r\n (click)=\"handleInsightsPrompt()\"\r\n >\r\n <i class=\"ri-sparkling-2-line\"></i>\r\n <span>Provide Insights about this document</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"documentHistoryAiService.state.queryMessages.length > 0\">\r\n <div\r\n class=\"message\"\r\n *ngFor=\"let msg of documentHistoryAiService.state.queryMessages\"\r\n [ngClass]=\"{ 'message-user': msg.role === 'user', 'message-assistant': msg.role === 'assistant' }\"\r\n >\r\n <span class=\"message-avatar\">\r\n <i [ngClass]=\"msg.role === 'user' ? 'ri-user-3-fill' : 'ri-robot-2-line'\"></i>\r\n </span>\r\n <div class=\"message-bubble\">\r\n <ng-container *ngIf=\"msg.role === 'user'\">\r\n {{ msg.content }}\r\n </ng-container>\r\n <ng-container *ngIf=\"msg.role === 'assistant'\">\r\n <div class=\"message-content ai-markdown\" [innerHTML]=\"msg.htmlContent\"></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"message message-assistant\" *ngIf=\"documentHistoryAiService.state.queryLoading\">\r\n <span class=\"message-avatar\">\r\n <i class=\"ri-robot-2-line\"></i>\r\n </span>\r\n <div class=\"message-bubble\">\r\n <span class=\"loading-dots\">\r\n <span></span><span></span><span></span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-input-area\">\r\n <div class=\"chat-input-wrapper\">\r\n <textarea\r\n class=\"chat-input\"\r\n [(ngModel)]=\"documentHistoryAiService.state.queryText\"\r\n [placeholder]=\"'Start Message...'\"\r\n [disabled]=\"documentHistoryAiService.state.queryLoading\"\r\n rows=\"1\"\r\n (keydown)=\"handleEnter($event)\"\r\n ></textarea>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"p-button p-button-primary send-btn\"\r\n (click)=\"handleSend()\"\r\n [disabled]=\"\r\n documentHistoryAiService.state.queryLoading ||\r\n !documentHistoryAiService.state.queryText?.trim()\r\n \"\r\n aria-label=\"Send\"\r\n >\r\n <i class=\"ri-send-plane-fill\"></i>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n","import { Component, Input, Output, EventEmitter, HostListener, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { DocumentHistorySection, HistoryDocument } from '../../models/document-history.model';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHistoryService } from '../../services/document-history.service';\r\nimport { DocumentViewerService } from '../../services/document-viewer.service';\r\nimport { DocumentActionsService } from '../../services/document-actions.service';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { ConfirmationDialogComponent } from '../../../../Shared/components/confirmation-dialog/confirmation-dialog.component';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentHistoryAiService } from '../../services/document-history-ai.service';\r\n\r\n// Extended interface for processed items with computed properties\r\ninterface ProcessedDocumentHistoryItem {\r\n label: string;\r\n dateTime: string;\r\n requestDescription: string;\r\n userName: string;\r\n userRole: string;\r\n documentUrl?: string;\r\n docName?: string;\r\n actionIcon: string;\r\n actionColor: string;\r\n actionBgColor: string;\r\n actionBorderColor: string;\r\n actionIconBgColor: string;\r\n}\r\n\r\ninterface ProcessedDocumentHistorySection extends DocumentHistorySection {\r\n list: ProcessedDocumentHistoryItem[];\r\n accordionClass?: string;\r\n hasValidContent?: boolean;\r\n}\r\n\r\n/**\r\n * Component for displaying document history in a timeline format.\r\n */\r\n@Component({\r\n selector: 'document-history',\r\n standalone: false,\r\n templateUrl: './document-history.component.html',\r\n styleUrls: ['./document-history.component.scss']\r\n})\r\nexport class DocumentHistoryComponent implements OnChanges, OnInit, OnDestroy {\r\n /**\r\n * Input data for document history sections\r\n */\r\n @Input() historyData: DocumentHistorySection[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Whether to show the history component\r\n */\r\n @Input() showHistory: boolean = false;\r\n\r\n /**\r\n * The context ID for API calls\r\n */\r\n @Input() contextId?: string;\r\n\r\n /**\r\n * The selected document for actions\r\n */\r\n @Input() selectedDocument?: any;\r\n\r\n /**\r\n * When true, shows the AI entry point and sidebar.\r\n * Set false to hide document intelligence UI.\r\n */\r\n @Input() isDocumentIntelligence: boolean = true;\r\n isDocumentAiFeatureEnabled = false;\r\n\r\n /**\r\n * Event emitted when delete task is requested\r\n */\r\n @Output() deleteTaskRequested = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when a document from history is selected\r\n */\r\n @Output() documentSelected = new EventEmitter<HistoryDocument>();\r\n\r\n /**\r\n * Reference to the document actions component\r\n */\r\n documentActionsComponent?: any;\r\n\r\n /**\r\n * Active accordion index for controlling expand/collapse\r\n */\r\n activeAccordionIndex: number = 0;\r\n\r\n /**\r\n * Whether the accordion is expanded\r\n */\r\n isAccordionExpanded: boolean = true;\r\n\r\n /**\r\n * Whether the actions dropdown menu is visible\r\n */\r\n showActionsMenu: boolean = false;\r\n private destroy$ = new Subject<void>();\r\n\r\n /**\r\n * Combines local input control and remote feature flag control.\r\n * @returns {boolean} True when AI menu/sidebar should be visible.\r\n */\r\n get showDocumentAiUi(): boolean {\r\n return Boolean(this.isDocumentIntelligence && this.isDocumentAiFeatureEnabled);\r\n }\r\n\r\n constructor(\r\n private documentHistoryService: DocumentHistoryService,\r\n private documentViewerService: DocumentViewerService,\r\n private documentActionsService: DocumentActionsService,\r\n private confirmationService: ConfirmationService,\r\n private documentHttpService: DocumentHttpService,\r\n public documentHistoryAiService: DocumentHistoryAiService\r\n ) { }\r\n\r\n /**\r\n * Reads Configs and enables AI only when `docIntelligence.data.enabled` is true.\r\n */\r\n ngOnInit(): void {\r\n this.documentHttpService\r\n .getAppConfigs()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((configs: any[]) => {\r\n const docIntelligenceConfig = configs?.find((item) => item?.name === SHARED.DOCUMENT_CHATBOT);\r\n this.isDocumentAiFeatureEnabled = Boolean(docIntelligenceConfig?.data?.enabled);\r\n });\r\n }\r\n\r\n /**\r\n * Handles changes to input properties\r\n * @param {SimpleChanges} changes - Changed input values.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['historyData'] && this.historyData) {\r\n this.processHistoryData();\r\n }\r\n }\r\n\r\n /**\r\n * Handle accordion open event\r\n */\r\n onAccordionOpen(): void {\r\n this.isAccordionExpanded = true;\r\n this.activeAccordionIndex = 0;\r\n }\r\n\r\n /**\r\n * Handle accordion close event\r\n */\r\n onAccordionClose(): void {\r\n this.isAccordionExpanded = false;\r\n this.activeAccordionIndex = -1;\r\n }\r\n\r\n /**\r\n * Toggle accordion state\r\n */\r\n toggleAccordion(): void {\r\n if (this.isAccordionExpanded) {\r\n this.onAccordionClose();\r\n } else {\r\n this.onAccordionOpen();\r\n }\r\n }\r\n\r\n /**\r\n * Process history data to add computed properties\r\n * @returns {any[]} Processed history sections for rendering.\r\n */\r\n get processedHistoryData(): any[] {\r\n return this._processedHistoryData;\r\n }\r\n\r\n /**\r\n * Downloads a document when clicked\r\n * @param {string} documentUrl - The URL of the document to download.\r\n * @param {string} docName - The name of the document.\r\n */\r\n downloadDocument(documentUrl: string, docName?: string): void {\r\n this.documentHistoryService.downloadDocument(documentUrl, docName);\r\n }\r\n\r\n /**\r\n * Get alert count for the alerts section\r\n * @returns {number} Alert count value.\r\n */\r\n getAlertCount(): number {\r\n // This could be enhanced to get actual alert count from a service\r\n return 3; // Placeholder value matching the image\r\n }\r\n\r\n /**\r\n * Get CSS class for event card based on action type\r\n * @param {string} label - Event label text.\r\n * @returns {string} CSS class name for event card.\r\n */\r\n getEventCardClass(label: string): string {\r\n const lowerLabel = label.toLowerCase();\r\n if (lowerLabel.includes(SHARED.REQUESTED)) {\r\n return SHARED.EVENT_REQUESTED;\r\n } else if (lowerLabel.includes(SHARED.ACCEPTED) || lowerLabel.includes(SHARED.UPLOADED)) {\r\n return SHARED.EVENT_ACCEPTED;\r\n } else if (lowerLabel.includes(SHARED.REJECTED)) {\r\n return SHARED.EVENT_REJECTED;\r\n }\r\n return SHARED.EVENT_DEFAULT;\r\n }\r\n\r\n /**\r\n * Get CSS class for event icon based on action type\r\n * @param {string} label - Event label text.\r\n * @returns {string} CSS class name for event icon.\r\n */\r\n getEventIconClass(label: string): string {\r\n const lowerLabel = label.toLowerCase();\r\n if (lowerLabel.includes(SHARED.REQUESTED)) {\r\n return SHARED.ICON_REQUESTED;\r\n } else if (lowerLabel.includes(SHARED.ACCEPTED) || lowerLabel.includes(SHARED.UPLOADED)) {\r\n return SHARED.ICON_ACCEPTED;\r\n } else if (lowerLabel.includes(SHARED.REJECTED)) {\r\n return SHARED.ICON_REJECTED;\r\n }\r\n return SHARED.ICON_DEFAULT;\r\n }\r\n\r\n /**\r\n * Get the appropriate icon for the event\r\n * @param {string} label - The event label.\r\n * @returns {string} The icon class\r\n */\r\n getEventIcon(label: string): string {\r\n const lowerLabel = label.toLowerCase();\r\n if (lowerLabel.includes(SHARED.UPLOADED)) {\r\n return SHARED.ICON_CHECK_CIRCLE;\r\n } else if (lowerLabel.includes(SHARED.REQUESTED)) {\r\n return SHARED.ICON_FOLDER_PLUS;\r\n } else if (lowerLabel.includes(SHARED.ACCEPTED) || lowerLabel.includes(SHARED.APPROVED)) {\r\n return SHARED.ICON_CHECK_CIRCLE;\r\n } else if (lowerLabel.includes(SHARED.REJECTED)) {\r\n return SHARED.ICON_TIMES;\r\n }\r\n return SHARED.ICON_FILE;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Toggle the actions dropdown menu\r\n */\r\n toggleActionsMenu(): void {\r\n this.showActionsMenu = !this.showActionsMenu;\r\n }\r\n\r\n /**\r\n * Close the actions dropdown menu\r\n */\r\n closeActionsMenu(): void {\r\n this.showActionsMenu = false;\r\n }\r\n\r\n /**\r\n * Open AI sidebar with selected section.\r\n * @param {'Query'} section - AI section (Query only).\r\n */\r\n openAiPanel(section: 'Query'): void {\r\n if (!this.showDocumentAiUi) return;\r\n this.documentHistoryAiService.openAiPanel(section, this.selectedDocument);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handle delete task action\r\n */\r\n onDeleteTask(): void {\r\n this.closeActionsMenu();\r\n if (this.selectedDocument && this.contextId) {\r\n const documentName = this.selectedDocument?.docName || 'this document';\r\n const documentId = this.selectedDocument?._id;\r\n const documentTypeName = this.selectedDocument?.documentTypeName?.toLowerCase() || '';\r\n // Check if the document is a valuation report\r\n const isValuationReport = documentTypeName.includes(SHARED.VALUATION_REPORT);\r\n if (isValuationReport && documentId) { // First check if valuation report data exists in the database\r\n this.documentHttpService.getValuationReportByContextId(this.contextId).subscribe({\r\n next: this.handleValuationReportCheckSuccess(documentId, documentName).bind(this),\r\n error: this.handleValuationReportCheckError(documentName).bind(this)\r\n });\r\n } else { this.showStandardDeleteConfirmation(documentName); // Show standard delete confirmation for other document types\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Shows standard delete confirmation dialog\r\n * @param {string} documentName - Document display name for confirmation message.\r\n * @private\r\n */\r\n private showStandardDeleteConfirmation(documentName: string): void {\r\n ConfirmationDialogComponent.confirmDelete(\r\n this.confirmationService,\r\n documentName,\r\n () => {\r\n this.performDelete();\r\n },\r\n () => {}\r\n );\r\n }\r\n\r\n /**\r\n * Handles valuation report lookup success before delete confirmation.\r\n * @param {string} documentId - Selected document id.\r\n * @param {string} documentName - Document display name.\r\n * @returns {(valuationReportData: any) => void} Callback for valuation report response.\r\n */\r\n private handleValuationReportCheckSuccess(documentId: string, documentName: string): (valuationReportData: any) => void {\r\n return (valuationReportData: any): void => {\r\n const hasValuationReportData = valuationReportData && Object.keys(valuationReportData).length > 0;\r\n const documentIdMatches = valuationReportData?.documentId === documentId;\r\n if (hasValuationReportData && documentIdMatches) {\r\n ConfirmationDialogComponent.confirm(\r\n this.confirmationService,\r\n {\r\n message: SHARED.VALUATION_REPORT_DELETE_MESSAGE,\r\n header: SHARED.DELETE_CONFIRMATION_HEADER,\r\n acceptLabel: SHARED.DELETE,\r\n rejectLabel: SHARED.CANCEL,\r\n acceptButtonClass: SHARED.DELETE_BUTTON_STYLE_CLASS\r\n },\r\n this.handleConfirmDelete.bind(this),\r\n this.handleCancelDelete.bind(this) );\r\n return;\r\n }\r\n this.showStandardDeleteConfirmation(documentName); };\r\n }\r\n\r\n /**\r\n * Handles valuation report lookup error before delete confirmation.\r\n * @param {string} documentName - Document display name.\r\n * @returns {(error: any) => void} Error callback.\r\n */\r\n private handleValuationReportCheckError(documentName: string): (error: any) => void {\r\n return (): void => {\r\n this.showStandardDeleteConfirmation(documentName);\r\n };\r\n }\r\n\r\n /**\r\n * Handles confirm action for delete dialog.\r\n */\r\n private handleConfirmDelete(): void {\r\n this.performDelete();\r\n }\r\n\r\n /**\r\n * Handles cancel action for delete dialog.\r\n */\r\n private handleCancelDelete(): void {}\r\n\r\n /**\r\n * Performs the actual delete operation\r\n * @private\r\n */\r\n private performDelete(): void {\r\n // Ensure the viewer service has the latest selected document (with _id from history)\r\n try {\r\n (this.documentViewerService as any).updateSelectedDocument?.(this.selectedDocument, true);\r\n } catch {}\r\n const deleteAction = this.documentActionsService.createDeleteAction();\r\n this.documentViewerService.handleDocumentAction(deleteAction, this.contextId);\r\n this.deleteTaskRequested.emit();\r\n }\r\n\r\n /**\r\n * Set reference to document actions component\r\n * @param {any} component - Document actions component reference.\r\n */\r\n setDocumentActionsComponent(component: any): void {\r\n this.documentActionsComponent = component;\r\n }\r\n\r\n /**\r\n * Handles document selection from history\r\n * @param {HistoryDocument} document - The selected document from history.\r\n */\r\n onDocumentClick(document: HistoryDocument): void {\r\n if (document && document.documentUrl && document.docName) {\r\n this.documentSelected.emit(document);\r\n }\r\n }\r\n\r\n /**\r\n * Processed history data with document lists\r\n */\r\n private _processedHistoryData: any[] = [];\r\n\r\n /**\r\n * Processes history data to include document lists for each item\r\n */\r\n private processHistoryData(): void {\r\n this._processedHistoryData = this.historyData.map(section => ({\r\n ...section,\r\n list: section.list.map(item => ({\r\n ...item,\r\n documentList: this.getValidDocuments(item),\r\n eventCardClass: this.getEventCardClass(item.label),\r\n eventIconClass: this.getEventIconClass(item.label),\r\n eventIcon: this.getEventIcon(item.label),\r\n shouldHide: this.shouldHideItem(item)\r\n }))\r\n }));\r\n }\r\n\r\n /**\r\n * Gets the list of valid documents for a history item\r\n * @param {any} item - The history item.\r\n * @returns {HistoryDocument[]} Array of valid documents.\r\n */\r\n private getValidDocuments(item: any): HistoryDocument[] {\r\n if (item.documents && Array.isArray(item.documents)) {\r\n return item.documents.filter((doc: HistoryDocument) =>\r\n doc && doc.docName && doc.documentUrl\r\n );\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Determines if a timeline item should be hidden\r\n * @param {any} item - The history item.\r\n * @returns {boolean} True if the item should be hidden.\r\n */\r\n private shouldHideItem(item: any): boolean {\r\n return this.selectedDocument?.isUploaded &&\r\n item.label.toLowerCase().includes(SHARED.REQUESTED);\r\n }\r\n\r\n /**\r\n * Sends a query to AI chat API and appends response in chat format.\r\n */\r\n sendQuery(): void {\r\n this.documentHistoryAiService.sendQuery(this.selectedDocument);\r\n }\r\n\r\n /**\r\n * Sends query when user presses Enter (without Shift).\r\n * @param {KeyboardEvent} event - Keyboard event from textarea.\r\n */\r\n onQueryEnter(event: KeyboardEvent): void {\r\n this.documentHistoryAiService.onQueryEnter(event, this.selectedDocument);\r\n }\r\n\r\n /**\r\n * Listen for clicks outside the dropdown to close it\r\n * @param {Event} event - Click event from document.\r\n */\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClickOutside(event: Event): void {\r\n const target = event.target as HTMLElement;\r\n\r\n if (this.showActionsMenu) {\r\n const actionsMenu = target.closest('.actions-menu');\r\n if (!actionsMenu) {\r\n this.closeActionsMenu();\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Cleans up subscriptions.\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n} ","<div class=\"document-review-container\">\r\n <!-- Header Section -->\r\n <div class=\"review-header\">\r\n <div class=\"review-title-section\">\r\n <h2 class=\"review-title\">Document Review</h2>\r\n <!-- <div class=\"ai-menu\" *ngIf=\"showDocumentAiUi\">\r\n <button class=\"ai-btn\" type=\"button\" (click)=\"openAiPanel('Query')\" [class.active]=\"documentHistoryAiService.state.showAiSidebar\">\r\n <i class=\"pi pi-sparkles\"></i>\r\n <span>AI</span>\r\n </button>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"actions-menu\" *ngIf=\"selectedDocument?.isUploaded || selectedDocument?.status == 'Approved'\"> -->\r\n <!-- <div class=\"actions-menu\" *ngIf=\"(selectedDocument?.isUploaded || selectedDocument?.status == 'Approved') && !selectedDocument?.isSystemDocument\"> -->\r\n <div class=\"actions-menu\" *ngIf=\"(selectedDocument?.status !== 'Approved') && (!selectedDocument?.isSystemDocument)\">\r\n <button class=\"actions-btn\" (click)=\"toggleActionsMenu()\" [class.active]=\"showActionsMenu\">\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\" (click)=\"$event.stopPropagation()\">\r\n <!-- <div class=\"dropdown-item\" *ngIf=\"selectedDocument?.status == 'Approved' || selectedDocument?.isUploaded || selectedDocument?.status == 'Uploaded'\">\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </div> -->\r\n <div *ngIf=\"selectedDocument?.status == 'Uploaded' || selectedDocument?.status === 'Rejected' || selectedDocument?.status === 'Reviewing' || selectedDocument?.status === 'Pending'\" [permission]=\"'documents-deleteDocumentByDocumentId'\" class=\"dropdown-item\" (click)=\"onDeleteTask()\">\r\n <span>Delete Document</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Document Actions Component - Below Header -->\r\n <div class=\"document-actions-section\">\r\n <ng-content select=\"[actions-component]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Alerts Section -->\r\n <!-- <div class=\"alerts-section\">\r\n <div class=\"alert-card\">\r\n <div class=\"alert-header\">\r\n <i class=\"pi pi-exclamation-triangle alert-icon\"></i>\r\n <span class=\"alert-text\">Alerts</span>\r\n <div class=\"alert-badge\">\r\n <span class=\"alert-count\">{{ getAlertCount() }}</span>\r\n <i class=\"pi pi-chevron-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Timeline Section -->\r\n <div class=\"timeline-section\" *ngIf=\"showHistory && historyData.length > 0\">\r\n <h3 class=\"timeline-title\">Timeline</h3>\r\n <div class=\"timeline-container\">\r\n <div class=\"timeline-item\" *ngFor=\"let section of processedHistoryData\">\r\n <ng-container *ngFor=\"let item of section.list; let i = index\">\r\n <div class=\"timeline-event mb-2\" *ngIf=\"!item.shouldHide\">\r\n <div class=\"event-card\" [ngClass]=\"item.eventCardClass\">\r\n <!-- Event Header -->\r\n <div class=\"event-header\">\r\n <div class=\"event-info\">\r\n <i [class]=\"item.eventIcon\"></i>\r\n <span class=\"event-label\">{{ item.label }}</span>\r\n </div>\r\n <div class=\"event-timestamp\">{{ item.dateTime }}</div>\r\n </div>\r\n <!-- User Information -->\r\n <div class=\"event-user mb-2\" *ngIf=\"!item.label.toLowerCase().includes('uploaded')\">\r\n <span class=\"user-name\">{{ item.userName }}</span>\r\n <span class=\"user-role\">({{ item.userRole }})</span>\r\n </div>\r\n <!-- Event Description -->\r\n <div class=\"event-description\" *ngIf=\"item.requestDescription\">\r\n <ul class=\"event-description-list\" *ngIf=\"item.label.toLowerCase().includes('requested')\">\r\n <li class=\"event-description-item\">{{ item.requestDescription }}</li>\r\n </ul>\r\n <p *ngIf=\"!item.label.toLowerCase().includes('requested')\">{{ item.requestDescription }}</p>\r\n </div>\r\n\r\n <!-- Document Upload Cards -->\r\n <div class=\"document-uploads\" *ngIf=\"item.documentList && item.documentList.length > 0\">\r\n <div class=\"uploaded-documents\">\r\n <div class=\"document-card\" *ngFor=\"let doc of item.documentList\" (click)=\"onDocumentClick(doc)\">\r\n <div class=\"document-icon\">\r\n <i class=\"pi pi-file\"></i>\r\n </div>\r\n <div class=\"document-info\">\r\n <span class=\"document-name\">{{ doc.docName }}</span>\r\n <div class=\"document-notes\" *ngIf=\"doc.notes\">\r\n <small class=\"notes-text\">{{ doc.notes }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <ng-content [select]=\"'actions-component'\"></ng-content> -->\r\n</div>\r\n\r\n<p-sidebar *ngIf=\"showDocumentAiUi\" [(visible)]=\"documentHistoryAiService.state.showAiSidebar\" position=\"right\"\r\n [style]=\"{ width: '420px' }\" styleClass=\"ai-chat-sidebar\" [dismissible]=\"true\" [showCloseIcon]=\"false\"\r\n [showHeader]=\"false\" [appendTo]=\"'body'\">\r\n\r\n <div class=\"ai-sidebar-content\">\r\n <document-ai-chat [selectedDocument]=\"selectedDocument\"></document-ai-chat>\r\n </div>\r\n</p-sidebar>","import { Injectable } from '@angular/core';\r\nimport * as XLSX from 'xlsx';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n/**\r\n * Interface for Excel cell styling information\r\n */\r\nexport interface ExcelCellStyle {\r\n backgroundColor?: string;\r\n fontColor?: string;\r\n bold?: boolean;\r\n italic?: boolean;\r\n border?: {\r\n top?: string;\r\n bottom?: string;\r\n left?: string;\r\n right?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Interface for Excel cell data with styling\r\n */\r\nexport interface ExcelCellData {\r\n value: any;\r\n style?: ExcelCellStyle;\r\n}\r\n\r\n/**\r\n * Interface for Excel row data\r\n */\r\nexport interface ExcelRowData {\r\n cells: ExcelCellData[];\r\n}\r\n\r\n/**\r\n * Interface for parsed Excel data\r\n */\r\nexport interface ParsedExcelData {\r\n sheets: string[];\r\n currentSheet: string;\r\n styledData: ExcelRowData[];\r\n tableData: any[][];\r\n hasStyling: boolean;\r\n workbook: XLSX.WorkBook;\r\n}\r\n\r\n/**\r\n * Service for parsing Excel files and extracting styling information\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExcelParserService {\r\n\r\n private workbookColors: { [key: number]: string } = {};\r\n\r\n /**\r\n * Parses Excel data from ArrayBuffer\r\n */\r\n parseExcelData(data: ArrayBuffer): ParsedExcelData | null {\r\n try {\r\n const workbook = this.createWorkbook(data);\r\n \r\n // Extract color palette from workbook\r\n this.extractWorkbookColors(workbook);\r\n \r\n const sheets = this.getSheetNames(workbook);\r\n const currentSheet = this.getFirstSheet(sheets);\r\n const styledData = this.parseSheetData(workbook, currentSheet);\r\n const tableData = this.convertToLegacyFormat(styledData);\r\n const hasStyling = this.hasWorkbookStyling(workbook);\r\n\r\n return {\r\n sheets,\r\n currentSheet,\r\n styledData,\r\n tableData,\r\n hasStyling,\r\n workbook\r\n };\r\n } catch (error) {\r\n console.error('Error parsing Excel data:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates workbook from ArrayBuffer\r\n */\r\n private createWorkbook(data: ArrayBuffer): XLSX.WorkBook {\r\n return XLSX.read(data, {\r\n type: 'array',\r\n cellStyles: true,\r\n cellDates: true,\r\n cellNF: false,\r\n cellHTML: false\r\n });\r\n }\r\n\r\n /**\r\n * Gets sheet names from workbook\r\n */\r\n private getSheetNames(workbook: XLSX.WorkBook): string[] {\r\n return workbook.SheetNames;\r\n }\r\n\r\n /**\r\n * Gets the first sheet name\r\n */\r\n private getFirstSheet(sheets: string[]): string {\r\n return sheets[0] || 'Sheet1';\r\n }\r\n\r\n /**\r\n * Parses sheet data with styling\r\n */\r\n parseSheetData(workbook: XLSX.WorkBook, sheetName: string): ExcelRowData[] {\r\n try {\r\n const worksheet = this.getWorksheet(workbook, sheetName);\r\n if (!worksheet) {\r\n return this.createNoDataRow();\r\n }\r\n\r\n const range = this.getWorksheetRange(worksheet);\r\n return this.processWorksheetRows(worksheet, range);\r\n } catch (error) {\r\n console.error('Error parsing sheet data:', error);\r\n return this.createErrorRow();\r\n }\r\n }\r\n\r\n /**\r\n * Gets worksheet from workbook\r\n */\r\n private getWorksheet(workbook: XLSX.WorkBook, sheetName: string): XLSX.WorkSheet | null {\r\n return workbook.Sheets[sheetName] || null;\r\n }\r\n\r\n /**\r\n * Gets worksheet range\r\n */\r\n private getWorksheetRange(worksheet: XLSX.WorkSheet): XLSX.Range {\r\n return XLSX.utils.decode_range(worksheet['!ref'] || 'A1');\r\n }\r\n\r\n /**\r\n * Processes worksheet rows\r\n */\r\n private processWorksheetRows(worksheet: XLSX.WorkSheet, range: XLSX.Range): ExcelRowData[] {\r\n const styledData: ExcelRowData[] = [];\r\n\r\n for (let row = range.s.r; row <= range.e.r; row++) {\r\n const rowData = this.processRow(worksheet, range, row);\r\n if (this.hasRowContent(rowData)) {\r\n styledData.push(rowData);\r\n }\r\n }\r\n\r\n return styledData;\r\n }\r\n\r\n /**\r\n * Processes a single row\r\n */\r\n private processRow(worksheet: XLSX.WorkSheet, range: XLSX.Range, rowIndex: number): ExcelRowData {\r\n const rowData: ExcelRowData = { cells: [] };\r\n\r\n for (let col = range.s.c; col <= range.e.c; col++) {\r\n const cell = this.getCell(worksheet, rowIndex, col);\r\n const cellData = this.createCellData(cell);\r\n rowData.cells.push(cellData);\r\n }\r\n\r\n return rowData;\r\n }\r\n\r\n /**\r\n * Gets cell from worksheet\r\n */\r\n private getCell(worksheet: XLSX.WorkSheet, row: number, col: number): XLSX.CellObject | null {\r\n const cellAddress = XLSX.utils.encode_cell({ r: row, c: col });\r\n return worksheet[cellAddress] || null;\r\n }\r\n\r\n /**\r\n * Creates cell data with styling\r\n */\r\n private createCellData(cell: XLSX.CellObject | null): ExcelCellData {\r\n if (!cell) {\r\n return { value: SHARED.EMPTY };\r\n }\r\n\r\n return {\r\n value: cell.v || SHARED.EMPTY,\r\n style: this.extractCellStyle(cell)\r\n };\r\n }\r\n\r\n /**\r\n * Checks if row has content\r\n */\r\n private hasRowContent(rowData: ExcelRowData): boolean {\r\n return rowData.cells.some(cell => cell.value !== SHARED.EMPTY);\r\n }\r\n\r\n /**\r\n * Creates no data row\r\n */\r\n private createNoDataRow(): ExcelRowData[] {\r\n return [{ cells: [{ value: SHARED.NO_DATA_FOUND }] }];\r\n }\r\n\r\n /**\r\n * Creates error row\r\n */\r\n private createErrorRow(): ExcelRowData[] {\r\n return [{ cells: [{ value: SHARED.ERROR_PARSING_SHEET_DATA }] }];\r\n }\r\n\r\n /**\r\n * Extracts styling from cell\r\n */\r\n extractCellStyle(cell: XLSX.CellObject): ExcelCellStyle | undefined {\r\n if (!cell.s) return undefined;\r\n\r\n const style: ExcelCellStyle = {};\r\n \r\n this.extractBackgroundColor(cell.s, style);\r\n this.extractFontColor(cell.s, style);\r\n this.extractFontFormatting(cell.s, style);\r\n this.extractBorders(cell.s, style);\r\n\r\n return Object.keys(style).length > 0 ? style : undefined;\r\n }\r\n\r\n /**\r\n * Extracts background color\r\n */\r\n private extractBackgroundColor(cellStyle: any, style: ExcelCellStyle): void {\r\n if (cellStyle.fgColor) {\r\n console.log('Found fgColor:', cellStyle.fgColor);\r\n style.backgroundColor = this.getColorValue(cellStyle.fgColor);\r\n if (style.backgroundColor) {\r\n console.log('Extracted background color from fgColor:', style.backgroundColor);\r\n }\r\n }\r\n\r\n if (!style.backgroundColor && cellStyle.bgColor) {\r\n console.log('Found bgColor:', cellStyle.bgColor);\r\n style.backgroundColor = this.getColorValue(cellStyle.bgColor);\r\n if (style.backgroundColor) {\r\n console.log('Extracted background color from bgColor:', style.backgroundColor);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Extracts font color\r\n */\r\n private extractFontColor(cellStyle: any, style: ExcelCellStyle): void {\r\n if (cellStyle.font?.color) {\r\n console.log('Found font color:', cellStyle.font.color);\r\n style.fontColor = this.getColorValue(cellStyle.font.color);\r\n if (style.fontColor) {\r\n console.log('Extracted font color:', style.fontColor);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Extracts font formatting\r\n */\r\n private extractFontFormatting(cellStyle: any, style: ExcelCellStyle): void {\r\n if (cellStyle.font?.bold) {\r\n style.bold = true;\r\n }\r\n if (cellStyle.font?.italic) {\r\n style.italic = true;\r\n }\r\n }\r\n\r\n /**\r\n * Extracts borders\r\n */\r\n private extractBorders(cellStyle: any, style: ExcelCellStyle): void {\r\n if (!cellStyle.border) return;\r\n\r\n style.border = {};\r\n const borders = ['top', 'bottom', 'left', 'right'] as const;\r\n \r\n borders.forEach(side => {\r\n const border = cellStyle.border[side];\r\n if (border?.color) {\r\n style.border![side] = this.getColorValue(border.color);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets color value from color object\r\n */\r\n private getColorValue(colorObj: any): string | undefined {\r\n \r\n if (colorObj.rgb) {\r\n const result = this.rgbToHex(colorObj.rgb);\r\n return result;\r\n }\r\n if (colorObj.theme !== undefined) {\r\n const result = this.extractThemeColor(colorObj.theme);\r\n return result;\r\n }\r\n if (colorObj.indexed !== undefined) {\r\n const result = this.extractIndexedColor(colorObj.indexed);\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Converts RGB to hex\r\n */\r\n private rgbToHex(rgb: string): string {\r\n if (!rgb) return SHARED.EMPTY;\r\n\r\n if (rgb.length === 8) {\r\n // Excel RGB format: AARRGGBB (Alpha, Red, Green, Blue)\r\n const red = parseInt(rgb.substring(2, 4), 16);\r\n const green = parseInt(rgb.substring(4, 6), 16);\r\n const blue = parseInt(rgb.substring(6, 8), 16);\r\n return `#${red.toString(16).padStart(2, '0')}${green.toString(16).padStart(2, '0')}${blue.toString(16).padStart(2, '0')}`;\r\n } else if (rgb.length === 6) {\r\n // Standard hex format: RRGGBB\r\n return `#${rgb}`;\r\n }\r\n\r\n return SHARED.EMPTY;\r\n }\r\n\r\n /**\r\n * Extracts theme color dynamically from Excel\r\n */\r\n private extractThemeColor(theme: number): string {\r\n const baseThemeColors: { [key: number]: string } = {\r\n 0: '#000000', // Black\r\n 1: '#FFFFFF', // White\r\n 2: '#FF0000', // Red\r\n 3: '#00FF00', // Green\r\n 4: '#0000FF', // Blue\r\n 5: '#FFFF00', // Yellow\r\n 6: '#FF00FF', // Magenta\r\n 7: '#00FFFF', // Cyan\r\n };\r\n \r\n return baseThemeColors[theme] || this.generateThemeColor(theme);\r\n }\r\n\r\n /**\r\n * Generates a theme color based on index (fallback)\r\n */\r\n private generateThemeColor(theme: number): string {\r\n // Generate a color based on the theme index\r\n // This is a fallback when we don't have the actual theme colors\r\n const hue = (theme * 137.508) % 360; // Golden angle approximation\r\n return `hsl(${hue}, 70%, 50%)`;\r\n }\r\n\r\n /**\r\n * Extracts indexed color dynamically from Excel\r\n */\r\n private extractIndexedColor(indexed: number): string {\r\n // Instead of hardcoded colors, we'll try to extract the actual color\r\n // from the Excel file's color palette\r\n if (this.workbookColors && this.workbookColors[indexed]) {\r\n return this.rgbToHex(this.workbookColors[indexed]);\r\n }\r\n \r\n // Fallback to a generated color if we don't have the palette\r\n return this.generateIndexedColor(indexed);\r\n }\r\n\r\n /**\r\n * Generates an indexed color based on index (fallback)\r\n */\r\n private generateIndexedColor(indexed: number): string {\r\n // Generate a color based on the indexed number\r\n // This ensures we always have a unique color for each index\r\n const hue = (indexed * 25) % 360;\r\n const saturation = 60 + (indexed % 20);\r\n const lightness = 40 + (indexed % 30);\r\n return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\r\n }\r\n\r\n /**\r\n * Extracts color palette from Excel workbook\r\n */\r\n private extractWorkbookColors(workbook: XLSX.WorkBook): void {\r\n this.workbookColors = {};\r\n \r\n // Try to extract colors from the workbook's color palette\r\n const workbookProps = workbook.Workbook as any;\r\n if (workbookProps && workbookProps.Colors) {\r\n const colors = workbookProps.Colors;\r\n if (colors.IndexedColors) {\r\n colors.IndexedColors.forEach((color: any, index: number) => {\r\n if (color.rgb) {\r\n this.workbookColors[index] = color.rgb;\r\n }\r\n });\r\n }\r\n }\r\n \r\n // Also try to extract from theme\r\n if (workbookProps && workbookProps.Theme) {\r\n const theme = workbookProps.Theme;\r\n if (theme.ThemeElements && theme.ThemeElements.ClrScheme) {\r\n const clrScheme = theme.ThemeElements.ClrScheme;\r\n // Extract theme colors if available\r\n Object.keys(clrScheme).forEach((key, index) => {\r\n const color = clrScheme[key];\r\n if (color && color.SrgbClr) {\r\n this.workbookColors[index] = color.SrgbClr.val;\r\n }\r\n });\r\n }\r\n }\r\n \r\n console.log('Extracted workbook colors:', this.workbookColors);\r\n }\r\n\r\n /**\r\n * Checks if workbook has styling\r\n */\r\n hasWorkbookStyling(workbook: XLSX.WorkBook): boolean {\r\n for (const sheetName of workbook.SheetNames) {\r\n const worksheet = workbook.Sheets[sheetName];\r\n if (worksheet && this.hasWorksheetStyling(worksheet)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if worksheet has styling\r\n */\r\n private hasWorksheetStyling(worksheet: XLSX.WorkSheet): boolean {\r\n for (const cellAddress in worksheet) {\r\n if (cellAddress.startsWith('!')) continue;\r\n const cell = worksheet[cellAddress];\r\n if (cell?.s) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Converts styled data to legacy format\r\n */\r\n convertToLegacyFormat(styledData: ExcelRowData[]): any[][] {\r\n return styledData.map(row => row.cells.map(cell => cell.value));\r\n }\r\n\r\n /**\r\n * Ensures data consistency\r\n */\r\n ensureDataConsistency(styledData: ExcelRowData[]): ExcelRowData[] {\r\n if (styledData.length === 0) {\r\n return [{ cells: [{ value: 'No data found' }] }];\r\n }\r\n\r\n const maxColumns = Math.max(...styledData.map(row => row.cells.length));\r\n const minColumns = Math.max(maxColumns, 3);\r\n\r\n return styledData.map(row => {\r\n const normalizedRow: ExcelRowData = { cells: [...row.cells] };\r\n while (normalizedRow.cells.length < minColumns) {\r\n normalizedRow.cells.push({ value: SHARED.EMPTY });\r\n }\r\n return normalizedRow;\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SHARED } from '../../../Shared/constant/SHARED';\r\n\r\nexport interface CsvRowData {\r\n cells: Array<{\r\n value: string;\r\n isHeader?: boolean;\r\n style?: any;\r\n }>;\r\n}\r\n\r\nexport interface ParsedCsvData {\r\n headers: string[];\r\n rows: string[][];\r\n styledData: CsvRowData[];\r\n totalRows: number;\r\n totalColumns: number;\r\n hasHeaders: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CsvParserService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Parses CSV data from a string\r\n * @param csvContent - The CSV content as a string\r\n * @param options - Parsing options\r\n * @returns Parsed CSV data\r\n */\r\n parseCsvData(csvContent: string, options: {\r\n delimiter?: string;\r\n hasHeaders?: boolean;\r\n maxRows?: number;\r\n } = {}): ParsedCsvData {\r\n const {\r\n delimiter = ',',\r\n hasHeaders = true,\r\n maxRows = 1000\r\n } = options;\r\n\r\n try {\r\n // Split content into lines and filter out empty lines\r\n const lines = csvContent\r\n .split('\\n')\r\n .map(line => line.trim())\r\n .filter(line => line.length > 0);\r\n\r\n if (lines.length === 0) {\r\n return this.createEmptyCsvData();\r\n }\r\n\r\n // Parse each line\r\n const parsedRows: string[][] = [];\r\n let headers: string[] = [];\r\n\r\n lines.forEach((line, index) => {\r\n if (index >= maxRows) return;\r\n\r\n const row = this.parseCsvLine(line, delimiter);\r\n if (row.length > 0) {\r\n parsedRows.push(row);\r\n }\r\n });\r\n\r\n // Extract headers if specified\r\n if (hasHeaders && parsedRows.length > 0) {\r\n headers = parsedRows[0];\r\n parsedRows.splice(0, 1); // Remove header row from data\r\n } else if (parsedRows.length > 0) {\r\n // Generate default headers if none provided\r\n headers = parsedRows[0].map((_, index) => `Column ${index + 1}`);\r\n }\r\n\r\n // Create styled data for display\r\n const styledData = this.createStyledData(headers, parsedRows, hasHeaders);\r\n\r\n return {\r\n headers,\r\n rows: parsedRows,\r\n styledData,\r\n totalRows: parsedRows.length,\r\n totalColumns: headers.length,\r\n hasHeaders\r\n };\r\n\r\n } catch (error) {\r\n console.error('Error parsing CSV data:', error);\r\n return this.createEmptyCsvData();\r\n }\r\n }\r\n\r\n /**\r\n * Parses a single CSV line with proper handling of quoted fields\r\n * @param line - Single CSV line\r\n * @param delimiter - Field delimiter\r\n * @returns Array of field values\r\n */\r\n private parseCsvLine(line: string, delimiter: string): string[] {\r\n const result: string[] = [];\r\n let current = '';\r\n let inQuotes = false;\r\n let i = 0;\r\n\r\n while (i < line.length) {\r\n const char = line[i];\r\n\r\n if (char === '\"') {\r\n if (inQuotes && line[i + 1] === '\"') {\r\n // Escaped quote\r\n current += '\"';\r\n i += 2;\r\n } else {\r\n // Toggle quote state\r\n inQuotes = !inQuotes;\r\n i++;\r\n }\r\n } else if (char === delimiter && !inQuotes) {\r\n // End of field\r\n result.push(current.trim());\r\n current = '';\r\n i++;\r\n } else {\r\n current += char;\r\n i++;\r\n }\r\n }\r\n\r\n // Add the last field\r\n result.push(current.trim());\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates styled data for display in tables\r\n * @param headers - Column headers\r\n * @param rows - Data rows\r\n * @param hasHeaders - Whether the data has headers\r\n * @returns Styled data array\r\n */\r\n private createStyledData(headers: string[], rows: string[][], hasHeaders: boolean): CsvRowData[] {\r\n const styledData: CsvRowData[] = [];\r\n\r\n // Add header row if headers exist\r\n if (hasHeaders && headers.length > 0) {\r\n styledData.push({\r\n cells: headers.map(header => ({\r\n value: header,\r\n isHeader: true,\r\n style: { fontWeight: 'bold', backgroundColor: '#f8f9fa' }\r\n }))\r\n });\r\n }\r\n\r\n // Add data rows\r\n rows.forEach(row => {\r\n styledData.push({\r\n cells: row.map((cell, index) => ({\r\n value: cell || '',\r\n isHeader: false,\r\n style: {}\r\n }))\r\n });\r\n });\r\n\r\n return styledData;\r\n }\r\n\r\n /**\r\n * Creates empty CSV data structure\r\n * @returns Empty CSV data\r\n */\r\n private createEmptyCsvData(): ParsedCsvData {\r\n return {\r\n headers: [],\r\n rows: [],\r\n styledData: [],\r\n totalRows: 0,\r\n totalColumns: 0,\r\n hasHeaders: false\r\n };\r\n }\r\n\r\n /**\r\n * Validates CSV content\r\n * @param csvContent - CSV content to validate\r\n * @returns Validation result\r\n */\r\n validateCsvContent(csvContent: string): { isValid: boolean; errors: string[] } {\r\n const errors: string[] = [];\r\n\r\n if (!csvContent || csvContent.trim().length === 0) {\r\n errors.push('CSV content is empty');\r\n return { isValid: false, errors };\r\n }\r\n\r\n const lines = csvContent.split('\\n').filter(line => line.trim().length > 0);\r\n \r\n if (lines.length === 0) {\r\n errors.push('No valid lines found in CSV');\r\n return { isValid: false, errors };\r\n }\r\n\r\n // Check for consistent column count\r\n const columnCounts = lines.map(line => this.countColumns(line));\r\n const firstColumnCount = columnCounts[0];\r\n \r\n for (let i = 1; i < columnCounts.length; i++) {\r\n if (columnCounts[i] !== firstColumnCount) {\r\n errors.push(`Line ${i + 1} has ${columnCounts[i]} columns, expected ${firstColumnCount}`);\r\n }\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors\r\n };\r\n }\r\n\r\n /**\r\n * Counts columns in a CSV line\r\n * @param line - CSV line\r\n * @returns Number of columns\r\n */\r\n private countColumns(line: string): number {\r\n let count = 0;\r\n let inQuotes = false;\r\n let i = 0;\r\n\r\n while (i < line.length) {\r\n const char = line[i];\r\n\r\n if (char === '\"') {\r\n if (inQuotes && line[i + 1] === '\"') {\r\n i += 2;\r\n } else {\r\n inQuotes = !inQuotes;\r\n i++;\r\n }\r\n } else if (char === ',' && !inQuotes) {\r\n count++;\r\n i++;\r\n } else {\r\n i++;\r\n }\r\n }\r\n\r\n return count + 1; // +1 because we count delimiters, not fields\r\n }\r\n\r\n /**\r\n * Exports data to CSV format\r\n * @param data - Data to export\r\n * @param headers - Column headers\r\n * @param delimiter - Field delimiter\r\n * @returns CSV string\r\n */\r\n exportToCsv(data: string[][], headers: string[], delimiter: string = ','): string {\r\n const csvLines: string[] = [];\r\n\r\n // Add headers if provided\r\n if (headers && headers.length > 0) {\r\n csvLines.push(this.escapeCsvField(headers.join(delimiter)));\r\n }\r\n\r\n // Add data rows\r\n data.forEach(row => {\r\n const escapedRow = row.map(field => this.escapeCsvField(field));\r\n csvLines.push(escapedRow.join(delimiter));\r\n });\r\n\r\n return csvLines.join('\\n');\r\n }\r\n\r\n /**\r\n * Escapes a CSV field value\r\n * @param field - Field value to escape\r\n * @returns Escaped field value\r\n */\r\n private escapeCsvField(field: string): string {\r\n if (field.includes(',') || field.includes('\"') || field.includes('\\n') || field.includes('\\r')) {\r\n return `\"${field.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return field;\r\n }\r\n\r\n /**\r\n * Gets CSV preview (first few rows)\r\n * @param csvContent - Full CSV content\r\n * @param maxRows - Maximum number of rows to preview\r\n * @returns Preview data\r\n */\r\n getCsvPreview(csvContent: string, maxRows: number = 10): ParsedCsvData {\r\n const lines = csvContent.split('\\n').filter(line => line.trim().length > 0);\r\n const previewContent = lines.slice(0, maxRows + 1).join('\\n'); // +1 for header\r\n \r\n return this.parseCsvData(previewContent, { maxRows });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nexport interface ZoomConfig {\r\n defaultZoom: number;\r\n zoomStep: number;\r\n minZoom: number;\r\n maxZoom: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentZoomService {\r\n private readonly DEFAULT_CONFIG: ZoomConfig = {\r\n defaultZoom: 100,\r\n zoomStep: 25,\r\n minZoom: 25,\r\n maxZoom: 400\r\n };\r\n\r\n private zoomLevelSubject = new BehaviorSubject<number>(this.DEFAULT_CONFIG.defaultZoom);\r\n private config: ZoomConfig = { ...this.DEFAULT_CONFIG };\r\n\r\n /**\r\n * Gets the current zoom level as an observable\r\n */\r\n get zoomLevel$(): Observable<number> {\r\n return this.zoomLevelSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Gets the current zoom level value\r\n */\r\n get currentZoom(): number {\r\n return this.zoomLevelSubject.value;\r\n }\r\n\r\n /**\r\n * Gets the current zoom configuration\r\n */\r\n get zoomConfig(): ZoomConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Sets custom zoom configuration\r\n */\r\n setZoomConfig(config: Partial<ZoomConfig>): void {\r\n this.config = { ...this.DEFAULT_CONFIG, ...config };\r\n this.setZoom(this.config.defaultZoom);\r\n }\r\n\r\n /**\r\n * Zooms in by the configured step\r\n */\r\n zoomIn(): void {\r\n const newZoom = Math.min(\r\n this.currentZoom + this.config.zoomStep,\r\n this.config.maxZoom\r\n );\r\n this.setZoom(newZoom);\r\n }\r\n\r\n /**\r\n * Zooms out by the configured step\r\n */\r\n zoomOut(): void {\r\n const newZoom = Math.max(\r\n this.currentZoom - this.config.zoomStep,\r\n this.config.minZoom\r\n );\r\n this.setZoom(newZoom);\r\n }\r\n\r\n /**\r\n * Sets zoom to a specific level\r\n */\r\n setZoom(zoom: number): void {\r\n const clampedZoom = Math.max(\r\n this.config.minZoom,\r\n Math.min(zoom, this.config.maxZoom)\r\n );\r\n this.zoomLevelSubject.next(clampedZoom);\r\n }\r\n\r\n /**\r\n * Resets zoom to default level\r\n */\r\n resetZoom(): void {\r\n this.setZoom(this.config.defaultZoom);\r\n }\r\n\r\n /**\r\n * Handles mouse wheel zoom\r\n */\r\n handleWheelZoom(event: WheelEvent, zoomFactor: number = 0.1): void {\r\n event.preventDefault();\r\n // Only use deltaY for zoom (vertical wheel movement)\r\n const delta = event.deltaY > 0 ? -1 : 1;\r\n const zoomStep = this.config.zoomStep * zoomFactor;\r\n const newZoom = this.currentZoom + (delta * zoomStep);\r\n this.setZoom(newZoom);\r\n }\r\n\r\n /**\r\n * Applies zoom transform to an iframe element\r\n * @param iframe - The iframe element to apply zoom to\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoom(iframe: HTMLIFrameElement, zoomLevel?: number): void {\r\n const zoom = zoomLevel ?? this.currentZoom;\r\n const zoomScale = zoom / 100;\r\n\r\n if (zoom === 100) {\r\n iframe.style.transform = 'none';\r\n iframe.style.width = '100%';\r\n iframe.style.height = '100%';\r\n } else {\r\n iframe.style.transform = `scale(${zoomScale})`;\r\n iframe.style.transformOrigin = 'top left';\r\n iframe.style.width = `${100 / zoomScale}%`;\r\n iframe.style.height = `${100 / zoomScale}%`;\r\n }\r\n }\r\n\r\n /**\r\n * Applies zoom transform to multiple iframe elements\r\n * @param iframes - Array of iframe elements to apply zoom to\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomToMultiple(iframes: HTMLIFrameElement[], zoomLevel?: number): void {\r\n iframes.forEach(iframe => this.applyIframeZoom(iframe, zoomLevel));\r\n }\r\n\r\n /**\r\n * Applies zoom transform to iframes within a container element\r\n * @param container - The container element to search for iframes\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomToContainer(container: HTMLElement, zoomLevel?: number): void {\r\n const iframes = container.querySelectorAll('iframe') as NodeListOf<HTMLIFrameElement>;\r\n this.applyIframeZoomToMultiple(Array.from(iframes), zoomLevel);\r\n }\r\n\r\n /**\r\n * Applies zoom transform to iframes within multiple container elements\r\n * @param containers - Array of container elements to search for iframes\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomToContainers(containers: HTMLElement[], zoomLevel?: number): void {\r\n containers.forEach(container => this.applyIframeZoomToContainer(container, zoomLevel));\r\n }\r\n\r\n /**\r\n * Applies zoom transform to iframes by CSS selector\r\n * @param selector - CSS selector to find iframe containers\r\n * @param zoomLevel - The zoom level to apply (defaults to current zoom)\r\n */\r\n applyIframeZoomBySelector(selector: string, zoomLevel?: number): void {\r\n const containers = document.querySelectorAll(selector) as NodeListOf<HTMLElement>;\r\n this.applyIframeZoomToContainers(Array.from(containers), zoomLevel);\r\n }\r\n}\r\n","import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { DocumentZoomService } from '../../services/document-zoom.service';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\nimport { Subscription } from 'rxjs';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { ERRORS } from '../../../../Shared/constant/ERROR';\r\n\r\n@Component({\r\n selector: 'document-zoom-controls',\r\n templateUrl: './document-zoom-controls.component.html',\r\n styleUrls: ['./document-zoom-controls.component.scss'],\r\n standalone:false\r\n})\r\nexport class DocumentZoomControlsComponent implements OnInit, OnDestroy {\r\n @Input() selectedDocument?: DocumentListItem;\r\n @Input() contextId?: string = SHARED.EMPTY;\r\n @Input() isFormHide: boolean = false;\r\n @Output() documentNameUpdated = new EventEmitter<void>();\r\n\r\n currentZoom: number = 100;\r\n private subscription: Subscription = new Subscription();\r\n\r\n // Document name editing properties\r\n isEditingDocumentName: boolean = false;\r\n documentName: string = SHARED.EMPTY;\r\n fileNameError: string = SHARED.EMPTY;\r\n disallowedCharsRegex: RegExp = /[<>:\"\\/\\\\|?*]/;\r\n\r\n constructor(\r\n private zoomService: DocumentZoomService,\r\n private documentHttpService: DocumentHttpService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.subscription.add(\r\n this.zoomService.zoomLevel$.subscribe(zoom => {\r\n this.currentZoom = zoom;\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n get isZoomOutDisabled(): boolean {\r\n return this.currentZoom <= this.zoomService.zoomConfig.minZoom;\r\n }\r\n\r\n get isZoomInDisabled(): boolean {\r\n return this.currentZoom >= this.zoomService.zoomConfig.maxZoom;\r\n }\r\n\r\n zoomIn(): void {\r\n this.zoomService.zoomIn();\r\n }\r\n\r\n zoomOut(): void {\r\n this.zoomService.zoomOut();\r\n }\r\n\r\n resetZoom(): void {\r\n this.zoomService.resetZoom();\r\n }\r\n\r\n // Document name editing methods\r\n onDocumentNameClick(): void {\r\n // Only allow editing if the document alias is editable\r\n if (!this.selectedDocument?.isAliasEditable) {\r\n return;\r\n }\r\n \r\n this.isEditingDocumentName = true;\r\n if (this.selectedDocument?.aliasName && this.selectedDocument.aliasName.trim() !== SHARED.EMPTY) {\r\n this.documentName = this.selectedDocument.aliasName;\r\n } else if (this.selectedDocument?.docName) {\r\n const lastDotIndex = this.selectedDocument.docName.lastIndexOf('.');\r\n if (lastDotIndex !== -1) {\r\n this.documentName = this.selectedDocument.docName.substring(0, lastDotIndex);\r\n } else {\r\n this.documentName = this.selectedDocument.docName;\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n const inputElement = document.querySelector('.document-name-input') as HTMLInputElement;\r\n if (inputElement) {\r\n inputElement.focus();\r\n inputElement.select();\r\n }\r\n }, 100);\r\n }\r\n\r\n cancelDocumentNameEdit(): void {\r\n this.isEditingDocumentName = false;\r\n this.fileNameError = SHARED.EMPTY;\r\n }\r\n\r\n onDocumentNameChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.documentName = input.value;\r\n if (this.disallowedCharsRegex.test(this.documentName)) {\r\n this.fileNameError = ERRORS.ERROR_FILE_NAME_INVALID_CHARACTERS;\r\n } else if (this.documentName.trim() === SHARED.EMPTY) {\r\n this.fileNameError = ERRORS.ERROR_FILE_NAME_EMPTY;\r\n } else {\r\n this.fileNameError = SHARED.EMPTY;\r\n }\r\n }\r\n\r\n handleSaveClick(): void {\r\n if (!this.selectedDocument?._id) {\r\n return;\r\n }\r\n\r\n let hasChanged = false;\r\n if (this.selectedDocument.aliasName && this.selectedDocument.aliasName.trim() !== SHARED.EMPTY) {\r\n hasChanged = this.documentName !== this.selectedDocument.aliasName;\r\n } else if (this.selectedDocument.docName) {\r\n const docNameWithoutExtension = this.selectedDocument.docName.lastIndexOf(SHARED.DOT) !== -1 \r\n ? this.selectedDocument.docName.substring(0, this.selectedDocument.docName.lastIndexOf(SHARED.DOT))\r\n : this.selectedDocument.docName;\r\n hasChanged = this.documentName !== docNameWithoutExtension;\r\n }\r\n \r\n if (hasChanged && !this.fileNameError) {\r\n const payload = { aliasName: this.documentName };\r\n this.documentHttpService.updateDocumentName(this.selectedDocument._id, payload)\r\n .subscribe({\r\n next: (res: any) => {\r\n if (res && res.aliasName) {\r\n this.selectedDocument!.aliasName = res.aliasName;\r\n } else {\r\n this.selectedDocument!.aliasName = this.documentName;\r\n }\r\n this.isEditingDocumentName = false;\r\n this.fileNameError = SHARED.EMPTY;\r\n this.documentNameUpdated.emit();\r\n },\r\n error: (error: any) => {\r\n this.fileNameError = error.message;\r\n }\r\n });\r\n } else {\r\n this.isEditingDocumentName = false;\r\n this.fileNameError = SHARED.EMPTY;\r\n }\r\n }\r\n}\r\n","<div class=\"control-container\">\r\n <div class=\"inline-flex align-items-center justify-content-center gap-2\">\r\n <!-- Document name display with hover edit icon -->\r\n <div *ngIf=\"!isEditingDocumentName\" class=\"document-name-display\" \r\n [class.clickable-doc-name]=\"selectedDocument?.isAliasEditable\" \r\n [class.non-clickable-doc-name]=\"!selectedDocument?.isAliasEditable\"\r\n (click)=\"selectedDocument?.isAliasEditable ? onDocumentNameClick() : null\"\r\n [title]=\"selectedDocument?.isAliasEditable ? 'Click to edit document name' : 'Document name is not editable'\">\r\n <div class=\"alias-name\">\r\n {{ selectedDocument?.aliasName || selectedDocument?.docName }}\r\n <i *ngIf=\"selectedDocument?.isAliasEditable && !isFormHide\" class=\"pi pi-pencil edit-icon-small\"></i> \r\n </div>\r\n <!-- Subline: show `ownerName documentTypeName` (falls back to just type if no owner) -->\r\n <div class=\"document-name\">\r\n <ng-container [ngTemplateOutlet]=\"ownerTypeDisplay\"></ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isEditingDocumentName\" class=\"document-edit-container\">\r\n <input #fileInput type=\"text\" class=\"h-3rem file-input-wrapper document-name-input\" pInputText\r\n [(ngModel)]=\"documentName\" (input)=\"onDocumentNameChange($event)\" (keydown.escape)=\"cancelDocumentNameEdit()\"\r\n (keydown.enter)=\"handleSaveClick()\" (blur)=\"handleSaveClick()\" />\r\n <div class=\"document-name-subline\">\r\n <ng-container [ngTemplateOutlet]=\"ownerTypeDisplay\"></ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"fileNameError\" class=\"error-message-wrapper\">\r\n {{ fileNameError }}\r\n </div>\r\n </div>\r\n <div class=\"zoom-controls\">\r\n <p-button type=\"button\" icon=\"pi pi-minus\" [rounded]=\"true\" severity=\"secondary\" [outlined]=\"true\" (click)=\"zoomOut()\" [disabled]=\"isZoomOutDisabled\" title=\"Zoom Out\">\r\n </p-button>\r\n <p-button type=\"button\" icon=\"pi pi-plus\" [rounded]=\"true\" severity=\"secondary\" [outlined]=\"true\" (click)=\"zoomIn()\" [disabled]=\"isZoomInDisabled\" title=\"Zoom In\">\r\n </p-button>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Shared template for displaying Owner + Type -->\r\n<ng-template #ownerTypeDisplay>\r\n <ng-container *ngIf=\"((selectedDocument?.ownerName || '').trim()).length > 0; else onlyTypeTpl\">\r\n {{ selectedDocument?.ownerName }}<ng-container *ngIf=\"selectedDocument?.documentTypeName\"> {{ selectedDocument?.documentTypeName }}</ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #onlyTypeTpl>\r\n {{ selectedDocument?.documentTypeName }}\r\n\r\n","import {\r\n Component,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n} from '@angular/core';\r\nimport { OPEN_DOCUMENT_EXTENSIONS, SHARED, SUPPORTED_IMAGE_TYPES } from '../../../../Shared/constant/SHARED';\r\nimport { ExcelParserService, ExcelRowData, ParsedExcelData } from '../../services/excel-parser.service';\r\nimport { CsvParserService, CsvRowData, ParsedCsvData } from '../../services/csv-parser.service';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentZoomService } from '../../services/document-zoom.service';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\n\r\n/**\r\n * Component for viewing different types of document content.\r\n * Supports PDF, images, and other document formats.\r\n * @class DocumentContentViewerComponent\r\n * @typedef {DocumentContentViewerComponent}\r\n */\r\n@Component({\r\n selector: 'document-content-viewer',\r\n templateUrl: './document-content-viewer.component.html',\r\n standalone: false,\r\n styleUrl: './document-content-viewer.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class DocumentContentViewerComponent implements OnChanges, OnInit, OnDestroy {\r\n /**\r\n * The document URL to display\r\n * @type {string}\r\n */\r\n @Input() documentUrl?: string;\r\n\r\n /**\r\n * The content type of the document\r\n * @type {string}\r\n */\r\n @Input() contentType?: string;\r\n\r\n /**\r\n * The document name for display purposes\r\n * @type {string}\r\n */\r\n @Input() documentName?: string;\r\n\r\n /**\r\n * The selected document for display purposes\r\n * @type {DocumentListItem}\r\n */\r\n @Input() selectedDocument?: DocumentListItem;\r\n\r\n /**\r\n * The context ID for the document\r\n * @type {string}\r\n */\r\n @Input() contextId?: string;\r\n\r\n /**\r\n * Flag to hide form elements\r\n * @type {boolean}\r\n */\r\n @Input() isFormHide: boolean = false;\r\n /**\r\n * Excel data for display\r\n * @type {any}\r\n */\r\n excelData: any = null;\r\n\r\n /**\r\n * Parsed Excel data as table rows\r\n * @type {any[][]}\r\n */\r\n excelTableData: any[][] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Enhanced Excel data with styling information\r\n * @type {ExcelRowData[]}\r\n */\r\n excelStyledData: ExcelRowData[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Excel sheet names\r\n * @type {string[]}\r\n */\r\n excelSheets: string[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Current active sheet\r\n * @type {string}\r\n */\r\n currentSheet: string = SHARED.EMPTY;\r\n\r\n /**\r\n * Loading state for Excel files\r\n * @type {boolean}\r\n */\r\n isLoadingExcel: boolean = false;\r\n\r\n /**\r\n * Error state for Excel files\r\n * @type {string | null}\r\n */\r\n excelError: string | null = null;\r\n\r\n /**\r\n * Loading state specifically for Word documents\r\n * @type {boolean}\r\n */\r\n isLoadingWordDocument: boolean = false;\r\n\r\n /**\r\n * CSV data for display\r\n * @type {any}\r\n */\r\n csvData: any = null;\r\n\r\n /**\r\n * Parsed CSV data as table rows\r\n * @type {any[][]}\r\n */\r\n csvTableData: any[][] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Enhanced CSV data with styling information\r\n * @type {CsvRowData[]}\r\n */\r\n csvStyledData: CsvRowData[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Loading state for CSV files\r\n * @type {boolean}\r\n */\r\n isLoadingCsv: boolean = false;\r\n\r\n /**\r\n * Error state for CSV files\r\n * @type {string | null}\r\n */\r\n csvError: string | null = null;\r\n\r\n /**\r\n * Current zoom level for the document\r\n * @type {number}\r\n */\r\n currentZoom: number = 100;\r\n\r\n /**\r\n * Loading state for Email files\r\n * @type {boolean}\r\n */\r\n isLoadingEmail: boolean = false;\r\n\r\n /**\r\n * Error state for Email files\r\n * @type {string | null}\r\n */\r\n emailError: string | null = null;\r\n\r\n /**\r\n * PDF URL for converted email\r\n * @type {string | null}\r\n */\r\n emailPdfUrl: string | null = null;\r\n\r\n\r\n\r\n /**\r\n * Constructor\r\n * @param {ExcelParserService} excelParserService - Service for parsing Excel files\r\n * @param {CsvParserService} csvParserService - Service for parsing CSV files\r\n * @param {DocumentHttpService} documentHttpService - Service for making HTTP requests for Excel/CSV files\r\n * @param {DocumentZoomService} zoomService - Service for handling zoom functionality\r\n * @param {DomSanitizer} sanitizer - Service for sanitizing HTML content\r\n */\r\n constructor(\r\n private excelParserService: ExcelParserService,\r\n private csvParserService: CsvParserService,\r\n private documentHttpService: DocumentHttpService,\r\n private zoomService: DocumentZoomService,\r\n private sanitizer: DomSanitizer\r\n ) { }\r\n\r\n /**\r\n * Computed property to determine if the document is a PDF\r\n * @type {boolean}\r\n */\r\n get isPdf(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.PDF || ext === SHARED.PDF2;\r\n }\r\n\r\n\r\n /**\r\n * Computed property to determine if the document is an Excel file\r\n * @type {boolean}\r\n */\r\n get isExcel(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.XLSX || ext === SHARED.XLS;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is a Word file\r\n * @type {boolean}\r\n */\r\n get isWord(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.DOCX || ext === SHARED.DOC;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is a CSV file\r\n * @type {boolean}\r\n */\r\n get isCsv(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return ext === SHARED.CSV;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is an email file\r\n * @type {boolean}\r\n */\r\n get isEmail(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return this.contentType === SHARED.EMAIL_RFC822_MIME_TYPE ||\r\n this.contentType === SHARED.EMAIL_OUTLOOK_MIME_TYPE ||\r\n ext === SHARED.EML ||\r\n ext === SHARED.MSG;\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document is an OpenDocument file\r\n * @type {boolean}\r\n */\r\n get isOpenDocument(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return OPEN_DOCUMENT_EXTENSIONS.includes(ext);\r\n }\r\n\r\n /**\r\n * Computed property to determine if the document has an unsupported content type\r\n * @type {boolean}\r\n */\r\n get isUnsupported(): boolean {\r\n return !this.isImage && !this.isPdf && !this.isExcel && !this.isWord &&\r\n !this.isCsv && !this.isEmail && !this.isOpenDocument;\r\n }\r\n\r\n /**\r\n * Computed property to get the appropriate icon for the document type\r\n * @type {string}\r\n */\r\n get documentIcon(): string {\r\n if (this.isPdf) return SHARED.ICON_FILE_PDF;\r\n if (this.isImage) return SHARED.ICON_IMAGE;\r\n if (this.isExcel) return SHARED.ICON_FILE_EXCEL;\r\n if (this.isWord) return SHARED.ICON_FILE_WORD;\r\n if (this.isCsv) return SHARED.ICON_FILE;\r\n if (this.isEmail) return SHARED.ICON_ENVELOPE;\r\n if (this.isOpenDocument) return SHARED.ICON_FILE;\r\n return SHARED.ICON_FILE;\r\n }\r\n\r\n /**\r\n * Computed property to get the display text for the document type\r\n * @type {string}\r\n */\r\n get documentTypeText(): string {\r\n if (this.isPdf) return SHARED.PDF_DOCUMENT;\r\n if (this.isImage) return SHARED.IMAGE;\r\n if (this.isExcel) return SHARED.EXCEL_SPREADSHEET;\r\n if (this.isWord) return SHARED.WORD_DOCUMENT;\r\n if (this.isCsv) return SHARED.CSV_FILE;\r\n if (this.isEmail) return SHARED.EMAIL_MESSAGE;\r\n if (this.isOpenDocument) return SHARED.OPEN_DOCUMENT;\r\n return SHARED.DOCUMENT;\r\n }\r\n\r\n /**\r\n * Safely gets the styled Excel data for display\r\n * @type {ExcelRowData[]}\r\n */\r\n get safeExcelStyledData(): ExcelRowData[] {\r\n if (!this.excelStyledData || this.excelStyledData.length === 0) {\r\n return [{ cells: [{ value: SHARED.NO_DATA_AVAILABLE }] }];\r\n }\r\n return this.excelStyledData;\r\n }\r\n\r\n /**\r\n * Safely gets the styled CSV data for display\r\n * @type {CsvRowData[]}\r\n */\r\n get safeCsvStyledData(): CsvRowData[] {\r\n if (!this.isCsvDataValid()) {\r\n return [{\r\n cells: [{\r\n value: SHARED.NO_DATA_AVAILABLE,\r\n isHeader: false,\r\n style: {}\r\n }]\r\n }];\r\n }\r\n\r\n // Ensure each row has the correct structure\r\n return this.csvStyledData.map(row => {\r\n if (!row || !row.cells || !Array.isArray(row.cells)) {\r\n return {\r\n cells: [{\r\n value: SHARED.NO_DATA_AVAILABLE,\r\n isHeader: false,\r\n style: {}\r\n }]\r\n };\r\n }\r\n return row;\r\n });\r\n }\r\n\r\n /**\r\n * Handles changes to input properties\r\n * @param {SimpleChanges} changes - The changes object\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.DOCUMENT_URL] || changes[SHARED.CONTENT_TYPE]) {\r\n if (this.isWord && this.documentUrl) {\r\n this.isLoadingWordDocument = true;\r\n }\r\n\r\n this.loadExcelData();\r\n this.loadCsvData();\r\n this.loadEmailData();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the component\r\n */\r\n ngOnInit(): void {\r\n this.loadExcelData();\r\n this.loadCsvData();\r\n this.loadEmailData();\r\n this.initializeZoom();\r\n }\r\n\r\n /**\r\n * Initializes zoom functionality\r\n */\r\n private initializeZoom(): void {\r\n this.zoomService.zoomLevel$.subscribe(zoom => {\r\n this.currentZoom = zoom;\r\n this.applyZoomTransform();\r\n });\r\n }\r\n\r\n /**\r\n * Handles mouse wheel events for zooming\r\n */\r\n @HostListener('wheel', ['$event'])\r\n onWheel(event: WheelEvent): void {\r\n this.handleWheelZoom(event);\r\n }\r\n /**\r\n * Handles wheel zoom for document viewers\r\n */\r\n handleWheelZoom(event: WheelEvent): void {\r\n const target = event.target as HTMLElement;\r\n const isOverDocumentViewer = target.closest(SHARED.DOC_VIEWER_WRAPPER) ||\r\n target.closest(SHARED.CSV_TABLE_CONTAINER) ||\r\n target.closest(SHARED.DOCX_CONTAINER) ||\r\n target.closest(SHARED.PDF_CONTAINER) ||\r\n target.closest(SHARED.IMAGE_CONTAINER) ||\r\n target.closest(SHARED.WHEEL_CAPTURE_OVERLAY) ||\r\n target.closest(SHARED.DOCUMENT_CONTENT_VIEWER_CONTAINER);\r\n\r\n if (isOverDocumentViewer) {\r\n if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\r\n if (event.ctrlKey || event.metaKey) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.zoomService.handleWheelZoom(event);\r\n }\r\n }\r\n else if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Applies zoom transform to the document viewer\r\n */\r\n private applyZoomTransform(): void {\r\n this.zoomService.applyIframeZoomBySelector(SHARED.EXCEL_ZOOM_WRAPPER);\r\n this.zoomService.applyIframeZoomBySelector(SHARED.DOC_VIEWER_WRAPPER);\r\n const csvContainer = document.querySelector(SHARED.CSV_ZOOM_WRAPPER) as HTMLElement;\r\n if (csvContainer) {\r\n const zoomScale = this.currentZoom / 100;\r\n csvContainer.style.transform = `scale(${zoomScale})`;\r\n }\r\n }\r\n\r\n /**\r\n * Downloads the document\r\n */\r\n downloadDocument(): void {\r\n if (this.documentUrl) {\r\n const link = document.createElement('a');\r\n link.href = this.documentUrl;\r\n link.download = this.documentName || 'document';\r\n link.target = '_blank';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the document in a new tab\r\n */\r\n openInNewTab(): void {\r\n if (this.documentUrl) {\r\n window.open(this.documentUrl, '_blank');\r\n }\r\n }\r\n\r\n /**\r\n * Loads Excel data for display\r\n */\r\n private loadExcelData(): void {\r\n if (this.isExcel && this.documentUrl) {\r\n this.isLoadingExcel = true;\r\n this.excelError = null;\r\n\r\n this.documentHttpService.downloadExcelFile(this.documentUrl)\r\n .subscribe({\r\n next: (data: ArrayBuffer) => {\r\n try {\r\n this.parseExcelData(data);\r\n } catch (error) {\r\n this.excelError = SHARED.ERROR_PARSING_EXCEL_FILE;\r\n }\r\n this.isLoadingExcel = false;\r\n },\r\n error: (error: any) => {\r\n console.log(error);\r\n this.isLoadingExcel = false;\r\n }\r\n });\r\n } else {\r\n this.resetExcelData();\r\n }\r\n }\r\n\r\n /**\r\n * Parses Excel data using the service\r\n * @param {ArrayBuffer} data - Excel file data\r\n */\r\n private parseExcelData(data: ArrayBuffer): void {\r\n const parsedData = this.excelParserService.parseExcelData(data);\r\n\r\n if (parsedData) {\r\n this.excelSheets = parsedData.sheets;\r\n this.currentSheet = parsedData.currentSheet;\r\n this.excelStyledData = parsedData.styledData;\r\n this.excelTableData = parsedData.tableData;\r\n this.excelStyledData = this.excelParserService.ensureDataConsistency(this.excelStyledData);\r\n this.excelTableData = this.excelParserService.convertToLegacyFormat(this.excelStyledData);\r\n\r\n this.excelData = {\r\n type: 'excel',\r\n sheets: this.excelSheets,\r\n currentSheet: this.currentSheet,\r\n tableData: this.excelTableData,\r\n styledData: this.excelStyledData,\r\n workbook: parsedData.workbook,\r\n hasStyling: parsedData.hasStyling\r\n };\r\n } else {\r\n this.excelError = SHARED.ERROR_PARSING_EXCEL_FILE_STRUCTURE;\r\n }\r\n }\r\n\r\n /**\r\n * Changes the active Excel sheet\r\n * @param {string} sheetName - Name of the sheet to activate\r\n */\r\n changeSheet(sheetName: string): void {\r\n this.currentSheet = sheetName;\r\n\r\n if (this.excelData?.workbook) {\r\n this.excelStyledData = this.excelParserService.parseSheetData(this.excelData.workbook, sheetName);\r\n this.excelStyledData = this.excelParserService.ensureDataConsistency(this.excelStyledData);\r\n this.excelTableData = this.excelParserService.convertToLegacyFormat(this.excelStyledData);\r\n }\r\n }\r\n\r\n /**\r\n * Resets Excel data to initial state\r\n */\r\n private resetExcelData(): void {\r\n this.excelData = null;\r\n this.excelTableData = SHARED.EMPTY_ARRAY;\r\n this.excelStyledData = SHARED.EMPTY_ARRAY;\r\n this.excelSheets = SHARED.EMPTY_ARRAY;\r\n this.currentSheet = SHARED.EMPTY;\r\n this.isLoadingExcel = false;\r\n this.excelError = null;\r\n }\r\n\r\n /**\r\n * Loads CSV data for display\r\n */\r\n private loadCsvData(): void {\r\n if (this.isCsv && this.documentUrl) {\r\n this.isLoadingCsv = true;\r\n this.csvError = null;\r\n\r\n this.documentHttpService.downloadCsvFile(this.documentUrl)\r\n .subscribe({\r\n next: (data: string) => {\r\n try {\r\n this.parseCsvData(data);\r\n } catch (error) {\r\n this.csvError = SHARED.ERROR_PARSING_CSV_FILE;\r\n this.resetCsvData();\r\n }\r\n this.isLoadingCsv = false;\r\n },\r\n error: (error: any) => {\r\n this.csvError = SHARED.ERROR_LOADING_CSV_FILE;\r\n this.resetCsvData();\r\n this.isLoadingCsv = false;\r\n }\r\n });\r\n } else {\r\n this.resetCsvData();\r\n }\r\n }\r\n\r\n /**\r\n * Parses CSV data using the service\r\n * @param {string} data - CSV file data\r\n */\r\n private parseCsvData(data: string): void {\r\n try {\r\n const parsedData = this.csvParserService.parseCsvData(data, {\r\n delimiter: SHARED.COMMA,\r\n hasHeaders: true,\r\n maxRows: 1000\r\n });\r\n\r\n if (parsedData && parsedData.styledData && parsedData.styledData.length > 0) {\r\n this.csvStyledData = parsedData.styledData;\r\n this.csvTableData = parsedData.rows;\r\n\r\n this.csvData = {\r\n type: 'csv',\r\n headers: parsedData.headers,\r\n rows: parsedData.rows,\r\n tableData: parsedData.rows,\r\n styledData: parsedData.styledData,\r\n totalRows: parsedData.totalRows,\r\n totalColumns: parsedData.totalColumns,\r\n hasHeaders: parsedData.hasHeaders\r\n };\r\n } else {\r\n this.csvError = SHARED.ERROR_PARSING_CSV_DATA;\r\n this.resetCsvData();\r\n }\r\n } catch (error) {\r\n this.csvError = SHARED.ERROR_PARSING_CSV_FILE;\r\n this.resetCsvData();\r\n }\r\n }\r\n\r\n /**\r\n * Resets CSV data to initial state\r\n */\r\n private resetCsvData(): void {\r\n this.csvData = null;\r\n this.csvTableData = SHARED.EMPTY_ARRAY;\r\n this.csvStyledData = SHARED.EMPTY_ARRAY;\r\n this.isLoadingCsv = false;\r\n this.csvError = null;\r\n }\r\n\r\n /**\r\n * TrackBy function for CSV cells to improve performance\r\n * @param index - Cell index\r\n * @param cell - Cell object\r\n * @returns Unique identifier for the cell\r\n */\r\n trackByCell(index: number, cell: any): any {\r\n return `${index}-${cell.value}`;\r\n }\r\n\r\n /**\r\n * Checks if CSV data is valid and ready for display\r\n * @returns {boolean} True if CSV data is valid\r\n */\r\n private isCsvDataValid(): boolean {\r\n return this.csvStyledData &&\r\n this.csvStyledData.length > 0 &&\r\n this.csvStyledData.every(row => row && row.cells && Array.isArray(row.cells));\r\n }\r\n\r\n private getFileExtension(urlOrName?: string): string {\r\n if (!urlOrName) return SHARED.EMPTY;\r\n const lastDot = urlOrName.lastIndexOf(SHARED.DOT);\r\n if (lastDot === -1) return SHARED.EMPTY;\r\n return urlOrName.substring(lastDot + 1).toLowerCase();\r\n }\r\n\r\n get isImage(): boolean {\r\n const ext = this.getFileExtension(this.documentName);\r\n return SUPPORTED_IMAGE_TYPES.includes(ext);\r\n }\r\n\r\n /**\r\n * Loads Email data for display\r\n * Converts email to PDF and renders it\r\n */\r\n private loadEmailData(): void {\r\n if (this.isEmail && this.documentUrl) {\r\n this.isLoadingEmail = true;\r\n this.emailError = null;\r\n \r\n // Clean up previous blob URL if exists\r\n if (this.emailPdfUrl) {\r\n URL.revokeObjectURL(this.emailPdfUrl);\r\n this.emailPdfUrl = null;\r\n }\r\n\r\n // Call convert-to-pdf API\r\n this.documentHttpService.convertEmailToPdf(this.documentUrl)\r\n .subscribe({\r\n next: (pdfBlob: Blob) => {\r\n // Verify it's a PDF blob\r\n if (pdfBlob.type === 'application/pdf' || pdfBlob.size > 0) {\r\n // Create blob URL from PDF response\r\n this.emailPdfUrl = URL.createObjectURL(pdfBlob);\r\n this.emailError = null;\r\n this.isLoadingEmail = false;\r\n } else {\r\n // Invalid PDF response\r\n this.emailError = 'Invalid PDF response from server';\r\n this.isLoadingEmail = false;\r\n }\r\n },\r\n error: (error: any) => {\r\n console.error('Error converting email to PDF:', error);\r\n this.emailError = error?.message || 'Failed to convert email to PDF';\r\n this.isLoadingEmail = false;\r\n }\r\n });\r\n } else {\r\n this.resetEmailData();\r\n }\r\n }\r\n\r\n /**\r\n * Resets Email data to initial state\r\n */\r\n private resetEmailData(): void {\r\n // Clean up blob URL to prevent memory leaks\r\n if (this.emailPdfUrl) {\r\n URL.revokeObjectURL(this.emailPdfUrl);\r\n this.emailPdfUrl = null;\r\n }\r\n this.isLoadingEmail = false;\r\n this.emailError = null;\r\n }\r\n\r\n /**\r\n * Computed property to determine if email should be displayed as PDF\r\n * @type {boolean}\r\n */\r\n get isEmailAsPdf(): boolean {\r\n return this.isEmail && !!this.emailPdfUrl;\r\n }\r\n\r\n /**\r\n * Cleanup when component is destroyed\r\n */\r\n ngOnDestroy(): void {\r\n // Clean up blob URL to prevent memory leaks\r\n if (this.emailPdfUrl) {\r\n URL.revokeObjectURL(this.emailPdfUrl);\r\n this.emailPdfUrl = null;\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"document-content-viewer-container\">\r\n <!-- Preview must not require contentType: APIs often omit MIME while still returning documentUrl + filename extension. -->\r\n @if(documentUrl){\r\n <!-- Zoom Controls -->\r\n <div class=\"zoom-controls-wrapper\">\r\n <document-zoom-controls [selectedDocument]=\"selectedDocument\" [contextId]=\"contextId\" [isFormHide]=\"isFormHide\">\r\n </document-zoom-controls>\r\n </div>\r\n\r\n <!-- PDF Viewer -->\r\n @if(isPdf){\r\n <div class=\"pdf-container\">\r\n <pdf-viewer [src]=\"documentUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\r\n [zoom]=\"currentZoom / 100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\r\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\r\n style=\"width: 100%; height: 100%\"></pdf-viewer>\r\n </div>\r\n }\r\n\r\n <!-- Image Viewer -->\r\n @else if(isImage){\r\n <div class=\"image-container\">\r\n <img [src]=\"documentUrl\" [alt]=\"documentName || 'Document Image'\" class=\"document-image\"\r\n [style.transform]=\"'scale(' + (currentZoom / 100) + ')'\" [style.transform-origin]=\"'center center'\" />\r\n </div>\r\n }\r\n\r\n <!-- Excel Files -->\r\n @else if(isExcel){\r\n <div class=\"excel-container\">\r\n @if(isLoadingExcel){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading Excel file...</p>\r\n </div>\r\n </div>\r\n }@else if(excelError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading Excel File</h4>\r\n <p>{{ excelError }}</p>\r\n <div class=\"error-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(excelData){\r\n <div class=\"excel-container\">\r\n <div class=\"excel-zoom-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Word Files -->\r\n @else if(isWord){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\r\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- CSV Files -->\r\n @else if(isCsv){\r\n <div class=\"csv-container\">\r\n @if(isLoadingCsv){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading CSV file...</p>\r\n </div>\r\n </div>\r\n }@else if(csvError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading CSV File</h4>\r\n <p>{{ csvError }}</p>\r\n <div class=\"error-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(csvData){\r\n <div class=\"csv-content\">\r\n <div class=\"csv-header\">\r\n <div class=\"csv-info\">\r\n <p>{{ documentName || 'CSV File' }}</p>\r\n <span class=\"csv-stats\">\r\n {{ csvData.totalRows }} rows × {{ csvData.totalColumns }} columns\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"csv-table-container\" [style.transform-origin]=\"'center center'\" (wheel)=\"onWheel($event)\">\r\n <p-table [value]=\"safeCsvStyledData\" [tableStyle]=\"{'min-width': '100%'}\" [scrollable]=\"true\"\r\n scrollHeight=\"67vh\" class=\"csv-table\">\r\n <ng-template pTemplate=\"body\" let-row>\r\n <tr>\r\n <ng-container *ngFor=\"let cell of row.cells; trackBy: trackByCell\">\r\n <td [ngClass]=\"{'csv-header-cell': cell.isHeader}\">\r\n {{ cell.value }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Email Files -->\r\n @else if(isEmail){\r\n <div class=\"email-container\">\r\n @if(isLoadingEmail){\r\n <div class=\"loading-container text-center m-1/2\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem;\"></i>\r\n <p>Opening email...</p>\r\n </div>\r\n }\r\n @else if(isEmailAsPdf && emailPdfUrl){\r\n <!-- Render PDF when email is converted -->\r\n <pdf-viewer [src]=\"emailPdfUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\r\n [zoom]=\"currentZoom/100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\r\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\r\n style=\"width: 100%; height: 82vh;\"></pdf-viewer>\r\n }\r\n @else if(emailError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-circle\" style=\"font-size: 2rem; color: #ef4444;\"></i>\r\n <h4>Unable to Preview Email</h4>\r\n <p>{{ emailError }}</p>\r\n <div class=\"error-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- OpenDocument Files -->\r\n @else if(isOpenDocument){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:800px;\"></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Unsupported Files -->\r\n @else if(isUnsupported){\r\n <div class=\"unsupported-document-container\">\r\n <div class=\"document-preview\">\r\n <div class=\"document-icon\">\r\n <i [class]=\"documentIcon\"></i>\r\n </div>\r\n <div class=\"document-info\">\r\n <h4>Unsupported Document Type</h4>\r\n <p>{{ documentName || 'Document' }}</p>\r\n <p class=\"document-note\">This document type ({{ contentType || 'unknown' }}) is not supported for preview. Please download to\r\n view.</p>\r\n </div>\r\n <div class=\"document-actions\">\r\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n <button type=\"button\" class=\"p-button p-button-outlined p-button-sm\" (click)=\"openInNewTab()\">\r\n <i class=\"pi pi-external-link\"></i>\r\n Open\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @else {\r\n <div class=\"no-document-container\">\r\n <div class=\"no-document-content\">\r\n <i class=\"pi pi-file-o\" style=\"font-size: 3rem; color: #6b7280;\"></i>\r\n <h4>No Document Uploaded</h4>\r\n <p>Please Upload a document to view its content.</p>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentActionsService, DocumentAction } from '../../services/document-actions.service';\r\nimport { SessionService } from '../../../../Shared/services/session.service';\r\n\r\n@Component({\r\n selector: 'document-actions',\r\n templateUrl: './document-actions.component.html',\r\n styleUrls: ['./document-actions.component.scss'],\r\n standalone: false\r\n})\r\nexport class DocumentActionsComponent implements OnChanges {\r\n readonly SHARED = SHARED;\r\n \r\n @Input() document?: any;\r\n @Input() documentId?: string;\r\n @Input() currentStatus?: string;\r\n @Input() isLoading?: boolean = false;\r\n @Input() isUploaded?: boolean = false;\r\n @Input() statusId?: string;\r\n @Output() actionPerformed = new EventEmitter<DocumentAction>();\r\n\r\n showAcceptDialog = false;\r\n showRejectDialog = false;\r\n acceptNote = SHARED.EMPTY;\r\n private _rejectNote = SHARED.EMPTY;\r\n userRole: any = SHARED.EMPTY;\r\n // Action processing flags\r\n isAccepting = false;\r\n isRejecting = false;\r\n\r\n // Computed properties for template\r\n cardClass: string = SHARED.CARD_PENDING;\r\n rejectButtonClass: string = SHARED.BUTTON_DEFAULT_REJECT;\r\n acceptButtonClass: string = SHARED.BUTTON_DEFAULT_ACCEPT;\r\n isRejectNoteEmpty: boolean = true;\r\n\r\n // Action visibility computed properties\r\n showApproveRejectActions: boolean = false;\r\n showNoActions: boolean = false;\r\n\r\n constructor(\r\n private documentActionsService: DocumentActionsService,\r\n private sessionService: SessionService\r\n ) {}\r\n\r\n get rejectNote(): string {\r\n return this._rejectNote;\r\n }\r\n\r\n set rejectNote(value: string) {\r\n this._rejectNote = value;\r\n this.updateRejectNoteEmpty();\r\n }\r\n\r\n /**\r\n * Checks if both action buttons should be disabled\r\n * @returns {boolean} True if both buttons should be disabled\r\n */\r\n get areButtonsDisabled(): boolean {\r\n return this.isDocumentApproved || this.isDocumentRejected;\r\n }\r\n\r\n /**\r\n * Checks if the document is approved (case-insensitive)\r\n * @returns {boolean} True if document is approved\r\n */\r\n get isDocumentApproved(): boolean {\r\n return this.currentStatus?.toLowerCase() === SHARED.STATUS_ACCEPTED.toLowerCase() ||\r\n this.currentStatus?.toLowerCase() === SHARED.STATUS_APPROVED.toLowerCase();\r\n }\r\n\r\n /**\r\n * Checks if the document is rejected (case-insensitive)\r\n * @returns {boolean} True if document is rejected\r\n */\r\n get isDocumentRejected(): boolean {\r\n return this.currentStatus?.toLowerCase() === SHARED.STATUS_REJECTED_LOWERCASE.toLowerCase() ||\r\n this.currentStatus?.toLowerCase() === SHARED.STATUS_REJECTED.toLowerCase();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.updateComputedProperties();\r\n if (changes['isLoading'] && !this.isLoading) {\r\n this.resetActionFlags();\r\n }\r\n }\r\n\r\n /**\r\n * Updates computed properties based on currentStatus and statusId\r\n */\r\n private updateComputedProperties(): void {\r\n this.cardClass = this.documentActionsService.calculateCardClass(this.currentStatus, this.statusId);\r\n this.rejectButtonClass = this.documentActionsService.calculateRejectButtonClass(this.currentStatus, this.statusId);\r\n this.acceptButtonClass = this.documentActionsService.calculateAcceptButtonClass(this.currentStatus, this.statusId);\r\n this.updateRejectNoteEmpty();\r\n }\r\n\r\n /**\r\n * Checks if the current user is a Team Leader\r\n * @returns {boolean} True if user is Team Leader\r\n */\r\n isUserTeamLeader(): boolean {\r\n this.userRole = this.sessionService.getUserRole();\r\n return this.userRole === SHARED.TEAM_LEADER;\r\n }\r\n\r\n /**\r\n * Checks if the current user is an Underwriter\r\n * @returns {boolean} True if user is Underwriter\r\n */\r\n isUserUnderwriter(): boolean {\r\n this.userRole = this.sessionService.getUserRole();\r\n return this.userRole === SHARED.UNDERWRITER_USER;\r\n }\r\n\r\n /**\r\n * Updates the isRejectNoteEmpty property based on current rejectNote value\r\n */\r\n updateRejectNoteEmpty(): void {\r\n this.isRejectNoteEmpty = !this.rejectNote || this.rejectNote.trim() === SHARED.EMPTY;\r\n }\r\n\r\n /**\r\n * Resets the action processing flags\r\n */\r\n private resetActionFlags(): void {\r\n this.isAccepting = false;\r\n this.isRejecting = false;\r\n }\r\n\r\n onAcceptClick(): void {\r\n this.showAcceptDialog = true;\r\n }\r\n\r\n onRejectClick(): void {\r\n this.showRejectDialog = true;\r\n }\r\n\r\n\r\n\r\n onAcceptConfirm(): void {\r\n this.isAccepting = true;\r\n this.actionPerformed.emit(this.documentActionsService.createAcceptAction(this.acceptNote));\r\n this.acceptNote = SHARED.EMPTY;\r\n this.showAcceptDialog = false;\r\n }\r\n\r\n onRejectConfirm(): void {\r\n this.isRejecting = true;\r\n this.actionPerformed.emit(this.documentActionsService.createRejectAction(this.rejectNote));\r\n this.rejectNote = SHARED.EMPTY;\r\n this.showRejectDialog = false;\r\n }\r\n\r\n onCancel(): void {\r\n this.showAcceptDialog = false;\r\n this.showRejectDialog = false;\r\n this.acceptNote = SHARED.EMPTY;\r\n this.rejectNote = SHARED.EMPTY;\r\n }\r\n\r\n} ","<div class=\"document-actions-container\" *ngIf=\"document?.status !=='Pending' && !document?.isUploaded && document?.status === 'Reviewing'\">\r\n <div class=\"actions-card\" [ngClass]=\"cardClass\">\r\n <div class=\"actions-buttons\">\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn reject-btn\" [ngClass]=\"rejectButtonClass\"\r\n (click)=\"onRejectClick()\" [disabled]=\"areButtonsDisabled || isRejecting\">\r\n <i class=\"pi pi-times\" *ngIf=\"isDocumentRejected\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isRejecting\"></i>\r\n <span>{{ isDocumentRejected ? SHARED.BUTTON_LABEL_REJECTED :\r\n SHARED.BUTTON_LABEL_REJECT }}</span>\r\n </button>\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn accept-btn\" [ngClass]=\"acceptButtonClass\"\r\n (click)=\"onAcceptClick()\" [disabled]=\"areButtonsDisabled || isAccepting\">\r\n <i class=\"pi pi-check\" *ngIf=\"isDocumentApproved\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isAccepting\"></i>\r\n <span>{{ isDocumentApproved ? SHARED.BUTTON_LABEL_ACCEPTED : SHARED.BUTTON_LABEL_ACCEPT\r\n }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<p-dialog [(visible)]=\"showAcceptDialog\" [header]=\"SHARED.ACCEPT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"acceptNote\" class=\"note-label\">{{ SHARED.ACCEPT_NOTE_LABEL }}</label>\r\n <textarea id=\"acceptNote\" pInputTextarea [(ngModel)]=\"acceptNote\" [placeholder]=\"SHARED.ACCEPT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.ACCEPT_BUTTON_LABEL\" class=\"p-button-success\" (click)=\"onAcceptConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [(visible)]=\"showRejectDialog\" [header]=\"SHARED.REJECT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"rejectNote\" class=\"note-label\">{{ SHARED.REJECT_NOTE_LABEL }}</label>\r\n <textarea id=\"rejectNote\" pInputTextarea [(ngModel)]=\"rejectNote\" [placeholder]=\"SHARED.REJECT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.REJECT_BUTTON_LABEL\" class=\"p-button-danger\" [disabled]=\"isRejectNoteEmpty\"\r\n (click)=\"onRejectConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { SHARED, SUPPORTED_IMAGE_TYPES } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\nimport { DocumentHistorySection } from '../../models/document-history.model';\r\nimport { DocumentAction } from '../../services/document-actions.service';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DocumentViewerService, DocumentViewerState } from '../../services/document-viewer.service';\r\nimport { DocumentStore } from '../../state/document.store';\r\n\r\n/**\r\n * Component for viewing and managing document details.\r\n * @class DocumentViewerComponent\r\n * @typedef {DocumentViewerComponent}\r\n */\r\n@Component({\r\n selector: 'document-viewer',\r\n templateUrl: './document-viewer.component.html',\r\n standalone : false,\r\n styleUrl: './document-viewer.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class DocumentViewerComponent implements OnChanges, OnDestroy {\r\n /**\r\n * Get the selected document by user.\r\n * @type {*}\r\n */\r\n @Input() selectedDocument?: DocumentListItem; // <-- Made optional to prevent undefined issues\r\n /**\r\n * Get the selected document by user.\r\n * @type {*}\r\n */\r\n @Input() documentList?: DocumentListItem[]; // <-- Made optional to prevent undefined issues\r\n /**\r\n * The context ID for API calls\r\n * @type {string}\r\n */\r\n @Input() contextId?: string;\r\n\r\n /**\r\n * Flag to hide form elements\r\n * @type {boolean}\r\n */\r\n @Input() isFormHide: boolean = false;\r\n\r\n /**\r\n * Event emitted when document status is updated to refresh the document list\r\n * @type {EventEmitter<void>}\r\n */\r\n @Output() documentStatusUpdated = new EventEmitter<{ actionType?: string }>();\r\n\r\n /**\r\n * Event emitted when a delete error occurs\r\n * @type {EventEmitter<any>}\r\n */\r\n @Output() deleteError = new EventEmitter<any>();\r\n\r\n /**\r\n * Event emitted when a delete operation succeeds\r\n * @type {EventEmitter<void>}\r\n */\r\n @Output() deleteSuccess = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when the document viewer is destroyed to trigger refresh\r\n * @type {EventEmitter<void>}\r\n */\r\n @Output() viewerDestroyed = new EventEmitter<void>();\r\n\r\n /**\r\n * Indicates whether a checkbox is selected.\r\n * @type {boolean}\r\n */\r\n checked: boolean = false;\r\n\r\n /**\r\n * Reference to the dynamic dialog used for displaying additional details.\r\n * @type {(DynamicDialogRef | undefined)}\r\n */\r\n ref: DynamicDialogRef | undefined;\r\n\r\n /**\r\n * Indicates whether the document has been verified.\r\n * @type {boolean}\r\n */\r\n isVerified: boolean = false;\r\n\r\n /**\r\n * Messages for user feedback\r\n * @type {any[]}\r\n */\r\n messages: any[] = [];\r\n\r\n /**\r\n * Current state from the service\r\n * @type {DocumentViewerState}\r\n */\r\n currentState: DocumentViewerState = {\r\n documentHistory: [],\r\n showDocumentHistory: false,\r\n isActionLoading: false,\r\n documentStatus: SHARED.STATUS_PENDING as 'pending',\r\n documentIsUploaded: false,\r\n alertData: null,\r\n deleteError: null,\r\n deleteSuccess: false\r\n };\r\n\r\n\r\n\r\n /**\r\n * Holds the subscription to manage observable cleanup.\r\n * @private\r\n * @type {Subscription}\r\n */\r\n private subscription: Subscription = new Subscription();\r\n\r\n /**\r\n * Initializes a new instance of the DocumentViewerComponent.\r\n * @param {DocumentHttpService} documentHttpService - Handle the http service.\r\n * @param {DocumentService} documentService - Handle the states.\r\n * @param {DocumentViewerService} documentViewerService - Handle the viewer business logic.\r\n */\r\n constructor(\r\n public documentHttpService : DocumentHttpService, \r\n private documentService: DocumentHelperService,\r\n private messageService: MessageService,\r\n private documentViewerService: DocumentViewerService,\r\n public documentStore: DocumentStore\r\n ) {\r\n // Subscribe to state changes from the service\r\n this.subscription.add(\r\n this.documentViewerService.state$.subscribe(state => {\r\n this.currentState = state;\r\n \r\n // Check for delete errors and emit them to parent\r\n if (state.deleteError) {\r\n this.deleteError.emit(state.deleteError);\r\n // Clear the error from state after emitting\r\n this.documentStore.setDeleteError(null);\r\n }\r\n \r\n // Check for delete success and emit to parent\r\n if (state.deleteSuccess) {\r\n this.deleteSuccess.emit();\r\n // Clear the success flag from state after emitting\r\n this.documentStore.setDeleteSuccess(false);\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches the alerts for the selected document.\r\n * @returns {void}\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['selectedDocument'] && this.selectedDocument) {\r\n this.documentViewerService.updateSelectedDocument(this.selectedDocument);\r\n }\r\n }\r\n\r\n /**\r\n * Handles document selection from template\r\n * @param document The selected document\r\n */\r\n handleSelectedDocument(document: DocumentListItem): void {\r\n this.selectedDocument = document;\r\n this.documentViewerService.updateSelectedDocument(document);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handles document actions from the actions component\r\n * @param {DocumentAction} action - The action performed\r\n */\r\n handleDocumentAction(action: DocumentAction): void {\r\n this.documentViewerService.handleDocumentAction(action, this.contextId);\r\n this.documentStatusUpdated.emit({ actionType: action.type });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n if (this.contextId) {\r\n this.refreshDocumentData();\r\n }\r\n this.viewerDestroyed.emit();\r\n }\r\n\r\n /**\r\n * Handles document name update event from content viewer\r\n */\r\n onDocumentNameUpdated(): void {\r\n this.documentStatusUpdated.emit({ actionType: SHARED.NAME_UPDATE_ACTION });\r\n }\r\n\r\n /**\r\n * Handles delete task request from history component\r\n */\r\n onDeleteTaskRequested(): void {\r\n this.documentStatusUpdated.emit({ actionType: 'delete' });\r\n }\r\n\r\n /**\r\n * Handles document selection from history component\r\n * @param document - The selected document from history\r\n */\r\n onDocumentSelected(document: any): void {\r\n if (document && document.documentUrl && document.docName) {\r\n const tempDocument: DocumentListItem = {\r\n _id: document._id,\r\n docName: document.docName,\r\n fileName: document.docName,\r\n documentUrl: document.documentUrl,\r\n contentType: document.contentType,\r\n status: this.selectedDocument?.status || '',\r\n documentTypeName:document.documentTypeName,\r\n isUploaded: this.selectedDocument?.isUploaded || false,\r\n isAliasEditable: document.isAliasEditable,\r\n parentDocumentId: document.parentDocumentId,\r\n aliasName: document.aliasName,\r\n isSystemDocument: document.isSystemDocument || false,\r\n fileSize: '0',\r\n uploadedOn: new Date().toISOString(),\r\n ownerName: 'History Document'\r\n };\r\n this.selectedDocument = tempDocument;\r\n }\r\n }\r\n\r\n /**\r\n * Refreshes document data when the viewer is closed\r\n */\r\n private refreshDocumentData(): void {\r\n this.documentStore.clearSelectionState();\r\n this.documentStore.setDocumentListResponse(null);\r\n this.documentStore.setDocumentList([]); \r\n this.documentStore.setDocumentCategories([]);\r\n this.documentStore.setUserList([]);\r\n this.documentStore.setStatusData([]);\r\n this.documentStore.setCurrentDocument(null); \r\n this.documentStore.setFolders([]);\r\n this.documentStore.setDocumentAlert(null);\r\n // Clear document viewer state including history data\r\n this.documentStore.clearDocumentViewerState();\r\n }\r\n}\r\n","<div class=\"document-viewer-container grid p-formgrid\">\r\n <div class=\"main-content col-12 md:col-12\">\r\n @if(messages.length > 0) {\r\n <p-messages [(value)]=\"messages\" [enableService]=\"false\"></p-messages>\r\n }\r\n \r\n <div class=\"content-grid col-12 md:col-12\">\r\n @if(selectedDocument){\r\n <div class=\"document-preview p-0 col-12 md:col-9\">\r\n <document-content-viewer\r\n [documentUrl]=\"selectedDocument?.documentUrl\"\r\n [contentType]=\"selectedDocument?.contentType\"\r\n [documentName]=\"selectedDocument?.docName\"\r\n [selectedDocument]=\"selectedDocument\"\r\n [contextId]=\"contextId\"\r\n [isFormHide]=\"isFormHide\"\r\n (documentNameUpdated)=\"onDocumentNameUpdated()\"\r\n ></document-content-viewer>\r\n </div>\r\n }\r\n\r\n <div class=\"sidebar col-12 md:col-3 pt-0\">\r\n <div class=\"sidebar card\">\r\n <document-history \r\n [historyData]=\"currentState.documentHistory\" \r\n [showHistory]=\"currentState.showDocumentHistory\"\r\n [contextId]=\"contextId\"\r\n [selectedDocument]=\"selectedDocument\"\r\n (deleteTaskRequested)=\"onDeleteTaskRequested()\"\r\n (documentSelected)=\"onDocumentSelected($event)\">\r\n \r\n <!-- Document Actions Component inside the history component -->\r\n <div actions-component *ngIf=\"selectedDocument?.status !=='Pending' && !selectedDocument?.isUploaded && selectedDocument?.status === 'Reviewing'\">\r\n <document-actions\r\n [document]=\"selectedDocument\"\r\n [documentId]=\"selectedDocument?._id\"\r\n [currentStatus]=\"currentState.documentStatus\"\r\n [isLoading]=\"currentState.isActionLoading\"\r\n [isUploaded]=\"currentState.documentIsUploaded\"\r\n [statusId]=\"selectedDocument?.statusId\"\r\n (actionPerformed)=\"handleDocumentAction($event)\">\r\n </document-actions>\r\n </div>\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </document-history>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","\r\nimport { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, OnDestroy, OnChanges, SimpleChanges, ElementRef, ViewChild, AfterViewInit } from '@angular/core';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentListItem, DocumentListResponse } from '../../models/document-list-response.model';\r\nimport { Subscription } from 'rxjs';\r\nimport { TableData } from '../../../../Shared/components/table-primary/table-primary.model';\r\nimport { DocumentListService } from '../../services/document-list.service';\r\nimport { Message } from 'primeng/api';\r\nimport { ERRORS } from '../../../../Shared/constant/ERROR';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentMenuService } from '../../services/document-menu.service';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentScrollService } from '../../services/document-scroll.service';\r\n\r\n\r\n/**\r\n * This component is responsible for displaying and managing a list of documents.\r\n * Provides functionality for file upload, document selection, and dialog management.\r\n * @class DocumentListComponent\r\n */\r\n@Component({\r\n selector: 'lib-document-list',\r\n standalone: false,\r\n templateUrl: './document-list.component.html',\r\n styleUrls: ['./document-list.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class DocumentListComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\r\n\r\n /**\r\n * Represents the context ID for the document list.\r\n * This value is passed from the parent component.\r\n * @type {string}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n\r\n /**\r\n * The document list response data passed from the parent component.\r\n * @type {DocumentListResponse[] | null}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() documentListResponse: DocumentListResponse[] | null = null;\r\n\r\n /**\r\n * The selected menu item ID for scrolling to specific sections\r\n * @type {string | null}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() selectedMenuItemId: string | null = null;\r\n\r\n /**\r\n * Additional navigation information for precise scrolling\r\n * @type {object | null}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n } | null = null;\r\n\r\n\r\n\r\n /**\r\n * Reference to the document categories container for scrolling\r\n */\r\n @ViewChild('documentCategoriesContainer', { static: false }) documentCategoriesContainer!: ElementRef;\r\n\r\n /**\r\n * Subscription to document list response from store\r\n */\r\n private documentListSubscription: Subscription = new Subscription();\r\n\r\n @Output() handleSelectedDocumentInNewTab = new EventEmitter<{\r\n selectedDocument: DocumentListItem;\r\n contextId: string;\r\n documentList: DocumentListItem[];\r\n }>();\r\n\r\n /**\r\n * The currently selected document.\r\n * @type {DocumentModel}\r\n * @memberof DocumentListComponent\r\n */\r\n selectedDocument!: DocumentListItem;\r\n\r\n /**\r\n * Default visibility of the sidebar.\r\n * @type {boolean}\r\n * @memberof DocumentListComponent\r\n */\r\n isSidebarVisible: boolean = SHARED.FALSE;\r\n\r\n /**\r\n * Default visibility of the messages.\r\n * @type {Message[]}\r\n * @memberof DocumentListComponent\r\n */\r\n messages: Message[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Default visibility of the dialog.\r\n * @type {boolean}\r\n * @memberof DocumentListComponent\r\n */\r\n isdialogVisible: boolean = SHARED.FALSE;\r\n\r\n /**\r\n * The list of documents to display.\r\n * This value is passed from the parent component.\r\n * @type {DocumentModel[]}\r\n * @memberof DocumentListComponent\r\n */\r\n @Input() documentList: DocumentListItem[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Available document types for selection.\r\n * @type {string[]}\r\n * @memberof DocumentListComponent\r\n */\r\n options: any[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * The selected option for the document type.\r\n * @type {(string | null)}\r\n * @memberof DocumentListComponent\r\n */\r\n selectedOption: string | null = null;\r\n \r\n /**\r\n * The file name associated with the document.\r\n * It may be undefined until a file is selected or loaded.\r\n * @type {string | undefined}\r\n */\r\n fileName!: string | undefined;\r\n \r\n /**\r\n * Table data for each category\r\n */\r\n categoryTables: TableData[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Document categories from the response\r\n */\r\n documentCategories: DocumentListResponse[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Completion counts for each category\r\n */\r\n categoryCompletionCounts: string[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Severity levels for each category completion badge\r\n */\r\n categorySeverities: ('success' | 'info' | 'warning' | 'danger')[] = SHARED.EMPTY_ARRAY;\r\n\r\n /**\r\n * Message to display for document deletion\r\n */\r\n deleteMessage: Message[] = SHARED.EMPTY_ARRAY;\r\n\r\n // Document name editing functionality moved to zoom controls component\r\n\r\n\r\n\r\n // Alias name functionality moved to zoom controls component\r\n\r\n @Output() handleSelectedDocument = new EventEmitter<DocumentListItem>();\r\n\r\n // Document name validation moved to zoom controls component\r\n /**\r\n * Getter to return category labels as they come from the API\r\n */\r\n get formattedCategoryLabels(): string[] {\r\n return this.documentCategories.map(category => category.label);\r\n }\r\n\r\n /**\r\n * Getter to generate safe category IDs for HTML elements\r\n */\r\n get categoryIds(): string[] {\r\n return this.documentCategories.map((category, index) => {\r\n if (category?.label) {\r\n return `section-${category.label.toLowerCase().replace(' ', '-')}`;\r\n }\r\n return `section-category-${index}`;\r\n });\r\n }\r\n\r\n /**\r\n * Creates an instance of DocumentListComponent.\r\n * @class\r\n * @param {DocumentListService} documentListService - The service responsible for document list operations.\r\n */\r\n constructor(\r\n private documentListService: DocumentListService,\r\n private documentHttpService: DocumentHttpService,\r\n private documentMenuService: DocumentMenuService,\r\n private documentStore: DocumentStore,\r\n private documentScrollService: DocumentScrollService\r\n ) {}\r\n\r\n /**\r\n * Handles changes to input properties\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.CONTEXT_ID] && !changes[SHARED.CONTEXT_ID].firstChange) {\r\n this.documentListService.refreshDocumentListForNewContext(this.contextId);\r\n }\r\n \r\n if (changes['selectedMenuItemId']) {\r\n if (this.selectedMenuItemId) {\r\n this.scrollToCategorySection(this.selectedMenuItemId);\r\n } else {\r\n // Reset to top when menu item is deselected\r\n this.resetToTop();\r\n }\r\n }\r\n\r\n if (changes['navigationInfo'] && this.navigationInfo) {\r\n this.scrollToCategorySectionWithNavigationInfo(this.navigationInfo);\r\n }\r\n\r\n // Handle document list changes due to filtering\r\n if (changes['documentListResponse'] && !changes['documentListResponse'].firstChange) {\r\n this.handleDocumentListFilteringChange();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the component by setting up document list subscription.\r\n */\r\n ngOnInit(): void {\r\n this.setupDocumentListSubscription();\r\n }\r\n\r\n /**\r\n * Called after the view is initialized\r\n */\r\n ngAfterViewInit(): void {\r\n if (this.selectedMenuItemId) {\r\n setTimeout(() => {\r\n this.scrollToCategorySection(this.selectedMenuItemId!);\r\n }, 100);\r\n }\r\n this.documentScrollService.setupScrollListeners(this.documentCategoriesContainer.nativeElement);\r\n }\r\n\r\n /**\r\n * Handles the visibility of the sidebar.\r\n * @param {boolean} isVisible - Indicates whether the sidebar should be visible or not.\r\n * @memberof DocumentListComponent\r\n */\r\n handleOpenSideBar(isVisible: boolean): void {\r\n this.isSidebarVisible = isVisible;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Builds document categories from the API response\r\n */\r\n buildDocumentCategories(): void {\r\n const result = this.documentListService.buildDocumentCategories(this.documentListResponse);\r\n this.documentCategories = result.documentCategories;\r\n this.categoryTables = result.categoryTables;\r\n this.categoryCompletionCounts = result.categoryCompletionCounts;\r\n this.categorySeverities = result.categorySeverities;\r\n \r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n * Sets up subscription to document list response from store\r\n */\r\n setupDocumentListSubscription(): void {\r\n this.documentListSubscription.add(\r\n this.documentListService.setupDocumentListSubscription().subscribe({\r\n next: (response: any) => {\r\n this.documentListResponse = response;\r\n this.buildDocumentCategories();\r\n },\r\n error: (error: any) => {\r\n console.error(ERRORS.ERROR_FETCHING_DOCUMENTS, error);\r\n }\r\n })\r\n );\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handles table row click event\r\n */\r\n handleTableRowClick(rowData: any): void {\r\n this.isdialogVisible = SHARED.TRUE;\r\n this.selectedDocument = this.documentListService.handleTableRowClick(rowData);\r\n this.handleSelectedDocument.emit(this.selectedDocument);\r\n }\r\n\r\n /**\r\n * Handles the delete action from the table component\r\n * @param {any} rowData - The row data containing the document to delete\r\n */\r\n handleDeleteAction(rowData: any): void {\r\n this.documentListService.handleDeleteAction(rowData, this.contextId)\r\n .subscribe({\r\n next: (response) => {\r\n if (this.selectedDocument && this.selectedDocument._id === rowData._id) {\r\n this.handleCloseModal();\r\n }\r\n this.documentListService.refreshAllDataWithCurrentFilters(this.contextId);\r\n },\r\n error: (error) => {\r\n this.showDeleteErrorMessage(error);\r\n }\r\n });\r\n }\r\n\r\n // Document name editing methods moved to zoom controls component\r\n\r\n /**\r\n * Closes the document viewer dialog and resets the selected document\r\n */\r\n handleCloseModal(): void {\r\n this.isdialogVisible = SHARED.FALSE;\r\n this.selectedDocument = {} as DocumentListItem;\r\n this.fileName = SHARED.EMPTY;\r\n this.documentListService.refreshAllDataWithCurrentFilters(this.contextId);\r\n }\r\n\r\n /**\r\n * Refreshes the document list after a status update\r\n * @param {boolean} isDeleteAction - Optional flag indicating if this refresh is due to a delete action\r\n */\r\n refreshDocumentList(isDeleteAction: boolean = false): void {\r\n this.documentListService.refreshDocumentList(this.contextId);\r\n if (isDeleteAction) {\r\n this.deleteMessage = [{severity: SHARED.SUCCESS_SEVERITY, detail: SHARED.DOCUMENT_DELETED_SUCCESSFULLY}];\r\n setTimeout(() => {\r\n this.deleteMessage = SHARED.EMPTY_ARRAY;\r\n this.handleCloseModal();\r\n }, 2000);\r\n }\r\n }\r\n\r\n handleTableRowCtrlClick(rowData: any): void {\r\n this.selectedDocument = this.documentListService.handleTableRowClick(rowData);\r\n this.handleSelectedDocument.emit(this.selectedDocument);\r\n this.handleSelectedDocumentInNewTab.emit({\r\n selectedDocument: this.selectedDocument,\r\n contextId: this.contextId,\r\n documentList: this.documentList\r\n });\r\n }\r\n\r\n /**\r\n * Handles document status update events from viewer\r\n * @param event - The status update event\r\n */\r\n handleDocumentStatusUpdate(event: { actionType?: string }): void {\r\n if (event.actionType === SHARED.DELETE_ACTION) {\r\n // Delete success is now handled separately via handleDeleteSuccess()\r\n // Don't call refreshDocumentList here for delete actions\r\n } else if (event.actionType === SHARED.NAME_UPDATE_ACTION) {\r\n this.handleDocumentNameUpdate();\r\n } else {\r\n this.refreshDocumentList();\r\n }\r\n }\r\n\r\n /**\r\n * Shows delete error message for 2 seconds without closing dialog\r\n * @param error - The error object from the delete operation\r\n */\r\n private showDeleteErrorMessage(error: any): void {\r\n const errorMessage = error?.error?.message || error?.message || 'Failed to delete document. Please try again.';\r\n this.deleteMessage = [{severity: 'error', detail: errorMessage}];\r\n \r\n // Clear error message after 2 seconds\r\n setTimeout(() => {\r\n this.deleteMessage = SHARED.EMPTY_ARRAY;\r\n }, 2000);\r\n }\r\n\r\n /**\r\n * Handles delete error events from the document viewer\r\n * @param error - The error object from the delete operation\r\n */\r\n handleDeleteError(error: any): void {\r\n this.showDeleteErrorMessage(error);\r\n }\r\n\r\n /**\r\n * Handles delete success events from the document viewer\r\n */\r\n handleDeleteSuccess(): void {\r\n this.refreshDocumentList(true);\r\n }\r\n\r\n /**\r\n * Handles document name update event from viewer\r\n */\r\n handleDocumentNameUpdate(): void {\r\n this.documentListService.refreshAllDataWithCurrentFilters(this.contextId);\r\n }\r\n\r\n /**\r\n * Handles the event when the document viewer is destroyed\r\n * Triggers a refresh of the document data\r\n */\r\n handleViewerDestroyed(): void {\r\n this.documentListService.refreshDocumentList(this.contextId);\r\n }\r\n\r\n /**\r\n * Scrolls to the category section that matches the selected menu item\r\n * @param menuItemId - The ID of the selected menu item\r\n */\r\n scrollToCategorySection(menuItemId: string): void {\r\n if (!this.documentCategories || !this.documentCategoriesContainer) {\r\n return;\r\n }\r\n \r\n this.documentScrollService.setScrolling();\r\n let targetCategory = this.findCategoryByMenuItemId(menuItemId);\r\n if (!targetCategory) {\r\n targetCategory = this.findCategoryByLegacyMatching(menuItemId);\r\n }\r\n if (!targetCategory) {\r\n targetCategory = this.documentCategories[0];\r\n }\r\n\r\n if (targetCategory) {\r\n const categoryIndex = this.documentCategories.findIndex(cat => cat === targetCategory);\r\n const categoryElements = this.documentCategoriesContainer.nativeElement.querySelectorAll('.category');\r\n if (categoryElements[categoryIndex]) {\r\n categoryElements[categoryIndex].scrollIntoView({\r\n behavior: SHARED.SMOOTH_SCROLL,\r\n block: 'start',\r\n inline: 'nearest'\r\n });\r\n this.highlightCategory(categoryElements[categoryIndex]);\r\n this.documentScrollService.setupSectionObserver(categoryElements[categoryIndex], this.selectedMenuItemId!);\r\n this.documentScrollService.resetScrollingAfterDelay(1200);\r\n }\r\n } \r\n }\r\n\r\n /**\r\n * Finds category by converting menuItemId to readable format and matching exactly\r\n * @param menuItemId - The menu item ID to match\r\n * @returns The matching category or null\r\n */\r\n private findCategoryByMenuItemId(menuItemId: string): DocumentListResponse | null {\r\n const readableLabel = this.convertMenuItemIdToReadableLabel(menuItemId);\r\n let targetCategory = this.documentCategories.find(category => \r\n category.label.toLowerCase() === readableLabel.toLowerCase()\r\n );\r\n \r\n if (!targetCategory) {\r\n targetCategory = this.documentCategories.find(category => {\r\n const categoryLabel = category.label.toLowerCase();\r\n const menuLabel = readableLabel.toLowerCase();\r\n return categoryLabel.includes(menuLabel) && \r\n !this.isSubstringOfLongerCategory(menuLabel, categoryLabel);\r\n });\r\n }\r\n return targetCategory || null;\r\n }\r\n\r\n /**\r\n * Converts menuItemId to readable label format\r\n * @param menuItemId - The menu item ID\r\n * @returns Readable label\r\n */\r\n private convertMenuItemIdToReadableLabel(menuItemId: string): string {\r\n // Convert kebab-case or snake_case to Title Case\r\n return menuItemId\r\n .replace(/[-_]/g, ' ')\r\n .replace(/\\b\\w/g, l => l.toUpperCase());\r\n }\r\n\r\n /**\r\n * Checks if a menu label is a substring of a longer category name\r\n * @param menuLabel - The menu label to check\r\n * @param categoryLabel - The category label to check against\r\n * @returns True if menuLabel is a substring of a longer category\r\n */\r\n private isSubstringOfLongerCategory(menuLabel: string, categoryLabel: string): boolean {\r\n // If the category is significantly longer than the menu item, it's likely a substring\r\n return categoryLabel.length > menuLabel.length + 3; // Allow some tolerance\r\n }\r\n\r\n /**\r\n * Legacy matching for backward compatibility with existing hardcoded keywords\r\n * @param menuItemId - The menu item ID\r\n * @returns The matching category or null\r\n */\r\n private findCategoryByLegacyMatching(menuItemId: string): DocumentListResponse | null {\r\n // Legacy matching for specific hardcoded keywords\r\n if (menuItemId.includes(SHARED.APPLICATION_LOWERCASE)) {\r\n return this.documentCategories.find(cat => \r\n cat.label.toLowerCase().includes(SHARED.APPLICATION_LOWERCASE)\r\n ) || null;\r\n } else if (menuItemId.includes(SHARED.APPLICANT_LOWERCASE) || menuItemId.includes(SHARED.USER_LOWERCASE)) {\r\n return this.documentCategories.find(cat => \r\n cat.label.toLowerCase().includes(SHARED.APPLICANT_LOWERCASE) || \r\n cat.label.toLowerCase().includes(SHARED.USER_LOWERCASE)\r\n ) || null;\r\n }\r\n \r\n return null;\r\n }\r\n\r\n /**\r\n * Scrolls to the category section using navigationInfo\r\n * @param navigationInfo - The navigation info object containing menuItemId\r\n */\r\n scrollToCategorySectionWithNavigationInfo(navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n }): void {\r\n if (!this.documentCategories || !this.documentCategoriesContainer) {\r\n return;\r\n }\r\n \r\n // Set scrolling flag\r\n this.documentScrollService.setScrolling();\r\n const targetCategory = this.documentCategories.find(category => \r\n category.label.toLowerCase() === navigationInfo.menuItemLabel.toLowerCase()\r\n );\r\n if (targetCategory) {\r\n const sectionId = 'section-' + targetCategory.label.toLowerCase().replace(SHARED.EMPTY_SPACE, SHARED.HYPEN);\r\n let targetElement = this.documentCategoriesContainer.nativeElement.querySelector(`#${sectionId}`);\r\n if (targetElement) {\r\n targetElement.scrollIntoView({\r\n behavior: SHARED.SMOOTH_SCROLL,\r\n block: 'start',\r\n inline: 'nearest'\r\n });\r\n this.highlightCategory(targetElement);\r\n this.documentScrollService.setupSectionObserver(targetElement, this.selectedMenuItemId!);\r\n this.documentScrollService.resetScrollingAfterDelay(1200);\r\n } else {\r\n const categoryIndex = this.documentCategories.findIndex(cat => cat === targetCategory);\r\n const categoryElements = this.documentCategoriesContainer.nativeElement.querySelectorAll('.category');\r\n if (categoryElements[categoryIndex]) {\r\n categoryElements[categoryIndex].scrollIntoView({\r\n behavior: SHARED.SMOOTH_SCROLL,\r\n block: 'start',\r\n inline: 'nearest'\r\n });\r\n this.highlightCategory(categoryElements[categoryIndex]);\r\n \r\n // Setup observer to deselect menu item when section scrolls out of view\r\n this.documentScrollService.setupSectionObserver(categoryElements[categoryIndex], this.selectedMenuItemId!);\r\n \r\n // Reset scrolling flag after smooth scroll completes\r\n this.documentScrollService.resetScrollingAfterDelay(500);\r\n }\r\n }\r\n } \r\n }\r\n\r\n /**\r\n * Adds a temporary highlight effect to the scrolled category\r\n * @param categoryElement - The DOM element of the category to highlight\r\n */\r\n highlightCategory(categoryElement: HTMLElement): void {\r\n categoryElement.classList.add('category-highlight');\r\n setTimeout(() => {\r\n categoryElement.classList.remove('category-highlight');\r\n }, 2000);\r\n }\r\n\r\n /**\r\n * Alternative scrolling method using IntersectionObserver for better performance\r\n * This method can be used as a fallback or alternative to the current approach\r\n * @param navigationInfo - The navigation info object\r\n */\r\n scrollToCategorySectionWithIntersectionObserver(navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n }): void {\r\n if (!this.documentCategories || !this.documentCategoriesContainer) {\r\n return;\r\n }\r\n const targetCategory = this.documentCategories.find(category => \r\n category.label.toLowerCase() === navigationInfo.menuItemLabel.toLowerCase()\r\n );\r\n if (!targetCategory) {\r\n return;\r\n }\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting && entry.target.id === `section-${targetCategory.label.toLowerCase().replace(SHARED.EMPTY_SPACE, SHARED.HYPEN)}`) {\r\n entry.target.scrollIntoView({behavior: SHARED.SMOOTH_SCROLL as ScrollBehavior,block: 'start'});\r\n this.highlightCategory(entry.target as HTMLElement);\r\n observer.disconnect();\r\n this.documentScrollService.setupSectionObserver(entry.target, this.selectedMenuItemId!);\r\n }\r\n });\r\n }, {threshold: 0.1,rootMargin: '0px 0px -100px 0px'});\r\n const categoryElements = this.documentCategoriesContainer.nativeElement.querySelectorAll('.category');\r\n categoryElements.forEach((element: Element) => {\r\n observer.observe(element);\r\n });\r\n setTimeout(() => {\r\n observer.disconnect();\r\n this.scrollToCategorySectionWithNavigationInfo(navigationInfo);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Resets the document list to the top when menu item is deselected\r\n */\r\n private resetToTop(): void {\r\n if (this.documentCategoriesContainer) {\r\n this.documentCategoriesContainer.nativeElement.scrollTo({\r\n top: 0,\r\n behavior: SHARED.SMOOTH_SCROLL\r\n });\r\n }\r\n this.documentScrollService.disconnectSectionObserver();\r\n }\r\n\r\n /**\r\n * Handles changes in document list due to filtering\r\n * Checks if the selected menu item's section is still visible and deselects if not\r\n */\r\n private handleDocumentListFilteringChange(): void {\r\n if (this.selectedMenuItemId && this.documentCategories) {\r\n // If no categories are available (all filtered out), deselect the menu item\r\n if (this.documentCategories.length === 0) {\r\n this.deselectMenuItemAndReset();\r\n return;\r\n }\r\n \r\n // Use the document menu service to check visibility\r\n const isSectionVisible = this.documentMenuService.isMenuItemSectionVisible(\r\n this.selectedMenuItemId, \r\n this.documentListResponse\r\n );\r\n \r\n if (!isSectionVisible) {\r\n this.deselectMenuItemAndReset();\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Deselects the current menu item and resets the view\r\n */\r\n private deselectMenuItemAndReset(): void {\r\n this.selectedMenuItemId = null;\r\n this.documentStore.setSelectedMenuItem(null);\r\n this.resetToTop();\r\n }\r\n\r\n /**\r\n * Cleanup subscriptions on component destroy\r\n */\r\n ngOnDestroy(): void {\r\n this.documentListSubscription.unsubscribe();\r\n this.documentScrollService.disconnectSectionObserver();\r\n if (this.documentCategoriesContainer) {\r\n this.documentScrollService.cleanupScrollListeners(this.documentCategoriesContainer.nativeElement);\r\n }\r\n }\r\n}\r\n","<div class=\"document-viewer\">\r\n <p-dialog [(visible)]=\"isdialogVisible\" [modal]=\"true\" appendTo=\"body\" [style]=\"{ width: '100vw', height: '100vh', minHeight: '100vh' }\"\r\n class=\"w-full h-full document-dailog-wrapper\" [draggable]=\"false\" [closable]=\"true\" (onHide)=\"handleCloseModal()\">\r\n <p-messages [(value)]=\"deleteMessage\" [enableService]=\"false\" [closable]=\"false\" />\r\n \r\n <document-viewer [selectedDocument]=\"selectedDocument\" [documentList]=\"documentList\" [contextId]=\"contextId\" \r\n (documentStatusUpdated)=\"handleDocumentStatusUpdate($event)\"\r\n (viewerDestroyed)=\"handleViewerDestroyed()\"\r\n (deleteError)=\"handleDeleteError($event)\"\r\n (deleteSuccess)=\"handleDeleteSuccess()\">\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"w-full flex align-items-center justify-content-between\">\r\n <input type=\"text\" class=\"w-full border-none bg-white h-3rem file-input-wrapper\" pInputText\r\n [(ngModel)]=\"fileName\" />\r\n\r\n </div>\r\n </ng-template>\r\n <ng-content></ng-content>\r\n </document-viewer>\r\n </p-dialog>\r\n</div>\r\n\r\n<div class=\"document-categories-container\" #documentCategoriesContainer>\r\n <div class=\"category\" *ngFor=\"let category of documentCategories; let i = index\"\r\n [id]=\"categoryIds[i]\">\r\n <div class=\"category-header\" *ngIf=\"documentCategories[i]?.list?.length\">\r\n <div class=\"category-title\" *ngIf=\"formattedCategoryLabels[i] || category.categoryDescription\">\r\n <h3 *ngIf=\"formattedCategoryLabels[i]\">{{ formattedCategoryLabels[i] }}</h3>\r\n <p class=\"category-description\" *ngIf=\"category.categoryDescription\">{{ category.categoryDescription }}</p>\r\n </div>\r\n <div class=\"completion-status\">\r\n <p-badge \r\n [severity]=\"categorySeverities[i]\" \r\n [value]=\"(((categoryCompletionCounts && categoryCompletionCounts[i]) || 0) + ' Complete')\"\r\n class=\"completion-badge\">\r\n </p-badge>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-container\">\r\n <lib-table-primary [tableData]=\"categoryTables[i]\" [tableStyle]=\"{ 'min-width': '100%' }\"\r\n (rowClick)=\"handleTableRowClick($event)\" (deleteAction)=\"handleDeleteAction($event)\" (rowCtrlClick)=\"handleTableRowCtrlClick($event)\" >\r\n </lib-table-primary>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, OnInit, OnDestroy, OnChanges, SimpleChanges, ViewChild, ElementRef, EventEmitter, Output } from '@angular/core';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentService } from '../../state/document.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { ERRORS } from '../../../../Shared/constant/ERROR';\r\nimport { DocumentHttpService } from '../../services/document-http.service';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { StatusDataModel } from '../../models/status-data.model';\r\nimport { DocumentListResponse } from '../../models/document-list-response.model';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { DocumentMenuService } from '../../services/document-menu.service';\r\n\r\n/**\r\n *This component is responsible for managing and displaying a list of documents.\r\n * @class DocumentContainerComponent\r\n * @typedef {DocumentContainerComponent}\r\n */\r\n@Component({\r\n selector: 'lib-document-container',\r\n standalone: false,\r\n templateUrl: './document-container.component.html',\r\n styleUrl: './document-container.component.scss'\r\n})\r\nexport class DocumentContainerComponent implements OnInit, OnDestroy, OnChanges {\r\n /**\r\n * The document list response data\r\n * @type {DocumentListResponse[] | null}\r\n */\r\n documentListResponse: DocumentListResponse[] | null = null;\r\n\r\n /**\r\n * Status data for the current selection\r\n * @type {StatusDataModel[]}\r\n */\r\n statusData: StatusDataModel[] = []\r\n\r\n /**\r\n * The currently selected menu item ID for scrolling\r\n */\r\n selectedMenuItemId: string | null = null;\r\n\r\n @Input() onOpenInNewTab?: (event: { selectedDocument: any, contextId: string, documentList: any[] }) => void;\r\n /**\r\n * Additional navigation information for better scrolling\r\n */\r\n navigationInfo: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n } | null = null;\r\n\r\n /**\r\n * Reference to the content scroll container\r\n */\r\n @ViewChild('contentScrollContainer', { static: false }) contentScrollContainer!: ElementRef;\r\n\r\n @Output() selectedDocument: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() selectedDocumentInNewTab: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n /**\r\n * Subscription to track selected menu item changes\r\n */\r\n private selectedMenuItemSubscription: Subscription = new Subscription();\r\n\r\n /**\r\n * Creates an instance of DocumentContainerComponent.\r\n * @param {DocumentHttpService} documentHttpService - Service for HTTP operations\r\n * @param {DocumentHelperService} documentHelperService - Service for document operations\r\n * @param {DocumentQuery} documentQuery - Query service for document state\r\n * @param {DocumentStore} documentStore - Store service for document state\r\n * @param {DocumentMenuService} documentMenuService - Service for menu operations\r\n */\r\n constructor(\r\n private documentHttpService: DocumentHttpService,\r\n private documentHelperService: DocumentHelperService,\r\n private documentQuery: DocumentQuery,\r\n private documentStore: DocumentStore,\r\n private documentMenuService: DocumentMenuService\r\n ) {}\r\n /**\r\n * Get contextId in input.\r\n * @type {string}\r\n */\r\n @Input() contextId: string = SHARED.EMPTY;\r\n \r\n \r\n /**\r\n * The list of folders.\r\n * @type {Array}\r\n */\r\n applicationNumber: string = SHARED.EMPTY\r\n catagories: DocumentCategory[] = SHARED.EMPTY_ARRAY\r\n userList: UserListModel[] = SHARED.EMPTY_ARRAY\r\n \r\n\r\n /**\r\n * Holds the subscription to manage observable cleanup.\r\n * @type {Subscription}\r\n */\r\n subscription: Subscription = new Subscription();\r\n\r\n /**\r\n * Handles changes to input properties\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.CONTEXT_ID] && !changes[SHARED.CONTEXT_ID].firstChange) {\r\n this.handleContextIdChange();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the component\r\n */\r\n ngOnInit(): void {\r\n this.clearAllState();\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.initializeData();\r\n }\r\n this.setupSelectedMenuItemSubscription();\r\n }\r\n\r\n /**\r\n * Sets up subscription to track selected menu item changes\r\n */\r\n setupSelectedMenuItemSubscription(): void {\r\n this.selectedMenuItemSubscription.add(\r\n this.documentQuery.selectSelectedMenuItem().subscribe(menuItemId => {\r\n this.selectedMenuItemId = menuItemId;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Handles menu item selection events from the documents menu\r\n * @param event - The menu item selection event\r\n */\r\n onMenuItemSelected(event: {\r\n item: any;\r\n category: any;\r\n navigationInfo?: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n };\r\n }): void {\r\n if (event && event.navigationInfo) {\r\n this.navigationInfo = event.navigationInfo;\r\n // Don't set selectedMenuItemId here - let the store subscription handle it\r\n } else {\r\n this.navigationInfo = null;\r\n // Don't set selectedMenuItemId here - let the store subscription handle it\r\n this.resetContentScrollToTop();\r\n }\r\n }\r\n\r\n /**\r\n * Resets the content scroll container to the top\r\n */\r\n private resetContentScrollToTop(): void {\r\n if (this.contentScrollContainer) {\r\n this.contentScrollContainer.nativeElement.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Initialize all data with proper sequencing to avoid duplicate API calls\r\n */\r\n initializeData(): void {\r\n this.fetchDocumentCatagories();\r\n this.fetchUserListWithFilters();\r\n this.setupStatusDataSubscriptions();\r\n this.setupFilteredDocumentSubscription();\r\n this.documentHelperService.initializeSelectionWatcherWithInitialLoad(this.contextId);\r\n }\r\n\r\n /**\r\n * Clears all state (store and component) comprehensively\r\n */\r\n clearAllState(): void {\r\n this.documentStore.clearSelectionState();\r\n // Don't clear document viewer state - let the viewer handle its own cleanup\r\n this.documentStore.setDocumentListResponse(null);\r\n this.documentStore.setDocumentList([]); \r\n this.documentStore.setDocumentCategories([]);\r\n this.documentStore.setUserList([]);\r\n this.documentStore.setStatusData([]);\r\n this.documentStore.setCurrentDocument(null); \r\n this.documentStore.setFolders([]);\r\n this.documentStore.setDocumentAlert(null);\r\n this.catagories = SHARED.EMPTY_ARRAY;\r\n this.userList = SHARED.EMPTY_ARRAY;\r\n this.statusData = [];\r\n this.documentListResponse = null;\r\n this.applicationNumber = SHARED.EMPTY;\r\n this.selectedMenuItemId = null;\r\n this.navigationInfo = null;\r\n }\r\n\r\n /**\r\n * Handles contextId change by clearing all state and refetching data\r\n */\r\n handleContextIdChange(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.subscription.unsubscribe();\r\n this.subscription = new Subscription();\r\n this.documentHelperService.cleanupSelectionWatcher();\r\n this.clearAllState();\r\n this.initializeData();\r\n }\r\n }\r\n\r\n /**\r\n * Sets up subscriptions to monitor menu item and user selection changes\r\n * to trigger status data fetching and user list refreshing\r\n */\r\n setupStatusDataSubscriptions(): void {\r\n \r\n this.subscription.add(\r\n this.documentQuery.selectSelectedUserId().subscribe(userId => {\r\n this.fetchStatusData();\r\n if (this.catagories.length > 0) {\r\n this.fetchUserListWithFilters();\r\n }\r\n })\r\n );\r\n this.subscription.add(\r\n this.documentQuery.selectSelectedStatus().subscribe(status => {\r\n this.fetchStatusData();\r\n if (this.catagories.length > 0) {\r\n this.fetchUserListWithFilters();\r\n }\r\n })\r\n );\r\n this.fetchStatusData();\r\n }\r\n\r\n onDocumentSelectedInNewTab(event: { selectedDocument: any; contextId: string; documentList: any[] }): void {\r\n // Call callback first if provided (preserves user gesture chain)\r\n if (this.onOpenInNewTab && typeof this.onOpenInNewTab === 'function') {\r\n this.onOpenInNewTab(event);\r\n }\r\n this.selectedDocumentInNewTab.emit(event);\r\n }\r\n /**\r\n * Fetches status data based on current selections\r\n */\r\n fetchStatusData(): void {\r\n if (!this.contextId) {\r\n console.warn(ERRORS.CONTEXT_ID_REQUIRED);\r\n return;\r\n }\r\n\r\n const currentState = this.documentQuery.getSelectionState();\r\n const contextId = currentState.userId || null;\r\n this.documentHttpService.getStatusDocumentCount(this.contextId, contextId, null).subscribe({\r\n next: (statusData) => {\r\n this.statusData = statusData;\r\n this.documentStore.setStatusData(statusData);\r\n },\r\n error: (error) => {\r\n console.error(ERRORS.ERROR_FETCHING_STATUS_DATA, error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Fetches userlist data with current filters applied\r\n */\r\n fetchUserListWithFilters(): void {\r\n if (!this.contextId) {\r\n console.warn(ERRORS.CONTEXT_ID_REQUIRED);\r\n return;\r\n }\r\n\r\n const currentState = this.documentQuery.getSelectionState();\r\n // If the API supports filtering by menu item or status, we can add those parameters\r\n this.documentHttpService.getUserListByContextId(this.contextId).subscribe({\r\n next: (res: UserListModel[]) => {\r\n this.userList = res;\r\n this.documentStore.setUserList(res);\r\n },\r\n error: (err: any) => {\r\n console.error(ERRORS.ERROR_FETCHING_USER_LIST, err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Fetches document catagory data.\r\n */\r\n fetchDocumentCatagories(): void {\r\n const categoriesSubscription = this.documentHttpService.getDocumentCatagories(this.contextId).subscribe({\r\n next: (categories: any) => {\r\n if (categories) {\r\n this.catagories = categories.categories;\r\n this.applicationNumber = categories.applicationNumber;\r\n this.documentStore.setDocumentCategories(categories.categories);\r\n\r\n }\r\n },\r\n error: (err: any) => {\r\n console.error(ERRORS.ERROR_FETCHING_DOCUMENT_CATEGORIES, err);\r\n }\r\n });\r\n this.subscription.add(categoriesSubscription);\r\n }\r\n \r\n /**\r\n * Refetches all data when contextId changes\r\n */\r\n refetchAllDataForNewContext(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.documentStore.clearSelectionState();\r\n this.documentStore.clearDocumentViewerState();\r\n this.fetchDocumentCatagories();\r\n this.fetchUserListWithFilters();\r\n this.fetchStatusData();\r\n this.documentHelperService.initializeSelectionWatcherWithInitialLoad(this.contextId);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up subscription to listen for filtered document responses\r\n */\r\n setupFilteredDocumentSubscription(): void {\r\n this.subscription.add(\r\n this.documentQuery.selectDocumentListResponse().subscribe({\r\n next: (response: any) => {\r\n this.documentListResponse = response;\r\n },\r\n error: (error: any) => {\r\n console.error(ERRORS.ERROR_RECEIVING_DOCUMENT_LIST, error);\r\n }\r\n })\r\n );\r\n }\r\n\r\n onDocumentSelected(document: any): void {\r\n console.log('Document selected:', document);\r\n this.selectedDocument.emit(document);\r\n }\r\n\r\n /** \r\n * Unsubscribe subscription on destroy of component and clean up state.\r\n */\r\n ngOnDestroy(): void {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n if (this.selectedMenuItemSubscription) {\r\n this.selectedMenuItemSubscription.unsubscribe();\r\n }\r\n this.documentHelperService.cleanupSelectionWatcher();\r\n this.clearAllState();\r\n }\r\n}\r\n","<div class=\"grid m-0 h-full\">\r\n <!-- <div class=\"menu-panel col-12 md:col-2\">\r\n <lib-documents-menu \r\n [catagories]=\"catagories\" \r\n [applicationNumber]=\"applicationNumber\" \r\n [contextId]=\"contextId\"\r\n (menuItemSelected)=\"onMenuItemSelected($event)\">\r\n </lib-documents-menu>\r\n </div> -->\r\n \r\n <div class=\"col-12 md:col-12 p-0 h-full\" #contentScrollContainer>\r\n <div class=\"content-card\">\r\n <lib-folder-container [contextId]=\"contextId\" [userList]=\"userList\" [statusData]=\"statusData\" [categories]=\"catagories\"></lib-folder-container>\r\n </div>\r\n <div class=\"document-list-container\">\r\n <lib-document-list \r\n [contextId]=\"contextId\" \r\n [documentListResponse]=\"documentListResponse\"\r\n [selectedMenuItemId]=\"selectedMenuItemId\"\r\n [navigationInfo]=\"navigationInfo\"\r\n (handleSelectedDocumentInNewTab)=\"onDocumentSelectedInNewTab($event)\"\r\n (handleSelectedDocument)=\"onDocumentSelected($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </lib-document-list>\r\n </div>\r\n </div>\r\n <p-confirmDialog \r\n [style]=\"{width: '25vw'}\" \r\n acceptLabel=\"Yes\"\r\n rejectLabel=\"No\"\r\n appendTo=\"body\"\r\n acceptIcon=\"pi pi-check\"\r\n rejectIcon=\"pi pi-times\">\r\n </p-confirmDialog>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { FolderBlockModel } from '../../models/folder.model';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\n\r\n/**\r\n * The `FolderBlockComponent` is responsible for displaying a block of folders and\r\n * providing filtering functionality based on folder IDs.\r\n *\r\n * It uses data from the `DocumentStore` and constants from the `SHARED` configuration \r\n * to display missing and pending file counts.\r\n */\r\n@Component({\r\n selector: 'lib-folder-block',\r\n standalone: false,\r\n templateUrl: './folder-block.component.html',\r\n styleUrl: './folder-block.component.scss'\r\n})\r\nexport class FolderBlockComponent {\r\n /**\r\n * Array of folder blocks data to display.\r\n * Each folder is represented as a `FolderBlockModel`.\r\n */\r\n @Input() folderList : FolderBlockModel[] = SHARED.EMPTY_ARRAY;\r\n \r\n /** Number of missing files, sourced from the `SHARED` constants. */\r\n missingFileCount = SHARED.MISSINGCOUNT;\r\n\r\n /** Number of pending files, sourced from the `SHARED` constants. */\r\n pendingFileCount = SHARED.PENDINGCOUNT;\r\n\r\n /**\r\n * Injects the `DocumentStore` service to manage and access document-related state.\r\n * @param {DocumentStore} documentStore - The state management store for documents.\r\n */\r\n constructor(public documentStore: DocumentStore) {}\r\n\r\n /**\r\n * Handles the click event for filtering based on the provided folder ID.\r\n * This method validates the folder ID and returns it for further processing. \r\n * If the folder ID is not provided, an empty string is returned.\r\n * @param {string} folderBlockId - The unique identifier of the folder to filter by.\r\n * @returns {string} The validated folder ID, or an empty string if the input is invalid.\r\n */\r\n handleClickForFilter(folderBlockId: string): string {\r\n if (!folderBlockId) {\r\n return SHARED.EMPTY;\r\n }\r\n this.documentStore.setParentDocumentTypeId(folderBlockId);\r\n return folderBlockId;\r\n }\r\n \r\n}\r\n","<div class=\"card p-0 folder-info\">\r\n <div class=\"text-900 text-xl font-semibold ml-2 mb-1\">Folders</div>\r\n <div class=\"grid m-0\">\r\n <div *ngFor=\"let folder of folderList\" class=\"col-12 md:col-6 xl:col-4 container-wrapper\">\r\n <div\r\n class=\"p-3 border-1 h-full surface-border flex flex-column justify-content-between hover:surface-100 cursor-pointer border-round\"\r\n (click)=\"handleClickForFilter(folder._id)\"\r\n >\r\n <div class=\"icon\">\r\n <img src=\"../../../../assets/images/FolderImg.png\" alt=\"\" />\r\n </div>\r\n <div class=\"flex flex-column\">\r\n <span class=\"text-600 mt-2\"> {{ folder.documentCount }} Files </span>\r\n <span class=\"text-900 text-lg mt-2 mb-2 font-semibold font-medium\">\r\n {{ folder.folderName }}\r\n </span>\r\n </div>\r\n <hr />\r\n <div class=\"flex justify-content-between\">\r\n <div class=\"flex flex-column\">\r\n <span>Missing</span>\r\n <span\r\n [ngClass]=\"{\r\n 'text-pink-500': missingFileCount > 0,\r\n 'text-green-500': missingFileCount === 0\r\n }\"\r\n >\r\n {{ missingFileCount }}\r\n </span>\r\n </div>\r\n <div class=\"flex flex-column\">\r\n <span>Pending</span>\r\n <span\r\n [ngClass]=\"{\r\n 'text-yellow-500': pendingFileCount > 0,\r\n 'text-green-500': pendingFileCount === 0\r\n }\"\r\n >\r\n {{ pendingFileCount }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { DocumentModel } from '../../models/document.model';\r\n\r\n/**\r\n * DocumentListItemComponent\r\n *\r\n * This component displays individual document items within a list. \r\n * It accepts a list of documents as input and handles interactions with documents.\r\n */\r\n@Component({\r\n selector: 'lib-document-list-item',\r\n standalone: false,\r\n templateUrl: './document-list-item.component.html',\r\n styleUrls: ['./document-list-item.component.scss']\r\n})\r\nexport class DocumentListItemComponent {\r\n /**\r\n * Emit the selected document.\r\n * @type {EventEmitter<DocumentModel>}\r\n */\r\n @Output() documentClick = new EventEmitter<DocumentModel>();\r\n \r\n /**\r\n * The document to display.\r\n * @type {DocumentModel[]}\r\n */\r\n @Input() document!: DocumentModel;\r\n\r\n /**\r\n * Handles interactions with a document.\r\n * @param {DocumentModel} document - The document to be opened or interacted with.\r\n */\r\n handleOpenDocument(document: DocumentModel): void {\r\n if (!document) {\r\n console.error('Error: Document is null or undefined:', document);\r\n return;\r\n }\r\n this.documentClick.emit(document);\r\n }\r\n}\r\n","<div class=\"grid m-0\">\r\n <div\r\n class=\"col-12 flex align-items-center justify-content-between md:col-12 xl:col-12\"\r\n >\r\n <div\r\n class=\"col-5 flex cursor-pointer align-items-center pl-0\"\r\n (click)=\"handleOpenDocument(document)\"\r\n >\r\n <img src=\"../../../../assets/images/Frame.png\" alt=\"\" />\r\n <span class=\"ml-4 file-name-wrapper document-text-wrapper\">{{ document.fileName }}</span>\r\n </div>\r\n <div class=\"col-4 flex align-items-center justify-content-center\">\r\n <span\r\n [class]=\"'product-badge status-' + document.status?.toLowerCase()\"\r\n class=\"flex align-items-center justify-content-center pl-2 pr-2 pt-1 pb-1\"\r\n >\r\n <ng-container *ngIf=\"document.status?.toLowerCase() === 'pending'\">\r\n <i class=\"pi pi-clock pr-1\" style=\"font-size: 12px;\"></i>\r\n Pending\r\n </ng-container>\r\n <ng-container *ngIf=\"document.status?.toLowerCase() === 'verified'\">\r\n <i class=\"pi pi-check-circle pr-1\" style=\"font-size: 12px;\"></i>\r\n Verified\r\n </ng-container>\r\n <ng-container *ngIf=\"document.status?.toLowerCase() === 'alert'\">\r\n <i class=\"pi pi-bell pr-1\" style=\"font-size: 12px;\"></i>\r\n Alert\r\n </ng-container>\r\n </span>\r\n </div>\r\n <div class=\"document-type file-name-wrapper document-text-wrapper\">\r\n {{document.documentTypeName}}\r\n </div>\r\n </div>\r\n </div>\r\n ","import { ErrorHandler, Injectable, Injector } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\n\r\n/**\r\n * GlobalErrorHandler is a custom error handler that implements the ErrorHandler interface.\r\n * It is used to handle both HTTP errors and other types of errors globally in the application.\r\n * @class\r\n * @implements {ErrorHandler}\r\n * @decorator {Injectable}\r\n */\r\n@Injectable()\r\nexport class GlobalErrorHandler implements ErrorHandler {\r\n /**\r\n * Creates an instance of GlobalErrorHandler.\r\n * @constructor\r\n * @param {Injector} injector - The Angular injector used to get instances of services.\r\n */\r\n constructor(private injector: Injector) { }\r\n\r\n /**\r\n * Handles errors globally in the application.\r\n * \r\n * @param {any} error - The error object that needs to be handled.\r\n * @returns {void}\r\n */\r\n handleError(error: any): void {\r\n console.error('GlobalErrorHandler:', error);\r\n }\r\n}\r\n","import { Directive, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\nimport { DocumentModel } from \"../models/document.model\";\r\nimport { DocumentHelperService } from \"../services/document.service\";\r\n\r\n/**\r\n * Directive to display the document data\r\n */\r\n@Directive({\r\n selector: '[doc]',\r\n standalone: false\r\n})\r\nexport class DocumentDirective {\r\n\r\n /**\r\n * Creates an instance of DocumentDirective.\r\n * @param documentService Service to get the document data.\r\n * @param templateRef Reference to the template.\r\n * @param vcr View container reference to manage the view.\r\n */\r\n constructor(\r\n private documentService: DocumentHelperService,\r\n private templateRef: TemplateRef<any>,\r\n private vcr: ViewContainerRef\r\n ) {\r\n this.documentService.get().subscribe((document: DocumentModel | null) => {\r\n this.vcr.clear();\r\n if (document) {\r\n this.vcr.createEmbeddedView(this.templateRef, { $implicit: document });\r\n }\r\n });\r\n }\r\n}","import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { DocumentModel } from '../../models/document.model';\r\nimport { DocumentListItem } from '../../models/document-list-response.model';\r\n/**\r\n * Description placeholder\r\n * @class LinkedDocumentComponent\r\n * @typedef {LinkedDocumentComponent}\r\n * @implements {OnChanges}\r\n */\r\n@Component({\r\n selector: 'app-linked-document',\r\n templateUrl: './linked-document.component.html',\r\n styleUrl: './linked-document.component.scss',\r\n standalone : false\r\n})\r\nexport class LinkedDocumentComponent {\r\n /**\r\n * Selected document for view.\r\n * @type {?DocumentModel}\r\n */\r\n @Input() selectedDocument?: DocumentListItem;\r\n /**\r\n * Whole document list.\r\n * @type {?DocumentModel[]}\r\n */\r\n @Input() documentList?: DocumentListItem[];\r\n /**\r\n * Changed selected document.\r\n * @type {*}\r\n */\r\n @Output() selectedDocumentChange = new EventEmitter<DocumentListItem>();\r\n\r\n /**\r\n * Filtered documents.\r\n * @type {DocumentModel[]}\r\n */\r\n filteredDocuments: DocumentModel[] = [];\r\n\r\n /**\r\n * Handle the click on the document.\r\n * @param {DocumentModel} document - Clicked document.\r\n */\r\n handleDocumentClick(document: DocumentListItem): void {\r\n this.selectedDocument = document;\r\n this.selectedDocumentChange.emit(this.selectedDocument);\r\n }\r\n\r\n}\r\n","<div class=\"summary-card mb-4 pb-1\">\r\n <div class=\"card p-0 mb-0\"\r\n style=\"border-bottom: 1px solid;border-color: rgba(68, 72, 109, 0.2); border-bottom-right-radius: 0px;border-bottom-left-radius: 0px; background-color: #F9fafb;\">\r\n <div class=\"p-0\">\r\n <h4 class=\"m-0 pt-3 pl-3 mb-3\" style=\"font-size: 21px; font-weight: bold; \">Linked Documents</h4>\r\n </div>\r\n </div>\r\n <div class=\"card mb-0\" style=\"border-top-right-radius: 0px;border-top-left-radius: 0px;\">\r\n @for(document of documentList; track document){\r\n <div class=\"linkedDocument documentName m-2\">\r\n <div class=\"documentName\" [class.selected]=\"document._id === selectedDocument?._id\"\r\n (click)=\"handleDocumentClick(document)\">\r\n <span class=\"pi pi-link\"></span>\r\n {{document.fileName}}\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n \r\n \r\n </div>\r\n ","import { Component, Input, OnInit, OnChanges, SimpleChanges, Output, EventEmitter, OnDestroy } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { DocumentCategory, DocumentCategoryItem } from '../../models/document-category.model';\r\nimport { DocumentMenuService } from '../../services/document-menu.service';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { SHARED } from '../../../../Shared/constant/SHARED';\r\n\r\ninterface MenuItemData {\r\n totalDocuments: number;\r\n approvedDocuments: number;\r\n badgeValue: string;\r\n badgeSeverity: 'success' | 'info' | 'warning' | 'danger';\r\n shouldShowBadge: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-documents-menu',\r\n standalone: false,\r\n templateUrl: './documents-menu.component.html',\r\n styleUrl: './documents-menu.component.scss'\r\n})\r\nexport class DocumentsMenuComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() catagories: DocumentCategory[] = SHARED.EMPTY_ARRAY\r\n @Input() applicationNumber : string = SHARED.EMPTY\r\n @Input() contextId: string = SHARED.EMPTY;\r\n @Output() menuItemSelected = new EventEmitter<{\r\n item: DocumentCategoryItem; \r\n category: DocumentCategory;\r\n navigationInfo?: {\r\n menuItemId: string;\r\n menuItemLabel: string;\r\n categoryLabel: string;\r\n categoryIndex: number;\r\n };\r\n }>();\r\n \r\n selectedMenuItem: string | null = null;\r\n selectedMenuItemId: string | null = null;\r\n\r\n // Store the categories from the store\r\n private storeCategories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n \r\n // Cache for categories to avoid repeated processing\r\n private _cachedCategories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n\r\n // Subscriptions to track for cleanup\r\n private selectedMenuItemSubscription!: Subscription;\r\n private documentCategoriesSubscription!: Subscription;\r\n private documentListResponseSubscription!: Subscription;\r\n\r\n constructor(\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery,\r\n private documentMenuService: DocumentMenuService,\r\n private documentHelperService: DocumentHelperService\r\n ) {}\r\n\r\n /**\r\n * Initialize the component\r\n * @returns {void}\r\n * @memberof DocumentsMenuComponent\r\n */\r\n ngOnInit(): void {\r\n this.selectedMenuItemSubscription = this.documentQuery.selectSelectedMenuItem().subscribe(menuItemId => {\r\n this.selectedMenuItemId = menuItemId;\r\n this.selectedMenuItem = this.findMenuItemLabelById(menuItemId);\r\n });\r\n\r\n // Subscribe to document categories from the store\r\n this.documentCategoriesSubscription = this.documentQuery.selectDocumentCategories().subscribe(categories => {\r\n if (categories && categories.length > 0) {\r\n this.storeCategories = categories;\r\n this.updateCachedCategories();\r\n this.updateMenuItemsData();\r\n }\r\n });\r\n\r\n // Subscribe to document list response to update menu item selectability\r\n this.setupDocumentListResponseSubscription();\r\n }\r\n\r\n /**\r\n * Handle changes to input properties\r\n * @param {SimpleChanges} changes - The changes to the input properties\r\n * @returns {void}\r\n * @memberof DocumentsMenuComponent\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.CATAGORIES] && this.catagories) {\r\n this.updateCachedCategories();\r\n this.updateMenuItemsData();\r\n }\r\n \r\n if (changes[SHARED.CONTEXT_ID] && !changes[SHARED.CONTEXT_ID].firstChange) {\r\n this.handleContextIdChange();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the categories to use for the menu\r\n * Priority: Store categories > Input categories\r\n * Categories maintain their original order as provided by the API\r\n */\r\n get categories(): DocumentCategory[] {\r\n return this._cachedCategories;\r\n }\r\n\r\n /**\r\n * Updates the cached categories when data changes\r\n * Maintains the original order as provided by the API\r\n */\r\n private updateCachedCategories(): void {\r\n const nextCategories = this.storeCategories.length > 0 ? this.storeCategories : this.catagories;\r\n if (!this._cachedCategories || this._cachedCategories.length === 0) {\r\n this._cachedCategories = nextCategories;\r\n return;\r\n }\r\n const previousById = new Map<string, boolean>();\r\n this._cachedCategories.forEach(category => {\r\n category.items?.forEach(item => {\r\n if ((item as any).isSelectable !== undefined) {\r\n previousById.set(item._id, (item as any).isSelectable);\r\n }\r\n });\r\n });\r\n\r\n this._cachedCategories = nextCategories.map(category => ({\r\n ...category,\r\n items: category.items?.map(item => ({\r\n ...item,\r\n isSelectable: previousById.has(item._id) ? previousById.get(item._id)! : (item as any).isSelectable\r\n }))\r\n }));\r\n }\r\n\r\n /**\r\n * Finds the label of a menu item by its _id\r\n * @param id The _id to search for\r\n * @returns The label of the menu item or null if not found\r\n */\r\n private findMenuItemLabelById(id: string | null): string | null {\r\n if (!id) return null;\r\n \r\n for (const category of this.categories) {\r\n if (category.items) {\r\n const item = category.items.find(item => item._id === id);\r\n if (item) {\r\n return item.label;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Finds the category for a menu item by its _id\r\n * @param id The _id to search for\r\n * @returns The category or null if not found\r\n */\r\n private findMenuItemCategoryById(id: string | null): DocumentCategory | null {\r\n if (!id) return null;\r\n \r\n for (const category of this.categories) {\r\n if (category.items) {\r\n const item = category.items.find(item => item._id === id);\r\n if (item) {\r\n return category;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n \r\n /**\r\n * Update menu use catagories\r\n */\r\n private updateMenuItemsData(): void {\r\n this.updateCachedCategories();\r\n \r\n this._cachedCategories.forEach(category => {\r\n if (category.items) {\r\n category.items.forEach(item => {\r\n const menuData = {\r\n totalDocuments: this.documentMenuService.getTotalDocuments(item),\r\n approvedDocuments: this.documentMenuService.getApprovedDocuments(item),\r\n badgeValue: this.documentMenuService.getBadgeValue(item),\r\n badgeSeverity: this.documentMenuService.getBadgeSeverity(item),\r\n shouldShowBadge: this.documentMenuService.shouldShowBadge(item)\r\n };\r\n (item as any).menuData = menuData;\r\n \r\n // Initialize isSelectable as true (default state)\r\n if (item.isSelectable === undefined) {\r\n item.isSelectable = true;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets up subscription to document list response to update menu item selectability\r\n */\r\n private setupDocumentListResponseSubscription(): void {\r\n this.documentListResponseSubscription = this.documentQuery.selectDocumentListResponse().subscribe(documentListResponse => {\r\n this.updateMenuItemsSelectability(documentListResponse);\r\n });\r\n }\r\n\r\n /**\r\n * Updates menu items with selectability status based on filtered document list\r\n * @param documentListResponse - The filtered document list response\r\n */\r\n private updateMenuItemsSelectability(documentListResponse: any): void {\r\n if (this._cachedCategories && this._cachedCategories.length > 0) {\r\n // Only update if we have a valid response (not null/undefined)\r\n // If response is null, keep previous selectability to avoid flicker/reset during refresh\r\n if (documentListResponse !== null && documentListResponse !== undefined) {\r\n this._cachedCategories = this.documentMenuService.updateMenuItemsWithSelectabilityStatus(\r\n this._cachedCategories, \r\n documentListResponse\r\n );\r\n } else {\r\n // Do nothing; preserve existing isSelectable values\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Handle the menu item click for navigation\r\n * @param {*} event - Event \r\n * @param {DocumentCategoryItem} item - catagory item\r\n */\r\n onMenuItemClick(event: any, item: DocumentCategoryItem): void {\r\n // Prevent selection if the menu item is not selectable\r\n if (item.isSelectable === false) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n if (this.selectedMenuItemId === item._id) {\r\n this.selectedMenuItem = null;\r\n this.selectedMenuItemId = null;\r\n this.documentStore.setSelectedMenuItem(null);\r\n this.menuItemSelected.emit({\r\n item: item, \r\n category: this.findMenuItemCategoryById(item._id)!,\r\n navigationInfo: undefined\r\n });\r\n } else {\r\n this.selectedMenuItem = item.label;\r\n this.selectedMenuItemId = item._id;\r\n this.documentStore.setSelectedMenuItem(item._id);\r\n const category = this.findMenuItemCategoryById(item._id);\r\n if (category) {\r\n this.menuItemSelected.emit({\r\n item: item, \r\n category: category,\r\n navigationInfo: {\r\n menuItemId: item._id,\r\n menuItemLabel: item.label,\r\n categoryLabel: category.label,\r\n categoryIndex: this.categories.findIndex(cat => cat === category)\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Get the selected menu item\r\n * @returns {string | null} - The selected menu item\r\n */\r\n getSelectedMenuItem(): string | null {\r\n return this.selectedMenuItem;\r\n }\r\n\r\n /**\r\n * Handles contextId changes by clearing current selection\r\n */\r\n private handleContextIdChange(): void {\r\n if (this.contextId && this.contextId !== SHARED.EMPTY) {\r\n this.selectedMenuItem = null;\r\n this.selectedMenuItemId = null;\r\n this.documentStore.setSelectedMenuItem(null);\r\n }\r\n }\r\n\r\n /**\r\n * Get the selected menu item id\r\n * @returns {string | null} - The selected menu item id\r\n */\r\n getSelectedMenuItemId(): string | null {\r\n return this.selectedMenuItemId;\r\n }\r\n\r\n /**\r\n * Clean up subscriptions when component is destroyed\r\n * Prevents memory leaks and ensures proper cleanup\r\n */\r\n ngOnDestroy(): void {\r\n if (this.selectedMenuItemSubscription) {\r\n this.selectedMenuItemSubscription.unsubscribe();\r\n }\r\n if (this.documentCategoriesSubscription) {\r\n this.documentCategoriesSubscription.unsubscribe();\r\n }\r\n if (this.documentListResponseSubscription) {\r\n this.documentListResponseSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<div class=\"document-sidebar-container\">\r\n <!-- Menu items are now used for navigation to specific sections, not for filtering documents -->\r\n <p-card class=\"widget-menu-wrapper h-full\">\r\n @if(applicationNumber){\r\n <div class=\"flex align-items-center justify-content-between widget-menu-header-wrapper\">\r\n <p class=\"mb-0 application-title-wrapper\">ID - {{applicationNumber}}</p>\r\n <div class=\"expand-icon-wrapper\">\r\n <i class=\"ri-arrow-left-s-line text-primary flex align-items-center justify-content-center w-full h-full\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"widget-menu-container\" >\r\n <div class=\"widget-menu-wrapper h-ful l custom-scroll\">\r\n <p-menu [model]=\"categories\" styleClass=\"w-full md:w-15rem\">\r\n <ng-template pTemplate=\"submenuheader\" let-item>\r\n <span [style]=\"{\r\n color : '#9EA0B3'\r\n }\">{{ item.label }} Documents</span>\r\n </ng-template>\r\n <ng-template pTemplate=\"item\" let-item>\r\n <a pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [class.selected-menu-item]=\"selectedMenuItemId === item._id\"\r\n [class.disabled-menu-item]=\"item.isSelectable === false\"\r\n [class.pointer-events-none]=\"item.isSelectable === false\"\r\n [style.opacity]=\"item.isSelectable === false ? '0.5' : '1'\"\r\n [style.cursor]=\"item.isSelectable === false ? 'not-allowed' : 'pointer'\"\r\n (click)=\"onMenuItemClick($event, item)\">\r\n <span [class]=\"item.icon\" class=\"text-xl\"></span>\r\n <span class=\"ml-2\">{{ item.label }}</span>\r\n <p-badge *ngIf=\"item.menuData?.shouldShowBadge\" \r\n class=\"ml-auto\" \r\n [severity]=\"item.menuData?.badgeSeverity\" \r\n [value]=\"item.menuData?.badgeValue\" />\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n </div>\r\n </div>\r\n </p-card>\r\n</div>\r\n\r\n ","import { Injectable } from '@angular/core';\r\nimport { UserListModel } from '../models/user-list.model';\r\nimport { SHARED } from '../../../Shared/constant/SHARED'\r\nimport { DocumentStore } from '../state/document.store';\r\nimport { DocumentQuery } from '../state/document.query';\r\nimport { DocumentCategory } from '../models/document-category.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserListService {\r\n\r\n constructor(\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery\r\n ) { }\r\n\r\n getInitials(name: string): string {\r\n if (!name || name.trim() === SHARED.EMPTY) {\r\n return SHARED.EMPTY;\r\n }\r\n const words = name.trim().split(SHARED.EMPTY_SPACE).filter(word => word.length > SHARED.INITIAL_COUNT);\r\n if (words.length === 1) {\r\n return words[0].substring(0, 2).toUpperCase();\r\n } else if (words.length >= 2) {\r\n const firstWord = words[0];\r\n const lastWord = words[words.length - 1];\r\n return (firstWord.charAt(0) + lastWord.charAt(0)).toUpperCase();\r\n }\r\n return SHARED.EMPTY;\r\n }\r\n\r\n getColorByIndex(index: number): string {\r\n const colors = SHARED.COLORS;\r\n return colors[index % colors.length];\r\n }\r\n\r\n getColorValue(colorName: string): string {\r\n const colorMap: { [key: string]: string } = SHARED.COLOR_MAP;\r\n return colorMap[colorName] || SHARED.DEFAULT_COLOR;\r\n }\r\n\r\n processUserData(userList: UserListModel[]): UserListModel[] {\r\n return userList.map((user, index) => ({\r\n ...user,\r\n initials: this.getInitials(user.name),\r\n color: this.getColorByIndex(index)\r\n }));\r\n }\r\n\r\n /**\r\n * Filters user list based on selected menu item category\r\n * @param userList - The complete user list\r\n * @param categories - The document categories\r\n * @returns Filtered user list\r\n */\r\n filterUsersByCategory(userList: UserListModel[], categories: DocumentCategory[]): UserListModel[] {\r\n return userList;\r\n }\r\n\r\n selectUser(userId: string, userData: UserListModel[]): { selectedUser: string | undefined; name: string | undefined } {\r\n const user = userData.find(u => u._id === userId);\r\n if (user) {\r\n this.documentStore.setSelectedUserId(userId);\r\n return { selectedUser: user.name, name: user.name };\r\n }\r\n return { selectedUser: undefined, name: undefined };\r\n }\r\n\r\n unselectUser(): void {\r\n this.documentStore.setSelectedUserId(null);\r\n }\r\n\r\n isUserSelected(userId: string, userData: UserListModel[], selectedUser: string | undefined): boolean {\r\n return selectedUser === userData.find(u => u._id === userId)?.name;\r\n }\r\n} ","\r\nimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport { SHARED, USERLIST } from '../../../../Shared/constant/SHARED';\r\nimport { DocumentStore } from '../../state/document.store';\r\nimport { DocumentQuery } from '../../state/document.query';\r\nimport { UserListModel } from '../../models/user-list.model';\r\nimport { UserListService } from '../../services/user-list.service';\r\nimport { DocumentCategory } from '../../models/document-category.model';\r\nimport { DocumentHelperService } from '../../services/document.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-user-list',\r\n standalone : false,\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('slideInFromTop', [\r\n state('void', style({\r\n opacity: 0,\r\n transform: 'translateY(-10px)'\r\n })),\r\n state('*', style({\r\n opacity: 1,\r\n transform: 'translateY(0)'\r\n })),\r\n transition('void => *', [\r\n animate('300ms ease-out')\r\n ])\r\n ]),\r\n trigger('fadeIn', [\r\n state('void', style({\r\n opacity: 0,\r\n transform: 'scale(0.8)'\r\n })),\r\n state('*', style({\r\n opacity: 1,\r\n transform: 'scale(1)'\r\n })),\r\n transition('void => *', [\r\n animate('200ms ease-in-out')\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class UserListComponent implements OnInit, OnChanges {\r\n \r\n @Input() userList: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n @Input() categories: DocumentCategory[] = SHARED.EMPTY_ARRAY;\r\n @Output() userSelected = new EventEmitter<string>();\r\n \r\n userData: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n filteredUserData: UserListModel[] = SHARED.EMPTY_ARRAY;\r\n selectedUser: string | undefined;\r\n shouldShowContainer: boolean = true;\r\n \r\n private userListSubscription: Subscription = new Subscription();\r\n private categoriesSubscription: Subscription = new Subscription();\r\n \r\n constructor(\r\n public documentService : DocumentHelperService,\r\n private documentStore: DocumentStore,\r\n private documentQuery: DocumentQuery,\r\n private userListService: UserListService,\r\n private cdr: ChangeDetectorRef\r\n ){\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[SHARED.USER_LIST] && !changes[SHARED.USER_LIST].firstChange) {\r\n this.initializeUserData();\r\n }\r\n if (changes[SHARED.CATEGORIES] && !changes[SHARED.CATEGORIES].firstChange) {\r\n this.updateFilteredUserData();\r\n }\r\n }\r\n\r\n initializeUserData(): void {\r\n if (this.userList && this.userList.length > 0) {\r\n this.userData = this.userListService.processUserData(this.userList);\r\n this.updateFilteredUserData();\r\n }\r\n }\r\n\r\n updateFilteredUserData(): void {\r\n if (this.userData.length > 0 && this.categories.length > 0) {\r\n this.filteredUserData = this.userListService.filterUsersByCategory(this.userData, this.categories);\r\n this.shouldShowContainer = true;\r\n if (this.selectedUser) {\r\n const selectedUserInFiltered = this.filteredUserData.find(user => user.name === this.selectedUser);\r\n if (!selectedUserInFiltered) {\r\n this.selectedUser = undefined;\r\n this.documentStore.setSelectedUserId(null);\r\n this.userSelected.emit(SHARED.EMPTY);\r\n }\r\n }\r\n } else {\r\n this.filteredUserData = this.userData;\r\n this.shouldShowContainer = true;\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initializeUserData();\r\n this.userListSubscription.add(\r\n this.documentQuery.selectUserList().subscribe(userList => {\r\n if (userList && userList.length > 0) {\r\n this.userList = userList;\r\n this.initializeUserData();\r\n this.cdr.markForCheck();\r\n }\r\n })\r\n );\r\n\r\n this.categoriesSubscription.add(\r\n this.documentQuery.selectDocumentCategories().subscribe(categories => {\r\n if (categories && categories.length > 0) {\r\n this.categories = categories;\r\n this.updateFilteredUserData();\r\n this.cdr.markForCheck();\r\n }\r\n })\r\n );\r\n\r\n this.userListSubscription.add(\r\n this.documentQuery.selectDocumentListResponse().subscribe(() => {\r\n const currentUserList = this.documentQuery.getUserList();\r\n if (currentUserList && currentUserList.length > 0) {\r\n this.userList = currentUserList;\r\n this.initializeUserData();\r\n this.cdr.markForCheck();\r\n }\r\n })\r\n );\r\n\r\n this.documentQuery.selectSelectedUserId().subscribe(userId => {\r\n if (userId) {\r\n const user = this.userData.find(u => u._id === userId);\r\n this.selectedUser = user ? user.name : undefined;\r\n } else {\r\n this.selectedUser = undefined;\r\n }\r\n this.cdr.markForCheck();\r\n });\r\n\r\n this.documentQuery.selectShowUserList().subscribe(show => {\r\n if (!show && this.selectedUser) {\r\n this.selectedUser = undefined;\r\n this.userSelected.emit(SHARED.EMPTY);\r\n }\r\n });\r\n }\r\n\r\n onUserSelect(username: string, id: string): void {\r\n if (this.selectedUser === username) {\r\n this.selectedUser = undefined;\r\n this.userListService.unselectUser();\r\n this.userSelected.emit(SHARED.EMPTY);\r\n } else {\r\n this.selectedUser = username;\r\n this.documentStore.setSelectedUserId(id);\r\n this.userSelected.emit(username);\r\n }\r\n }\r\n\r\n getAvatarColor(color: string | undefined): string {\r\n if (!color) {\r\n return SHARED.DEFAULT_COLOR;\r\n }\r\n return SHARED.COLOR_MAP[color as keyof typeof SHARED.COLOR_MAP] || SHARED.DEFAULT_COLOR;\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n this.userListSubscription.unsubscribe();\r\n this.categoriesSubscription.unsubscribe();\r\n }\r\n}","<div class=\"user-list-container\" [@slideInFromTop]>\r\n <div class=\"user-cards\">\r\n <div \r\n *ngFor=\"let user of filteredUserData\" \r\n class=\"user-card\"\r\n [class.selected]=\"selectedUser === user.name\"\r\n [style.border-color]=\"selectedUser === user.name ? getAvatarColor(user.color) : 'transparent'\"\r\n (click)=\"onUserSelect(user.name, user._id)\"\r\n >\r\n @if(user.name === \"Application Docs\"){\r\n <div class=\"user-avatar\" [ngClass]=\"'avatar-' + user.color\">\r\n <span class=\"initials\"><i class=\"pi pi-user\"></i></span>\r\n </div>\r\n }@else {\r\n <div class=\"user-avatar\" [ngClass]=\"'avatar-' + user.color\">\r\n <span class=\"initials\">{{ user.initials }}</span>\r\n </div>\r\n }\r\n <div class=\"user-info\">\r\n <div class=\"username\">{{ user.name }}</div>\r\n <div class=\"document-counts\">\r\n <span style=\"color : #16A34A;\"> {{ user.approved }} approved </span><span>/ {{ user.pending }} outstanding</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n <!-- Show message when filtered list is empty -->\r\n <div *ngIf=\"filteredUserData.length === 0 && shouldShowContainer\" class=\"no-users-message\" [@slideInFromTop]>\r\n <p>No users available for this category.</p>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TablePrimaryComponent } from './components/table-primary/table-primary.component';\r\nimport { TableModule } from 'primeng/table';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\r\nimport { HasPermissionDirective } from '../lib/document/directives/permission.directive';\r\nimport { ConfirmationDialogComponent } from './components/confirmation-dialog/confirmation-dialog.component';\r\nimport { ConfirmationService } from 'primeng/api';\r\n\r\n\r\n@NgModule({\r\n declarations: [TablePrimaryComponent, HasPermissionDirective, ConfirmationDialogComponent],\r\n imports: [\r\n CommonModule,\r\n TableModule,\r\n ButtonModule,\r\n RippleModule,\r\n ConfirmDialogModule\r\n ],\r\n providers: [ConfirmationService],\r\n exports : [TablePrimaryComponent, HasPermissionDirective, ConfirmationDialogComponent, ConfirmDialogModule]\r\n})\r\nexport class SharedModule { }\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Service for handling document content types and their mappings.\r\n * Supports the content types: \"xlsx\",\"xls\",\"doc\",\"docx\",\"pdf\",\"jpg\",\"jpeg\",\"odt\",\"csv\",\"png\",\"msg\",\"eml\"\r\n * @class DocumentContentTypeService\r\n * @typedef {DocumentContentTypeService}\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentContentTypeService {\r\n\r\n /**\r\n * Mapping of file extensions to MIME types\r\n * @type {Record<string, string>}\r\n */\r\n private readonly extensionToMimeType: Record<string, string> = {\r\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'xls': 'application/vnd.ms-excel',\r\n 'doc': 'application/msword',\r\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'pdf': 'application/pdf',\r\n 'jpg': 'image/jpeg',\r\n 'jpeg': 'image/jpeg',\r\n 'odt': 'application/vnd.oasis.opendocument.text',\r\n 'csv': 'text/csv',\r\n 'png': 'image/png',\r\n 'msg': 'application/vnd.ms-outlook',\r\n 'eml': 'message/rfc822'\r\n };\r\n\r\n /**\r\n * Mapping of MIME types to file extensions\r\n * @type {Record<string, string>}\r\n */\r\n private readonly mimeTypeToExtension: Record<string, string> = {\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\r\n 'application/vnd.ms-excel': 'xls',\r\n 'application/msword': 'doc',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\r\n 'application/pdf': 'pdf',\r\n 'image/jpeg': 'jpg',\r\n 'image/jpg': 'jpg',\r\n 'application/vnd.oasis.opendocument.text': 'odt',\r\n 'text/csv': 'csv',\r\n 'image/png': 'png',\r\n 'application/vnd.ms-outlook': 'msg',\r\n 'message/rfc822': 'eml'\r\n };\r\n\r\n /**\r\n * List of all supported file extensions\r\n * @type {string[]}\r\n */\r\n readonly supportedExtensions: string[] = [\r\n 'xlsx', 'xls', 'doc', 'docx', 'pdf', 'jpg', 'jpeg', 'odt', 'csv', 'png', 'msg', 'eml'\r\n ];\r\n\r\n /**\r\n * List of all supported MIME types\r\n * @type {string[]}\r\n */\r\n readonly supportedMimeTypes: string[] = [\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.ms-excel',\r\n 'application/msword',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/pdf',\r\n 'image/jpeg',\r\n 'image/jpg',\r\n 'application/vnd.oasis.opendocument.text',\r\n 'text/csv',\r\n 'image/png',\r\n 'application/vnd.ms-outlook',\r\n 'message/rfc822'\r\n ];\r\n\r\n /**\r\n * Gets the MIME type for a given file extension\r\n * @param {string} extension - The file extension (with or without dot)\r\n * @returns {string | undefined} The MIME type or undefined if not supported\r\n */\r\n getMimeType(extension: string): string | undefined {\r\n const cleanExtension = extension.replace('.', '').toLowerCase();\r\n return this.extensionToMimeType[cleanExtension];\r\n }\r\n\r\n /**\r\n * Gets the file extension for a given MIME type\r\n * @param {string} mimeType - The MIME type\r\n * @returns {string | undefined} The file extension or undefined if not supported\r\n */\r\n getExtension(mimeType: string): string | undefined {\r\n return this.mimeTypeToExtension[mimeType];\r\n }\r\n\r\n /**\r\n * Checks if a file extension is supported\r\n * @param {string} extension - The file extension (with or without dot)\r\n * @returns {boolean} True if the extension is supported\r\n */\r\n isExtensionSupported(extension: string): boolean {\r\n const cleanExtension = extension.replace('.', '').toLowerCase();\r\n return this.supportedExtensions.includes(cleanExtension);\r\n }\r\n\r\n /**\r\n * Checks if a MIME type is supported\r\n * @param {string} mimeType - The MIME type\r\n * @returns {boolean} True if the MIME type is supported\r\n */\r\n isMimeTypeSupported(mimeType: string): boolean {\r\n return this.supportedMimeTypes.includes(mimeType);\r\n }\r\n\r\n /**\r\n * Gets the file extension from a filename\r\n * @param {string} filename - The filename\r\n * @returns {string | undefined} The file extension or undefined if no extension found\r\n */\r\n getExtensionFromFilename(filename: string): string | undefined {\r\n if (!filename || !filename.includes('.')) {\r\n return undefined;\r\n }\r\n const parts = filename.split('.');\r\n return parts[parts.length - 1].toLowerCase();\r\n }\r\n\r\n /**\r\n * Gets the MIME type from a filename\r\n * @param {string} filename - The filename\r\n * @returns {string | undefined} The MIME type or undefined if not supported\r\n */\r\n getMimeTypeFromFilename(filename: string): string | undefined {\r\n const extension = this.getExtensionFromFilename(filename);\r\n return extension ? this.getMimeType(extension) : undefined;\r\n }\r\n\r\n /**\r\n * Validates if a file can be uploaded based on its extension\r\n * @param {string} filename - The filename to validate\r\n * @returns {boolean} True if the file can be uploaded\r\n */\r\n canUploadFile(filename: string): boolean {\r\n const extension = this.getExtensionFromFilename(filename);\r\n return extension ? this.isExtensionSupported(extension) : false;\r\n }\r\n\r\n /**\r\n * Gets a human-readable description for a content type\r\n * @param {string} contentType - The content type (MIME type or extension)\r\n * @returns {string} Human-readable description\r\n */\r\n getContentTypeDescription(contentType: string): string {\r\n // Check if it's a MIME type first\r\n if (this.isMimeTypeSupported(contentType)) {\r\n const extension = this.getExtension(contentType);\r\n return this.getExtensionDescription(extension || 'unknown');\r\n }\r\n \r\n // Check if it's an extension\r\n if (this.isExtensionSupported(contentType)) {\r\n return this.getExtensionDescription(contentType);\r\n }\r\n \r\n return 'Unknown Document Type';\r\n }\r\n\r\n /**\r\n * Gets a human-readable description for a file extension\r\n * @param {string} extension - The file extension\r\n * @returns {string} Human-readable description\r\n */\r\n private getExtensionDescription(extension: string): string {\r\n const descriptions: Record<string, string> = {\r\n 'xlsx': 'Excel Spreadsheet (XLSX)',\r\n 'xls': 'Excel Spreadsheet (XLS)',\r\n 'doc': 'Word Document (DOC)',\r\n 'docx': 'Word Document (DOCX)',\r\n 'pdf': 'PDF Document',\r\n 'jpg': 'JPEG Image',\r\n 'jpeg': 'JPEG Image',\r\n 'odt': 'OpenDocument Text',\r\n 'csv': 'CSV File',\r\n 'png': 'PNG Image',\r\n 'msg': 'Outlook Message',\r\n 'eml': 'Email Message'\r\n };\r\n \r\n return descriptions[extension] || 'Unknown File Type';\r\n }\r\n}\r\n","import { APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DocumentContainerComponent } from './components/document-container/document-container.component';\r\nimport { FolderContainerComponent } from './components/folder-container/folder-container.component';\r\nimport { FolderBlockComponent } from './components/folder-block/folder-block.component';\r\nimport { DocumentListComponent } from './components/document-list/document-list.component';\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { DocumentListItemComponent } from './components/document-list-item/document-list-item.component';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { SidebarModule } from 'primeng/sidebar';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { DocumentUploadComponent } from './components/document-upload/document-upload.component';\r\nimport { MessageService } from 'primeng/api';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';\r\nimport { ProgressBarModule } from 'primeng/progressbar';\r\nimport { BadgeModule } from 'primeng/badge';\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { TimelineModule } from 'primeng/timeline';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { InputTextareaModule } from 'primeng/inputtextarea';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DocumentViewerComponent } from './components/document-viewer/document-viewer.component';\r\nimport { DocumentHistoryComponent } from './components/document-history/document-history.component';\r\nimport { DocumentContentViewerComponent } from './components/document-content-viewer/document-content-viewer.component';\r\nimport { DocumentZoomControlsComponent } from './components/document-zoom-controls/document-zoom-controls.component';\r\nimport { PdfViewerModule } from 'ng2-pdf-viewer';\r\nimport { NgxDocViewerModule } from 'ngx-doc-viewer';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { AppConfigService } from '../../Shared/services/app-config.service';\r\nimport { GlobalErrorHandler } from '../../Shared/services/global-error.handler';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { DocumentDirective } from './directives/document.directive';\r\nimport { LinkedDocumentComponent } from './components/linked-document/linked-document.component';\r\nimport { DocumentsMenuComponent } from './components/documents-menu/documents-menu.component';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { CardModule } from 'primeng/card';\r\nimport { TableModule } from 'primeng/table';\r\nimport { UserListComponent } from './components/user-list/user-list.component';\r\nimport { DocumentStatusComponent } from './components/document-status/document-status.component';\r\nimport { DocumentActionsComponent } from './components/document-actions/document-actions.component';\r\nimport { DocumentSearchComponent } from './components/document-search/document-search.component';\r\nimport { SharedModule } from '../../Shared/shared.module';\r\nimport { DocumentActionsService } from './services/document-actions.service';\r\nimport { DocumentContentTypeService } from './services/document-content-type.service';\r\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\r\nimport { RequestDocumentComponent } from './components/request-document/request-document.component';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { MessagesModule } from 'primeng/messages';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { DocumentAiChatComponent } from './components/document-ai-chat/document-ai-chat.component';\r\n\r\n/**\r\n * @module DocumentModule\r\n * \r\n * The `DocumentModule` handles the organization and display of document and folder components \r\n * in the application. This module is designed to support features like folder containers, \r\n * document lists, and individual document items.\r\n */\r\n@NgModule({\r\n declarations: [\r\n /**\r\n * The main container for managing documents.\r\n * DocumentContainerComponent\r\n */\r\n DocumentContainerComponent,\r\n\r\n /**\r\n * A container component to manage folders.\r\n * FolderContainerComponent\r\n */\r\n FolderContainerComponent,\r\n\r\n /**\r\n * A block component that represents an individual folder.\r\n * FolderBlockComponent\r\n */\r\n FolderBlockComponent,\r\n\r\n /**\r\n * A component to display a list of documents.\r\n * DocumentListComponent\r\n */\r\n DocumentListComponent,\r\n\r\n /**\r\n * A component representing an individual item in the document list.\r\n * DocumentListItemComponent\r\n */\r\n DocumentListItemComponent,\r\n\r\n /** \r\n * A component representing to upload a file.\r\n */\r\n DocumentUploadComponent,\r\n\r\n /**\r\n * A component representing and allow you to view the document.\r\n */\r\n DocumentViewerComponent,\r\n\r\n /**\r\n * A component representing document history timeline.\r\n */\r\n DocumentHistoryComponent,\r\n\r\n /**\r\n * A reusable component for viewing different types of document content.\r\n */\r\n DocumentContentViewerComponent,\r\n\r\n /**\r\n * A component providing zoom controls for document viewing.\r\n */\r\n DocumentZoomControlsComponent,\r\n\r\n /**\r\n * A directive to show the document.\r\n */\r\n DocumentDirective,\r\n\r\n /**\r\n * A component which have linked documents.\r\n */\r\n LinkedDocumentComponent,\r\n DocumentsMenuComponent,\r\n UserListComponent,\r\n DocumentStatusComponent,\r\n DocumentActionsComponent,\r\n DocumentSearchComponent,\r\n /**\r\n * A sidebar component for content projection.\r\n */\r\n SidebarComponent,\r\n /**\r\n * A component to request a document (without upload), with description.\r\n */\r\n RequestDocumentComponent,\r\n DocumentAiChatComponent,\r\n\r\n ],\r\n imports: [\r\n /**\r\n * Angular's CommonModule is imported to access common directives like `ngIf` and `ngFor`.\r\n */\r\n CommonModule,\r\n\r\n /**\r\n * PrimeNG AccordionModule is used for creating collapsible sections in the UI.\r\n */\r\n AccordionModule,\r\n\r\n /**\r\n * HttpClientModule for the http calls\r\n */\r\n HttpClientModule,\r\n\r\n /**\r\n * PrimeNG ButtonModule is used for creating buttons in the UI.\r\n */\r\n ButtonModule,\r\n\r\n /**\r\n * PrimeNG SidebarModule is used for creating sidebars.\r\n */\r\n SidebarModule,\r\n\r\n /**\r\n * PrimeNG FileUploadModule is used for uploading file.\r\n */\r\n FileUploadModule,\r\n\r\n /**\r\n * PrimeNG ProgressBarModule is used for showing progress.\r\n */\r\n ProgressBarModule,\r\n\r\n /**\r\n * PrimeNG BadgeModule is used for showing badge value.\r\n */\r\n BadgeModule,\r\n\r\n /**\r\n * PrimeNG ListboxModule is used for showing listbox value.\r\n */\r\n ListboxModule,\r\n\r\n /**\r\n * PrimeNG CheckboxModule is used for showing checkbox value.\r\n */\r\n CheckboxModule,\r\n\r\n /**\r\n * PrimeNG RadioButtonModule is used for showing radio button values.\r\n */\r\n RadioButtonModule,\r\n\r\n /**\r\n * PrimeNG TimelineModule is used for showing timeline value.\r\n */\r\n TimelineModule,\r\n /**\r\n * PrimeNG InputTextareaModule is used for showing textarea value.\r\n */\r\n InputTextareaModule,\r\n /**\r\n * FormsModule to handle the forms.\r\n */\r\n FormsModule,\r\n /**\r\n * PdfViewerModule to handle and make visible the pdf.\r\n */\r\n PdfViewerModule,\r\n /**\r\n * NgxDocViewerModule to handle and make visible Office documents.\r\n */\r\n NgxDocViewerModule,\r\n /**\r\n * PrimeNG DialogModule is used for showing dialog.\r\n */\r\n DialogModule,\r\n /**\r\n * PrimeNG DropdownModule is used for creating dropdown menus, allowing users to select options from a list.\r\n */\r\n DropdownModule,\r\n /**\r\n * PrimeNG InputTextModule is used for creating InputTextFeilds, allowing users to enter name for a document.\r\n */\r\n InputTextModule,\r\n\r\n MenuModule,\r\n PanelMenuModule,\r\n CardModule,\r\n TableModule,\r\n SharedModule,\r\n InputTextareaModule,\r\n ToastModule,\r\n TooltipModule,\r\n MessagesModule,\r\n MessageModule\r\n\r\n ],\r\n exports: [\r\n /**\r\n * Exports the `DocumentContainerComponent` to be used in other modules.\r\n */\r\n DocumentContainerComponent,\r\n /**\r\n * Exports the `DocumentViewerComponent` to be used in other modules.\r\n */\r\n DocumentViewerComponent,\r\n\r\n /**\r\n * Exports the `DocumentContentViewerComponent` to be used in other modules.\r\n */\r\n DocumentContentViewerComponent,\r\n\r\n /**\r\n * Exports the `DocumentZoomControlsComponent` to be used in other modules.\r\n */\r\n DocumentZoomControlsComponent,\r\n /**\r\n * Exports the `DocumentActionsComponent` to be used in other modules.\r\n */\r\n DocumentActionsComponent,\r\n /**\r\n * A component to display a list of documents.\r\n * DocumentListComponent\r\n */\r\n DocumentListComponent,\r\n\r\n /**\r\n * A component for uploading documents.\r\n * DocumentUploadComponent\r\n */\r\n DocumentUploadComponent,\r\n\r\n /**\r\n * A directive to show the document.\r\n */\r\n DocumentDirective,\r\n\r\n /**\r\n * A component for searching documents.\r\n */\r\n DocumentSearchComponent,\r\n\r\n /**\r\n * A sidebar component for content projection.\r\n */\r\n SidebarComponent,\r\n RequestDocumentComponent,\r\n DocumentAiChatComponent,\r\n\r\n\r\n ],\r\n providers: [\r\n /**\r\n * Provide the messageservice to be used in other components.\r\n */\r\n MessageService,\r\n\r\n /**\r\n * Provide the DocumentActionsService to be used in other components.\r\n */\r\n DocumentActionsService,\r\n\r\n /**\r\n * Provide the DocumentContentTypeService to be used in other components.\r\n */\r\n DocumentContentTypeService,\r\n\r\n /**\r\n * Provide the ConfirmationService to be used in other components.\r\n */\r\n ConfirmationService,\r\n\r\n /**\r\n * Provide the messageservice to be used in other components.\r\n */\r\n { provide: GlobalErrorHandler, useClass: GlobalErrorHandler },\r\n /**\r\n * Initializes the application configuration by loading it from the AppConfigService\r\n * before the application starts.\r\n * This ensures that the configuration is available for the rest of the app when needed.\r\n * The configuration is loaded asynchronously using the APP_INITIALIZER.\r\n * @returns {Function} - A function that loads the configuration from the AppConfigService.\r\n */\r\n {\r\n provide: APP_INITIALIZER,\r\n /**\r\n * This useFactory is executed when the app initializes.\r\n * It calls the AppConfigService to load the configuration.\r\n * If an error occurs, it throws an error.\r\n * @param {AppConfigService} configService - The service responsible for loading the application configuration.\r\n * @returns {Function} - A function that loads the configuration from the AppConfigService.\r\n */\r\n useFactory: (configService: AppConfigService) => () =>\r\n configService.loadAppConfig().catch((error) => {\r\n throw new Error(error);\r\n }),\r\n deps: [AppConfigService],\r\n multi: true,\r\n },\r\n ]\r\n ,\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class DocumentModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\n/**\r\n * Interface for parsed email data\r\n */\r\nexport interface ParsedEmailData {\r\n from: string;\r\n to: string;\r\n cc?: string;\r\n subject: string;\r\n date: string;\r\n body: string;\r\n isHtml: boolean;\r\n attachments?: EmailAttachment[];\r\n}\r\n\r\n/**\r\n * Interface for email attachments\r\n */\r\nexport interface EmailAttachment {\r\n filename: string;\r\n contentType: string;\r\n size: number;\r\n}\r\n\r\n/**\r\n * Service for parsing EML (email message) files\r\n * Handles both plain text and HTML email content\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EmlParserService {\r\n\r\n constructor(\r\n private sanitizer: DomSanitizer,\r\n private http: HttpClient\r\n ) { }\r\n\r\n /**\r\n * Parses EML file content\r\n * @param emlContent - Raw EML file content as string\r\n * @returns Parsed email data\r\n */\r\n parseEmlData(emlContent: string): ParsedEmailData | null {\r\n try {\r\n const lines = emlContent.split(/\\r?\\n/);\r\n const headers = this.parseHeaders(lines);\r\n const body = this.parseBody(lines);\r\n\r\n return {\r\n from: this.cleanEmailAddress(headers['from'] || 'Unknown'),\r\n to: this.cleanEmailAddress(headers['to'] || 'Unknown'),\r\n cc: headers['cc'] ? this.cleanEmailAddress(headers['cc']) : undefined,\r\n subject: this.decodeHeader(headers['subject'] || 'No Subject'),\r\n date: this.formatDate(headers['date'] || ''),\r\n body: body.content,\r\n isHtml: body.isHtml,\r\n attachments: this.parseAttachments(emlContent)\r\n };\r\n } catch (error) {\r\n console.error('Error parsing EML file:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Parses email headers from EML content\r\n * @param lines - Lines of the EML file\r\n * @returns Object containing parsed headers\r\n */\r\n private parseHeaders(lines: string[]): { [key: string]: string } {\r\n const headers: { [key: string]: string } = {};\r\n let currentHeader = '';\r\n let currentValue = '';\r\n\r\n for (const line of lines) {\r\n // Empty line indicates end of headers\r\n if (line.trim() === '') {\r\n if (currentHeader) {\r\n headers[currentHeader.toLowerCase()] = currentValue.trim();\r\n }\r\n break;\r\n }\r\n\r\n // Check if line is a new header (starts without whitespace and contains ':')\r\n if (line.match(/^[\\w-]+:/) && !line.startsWith(' ') && !line.startsWith('\\t')) {\r\n // Save previous header if exists\r\n if (currentHeader) {\r\n headers[currentHeader.toLowerCase()] = currentValue.trim();\r\n }\r\n\r\n // Parse new header\r\n const colonIndex = line.indexOf(':');\r\n currentHeader = line.substring(0, colonIndex).trim();\r\n currentValue = line.substring(colonIndex + 1).trim();\r\n } else if (currentHeader && (line.startsWith(' ') || line.startsWith('\\t'))) {\r\n // Continuation of previous header (folded header)\r\n currentValue += ' ' + line.trim();\r\n }\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Parses the email body from EML content\r\n * @param lines - Lines of the EML file\r\n * @returns Object containing body content and format information\r\n */\r\n private parseBody(lines: string[]): { content: string, isHtml: boolean } {\r\n let inBody = false;\r\n let bodyLines: string[] = [];\r\n let contentType = 'text/plain';\r\n let boundary = '';\r\n let isBase64 = false;\r\n let isQuotedPrintable = false;\r\n\r\n // Find Content-Type and boundary\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n \r\n if (line.toLowerCase().startsWith('content-type:')) {\r\n contentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';\r\n \r\n // Check for multipart boundary\r\n const boundaryMatch = line.match(/boundary=\"?([^\";\\s]+)\"?/i);\r\n if (boundaryMatch) {\r\n boundary = boundaryMatch[1];\r\n }\r\n }\r\n\r\n if (line.toLowerCase().startsWith('content-transfer-encoding:')) {\r\n isBase64 = line.toLowerCase().includes('base64');\r\n isQuotedPrintable = line.toLowerCase().includes('quoted-printable');\r\n }\r\n\r\n // Empty line marks start of body\r\n if (line.trim() === '' && !inBody) {\r\n inBody = true;\r\n continue;\r\n }\r\n\r\n if (inBody) {\r\n bodyLines.push(line);\r\n }\r\n }\r\n\r\n // If multipart, extract the relevant part\r\n if (boundary) {\r\n bodyLines = this.extractMultipartBody(bodyLines.join('\\n'), boundary, contentType);\r\n }\r\n\r\n let bodyContent = bodyLines.join('\\n').trim();\r\n\r\n // Decode body if necessary\r\n if (isBase64) {\r\n try {\r\n bodyContent = atob(bodyContent.replace(/\\s/g, ''));\r\n } catch (e) {\r\n console.warn('Failed to decode base64 content');\r\n }\r\n } else if (isQuotedPrintable) {\r\n bodyContent = this.decodeQuotedPrintable(bodyContent);\r\n }\r\n\r\n // Clean up HTML if present\r\n if (contentType === 'text/html') {\r\n bodyContent = this.sanitizeHtmlContent(bodyContent);\r\n }\r\n\r\n return {\r\n content: bodyContent || 'No content available',\r\n isHtml: contentType === 'text/html'\r\n };\r\n }\r\n\r\n /**\r\n * Extracts body from multipart email\r\n * @param content - Email content\r\n * @param boundary - Multipart boundary string\r\n * @param preferredType - Preferred content type\r\n * @returns Array of body lines\r\n */\r\n private extractMultipartBody(content: string, boundary: string, preferredType: string): string[] {\r\n const parts = content.split('--' + boundary);\r\n \r\n for (const part of parts) {\r\n const lines = part.split(/\\r?\\n/);\r\n let partContentType = 'text/plain';\r\n let isBase64 = false;\r\n let isQuotedPrintable = false;\r\n let inPartBody = false;\r\n const partBodyLines: string[] = [];\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n\r\n if (line.toLowerCase().startsWith('content-type:')) {\r\n partContentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';\r\n }\r\n\r\n if (line.toLowerCase().startsWith('content-transfer-encoding:')) {\r\n isBase64 = line.toLowerCase().includes('base64');\r\n isQuotedPrintable = line.toLowerCase().includes('quoted-printable');\r\n }\r\n\r\n if (line.trim() === '' && !inPartBody) {\r\n inPartBody = true;\r\n continue;\r\n }\r\n\r\n if (inPartBody) {\r\n partBodyLines.push(line);\r\n }\r\n }\r\n\r\n // If this part matches our preferred content type, use it\r\n if (partContentType === preferredType && partBodyLines.length > 0) {\r\n let bodyContent = partBodyLines.join('\\n');\r\n\r\n if (isBase64) {\r\n try {\r\n bodyContent = atob(bodyContent.replace(/\\s/g, ''));\r\n } catch (e) {\r\n console.warn('Failed to decode base64 part');\r\n }\r\n } else if (isQuotedPrintable) {\r\n bodyContent = this.decodeQuotedPrintable(bodyContent);\r\n }\r\n\r\n return [bodyContent];\r\n }\r\n }\r\n\r\n // Fallback: return first non-empty part\r\n for (const part of parts) {\r\n const lines = part.split(/\\r?\\n/);\r\n const bodyLines = lines.filter(line => line.trim() !== '').slice(3); // Skip headers\r\n if (bodyLines.length > 0) {\r\n return bodyLines;\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Decodes quoted-printable encoded content\r\n * @param content - Quoted-printable encoded string\r\n * @returns Decoded string\r\n */\r\n private decodeQuotedPrintable(content: string): string {\r\n return content\r\n .replace(/=\\r?\\n/g, '') // Remove soft line breaks\r\n .replace(/=([0-9A-F]{2})/gi, (match, hex) => {\r\n return String.fromCharCode(parseInt(hex, 16));\r\n });\r\n }\r\n\r\n /**\r\n * Sanitizes HTML content for safe display\r\n * @param html - Raw HTML content\r\n * @returns Sanitized HTML\r\n */\r\n private sanitizeHtmlContent(html: string): string {\r\n // Basic sanitization - remove script tags and dangerous attributes\r\n let sanitized = html\r\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\r\n .replace(/on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi, '')\r\n .replace(/javascript:/gi, '');\r\n\r\n return sanitized;\r\n }\r\n\r\n /**\r\n * Parses attachment information from EML content\r\n * @param emlContent - Raw EML content\r\n * @returns Array of attachment information\r\n */\r\n private parseAttachments(emlContent: string): EmailAttachment[] {\r\n const attachments: EmailAttachment[] = [];\r\n const attachmentRegex = /Content-Disposition:\\s*attachment[^;]*;\\s*filename=\"?([^\"\\r\\n]+)\"?/gi;\r\n let match;\r\n\r\n while ((match = attachmentRegex.exec(emlContent)) !== null) {\r\n attachments.push({\r\n filename: match[1],\r\n contentType: 'application/octet-stream',\r\n size: 0\r\n });\r\n }\r\n\r\n return attachments;\r\n }\r\n\r\n /**\r\n * Cleans and formats email addresses\r\n * @param email - Raw email address string\r\n * @returns Cleaned email address\r\n */\r\n private cleanEmailAddress(email: string): string {\r\n // Remove quotes and extra whitespace\r\n let cleaned = email.replace(/['\"]/g, '').trim();\r\n \r\n // Extract email from format: \"Name <email@example.com>\"\r\n const emailMatch = cleaned.match(/<([^>]+)>/);\r\n if (emailMatch) {\r\n const name = cleaned.substring(0, cleaned.indexOf('<')).trim();\r\n const address = emailMatch[1];\r\n return name ? `${name} <${address}>` : address;\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n /**\r\n * Decodes encoded email headers (RFC 2047)\r\n * @param header - Encoded header string\r\n * @returns Decoded header string\r\n */\r\n private decodeHeader(header: string): string {\r\n // Decode RFC 2047 encoded words (=?charset?encoding?text?=)\r\n return header.replace(/=\\?([^?]+)\\?([BQ])\\?([^?]+)\\?=/gi, (match, charset, encoding, text) => {\r\n try {\r\n if (encoding.toUpperCase() === 'B') {\r\n // Base64 encoding\r\n return atob(text);\r\n } else if (encoding.toUpperCase() === 'Q') {\r\n // Quoted-printable encoding\r\n return this.decodeQuotedPrintable(text.replace(/_/g, ' '));\r\n }\r\n } catch (e) {\r\n console.warn('Failed to decode header:', match);\r\n }\r\n return match;\r\n });\r\n }\r\n\r\n /**\r\n * Formats email date to readable format\r\n * @param dateStr - Raw date string from email\r\n * @returns Formatted date string\r\n */\r\n private formatDate(dateStr: string): string {\r\n try {\r\n const date = new Date(dateStr);\r\n if (isNaN(date.getTime())) {\r\n return dateStr || 'Unknown date';\r\n }\r\n return date.toLocaleString('en-GB', {\r\n day: '2-digit',\r\n month: 'short',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n });\r\n } catch (e) {\r\n return dateStr || 'Unknown date';\r\n }\r\n }\r\n\r\n /**\r\n * Sanitizes HTML for Angular display\r\n * @param html - HTML string\r\n * @returns SafeHtml for Angular templates\r\n */\r\n getSafeHtml(html: string): SafeHtml {\r\n return this.sanitizer.sanitize(1, html) || '';\r\n }\r\n\r\n /**\r\n * Downloads and parses an EML file from a URL\r\n * @param documentUrl - URL of the EML file\r\n * @returns Observable of parsed email data\r\n */\r\n loadAndParseEmail(documentUrl: string): Observable<ParsedEmailData> {\r\n console.log('EmlParserService: Loading email from URL:', documentUrl);\r\n \r\n return this.downloadEmailFile(documentUrl).pipe(\r\n map((emlContent: string) => {\r\n console.log('EmlParserService: Email downloaded, size:', emlContent?.length || 0, 'bytes');\r\n \r\n if (!emlContent || emlContent.trim().length === 0) {\r\n throw new Error('Email file is empty or could not be loaded');\r\n }\r\n\r\n const parsedData = this.parseEmlData(emlContent);\r\n if (!parsedData) {\r\n throw new Error('Failed to parse email data');\r\n }\r\n\r\n console.log('EmlParserService: Email parsed successfully:', parsedData);\r\n return parsedData;\r\n }),\r\n catchError((error) => {\r\n console.error('EmlParserService: Error loading/parsing email:', error);\r\n return throwError(() => new Error(error.message || 'Failed to load or parse email file'));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Downloads an email file with appropriate authentication handling\r\n * @param documentUrl - URL of the email file\r\n * @returns Observable of file content as text\r\n */\r\n private downloadEmailFile(documentUrl: string): Observable<string> {\r\n // Check if it's Azure Blob Storage URL\r\n const isAzureBlobStorage = documentUrl.includes('.blob.core.windows.net');\r\n \r\n if (isAzureBlobStorage) {\r\n // For Azure Blob Storage, don't send Authorization header\r\n // The URL should contain a SAS token or the blob should be publicly accessible\r\n return this.http.get(documentUrl, {\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n console.error('Error downloading email from blob storage:', error);\r\n return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));\r\n })\r\n );\r\n } else {\r\n // For other storage types, use Bearer token authentication\r\n const Authorization = `Bearer d8764575-d713-4e31-aeb0-29ea31057461`;\r\n return this.http.get(documentUrl, {\r\n headers: new HttpHeaders({\r\n 'Authorization': Authorization\r\n }),\r\n responseType: 'text'\r\n }).pipe(\r\n catchError((error) => {\r\n console.error('Error downloading email file:', error);\r\n return throwError(() => new Error('Failed to download email file. Please check authentication.'));\r\n })\r\n );\r\n }\r\n }\r\n}\r\n\r\n","/*\r\n * Public API Surface of cat-document-lib\r\n */\r\n\r\nexport * from './lib/document/document.module';\r\nexport * from './lib/document/components/document-container/document-container.component';\r\nexport * from './lib/document/components/document-upload/document-upload.component';\r\nexport * from './lib/document/components/document-viewer/document-viewer.component';\r\nexport * from './lib/document/components/document-content-viewer/document-content-viewer.component';\r\nexport * from './lib/document/components/document-zoom-controls/document-zoom-controls.component';\r\nexport * from './lib/document/components/document-actions/document-actions.component';\r\nexport * from './lib/document/components/document-history/document-history.component';\r\nexport * from './lib/document/components/document-list/document-list.component';\r\nexport * from './lib/document/components/document-search/document-search.component';\r\nexport * from './lib/document/components/sidebar/sidebar.component';\r\nexport * from './lib/document/components/request-document/request-document.component';\r\nexport * from './lib/document/components/document-ai-chat/document-ai-chat.component';\r\nexport * from './lib/document/models/document-history.model';\r\nexport * from './lib/document/models/uploaded-file-response.model';\r\nexport * from './lib/document/services/document-table-builder.service';\r\nexport * from './lib/document/services/document-content-type.service';\r\nexport * from './lib/document/services/document-zoom.service';\r\nexport * from './lib/document/services/eml-parser.service';\r\nexport * from './lib/document/services/excel-parser.service';\r\nexport * from './lib/document/services/csv-parser.service';\r\nexport * from './lib/document/directives/document.directive';\r\nexport * from './lib/document/directives/permission.directive';\r\nexport * from './Shared/components/confirmation-dialog/confirmation-dialog.component';\r\nexport * from './Shared/components/table-primary/table-primary.component';\r\nexport * from './Shared/components/table-primary/table-primary.model';\r\nexport * from './Shared/constant/SHARED';\r\nexport * from './Shared/shared.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.DocumentStore","i3.AppConfigService","i2.DocumentQuery","i3.DocumentHttpService","i4.DocumentMenuService","i1.DocumentService","i2.DocumentStore","i1.DocumentHttpService","i2.FileFormatService","i1.DocumentUploadBusinessService","i2.DocumentUploadFormService","i1.DocumentUploadService","i2.DocumentService","i4.FileFormatService","i5.DocumentUploadBusinessService","i6.DocumentUploadFormService","i7.DocumentUploadDataService","i8","i14","i3.DocumentUploadDataService","i4.DocumentHttpService","i5.SessionService","i1.DocumentQuery","i2.DocumentHelperService","i3.StatusCalculatorService","i4","debounceTime","distinctUntilChanged","i1.DocumentHelperService","i3","i2","i3.DocumentUploadComponent","i4.DocumentStatusComponent","i5.DocumentSearchComponent","i6.SidebarComponent","i7.RequestDocumentComponent","i2.DocumentHttpService","i3.DocumentQuery","i4.DocumentStore","i5.DocumentTableBuilderService","i6.DocumentHelperService","i5.DocumentQuery","i1.DocumentHistoryStyleService","catchError","i1.SessionService","i1.DocumentHistoryAiService","i1.DocumentHistoryService","i2.DocumentViewerService","i3.DocumentActionsService","i5.DocumentHttpService","i6.DocumentHistoryAiService","i7","i9.HasPermissionDirective","i10.DocumentAiChatComponent","i1.DocumentZoomService","i5","i6","i1.ExcelParserService","i2.CsvParserService","i4.DocumentZoomService","i9","i10","i11.DocumentZoomControlsComponent","i1.DocumentActionsService","i2.SessionService","i4.DocumentViewerService","i5.DocumentStore","i8.DocumentHistoryComponent","i9.DocumentContentViewerComponent","i10.DocumentActionsComponent","i1.DocumentListService","i3.DocumentMenuService","i5.DocumentScrollService","i11","i12","i13.TablePrimaryComponent","i14.DocumentViewerComponent","i5.DocumentMenuService","i7.FolderContainerComponent","i8.DocumentListComponent","i4.DocumentHelperService","i4.UserListService"],"mappings":"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"}