cloud-ide-core 2.0.1 → 2.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.
@@ -1,901 +0,0 @@
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 i1 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-8JWTVijZ.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
- http = inject(HttpClient);
18
- generalMasterListSubject = new BehaviorSubject([]);
19
- generalMasterList$ = this.generalMasterListSubject.asObservable();
20
- constructor() {
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 ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: GeneralMasterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
167
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: GeneralMasterService, providedIn: 'root' });
168
- }
169
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.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
- // Dependency injection
189
- destroyRef = inject(DestroyRef);
190
- masterService = inject(GeneralMasterService);
191
- typeService = inject(GeneralMasterTypeService);
192
- fb = inject(NonNullableFormBuilder);
193
- router = inject(Router);
194
- route = inject(ActivatedRoute);
195
- appState = inject(AppStateHelperService);
196
- // Modern ViewChild signals for template renderers (Angular 20 approach)
197
- masterDetailsRendererTemplate = viewChild.required('masterDetailsRendererTemplate');
198
- masterStatusRendererTemplate = viewChild.required('masterStatusRendererTemplate');
199
- actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
200
- // Make Math available in template
201
- Math = Math;
202
- // Signals for reactive state management
203
- masters = signal([], ...(ngDevMode ? [{ debugName: "masters" }] : []));
204
- loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
205
- error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
206
- selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
207
- searchTerm = signal('', ...(ngDevMode ? [{ debugName: "searchTerm" }] : []));
208
- selectedParentMaster = signal('', ...(ngDevMode ? [{ debugName: "selectedParentMaster" }] : []));
209
- // Type information
210
- typeId = signal('', ...(ngDevMode ? [{ debugName: "typeId" }] : []));
211
- typeTitle = signal('', ...(ngDevMode ? [{ debugName: "typeTitle" }] : []));
212
- currentType = signal(null, ...(ngDevMode ? [{ debugName: "currentType" }] : []));
213
- // Form state
214
- isEditMode = signal(false, ...(ngDevMode ? [{ debugName: "isEditMode" }] : []));
215
- editingMasterId = signal(null, ...(ngDevMode ? [{ debugName: "editingMasterId" }] : []));
216
- retrievedMaster = signal(null, ...(ngDevMode ? [{ debugName: "retrievedMaster" }] : []));
217
- // Pagination signals
218
- currentPage = signal(1, ...(ngDevMode ? [{ debugName: "currentPage" }] : []));
219
- pageSize = signal(10, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
220
- totalItems = signal(0, ...(ngDevMode ? [{ debugName: "totalItems" }] : []));
221
- // Modern reactive forms with signals
222
- masterForm = this.fb.group({
223
- sygms_code: ['', [Validators.required, Validators.maxLength(40)]],
224
- sygms_title: ['', [Validators.required, Validators.maxLength(150)]],
225
- sygms_desc: ['', [Validators.maxLength(500)]],
226
- sygms_configuration: ['{}', [Validators.required]],
227
- sygms_id_sygms: [''],
228
- sygms_isactive: [true]
229
- });
230
- // Computed values
231
- isFormDirty = computed(() => this.masterForm.dirty, ...(ngDevMode ? [{ debugName: "isFormDirty" }] : []));
232
- // Parent master options for dropdown
233
- parentMasterOptions = signal([], ...(ngDevMode ? [{ debugName: "parentMasterOptions" }] : []));
234
- // Grid configuration signal
235
- gridConfig = signal({
236
- id: 'master-list-grid',
237
- title: '',
238
- subtitle: '',
239
- columns: [
240
- {
241
- key: 'details',
242
- header: 'Master Details',
243
- type: 'custom',
244
- width: 'auto',
245
- truncate: true,
246
- align: 'left',
247
- renderer: 'masterDetailsRenderer'
248
- },
249
- {
250
- key: 'sygms_code',
251
- header: 'Master Code',
252
- type: 'text',
253
- width: '150px',
254
- truncate: true,
255
- align: 'left'
256
- },
257
- {
258
- key: 'sygms_isactive',
259
- header: 'Status',
260
- type: 'custom',
261
- width: '100px',
262
- truncate: false,
263
- align: 'center',
264
- renderer: 'masterStatusRenderer'
265
- },
266
- {
267
- key: 'actions',
268
- header: '',
269
- type: 'custom',
270
- width: '150px',
271
- truncate: false,
272
- align: 'center',
273
- renderer: 'actionsDropdownRenderer'
274
- }
275
- ],
276
- data: [],
277
- trackBy: '_id',
278
- pagination: {
279
- enabled: true,
280
- pageSize: 10,
281
- pageSizeOptions: [10, 25, 50, 100],
282
- showQuickJump: true,
283
- showPageInfo: true,
284
- showRefresh: true
285
- },
286
- search: {
287
- enabled: true,
288
- placeholder: 'Search masters...',
289
- searchableColumns: ['sygms_title', 'sygms_desc', 'sygms_code'],
290
- debounceMs: 300
291
- },
292
- loading: {
293
- useDefer: true,
294
- skeletonRows: 5,
295
- showOverlay: false
296
- },
297
- scroll: {
298
- enabled: true,
299
- maxHeight: '',
300
- minHeight: '',
301
- stickyHeader: true,
302
- virtualScroll: false,
303
- rowHeight: 50
304
- },
305
- tree: {
306
- enabled: true,
307
- primaryKey: '_id',
308
- foreignKey: 'sygms_id_sygms',
309
- childrenKey: 'children',
310
- levelKey: 'level',
311
- expandedKey: 'expanded',
312
- hasChildrenKey: 'hasChildren'
313
- },
314
- responsive: true,
315
- striped: false,
316
- bordered: true,
317
- compact: false,
318
- tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
319
- }, ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
320
- // Action handlers for grid
321
- actionHandlers = {
322
- onEdit: (item) => this.editMaster(item),
323
- onDelete: (item) => this.deleteMaster(item),
324
- onToggleStatus: (item) => this.toggleMasterStatus(item)
325
- };
326
- ngOnInit() {
327
- this.initializeComponent();
328
- }
329
- /**
330
- * Initialize component
331
- */
332
- initializeComponent() {
333
- // Get type information from route
334
- this.route.params.subscribe(params => {
335
- const payload = generateObjectFromString(params['query'] || '');
336
- this.typeId.set(payload.sygmt_id || '');
337
- this.typeTitle.set(payload.sygmt_title || '');
338
- if (this.typeId()) {
339
- this.loadTypeDetails();
340
- this.loadMasters();
341
- this.loadParentMasterOptions();
342
- this.setupFormSubscriptions();
343
- }
344
- else {
345
- this.error.set('No type ID provided');
346
- }
347
- });
348
- }
349
- /**
350
- * Load type details
351
- */
352
- loadTypeDetails() {
353
- this.typeService.getTypeById(this.typeId())
354
- .pipe(takeUntilDestroyed(this.destroyRef))
355
- .subscribe({
356
- next: (response) => {
357
- if (response.success) {
358
- this.currentType.set(response.data);
359
- }
360
- },
361
- error: (error) => {
362
- console.error('Error loading type details:', error);
363
- }
364
- });
365
- }
366
- /**
367
- * Load masters from API
368
- */
369
- loadMasters() {
370
- this.loading.set(true);
371
- this.error.set(null);
372
- const payload = {
373
- ...(this.typeId() && { sygms_id_sygmt: this.typeId() })
374
- // Note: search, pagination, and parent_id are not supported in the new interface
375
- // These would need to be implemented in the backend if needed
376
- };
377
- this.masterService.getMasterList(payload)
378
- .pipe(takeUntilDestroyed(this.destroyRef))
379
- .subscribe({
380
- next: (response) => {
381
- if (response.success) {
382
- this.masters.set(response.data || []);
383
- this.totalItems.set(response.total || 0);
384
- this.updateGridData();
385
- }
386
- else {
387
- this.error.set(response.message || 'Failed to load masters');
388
- }
389
- this.loading.set(false);
390
- },
391
- error: (error) => {
392
- console.error('Error loading masters:', error);
393
- this.error.set('Failed to load masters. Please try again.');
394
- this.loading.set(false);
395
- }
396
- });
397
- }
398
- /**
399
- * Load masters by entity ID
400
- */
401
- loadMastersByEntity(entityId) {
402
- this.loading.set(true);
403
- this.error.set(null);
404
- const payload = {
405
- sygms_entity_id_syen: entityId,
406
- ...(this.typeId() && { sygms_id_sygmt: this.typeId() })
407
- };
408
- this.masterService.getMasterList(payload)
409
- .pipe(takeUntilDestroyed(this.destroyRef))
410
- .subscribe({
411
- next: (response) => {
412
- if (response.success) {
413
- this.masters.set(response.data || []);
414
- this.totalItems.set(response.total || 0);
415
- this.updateGridData();
416
- }
417
- else {
418
- this.error.set(response.message || 'Failed to load masters');
419
- }
420
- this.loading.set(false);
421
- },
422
- error: (error) => {
423
- console.error('Error loading masters by entity:', error);
424
- this.error.set('Failed to load masters. Please try again.');
425
- this.loading.set(false);
426
- }
427
- });
428
- }
429
- /**
430
- * Load parent master options for dropdown
431
- */
432
- loadParentMasterOptions() {
433
- const payload = {
434
- ...(this.typeId() && { sygms_id_sygmt: this.typeId() })
435
- };
436
- this.masterService.getMasterList(payload)
437
- .pipe(takeUntilDestroyed(this.destroyRef))
438
- .subscribe({
439
- next: (response) => {
440
- if (response.success) {
441
- const options = [
442
- { value: '', label: '-- Select Parent Master --' },
443
- ...(response.data || []).map(master => ({
444
- value: master._id || "",
445
- label: master.sygms_title || ""
446
- }))
447
- ];
448
- this.parentMasterOptions.set(options);
449
- }
450
- },
451
- error: (error) => {
452
- console.error('Error loading parent master options:', error);
453
- }
454
- });
455
- }
456
- /**
457
- * Setup form subscriptions
458
- */
459
- setupFormSubscriptions() {
460
- // Watch for form changes to enable/disable save button
461
- this.masterForm.valueChanges
462
- .pipe(takeUntilDestroyed(this.destroyRef))
463
- .subscribe(() => {
464
- // Form validation is handled by computed signals
465
- });
466
- }
467
- /**
468
- * Update grid data
469
- */
470
- updateGridData() {
471
- this.gridConfig.update(config => ({
472
- ...config,
473
- data: this.masters()
474
- }));
475
- }
476
- // Computed template renderers for grid
477
- templateRenderers = computed(() => ({
478
- masterDetailsRenderer: this.masterDetailsRendererTemplate(),
479
- masterStatusRenderer: this.masterStatusRendererTemplate(),
480
- actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
481
- }), ...(ngDevMode ? [{ debugName: "templateRenderers" }] : []));
482
- /**
483
- * Handle grid events
484
- */
485
- onGridEvent(event) {
486
- switch (event.type) {
487
- case 'pageChange':
488
- if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
489
- this.currentPage.set(event.data['pageIndex']);
490
- this.pageSize.set(event.data['pageSize']);
491
- this.loadMasters();
492
- }
493
- break;
494
- case 'search':
495
- if (event.data && typeof event.data === 'string') {
496
- this.searchTerm.set(event.data);
497
- this.currentPage.set(1);
498
- this.loadMasters();
499
- }
500
- break;
501
- case 'refresh':
502
- this.loadMasters();
503
- break;
504
- case 'action':
505
- // Handle action events if needed
506
- console.log('Action event:', event);
507
- break;
508
- case 'rowClick':
509
- // Handle row click events if needed
510
- console.log('Row click event:', event);
511
- break;
512
- case 'sort':
513
- // Handle sort events if needed
514
- console.log('Sort event:', event);
515
- break;
516
- case 'export':
517
- // Handle export events if needed
518
- console.log('Export event:', event);
519
- break;
520
- case 'rowReorder':
521
- // Handle row reorder events if needed
522
- console.log('Row reorder event:', event);
523
- break;
524
- }
525
- }
526
- /**
527
- * Create new master
528
- */
529
- createMaster() {
530
- if (!this.masterForm.valid) {
531
- this.markFormAsTouched();
532
- return;
533
- }
534
- const formValue = this.masterForm.getRawValue();
535
- const newMaster = {
536
- _id: '',
537
- sygms_code: formValue.sygms_code,
538
- sygms_id_sygmt: this.typeId(),
539
- sygms_title: formValue.sygms_title,
540
- sygms_desc: formValue.sygms_desc,
541
- sygms_configuration: JSON.parse(formValue.sygms_configuration),
542
- sygms_id_sygms: formValue.sygms_id_sygms || undefined,
543
- sygms_entity_id_syen: this.appState.getActiveEntityId() || undefined,
544
- sygms_isactive: formValue.sygms_isactive
545
- };
546
- this.loading.set(true);
547
- this.masterService.createMaster(newMaster)
548
- .pipe(takeUntilDestroyed(this.destroyRef))
549
- .subscribe({
550
- next: (response) => {
551
- if (response.success) {
552
- this.resetForm();
553
- this.loadMasters();
554
- this.loadParentMasterOptions();
555
- console.log('✅ Master created successfully');
556
- }
557
- else {
558
- console.error('❌ Failed to create master:', response.message);
559
- }
560
- this.loading.set(false);
561
- },
562
- error: (error) => {
563
- console.error('Error creating master:', error);
564
- console.error('❌ Failed to create master. Please try again.');
565
- this.loading.set(false);
566
- }
567
- });
568
- }
569
- /**
570
- * Update existing master
571
- */
572
- updateMaster() {
573
- if (!this.masterForm.valid || !this.editingMasterId()) {
574
- this.markFormAsTouched();
575
- return;
576
- }
577
- const formValue = this.masterForm.getRawValue();
578
- const updatedMaster = {
579
- _id: this.editingMasterId(),
580
- sygms_code: formValue.sygms_code,
581
- sygms_id_sygmt: this.typeId(),
582
- sygms_title: formValue.sygms_title,
583
- sygms_desc: formValue.sygms_desc,
584
- sygms_configuration: JSON.parse(formValue.sygms_configuration),
585
- sygms_id_sygms: formValue.sygms_id_sygms || undefined,
586
- sygms_entity_id_syen: this.appState.getActiveEntityId() || undefined,
587
- sygms_isactive: formValue.sygms_isactive
588
- };
589
- this.loading.set(true);
590
- this.masterService.updateMaster(this.editingMasterId(), updatedMaster)
591
- .pipe(takeUntilDestroyed(this.destroyRef))
592
- .subscribe({
593
- next: (response) => {
594
- if (response.success) {
595
- this.resetForm();
596
- this.loadMasters();
597
- this.loadParentMasterOptions();
598
- console.log('✅ Master updated successfully');
599
- }
600
- else {
601
- console.error('❌ Failed to update master:', response.message);
602
- }
603
- this.loading.set(false);
604
- },
605
- error: (error) => {
606
- console.error('Error updating master:', error);
607
- console.error('❌ Failed to update master. Please try again.');
608
- this.loading.set(false);
609
- }
610
- });
611
- }
612
- /**
613
- * Edit master
614
- */
615
- editMaster(master) {
616
- this.isEditMode.set(true);
617
- this.editingMasterId.set(master._id || "");
618
- this.retrievedMaster.set(master);
619
- this.masterForm.patchValue({
620
- sygms_code: master.sygms_code,
621
- sygms_title: master.sygms_title,
622
- sygms_desc: master.sygms_desc,
623
- sygms_configuration: JSON.stringify(master.sygms_configuration, null, 2),
624
- sygms_id_sygms: master.sygms_id_sygms || '',
625
- sygms_isactive: master.sygms_isactive
626
- });
627
- this.masterForm.markAsPristine();
628
- }
629
- /**
630
- * Delete master
631
- */
632
- deleteMaster(master) {
633
- if (confirm(`Are you sure you want to delete the master "${master.sygms_title}"?`)) {
634
- this.loading.set(true);
635
- this.masterService.deleteMaster(master._id || "")
636
- .pipe(takeUntilDestroyed(this.destroyRef))
637
- .subscribe({
638
- next: (response) => {
639
- if (response.success) {
640
- this.loadMasters();
641
- this.loadParentMasterOptions();
642
- console.log('✅ Master deleted successfully');
643
- }
644
- else {
645
- console.error('❌ Failed to delete master:', response.message);
646
- }
647
- this.loading.set(false);
648
- },
649
- error: (error) => {
650
- console.error('Error deleting master:', error);
651
- console.error('❌ Failed to delete master. Please try again.');
652
- this.loading.set(false);
653
- }
654
- });
655
- }
656
- }
657
- /**
658
- * Toggle master status
659
- */
660
- toggleMasterStatus(master) {
661
- this.loading.set(true);
662
- this.masterService.toggleMasterStatus(master._id || "")
663
- .pipe(takeUntilDestroyed(this.destroyRef))
664
- .subscribe({
665
- next: (response) => {
666
- if (response.success) {
667
- this.loadMasters();
668
- console.log(`✅ Master ${master.sygms_isactive ? 'deactivated' : 'activated'} successfully`);
669
- }
670
- else {
671
- console.error('❌ Failed to toggle master status:', response.message);
672
- }
673
- this.loading.set(false);
674
- },
675
- error: (error) => {
676
- console.error('Error toggling master status:', error);
677
- console.error('❌ Failed to toggle master status. Please try again.');
678
- this.loading.set(false);
679
- }
680
- });
681
- }
682
- /**
683
- * Reset to parent (delete entity-specific override)
684
- */
685
- resetToParent(master) {
686
- if (confirm(`Are you sure you want to reset "${master.sygms_title}" to parent values?`)) {
687
- this.loading.set(true);
688
- this.masterService.deleteMaster(master._id || "")
689
- .pipe(takeUntilDestroyed(this.destroyRef))
690
- .subscribe({
691
- next: (response) => {
692
- if (response.success) {
693
- this.loadMasters();
694
- console.log('✅ Master reset to parent successfully');
695
- }
696
- else {
697
- console.error('❌ Failed to reset master:', response.message);
698
- }
699
- this.loading.set(false);
700
- },
701
- error: (error) => {
702
- console.error('Error resetting master:', error);
703
- console.error('❌ Failed to reset master. Please try again.');
704
- this.loading.set(false);
705
- }
706
- });
707
- }
708
- }
709
- /**
710
- * Save master (create or update)
711
- */
712
- saveMaster() {
713
- if (this.isEditMode()) {
714
- this.updateMaster();
715
- }
716
- else {
717
- this.createMaster();
718
- }
719
- }
720
- /**
721
- * Cancel form
722
- */
723
- cancelForm() {
724
- this.resetForm();
725
- }
726
- /**
727
- * Go back to type list
728
- */
729
- goBack() {
730
- this.router.navigate(['/control-panel/general-master-type']);
731
- }
732
- /**
733
- * Reset form
734
- */
735
- resetForm() {
736
- this.masterForm.reset({
737
- sygms_code: '',
738
- sygms_title: '',
739
- sygms_desc: '',
740
- sygms_configuration: '{}',
741
- sygms_id_sygms: '',
742
- sygms_isactive: true
743
- });
744
- this.isEditMode.set(false);
745
- this.editingMasterId.set(null);
746
- this.retrievedMaster.set(null);
747
- this.masterForm.markAsPristine();
748
- this.masterForm.markAsUntouched();
749
- }
750
- /**
751
- * Mark form as touched to trigger validation display
752
- */
753
- markFormAsTouched() {
754
- Object.keys(this.masterForm.controls).forEach(key => {
755
- const control = this.masterForm.get(key);
756
- control?.markAsTouched();
757
- });
758
- }
759
- /**
760
- * Get dropdown items for actions
761
- */
762
- getActionDropdownItems(master) {
763
- const items = [
764
- {
765
- id: 'edit',
766
- label: 'Edit',
767
- icon: 'edit',
768
- disabled: false
769
- },
770
- {
771
- id: 'addChild',
772
- label: 'Add Child',
773
- icon: 'add',
774
- disabled: false
775
- },
776
- {
777
- id: 'toggle',
778
- label: master.sygms_isactive ? 'Deactivate' : 'Activate',
779
- icon: master.sygms_isactive ? 'block' : 'check_circle',
780
- disabled: false
781
- }
782
- ];
783
- // Add reset to parent option if entity-specific
784
- if (master.sygms_entity_id_syen) {
785
- items.push({
786
- id: 'reset',
787
- label: 'Reset to Parent',
788
- icon: 'restore',
789
- disabled: false
790
- });
791
- }
792
- items.push({
793
- id: 'delete',
794
- label: 'Delete',
795
- icon: 'delete',
796
- disabled: false
797
- });
798
- return items;
799
- }
800
- /**
801
- * Handle dropdown item click
802
- */
803
- onDropdownItemClick(item, row) {
804
- console.log('🔵 onDropdownItemClick called with:', item, row);
805
- switch (item.id) {
806
- case 'edit':
807
- console.log('🔵 Calling editMaster with:', row);
808
- this.editMaster(row);
809
- break;
810
- case 'addChild':
811
- console.log('🔵 Calling onAddChild with:', row);
812
- this.onAddChild(row);
813
- break;
814
- case 'toggle':
815
- console.log('🔵 Calling toggleMasterStatus with:', row);
816
- this.toggleMasterStatus(row);
817
- break;
818
- case 'reset':
819
- console.log('🔵 Calling resetToParent with:', row);
820
- this.resetToParent(row);
821
- break;
822
- case 'delete':
823
- console.log('🔵 Calling deleteMaster with:', row);
824
- this.deleteMaster(row);
825
- break;
826
- default:
827
- console.log('🔵 Unknown action:', item.id);
828
- }
829
- // Close all dropdowns after action
830
- this.closeAllDropdowns();
831
- }
832
- /**
833
- * Add child master
834
- */
835
- onAddChild(parentMaster) {
836
- console.log('🔵 onAddChild called with:', parentMaster);
837
- console.log('🔵 Parent title:', parentMaster.sygms_title);
838
- // Clear edit mode and retrieved item when adding a child
839
- this.isEditMode.set(false);
840
- this.editingMasterId.set(null);
841
- this.retrievedMaster.set(null);
842
- // Reset form and pre-fill with parent context
843
- this.masterForm.patchValue({
844
- sygms_code: '',
845
- sygms_title: '',
846
- sygms_desc: '',
847
- sygms_configuration: '{}',
848
- sygms_id_sygms: parentMaster._id, // Set parent master ID
849
- sygms_isactive: true
850
- });
851
- // Store the parent master for reference (you can display this in the UI)
852
- console.log('🔵 Ready to add child master for parent:', parentMaster.sygms_title);
853
- }
854
- /**
855
- * Get parent master display name
856
- */
857
- getParentMasterDisplay() {
858
- const parentId = this.masterForm.get('sygms_id_sygms')?.value;
859
- if (!parentId)
860
- return 'Unknown Parent';
861
- const parentMaster = this.masters().find(master => master._id === parentId);
862
- return parentMaster?.sygms_title || 'Unknown Parent';
863
- }
864
- /**
865
- * Clear parent master from form
866
- */
867
- clearParentMaster() {
868
- this.masterForm.patchValue({
869
- sygms_id_sygms: ''
870
- });
871
- }
872
- /**
873
- * Close all dropdowns
874
- */
875
- closeAllDropdowns() {
876
- // Close all dropdowns by clicking outside
877
- const event = new MouseEvent('click', { bubbles: true });
878
- document.dispatchEvent(event);
879
- }
880
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: GeneralMasterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
881
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.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: 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { 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: "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"] }] });
882
- }
883
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: GeneralMasterComponent, decorators: [{
884
- type: Component,
885
- args: [{ selector: 'cide-core-app-general-master', standalone: true, imports: [
886
- CommonModule,
887
- ReactiveFormsModule,
888
- FormsModule,
889
- CideEleButtonComponent,
890
- CideEleDataGridComponent,
891
- CideInputComponent,
892
- CideSelectComponent,
893
- CideTextareaComponent,
894
- CideIconComponent,
895
- CideEleDropdownComponent,
896
- CideEleJsonEditorComponent
897
- ], 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> " }]
898
- }] });
899
-
900
- export { GeneralMasterComponent };
901
- //# sourceMappingURL=cloud-ide-core-general-master.component-BEHWqXvF.mjs.map