cloud-ide-academics 0.0.71 → 0.0.72

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 (27) hide show
  1. package/fesm2022/cloud-ide-academics-bonafide-request-detail.component-DCSrOjrf.mjs +340 -0
  2. package/fesm2022/cloud-ide-academics-bonafide-request-detail.component-DCSrOjrf.mjs.map +1 -0
  3. package/fesm2022/{cloud-ide-academics-bonafide-request-form.component-h0ouDPrh.mjs → cloud-ide-academics-bonafide-request-form.component-Ct9iMl4R.mjs} +3 -3
  4. package/fesm2022/{cloud-ide-academics-bonafide-request-form.component-h0ouDPrh.mjs.map → cloud-ide-academics-bonafide-request-form.component-Ct9iMl4R.mjs.map} +1 -1
  5. package/fesm2022/{cloud-ide-academics-bonafide-request-list.component-Bi6IfukP.mjs → cloud-ide-academics-bonafide-request-list.component-5Iwo1iDT.mjs} +19 -29
  6. package/fesm2022/cloud-ide-academics-bonafide-request-list.component-5Iwo1iDT.mjs.map +1 -0
  7. package/fesm2022/{cloud-ide-academics-bonafide.service-CHPe3MPl.mjs → cloud-ide-academics-bonafide.service-Cv-d0CvI.mjs} +40 -27
  8. package/fesm2022/cloud-ide-academics-bonafide.service-Cv-d0CvI.mjs.map +1 -0
  9. package/fesm2022/{cloud-ide-academics-class-program-term-create.component-CjslX7EN.mjs → cloud-ide-academics-class-program-term-create.component-Cr_W1iqG.mjs} +2 -2
  10. package/fesm2022/{cloud-ide-academics-class-program-term-create.component-CjslX7EN.mjs.map → cloud-ide-academics-class-program-term-create.component-Cr_W1iqG.mjs.map} +1 -1
  11. package/fesm2022/{cloud-ide-academics-class-program-term-list.component-BPXO361E.mjs → cloud-ide-academics-class-program-term-list.component-B0cw_JOl.mjs} +2 -2
  12. package/fesm2022/cloud-ide-academics-class-program-term-list.component-B0cw_JOl.mjs.map +1 -0
  13. package/fesm2022/{cloud-ide-academics-cloud-ide-academics-CgiTn_ib.mjs → cloud-ide-academics-cloud-ide-academics-ABeAQSyX.mjs} +14 -14
  14. package/fesm2022/cloud-ide-academics-cloud-ide-academics-ABeAQSyX.mjs.map +1 -0
  15. package/fesm2022/{cloud-ide-academics-program-class-create.component-CZ5H-9h3.mjs → cloud-ide-academics-program-class-create.component-7SfnMr9q.mjs} +2 -2
  16. package/fesm2022/{cloud-ide-academics-program-class-create.component-CZ5H-9h3.mjs.map → cloud-ide-academics-program-class-create.component-7SfnMr9q.mjs.map} +1 -1
  17. package/fesm2022/{cloud-ide-academics-program-class-list.component-D4nciT1P.mjs → cloud-ide-academics-program-class-list.component-CZ3bMFTD.mjs} +2 -2
  18. package/fesm2022/cloud-ide-academics-program-class-list.component-CZ3bMFTD.mjs.map +1 -0
  19. package/fesm2022/cloud-ide-academics.mjs +1 -1
  20. package/package.json +1 -1
  21. package/fesm2022/cloud-ide-academics-bonafide-request-detail.component-BntVISFj.mjs +0 -216
  22. package/fesm2022/cloud-ide-academics-bonafide-request-detail.component-BntVISFj.mjs.map +0 -1
  23. package/fesm2022/cloud-ide-academics-bonafide-request-list.component-Bi6IfukP.mjs.map +0 -1
  24. package/fesm2022/cloud-ide-academics-bonafide.service-CHPe3MPl.mjs.map +0 -1
  25. package/fesm2022/cloud-ide-academics-class-program-term-list.component-BPXO361E.mjs.map +0 -1
  26. package/fesm2022/cloud-ide-academics-cloud-ide-academics-CgiTn_ib.mjs.map +0 -1
  27. package/fesm2022/cloud-ide-academics-program-class-list.component-D4nciT1P.mjs.map +0 -1
@@ -0,0 +1,340 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DestroyRef, signal, computed, effect, Component } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule, DatePipe } from '@angular/common';
5
+ import { Router, ActivatedRoute } from '@angular/router';
6
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { switchMap } from 'rxjs/operators';
8
+ import { NotificationService, CideEleButtonComponent, CideIconComponent, CideEleFileInputComponent } from 'cloud-ide-element';
9
+ import { RightsService, CideLytSharedService, AppStateService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
10
+ import { C as CideAcademicsBonafideService } from './cloud-ide-academics-bonafide.service-Cv-d0CvI.mjs';
11
+ import { generateObjectFromString } from 'cloud-ide-lms-model';
12
+
13
+ class CideAcademicsBonafideRequestDetailComponent {
14
+ destroyRef = inject(DestroyRef);
15
+ bonafideService = inject(CideAcademicsBonafideService);
16
+ router = inject(Router);
17
+ route = inject(ActivatedRoute);
18
+ rightsService = inject(RightsService);
19
+ sharedService = inject(CideLytSharedService);
20
+ notificationService = inject(NotificationService);
21
+ appStateService = inject(AppStateService);
22
+ request = signal(null, ...(ngDevMode ? [{ debugName: "request" }] : []));
23
+ history = signal([], ...(ngDevMode ? [{ debugName: "history" }] : []));
24
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
25
+ loadingHistory = signal(false, ...(ngDevMode ? [{ debugName: "loadingHistory" }] : []));
26
+ error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
27
+ // Faculty actions state
28
+ uploadedFileId = signal(null, ...(ngDevMode ? [{ debugName: "uploadedFileId" }] : []));
29
+ generatingDraft = signal(false, ...(ngDevMode ? [{ debugName: "generatingDraft" }] : []));
30
+ submittingApproval = signal(false, ...(ngDevMode ? [{ debugName: "submittingApproval" }] : []));
31
+ // Page config
32
+ pageTitle = signal('', ...(ngDevMode ? [{ debugName: "pageTitle" }] : []));
33
+ pageSubtitle = signal('', ...(ngDevMode ? [{ debugName: "pageSubtitle" }] : []));
34
+ pageCode = signal('bonafide_request', ...(ngDevMode ? [{ debugName: "pageCode" }] : []));
35
+ canView = computed(() => this.rightsService.hasRight('VIEW'), ...(ngDevMode ? [{ debugName: "canView" }] : []));
36
+ canDownload = computed(() => this.rightsService.hasRight('DOWNLOAD'), ...(ngDevMode ? [{ debugName: "canDownload" }] : []));
37
+ // Faculty check: User is NOT a student
38
+ isFaculty = computed(() => {
39
+ const user = this.appStateService.currentUser();
40
+ const userType = user?.user_type_mapping?.syutm_user_type;
41
+ return userType !== 'STUDENT';
42
+ }, ...(ngDevMode ? [{ debugName: "isFaculty" }] : []));
43
+ isPending = computed(() => {
44
+ const status = this.getStatusText().toUpperCase();
45
+ return status.includes('PENDING') || status.includes('PROGRESS');
46
+ }, ...(ngDevMode ? [{ debugName: "isPending" }] : []));
47
+ showFacultyActions = computed(() => {
48
+ return this.isFaculty() && this.isPending();
49
+ }, ...(ngDevMode ? [{ debugName: "showFacultyActions" }] : []));
50
+ hasSoftCopy = computed(() => {
51
+ const req = this.request();
52
+ return !!(req?.abnr_soft_copy_id_cyfm);
53
+ }, ...(ngDevMode ? [{ debugName: "hasSoftCopy" }] : []));
54
+ hasStampedCopy = computed(() => {
55
+ const req = this.request();
56
+ return !!(req?.abnr_stamped_copy_id_cyfm);
57
+ }, ...(ngDevMode ? [{ debugName: "hasStampedCopy" }] : []));
58
+ // Certificate purpose (editable by faculty)
59
+ certificatePurpose = signal('', ...(ngDevMode ? [{ debugName: "certificatePurpose" }] : []));
60
+ constructor() {
61
+ // Watch for page data changes
62
+ effect(() => {
63
+ const currentPageCode = this.pageCode();
64
+ if (!currentPageCode)
65
+ return;
66
+ const pageDataCache = this.sharedService.pageDataStore();
67
+ const cachedData = pageDataCache[currentPageCode];
68
+ const page = cachedData?.data?.page;
69
+ if (page) {
70
+ const cfgString = page?.sypg_configuration;
71
+ if (cfgString) {
72
+ try {
73
+ const cfg = JSON.parse(cfgString);
74
+ this.pageTitle.set(cfg.title || page?.sypg_title || '');
75
+ this.pageSubtitle.set(cfg.subTitle || page?.sypg_desc || '');
76
+ }
77
+ catch (e) {
78
+ console.warn('Invalid page config JSON', e);
79
+ this.pageTitle.set(page?.sypg_title || '');
80
+ this.pageSubtitle.set(page?.sypg_desc || '');
81
+ }
82
+ }
83
+ else {
84
+ this.pageTitle.set(page?.sypg_title || '');
85
+ this.pageSubtitle.set(page?.sypg_desc || '');
86
+ }
87
+ }
88
+ });
89
+ }
90
+ ngOnInit() {
91
+ // Initialize rights
92
+ this.rightsService.initializeRights('bonafide_request');
93
+ // Get request ID from route
94
+ this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
95
+ const query = params['query'];
96
+ if (query) {
97
+ const queryObj = generateObjectFromString(query);
98
+ const requestId = queryObj.abnr_id || queryObj._id;
99
+ if (requestId) {
100
+ this.loadRequest(requestId);
101
+ this.loadHistory(requestId);
102
+ }
103
+ else {
104
+ this.error.set('Request ID not found in route');
105
+ }
106
+ }
107
+ });
108
+ }
109
+ loadRequest(requestId) {
110
+ this.loading.set(true);
111
+ this.bonafideService.getRequestById(requestId)
112
+ .pipe(takeUntilDestroyed(this.destroyRef))
113
+ .subscribe({
114
+ next: (response) => {
115
+ if (response.success && response.data) {
116
+ this.request.set(response.data);
117
+ // Initialize certificate purpose with existing value or original purpose
118
+ this.certificatePurpose.set(response.data.abnr_certificate_purpose || response.data.abnr_purpose || '');
119
+ }
120
+ else {
121
+ this.error.set(response.message || 'Failed to load request');
122
+ }
123
+ this.loading.set(false);
124
+ },
125
+ error: (err) => {
126
+ this.error.set('Failed to load request');
127
+ this.loading.set(false);
128
+ }
129
+ });
130
+ }
131
+ loadHistory(requestId) {
132
+ this.loadingHistory.set(true);
133
+ this.bonafideService.getHistory(requestId)
134
+ .pipe(takeUntilDestroyed(this.destroyRef))
135
+ .subscribe({
136
+ next: (response) => {
137
+ if (response.success) {
138
+ this.history.set(Array.isArray(response.data) ? response.data : []);
139
+ }
140
+ this.loadingHistory.set(false);
141
+ },
142
+ error: (err) => {
143
+ console.error('Error loading history:', err);
144
+ this.history.set([]);
145
+ this.loadingHistory.set(false);
146
+ }
147
+ });
148
+ }
149
+ getStatusText() {
150
+ const req = this.request();
151
+ if (!req)
152
+ return 'N/A';
153
+ const status = req.abnr_status_id_sygms;
154
+ if (!status)
155
+ return 'N/A';
156
+ if (typeof status === 'string')
157
+ return status;
158
+ return status.sygms_title || status.sygms_code || 'N/A';
159
+ }
160
+ getStatusBadgeClass() {
161
+ const statusText = this.getStatusText().toUpperCase();
162
+ if (statusText.includes('PENDING')) {
163
+ 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';
164
+ }
165
+ else if (statusText.includes('PROGRESS') || statusText.includes('REVIEW')) {
166
+ 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';
167
+ }
168
+ else if (statusText.includes('APPROVED')) {
169
+ 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';
170
+ }
171
+ else if (statusText.includes('COMPLETED')) {
172
+ 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';
173
+ }
174
+ else if (statusText.includes('REJECTED')) {
175
+ 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';
176
+ }
177
+ 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';
178
+ }
179
+ getStudentName() {
180
+ const req = this.request();
181
+ if (!req)
182
+ return 'N/A';
183
+ const student = req.abnr_student_id_auth;
184
+ if (!student)
185
+ return 'N/A';
186
+ if (typeof student === 'string')
187
+ return student;
188
+ return student.user_fullname || student.user_username || 'N/A';
189
+ }
190
+ // Generate and print certificate (following receipt pattern)
191
+ generateAndDownloadDraft() {
192
+ const req = this.request();
193
+ const user = this.appStateService.currentUser();
194
+ if (!req || !req._id || !user?._id) {
195
+ this.notificationService.error('Missing required information');
196
+ return;
197
+ }
198
+ // Validate certificate purpose
199
+ if (!this.certificatePurpose().trim()) {
200
+ this.notificationService.error('Certificate purpose is required');
201
+ return;
202
+ }
203
+ this.generatingDraft.set(true);
204
+ this.notificationService.info('Saving purpose and generating certificate...');
205
+ console.log('Starting certificate generation process...');
206
+ console.log('Request ID:', req._id);
207
+ console.log('User ID:', user._id);
208
+ console.log('Certificate Purpose:', this.certificatePurpose());
209
+ // First, save the certificate purpose
210
+ this.bonafideService.updateCertificatePurpose(req._id, this.certificatePurpose())
211
+ .pipe(takeUntilDestroyed(this.destroyRef),
212
+ // Then generate certificate
213
+ switchMap((updateResponse) => {
214
+ console.log('Update purpose response:', updateResponse);
215
+ if (!updateResponse.success) {
216
+ throw new Error(updateResponse.message || 'Failed to update purpose');
217
+ }
218
+ return this.bonafideService.generateCertificate(req._id, user._id);
219
+ }))
220
+ .subscribe({
221
+ next: (response) => {
222
+ console.log('Generate certificate response:', response);
223
+ if (response.success) {
224
+ const html = response.data?.certificateHtml || response.data?.html;
225
+ if (html) {
226
+ this.printHtml(html);
227
+ this.notificationService.success('Certificate generated successfully');
228
+ }
229
+ else {
230
+ this.notificationService.error('Certificate HTML not available');
231
+ }
232
+ }
233
+ else {
234
+ this.notificationService.error(response.message || 'Failed to generate certificate');
235
+ }
236
+ this.generatingDraft.set(false);
237
+ },
238
+ error: (err) => {
239
+ console.error('Error generating certificate:', err);
240
+ const errorMessage = err?.error?.message || err.message || 'Failed to generate certificate';
241
+ this.notificationService.error(errorMessage);
242
+ this.generatingDraft.set(false);
243
+ }
244
+ });
245
+ }
246
+ printHtml(html) {
247
+ const printWindow = window.open('', '_blank');
248
+ if (printWindow) {
249
+ printWindow.document.write(html);
250
+ printWindow.document.close();
251
+ printWindow.focus();
252
+ setTimeout(() => {
253
+ printWindow.print();
254
+ }, 500);
255
+ }
256
+ else {
257
+ this.notificationService.error('Failed to open print window. Please allow popups.');
258
+ }
259
+ }
260
+ onFileUploaded(fileId) {
261
+ console.log('File uploaded, received ID:', fileId);
262
+ this.uploadedFileId.set(fileId);
263
+ console.log('uploadedFileId signal set to:', this.uploadedFileId());
264
+ }
265
+ onUploadStampedCopy() {
266
+ const req = this.request();
267
+ const fileId = this.uploadedFileId();
268
+ const user = this.appStateService.currentUser();
269
+ if (!req || !req._id || !fileId || !user) {
270
+ this.notificationService.error('Missing information');
271
+ return;
272
+ }
273
+ this.submittingApproval.set(true);
274
+ this.bonafideService.uploadStampedCopy(req._id, {
275
+ stampedCopyFileId: fileId,
276
+ uploadedBy: user._id
277
+ })
278
+ .pipe(takeUntilDestroyed(this.destroyRef))
279
+ .subscribe({
280
+ next: (response) => {
281
+ if (response.success) {
282
+ this.notificationService.success('Request approved and stamped copy uploaded');
283
+ this.loadRequest(req._id); // Refresh
284
+ this.uploadedFileId.set(null); // Reset
285
+ this.loadHistory(req._id); // Refresh history
286
+ }
287
+ else {
288
+ this.notificationService.error(response.message || 'Failed to approve');
289
+ }
290
+ this.submittingApproval.set(false);
291
+ },
292
+ error: (err) => {
293
+ this.notificationService.error(err.message || 'Failed to approve');
294
+ this.submittingApproval.set(false);
295
+ }
296
+ });
297
+ }
298
+ downloadCertificate() {
299
+ const req = this.request();
300
+ if (!req || !req._id)
301
+ return;
302
+ this.bonafideService.downloadCertificateAsBlob(req._id, 'stamped-copy')
303
+ .pipe(takeUntilDestroyed(this.destroyRef))
304
+ .subscribe({
305
+ next: (blob) => {
306
+ const url = window.URL.createObjectURL(blob);
307
+ const a = document.createElement('a');
308
+ a.href = url;
309
+ a.download = `Bonafide_Certificate_${req.abnr_request_number || 'stamped'}.pdf`;
310
+ document.body.appendChild(a);
311
+ a.click();
312
+ window.URL.revokeObjectURL(url);
313
+ document.body.removeChild(a);
314
+ },
315
+ error: (err) => {
316
+ console.error('Download failed:', err);
317
+ this.notificationService.error('Failed to download certificate');
318
+ }
319
+ });
320
+ }
321
+ goBack() {
322
+ this.router.navigate(['/control-panel/bonafide']);
323
+ }
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"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { 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
+ }
327
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAcademicsBonafideRequestDetailComponent, decorators: [{
328
+ type: Component,
329
+ args: [{ selector: 'cide-academics-bonafide-request-detail', standalone: true, imports: [
330
+ CommonModule,
331
+ DatePipe,
332
+ CideEleButtonComponent,
333
+ CideIconComponent,
334
+ CideEleFileInputComponent,
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"] }]
337
+ }], ctorParameters: () => [] });
338
+
339
+ export { CideAcademicsBonafideRequestDetailComponent };
340
+ //# sourceMappingURL=cloud-ide-academics-bonafide-request-detail.component-DCSrOjrf.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-academics-bonafide-request-detail.component-DCSrOjrf.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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"}
@@ -8,8 +8,8 @@ import { HttpClient } from '@angular/common/http';
8
8
  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
- import { C as CideAcademicsBonafideService } from './cloud-ide-academics-bonafide.service-CHPe3MPl.mjs';
12
- import { e as CideLytProgramSectionSelectorComponent } from './cloud-ide-academics-cloud-ide-academics-CgiTn_ib.mjs';
11
+ import { C as CideAcademicsBonafideService } from './cloud-ide-academics-bonafide.service-Cv-d0CvI.mjs';
12
+ import { e as CideLytProgramSectionSelectorComponent } from './cloud-ide-academics-cloud-ide-academics-ABeAQSyX.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-h0ouDPrh.mjs.map
328
+ //# sourceMappingURL=cloud-ide-academics-bonafide-request-form.component-Ct9iMl4R.mjs.map