cloud-ide-academics 0.0.1 → 0.0.2
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-D3PfbSMN.mjs +578 -0
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-D3PfbSMN.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-Cpbyavgd.mjs +404 -0
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-Cpbyavgd.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs +111 -0
- package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-BP1hZ-yx.mjs +2802 -0
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-BP1hZ-yx.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-program-class-create.component-Ds8vN9sL.mjs +391 -0
- package/fesm2022/cloud-ide-academics-program-class-create.component-Ds8vN9sL.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-program-class-list.component-C6VyX4hH.mjs +433 -0
- package/fesm2022/cloud-ide-academics-program-class-list.component-C6VyX4hH.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dg9Pjwj5.mjs +211 -0
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dg9Pjwj5.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-program-term-section-list.component-xVeeeGDV.mjs +478 -0
- package/fesm2022/cloud-ide-academics-program-term-section-list.component-xVeeeGDV.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics.mjs +1 -1535
- package/fesm2022/cloud-ide-academics.mjs.map +1 -1
- package/index.d.ts +239 -2
- package/package.json +1 -1
|
@@ -0,0 +1,433 @@
|
|
|
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 } 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 { generateStringFromObject } from 'cloud-ide-lms-model';
|
|
10
|
+
import { C as CideLytProgramClassService } from './cloud-ide-academics-cloud-ide-academics-BP1hZ-yx.mjs';
|
|
11
|
+
|
|
12
|
+
class ProgramClassListComponent {
|
|
13
|
+
// Dependency injection
|
|
14
|
+
destroyRef = inject(DestroyRef);
|
|
15
|
+
router = inject(Router);
|
|
16
|
+
appState = inject(AppStateHelperService);
|
|
17
|
+
notificationService = inject(NotificationService);
|
|
18
|
+
confirmationService = inject(ConfirmationService);
|
|
19
|
+
programClassService = inject(CideLytProgramClassService);
|
|
20
|
+
// Modern ViewChild signals for template renderers (Angular 20 approach)
|
|
21
|
+
programClassDetailsRendererTemplate = viewChild.required('programClassDetailsRendererTemplate');
|
|
22
|
+
programClassStatusRendererTemplate = viewChild.required('programClassStatusRendererTemplate');
|
|
23
|
+
classProgramRendererTemplate = viewChild.required('classProgramRendererTemplate');
|
|
24
|
+
academicYearRendererTemplate = viewChild.required('academicYearRendererTemplate');
|
|
25
|
+
actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
|
|
26
|
+
// Computed template renderers for grid
|
|
27
|
+
templateRenderers = computed(() => ({
|
|
28
|
+
programClassDetailsRenderer: this.programClassDetailsRendererTemplate(),
|
|
29
|
+
programClassStatusRenderer: this.programClassStatusRendererTemplate(),
|
|
30
|
+
classProgramRenderer: this.classProgramRendererTemplate(),
|
|
31
|
+
academicYearRenderer: this.academicYearRendererTemplate(),
|
|
32
|
+
actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
|
|
33
|
+
}), ...(ngDevMode ? [{ debugName: "templateRenderers" }] : []));
|
|
34
|
+
// Make Math available in template
|
|
35
|
+
Math = Math;
|
|
36
|
+
// Signals for reactive state management
|
|
37
|
+
programClasses = signal([], ...(ngDevMode ? [{ debugName: "programClasses" }] : []));
|
|
38
|
+
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
39
|
+
error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
40
|
+
selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
|
|
41
|
+
searchTerm = signal('', ...(ngDevMode ? [{ debugName: "searchTerm" }] : []));
|
|
42
|
+
// Derived list filtered by searchTerm
|
|
43
|
+
filteredProgramClasses = computed(() => {
|
|
44
|
+
const q = (this.searchTerm() || '').toLowerCase().trim();
|
|
45
|
+
const items = this.programClasses() || [];
|
|
46
|
+
if (!q)
|
|
47
|
+
return items;
|
|
48
|
+
return items.filter(pc => {
|
|
49
|
+
const title = (pc.acacpm_alise_title || '').toLowerCase();
|
|
50
|
+
const classProgramTitle = (pc.acacpm_class_program_id_sygms?.sygms_title || '').toLowerCase();
|
|
51
|
+
const academicYearName = (pc.acacpm_academic_year_id_acayr?.acayr_name || '').toLowerCase();
|
|
52
|
+
const entityName = (pc.acacpm_entity_id_syen?.syen_name || '').toLowerCase();
|
|
53
|
+
return title.includes(q) || classProgramTitle.includes(q) || academicYearName.includes(q) || entityName.includes(q);
|
|
54
|
+
});
|
|
55
|
+
}, ...(ngDevMode ? [{ debugName: "filteredProgramClasses" }] : []));
|
|
56
|
+
// Grid configuration signal
|
|
57
|
+
gridConfig = signal({
|
|
58
|
+
id: 'program-class-list-grid',
|
|
59
|
+
columns: [
|
|
60
|
+
{
|
|
61
|
+
key: 'details',
|
|
62
|
+
header: 'Program Class Details',
|
|
63
|
+
type: 'custom',
|
|
64
|
+
width: 'auto',
|
|
65
|
+
truncate: true,
|
|
66
|
+
align: 'left',
|
|
67
|
+
renderer: 'programClassDetailsRenderer'
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
key: 'acacpm_class_program_id_sygms',
|
|
71
|
+
header: 'Class Program',
|
|
72
|
+
type: 'custom',
|
|
73
|
+
width: '200px',
|
|
74
|
+
truncate: true,
|
|
75
|
+
align: 'left',
|
|
76
|
+
renderer: 'classProgramRenderer'
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
key: 'acacpm_academic_year_id_acayr',
|
|
80
|
+
header: 'Academic Year',
|
|
81
|
+
type: 'custom',
|
|
82
|
+
width: '180px',
|
|
83
|
+
truncate: true,
|
|
84
|
+
align: 'left',
|
|
85
|
+
renderer: 'academicYearRenderer'
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: 'acacpm_isactive',
|
|
89
|
+
header: 'Status',
|
|
90
|
+
type: 'custom',
|
|
91
|
+
width: '120px',
|
|
92
|
+
truncate: false,
|
|
93
|
+
align: 'center',
|
|
94
|
+
renderer: 'programClassStatusRenderer'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
key: 'actions',
|
|
98
|
+
header: '',
|
|
99
|
+
type: 'custom',
|
|
100
|
+
width: '150px',
|
|
101
|
+
truncate: false,
|
|
102
|
+
align: 'center',
|
|
103
|
+
renderer: 'actionsDropdownRenderer'
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
data: [],
|
|
107
|
+
trackBy: '_id',
|
|
108
|
+
pagination: {
|
|
109
|
+
enabled: true,
|
|
110
|
+
pageSize: 10,
|
|
111
|
+
pageSizeOptions: [10, 25, 50, 100],
|
|
112
|
+
showQuickJump: true,
|
|
113
|
+
showPageInfo: true,
|
|
114
|
+
showRefresh: true
|
|
115
|
+
},
|
|
116
|
+
search: {
|
|
117
|
+
enabled: true,
|
|
118
|
+
placeholder: 'Search program classes...',
|
|
119
|
+
searchableColumns: ['acacpm_alise_title'],
|
|
120
|
+
debounceMs: 300
|
|
121
|
+
},
|
|
122
|
+
loading: {
|
|
123
|
+
useDefer: true,
|
|
124
|
+
skeletonRows: 5,
|
|
125
|
+
showOverlay: false
|
|
126
|
+
},
|
|
127
|
+
scroll: {
|
|
128
|
+
enabled: true,
|
|
129
|
+
maxHeight: '',
|
|
130
|
+
minHeight: '',
|
|
131
|
+
stickyHeader: true,
|
|
132
|
+
virtualScroll: false,
|
|
133
|
+
rowHeight: 50
|
|
134
|
+
},
|
|
135
|
+
responsive: true,
|
|
136
|
+
striped: false,
|
|
137
|
+
bordered: true,
|
|
138
|
+
compact: false,
|
|
139
|
+
tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
|
|
140
|
+
}, ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
|
|
141
|
+
/**
|
|
142
|
+
* Get action dropdown items
|
|
143
|
+
*/
|
|
144
|
+
getActionDropdownItems(programClass) {
|
|
145
|
+
const items = [
|
|
146
|
+
{
|
|
147
|
+
id: 'view',
|
|
148
|
+
label: 'View Details',
|
|
149
|
+
icon: 'visibility',
|
|
150
|
+
iconColor: 'tw-text-gray-400',
|
|
151
|
+
textColor: 'tw-text-gray-700'
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: 'edit',
|
|
155
|
+
label: 'Edit Program Class',
|
|
156
|
+
icon: 'edit',
|
|
157
|
+
iconColor: 'tw-text-blue-400',
|
|
158
|
+
textColor: 'tw-text-blue-700'
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: 'branch',
|
|
162
|
+
label: 'Manage Branches',
|
|
163
|
+
icon: 'account_tree',
|
|
164
|
+
iconColor: 'tw-text-purple-400',
|
|
165
|
+
textColor: 'tw-text-purple-700'
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
id: 'toggleStatus',
|
|
169
|
+
label: programClass?.acacpm_isactive ? 'Deactivate' : 'Activate',
|
|
170
|
+
icon: programClass?.acacpm_isactive ? 'toggle_off' : 'toggle_on',
|
|
171
|
+
iconColor: programClass?.acacpm_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',
|
|
172
|
+
textColor: programClass?.acacpm_isactive ? 'tw-text-orange-700' : 'tw-text-green-700'
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: 'delete',
|
|
176
|
+
label: 'Delete',
|
|
177
|
+
icon: 'delete',
|
|
178
|
+
iconColor: 'tw-text-red-400',
|
|
179
|
+
textColor: 'tw-text-red-700'
|
|
180
|
+
}
|
|
181
|
+
];
|
|
182
|
+
return items;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Handle dropdown item click
|
|
186
|
+
*/
|
|
187
|
+
onDropdownItemClick(item, programClass) {
|
|
188
|
+
console.log('🔍 onDropdownItemClick called with:', { item, programClass });
|
|
189
|
+
if (!item || !item.id) {
|
|
190
|
+
console.error('Dropdown item is undefined:', item);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (!programClass) {
|
|
194
|
+
console.error('Program class is undefined:', programClass);
|
|
195
|
+
this.notificationService.error('Unable to perform action: Invalid data');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
switch (item.id) {
|
|
199
|
+
case 'view':
|
|
200
|
+
this.viewProgramClass(programClass);
|
|
201
|
+
break;
|
|
202
|
+
case 'edit':
|
|
203
|
+
this.editProgramClass(programClass);
|
|
204
|
+
break;
|
|
205
|
+
case 'branch':
|
|
206
|
+
this.manageBranches(programClass);
|
|
207
|
+
break;
|
|
208
|
+
case 'toggleStatus':
|
|
209
|
+
this.toggleProgramClassStatus(programClass);
|
|
210
|
+
break;
|
|
211
|
+
case 'delete':
|
|
212
|
+
this.deleteProgramClass(programClass);
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
console.warn('Unknown dropdown action:', item.id);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
ngOnInit() {
|
|
219
|
+
this.loadProgramClasses();
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Load program classes data
|
|
223
|
+
*/
|
|
224
|
+
loadProgramClasses() {
|
|
225
|
+
this.loading.set(true);
|
|
226
|
+
this.error.set(null);
|
|
227
|
+
const payload = {
|
|
228
|
+
pageIndex: 0,
|
|
229
|
+
pageSize: 100,
|
|
230
|
+
query: this.searchTerm() || "",
|
|
231
|
+
sort: {
|
|
232
|
+
key: 'acacpm_alise_title',
|
|
233
|
+
order: 'asc'
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
this.programClassService.getProgramClassList(payload)
|
|
237
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
238
|
+
.subscribe({
|
|
239
|
+
next: (response) => {
|
|
240
|
+
if (response?.success && response.data) {
|
|
241
|
+
console.log('📚 Program classes loaded:', response.data);
|
|
242
|
+
this.programClasses.set(response.data);
|
|
243
|
+
this.updateGridData();
|
|
244
|
+
this.notificationService.success(`Loaded ${response.data.length} program class(es) successfully.`);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
console.warn('⚠️ No program class data received');
|
|
248
|
+
this.programClasses.set([]);
|
|
249
|
+
this.updateGridData();
|
|
250
|
+
this.notificationService.warning('No program classes found.');
|
|
251
|
+
}
|
|
252
|
+
this.loading.set(false);
|
|
253
|
+
},
|
|
254
|
+
error: (error) => {
|
|
255
|
+
console.error('❌ Error loading program classes:', error);
|
|
256
|
+
this.error.set('Failed to load program classes');
|
|
257
|
+
this.loading.set(false);
|
|
258
|
+
this.notificationService.error('Failed to load program classes');
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Update grid data
|
|
264
|
+
*/
|
|
265
|
+
updateGridData() {
|
|
266
|
+
this.gridConfig.update(config => ({
|
|
267
|
+
...config,
|
|
268
|
+
data: this.filteredProgramClasses()
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Handle grid events
|
|
273
|
+
*/
|
|
274
|
+
onGridEvent(event) {
|
|
275
|
+
switch (event.type) {
|
|
276
|
+
case 'pageChange':
|
|
277
|
+
if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
|
|
278
|
+
this.loadProgramClasses();
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
case 'search':
|
|
282
|
+
this.searchTerm.set(event.data);
|
|
283
|
+
this.updateGridData();
|
|
284
|
+
break;
|
|
285
|
+
case 'refresh':
|
|
286
|
+
this.loadProgramClasses();
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Create new program class
|
|
292
|
+
*/
|
|
293
|
+
createProgramClass() {
|
|
294
|
+
this.router.navigate(['/control-panel/program-class-management/create']);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* View program class details
|
|
298
|
+
*/
|
|
299
|
+
viewProgramClass(programClass) {
|
|
300
|
+
if (!programClass || !programClass._id) {
|
|
301
|
+
console.error('Program class or ID is undefined:', programClass);
|
|
302
|
+
this.notificationService.error('Unable to view program class: Invalid data');
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
console.log('👁️ Viewing program class:', programClass);
|
|
306
|
+
this.notificationService.info(`Opening program class "${programClass.acacpm_alise_title}" for viewing.`);
|
|
307
|
+
const queryParams = generateStringFromObject({ acacpm_id: programClass._id });
|
|
308
|
+
this.router.navigate(['/control-panel/program-class-management/view', queryParams]);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Edit program class
|
|
312
|
+
*/
|
|
313
|
+
editProgramClass(programClass) {
|
|
314
|
+
if (!programClass || !programClass._id) {
|
|
315
|
+
console.error('Program class or ID is undefined:', programClass);
|
|
316
|
+
this.notificationService.error('Unable to edit program class: Invalid data');
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
console.log('✏️ Editing program class:', programClass);
|
|
320
|
+
this.notificationService.info(`Opening program class "${programClass.acacpm_alise_title}" for editing.`);
|
|
321
|
+
const queryParams = generateStringFromObject({ acacpm_id: programClass._id });
|
|
322
|
+
this.router.navigate(['/control-panel/program-class-management/edit', queryParams]);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Manage branches for program class
|
|
326
|
+
*/
|
|
327
|
+
manageBranches(programClass) {
|
|
328
|
+
if (!programClass || !programClass._id) {
|
|
329
|
+
console.error('Program class or ID is undefined:', programClass);
|
|
330
|
+
this.notificationService.error('Unable to manage branches: Invalid data');
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
console.log('🌿 Managing branches for program class:', programClass);
|
|
334
|
+
this.notificationService.info(`Opening branch management for "${programClass.acacpm_alise_title}".`);
|
|
335
|
+
const queryParams = generateStringFromObject({ programId: programClass._id });
|
|
336
|
+
this.router.navigate(['/control-panel/program_specialization', queryParams]);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Delete program class
|
|
340
|
+
*/
|
|
341
|
+
deleteProgramClass(programClass) {
|
|
342
|
+
if (!programClass || !programClass._id) {
|
|
343
|
+
console.error('Program class or ID is undefined:', programClass);
|
|
344
|
+
this.notificationService.error('Unable to delete program class: Invalid data');
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
this.confirmationService.confirmDelete(programClass.acacpm_alise_title).then((confirmed) => {
|
|
348
|
+
if (confirmed) {
|
|
349
|
+
this.loading.set(true);
|
|
350
|
+
const payload = {
|
|
351
|
+
acacpm_id: programClass._id
|
|
352
|
+
};
|
|
353
|
+
this.programClassService.deleteProgramClass(payload)
|
|
354
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
355
|
+
.subscribe({
|
|
356
|
+
next: (response) => {
|
|
357
|
+
if (response?.success) {
|
|
358
|
+
this.programClasses.update(classes => classes.filter(pc => pc._id !== programClass._id));
|
|
359
|
+
this.updateGridData();
|
|
360
|
+
this.notificationService.success('Program class deleted successfully.');
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
this.notificationService.error('Failed to delete program class.');
|
|
364
|
+
}
|
|
365
|
+
this.loading.set(false);
|
|
366
|
+
},
|
|
367
|
+
error: (error) => {
|
|
368
|
+
console.error('❌ Error deleting program class:', error);
|
|
369
|
+
this.notificationService.error('Failed to delete program class.');
|
|
370
|
+
this.loading.set(false);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Toggle program class status
|
|
378
|
+
*/
|
|
379
|
+
toggleProgramClassStatus(programClass) {
|
|
380
|
+
if (!programClass || !programClass._id) {
|
|
381
|
+
console.error('Program class or ID is undefined:', programClass);
|
|
382
|
+
this.notificationService.error('Unable to toggle program class status: Invalid data');
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
this.loading.set(true);
|
|
386
|
+
const payload = {
|
|
387
|
+
acacpm_id: programClass._id
|
|
388
|
+
};
|
|
389
|
+
this.programClassService.toggleProgramClassStatus(payload)
|
|
390
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
391
|
+
.subscribe({
|
|
392
|
+
next: (response) => {
|
|
393
|
+
if (response?.success) {
|
|
394
|
+
this.programClasses.update(classes => classes.map(pc => pc._id === programClass._id
|
|
395
|
+
? { ...pc, acacpm_isactive: !pc.acacpm_isactive }
|
|
396
|
+
: pc));
|
|
397
|
+
this.updateGridData();
|
|
398
|
+
this.notificationService.success(`Program class ${programClass.acacpm_isactive ? 'deactivated' : 'activated'} successfully.`);
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
this.notificationService.error('Failed to toggle program class status.');
|
|
402
|
+
}
|
|
403
|
+
this.loading.set(false);
|
|
404
|
+
},
|
|
405
|
+
error: (error) => {
|
|
406
|
+
console.error('❌ Error toggling program class status:', error);
|
|
407
|
+
this.notificationService.error('Failed to toggle program class status.');
|
|
408
|
+
this.loading.set(false);
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Refresh data
|
|
414
|
+
*/
|
|
415
|
+
refreshData() {
|
|
416
|
+
this.loadProgramClasses();
|
|
417
|
+
}
|
|
418
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ProgramClassListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
419
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.7", type: ProgramClassListComponent, isStandalone: true, selector: "cide-academics-program-class-list", viewQueries: [{ propertyName: "programClassDetailsRendererTemplate", first: true, predicate: ["programClassDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "programClassStatusRendererTemplate", first: true, predicate: ["programClassStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "classProgramRendererTemplate", first: true, predicate: ["classProgramRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "academicYearRendererTemplate", first: true, predicate: ["academicYearRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Program Class 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-purple-600 tw-w-5 tw-h-5\">school</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Program Class 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)=\"createProgramClass()\">\r\n Create Program Class\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 #programClassDetailsRendererTemplate let-value=\"value\" let-row=\"row\" 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-purple-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-5 tw-h-5\">school</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 {{ row?.acacpm_alise_title }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ row?.acacpm_class_program_id_sygms?.sygms_title }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #programClassStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': row?.acacpm_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !row?.acacpm_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': row?.acacpm_isactive,\r\n 'tw-text-red-600': !row?.acacpm_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-2\">\r\n {{ row?.acacpm_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ row?.acacpm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\r\n {{ row?.acacpm_class_program_id_sygms?.sygms_title || 'N/A' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #academicYearRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-green-600 tw-w-4 tw-h-4\">calendar_today</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\r\n {{ row?.acacpm_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(row)\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\"\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]", 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"] }] });
|
|
420
|
+
}
|
|
421
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ProgramClassListComponent, decorators: [{
|
|
422
|
+
type: Component,
|
|
423
|
+
args: [{ selector: 'cide-academics-program-class-list', standalone: true, imports: [
|
|
424
|
+
CommonModule,
|
|
425
|
+
CideEleDataGridComponent,
|
|
426
|
+
CideIconComponent,
|
|
427
|
+
CideEleButtonComponent,
|
|
428
|
+
CideEleDropdownComponent
|
|
429
|
+
], template: "<!-- Program Class 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-purple-600 tw-w-5 tw-h-5\">school</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Program Class 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)=\"createProgramClass()\">\r\n Create Program Class\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 #programClassDetailsRendererTemplate let-value=\"value\" let-row=\"row\" 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-purple-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-5 tw-h-5\">school</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 {{ row?.acacpm_alise_title }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ row?.acacpm_class_program_id_sygms?.sygms_title }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #programClassStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': row?.acacpm_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !row?.acacpm_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': row?.acacpm_isactive,\r\n 'tw-text-red-600': !row?.acacpm_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-2\">\r\n {{ row?.acacpm_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ row?.acacpm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\r\n {{ row?.acacpm_class_program_id_sygms?.sygms_title || 'N/A' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #academicYearRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-green-600 tw-w-4 tw-h-4\">calendar_today</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\r\n {{ row?.acacpm_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(row)\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\"\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n icon=\"more_vert\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n" }]
|
|
430
|
+
}] });
|
|
431
|
+
|
|
432
|
+
export { ProgramClassListComponent };
|
|
433
|
+
//# sourceMappingURL=cloud-ide-academics-program-class-list.component-C6VyX4hH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-ide-academics-program-class-list.component-C6VyX4hH.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/program-class-management/components/program-class-list/program-class-list.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/program-class-management/components/program-class-list/program-class-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 } 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 MClassProgramMaster,\r\n type MClassProgramMasterDeletePayload,\r\n type MClassProgramMasterToggleStatusPayload,\r\n generateStringFromObject\r\n} from 'cloud-ide-lms-model';\r\nimport { CideLytProgramClassService } from '../../services/program-class.service';\r\n\r\n// Interfaces based on the actual API response\r\ninterface ProgramClass {\r\n _id?: string;\r\n acacpm_alise_title?: string;\r\n acacpm_class_program_id_sygms?: {\r\n _id?: string;\r\n sygms_id_sygmt?: string;\r\n sygms_code?: string;\r\n sygms_title?: string;\r\n sygms_desc?: string;\r\n sygms_entity_id_syen?: string;\r\n sygms_isactive?: boolean;\r\n __v?: number;\r\n };\r\n acacpm_academic_year_id_acayr?: {\r\n _id?: string;\r\n acayr_code?: string;\r\n acayr_name?: string;\r\n acayr_description?: string;\r\n acayr_from_date?: string;\r\n acayr_to_date?: string;\r\n acayr_isactive?: boolean;\r\n acayr_iscurrent?: boolean;\r\n acayr_islocked?: boolean;\r\n __v?: number;\r\n };\r\n acacpm_entity_id_syen?: {\r\n _id?: string;\r\n syen_name?: string;\r\n syen_entity_type_gmst?: string;\r\n syen_entity_code?: string;\r\n syen_corporate_address?: string;\r\n syen_corporate_pin_sypin?: string;\r\n syen_corporate_city_sypin?: string;\r\n syen_corporate_state_sypin?: string;\r\n syen_corporate_contact_person_user?: any;\r\n syen_corporate_phone?: string;\r\n syen_corporate_phone_alt?: string;\r\n syen_corporate_fax?: string;\r\n syen_corporate_email?: string;\r\n syen_corporate_email_alt?: string;\r\n syen_website?: string;\r\n syen_currency_sycr?: string;\r\n syen_registered_address?: string;\r\n syen_registered_pin_sypin?: string;\r\n syen_registered_city_sypin?: string;\r\n syen_registered_state_sypin?: string;\r\n syen_registered_contact_person_user?: any;\r\n syen_registered_phone?: string;\r\n syen_registered_fax?: string;\r\n syen_registered_email?: string;\r\n syen_udise_no?: string;\r\n syen_affiliation_no?: string;\r\n syen_isactive?: boolean;\r\n __v?: number;\r\n };\r\n acacpm_isactive?: boolean;\r\n __v?: number;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-academics-program-class-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: './program-class-list.component.html'\r\n})\r\nexport class ProgramClassListComponent implements OnInit {\r\n // Dependency injection\r\n private destroyRef = inject(DestroyRef);\r\n private router = inject(Router);\r\n private appState = inject(AppStateHelperService);\r\n private notificationService = inject(NotificationService);\r\n private confirmationService = inject(ConfirmationService);\r\n private programClassService = inject(CideLytProgramClassService);\r\n\r\n // Modern ViewChild signals for template renderers (Angular 20 approach)\r\n programClassDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('programClassDetailsRendererTemplate');\r\n programClassStatusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('programClassStatusRendererTemplate');\r\n classProgramRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('classProgramRendererTemplate');\r\n academicYearRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('academicYearRendererTemplate');\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 programClassDetailsRenderer: this.programClassDetailsRendererTemplate(),\r\n programClassStatusRenderer: this.programClassStatusRendererTemplate(),\r\n classProgramRenderer: this.classProgramRendererTemplate(),\r\n academicYearRenderer: this.academicYearRendererTemplate(),\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 programClasses = signal<ProgramClass[]>([]);\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n selectedItems = signal<string[]>([]);\r\n searchTerm = signal('');\r\n\r\n // Derived list filtered by searchTerm\r\n filteredProgramClasses = computed(() => {\r\n const q = (this.searchTerm() || '').toLowerCase().trim();\r\n const items = this.programClasses() || [];\r\n if (!q) return items;\r\n return items.filter(pc => {\r\n const title = (pc.acacpm_alise_title || '').toLowerCase();\r\n const classProgramTitle = (pc.acacpm_class_program_id_sygms?.sygms_title || '').toLowerCase();\r\n const academicYearName = (pc.acacpm_academic_year_id_acayr?.acayr_name || '').toLowerCase();\r\n const entityName = (pc.acacpm_entity_id_syen?.syen_name || '').toLowerCase();\r\n return title.includes(q) || classProgramTitle.includes(q) || academicYearName.includes(q) || entityName.includes(q);\r\n });\r\n });\r\n\r\n // Grid configuration signal\r\n gridConfig = signal<GridConfiguration<ProgramClass>>({\r\n id: 'program-class-list-grid',\r\n columns: [\r\n {\r\n key: 'details',\r\n header: 'Program Class Details',\r\n type: 'custom',\r\n width: 'auto',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'programClassDetailsRenderer'\r\n },\r\n {\r\n key: 'acacpm_class_program_id_sygms',\r\n header: 'Class Program',\r\n type: 'custom',\r\n width: '200px',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'classProgramRenderer'\r\n },\r\n {\r\n key: 'acacpm_academic_year_id_acayr',\r\n header: 'Academic Year',\r\n type: 'custom',\r\n width: '180px',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'academicYearRenderer'\r\n },\r\n {\r\n key: 'acacpm_isactive',\r\n header: 'Status',\r\n type: 'custom',\r\n width: '120px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'programClassStatusRenderer'\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 program classes...',\r\n searchableColumns: ['acacpm_alise_title'],\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(programClass: ProgramClass): 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 Program Class',\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: 'branch',\r\n label: 'Manage Branches',\r\n icon: 'account_tree',\r\n iconColor: 'tw-text-purple-400',\r\n textColor: 'tw-text-purple-700'\r\n },\r\n {\r\n id: 'toggleStatus',\r\n label: programClass?.acacpm_isactive ? 'Deactivate' : 'Activate',\r\n icon: programClass?.acacpm_isactive ? 'toggle_off' : 'toggle_on',\r\n iconColor: programClass?.acacpm_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',\r\n textColor: programClass?.acacpm_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, programClass: ProgramClass): void {\r\n console.log('🔍 onDropdownItemClick called with:', { item, programClass });\r\n \r\n if (!item || !item.id) {\r\n console.error('Dropdown item is undefined:', item);\r\n return;\r\n }\r\n \r\n if (!programClass) {\r\n console.error('Program class is undefined:', programClass);\r\n this.notificationService.error('Unable to perform action: Invalid data');\r\n return;\r\n }\r\n\r\n switch (item.id) {\r\n case 'view':\r\n this.viewProgramClass(programClass);\r\n break;\r\n case 'edit':\r\n this.editProgramClass(programClass);\r\n break;\r\n case 'branch':\r\n this.manageBranches(programClass);\r\n break;\r\n case 'toggleStatus':\r\n this.toggleProgramClassStatus(programClass);\r\n break;\r\n case 'delete':\r\n this.deleteProgramClass(programClass);\r\n break;\r\n default:\r\n console.warn('Unknown dropdown action:', item.id);\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadProgramClasses();\r\n }\r\n\r\n /**\r\n * Load program classes data\r\n */\r\n private loadProgramClasses(): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n const payload: MClassProgramMaster = {\r\n pageIndex: 0,\r\n pageSize: 100,\r\n query: this.searchTerm() || \"\",\r\n sort: {\r\n key: 'acacpm_alise_title',\r\n order: 'asc'\r\n }\r\n };\r\n\r\n this.programClassService.getProgramClassList(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('📚 Program classes loaded:', response.data);\r\n this.programClasses.set(response.data);\r\n this.updateGridData();\r\n this.notificationService.success(`Loaded ${response.data.length} program class(es) successfully.`);\r\n } else {\r\n console.warn('⚠️ No program class data received');\r\n this.programClasses.set([]);\r\n this.updateGridData();\r\n this.notificationService.warning('No program classes found.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error loading program classes:', error);\r\n this.error.set('Failed to load program classes');\r\n this.loading.set(false);\r\n this.notificationService.error('Failed to load program classes');\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.filteredProgramClasses()\r\n }));\r\n }\r\n\r\n /**\r\n * Handle grid events\r\n */\r\n onGridEvent(event: GridEvent<ProgramClass>): 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.loadProgramClasses();\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.loadProgramClasses();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Create new program class\r\n */\r\n createProgramClass(): void {\r\n this.router.navigate(['/control-panel/program-class-management/create']);\r\n }\r\n\r\n /**\r\n * View program class details\r\n */\r\n viewProgramClass(programClass: ProgramClass): void {\r\n if (!programClass || !programClass._id) {\r\n console.error('Program class or ID is undefined:', programClass);\r\n this.notificationService.error('Unable to view program class: Invalid data');\r\n return;\r\n }\r\n console.log('👁️ Viewing program class:', programClass);\r\n this.notificationService.info(`Opening program class \"${programClass.acacpm_alise_title}\" for viewing.`);\r\n const queryParams = generateStringFromObject({ acacpm_id: programClass._id });\r\n this.router.navigate(['/control-panel/program-class-management/view', queryParams]);\r\n }\r\n\r\n /**\r\n * Edit program class\r\n */\r\n editProgramClass(programClass: ProgramClass): void {\r\n if (!programClass || !programClass._id) {\r\n console.error('Program class or ID is undefined:', programClass);\r\n this.notificationService.error('Unable to edit program class: Invalid data');\r\n return;\r\n }\r\n console.log('✏️ Editing program class:', programClass);\r\n this.notificationService.info(`Opening program class \"${programClass.acacpm_alise_title}\" for editing.`);\r\n const queryParams = generateStringFromObject({ acacpm_id: programClass._id });\r\n this.router.navigate(['/control-panel/program-class-management/edit', queryParams]);\r\n }\r\n\r\n /**\r\n * Manage branches for program class\r\n */\r\n manageBranches(programClass: ProgramClass): void {\r\n if (!programClass || !programClass._id) {\r\n console.error('Program class or ID is undefined:', programClass);\r\n this.notificationService.error('Unable to manage branches: Invalid data');\r\n return;\r\n }\r\n console.log('🌿 Managing branches for program class:', programClass);\r\n this.notificationService.info(`Opening branch management for \"${programClass.acacpm_alise_title}\".`);\r\n const queryParams = generateStringFromObject({ programId: programClass._id });\r\n this.router.navigate(['/control-panel/program_specialization', queryParams]);\r\n }\r\n\r\n /**\r\n * Delete program class\r\n */\r\n deleteProgramClass(programClass: ProgramClass): void {\r\n if (!programClass || !programClass._id) {\r\n console.error('Program class or ID is undefined:', programClass);\r\n this.notificationService.error('Unable to delete program class: Invalid data');\r\n return;\r\n }\r\n this.confirmationService.confirmDelete(programClass.acacpm_alise_title).then((confirmed: boolean) => {\r\n if (confirmed) {\r\n this.loading.set(true);\r\n const payload: MClassProgramMasterDeletePayload = {\r\n acacpm_id: programClass._id!\r\n };\r\n\r\n this.programClassService.deleteProgramClass(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.programClasses.update(classes => \r\n classes.filter(pc => pc._id !== programClass._id)\r\n );\r\n this.updateGridData();\r\n this.notificationService.success('Program class deleted successfully.');\r\n } else {\r\n this.notificationService.error('Failed to delete program class.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error deleting program class:', error);\r\n this.notificationService.error('Failed to delete program class.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Toggle program class status\r\n */\r\n toggleProgramClassStatus(programClass: ProgramClass): void {\r\n if (!programClass || !programClass._id) {\r\n console.error('Program class or ID is undefined:', programClass);\r\n this.notificationService.error('Unable to toggle program class status: Invalid data');\r\n return;\r\n }\r\n this.loading.set(true);\r\n const payload: MClassProgramMasterToggleStatusPayload = {\r\n acacpm_id: programClass._id!\r\n };\r\n\r\n this.programClassService.toggleProgramClassStatus(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.programClasses.update(classes => \r\n classes.map(pc => \r\n pc._id === programClass._id \r\n ? { ...pc, acacpm_isactive: !pc.acacpm_isactive }\r\n : pc\r\n )\r\n );\r\n this.updateGridData();\r\n this.notificationService.success(`Program class ${programClass.acacpm_isactive ? 'deactivated' : 'activated'} successfully.`);\r\n } else {\r\n this.notificationService.error('Failed to toggle program class status.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error toggling program class status:', error);\r\n this.notificationService.error('Failed to toggle program class 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.loadProgramClasses();\r\n }\r\n}\r\n","<!-- Program Class 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-purple-600 tw-w-5 tw-h-5\">school</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Program Class 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)=\"createProgramClass()\">\r\n Create Program Class\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 #programClassDetailsRendererTemplate let-value=\"value\" let-row=\"row\" 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-purple-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-5 tw-h-5\">school</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 {{ row?.acacpm_alise_title }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ row?.acacpm_class_program_id_sygms?.sygms_title }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #programClassStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': row?.acacpm_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !row?.acacpm_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': row?.acacpm_isactive,\r\n 'tw-text-red-600': !row?.acacpm_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-2\">\r\n {{ row?.acacpm_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ row?.acacpm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\r\n {{ row?.acacpm_class_program_id_sygms?.sygms_title || 'N/A' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #academicYearRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-green-600 tw-w-4 tw-h-4\">calendar_today</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\r\n {{ row?.acacpm_academic_year_id_acayr?.acayr_name || 'N/A' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(row)\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\"\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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"}
|