cloud-ide-academics 0.0.26 → 0.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (14) hide show
  1. package/fesm2022/{cloud-ide-academics-class-program-term-create.component-CM7vxAXT.mjs → cloud-ide-academics-class-program-term-create.component-BRbHViJN.mjs} +17 -4
  2. package/fesm2022/cloud-ide-academics-class-program-term-create.component-BRbHViJN.mjs.map +1 -0
  3. package/fesm2022/{cloud-ide-academics-class-program-term-list.component-BQ1Etnft.mjs → cloud-ide-academics-class-program-term-list.component-CP2vlRBP.mjs} +67 -83
  4. package/fesm2022/cloud-ide-academics-class-program-term-list.component-CP2vlRBP.mjs.map +1 -0
  5. package/fesm2022/{cloud-ide-academics-cloud-ide-academics-CFEjm3Iz.mjs → cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs} +10 -10
  6. package/fesm2022/{cloud-ide-academics-cloud-ide-academics-CFEjm3Iz.mjs.map → cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs.map} +1 -1
  7. package/fesm2022/{cloud-ide-academics-program-class-create.component-DG6m0cmY.mjs → cloud-ide-academics-program-class-create.component-KijRP6Nl.mjs} +2 -2
  8. package/fesm2022/{cloud-ide-academics-program-class-create.component-DG6m0cmY.mjs.map → cloud-ide-academics-program-class-create.component-KijRP6Nl.mjs.map} +1 -1
  9. package/fesm2022/{cloud-ide-academics-program-class-list.component-DizuYHy3.mjs → cloud-ide-academics-program-class-list.component-B5cy2Gpk.mjs} +2 -2
  10. package/fesm2022/{cloud-ide-academics-program-class-list.component-DizuYHy3.mjs.map → cloud-ide-academics-program-class-list.component-B5cy2Gpk.mjs.map} +1 -1
  11. package/fesm2022/cloud-ide-academics.mjs +1 -1
  12. package/package.json +1 -1
  13. package/fesm2022/cloud-ide-academics-class-program-term-create.component-CM7vxAXT.mjs.map +0 -1
  14. package/fesm2022/cloud-ide-academics-class-program-term-list.component-BQ1Etnft.mjs.map +0 -1
@@ -8,7 +8,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
8
  import { NotificationService, ConfirmationService, CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideIconComponent, CideSelectComponent } from 'cloud-ide-element';
9
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-CFEjm3Iz.mjs';
11
+ import { b as CideLytClassProgramBranchService, C as CideLytProgramClassService } from './cloud-ide-academics-cloud-ide-academics-g9qZGJtG.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,7 @@ class ClassProgramTermCreateComponent {
42
42
  // Route parameters
43
43
  acabrnId = signal(null, ...(ngDevMode ? [{ debugName: "acabrnId" }] : []));
44
44
  acacpmId = signal(null, ...(ngDevMode ? [{ debugName: "acacpmId" }] : []));
45
+ parentTermId = signal(null, ...(ngDevMode ? [{ debugName: "parentTermId" }] : []));
45
46
  // Signal for breadcrumb data that will be passed to shared wrapper
46
47
  breadcrumbData = signal([], ...(ngDevMode ? [{ debugName: "breadcrumbData" }] : []));
47
48
  // Date constraints
@@ -168,6 +169,13 @@ class ClassProgramTermCreateComponent {
168
169
  this.updateBreadcrumbData();
169
170
  // Load dropdown options
170
171
  this.loadDropdownOptions();
172
+ // Set parent term if provided from route (for child term creation)
173
+ const parentId = this.parentTermId();
174
+ if (parentId && !this.isEditMode() && !this.isViewMode()) {
175
+ this.classProgramTermForm.patchValue({
176
+ acapt_parent_class_prog_term_acapt: parentId
177
+ });
178
+ }
171
179
  }
172
180
  /**
173
181
  * Check route parameters for acabrn_id and acacpm_id
@@ -188,6 +196,11 @@ class ClassProgramTermCreateComponent {
188
196
  this.acacpmId.set(queryData.acacpm_id);
189
197
  console.log('🏢 Class Program ID from route:', queryData.acacpm_id);
190
198
  }
199
+ if (queryData?.acapt_parent_id || queryData?.acapt_id) {
200
+ const parentId = (queryData.acapt_parent_id || queryData.acapt_id);
201
+ this.parentTermId.set(parentId);
202
+ console.log('🏢 Parent Term ID from route:', parentId);
203
+ }
191
204
  }
192
205
  });
193
206
  }
@@ -626,7 +639,7 @@ class ClassProgramTermCreateComponent {
626
639
  console.log('🧹 ClassProgramTermCreateComponent: Component state cleaned up');
627
640
  }
628
641
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermCreateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
629
- 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: "<!-- \n CLASS PROGRAM TERM MASTER FORM\n \n Enterprise-Level Styling with Tailwind CSS\n Features: Responsive grids, proper typography, enhanced user experience\n-->\n\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <!-- Class Program Term Information -->\n <div class=\"tw-space-y-6\">\n <!-- Program Class and Branch at the top -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <div class=\"tw-space-y-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_id_acacpm\" \n placeholder=\"Select program class\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acacpm_alise_title\" \n [options]=\"programClassOptions()\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-space-y-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program Branch *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_branch_id_acabrn\" \n placeholder=\"Select branch\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acabrn_name\" \n [options]=\"branchOptions()\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\n size=\"md\" leadingIcon=\"code\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\n </cide-ele-input>\n </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\n size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\n <span class=\"tw-text-sm tw-text-blue-700\">\n Sequence will be automatically managed through drag-and-drop on the listing page\n </span>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onActiveCardClick()\">\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\n </div>\n </div>\n\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onLockedCardClick()\">\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Display -->\n @if (error()) {\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"tw-table-row tw-h-0\">\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\">\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\n [loading]=\"loading()\" leftIcon=\"save\">\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n</cide-lyt-shared-wrapper>\n\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"] }] });
642
+ 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: "<!-- \n CLASS PROGRAM TERM MASTER FORM\n \n Enterprise-Level Styling with Tailwind CSS\n Features: Responsive grids, proper typography, enhanced user experience\n-->\n\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <!-- Class Program Term Information -->\n <div class=\"tw-space-y-6\">\n <!-- Program Class and Branch at the top -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-6\">\n <div class=\"tw-space-y-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_id_acacpm\" \n placeholder=\"Select program class\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acacpm_alise_title\" \n [options]=\"programClassOptions()\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-space-y-2 md:tw-col-span-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Specialization *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_branch_id_acabrn\" \n placeholder=\"Select specialization\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acabrn_name\" \n [options]=\"branchOptions()\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\n size=\"md\" leadingIcon=\"code\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\n </cide-ele-input>\n </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\n size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\n <span class=\"tw-text-sm tw-text-blue-700\">\n Sequence will be automatically managed through drag-and-drop on the listing page\n </span>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onActiveCardClick()\">\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\n </div>\n </div>\n\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onLockedCardClick()\">\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Display -->\n @if (error()) {\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"tw-table-row tw-h-0\">\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\">\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\n [loading]=\"loading()\" leftIcon=\"save\">\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n</cide-lyt-shared-wrapper>\n\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"] }] });
630
643
  }
631
644
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermCreateComponent, decorators: [{
632
645
  type: Component,
@@ -639,8 +652,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
639
652
  CideIconComponent,
640
653
  CideSelectComponent,
641
654
  CideLytSharedWrapperComponent
642
- ], template: "<!-- \n CLASS PROGRAM TERM MASTER FORM\n \n Enterprise-Level Styling with Tailwind CSS\n Features: Responsive grids, proper typography, enhanced user experience\n-->\n\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <!-- Class Program Term Information -->\n <div class=\"tw-space-y-6\">\n <!-- Program Class and Branch at the top -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <div class=\"tw-space-y-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_id_acacpm\" \n placeholder=\"Select program class\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acacpm_alise_title\" \n [options]=\"programClassOptions()\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-space-y-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program Branch *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_branch_id_acabrn\" \n placeholder=\"Select branch\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acabrn_name\" \n [options]=\"branchOptions()\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\n size=\"md\" leadingIcon=\"code\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\n </cide-ele-input>\n </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\n size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\n <span class=\"tw-text-sm tw-text-blue-700\">\n Sequence will be automatically managed through drag-and-drop on the listing page\n </span>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onActiveCardClick()\">\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\n </div>\n </div>\n\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onLockedCardClick()\">\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Display -->\n @if (error()) {\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"tw-table-row tw-h-0\">\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\">\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\n [loading]=\"loading()\" leftIcon=\"save\">\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n</cide-lyt-shared-wrapper>\n\n" }]
655
+ ], template: "<!-- \n CLASS PROGRAM TERM MASTER FORM\n \n Enterprise-Level Styling with Tailwind CSS\n Features: Responsive grids, proper typography, enhanced user experience\n-->\n\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <!-- Class Program Term Information -->\n <div class=\"tw-space-y-6\">\n <!-- Program Class and Branch at the top -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-6\">\n <div class=\"tw-space-y-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_id_acacpm\" \n placeholder=\"Select program class\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acacpm_alise_title\" \n [options]=\"programClassOptions()\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-space-y-2 md:tw-col-span-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Specialization *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_branch_id_acabrn\" \n placeholder=\"Select specialization\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acabrn_name\" \n [options]=\"branchOptions()\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\n size=\"md\" leadingIcon=\"code\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\n </cide-ele-input>\n </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\n size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\n <span class=\"tw-text-sm tw-text-blue-700\">\n Sequence will be automatically managed through drag-and-drop on the listing page\n </span>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onActiveCardClick()\">\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\n </div>\n </div>\n\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onLockedCardClick()\">\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Display -->\n @if (error()) {\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"tw-table-row tw-h-0\">\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\">\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\n [loading]=\"loading()\" leftIcon=\"save\">\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n</cide-lyt-shared-wrapper>\n\n" }]
643
656
  }], ctorParameters: () => [] });
644
657
 
645
658
  export { ClassProgramTermCreateComponent };
646
- //# sourceMappingURL=cloud-ide-academics-class-program-term-create.component-CM7vxAXT.mjs.map
659
+ //# sourceMappingURL=cloud-ide-academics-class-program-term-create.component-BRbHViJN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-academics-class-program-term-create.component-BRbHViJN.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';\nimport { CommonModule } from '@angular/common';\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideIconComponent, CideSelectComponent, NotificationService, ConfirmationService } from 'cloud-ide-element';\nimport { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';\nimport { ENTITY_SERVICE_TOKEN, type IEntityService } from 'cloud-ide-shared';\nimport { CideLytClassProgramBranchService } from '../../../class-program-branch-management/services/class-program-branch.service';\nimport { CideLytProgramClassService } from '../../../program-class-management/services/program-class.service';\nimport { CideLytClassProgramTermService } from '../../services/class-program-term.service';\nimport { Observable, forkJoin, of } from 'rxjs';\nimport { map, catchError, switchMap } from 'rxjs/operators';\nimport { \n type AcaClassPrgBranchListPayload,\n type AcaClassPrgBranchResponse,\n type MClassProgramTermInsertUpdatePayload,\n generateObjectFromString\n} from 'cloud-ide-lms-model';\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 acapt_class_program_branch_id_acabrn?: string;\n acapt_parent_class_prog_term_acapt?: string;\n acapt_sequence?: number;\n acapt_start_date?: string;\n acapt_end_date?: string;\n acapt_isactive?: boolean;\n acapt_islocked?: boolean;\n}\n\ninterface ProgramClass {\n _id?: string;\n acacpm_name?: string;\n acacpm_code?: string;\n acacpm_alise_title?: string;\n}\n\ninterface ClassProgramBranch {\n _id?: string;\n acabrn_name?: string;\n acabrn_code?: string;\n acabrn_class_program_id_acacpm?: any;\n}\n\n\n@Component({\n selector: 'cide-academics-class-program-term-create',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './class-program-term-create.component.html'\n})\nexport class ClassProgramTermCreateComponent implements OnInit, OnDestroy {\n // Dependency injection\n private destroyRef = inject(DestroyRef);\n private fb = inject(FormBuilder);\n private entityService = inject<IEntityService>(ENTITY_SERVICE_TOKEN);\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 classProgramBranchService = inject(CideLytClassProgramBranchService);\n private programClassService = inject(CideLytProgramClassService);\n private classProgramTermService = inject(CideLytClassProgramTermService);\n\n classProgramTermForm: FormGroup;\n loading = signal(false);\n error = signal<string | null>(null);\n\n // Class program term information from route\n classProgramTermId = signal<string>('');\n isEditMode = signal(false);\n isViewMode = signal(false);\n\n // Data signals\n programClasses = signal<ProgramClass[]>([]);\n classProgramBranches = signal<ClassProgramBranch[]>([]);\n\n // Options for dropdowns\n programClassOptions = signal<ProgramClass[]>([]);\n branchOptions = signal<ClassProgramBranch[]>([]);\n parentTermOptions = signal<ClassProgramTerm[]>([]);\n\n // Route parameters\n acabrnId = signal<string | null>(null);\n acacpmId = signal<string | null>(null);\n parentTermId = 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 // Date constraints\n endDateMinDate = signal<string>('');\n\n constructor() {\n this.classProgramTermForm = this.fb.group({\n // Basic Class Program Term Information\n acapt_code: ['', [Validators.required]],\n acapt_name: ['', [Validators.required]],\n acapt_description: [''],\n acapt_class_program_id_acacpm: ['', [Validators.required]],\n acapt_class_program_branch_id_acabrn: ['', [Validators.required]],\n acapt_parent_class_prog_term_acapt: [''],\n acapt_start_date: [''],\n acapt_end_date: [''],\n acapt_isactive: [true],\n acapt_islocked: [false]\n });\n }\n\n ngOnInit(): void {\n this.initializeComponent();\n this.setupFormSubscriptions();\n this.updateBreadcrumbData();\n }\n\n /**\n * Update breadcrumb data based on mode\n */\n private updateBreadcrumbData(): void {\n const additionalItems: { id: string; label: string; icon?: string; url?: string }[] = [];\n \n if (this.isViewMode()) {\n additionalItems.push({\n id: 'view',\n label: 'View',\n icon: 'visibility',\n url: undefined\n });\n } else if (this.isEditMode()) {\n additionalItems.push({\n id: 'edit',\n label: 'Edit',\n icon: 'edit',\n url: undefined\n });\n } else {\n additionalItems.push({\n id: 'create',\n label: 'Create',\n icon: 'add',\n url: undefined\n });\n }\n \n this.breadcrumbData.set(additionalItems);\n }\n\n /**\n * Setup form subscriptions for dependent dropdowns\n */\n private setupFormSubscriptions(): void {\n // Watch for program class changes to filter branches\n this.classProgramTermForm.get('acapt_class_program_id_acacpm')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(programClassId => {\n if (programClassId) {\n this.loadBranchesForProgramClass(programClassId);\n // Clear branch selection when program class changes\n this.classProgramTermForm.patchValue({\n acapt_class_program_branch_id_acabrn: ''\n });\n } else {\n this.branchOptions.set([]);\n }\n });\n\n // Watch for branch changes to determine parent term\n this.classProgramTermForm.get('acapt_class_program_branch_id_acabrn')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(branchId => {\n if (branchId) {\n this.determineParentTerm(branchId);\n } else {\n // Clear parent term when branch is cleared\n this.classProgramTermForm.patchValue({\n acapt_parent_class_prog_term_acapt: ''\n });\n }\n });\n\n // Watch for parent term changes to set date constraints\n this.classProgramTermForm.get('acapt_parent_class_prog_term_acapt')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(parentTermId => {\n this.loadParentTermDetails(parentTermId);\n });\n\n // Watch for start date changes to set minimum date for end date\n this.classProgramTermForm.get('acapt_start_date')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(startDate => {\n this.updateEndDateMinDate(startDate);\n });\n }\n\n /**\n * Initialize component\n */\n private initializeComponent(): void {\n // Check route parameters to determine mode\n this.checkRouteParams();\n \n const url = this.router.url;\n const queryParams = this.route.snapshot.queryParams;\n \n if (url.includes('/view/')) {\n this.isViewMode.set(true);\n this.loadClassProgramTermForView(queryParams);\n } else if (url.includes('/edit/')) {\n this.isEditMode.set(true);\n this.loadClassProgramTermForEdit(queryParams);\n } else {\n // Create mode\n this.isEditMode.set(false);\n this.isViewMode.set(false);\n }\n\n // Update breadcrumb after mode is determined\n this.updateBreadcrumbData();\n\n // Load dropdown options\n this.loadDropdownOptions();\n\n // Set parent term if provided from route (for child term creation)\n const parentId = this.parentTermId();\n if (parentId && !this.isEditMode() && !this.isViewMode()) {\n this.classProgramTermForm.patchValue({\n acapt_parent_class_prog_term_acapt: parentId\n });\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 Create 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 if (queryData?.acapt_parent_id || queryData?.acapt_id) {\n const parentId = (queryData.acapt_parent_id || queryData.acapt_id) as string;\n this.parentTermId.set(parentId);\n console.log('🏢 Parent Term ID from route:', parentId);\n }\n }\n });\n }\n\n /**\n * Load class program term for viewing\n */\n private loadClassProgramTermForView(queryParams: any): void {\n // Implementation for view mode\n this.classProgramTermForm.disable();\n }\n\n /**\n * Load class program term for editing\n */\n private loadClassProgramTermForEdit(queryParams: any): void {\n // Implementation for edit mode\n }\n\n /**\n * Load dropdown options\n */\n private loadDropdownOptions(): void {\n // Load program classes\n this.loadProgramClasses();\n \n // Load branches\n this.loadClassProgramBranches();\n }\n\n /**\n * Load program classes\n */\n private loadProgramClasses(): void {\n this.programClassService.getProgramClassList({ pagination: false })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n console.log('✅ Program classes loaded:', response);\n if (response?.success && response.data) {\n this.programClassOptions.set(response.data as ProgramClass[]);\n \n // Pre-select program class if provided in route\n const acacpmId = this.acacpmId();\n if (acacpmId) {\n this.classProgramTermForm.patchValue({\n acapt_class_program_id_acacpm: acacpmId\n });\n }\n } else {\n console.warn('⚠️ No program class data received');\n this.programClassOptions.set([]);\n }\n },\n error: (error) => {\n console.error('❌ Error loading program classes:', error);\n this.programClassOptions.set([]);\n }\n });\n }\n\n /**\n * Load class program branches\n */\n private loadClassProgramBranches(): void {\n const acacpmId = this.acacpmId();\n if (acacpmId) {\n this.loadBranchesForProgramClass(acacpmId);\n }\n }\n\n /**\n * Load branches for a specific program class\n */\n private loadBranchesForProgramClass(programClassId: string): void {\n const payload: AcaClassPrgBranchListPayload = {\n pagination: false,\n pageIndex: 0,\n pageSize: 100,\n acabrn_class_program_id_acacpm: programClassId\n };\n\n this.classProgramBranchService.getClassProgramBranchList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: any) => {\n console.log('✅ Class program branches loaded for program class:', programClassId, response);\n if (response?.success && response.data) {\n this.branchOptions.set(response.data as ClassProgramBranch[]);\n \n // Pre-select branch if provided in route and not already set\n const acabrnId = this.acabrnId();\n const currentBranchId = this.classProgramTermForm.get('acapt_class_program_branch_id_acabrn')?.value;\n if (acabrnId && !currentBranchId) {\n this.classProgramTermForm.patchValue({\n acapt_class_program_branch_id_acabrn: acabrnId\n });\n }\n } else {\n console.warn('⚠️ No branch data received');\n this.branchOptions.set([]);\n }\n },\n error: (error: any) => {\n console.error('❌ Error loading branches:', error);\n this.branchOptions.set([]);\n }\n });\n }\n\n /**\n * Determine parent term based on selected branch\n * This method will be called internally when branch is selected\n */\n private determineParentTerm(branchId: string): void {\n // Find the selected branch from the options\n const selectedBranch = this.branchOptions().find(branch => branch._id === branchId);\n \n if (selectedBranch) {\n console.log('🏢 Determining parent term for branch:', selectedBranch.acabrn_name);\n \n // Load existing terms for this branch to find potential parent terms\n this.loadParentTermsForBranch(branchId);\n }\n }\n\n /**\n * Load parent terms for a specific branch\n */\n private loadParentTermsForBranch(branchId: string): void {\n // TODO: Implement API call to get existing terms for the branch\n // This will help determine which terms can be parent terms\n console.log('🏢 Loading parent terms for branch:', branchId);\n \n // Example implementation - replace with actual API call\n // const payload = {\n // acabrn_id: branchId,\n // pagination: false\n // };\n \n // this.classProgramTermService.getClassProgramTermList(payload)\n // .pipe(takeUntilDestroyed(this.destroyRef))\n // .subscribe({\n // next: (response) => {\n // if (response?.success && response.data) {\n // // Filter terms that can be parent terms (e.g., terms without parent)\n // const parentTerms = response.data.filter(term => !term.acapt_parent_class_prog_term_acapt);\n // this.parentTermOptions.set(parentTerms);\n // }\n // },\n // error: (error) => {\n // console.error('❌ Error loading parent terms:', error);\n // this.parentTermOptions.set([]);\n // }\n // });\n \n // For now, set empty array\n this.parentTermOptions.set([]);\n }\n\n /**\n * Load parent term details for date validation\n * This method will be called when a parent term is selected\n */\n private loadParentTermDetails(parentTermId: string): void {\n if (!parentTermId) {\n // Clear date constraints when no parent is selected\n this.clearDateConstraints();\n return;\n }\n\n // TODO: Implement API call to get parent term details\n // For now, we'll use mock data or implement based on your API\n console.log('🏢 Loading parent term details for ID:', parentTermId);\n \n // Example implementation - replace with actual API call\n // this.classProgramTermService.getClassProgramTermById({ _id: parentTermId })\n // .pipe(takeUntilDestroyed(this.destroyRef))\n // .subscribe({\n // next: (response) => {\n // if (response?.success && response.data) {\n // const parentTerm = response.data;\n // this.setDateConstraints(parentTerm.acapt_start_date, parentTerm.acapt_end_date);\n // }\n // },\n // error: (error) => {\n // console.error('❌ Error loading parent term details:', error);\n // }\n // });\n }\n\n /**\n * Set date constraints based on parent term dates\n */\n private setDateConstraints(parentStartDate: string, parentEndDate: string): void {\n console.log('🏢 Setting date constraints:', { parentStartDate, parentEndDate });\n \n // Update form validation to ensure child dates are within parent range\n const startDateControl = this.classProgramTermForm.get('acapt_start_date');\n const endDateControl = this.classProgramTermForm.get('acapt_end_date');\n \n if (startDateControl && endDateControl) {\n // Add custom validators for date range\n startDateControl.setValidators([\n this.dateRangeValidator(parentStartDate, parentEndDate, 'start')\n ]);\n endDateControl.setValidators([\n this.dateRangeValidator(parentStartDate, parentEndDate, 'end')\n ]);\n \n // Update validation\n startDateControl.updateValueAndValidity();\n endDateControl.updateValueAndValidity();\n }\n }\n\n /**\n * Clear date constraints when no parent is selected\n */\n private clearDateConstraints(): void {\n const startDateControl = this.classProgramTermForm.get('acapt_start_date');\n const endDateControl = this.classProgramTermForm.get('acapt_end_date');\n \n if (startDateControl && endDateControl) {\n // Remove custom validators\n startDateControl.clearValidators();\n endDateControl.clearValidators();\n \n // Update validation\n startDateControl.updateValueAndValidity();\n endDateControl.updateValueAndValidity();\n }\n }\n\n /**\n * Custom validator for date range constraints\n */\n private dateRangeValidator(parentStartDate: string, parentEndDate: string, dateType: 'start' | 'end') {\n return (control: any) => {\n if (!control.value || !parentStartDate || !parentEndDate) {\n return null; // No validation if no date or parent dates\n }\n\n const selectedDate = new Date(control.value);\n const parentStart = new Date(parentStartDate);\n const parentEnd = new Date(parentEndDate);\n\n if (dateType === 'start') {\n // Start date should be >= parent start date and < parent end date\n if (selectedDate < parentStart || selectedDate >= parentEnd) {\n return { \n dateRangeError: { \n message: `Start date must be between ${parentStartDate} and ${parentEndDate}` \n } \n };\n }\n } else if (dateType === 'end') {\n // End date should be > parent start date and <= parent end date\n if (selectedDate <= parentStart || selectedDate > parentEnd) {\n return { \n dateRangeError: { \n message: `End date must be between ${parentStartDate} and ${parentEndDate}` \n } \n };\n }\n }\n\n return null; // Valid\n };\n }\n\n /**\n * Update minimum date for end date based on start date\n */\n private updateEndDateMinDate(startDate: string): void {\n if (startDate) {\n // Set the minimum date for end date to be the start date\n this.endDateMinDate.set(startDate);\n \n // If end date is already set and is before the new start date, clear it\n const endDate = this.classProgramTermForm.get('acapt_end_date')?.value;\n if (endDate && endDate < startDate) {\n this.classProgramTermForm.patchValue({\n acapt_end_date: ''\n });\n }\n \n console.log('🏢 Updated end date minimum date to:', startDate);\n } else {\n // Clear minimum date constraint if no start date\n this.endDateMinDate.set('');\n }\n }\n\n\n onSubmit() {\n if (this.isViewMode()) {\n this.router.navigate(['/control-panel/class-program-term']);\n return;\n }\n\n if (this.classProgramTermForm.invalid) {\n this.notificationService.error('Please fill in all required fields correctly.');\n this.markFormGroupTouched();\n return;\n }\n\n this.loading.set(true);\n this.error.set(null);\n\n const formData = this.classProgramTermForm.value;\n console.log('Class Program Term Form Data:', formData);\n\n // Prepare payload for API call\n const payload: MClassProgramTermInsertUpdatePayload = {\n acapt_code: formData.acapt_code,\n acapt_name: formData.acapt_name,\n acapt_class_program_id_acacpm: formData.acapt_class_program_id_acacpm,\n acapt_class_prg_branch_acabrn: formData.acapt_class_program_branch_id_acabrn,\n acapt_parent_class_prog_term_acapt: formData.acapt_parent_class_prog_term_acapt || null,\n acapt_start_date: formData.acapt_start_date,\n acapt_end_date: formData.acapt_end_date,\n acapt_isactive: formData.acapt_isactive,\n acapt_islocked: formData.acapt_islocked\n };\n\n // Add _id for edit mode\n if (this.isEditMode() && this.classProgramTermId()) {\n payload._id = this.classProgramTermId();\n }\n\n console.log('API Payload:', payload);\n\n // Make API call\n this.classProgramTermService.saveClassProgramTerm(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: any) => {\n console.log('✅ Class program term saved successfully:', response);\n \n if (response?.success) {\n const action = this.isEditMode() ? 'updated' : 'created';\n this.notificationService.success(`Class program term has been ${action} successfully.`);\n \n if (this.isEditMode()) {\n // Navigate back to list on edit mode\n this.router.navigate(['/control-panel/class-program-term']);\n } else {\n // In create mode, reset only Term Code, Term Name, and Description\n this.resetFormFields();\n }\n } else {\n this.error.set(response?.message || 'Failed to save class program term');\n this.notificationService.error(response?.message || 'Failed to save class program term');\n }\n this.loading.set(false);\n },\n error: (error: any) => {\n console.error('❌ Error saving class program term:', error);\n this.error.set('Failed to save class program term');\n this.notificationService.error('Failed to save class program term. Please try again.');\n this.loading.set(false);\n }\n });\n }\n\n /**\n * Mark all form controls as touched to trigger validation display\n */\n private markFormGroupTouched(): void {\n Object.keys(this.classProgramTermForm.controls).forEach(key => {\n const control = this.classProgramTermForm.get(key);\n control?.markAsTouched();\n });\n }\n\n resetForm() {\n this.classProgramTermForm.reset({\n acapt_isactive: true,\n acapt_islocked: false\n });\n \n // Clear options when form is reset\n this.branchOptions.set([]);\n this.parentTermOptions.set([]);\n \n // Clear date constraints\n this.clearDateConstraints();\n this.endDateMinDate.set('');\n }\n\n /**\n * Reset only Term Code, Term Name, and Description fields after successful save\n */\n private resetFormFields(): void {\n // Get current values to preserve\n const currentProgramClass = this.classProgramTermForm.get('acapt_class_program_id_acacpm')?.value;\n const currentBranch = this.classProgramTermForm.get('acapt_class_program_branch_id_acabrn')?.value;\n const currentStartDate = this.classProgramTermForm.get('acapt_start_date')?.value;\n const currentEndDate = this.classProgramTermForm.get('acapt_end_date')?.value;\n const currentIsActive = this.classProgramTermForm.get('acapt_isactive')?.value;\n const currentIsLocked = this.classProgramTermForm.get('acapt_islocked')?.value;\n \n // Reset only the specified fields\n this.classProgramTermForm.patchValue({\n acapt_code: '',\n acapt_name: '',\n acapt_description: '',\n // Preserve other fields\n acapt_class_program_id_acacpm: currentProgramClass,\n acapt_class_program_branch_id_acabrn: currentBranch,\n acapt_start_date: currentStartDate,\n acapt_end_date: currentEndDate,\n acapt_isactive: currentIsActive,\n acapt_islocked: currentIsLocked\n });\n \n // Clear validation errors for reset fields\n this.classProgramTermForm.get('acapt_code')?.setErrors(null);\n this.classProgramTermForm.get('acapt_name')?.setErrors(null);\n this.classProgramTermForm.get('acapt_description')?.setErrors(null);\n }\n\n /**\n * Go back to class program term list\n */\n goBackToClassProgramTermList(): void {\n this.router.navigate(['/control-panel/class-program-term']);\n }\n\n /**\n * Cancel form and navigate back to listing page\n */\n cancelForm(): void {\n this.goBackToClassProgramTermList();\n }\n\n /**\n * Get page title based on mode\n */\n getPageTitle(): string {\n if (this.isViewMode()) return 'View Class Program Term';\n return this.isEditMode() ? 'Edit Class Program Term' : 'Create New Class Program Term';\n }\n\n /**\n * Handle Active card click to toggle checkbox\n */\n onActiveCardClick(): void {\n if (this.isViewMode()) {\n return; // Don't allow changes in view mode\n }\n \n const currentValue = this.classProgramTermForm.get('acapt_isactive')?.value;\n this.classProgramTermForm.patchValue({\n acapt_isactive: !currentValue\n });\n }\n\n /**\n * Handle Locked card click to toggle checkbox\n */\n onLockedCardClick(): void {\n if (this.isViewMode()) {\n return; // Don't allow changes in view mode\n }\n \n const currentValue = this.classProgramTermForm.get('acapt_islocked')?.value;\n this.classProgramTermForm.patchValue({\n acapt_islocked: !currentValue\n });\n }\n\n /**\n * Cleanup when component is destroyed\n */\n ngOnDestroy(): void {\n console.log('🧹 ClassProgramTermCreateComponent: Cleaning up component state');\n\n // Reset all signals to their initial state\n this.loading.set(false);\n this.error.set(null);\n this.classProgramTermId.set('');\n this.isEditMode.set(false);\n this.programClassOptions.set([]);\n this.branchOptions.set([]);\n this.parentTermOptions.set([]);\n\n // Reset form to initial state\n this.resetForm();\n\n console.log('🧹 ClassProgramTermCreateComponent: Component state cleaned up');\n }\n}\n","<!-- \n CLASS PROGRAM TERM MASTER FORM\n \n Enterprise-Level Styling with Tailwind CSS\n Features: Responsive grids, proper typography, enhanced user experience\n-->\n\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"classProgramTermForm\"\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <!-- Class Program Term Information -->\n <div class=\"tw-space-y-6\">\n <!-- Program Class and Branch at the top -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-6\">\n <div class=\"tw-space-y-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Program Class *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_id_acacpm\" \n placeholder=\"Select program class\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acacpm_alise_title\" \n [options]=\"programClassOptions()\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-space-y-2 md:tw-col-span-2\">\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Specialization *</label>\n <cide-ele-select \n formControlName=\"acapt_class_program_branch_id_acabrn\" \n placeholder=\"Select specialization\"\n [disabled]=\"isViewMode()\" \n valueKey=\"_id\" \n labelKey=\"acabrn_name\" \n [options]=\"branchOptions()\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input label=\"Term Code *\" formControlName=\"acapt_code\" placeholder=\"e.g., T1, T2, T3\"\n size=\"md\" leadingIcon=\"code\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Term Name *\" formControlName=\"acapt_name\"\n placeholder=\"e.g., First Term, Second Term\" size=\"md\" leadingIcon=\"schedule\">\n </cide-ele-input>\n </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"acapt_description\"\n placeholder=\"Enter detailed description of the term...\" rows=\"3\" size=\"md\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <cide-ele-input id=\"acapt_start_date\" label=\"Start Date\" formControlName=\"acapt_start_date\" type=\"date\"\n size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n\n <cide-ele-input id=\"acapt_end_date\" label=\"End Date\" formControlName=\"acapt_end_date\" type=\"date\"\n [min]=\"endDateMinDate()\" size=\"md\" leadingIcon=\"event\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-p-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon name=\"info\" class=\"tw-w-4 tw-h-4 tw-text-blue-500\"></cide-ele-icon>\n <span class=\"tw-text-sm tw-text-blue-700\">\n Sequence will be automatically managed through drag-and-drop on the listing page\n </span>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onActiveCardClick()\">\n <cide-ele-input formControlName=\"acapt_isactive\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this term</span>\n </div>\n </div>\n\n <div\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\"\n [class.tw-cursor-not-allowed]=\"isViewMode()\"\n [class.tw-opacity-60]=\"isViewMode()\"\n (click)=\"onLockedCardClick()\">\n <cide-ele-input formControlName=\"acapt_islocked\" type=\"checkbox\" size=\"md\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Locked</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Prevent modifications</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Display -->\n @if (error()) {\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"tw-table-row tw-h-0\">\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\">\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || classProgramTermForm.invalid\"\n [loading]=\"loading()\" leftIcon=\"save\">\n {{ isEditMode() ? 'Update Class Program Term' : 'Create Class Program Term' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n</cide-lyt-shared-wrapper>\n\n"],"names":[],"mappings":"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"}
@@ -8,10 +8,10 @@ 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
10
  import { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
11
- import { AcaClassPrgBranchListPayload, MClassProgramTerm, generateObjectFromString } from 'cloud-ide-lms-model';
11
+ import { AcaClassPrgBranchListPayload, generateObjectFromString, MClassProgramTerm, generateStringFromObject } 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-CFEjm3Iz.mjs';
14
+ import { b as CideLytClassProgramBranchService } from './cloud-ide-academics-cloud-ide-academics-g9qZGJtG.mjs';
15
15
 
16
16
  class ClassProgramTermListComponent {
17
17
  // Dependency injection
@@ -63,15 +63,10 @@ class ClassProgramTermListComponent {
63
63
  classProgramBranchesLoading = signal(false, ...(ngDevMode ? [{ debugName: "classProgramBranchesLoading" }] : []));
64
64
  selectedProgramClassId = signal(null, ...(ngDevMode ? [{ debugName: "selectedProgramClassId" }] : []));
65
65
  selectedBranchId = signal(null, ...(ngDevMode ? [{ debugName: "selectedBranchId" }] : []));
66
- // Program term dropdown signals
67
- classProgramTermsForDropdown = signal([], ...(ngDevMode ? [{ debugName: "classProgramTermsForDropdown" }] : []));
68
- classProgramTermsLoadingForDropdown = signal(false, ...(ngDevMode ? [{ debugName: "classProgramTermsLoadingForDropdown" }] : []));
69
- selectedTermId = signal(null, ...(ngDevMode ? [{ debugName: "selectedTermId" }] : []));
70
66
  // Signal for breadcrumb data that will be passed to shared wrapper
71
67
  breadcrumbData = signal([], ...(ngDevMode ? [{ debugName: "breadcrumbData" }] : []));
72
68
  // Computed signals for dropdown options
73
69
  classProgramMastersOptions = computed(() => this.classProgramMasters(), ...(ngDevMode ? [{ debugName: "classProgramMastersOptions" }] : []));
74
- classProgramTermsOptions = computed(() => this.classProgramTermsForDropdown(), ...(ngDevMode ? [{ debugName: "classProgramTermsOptions" }] : []));
75
70
  // Computed signal to check if branch dropdown should be shown
76
71
  showBranchDropdown = computed(() => {
77
72
  const selectedProgram = this.selectedClassProgram();
@@ -220,22 +215,37 @@ class ClassProgramTermListComponent {
220
215
  icon: 'edit',
221
216
  iconColor: 'tw-text-blue-400',
222
217
  textColor: 'tw-text-blue-700'
223
- },
224
- {
225
- id: 'toggleStatus',
226
- label: classProgramTerm.acapt_isactive ? 'Deactivate' : 'Activate',
227
- icon: classProgramTerm.acapt_isactive ? 'toggle_off' : 'toggle_on',
228
- iconColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',
229
- textColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-700' : 'tw-text-green-700'
230
- },
231
- {
232
- id: 'delete',
233
- label: 'Delete',
234
- icon: 'delete',
235
- iconColor: 'tw-text-red-400',
236
- textColor: 'tw-text-red-700'
237
218
  }
238
219
  ];
220
+ // Only show "Add Term" if this term doesn't have a parent (is at level 1)
221
+ // Check if parent term is null/undefined or empty string
222
+ const parentTerm = classProgramTerm.acapt_parent_class_prog_term_acapt;
223
+ const hasParent = parentTerm &&
224
+ (typeof parentTerm === 'string' ?
225
+ (parentTerm.trim() !== '') :
226
+ (parentTerm && typeof parentTerm === 'object' && parentTerm._id));
227
+ if (!hasParent) {
228
+ items.push({
229
+ id: 'addTerm',
230
+ label: 'Add Term',
231
+ icon: 'add',
232
+ iconColor: 'tw-text-green-400',
233
+ textColor: 'tw-text-green-700'
234
+ });
235
+ }
236
+ items.push({
237
+ id: 'toggleStatus',
238
+ label: classProgramTerm.acapt_isactive ? 'Deactivate' : 'Activate',
239
+ icon: classProgramTerm.acapt_isactive ? 'toggle_off' : 'toggle_on',
240
+ iconColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-400' : 'tw-text-green-400',
241
+ textColor: classProgramTerm.acapt_isactive ? 'tw-text-orange-700' : 'tw-text-green-700'
242
+ }, {
243
+ id: 'delete',
244
+ label: 'Delete',
245
+ icon: 'delete',
246
+ iconColor: 'tw-text-red-400',
247
+ textColor: 'tw-text-red-700'
248
+ });
239
249
  return items;
240
250
  }
241
251
  /**
@@ -249,6 +259,9 @@ class ClassProgramTermListComponent {
249
259
  case 'edit':
250
260
  this.editClassProgramTerm(classProgramTerm);
251
261
  break;
262
+ case 'addTerm':
263
+ this.addChildTerm(classProgramTerm);
264
+ break;
252
265
  case 'toggleStatus':
253
266
  this.toggleClassProgramTermStatus(classProgramTerm);
254
267
  break;
@@ -325,8 +338,6 @@ class ClassProgramTermListComponent {
325
338
  this.classProgramBranches.set([]);
326
339
  this.selectedBranchId.set(null);
327
340
  this.acabrnId.set(null);
328
- // Load program terms directly if no branch dropdown
329
- this.loadClassProgramTermsForDropdown(programId);
330
341
  // Load terms for grid only when class program is selected (no branch required)
331
342
  this.loadClassProgramTerms();
332
343
  }
@@ -336,8 +347,6 @@ class ClassProgramTermListComponent {
336
347
  this.classProgramBranches.set([]);
337
348
  this.selectedBranchId.set(null);
338
349
  this.acabrnId.set(null);
339
- this.classProgramTermsForDropdown.set([]);
340
- this.selectedTermId.set(null);
341
350
  // Clear grid data when no class program is selected
342
351
  this.classProgramTerms.set([]);
343
352
  this.updateGridData();
@@ -383,70 +392,16 @@ class ClassProgramTermListComponent {
383
392
  console.log('🔄 Branch changed:', branch);
384
393
  this.selectedBranchId.set(branch);
385
394
  this.acabrnId.set(branch);
386
- // Load program terms for dropdown when branch changes
395
+ // Load terms for grid only when both class program and branch are selected
387
396
  if (branch && this.selectedProgramClassId()) {
388
- this.loadClassProgramTermsForDropdown(this.selectedProgramClassId(), branch);
389
- // Load terms for grid only when both class program and branch are selected
390
397
  this.loadClassProgramTerms();
391
398
  }
392
399
  else {
393
- this.classProgramTermsForDropdown.set([]);
394
- this.selectedTermId.set(null);
395
400
  // Clear grid data when branch is cleared
396
401
  this.classProgramTerms.set([]);
397
402
  this.updateGridData();
398
403
  }
399
404
  }
400
- /**
401
- * Load class program terms for dropdown (filtered by class program and branch)
402
- */
403
- loadClassProgramTermsForDropdown(classProgramId, branchId) {
404
- this.classProgramTermsLoadingForDropdown.set(true);
405
- const payload = new MClassProgramTerm({
406
- pageIndex: 0,
407
- pageSize: 1000,
408
- query: "",
409
- sort: {
410
- key: 'acapt_name',
411
- order: 'asc'
412
- },
413
- acapt_class_prg_branch_acabrn: branchId || "",
414
- });
415
- this.classProgramTermService.getClassProgramTermList(payload)
416
- .pipe(takeUntilDestroyed(this.destroyRef))
417
- .subscribe({
418
- next: (response) => {
419
- if (response?.success && response.data) {
420
- // Filter by class program ID if provided
421
- let terms = response.data;
422
- if (classProgramId) {
423
- terms = terms.filter(term => term.acapt_class_program_id_acacpm?._id === classProgramId ||
424
- (typeof term.acapt_class_program_id_acacpm === 'string' && term.acapt_class_program_id_acacpm === classProgramId));
425
- }
426
- this.classProgramTermsForDropdown.set(terms);
427
- }
428
- else {
429
- this.classProgramTermsForDropdown.set([]);
430
- }
431
- this.classProgramTermsLoadingForDropdown.set(false);
432
- },
433
- error: (error) => {
434
- console.error('❌ Error loading class program terms for dropdown:', error);
435
- this.classProgramTermsForDropdown.set([]);
436
- this.classProgramTermsLoadingForDropdown.set(false);
437
- }
438
- });
439
- }
440
- /**
441
- * Handle program term selection change
442
- */
443
- onTermChange(termId) {
444
- const term = typeof termId === 'string' ? termId : (termId ? String(termId) : null);
445
- console.log('🔄 Program Term changed:', term);
446
- this.selectedTermId.set(term);
447
- // Filter the main list by selected term if needed
448
- // For now, we'll just store the selection
449
- }
450
405
  /**
451
406
  * Handle class program master search
452
407
  */
@@ -571,6 +526,35 @@ class ClassProgramTermListComponent {
571
526
  createClassProgramTerm() {
572
527
  this.router.navigate(['/control-panel/program-term-management/create']);
573
528
  }
529
+ /**
530
+ * Add child term under a parent term
531
+ */
532
+ addChildTerm(parentTerm) {
533
+ if (!parentTerm._id) {
534
+ this.notificationService.error('Invalid term selected');
535
+ return;
536
+ }
537
+ // Get the class program and branch IDs from the parent term
538
+ const classProgramId = typeof parentTerm.acapt_class_program_id_acacpm === 'string'
539
+ ? parentTerm.acapt_class_program_id_acacpm
540
+ : parentTerm.acapt_class_program_id_acacpm?._id;
541
+ const branchId = typeof parentTerm.acapt_class_program_branch_id_acabrn === 'string'
542
+ ? parentTerm.acapt_class_program_branch_id_acabrn
543
+ : parentTerm.acapt_class_program_branch_id_acabrn?._id;
544
+ // Build query params with parent term ID, class program ID, and branch ID
545
+ const queryParams = {
546
+ acapt_id: parentTerm._id,
547
+ acapt_parent_id: parentTerm._id
548
+ };
549
+ if (classProgramId) {
550
+ queryParams.acacpm_id = classProgramId;
551
+ }
552
+ if (branchId) {
553
+ queryParams.acabrn_id = branchId;
554
+ }
555
+ const queryString = generateStringFromObject(queryParams);
556
+ this.router.navigate(['/control-panel/program-term-management/create', queryString]);
557
+ }
574
558
  /**
575
559
  * View class program term details
576
560
  */
@@ -654,7 +638,7 @@ class ClassProgramTermListComponent {
654
638
  this.loadClassProgramTerms();
655
639
  }
656
640
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
657
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ClassProgramTermListComponent, isStandalone: true, selector: "cide-academics-class-program-term-list", viewQueries: [{ propertyName: "classProgramTermDetailsRendererTemplate", first: true, predicate: ["classProgramTermDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "classProgramTermStatusRendererTemplate", first: true, predicate: ["classProgramTermStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "programClassRendererTemplate", first: true, predicate: ["programClassRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "parentTermRendererTemplate", first: true, predicate: ["parentTermRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\n\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n \n @if (selectedProgramClassId() && (!showBranchDropdown() || selectedBranchId())) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Program Term</label>\n <cide-ele-select\n [options]=\"classProgramTermsOptions()\"\n [ngModel]=\"selectedTermId() || ''\"\n (ngModelChange)=\"onTermChange($event)\"\n placeholder=\"Select Program Term\"\n valueKey=\"_id\"\n labelKey=\"acapt_name\"\n [loading]=\"classProgramTermsLoadingForDropdown()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n</div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading", "valueKey", "labelKey"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }] });
641
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ClassProgramTermListComponent, isStandalone: true, selector: "cide-academics-class-program-term-list", viewQueries: [{ propertyName: "classProgramTermDetailsRendererTemplate", first: true, predicate: ["classProgramTermDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "classProgramTermStatusRendererTemplate", first: true, predicate: ["classProgramTermStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "programClassRendererTemplate", first: true, predicate: ["programClassRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "parentTermRendererTemplate", first: true, predicate: ["parentTermRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\n\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n</div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading", "valueKey", "labelKey"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }] });
658
642
  }
659
643
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ClassProgramTermListComponent, decorators: [{
660
644
  type: Component,
@@ -667,8 +651,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
667
651
  CideEleDropdownComponent,
668
652
  CideSelectComponent,
669
653
  CideLytSharedWrapperComponent
670
- ], template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\n\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n \n @if (selectedProgramClassId() && (!showBranchDropdown() || selectedBranchId())) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Program Term</label>\n <cide-ele-select\n [options]=\"classProgramTermsOptions()\"\n [ngModel]=\"selectedTermId() || ''\"\n (ngModelChange)=\"onTermChange($event)\"\n placeholder=\"Select Program Term\"\n valueKey=\"_id\"\n labelKey=\"acapt_name\"\n [loading]=\"classProgramTermsLoadingForDropdown()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n</div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n" }]
654
+ ], template: "<!-- Class Program Term Management Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'class_program_term' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\" (btnClick)=\"createClassProgramTerm()\">\n Create Class Program Term\n </button>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\n\n <!-- Filter Section -->\n <div class=\"tw-flex-shrink-0 tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Class Program</label>\n <cide-ele-select\n [options]=\"classProgramMastersOptions()\"\n [ngModel]=\"selectedProgramClassId() || ''\"\n (ngModelChange)=\"onClassProgramChange($event)\"\n placeholder=\"Select Class Program\"\n valueKey=\"_id\"\n labelKey=\"acacpm_alise_title\"\n [loading]=\"classProgramMastersLoading()\"\n [searchable]=\"true\"\n (searchChange)=\"onClassProgramMasterSearch($event)\">\n </cide-ele-select>\n </div>\n \n @if (showBranchDropdown()) {\n <div class=\"tw-w-64\">\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\">Specialization</label>\n <cide-ele-select\n [options]=\"classProgramBranches()\"\n [ngModel]=\"selectedBranchId() || ''\"\n (ngModelChange)=\"onBranchChange($event)\"\n placeholder=\"Select Specialization\"\n valueKey=\"_id\"\n labelKey=\"acabrn_name\"\n [loading]=\"classProgramBranchesLoading()\">\n </cide-ele-select>\n </div>\n }\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-min-h-0 tw-p-0\">\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n</div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #classProgramTermDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-orange-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-orange-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate tw-m-0\">\n {{ row?.acapt_name || 'N/A' }}\n </h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-m-0\">\n {{ row?.acapt_description || '' }}\n </p>\n </div>\n </div>\n</ng-template>\n\n<ng-template #classProgramTermStatusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (row?.acapt_iscurrent) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-blue-100 tw-text-blue-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">star</cide-ele-icon>\n Current\n </span>\n }\n @if (row?.acapt_islocked) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-1\">lock</cide-ele-icon>\n Locked\n </span>\n }\n <span [ngClass]=\"{\n 'tw-bg-green-100 tw-text-green-800': row?.acapt_isactive,\n 'tw-bg-red-100 tw-text-red-800': !row?.acapt_isactive\n }\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium\">\n <cide-ele-icon [ngClass]=\"{\n 'tw-text-green-600': row?.acapt_isactive,\n 'tw-text-red-600': !row?.acapt_isactive\n }\" class=\"tw-w-3 tw-h-3 tw-mr-1\">\n {{ row?.acapt_isactive ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ row?.acapt_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n [config]=\"{\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n usePortal: true\n }\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #programClassRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">school</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-900 tw-truncate\">\n {{ row?.acapt_class_program_id_acacpm?.acacpm_alise_title || 'N/A' }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #parentTermRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-text-sm tw-text-gray-900\">\n {{ row?.acapt_parent_class_prog_term_acapt?.acapt_name || 'N/A' }}\n </div>\n</ng-template>\n" }]
671
655
  }] });
672
656
 
673
657
  export { ClassProgramTermListComponent };
674
- //# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-BQ1Etnft.mjs.map
658
+ //# sourceMappingURL=cloud-ide-academics-class-program-term-list.component-CP2vlRBP.mjs.map