cloud-ide-core 0.0.1 → 1.0.1

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 (25) hide show
  1. package/esm2022/lib/cloud-ide-core.routes.mjs +137 -0
  2. package/esm2022/lib/core/general-master-management/components/general-master/general-master.component.mjs +738 -0
  3. package/esm2022/lib/core/general-master-management/components/general-master-type/general-master-type.component.mjs +608 -0
  4. package/esm2022/lib/core/general-master-management/services/general-master-type.service.mjs +203 -0
  5. package/esm2022/lib/core/general-master-management/services/general-master.service.mjs +166 -0
  6. package/esm2022/lib/core/page-management/components/page-form/page-form.component.mjs +212 -0
  7. package/esm2022/public-api.mjs +2 -1
  8. package/fesm2022/cloud-ide-core-general-master-type.component-B26auJZw.mjs +611 -0
  9. package/fesm2022/cloud-ide-core-general-master-type.component-B26auJZw.mjs.map +1 -0
  10. package/fesm2022/cloud-ide-core-general-master-type.service-Ab64Jjps.mjs +206 -0
  11. package/fesm2022/cloud-ide-core-general-master-type.service-Ab64Jjps.mjs.map +1 -0
  12. package/fesm2022/cloud-ide-core-general-master.component-B6llTVoV.mjs +903 -0
  13. package/fesm2022/cloud-ide-core-general-master.component-B6llTVoV.mjs.map +1 -0
  14. package/fesm2022/cloud-ide-core-page-form.component-CaEca3mB.mjs +215 -0
  15. package/fesm2022/cloud-ide-core-page-form.component-CaEca3mB.mjs.map +1 -0
  16. package/fesm2022/cloud-ide-core.mjs +173 -1
  17. package/fesm2022/cloud-ide-core.mjs.map +1 -1
  18. package/lib/cloud-ide-core.routes.d.ts +2 -0
  19. package/lib/core/general-master-management/components/general-master/general-master.component.d.ts +167 -0
  20. package/lib/core/general-master-management/components/general-master-type/general-master-type.component.d.ts +129 -0
  21. package/lib/core/general-master-management/services/general-master-type.service.d.ts +75 -0
  22. package/lib/core/general-master-management/services/general-master.service.d.ts +62 -0
  23. package/lib/core/page-management/components/page-form/page-form.component.d.ts +35 -0
  24. package/package.json +1 -1
  25. package/public-api.d.ts +1 -0
@@ -0,0 +1,903 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable, DestroyRef, viewChild, signal, computed, Component } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import * as i2 from '@angular/forms';
5
+ import { NonNullableFormBuilder, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
6
+ import { Router, ActivatedRoute } from '@angular/router';
7
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
+ import { HttpClient } from '@angular/common/http';
9
+ import { BehaviorSubject, throwError } from 'rxjs';
10
+ import { tap, catchError } from 'rxjs/operators';
11
+ import { generateStringFromObject, cidePath, hostManagerRoutesUrl, coreRoutesUrl, generateObjectFromString } from 'cloud-ide-lms-model';
12
+ import { G as GeneralMasterTypeService } from './cloud-ide-core-general-master-type.service-Ab64Jjps.mjs';
13
+ import { CideEleButtonComponent, CideEleDataGridComponent, CideInputComponent, CideTextareaComponent, CideIconComponent, CideEleDropdownComponent, CideEleJsonEditorComponent, CideSelectComponent } from 'cloud-ide-element';
14
+ import { AppStateHelperService } from 'cloud-ide-layout';
15
+
16
+ class GeneralMasterService {
17
+ constructor() {
18
+ this.http = inject(HttpClient);
19
+ this.generalMasterListSubject = new BehaviorSubject([]);
20
+ this.generalMasterList$ = this.generalMasterListSubject.asObservable();
21
+ console.log('GeneralMasterService initialized - using real API');
22
+ }
23
+ /**
24
+ * Get general master list from API
25
+ */
26
+ getMasterList(payload) {
27
+ const query = generateStringFromObject(payload);
28
+ return this.http?.get(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]))
29
+ .pipe(tap((response) => {
30
+ if (response?.success) {
31
+ this.generalMasterListSubject.next(response?.data || []);
32
+ }
33
+ }), catchError(error => {
34
+ console.error('GeneralMasterService API error:', error);
35
+ return this.handleError(error);
36
+ }));
37
+ }
38
+ /**
39
+ * Get general master list from cache (if available)
40
+ */
41
+ getMasterListFromCache() {
42
+ return this.generalMasterListSubject.value;
43
+ }
44
+ /**
45
+ * Save general master (create or update)
46
+ * POST ${coreRoutesUrl?.generalMaster} - payload: ICoreSygms, response: generalMasterInsertUpdateControllerResponse
47
+ */
48
+ saveMaster(master) {
49
+ const isUpdate = !!master._id;
50
+ console.log(`${isUpdate ? 'Updating' : 'Creating'} general master:`, master);
51
+ // Create proper payload
52
+ const payload = {
53
+ ...(master._id && { _id: master._id }), // Only include _id if it exists
54
+ sygms_code: master.sygms_code,
55
+ sygms_id_sygmt: master.sygms_id_sygmt,
56
+ sygms_title: master.sygms_title,
57
+ sygms_desc: master.sygms_desc,
58
+ sygms_isactive: master.sygms_isactive,
59
+ sygms_id_sygms: master.sygms_id_sygms,
60
+ sygms_configuration: master.sygms_configuration,
61
+ sygms_entity_id_syen: master.sygms_entity_id_syen
62
+ };
63
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster]);
64
+ return this.http.post(url, payload)
65
+ .pipe(tap((response) => {
66
+ if (response.success) {
67
+ this.refreshMasterList();
68
+ }
69
+ }), catchError(this.handleError));
70
+ }
71
+ /**
72
+ * Create new general master (backward compatibility)
73
+ */
74
+ createMaster(master) {
75
+ return this.saveMaster(master);
76
+ }
77
+ /**
78
+ * Update existing general master (backward compatibility)
79
+ */
80
+ updateMaster(id, master) {
81
+ return this.saveMaster({ ...master, _id: id });
82
+ }
83
+ /**
84
+ * Get general master by ID
85
+ * GET ${coreRoutesUrl?.generalMaster}/byId/:query - payload: { sygms_id: string }, response: generalMasterByIdControllerResponse
86
+ */
87
+ getMasterById(id) {
88
+ console.log('Getting general master by ID:', id);
89
+ const payload = { sygms_id: id };
90
+ const query = generateStringFromObject(payload);
91
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, 'byId', query]);
92
+ return this.http.get(url)
93
+ .pipe(catchError(this.handleError));
94
+ }
95
+ /**
96
+ * Delete general master
97
+ * DELETE ${coreRoutesUrl?.generalMaster}/:query - payload: { sygms_id: string }, response: generalMasterDeleteControllerResponse
98
+ */
99
+ deleteMaster(id) {
100
+ const payload = { sygms_id: id };
101
+ const query = generateStringFromObject(payload);
102
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]);
103
+ return this.http.delete(url)
104
+ .pipe(tap((response) => {
105
+ if (response.success) {
106
+ this.refreshMasterList();
107
+ }
108
+ }), catchError(this.handleError));
109
+ }
110
+ /**
111
+ * Toggle general master active status
112
+ */
113
+ toggleMasterStatus(id) {
114
+ console.log('Toggling general master status:', id);
115
+ const payload = { id };
116
+ const query = generateStringFromObject(payload);
117
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]);
118
+ return this.http.put(url, {})
119
+ .pipe(tap((response) => {
120
+ if (response.success) {
121
+ this.refreshMasterList();
122
+ }
123
+ }), catchError(this.handleError));
124
+ }
125
+ /**
126
+ * Check if master code exists
127
+ */
128
+ checkMasterCodeExists(code, typeId, excludeId) {
129
+ const payload = { code, typeId };
130
+ if (excludeId) {
131
+ payload['excludeId'] = excludeId;
132
+ }
133
+ const query = generateStringFromObject(payload);
134
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, 'checkCodeExists', query]);
135
+ return this.http.get(url)
136
+ .pipe(catchError(this.handleError));
137
+ }
138
+ /**
139
+ * Refresh general master list from server
140
+ */
141
+ refreshMasterList() {
142
+ const defaultPayload = {};
143
+ this.getMasterList(defaultPayload).subscribe({
144
+ next: () => {
145
+ console.log('General master list refreshed successfully');
146
+ },
147
+ error: (error) => {
148
+ console.error('Error refreshing general master list:', error);
149
+ }
150
+ });
151
+ }
152
+ /**
153
+ * Handle errors
154
+ */
155
+ handleError(error) {
156
+ let errorMessage = 'An error occurred';
157
+ if (error instanceof Error) {
158
+ errorMessage = error.message;
159
+ }
160
+ else if (typeof error === 'string') {
161
+ errorMessage = error;
162
+ }
163
+ console.error('General Master Service Error:', errorMessage);
164
+ return throwError(() => new Error(errorMessage));
165
+ }
166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
167
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterService, providedIn: 'root' }); }
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterService, decorators: [{
170
+ type: Injectable,
171
+ args: [{
172
+ providedIn: 'root'
173
+ }]
174
+ }], ctorParameters: () => [] });
175
+
176
+ /**
177
+ * General Master Component
178
+ *
179
+ * Note: This component now uses the new IGeneralMasterListRequest interface
180
+ * which only supports:
181
+ * - sygms_id_sygmt: Filter by master type
182
+ * - sygms_entity_id_syen: Filter by entity (with hierarchical lookup)
183
+ *
184
+ * Features like search, pagination, and parent filtering are not supported
185
+ * in the current interface and would need backend implementation.
186
+ */
187
+ class GeneralMasterComponent {
188
+ constructor() {
189
+ // Dependency injection
190
+ this.destroyRef = inject(DestroyRef);
191
+ this.masterService = inject(GeneralMasterService);
192
+ this.typeService = inject(GeneralMasterTypeService);
193
+ this.fb = inject(NonNullableFormBuilder);
194
+ this.router = inject(Router);
195
+ this.route = inject(ActivatedRoute);
196
+ this.appState = inject(AppStateHelperService);
197
+ // Modern ViewChild signals for template renderers (Angular 20 approach)
198
+ this.masterDetailsRendererTemplate = viewChild.required('masterDetailsRendererTemplate');
199
+ this.masterStatusRendererTemplate = viewChild.required('masterStatusRendererTemplate');
200
+ this.actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
201
+ // Make Math available in template
202
+ this.Math = Math;
203
+ // Signals for reactive state management
204
+ this.masters = signal([]);
205
+ this.loading = signal(false);
206
+ this.error = signal(null);
207
+ this.selectedItems = signal([]);
208
+ this.searchTerm = signal('');
209
+ this.selectedParentMaster = signal('');
210
+ // Type information
211
+ this.typeId = signal('');
212
+ this.typeTitle = signal('');
213
+ this.currentType = signal(null);
214
+ // Form state
215
+ this.isEditMode = signal(false);
216
+ this.editingMasterId = signal(null);
217
+ this.retrievedMaster = signal(null);
218
+ // Pagination signals
219
+ this.currentPage = signal(1);
220
+ this.pageSize = signal(10);
221
+ this.totalItems = signal(0);
222
+ // Modern reactive forms with signals
223
+ this.masterForm = this.fb.group({
224
+ sygms_code: ['', [Validators.required, Validators.maxLength(40)]],
225
+ sygms_title: ['', [Validators.required, Validators.maxLength(150)]],
226
+ sygms_desc: ['', [Validators.maxLength(500)]],
227
+ sygms_configuration: ['{}', [Validators.required]],
228
+ sygms_id_sygms: [''],
229
+ sygms_isactive: [true]
230
+ });
231
+ // Computed values
232
+ this.isFormDirty = computed(() => this.masterForm.dirty);
233
+ // Parent master options for dropdown
234
+ this.parentMasterOptions = signal([]);
235
+ // Grid configuration signal
236
+ this.gridConfig = signal({
237
+ id: 'master-list-grid',
238
+ title: '',
239
+ subtitle: '',
240
+ columns: [
241
+ {
242
+ key: 'details',
243
+ header: 'Master Details',
244
+ type: 'custom',
245
+ width: 'auto',
246
+ truncate: true,
247
+ align: 'left',
248
+ renderer: 'masterDetailsRenderer'
249
+ },
250
+ {
251
+ key: 'sygms_code',
252
+ header: 'Master Code',
253
+ type: 'text',
254
+ width: '150px',
255
+ truncate: true,
256
+ align: 'left'
257
+ },
258
+ {
259
+ key: 'sygms_isactive',
260
+ header: 'Status',
261
+ type: 'custom',
262
+ width: '100px',
263
+ truncate: false,
264
+ align: 'center',
265
+ renderer: 'masterStatusRenderer'
266
+ },
267
+ {
268
+ key: 'actions',
269
+ header: '',
270
+ type: 'custom',
271
+ width: '150px',
272
+ truncate: false,
273
+ align: 'center',
274
+ renderer: 'actionsDropdownRenderer'
275
+ }
276
+ ],
277
+ data: [],
278
+ trackBy: '_id',
279
+ pagination: {
280
+ enabled: true,
281
+ pageSize: 10,
282
+ pageSizeOptions: [10, 25, 50, 100],
283
+ showQuickJump: true,
284
+ showPageInfo: true,
285
+ showRefresh: true
286
+ },
287
+ search: {
288
+ enabled: true,
289
+ placeholder: 'Search masters...',
290
+ searchableColumns: ['sygms_title', 'sygms_desc', 'sygms_code'],
291
+ debounceMs: 300
292
+ },
293
+ loading: {
294
+ useDefer: true,
295
+ skeletonRows: 5,
296
+ showOverlay: false
297
+ },
298
+ scroll: {
299
+ enabled: true,
300
+ maxHeight: '',
301
+ minHeight: '',
302
+ stickyHeader: true,
303
+ virtualScroll: false,
304
+ rowHeight: 50
305
+ },
306
+ tree: {
307
+ enabled: true,
308
+ primaryKey: '_id',
309
+ foreignKey: 'sygms_id_sygms',
310
+ childrenKey: 'children',
311
+ levelKey: 'level',
312
+ expandedKey: 'expanded',
313
+ hasChildrenKey: 'hasChildren'
314
+ },
315
+ responsive: true,
316
+ striped: false,
317
+ bordered: true,
318
+ compact: false,
319
+ tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
320
+ });
321
+ // Action handlers for grid
322
+ this.actionHandlers = {
323
+ onEdit: (item) => this.editMaster(item),
324
+ onDelete: (item) => this.deleteMaster(item),
325
+ onToggleStatus: (item) => this.toggleMasterStatus(item)
326
+ };
327
+ // Computed template renderers for grid
328
+ this.templateRenderers = computed(() => ({
329
+ masterDetailsRenderer: this.masterDetailsRendererTemplate(),
330
+ masterStatusRenderer: this.masterStatusRendererTemplate(),
331
+ actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
332
+ }));
333
+ }
334
+ ngOnInit() {
335
+ this.initializeComponent();
336
+ }
337
+ /**
338
+ * Initialize component
339
+ */
340
+ initializeComponent() {
341
+ // Get type information from route
342
+ this.route.params.subscribe(params => {
343
+ const payload = generateObjectFromString(params['query'] || '');
344
+ this.typeId.set(payload.sygmt_id || '');
345
+ this.typeTitle.set(payload.sygmt_title || '');
346
+ if (this.typeId()) {
347
+ this.loadTypeDetails();
348
+ this.loadMasters();
349
+ this.loadParentMasterOptions();
350
+ this.setupFormSubscriptions();
351
+ }
352
+ else {
353
+ this.error.set('No type ID provided');
354
+ }
355
+ });
356
+ }
357
+ /**
358
+ * Load type details
359
+ */
360
+ loadTypeDetails() {
361
+ this.typeService.getTypeById(this.typeId())
362
+ .pipe(takeUntilDestroyed(this.destroyRef))
363
+ .subscribe({
364
+ next: (response) => {
365
+ if (response.success) {
366
+ this.currentType.set(response.data);
367
+ }
368
+ },
369
+ error: (error) => {
370
+ console.error('Error loading type details:', error);
371
+ }
372
+ });
373
+ }
374
+ /**
375
+ * Load masters from API
376
+ */
377
+ loadMasters() {
378
+ this.loading.set(true);
379
+ this.error.set(null);
380
+ const payload = {
381
+ ...(this.typeId() && { sygms_id_sygmt: this.typeId() })
382
+ // Note: search, pagination, and parent_id are not supported in the new interface
383
+ // These would need to be implemented in the backend if needed
384
+ };
385
+ this.masterService.getMasterList(payload)
386
+ .pipe(takeUntilDestroyed(this.destroyRef))
387
+ .subscribe({
388
+ next: (response) => {
389
+ if (response.success) {
390
+ this.masters.set(response.data || []);
391
+ this.totalItems.set(response.total || 0);
392
+ this.updateGridData();
393
+ }
394
+ else {
395
+ this.error.set(response.message || 'Failed to load masters');
396
+ }
397
+ this.loading.set(false);
398
+ },
399
+ error: (error) => {
400
+ console.error('Error loading masters:', error);
401
+ this.error.set('Failed to load masters. Please try again.');
402
+ this.loading.set(false);
403
+ }
404
+ });
405
+ }
406
+ /**
407
+ * Load masters by entity ID
408
+ */
409
+ loadMastersByEntity(entityId) {
410
+ this.loading.set(true);
411
+ this.error.set(null);
412
+ const payload = {
413
+ sygms_entity_id_syen: entityId,
414
+ ...(this.typeId() && { sygms_id_sygmt: this.typeId() })
415
+ };
416
+ this.masterService.getMasterList(payload)
417
+ .pipe(takeUntilDestroyed(this.destroyRef))
418
+ .subscribe({
419
+ next: (response) => {
420
+ if (response.success) {
421
+ this.masters.set(response.data || []);
422
+ this.totalItems.set(response.total || 0);
423
+ this.updateGridData();
424
+ }
425
+ else {
426
+ this.error.set(response.message || 'Failed to load masters');
427
+ }
428
+ this.loading.set(false);
429
+ },
430
+ error: (error) => {
431
+ console.error('Error loading masters by entity:', error);
432
+ this.error.set('Failed to load masters. Please try again.');
433
+ this.loading.set(false);
434
+ }
435
+ });
436
+ }
437
+ /**
438
+ * Load parent master options for dropdown
439
+ */
440
+ loadParentMasterOptions() {
441
+ const payload = {
442
+ ...(this.typeId() && { sygms_id_sygmt: this.typeId() })
443
+ };
444
+ this.masterService.getMasterList(payload)
445
+ .pipe(takeUntilDestroyed(this.destroyRef))
446
+ .subscribe({
447
+ next: (response) => {
448
+ if (response.success) {
449
+ const options = [
450
+ { value: '', label: '-- Select Parent Master --' },
451
+ ...(response.data || []).map(master => ({
452
+ value: master._id || "",
453
+ label: master.sygms_title || ""
454
+ }))
455
+ ];
456
+ this.parentMasterOptions.set(options);
457
+ }
458
+ },
459
+ error: (error) => {
460
+ console.error('Error loading parent master options:', error);
461
+ }
462
+ });
463
+ }
464
+ /**
465
+ * Setup form subscriptions
466
+ */
467
+ setupFormSubscriptions() {
468
+ // Watch for form changes to enable/disable save button
469
+ this.masterForm.valueChanges
470
+ .pipe(takeUntilDestroyed(this.destroyRef))
471
+ .subscribe(() => {
472
+ // Form validation is handled by computed signals
473
+ });
474
+ }
475
+ /**
476
+ * Update grid data
477
+ */
478
+ updateGridData() {
479
+ this.gridConfig.update(config => ({
480
+ ...config,
481
+ data: this.masters()
482
+ }));
483
+ }
484
+ /**
485
+ * Handle grid events
486
+ */
487
+ onGridEvent(event) {
488
+ switch (event.type) {
489
+ case 'pageChange':
490
+ if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
491
+ this.currentPage.set(event.data['pageIndex']);
492
+ this.pageSize.set(event.data['pageSize']);
493
+ this.loadMasters();
494
+ }
495
+ break;
496
+ case 'search':
497
+ if (event.data && typeof event.data === 'string') {
498
+ this.searchTerm.set(event.data);
499
+ this.currentPage.set(1);
500
+ this.loadMasters();
501
+ }
502
+ break;
503
+ case 'refresh':
504
+ this.loadMasters();
505
+ break;
506
+ case 'action':
507
+ // Handle action events if needed
508
+ console.log('Action event:', event);
509
+ break;
510
+ case 'rowClick':
511
+ // Handle row click events if needed
512
+ console.log('Row click event:', event);
513
+ break;
514
+ case 'sort':
515
+ // Handle sort events if needed
516
+ console.log('Sort event:', event);
517
+ break;
518
+ case 'export':
519
+ // Handle export events if needed
520
+ console.log('Export event:', event);
521
+ break;
522
+ case 'rowReorder':
523
+ // Handle row reorder events if needed
524
+ console.log('Row reorder event:', event);
525
+ break;
526
+ }
527
+ }
528
+ /**
529
+ * Create new master
530
+ */
531
+ createMaster() {
532
+ if (!this.masterForm.valid) {
533
+ this.markFormAsTouched();
534
+ return;
535
+ }
536
+ const formValue = this.masterForm.getRawValue();
537
+ const newMaster = {
538
+ _id: '',
539
+ sygms_code: formValue.sygms_code,
540
+ sygms_id_sygmt: this.typeId(),
541
+ sygms_title: formValue.sygms_title,
542
+ sygms_desc: formValue.sygms_desc,
543
+ sygms_configuration: JSON.parse(formValue.sygms_configuration),
544
+ sygms_id_sygms: formValue.sygms_id_sygms || undefined,
545
+ sygms_entity_id_syen: this.appState.getActiveEntityId() || undefined,
546
+ sygms_isactive: formValue.sygms_isactive
547
+ };
548
+ this.loading.set(true);
549
+ this.masterService.createMaster(newMaster)
550
+ .pipe(takeUntilDestroyed(this.destroyRef))
551
+ .subscribe({
552
+ next: (response) => {
553
+ if (response.success) {
554
+ this.resetForm();
555
+ this.loadMasters();
556
+ this.loadParentMasterOptions();
557
+ console.log('✅ Master created successfully');
558
+ }
559
+ else {
560
+ console.error('❌ Failed to create master:', response.message);
561
+ }
562
+ this.loading.set(false);
563
+ },
564
+ error: (error) => {
565
+ console.error('Error creating master:', error);
566
+ console.error('❌ Failed to create master. Please try again.');
567
+ this.loading.set(false);
568
+ }
569
+ });
570
+ }
571
+ /**
572
+ * Update existing master
573
+ */
574
+ updateMaster() {
575
+ if (!this.masterForm.valid || !this.editingMasterId()) {
576
+ this.markFormAsTouched();
577
+ return;
578
+ }
579
+ const formValue = this.masterForm.getRawValue();
580
+ const updatedMaster = {
581
+ _id: this.editingMasterId(),
582
+ sygms_code: formValue.sygms_code,
583
+ sygms_id_sygmt: this.typeId(),
584
+ sygms_title: formValue.sygms_title,
585
+ sygms_desc: formValue.sygms_desc,
586
+ sygms_configuration: JSON.parse(formValue.sygms_configuration),
587
+ sygms_id_sygms: formValue.sygms_id_sygms || undefined,
588
+ sygms_entity_id_syen: this.appState.getActiveEntityId() || undefined,
589
+ sygms_isactive: formValue.sygms_isactive
590
+ };
591
+ this.loading.set(true);
592
+ this.masterService.updateMaster(this.editingMasterId(), updatedMaster)
593
+ .pipe(takeUntilDestroyed(this.destroyRef))
594
+ .subscribe({
595
+ next: (response) => {
596
+ if (response.success) {
597
+ this.resetForm();
598
+ this.loadMasters();
599
+ this.loadParentMasterOptions();
600
+ console.log('✅ Master updated successfully');
601
+ }
602
+ else {
603
+ console.error('❌ Failed to update master:', response.message);
604
+ }
605
+ this.loading.set(false);
606
+ },
607
+ error: (error) => {
608
+ console.error('Error updating master:', error);
609
+ console.error('❌ Failed to update master. Please try again.');
610
+ this.loading.set(false);
611
+ }
612
+ });
613
+ }
614
+ /**
615
+ * Edit master
616
+ */
617
+ editMaster(master) {
618
+ this.isEditMode.set(true);
619
+ this.editingMasterId.set(master._id || "");
620
+ this.retrievedMaster.set(master);
621
+ this.masterForm.patchValue({
622
+ sygms_code: master.sygms_code,
623
+ sygms_title: master.sygms_title,
624
+ sygms_desc: master.sygms_desc,
625
+ sygms_configuration: JSON.stringify(master.sygms_configuration, null, 2),
626
+ sygms_id_sygms: master.sygms_id_sygms || '',
627
+ sygms_isactive: master.sygms_isactive
628
+ });
629
+ this.masterForm.markAsPristine();
630
+ }
631
+ /**
632
+ * Delete master
633
+ */
634
+ deleteMaster(master) {
635
+ if (confirm(`Are you sure you want to delete the master "${master.sygms_title}"?`)) {
636
+ this.loading.set(true);
637
+ this.masterService.deleteMaster(master._id || "")
638
+ .pipe(takeUntilDestroyed(this.destroyRef))
639
+ .subscribe({
640
+ next: (response) => {
641
+ if (response.success) {
642
+ this.loadMasters();
643
+ this.loadParentMasterOptions();
644
+ console.log('✅ Master deleted successfully');
645
+ }
646
+ else {
647
+ console.error('❌ Failed to delete master:', response.message);
648
+ }
649
+ this.loading.set(false);
650
+ },
651
+ error: (error) => {
652
+ console.error('Error deleting master:', error);
653
+ console.error('❌ Failed to delete master. Please try again.');
654
+ this.loading.set(false);
655
+ }
656
+ });
657
+ }
658
+ }
659
+ /**
660
+ * Toggle master status
661
+ */
662
+ toggleMasterStatus(master) {
663
+ this.loading.set(true);
664
+ this.masterService.toggleMasterStatus(master._id || "")
665
+ .pipe(takeUntilDestroyed(this.destroyRef))
666
+ .subscribe({
667
+ next: (response) => {
668
+ if (response.success) {
669
+ this.loadMasters();
670
+ console.log(`✅ Master ${master.sygms_isactive ? 'deactivated' : 'activated'} successfully`);
671
+ }
672
+ else {
673
+ console.error('❌ Failed to toggle master status:', response.message);
674
+ }
675
+ this.loading.set(false);
676
+ },
677
+ error: (error) => {
678
+ console.error('Error toggling master status:', error);
679
+ console.error('❌ Failed to toggle master status. Please try again.');
680
+ this.loading.set(false);
681
+ }
682
+ });
683
+ }
684
+ /**
685
+ * Reset to parent (delete entity-specific override)
686
+ */
687
+ resetToParent(master) {
688
+ if (confirm(`Are you sure you want to reset "${master.sygms_title}" to parent values?`)) {
689
+ this.loading.set(true);
690
+ this.masterService.deleteMaster(master._id || "")
691
+ .pipe(takeUntilDestroyed(this.destroyRef))
692
+ .subscribe({
693
+ next: (response) => {
694
+ if (response.success) {
695
+ this.loadMasters();
696
+ console.log('✅ Master reset to parent successfully');
697
+ }
698
+ else {
699
+ console.error('❌ Failed to reset master:', response.message);
700
+ }
701
+ this.loading.set(false);
702
+ },
703
+ error: (error) => {
704
+ console.error('Error resetting master:', error);
705
+ console.error('❌ Failed to reset master. Please try again.');
706
+ this.loading.set(false);
707
+ }
708
+ });
709
+ }
710
+ }
711
+ /**
712
+ * Save master (create or update)
713
+ */
714
+ saveMaster() {
715
+ if (this.isEditMode()) {
716
+ this.updateMaster();
717
+ }
718
+ else {
719
+ this.createMaster();
720
+ }
721
+ }
722
+ /**
723
+ * Cancel form
724
+ */
725
+ cancelForm() {
726
+ this.resetForm();
727
+ }
728
+ /**
729
+ * Go back to type list
730
+ */
731
+ goBack() {
732
+ this.router.navigate(['/control-panel/general-master-type']);
733
+ }
734
+ /**
735
+ * Reset form
736
+ */
737
+ resetForm() {
738
+ this.masterForm.reset({
739
+ sygms_code: '',
740
+ sygms_title: '',
741
+ sygms_desc: '',
742
+ sygms_configuration: '{}',
743
+ sygms_id_sygms: '',
744
+ sygms_isactive: true
745
+ });
746
+ this.isEditMode.set(false);
747
+ this.editingMasterId.set(null);
748
+ this.retrievedMaster.set(null);
749
+ this.masterForm.markAsPristine();
750
+ this.masterForm.markAsUntouched();
751
+ }
752
+ /**
753
+ * Mark form as touched to trigger validation display
754
+ */
755
+ markFormAsTouched() {
756
+ Object.keys(this.masterForm.controls).forEach(key => {
757
+ const control = this.masterForm.get(key);
758
+ control?.markAsTouched();
759
+ });
760
+ }
761
+ /**
762
+ * Get dropdown items for actions
763
+ */
764
+ getActionDropdownItems(master) {
765
+ const items = [
766
+ {
767
+ id: 'edit',
768
+ label: 'Edit',
769
+ icon: 'edit',
770
+ disabled: false
771
+ },
772
+ {
773
+ id: 'addChild',
774
+ label: 'Add Child',
775
+ icon: 'add',
776
+ disabled: false
777
+ },
778
+ {
779
+ id: 'toggle',
780
+ label: master.sygms_isactive ? 'Deactivate' : 'Activate',
781
+ icon: master.sygms_isactive ? 'block' : 'check_circle',
782
+ disabled: false
783
+ }
784
+ ];
785
+ // Add reset to parent option if entity-specific
786
+ if (master.sygms_entity_id_syen) {
787
+ items.push({
788
+ id: 'reset',
789
+ label: 'Reset to Parent',
790
+ icon: 'restore',
791
+ disabled: false
792
+ });
793
+ }
794
+ items.push({
795
+ id: 'delete',
796
+ label: 'Delete',
797
+ icon: 'delete',
798
+ disabled: false
799
+ });
800
+ return items;
801
+ }
802
+ /**
803
+ * Handle dropdown item click
804
+ */
805
+ onDropdownItemClick(item, row) {
806
+ console.log('🔵 onDropdownItemClick called with:', item, row);
807
+ switch (item.id) {
808
+ case 'edit':
809
+ console.log('🔵 Calling editMaster with:', row);
810
+ this.editMaster(row);
811
+ break;
812
+ case 'addChild':
813
+ console.log('🔵 Calling onAddChild with:', row);
814
+ this.onAddChild(row);
815
+ break;
816
+ case 'toggle':
817
+ console.log('🔵 Calling toggleMasterStatus with:', row);
818
+ this.toggleMasterStatus(row);
819
+ break;
820
+ case 'reset':
821
+ console.log('🔵 Calling resetToParent with:', row);
822
+ this.resetToParent(row);
823
+ break;
824
+ case 'delete':
825
+ console.log('🔵 Calling deleteMaster with:', row);
826
+ this.deleteMaster(row);
827
+ break;
828
+ default:
829
+ console.log('🔵 Unknown action:', item.id);
830
+ }
831
+ // Close all dropdowns after action
832
+ this.closeAllDropdowns();
833
+ }
834
+ /**
835
+ * Add child master
836
+ */
837
+ onAddChild(parentMaster) {
838
+ console.log('🔵 onAddChild called with:', parentMaster);
839
+ console.log('🔵 Parent title:', parentMaster.sygms_title);
840
+ // Clear edit mode and retrieved item when adding a child
841
+ this.isEditMode.set(false);
842
+ this.editingMasterId.set(null);
843
+ this.retrievedMaster.set(null);
844
+ // Reset form and pre-fill with parent context
845
+ this.masterForm.patchValue({
846
+ sygms_code: '',
847
+ sygms_title: '',
848
+ sygms_desc: '',
849
+ sygms_configuration: '{}',
850
+ sygms_id_sygms: parentMaster._id, // Set parent master ID
851
+ sygms_isactive: true
852
+ });
853
+ // Store the parent master for reference (you can display this in the UI)
854
+ console.log('🔵 Ready to add child master for parent:', parentMaster.sygms_title);
855
+ }
856
+ /**
857
+ * Get parent master display name
858
+ */
859
+ getParentMasterDisplay() {
860
+ const parentId = this.masterForm.get('sygms_id_sygms')?.value;
861
+ if (!parentId)
862
+ return 'Unknown Parent';
863
+ const parentMaster = this.masters().find(master => master._id === parentId);
864
+ return parentMaster?.sygms_title || 'Unknown Parent';
865
+ }
866
+ /**
867
+ * Clear parent master from form
868
+ */
869
+ clearParentMaster() {
870
+ this.masterForm.patchValue({
871
+ sygms_id_sygms: ''
872
+ });
873
+ }
874
+ /**
875
+ * Close all dropdowns
876
+ */
877
+ closeAllDropdowns() {
878
+ // Close all dropdowns by clicking outside
879
+ const event = new MouseEvent('click', { bubbles: true });
880
+ document.dispatchEvent(event);
881
+ }
882
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
883
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: GeneralMasterComponent, isStandalone: true, selector: "cide-core-app-general-master", viewQueries: [{ propertyName: "masterDetailsRendererTemplate", first: true, predicate: ["masterDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "masterStatusRendererTemplate", first: true, predicate: ["masterStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- General Master Container -->\n<div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Quick Add Form Section -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-white\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-0\">\n <div class=\"tw-flex tw-items-center tw-space-x-3 tw-mb-3\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">{{ isEditMode() ? 'Edit Master' : 'Quick Add Master' }}</h6>\n </div>\n \n <!-- Parent Master Info Box -->\n @if (masterForm.get('sygms_id_sygms')?.value) {\n <div class=\"tw-flex tw-items-center tw-space-x-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-px-4 tw-py-1 tw-rounded-lg\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">account_tree</cide-ele-icon>\n <span class=\"tw-text-sm tw-font-medium tw-text-blue-800\">Adding Child</span>\n <span class=\"tw-text-xs tw-text-blue-700\">\n Parent: <span class=\"tw-font-medium\">{{ getParentMasterDisplay() }}</span>\n </span>\n <button \n type=\"button\"\n (click)=\"clearParentMaster()\"\n class=\"tw-text-sm tw-text-blue-600 hover:tw-text-blue-800 hover:tw-bg-blue-100 tw-rounded tw-px-1\">\n \u00D7\n </button>\n </div>\n }\n </div>\n \n <form [formGroup]=\"masterForm\" class=\"tw-space-y-2\">\n \n <!-- First Row - Basic fields -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-6 tw-gap-2\">\n <!-- Master Code -->\n <div class=\"lg:tw-col-span-1\">\n <cide-ele-input \n formControlName=\"sygms_code\" \n label=\"Master Code*\" \n placeholder=\"Enter master code\"\n size=\"sm\"\n [required]=\"true\" \n [maxlength]=\"40\">\n </cide-ele-input>\n </div>\n \n <!-- Master Title -->\n <div class=\"lg:tw-col-span-3\">\n <cide-ele-input \n formControlName=\"sygms_title\" \n label=\"Master Title*\" \n placeholder=\"Enter master title\"\n size=\"sm\"\n [required]=\"true\" \n [maxlength]=\"150\">\n </cide-ele-input>\n </div>\n \n <!-- Active Status -->\n <div class=\"lg:tw-col-span-1 tw-flex tw-items-center tw-pt-0\">\n <cide-ele-input \n formControlName=\"sygms_isactive\"\n type=\"checkbox\"\n label=\"Active\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n \n <!-- Third Row - JSON Configuration and Description/Save side by side -->\n <div class=\"tw-flex tw-gap-4\">\n <!-- JSON Configuration (60% width) -->\n <div class=\"tw-w-3/5\">\n <cide-ele-json-editor \n formControlName=\"sygms_configuration\" \n label=\"Configuration*\" \n size=\"sm\"\n [required]=\"true\">\n </cide-ele-json-editor>\n </div>\n \n <!-- Description and Save Button (40% width) -->\n <div class=\"tw-w-2/5 tw-flex tw-flex-col tw-space-y-4\">\n <!-- Description -->\n <div class=\"tw-flex-1\">\n <cide-ele-textarea \n formControlName=\"sygms_desc\" \n label=\"Description\" \n placeholder=\"Enter description\"\n size=\"sm\"\n [maxlength]=\"500\" \n [rows]=\"4\">\n </cide-ele-textarea>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-space-x-2\">\n <button \n cideEleButton \n variant=\"outline\" \n size=\"sm\" \n type=\"button\" \n (click)=\"resetForm()\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\">\n Reset\n </button>\n @if (isEditMode()) {\n <button \n cideEleButton \n variant=\"outline\" \n size=\"sm\" \n type=\"button\" \n (click)=\"cancelForm()\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\">\n Cancel\n </button>\n }\n <button \n cideEleButton \n variant=\"primary\" \n size=\"sm\" \n type=\"submit\"\n (click)=\"saveMaster()\"\n [disabled]=\"!masterForm.valid || loading()\"\n class=\"tw-px-4 tw-py-2\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n {{ isEditMode() ? 'Update' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Header Section with Filters -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-4 tw-py-2 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-2 sm:tw-space-y-0\">\n \n <!-- Title and Back Button -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (typeTitle()) {\n <div>\n <p class=\"tw-text-xs tw-text-gray-500 tw-m-0\">Type: {{ typeTitle() }}</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-2 sm:tw-space-y-0 sm:tw-space-x-3\">\n <!-- Actions can be added here in the future -->\n </div>\n </div>\n\n <!-- Error Message -->\n @if (error()) {\n <div class=\"tw-mt-3 tw-p-3 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\n <div class=\"tw-flex tw-items-start\">\n <cide-ele-icon name=\"error\" class=\"tw-text-red-400 tw-w-4 tw-h-4 tw-mt-0.5 tw-flex-shrink-0\"></cide-ele-icon>\n <div class=\"tw-ml-3\">\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-h-full tw-relative\">\n \n <!-- Data Grid Component -->\n <div class=\"tw-h-full tw-overflow-auto\">\n <cide-ele-data-grid \n [config]=\"gridConfig()\" \n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n</div>\n\n<!-- Template Renderers -->\n<ng-template #masterDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-w-full\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.sygms_title || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">{{ row.sygms_desc || 'No description' }}</div>\n </div>\n</ng-template>\n\n<ng-template #masterStatusRendererTemplate let-row=\"row\">\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [class.tw-bg-green-100]=\"row.sygms_isactive\"\n [class.tw-text-green-800]=\"row.sygms_isactive\"\n [class.tw-bg-red-100]=\"!row.sygms_isactive\"\n [class.tw-text-red-800]=\"!row.sygms_isactive\">\n {{ row.sygms_isactive ? 'Active' : 'Inactive' }}\n </span>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template> ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { 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: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "customRenderers", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { 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: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }, { kind: "component", type: CideEleJsonEditorComponent, selector: "cide-ele-json-editor", inputs: ["label", "helperText", "required", "disabled", "showCharacterCount", "config"], outputs: ["valueChange", "objectChange", "errorsChange", "validChange"] }] }); }
884
+ }
885
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterComponent, decorators: [{
886
+ type: Component,
887
+ args: [{ selector: 'cide-core-app-general-master', standalone: true, imports: [
888
+ CommonModule,
889
+ ReactiveFormsModule,
890
+ FormsModule,
891
+ CideEleButtonComponent,
892
+ CideEleDataGridComponent,
893
+ CideInputComponent,
894
+ CideSelectComponent,
895
+ CideTextareaComponent,
896
+ CideIconComponent,
897
+ CideEleDropdownComponent,
898
+ CideEleJsonEditorComponent
899
+ ], template: "<!-- General Master Container -->\n<div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Quick Add Form Section -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-white\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-0\">\n <div class=\"tw-flex tw-items-center tw-space-x-3 tw-mb-3\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">{{ isEditMode() ? 'Edit Master' : 'Quick Add Master' }}</h6>\n </div>\n \n <!-- Parent Master Info Box -->\n @if (masterForm.get('sygms_id_sygms')?.value) {\n <div class=\"tw-flex tw-items-center tw-space-x-3 tw-bg-blue-50 tw-border tw-border-blue-200 tw-px-4 tw-py-1 tw-rounded-lg\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">account_tree</cide-ele-icon>\n <span class=\"tw-text-sm tw-font-medium tw-text-blue-800\">Adding Child</span>\n <span class=\"tw-text-xs tw-text-blue-700\">\n Parent: <span class=\"tw-font-medium\">{{ getParentMasterDisplay() }}</span>\n </span>\n <button \n type=\"button\"\n (click)=\"clearParentMaster()\"\n class=\"tw-text-sm tw-text-blue-600 hover:tw-text-blue-800 hover:tw-bg-blue-100 tw-rounded tw-px-1\">\n \u00D7\n </button>\n </div>\n }\n </div>\n \n <form [formGroup]=\"masterForm\" class=\"tw-space-y-2\">\n \n <!-- First Row - Basic fields -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-6 tw-gap-2\">\n <!-- Master Code -->\n <div class=\"lg:tw-col-span-1\">\n <cide-ele-input \n formControlName=\"sygms_code\" \n label=\"Master Code*\" \n placeholder=\"Enter master code\"\n size=\"sm\"\n [required]=\"true\" \n [maxlength]=\"40\">\n </cide-ele-input>\n </div>\n \n <!-- Master Title -->\n <div class=\"lg:tw-col-span-3\">\n <cide-ele-input \n formControlName=\"sygms_title\" \n label=\"Master Title*\" \n placeholder=\"Enter master title\"\n size=\"sm\"\n [required]=\"true\" \n [maxlength]=\"150\">\n </cide-ele-input>\n </div>\n \n <!-- Active Status -->\n <div class=\"lg:tw-col-span-1 tw-flex tw-items-center tw-pt-0\">\n <cide-ele-input \n formControlName=\"sygms_isactive\"\n type=\"checkbox\"\n label=\"Active\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n \n <!-- Third Row - JSON Configuration and Description/Save side by side -->\n <div class=\"tw-flex tw-gap-4\">\n <!-- JSON Configuration (60% width) -->\n <div class=\"tw-w-3/5\">\n <cide-ele-json-editor \n formControlName=\"sygms_configuration\" \n label=\"Configuration*\" \n size=\"sm\"\n [required]=\"true\">\n </cide-ele-json-editor>\n </div>\n \n <!-- Description and Save Button (40% width) -->\n <div class=\"tw-w-2/5 tw-flex tw-flex-col tw-space-y-4\">\n <!-- Description -->\n <div class=\"tw-flex-1\">\n <cide-ele-textarea \n formControlName=\"sygms_desc\" \n label=\"Description\" \n placeholder=\"Enter description\"\n size=\"sm\"\n [maxlength]=\"500\" \n [rows]=\"4\">\n </cide-ele-textarea>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-space-x-2\">\n <button \n cideEleButton \n variant=\"outline\" \n size=\"sm\" \n type=\"button\" \n (click)=\"resetForm()\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\">\n Reset\n </button>\n @if (isEditMode()) {\n <button \n cideEleButton \n variant=\"outline\" \n size=\"sm\" \n type=\"button\" \n (click)=\"cancelForm()\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\">\n Cancel\n </button>\n }\n <button \n cideEleButton \n variant=\"primary\" \n size=\"sm\" \n type=\"submit\"\n (click)=\"saveMaster()\"\n [disabled]=\"!masterForm.valid || loading()\"\n class=\"tw-px-4 tw-py-2\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n {{ isEditMode() ? 'Update' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Header Section with Filters -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-4 tw-py-2 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-2 sm:tw-space-y-0\">\n \n <!-- Title and Back Button -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @if (typeTitle()) {\n <div>\n <p class=\"tw-text-xs tw-text-gray-500 tw-m-0\">Type: {{ typeTitle() }}</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-2 sm:tw-space-y-0 sm:tw-space-x-3\">\n <!-- Actions can be added here in the future -->\n </div>\n </div>\n\n <!-- Error Message -->\n @if (error()) {\n <div class=\"tw-mt-3 tw-p-3 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\n <div class=\"tw-flex tw-items-start\">\n <cide-ele-icon name=\"error\" class=\"tw-text-red-400 tw-w-4 tw-h-4 tw-mt-0.5 tw-flex-shrink-0\"></cide-ele-icon>\n <div class=\"tw-ml-3\">\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-h-full tw-relative\">\n \n <!-- Data Grid Component -->\n <div class=\"tw-h-full tw-overflow-auto\">\n <cide-ele-data-grid \n [config]=\"gridConfig()\" \n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n</div>\n\n<!-- Template Renderers -->\n<ng-template #masterDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-w-full\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.sygms_title || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">{{ row.sygms_desc || 'No description' }}</div>\n </div>\n</ng-template>\n\n<ng-template #masterStatusRendererTemplate let-row=\"row\">\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [class.tw-bg-green-100]=\"row.sygms_isactive\"\n [class.tw-text-green-800]=\"row.sygms_isactive\"\n [class.tw-bg-red-100]=\"!row.sygms_isactive\"\n [class.tw-text-red-800]=\"!row.sygms_isactive\">\n {{ row.sygms_isactive ? 'Active' : 'Inactive' }}\n </span>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template> " }]
900
+ }] });
901
+
902
+ export { GeneralMasterComponent };
903
+ //# sourceMappingURL=cloud-ide-core-general-master.component-B6llTVoV.mjs.map