cloud-ide-academics 0.0.52 → 0.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/cloud-ide-academics-bonafide-request-detail.component-BRG6AkHZ.mjs +216 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-detail.component-BRG6AkHZ.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-form.component-CM3ISuhU.mjs +317 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-form.component-CM3ISuhU.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-list.component-DKYKgplL.mjs +346 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-list.component-DKYKgplL.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-bonafide.service-B_HDaTmS.mjs → cloud-ide-academics-bonafide.service-DB6ySuGe.mjs} +34 -1
- package/fesm2022/{cloud-ide-academics-bonafide.service-B_HDaTmS.mjs.map → cloud-ide-academics-bonafide.service-DB6ySuGe.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-class-program-term-create.component-CVatJk3N.mjs → cloud-ide-academics-class-program-term-create.component-1IuTrJUo.mjs} +6 -3
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-1IuTrJUo.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-class-program-term-list.component-C8HKn3DL.mjs → cloud-ide-academics-class-program-term-list.component-C1JWoKus.mjs} +5 -3
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-C1JWoKus.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-cloud-ide-academics-DbVZGw49.mjs → cloud-ide-academics-cloud-ide-academics-Dd-B1hBe.mjs} +36 -17
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-Dd-B1hBe.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-create.component-BVsXpSzg.mjs → cloud-ide-academics-program-class-create.component-DT_-sBiQ.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-program-class-create.component-BVsXpSzg.mjs.map → cloud-ide-academics-program-class-create.component-DT_-sBiQ.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-program-class-list.component-DAZeLVtC.mjs → cloud-ide-academics-program-class-list.component-CaVWRJfR.mjs} +3 -2
- package/fesm2022/cloud-ide-academics-program-class-list.component-CaVWRJfR.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/cloud-ide-academics-bonafide-request-form.component-DoW_oswM.mjs +0 -114
- package/fesm2022/cloud-ide-academics-bonafide-request-form.component-DoW_oswM.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-bonafide-request-list.component-CsFlYVci.mjs +0 -121
- package/fesm2022/cloud-ide-academics-bonafide-request-list.component-CsFlYVci.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-CVatJk3N.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-C8HKn3DL.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-DbVZGw49.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-class-list.component-DAZeLVtC.mjs.map +0 -1
|
@@ -0,0 +1,216 @@
|
|
|
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 { NotificationService, CideEleButtonComponent, CideIconComponent } from 'cloud-ide-element';
|
|
8
|
+
import { RightsService, CideLytSharedService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
|
|
9
|
+
import { C as CideAcademicsBonafideService } from './cloud-ide-academics-bonafide.service-DB6ySuGe.mjs';
|
|
10
|
+
import { generateObjectFromString } from 'cloud-ide-lms-model';
|
|
11
|
+
|
|
12
|
+
class CideAcademicsBonafideRequestDetailComponent {
|
|
13
|
+
destroyRef = inject(DestroyRef);
|
|
14
|
+
bonafideService = inject(CideAcademicsBonafideService);
|
|
15
|
+
router = inject(Router);
|
|
16
|
+
route = inject(ActivatedRoute);
|
|
17
|
+
rightsService = inject(RightsService);
|
|
18
|
+
sharedService = inject(CideLytSharedService);
|
|
19
|
+
notificationService = inject(NotificationService);
|
|
20
|
+
request = signal(null, ...(ngDevMode ? [{ debugName: "request" }] : []));
|
|
21
|
+
history = signal([], ...(ngDevMode ? [{ debugName: "history" }] : []));
|
|
22
|
+
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
23
|
+
loadingHistory = signal(false, ...(ngDevMode ? [{ debugName: "loadingHistory" }] : []));
|
|
24
|
+
error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
25
|
+
// Page config
|
|
26
|
+
pageTitle = signal('', ...(ngDevMode ? [{ debugName: "pageTitle" }] : []));
|
|
27
|
+
pageSubtitle = signal('', ...(ngDevMode ? [{ debugName: "pageSubtitle" }] : []));
|
|
28
|
+
pageCode = signal('academics_bonafide_detail', ...(ngDevMode ? [{ debugName: "pageCode" }] : []));
|
|
29
|
+
canView = computed(() => this.rightsService.hasRight('VIEW'), ...(ngDevMode ? [{ debugName: "canView" }] : []));
|
|
30
|
+
canDownload = computed(() => this.rightsService.hasRight('DOWNLOAD'), ...(ngDevMode ? [{ debugName: "canDownload" }] : []));
|
|
31
|
+
hasSoftCopy = computed(() => {
|
|
32
|
+
const req = this.request();
|
|
33
|
+
return !!(req?.abnr_soft_copy_id_cyfm);
|
|
34
|
+
}, ...(ngDevMode ? [{ debugName: "hasSoftCopy" }] : []));
|
|
35
|
+
hasStampedCopy = computed(() => {
|
|
36
|
+
const req = this.request();
|
|
37
|
+
return !!(req?.abnr_stamped_copy_id_cyfm);
|
|
38
|
+
}, ...(ngDevMode ? [{ debugName: "hasStampedCopy" }] : []));
|
|
39
|
+
constructor() {
|
|
40
|
+
// Watch for page data changes
|
|
41
|
+
effect(() => {
|
|
42
|
+
const currentPageCode = this.pageCode();
|
|
43
|
+
if (!currentPageCode)
|
|
44
|
+
return;
|
|
45
|
+
const pageDataCache = this.sharedService.pageDataStore();
|
|
46
|
+
const cachedData = pageDataCache[currentPageCode];
|
|
47
|
+
const page = cachedData?.data?.page;
|
|
48
|
+
if (page) {
|
|
49
|
+
const cfgString = page?.sypg_configuration;
|
|
50
|
+
if (cfgString) {
|
|
51
|
+
try {
|
|
52
|
+
const cfg = JSON.parse(cfgString);
|
|
53
|
+
this.pageTitle.set(cfg.title || page?.sypg_title || '');
|
|
54
|
+
this.pageSubtitle.set(cfg.subTitle || page?.sypg_desc || '');
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
console.warn('Invalid page config JSON', e);
|
|
58
|
+
this.pageTitle.set(page?.sypg_title || '');
|
|
59
|
+
this.pageSubtitle.set(page?.sypg_desc || '');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.pageTitle.set(page?.sypg_title || '');
|
|
64
|
+
this.pageSubtitle.set(page?.sypg_desc || '');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
ngOnInit() {
|
|
70
|
+
// Initialize rights
|
|
71
|
+
this.rightsService.initializeRights('academics_bonafide_detail');
|
|
72
|
+
// Get request ID from route
|
|
73
|
+
this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
|
|
74
|
+
const query = params['query'];
|
|
75
|
+
if (query) {
|
|
76
|
+
const queryObj = generateObjectFromString(query);
|
|
77
|
+
const requestId = queryObj.abnr_id || queryObj._id;
|
|
78
|
+
if (requestId) {
|
|
79
|
+
this.loadRequest(requestId);
|
|
80
|
+
this.loadHistory(requestId);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.error.set('Request ID not found in route');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
loadRequest(requestId) {
|
|
89
|
+
this.loading.set(true);
|
|
90
|
+
this.error.set(null);
|
|
91
|
+
this.bonafideService.getRequestById(requestId)
|
|
92
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
93
|
+
.subscribe({
|
|
94
|
+
next: (response) => {
|
|
95
|
+
if (response.success) {
|
|
96
|
+
this.request.set(response.data);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.error.set(response.message || 'Failed to load request');
|
|
100
|
+
}
|
|
101
|
+
this.loading.set(false);
|
|
102
|
+
},
|
|
103
|
+
error: (err) => {
|
|
104
|
+
console.error('Error loading request:', err);
|
|
105
|
+
this.error.set(err.message || 'Failed to load request');
|
|
106
|
+
this.loading.set(false);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
loadHistory(requestId) {
|
|
111
|
+
this.loadingHistory.set(true);
|
|
112
|
+
this.bonafideService.getHistory(requestId)
|
|
113
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
114
|
+
.subscribe({
|
|
115
|
+
next: (response) => {
|
|
116
|
+
if (response.success) {
|
|
117
|
+
this.history.set(Array.isArray(response.data) ? response.data : []);
|
|
118
|
+
}
|
|
119
|
+
this.loadingHistory.set(false);
|
|
120
|
+
},
|
|
121
|
+
error: (err) => {
|
|
122
|
+
console.error('Error loading history:', err);
|
|
123
|
+
this.history.set([]);
|
|
124
|
+
this.loadingHistory.set(false);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
getStatusText() {
|
|
129
|
+
const req = this.request();
|
|
130
|
+
if (!req)
|
|
131
|
+
return 'N/A';
|
|
132
|
+
const status = req.abnr_status_id_sygms;
|
|
133
|
+
if (!status)
|
|
134
|
+
return 'N/A';
|
|
135
|
+
if (typeof status === 'string')
|
|
136
|
+
return status;
|
|
137
|
+
return status.sygms_title || status.sygms_code || 'N/A';
|
|
138
|
+
}
|
|
139
|
+
getStatusBadgeClass() {
|
|
140
|
+
const statusText = this.getStatusText().toUpperCase();
|
|
141
|
+
if (statusText.includes('PENDING')) {
|
|
142
|
+
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';
|
|
143
|
+
}
|
|
144
|
+
else if (statusText.includes('REVIEW')) {
|
|
145
|
+
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';
|
|
146
|
+
}
|
|
147
|
+
else if (statusText.includes('APPROVED')) {
|
|
148
|
+
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';
|
|
149
|
+
}
|
|
150
|
+
else if (statusText.includes('COMPLETED')) {
|
|
151
|
+
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';
|
|
152
|
+
}
|
|
153
|
+
else if (statusText.includes('REJECTED')) {
|
|
154
|
+
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';
|
|
155
|
+
}
|
|
156
|
+
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';
|
|
157
|
+
}
|
|
158
|
+
getStudentName() {
|
|
159
|
+
const req = this.request();
|
|
160
|
+
if (!req)
|
|
161
|
+
return 'N/A';
|
|
162
|
+
const student = req.abnr_student_id_auth;
|
|
163
|
+
if (!student)
|
|
164
|
+
return 'N/A';
|
|
165
|
+
if (typeof student === 'string')
|
|
166
|
+
return student;
|
|
167
|
+
return student.user_fullname || student.user_username || 'N/A';
|
|
168
|
+
}
|
|
169
|
+
downloadCertificate(fileType) {
|
|
170
|
+
const req = this.request();
|
|
171
|
+
if (!req || !req._id) {
|
|
172
|
+
this.notificationService.error('Request ID not found');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
this.bonafideService.downloadCertificate(req._id, fileType);
|
|
177
|
+
this.notificationService.success(`Downloading ${fileType === 'soft-copy' ? 'soft copy' : 'stamped copy'}...`);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.error('Error downloading certificate:', error);
|
|
181
|
+
this.notificationService.error('Failed to download certificate');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
viewCertificate() {
|
|
185
|
+
const req = this.request();
|
|
186
|
+
if (!req || !req._id) {
|
|
187
|
+
this.notificationService.error('Request ID not found');
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (!this.hasSoftCopy()) {
|
|
191
|
+
this.notificationService.error('Soft copy not available');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Open in new window for viewing/printing
|
|
195
|
+
const url = this.bonafideService.getDownloadUrl(req._id, 'soft-copy');
|
|
196
|
+
window.open(url, '_blank');
|
|
197
|
+
}
|
|
198
|
+
goBack() {
|
|
199
|
+
this.router.navigate(['/control-panel/bonafide']);
|
|
200
|
+
}
|
|
201
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAcademicsBonafideRequestDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
202
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", 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: 'academics_bonafide_detail' }\">\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 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 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 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 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 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 @if (req.abnr_student_id) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student ID</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id }}</p>\r\n </div>\r\n }\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 <!-- File Downloads Card -->\r\n @if (canDownload() && (hasSoftCopy() || hasStampedCopy())) {\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-green-500\">download</cide-ele-icon>\r\n Certificate Downloads\r\n </h3>\r\n <div class=\"tw-space-y-3\">\r\n @if (hasSoftCopy()) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-bg-gray-50 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">description</cide-ele-icon>\r\n <div>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">Soft Copy Certificate</p>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Generated certificate (HTML/PDF)</p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" leftIcon=\"visibility\" (click)=\"viewCertificate()\">\r\n View\r\n </button>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"download\" (click)=\"downloadCertificate('soft-copy')\">\r\n Download\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-bg-gray-50 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-green-500\">stamp</cide-ele-icon>\r\n <div>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">Stamped Copy</p>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Physical stamped certificate scan</p>\r\n </div>\r\n </div>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"download\" (click)=\"downloadCertificate('stamped-copy')\">\r\n Download\r\n </button>\r\n </div>\r\n }\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 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.action_type || 'Action' }}</p>\r\n @if (item.action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.comments }}</p>\r\n }\r\n @if (item.action_by) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.action_by }}</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>\r\n", 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: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
203
|
+
}
|
|
204
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAcademicsBonafideRequestDetailComponent, decorators: [{
|
|
205
|
+
type: Component,
|
|
206
|
+
args: [{ selector: 'cide-academics-bonafide-request-detail', standalone: true, imports: [
|
|
207
|
+
CommonModule,
|
|
208
|
+
DatePipe,
|
|
209
|
+
CideEleButtonComponent,
|
|
210
|
+
CideIconComponent,
|
|
211
|
+
CideLytSharedWrapperComponent
|
|
212
|
+
], template: "<!-- Bonafide Request Detail with Shared Wrapper -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'academics_bonafide_detail' }\">\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 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 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 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 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 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 @if (req.abnr_student_id) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student ID</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id }}</p>\r\n </div>\r\n }\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 <!-- File Downloads Card -->\r\n @if (canDownload() && (hasSoftCopy() || hasStampedCopy())) {\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-green-500\">download</cide-ele-icon>\r\n Certificate Downloads\r\n </h3>\r\n <div class=\"tw-space-y-3\">\r\n @if (hasSoftCopy()) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-bg-gray-50 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">description</cide-ele-icon>\r\n <div>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">Soft Copy Certificate</p>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Generated certificate (HTML/PDF)</p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" leftIcon=\"visibility\" (click)=\"viewCertificate()\">\r\n View\r\n </button>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"download\" (click)=\"downloadCertificate('soft-copy')\">\r\n Download\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-bg-gray-50 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-green-500\">stamp</cide-ele-icon>\r\n <div>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">Stamped Copy</p>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Physical stamped certificate scan</p>\r\n </div>\r\n </div>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"download\" (click)=\"downloadCertificate('stamped-copy')\">\r\n Download\r\n </button>\r\n </div>\r\n }\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 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.action_type || 'Action' }}</p>\r\n @if (item.action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.comments }}</p>\r\n }\r\n @if (item.action_by) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.action_by }}</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>\r\n", styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"] }]
|
|
213
|
+
}], ctorParameters: () => [] });
|
|
214
|
+
|
|
215
|
+
export { CideAcademicsBonafideRequestDetailComponent };
|
|
216
|
+
//# sourceMappingURL=cloud-ide-academics-bonafide-request-detail.component-BRG6AkHZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-ide-academics-bonafide-request-detail.component-BRG6AkHZ.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 { CideEleButtonComponent, CideIconComponent, NotificationService } from 'cloud-ide-element';\r\nimport { RightsService, CideLytSharedService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';\r\nimport { CideAcademicsBonafideService } 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 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\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 // Page config\r\n pageTitle = signal<string>('');\r\n pageSubtitle = signal<string>('');\r\n pageCode = signal<string>('academics_bonafide_detail');\r\n \r\n canView = computed(() => this.rightsService.hasRight('VIEW'));\r\n canDownload = computed(() => this.rightsService.hasRight('DOWNLOAD'));\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 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('academics_bonafide_detail');\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 loadRequest(requestId: string): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.bonafideService.getRequestById(requestId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.request.set(response.data);\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) => {\r\n console.error('Error loading request:', err);\r\n this.error.set(err.message || '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('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 downloadCertificate(fileType: 'soft-copy' | 'stamped-copy'): void {\r\n const req = this.request();\r\n if (!req || !req._id) {\r\n this.notificationService.error('Request ID not found');\r\n return;\r\n }\r\n\r\n try {\r\n this.bonafideService.downloadCertificate(req._id, fileType);\r\n this.notificationService.success(`Downloading ${fileType === 'soft-copy' ? 'soft copy' : 'stamped copy'}...`);\r\n } catch (error: any) {\r\n console.error('Error downloading certificate:', error);\r\n this.notificationService.error('Failed to download certificate');\r\n }\r\n }\r\n\r\n viewCertificate(): void {\r\n const req = this.request();\r\n if (!req || !req._id) {\r\n this.notificationService.error('Request ID not found');\r\n return;\r\n }\r\n\r\n if (!this.hasSoftCopy()) {\r\n this.notificationService.error('Soft copy not available');\r\n return;\r\n }\r\n\r\n // Open in new window for viewing/printing\r\n const url = this.bonafideService.getDownloadUrl(req._id, 'soft-copy');\r\n window.open(url, '_blank');\r\n }\r\n\r\n goBack(): void {\r\n this.router.navigate(['/control-panel/bonafide']);\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: 'academics_bonafide_detail' }\">\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 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 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 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 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 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 @if (req.abnr_student_id) {\r\n <div>\r\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wide\">Student ID</label>\r\n <p class=\"tw-text-sm tw-text-gray-900 tw-mt-1\">{{ req.abnr_student_id }}</p>\r\n </div>\r\n }\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 <!-- File Downloads Card -->\r\n @if (canDownload() && (hasSoftCopy() || hasStampedCopy())) {\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-green-500\">download</cide-ele-icon>\r\n Certificate Downloads\r\n </h3>\r\n <div class=\"tw-space-y-3\">\r\n @if (hasSoftCopy()) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-bg-gray-50 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-500\">description</cide-ele-icon>\r\n <div>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">Soft Copy Certificate</p>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Generated certificate (HTML/PDF)</p>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" leftIcon=\"visibility\" (click)=\"viewCertificate()\">\r\n View\r\n </button>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"download\" (click)=\"downloadCertificate('soft-copy')\">\r\n Download\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n @if (hasStampedCopy()) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-bg-gray-50 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-green-500\">stamp</cide-ele-icon>\r\n <div>\r\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900\">Stamped Copy</p>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Physical stamped certificate scan</p>\r\n </div>\r\n </div>\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"download\" (click)=\"downloadCertificate('stamped-copy')\">\r\n Download\r\n </button>\r\n </div>\r\n }\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 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.action_type || 'Action' }}</p>\r\n @if (item.action_date) {\r\n <p class=\"tw-text-xs tw-text-gray-500\">{{ item.action_date | date:'MMM dd, yyyy HH:mm' }}</p>\r\n }\r\n </div>\r\n @if (item.comments) {\r\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ item.comments }}</p>\r\n }\r\n @if (item.action_by) {\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">By: {{ item.action_by }}</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>\r\n"],"names":[],"mappings":"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"}
|