cloud-ide-academics 0.0.80 → 0.0.86

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.
Files changed (18) hide show
  1. package/fesm2022/{cloud-ide-academics-bonafide-request-detail.component-B2OEdcio.mjs → cloud-ide-academics-bonafide-request-detail.component-RG_8p75c.mjs} +3 -3
  2. package/fesm2022/{cloud-ide-academics-bonafide-request-detail.component-B2OEdcio.mjs.map → cloud-ide-academics-bonafide-request-detail.component-RG_8p75c.mjs.map} +1 -1
  3. package/fesm2022/{cloud-ide-academics-bonafide-request-form.component-BjVCiCa1.mjs → cloud-ide-academics-bonafide-request-form.component-IaFvjXbQ.mjs} +2 -2
  4. package/fesm2022/{cloud-ide-academics-bonafide-request-form.component-BjVCiCa1.mjs.map → cloud-ide-academics-bonafide-request-form.component-IaFvjXbQ.mjs.map} +1 -1
  5. package/fesm2022/{cloud-ide-academics-class-program-term-create.component-BADUG2wf.mjs → cloud-ide-academics-class-program-term-create.component-C3T6yWso.mjs} +2 -2
  6. package/fesm2022/{cloud-ide-academics-class-program-term-create.component-BADUG2wf.mjs.map → cloud-ide-academics-class-program-term-create.component-C3T6yWso.mjs.map} +1 -1
  7. package/fesm2022/{cloud-ide-academics-class-program-term-list.component-CXllf5oo.mjs → cloud-ide-academics-class-program-term-list.component-9gMzQAw8.mjs} +2 -2
  8. package/fesm2022/{cloud-ide-academics-class-program-term-list.component-CXllf5oo.mjs.map → cloud-ide-academics-class-program-term-list.component-9gMzQAw8.mjs.map} +1 -1
  9. package/fesm2022/{cloud-ide-academics-cloud-ide-academics-Ch8rjGyx.mjs → cloud-ide-academics-cloud-ide-academics-No6zWRYY.mjs} +21 -18
  10. package/fesm2022/cloud-ide-academics-cloud-ide-academics-No6zWRYY.mjs.map +1 -0
  11. package/fesm2022/{cloud-ide-academics-program-class-create.component-CwYJKsmQ.mjs → cloud-ide-academics-program-class-create.component-C2oM5wG6.mjs} +2 -2
  12. package/fesm2022/{cloud-ide-academics-program-class-create.component-CwYJKsmQ.mjs.map → cloud-ide-academics-program-class-create.component-C2oM5wG6.mjs.map} +1 -1
  13. package/fesm2022/{cloud-ide-academics-program-class-list.component-C0o2zAdG.mjs → cloud-ide-academics-program-class-list.component-CnHzs_qj.mjs} +2 -2
  14. package/fesm2022/{cloud-ide-academics-program-class-list.component-C0o2zAdG.mjs.map → cloud-ide-academics-program-class-list.component-CnHzs_qj.mjs.map} +1 -1
  15. package/fesm2022/cloud-ide-academics.mjs +1 -1
  16. package/index.d.ts +1 -0
  17. package/package.json +1 -1
  18. package/fesm2022/cloud-ide-academics-cloud-ide-academics-Ch8rjGyx.mjs.map +0 -1
@@ -322,7 +322,7 @@ class CideAcademicsBonafideRequestDetailComponent {
322
322
  this.router.navigate(['/control-panel/bonafide']);
323
323
  }
324
324
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAcademicsBonafideRequestDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
325
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CideAcademicsBonafideRequestDetailComponent, isStandalone: true, selector: "cide-academics-bonafide-request-detail", ngImport: i0, template: "<!-- Bonafide Request Detail with Shared Wrapper -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\r\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-bg-gray-50\">\r\n\r\n @if (loading()) {\r\n <!-- Loading State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center\">\r\n <cide-ele-icon\r\n class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading request details...</p>\r\n </div>\r\n </div>\r\n } @else if (error()) {\r\n <!-- Error State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center tw-max-w-md\">\r\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mt-4\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-mt-2\">{{ error() }}</p>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"goBack()\" class=\"tw-mt-4\">\r\n Back to List\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (request()) {\r\n @if (request(); as req) {\r\n <!-- Header Section -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600\">description</cide-ele-icon>\r\n <div>\r\n <h2 class=\"tw-text-xl tw-font-semibold tw-text-gray-900\">\r\n {{ req.abnr_request_number || 'Bonafide Request' }}\r\n </h2>\r\n <p class=\"tw-text-sm tw-text-gray-600\">\r\n {{ pageSubtitle() || 'Request details and workflow history' }}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [class]=\"getStatusBadgeClass()\">\r\n {{ getStatusText() }}\r\n </span>\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" leftIcon=\"arrow_back\" (click)=\"goBack()\">\r\n Back\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-p-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n\r\n <!-- Request Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">info</cide-ele-icon>\r\n Request Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Number</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_number || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Purpose</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_purpose || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n @if (req.abnr_completed_date) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Completed\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_completed_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Student Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-purple-500\">person</cide-ele-icon>\r\n Student Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student\r\n Name</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ getStudentName() }}</p>\r\n </div>\r\n <!-- Student ID display removed -->\r\n @if (req.abnr_student_id_auth?.user_emailid) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Email</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id_auth.user_emailid }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Academic Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-indigo-500\">school</cide-ele-icon>\r\n Academic Information\r\n </h3>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Academic\r\n Year</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Program /\r\n Class</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_class_program_id_acacpm?.acacpm_alise_title ||\r\n 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Term</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_term_id_acatrm?.acapt_name || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Section</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_section_id_acapts?.acapts_name || 'N/A' }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Faculty Actions Card (Manual Approval) -->\r\n @if (showFacultyActions()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-orange-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">verified_user</cide-ele-icon>\r\n Faculty Actions\r\n </h3>\r\n\r\n <div class=\"tw-space-y-6\">\r\n <!-- Certificate Purpose (Editable) -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">Certificate Purpose <span\r\n class=\"tw-text-red-500\">*</span></h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Edit the purpose that will be printed on the certificate. You can correct spelling or reword as needed.\r\n </p>\r\n\r\n <div class=\"tw-mb-3\">\r\n <textarea\r\n class=\"tw-w-full tw-border tw-border-gray-300 tw-rounded-md tw-px-3 tw-py-2 tw-text-sm focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n rows=\"3\" [value]=\"certificatePurpose()\" (input)=\"certificatePurpose.set($any($event.target).value)\"\r\n placeholder=\"Enter the purpose for the certificate...\" maxlength=\"500\"></textarea>\r\n <div class=\"tw-flex tw-justify-between tw-mt-1\">\r\n <span class=\"tw-text-xs tw-text-gray-400\">\r\n @if (request()?.abnr_purpose) {\r\n Original: \"{{ request()?.abnr_purpose }}\"\r\n }\r\n </span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">\r\n {{ certificatePurpose().length }}/500\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Step 1: Download Draft -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">1. Download Draft Certificate</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Download the draft certificate to sign and stamp. This includes the student's photo.\r\n </p>\r\n <button cideEleButton variant=\"secondary\" leftIcon=\"download\" (click)=\"generateAndDownloadDraft()\"\r\n [loading]=\"generatingDraft()\" [disabled]=\"!certificatePurpose().trim()\">\r\n Download Draft with Photo\r\n </button>\r\n </div>\r\n\r\n <!-- Step 2: Upload Stamped Copy -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">2. Upload Stamped Copy</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Upload the signed and stamped copy to finalize the request. This will mark the request as COMPLETED.\r\n </p>\r\n\r\n <div class=\"tw-mb-4 tw-max-w-md\">\r\n <cide-ele-file-input [autoUpload]=\"true\" label=\"Select Stamped Copy\" accept=\".pdf,.jpg,.jpeg,.png\"\r\n [multiple]=\"false\" (uploadSuccess)=\"onFileUploaded($event)\">\r\n </cide-ele-file-input>\r\n </div>\r\n\r\n <button cideEleButton variant=\"primary\" leftIcon=\"check_circle\" [disabled]=\"!uploadedFileId()\"\r\n [loading]=\"submittingApproval()\" (click)=\"onUploadStampedCopy()\">\r\n Approve & Finalize Request\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n\r\n\r\n <!-- Completed Certificate Download (For All/Student) -->\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-green-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-green-500\">check_circle</cide-ele-icon>\r\n Completed Certificate\r\n </h3>\r\n <div class=\"tw-bg-green-50 tw-p-4 tw-rounded-md\">\r\n <p class=\"tw-text-sm tw-text-green-800 tw-mb-3\">\r\n Your bonafide certificate has been approved and generated. You can download the signed copy below.\r\n </p>\r\n <button cideEleButton variant=\"primary\" leftIcon=\"download\" (click)=\"downloadCertificate()\">\r\n Download Certificate\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Workflow History Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 lg:tw-col-span-2\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">history</cide-ele-icon>\r\n Workflow History\r\n </h3>\r\n @if (loadingHistory()) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">Loading history...</p>\r\n </div>\r\n } @else if (history().length === 0) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300\">history</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">No workflow history available</p>\r\n </div>\r\n } @else {\r\n <div class=\"tw-space-y-4\">\r\n @for (item of history(); track item._id || $index) {\r\n <div\r\n class=\"tw-flex tw-items-start tw-space-x-4 tw-p-4 tw-border-l-4 tw-border-blue-500 tw-bg-gray-50 tw-rounded-r-lg\">\r\n <cide-ele-icon class=\"tw-text-blue-500 tw-mt-1\">circle</cide-ele-icon>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ item.wfth_action_type_id_sygms?.sygms_title\r\n || 'Action' }}</p>\r\n @if (item.wfth_action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.wfth_action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.wfth_comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.wfth_comments }}</p>\r\n }\r\n @if (item.wfth_action_by_user) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.wfth_action_by_user?.user_fullname ||\r\n item.wfth_action_by_user?.user_username }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</cide-lyt-shared-wrapper>", styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated", "adaptive"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip", "name"] }, { kind: "component", type: CideEleFileInputComponent, selector: "cide-ele-file-input", inputs: ["label", "accept", "multiple", "disabled", "required", "helperText", "errorText", "showPreview", "previewWidth", "previewHeight", "previewBoxMode", "showFileName", "placeholderText", "placeholderIcon", "autoUpload", "uploadData", "showFloatingUploader", "floatingUploaderGroupId"], outputs: ["fileChange", "uploadSuccess", "uploadError", "uploadProgressChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
325
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CideAcademicsBonafideRequestDetailComponent, isStandalone: true, selector: "cide-academics-bonafide-request-detail", ngImport: i0, template: "<!-- Bonafide Request Detail with Shared Wrapper -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\r\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-bg-gray-50\">\r\n\r\n @if (loading()) {\r\n <!-- Loading State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center\">\r\n <cide-ele-icon\r\n class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading request details...</p>\r\n </div>\r\n </div>\r\n } @else if (error()) {\r\n <!-- Error State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center tw-max-w-md\">\r\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mt-4\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-mt-2\">{{ error() }}</p>\r\n <button cideEleButton variant=\"primary\" size=\"xs\" (click)=\"goBack()\" class=\"tw-mt-4\">\r\n Back to List\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (request()) {\r\n @if (request(); as req) {\r\n <!-- Header Section -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600\">description</cide-ele-icon>\r\n <div>\r\n <h2 class=\"tw-text-xl tw-font-semibold tw-text-gray-900\">\r\n {{ req.abnr_request_number || 'Bonafide Request' }}\r\n </h2>\r\n <p class=\"tw-text-sm tw-text-gray-600\">\r\n {{ pageSubtitle() || 'Request details and workflow history' }}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [class]=\"getStatusBadgeClass()\">\r\n {{ getStatusText() }}\r\n </span>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" leftIcon=\"arrow_back\" (click)=\"goBack()\">\r\n Back\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-p-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n\r\n <!-- Request Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">info</cide-ele-icon>\r\n Request Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Number</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_number || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Purpose</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_purpose || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n @if (req.abnr_completed_date) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Completed\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_completed_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Student Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-purple-500\">person</cide-ele-icon>\r\n Student Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student\r\n Name</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ getStudentName() }}</p>\r\n </div>\r\n <!-- Student ID display removed -->\r\n @if (req.abnr_student_id_auth?.user_emailid) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Email</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id_auth.user_emailid }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Academic Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-indigo-500\">school</cide-ele-icon>\r\n Academic Information\r\n </h3>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Academic\r\n Year</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Program /\r\n Class</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_class_program_id_acacpm?.acacpm_alise_title ||\r\n 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Term</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_term_id_acatrm?.acapt_name || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Section</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_section_id_acapts?.acapts_name || 'N/A' }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Faculty Actions Card (Manual Approval) -->\r\n @if (showFacultyActions()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-orange-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">verified_user</cide-ele-icon>\r\n Faculty Actions\r\n </h3>\r\n\r\n <div class=\"tw-space-y-6\">\r\n <!-- Certificate Purpose (Editable) -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">Certificate Purpose <span\r\n class=\"tw-text-red-500\">*</span></h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Edit the purpose that will be printed on the certificate. You can correct spelling or reword as needed.\r\n </p>\r\n\r\n <div class=\"tw-mb-3\">\r\n <textarea\r\n class=\"tw-w-full tw-border tw-border-gray-300 tw-rounded-md tw-px-3 tw-py-2 tw-text-sm focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n rows=\"3\" [value]=\"certificatePurpose()\" (input)=\"certificatePurpose.set($any($event.target).value)\"\r\n placeholder=\"Enter the purpose for the certificate...\" maxlength=\"500\"></textarea>\r\n <div class=\"tw-flex tw-justify-between tw-mt-1\">\r\n <span class=\"tw-text-xs tw-text-gray-400\">\r\n @if (request()?.abnr_purpose) {\r\n Original: \"{{ request()?.abnr_purpose }}\"\r\n }\r\n </span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">\r\n {{ certificatePurpose().length }}/500\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Step 1: Download Draft -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">1. Download Draft Certificate</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Download the draft certificate to sign and stamp. This includes the student's photo.\r\n </p>\r\n <button cideEleButton variant=\"secondary\" leftIcon=\"download\" (click)=\"generateAndDownloadDraft()\"\r\n [loading]=\"generatingDraft()\" [disabled]=\"!certificatePurpose().trim()\">\r\n Download Draft with Photo\r\n </button>\r\n </div>\r\n\r\n <!-- Step 2: Upload Stamped Copy -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">2. Upload Stamped Copy</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Upload the signed and stamped copy to finalize the request. This will mark the request as COMPLETED.\r\n </p>\r\n\r\n <div class=\"tw-mb-4 tw-max-w-md\">\r\n <cide-ele-file-input [autoUpload]=\"true\" label=\"Select Stamped Copy\" accept=\".pdf,.jpg,.jpeg,.png\"\r\n [multiple]=\"false\" (uploadSuccess)=\"onFileUploaded($event)\">\r\n </cide-ele-file-input>\r\n </div>\r\n\r\n <button cideEleButton variant=\"primary\" leftIcon=\"check_circle\" [disabled]=\"!uploadedFileId()\"\r\n [loading]=\"submittingApproval()\" (click)=\"onUploadStampedCopy()\">\r\n Approve & Finalize Request\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n\r\n\r\n <!-- Completed Certificate Download (For All/Student) -->\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-green-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-green-500\">check_circle</cide-ele-icon>\r\n Completed Certificate\r\n </h3>\r\n <div class=\"tw-bg-green-50 tw-p-4 tw-rounded-md\">\r\n <p class=\"tw-text-sm tw-text-green-800 tw-mb-3\">\r\n Your bonafide certificate has been approved and generated. You can download the signed copy below.\r\n </p>\r\n <button cideEleButton variant=\"primary\" leftIcon=\"download\" (click)=\"downloadCertificate()\">\r\n Download Certificate\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Workflow History Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 lg:tw-col-span-2\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">history</cide-ele-icon>\r\n Workflow History\r\n </h3>\r\n @if (loadingHistory()) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">Loading history...</p>\r\n </div>\r\n } @else if (history().length === 0) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300\">history</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">No workflow history available</p>\r\n </div>\r\n } @else {\r\n <div class=\"tw-space-y-4\">\r\n @for (item of history(); track item._id || $index) {\r\n <div\r\n class=\"tw-flex tw-items-start tw-space-x-4 tw-p-4 tw-border-l-4 tw-border-blue-500 tw-bg-gray-50 tw-rounded-r-lg\">\r\n <cide-ele-icon class=\"tw-text-blue-500 tw-mt-1\">circle</cide-ele-icon>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ item.wfth_action_type_id_sygms?.sygms_title\r\n || 'Action' }}</p>\r\n @if (item.wfth_action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.wfth_action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.wfth_comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.wfth_comments }}</p>\r\n }\r\n @if (item.wfth_action_by_user) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.wfth_action_by_user?.user_fullname ||\r\n item.wfth_action_by_user?.user_username }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</cide-lyt-shared-wrapper>", styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated", "adaptive"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip", "name"] }, { kind: "component", type: CideEleFileInputComponent, selector: "cide-ele-file-input", inputs: ["label", "accept", "multiple", "disabled", "required", "helperText", "errorText", "showPreview", "previewWidth", "previewHeight", "previewBoxMode", "showFileName", "placeholderText", "placeholderIcon", "autoUpload", "uploadData", "showFloatingUploader", "floatingUploaderGroupId"], outputs: ["fileChange", "uploadSuccess", "uploadError", "uploadProgressChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
326
326
  }
327
327
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAcademicsBonafideRequestDetailComponent, decorators: [{
328
328
  type: Component,
@@ -333,8 +333,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
333
333
  CideIconComponent,
334
334
  CideEleFileInputComponent,
335
335
  CideLytSharedWrapperComponent
336
- ], template: "<!-- Bonafide Request Detail with Shared Wrapper -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\r\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-bg-gray-50\">\r\n\r\n @if (loading()) {\r\n <!-- Loading State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center\">\r\n <cide-ele-icon\r\n class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading request details...</p>\r\n </div>\r\n </div>\r\n } @else if (error()) {\r\n <!-- Error State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center tw-max-w-md\">\r\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mt-4\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-mt-2\">{{ error() }}</p>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"goBack()\" class=\"tw-mt-4\">\r\n Back to List\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (request()) {\r\n @if (request(); as req) {\r\n <!-- Header Section -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600\">description</cide-ele-icon>\r\n <div>\r\n <h2 class=\"tw-text-xl tw-font-semibold tw-text-gray-900\">\r\n {{ req.abnr_request_number || 'Bonafide Request' }}\r\n </h2>\r\n <p class=\"tw-text-sm tw-text-gray-600\">\r\n {{ pageSubtitle() || 'Request details and workflow history' }}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [class]=\"getStatusBadgeClass()\">\r\n {{ getStatusText() }}\r\n </span>\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" leftIcon=\"arrow_back\" (click)=\"goBack()\">\r\n Back\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-p-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n\r\n <!-- Request Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">info</cide-ele-icon>\r\n Request Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Number</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_number || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Purpose</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_purpose || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n @if (req.abnr_completed_date) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Completed\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_completed_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Student Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-purple-500\">person</cide-ele-icon>\r\n Student Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student\r\n Name</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ getStudentName() }}</p>\r\n </div>\r\n <!-- Student ID display removed -->\r\n @if (req.abnr_student_id_auth?.user_emailid) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Email</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id_auth.user_emailid }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Academic Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-indigo-500\">school</cide-ele-icon>\r\n Academic Information\r\n </h3>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Academic\r\n Year</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Program /\r\n Class</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_class_program_id_acacpm?.acacpm_alise_title ||\r\n 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Term</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_term_id_acatrm?.acapt_name || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Section</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_section_id_acapts?.acapts_name || 'N/A' }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Faculty Actions Card (Manual Approval) -->\r\n @if (showFacultyActions()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-orange-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">verified_user</cide-ele-icon>\r\n Faculty Actions\r\n </h3>\r\n\r\n <div class=\"tw-space-y-6\">\r\n <!-- Certificate Purpose (Editable) -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">Certificate Purpose <span\r\n class=\"tw-text-red-500\">*</span></h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Edit the purpose that will be printed on the certificate. You can correct spelling or reword as needed.\r\n </p>\r\n\r\n <div class=\"tw-mb-3\">\r\n <textarea\r\n class=\"tw-w-full tw-border tw-border-gray-300 tw-rounded-md tw-px-3 tw-py-2 tw-text-sm focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n rows=\"3\" [value]=\"certificatePurpose()\" (input)=\"certificatePurpose.set($any($event.target).value)\"\r\n placeholder=\"Enter the purpose for the certificate...\" maxlength=\"500\"></textarea>\r\n <div class=\"tw-flex tw-justify-between tw-mt-1\">\r\n <span class=\"tw-text-xs tw-text-gray-400\">\r\n @if (request()?.abnr_purpose) {\r\n Original: \"{{ request()?.abnr_purpose }}\"\r\n }\r\n </span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">\r\n {{ certificatePurpose().length }}/500\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Step 1: Download Draft -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">1. Download Draft Certificate</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Download the draft certificate to sign and stamp. This includes the student's photo.\r\n </p>\r\n <button cideEleButton variant=\"secondary\" leftIcon=\"download\" (click)=\"generateAndDownloadDraft()\"\r\n [loading]=\"generatingDraft()\" [disabled]=\"!certificatePurpose().trim()\">\r\n Download Draft with Photo\r\n </button>\r\n </div>\r\n\r\n <!-- Step 2: Upload Stamped Copy -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">2. Upload Stamped Copy</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Upload the signed and stamped copy to finalize the request. This will mark the request as COMPLETED.\r\n </p>\r\n\r\n <div class=\"tw-mb-4 tw-max-w-md\">\r\n <cide-ele-file-input [autoUpload]=\"true\" label=\"Select Stamped Copy\" accept=\".pdf,.jpg,.jpeg,.png\"\r\n [multiple]=\"false\" (uploadSuccess)=\"onFileUploaded($event)\">\r\n </cide-ele-file-input>\r\n </div>\r\n\r\n <button cideEleButton variant=\"primary\" leftIcon=\"check_circle\" [disabled]=\"!uploadedFileId()\"\r\n [loading]=\"submittingApproval()\" (click)=\"onUploadStampedCopy()\">\r\n Approve & Finalize Request\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n\r\n\r\n <!-- Completed Certificate Download (For All/Student) -->\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-green-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-green-500\">check_circle</cide-ele-icon>\r\n Completed Certificate\r\n </h3>\r\n <div class=\"tw-bg-green-50 tw-p-4 tw-rounded-md\">\r\n <p class=\"tw-text-sm tw-text-green-800 tw-mb-3\">\r\n Your bonafide certificate has been approved and generated. You can download the signed copy below.\r\n </p>\r\n <button cideEleButton variant=\"primary\" leftIcon=\"download\" (click)=\"downloadCertificate()\">\r\n Download Certificate\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Workflow History Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 lg:tw-col-span-2\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">history</cide-ele-icon>\r\n Workflow History\r\n </h3>\r\n @if (loadingHistory()) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">Loading history...</p>\r\n </div>\r\n } @else if (history().length === 0) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300\">history</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">No workflow history available</p>\r\n </div>\r\n } @else {\r\n <div class=\"tw-space-y-4\">\r\n @for (item of history(); track item._id || $index) {\r\n <div\r\n class=\"tw-flex tw-items-start tw-space-x-4 tw-p-4 tw-border-l-4 tw-border-blue-500 tw-bg-gray-50 tw-rounded-r-lg\">\r\n <cide-ele-icon class=\"tw-text-blue-500 tw-mt-1\">circle</cide-ele-icon>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ item.wfth_action_type_id_sygms?.sygms_title\r\n || 'Action' }}</p>\r\n @if (item.wfth_action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.wfth_action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.wfth_comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.wfth_comments }}</p>\r\n }\r\n @if (item.wfth_action_by_user) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.wfth_action_by_user?.user_fullname ||\r\n item.wfth_action_by_user?.user_username }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</cide-lyt-shared-wrapper>", styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"] }]
336
+ ], template: "<!-- Bonafide Request Detail with Shared Wrapper -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\r\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-bg-gray-50\">\r\n\r\n @if (loading()) {\r\n <!-- Loading State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center\">\r\n <cide-ele-icon\r\n class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading request details...</p>\r\n </div>\r\n </div>\r\n } @else if (error()) {\r\n <!-- Error State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center tw-max-w-md\">\r\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mt-4\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-mt-2\">{{ error() }}</p>\r\n <button cideEleButton variant=\"primary\" size=\"xs\" (click)=\"goBack()\" class=\"tw-mt-4\">\r\n Back to List\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (request()) {\r\n @if (request(); as req) {\r\n <!-- Header Section -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600\">description</cide-ele-icon>\r\n <div>\r\n <h2 class=\"tw-text-xl tw-font-semibold tw-text-gray-900\">\r\n {{ req.abnr_request_number || 'Bonafide Request' }}\r\n </h2>\r\n <p class=\"tw-text-sm tw-text-gray-600\">\r\n {{ pageSubtitle() || 'Request details and workflow history' }}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [class]=\"getStatusBadgeClass()\">\r\n {{ getStatusText() }}\r\n </span>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" leftIcon=\"arrow_back\" (click)=\"goBack()\">\r\n Back\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-p-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n\r\n <!-- Request Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">info</cide-ele-icon>\r\n Request Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Number</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_number || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Purpose</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_purpose || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n @if (req.abnr_completed_date) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Completed\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_completed_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Student Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-purple-500\">person</cide-ele-icon>\r\n Student Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student\r\n Name</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ getStudentName() }}</p>\r\n </div>\r\n <!-- Student ID display removed -->\r\n @if (req.abnr_student_id_auth?.user_emailid) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Email</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id_auth.user_emailid }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Academic Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-indigo-500\">school</cide-ele-icon>\r\n Academic Information\r\n </h3>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Academic\r\n Year</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Program /\r\n Class</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_class_program_id_acacpm?.acacpm_alise_title ||\r\n 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Term</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_term_id_acatrm?.acapt_name || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Section</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_section_id_acapts?.acapts_name || 'N/A' }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Faculty Actions Card (Manual Approval) -->\r\n @if (showFacultyActions()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-orange-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">verified_user</cide-ele-icon>\r\n Faculty Actions\r\n </h3>\r\n\r\n <div class=\"tw-space-y-6\">\r\n <!-- Certificate Purpose (Editable) -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">Certificate Purpose <span\r\n class=\"tw-text-red-500\">*</span></h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Edit the purpose that will be printed on the certificate. You can correct spelling or reword as needed.\r\n </p>\r\n\r\n <div class=\"tw-mb-3\">\r\n <textarea\r\n class=\"tw-w-full tw-border tw-border-gray-300 tw-rounded-md tw-px-3 tw-py-2 tw-text-sm focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n rows=\"3\" [value]=\"certificatePurpose()\" (input)=\"certificatePurpose.set($any($event.target).value)\"\r\n placeholder=\"Enter the purpose for the certificate...\" maxlength=\"500\"></textarea>\r\n <div class=\"tw-flex tw-justify-between tw-mt-1\">\r\n <span class=\"tw-text-xs tw-text-gray-400\">\r\n @if (request()?.abnr_purpose) {\r\n Original: \"{{ request()?.abnr_purpose }}\"\r\n }\r\n </span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">\r\n {{ certificatePurpose().length }}/500\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Step 1: Download Draft -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">1. Download Draft Certificate</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Download the draft certificate to sign and stamp. This includes the student's photo.\r\n </p>\r\n <button cideEleButton variant=\"secondary\" leftIcon=\"download\" (click)=\"generateAndDownloadDraft()\"\r\n [loading]=\"generatingDraft()\" [disabled]=\"!certificatePurpose().trim()\">\r\n Download Draft with Photo\r\n </button>\r\n </div>\r\n\r\n <!-- Step 2: Upload Stamped Copy -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">2. Upload Stamped Copy</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Upload the signed and stamped copy to finalize the request. This will mark the request as COMPLETED.\r\n </p>\r\n\r\n <div class=\"tw-mb-4 tw-max-w-md\">\r\n <cide-ele-file-input [autoUpload]=\"true\" label=\"Select Stamped Copy\" accept=\".pdf,.jpg,.jpeg,.png\"\r\n [multiple]=\"false\" (uploadSuccess)=\"onFileUploaded($event)\">\r\n </cide-ele-file-input>\r\n </div>\r\n\r\n <button cideEleButton variant=\"primary\" leftIcon=\"check_circle\" [disabled]=\"!uploadedFileId()\"\r\n [loading]=\"submittingApproval()\" (click)=\"onUploadStampedCopy()\">\r\n Approve & Finalize Request\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n\r\n\r\n <!-- Completed Certificate Download (For All/Student) -->\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-green-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-green-500\">check_circle</cide-ele-icon>\r\n Completed Certificate\r\n </h3>\r\n <div class=\"tw-bg-green-50 tw-p-4 tw-rounded-md\">\r\n <p class=\"tw-text-sm tw-text-green-800 tw-mb-3\">\r\n Your bonafide certificate has been approved and generated. You can download the signed copy below.\r\n </p>\r\n <button cideEleButton variant=\"primary\" leftIcon=\"download\" (click)=\"downloadCertificate()\">\r\n Download Certificate\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Workflow History Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 lg:tw-col-span-2\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">history</cide-ele-icon>\r\n Workflow History\r\n </h3>\r\n @if (loadingHistory()) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">Loading history...</p>\r\n </div>\r\n } @else if (history().length === 0) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300\">history</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">No workflow history available</p>\r\n </div>\r\n } @else {\r\n <div class=\"tw-space-y-4\">\r\n @for (item of history(); track item._id || $index) {\r\n <div\r\n class=\"tw-flex tw-items-start tw-space-x-4 tw-p-4 tw-border-l-4 tw-border-blue-500 tw-bg-gray-50 tw-rounded-r-lg\">\r\n <cide-ele-icon class=\"tw-text-blue-500 tw-mt-1\">circle</cide-ele-icon>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ item.wfth_action_type_id_sygms?.sygms_title\r\n || 'Action' }}</p>\r\n @if (item.wfth_action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.wfth_action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.wfth_comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.wfth_comments }}</p>\r\n }\r\n @if (item.wfth_action_by_user) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.wfth_action_by_user?.user_fullname ||\r\n item.wfth_action_by_user?.user_username }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</cide-lyt-shared-wrapper>", styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"] }]
337
337
  }], ctorParameters: () => [] });
338
338
 
339
339
  export { CideAcademicsBonafideRequestDetailComponent };
340
- //# sourceMappingURL=cloud-ide-academics-bonafide-request-detail.component-B2OEdcio.mjs.map
340
+ //# sourceMappingURL=cloud-ide-academics-bonafide-request-detail.component-RG_8p75c.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-academics-bonafide-request-detail.component-B2OEdcio.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-detail/bonafide-request-detail.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-detail/bonafide-request-detail.component.html"],"sourcesContent":["import { Component, signal, DestroyRef, inject, computed, OnInit, effect } from '@angular/core';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { switchMap } from 'rxjs/operators';\r\nimport { CideEleButtonComponent, CideIconComponent, NotificationService } from 'cloud-ide-element';\r\nimport { CideEleFileInputComponent } from 'cloud-ide-element';\r\nimport { RightsService, CideLytSharedService, CideLytSharedWrapperComponent, AppStateService } from 'cloud-ide-layout';\r\nimport { CideAcademicsBonafideService, BonafideRequestResponse } from '../../services/bonafide.service';\r\nimport { generateObjectFromString } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-academics-bonafide-request-detail',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DatePipe,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n CideEleFileInputComponent,\r\n CideLytSharedWrapperComponent\r\n ],\r\n templateUrl: './bonafide-request-detail.component.html',\r\n styles: [`\r\n :host {\r\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\r\n }\r\n `]\r\n})\r\nexport class CideAcademicsBonafideRequestDetailComponent implements OnInit {\r\n private destroyRef = inject(DestroyRef);\r\n private bonafideService = inject(CideAcademicsBonafideService);\r\n private router = inject(Router);\r\n private route = inject(ActivatedRoute);\r\n private rightsService = inject(RightsService);\r\n private sharedService = inject(CideLytSharedService);\r\n private notificationService = inject(NotificationService);\r\n private appStateService = inject(AppStateService);\r\n\r\n request = signal<any>(null);\r\n history = signal<any[]>([]);\r\n loading = signal(false);\r\n loadingHistory = signal(false);\r\n error = signal<string | null>(null);\r\n\r\n // Faculty actions state\r\n uploadedFileId = signal<string | null>(null);\r\n generatingDraft = signal(false);\r\n submittingApproval = signal(false);\r\n\r\n // Page config\r\n pageTitle = signal<string>('');\r\n pageSubtitle = signal<string>('');\r\n pageCode = signal<string>('bonafide_request');\r\n\r\n canView = computed(() => this.rightsService.hasRight('VIEW'));\r\n canDownload = computed(() => this.rightsService.hasRight('DOWNLOAD'));\r\n\r\n // Faculty check: User is NOT a student\r\n isFaculty = computed(() => {\r\n const user = this.appStateService.currentUser();\r\n const userType = (user as any)?.user_type_mapping?.syutm_user_type;\r\n return userType !== 'STUDENT';\r\n });\r\n\r\n isPending = computed(() => {\r\n const status = this.getStatusText().toUpperCase();\r\n return status.includes('PENDING') || status.includes('PROGRESS');\r\n });\r\n\r\n showFacultyActions = computed(() => {\r\n return this.isFaculty() && this.isPending();\r\n });\r\n\r\n hasSoftCopy = computed(() => {\r\n const req = this.request();\r\n return !!(req?.abnr_soft_copy_id_cyfm);\r\n });\r\n\r\n hasStampedCopy = computed(() => {\r\n const req = this.request();\r\n return !!(req?.abnr_stamped_copy_id_cyfm);\r\n });\r\n\r\n // Certificate purpose (editable by faculty)\r\n certificatePurpose = signal<string>('');\r\n\r\n constructor() {\r\n // Watch for page data changes\r\n effect(() => {\r\n const currentPageCode = this.pageCode();\r\n if (!currentPageCode) return;\r\n\r\n const pageDataCache = this.sharedService.pageDataStore();\r\n const cachedData = pageDataCache[currentPageCode];\r\n const page = cachedData?.data?.page;\r\n\r\n if (page) {\r\n const cfgString = page?.sypg_configuration;\r\n if (cfgString) {\r\n try {\r\n const cfg = JSON.parse(cfgString);\r\n this.pageTitle.set(cfg.title || page?.sypg_title || '');\r\n this.pageSubtitle.set(cfg.subTitle || page?.sypg_desc || '');\r\n } catch (e) {\r\n console.warn('Invalid page config JSON', e);\r\n this.pageTitle.set(page?.sypg_title || '');\r\n this.pageSubtitle.set(page?.sypg_desc || '');\r\n }\r\n } else {\r\n this.pageTitle.set(page?.sypg_title || '');\r\n this.pageSubtitle.set(page?.sypg_desc || '');\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Initialize rights\r\n this.rightsService.initializeRights('bonafide_request');\r\n\r\n // Get request ID from route\r\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\r\n const query = params['query'];\r\n if (query) {\r\n const queryObj = generateObjectFromString(query);\r\n const requestId = queryObj.abnr_id || queryObj._id;\r\n if (requestId) {\r\n this.loadRequest(requestId);\r\n this.loadHistory(requestId);\r\n } else {\r\n this.error.set('Request ID not found in route');\r\n }\r\n }\r\n });\r\n }\r\n\r\n private loadRequest(requestId: string): void {\r\n this.loading.set(true);\r\n this.bonafideService.getRequestById(requestId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: BonafideRequestResponse) => {\r\n if (response.success && response.data) {\r\n this.request.set(response.data);\r\n // Initialize certificate purpose with existing value or original purpose\r\n this.certificatePurpose.set(\r\n response.data.abnr_certificate_purpose || response.data.abnr_purpose || ''\r\n );\r\n } else {\r\n this.error.set(response.message || 'Failed to load request');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err: Error) => {\r\n this.error.set('Failed to load request');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n loadHistory(requestId: string): void {\r\n this.loadingHistory.set(true);\r\n\r\n this.bonafideService.getHistory(requestId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.history.set(Array.isArray(response.data) ? response.data : []);\r\n }\r\n this.loadingHistory.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error loading history:', err);\r\n this.history.set([]);\r\n this.loadingHistory.set(false);\r\n }\r\n });\r\n }\r\n\r\n getStatusText(): string {\r\n const req = this.request();\r\n if (!req) return 'N/A';\r\n const status = req.abnr_status_id_sygms;\r\n if (!status) return 'N/A';\r\n if (typeof status === 'string') return status;\r\n return status.sygms_title || status.sygms_code || 'N/A';\r\n }\r\n\r\n getStatusBadgeClass(): string {\r\n const statusText = this.getStatusText().toUpperCase();\r\n if (statusText.includes('PENDING')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-yellow-100 tw-text-yellow-800 dark:tw-bg-yellow-900/30 dark:tw-text-yellow-300';\r\n } else if (statusText.includes('PROGRESS') || statusText.includes('REVIEW')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-blue-100 tw-text-blue-800 dark:tw-bg-blue-900/30 dark:tw-text-blue-300';\r\n } else if (statusText.includes('APPROVED')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-green-100 tw-text-green-800 dark:tw-bg-green-900/30 dark:tw-text-green-300';\r\n } else if (statusText.includes('COMPLETED')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-emerald-100 tw-text-emerald-800 dark:tw-bg-emerald-900/30 dark:tw-text-emerald-300';\r\n } else if (statusText.includes('REJECTED')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-red-100 tw-text-red-800 dark:tw-bg-red-900/30 dark:tw-text-red-300';\r\n }\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-gray-100 tw-text-gray-800 dark:tw-bg-gray-700 dark:tw-text-gray-300';\r\n }\r\n\r\n getStudentName(): string {\r\n const req = this.request();\r\n if (!req) return 'N/A';\r\n const student = req.abnr_student_id_auth;\r\n if (!student) return 'N/A';\r\n if (typeof student === 'string') return student;\r\n return student.user_fullname || student.user_username || 'N/A';\r\n }\r\n\r\n // Generate and print certificate (following receipt pattern)\r\n generateAndDownloadDraft(): void {\r\n const req = this.request();\r\n const user = this.appStateService.currentUser();\r\n\r\n if (!req || !req._id || !user?._id) {\r\n this.notificationService.error('Missing required information');\r\n return;\r\n }\r\n\r\n // Validate certificate purpose\r\n if (!this.certificatePurpose().trim()) {\r\n this.notificationService.error('Certificate purpose is required');\r\n return;\r\n }\r\n\r\n this.generatingDraft.set(true);\r\n this.notificationService.info('Saving purpose and generating certificate...');\r\n\r\n console.log('Starting certificate generation process...');\r\n console.log('Request ID:', req._id);\r\n console.log('User ID:', user._id);\r\n console.log('Certificate Purpose:', this.certificatePurpose());\r\n\r\n // First, save the certificate purpose\r\n this.bonafideService.updateCertificatePurpose(req._id, this.certificatePurpose())\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n // Then generate certificate\r\n switchMap((updateResponse: BonafideRequestResponse) => {\r\n console.log('Update purpose response:', updateResponse);\r\n if (!updateResponse.success) {\r\n throw new Error(updateResponse.message || 'Failed to update purpose');\r\n }\r\n return this.bonafideService.generateCertificate(req._id!, user._id!);\r\n })\r\n )\r\n .subscribe({\r\n next: (response: BonafideRequestResponse) => {\r\n console.log('Generate certificate response:', response);\r\n if (response.success) {\r\n const html = response.data?.certificateHtml || response.data?.html;\r\n if (html) {\r\n this.printHtml(html);\r\n this.notificationService.success('Certificate generated successfully');\r\n } else {\r\n this.notificationService.error('Certificate HTML not available');\r\n }\r\n } else {\r\n this.notificationService.error(response.message || 'Failed to generate certificate');\r\n }\r\n this.generatingDraft.set(false);\r\n },\r\n error: (err: Error) => {\r\n console.error('Error generating certificate:', err);\r\n const errorMessage = (err as { error?: { message?: string } })?.error?.message || err.message || 'Failed to generate certificate';\r\n this.notificationService.error(errorMessage);\r\n this.generatingDraft.set(false);\r\n }\r\n });\r\n }\r\n\r\n private printHtml(html: string): void {\r\n const printWindow = window.open('', '_blank');\r\n if (printWindow) {\r\n printWindow.document.write(html);\r\n printWindow.document.close();\r\n printWindow.focus();\r\n setTimeout(() => {\r\n printWindow.print();\r\n }, 500);\r\n } else {\r\n this.notificationService.error('Failed to open print window. Please allow popups.');\r\n }\r\n }\r\n\r\n onFileUploaded(fileId: string): void {\r\n console.log('File uploaded, received ID:', fileId);\r\n this.uploadedFileId.set(fileId);\r\n console.log('uploadedFileId signal set to:', this.uploadedFileId());\r\n }\r\n\r\n onUploadStampedCopy(): void {\r\n const req = this.request();\r\n const fileId = this.uploadedFileId();\r\n const user = this.appStateService.currentUser();\r\n\r\n if (!req || !req._id || !fileId || !user) {\r\n this.notificationService.error('Missing information');\r\n return;\r\n }\r\n\r\n this.submittingApproval.set(true);\r\n this.bonafideService.uploadStampedCopy(req._id, {\r\n stampedCopyFileId: fileId,\r\n uploadedBy: user._id\r\n })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.notificationService.success('Request approved and stamped copy uploaded');\r\n this.loadRequest(req._id); // Refresh\r\n this.uploadedFileId.set(null); // Reset\r\n this.loadHistory(req._id); // Refresh history\r\n } else {\r\n this.notificationService.error(response.message || 'Failed to approve');\r\n }\r\n this.submittingApproval.set(false);\r\n },\r\n error: (err) => {\r\n this.notificationService.error(err.message || 'Failed to approve');\r\n this.submittingApproval.set(false);\r\n }\r\n });\r\n }\r\n\r\n downloadCertificate(): void {\r\n const req = this.request();\r\n if (!req || !req._id) return;\r\n\r\n this.bonafideService.downloadCertificateAsBlob(req._id, 'stamped-copy')\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = `Bonafide_Certificate_${req.abnr_request_number || 'stamped'}.pdf`;\r\n document.body.appendChild(a);\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n document.body.removeChild(a);\r\n },\r\n error: (err) => {\r\n console.error('Download failed:', err);\r\n this.notificationService.error('Failed to download certificate');\r\n }\r\n });\r\n }\r\n\r\n goBack(): void {\r\n this.router.navigate(['/control-panel/bonafide']);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n","<!-- Bonafide Request Detail with Shared Wrapper -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\r\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-bg-gray-50\">\r\n\r\n @if (loading()) {\r\n <!-- Loading State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center\">\r\n <cide-ele-icon\r\n class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading request details...</p>\r\n </div>\r\n </div>\r\n } @else if (error()) {\r\n <!-- Error State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center tw-max-w-md\">\r\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mt-4\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-mt-2\">{{ error() }}</p>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"goBack()\" class=\"tw-mt-4\">\r\n Back to List\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (request()) {\r\n @if (request(); as req) {\r\n <!-- Header Section -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600\">description</cide-ele-icon>\r\n <div>\r\n <h2 class=\"tw-text-xl tw-font-semibold tw-text-gray-900\">\r\n {{ req.abnr_request_number || 'Bonafide Request' }}\r\n </h2>\r\n <p class=\"tw-text-sm tw-text-gray-600\">\r\n {{ pageSubtitle() || 'Request details and workflow history' }}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [class]=\"getStatusBadgeClass()\">\r\n {{ getStatusText() }}\r\n </span>\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" leftIcon=\"arrow_back\" (click)=\"goBack()\">\r\n Back\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-p-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n\r\n <!-- Request Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">info</cide-ele-icon>\r\n Request Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Number</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_number || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Purpose</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_purpose || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n @if (req.abnr_completed_date) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Completed\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_completed_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Student Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-purple-500\">person</cide-ele-icon>\r\n Student Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student\r\n Name</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ getStudentName() }}</p>\r\n </div>\r\n <!-- Student ID display removed -->\r\n @if (req.abnr_student_id_auth?.user_emailid) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Email</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id_auth.user_emailid }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Academic Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-indigo-500\">school</cide-ele-icon>\r\n Academic Information\r\n </h3>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Academic\r\n Year</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Program /\r\n Class</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_class_program_id_acacpm?.acacpm_alise_title ||\r\n 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Term</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_term_id_acatrm?.acapt_name || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Section</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_section_id_acapts?.acapts_name || 'N/A' }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Faculty Actions Card (Manual Approval) -->\r\n @if (showFacultyActions()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-orange-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">verified_user</cide-ele-icon>\r\n Faculty Actions\r\n </h3>\r\n\r\n <div class=\"tw-space-y-6\">\r\n <!-- Certificate Purpose (Editable) -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">Certificate Purpose <span\r\n class=\"tw-text-red-500\">*</span></h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Edit the purpose that will be printed on the certificate. You can correct spelling or reword as needed.\r\n </p>\r\n\r\n <div class=\"tw-mb-3\">\r\n <textarea\r\n class=\"tw-w-full tw-border tw-border-gray-300 tw-rounded-md tw-px-3 tw-py-2 tw-text-sm focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n rows=\"3\" [value]=\"certificatePurpose()\" (input)=\"certificatePurpose.set($any($event.target).value)\"\r\n placeholder=\"Enter the purpose for the certificate...\" maxlength=\"500\"></textarea>\r\n <div class=\"tw-flex tw-justify-between tw-mt-1\">\r\n <span class=\"tw-text-xs tw-text-gray-400\">\r\n @if (request()?.abnr_purpose) {\r\n Original: \"{{ request()?.abnr_purpose }}\"\r\n }\r\n </span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">\r\n {{ certificatePurpose().length }}/500\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Step 1: Download Draft -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">1. Download Draft Certificate</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Download the draft certificate to sign and stamp. This includes the student's photo.\r\n </p>\r\n <button cideEleButton variant=\"secondary\" leftIcon=\"download\" (click)=\"generateAndDownloadDraft()\"\r\n [loading]=\"generatingDraft()\" [disabled]=\"!certificatePurpose().trim()\">\r\n Download Draft with Photo\r\n </button>\r\n </div>\r\n\r\n <!-- Step 2: Upload Stamped Copy -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">2. Upload Stamped Copy</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Upload the signed and stamped copy to finalize the request. This will mark the request as COMPLETED.\r\n </p>\r\n\r\n <div class=\"tw-mb-4 tw-max-w-md\">\r\n <cide-ele-file-input [autoUpload]=\"true\" label=\"Select Stamped Copy\" accept=\".pdf,.jpg,.jpeg,.png\"\r\n [multiple]=\"false\" (uploadSuccess)=\"onFileUploaded($event)\">\r\n </cide-ele-file-input>\r\n </div>\r\n\r\n <button cideEleButton variant=\"primary\" leftIcon=\"check_circle\" [disabled]=\"!uploadedFileId()\"\r\n [loading]=\"submittingApproval()\" (click)=\"onUploadStampedCopy()\">\r\n Approve & Finalize Request\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n\r\n\r\n <!-- Completed Certificate Download (For All/Student) -->\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-green-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-green-500\">check_circle</cide-ele-icon>\r\n Completed Certificate\r\n </h3>\r\n <div class=\"tw-bg-green-50 tw-p-4 tw-rounded-md\">\r\n <p class=\"tw-text-sm tw-text-green-800 tw-mb-3\">\r\n Your bonafide certificate has been approved and generated. You can download the signed copy below.\r\n </p>\r\n <button cideEleButton variant=\"primary\" leftIcon=\"download\" (click)=\"downloadCertificate()\">\r\n Download Certificate\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Workflow History Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 lg:tw-col-span-2\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">history</cide-ele-icon>\r\n Workflow History\r\n </h3>\r\n @if (loadingHistory()) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">Loading history...</p>\r\n </div>\r\n } @else if (history().length === 0) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300\">history</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">No workflow history available</p>\r\n </div>\r\n } @else {\r\n <div class=\"tw-space-y-4\">\r\n @for (item of history(); track item._id || $index) {\r\n <div\r\n class=\"tw-flex tw-items-start tw-space-x-4 tw-p-4 tw-border-l-4 tw-border-blue-500 tw-bg-gray-50 tw-rounded-r-lg\">\r\n <cide-ele-icon class=\"tw-text-blue-500 tw-mt-1\">circle</cide-ele-icon>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ item.wfth_action_type_id_sygms?.sygms_title\r\n || 'Action' }}</p>\r\n @if (item.wfth_action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.wfth_action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.wfth_comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.wfth_comments }}</p>\r\n }\r\n @if (item.wfth_action_by_user) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.wfth_action_by_user?.user_fullname ||\r\n item.wfth_action_by_user?.user_username }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</cide-lyt-shared-wrapper>"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-academics-bonafide-request-detail.component-RG_8p75c.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-detail/bonafide-request-detail.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-detail/bonafide-request-detail.component.html"],"sourcesContent":["import { Component, signal, DestroyRef, inject, computed, OnInit, effect } from '@angular/core';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { switchMap } from 'rxjs/operators';\r\nimport { CideEleButtonComponent, CideIconComponent, NotificationService } from 'cloud-ide-element';\r\nimport { CideEleFileInputComponent } from 'cloud-ide-element';\r\nimport { RightsService, CideLytSharedService, CideLytSharedWrapperComponent, AppStateService } from 'cloud-ide-layout';\r\nimport { CideAcademicsBonafideService, BonafideRequestResponse } from '../../services/bonafide.service';\r\nimport { generateObjectFromString } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-academics-bonafide-request-detail',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DatePipe,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n CideEleFileInputComponent,\r\n CideLytSharedWrapperComponent\r\n ],\r\n templateUrl: './bonafide-request-detail.component.html',\r\n styles: [`\r\n :host {\r\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\r\n }\r\n `]\r\n})\r\nexport class CideAcademicsBonafideRequestDetailComponent implements OnInit {\r\n private destroyRef = inject(DestroyRef);\r\n private bonafideService = inject(CideAcademicsBonafideService);\r\n private router = inject(Router);\r\n private route = inject(ActivatedRoute);\r\n private rightsService = inject(RightsService);\r\n private sharedService = inject(CideLytSharedService);\r\n private notificationService = inject(NotificationService);\r\n private appStateService = inject(AppStateService);\r\n\r\n request = signal<any>(null);\r\n history = signal<any[]>([]);\r\n loading = signal(false);\r\n loadingHistory = signal(false);\r\n error = signal<string | null>(null);\r\n\r\n // Faculty actions state\r\n uploadedFileId = signal<string | null>(null);\r\n generatingDraft = signal(false);\r\n submittingApproval = signal(false);\r\n\r\n // Page config\r\n pageTitle = signal<string>('');\r\n pageSubtitle = signal<string>('');\r\n pageCode = signal<string>('bonafide_request');\r\n\r\n canView = computed(() => this.rightsService.hasRight('VIEW'));\r\n canDownload = computed(() => this.rightsService.hasRight('DOWNLOAD'));\r\n\r\n // Faculty check: User is NOT a student\r\n isFaculty = computed(() => {\r\n const user = this.appStateService.currentUser();\r\n const userType = (user as any)?.user_type_mapping?.syutm_user_type;\r\n return userType !== 'STUDENT';\r\n });\r\n\r\n isPending = computed(() => {\r\n const status = this.getStatusText().toUpperCase();\r\n return status.includes('PENDING') || status.includes('PROGRESS');\r\n });\r\n\r\n showFacultyActions = computed(() => {\r\n return this.isFaculty() && this.isPending();\r\n });\r\n\r\n hasSoftCopy = computed(() => {\r\n const req = this.request();\r\n return !!(req?.abnr_soft_copy_id_cyfm);\r\n });\r\n\r\n hasStampedCopy = computed(() => {\r\n const req = this.request();\r\n return !!(req?.abnr_stamped_copy_id_cyfm);\r\n });\r\n\r\n // Certificate purpose (editable by faculty)\r\n certificatePurpose = signal<string>('');\r\n\r\n constructor() {\r\n // Watch for page data changes\r\n effect(() => {\r\n const currentPageCode = this.pageCode();\r\n if (!currentPageCode) return;\r\n\r\n const pageDataCache = this.sharedService.pageDataStore();\r\n const cachedData = pageDataCache[currentPageCode];\r\n const page = cachedData?.data?.page;\r\n\r\n if (page) {\r\n const cfgString = page?.sypg_configuration;\r\n if (cfgString) {\r\n try {\r\n const cfg = JSON.parse(cfgString);\r\n this.pageTitle.set(cfg.title || page?.sypg_title || '');\r\n this.pageSubtitle.set(cfg.subTitle || page?.sypg_desc || '');\r\n } catch (e) {\r\n console.warn('Invalid page config JSON', e);\r\n this.pageTitle.set(page?.sypg_title || '');\r\n this.pageSubtitle.set(page?.sypg_desc || '');\r\n }\r\n } else {\r\n this.pageTitle.set(page?.sypg_title || '');\r\n this.pageSubtitle.set(page?.sypg_desc || '');\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Initialize rights\r\n this.rightsService.initializeRights('bonafide_request');\r\n\r\n // Get request ID from route\r\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\r\n const query = params['query'];\r\n if (query) {\r\n const queryObj = generateObjectFromString(query);\r\n const requestId = queryObj.abnr_id || queryObj._id;\r\n if (requestId) {\r\n this.loadRequest(requestId);\r\n this.loadHistory(requestId);\r\n } else {\r\n this.error.set('Request ID not found in route');\r\n }\r\n }\r\n });\r\n }\r\n\r\n private loadRequest(requestId: string): void {\r\n this.loading.set(true);\r\n this.bonafideService.getRequestById(requestId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: BonafideRequestResponse) => {\r\n if (response.success && response.data) {\r\n this.request.set(response.data);\r\n // Initialize certificate purpose with existing value or original purpose\r\n this.certificatePurpose.set(\r\n response.data.abnr_certificate_purpose || response.data.abnr_purpose || ''\r\n );\r\n } else {\r\n this.error.set(response.message || 'Failed to load request');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err: Error) => {\r\n this.error.set('Failed to load request');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n loadHistory(requestId: string): void {\r\n this.loadingHistory.set(true);\r\n\r\n this.bonafideService.getHistory(requestId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.history.set(Array.isArray(response.data) ? response.data : []);\r\n }\r\n this.loadingHistory.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error loading history:', err);\r\n this.history.set([]);\r\n this.loadingHistory.set(false);\r\n }\r\n });\r\n }\r\n\r\n getStatusText(): string {\r\n const req = this.request();\r\n if (!req) return 'N/A';\r\n const status = req.abnr_status_id_sygms;\r\n if (!status) return 'N/A';\r\n if (typeof status === 'string') return status;\r\n return status.sygms_title || status.sygms_code || 'N/A';\r\n }\r\n\r\n getStatusBadgeClass(): string {\r\n const statusText = this.getStatusText().toUpperCase();\r\n if (statusText.includes('PENDING')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-yellow-100 tw-text-yellow-800 dark:tw-bg-yellow-900/30 dark:tw-text-yellow-300';\r\n } else if (statusText.includes('PROGRESS') || statusText.includes('REVIEW')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-blue-100 tw-text-blue-800 dark:tw-bg-blue-900/30 dark:tw-text-blue-300';\r\n } else if (statusText.includes('APPROVED')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-green-100 tw-text-green-800 dark:tw-bg-green-900/30 dark:tw-text-green-300';\r\n } else if (statusText.includes('COMPLETED')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-emerald-100 tw-text-emerald-800 dark:tw-bg-emerald-900/30 dark:tw-text-emerald-300';\r\n } else if (statusText.includes('REJECTED')) {\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-red-100 tw-text-red-800 dark:tw-bg-red-900/30 dark:tw-text-red-300';\r\n }\r\n return 'tw-inline-flex tw-items-center tw-px-3 tw-py-1 tw-rounded-full tw-text-sm tw-font-medium tw-bg-gray-100 tw-text-gray-800 dark:tw-bg-gray-700 dark:tw-text-gray-300';\r\n }\r\n\r\n getStudentName(): string {\r\n const req = this.request();\r\n if (!req) return 'N/A';\r\n const student = req.abnr_student_id_auth;\r\n if (!student) return 'N/A';\r\n if (typeof student === 'string') return student;\r\n return student.user_fullname || student.user_username || 'N/A';\r\n }\r\n\r\n // Generate and print certificate (following receipt pattern)\r\n generateAndDownloadDraft(): void {\r\n const req = this.request();\r\n const user = this.appStateService.currentUser();\r\n\r\n if (!req || !req._id || !user?._id) {\r\n this.notificationService.error('Missing required information');\r\n return;\r\n }\r\n\r\n // Validate certificate purpose\r\n if (!this.certificatePurpose().trim()) {\r\n this.notificationService.error('Certificate purpose is required');\r\n return;\r\n }\r\n\r\n this.generatingDraft.set(true);\r\n this.notificationService.info('Saving purpose and generating certificate...');\r\n\r\n console.log('Starting certificate generation process...');\r\n console.log('Request ID:', req._id);\r\n console.log('User ID:', user._id);\r\n console.log('Certificate Purpose:', this.certificatePurpose());\r\n\r\n // First, save the certificate purpose\r\n this.bonafideService.updateCertificatePurpose(req._id, this.certificatePurpose())\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n // Then generate certificate\r\n switchMap((updateResponse: BonafideRequestResponse) => {\r\n console.log('Update purpose response:', updateResponse);\r\n if (!updateResponse.success) {\r\n throw new Error(updateResponse.message || 'Failed to update purpose');\r\n }\r\n return this.bonafideService.generateCertificate(req._id!, user._id!);\r\n })\r\n )\r\n .subscribe({\r\n next: (response: BonafideRequestResponse) => {\r\n console.log('Generate certificate response:', response);\r\n if (response.success) {\r\n const html = response.data?.certificateHtml || response.data?.html;\r\n if (html) {\r\n this.printHtml(html);\r\n this.notificationService.success('Certificate generated successfully');\r\n } else {\r\n this.notificationService.error('Certificate HTML not available');\r\n }\r\n } else {\r\n this.notificationService.error(response.message || 'Failed to generate certificate');\r\n }\r\n this.generatingDraft.set(false);\r\n },\r\n error: (err: Error) => {\r\n console.error('Error generating certificate:', err);\r\n const errorMessage = (err as { error?: { message?: string } })?.error?.message || err.message || 'Failed to generate certificate';\r\n this.notificationService.error(errorMessage);\r\n this.generatingDraft.set(false);\r\n }\r\n });\r\n }\r\n\r\n private printHtml(html: string): void {\r\n const printWindow = window.open('', '_blank');\r\n if (printWindow) {\r\n printWindow.document.write(html);\r\n printWindow.document.close();\r\n printWindow.focus();\r\n setTimeout(() => {\r\n printWindow.print();\r\n }, 500);\r\n } else {\r\n this.notificationService.error('Failed to open print window. Please allow popups.');\r\n }\r\n }\r\n\r\n onFileUploaded(fileId: string): void {\r\n console.log('File uploaded, received ID:', fileId);\r\n this.uploadedFileId.set(fileId);\r\n console.log('uploadedFileId signal set to:', this.uploadedFileId());\r\n }\r\n\r\n onUploadStampedCopy(): void {\r\n const req = this.request();\r\n const fileId = this.uploadedFileId();\r\n const user = this.appStateService.currentUser();\r\n\r\n if (!req || !req._id || !fileId || !user) {\r\n this.notificationService.error('Missing information');\r\n return;\r\n }\r\n\r\n this.submittingApproval.set(true);\r\n this.bonafideService.uploadStampedCopy(req._id, {\r\n stampedCopyFileId: fileId,\r\n uploadedBy: user._id\r\n })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.notificationService.success('Request approved and stamped copy uploaded');\r\n this.loadRequest(req._id); // Refresh\r\n this.uploadedFileId.set(null); // Reset\r\n this.loadHistory(req._id); // Refresh history\r\n } else {\r\n this.notificationService.error(response.message || 'Failed to approve');\r\n }\r\n this.submittingApproval.set(false);\r\n },\r\n error: (err) => {\r\n this.notificationService.error(err.message || 'Failed to approve');\r\n this.submittingApproval.set(false);\r\n }\r\n });\r\n }\r\n\r\n downloadCertificate(): void {\r\n const req = this.request();\r\n if (!req || !req._id) return;\r\n\r\n this.bonafideService.downloadCertificateAsBlob(req._id, 'stamped-copy')\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = `Bonafide_Certificate_${req.abnr_request_number || 'stamped'}.pdf`;\r\n document.body.appendChild(a);\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n document.body.removeChild(a);\r\n },\r\n error: (err) => {\r\n console.error('Download failed:', err);\r\n this.notificationService.error('Failed to download certificate');\r\n }\r\n });\r\n }\r\n\r\n goBack(): void {\r\n this.router.navigate(['/control-panel/bonafide']);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n","<!-- Bonafide Request Detail with Shared Wrapper -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\r\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-bg-gray-50\">\r\n\r\n @if (loading()) {\r\n <!-- Loading State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center\">\r\n <cide-ele-icon\r\n class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading request details...</p>\r\n </div>\r\n </div>\r\n } @else if (error()) {\r\n <!-- Error State -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-full\">\r\n <div class=\"tw-text-center tw-max-w-md\">\r\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mt-4\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-mt-2\">{{ error() }}</p>\r\n <button cideEleButton variant=\"primary\" size=\"xs\" (click)=\"goBack()\" class=\"tw-mt-4\">\r\n Back to List\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (request()) {\r\n @if (request(); as req) {\r\n <!-- Header Section -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600\">description</cide-ele-icon>\r\n <div>\r\n <h2 class=\"tw-text-xl tw-font-semibold tw-text-gray-900\">\r\n {{ req.abnr_request_number || 'Bonafide Request' }}\r\n </h2>\r\n <p class=\"tw-text-sm tw-text-gray-600\">\r\n {{ pageSubtitle() || 'Request details and workflow history' }}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [class]=\"getStatusBadgeClass()\">\r\n {{ getStatusText() }}\r\n </span>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" leftIcon=\"arrow_back\" (click)=\"goBack()\">\r\n Back\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-p-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n\r\n <!-- Request Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">info</cide-ele-icon>\r\n Request Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Number</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_number || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Purpose</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_purpose || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Request\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_request_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n @if (req.abnr_completed_date) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Completed\r\n Date</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_completed_date | date:'MMM dd, yyyy' }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Student Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-purple-500\">person</cide-ele-icon>\r\n Student Information\r\n </h3>\r\n <div class=\"tw-space-y-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student\r\n Name</label>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-mt-1\">{{ getStudentName() }}</p>\r\n </div>\r\n <!-- Student ID display removed -->\r\n @if (req.abnr_student_id_auth?.user_emailid) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Email</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id_auth.user_emailid }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Academic Information Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-indigo-500\">school</cide-ele-icon>\r\n Academic Information\r\n </h3>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Academic\r\n Year</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Program /\r\n Class</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_class_program_id_acacpm?.acacpm_alise_title ||\r\n 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Term</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_term_id_acatrm?.acapt_name || 'N/A' }}</p>\r\n </div>\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Section</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_section_id_acapts?.acapts_name || 'N/A' }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Faculty Actions Card (Manual Approval) -->\r\n @if (showFacultyActions()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-orange-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">verified_user</cide-ele-icon>\r\n Faculty Actions\r\n </h3>\r\n\r\n <div class=\"tw-space-y-6\">\r\n <!-- Certificate Purpose (Editable) -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">Certificate Purpose <span\r\n class=\"tw-text-red-500\">*</span></h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Edit the purpose that will be printed on the certificate. You can correct spelling or reword as needed.\r\n </p>\r\n\r\n <div class=\"tw-mb-3\">\r\n <textarea\r\n class=\"tw-w-full tw-border tw-border-gray-300 tw-rounded-md tw-px-3 tw-py-2 tw-text-sm focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n rows=\"3\" [value]=\"certificatePurpose()\" (input)=\"certificatePurpose.set($any($event.target).value)\"\r\n placeholder=\"Enter the purpose for the certificate...\" maxlength=\"500\"></textarea>\r\n <div class=\"tw-flex tw-justify-between tw-mt-1\">\r\n <span class=\"tw-text-xs tw-text-gray-400\">\r\n @if (request()?.abnr_purpose) {\r\n Original: \"{{ request()?.abnr_purpose }}\"\r\n }\r\n </span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">\r\n {{ certificatePurpose().length }}/500\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Step 1: Download Draft -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">1. Download Draft Certificate</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Download the draft certificate to sign and stamp. This includes the student's photo.\r\n </p>\r\n <button cideEleButton variant=\"secondary\" leftIcon=\"download\" (click)=\"generateAndDownloadDraft()\"\r\n [loading]=\"generatingDraft()\" [disabled]=\"!certificatePurpose().trim()\">\r\n Download Draft with Photo\r\n </button>\r\n </div>\r\n\r\n <!-- Step 2: Upload Stamped Copy -->\r\n <div class=\"tw-bg-gray-50 tw-p-4 tw-rounded-md\">\r\n <h4 class=\"tw-font-medium tw-text-gray-900 tw-mb-1\">2. Upload Stamped Copy</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mb-3\">\r\n Upload the signed and stamped copy to finalize the request. This will mark the request as COMPLETED.\r\n </p>\r\n\r\n <div class=\"tw-mb-4 tw-max-w-md\">\r\n <cide-ele-file-input [autoUpload]=\"true\" label=\"Select Stamped Copy\" accept=\".pdf,.jpg,.jpeg,.png\"\r\n [multiple]=\"false\" (uploadSuccess)=\"onFileUploaded($event)\">\r\n </cide-ele-file-input>\r\n </div>\r\n\r\n <button cideEleButton variant=\"primary\" leftIcon=\"check_circle\" [disabled]=\"!uploadedFileId()\"\r\n [loading]=\"submittingApproval()\" (click)=\"onUploadStampedCopy()\">\r\n Approve & Finalize Request\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n\r\n\r\n <!-- Completed Certificate Download (For All/Student) -->\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 tw-mb-6 border-l-4 border-green-500\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-green-500\">check_circle</cide-ele-icon>\r\n Completed Certificate\r\n </h3>\r\n <div class=\"tw-bg-green-50 tw-p-4 tw-rounded-md\">\r\n <p class=\"tw-text-sm tw-text-green-800 tw-mb-3\">\r\n Your bonafide certificate has been approved and generated. You can download the signed copy below.\r\n </p>\r\n <button cideEleButton variant=\"primary\" leftIcon=\"download\" (click)=\"downloadCertificate()\">\r\n Download Certificate\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Workflow History Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-shadow tw-p-6 lg:tw-col-span-2\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-orange-500\">history</cide-ele-icon>\r\n Workflow History\r\n </h3>\r\n @if (loadingHistory()) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300 tw-animate-spin\">refresh</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">Loading history...</p>\r\n </div>\r\n } @else if (history().length === 0) {\r\n <div class=\"tw-text-center tw-py-8\">\r\n <cide-ele-icon class=\"tw-text-4xl tw-text-gray-300\">history</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-mt-2\">No workflow history available</p>\r\n </div>\r\n } @else {\r\n <div class=\"tw-space-y-4\">\r\n @for (item of history(); track item._id || $index) {\r\n <div\r\n class=\"tw-flex tw-items-start tw-space-x-4 tw-p-4 tw-border-l-4 tw-border-blue-500 tw-bg-gray-50 tw-rounded-r-lg\">\r\n <cide-ele-icon class=\"tw-text-blue-500 tw-mt-1\">circle</cide-ele-icon>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ item.wfth_action_type_id_sygms?.sygms_title\r\n || 'Action' }}</p>\r\n @if (item.wfth_action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.wfth_action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.wfth_comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.wfth_comments }}</p>\r\n }\r\n @if (item.wfth_action_by_user) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.wfth_action_by_user?.user_fullname ||\r\n item.wfth_action_by_user?.user_username }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</cide-lyt-shared-wrapper>"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
9
  import { NotificationService, CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideFormFieldErrorComponent, CideSelectComponent } from 'cloud-ide-element';
10
10
  import { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
11
11
  import { C as CideAcademicsBonafideService } from './cloud-ide-academics-bonafide.service-BSelbA0D.mjs';
12
- import { e as CideLytProgramSectionSelectorComponent } from './cloud-ide-academics-cloud-ide-academics-Ch8rjGyx.mjs';
12
+ import { e as CideLytProgramSectionSelectorComponent } from './cloud-ide-academics-cloud-ide-academics-No6zWRYY.mjs';
13
13
  import { CideCoreUserMasterService } from 'cloud-ide-core';
14
14
  import { AuthUserMstListPayload } from 'cloud-ide-lms-model';
15
15
 
@@ -325,4 +325,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
325
325
  }] });
326
326
 
327
327
  export { CideAcademicsBonafideRequestFormComponent };
328
- //# sourceMappingURL=cloud-ide-academics-bonafide-request-form.component-BjVCiCa1.mjs.map
328
+ //# sourceMappingURL=cloud-ide-academics-bonafide-request-form.component-IaFvjXbQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-academics-bonafide-request-form.component-BjVCiCa1.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-form/bonafide-request-form.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-form/bonafide-request-form.component.html"],"sourcesContent":["import { Component, signal, DestroyRef, inject, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideFormFieldErrorComponent, CideSelectComponent } from 'cloud-ide-element';\nimport { NotificationService } from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, AppStateHelperService } from 'cloud-ide-layout';\nimport { CideAcademicsBonafideService } from '../../services/bonafide.service';\nimport { cidePath, coreRoutesUrl, hostManagerRoutesUrl, generateStringFromObject, admissionRoutesUrl, MAdmissionApplicationMain } from 'cloud-ide-lms-model';\nimport { CideLytProgramSectionSelectorComponent } from '../../../../../public-api';\nimport { startWith } from 'rxjs/operators';\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\nimport { AuthUserMstListPayload } from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-academics-bonafide-request-form',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideFormFieldErrorComponent,\n CideLytSharedWrapperComponent,\n CideLytProgramSectionSelectorComponent,\n CideSelectComponent\n ],\n templateUrl: './bonafide-request-form.component.html',\n styles: [`\n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class CideAcademicsBonafideRequestFormComponent implements OnInit {\n private destroyRef = inject(DestroyRef);\n private bonafideService = inject(CideAcademicsBonafideService);\n private fb = inject(FormBuilder);\n private router = inject(Router);\n private notificationService = inject(NotificationService);\n private appStateHelper = inject(AppStateHelperService);\n private http = inject(HttpClient);\n\n form: FormGroup = this.fb.group({\n // Common fields\n abnr_purpose: ['', Validators.required],\n abnr_remarks: [''],\n // For non-student users: class/section/student selection\n class_program_id: [''],\n branch_id: [''],\n term_id: [''],\n section_id: [''],\n selected_student_id: ['']\n });\n\n loading = signal(false);\n initializing = signal(true);\n isStudentUser = signal<boolean>(false);\n\n // Store student and entity IDs\n private studentAuthId: string | null = null;\n private entityId: string | null = null;\n\n // For non-student users: class/section/student selection\n studentsList = signal<any[]>([]);\n studentsLoading = signal(false);\n selectedStudent = signal<any | null>(null);\n\n // Flag to prevent reactive clearing during auto-population\n private isProgrammaticUpdate = false;\n\n // Expose IDs for template binding\n readonly activeEntityId = computed(() => this.appStateHelper.activeEntity()?._id || '');\n readonly activeAcademicYearId = computed(() => this.appStateHelper.activeAcademicYear()?._id || '');\n\n // Reactive form values for computed signals\n private formValues = toSignal(this.form.valueChanges, { initialValue: this.form.value });\n\n // Visibility logic controlled by class program and term\n showClassSectionSelector = computed(() => {\n const vals = this.formValues();\n // return !vals?.class_program_id || !vals?.term_id;\n return true;\n });\n\n showStudentSelector = computed(() => {\n return this.isStudentUser() ? false : true;\n });\n\n ngOnInit(): void {\n // Watch for class/section changes to load students\n this.setupClassSectionWatchers();\n\n // Load student and entity data from admission\n this.loadStudentAndEntityData();\n }\n\n /**\n * Setup watchers for class/section changes to load students\n */\n private setupClassSectionWatchers(): void {\n // Watch for section_id changes to load students\n this.form.get('section_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.loadStudentsByClassSection();\n });\n\n // Watch for class_program_id changes (if section not available)\n this.form.get('class_program_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // Reset section and student when class changes, but ONLY if not a programmatic update\n if (!this.isProgrammaticUpdate) {\n this.form.patchValue({ section_id: '', selected_student_id: '' }, { emitEvent: false });\n this.loadStudentsByClassSection();\n }\n });\n }\n\n /**\n * Update validators based on user type\n */\n private updateValidators(): void {\n const isStudent = this.isStudentUser();\n const studentControl = this.form.get('selected_student_id');\n\n if (!isStudent && studentControl) {\n // Non-student: make student selection required\n studentControl.setValidators([Validators.required]);\n } else if (isStudent && studentControl) {\n // Student: remove required validator\n studentControl.clearValidators();\n }\n studentControl?.updateValueAndValidity({ emitEvent: false });\n }\n\n private userMasterService = inject(CideCoreUserMasterService);\n\n // ... inside loadStudentsByClassSection ...\n\n /**\n * Load students based on selected class/section\n */\n private loadStudentsByClassSection(): void {\n const classProgramId = this.form.get('class_program_id')?.value;\n const sectionId = this.form.get('section_id')?.value;\n\n if (!classProgramId) {\n this.studentsList.set([]);\n this.form.patchValue({ selected_student_id: '' }, { emitEvent: false });\n return;\n }\n\n this.studentsLoading.set(true);\n\n // Build payload for User List API\n // We are filtering by User Type 'STUDENT' and current Entity\n // We also attempt to pass Class/Section filters if the API supports them dynamically\n const payload = new AuthUserMstListPayload({\n syutm_user_type: 'STUDENT',\n syenm_entity_id_syen: this.activeEntityId(),\n // Custom filters for class/section - utilizing any dynamic fields the API might accept\n // or assuming the backend can filter by these if passed\n admap_class_program_id_acacpm: classProgramId,\n admap_section_id_acapts: sectionId,\n admap_isactive: true,\n pagination: false // Get all matching students\n } as any);\n\n this.userMasterService.getUserList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const users = response.data;\n // Map to student options\n const students = users.map((user: any) => ({\n value: user._id,\n label: `${user.user_firstname || ''} ${user.user_lastname || ''}`.trim() || user.user_username,\n // Fallback: use username as student ID since we don't have admission object\n admission: {\n admap_student_id: user.user_username,\n // Keep other admission fields null or minimal as they aren't available from User API\n }\n }));\n this.studentsList.set(students);\n } else {\n this.studentsList.set([]);\n }\n this.studentsLoading.set(false);\n },\n error: (err) => {\n console.error('Error loading students via User API:', err);\n this.notificationService.error('Failed to load students. Please try again.');\n this.studentsList.set([]);\n this.studentsLoading.set(false);\n }\n });\n }\n\n /**\n * Load student ID and entity ID from admission data\n * Determines if user is a student or non-student\n */\n /**\n * Load student ID and entity ID from admission data\n * Determines if user is a student or non-student\n */\n private loadStudentAndEntityData(): void {\n this.initializing.set(true);\n\n // Get current user\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n this.notificationService.error('User not authenticated');\n this.initializing.set(false);\n return;\n }\n\n // Check if user is a student based on user type mapping\n const isStudent = (currentUser as any)?.user_type_mapping?.syutm_user_type === 'STUDENT';\n this.isStudentUser.set(isStudent);\n this.updateValidators();\n\n // If not a student, we are done with initialization (just need entity ID)\n if (!isStudent) {\n const activeEntity = this.appStateHelper.activeEntity();\n if (activeEntity?._id) {\n this.entityId = activeEntity._id;\n } else {\n this.notificationService.warning('Entity ID not found. Please contact administrator.');\n }\n this.initializing.set(false);\n return;\n }\n\n // If student, attempt to load admission data from AppState (populated during login)\n // This avoids redundant API calls as per user request\n const studentModel = this.appStateHelper.studentModel();\n\n if (studentModel) {\n console.log('Using cached student model:', studentModel);\n const admissionData = studentModel;\n\n // Student user: auto-populate student and entity IDs\n // We need the AUTH USER ID, not the readable student ID\n this.studentAuthId = currentUser._id;\n\n // Ensure entityId is just the string ID\n const entityData = admissionData?.admap_entity_id_syen;\n this.entityId = typeof entityData === 'object' ? entityData?._id : entityData || null;\n\n // Patch form with student's current enrollment info\n // This will automatically hide the class section selector via showClassSectionSelector signal\n this.isProgrammaticUpdate = true;\n this.form.patchValue({\n class_program_id: admissionData.admap_class_program_id_acacpm,\n branch_id: admissionData.admap_branch_id_acabrc,\n term_id: admissionData.admap_term_id_acatrm,\n section_id: admissionData.admap_section_id_acapts\n });\n this.isProgrammaticUpdate = false;\n\n // If entity ID not found in admission, try to get from active entity\n if (!this.entityId) {\n const activeEntity = this.appStateHelper.activeEntity();\n if (activeEntity?._id) {\n this.entityId = activeEntity._id;\n }\n }\n\n if (!this.entityId) {\n this.notificationService.warning('Entity ID not found. Please contact administrator.');\n }\n this.initializing.set(false);\n } else {\n // Student is logged in but no student model found in state\n console.warn('Student model not found in AppState');\n this.notificationService.warning('Student details not found. Please re-login.');\n\n const activeEntity = this.appStateHelper.activeEntity();\n if (activeEntity?._id) {\n this.entityId = activeEntity._id;\n }\n this.initializing.set(false);\n }\n }\n\n onSubmit(): void {\n if (this.form.valid) {\n // Determine student ID based on user type\n let finalStudentId: string | null = null;\n\n if (this.isStudentUser()) {\n // Student user: use auto-fetched student ID\n finalStudentId = this.studentAuthId;\n } else {\n // Non-student user: use selected student ID\n const studentOption = this.studentsList().find(s => s.value === this.form.get('selected_student_id')?.value);\n finalStudentId = studentOption?.value || null;\n }\n\n // Validate required data\n if (!finalStudentId) {\n if (this.isStudentUser()) {\n this.notificationService.error('Student ID is required. Please ensure your admission is confirmed.');\n } else {\n this.notificationService.error('Please select a student.');\n }\n return;\n }\n\n if (!this.entityId) {\n this.notificationService.error('Entity ID is required. Please contact administrator.');\n return;\n }\n\n const formValues = this.form.value;\n if (!formValues.class_program_id || !formValues.term_id || !formValues.section_id) {\n this.notificationService.error('Class, Term and Section details are required.');\n return;\n }\n\n this.loading.set(true);\n\n // Build payload with all required fields\n const payload = {\n abnr_student_id_auth: finalStudentId,\n abnr_entity_id_syen: this.entityId,\n abnr_academic_year_id_acayr: this.activeAcademicYearId(),\n abnr_class_program_id_acacpm: formValues.class_program_id,\n abnr_term_id_acatrm: formValues.term_id,\n abnr_section_id_acapts: formValues.section_id,\n abnr_purpose: formValues.abnr_purpose,\n abnr_remarks: formValues.abnr_remarks || '',\n abnr_requested_by_user: this.appStateHelper.getCurrentUser()?._id\n };\n\n this.bonafideService.createRequest(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.notificationService.success('Bonafide request created successfully');\n this.router.navigate(['/control-panel/bonafide']);\n } else {\n this.notificationService.error(response.message || 'Failed to create request');\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error creating bonafide request:', err);\n this.notificationService.error(err.error?.message || 'Failed to create request');\n this.loading.set(false);\n }\n });\n }\n }\n\n cancel(): void {\n this.router.navigate(['/control-panel/bonafide']);\n }\n}\n\n","<!-- Bonafide Request Form with Shared Wrapper -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\n <div class=\"tw-w-full tw-h-full\">\n @if (initializing()) {\n <!-- Loading State -->\n <div class=\"tw-w-full tw-h-full tw-flex tw-items-center tw-justify-center\">\n <div class=\"tw-text-center\">\n <div class=\"tw-text-gray-600 tw-mb-2\">Loading student information...</div>\n <div class=\"tw-text-sm tw-text-gray-500\">Please wait</div>\n </div>\n </div>\n } @else {\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\" class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\"\n [class.tw-opacity-60]=\"loading()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <!-- Form Fields -->\n <div class=\"tw-space-y-6\">\n <!-- Class/Section Selector for Non-Student Users -->\n @if (showClassSectionSelector()) {\n <div class=\"tw-max-w-4xl\">\n <div class=\"tw-mb-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-700 tw-mb-2\">Select Class & Section</h3>\n <p class=\"tw-text-xs tw-text-gray-500\">Select the class and section to find the student</p>\n </div>\n <cide-lyt-program-section-selector [formGroup]=\"form\" [entityId]=\"activeEntityId()\"\n [academicYearId]=\"activeAcademicYearId()\" classProgramControlName=\"class_program_id\"\n branchControlName=\"branch_id\" termControlName=\"term_id\" sectionControlName=\"section_id\"\n [showLabels]=\"true\" [disabled]=\"loading()\">\n </cide-lyt-program-section-selector>\n </div>\n }\n <!-- Student Selection for Non-Student Users -->\n @if (showStudentSelector()) {\n <div class=\"tw-max-w-2xl\">\n <cide-ele-select label=\"Select Student\" formControlName=\"selected_student_id\" [options]=\"studentsList()\"\n [loading]=\"studentsLoading()\" placeholder=\"Select a student\" valueKey=\"value\" labelKey=\"label\"\n size=\"md\" [required]=\"true\" [disabled]=\"loading() || studentsLoading()\">\n </cide-ele-select>\n </div>\n }\n\n <!-- Purpose Field -->\n <div class=\"tw-max-w-2xl\">\n <cide-ele-input label=\"Purpose\" formControlName=\"abnr_purpose\" [required]=\"true\"\n placeholder=\"Enter purpose for bonafide certificate\" size=\"md\" [disabled]=\"loading()\">\n </cide-ele-input>\n </div>\n\n <!-- Remarks Field -->\n <div class=\"tw-max-w-2xl\">\n <cide-ele-textarea label=\"Remarks\" formControlName=\"abnr_remarks\"\n placeholder=\"Enter any additional remarks\" rows=\"4\" size=\"md\" [disabled]=\"loading()\">\n </cide-ele-textarea>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\n <div class=\"tw-flex tw-flex-col tw-gap-3\">\n <!-- Error Message -->\n <div class=\"tw-w-full\">\n <cide-form-field-error [formGroup]=\"form\"></cide-form-field-error>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancel()\" [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"!form.valid || loading()\"\n [loading]=\"loading()\" leftIcon=\"save\">\n Submit Request\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n }\n </div>\n</cide-lyt-shared-wrapper>"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-academics-bonafide-request-form.component-IaFvjXbQ.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-form/bonafide-request-form.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/bonafide/components/bonafide-request-form/bonafide-request-form.component.html"],"sourcesContent":["import { Component, signal, DestroyRef, inject, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideFormFieldErrorComponent, CideSelectComponent } from 'cloud-ide-element';\nimport { NotificationService } from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, AppStateHelperService } from 'cloud-ide-layout';\nimport { CideAcademicsBonafideService } from '../../services/bonafide.service';\nimport { cidePath, coreRoutesUrl, hostManagerRoutesUrl, generateStringFromObject, admissionRoutesUrl, MAdmissionApplicationMain } from 'cloud-ide-lms-model';\nimport { CideLytProgramSectionSelectorComponent } from '../../../../../public-api';\nimport { startWith } from 'rxjs/operators';\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\nimport { AuthUserMstListPayload } from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-academics-bonafide-request-form',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideFormFieldErrorComponent,\n CideLytSharedWrapperComponent,\n CideLytProgramSectionSelectorComponent,\n CideSelectComponent\n ],\n templateUrl: './bonafide-request-form.component.html',\n styles: [`\n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class CideAcademicsBonafideRequestFormComponent implements OnInit {\n private destroyRef = inject(DestroyRef);\n private bonafideService = inject(CideAcademicsBonafideService);\n private fb = inject(FormBuilder);\n private router = inject(Router);\n private notificationService = inject(NotificationService);\n private appStateHelper = inject(AppStateHelperService);\n private http = inject(HttpClient);\n\n form: FormGroup = this.fb.group({\n // Common fields\n abnr_purpose: ['', Validators.required],\n abnr_remarks: [''],\n // For non-student users: class/section/student selection\n class_program_id: [''],\n branch_id: [''],\n term_id: [''],\n section_id: [''],\n selected_student_id: ['']\n });\n\n loading = signal(false);\n initializing = signal(true);\n isStudentUser = signal<boolean>(false);\n\n // Store student and entity IDs\n private studentAuthId: string | null = null;\n private entityId: string | null = null;\n\n // For non-student users: class/section/student selection\n studentsList = signal<any[]>([]);\n studentsLoading = signal(false);\n selectedStudent = signal<any | null>(null);\n\n // Flag to prevent reactive clearing during auto-population\n private isProgrammaticUpdate = false;\n\n // Expose IDs for template binding\n readonly activeEntityId = computed(() => this.appStateHelper.activeEntity()?._id || '');\n readonly activeAcademicYearId = computed(() => this.appStateHelper.activeAcademicYear()?._id || '');\n\n // Reactive form values for computed signals\n private formValues = toSignal(this.form.valueChanges, { initialValue: this.form.value });\n\n // Visibility logic controlled by class program and term\n showClassSectionSelector = computed(() => {\n const vals = this.formValues();\n // return !vals?.class_program_id || !vals?.term_id;\n return true;\n });\n\n showStudentSelector = computed(() => {\n return this.isStudentUser() ? false : true;\n });\n\n ngOnInit(): void {\n // Watch for class/section changes to load students\n this.setupClassSectionWatchers();\n\n // Load student and entity data from admission\n this.loadStudentAndEntityData();\n }\n\n /**\n * Setup watchers for class/section changes to load students\n */\n private setupClassSectionWatchers(): void {\n // Watch for section_id changes to load students\n this.form.get('section_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.loadStudentsByClassSection();\n });\n\n // Watch for class_program_id changes (if section not available)\n this.form.get('class_program_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // Reset section and student when class changes, but ONLY if not a programmatic update\n if (!this.isProgrammaticUpdate) {\n this.form.patchValue({ section_id: '', selected_student_id: '' }, { emitEvent: false });\n this.loadStudentsByClassSection();\n }\n });\n }\n\n /**\n * Update validators based on user type\n */\n private updateValidators(): void {\n const isStudent = this.isStudentUser();\n const studentControl = this.form.get('selected_student_id');\n\n if (!isStudent && studentControl) {\n // Non-student: make student selection required\n studentControl.setValidators([Validators.required]);\n } else if (isStudent && studentControl) {\n // Student: remove required validator\n studentControl.clearValidators();\n }\n studentControl?.updateValueAndValidity({ emitEvent: false });\n }\n\n private userMasterService = inject(CideCoreUserMasterService);\n\n // ... inside loadStudentsByClassSection ...\n\n /**\n * Load students based on selected class/section\n */\n private loadStudentsByClassSection(): void {\n const classProgramId = this.form.get('class_program_id')?.value;\n const sectionId = this.form.get('section_id')?.value;\n\n if (!classProgramId) {\n this.studentsList.set([]);\n this.form.patchValue({ selected_student_id: '' }, { emitEvent: false });\n return;\n }\n\n this.studentsLoading.set(true);\n\n // Build payload for User List API\n // We are filtering by User Type 'STUDENT' and current Entity\n // We also attempt to pass Class/Section filters if the API supports them dynamically\n const payload = new AuthUserMstListPayload({\n syutm_user_type: 'STUDENT',\n syenm_entity_id_syen: this.activeEntityId(),\n // Custom filters for class/section - utilizing any dynamic fields the API might accept\n // or assuming the backend can filter by these if passed\n admap_class_program_id_acacpm: classProgramId,\n admap_section_id_acapts: sectionId,\n admap_isactive: true,\n pagination: false // Get all matching students\n } as any);\n\n this.userMasterService.getUserList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const users = response.data;\n // Map to student options\n const students = users.map((user: any) => ({\n value: user._id,\n label: `${user.user_firstname || ''} ${user.user_lastname || ''}`.trim() || user.user_username,\n // Fallback: use username as student ID since we don't have admission object\n admission: {\n admap_student_id: user.user_username,\n // Keep other admission fields null or minimal as they aren't available from User API\n }\n }));\n this.studentsList.set(students);\n } else {\n this.studentsList.set([]);\n }\n this.studentsLoading.set(false);\n },\n error: (err) => {\n console.error('Error loading students via User API:', err);\n this.notificationService.error('Failed to load students. Please try again.');\n this.studentsList.set([]);\n this.studentsLoading.set(false);\n }\n });\n }\n\n /**\n * Load student ID and entity ID from admission data\n * Determines if user is a student or non-student\n */\n /**\n * Load student ID and entity ID from admission data\n * Determines if user is a student or non-student\n */\n private loadStudentAndEntityData(): void {\n this.initializing.set(true);\n\n // Get current user\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n this.notificationService.error('User not authenticated');\n this.initializing.set(false);\n return;\n }\n\n // Check if user is a student based on user type mapping\n const isStudent = (currentUser as any)?.user_type_mapping?.syutm_user_type === 'STUDENT';\n this.isStudentUser.set(isStudent);\n this.updateValidators();\n\n // If not a student, we are done with initialization (just need entity ID)\n if (!isStudent) {\n const activeEntity = this.appStateHelper.activeEntity();\n if (activeEntity?._id) {\n this.entityId = activeEntity._id;\n } else {\n this.notificationService.warning('Entity ID not found. Please contact administrator.');\n }\n this.initializing.set(false);\n return;\n }\n\n // If student, attempt to load admission data from AppState (populated during login)\n // This avoids redundant API calls as per user request\n const studentModel = this.appStateHelper.studentModel();\n\n if (studentModel) {\n console.log('Using cached student model:', studentModel);\n const admissionData = studentModel;\n\n // Student user: auto-populate student and entity IDs\n // We need the AUTH USER ID, not the readable student ID\n this.studentAuthId = currentUser._id;\n\n // Ensure entityId is just the string ID\n const entityData = admissionData?.admap_entity_id_syen;\n this.entityId = typeof entityData === 'object' ? entityData?._id : entityData || null;\n\n // Patch form with student's current enrollment info\n // This will automatically hide the class section selector via showClassSectionSelector signal\n this.isProgrammaticUpdate = true;\n this.form.patchValue({\n class_program_id: admissionData.admap_class_program_id_acacpm,\n branch_id: admissionData.admap_branch_id_acabrc,\n term_id: admissionData.admap_term_id_acatrm,\n section_id: admissionData.admap_section_id_acapts\n });\n this.isProgrammaticUpdate = false;\n\n // If entity ID not found in admission, try to get from active entity\n if (!this.entityId) {\n const activeEntity = this.appStateHelper.activeEntity();\n if (activeEntity?._id) {\n this.entityId = activeEntity._id;\n }\n }\n\n if (!this.entityId) {\n this.notificationService.warning('Entity ID not found. Please contact administrator.');\n }\n this.initializing.set(false);\n } else {\n // Student is logged in but no student model found in state\n console.warn('Student model not found in AppState');\n this.notificationService.warning('Student details not found. Please re-login.');\n\n const activeEntity = this.appStateHelper.activeEntity();\n if (activeEntity?._id) {\n this.entityId = activeEntity._id;\n }\n this.initializing.set(false);\n }\n }\n\n onSubmit(): void {\n if (this.form.valid) {\n // Determine student ID based on user type\n let finalStudentId: string | null = null;\n\n if (this.isStudentUser()) {\n // Student user: use auto-fetched student ID\n finalStudentId = this.studentAuthId;\n } else {\n // Non-student user: use selected student ID\n const studentOption = this.studentsList().find(s => s.value === this.form.get('selected_student_id')?.value);\n finalStudentId = studentOption?.value || null;\n }\n\n // Validate required data\n if (!finalStudentId) {\n if (this.isStudentUser()) {\n this.notificationService.error('Student ID is required. Please ensure your admission is confirmed.');\n } else {\n this.notificationService.error('Please select a student.');\n }\n return;\n }\n\n if (!this.entityId) {\n this.notificationService.error('Entity ID is required. Please contact administrator.');\n return;\n }\n\n const formValues = this.form.value;\n if (!formValues.class_program_id || !formValues.term_id || !formValues.section_id) {\n this.notificationService.error('Class, Term and Section details are required.');\n return;\n }\n\n this.loading.set(true);\n\n // Build payload with all required fields\n const payload = {\n abnr_student_id_auth: finalStudentId,\n abnr_entity_id_syen: this.entityId,\n abnr_academic_year_id_acayr: this.activeAcademicYearId(),\n abnr_class_program_id_acacpm: formValues.class_program_id,\n abnr_term_id_acatrm: formValues.term_id,\n abnr_section_id_acapts: formValues.section_id,\n abnr_purpose: formValues.abnr_purpose,\n abnr_remarks: formValues.abnr_remarks || '',\n abnr_requested_by_user: this.appStateHelper.getCurrentUser()?._id\n };\n\n this.bonafideService.createRequest(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.notificationService.success('Bonafide request created successfully');\n this.router.navigate(['/control-panel/bonafide']);\n } else {\n this.notificationService.error(response.message || 'Failed to create request');\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error creating bonafide request:', err);\n this.notificationService.error(err.error?.message || 'Failed to create request');\n this.loading.set(false);\n }\n });\n }\n }\n\n cancel(): void {\n this.router.navigate(['/control-panel/bonafide']);\n }\n}\n\n","<!-- Bonafide Request Form with Shared Wrapper -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'bonafide_request' }\">\n <div class=\"tw-w-full tw-h-full\">\n @if (initializing()) {\n <!-- Loading State -->\n <div class=\"tw-w-full tw-h-full tw-flex tw-items-center tw-justify-center\">\n <div class=\"tw-text-center\">\n <div class=\"tw-text-gray-600 tw-mb-2\">Loading student information...</div>\n <div class=\"tw-text-sm tw-text-gray-500\">Please wait</div>\n </div>\n </div>\n } @else {\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\" class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\"\n [class.tw-opacity-60]=\"loading()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <!-- Form Fields -->\n <div class=\"tw-space-y-6\">\n <!-- Class/Section Selector for Non-Student Users -->\n @if (showClassSectionSelector()) {\n <div class=\"tw-max-w-4xl\">\n <div class=\"tw-mb-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-700 tw-mb-2\">Select Class & Section</h3>\n <p class=\"tw-text-xs tw-text-gray-500\">Select the class and section to find the student</p>\n </div>\n <cide-lyt-program-section-selector [formGroup]=\"form\" [entityId]=\"activeEntityId()\"\n [academicYearId]=\"activeAcademicYearId()\" classProgramControlName=\"class_program_id\"\n branchControlName=\"branch_id\" termControlName=\"term_id\" sectionControlName=\"section_id\"\n [showLabels]=\"true\" [disabled]=\"loading()\">\n </cide-lyt-program-section-selector>\n </div>\n }\n <!-- Student Selection for Non-Student Users -->\n @if (showStudentSelector()) {\n <div class=\"tw-max-w-2xl\">\n <cide-ele-select label=\"Select Student\" formControlName=\"selected_student_id\" [options]=\"studentsList()\"\n [loading]=\"studentsLoading()\" placeholder=\"Select a student\" valueKey=\"value\" labelKey=\"label\"\n size=\"md\" [required]=\"true\" [disabled]=\"loading() || studentsLoading()\">\n </cide-ele-select>\n </div>\n }\n\n <!-- Purpose Field -->\n <div class=\"tw-max-w-2xl\">\n <cide-ele-input label=\"Purpose\" formControlName=\"abnr_purpose\" [required]=\"true\"\n placeholder=\"Enter purpose for bonafide certificate\" size=\"md\" [disabled]=\"loading()\">\n </cide-ele-input>\n </div>\n\n <!-- Remarks Field -->\n <div class=\"tw-max-w-2xl\">\n <cide-ele-textarea label=\"Remarks\" formControlName=\"abnr_remarks\"\n placeholder=\"Enter any additional remarks\" rows=\"4\" size=\"md\" [disabled]=\"loading()\">\n </cide-ele-textarea>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\n <div class=\"tw-flex tw-flex-col tw-gap-3\">\n <!-- Error Message -->\n <div class=\"tw-w-full\">\n <cide-form-field-error [formGroup]=\"form\"></cide-form-field-error>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancel()\" [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"!form.valid || loading()\"\n [loading]=\"loading()\" leftIcon=\"save\">\n Submit Request\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n }\n </div>\n</cide-lyt-shared-wrapper>"],"names":[],"mappings":"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"}