cloud-ide-academics 0.0.21 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/fesm2022/{cloud-ide-academics-class-program-term-create.component--_32xUHz.mjs → cloud-ide-academics-class-program-term-create.component-C5FnRTND.mjs} +43 -6
  2. package/fesm2022/cloud-ide-academics-class-program-term-create.component-C5FnRTND.mjs.map +1 -0
  3. package/fesm2022/cloud-ide-academics-class-program-term-list.component-BaFtTKcS.mjs +639 -0
  4. package/fesm2022/cloud-ide-academics-class-program-term-list.component-BaFtTKcS.mjs.map +1 -0
  5. package/fesm2022/{cloud-ide-academics-cloud-ide-academics-COFzfbQg.mjs → cloud-ide-academics-cloud-ide-academics-DxRzuyxa.mjs} +30 -20
  6. package/fesm2022/cloud-ide-academics-cloud-ide-academics-DxRzuyxa.mjs.map +1 -0
  7. package/fesm2022/{cloud-ide-academics-program-class-create.component-DZGdqzE7.mjs → cloud-ide-academics-program-class-create.component-Co60CYKC.mjs} +40 -5
  8. package/fesm2022/cloud-ide-academics-program-class-create.component-Co60CYKC.mjs.map +1 -0
  9. package/fesm2022/{cloud-ide-academics-program-class-list.component-DPUjW-UV.mjs → cloud-ide-academics-program-class-list.component-jPpK9V-X.mjs} +11 -9
  10. package/fesm2022/cloud-ide-academics-program-class-list.component-jPpK9V-X.mjs.map +1 -0
  11. package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dx9JQOwW.mjs +214 -0
  12. package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dx9JQOwW.mjs.map +1 -0
  13. package/fesm2022/{cloud-ide-academics-program-term-section-list.component-Q2nO1n4a.mjs → cloud-ide-academics-program-term-section-list.component-Dshnvq8K.mjs} +22 -5
  14. package/fesm2022/cloud-ide-academics-program-term-section-list.component-Dshnvq8K.mjs.map +1 -0
  15. package/fesm2022/cloud-ide-academics.mjs +1 -1
  16. package/package.json +1 -1
  17. package/fesm2022/cloud-ide-academics-class-program-term-create.component--_32xUHz.mjs.map +0 -1
  18. package/fesm2022/cloud-ide-academics-class-program-term-list.component-CaWAHMHN.mjs +0 -404
  19. package/fesm2022/cloud-ide-academics-class-program-term-list.component-CaWAHMHN.mjs.map +0 -1
  20. package/fesm2022/cloud-ide-academics-cloud-ide-academics-COFzfbQg.mjs.map +0 -1
  21. package/fesm2022/cloud-ide-academics-program-class-create.component-DZGdqzE7.mjs.map +0 -1
  22. package/fesm2022/cloud-ide-academics-program-class-list.component-DPUjW-UV.mjs.map +0 -1
  23. package/fesm2022/cloud-ide-academics-program-term-section-create.component-DQH-DeS0.mjs +0 -211
  24. package/fesm2022/cloud-ide-academics-program-term-section-create.component-DQH-DeS0.mjs.map +0 -1
  25. package/fesm2022/cloud-ide-academics-program-term-section-list.component-Q2nO1n4a.mjs.map +0 -1
@@ -0,0 +1,639 @@
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 * as i1$1 from '@angular/forms';
6
+ import { FormsModule } from '@angular/forms';
7
+ import { Router, ActivatedRoute } from '@angular/router';
8
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
+ import { NotificationService, ConfirmationService, CideEleDataGridComponent, CideIconComponent, CideEleButtonComponent, CideEleDropdownComponent, CideSelectComponent } from 'cloud-ide-element';
10
+ import { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
11
+ import { AcaClassPrgBranchListPayload, MClassProgramTerm, generateObjectFromString } from 'cloud-ide-lms-model';
12
+ import { C as CideLytClassProgramTermService } from './cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs';
13
+ import { CLASS_PROGRAM_MASTER_SERVICE_TOKEN } from 'cloud-ide-shared';
14
+ import { b as CideLytClassProgramBranchService } from './cloud-ide-academics-cloud-ide-academics-DxRzuyxa.mjs';
15
+
16
+ class ClassProgramTermListComponent {
17
+ // Dependency injection
18
+ destroyRef = inject(DestroyRef);
19
+ router = inject(Router);
20
+ route = inject(ActivatedRoute);
21
+ appState = inject(AppStateHelperService);
22
+ notificationService = inject(NotificationService);
23
+ confirmationService = inject(ConfirmationService);
24
+ classProgramTermService = inject(CideLytClassProgramTermService);
25
+ classProgramMasterService = inject(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);
26
+ classProgramBranchService = inject(CideLytClassProgramBranchService);
27
+ // Modern ViewChild signals for template renderers (Angular 20 approach)
28
+ classProgramTermDetailsRendererTemplate = viewChild.required('classProgramTermDetailsRendererTemplate');
29
+ classProgramTermStatusRendererTemplate = viewChild.required('classProgramTermStatusRendererTemplate');
30
+ actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
31
+ // Computed template renderers for grid
32
+ templateRenderers = computed(() => ({
33
+ classProgramTermDetailsRenderer: this.classProgramTermDetailsRendererTemplate(),
34
+ classProgramTermStatusRenderer: this.classProgramTermStatusRendererTemplate(),
35
+ actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
36
+ }), ...(ngDevMode ? [{ debugName: "templateRenderers" }] : []));
37
+ // Make Math available in template
38
+ Math = Math;
39
+ // Signals for reactive state management
40
+ classProgramTerms = signal([], ...(ngDevMode ? [{ debugName: "classProgramTerms" }] : []));
41
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
42
+ error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
43
+ selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
44
+ searchTerm = signal('', ...(ngDevMode ? [{ debugName: "searchTerm" }] : []));
45
+ acabrnId = signal(null, ...(ngDevMode ? [{ debugName: "acabrnId" }] : []));
46
+ acacpmId = signal(null, ...(ngDevMode ? [{ debugName: "acacpmId" }] : []));
47
+ // Class program and branch dropdown signals
48
+ classProgramMasters = signal([], ...(ngDevMode ? [{ debugName: "classProgramMasters" }] : []));
49
+ classProgramMastersLoading = signal(false, ...(ngDevMode ? [{ debugName: "classProgramMastersLoading" }] : []));
50
+ selectedClassProgram = signal(null, ...(ngDevMode ? [{ debugName: "selectedClassProgram" }] : []));
51
+ classProgramBranches = signal([], ...(ngDevMode ? [{ debugName: "classProgramBranches" }] : []));
52
+ classProgramBranchesLoading = signal(false, ...(ngDevMode ? [{ debugName: "classProgramBranchesLoading" }] : []));
53
+ selectedProgramClassId = signal(null, ...(ngDevMode ? [{ debugName: "selectedProgramClassId" }] : []));
54
+ selectedBranchId = signal(null, ...(ngDevMode ? [{ debugName: "selectedBranchId" }] : []));
55
+ // Program term dropdown signals
56
+ classProgramTermsForDropdown = signal([], ...(ngDevMode ? [{ debugName: "classProgramTermsForDropdown" }] : []));
57
+ classProgramTermsLoadingForDropdown = signal(false, ...(ngDevMode ? [{ debugName: "classProgramTermsLoadingForDropdown" }] : []));
58
+ selectedTermId = signal(null, ...(ngDevMode ? [{ debugName: "selectedTermId" }] : []));
59
+ // Signal for breadcrumb data that will be passed to shared wrapper
60
+ breadcrumbData = signal([], ...(ngDevMode ? [{ debugName: "breadcrumbData" }] : []));
61
+ // Computed signals for dropdown options
62
+ classProgramMastersOptions = computed(() => this.classProgramMasters(), ...(ngDevMode ? [{ debugName: "classProgramMastersOptions" }] : []));
63
+ classProgramTermsOptions = computed(() => this.classProgramTermsForDropdown(), ...(ngDevMode ? [{ debugName: "classProgramTermsOptions" }] : []));
64
+ // Computed signal to check if branch dropdown should be shown
65
+ showBranchDropdown = computed(() => {
66
+ const selectedProgram = this.selectedClassProgram();
67
+ if (!selectedProgram)
68
+ return false;
69
+ const generalMaster = selectedProgram.acacpm_class_program_id_sygms;
70
+ if (!generalMaster || typeof generalMaster !== 'object')
71
+ return false;
72
+ let config;
73
+ if ('sygms_configuration' in generalMaster) {
74
+ const configValue = generalMaster.sygms_configuration;
75
+ if (typeof configValue === 'string') {
76
+ try {
77
+ config = JSON.parse(configValue);
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ else if (typeof configValue === 'object' && configValue !== null) {
84
+ config = configValue;
85
+ }
86
+ }
87
+ return config?.branchType === true;
88
+ }, ...(ngDevMode ? [{ debugName: "showBranchDropdown" }] : []));
89
+ // Derived list filtered by searchTerm
90
+ filteredClassProgramTerms = computed(() => {
91
+ const q = (this.searchTerm() || '').toLowerCase().trim();
92
+ const items = this.classProgramTerms() || [];
93
+ if (!q)
94
+ return items;
95
+ return items.filter(cpt => {
96
+ const name = (cpt.acapt_name || '').toLowerCase();
97
+ const code = (cpt.acapt_code || '').toLowerCase();
98
+ const description = (cpt.acapt_description || '').toLowerCase();
99
+ return name.includes(q) || code.includes(q) || description.includes(q);
100
+ });
101
+ }, ...(ngDevMode ? [{ debugName: "filteredClassProgramTerms" }] : []));
102
+ // Grid configuration signal
103
+ gridConfig = signal({
104
+ id: 'class-program-term-list-grid',
105
+ columns: [
106
+ {
107
+ key: 'details',
108
+ header: 'Term Details',
109
+ type: 'custom',
110
+ width: 'auto',
111
+ truncate: true,
112
+ align: 'left',
113
+ renderer: 'classProgramTermDetailsRenderer'
114
+ },
115
+ {
116
+ key: 'acapt_code',
117
+ header: 'Code',
118
+ type: 'text',
119
+ width: '120px',
120
+ truncate: true,
121
+ align: 'left'
122
+ },
123
+ {
124
+ key: 'acapt_class_program_id_acacpm',
125
+ header: 'Program Class',
126
+ type: 'custom',
127
+ width: '200px',
128
+ truncate: true,
129
+ align: 'left',
130
+ renderer: 'programClassRenderer'
131
+ },
132
+ {
133
+ key: 'acapt_parent_class_prog_term_acapt',
134
+ header: 'Parent Term',
135
+ type: 'custom',
136
+ width: '180px',
137
+ truncate: true,
138
+ align: 'left',
139
+ renderer: 'parentTermRenderer'
140
+ },
141
+ {
142
+ key: 'acapt_isactive',
143
+ header: 'Status',
144
+ type: 'custom',
145
+ width: '120px',
146
+ truncate: false,
147
+ align: 'center',
148
+ renderer: 'classProgramTermStatusRenderer'
149
+ },
150
+ {
151
+ key: 'actions',
152
+ header: '',
153
+ type: 'custom',
154
+ width: '150px',
155
+ truncate: false,
156
+ align: 'center',
157
+ renderer: 'actionsDropdownRenderer'
158
+ }
159
+ ],
160
+ data: [],
161
+ trackBy: '_id',
162
+ pagination: {
163
+ enabled: true,
164
+ pageSize: 10,
165
+ pageSizeOptions: [10, 25, 50, 100],
166
+ showQuickJump: true,
167
+ showPageInfo: true,
168
+ showRefresh: true
169
+ },
170
+ search: {
171
+ enabled: true,
172
+ placeholder: 'Search class program terms...',
173
+ searchableColumns: ['acapt_name', 'acapt_code', 'acapt_description'],
174
+ debounceMs: 300
175
+ },
176
+ loading: {
177
+ useDefer: true,
178
+ skeletonRows: 5,
179
+ showOverlay: false
180
+ },
181
+ scroll: {
182
+ enabled: true,
183
+ stickyHeader: true,
184
+ virtualScroll: false,
185
+ rowHeight: 50
186
+ },
187
+ fullHeight: true,
188
+ responsive: true,
189
+ striped: false,
190
+ bordered: true,
191
+ compact: false,
192
+ tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
193
+ }, ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
194
+ /**
195
+ * Get action dropdown items
196
+ */
197
+ getActionDropdownItems(classProgramTerm) {
198
+ const items = [
199
+ {
200
+ id: 'view',
201
+ label: 'View Details',
202
+ icon: 'visibility',
203
+ iconColor: 'tw-text-gray-400',
204
+ textColor: 'tw-text-gray-700'
205
+ },
206
+ {
207
+ id: 'edit',
208
+ label: 'Edit Term',
209
+ icon: 'edit',
210
+ iconColor: 'tw-text-blue-400',
211
+ textColor: 'tw-text-blue-700'
212
+ },
213
+ {
214
+ id: 'toggleStatus',
215
+ label: classProgramTerm.acapt_isactive ? 'Deactivate' : 'Activate',
216
+ icon: classProgramTerm.acapt_isactive ? 'toggle_off' : 'toggle_on',
217
+ iconColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',
218
+ textColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-700' : 'tw-text-green-700'
219
+ },
220
+ {
221
+ id: 'delete',
222
+ label: 'Delete',
223
+ icon: 'delete',
224
+ iconColor: 'tw-text-red-400',
225
+ textColor: 'tw-text-red-700'
226
+ }
227
+ ];
228
+ return items;
229
+ }
230
+ /**
231
+ * Handle dropdown item click
232
+ */
233
+ onDropdownItemClick(item, classProgramTerm) {
234
+ switch (item.id) {
235
+ case 'view':
236
+ this.viewClassProgramTerm(classProgramTerm);
237
+ break;
238
+ case 'edit':
239
+ this.editClassProgramTerm(classProgramTerm);
240
+ break;
241
+ case 'toggleStatus':
242
+ this.toggleClassProgramTermStatus(classProgramTerm);
243
+ break;
244
+ case 'delete':
245
+ this.deleteClassProgramTerm(classProgramTerm);
246
+ break;
247
+ }
248
+ }
249
+ ngOnInit() {
250
+ this.initializeBreadcrumbData();
251
+ this.checkRouteParams();
252
+ this.loadClassProgramMasters();
253
+ this.loadClassProgramTerms();
254
+ }
255
+ /**
256
+ * Initialize breadcrumb data for list view
257
+ */
258
+ initializeBreadcrumbData() {
259
+ this.breadcrumbData.set([
260
+ {
261
+ id: 'list',
262
+ label: 'List',
263
+ icon: 'list',
264
+ url: undefined
265
+ }
266
+ ]);
267
+ }
268
+ /**
269
+ * Load class program masters for dropdown
270
+ */
271
+ loadClassProgramMasters() {
272
+ this.classProgramMastersLoading.set(true);
273
+ const payload = {
274
+ pagination: false,
275
+ acacpm_isactive: true
276
+ };
277
+ this.classProgramMasterService.getClassProgramMasterList(payload)
278
+ .pipe(takeUntilDestroyed(this.destroyRef))
279
+ .subscribe({
280
+ next: (response) => {
281
+ if (response?.success && response.data) {
282
+ this.classProgramMasters.set(response.data);
283
+ }
284
+ else {
285
+ this.classProgramMasters.set([]);
286
+ }
287
+ this.classProgramMastersLoading.set(false);
288
+ },
289
+ error: (error) => {
290
+ console.error('❌ Error loading class program masters:', error);
291
+ this.classProgramMasters.set([]);
292
+ this.classProgramMastersLoading.set(false);
293
+ }
294
+ });
295
+ }
296
+ /**
297
+ * Handle class program selection change
298
+ */
299
+ onClassProgramChange(programClassId) {
300
+ const programId = typeof programClassId === 'string' ? programClassId : (programClassId ? String(programClassId) : null);
301
+ console.log('🔄 Class Program changed:', programId);
302
+ this.selectedProgramClassId.set(programId);
303
+ this.acacpmId.set(programId);
304
+ if (programId) {
305
+ const selectedProgram = this.classProgramMasters().find(p => p._id === programId);
306
+ this.selectedClassProgram.set(selectedProgram || null);
307
+ // Load branches if branchType is configured
308
+ if (this.showBranchDropdown()) {
309
+ this.loadClassProgramBranches(programId);
310
+ }
311
+ else {
312
+ this.classProgramBranches.set([]);
313
+ this.selectedBranchId.set(null);
314
+ this.acabrnId.set(null);
315
+ // Load program terms directly if no branch dropdown
316
+ this.loadClassProgramTermsForDropdown(programId);
317
+ }
318
+ }
319
+ else {
320
+ this.selectedClassProgram.set(null);
321
+ this.classProgramBranches.set([]);
322
+ this.selectedBranchId.set(null);
323
+ this.acabrnId.set(null);
324
+ this.classProgramTermsForDropdown.set([]);
325
+ this.selectedTermId.set(null);
326
+ }
327
+ this.loadClassProgramTerms();
328
+ }
329
+ /**
330
+ * Load class program branches
331
+ */
332
+ loadClassProgramBranches(classProgramId) {
333
+ this.classProgramBranchesLoading.set(true);
334
+ const payload = new AcaClassPrgBranchListPayload({
335
+ acabrn_class_program_id_acacpm: classProgramId,
336
+ pagination: false
337
+ });
338
+ this.classProgramBranchService.getClassProgramBranchList(payload)
339
+ .pipe(takeUntilDestroyed(this.destroyRef))
340
+ .subscribe({
341
+ next: (response) => {
342
+ if (response?.success && response.data) {
343
+ this.classProgramBranches.set(response.data);
344
+ // Load program terms for dropdown when branches are loaded
345
+ if (this.selectedProgramClassId()) {
346
+ // Will be triggered when user selects a branch
347
+ }
348
+ }
349
+ else {
350
+ this.classProgramBranches.set([]);
351
+ }
352
+ this.classProgramBranchesLoading.set(false);
353
+ },
354
+ error: (error) => {
355
+ console.error('❌ Error loading class program branches:', error);
356
+ this.classProgramBranches.set([]);
357
+ this.classProgramBranchesLoading.set(false);
358
+ }
359
+ });
360
+ }
361
+ /**
362
+ * Handle branch selection change
363
+ */
364
+ onBranchChange(branchId) {
365
+ const branch = typeof branchId === 'string' ? branchId : (branchId ? String(branchId) : null);
366
+ console.log('🔄 Branch changed:', branch);
367
+ this.selectedBranchId.set(branch);
368
+ this.acabrnId.set(branch);
369
+ // Load program terms for dropdown when branch changes
370
+ if (branch && this.selectedProgramClassId()) {
371
+ this.loadClassProgramTermsForDropdown(this.selectedProgramClassId(), branch);
372
+ }
373
+ else {
374
+ this.classProgramTermsForDropdown.set([]);
375
+ this.selectedTermId.set(null);
376
+ }
377
+ this.loadClassProgramTerms();
378
+ }
379
+ /**
380
+ * Load class program terms for dropdown (filtered by class program and branch)
381
+ */
382
+ loadClassProgramTermsForDropdown(classProgramId, branchId) {
383
+ this.classProgramTermsLoadingForDropdown.set(true);
384
+ const payload = new MClassProgramTerm({
385
+ pageIndex: 0,
386
+ pageSize: 1000,
387
+ query: "",
388
+ sort: {
389
+ key: 'acapt_name',
390
+ order: 'asc'
391
+ },
392
+ acapt_class_prg_branch_acabrn: branchId || "",
393
+ });
394
+ this.classProgramTermService.getClassProgramTermList(payload)
395
+ .pipe(takeUntilDestroyed(this.destroyRef))
396
+ .subscribe({
397
+ next: (response) => {
398
+ if (response?.success && response.data) {
399
+ // Filter by class program ID if provided
400
+ let terms = response.data;
401
+ if (classProgramId) {
402
+ terms = terms.filter(term => term.acapt_class_program_id_acacpm?._id === classProgramId ||
403
+ (typeof term.acapt_class_program_id_acacpm === 'string' && term.acapt_class_program_id_acacpm === classProgramId));
404
+ }
405
+ this.classProgramTermsForDropdown.set(terms);
406
+ }
407
+ else {
408
+ this.classProgramTermsForDropdown.set([]);
409
+ }
410
+ this.classProgramTermsLoadingForDropdown.set(false);
411
+ },
412
+ error: (error) => {
413
+ console.error('❌ Error loading class program terms for dropdown:', error);
414
+ this.classProgramTermsForDropdown.set([]);
415
+ this.classProgramTermsLoadingForDropdown.set(false);
416
+ }
417
+ });
418
+ }
419
+ /**
420
+ * Handle program term selection change
421
+ */
422
+ onTermChange(termId) {
423
+ const term = typeof termId === 'string' ? termId : (termId ? String(termId) : null);
424
+ console.log('🔄 Program Term changed:', term);
425
+ this.selectedTermId.set(term);
426
+ // Filter the main list by selected term if needed
427
+ // For now, we'll just store the selection
428
+ }
429
+ /**
430
+ * Handle class program master search
431
+ */
432
+ onClassProgramMasterSearch(event) {
433
+ // Trigger loading if needed
434
+ if (event && event.query) {
435
+ // Could implement search functionality here if needed
436
+ }
437
+ }
438
+ /**
439
+ * Check route parameters for acabrn_id and acacpm_id
440
+ */
441
+ checkRouteParams() {
442
+ this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
443
+ const queryParams = params['query'];
444
+ console.log('🏢 Route params:', params, 'queryParams:', queryParams);
445
+ if (queryParams) {
446
+ // Query parameters passed (following page-controls pattern)
447
+ const queryData = generateObjectFromString(queryParams);
448
+ console.log('🏢 Class Program Term params from route:', queryData);
449
+ if (queryData?.acabrn_id) {
450
+ this.acabrnId.set(queryData.acabrn_id);
451
+ console.log('🏢 Branch ID from route:', queryData.acabrn_id);
452
+ }
453
+ if (queryData?.acacpm_id) {
454
+ this.acacpmId.set(queryData.acacpm_id);
455
+ console.log('🏢 Class Program ID from route:', queryData.acacpm_id);
456
+ }
457
+ }
458
+ });
459
+ }
460
+ /**
461
+ * Load class program terms data
462
+ */
463
+ loadClassProgramTerms() {
464
+ this.loading.set(true);
465
+ this.error.set(null);
466
+ // Add filter parameters if available
467
+ const acabrnId = this.acabrnId();
468
+ const acacpmId = this.acacpmId();
469
+ const payload = new MClassProgramTerm({
470
+ pageIndex: 0,
471
+ pageSize: 100,
472
+ query: this.searchTerm() || "",
473
+ sort: {
474
+ key: 'acapt_name',
475
+ order: 'asc'
476
+ },
477
+ acapt_class_prg_branch_acabrn: acabrnId || "",
478
+ });
479
+ this.classProgramTermService.getClassProgramTermList(payload)
480
+ .pipe(takeUntilDestroyed(this.destroyRef))
481
+ .subscribe({
482
+ next: (response) => {
483
+ if (response?.success && response.data) {
484
+ console.log('📚 Class program terms loaded:', response.data);
485
+ this.classProgramTerms.set(response.data);
486
+ this.updateGridData();
487
+ this.notificationService.success(`Loaded ${response.data.length} class program term(s) successfully.`);
488
+ }
489
+ else {
490
+ console.warn('⚠️ No class program term data received');
491
+ this.classProgramTerms.set([]);
492
+ this.updateGridData();
493
+ this.notificationService.warning('No class program terms found.');
494
+ }
495
+ this.loading.set(false);
496
+ },
497
+ error: (error) => {
498
+ console.error('❌ Error loading class program terms:', error);
499
+ this.error.set('Failed to load class program terms');
500
+ this.loading.set(false);
501
+ this.notificationService.error('Failed to load class program terms');
502
+ }
503
+ });
504
+ }
505
+ /**
506
+ * Update grid data
507
+ */
508
+ updateGridData() {
509
+ this.gridConfig.update(config => ({
510
+ ...config,
511
+ data: this.filteredClassProgramTerms()
512
+ }));
513
+ }
514
+ /**
515
+ * Handle grid events
516
+ */
517
+ onGridEvent(event) {
518
+ switch (event.type) {
519
+ case 'pageChange':
520
+ if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
521
+ this.loadClassProgramTerms();
522
+ }
523
+ break;
524
+ case 'search':
525
+ this.searchTerm.set(event.data);
526
+ this.updateGridData();
527
+ break;
528
+ case 'refresh':
529
+ this.loadClassProgramTerms();
530
+ break;
531
+ }
532
+ }
533
+ /**
534
+ * Create new class program term
535
+ */
536
+ createClassProgramTerm() {
537
+ this.router.navigate(['/control-panel/program-term-management/create']);
538
+ }
539
+ /**
540
+ * View class program term details
541
+ */
542
+ viewClassProgramTerm(classProgramTerm) {
543
+ this.router.navigate(['/control-panel/class-program-term/view', classProgramTerm._id]);
544
+ }
545
+ /**
546
+ * Edit class program term
547
+ */
548
+ editClassProgramTerm(classProgramTerm) {
549
+ this.router.navigate(['/control-panel/class-program-term/edit', classProgramTerm._id]);
550
+ }
551
+ /**
552
+ * Delete class program term
553
+ */
554
+ deleteClassProgramTerm(classProgramTerm) {
555
+ this.confirmationService.confirmDelete(classProgramTerm.acapt_name).then((confirmed) => {
556
+ if (confirmed) {
557
+ this.loading.set(true);
558
+ const payload = {
559
+ acapt_id: classProgramTerm._id
560
+ };
561
+ this.classProgramTermService.deleteClassProgramTerm(payload)
562
+ .pipe(takeUntilDestroyed(this.destroyRef))
563
+ .subscribe({
564
+ next: (response) => {
565
+ if (response?.success) {
566
+ this.classProgramTerms.update(terms => terms.filter(cpt => cpt._id !== classProgramTerm._id));
567
+ this.updateGridData();
568
+ this.notificationService.success('Class program term deleted successfully.');
569
+ }
570
+ else {
571
+ this.notificationService.error('Failed to delete class program term.');
572
+ }
573
+ this.loading.set(false);
574
+ },
575
+ error: (error) => {
576
+ console.error('❌ Error deleting class program term:', error);
577
+ this.notificationService.error('Failed to delete class program term.');
578
+ this.loading.set(false);
579
+ }
580
+ });
581
+ }
582
+ });
583
+ }
584
+ /**
585
+ * Toggle class program term status
586
+ */
587
+ toggleClassProgramTermStatus(classProgramTerm) {
588
+ this.loading.set(true);
589
+ const payload = {
590
+ acapt_id: classProgramTerm._id
591
+ };
592
+ this.classProgramTermService.toggleClassProgramTermStatus(payload)
593
+ .pipe(takeUntilDestroyed(this.destroyRef))
594
+ .subscribe({
595
+ next: (response) => {
596
+ if (response?.success) {
597
+ this.classProgramTerms.update(terms => terms.map(cpt => cpt._id === classProgramTerm._id
598
+ ? { ...cpt, acapt_isactive: !cpt.acapt_isactive }
599
+ : cpt));
600
+ this.updateGridData();
601
+ this.notificationService.success(`Class program term ${classProgramTerm.acapt_isactive ? 'deactivated' : 'activated'} successfully.`);
602
+ }
603
+ else {
604
+ this.notificationService.error('Failed to toggle class program term status.');
605
+ }
606
+ this.loading.set(false);
607
+ },
608
+ error: (error) => {
609
+ console.error('❌ Error toggling class program term status:', error);
610
+ this.notificationService.error('Failed to toggle class program term status.');
611
+ this.loading.set(false);
612
+ }
613
+ });
614
+ }
615
+ /**
616
+ * Refresh data
617
+ */
618
+ refreshData() {
619
+ this.loadClassProgramTerms();
620
+ }
621
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
622
+ 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<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n \r\n <!-- Action Buttons in Breadcrumb Area -->\r\n <div breadcrumb-actions>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\r\n Create Class Program Term\r\n </button>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\r\n\r\n <!-- Filter Section -->\r\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\r\n <cide-ele-select\r\n [options]=\"classProgramMastersOptions()\"\r\n [ngModel]=\"selectedProgramClassId() || ''\"\r\n (ngModelChange)=\"onClassProgramChange($event)\"\r\n placeholder=\"Select Class Program\"\r\n valueKey=\"_id\"\r\n labelKey=\"acacpm_alise_title\"\r\n [loading]=\"classProgramMastersLoading()\"\r\n [searchable]=\"true\"\r\n (searchChange)=\"onClassProgramMasterSearch($event)\">\r\n </cide-ele-select>\r\n </div>\r\n \r\n @if (showBranchDropdown()) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\r\n <cide-ele-select\r\n [options]=\"classProgramBranches()\"\r\n [ngModel]=\"selectedBranchId() || ''\"\r\n (ngModelChange)=\"onBranchChange($event)\"\r\n placeholder=\"Select Specialization\"\r\n valueKey=\"_id\"\r\n labelKey=\"acabrn_name\"\r\n [loading]=\"classProgramBranchesLoading()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n \r\n @if (selectedProgramClassId() && (!showBranchDropdown() || selectedBranchId())) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Program Term</label>\r\n <cide-ele-select\r\n [options]=\"classProgramTermsOptions()\"\r\n [ngModel]=\"selectedTermId() || ''\"\r\n (ngModelChange)=\"onTermChange($event)\"\r\n placeholder=\"Select Program Term\"\r\n valueKey=\"_id\"\r\n labelKey=\"acapt_name\"\r\n [loading]=\"classProgramTermsLoadingForDropdown()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid Section -->\r\n <div class=\"tw-flex-1 tw-min-h-0 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</cide-lyt-shared-wrapper>\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: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading", "valueKey", "labelKey"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }] });
623
+ }
624
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, decorators: [{
625
+ type: Component,
626
+ args: [{ selector: 'cide-academics-class-program-term-list', standalone: true, imports: [
627
+ CommonModule,
628
+ FormsModule,
629
+ CideEleDataGridComponent,
630
+ CideIconComponent,
631
+ CideEleButtonComponent,
632
+ CideEleDropdownComponent,
633
+ CideSelectComponent,
634
+ CideLytSharedWrapperComponent
635
+ ], template: "<!-- Class Program Term Management Container -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n \r\n <!-- Action Buttons in Breadcrumb Area -->\r\n <div breadcrumb-actions>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\r\n Create Class Program Term\r\n </button>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\r\n\r\n <!-- Filter Section -->\r\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\r\n <cide-ele-select\r\n [options]=\"classProgramMastersOptions()\"\r\n [ngModel]=\"selectedProgramClassId() || ''\"\r\n (ngModelChange)=\"onClassProgramChange($event)\"\r\n placeholder=\"Select Class Program\"\r\n valueKey=\"_id\"\r\n labelKey=\"acacpm_alise_title\"\r\n [loading]=\"classProgramMastersLoading()\"\r\n [searchable]=\"true\"\r\n (searchChange)=\"onClassProgramMasterSearch($event)\">\r\n </cide-ele-select>\r\n </div>\r\n \r\n @if (showBranchDropdown()) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\r\n <cide-ele-select\r\n [options]=\"classProgramBranches()\"\r\n [ngModel]=\"selectedBranchId() || ''\"\r\n (ngModelChange)=\"onBranchChange($event)\"\r\n placeholder=\"Select Specialization\"\r\n valueKey=\"_id\"\r\n labelKey=\"acabrn_name\"\r\n [loading]=\"classProgramBranchesLoading()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n \r\n @if (selectedProgramClassId() && (!showBranchDropdown() || selectedBranchId())) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Program Term</label>\r\n <cide-ele-select\r\n [options]=\"classProgramTermsOptions()\"\r\n [ngModel]=\"selectedTermId() || ''\"\r\n (ngModelChange)=\"onTermChange($event)\"\r\n placeholder=\"Select Program Term\"\r\n valueKey=\"_id\"\r\n labelKey=\"acapt_name\"\r\n [loading]=\"classProgramTermsLoadingForDropdown()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid Section -->\r\n <div class=\"tw-flex-1 tw-min-h-0 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</cide-lyt-shared-wrapper>\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" }]
636
+ }] });
637
+
638
+ export { ClassProgramTermListComponent };
639
+ //# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-BaFtTKcS.mjs.map