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.
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-B-7JRpVE.mjs +1196 -0
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-B-7JRpVE.mjs.map +1 -0
- 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
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-DObKkh-y.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-FwQEJSnJ.mjs +6127 -0
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-FwQEJSnJ.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-create.component-KijRP6Nl.mjs → cloud-ide-academics-program-class-create.component-x0rh1ESo.mjs} +45 -23
- package/fesm2022/cloud-ide-academics-program-class-create.component-x0rh1ESo.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-list.component-B5cy2Gpk.mjs → cloud-ide-academics-program-class-list.component-CkzH8u8u.mjs} +10 -9
- package/fesm2022/cloud-ide-academics-program-class-list.component-CkzH8u8u.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics.mjs +1 -1
- package/index.d.ts +500 -18
- package/package.json +1 -1
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-BRbHViJN.mjs +0 -659
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-BRbHViJN.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-CP2vlRBP.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs +0 -111
- package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs +0 -3102
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-class-create.component-KijRP6Nl.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-class-list.component-B5cy2Gpk.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-DHrTb-XI.mjs +0 -248
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-DHrTb-XI.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-term-section-list.component-ktIAxvxR.mjs +0 -495
- 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 {
|
|
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
|
-
//
|
|
278
|
-
|
|
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
|
|
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
|
-
//
|
|
351
|
-
this.
|
|
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
|
|
396
|
-
|
|
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
|
-
//
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
542
|
-
|
|
543
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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-
|
|
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":";;;;;;;;;;;;;;;MAoGa,6BAA6B,CAAA;;AAEhC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACxC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,uBAAuB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AAChE,IAAA,yBAAyB,GAAG,MAAM,CAAC,kCAAkC,CAA+B;AACpG,IAAA,yBAAyB,GAAG,MAAM,CAAC,gCAAgC,CAAC;;AAG5E,IAAA,uCAAuC,GAAG,SAAS,CAAC,QAAQ,CAA+B,yCAAyC,CAAC;AACrI,IAAA,sCAAsC,GAAG,SAAS,CAAC,QAAQ,CAA+B,wCAAwC,CAAC;AACnI,IAAA,+BAA+B,GAAG,SAAS,CAAC,QAAQ,CAA+B,iCAAiC,CAAC;AACrH,IAAA,4BAA4B,GAAG,SAAS,CAA+B,8BAA8B,wEAAC;AACtG,IAAA,8BAA8B,GAAG,SAAS,CAA+B,gCAAgC,0EAAC;AAC1G,IAAA,0BAA0B,GAAG,SAAS,CAA+B,4BAA4B,sEAAC;;AAGlG,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAmD;AAC9E,QAAA,MAAM,SAAS,GAAiD;AAC9D,YAAA,+BAA+B,EAAE,IAAI,CAAC,uCAAuC,EAAE;AAC/E,YAAA,8BAA8B,EAAE,IAAI,CAAC,sCAAsC,EAAE;AAC7E,YAAA,uBAAuB,EAAE,IAAI,CAAC,+BAA+B;SAC9D;AAED,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE,EAAE;YACvC,SAAS,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,4BAA4B,EAAG;;AAG1E,QAAA,IAAI,IAAI,CAAC,8BAA8B,EAAE,EAAE;YACzC,SAAS,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC,8BAA8B,EAAG;;AAG9E,QAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE,EAAE;YACrC,SAAS,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,0BAA0B,EAAG;;AAGtE,QAAA,OAAO,SAAS;AAClB,KAAC,6DAAC;;IAGF,IAAI,GAAG,IAAI;;AAGX,IAAA,iBAAiB,GAAG,MAAM,CAAqB,EAAE,6DAAC;AAClD,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AACvB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AACnC,IAAA,aAAa,GAAG,MAAM,CAAW,EAAE,yDAAC;AACpC,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,sDAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,oDAAC;AACtC,IAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,oDAAC;;AAGtC,IAAA,mBAAmB,GAAG,MAAM,CAAiB,EAAE,+DAAC;AAChD,IAAA,0BAA0B,GAAG,MAAM,CAAU,KAAK,sEAAC;AACnD,IAAA,oBAAoB,GAAG,MAAM,CAAsB,IAAI,gEAAC;AACxD,IAAA,oBAAoB,GAAG,MAAM,CAAuB,EAAE,gEAAC;AACvD,IAAA,2BAA2B,GAAG,MAAM,CAAU,KAAK,uEAAC;AACpD,IAAA,sBAAsB,GAAG,MAAM,CAAgB,IAAI,kEAAC;AACpD,IAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,4DAAC;;AAG9C,IAAA,cAAc,GAAG,MAAM,CAA+D,EAAE,0DAAC;;IAGzF,0BAA0B,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGvE,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACnD,QAAA,IAAI,CAAC,eAAe;AAAE,YAAA,OAAO,KAAK;AAElC,QAAA,MAAM,aAAa,GAAG,eAAe,CAAC,6BAA6B;AACnE,QAAA,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AAErE,QAAA,IAAI,MAA6C;AACjD,QAAA,IAAI,qBAAqB,IAAI,aAAa,EAAE;AAC1C,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,mBAAmB;AACrD,YAAA,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AACnC,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA8B;;AAC7D,gBAAA,MAAM;AACN,oBAAA,OAAO,KAAK;;;iBAET,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE;gBAClE,MAAM,GAAG,WAAwC;;;AAIrD,QAAA,OAAO,MAAM,EAAE,UAAU,KAAK,IAAI;AACpC,KAAC,8DAAC;;AAGF,IAAA,yBAAyB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;AAC5C,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,KAAK;AACpB,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,IAAG;AACxB,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,WAAW,EAAE;AACjD,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,WAAW,EAAE;AACjD,YAAA,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,EAAE,WAAW,EAAE;YAC/D,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxE,SAAC,CAAC;AACJ,KAAC,qEAAC;;IAGF,UAAU,GAAG,MAAM,CAAsC;AACvD,QAAA,EAAE,EAAE,8BAA8B;AAClC,QAAA,OAAO,EAAE;AACP,YAAA;AACE,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,MAAM,EAAE,cAAc;AACtB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE;AACX,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,YAAY;AACjB,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,+BAA+B;AACpC,gBAAA,MAAM,EAAE,eAAe;AACvB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE,sBAAsB;AAChC,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,WAAW,EAAE,kDAAkD;AAC/D,gBAAA,eAAe,EAAE;AAClB,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,+BAA+B;AACpC,gBAAA,MAAM,EAAE,gBAAgB;AACxB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE,wBAAwB;AAClC,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,WAAW,EAAE,2CAA2C;AACxD,gBAAA,eAAe,EAAE;AAClB,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,oCAAoC;AACzC,gBAAA,MAAM,EAAE,aAAa;AACrB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE;AACX,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,gBAAgB;AACrB,gBAAA,MAAM,EAAE,QAAQ;AAChB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,QAAQ,EAAE;AACX,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,QAAQ,EAAE;AACX;AACF,SAAA;AACD,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,UAAU,EAAE;AACV,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAClC,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,WAAW,EAAE;AACd,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,WAAW,EAAE,+BAA+B;AAC5C,YAAA,iBAAiB,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,mBAAmB,CAAC;AACpE,YAAA,UAAU,EAAE;AACb,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,WAAW,EAAE;AACd,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,aAAa,EAAE,KAAK;AACpB,YAAA,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,SAAS;AACrB,SAAA;AACD,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,UAAU,EAAE,0CAA0C;AACtD,QAAA,UAAU,EAAE;AACV,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,QAAQ,EAAE;AACX,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,UAAU,EAAE,wCAAwC;AACpD,YAAA,WAAW,EAAE,UAAU;AACvB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,WAAW,EAAE,YAAY;AACzB,YAAA,cAAc,EAAE;AACjB;AACF,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEF;;AAEG;AACH,IAAA,sBAAsB,CAAC,gBAAkC,EAAA;AACvD,QAAA,MAAM,KAAK,GAAmB;AAC5B,YAAA;AACE,gBAAA,EAAE,EAAE,MAAM;AACV,gBAAA,KAAK,EAAE,cAAc;AACrB,gBAAA,IAAI,EAAE,YAAY;AAClB,gBAAA,SAAS,EAAE,kBAAkB;AAC7B,gBAAA,SAAS,EAAE;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,MAAM;AACV,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,SAAS,EAAE,kBAAkB;AAC7B,gBAAA,SAAS,EAAE;AACZ;SACF;;;AAID,QAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC,kCAAkC;QACtE,MAAM,SAAS,GAAG,UAAU;AACX,aAAC,OAAO,UAAU,KAAK,QAAQ;iBAC5B,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;AACzB,iBAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;QAEpF,IAAI,CAAC,SAAS,EAAE;YACd,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,SAAS,EAAE,mBAAmB;AAC9B,gBAAA,SAAS,EAAE;AACZ,aAAA,CAAC;;QAGJ,KAAK,CAAC,IAAI,CACR;AACE,YAAA,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,gBAAgB,CAAC,cAAc,GAAG,YAAY,GAAG,UAAU;YAClE,IAAI,EAAE,gBAAgB,CAAC,cAAc,GAAG,YAAY,GAAG,WAAW;YAClE,SAAS,EAAE,gBAAgB,CAAC,cAAc,GAAG,oBAAoB,GAAG,mBAAmB;YACvF,SAAS,EAAE,gBAAgB,CAAC,cAAc,GAAG,oBAAoB,GAAG;SACrE,EACD;AACE,YAAA,EAAE,EAAE,QAAQ;AACZ,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,SAAS,EAAE,iBAAiB;AAC5B,YAAA,SAAS,EAAE;AACZ,SAAA,CACF;AAED,QAAA,OAAO,KAAK;;AAGd;;AAEG;IACH,mBAAmB,CAAC,IAAkB,EAAE,gBAAkC,EAAA;AACxE,QAAA,QAAQ,IAAI,CAAC,EAAE;AACb,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;gBAC3C;AACF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;gBAC3C;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;gBACnC;AACF,YAAA,KAAK,cAAc;AACjB,gBAAA,IAAI,CAAC,4BAA4B,CAAC,gBAAgB,CAAC;gBACnD;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC;gBAC7C;;;IAIN,QAAQ,GAAA;QACN,IAAI,CAAC,wBAAwB,EAAE;QAC/B,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,uBAAuB,EAAE;;QAE9B,IAAI,CAAC,qBAAqB,EAAE;;QAG5B,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CACH,MAAM,CAAC,KAAK,IAAI,KAAK,YAAY,aAAa,CAAC,EAC/C,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC,CAAC,KAAoB,KAAI;;AAElC,YAAA,IAAI,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACvM,gBAAA,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC;gBACxE,IAAI,CAAC,qBAAqB,EAAE;;AAEhC,SAAC,CAAC;;AAGN;;AAEG;IACK,wBAAwB,GAAA;AAC9B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA;AACE,gBAAA,EAAE,EAAE,MAAM;AACV,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,GAAG,EAAE;AACN;AACF,SAAA,CAAC;;AAGJ;;AAEG;IACH,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC;AACzC,QAAA,MAAM,OAAO,GAAwB;AACnC,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,eAAe,EAAE;SAClB;AAED,QAAA,IAAI,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,OAAO;AAC7D,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAA8C,KAAI;gBACvD,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACtC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAsB,CAAC;;qBACxD;AACL,oBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;;AAElC,gBAAA,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC;aAC3C;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC;AAC9D,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;AAChC,gBAAA,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC;;AAE7C,SAAA,CAAC;;AAGN;;AAEG;AACH,IAAA,oBAAoB,CAAC,cAAiD,EAAA;QACpE,MAAM,SAAS,GAAG,OAAO,cAAc,KAAK,QAAQ,GAAG,cAAc,IAAI,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;AACxH,QAAA,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,CAAC;AAEnD,QAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;QAE5B,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC;YACjF,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC;;AAGtD,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC7B,gBAAA,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC;;;iBAEnC;AACL,gBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;AACjC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;;gBAEvB,IAAI,CAAC,qBAAqB,EAAE;;;aAEzB;AACL,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;;YAEvB,IAAI,CAAC,qBAAqB,EAAE;;;AAIhC;;AAEG;AACH,IAAA,wBAAwB,CAAC,cAAsB,EAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAiC,IAAI,4BAA4B,CAAC;AAC7E,YAAA,8BAA8B,EAAE,cAAc;AAC9C,YAAA,UAAU,EAAE;AACb,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,OAAO;AAC7D,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAA0C,KAAI;gBACnD,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACtC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAA4B,CAAC;;AAEpE,oBAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;;;;qBAG9B;AACL,oBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;;AAEnC,gBAAA,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,KAAK,CAAC;aAC5C;AACD,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC;AAC/D,gBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;AACjC,gBAAA,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,KAAK,CAAC;;AAE9C,SAAA,CAAC;;AAGN;;AAEG;AACH,IAAA,cAAc,CAAC,QAA2C,EAAA;QACxD,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK,QAAQ,GAAG,QAAQ,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AAC7F,QAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC;AAEzC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;;QAGzB,IAAI,CAAC,qBAAqB,EAAE;;AAG9B;;AAEG;AACH,IAAA,0BAA0B,CAAC,KAAU,EAAA;;AAEnC,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;;;;AAK5B;;AAEG;IACK,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AAC7E,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC;YAEpE,IAAI,WAAW,EAAE;;AAEf,gBAAA,MAAM,SAAS,GAAG,wBAAwB,CAAC,WAAW,CAAC;AACvD,gBAAA,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,SAAS,CAAC;AAElE,gBAAA,IAAI,SAAS,EAAE,SAAS,EAAE;oBACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAmB,CAAC;oBAChD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,SAAS,CAAC,SAAS,CAAC;;AAG9D,gBAAA,IAAI,SAAS,EAAE,SAAS,EAAE;oBACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAmB,CAAC;oBAChD,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,SAAS,CAAC,SAAS,CAAC;;;AAGzE,SAAC,CAAC;;AAGJ;;AAEG;IACK,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGpB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,MAAM,OAAO,GAAsB,IAAI,iBAAiB,CAAC;AACvD,YAAA,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,KAAK;AACjB,YAAA,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;AAC9B,YAAA,IAAI,EAAE;AACJ,gBAAA,GAAG,EAAE,YAAY;AACjB,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA,6BAA6B,EAAE,QAAQ,IAAI,EAAE;AAC7C,YAAA,6BAA6B,EAAE,QAAQ,IAAI,EAAE;AAC9C,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,OAAO;AACzD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,QAAQ,CAAC,IAAI,CAAC;AAC5D,oBAAA,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;wBACvE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG;wBACzB,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU;wBACvC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,6BAA6B;AAC5D,wBAAA,cAAc,EAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAS,CAAC,6BAA6B,IAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAS,CAAC,oCAAoC;wBACzI,gBAAgB,EAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,6BAA6B;wBACvE,kBAAkB,EAAE,QAAS,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAS,CAAC,6BAA6B,IAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAS,CAAC,oCAAoC;AACtJ,qBAAA,GAAG,SAAS,CAAC;oBACd,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACzC,IAAI,CAAC,cAAc,EAAE;AACrB,oBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA,OAAA,EAAU,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA,oCAAA,CAAsC,CAAC;;qBACjG;AACL,oBAAA,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC;AACtD,oBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,IAAI,CAAC,cAAc,EAAE;AACrB,oBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,+BAA+B,CAAC;;AAEnE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;aACxB;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;AAC5D,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC;AACpD,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,oCAAoC,CAAC;;AAEvE,SAAA,CAAC;;AAGN;;;AAGG;AACK,IAAA,oBAAoB,CAAC,KAAyB,EAAA;AACpD,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAG;AACtB,YAAA,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,EAAE;;;;;AAOlC,YAAA,IAAI,cAAc,CAAC,6BAA6B,EAAE;AAChD,gBAAA,IAAI,OAAO,cAAc,CAAC,6BAA6B,KAAK,QAAQ,EAAE;;AAEpE,oBAAA,MAAM,YAAY,GAAG,cAAc,CAAC,6BAAoC;oBACxE,IAAI,CAAC,YAAY,CAAC,kBAAkB,IAAI,YAAY,CAAC,WAAW,EAAE;AAChE,wBAAA,YAAY,CAAC,kBAAkB,GAAG,YAAY,CAAC,WAAW;;;AAEvD,qBAAA,IAAI,OAAO,cAAc,CAAC,6BAA6B,KAAK,QAAQ,EAAE;;AAE3E,oBAAA,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC;;;;;AAMpG,YAAA,IAAI,cAAc,CAAC,6BAA6B,EAAE;AAChD,gBAAA,IAAI,OAAO,cAAc,CAAC,6BAA6B,KAAK,QAAQ,EAAE;;AAEpE,oBAAA,MAAM,cAAc,GAAG,cAAc,CAAC,6BAAoC;AAC1E,oBAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;AAC/B,wBAAA,cAAc,CAAC,WAAW,GAAG,KAAK;;;AAE/B,qBAAA,IAAI,OAAO,cAAc,CAAC,6BAA6B,KAAK,QAAQ,EAAE;;AAE3E,oBAAA,OAAO,CAAC,IAAI,CAAC,mFAAmF,CAAC;;;iBAE9F;;;;gBAIJ,cAAsB,CAAC,6BAA6B,GAAG;AACtD,oBAAA,GAAG,EAAE,IAAI;AACT,oBAAA,WAAW,EAAE;iBACd;;AAGH,YAAA,OAAO,cAAc;AACvB,SAAC,CAAC;;AAGJ;;AAEG;IACK,cAAc,GAAA;AACpB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,EAAE;QACtD,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;QAEhE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK;AAChC,YAAA,GAAG,MAAM;AACT,YAAA,IAAI,EAAE;AACP,SAAA,CAAC,CAAC;;AAIL;;AAEG;AACH,IAAA,WAAW,CAAC,KAAkC,EAAA;AAC5C,QAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,YAAA,KAAK,YAAY;gBACf,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,IAAI,KAAK,CAAC,IAAI,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE;oBACzG,IAAI,CAAC,qBAAqB,EAAE;;gBAE9B;AACF,YAAA,KAAK,QAAQ;gBACX,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC;gBACzC,IAAI,CAAC,cAAc,EAAE;gBACrB;AACF,YAAA,KAAK,SAAS;gBACZ,IAAI,CAAC,qBAAqB,EAAE;gBAC5B;;;AAIN;;AAEG;IACH,sBAAsB,GAAA;;QAEpB,MAAM,WAAW,GAAQ,EAAE;AAE3B,QAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAC5D,IAAI,sBAAsB,EAAE;AAC1B,YAAA,WAAW,CAAC,SAAS,GAAG,sBAAsB;;AAGhD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAChD,IAAI,gBAAgB,EAAE;AACpB,YAAA,WAAW,CAAC,SAAS,GAAG,gBAAgB;;;QAI1C,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACvC,YAAA,MAAM,WAAW,GAAG,wBAAwB,CAAC,WAAW,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,+CAA+C,EAAE,WAAW,CAAC,CAAC;;aAC/E;;YAEL,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,+CAA+C,CAAC,CAAC;;;AAI3E;;AAEG;AACH,IAAA,YAAY,CAAC,UAA4B,EAAA;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;AACnB,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,uBAAuB,CAAC;YACvD;;AAGF,QAAA,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,UAAU,CAAC;;AAG3D,QAAA,MAAM,cAAc,GAAG,OAAO,UAAU,CAAC,6BAA6B,KAAK;cACvE,UAAU,CAAC;AACb,cAAE,UAAU,CAAC,6BAA6B,EAAE,GAAG;;AAGjD,QAAA,IAAI,QAA4B;QAChC,MAAM,WAAW,GAAI,UAAkB,CAAC,6BAA6B,IAAI,UAAU,CAAC,oCAAoC;QAExH,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACnC,QAAQ,GAAG,WAAW;;iBACjB,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE;AAClE,gBAAA,QAAQ,GAAG,WAAW,CAAC,GAAG;;;AAI9B,QAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,QAAQ,CAAC;;QAGvD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE;YAC9C,IAAI,cAAc,EAAE;gBAClB,QAAQ,GAAG,cAAc;AACzB,gBAAA,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC;;;;QAKtD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,EAAE;YACzC,IAAI,iBAAiB,EAAE;gBACrB,QAAQ,GAAG,iBAAiB;AAC5B,gBAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,QAAQ,CAAC;;;;AAK/D,QAAA,MAAM,WAAW,GAAQ;YACvB,QAAQ,EAAE,UAAU,CAAC,GAAG;YACxB,eAAe,EAAE,UAAU,CAAC;SAC7B;QAED,IAAI,cAAc,EAAE;AAClB,YAAA,WAAW,CAAC,SAAS,GAAG,cAAc;;QAGxC,IAAI,QAAQ,EAAE;AACZ,YAAA,WAAW,CAAC,SAAS,GAAG,QAAQ;;AAGlC,QAAA,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,WAAW,CAAC;AAEjE,QAAA,MAAM,WAAW,GAAG,wBAAwB,CAAC,WAAW,CAAC;AACzD,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,WAAW,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,+CAA+C,EAAE,WAAW,CAAC,CAAC;;AAGtF;;AAEG;AACH,IAAA,oBAAoB,CAAC,gBAAkC,EAAA;AACrD,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,wCAAwC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;;AAGxF;;AAEG;AACH,IAAA,oBAAoB,CAAC,gBAAkC,EAAA;AACrD,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE;AACzB,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,uBAAuB,CAAC;YACvD;;;AAIF,QAAA,MAAM,WAAW,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,6CAA6C,EAAE,WAAW,CAAC,CAAC;;AAGpF;;AAEG;AACH,IAAA,sBAAsB,CAAC,gBAAkC,EAAA;AACvD,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,SAAkB,KAAI;YAC9F,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,gBAAA,MAAM,OAAO,GAAmC;oBAC9C,QAAQ,EAAE,gBAAgB,CAAC;iBAC5B;AAED,gBAAA,IAAI,CAAC,uBAAuB,CAAC,sBAAsB,CAAC,OAAO;AACxD,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,qBAAA,SAAS,CAAC;AACT,oBAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,wBAAA,IAAI,QAAQ,EAAE,OAAO,EAAE;4BACrB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,IACjC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,CAAC,CACtD;4BACD,IAAI,CAAC,cAAc,EAAE;AACrB,4BAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,0CAA0C,CAAC;;6BACvE;AACL,4BAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,sCAAsC,CAAC;;AAExE,wBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;qBACxB;AACD,oBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,wBAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;AAC5D,wBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,sCAAsC,CAAC;AACtE,wBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;AAE1B,iBAAA,CAAC;;AAER,SAAC,CAAC;;AAGJ;;AAEG;AACH,IAAA,4BAA4B,CAAC,gBAAkC,EAAA;AAC7D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,MAAM,OAAO,GAAyC;YACpD,QAAQ,EAAE,gBAAgB,CAAC;SAC5B;AAED,QAAA,IAAI,CAAC,uBAAuB,CAAC,4BAA4B,CAAC,OAAO;AAC9D,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,QAAQ,EAAE,OAAO,EAAE;oBACrB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,IACjC,KAAK,CAAC,GAAG,CAAC,GAAG,IACX,GAAG,CAAC,GAAG,KAAK,gBAAgB,CAAC;0BACzB,EAAE,GAAG,GAAG,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,cAAc;AAC/C,0BAAE,GAAG,CACR,CACF;oBACD,IAAI,CAAC,cAAc,EAAE;AACrB,oBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA,mBAAA,EAAsB,gBAAgB,CAAC,cAAc,GAAG,aAAa,GAAG,WAAW,CAAA,cAAA,CAAgB,CAAC;;qBAChI;AACL,oBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,6CAA6C,CAAC;;AAE/E,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;aACxB;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC;AACnE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,6CAA6C,CAAC;AAC7E,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;AAE1B,SAAA,CAAC;;AAGN;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,qBAAqB,EAAE;;uGAn0BnB,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,2/BCpG1C,ygMAkJA,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvEI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,wBAAwB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,iBAAiB,+FACjB,sBAAsB,EAAA,QAAA,EAAA,0DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,IAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,mBAAmB,4ZACnB,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAkBpB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA7BzC,SAAS;+BACE,wCAAwC,EAAA,UAAA,EACtC,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,wBAAwB;wBACxB,iBAAiB;wBACjB,sBAAsB;wBACtB,wBAAwB;wBACxB,mBAAmB;wBACnB;AACD,qBAAA,EAAA,QAAA,EAAA,ygMAAA,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA;;;;;"}
|