cloud-ide-academics 0.0.28 → 0.0.30

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 (26) hide show
  1. package/fesm2022/cloud-ide-academics-class-program-term-create.component-B-7JRpVE.mjs +1196 -0
  2. package/fesm2022/cloud-ide-academics-class-program-term-create.component-B-7JRpVE.mjs.map +1 -0
  3. package/fesm2022/{cloud-ide-academics-class-program-term-list.component-CP2vlRBP.mjs → cloud-ide-academics-class-program-term-list.component-DObKkh-y.mjs} +186 -48
  4. package/fesm2022/cloud-ide-academics-class-program-term-list.component-DObKkh-y.mjs.map +1 -0
  5. package/fesm2022/cloud-ide-academics-cloud-ide-academics-FwQEJSnJ.mjs +6127 -0
  6. package/fesm2022/cloud-ide-academics-cloud-ide-academics-FwQEJSnJ.mjs.map +1 -0
  7. package/fesm2022/{cloud-ide-academics-program-class-create.component-KijRP6Nl.mjs → cloud-ide-academics-program-class-create.component-x0rh1ESo.mjs} +45 -23
  8. package/fesm2022/cloud-ide-academics-program-class-create.component-x0rh1ESo.mjs.map +1 -0
  9. package/fesm2022/{cloud-ide-academics-program-class-list.component-B5cy2Gpk.mjs → cloud-ide-academics-program-class-list.component-CkzH8u8u.mjs} +10 -9
  10. package/fesm2022/cloud-ide-academics-program-class-list.component-CkzH8u8u.mjs.map +1 -0
  11. package/fesm2022/cloud-ide-academics.mjs +1 -1
  12. package/index.d.ts +500 -18
  13. package/package.json +1 -1
  14. package/fesm2022/cloud-ide-academics-class-program-term-create.component-BRbHViJN.mjs +0 -659
  15. package/fesm2022/cloud-ide-academics-class-program-term-create.component-BRbHViJN.mjs.map +0 -1
  16. package/fesm2022/cloud-ide-academics-class-program-term-list.component-CP2vlRBP.mjs.map +0 -1
  17. package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs +0 -111
  18. package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs.map +0 -1
  19. package/fesm2022/cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs +0 -3102
  20. package/fesm2022/cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs.map +0 -1
  21. package/fesm2022/cloud-ide-academics-program-class-create.component-KijRP6Nl.mjs.map +0 -1
  22. package/fesm2022/cloud-ide-academics-program-class-list.component-B5cy2Gpk.mjs.map +0 -1
  23. package/fesm2022/cloud-ide-academics-program-term-section-create.component-DHrTb-XI.mjs +0 -248
  24. package/fesm2022/cloud-ide-academics-program-term-section-create.component-DHrTb-XI.mjs.map +0 -1
  25. package/fesm2022/cloud-ide-academics-program-term-section-list.component-ktIAxvxR.mjs +0 -495
  26. package/fesm2022/cloud-ide-academics-program-term-section-list.component-ktIAxvxR.mjs.map +0 -1
@@ -4,14 +4,14 @@ import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i1$1 from '@angular/forms';
6
6
  import { FormsModule } from '@angular/forms';
7
- import { Router, ActivatedRoute } from '@angular/router';
7
+ import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';
8
+ import { filter } from 'rxjs/operators';
8
9
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
10
  import { NotificationService, ConfirmationService, CideEleDataGridComponent, CideIconComponent, CideEleButtonComponent, CideEleDropdownComponent, CideSelectComponent } from 'cloud-ide-element';
10
11
  import { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
11
12
  import { AcaClassPrgBranchListPayload, generateObjectFromString, MClassProgramTerm, generateStringFromObject } from 'cloud-ide-lms-model';
12
- import { C as CideLytClassProgramTermService } from './cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs';
13
+ import { c as CideLytClassProgramTermService, b as CideLytClassProgramBranchService } from './cloud-ide-academics-cloud-ide-academics-FwQEJSnJ.mjs';
13
14
  import { CLASS_PROGRAM_MASTER_SERVICE_TOKEN } from 'cloud-ide-shared';
14
- import { b as CideLytClassProgramBranchService } from './cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs';
15
15
 
16
16
  class ClassProgramTermListComponent {
17
17
  // Dependency injection
@@ -29,6 +29,7 @@ class ClassProgramTermListComponent {
29
29
  classProgramTermStatusRendererTemplate = viewChild.required('classProgramTermStatusRendererTemplate');
30
30
  actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
31
31
  programClassRendererTemplate = viewChild('programClassRendererTemplate', ...(ngDevMode ? [{ debugName: "programClassRendererTemplate" }] : []));
32
+ specializationRendererTemplate = viewChild('specializationRendererTemplate', ...(ngDevMode ? [{ debugName: "specializationRendererTemplate" }] : []));
32
33
  parentTermRendererTemplate = viewChild('parentTermRendererTemplate', ...(ngDevMode ? [{ debugName: "parentTermRendererTemplate" }] : []));
33
34
  // Computed template renderers for grid
34
35
  templateRenderers = computed(() => {
@@ -40,6 +41,9 @@ class ClassProgramTermListComponent {
40
41
  if (this.programClassRendererTemplate()) {
41
42
  renderers['programClassRenderer'] = this.programClassRendererTemplate();
42
43
  }
44
+ if (this.specializationRendererTemplate()) {
45
+ renderers['specializationRenderer'] = this.specializationRendererTemplate();
46
+ }
43
47
  if (this.parentTermRendererTemplate()) {
44
48
  renderers['parentTermRenderer'] = this.parentTermRendererTemplate();
45
49
  }
@@ -133,7 +137,22 @@ class ClassProgramTermListComponent {
133
137
  width: '200px',
134
138
  truncate: true,
135
139
  align: 'left',
136
- renderer: 'programClassRenderer'
140
+ renderer: 'programClassRenderer',
141
+ groupable: true,
142
+ valueGetter: 'acapt_class_program_id_acacpm.acacpm_alise_title',
143
+ dataValueGetter: 'acapt_class_program_id_acacpm.acacpm_alise_title'
144
+ },
145
+ {
146
+ key: 'acapt_class_prg_branch_acabrn',
147
+ header: 'Specialization',
148
+ type: 'custom',
149
+ width: '180px',
150
+ truncate: true,
151
+ align: 'left',
152
+ renderer: 'specializationRenderer',
153
+ groupable: true,
154
+ valueGetter: 'acapt_class_prg_branch_acabrn.acabrn_name',
155
+ dataValueGetter: 'acapt_class_prg_branch_acabrn.acabrn_name'
137
156
  },
138
157
  {
139
158
  key: 'acapt_parent_class_prog_term_acapt',
@@ -188,14 +207,30 @@ class ClassProgramTermListComponent {
188
207
  enabled: true,
189
208
  stickyHeader: true,
190
209
  virtualScroll: false,
191
- rowHeight: 50
210
+ rowHeight: 50,
211
+ maxHeight: undefined // Explicitly no max-height - grid should fill available space
192
212
  },
193
213
  fullHeight: true,
194
214
  responsive: true,
195
215
  striped: false,
196
216
  bordered: true,
197
217
  compact: false,
198
- tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
218
+ tableClass: 'tw-table-fixed tw-w-full tw-rounded-none',
219
+ columnMenu: {
220
+ enabled: true,
221
+ showGroupBy: true,
222
+ showFilter: true,
223
+ showSort: true
224
+ },
225
+ tree: {
226
+ enabled: true,
227
+ primaryKey: '_id',
228
+ foreignKey: 'acapt_parent_class_prog_term_acapt._id',
229
+ childrenKey: 'children',
230
+ levelKey: 'level',
231
+ expandedKey: 'isExpanded',
232
+ hasChildrenKey: 'hasChildren'
233
+ }
199
234
  }, ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
200
235
  /**
201
236
  * Get action dropdown items
@@ -274,8 +309,18 @@ class ClassProgramTermListComponent {
274
309
  this.initializeBreadcrumbData();
275
310
  this.checkRouteParams();
276
311
  this.loadClassProgramMasters();
277
- // Don't load terms until class program is selected
278
- // this.loadClassProgramTerms();
312
+ // Load all terms on initialization (grouping will be handled by grid)
313
+ this.loadClassProgramTerms();
314
+ // Subscribe to router events to reload data when navigating back to this page
315
+ this.router.events
316
+ .pipe(filter(event => event instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef))
317
+ .subscribe((event) => {
318
+ // Reload data when navigating to the listing page
319
+ if (event.urlAfterRedirects.includes('/class-program-term') && !event.urlAfterRedirects.includes('/create') && !event.urlAfterRedirects.includes('/edit') && !event.urlAfterRedirects.includes('/view')) {
320
+ console.log('🔄 Navigation detected to listing page, reloading data...');
321
+ this.loadClassProgramTerms();
322
+ }
323
+ });
279
324
  }
280
325
  /**
281
326
  * Initialize breadcrumb data for list view
@@ -338,7 +383,7 @@ class ClassProgramTermListComponent {
338
383
  this.classProgramBranches.set([]);
339
384
  this.selectedBranchId.set(null);
340
385
  this.acabrnId.set(null);
341
- // Load terms for grid only when class program is selected (no branch required)
386
+ // Load all terms (will be filtered by selected program if any)
342
387
  this.loadClassProgramTerms();
343
388
  }
344
389
  }
@@ -347,9 +392,8 @@ class ClassProgramTermListComponent {
347
392
  this.classProgramBranches.set([]);
348
393
  this.selectedBranchId.set(null);
349
394
  this.acabrnId.set(null);
350
- // Clear grid data when no class program is selected
351
- this.classProgramTerms.set([]);
352
- this.updateGridData();
395
+ // Load all terms when no filter is selected
396
+ this.loadClassProgramTerms();
353
397
  }
354
398
  }
355
399
  /**
@@ -392,15 +436,8 @@ class ClassProgramTermListComponent {
392
436
  console.log('🔄 Branch changed:', branch);
393
437
  this.selectedBranchId.set(branch);
394
438
  this.acabrnId.set(branch);
395
- // Load terms for grid only when both class program and branch are selected
396
- if (branch && this.selectedProgramClassId()) {
397
- this.loadClassProgramTerms();
398
- }
399
- else {
400
- // Clear grid data when branch is cleared
401
- this.classProgramTerms.set([]);
402
- this.updateGridData();
403
- }
439
+ // Load all terms (will be filtered by selected branch if any)
440
+ this.loadClassProgramTerms();
404
441
  }
405
442
  /**
406
443
  * Handle class program master search
@@ -437,34 +474,22 @@ class ClassProgramTermListComponent {
437
474
  * Load class program terms data
438
475
  */
439
476
  loadClassProgramTerms() {
440
- // Don't load if no class program is selected
441
- if (!this.selectedProgramClassId()) {
442
- this.classProgramTerms.set([]);
443
- this.loading.set(false);
444
- this.updateGridData();
445
- return;
446
- }
447
- // If branch dropdown is shown, require branch selection
448
- if (this.showBranchDropdown() && !this.selectedBranchId()) {
449
- this.classProgramTerms.set([]);
450
- this.loading.set(false);
451
- this.updateGridData();
452
- return;
453
- }
454
477
  this.loading.set(true);
455
478
  this.error.set(null);
456
- // Add filter parameters if available
479
+ // Build payload - only include filters if they are selected
457
480
  const acabrnId = this.acabrnId();
458
481
  const acacpmId = this.acacpmId();
459
482
  const payload = new MClassProgramTerm({
460
483
  pageIndex: 0,
461
- pageSize: 100,
484
+ pageSize: 1000, // Load more records for grouping
485
+ pagination: false, // Disable pagination to get all records
462
486
  query: this.searchTerm() || "",
463
487
  sort: {
464
488
  key: 'acapt_name',
465
489
  order: 'asc'
466
490
  },
467
- acapt_class_prg_branch_acabrn: acabrnId || "",
491
+ acapt_class_prg_branch_acabrn: acabrnId || "", // Only include if selected
492
+ acapt_class_program_id_acacpm: acacpmId || "" // Only include if selected
468
493
  });
469
494
  this.classProgramTermService.getClassProgramTermList(payload)
470
495
  .pipe(takeUntilDestroyed(this.destroyRef))
@@ -472,6 +497,14 @@ class ClassProgramTermListComponent {
472
497
  next: (response) => {
473
498
  if (response?.success && response.data) {
474
499
  console.log('📚 Class program terms loaded:', response.data);
500
+ console.log('📊 Sample term structure for grouping:', response.data[0] ? {
501
+ _id: response.data[0]._id,
502
+ acapt_name: response.data[0].acapt_name,
503
+ programClass: response.data[0].acapt_class_program_id_acacpm,
504
+ specialization: response.data[0].acapt_class_prg_branch_acabrn || response.data[0].acapt_class_program_branch_id_acabrn,
505
+ programClassType: typeof response.data[0].acapt_class_program_id_acacpm,
506
+ specializationType: typeof (response.data[0].acapt_class_prg_branch_acabrn || response.data[0].acapt_class_program_branch_id_acabrn)
507
+ } : 'No data');
475
508
  this.classProgramTerms.set(response.data);
476
509
  this.updateGridData();
477
510
  this.notificationService.success(`Loaded ${response.data.length} class program term(s) successfully.`);
@@ -492,13 +525,66 @@ class ClassProgramTermListComponent {
492
525
  }
493
526
  });
494
527
  }
528
+ /**
529
+ * Normalize parent field - preserve nested objects for both tree view and grouping
530
+ * The data grid component now handles nested foreign key objects generically
531
+ */
532
+ normalizeParentField(terms) {
533
+ return terms.map(term => {
534
+ const normalizedTerm = { ...term };
535
+ // Keep the original object structure - tree view will extract _id generically
536
+ // No need to convert to string ID - the grid component handles nested objects
537
+ // This preserves the full object for display and grouping purposes
538
+ // Ensure program class object structure is preserved for grouping
539
+ if (normalizedTerm.acapt_class_program_id_acacpm) {
540
+ if (typeof normalizedTerm.acapt_class_program_id_acacpm === 'object') {
541
+ // Ensure acacpm_alise_title exists, fallback to acacpm_name
542
+ const programClass = normalizedTerm.acapt_class_program_id_acacpm;
543
+ if (!programClass.acacpm_alise_title && programClass.acacpm_name) {
544
+ programClass.acacpm_alise_title = programClass.acacpm_name;
545
+ }
546
+ }
547
+ else if (typeof normalizedTerm.acapt_class_program_id_acacpm === 'string') {
548
+ // If it's a string ID, we can't group by it - this should not happen with proper API response
549
+ console.warn('⚠️ Program class is a string ID, not an object. Grouping may not work correctly.');
550
+ }
551
+ }
552
+ // Ensure specialization object structure is preserved for grouping
553
+ // Handle optional specialization - some terms may not have specialization
554
+ if (normalizedTerm.acapt_class_prg_branch_acabrn) {
555
+ if (typeof normalizedTerm.acapt_class_prg_branch_acabrn === 'object') {
556
+ // Ensure acabrn_name exists for grouping
557
+ const specialization = normalizedTerm.acapt_class_prg_branch_acabrn;
558
+ if (!specialization.acabrn_name) {
559
+ specialization.acabrn_name = 'N/A';
560
+ }
561
+ }
562
+ else if (typeof normalizedTerm.acapt_class_prg_branch_acabrn === 'string') {
563
+ // If it's a string ID, we can't group by it - this should not happen with proper API response
564
+ console.warn('⚠️ Specialization is a string ID, not an object. Grouping may not work correctly.');
565
+ }
566
+ }
567
+ else {
568
+ // No specialization - create a placeholder object for consistent grouping
569
+ // This ensures terms without specialization are grouped together
570
+ // The valueGetter will extract 'No Specialization' from acabrn_name for grouping
571
+ normalizedTerm.acapt_class_prg_branch_acabrn = {
572
+ _id: null,
573
+ acabrn_name: 'No Specialization'
574
+ };
575
+ }
576
+ return normalizedTerm;
577
+ });
578
+ }
495
579
  /**
496
580
  * Update grid data
497
581
  */
498
582
  updateGridData() {
583
+ const filteredTerms = this.filteredClassProgramTerms();
584
+ const normalizedTerms = this.normalizeParentField(filteredTerms);
499
585
  this.gridConfig.update(config => ({
500
586
  ...config,
501
- data: this.filteredClassProgramTerms()
587
+ data: normalizedTerms
502
588
  }));
503
589
  }
504
590
  /**
@@ -524,7 +610,25 @@ class ClassProgramTermListComponent {
524
610
  * Create new class program term
525
611
  */
526
612
  createClassProgramTerm() {
527
- this.router.navigate(['/control-panel/program-term-management/create']);
613
+ // Build query params with selected program class and branch if available
614
+ const queryParams = {};
615
+ const selectedProgramClassId = this.selectedProgramClassId();
616
+ if (selectedProgramClassId) {
617
+ queryParams.acacpm_id = selectedProgramClassId;
618
+ }
619
+ const selectedBranchId = this.selectedBranchId();
620
+ if (selectedBranchId) {
621
+ queryParams.acabrn_id = selectedBranchId;
622
+ }
623
+ // If we have any query params, include them in the route
624
+ if (Object.keys(queryParams).length > 0) {
625
+ const queryString = generateStringFromObject(queryParams);
626
+ this.router.navigate(['/control-panel/program-term-management/create', queryString]);
627
+ }
628
+ else {
629
+ // No filters selected, navigate without query params
630
+ this.router.navigate(['/control-panel/program-term-management/create']);
631
+ }
528
632
  }
529
633
  /**
530
634
  * Add child term under a parent term
@@ -534,13 +638,39 @@ class ClassProgramTermListComponent {
534
638
  this.notificationService.error('Invalid term selected');
535
639
  return;
536
640
  }
537
- // Get the class program and branch IDs from the parent term
641
+ console.log('🔍 Add Child Term - Parent Term:', parentTerm);
642
+ // Get the class program ID from the parent term
538
643
  const classProgramId = typeof parentTerm.acapt_class_program_id_acacpm === 'string'
539
644
  ? parentTerm.acapt_class_program_id_acacpm
540
645
  : parentTerm.acapt_class_program_id_acacpm?._id;
541
- const branchId = typeof parentTerm.acapt_class_program_branch_id_acabrn === 'string'
542
- ? parentTerm.acapt_class_program_branch_id_acabrn
543
- : parentTerm.acapt_class_program_branch_id_acabrn?._id;
646
+ // Get branch ID from parent term - check both property names
647
+ let branchId;
648
+ const branchValue = parentTerm.acapt_class_prg_branch_acabrn || parentTerm.acapt_class_program_branch_id_acabrn;
649
+ if (branchValue) {
650
+ if (typeof branchValue === 'string') {
651
+ branchId = branchValue;
652
+ }
653
+ else if (typeof branchValue === 'object' && branchValue !== null) {
654
+ branchId = branchValue._id;
655
+ }
656
+ }
657
+ console.log('🔍 Branch ID from parent term:', branchId);
658
+ // If branch ID is not in parent term, use the selected branch from filter
659
+ if (!branchId) {
660
+ const selectedBranch = this.selectedBranchId();
661
+ if (selectedBranch) {
662
+ branchId = selectedBranch;
663
+ console.log('🔍 Branch ID from filter:', branchId);
664
+ }
665
+ }
666
+ // If still no branch ID, use the acabrnId signal
667
+ if (!branchId) {
668
+ const acabrnSignalValue = this.acabrnId();
669
+ if (acabrnSignalValue) {
670
+ branchId = acabrnSignalValue;
671
+ console.log('🔍 Branch ID from acabrnId signal:', branchId);
672
+ }
673
+ }
544
674
  // Build query params with parent term ID, class program ID, and branch ID
545
675
  const queryParams = {
546
676
  acapt_id: parentTerm._id,
@@ -552,7 +682,9 @@ class ClassProgramTermListComponent {
552
682
  if (branchId) {
553
683
  queryParams.acabrn_id = branchId;
554
684
  }
685
+ console.log('🔍 Final query params for child term:', queryParams);
555
686
  const queryString = generateStringFromObject(queryParams);
687
+ console.log('🔍 Query string:', queryString);
556
688
  this.router.navigate(['/control-panel/program-term-management/create', queryString]);
557
689
  }
558
690
  /**
@@ -565,7 +697,13 @@ class ClassProgramTermListComponent {
565
697
  * Edit class program term
566
698
  */
567
699
  editClassProgramTerm(classProgramTerm) {
568
- this.router.navigate(['/control-panel/class-program-term/edit', classProgramTerm._id]);
700
+ if (!classProgramTerm._id) {
701
+ this.notificationService.error('Invalid term selected');
702
+ return;
703
+ }
704
+ // Encode ID as query object following the pattern used by other entities
705
+ const queryParams = generateStringFromObject({ acapt_id: classProgramTerm._id });
706
+ this.router.navigate(['/control-panel/program-term-management/edit', queryParams]);
569
707
  }
570
708
  /**
571
709
  * Delete class program term
@@ -638,7 +776,7 @@ class ClassProgramTermListComponent {
638
776
  this.loadClassProgramTerms();
639
777
  }
640
778
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
641
- 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 }, { propertyName: "programClassRendererTemplate", first: true, predicate: ["programClassRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "parentTermRendererTemplate", first: true, predicate: ["parentTermRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\n\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n</div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\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"] }] });
779
+ 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 }, { propertyName: "programClassRendererTemplate", first: true, predicate: ["programClassRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "specializationRendererTemplate", first: true, predicate: ["specializationRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "parentTermRendererTemplate", first: true, predicate: ["parentTermRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full tw-overflow-hidden\">\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n class=\"tw-h-full\"\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || row?.acapt_class_program_id_acacpm?.acacpm_name || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #specializationRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-4 tw-h-4\">category</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_prg_branch_acabrn?.acabrn_name || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n", styles: [":host{height:100%;display:flex;flex-direction:column}cide-ele-data-grid{flex:1;min-height:0;display:flex;flex-direction:column}\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", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading", "valueKey", "labelKey", "treeView"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }] });
642
780
  }
643
781
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, decorators: [{
644
782
  type: Component,
@@ -651,8 +789,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
651
789
  CideEleDropdownComponent,
652
790
  CideSelectComponent,
653
791
  CideLytSharedWrapperComponent
654
- ], template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\n\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n</div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n" }]
792
+ ], template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full tw-overflow-hidden\">\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n class=\"tw-h-full\"\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || row?.acapt_class_program_id_acacpm?.acacpm_name || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #specializationRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-4 tw-h-4\">category</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_prg_branch_acabrn?.acabrn_name || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n", styles: [":host{height:100%;display:flex;flex-direction:column}cide-ele-data-grid{flex:1;min-height:0;display:flex;flex-direction:column}\n"] }]
655
793
  }] });
656
794
 
657
795
  export { ClassProgramTermListComponent };
658
- //# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-CP2vlRBP.mjs.map
796
+ //# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-DObKkh-y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-academics-class-program-term-list.component-DObKkh-y.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';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router, ActivatedRoute, NavigationEnd } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CideEleDataGridComponent, CideIconComponent, CideEleButtonComponent, GridConfiguration, GridEvent, CideEleDropdownComponent, DropdownItem, NotificationService, ConfirmationService, CideSelectComponent } from 'cloud-ide-element';\nimport { TemplateContext } from 'cloud-ide-element';\nimport { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';\nimport { \n MClassProgramTerm,\n type MClassProgramTermDeletePayload,\n type MClassProgramTermToggleStatusPayload,\n generateObjectFromString,\n generateStringFromObject,\n type MClassProgramMaster,\n type classProgramMasterControllerResponse,\n AcaClassPrgBranchListPayload,\n type classPrgBranchControllerResponse\n} from 'cloud-ide-lms-model';\nimport { CideLytClassProgramTermService } from '../../services/class-program-term.service';\nimport { CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IClassProgramMasterService } from 'cloud-ide-shared';\nimport { CideLytClassProgramBranchService } from '../../../class-program-branch-management/services/class-program-branch.service';\n\n// Interfaces based on the model files\ninterface ClassProgramTerm {\n _id?: string;\n acapt_code?: string;\n acapt_name?: string;\n acapt_description?: string;\n acapt_class_program_id_acacpm?: string | {\n _id?: string;\n acacpm_name?: string;\n };\n acapt_class_program_branch_id_acabrn?: string | {\n _id?: string;\n acabrn_name?: string;\n };\n acapt_class_prg_branch_acabrn?: string | {\n _id?: string;\n acabrn_name?: string;\n };\n acapt_parent_class_prog_term_acapt?: string | {\n _id?: string;\n acapt_name?: string;\n };\n acapt_isactive?: boolean;\n acapt_iscurrent?: boolean;\n acapt_islocked?: boolean;\n}\n\ninterface ClassProgramConfiguration {\n branchType?: boolean;\n semesterType?: boolean;\n}\n\ninterface ProgramClass {\n _id?: string;\n acacpm_name?: string;\n acacpm_code?: string;\n acacpm_alise_title?: string;\n acacpm_description?: string;\n acacpm_class_program_id_sygms?: any;\n}\n\ninterface ClassProgramBranch {\n _id?: string;\n acabrn_name?: string;\n acabrn_code?: string;\n}\n\n@Component({\n selector: 'cide-academics-class-program-term-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideEleDataGridComponent,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDropdownComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './class-program-term-list.component.html',\n styles: [`\n :host {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n cide-ele-data-grid {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n `]\n})\nexport class ClassProgramTermListComponent implements OnInit {\n // Dependency injection\n private destroyRef = inject(DestroyRef);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private appState = inject(AppStateHelperService);\n private notificationService = inject(NotificationService);\n private confirmationService = inject(ConfirmationService);\n private classProgramTermService = inject(CideLytClassProgramTermService);\n private classProgramMasterService = inject(CLASS_PROGRAM_MASTER_SERVICE_TOKEN) as IClassProgramMasterService;\n private classProgramBranchService = inject(CideLytClassProgramBranchService);\n\n // Modern ViewChild signals for template renderers (Angular 20 approach)\n classProgramTermDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('classProgramTermDetailsRendererTemplate');\n classProgramTermStatusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('classProgramTermStatusRendererTemplate');\n actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n programClassRendererTemplate = viewChild<TemplateRef<TemplateContext>>('programClassRendererTemplate');\n specializationRendererTemplate = viewChild<TemplateRef<TemplateContext>>('specializationRendererTemplate');\n parentTermRendererTemplate = viewChild<TemplateRef<TemplateContext>>('parentTermRendererTemplate');\n\n // Computed template renderers for grid\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => {\n const renderers: Record<string, TemplateRef<TemplateContext>> = {\n classProgramTermDetailsRenderer: this.classProgramTermDetailsRendererTemplate(),\n classProgramTermStatusRenderer: this.classProgramTermStatusRendererTemplate(),\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate()\n };\n \n if (this.programClassRendererTemplate()) {\n renderers['programClassRenderer'] = this.programClassRendererTemplate()!;\n }\n \n if (this.specializationRendererTemplate()) {\n renderers['specializationRenderer'] = this.specializationRendererTemplate()!;\n }\n \n if (this.parentTermRendererTemplate()) {\n renderers['parentTermRenderer'] = this.parentTermRendererTemplate()!;\n }\n \n return renderers;\n });\n\n // Make Math available in template\n Math = Math;\n\n // Signals for reactive state management\n classProgramTerms = signal<ClassProgramTerm[]>([]);\n loading = signal(false);\n error = signal<string | null>(null);\n selectedItems = signal<string[]>([]);\n searchTerm = signal('');\n acabrnId = signal<string | null>(null);\n acacpmId = signal<string | null>(null);\n \n // Class program and branch dropdown signals\n classProgramMasters = signal<ProgramClass[]>([]);\n classProgramMastersLoading = signal<boolean>(false);\n selectedClassProgram = signal<ProgramClass | null>(null);\n classProgramBranches = signal<ClassProgramBranch[]>([]);\n classProgramBranchesLoading = signal<boolean>(false);\n selectedProgramClassId = signal<string | null>(null);\n selectedBranchId = signal<string | null>(null);\n \n // Signal for breadcrumb data that will be passed to shared wrapper\n breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n \n // Computed signals for dropdown options\n classProgramMastersOptions = computed(() => this.classProgramMasters());\n \n // Computed signal to check if branch dropdown should be shown\n showBranchDropdown = computed(() => {\n const selectedProgram = this.selectedClassProgram();\n if (!selectedProgram) return false;\n \n const generalMaster = selectedProgram.acacpm_class_program_id_sygms;\n if (!generalMaster || typeof generalMaster !== 'object') return false;\n \n let config: ClassProgramConfiguration | undefined;\n if ('sygms_configuration' in generalMaster) {\n const configValue = generalMaster.sygms_configuration;\n if (typeof configValue === 'string') {\n try {\n config = JSON.parse(configValue) as ClassProgramConfiguration;\n } catch {\n return false;\n }\n } else if (typeof configValue === 'object' && configValue !== null) {\n config = configValue as ClassProgramConfiguration;\n }\n }\n \n return config?.branchType === true;\n });\n\n // Derived list filtered by searchTerm\n filteredClassProgramTerms = computed(() => {\n const q = (this.searchTerm() || '').toLowerCase().trim();\n const items = this.classProgramTerms() || [];\n if (!q) return items;\n return items.filter(cpt => {\n const name = (cpt.acapt_name || '').toLowerCase();\n const code = (cpt.acapt_code || '').toLowerCase();\n const description = (cpt.acapt_description || '').toLowerCase();\n return name.includes(q) || code.includes(q) || description.includes(q);\n });\n });\n\n // Grid configuration signal\n gridConfig = signal<GridConfiguration<ClassProgramTerm>>({\n id: 'class-program-term-list-grid',\n columns: [\n {\n key: 'details',\n header: 'Term Details',\n type: 'custom',\n width: 'auto',\n truncate: true,\n align: 'left',\n renderer: 'classProgramTermDetailsRenderer'\n },\n {\n key: 'acapt_code',\n header: 'Code',\n type: 'text',\n width: '120px',\n truncate: true,\n align: 'left'\n },\n {\n key: 'acapt_class_program_id_acacpm',\n header: 'Program Class',\n type: 'custom',\n width: '200px',\n truncate: true,\n align: 'left',\n renderer: 'programClassRenderer',\n groupable: true,\n valueGetter: 'acapt_class_program_id_acacpm.acacpm_alise_title',\n dataValueGetter: 'acapt_class_program_id_acacpm.acacpm_alise_title'\n },\n {\n key: 'acapt_class_prg_branch_acabrn',\n header: 'Specialization',\n type: 'custom',\n width: '180px',\n truncate: true,\n align: 'left',\n renderer: 'specializationRenderer',\n groupable: true,\n valueGetter: 'acapt_class_prg_branch_acabrn.acabrn_name',\n dataValueGetter: 'acapt_class_prg_branch_acabrn.acabrn_name'\n },\n {\n key: 'acapt_parent_class_prog_term_acapt',\n header: 'Parent Term',\n type: 'custom',\n width: '180px',\n truncate: true,\n align: 'left',\n renderer: 'parentTermRenderer'\n },\n {\n key: 'acapt_isactive',\n header: 'Status',\n type: 'custom',\n width: '120px',\n truncate: false,\n align: 'center',\n renderer: 'classProgramTermStatusRenderer'\n },\n {\n key: 'actions',\n header: '',\n type: 'custom',\n width: '150px',\n truncate: false,\n align: 'center',\n renderer: 'actionsDropdownRenderer'\n }\n ],\n data: [],\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search class program terms...',\n searchableColumns: ['acapt_name', 'acapt_code', 'acapt_description'],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n scroll: {\n enabled: true,\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 50,\n maxHeight: undefined // Explicitly no max-height - grid should fill available space\n },\n fullHeight: true,\n responsive: true,\n striped: false,\n bordered: true,\n compact: false,\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none',\n columnMenu: {\n enabled: true,\n showGroupBy: true,\n showFilter: true,\n showSort: true\n },\n tree: {\n enabled: true,\n primaryKey: '_id',\n foreignKey: 'acapt_parent_class_prog_term_acapt._id',\n childrenKey: 'children',\n levelKey: 'level',\n expandedKey: 'isExpanded',\n hasChildrenKey: 'hasChildren'\n }\n });\n\n /**\n * Get action dropdown items\n */\n getActionDropdownItems(classProgramTerm: ClassProgramTerm): DropdownItem[] {\n const items: DropdownItem[] = [\n {\n id: 'view',\n label: 'View Details',\n icon: 'visibility',\n iconColor: 'tw-text-gray-400',\n textColor: 'tw-text-gray-700'\n },\n {\n id: 'edit',\n label: 'Edit Term',\n icon: 'edit',\n iconColor: 'tw-text-blue-400',\n textColor: 'tw-text-blue-700'\n }\n ];\n\n // Only show \"Add Term\" if this term doesn't have a parent (is at level 1)\n // Check if parent term is null/undefined or empty string\n const parentTerm = classProgramTerm.acapt_parent_class_prog_term_acapt;\n const hasParent = parentTerm && \n (typeof parentTerm === 'string' ? \n (parentTerm.trim() !== '') : \n (parentTerm && typeof parentTerm === 'object' && parentTerm._id));\n \n if (!hasParent) {\n items.push({\n id: 'addTerm',\n label: 'Add Term',\n icon: 'add',\n iconColor: 'tw-text-green-400',\n textColor: 'tw-text-green-700'\n });\n }\n\n items.push(\n {\n id: 'toggleStatus',\n label: classProgramTerm.acapt_isactive ? 'Deactivate' : 'Activate',\n icon: classProgramTerm.acapt_isactive ? 'toggle_off' : 'toggle_on',\n iconColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',\n textColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-700' : 'tw-text-green-700'\n },\n {\n id: 'delete',\n label: 'Delete',\n icon: 'delete',\n iconColor: 'tw-text-red-400',\n textColor: 'tw-text-red-700'\n }\n );\n\n return items;\n }\n\n /**\n * Handle dropdown item click\n */\n onDropdownItemClick(item: DropdownItem, classProgramTerm: ClassProgramTerm): void {\n switch (item.id) {\n case 'view':\n this.viewClassProgramTerm(classProgramTerm);\n break;\n case 'edit':\n this.editClassProgramTerm(classProgramTerm);\n break;\n case 'addTerm':\n this.addChildTerm(classProgramTerm);\n break;\n case 'toggleStatus':\n this.toggleClassProgramTermStatus(classProgramTerm);\n break;\n case 'delete':\n this.deleteClassProgramTerm(classProgramTerm);\n break;\n }\n }\n\n ngOnInit(): void {\n this.initializeBreadcrumbData();\n this.checkRouteParams();\n this.loadClassProgramMasters();\n // Load all terms on initialization (grouping will be handled by grid)\n this.loadClassProgramTerms();\n \n // Subscribe to router events to reload data when navigating back to this page\n this.router.events\n .pipe(\n filter(event => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe((event: NavigationEnd) => {\n // Reload data when navigating to the listing page\n if (event.urlAfterRedirects.includes('/class-program-term') && !event.urlAfterRedirects.includes('/create') && !event.urlAfterRedirects.includes('/edit') && !event.urlAfterRedirects.includes('/view')) {\n console.log('🔄 Navigation detected to listing page, reloading data...');\n this.loadClassProgramTerms();\n }\n });\n }\n\n /**\n * Initialize breadcrumb data for list view\n */\n private initializeBreadcrumbData(): void {\n this.breadcrumbData.set([\n {\n id: 'list',\n label: 'List',\n icon: 'list',\n url: undefined\n }\n ]);\n }\n \n /**\n * Load class program masters for dropdown\n */\n loadClassProgramMasters(): void {\n this.classProgramMastersLoading.set(true);\n const payload: MClassProgramMaster = {\n pagination: false,\n acacpm_isactive: true\n };\n \n this.classProgramMasterService.getClassProgramMasterList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: classProgramMasterControllerResponse) => {\n if (response?.success && response.data) {\n this.classProgramMasters.set(response.data as ProgramClass[]);\n } else {\n this.classProgramMasters.set([]);\n }\n this.classProgramMastersLoading.set(false);\n },\n error: (error) => {\n console.error('❌ Error loading class program masters:', error);\n this.classProgramMasters.set([]);\n this.classProgramMastersLoading.set(false);\n }\n });\n }\n \n /**\n * Handle class program selection change\n */\n onClassProgramChange(programClassId: string | number | string[] | null): void {\n const programId = typeof programClassId === 'string' ? programClassId : (programClassId ? String(programClassId) : null);\n console.log('🔄 Class Program changed:', programId);\n \n this.selectedProgramClassId.set(programId);\n this.acacpmId.set(programId);\n \n if (programId) {\n const selectedProgram = this.classProgramMasters().find(p => p._id === programId);\n this.selectedClassProgram.set(selectedProgram || null);\n \n // Load branches if branchType is configured\n if (this.showBranchDropdown()) {\n this.loadClassProgramBranches(programId);\n // Don't load terms yet - wait for branch selection\n } else {\n this.classProgramBranches.set([]);\n this.selectedBranchId.set(null);\n this.acabrnId.set(null);\n // Load all terms (will be filtered by selected program if any)\n this.loadClassProgramTerms();\n }\n } else {\n this.selectedClassProgram.set(null);\n this.classProgramBranches.set([]);\n this.selectedBranchId.set(null);\n this.acabrnId.set(null);\n // Load all terms when no filter is selected\n this.loadClassProgramTerms();\n }\n }\n \n /**\n * Load class program branches\n */\n loadClassProgramBranches(classProgramId: string): void {\n this.classProgramBranchesLoading.set(true);\n const payload: AcaClassPrgBranchListPayload = new AcaClassPrgBranchListPayload({\n acabrn_class_program_id_acacpm: classProgramId,\n pagination: false\n });\n \n this.classProgramBranchService.getClassProgramBranchList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: classPrgBranchControllerResponse) => {\n if (response?.success && response.data) {\n this.classProgramBranches.set(response.data as ClassProgramBranch[]);\n // Load program terms for dropdown when branches are loaded\n if (this.selectedProgramClassId()) {\n // Will be triggered when user selects a branch\n }\n } else {\n this.classProgramBranches.set([]);\n }\n this.classProgramBranchesLoading.set(false);\n },\n error: (error: any) => {\n console.error('❌ Error loading class program branches:', error);\n this.classProgramBranches.set([]);\n this.classProgramBranchesLoading.set(false);\n }\n });\n }\n \n /**\n * Handle branch selection change\n */\n onBranchChange(branchId: string | number | string[] | null): void {\n const branch = typeof branchId === 'string' ? branchId : (branchId ? String(branchId) : null);\n console.log('🔄 Branch changed:', branch);\n \n this.selectedBranchId.set(branch);\n this.acabrnId.set(branch);\n \n // Load all terms (will be filtered by selected branch if any)\n this.loadClassProgramTerms();\n }\n \n /**\n * Handle class program master search\n */\n onClassProgramMasterSearch(event: any): void {\n // Trigger loading if needed\n if (event && event.query) {\n // Could implement search functionality here if needed\n }\n }\n\n /**\n * Check route parameters for acabrn_id and acacpm_id\n */\n private checkRouteParams(): void {\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n const queryParams = params['query'];\n console.log('🏢 Route params:', params, 'queryParams:', queryParams);\n\n if (queryParams) {\n // Query parameters passed (following page-controls pattern)\n const queryData = generateObjectFromString(queryParams);\n console.log('🏢 Class Program Term params from route:', queryData);\n \n if (queryData?.acabrn_id) {\n this.acabrnId.set(queryData.acabrn_id as string);\n console.log('🏢 Branch ID from route:', queryData.acabrn_id);\n }\n \n if (queryData?.acacpm_id) {\n this.acacpmId.set(queryData.acacpm_id as string);\n console.log('🏢 Class Program ID from route:', queryData.acacpm_id);\n }\n }\n });\n }\n\n /**\n * Load class program terms data\n */\n private loadClassProgramTerms(): void {\n this.loading.set(true);\n this.error.set(null);\n \n // Build payload - only include filters if they are selected\n const acabrnId = this.acabrnId();\n const acacpmId = this.acacpmId();\n \n const payload: MClassProgramTerm = new MClassProgramTerm({\n pageIndex: 0,\n pageSize: 1000, // Load more records for grouping\n pagination: false, // Disable pagination to get all records\n query: this.searchTerm() || \"\",\n sort: {\n key: 'acapt_name',\n order: 'asc'\n },\n acapt_class_prg_branch_acabrn: acabrnId || \"\", // Only include if selected\n acapt_class_program_id_acacpm: acacpmId || \"\" // Only include if selected\n });\n\n this.classProgramTermService.getClassProgramTermList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n console.log('📚 Class program terms loaded:', response.data);\n console.log('📊 Sample term structure for grouping:', response.data[0] ? {\n _id: response.data[0]._id,\n acapt_name: response.data[0].acapt_name,\n programClass: response.data[0].acapt_class_program_id_acacpm,\n specialization: (response.data[0] as any).acapt_class_prg_branch_acabrn || (response.data[0] as any).acapt_class_program_branch_id_acabrn,\n programClassType: typeof response.data[0].acapt_class_program_id_acacpm,\n specializationType: typeof ((response.data[0] as any).acapt_class_prg_branch_acabrn || (response.data[0] as any).acapt_class_program_branch_id_acabrn)\n } : 'No data');\n this.classProgramTerms.set(response.data);\n this.updateGridData();\n this.notificationService.success(`Loaded ${response.data.length} class program term(s) successfully.`);\n } else {\n console.warn('⚠️ No class program term data received');\n this.classProgramTerms.set([]);\n this.updateGridData();\n this.notificationService.warning('No class program terms found.');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('❌ Error loading class program terms:', error);\n this.error.set('Failed to load class program terms');\n this.loading.set(false);\n this.notificationService.error('Failed to load class program terms');\n }\n });\n }\n\n /**\n * Normalize parent field - preserve nested objects for both tree view and grouping\n * The data grid component now handles nested foreign key objects generically\n */\n private normalizeParentField(terms: ClassProgramTerm[]): ClassProgramTerm[] {\n return terms.map(term => {\n const normalizedTerm = { ...term };\n \n // Keep the original object structure - tree view will extract _id generically\n // No need to convert to string ID - the grid component handles nested objects\n // This preserves the full object for display and grouping purposes\n \n // Ensure program class object structure is preserved for grouping\n if (normalizedTerm.acapt_class_program_id_acacpm) {\n if (typeof normalizedTerm.acapt_class_program_id_acacpm === 'object') {\n // Ensure acacpm_alise_title exists, fallback to acacpm_name\n const programClass = normalizedTerm.acapt_class_program_id_acacpm as any;\n if (!programClass.acacpm_alise_title && programClass.acacpm_name) {\n programClass.acacpm_alise_title = programClass.acacpm_name;\n }\n } else if (typeof normalizedTerm.acapt_class_program_id_acacpm === 'string') {\n // If it's a string ID, we can't group by it - this should not happen with proper API response\n console.warn('⚠️ Program class is a string ID, not an object. Grouping may not work correctly.');\n }\n }\n \n // Ensure specialization object structure is preserved for grouping\n // Handle optional specialization - some terms may not have specialization\n if (normalizedTerm.acapt_class_prg_branch_acabrn) {\n if (typeof normalizedTerm.acapt_class_prg_branch_acabrn === 'object') {\n // Ensure acabrn_name exists for grouping\n const specialization = normalizedTerm.acapt_class_prg_branch_acabrn as any;\n if (!specialization.acabrn_name) {\n specialization.acabrn_name = 'N/A';\n }\n } else if (typeof normalizedTerm.acapt_class_prg_branch_acabrn === 'string') {\n // If it's a string ID, we can't group by it - this should not happen with proper API response\n console.warn('⚠️ Specialization is a string ID, not an object. Grouping may not work correctly.');\n }\n } else {\n // No specialization - create a placeholder object for consistent grouping\n // This ensures terms without specialization are grouped together\n // The valueGetter will extract 'No Specialization' from acabrn_name for grouping\n (normalizedTerm as any).acapt_class_prg_branch_acabrn = {\n _id: null,\n acabrn_name: 'No Specialization'\n };\n }\n \n return normalizedTerm;\n });\n }\n\n /**\n * Update grid data\n */\n private updateGridData(): void {\n const filteredTerms = this.filteredClassProgramTerms();\n const normalizedTerms = this.normalizeParentField(filteredTerms);\n \n this.gridConfig.update(config => ({\n ...config,\n data: normalizedTerms\n }));\n }\n\n\n /**\n * Handle grid events\n */\n onGridEvent(event: GridEvent<ClassProgramTerm>): void {\n switch (event.type) {\n case 'pageChange':\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\n this.loadClassProgramTerms();\n }\n break;\n case 'search':\n this.searchTerm.set(event.data as string);\n this.updateGridData();\n break;\n case 'refresh':\n this.loadClassProgramTerms();\n break;\n }\n }\n\n /**\n * Create new class program term\n */\n createClassProgramTerm(): void {\n // Build query params with selected program class and branch if available\n const queryParams: any = {};\n \n const selectedProgramClassId = this.selectedProgramClassId();\n if (selectedProgramClassId) {\n queryParams.acacpm_id = selectedProgramClassId;\n }\n \n const selectedBranchId = this.selectedBranchId();\n if (selectedBranchId) {\n queryParams.acabrn_id = selectedBranchId;\n }\n \n // If we have any query params, include them in the route\n if (Object.keys(queryParams).length > 0) {\n const queryString = generateStringFromObject(queryParams);\n this.router.navigate(['/control-panel/program-term-management/create', queryString]);\n } else {\n // No filters selected, navigate without query params\n this.router.navigate(['/control-panel/program-term-management/create']);\n }\n }\n\n /**\n * Add child term under a parent term\n */\n addChildTerm(parentTerm: ClassProgramTerm): void {\n if (!parentTerm._id) {\n this.notificationService.error('Invalid term selected');\n return;\n }\n\n console.log('🔍 Add Child Term - Parent Term:', parentTerm);\n\n // Get the class program ID from the parent term\n const classProgramId = typeof parentTerm.acapt_class_program_id_acacpm === 'string' \n ? parentTerm.acapt_class_program_id_acacpm \n : parentTerm.acapt_class_program_id_acacpm?._id;\n \n // Get branch ID from parent term - check both property names\n let branchId: string | undefined;\n const branchValue = (parentTerm as any).acapt_class_prg_branch_acabrn || parentTerm.acapt_class_program_branch_id_acabrn;\n \n if (branchValue) {\n if (typeof branchValue === 'string') {\n branchId = branchValue;\n } else if (typeof branchValue === 'object' && branchValue !== null) {\n branchId = branchValue._id;\n }\n }\n\n console.log('🔍 Branch ID from parent term:', branchId);\n\n // If branch ID is not in parent term, use the selected branch from filter\n if (!branchId) {\n const selectedBranch = this.selectedBranchId();\n if (selectedBranch) {\n branchId = selectedBranch;\n console.log('🔍 Branch ID from filter:', branchId);\n }\n }\n\n // If still no branch ID, use the acabrnId signal\n if (!branchId) {\n const acabrnSignalValue = this.acabrnId();\n if (acabrnSignalValue) {\n branchId = acabrnSignalValue;\n console.log('🔍 Branch ID from acabrnId signal:', branchId);\n }\n }\n\n // Build query params with parent term ID, class program ID, and branch ID\n const queryParams: any = {\n acapt_id: parentTerm._id,\n acapt_parent_id: parentTerm._id\n };\n\n if (classProgramId) {\n queryParams.acacpm_id = classProgramId;\n }\n\n if (branchId) {\n queryParams.acabrn_id = branchId;\n }\n\n console.log('🔍 Final query params for child term:', queryParams);\n\n const queryString = generateStringFromObject(queryParams);\n console.log('🔍 Query string:', queryString);\n this.router.navigate(['/control-panel/program-term-management/create', queryString]);\n }\n\n /**\n * View class program term details\n */\n viewClassProgramTerm(classProgramTerm: ClassProgramTerm): void {\n this.router.navigate(['/control-panel/class-program-term/view', classProgramTerm._id]);\n }\n\n /**\n * Edit class program term\n */\n editClassProgramTerm(classProgramTerm: ClassProgramTerm): void {\n if (!classProgramTerm._id) {\n this.notificationService.error('Invalid term selected');\n return;\n }\n \n // Encode ID as query object following the pattern used by other entities\n const queryParams = generateStringFromObject({ acapt_id: classProgramTerm._id });\n this.router.navigate(['/control-panel/program-term-management/edit', queryParams]);\n }\n\n /**\n * Delete class program term\n */\n deleteClassProgramTerm(classProgramTerm: ClassProgramTerm): void {\n this.confirmationService.confirmDelete(classProgramTerm.acapt_name).then((confirmed: boolean) => {\n if (confirmed) {\n this.loading.set(true);\n const payload: MClassProgramTermDeletePayload = {\n acapt_id: classProgramTerm._id!\n };\n\n this.classProgramTermService.deleteClassProgramTerm(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success) {\n this.classProgramTerms.update(terms => \n terms.filter(cpt => cpt._id !== classProgramTerm._id)\n );\n this.updateGridData();\n this.notificationService.success('Class program term deleted successfully.');\n } else {\n this.notificationService.error('Failed to delete class program term.');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('❌ Error deleting class program term:', error);\n this.notificationService.error('Failed to delete class program term.');\n this.loading.set(false);\n }\n });\n }\n });\n }\n\n /**\n * Toggle class program term status\n */\n toggleClassProgramTermStatus(classProgramTerm: ClassProgramTerm): void {\n this.loading.set(true);\n const payload: MClassProgramTermToggleStatusPayload = {\n acapt_id: classProgramTerm._id!\n };\n\n this.classProgramTermService.toggleClassProgramTermStatus(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success) {\n this.classProgramTerms.update(terms => \n terms.map(cpt => \n cpt._id === classProgramTerm._id \n ? { ...cpt, acapt_isactive: !cpt.acapt_isactive }\n : cpt\n )\n );\n this.updateGridData();\n this.notificationService.success(`Class program term ${classProgramTerm.acapt_isactive ? 'deactivated' : 'activated'} successfully.`);\n } else {\n this.notificationService.error('Failed to toggle class program term status.');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('❌ Error toggling class program term status:', error);\n this.notificationService.error('Failed to toggle class program term status.');\n this.loading.set(false);\n }\n });\n }\n\n /**\n * Refresh data\n */\n refreshData(): void {\n this.loadClassProgramTerms();\n }\n}\n","<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full tw-overflow-hidden\">\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n class=\"tw-h-full\"\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\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\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || row?.acapt_class_program_id_acacpm?.acacpm_name || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #specializationRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-4 tw-h-4\">category</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_prg_branch_acabrn?.acabrn_name || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n"],"names":["i2"],"mappings":"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"}