cloud-ide-academics 0.0.23 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{cloud-ide-academics-class-program-term-create.component-CD-JRaOo.mjs → cloud-ide-academics-class-program-term-create.component-C5FnRTND.mjs} +43 -6
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-C5FnRTND.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-class-program-term-list.component-Bp-jTkgq.mjs → cloud-ide-academics-class-program-term-list.component-BaFtTKcS.mjs} +95 -7
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-BaFtTKcS.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-cloud-ide-academics-DfUIvaVH.mjs → cloud-ide-academics-cloud-ide-academics-DxRzuyxa.mjs} +26 -16
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-DxRzuyxa.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-create.component-BPgeglM_.mjs → cloud-ide-academics-program-class-create.component-Co60CYKC.mjs} +40 -5
- package/fesm2022/cloud-ide-academics-program-class-create.component-Co60CYKC.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-list.component-x8jYxy7J.mjs → cloud-ide-academics-program-class-list.component-jPpK9V-X.mjs} +11 -9
- package/fesm2022/cloud-ide-academics-program-class-list.component-jPpK9V-X.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dx9JQOwW.mjs +214 -0
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dx9JQOwW.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-term-section-list.component-Q2nO1n4a.mjs → cloud-ide-academics-program-term-section-list.component-Dshnvq8K.mjs} +22 -5
- package/fesm2022/cloud-ide-academics-program-term-section-list.component-Dshnvq8K.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/cloud-ide-academics-class-program-term-create.component-CD-JRaOo.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-class-program-term-list.component-Bp-jTkgq.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-DfUIvaVH.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-class-create.component-BPgeglM_.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-class-list.component-x8jYxy7J.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-DQH-DeS0.mjs +0 -211
- package/fesm2022/cloud-ide-academics-program-term-section-create.component-DQH-DeS0.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-program-term-section-list.component-Q2nO1n4a.mjs.map +0 -1
|
@@ -6,9 +6,9 @@ import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
|
6
6
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
7
7
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
8
|
import { NotificationService, ConfirmationService, CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideIconComponent, CideSelectComponent } from 'cloud-ide-element';
|
|
9
|
-
import { AppStateHelperService } from 'cloud-ide-layout';
|
|
9
|
+
import { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
|
|
10
10
|
import { ENTITY_SERVICE_TOKEN } from 'cloud-ide-shared';
|
|
11
|
-
import { b as CideLytClassProgramBranchService, C as CideLytProgramClassService } from './cloud-ide-academics-cloud-ide-academics-
|
|
11
|
+
import { b as CideLytClassProgramBranchService, C as CideLytProgramClassService } from './cloud-ide-academics-cloud-ide-academics-DxRzuyxa.mjs';
|
|
12
12
|
import { C as CideLytClassProgramTermService } from './cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs';
|
|
13
13
|
import { generateObjectFromString } from 'cloud-ide-lms-model';
|
|
14
14
|
|
|
@@ -42,6 +42,8 @@ class ClassProgramTermCreateComponent {
|
|
|
42
42
|
// Route parameters
|
|
43
43
|
acabrnId = signal(null, ...(ngDevMode ? [{ debugName: "acabrnId" }] : []));
|
|
44
44
|
acacpmId = signal(null, ...(ngDevMode ? [{ debugName: "acacpmId" }] : []));
|
|
45
|
+
// Signal for breadcrumb data that will be passed to shared wrapper
|
|
46
|
+
breadcrumbData = signal([], ...(ngDevMode ? [{ debugName: "breadcrumbData" }] : []));
|
|
45
47
|
// Date constraints
|
|
46
48
|
endDateMinDate = signal('', ...(ngDevMode ? [{ debugName: "endDateMinDate" }] : []));
|
|
47
49
|
constructor() {
|
|
@@ -62,6 +64,38 @@ class ClassProgramTermCreateComponent {
|
|
|
62
64
|
ngOnInit() {
|
|
63
65
|
this.initializeComponent();
|
|
64
66
|
this.setupFormSubscriptions();
|
|
67
|
+
this.updateBreadcrumbData();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Update breadcrumb data based on mode
|
|
71
|
+
*/
|
|
72
|
+
updateBreadcrumbData() {
|
|
73
|
+
const additionalItems = [];
|
|
74
|
+
if (this.isViewMode()) {
|
|
75
|
+
additionalItems.push({
|
|
76
|
+
id: 'view',
|
|
77
|
+
label: 'View',
|
|
78
|
+
icon: 'visibility',
|
|
79
|
+
url: undefined
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else if (this.isEditMode()) {
|
|
83
|
+
additionalItems.push({
|
|
84
|
+
id: 'edit',
|
|
85
|
+
label: 'Edit',
|
|
86
|
+
icon: 'edit',
|
|
87
|
+
url: undefined
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
additionalItems.push({
|
|
92
|
+
id: 'create',
|
|
93
|
+
label: 'Create',
|
|
94
|
+
icon: 'add',
|
|
95
|
+
url: undefined
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
this.breadcrumbData.set(additionalItems);
|
|
65
99
|
}
|
|
66
100
|
/**
|
|
67
101
|
* Setup form subscriptions for dependent dropdowns
|
|
@@ -130,6 +164,8 @@ class ClassProgramTermCreateComponent {
|
|
|
130
164
|
this.isEditMode.set(false);
|
|
131
165
|
this.isViewMode.set(false);
|
|
132
166
|
}
|
|
167
|
+
// Update breadcrumb after mode is determined
|
|
168
|
+
this.updateBreadcrumbData();
|
|
133
169
|
// Load dropdown options
|
|
134
170
|
this.loadDropdownOptions();
|
|
135
171
|
}
|
|
@@ -559,7 +595,7 @@ class ClassProgramTermCreateComponent {
|
|
|
559
595
|
console.log('🧹 ClassProgramTermCreateComponent: Component state cleaned up');
|
|
560
596
|
}
|
|
561
597
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermCreateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
562
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ClassProgramTermCreateComponent, isStandalone: true, selector: "cide-academics-class-program-term-create", ngImport: i0, template: "<!-- \r\n CLASS PROGRAM TERM MASTER FORM\r\n \r\n Enterprise-Level Styling with Tailwind CSS\r\n Features: Responsive grids, proper typography, enhanced user experience\r\n-->\r\n\r\n<div class=\"tw-w-full tw-h-full\">\r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Simple Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">\r\n {{ getPageTitle() }}\r\n </h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Back button or other actions can be added here if needed -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <!-- Class Program Term Information -->\r\n <div class=\"tw-space-y-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\r\n size=\"md\" leadingIcon=\"code\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\r\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div>\r\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\r\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\r\n </cide-ele-textarea>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\r\n size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\r\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-blue-700\">\r\n Sequence will be automatically managed through drag-and-drop on the listing page\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_id_acacpm\" \r\n placeholder=\"Select program class\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acacpm_alise_title\" \r\n [options]=\"programClassOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program Branch *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_branch_id_acabrn\" \r\n placeholder=\"Select branch\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acabrn_name\" \r\n [options]=\"branchOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onActiveCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onLockedCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Display -->\r\n @if (error()) {\r\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\r\n [disabled]=\"loading()\">\r\n Reset Form\r\n </button>\r\n\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\r\n [loading]=\"loading()\" leftIcon=\"save\">\r\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { 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: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading", "valueKey", "labelKey"], outputs: ["ngModelChange", "change", "searchChange"] }] });
|
|
598
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ClassProgramTermCreateComponent, isStandalone: true, selector: "cide-academics-class-program-term-create", ngImport: i0, template: "<!-- \r\n CLASS PROGRAM TERM MASTER FORM\r\n \r\n Enterprise-Level Styling with Tailwind CSS\r\n Features: Responsive grids, proper typography, enhanced user experience\r\n-->\r\n\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n \r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <!-- Class Program Term Information -->\r\n <div class=\"tw-space-y-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\r\n size=\"md\" leadingIcon=\"code\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\r\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div>\r\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\r\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\r\n </cide-ele-textarea>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\r\n size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\r\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-blue-700\">\r\n Sequence will be automatically managed through drag-and-drop on the listing page\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_id_acacpm\" \r\n placeholder=\"Select program class\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acacpm_alise_title\" \r\n [options]=\"programClassOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program Branch *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_branch_id_acabrn\" \r\n placeholder=\"Select branch\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acabrn_name\" \r\n [options]=\"branchOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onActiveCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onLockedCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Display -->\r\n @if (error()) {\r\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\r\n [disabled]=\"loading()\">\r\n Reset Form\r\n </button>\r\n\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\r\n [loading]=\"loading()\" leftIcon=\"save\">\r\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</cide-lyt-shared-wrapper>\r\n\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { 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: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading", "valueKey", "labelKey"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }] });
|
|
563
599
|
}
|
|
564
600
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermCreateComponent, decorators: [{
|
|
565
601
|
type: Component,
|
|
@@ -570,9 +606,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
570
606
|
CideTextareaComponent,
|
|
571
607
|
CideEleButtonComponent,
|
|
572
608
|
CideIconComponent,
|
|
573
|
-
CideSelectComponent
|
|
574
|
-
|
|
609
|
+
CideSelectComponent,
|
|
610
|
+
CideLytSharedWrapperComponent
|
|
611
|
+
], template: "<!-- \r\n CLASS PROGRAM TERM MASTER FORM\r\n \r\n Enterprise-Level Styling with Tailwind CSS\r\n Features: Responsive grids, proper typography, enhanced user experience\r\n-->\r\n\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n \r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <!-- Class Program Term Information -->\r\n <div class=\"tw-space-y-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\r\n size=\"md\" leadingIcon=\"code\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\r\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div>\r\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\r\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\r\n </cide-ele-textarea>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\r\n size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\r\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-blue-700\">\r\n Sequence will be automatically managed through drag-and-drop on the listing page\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_id_acacpm\" \r\n placeholder=\"Select program class\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acacpm_alise_title\" \r\n [options]=\"programClassOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program Branch *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_branch_id_acabrn\" \r\n placeholder=\"Select branch\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acabrn_name\" \r\n [options]=\"branchOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onActiveCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onLockedCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Display -->\r\n @if (error()) {\r\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\r\n [disabled]=\"loading()\">\r\n Reset Form\r\n </button>\r\n\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\r\n [loading]=\"loading()\" leftIcon=\"save\">\r\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</cide-lyt-shared-wrapper>\r\n\r\n" }]
|
|
575
612
|
}], ctorParameters: () => [] });
|
|
576
613
|
|
|
577
614
|
export { ClassProgramTermCreateComponent };
|
|
578
|
-
//# sourceMappingURL=cloud-ide-academics-class-program-term-create.component-
|
|
615
|
+
//# sourceMappingURL=cloud-ide-academics-class-program-term-create.component-C5FnRTND.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-ide-academics-class-program-term-create.component-C5FnRTND.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/class-program-term-management/components/class-program-term-create/class-program-term-create.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/class-program-term-management/components/class-program-term-create/class-program-term-create.component.html"],"sourcesContent":["import { Component, inject, signal, OnInit, DestroyRef, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideIconComponent, CideSelectComponent, NotificationService, ConfirmationService } from 'cloud-ide-element';\r\nimport { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';\r\nimport { ENTITY_SERVICE_TOKEN, type IEntityService } from 'cloud-ide-shared';\r\nimport { CideLytClassProgramBranchService } from '../../../class-program-branch-management/services/class-program-branch.service';\r\nimport { CideLytProgramClassService } from '../../../program-class-management/services/program-class.service';\r\nimport { CideLytClassProgramTermService } from '../../services/class-program-term.service';\r\nimport { Observable, forkJoin, of } from 'rxjs';\r\nimport { map, catchError, switchMap } from 'rxjs/operators';\r\nimport { \r\n type AcaClassPrgBranchListPayload,\r\n type AcaClassPrgBranchResponse,\r\n type MClassProgramTermInsertUpdatePayload,\r\n generateObjectFromString\r\n} from 'cloud-ide-lms-model';\r\n\r\n// Interfaces based on the model files\r\ninterface ClassProgramTerm {\r\n _id?: string;\r\n acapt_code?: string;\r\n acapt_name?: string;\r\n acapt_description?: string;\r\n acapt_class_program_id_acacpm?: string;\r\n acapt_class_program_branch_id_acabrn?: string;\r\n acapt_parent_class_prog_term_acapt?: string;\r\n acapt_sequence?: number;\r\n acapt_start_date?: string;\r\n acapt_end_date?: string;\r\n acapt_isactive?: boolean;\r\n acapt_islocked?: boolean;\r\n}\r\n\r\ninterface ProgramClass {\r\n _id?: string;\r\n acacpm_name?: string;\r\n acacpm_code?: string;\r\n acacpm_alise_title?: string;\r\n}\r\n\r\ninterface ClassProgramBranch {\r\n _id?: string;\r\n acabrn_name?: string;\r\n acabrn_code?: string;\r\n acabrn_class_program_id_acacpm?: any;\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'cide-academics-class-program-term-create',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n CideInputComponent,\r\n CideTextareaComponent,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n CideSelectComponent,\r\n CideLytSharedWrapperComponent\r\n ],\r\n templateUrl: './class-program-term-create.component.html'\r\n})\r\nexport class ClassProgramTermCreateComponent implements OnInit, OnDestroy {\r\n // Dependency injection\r\n private destroyRef = inject(DestroyRef);\r\n private fb = inject(FormBuilder);\r\n private entityService = inject<IEntityService>(ENTITY_SERVICE_TOKEN);\r\n private router = inject(Router);\r\n private route = inject(ActivatedRoute);\r\n private appState = inject(AppStateHelperService);\r\n private notificationService = inject(NotificationService);\r\n private confirmationService = inject(ConfirmationService);\r\n private classProgramBranchService = inject(CideLytClassProgramBranchService);\r\n private programClassService = inject(CideLytProgramClassService);\r\n private classProgramTermService = inject(CideLytClassProgramTermService);\r\n\r\n classProgramTermForm: FormGroup;\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n\r\n // Class program term information from route\r\n classProgramTermId = signal<string>('');\r\n isEditMode = signal(false);\r\n isViewMode = signal(false);\r\n\r\n // Data signals\r\n programClasses = signal<ProgramClass[]>([]);\r\n classProgramBranches = signal<ClassProgramBranch[]>([]);\r\n\r\n // Options for dropdowns\r\n programClassOptions = signal<ProgramClass[]>([]);\r\n branchOptions = signal<ClassProgramBranch[]>([]);\r\n parentTermOptions = signal<ClassProgramTerm[]>([]);\r\n\r\n // Route parameters\r\n acabrnId = signal<string | null>(null);\r\n acacpmId = signal<string | null>(null);\r\n\r\n // Signal for breadcrumb data that will be passed to shared wrapper\r\n breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\r\n\r\n // Date constraints\r\n endDateMinDate = signal<string>('');\r\n\r\n constructor() {\r\n this.classProgramTermForm = this.fb.group({\r\n // Basic Class Program Term Information\r\n acapt_code: ['', [Validators.required]],\r\n acapt_name: ['', [Validators.required]],\r\n acapt_description: [''],\r\n acapt_class_program_id_acacpm: ['', [Validators.required]],\r\n acapt_class_program_branch_id_acabrn: ['', [Validators.required]],\r\n acapt_parent_class_prog_term_acapt: [''],\r\n acapt_start_date: [''],\r\n acapt_end_date: [''],\r\n acapt_isactive: [true],\r\n acapt_islocked: [false]\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initializeComponent();\r\n this.setupFormSubscriptions();\r\n this.updateBreadcrumbData();\r\n }\r\n\r\n /**\r\n * Update breadcrumb data based on mode\r\n */\r\n private updateBreadcrumbData(): void {\r\n const additionalItems: { id: string; label: string; icon?: string; url?: string }[] = [];\r\n \r\n if (this.isViewMode()) {\r\n additionalItems.push({\r\n id: 'view',\r\n label: 'View',\r\n icon: 'visibility',\r\n url: undefined\r\n });\r\n } else if (this.isEditMode()) {\r\n additionalItems.push({\r\n id: 'edit',\r\n label: 'Edit',\r\n icon: 'edit',\r\n url: undefined\r\n });\r\n } else {\r\n additionalItems.push({\r\n id: 'create',\r\n label: 'Create',\r\n icon: 'add',\r\n url: undefined\r\n });\r\n }\r\n \r\n this.breadcrumbData.set(additionalItems);\r\n }\r\n\r\n /**\r\n * Setup form subscriptions for dependent dropdowns\r\n */\r\n private setupFormSubscriptions(): void {\r\n // Watch for program class changes to filter branches\r\n this.classProgramTermForm.get('acapt_class_program_id_acacpm')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(programClassId => {\r\n if (programClassId) {\r\n this.loadBranchesForProgramClass(programClassId);\r\n // Clear branch selection when program class changes\r\n this.classProgramTermForm.patchValue({\r\n acapt_class_program_branch_id_acabrn: ''\r\n });\r\n } else {\r\n this.branchOptions.set([]);\r\n }\r\n });\r\n\r\n // Watch for branch changes to determine parent term\r\n this.classProgramTermForm.get('acapt_class_program_branch_id_acabrn')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(branchId => {\r\n if (branchId) {\r\n this.determineParentTerm(branchId);\r\n } else {\r\n // Clear parent term when branch is cleared\r\n this.classProgramTermForm.patchValue({\r\n acapt_parent_class_prog_term_acapt: ''\r\n });\r\n }\r\n });\r\n\r\n // Watch for parent term changes to set date constraints\r\n this.classProgramTermForm.get('acapt_parent_class_prog_term_acapt')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(parentTermId => {\r\n this.loadParentTermDetails(parentTermId);\r\n });\r\n\r\n // Watch for start date changes to set minimum date for end date\r\n this.classProgramTermForm.get('acapt_start_date')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(startDate => {\r\n this.updateEndDateMinDate(startDate);\r\n });\r\n }\r\n\r\n /**\r\n * Initialize component\r\n */\r\n private initializeComponent(): void {\r\n // Check route parameters to determine mode\r\n this.checkRouteParams();\r\n \r\n const url = this.router.url;\r\n const queryParams = this.route.snapshot.queryParams;\r\n \r\n if (url.includes('/view/')) {\r\n this.isViewMode.set(true);\r\n this.loadClassProgramTermForView(queryParams);\r\n } else if (url.includes('/edit/')) {\r\n this.isEditMode.set(true);\r\n this.loadClassProgramTermForEdit(queryParams);\r\n } else {\r\n // Create mode\r\n this.isEditMode.set(false);\r\n this.isViewMode.set(false);\r\n }\r\n\r\n // Update breadcrumb after mode is determined\r\n this.updateBreadcrumbData();\r\n\r\n // Load dropdown options\r\n this.loadDropdownOptions();\r\n }\r\n\r\n /**\r\n * Check route parameters for acabrn_id and acacpm_id\r\n */\r\n private checkRouteParams(): void {\r\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\r\n const queryParams = params['query'];\r\n console.log('🏢 Route params:', params, 'queryParams:', queryParams);\r\n\r\n if (queryParams) {\r\n // Query parameters passed (following page-controls pattern)\r\n const queryData = generateObjectFromString(queryParams);\r\n console.log('🏢 Class Program Term Create params from route:', queryData);\r\n \r\n if (queryData?.acabrn_id) {\r\n this.acabrnId.set(queryData.acabrn_id as string);\r\n console.log('🏢 Branch ID from route:', queryData.acabrn_id);\r\n }\r\n \r\n if (queryData?.acacpm_id) {\r\n this.acacpmId.set(queryData.acacpm_id as string);\r\n console.log('🏢 Class Program ID from route:', queryData.acacpm_id);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load class program term for viewing\r\n */\r\n private loadClassProgramTermForView(queryParams: any): void {\r\n // Implementation for view mode\r\n this.classProgramTermForm.disable();\r\n }\r\n\r\n /**\r\n * Load class program term for editing\r\n */\r\n private loadClassProgramTermForEdit(queryParams: any): void {\r\n // Implementation for edit mode\r\n }\r\n\r\n /**\r\n * Load dropdown options\r\n */\r\n private loadDropdownOptions(): void {\r\n // Load program classes\r\n this.loadProgramClasses();\r\n \r\n // Load branches\r\n this.loadClassProgramBranches();\r\n }\r\n\r\n /**\r\n * Load program classes\r\n */\r\n private loadProgramClasses(): void {\r\n this.programClassService.getProgramClassList({ pagination: false })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n console.log('✅ Program classes loaded:', response);\r\n if (response?.success && response.data) {\r\n this.programClassOptions.set(response.data as ProgramClass[]);\r\n \r\n // Pre-select program class if provided in route\r\n const acacpmId = this.acacpmId();\r\n if (acacpmId) {\r\n this.classProgramTermForm.patchValue({\r\n acapt_class_program_id_acacpm: acacpmId\r\n });\r\n }\r\n } else {\r\n console.warn('⚠️ No program class data received');\r\n this.programClassOptions.set([]);\r\n }\r\n },\r\n error: (error) => {\r\n console.error('❌ Error loading program classes:', error);\r\n this.programClassOptions.set([]);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load class program branches\r\n */\r\n private loadClassProgramBranches(): void {\r\n const acacpmId = this.acacpmId();\r\n if (acacpmId) {\r\n this.loadBranchesForProgramClass(acacpmId);\r\n }\r\n }\r\n\r\n /**\r\n * Load branches for a specific program class\r\n */\r\n private loadBranchesForProgramClass(programClassId: string): void {\r\n const payload: AcaClassPrgBranchListPayload = {\r\n pagination: false,\r\n pageIndex: 0,\r\n pageSize: 100,\r\n acabrn_class_program_id_acacpm: programClassId\r\n };\r\n\r\n this.classProgramBranchService.getClassProgramBranchList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: any) => {\r\n console.log('✅ Class program branches loaded for program class:', programClassId, response);\r\n if (response?.success && response.data) {\r\n this.branchOptions.set(response.data as ClassProgramBranch[]);\r\n \r\n // Pre-select branch if provided in route and not already set\r\n const acabrnId = this.acabrnId();\r\n const currentBranchId = this.classProgramTermForm.get('acapt_class_program_branch_id_acabrn')?.value;\r\n if (acabrnId && !currentBranchId) {\r\n this.classProgramTermForm.patchValue({\r\n acapt_class_program_branch_id_acabrn: acabrnId\r\n });\r\n }\r\n } else {\r\n console.warn('⚠️ No branch data received');\r\n this.branchOptions.set([]);\r\n }\r\n },\r\n error: (error: any) => {\r\n console.error('❌ Error loading branches:', error);\r\n this.branchOptions.set([]);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Determine parent term based on selected branch\r\n * This method will be called internally when branch is selected\r\n */\r\n private determineParentTerm(branchId: string): void {\r\n // Find the selected branch from the options\r\n const selectedBranch = this.branchOptions().find(branch => branch._id === branchId);\r\n \r\n if (selectedBranch) {\r\n console.log('🏢 Determining parent term for branch:', selectedBranch.acabrn_name);\r\n \r\n // Load existing terms for this branch to find potential parent terms\r\n this.loadParentTermsForBranch(branchId);\r\n }\r\n }\r\n\r\n /**\r\n * Load parent terms for a specific branch\r\n */\r\n private loadParentTermsForBranch(branchId: string): void {\r\n // TODO: Implement API call to get existing terms for the branch\r\n // This will help determine which terms can be parent terms\r\n console.log('🏢 Loading parent terms for branch:', branchId);\r\n \r\n // Example implementation - replace with actual API call\r\n // const payload = {\r\n // acabrn_id: branchId,\r\n // pagination: false\r\n // };\r\n \r\n // this.classProgramTermService.getClassProgramTermList(payload)\r\n // .pipe(takeUntilDestroyed(this.destroyRef))\r\n // .subscribe({\r\n // next: (response) => {\r\n // if (response?.success && response.data) {\r\n // // Filter terms that can be parent terms (e.g., terms without parent)\r\n // const parentTerms = response.data.filter(term => !term.acapt_parent_class_prog_term_acapt);\r\n // this.parentTermOptions.set(parentTerms);\r\n // }\r\n // },\r\n // error: (error) => {\r\n // console.error('❌ Error loading parent terms:', error);\r\n // this.parentTermOptions.set([]);\r\n // }\r\n // });\r\n \r\n // For now, set empty array\r\n this.parentTermOptions.set([]);\r\n }\r\n\r\n /**\r\n * Load parent term details for date validation\r\n * This method will be called when a parent term is selected\r\n */\r\n private loadParentTermDetails(parentTermId: string): void {\r\n if (!parentTermId) {\r\n // Clear date constraints when no parent is selected\r\n this.clearDateConstraints();\r\n return;\r\n }\r\n\r\n // TODO: Implement API call to get parent term details\r\n // For now, we'll use mock data or implement based on your API\r\n console.log('🏢 Loading parent term details for ID:', parentTermId);\r\n \r\n // Example implementation - replace with actual API call\r\n // this.classProgramTermService.getClassProgramTermById({ _id: parentTermId })\r\n // .pipe(takeUntilDestroyed(this.destroyRef))\r\n // .subscribe({\r\n // next: (response) => {\r\n // if (response?.success && response.data) {\r\n // const parentTerm = response.data;\r\n // this.setDateConstraints(parentTerm.acapt_start_date, parentTerm.acapt_end_date);\r\n // }\r\n // },\r\n // error: (error) => {\r\n // console.error('❌ Error loading parent term details:', error);\r\n // }\r\n // });\r\n }\r\n\r\n /**\r\n * Set date constraints based on parent term dates\r\n */\r\n private setDateConstraints(parentStartDate: string, parentEndDate: string): void {\r\n console.log('🏢 Setting date constraints:', { parentStartDate, parentEndDate });\r\n \r\n // Update form validation to ensure child dates are within parent range\r\n const startDateControl = this.classProgramTermForm.get('acapt_start_date');\r\n const endDateControl = this.classProgramTermForm.get('acapt_end_date');\r\n \r\n if (startDateControl && endDateControl) {\r\n // Add custom validators for date range\r\n startDateControl.setValidators([\r\n this.dateRangeValidator(parentStartDate, parentEndDate, 'start')\r\n ]);\r\n endDateControl.setValidators([\r\n this.dateRangeValidator(parentStartDate, parentEndDate, 'end')\r\n ]);\r\n \r\n // Update validation\r\n startDateControl.updateValueAndValidity();\r\n endDateControl.updateValueAndValidity();\r\n }\r\n }\r\n\r\n /**\r\n * Clear date constraints when no parent is selected\r\n */\r\n private clearDateConstraints(): void {\r\n const startDateControl = this.classProgramTermForm.get('acapt_start_date');\r\n const endDateControl = this.classProgramTermForm.get('acapt_end_date');\r\n \r\n if (startDateControl && endDateControl) {\r\n // Remove custom validators\r\n startDateControl.clearValidators();\r\n endDateControl.clearValidators();\r\n \r\n // Update validation\r\n startDateControl.updateValueAndValidity();\r\n endDateControl.updateValueAndValidity();\r\n }\r\n }\r\n\r\n /**\r\n * Custom validator for date range constraints\r\n */\r\n private dateRangeValidator(parentStartDate: string, parentEndDate: string, dateType: 'start' | 'end') {\r\n return (control: any) => {\r\n if (!control.value || !parentStartDate || !parentEndDate) {\r\n return null; // No validation if no date or parent dates\r\n }\r\n\r\n const selectedDate = new Date(control.value);\r\n const parentStart = new Date(parentStartDate);\r\n const parentEnd = new Date(parentEndDate);\r\n\r\n if (dateType === 'start') {\r\n // Start date should be >= parent start date and < parent end date\r\n if (selectedDate < parentStart || selectedDate >= parentEnd) {\r\n return { \r\n dateRangeError: { \r\n message: `Start date must be between ${parentStartDate} and ${parentEndDate}` \r\n } \r\n };\r\n }\r\n } else if (dateType === 'end') {\r\n // End date should be > parent start date and <= parent end date\r\n if (selectedDate <= parentStart || selectedDate > parentEnd) {\r\n return { \r\n dateRangeError: { \r\n message: `End date must be between ${parentStartDate} and ${parentEndDate}` \r\n } \r\n };\r\n }\r\n }\r\n\r\n return null; // Valid\r\n };\r\n }\r\n\r\n /**\r\n * Update minimum date for end date based on start date\r\n */\r\n private updateEndDateMinDate(startDate: string): void {\r\n if (startDate) {\r\n // Set the minimum date for end date to be the start date\r\n this.endDateMinDate.set(startDate);\r\n \r\n // If end date is already set and is before the new start date, clear it\r\n const endDate = this.classProgramTermForm.get('acapt_end_date')?.value;\r\n if (endDate && endDate < startDate) {\r\n this.classProgramTermForm.patchValue({\r\n acapt_end_date: ''\r\n });\r\n }\r\n \r\n console.log('🏢 Updated end date minimum date to:', startDate);\r\n } else {\r\n // Clear minimum date constraint if no start date\r\n this.endDateMinDate.set('');\r\n }\r\n }\r\n\r\n\r\n onSubmit() {\r\n if (this.isViewMode()) {\r\n this.router.navigate(['/control-panel/program-term-section-management']);\r\n return;\r\n }\r\n\r\n if (this.classProgramTermForm.invalid) {\r\n this.notificationService.error('Please fill in all required fields correctly.');\r\n this.markFormGroupTouched();\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n const formData = this.classProgramTermForm.value;\r\n console.log('Class Program Term Form Data:', formData);\r\n\r\n // Prepare payload for API call\r\n const payload: MClassProgramTermInsertUpdatePayload = {\r\n acapt_code: formData.acapt_code,\r\n acapt_name: formData.acapt_name,\r\n acapt_class_program_id_acacpm: formData.acapt_class_program_id_acacpm,\r\n acapt_class_prg_branch_acabrn: formData.acapt_class_program_branch_id_acabrn,\r\n acapt_parent_class_prog_term_acapt: formData.acapt_parent_class_prog_term_acapt || null,\r\n acapt_start_date: formData.acapt_start_date,\r\n acapt_end_date: formData.acapt_end_date,\r\n acapt_isactive: formData.acapt_isactive,\r\n acapt_islocked: formData.acapt_islocked\r\n };\r\n\r\n // Add _id for edit mode\r\n if (this.isEditMode() && this.classProgramTermId()) {\r\n payload._id = this.classProgramTermId();\r\n }\r\n\r\n console.log('API Payload:', payload);\r\n\r\n // Make API call\r\n this.classProgramTermService.saveClassProgramTerm(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: any) => {\r\n console.log('✅ Class program term saved successfully:', response);\r\n \r\n if (response?.success) {\r\n const action = this.isEditMode() ? 'updated' : 'created';\r\n this.notificationService.success(`Class program term has been ${action} successfully.`);\r\n this.router.navigate(['/control-panel/program-term-section-management']);\r\n } else {\r\n this.error.set(response?.message || 'Failed to save class program term');\r\n this.notificationService.error(response?.message || 'Failed to save class program term');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error: any) => {\r\n console.error('❌ Error saving class program term:', error);\r\n this.error.set('Failed to save class program term');\r\n this.notificationService.error('Failed to save class program term. Please try again.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all form controls as touched to trigger validation display\r\n */\r\n private markFormGroupTouched(): void {\r\n Object.keys(this.classProgramTermForm.controls).forEach(key => {\r\n const control = this.classProgramTermForm.get(key);\r\n control?.markAsTouched();\r\n });\r\n }\r\n\r\n resetForm() {\r\n this.classProgramTermForm.reset({\r\n acapt_isactive: true,\r\n acapt_islocked: false\r\n });\r\n \r\n // Clear options when form is reset\r\n this.branchOptions.set([]);\r\n this.parentTermOptions.set([]);\r\n \r\n // Clear date constraints\r\n this.clearDateConstraints();\r\n this.endDateMinDate.set('');\r\n }\r\n\r\n /**\r\n * Go back to class program term list\r\n */\r\n goBackToClassProgramTermList(): void {\r\n this.router.navigate(['/control-panel/program-term-section-management']);\r\n }\r\n\r\n /**\r\n * Cancel form and optionally navigate back\r\n */\r\n cancelForm(): void {\r\n if (this.isEditMode()) {\r\n this.goBackToClassProgramTermList();\r\n } else {\r\n this.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Get page title based on mode\r\n */\r\n getPageTitle(): string {\r\n if (this.isViewMode()) return 'View Class Program Term';\r\n return this.isEditMode() ? 'Edit Class Program Term' : 'Create New Class Program Term';\r\n }\r\n\r\n /**\r\n * Handle Active card click to toggle checkbox\r\n */\r\n onActiveCardClick(): void {\r\n if (this.isViewMode()) {\r\n return; // Don't allow changes in view mode\r\n }\r\n \r\n const currentValue = this.classProgramTermForm.get('acapt_isactive')?.value;\r\n this.classProgramTermForm.patchValue({\r\n acapt_isactive: !currentValue\r\n });\r\n }\r\n\r\n /**\r\n * Handle Locked card click to toggle checkbox\r\n */\r\n onLockedCardClick(): void {\r\n if (this.isViewMode()) {\r\n return; // Don't allow changes in view mode\r\n }\r\n \r\n const currentValue = this.classProgramTermForm.get('acapt_islocked')?.value;\r\n this.classProgramTermForm.patchValue({\r\n acapt_islocked: !currentValue\r\n });\r\n }\r\n\r\n /**\r\n * Cleanup when component is destroyed\r\n */\r\n ngOnDestroy(): void {\r\n console.log('🧹 ClassProgramTermCreateComponent: Cleaning up component state');\r\n\r\n // Reset all signals to their initial state\r\n this.loading.set(false);\r\n this.error.set(null);\r\n this.classProgramTermId.set('');\r\n this.isEditMode.set(false);\r\n this.programClassOptions.set([]);\r\n this.branchOptions.set([]);\r\n this.parentTermOptions.set([]);\r\n\r\n // Reset form to initial state\r\n this.resetForm();\r\n\r\n console.log('🧹 ClassProgramTermCreateComponent: Component state cleaned up');\r\n }\r\n}\r\n","<!-- \r\n CLASS PROGRAM TERM MASTER FORM\r\n \r\n Enterprise-Level Styling with Tailwind CSS\r\n Features: Responsive grids, proper typography, enhanced user experience\r\n-->\r\n\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n \r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <!-- Class Program Term Information -->\r\n <div class=\"tw-space-y-6\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\r\n size=\"md\" leadingIcon=\"code\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\r\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div>\r\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\r\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\r\n </cide-ele-textarea>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\r\n size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\r\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-blue-700\">\r\n Sequence will be automatically managed through drag-and-drop on the listing page\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_id_acacpm\" \r\n placeholder=\"Select program class\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acacpm_alise_title\" \r\n [options]=\"programClassOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program Branch *</label>\r\n <cide-ele-select \r\n formControlName=\"acapt_class_program_branch_id_acabrn\" \r\n placeholder=\"Select branch\"\r\n [disabled]=\"isViewMode()\" \r\n valueKey=\"_id\" \r\n labelKey=\"acabrn_name\" \r\n [options]=\"branchOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onActiveCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\"\r\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\r\n [class.tw-opacity-60]=\"isViewMode()\"\r\n (click)=\"onLockedCardClick()\">\r\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Display -->\r\n @if (error()) {\r\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\r\n [disabled]=\"loading()\">\r\n Reset Form\r\n </button>\r\n\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\r\n [loading]=\"loading()\" leftIcon=\"save\">\r\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</cide-lyt-shared-wrapper>\r\n\r\n"],"names":[],"mappings":"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"}
|
|
@@ -7,11 +7,11 @@ import { FormsModule } from '@angular/forms';
|
|
|
7
7
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
8
8
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
9
9
|
import { NotificationService, ConfirmationService, CideEleDataGridComponent, CideIconComponent, CideEleButtonComponent, CideEleDropdownComponent, CideSelectComponent } from 'cloud-ide-element';
|
|
10
|
-
import { AppStateHelperService } from 'cloud-ide-layout';
|
|
11
|
-
import { AcaClassPrgBranchListPayload,
|
|
10
|
+
import { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
|
|
11
|
+
import { AcaClassPrgBranchListPayload, MClassProgramTerm, generateObjectFromString } from 'cloud-ide-lms-model';
|
|
12
12
|
import { C as CideLytClassProgramTermService } from './cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs';
|
|
13
13
|
import { CLASS_PROGRAM_MASTER_SERVICE_TOKEN } from 'cloud-ide-shared';
|
|
14
|
-
import { b as CideLytClassProgramBranchService } from './cloud-ide-academics-cloud-ide-academics-
|
|
14
|
+
import { b as CideLytClassProgramBranchService } from './cloud-ide-academics-cloud-ide-academics-DxRzuyxa.mjs';
|
|
15
15
|
|
|
16
16
|
class ClassProgramTermListComponent {
|
|
17
17
|
// Dependency injection
|
|
@@ -52,8 +52,15 @@ class ClassProgramTermListComponent {
|
|
|
52
52
|
classProgramBranchesLoading = signal(false, ...(ngDevMode ? [{ debugName: "classProgramBranchesLoading" }] : []));
|
|
53
53
|
selectedProgramClassId = signal(null, ...(ngDevMode ? [{ debugName: "selectedProgramClassId" }] : []));
|
|
54
54
|
selectedBranchId = signal(null, ...(ngDevMode ? [{ debugName: "selectedBranchId" }] : []));
|
|
55
|
+
// Program term dropdown signals
|
|
56
|
+
classProgramTermsForDropdown = signal([], ...(ngDevMode ? [{ debugName: "classProgramTermsForDropdown" }] : []));
|
|
57
|
+
classProgramTermsLoadingForDropdown = signal(false, ...(ngDevMode ? [{ debugName: "classProgramTermsLoadingForDropdown" }] : []));
|
|
58
|
+
selectedTermId = signal(null, ...(ngDevMode ? [{ debugName: "selectedTermId" }] : []));
|
|
59
|
+
// Signal for breadcrumb data that will be passed to shared wrapper
|
|
60
|
+
breadcrumbData = signal([], ...(ngDevMode ? [{ debugName: "breadcrumbData" }] : []));
|
|
55
61
|
// Computed signals for dropdown options
|
|
56
62
|
classProgramMastersOptions = computed(() => this.classProgramMasters(), ...(ngDevMode ? [{ debugName: "classProgramMastersOptions" }] : []));
|
|
63
|
+
classProgramTermsOptions = computed(() => this.classProgramTermsForDropdown(), ...(ngDevMode ? [{ debugName: "classProgramTermsOptions" }] : []));
|
|
57
64
|
// Computed signal to check if branch dropdown should be shown
|
|
58
65
|
showBranchDropdown = computed(() => {
|
|
59
66
|
const selectedProgram = this.selectedClassProgram();
|
|
@@ -240,10 +247,24 @@ class ClassProgramTermListComponent {
|
|
|
240
247
|
}
|
|
241
248
|
}
|
|
242
249
|
ngOnInit() {
|
|
250
|
+
this.initializeBreadcrumbData();
|
|
243
251
|
this.checkRouteParams();
|
|
244
252
|
this.loadClassProgramMasters();
|
|
245
253
|
this.loadClassProgramTerms();
|
|
246
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Initialize breadcrumb data for list view
|
|
257
|
+
*/
|
|
258
|
+
initializeBreadcrumbData() {
|
|
259
|
+
this.breadcrumbData.set([
|
|
260
|
+
{
|
|
261
|
+
id: 'list',
|
|
262
|
+
label: 'List',
|
|
263
|
+
icon: 'list',
|
|
264
|
+
url: undefined
|
|
265
|
+
}
|
|
266
|
+
]);
|
|
267
|
+
}
|
|
247
268
|
/**
|
|
248
269
|
* Load class program masters for dropdown
|
|
249
270
|
*/
|
|
@@ -291,6 +312,8 @@ class ClassProgramTermListComponent {
|
|
|
291
312
|
this.classProgramBranches.set([]);
|
|
292
313
|
this.selectedBranchId.set(null);
|
|
293
314
|
this.acabrnId.set(null);
|
|
315
|
+
// Load program terms directly if no branch dropdown
|
|
316
|
+
this.loadClassProgramTermsForDropdown(programId);
|
|
294
317
|
}
|
|
295
318
|
}
|
|
296
319
|
else {
|
|
@@ -298,6 +321,8 @@ class ClassProgramTermListComponent {
|
|
|
298
321
|
this.classProgramBranches.set([]);
|
|
299
322
|
this.selectedBranchId.set(null);
|
|
300
323
|
this.acabrnId.set(null);
|
|
324
|
+
this.classProgramTermsForDropdown.set([]);
|
|
325
|
+
this.selectedTermId.set(null);
|
|
301
326
|
}
|
|
302
327
|
this.loadClassProgramTerms();
|
|
303
328
|
}
|
|
@@ -316,6 +341,10 @@ class ClassProgramTermListComponent {
|
|
|
316
341
|
next: (response) => {
|
|
317
342
|
if (response?.success && response.data) {
|
|
318
343
|
this.classProgramBranches.set(response.data);
|
|
344
|
+
// Load program terms for dropdown when branches are loaded
|
|
345
|
+
if (this.selectedProgramClassId()) {
|
|
346
|
+
// Will be triggered when user selects a branch
|
|
347
|
+
}
|
|
319
348
|
}
|
|
320
349
|
else {
|
|
321
350
|
this.classProgramBranches.set([]);
|
|
@@ -337,8 +366,66 @@ class ClassProgramTermListComponent {
|
|
|
337
366
|
console.log('🔄 Branch changed:', branch);
|
|
338
367
|
this.selectedBranchId.set(branch);
|
|
339
368
|
this.acabrnId.set(branch);
|
|
369
|
+
// Load program terms for dropdown when branch changes
|
|
370
|
+
if (branch && this.selectedProgramClassId()) {
|
|
371
|
+
this.loadClassProgramTermsForDropdown(this.selectedProgramClassId(), branch);
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
this.classProgramTermsForDropdown.set([]);
|
|
375
|
+
this.selectedTermId.set(null);
|
|
376
|
+
}
|
|
340
377
|
this.loadClassProgramTerms();
|
|
341
378
|
}
|
|
379
|
+
/**
|
|
380
|
+
* Load class program terms for dropdown (filtered by class program and branch)
|
|
381
|
+
*/
|
|
382
|
+
loadClassProgramTermsForDropdown(classProgramId, branchId) {
|
|
383
|
+
this.classProgramTermsLoadingForDropdown.set(true);
|
|
384
|
+
const payload = new MClassProgramTerm({
|
|
385
|
+
pageIndex: 0,
|
|
386
|
+
pageSize: 1000,
|
|
387
|
+
query: "",
|
|
388
|
+
sort: {
|
|
389
|
+
key: 'acapt_name',
|
|
390
|
+
order: 'asc'
|
|
391
|
+
},
|
|
392
|
+
acapt_class_prg_branch_acabrn: branchId || "",
|
|
393
|
+
});
|
|
394
|
+
this.classProgramTermService.getClassProgramTermList(payload)
|
|
395
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
396
|
+
.subscribe({
|
|
397
|
+
next: (response) => {
|
|
398
|
+
if (response?.success && response.data) {
|
|
399
|
+
// Filter by class program ID if provided
|
|
400
|
+
let terms = response.data;
|
|
401
|
+
if (classProgramId) {
|
|
402
|
+
terms = terms.filter(term => term.acapt_class_program_id_acacpm?._id === classProgramId ||
|
|
403
|
+
(typeof term.acapt_class_program_id_acacpm === 'string' && term.acapt_class_program_id_acacpm === classProgramId));
|
|
404
|
+
}
|
|
405
|
+
this.classProgramTermsForDropdown.set(terms);
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
this.classProgramTermsForDropdown.set([]);
|
|
409
|
+
}
|
|
410
|
+
this.classProgramTermsLoadingForDropdown.set(false);
|
|
411
|
+
},
|
|
412
|
+
error: (error) => {
|
|
413
|
+
console.error('❌ Error loading class program terms for dropdown:', error);
|
|
414
|
+
this.classProgramTermsForDropdown.set([]);
|
|
415
|
+
this.classProgramTermsLoadingForDropdown.set(false);
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Handle program term selection change
|
|
421
|
+
*/
|
|
422
|
+
onTermChange(termId) {
|
|
423
|
+
const term = typeof termId === 'string' ? termId : (termId ? String(termId) : null);
|
|
424
|
+
console.log('🔄 Program Term changed:', term);
|
|
425
|
+
this.selectedTermId.set(term);
|
|
426
|
+
// Filter the main list by selected term if needed
|
|
427
|
+
// For now, we'll just store the selection
|
|
428
|
+
}
|
|
342
429
|
/**
|
|
343
430
|
* Handle class program master search
|
|
344
431
|
*/
|
|
@@ -532,7 +619,7 @@ class ClassProgramTermListComponent {
|
|
|
532
619
|
this.loadClassProgramTerms();
|
|
533
620
|
}
|
|
534
621
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
535
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ClassProgramTermListComponent, isStandalone: true, selector: "cide-academics-class-program-term-list", viewQueries: [{ propertyName: "classProgramTermDetailsRendererTemplate", first: true, predicate: ["classProgramTermDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "classProgramTermStatusRendererTemplate", first: true, predicate: ["classProgramTermStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Class Program Term Management Container -->\r\n<
|
|
622
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ClassProgramTermListComponent, isStandalone: true, selector: "cide-academics-class-program-term-list", viewQueries: [{ propertyName: "classProgramTermDetailsRendererTemplate", first: true, predicate: ["classProgramTermDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "classProgramTermStatusRendererTemplate", first: true, predicate: ["classProgramTermStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Class Program Term Management Container -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n \r\n <!-- Action Buttons in Breadcrumb Area -->\r\n <div breadcrumb-actions>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\r\n Create Class Program Term\r\n </button>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\r\n\r\n <!-- Filter Section -->\r\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\r\n <cide-ele-select\r\n [options]=\"classProgramMastersOptions()\"\r\n [ngModel]=\"selectedProgramClassId() || ''\"\r\n (ngModelChange)=\"onClassProgramChange($event)\"\r\n placeholder=\"Select Class Program\"\r\n valueKey=\"_id\"\r\n labelKey=\"acacpm_alise_title\"\r\n [loading]=\"classProgramMastersLoading()\"\r\n [searchable]=\"true\"\r\n (searchChange)=\"onClassProgramMasterSearch($event)\">\r\n </cide-ele-select>\r\n </div>\r\n \r\n @if (showBranchDropdown()) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\r\n <cide-ele-select\r\n [options]=\"classProgramBranches()\"\r\n [ngModel]=\"selectedBranchId() || ''\"\r\n (ngModelChange)=\"onBranchChange($event)\"\r\n placeholder=\"Select Specialization\"\r\n valueKey=\"_id\"\r\n labelKey=\"acabrn_name\"\r\n [loading]=\"classProgramBranchesLoading()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n \r\n @if (selectedProgramClassId() && (!showBranchDropdown() || selectedBranchId())) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Program Term</label>\r\n <cide-ele-select\r\n [options]=\"classProgramTermsOptions()\"\r\n [ngModel]=\"selectedTermId() || ''\"\r\n (ngModelChange)=\"onTermChange($event)\"\r\n placeholder=\"Select Program Term\"\r\n valueKey=\"_id\"\r\n labelKey=\"acapt_name\"\r\n [loading]=\"classProgramTermsLoadingForDropdown()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid Section -->\r\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n [templateRenderers]=\"templateRenderers()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n</div>\r\n</cide-lyt-shared-wrapper>\r\n\r\n<!-- Template Renderers -->\r\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <div class=\"tw-flex-shrink-0\">\r\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n </div>\r\n </div>\r\n <div class=\"tw-min-w-0 tw-flex-1\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\r\n {{ item.acapt_name }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ item.acapt_description }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n @if (item.acapt_iscurrent) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\r\n Current\r\n </span>\r\n }\r\n @if (item.acapt_islocked) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\r\n Locked\r\n </span>\r\n }\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': item.acapt_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !item.acapt_isactive\r\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\r\n <cide-ele-icon [ngClass]=\"{\r\n 'tw-text-green-600': item.acapt_isactive,\r\n 'tw-text-red-600': !item.acapt_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\r\n {{ item.acapt_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ item.acapt_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(item)\"\r\n (itemClick)=\"onDropdownItemClick($event, item)\"\r\n [config]=\"{\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm',\r\n usePortal: true\r\n }\"\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n icon=\"more_vert\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading", "valueKey", "labelKey"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }] });
|
|
536
623
|
}
|
|
537
624
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, decorators: [{
|
|
538
625
|
type: Component,
|
|
@@ -543,9 +630,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
543
630
|
CideIconComponent,
|
|
544
631
|
CideEleButtonComponent,
|
|
545
632
|
CideEleDropdownComponent,
|
|
546
|
-
CideSelectComponent
|
|
547
|
-
|
|
633
|
+
CideSelectComponent,
|
|
634
|
+
CideLytSharedWrapperComponent
|
|
635
|
+
], template: "<!-- Class Program Term Management Container -->\r\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n \r\n <!-- Action Buttons in Breadcrumb Area -->\r\n <div breadcrumb-actions>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\r\n Create Class Program Term\r\n </button>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\r\n\r\n <!-- Filter Section -->\r\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\r\n <cide-ele-select\r\n [options]=\"classProgramMastersOptions()\"\r\n [ngModel]=\"selectedProgramClassId() || ''\"\r\n (ngModelChange)=\"onClassProgramChange($event)\"\r\n placeholder=\"Select Class Program\"\r\n valueKey=\"_id\"\r\n labelKey=\"acacpm_alise_title\"\r\n [loading]=\"classProgramMastersLoading()\"\r\n [searchable]=\"true\"\r\n (searchChange)=\"onClassProgramMasterSearch($event)\">\r\n </cide-ele-select>\r\n </div>\r\n \r\n @if (showBranchDropdown()) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\r\n <cide-ele-select\r\n [options]=\"classProgramBranches()\"\r\n [ngModel]=\"selectedBranchId() || ''\"\r\n (ngModelChange)=\"onBranchChange($event)\"\r\n placeholder=\"Select Specialization\"\r\n valueKey=\"_id\"\r\n labelKey=\"acabrn_name\"\r\n [loading]=\"classProgramBranchesLoading()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n \r\n @if (selectedProgramClassId() && (!showBranchDropdown() || selectedBranchId())) {\r\n <div class=\"tw-w-64\">\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Program Term</label>\r\n <cide-ele-select\r\n [options]=\"classProgramTermsOptions()\"\r\n [ngModel]=\"selectedTermId() || ''\"\r\n (ngModelChange)=\"onTermChange($event)\"\r\n placeholder=\"Select Program Term\"\r\n valueKey=\"_id\"\r\n labelKey=\"acapt_name\"\r\n [loading]=\"classProgramTermsLoadingForDropdown()\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid Section -->\r\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n [templateRenderers]=\"templateRenderers()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n</div>\r\n</cide-lyt-shared-wrapper>\r\n\r\n<!-- Template Renderers -->\r\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <div class=\"tw-flex-shrink-0\">\r\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\r\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\r\n </div>\r\n </div>\r\n <div class=\"tw-min-w-0 tw-flex-1\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\r\n {{ item.acapt_name }}\r\n </h6>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\r\n {{ item.acapt_description }}\r\n </p>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n @if (item.acapt_iscurrent) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\r\n Current\r\n </span>\r\n }\r\n @if (item.acapt_islocked) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\r\n Locked\r\n </span>\r\n }\r\n <span [ngClass]=\"{\r\n 'tw-bg-green-100 tw-text-green-800': item.acapt_isactive,\r\n 'tw-bg-red-100 tw-text-red-800': !item.acapt_isactive\r\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\r\n <cide-ele-icon [ngClass]=\"{\r\n 'tw-text-green-600': item.acapt_isactive,\r\n 'tw-text-red-600': !item.acapt_isactive\r\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\r\n {{ item.acapt_isactive ? 'check_circle' : 'cancel' }}\r\n </cide-ele-icon>\r\n {{ item.acapt_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-item=\"item\" let-column=\"column\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(item)\"\r\n (itemClick)=\"onDropdownItemClick($event, item)\"\r\n [config]=\"{\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm',\r\n usePortal: true\r\n }\"\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n icon=\"more_vert\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n" }]
|
|
548
636
|
}] });
|
|
549
637
|
|
|
550
638
|
export { ClassProgramTermListComponent };
|
|
551
|
-
//# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-
|
|
639
|
+
//# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-BaFtTKcS.mjs.map
|