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,611 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DestroyRef, viewChild, signal, computed, Component } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import * as i2 from '@angular/forms';
5
+ import { NonNullableFormBuilder, ReactiveFormsModule, FormsModule } from '@angular/forms';
6
+ import { Router } from '@angular/router';
7
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
+ import { G as GeneralMasterTypeService } from './cloud-ide-core-general-master-type.service-Ab64Jjps.mjs';
9
+ import { CideEleDataGridComponent, CideEleButtonComponent, CideInputComponent, CideTextareaComponent, CideIconComponent, CideEleDropdownComponent, CideEleJsonEditorComponent, CideSelectComponent } from 'cloud-ide-element';
10
+ import { generateStringFromObject } from 'cloud-ide-lms-model';
11
+
12
+ class GeneralMasterTypeComponent {
13
+ constructor() {
14
+ // Dependency injection
15
+ this.destroyRef = inject(DestroyRef);
16
+ this.typeService = inject(GeneralMasterTypeService);
17
+ this.fb = inject(NonNullableFormBuilder);
18
+ this.router = inject(Router);
19
+ // Modern ViewChild signals for template renderers (Angular 20 approach)
20
+ this.typeDetailsRendererTemplate = viewChild.required('typeDetailsRendererTemplate');
21
+ this.typeStatusRendererTemplate = viewChild.required('typeStatusRendererTemplate');
22
+ this.actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
23
+ // Make Math available in template
24
+ this.Math = Math;
25
+ // Signals for reactive state management
26
+ this.types = signal([]);
27
+ this.loading = signal(false);
28
+ this.error = signal(null);
29
+ this.selectedItems = signal([]);
30
+ this.searchTerm = signal('');
31
+ // Form state
32
+ this.isEditMode = signal(false);
33
+ this.editingTypeId = signal(null);
34
+ this.retrievedType = signal(null);
35
+ // Pagination signals
36
+ this.currentPage = signal(1);
37
+ this.pageSize = signal(10);
38
+ this.totalItems = signal(0);
39
+ // Modern reactive forms with signals
40
+ this.typeForm = this.fb.group({
41
+ sygmt_code: [''],
42
+ sygmt_title: [''],
43
+ sygmt_desc: [''],
44
+ sygmt_configuration: ['{}'],
45
+ sygmt_isactive: [true],
46
+ sygmt_id_sygmt: [''] // Parent type ID for child types
47
+ });
48
+ // Computed values
49
+ this.isFormDirty = computed(() => this.typeForm.dirty);
50
+ // Grid configuration signal
51
+ this.gridConfig = signal({
52
+ id: 'type-list-grid',
53
+ title: '',
54
+ subtitle: '',
55
+ columns: [
56
+ {
57
+ key: 'details',
58
+ header: 'Type Details',
59
+ type: 'custom',
60
+ width: 'auto',
61
+ truncate: true,
62
+ align: 'left',
63
+ renderer: 'typeDetailsRenderer'
64
+ },
65
+ {
66
+ key: 'sygmt_code',
67
+ header: 'Type Code',
68
+ type: 'text',
69
+ width: '150px',
70
+ truncate: true,
71
+ align: 'left'
72
+ },
73
+ {
74
+ key: 'sygmt_isactive',
75
+ header: 'Status',
76
+ type: 'custom',
77
+ width: '100px',
78
+ truncate: false,
79
+ align: 'center',
80
+ renderer: 'typeStatusRenderer'
81
+ },
82
+ {
83
+ key: 'actions',
84
+ header: '',
85
+ type: 'custom',
86
+ width: '150px',
87
+ truncate: false,
88
+ align: 'center',
89
+ renderer: 'actionsDropdownRenderer'
90
+ }
91
+ ],
92
+ data: [],
93
+ trackBy: '_id',
94
+ tree: {
95
+ enabled: true,
96
+ foreignKey: 'sygmt_id_sygmt',
97
+ primaryKey: '_id'
98
+ },
99
+ pagination: {
100
+ enabled: true,
101
+ pageSize: 10,
102
+ pageSizeOptions: [10, 25, 50, 100],
103
+ showQuickJump: true,
104
+ showPageInfo: true,
105
+ showRefresh: true
106
+ },
107
+ search: {
108
+ enabled: true,
109
+ placeholder: 'Search types...',
110
+ searchableColumns: ['sygmt_title', 'sygmt_desc', 'sygmt_code'],
111
+ debounceMs: 300
112
+ },
113
+ loading: {
114
+ useDefer: true,
115
+ skeletonRows: 5,
116
+ showOverlay: false
117
+ },
118
+ scroll: {
119
+ enabled: true,
120
+ maxHeight: '',
121
+ minHeight: '',
122
+ stickyHeader: true,
123
+ virtualScroll: false,
124
+ rowHeight: 40
125
+ },
126
+ responsive: true,
127
+ striped: false,
128
+ bordered: true,
129
+ compact: true,
130
+ tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
131
+ });
132
+ // Action handlers for grid
133
+ this.actionHandlers = {
134
+ onEdit: (item) => this.editType(item),
135
+ onDelete: (item) => this.deleteType(item),
136
+ onToggleStatus: (item) => this.toggleTypeStatus(item)
137
+ };
138
+ // Computed template renderers for grid
139
+ this.templateRenderers = computed(() => ({
140
+ typeDetailsRenderer: this.typeDetailsRendererTemplate(),
141
+ typeStatusRenderer: this.typeStatusRendererTemplate(),
142
+ actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
143
+ }));
144
+ }
145
+ ngOnInit() {
146
+ this.initializeComponent();
147
+ // Add form submission debugging
148
+ this.typeForm.valueChanges.subscribe(value => {
149
+ console.log('🔵 Form value changed:', value);
150
+ });
151
+ this.typeForm.statusChanges.subscribe(status => {
152
+ console.log('🔵 Form status changed:', status);
153
+ });
154
+ }
155
+ /**
156
+ * Initialize component
157
+ */
158
+ initializeComponent() {
159
+ this.loadTypes();
160
+ this.setupFormSubscriptions();
161
+ }
162
+ /**
163
+ * Load types from API
164
+ */
165
+ loadTypes() {
166
+ this.loading.set(true);
167
+ this.error.set(null);
168
+ const request = {};
169
+ this.typeService.getTypeList(request)
170
+ .pipe(takeUntilDestroyed(this.destroyRef))
171
+ .subscribe({
172
+ next: (response) => {
173
+ if (response.success) {
174
+ this.types.set(response.data || []);
175
+ this.totalItems.set(response.total || 0);
176
+ this.updateGridData();
177
+ }
178
+ else {
179
+ this.error.set(response.message || 'Failed to load types');
180
+ }
181
+ this.loading.set(false);
182
+ },
183
+ error: (error) => {
184
+ console.error('Error loading types:', error);
185
+ this.error.set('Failed to load types. Please try again.');
186
+ this.loading.set(false);
187
+ }
188
+ });
189
+ }
190
+ /**
191
+ * Setup form subscriptions
192
+ */
193
+ setupFormSubscriptions() {
194
+ // Watch for form changes to enable/disable save button
195
+ this.typeForm.valueChanges
196
+ .pipe(takeUntilDestroyed(this.destroyRef))
197
+ .subscribe(() => {
198
+ // Form validation is handled by computed signals
199
+ });
200
+ }
201
+ /**
202
+ * Update grid data
203
+ */
204
+ updateGridData() {
205
+ this.gridConfig.update(config => ({
206
+ ...config,
207
+ data: this.types()
208
+ }));
209
+ }
210
+ /**
211
+ * Handle grid events
212
+ */
213
+ onGridEvent(event) {
214
+ switch (event.type) {
215
+ case 'pageChange':
216
+ if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
217
+ this.currentPage.set(event.data['pageIndex']);
218
+ this.pageSize.set(event.data['pageSize']);
219
+ this.loadTypes();
220
+ }
221
+ break;
222
+ case 'search':
223
+ if (event.data && typeof event.data === 'string') {
224
+ this.searchTerm.set(event.data);
225
+ this.currentPage.set(1);
226
+ this.loadTypes();
227
+ }
228
+ break;
229
+ case 'refresh':
230
+ this.loadTypes();
231
+ break;
232
+ case 'action':
233
+ // Handle action events if needed
234
+ console.log('Action event:', event);
235
+ break;
236
+ case 'rowClick':
237
+ // Handle row click events if needed
238
+ console.log('Row click event:', event);
239
+ break;
240
+ case 'sort':
241
+ // Handle sort events if needed
242
+ console.log('Sort event:', event);
243
+ break;
244
+ case 'export':
245
+ // Handle export events if needed
246
+ console.log('Export event:', event);
247
+ break;
248
+ case 'rowReorder':
249
+ // Handle row reorder events if needed
250
+ console.log('Row reorder event:', event);
251
+ break;
252
+ }
253
+ }
254
+ /**
255
+ * Create new type
256
+ */
257
+ createType() {
258
+ if (!this.typeForm.valid) {
259
+ this.markFormAsTouched();
260
+ return;
261
+ }
262
+ const formValue = this.typeForm.getRawValue();
263
+ const newType = {
264
+ _id: '', // Empty _id for create operation
265
+ sygmt_code: formValue.sygmt_code,
266
+ sygmt_title: formValue.sygmt_title,
267
+ sygmt_desc: formValue.sygmt_desc,
268
+ sygmt_configuration: JSON.parse(formValue.sygmt_configuration),
269
+ sygmt_isactive: formValue.sygmt_isactive
270
+ };
271
+ this.loading.set(true);
272
+ this.typeService.saveType(newType)
273
+ .pipe(takeUntilDestroyed(this.destroyRef))
274
+ .subscribe({
275
+ next: (response) => {
276
+ if (response.success) {
277
+ this.cancelForm();
278
+ this.loadTypes();
279
+ console.log('✅ Type created successfully');
280
+ }
281
+ else {
282
+ console.error('❌ Failed to create type:', response.message);
283
+ }
284
+ this.loading.set(false);
285
+ },
286
+ error: (error) => {
287
+ console.error('Error creating type:', error);
288
+ console.error('❌ Failed to create type. Please try again.');
289
+ this.loading.set(false);
290
+ }
291
+ });
292
+ }
293
+ /**
294
+ * Update existing type
295
+ */
296
+ updateType() {
297
+ console.log('🔵 updateType called');
298
+ console.log('🔵 form valid:', this.typeForm.valid);
299
+ console.log('🔵 editingTypeId:', this.editingTypeId());
300
+ if (!this.typeForm.valid || !this.editingTypeId()) {
301
+ console.log('🔵 Form validation failed or no editing ID');
302
+ this.markFormAsTouched();
303
+ return;
304
+ }
305
+ const formValue = this.typeForm.getRawValue();
306
+ const updatedType = {
307
+ _id: this.editingTypeId(), // Include _id for update operation
308
+ sygmt_code: formValue.sygmt_code,
309
+ sygmt_title: formValue.sygmt_title,
310
+ sygmt_desc: formValue.sygmt_desc,
311
+ sygmt_configuration: JSON.parse(formValue.sygmt_configuration || '{}'),
312
+ sygmt_isactive: formValue.sygmt_isactive
313
+ };
314
+ console.log('🔵 Making API call to update type:', updatedType);
315
+ this.loading.set(true);
316
+ this.typeService.saveType(updatedType)
317
+ .pipe(takeUntilDestroyed(this.destroyRef))
318
+ .subscribe({
319
+ next: (response) => {
320
+ console.log('🔵 API response received:', response);
321
+ if (response.success) {
322
+ this.cancelForm();
323
+ this.loadTypes();
324
+ console.log('✅ Type updated successfully');
325
+ }
326
+ else {
327
+ console.error('❌ Failed to update type:', response.message);
328
+ }
329
+ this.loading.set(false);
330
+ },
331
+ error: (error) => {
332
+ console.error('🔵 API error:', error);
333
+ console.error('❌ Failed to update type. Please try again.');
334
+ this.loading.set(false);
335
+ }
336
+ });
337
+ }
338
+ /**
339
+ * Edit type
340
+ */
341
+ editType(type) {
342
+ this.isEditMode.set(true);
343
+ this.editingTypeId.set(type._id || "");
344
+ this.retrievedType.set(type);
345
+ this.typeForm.patchValue({
346
+ sygmt_code: type.sygmt_code,
347
+ sygmt_title: type.sygmt_title,
348
+ sygmt_desc: type.sygmt_desc,
349
+ sygmt_configuration: JSON.stringify(type.sygmt_configuration, null, 2),
350
+ sygmt_isactive: type.sygmt_isactive
351
+ });
352
+ this.typeForm.markAsPristine();
353
+ }
354
+ /**
355
+ * Delete type
356
+ */
357
+ deleteType(type) {
358
+ if (confirm(`Are you sure you want to delete the type "${type.sygmt_title}"?`)) {
359
+ this.loading.set(true);
360
+ this.typeService.deleteType(type._id || "")
361
+ .pipe(takeUntilDestroyed(this.destroyRef))
362
+ .subscribe({
363
+ next: (response) => {
364
+ if (response.success) {
365
+ this.loadTypes();
366
+ console.log('✅ Type deleted successfully');
367
+ }
368
+ else {
369
+ console.error('❌ Failed to delete type:', response.message);
370
+ }
371
+ this.loading.set(false);
372
+ },
373
+ error: (error) => {
374
+ console.error('Error deleting type:', error);
375
+ console.error('❌ Failed to delete type. Please try again.');
376
+ this.loading.set(false);
377
+ }
378
+ });
379
+ }
380
+ }
381
+ /**
382
+ * Toggle type status
383
+ */
384
+ toggleTypeStatus(type) {
385
+ this.loading.set(true);
386
+ this.typeService.toggleTypeStatus({ sygmt_id: type._id || "" })
387
+ .pipe(takeUntilDestroyed(this.destroyRef))
388
+ .subscribe({
389
+ next: (response) => {
390
+ if (response.success) {
391
+ this.loadTypes();
392
+ console.log(`✅ Type ${type.sygmt_isactive ? 'deactivated' : 'activated'} successfully`);
393
+ }
394
+ else {
395
+ console.error('❌ Failed to toggle type status:', response.message);
396
+ }
397
+ this.loading.set(false);
398
+ },
399
+ error: (error) => {
400
+ console.error('Error toggling type status:', error);
401
+ console.error('❌ Failed to toggle type status. Please try again.');
402
+ this.loading.set(false);
403
+ }
404
+ });
405
+ }
406
+ /**
407
+ * Navigate to general master management for this type
408
+ */
409
+ navigateToGeneralMaster(type) {
410
+ const payload = generateStringFromObject({
411
+ sygmt_id: type._id,
412
+ sygmt_title: type.sygmt_title
413
+ });
414
+ this.router.navigate(['control-panel', 'general_master_entry', payload]);
415
+ }
416
+ /**
417
+ * Handle form submission event
418
+ */
419
+ onSubmit(event) {
420
+ event.preventDefault();
421
+ console.log('🔵 Form onSubmit event triggered');
422
+ this.saveType();
423
+ }
424
+ /**
425
+ * Save type (create or update)
426
+ */
427
+ saveType() {
428
+ console.log('🔵 saveType called');
429
+ console.log('🔵 isEditMode:', this.isEditMode());
430
+ console.log('🔵 editingTypeId:', this.editingTypeId());
431
+ console.log('🔵 form valid:', this.typeForm.valid);
432
+ console.log('🔵 form values:', this.typeForm.getRawValue());
433
+ console.log('🔵 form dirty:', this.typeForm.dirty);
434
+ console.log('🔵 form pristine:', this.typeForm.pristine);
435
+ console.log('🔵 form touched:', this.typeForm.touched);
436
+ if (this.isEditMode()) {
437
+ console.log('🔵 Calling updateType');
438
+ this.updateType();
439
+ }
440
+ else {
441
+ console.log('🔵 Calling createType');
442
+ this.createType();
443
+ }
444
+ }
445
+ /**
446
+ * Cancel form (reset to defaults and exit edit mode)
447
+ */
448
+ cancelForm() {
449
+ this.typeForm.reset({
450
+ sygmt_code: '',
451
+ sygmt_title: '',
452
+ sygmt_desc: '',
453
+ sygmt_configuration: '{}',
454
+ sygmt_isactive: true,
455
+ sygmt_id_sygmt: '' // Clear parent type ID
456
+ });
457
+ this.isEditMode.set(false);
458
+ this.editingTypeId.set(null);
459
+ this.retrievedType.set(null);
460
+ this.typeForm.markAsPristine();
461
+ this.typeForm.markAsUntouched();
462
+ }
463
+ /**
464
+ * Mark form as touched to trigger validation display
465
+ */
466
+ markFormAsTouched() {
467
+ Object.keys(this.typeForm.controls).forEach(key => {
468
+ const control = this.typeForm.get(key);
469
+ control?.markAsTouched();
470
+ });
471
+ }
472
+ /**
473
+ * Clear parent type relationship
474
+ */
475
+ clearParentType() {
476
+ this.typeForm.patchValue({
477
+ sygmt_id_sygmt: ''
478
+ });
479
+ console.log('🔵 Parent type relationship cleared');
480
+ }
481
+ /**
482
+ * Get dropdown items for actions
483
+ */
484
+ getActionDropdownItems(type) {
485
+ return [
486
+ {
487
+ id: 'edit',
488
+ label: 'Edit',
489
+ icon: 'edit',
490
+ disabled: false
491
+ },
492
+ {
493
+ id: 'addChild',
494
+ label: 'Add Child',
495
+ icon: 'add',
496
+ disabled: false
497
+ },
498
+ {
499
+ id: 'general-master',
500
+ label: 'General Master',
501
+ icon: 'list',
502
+ disabled: false
503
+ },
504
+ {
505
+ id: 'toggle',
506
+ label: type.sygmt_isactive ? 'Deactivate' : 'Activate',
507
+ icon: type.sygmt_isactive ? 'block' : 'check_circle',
508
+ disabled: false
509
+ },
510
+ {
511
+ id: 'delete',
512
+ label: 'Delete',
513
+ icon: 'delete',
514
+ disabled: false
515
+ }
516
+ ];
517
+ }
518
+ /**
519
+ * Get parent type display name
520
+ */
521
+ getParentTypeDisplay() {
522
+ const parentId = this.typeForm.get('sygmt_id_sygmt')?.value;
523
+ if (!parentId)
524
+ return '';
525
+ const parentType = this.types().find(t => t._id === parentId);
526
+ return parentType ? (parentType.sygmt_title || 'Unknown Parent') : 'Unknown Parent';
527
+ }
528
+ /**
529
+ * Handle adding a child type
530
+ */
531
+ onAddChild(parentType) {
532
+ console.log('🔵 onAddChild called with:', parentType);
533
+ console.log('🔵 Parent title:', parentType.sygmt_title);
534
+ // Clear edit mode and retrieved item when adding a child
535
+ this.isEditMode.set(false);
536
+ this.editingTypeId.set(null);
537
+ this.retrievedType.set(null);
538
+ // Reset form and pre-fill with parent context
539
+ this.typeForm.patchValue({
540
+ sygmt_code: '',
541
+ sygmt_title: '',
542
+ sygmt_desc: '',
543
+ sygmt_configuration: '{}',
544
+ sygmt_isactive: true,
545
+ sygmt_id_sygmt: parentType._id // Set parent type ID
546
+ });
547
+ // Store the parent type for reference (you can display this in the UI)
548
+ console.log('🔵 Ready to add child type for parent:', parentType.sygmt_title);
549
+ }
550
+ /**
551
+ * Handle dropdown item click
552
+ */
553
+ onDropdownItemClick(item, row) {
554
+ console.log('🔵 onDropdownItemClick called with:', item, row);
555
+ switch (item.id) {
556
+ case 'edit':
557
+ console.log('🔵 Calling editType with:', row);
558
+ this.editType(row);
559
+ break;
560
+ case 'addChild':
561
+ console.log('🔵 Calling onAddChild with:', row);
562
+ this.onAddChild(row);
563
+ break;
564
+ case 'general-master':
565
+ console.log('🔵 Calling navigateToGeneralMaster with:', row);
566
+ this.navigateToGeneralMaster(row);
567
+ break;
568
+ case 'toggle':
569
+ console.log('🔵 Calling toggleTypeStatus with:', row);
570
+ this.toggleTypeStatus(row);
571
+ break;
572
+ case 'delete':
573
+ console.log('🔵 Calling deleteType with:', row);
574
+ this.deleteType(row);
575
+ break;
576
+ default:
577
+ console.log('🔵 Unknown action:', item.id);
578
+ }
579
+ // Close all dropdowns after action
580
+ this.closeAllDropdowns();
581
+ }
582
+ /**
583
+ * Close all dropdowns
584
+ */
585
+ closeAllDropdowns() {
586
+ // Close all dropdowns by clicking outside
587
+ const event = new MouseEvent('click', { bubbles: true });
588
+ document.dispatchEvent(event);
589
+ }
590
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterTypeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
591
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: GeneralMasterTypeComponent, isStandalone: true, selector: "cide-core-app-general-master-type", viewQueries: [{ propertyName: "typeDetailsRendererTemplate", first: true, predicate: ["typeDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "typeStatusRendererTemplate", first: true, predicate: ["typeStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- General Master Type 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 Type' : 'Quick Add Type' }}</h6>\n </div>\n \n <!-- Parent Type Info (shown when adding child) -->\n @if (typeForm.get('sygmt_id_sygmt')?.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 <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <span class=\"tw-text-sm tw-text-blue-600 tw-font-medium\">{{ isEditMode() ? 'Parent:' : 'Creating child under:' }}</span>\n <span class=\"tw-text-sm tw-text-blue-800 tw-font-semibold\">{{ getParentTypeDisplay() }}</span>\n </div>\n <button \n cideEleButton \n variant=\"ghost\" \n size=\"xs\" \n type=\"button\" \n (click)=\"clearParentType()\" \n class=\"tw-text-blue-400 hover:tw-text-blue-600\">\n <svg class=\"tw-w-4 tw-h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n\n <form [formGroup]=\"typeForm\" (ngSubmit)=\"onSubmit($event)\" class=\"tw-space-y-2 tw-relative\">\n <!-- Hidden field for parent type ID -->\n <input type=\"hidden\" formControlName=\"sygmt_id_sygmt\">\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 <!-- Type Code -->\n <div class=\"lg:tw-col-span-1\">\n <cide-ele-input \n formControlName=\"sygmt_code\" \n label=\"Type Code*\" \n placeholder=\"Enter type code\"\n size=\"sm\"\n [maxlength]=\"40\">\n </cide-ele-input>\n </div>\n \n <!-- Type Title -->\n <div class=\"lg:tw-col-span-2\">\n <cide-ele-input \n formControlName=\"sygmt_title\" \n label=\"Type Title*\" \n placeholder=\"Enter type title\"\n size=\"sm\"\n [maxlength]=\"100\">\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=\"sygmt_isactive\"\n type=\"checkbox\"\n label=\"Active\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n <!-- Second 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=\"sygmt_configuration\" \n label=\"Configuration*\" \n size=\"sm\">\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=\"sygmt_desc\" \n label=\"Description\" \n placeholder=\"Enter description\"\n size=\"sm\"\n [maxlength]=\"255\" \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)=\"cancelForm()\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\">\n Cancel\n </button>\n <button \n cideEleButton \n variant=\"primary\" \n size=\"sm\" \n type=\"submit\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\" [leftIcon]=\"isEditMode() ? 'edit' : 'add'\">\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 -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">category</cide-ele-icon>\n <h5 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">General Master Type Management</h5>\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\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-2\">\n <h3 class=\"tw-text-xs tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\n <p class=\"tw-text-xs 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 #typeDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.sygmt_title || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate tw-max-w-xs\" title=\"{{ row.sygmt_desc || 'No description' }}\">{{ row.sygmt_desc || 'No description' }}</div>\n </div>\n</ng-template>\n\n<ng-template #typeStatusRendererTemplate 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.sygmt_isactive\"\n [class.tw-text-green-800]=\"row.sygmt_isactive\"\n [class.tw-bg-red-100]=\"!row.sygmt_isactive\"\n [class.tw-text-red-800]=\"!row.sygmt_isactive\">\n {{ row.sygmt_isactive ? 'Active' : 'Inactive' }}\n </span>\n</ng-template>\n\n\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.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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.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: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "customRenderers", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { 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: 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"] }] }); }
592
+ }
593
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterTypeComponent, decorators: [{
594
+ type: Component,
595
+ args: [{ selector: 'cide-core-app-general-master-type', standalone: true, imports: [
596
+ CommonModule,
597
+ ReactiveFormsModule,
598
+ FormsModule,
599
+ CideEleDataGridComponent,
600
+ CideEleButtonComponent,
601
+ CideInputComponent,
602
+ CideSelectComponent,
603
+ CideTextareaComponent,
604
+ CideIconComponent,
605
+ CideEleDropdownComponent,
606
+ CideEleJsonEditorComponent
607
+ ], template: "<!-- General Master Type 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 Type' : 'Quick Add Type' }}</h6>\n </div>\n \n <!-- Parent Type Info (shown when adding child) -->\n @if (typeForm.get('sygmt_id_sygmt')?.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 <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <span class=\"tw-text-sm tw-text-blue-600 tw-font-medium\">{{ isEditMode() ? 'Parent:' : 'Creating child under:' }}</span>\n <span class=\"tw-text-sm tw-text-blue-800 tw-font-semibold\">{{ getParentTypeDisplay() }}</span>\n </div>\n <button \n cideEleButton \n variant=\"ghost\" \n size=\"xs\" \n type=\"button\" \n (click)=\"clearParentType()\" \n class=\"tw-text-blue-400 hover:tw-text-blue-600\">\n <svg class=\"tw-w-4 tw-h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n\n <form [formGroup]=\"typeForm\" (ngSubmit)=\"onSubmit($event)\" class=\"tw-space-y-2 tw-relative\">\n <!-- Hidden field for parent type ID -->\n <input type=\"hidden\" formControlName=\"sygmt_id_sygmt\">\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 <!-- Type Code -->\n <div class=\"lg:tw-col-span-1\">\n <cide-ele-input \n formControlName=\"sygmt_code\" \n label=\"Type Code*\" \n placeholder=\"Enter type code\"\n size=\"sm\"\n [maxlength]=\"40\">\n </cide-ele-input>\n </div>\n \n <!-- Type Title -->\n <div class=\"lg:tw-col-span-2\">\n <cide-ele-input \n formControlName=\"sygmt_title\" \n label=\"Type Title*\" \n placeholder=\"Enter type title\"\n size=\"sm\"\n [maxlength]=\"100\">\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=\"sygmt_isactive\"\n type=\"checkbox\"\n label=\"Active\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n <!-- Second 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=\"sygmt_configuration\" \n label=\"Configuration*\" \n size=\"sm\">\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=\"sygmt_desc\" \n label=\"Description\" \n placeholder=\"Enter description\"\n size=\"sm\"\n [maxlength]=\"255\" \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)=\"cancelForm()\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\">\n Cancel\n </button>\n <button \n cideEleButton \n variant=\"primary\" \n size=\"sm\" \n type=\"submit\"\n [disabled]=\"loading()\"\n class=\"tw-px-4 tw-py-2\" [leftIcon]=\"isEditMode() ? 'edit' : 'add'\">\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 -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">category</cide-ele-icon>\n <h5 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">General Master Type Management</h5>\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\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-2\">\n <h3 class=\"tw-text-xs tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\n <p class=\"tw-text-xs 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 #typeDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.sygmt_title || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate tw-max-w-xs\" title=\"{{ row.sygmt_desc || 'No description' }}\">{{ row.sygmt_desc || 'No description' }}</div>\n </div>\n</ng-template>\n\n<ng-template #typeStatusRendererTemplate 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.sygmt_isactive\"\n [class.tw-text-green-800]=\"row.sygmt_isactive\"\n [class.tw-bg-red-100]=\"!row.sygmt_isactive\"\n [class.tw-text-red-800]=\"!row.sygmt_isactive\">\n {{ row.sygmt_isactive ? 'Active' : 'Inactive' }}\n </span>\n</ng-template>\n\n\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>" }]
608
+ }] });
609
+
610
+ export { GeneralMasterTypeComponent };
611
+ //# sourceMappingURL=cloud-ide-core-general-master-type.component-B26auJZw.mjs.map