cloud-ide-academics 0.0.21 → 0.0.23
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-class-program-term-create.component--_32xUHz.mjs → cloud-ide-academics-class-program-term-create.component-CD-JRaOo.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-class-program-term-create.component--_32xUHz.mjs.map → cloud-ide-academics-class-program-term-create.component-CD-JRaOo.mjs.map} +1 -1
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-Bp-jTkgq.mjs +551 -0
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-Bp-jTkgq.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-cloud-ide-academics-COFzfbQg.mjs → cloud-ide-academics-cloud-ide-academics-DfUIvaVH.mjs} +15 -15
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-DfUIvaVH.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-create.component-DZGdqzE7.mjs → cloud-ide-academics-program-class-create.component-BPgeglM_.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-program-class-create.component-DZGdqzE7.mjs.map → cloud-ide-academics-program-class-create.component-BPgeglM_.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-program-class-list.component-DPUjW-UV.mjs → cloud-ide-academics-program-class-list.component-x8jYxy7J.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-program-class-list.component-DPUjW-UV.mjs.map → cloud-ide-academics-program-class-list.component-x8jYxy7J.mjs.map} +1 -1
- package/fesm2022/cloud-ide-academics.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-CaWAHMHN.mjs +0 -404
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-CaWAHMHN.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-COFzfbQg.mjs.map +0 -1
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, DestroyRef, viewChild, computed, signal, Component } from '@angular/core';
|
|
3
|
-
import * as i1 from '@angular/common';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { Router, ActivatedRoute } from '@angular/router';
|
|
6
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
7
|
-
import { NotificationService, ConfirmationService, CideEleDataGridComponent, CideIconComponent, CideEleButtonComponent, CideEleDropdownComponent } from 'cloud-ide-element';
|
|
8
|
-
import { AppStateHelperService } from 'cloud-ide-layout';
|
|
9
|
-
import { generateObjectFromString } from 'cloud-ide-lms-model';
|
|
10
|
-
import { C as CideLytClassProgramTermService } from './cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs';
|
|
11
|
-
|
|
12
|
-
class ClassProgramTermListComponent {
|
|
13
|
-
// Dependency injection
|
|
14
|
-
destroyRef = inject(DestroyRef);
|
|
15
|
-
router = inject(Router);
|
|
16
|
-
route = inject(ActivatedRoute);
|
|
17
|
-
appState = inject(AppStateHelperService);
|
|
18
|
-
notificationService = inject(NotificationService);
|
|
19
|
-
confirmationService = inject(ConfirmationService);
|
|
20
|
-
classProgramTermService = inject(CideLytClassProgramTermService);
|
|
21
|
-
// Modern ViewChild signals for template renderers (Angular 20 approach)
|
|
22
|
-
classProgramTermDetailsRendererTemplate = viewChild.required('classProgramTermDetailsRendererTemplate');
|
|
23
|
-
classProgramTermStatusRendererTemplate = viewChild.required('classProgramTermStatusRendererTemplate');
|
|
24
|
-
actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
|
|
25
|
-
// Computed template renderers for grid
|
|
26
|
-
templateRenderers = computed(() => ({
|
|
27
|
-
classProgramTermDetailsRenderer: this.classProgramTermDetailsRendererTemplate(),
|
|
28
|
-
classProgramTermStatusRenderer: this.classProgramTermStatusRendererTemplate(),
|
|
29
|
-
actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
|
|
30
|
-
}), ...(ngDevMode ? [{ debugName: "templateRenderers" }] : []));
|
|
31
|
-
// Make Math available in template
|
|
32
|
-
Math = Math;
|
|
33
|
-
// Signals for reactive state management
|
|
34
|
-
classProgramTerms = signal([], ...(ngDevMode ? [{ debugName: "classProgramTerms" }] : []));
|
|
35
|
-
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
36
|
-
error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
37
|
-
selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
|
|
38
|
-
searchTerm = signal('', ...(ngDevMode ? [{ debugName: "searchTerm" }] : []));
|
|
39
|
-
acabrnId = signal(null, ...(ngDevMode ? [{ debugName: "acabrnId" }] : []));
|
|
40
|
-
acacpmId = signal(null, ...(ngDevMode ? [{ debugName: "acacpmId" }] : []));
|
|
41
|
-
// Derived list filtered by searchTerm
|
|
42
|
-
filteredClassProgramTerms = computed(() => {
|
|
43
|
-
const q = (this.searchTerm() || '').toLowerCase().trim();
|
|
44
|
-
const items = this.classProgramTerms() || [];
|
|
45
|
-
if (!q)
|
|
46
|
-
return items;
|
|
47
|
-
return items.filter(cpt => {
|
|
48
|
-
const name = (cpt.acapt_name || '').toLowerCase();
|
|
49
|
-
const code = (cpt.acapt_code || '').toLowerCase();
|
|
50
|
-
const description = (cpt.acapt_description || '').toLowerCase();
|
|
51
|
-
return name.includes(q) || code.includes(q) || description.includes(q);
|
|
52
|
-
});
|
|
53
|
-
}, ...(ngDevMode ? [{ debugName: "filteredClassProgramTerms" }] : []));
|
|
54
|
-
// Grid configuration signal
|
|
55
|
-
gridConfig = signal({
|
|
56
|
-
id: 'class-program-term-list-grid',
|
|
57
|
-
columns: [
|
|
58
|
-
{
|
|
59
|
-
key: 'details',
|
|
60
|
-
header: 'Term Details',
|
|
61
|
-
type: 'custom',
|
|
62
|
-
width: 'auto',
|
|
63
|
-
truncate: true,
|
|
64
|
-
align: 'left',
|
|
65
|
-
renderer: 'classProgramTermDetailsRenderer'
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
key: 'acapt_code',
|
|
69
|
-
header: 'Code',
|
|
70
|
-
type: 'text',
|
|
71
|
-
width: '120px',
|
|
72
|
-
truncate: true,
|
|
73
|
-
align: 'left'
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
key: 'acapt_class_program_id_acacpm',
|
|
77
|
-
header: 'Program Class',
|
|
78
|
-
type: 'custom',
|
|
79
|
-
width: '200px',
|
|
80
|
-
truncate: true,
|
|
81
|
-
align: 'left',
|
|
82
|
-
renderer: 'programClassRenderer'
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
key: 'acapt_parent_class_prog_term_acapt',
|
|
86
|
-
header: 'Parent Term',
|
|
87
|
-
type: 'custom',
|
|
88
|
-
width: '180px',
|
|
89
|
-
truncate: true,
|
|
90
|
-
align: 'left',
|
|
91
|
-
renderer: 'parentTermRenderer'
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
key: 'acapt_isactive',
|
|
95
|
-
header: 'Status',
|
|
96
|
-
type: 'custom',
|
|
97
|
-
width: '120px',
|
|
98
|
-
truncate: false,
|
|
99
|
-
align: 'center',
|
|
100
|
-
renderer: 'classProgramTermStatusRenderer'
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
key: 'actions',
|
|
104
|
-
header: '',
|
|
105
|
-
type: 'custom',
|
|
106
|
-
width: '150px',
|
|
107
|
-
truncate: false,
|
|
108
|
-
align: 'center',
|
|
109
|
-
renderer: 'actionsDropdownRenderer'
|
|
110
|
-
}
|
|
111
|
-
],
|
|
112
|
-
data: [],
|
|
113
|
-
trackBy: '_id',
|
|
114
|
-
pagination: {
|
|
115
|
-
enabled: true,
|
|
116
|
-
pageSize: 10,
|
|
117
|
-
pageSizeOptions: [10, 25, 50, 100],
|
|
118
|
-
showQuickJump: true,
|
|
119
|
-
showPageInfo: true,
|
|
120
|
-
showRefresh: true
|
|
121
|
-
},
|
|
122
|
-
search: {
|
|
123
|
-
enabled: true,
|
|
124
|
-
placeholder: 'Search class program terms...',
|
|
125
|
-
searchableColumns: ['acapt_name', 'acapt_code', 'acapt_description'],
|
|
126
|
-
debounceMs: 300
|
|
127
|
-
},
|
|
128
|
-
loading: {
|
|
129
|
-
useDefer: true,
|
|
130
|
-
skeletonRows: 5,
|
|
131
|
-
showOverlay: false
|
|
132
|
-
},
|
|
133
|
-
scroll: {
|
|
134
|
-
enabled: true,
|
|
135
|
-
maxHeight: '',
|
|
136
|
-
minHeight: '',
|
|
137
|
-
stickyHeader: true,
|
|
138
|
-
virtualScroll: false,
|
|
139
|
-
rowHeight: 50
|
|
140
|
-
},
|
|
141
|
-
responsive: true,
|
|
142
|
-
striped: false,
|
|
143
|
-
bordered: true,
|
|
144
|
-
compact: false,
|
|
145
|
-
tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
|
|
146
|
-
}, ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
|
|
147
|
-
/**
|
|
148
|
-
* Get action dropdown items
|
|
149
|
-
*/
|
|
150
|
-
getActionDropdownItems(classProgramTerm) {
|
|
151
|
-
const items = [
|
|
152
|
-
{
|
|
153
|
-
id: 'view',
|
|
154
|
-
label: 'View Details',
|
|
155
|
-
icon: 'visibility',
|
|
156
|
-
iconColor: 'tw-text-gray-400',
|
|
157
|
-
textColor: 'tw-text-gray-700'
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
id: 'edit',
|
|
161
|
-
label: 'Edit Term',
|
|
162
|
-
icon: 'edit',
|
|
163
|
-
iconColor: 'tw-text-blue-400',
|
|
164
|
-
textColor: 'tw-text-blue-700'
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
id: 'toggleStatus',
|
|
168
|
-
label: classProgramTerm.acapt_isactive ? 'Deactivate' : 'Activate',
|
|
169
|
-
icon: classProgramTerm.acapt_isactive ? 'toggle_off' : 'toggle_on',
|
|
170
|
-
iconColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',
|
|
171
|
-
textColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-700' : 'tw-text-green-700'
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
id: 'delete',
|
|
175
|
-
label: 'Delete',
|
|
176
|
-
icon: 'delete',
|
|
177
|
-
iconColor: 'tw-text-red-400',
|
|
178
|
-
textColor: 'tw-text-red-700'
|
|
179
|
-
}
|
|
180
|
-
];
|
|
181
|
-
return items;
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Handle dropdown item click
|
|
185
|
-
*/
|
|
186
|
-
onDropdownItemClick(item, classProgramTerm) {
|
|
187
|
-
switch (item.id) {
|
|
188
|
-
case 'view':
|
|
189
|
-
this.viewClassProgramTerm(classProgramTerm);
|
|
190
|
-
break;
|
|
191
|
-
case 'edit':
|
|
192
|
-
this.editClassProgramTerm(classProgramTerm);
|
|
193
|
-
break;
|
|
194
|
-
case 'toggleStatus':
|
|
195
|
-
this.toggleClassProgramTermStatus(classProgramTerm);
|
|
196
|
-
break;
|
|
197
|
-
case 'delete':
|
|
198
|
-
this.deleteClassProgramTerm(classProgramTerm);
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
ngOnInit() {
|
|
203
|
-
this.checkRouteParams();
|
|
204
|
-
this.loadClassProgramTerms();
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Check route parameters for acabrn_id and acacpm_id
|
|
208
|
-
*/
|
|
209
|
-
checkRouteParams() {
|
|
210
|
-
this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
|
|
211
|
-
const queryParams = params['query'];
|
|
212
|
-
console.log('🏢 Route params:', params, 'queryParams:', queryParams);
|
|
213
|
-
if (queryParams) {
|
|
214
|
-
// Query parameters passed (following page-controls pattern)
|
|
215
|
-
const queryData = generateObjectFromString(queryParams);
|
|
216
|
-
console.log('🏢 Class Program Term params from route:', queryData);
|
|
217
|
-
if (queryData?.acabrn_id) {
|
|
218
|
-
this.acabrnId.set(queryData.acabrn_id);
|
|
219
|
-
console.log('🏢 Branch ID from route:', queryData.acabrn_id);
|
|
220
|
-
}
|
|
221
|
-
if (queryData?.acacpm_id) {
|
|
222
|
-
this.acacpmId.set(queryData.acacpm_id);
|
|
223
|
-
console.log('🏢 Class Program ID from route:', queryData.acacpm_id);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Load class program terms data
|
|
230
|
-
*/
|
|
231
|
-
loadClassProgramTerms() {
|
|
232
|
-
this.loading.set(true);
|
|
233
|
-
this.error.set(null);
|
|
234
|
-
// Add filter parameters if available
|
|
235
|
-
const acabrnId = this.acabrnId();
|
|
236
|
-
const acacpmId = this.acacpmId();
|
|
237
|
-
const payload = {
|
|
238
|
-
pageIndex: 0,
|
|
239
|
-
pageSize: 100,
|
|
240
|
-
query: this.searchTerm() || "",
|
|
241
|
-
sort: {
|
|
242
|
-
key: 'acapt_name',
|
|
243
|
-
order: 'asc'
|
|
244
|
-
},
|
|
245
|
-
acapt_class_prg_branch_acabrn: acabrnId,
|
|
246
|
-
};
|
|
247
|
-
this.classProgramTermService.getClassProgramTermList(payload)
|
|
248
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
249
|
-
.subscribe({
|
|
250
|
-
next: (response) => {
|
|
251
|
-
if (response?.success && response.data) {
|
|
252
|
-
console.log('📚 Class program terms loaded:', response.data);
|
|
253
|
-
this.classProgramTerms.set(response.data);
|
|
254
|
-
this.updateGridData();
|
|
255
|
-
this.notificationService.success(`Loaded ${response.data.length} class program term(s) successfully.`);
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
console.warn('⚠️ No class program term data received');
|
|
259
|
-
this.classProgramTerms.set([]);
|
|
260
|
-
this.updateGridData();
|
|
261
|
-
this.notificationService.warning('No class program terms found.');
|
|
262
|
-
}
|
|
263
|
-
this.loading.set(false);
|
|
264
|
-
},
|
|
265
|
-
error: (error) => {
|
|
266
|
-
console.error('❌ Error loading class program terms:', error);
|
|
267
|
-
this.error.set('Failed to load class program terms');
|
|
268
|
-
this.loading.set(false);
|
|
269
|
-
this.notificationService.error('Failed to load class program terms');
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Update grid data
|
|
275
|
-
*/
|
|
276
|
-
updateGridData() {
|
|
277
|
-
this.gridConfig.update(config => ({
|
|
278
|
-
...config,
|
|
279
|
-
data: this.filteredClassProgramTerms()
|
|
280
|
-
}));
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Handle grid events
|
|
284
|
-
*/
|
|
285
|
-
onGridEvent(event) {
|
|
286
|
-
switch (event.type) {
|
|
287
|
-
case 'pageChange':
|
|
288
|
-
if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
|
|
289
|
-
this.loadClassProgramTerms();
|
|
290
|
-
}
|
|
291
|
-
break;
|
|
292
|
-
case 'search':
|
|
293
|
-
this.searchTerm.set(event.data);
|
|
294
|
-
this.updateGridData();
|
|
295
|
-
break;
|
|
296
|
-
case 'refresh':
|
|
297
|
-
this.loadClassProgramTerms();
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Create new class program term
|
|
303
|
-
*/
|
|
304
|
-
createClassProgramTerm() {
|
|
305
|
-
this.router.navigate(['/control-panel/program-term-management/create']);
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* View class program term details
|
|
309
|
-
*/
|
|
310
|
-
viewClassProgramTerm(classProgramTerm) {
|
|
311
|
-
this.router.navigate(['/control-panel/class-program-term/view', classProgramTerm._id]);
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Edit class program term
|
|
315
|
-
*/
|
|
316
|
-
editClassProgramTerm(classProgramTerm) {
|
|
317
|
-
this.router.navigate(['/control-panel/class-program-term/edit', classProgramTerm._id]);
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Delete class program term
|
|
321
|
-
*/
|
|
322
|
-
deleteClassProgramTerm(classProgramTerm) {
|
|
323
|
-
this.confirmationService.confirmDelete(classProgramTerm.acapt_name).then((confirmed) => {
|
|
324
|
-
if (confirmed) {
|
|
325
|
-
this.loading.set(true);
|
|
326
|
-
const payload = {
|
|
327
|
-
acapt_id: classProgramTerm._id
|
|
328
|
-
};
|
|
329
|
-
this.classProgramTermService.deleteClassProgramTerm(payload)
|
|
330
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
331
|
-
.subscribe({
|
|
332
|
-
next: (response) => {
|
|
333
|
-
if (response?.success) {
|
|
334
|
-
this.classProgramTerms.update(terms => terms.filter(cpt => cpt._id !== classProgramTerm._id));
|
|
335
|
-
this.updateGridData();
|
|
336
|
-
this.notificationService.success('Class program term deleted successfully.');
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
this.notificationService.error('Failed to delete class program term.');
|
|
340
|
-
}
|
|
341
|
-
this.loading.set(false);
|
|
342
|
-
},
|
|
343
|
-
error: (error) => {
|
|
344
|
-
console.error('❌ Error deleting class program term:', error);
|
|
345
|
-
this.notificationService.error('Failed to delete class program term.');
|
|
346
|
-
this.loading.set(false);
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Toggle class program term status
|
|
354
|
-
*/
|
|
355
|
-
toggleClassProgramTermStatus(classProgramTerm) {
|
|
356
|
-
this.loading.set(true);
|
|
357
|
-
const payload = {
|
|
358
|
-
acapt_id: classProgramTerm._id
|
|
359
|
-
};
|
|
360
|
-
this.classProgramTermService.toggleClassProgramTermStatus(payload)
|
|
361
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
362
|
-
.subscribe({
|
|
363
|
-
next: (response) => {
|
|
364
|
-
if (response?.success) {
|
|
365
|
-
this.classProgramTerms.update(terms => terms.map(cpt => cpt._id === classProgramTerm._id
|
|
366
|
-
? { ...cpt, acapt_isactive: !cpt.acapt_isactive }
|
|
367
|
-
: cpt));
|
|
368
|
-
this.updateGridData();
|
|
369
|
-
this.notificationService.success(`Class program term ${classProgramTerm.acapt_isactive ? 'deactivated' : 'activated'} successfully.`);
|
|
370
|
-
}
|
|
371
|
-
else {
|
|
372
|
-
this.notificationService.error('Failed to toggle class program term status.');
|
|
373
|
-
}
|
|
374
|
-
this.loading.set(false);
|
|
375
|
-
},
|
|
376
|
-
error: (error) => {
|
|
377
|
-
console.error('❌ Error toggling class program term status:', error);
|
|
378
|
-
this.notificationService.error('Failed to toggle class program term status.');
|
|
379
|
-
this.loading.set(false);
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Refresh data
|
|
385
|
-
*/
|
|
386
|
-
refreshData() {
|
|
387
|
-
this.loadClassProgramTerms();
|
|
388
|
-
}
|
|
389
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
390
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ClassProgramTermListComponent, isStandalone: true, selector: "cide-academics-class-program-term-list", viewQueries: [{ propertyName: "classProgramTermDetailsRendererTemplate", first: true, predicate: ["classProgramTermDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "classProgramTermStatusRendererTemplate", first: true, predicate: ["classProgramTermStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Class Program Term Management Container -->\r\n<div class=\"tw-table tw-w-full tw-h-full\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Class Program Term Management</h5>\r\n </div>\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"createClassProgramTerm()\">\r\n Create Class Program Term\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid Section -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-p-0\">\r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n [templateRenderers]=\"templateRenderers()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Template Renderers -->\r\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <div class=\"tw-flex-shrink-0\">\r\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n </div>\r\n </div>\r\n <div class=\"tw-min-w-0 tw-flex-1\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\r\n {{ item.acapt_name }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ item.acapt_description }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n @if (item.acapt_iscurrent) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\r\n Current\r\n </span>\r\n }\r\n @if (item.acapt_islocked) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\r\n Locked\r\n </span>\r\n }\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': item.acapt_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !item.acapt_isactive\r\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\r\n <cide-ele-icon [ngClass]=\"{\r\n 'tw-text-green-600': item.acapt_isactive,\r\n 'tw-text-red-600': !item.acapt_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\r\n {{ item.acapt_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ item.acapt_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(item)\"\r\n (itemClick)=\"onDropdownItemClick($event, item)\"\r\n [config]=\"{\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm',\r\n usePortal: true\r\n }\"\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n icon=\"more_vert\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { 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: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }] });
|
|
391
|
-
}
|
|
392
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, decorators: [{
|
|
393
|
-
type: Component,
|
|
394
|
-
args: [{ selector: 'cide-academics-class-program-term-list', standalone: true, imports: [
|
|
395
|
-
CommonModule,
|
|
396
|
-
CideEleDataGridComponent,
|
|
397
|
-
CideIconComponent,
|
|
398
|
-
CideEleButtonComponent,
|
|
399
|
-
CideEleDropdownComponent
|
|
400
|
-
], template: "<!-- Class Program Term Management Container -->\r\n<div class=\"tw-table tw-w-full tw-h-full\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Class Program Term Management</h5>\r\n </div>\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"createClassProgramTerm()\">\r\n Create Class Program Term\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid Section -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-p-0\">\r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n [templateRenderers]=\"templateRenderers()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Template Renderers -->\r\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <div class=\"tw-flex-shrink-0\">\r\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n </div>\r\n </div>\r\n <div class=\"tw-min-w-0 tw-flex-1\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\r\n {{ item.acapt_name }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ item.acapt_description }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n @if (item.acapt_iscurrent) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\r\n Current\r\n </span>\r\n }\r\n @if (item.acapt_islocked) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\r\n Locked\r\n </span>\r\n }\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': item.acapt_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !item.acapt_isactive\r\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\r\n <cide-ele-icon [ngClass]=\"{\r\n 'tw-text-green-600': item.acapt_isactive,\r\n 'tw-text-red-600': !item.acapt_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\r\n {{ item.acapt_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ item.acapt_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(item)\"\r\n (itemClick)=\"onDropdownItemClick($event, item)\"\r\n [config]=\"{\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm',\r\n usePortal: true\r\n }\"\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n icon=\"more_vert\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n" }]
|
|
401
|
-
}] });
|
|
402
|
-
|
|
403
|
-
export { ClassProgramTermListComponent };
|
|
404
|
-
//# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-CaWAHMHN.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-academics-class-program-term-list.component-CaWAHMHN.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/class-program-term-management/components/class-program-term-list/class-program-term-list.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/class-program-term-management/components/class-program-term-list/class-program-term-list.component.html"],"sourcesContent":["import { Component, signal, computed, viewChild, TemplateRef, DestroyRef, inject, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CideEleDataGridComponent, CideIconComponent, CideEleButtonComponent, GridConfiguration, GridEvent, CideEleDropdownComponent, DropdownItem, NotificationService, ConfirmationService } from 'cloud-ide-element';\r\nimport { TemplateContext } from 'cloud-ide-element';\r\nimport { AppStateHelperService } from 'cloud-ide-layout';\r\nimport { \r\n type MClassProgramTerm,\r\n type MClassProgramTermDeletePayload,\r\n type MClassProgramTermToggleStatusPayload,\r\n generateObjectFromString\r\n} from 'cloud-ide-lms-model';\r\nimport { CideLytClassProgramTermService } from '../../services/class-program-term.service';\r\n\r\n// Interfaces based on the model files\r\ninterface ClassProgramTerm {\r\n _id?: string;\r\n acapt_code?: string;\r\n acapt_name?: string;\r\n acapt_description?: string;\r\n acapt_class_program_id_acacpm?: {\r\n _id?: string;\r\n acacpm_name?: string;\r\n };\r\n acapt_parent_class_prog_term_acapt?: {\r\n _id?: string;\r\n acapt_name?: string;\r\n };\r\n acapt_isactive?: boolean;\r\n acapt_iscurrent?: boolean;\r\n acapt_islocked?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-academics-class-program-term-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n CideEleDataGridComponent,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideEleDropdownComponent\r\n ],\r\n templateUrl: './class-program-term-list.component.html'\r\n})\r\nexport class ClassProgramTermListComponent implements OnInit {\r\n // Dependency injection\r\n private destroyRef = inject(DestroyRef);\r\n private router = inject(Router);\r\n private route = inject(ActivatedRoute);\r\n private appState = inject(AppStateHelperService);\r\n private notificationService = inject(NotificationService);\r\n private confirmationService = inject(ConfirmationService);\r\n private classProgramTermService = inject(CideLytClassProgramTermService);\r\n\r\n // Modern ViewChild signals for template renderers (Angular 20 approach)\r\n classProgramTermDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('classProgramTermDetailsRendererTemplate');\r\n classProgramTermStatusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('classProgramTermStatusRendererTemplate');\r\n actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\r\n\r\n // Computed template renderers for grid\r\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\r\n classProgramTermDetailsRenderer: this.classProgramTermDetailsRendererTemplate(),\r\n classProgramTermStatusRenderer: this.classProgramTermStatusRendererTemplate(),\r\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate()\r\n }));\r\n\r\n // Make Math available in template\r\n Math = Math;\r\n\r\n // Signals for reactive state management\r\n classProgramTerms = signal<ClassProgramTerm[]>([]);\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n selectedItems = signal<string[]>([]);\r\n searchTerm = signal('');\r\n acabrnId = signal<string | null>(null);\r\n acacpmId = signal<string | null>(null);\r\n\r\n // Derived list filtered by searchTerm\r\n filteredClassProgramTerms = computed(() => {\r\n const q = (this.searchTerm() || '').toLowerCase().trim();\r\n const items = this.classProgramTerms() || [];\r\n if (!q) return items;\r\n return items.filter(cpt => {\r\n const name = (cpt.acapt_name || '').toLowerCase();\r\n const code = (cpt.acapt_code || '').toLowerCase();\r\n const description = (cpt.acapt_description || '').toLowerCase();\r\n return name.includes(q) || code.includes(q) || description.includes(q);\r\n });\r\n });\r\n\r\n // Grid configuration signal\r\n gridConfig = signal<GridConfiguration<ClassProgramTerm>>({\r\n id: 'class-program-term-list-grid',\r\n columns: [\r\n {\r\n key: 'details',\r\n header: 'Term Details',\r\n type: 'custom',\r\n width: 'auto',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'classProgramTermDetailsRenderer'\r\n },\r\n {\r\n key: 'acapt_code',\r\n header: 'Code',\r\n type: 'text',\r\n width: '120px',\r\n truncate: true,\r\n align: 'left'\r\n },\r\n {\r\n key: 'acapt_class_program_id_acacpm',\r\n header: 'Program Class',\r\n type: 'custom',\r\n width: '200px',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'programClassRenderer'\r\n },\r\n {\r\n key: 'acapt_parent_class_prog_term_acapt',\r\n header: 'Parent Term',\r\n type: 'custom',\r\n width: '180px',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'parentTermRenderer'\r\n },\r\n {\r\n key: 'acapt_isactive',\r\n header: 'Status',\r\n type: 'custom',\r\n width: '120px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'classProgramTermStatusRenderer'\r\n },\r\n {\r\n key: 'actions',\r\n header: '',\r\n type: 'custom',\r\n width: '150px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'actionsDropdownRenderer'\r\n }\r\n ],\r\n data: [],\r\n trackBy: '_id',\r\n pagination: {\r\n enabled: true,\r\n pageSize: 10,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n showQuickJump: true,\r\n showPageInfo: true,\r\n showRefresh: true\r\n },\r\n search: {\r\n enabled: true,\r\n placeholder: 'Search class program terms...',\r\n searchableColumns: ['acapt_name', 'acapt_code', 'acapt_description'],\r\n debounceMs: 300\r\n },\r\n loading: {\r\n useDefer: true,\r\n skeletonRows: 5,\r\n showOverlay: false\r\n },\r\n scroll: {\r\n enabled: true,\r\n maxHeight: '',\r\n minHeight: '',\r\n stickyHeader: true,\r\n virtualScroll: false,\r\n rowHeight: 50\r\n },\r\n responsive: true,\r\n striped: false,\r\n bordered: true,\r\n compact: false,\r\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\r\n });\r\n\r\n /**\r\n * Get action dropdown items\r\n */\r\n getActionDropdownItems(classProgramTerm: ClassProgramTerm): DropdownItem[] {\r\n const items: DropdownItem[] = [\r\n {\r\n id: 'view',\r\n label: 'View Details',\r\n icon: 'visibility',\r\n iconColor: 'tw-text-gray-400',\r\n textColor: 'tw-text-gray-700'\r\n },\r\n {\r\n id: 'edit',\r\n label: 'Edit Term',\r\n icon: 'edit',\r\n iconColor: 'tw-text-blue-400',\r\n textColor: 'tw-text-blue-700'\r\n },\r\n {\r\n id: 'toggleStatus',\r\n label: classProgramTerm.acapt_isactive ? 'Deactivate' : 'Activate',\r\n icon: classProgramTerm.acapt_isactive ? 'toggle_off' : 'toggle_on',\r\n iconColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',\r\n textColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-700' : 'tw-text-green-700'\r\n },\r\n {\r\n id: 'delete',\r\n label: 'Delete',\r\n icon: 'delete',\r\n iconColor: 'tw-text-red-400',\r\n textColor: 'tw-text-red-700'\r\n }\r\n ];\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Handle dropdown item click\r\n */\r\n onDropdownItemClick(item: DropdownItem, classProgramTerm: ClassProgramTerm): void {\r\n switch (item.id) {\r\n case 'view':\r\n this.viewClassProgramTerm(classProgramTerm);\r\n break;\r\n case 'edit':\r\n this.editClassProgramTerm(classProgramTerm);\r\n break;\r\n case 'toggleStatus':\r\n this.toggleClassProgramTermStatus(classProgramTerm);\r\n break;\r\n case 'delete':\r\n this.deleteClassProgramTerm(classProgramTerm);\r\n break;\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.checkRouteParams();\r\n this.loadClassProgramTerms();\r\n }\r\n\r\n /**\r\n * Check route parameters for acabrn_id and acacpm_id\r\n */\r\n private checkRouteParams(): void {\r\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\r\n const queryParams = params['query'];\r\n console.log('🏢 Route params:', params, 'queryParams:', queryParams);\r\n\r\n if (queryParams) {\r\n // Query parameters passed (following page-controls pattern)\r\n const queryData = generateObjectFromString(queryParams);\r\n console.log('🏢 Class Program Term params from route:', queryData);\r\n \r\n if (queryData?.acabrn_id) {\r\n this.acabrnId.set(queryData.acabrn_id as string);\r\n console.log('🏢 Branch ID from route:', queryData.acabrn_id);\r\n }\r\n \r\n if (queryData?.acacpm_id) {\r\n this.acacpmId.set(queryData.acacpm_id as string);\r\n console.log('🏢 Class Program ID from route:', queryData.acacpm_id);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load class program terms data\r\n */\r\n private loadClassProgramTerms(): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n // Add filter parameters if available\r\n const acabrnId = this.acabrnId();\r\n const acacpmId = this.acacpmId();\r\n const payload: MClassProgramTerm = {\r\n pageIndex: 0,\r\n pageSize: 100,\r\n query: this.searchTerm() || \"\",\r\n sort: {\r\n key: 'acapt_name',\r\n order: 'asc'\r\n },\r\n acapt_class_prg_branch_acabrn: acabrnId as string,\r\n };\r\n\r\n this.classProgramTermService.getClassProgramTermList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n console.log('📚 Class program terms loaded:', response.data);\r\n this.classProgramTerms.set(response.data);\r\n this.updateGridData();\r\n this.notificationService.success(`Loaded ${response.data.length} class program term(s) successfully.`);\r\n } else {\r\n console.warn('⚠️ No class program term data received');\r\n this.classProgramTerms.set([]);\r\n this.updateGridData();\r\n this.notificationService.warning('No class program terms found.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error loading class program terms:', error);\r\n this.error.set('Failed to load class program terms');\r\n this.loading.set(false);\r\n this.notificationService.error('Failed to load class program terms');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update grid data\r\n */\r\n private updateGridData(): void {\r\n this.gridConfig.update(config => ({\r\n ...config,\r\n data: this.filteredClassProgramTerms()\r\n }));\r\n }\r\n\r\n /**\r\n * Handle grid events\r\n */\r\n onGridEvent(event: GridEvent<ClassProgramTerm>): void {\r\n switch (event.type) {\r\n case 'pageChange':\r\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\r\n this.loadClassProgramTerms();\r\n }\r\n break;\r\n case 'search':\r\n this.searchTerm.set(event.data as string);\r\n this.updateGridData();\r\n break;\r\n case 'refresh':\r\n this.loadClassProgramTerms();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Create new class program term\r\n */\r\n createClassProgramTerm(): void {\r\n this.router.navigate(['/control-panel/program-term-management/create']);\r\n }\r\n\r\n /**\r\n * View class program term details\r\n */\r\n viewClassProgramTerm(classProgramTerm: ClassProgramTerm): void {\r\n this.router.navigate(['/control-panel/class-program-term/view', classProgramTerm._id]);\r\n }\r\n\r\n /**\r\n * Edit class program term\r\n */\r\n editClassProgramTerm(classProgramTerm: ClassProgramTerm): void {\r\n this.router.navigate(['/control-panel/class-program-term/edit', classProgramTerm._id]);\r\n }\r\n\r\n /**\r\n * Delete class program term\r\n */\r\n deleteClassProgramTerm(classProgramTerm: ClassProgramTerm): void {\r\n this.confirmationService.confirmDelete(classProgramTerm.acapt_name).then((confirmed: boolean) => {\r\n if (confirmed) {\r\n this.loading.set(true);\r\n const payload: MClassProgramTermDeletePayload = {\r\n acapt_id: classProgramTerm._id!\r\n };\r\n\r\n this.classProgramTermService.deleteClassProgramTerm(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.classProgramTerms.update(terms => \r\n terms.filter(cpt => cpt._id !== classProgramTerm._id)\r\n );\r\n this.updateGridData();\r\n this.notificationService.success('Class program term deleted successfully.');\r\n } else {\r\n this.notificationService.error('Failed to delete class program term.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error deleting class program term:', error);\r\n this.notificationService.error('Failed to delete class program term.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Toggle class program term status\r\n */\r\n toggleClassProgramTermStatus(classProgramTerm: ClassProgramTerm): void {\r\n this.loading.set(true);\r\n const payload: MClassProgramTermToggleStatusPayload = {\r\n acapt_id: classProgramTerm._id!\r\n };\r\n\r\n this.classProgramTermService.toggleClassProgramTermStatus(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.classProgramTerms.update(terms => \r\n terms.map(cpt => \r\n cpt._id === classProgramTerm._id \r\n ? { ...cpt, acapt_isactive: !cpt.acapt_isactive }\r\n : cpt\r\n )\r\n );\r\n this.updateGridData();\r\n this.notificationService.success(`Class program term ${classProgramTerm.acapt_isactive ? 'deactivated' : 'activated'} successfully.`);\r\n } else {\r\n this.notificationService.error('Failed to toggle class program term status.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error toggling class program term status:', error);\r\n this.notificationService.error('Failed to toggle class program term status.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Refresh data\r\n */\r\n refreshData(): void {\r\n this.loadClassProgramTerms();\r\n }\r\n}\r\n","<!-- Class Program Term Management Container -->\r\n<div class=\"tw-table tw-w-full tw-h-full\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Class Program Term Management</h5>\r\n </div>\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"createClassProgramTerm()\">\r\n Create Class Program Term\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid Section -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-p-0\">\r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n [templateRenderers]=\"templateRenderers()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Template Renderers -->\r\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <div class=\"tw-flex-shrink-0\">\r\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n </div>\r\n </div>\r\n <div class=\"tw-min-w-0 tw-flex-1\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\r\n {{ item.acapt_name }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ item.acapt_description }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n @if (item.acapt_iscurrent) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\r\n Current\r\n </span>\r\n }\r\n @if (item.acapt_islocked) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\r\n Locked\r\n </span>\r\n }\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': item.acapt_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !item.acapt_isactive\r\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\r\n <cide-ele-icon [ngClass]=\"{\r\n 'tw-text-green-600': item.acapt_isactive,\r\n 'tw-text-red-600': !item.acapt_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\r\n {{ item.acapt_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ item.acapt_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(item)\"\r\n (itemClick)=\"onDropdownItemClick($event, item)\"\r\n [config]=\"{\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm',\r\n usePortal: true\r\n }\"\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n icon=\"more_vert\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n"],"names":[],"mappings":"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"}
|