cloud-ide-academics 0.0.1 → 0.0.2

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 (20) hide show
  1. package/fesm2022/cloud-ide-academics-class-program-term-create.component-D3PfbSMN.mjs +578 -0
  2. package/fesm2022/cloud-ide-academics-class-program-term-create.component-D3PfbSMN.mjs.map +1 -0
  3. package/fesm2022/cloud-ide-academics-class-program-term-list.component-Cpbyavgd.mjs +404 -0
  4. package/fesm2022/cloud-ide-academics-class-program-term-list.component-Cpbyavgd.mjs.map +1 -0
  5. package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs +111 -0
  6. package/fesm2022/cloud-ide-academics-class-program-term.service-BW4PJQEM.mjs.map +1 -0
  7. package/fesm2022/cloud-ide-academics-cloud-ide-academics-BP1hZ-yx.mjs +2802 -0
  8. package/fesm2022/cloud-ide-academics-cloud-ide-academics-BP1hZ-yx.mjs.map +1 -0
  9. package/fesm2022/cloud-ide-academics-program-class-create.component-Ds8vN9sL.mjs +391 -0
  10. package/fesm2022/cloud-ide-academics-program-class-create.component-Ds8vN9sL.mjs.map +1 -0
  11. package/fesm2022/cloud-ide-academics-program-class-list.component-C6VyX4hH.mjs +433 -0
  12. package/fesm2022/cloud-ide-academics-program-class-list.component-C6VyX4hH.mjs.map +1 -0
  13. package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dg9Pjwj5.mjs +211 -0
  14. package/fesm2022/cloud-ide-academics-program-term-section-create.component-Dg9Pjwj5.mjs.map +1 -0
  15. package/fesm2022/cloud-ide-academics-program-term-section-list.component-xVeeeGDV.mjs +478 -0
  16. package/fesm2022/cloud-ide-academics-program-term-section-list.component-xVeeeGDV.mjs.map +1 -0
  17. package/fesm2022/cloud-ide-academics.mjs +1 -1535
  18. package/fesm2022/cloud-ide-academics.mjs.map +1 -1
  19. package/index.d.ts +239 -2
  20. package/package.json +1 -1
@@ -0,0 +1,391 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DestroyRef, signal, Component } from '@angular/core';
3
+ import { Location, CommonModule } from '@angular/common';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
6
+ import { Router, ActivatedRoute } from '@angular/router';
7
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
+ import { NotificationService, ConfirmationService, CideInputComponent, CideEleButtonComponent, CideIconComponent, CideSelectComponent } from 'cloud-ide-element';
9
+ import { AppStateHelperService } from 'cloud-ide-layout';
10
+ import { CideCoreGeneralMasterService } from 'cloud-ide-core';
11
+ import { a as CideLytAcademicYearService, C as CideLytProgramClassService } from './cloud-ide-academics-cloud-ide-academics-BP1hZ-yx.mjs';
12
+ import { generateObjectFromString } from 'cloud-ide-lms-model';
13
+
14
+ class ProgramClassCreateComponent {
15
+ // Dependency injection
16
+ destroyRef = inject(DestroyRef);
17
+ fb = inject(FormBuilder);
18
+ generalMasterService = inject(CideCoreGeneralMasterService);
19
+ academicYearService = inject(CideLytAcademicYearService);
20
+ programClassService = inject(CideLytProgramClassService);
21
+ router = inject(Router);
22
+ route = inject(ActivatedRoute);
23
+ location = inject(Location);
24
+ appState = inject(AppStateHelperService);
25
+ notificationService = inject(NotificationService);
26
+ confirmationService = inject(ConfirmationService);
27
+ programClassForm;
28
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
29
+ error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
30
+ // Program class information from route
31
+ programClassId = signal('', ...(ngDevMode ? [{ debugName: "programClassId" }] : []));
32
+ isEditMode = signal(false, ...(ngDevMode ? [{ debugName: "isEditMode" }] : []));
33
+ isViewMode = signal(false, ...(ngDevMode ? [{ debugName: "isViewMode" }] : []));
34
+ // Data signals
35
+ academicYears = signal([], ...(ngDevMode ? [{ debugName: "academicYears" }] : []));
36
+ classPrograms = signal([], ...(ngDevMode ? [{ debugName: "classPrograms" }] : []));
37
+ // Options for dropdowns
38
+ academicYearOptions = signal([], ...(ngDevMode ? [{ debugName: "academicYearOptions" }] : []));
39
+ classProgramOptions = signal([], ...(ngDevMode ? [{ debugName: "classProgramOptions" }] : []));
40
+ constructor() {
41
+ this.programClassForm = this.fb.group({
42
+ // Basic Program Class Information
43
+ acacpm_class_program_id_sygms: ['', [Validators.required]],
44
+ acacpm_alise_title: ['', [Validators.required, Validators.minLength(2)]],
45
+ acacpm_academic_year_id_acayr: ['', [Validators.required]],
46
+ acacpm_entity_id_syen: [''], // Set automatically from app state
47
+ acacpm_isactive: [true]
48
+ });
49
+ }
50
+ ngOnInit() {
51
+ this.initializeComponent();
52
+ this.setupFormSubscriptions();
53
+ }
54
+ /**
55
+ * Initialize component
56
+ */
57
+ initializeComponent() {
58
+ // Set entity ID from app state
59
+ this.setEntityFromAppState();
60
+ // Get program class information from route (for edit/view mode)
61
+ this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
62
+ const queryParams = params['query'];
63
+ console.log('🔍 Route params:', queryParams);
64
+ if (queryParams) {
65
+ // Query parameters passed (following page-controls pattern)
66
+ const queryData = generateObjectFromString(queryParams);
67
+ if (queryData?.acacpm_id) {
68
+ this.programClassId.set(queryData.acacpm_id);
69
+ this.isEditMode.set(true);
70
+ this.loadProgramClassData(queryData.acacpm_id);
71
+ }
72
+ }
73
+ else {
74
+ // Check URL path for edit/view mode
75
+ const url = this.router.url;
76
+ if (url.includes('/view/')) {
77
+ this.isViewMode.set(true);
78
+ // Extract ID from URL path
79
+ const pathSegments = url.split('/');
80
+ const id = pathSegments[pathSegments.length - 1];
81
+ if (id) {
82
+ this.programClassId.set(id);
83
+ this.loadProgramClassData(id);
84
+ }
85
+ }
86
+ else if (url.includes('/edit/')) {
87
+ this.isEditMode.set(true);
88
+ // Extract ID from URL path
89
+ const pathSegments = url.split('/');
90
+ const id = pathSegments[pathSegments.length - 1];
91
+ if (id) {
92
+ this.programClassId.set(id);
93
+ this.loadProgramClassData(id);
94
+ }
95
+ }
96
+ else {
97
+ // Create mode
98
+ this.isEditMode.set(false);
99
+ this.isViewMode.set(false);
100
+ }
101
+ }
102
+ // Always load dropdown options
103
+ this.loadDropdownOptions();
104
+ });
105
+ }
106
+ /**
107
+ * Set entity ID from app state
108
+ */
109
+ setEntityFromAppState() {
110
+ const activeEntity = this.appState.activeEntity();
111
+ if (activeEntity?._id) {
112
+ this.programClassForm.patchValue({
113
+ acacpm_entity_id_syen: activeEntity._id
114
+ });
115
+ console.log('✅ Entity ID set from app state:', activeEntity._id);
116
+ }
117
+ else {
118
+ console.warn('⚠️ No active entity found in app state');
119
+ }
120
+ }
121
+ /**
122
+ * Set default academic year to the current one
123
+ */
124
+ setDefaultAcademicYear(academicYears) {
125
+ // Find the academic year with acayrmp_iscurrent: true
126
+ const currentAcademicYear = academicYears.find(year => year.acayr_iscurrent === true);
127
+ if (currentAcademicYear) {
128
+ this.programClassForm.patchValue({
129
+ acacpm_academic_year_id_acayr: currentAcademicYear._id
130
+ });
131
+ console.log('✅ Default academic year set to current:', currentAcademicYear.acayr_name, currentAcademicYear._id);
132
+ }
133
+ else {
134
+ console.warn('⚠️ No current academic year found (acayrmp_iscurrent: true)');
135
+ }
136
+ }
137
+ /**
138
+ * Setup form subscriptions for auto-population
139
+ */
140
+ setupFormSubscriptions() {
141
+ // Listen for class program selection changes
142
+ this.programClassForm.get('acacpm_class_program_id_sygms')?.valueChanges
143
+ .pipe(takeUntilDestroyed(this.destroyRef))
144
+ .subscribe((selectedClassProgramId) => {
145
+ if (selectedClassProgramId) {
146
+ this.updateProgramClassName(selectedClassProgramId);
147
+ }
148
+ });
149
+ }
150
+ /**
151
+ * Update program class name based on selected class program
152
+ */
153
+ updateProgramClassName(selectedClassProgramId) {
154
+ const selectedClassProgram = this.classProgramOptions().find(option => option._id === selectedClassProgramId);
155
+ if (selectedClassProgram && selectedClassProgram.sygms_title) {
156
+ // Only update if the title field is empty or if user hasn't manually changed it
157
+ const currentTitle = this.programClassForm.get('acacpm_alise_title')?.value;
158
+ if (!currentTitle || currentTitle.trim() === '') {
159
+ this.programClassForm.patchValue({
160
+ acacpm_alise_title: selectedClassProgram.sygms_title
161
+ });
162
+ console.log('✅ Program class title auto-populated:', selectedClassProgram.sygms_title);
163
+ }
164
+ }
165
+ }
166
+ /**
167
+ * Load program class data for edit/view mode
168
+ */
169
+ loadProgramClassData(programClassId) {
170
+ this.loading.set(true);
171
+ this.error.set(null);
172
+ // Create payload for getting program class by ID
173
+ const payload = {
174
+ acacpm_id: programClassId
175
+ };
176
+ // Load program class data
177
+ this.programClassService.getProgramClassById(payload)
178
+ .pipe(takeUntilDestroyed(this.destroyRef))
179
+ .subscribe({
180
+ next: (response) => {
181
+ if (response?.success && response.data) {
182
+ console.log('📚 Program class data loaded:', response.data);
183
+ this.populateFormWithProgramClassData(response.data);
184
+ // Disable form if in view mode
185
+ if (this.isViewMode()) {
186
+ this.programClassForm.disable();
187
+ }
188
+ }
189
+ else {
190
+ console.error('❌ Failed to load program class data');
191
+ this.error.set('Failed to load program class data');
192
+ }
193
+ this.loading.set(false);
194
+ },
195
+ error: (error) => {
196
+ console.error('❌ Error loading program class data:', error);
197
+ this.error.set('Error loading program class data');
198
+ this.loading.set(false);
199
+ }
200
+ });
201
+ }
202
+ /**
203
+ * Populate form with program class data
204
+ */
205
+ populateFormWithProgramClassData(data) {
206
+ this.programClassForm.patchValue({
207
+ acacpm_class_program_id_sygms: data.acacpm_class_program_id_sygms?._id || data.acacpm_class_program_id_sygms,
208
+ acacpm_alise_title: data.acacpm_alise_title,
209
+ acacpm_academic_year_id_acayr: data.acacpm_academic_year_id_acayr?._id || data.acacpm_academic_year_id_acayr,
210
+ acacpm_entity_id_syen: data.acacpm_entity_id_syen?._id || data.acacpm_entity_id_syen,
211
+ acacpm_isactive: data.acacpm_isactive
212
+ });
213
+ }
214
+ /**
215
+ * Load dropdown options
216
+ */
217
+ loadDropdownOptions() {
218
+ // Load academic year options from academic year service
219
+ this.academicYearService.getAcademicYearList({})
220
+ .pipe(takeUntilDestroyed(this.destroyRef))
221
+ .subscribe({
222
+ next: (response) => {
223
+ console.log('🔍 Academic Year API Response:', response);
224
+ if (response?.success && response.data) {
225
+ console.log('📚 Academic years loaded from service:', response.data);
226
+ this.academicYearOptions.set(response.data);
227
+ console.log('✅ academicYearOptions signal updated:', this.academicYearOptions());
228
+ // Set default academic year to the current one
229
+ this.setDefaultAcademicYear(response.data);
230
+ }
231
+ else {
232
+ console.warn('⚠️ No academic year data received from service');
233
+ this.academicYearOptions.set([]);
234
+ }
235
+ },
236
+ error: (error) => {
237
+ console.error('❌ Error loading academic years from service:', error);
238
+ this.academicYearOptions.set([]);
239
+ }
240
+ });
241
+ // Load class program options from general master service
242
+ this.generalMasterService.getMasterList({ sygmt_code: 'class_program_type' })
243
+ .pipe(takeUntilDestroyed(this.destroyRef))
244
+ .subscribe({
245
+ next: (response) => {
246
+ console.log('🔍 General Master API Response:', response);
247
+ if (response?.success && response.data) {
248
+ console.log('📚 Class program types loaded from general master:', response.data);
249
+ // Use the response data directly without transformation
250
+ this.classProgramOptions.set(response.data);
251
+ console.log('✅ classProgramOptions signal updated:', this.classProgramOptions());
252
+ }
253
+ else {
254
+ console.warn('⚠️ No class program type data received from general master');
255
+ this.classProgramOptions.set([]);
256
+ }
257
+ },
258
+ error: (error) => {
259
+ console.error('❌ Error loading class program types from general master:', error);
260
+ this.classProgramOptions.set([]);
261
+ }
262
+ });
263
+ }
264
+ onSubmit() {
265
+ if (this.isViewMode()) {
266
+ this.location.back();
267
+ return;
268
+ }
269
+ if (this.programClassForm.invalid) {
270
+ this.notificationService.error('Please fill in all required fields correctly.');
271
+ this.markFormGroupTouched();
272
+ return;
273
+ }
274
+ this.loading.set(true);
275
+ this.error.set(null);
276
+ const formData = this.programClassForm.value;
277
+ console.log('Program Class Form Data:', formData);
278
+ // Add ID for edit mode
279
+ if (this.isEditMode()) {
280
+ formData._id = this.programClassId();
281
+ }
282
+ // Make API call to save program class
283
+ this.programClassService.saveProgramClass(formData)
284
+ .pipe(takeUntilDestroyed(this.destroyRef))
285
+ .subscribe({
286
+ next: (response) => {
287
+ if (response?.success) {
288
+ const action = this.isEditMode() ? 'updated' : 'created';
289
+ this.notificationService.success(`Program class has been ${action} successfully.`);
290
+ // Navigate to program class list on successful create, go back on edit
291
+ if (this.isEditMode()) {
292
+ this.location.back();
293
+ }
294
+ else {
295
+ // Navigate to program class list for create operation (closes current tab)
296
+ this.router.navigate(['/control-panel/program-class-management']);
297
+ }
298
+ }
299
+ else {
300
+ this.notificationService.error(response?.message || 'Failed to save program class.');
301
+ }
302
+ this.loading.set(false);
303
+ },
304
+ error: (error) => {
305
+ console.error('Error saving program class:', error);
306
+ this.notificationService.error('An error occurred while saving the program class.');
307
+ this.loading.set(false);
308
+ }
309
+ });
310
+ }
311
+ /**
312
+ * Mark all form controls as touched to trigger validation display
313
+ */
314
+ markFormGroupTouched() {
315
+ Object.keys(this.programClassForm.controls).forEach(key => {
316
+ const control = this.programClassForm.get(key);
317
+ control?.markAsTouched();
318
+ });
319
+ }
320
+ resetForm() {
321
+ this.programClassForm.reset({
322
+ acacpm_isactive: true
323
+ });
324
+ }
325
+ /**
326
+ * Toggle active status when card is clicked
327
+ */
328
+ toggleActiveStatus() {
329
+ const currentValue = this.programClassForm.get('acacpm_isactive')?.value;
330
+ this.programClassForm.patchValue({
331
+ acacpm_isactive: !currentValue
332
+ });
333
+ }
334
+ /**
335
+ * Go back to previous page using browser history
336
+ */
337
+ goBackToProgramClassList() {
338
+ this.location.back();
339
+ }
340
+ /**
341
+ * Cancel form and optionally navigate back
342
+ */
343
+ cancelForm() {
344
+ if (this.isEditMode()) {
345
+ this.location.back();
346
+ }
347
+ else {
348
+ this.resetForm();
349
+ }
350
+ }
351
+ /**
352
+ * Get page title based on mode
353
+ */
354
+ getPageTitle() {
355
+ if (this.isViewMode())
356
+ return 'View Program Class';
357
+ return this.isEditMode() ? 'Edit Program Class' : 'Create New Program Class';
358
+ }
359
+ /**
360
+ * Cleanup when component is destroyed
361
+ */
362
+ ngOnDestroy() {
363
+ console.log('🧹 ProgramClassCreateComponent: Cleaning up component state');
364
+ // Reset all signals to their initial state
365
+ this.loading.set(false);
366
+ this.error.set(null);
367
+ this.programClassId.set('');
368
+ this.isEditMode.set(false);
369
+ this.academicYearOptions.set([]);
370
+ this.classProgramOptions.set([]);
371
+ // Reset form to initial state
372
+ this.resetForm();
373
+ console.log('🧹 ProgramClassCreateComponent: Component state cleaned up');
374
+ }
375
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ProgramClassCreateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
376
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ProgramClassCreateComponent, isStandalone: true, selector: "cide-academics-program-class-create", ngImport: i0, template: "<!-- \r\n PROGRAM CLASS MASTER FORM\r\n \r\n Enterprise-Level Styling with Tailwind CSS\r\n Features: Responsive grids, proper typography, enhanced user experience\r\n-->\r\n\r\n<div class=\"tw-w-full tw-h-full\">\r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"programClassForm\"\r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Simple Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-5 tw-h-5\">school</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">\r\n {{ getPageTitle() }}\r\n </h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Back button or other actions can be added here if needed -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <!-- Basic Program Class Information -->\r\n <div class=\"tw-space-y-6\">\r\n <!-- Class Program and Academic Year at the top -->\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Academic Year *</label>\r\n <cide-ele-select formControlName=\"acacpm_academic_year_id_acayr\" placeholder=\"Select academic year\"\r\n [disabled]=\"isViewMode()\" valueKey=\"_id\" labelKey=\"acayr_name\" [options]=\"academicYearOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program *</label>\r\n <cide-ele-select formControlName=\"acacpm_class_program_id_sygms\" placeholder=\"Select class program\"\r\n [disabled]=\"isViewMode()\" valueKey=\"_id\" labelKey=\"sygms_title\" [options]=\"classProgramOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input label=\"Program Class Title *\" formControlName=\"acacpm_alise_title\"\r\n placeholder=\"e.g., Program Class 2024-2025\" size=\"md\" leadingIcon=\"school\">\r\n </cide-ele-input>\r\n\r\n <div class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\" \r\n (click)=\"toggleActiveStatus()\">\r\n <cide-ele-input formControlName=\"acacpm_isactive\" type=\"checkbox\" size=\"md\" \r\n (click)=\"$event.stopPropagation()\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this program class</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Display -->\r\n @if (error()) {\r\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\r\n [disabled]=\"loading()\">\r\n Reset Form\r\n </button>\r\n\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || programClassForm.invalid\"\r\n [loading]=\"loading()\" leftIcon=\"save\">\r\n {{ isEditMode() ? 'Update Program Class' : 'Create Program Class' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", 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"] }] });
377
+ }
378
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ProgramClassCreateComponent, decorators: [{
379
+ type: Component,
380
+ args: [{ selector: 'cide-academics-program-class-create', standalone: true, imports: [
381
+ CommonModule,
382
+ ReactiveFormsModule,
383
+ CideInputComponent,
384
+ CideEleButtonComponent,
385
+ CideIconComponent,
386
+ CideSelectComponent,
387
+ ], template: "<!-- \r\n PROGRAM CLASS MASTER FORM\r\n \r\n Enterprise-Level Styling with Tailwind CSS\r\n Features: Responsive grids, proper typography, enhanced user experience\r\n-->\r\n\r\n<div class=\"tw-w-full tw-h-full\">\r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"programClassForm\"\r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Simple Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-5 tw-h-5\">school</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">\r\n {{ getPageTitle() }}\r\n </h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Back button or other actions can be added here if needed -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <!-- Basic Program Class Information -->\r\n <div class=\"tw-space-y-6\">\r\n <!-- Class Program and Academic Year at the top -->\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Academic Year *</label>\r\n <cide-ele-select formControlName=\"acacpm_academic_year_id_acayr\" placeholder=\"Select academic year\"\r\n [disabled]=\"isViewMode()\" valueKey=\"_id\" labelKey=\"acayr_name\" [options]=\"academicYearOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program *</label>\r\n <cide-ele-select formControlName=\"acacpm_class_program_id_sygms\" placeholder=\"Select class program\"\r\n [disabled]=\"isViewMode()\" valueKey=\"_id\" labelKey=\"sygms_title\" [options]=\"classProgramOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input label=\"Program Class Title *\" formControlName=\"acacpm_alise_title\"\r\n placeholder=\"e.g., Program Class 2024-2025\" size=\"md\" leadingIcon=\"school\">\r\n </cide-ele-input>\r\n\r\n <div class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\" \r\n (click)=\"toggleActiveStatus()\">\r\n <cide-ele-input formControlName=\"acacpm_isactive\" type=\"checkbox\" size=\"md\" \r\n (click)=\"$event.stopPropagation()\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this program class</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Display -->\r\n @if (error()) {\r\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\r\n [disabled]=\"loading()\">\r\n Reset Form\r\n </button>\r\n\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || programClassForm.invalid\"\r\n [loading]=\"loading()\" leftIcon=\"save\">\r\n {{ isEditMode() ? 'Update Program Class' : 'Create Program Class' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n" }]
388
+ }], ctorParameters: () => [] });
389
+
390
+ export { ProgramClassCreateComponent };
391
+ //# sourceMappingURL=cloud-ide-academics-program-class-create.component-Ds8vN9sL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-academics-program-class-create.component-Ds8vN9sL.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/program-class-management/components/program-class-create/program-class-create.component.ts","../../../projects/cloud-ide-academics/src/lib/collection/program-class-management/components/program-class-create/program-class-create.component.html"],"sourcesContent":["import { Component, inject, signal, OnInit, DestroyRef, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Location } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CideInputComponent, CideTextareaComponent, CideEleButtonComponent, CideIconComponent, CideSelectComponent, NotificationService, ConfirmationService } from 'cloud-ide-element';\r\nimport { AppStateHelperService } from 'cloud-ide-layout';\r\nimport { CideCoreGeneralMasterService } from 'cloud-ide-core';\r\nimport { CideLytAcademicYearService } from '../../../academic-year-management';\r\nimport { CideLytProgramClassService } from '../../services/program-class.service';\r\nimport { AcaAcademicYear, ICoreSygms, generateObjectFromString } from 'cloud-ide-lms-model';\r\n\r\n// Interfaces based on the model files\r\ninterface ProgramClass {\r\n _id?: string;\r\n acacpm_class_program_id_sygms?: string;\r\n acacpm_alise_title?: string;\r\n acacpm_academic_year_id_acayr?: string;\r\n acacpm_entity_id_syen?: string;\r\n acacpm_isactive?: boolean;\r\n}\r\n\r\n\r\ninterface AcademicYear {\r\n _id?: string;\r\n acayr_name?: string;\r\n acayr_code?: string;\r\n}\r\n\r\ninterface ClassProgram {\r\n _id?: string;\r\n sygmt_name?: string;\r\n sygmt_code?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-academics-program-class-create',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n CideInputComponent,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n CideSelectComponent,\r\n ],\r\n templateUrl: './program-class-create.component.html'\r\n})\r\nexport class ProgramClassCreateComponent implements OnInit, OnDestroy {\r\n // Dependency injection\r\n private destroyRef = inject(DestroyRef);\r\n private fb = inject(FormBuilder);\r\n private generalMasterService = inject(CideCoreGeneralMasterService);\r\n private academicYearService = inject(CideLytAcademicYearService);\r\n private programClassService = inject(CideLytProgramClassService);\r\n private router = inject(Router);\r\n private route = inject(ActivatedRoute);\r\n private location = inject(Location);\r\n private appState = inject(AppStateHelperService);\r\n private notificationService = inject(NotificationService);\r\n private confirmationService = inject(ConfirmationService);\r\n\r\n programClassForm: FormGroup;\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n\r\n // Program class information from route\r\n programClassId = signal<string>('');\r\n isEditMode = signal(false);\r\n isViewMode = signal(false);\r\n\r\n // Data signals\r\n academicYears = signal<AcademicYear[]>([]);\r\n classPrograms = signal<ClassProgram[]>([]);\r\n\r\n // Options for dropdowns\r\n academicYearOptions = signal<AcaAcademicYear[]>([]);\r\n classProgramOptions = signal<ICoreSygms[]>([]);\r\n\r\n constructor() {\r\n this.programClassForm = this.fb.group({\r\n // Basic Program Class Information\r\n acacpm_class_program_id_sygms: ['', [Validators.required]],\r\n acacpm_alise_title: ['', [Validators.required, Validators.minLength(2)]],\r\n acacpm_academic_year_id_acayr: ['', [Validators.required]],\r\n acacpm_entity_id_syen: [''], // Set automatically from app state\r\n acacpm_isactive: [true]\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initializeComponent();\r\n this.setupFormSubscriptions();\r\n }\r\n\r\n /**\r\n * Initialize component\r\n */\r\n private initializeComponent(): void {\r\n // Set entity ID from app state\r\n this.setEntityFromAppState();\r\n\r\n // Get program class information from route (for edit/view mode)\r\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\r\n const queryParams = params['query'];\r\n console.log('🔍 Route params:', queryParams);\r\n\r\n if (queryParams) {\r\n // Query parameters passed (following page-controls pattern)\r\n const queryData = generateObjectFromString(queryParams);\r\n if (queryData?.acacpm_id) {\r\n this.programClassId.set(queryData.acacpm_id as string);\r\n this.isEditMode.set(true);\r\n this.loadProgramClassData(queryData.acacpm_id as string);\r\n }\r\n } else {\r\n // Check URL path for edit/view mode\r\n const url = this.router.url;\r\n if (url.includes('/view/')) {\r\n this.isViewMode.set(true);\r\n // Extract ID from URL path\r\n const pathSegments = url.split('/');\r\n const id = pathSegments[pathSegments.length - 1];\r\n if (id) {\r\n this.programClassId.set(id);\r\n this.loadProgramClassData(id);\r\n }\r\n } else if (url.includes('/edit/')) {\r\n this.isEditMode.set(true);\r\n // Extract ID from URL path\r\n const pathSegments = url.split('/');\r\n const id = pathSegments[pathSegments.length - 1];\r\n if (id) {\r\n this.programClassId.set(id);\r\n this.loadProgramClassData(id);\r\n }\r\n } else {\r\n // Create mode\r\n this.isEditMode.set(false);\r\n this.isViewMode.set(false);\r\n }\r\n }\r\n\r\n // Always load dropdown options\r\n this.loadDropdownOptions();\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Set entity ID from app state\r\n */\r\n private setEntityFromAppState(): void {\r\n const activeEntity = this.appState.activeEntity();\r\n if (activeEntity?._id) {\r\n this.programClassForm.patchValue({\r\n acacpm_entity_id_syen: activeEntity._id\r\n });\r\n console.log('✅ Entity ID set from app state:', activeEntity._id);\r\n } else {\r\n console.warn('⚠️ No active entity found in app state');\r\n }\r\n }\r\n\r\n /**\r\n * Set default academic year to the current one\r\n */\r\n private setDefaultAcademicYear(academicYears: AcaAcademicYear[]): void {\r\n // Find the academic year with acayrmp_iscurrent: true\r\n const currentAcademicYear = academicYears.find(year => year.acayr_iscurrent === true);\r\n \r\n if (currentAcademicYear) {\r\n this.programClassForm.patchValue({\r\n acacpm_academic_year_id_acayr: currentAcademicYear._id\r\n });\r\n console.log('✅ Default academic year set to current:', currentAcademicYear.acayr_name, currentAcademicYear._id);\r\n } else {\r\n console.warn('⚠️ No current academic year found (acayrmp_iscurrent: true)');\r\n }\r\n }\r\n\r\n /**\r\n * Setup form subscriptions for auto-population\r\n */\r\n private setupFormSubscriptions(): void {\r\n // Listen for class program selection changes\r\n this.programClassForm.get('acacpm_class_program_id_sygms')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((selectedClassProgramId) => {\r\n if (selectedClassProgramId) {\r\n this.updateProgramClassName(selectedClassProgramId);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update program class name based on selected class program\r\n */\r\n private updateProgramClassName(selectedClassProgramId: string): void {\r\n const selectedClassProgram = this.classProgramOptions().find(option => option._id === selectedClassProgramId);\r\n \r\n if (selectedClassProgram && selectedClassProgram.sygms_title) {\r\n // Only update if the title field is empty or if user hasn't manually changed it\r\n const currentTitle = this.programClassForm.get('acacpm_alise_title')?.value;\r\n if (!currentTitle || currentTitle.trim() === '') {\r\n this.programClassForm.patchValue({\r\n acacpm_alise_title: selectedClassProgram.sygms_title\r\n });\r\n console.log('✅ Program class title auto-populated:', selectedClassProgram.sygms_title);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load program class data for edit/view mode\r\n */\r\n private loadProgramClassData(programClassId: string): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n // Create payload for getting program class by ID\r\n const payload = {\r\n acacpm_id: programClassId\r\n };\r\n\r\n // Load program class data\r\n this.programClassService.getProgramClassById(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n console.log('📚 Program class data loaded:', response.data);\r\n this.populateFormWithProgramClassData(response.data);\r\n \r\n // Disable form if in view mode\r\n if (this.isViewMode()) {\r\n this.programClassForm.disable();\r\n }\r\n } else {\r\n console.error('❌ Failed to load program class data');\r\n this.error.set('Failed to load program class data');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error loading program class data:', error);\r\n this.error.set('Error loading program class data');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Populate form with program class data\r\n */\r\n private populateFormWithProgramClassData(data: any): void {\r\n this.programClassForm.patchValue({\r\n acacpm_class_program_id_sygms: data.acacpm_class_program_id_sygms?._id || data.acacpm_class_program_id_sygms,\r\n acacpm_alise_title: data.acacpm_alise_title,\r\n acacpm_academic_year_id_acayr: data.acacpm_academic_year_id_acayr?._id || data.acacpm_academic_year_id_acayr,\r\n acacpm_entity_id_syen: data.acacpm_entity_id_syen?._id || data.acacpm_entity_id_syen,\r\n acacpm_isactive: data.acacpm_isactive\r\n });\r\n }\r\n\r\n /**\r\n * Load dropdown options\r\n */\r\n private loadDropdownOptions(): void {\r\n // Load academic year options from academic year service\r\n this.academicYearService.getAcademicYearList({})\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n console.log('🔍 Academic Year API Response:', response);\r\n if (response?.success && response.data) {\r\n console.log('📚 Academic years loaded from service:', response.data);\r\n this.academicYearOptions.set(response.data);\r\n console.log('✅ academicYearOptions signal updated:', this.academicYearOptions());\r\n \r\n // Set default academic year to the current one\r\n this.setDefaultAcademicYear(response.data);\r\n } else {\r\n console.warn('⚠️ No academic year data received from service');\r\n this.academicYearOptions.set([]);\r\n }\r\n },\r\n error: (error) => {\r\n console.error('❌ Error loading academic years from service:', error);\r\n this.academicYearOptions.set([]);\r\n }\r\n });\r\n\r\n // Load class program options from general master service\r\n this.generalMasterService.getMasterList({ sygmt_code: 'class_program_type' })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n console.log('🔍 General Master API Response:', response);\r\n if (response?.success && response.data) {\r\n console.log('📚 Class program types loaded from general master:', response.data);\r\n // Use the response data directly without transformation\r\n this.classProgramOptions.set(response.data);\r\n console.log('✅ classProgramOptions signal updated:', this.classProgramOptions());\r\n } else {\r\n console.warn('⚠️ No class program type data received from general master');\r\n this.classProgramOptions.set([]);\r\n }\r\n },\r\n error: (error) => {\r\n console.error('❌ Error loading class program types from general master:', error);\r\n this.classProgramOptions.set([]);\r\n }\r\n });\r\n }\r\n\r\n\r\n onSubmit() {\r\n if (this.isViewMode()) {\r\n this.location.back();\r\n return;\r\n }\r\n\r\n if (this.programClassForm.invalid) {\r\n this.notificationService.error('Please fill in all required fields correctly.');\r\n this.markFormGroupTouched();\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n const formData = this.programClassForm.value;\r\n console.log('Program Class Form Data:', formData);\r\n\r\n // Add ID for edit mode\r\n if (this.isEditMode()) {\r\n formData._id = this.programClassId();\r\n }\r\n\r\n // Make API call to save program class\r\n this.programClassService.saveProgramClass(formData)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n const action = this.isEditMode() ? 'updated' : 'created';\r\n this.notificationService.success(`Program class has been ${action} successfully.`);\r\n \r\n // Navigate to program class list on successful create, go back on edit\r\n if (this.isEditMode()) {\r\n this.location.back();\r\n } else {\r\n // Navigate to program class list for create operation (closes current tab)\r\n this.router.navigate(['/control-panel/program-class-management']);\r\n }\r\n } else {\r\n this.notificationService.error(response?.message || 'Failed to save program class.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('Error saving program class:', error);\r\n this.notificationService.error('An error occurred while saving the program class.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all form controls as touched to trigger validation display\r\n */\r\n private markFormGroupTouched(): void {\r\n Object.keys(this.programClassForm.controls).forEach(key => {\r\n const control = this.programClassForm.get(key);\r\n control?.markAsTouched();\r\n });\r\n }\r\n\r\n resetForm() {\r\n this.programClassForm.reset({\r\n acacpm_isactive: true\r\n });\r\n }\r\n\r\n /**\r\n * Toggle active status when card is clicked\r\n */\r\n toggleActiveStatus(): void {\r\n const currentValue = this.programClassForm.get('acacpm_isactive')?.value;\r\n this.programClassForm.patchValue({\r\n acacpm_isactive: !currentValue\r\n });\r\n }\r\n\r\n /**\r\n * Go back to previous page using browser history\r\n */\r\n goBackToProgramClassList(): void {\r\n this.location.back();\r\n }\r\n\r\n /**\r\n * Cancel form and optionally navigate back\r\n */\r\n cancelForm(): void {\r\n if (this.isEditMode()) {\r\n this.location.back();\r\n } else {\r\n this.resetForm();\r\n }\r\n }\r\n\r\n /**\r\n * Get page title based on mode\r\n */\r\n getPageTitle(): string {\r\n if (this.isViewMode()) return 'View Program Class';\r\n return this.isEditMode() ? 'Edit Program Class' : 'Create New Program Class';\r\n }\r\n\r\n /**\r\n * Cleanup when component is destroyed\r\n */\r\n ngOnDestroy(): void {\r\n console.log('🧹 ProgramClassCreateComponent: Cleaning up component state');\r\n\r\n // Reset all signals to their initial state\r\n this.loading.set(false);\r\n this.error.set(null);\r\n this.programClassId.set('');\r\n this.isEditMode.set(false);\r\n this.academicYearOptions.set([]);\r\n this.classProgramOptions.set([]);\r\n\r\n // Reset form to initial state\r\n this.resetForm();\r\n\r\n console.log('🧹 ProgramClassCreateComponent: Component state cleaned up');\r\n }\r\n}\r\n","<!-- \r\n PROGRAM CLASS MASTER FORM\r\n \r\n Enterprise-Level Styling with Tailwind CSS\r\n Features: Responsive grids, proper typography, enhanced user experience\r\n-->\r\n\r\n<div class=\"tw-w-full tw-h-full\">\r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"programClassForm\"\r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Simple Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-purple-600 tw-w-5 tw-h-5\">school</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">\r\n {{ getPageTitle() }}\r\n </h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Back button or other actions can be added here if needed -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <!-- Basic Program Class Information -->\r\n <div class=\"tw-space-y-6\">\r\n <!-- Class Program and Academic Year at the top -->\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Academic Year *</label>\r\n <cide-ele-select formControlName=\"acacpm_academic_year_id_acayr\" placeholder=\"Select academic year\"\r\n [disabled]=\"isViewMode()\" valueKey=\"_id\" labelKey=\"acayr_name\" [options]=\"academicYearOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-space-y-2\">\r\n <label class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Class Program *</label>\r\n <cide-ele-select formControlName=\"acacpm_class_program_id_sygms\" placeholder=\"Select class program\"\r\n [disabled]=\"isViewMode()\" valueKey=\"_id\" labelKey=\"sygms_title\" [options]=\"classProgramOptions()\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6\">\r\n <cide-ele-input label=\"Program Class Title *\" formControlName=\"acacpm_alise_title\"\r\n placeholder=\"e.g., Program Class 2024-2025\" size=\"md\" leadingIcon=\"school\">\r\n </cide-ele-input>\r\n\r\n <div class=\"tw-flex tw-items-center tw-gap-3 tw-p-4 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200 tw-cursor-pointer hover:tw-bg-gray-100 tw-transition-colors tw-duration-200\" \r\n (click)=\"toggleActiveStatus()\">\r\n <cide-ele-input formControlName=\"acacpm_isactive\" type=\"checkbox\" size=\"md\" \r\n (click)=\"$event.stopPropagation()\">\r\n </cide-ele-input>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this program class</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Display -->\r\n @if (error()) {\r\n <div class=\"tw-mt-6 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon variant=\"red\" size=\"sm\">error</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-font-medium tw-text-red-800\">{{ error() }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-2 tw-bg-gray-50 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-justify-end tw-gap-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"resetForm()\" leftIcon=\"refresh\"\r\n [disabled]=\"loading()\">\r\n Reset Form\r\n </button>\r\n\r\n <button cideEleButton type=\"button\" variant=\"secondary\" (click)=\"cancelForm()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" [disabled]=\"loading() || programClassForm.invalid\"\r\n [loading]=\"loading()\" leftIcon=\"save\">\r\n {{ isEditMode() ? 'Update Program Class' : 'Create Program Class' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n"],"names":[],"mappings":"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"}