cloud-ide-core 2.0.79 → 2.0.83

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.
@@ -0,0 +1,323 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable, DestroyRef, signal, computed, Component } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import { Router } from '@angular/router';
6
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { CideEleDataGridComponent, CideEleButtonComponent, CideIconComponent, CideEleDropdownComponent } from 'cloud-ide-element';
8
+ import { RightsService } from 'cloud-ide-layout';
9
+ import { HttpClient } from '@angular/common/http';
10
+ import { cidePath, hostManagerRoutesUrl, coreRoutesUrl, generateStringFromObject } from 'cloud-ide-lms-model';
11
+
12
+ class CideCoreWorkflowRegistryService {
13
+ http = inject(HttpClient);
14
+ /**
15
+ * Create workflow registry
16
+ */
17
+ createRegistry(data) {
18
+ const url = cidePath.join([
19
+ hostManagerRoutesUrl.cideSuiteHost,
20
+ coreRoutesUrl.module,
21
+ coreRoutesUrl.workflowRegistry
22
+ ]);
23
+ return this.http.post(url, data);
24
+ }
25
+ /**
26
+ * Get workflow registry list
27
+ */
28
+ getRegistryList(query) {
29
+ const queryString = query ? generateStringFromObject(query) : '';
30
+ const url = cidePath.join([
31
+ hostManagerRoutesUrl.cideSuiteHost,
32
+ coreRoutesUrl.module,
33
+ coreRoutesUrl.workflowRegistry,
34
+ queryString
35
+ ]);
36
+ return this.http.get(url);
37
+ }
38
+ /**
39
+ * Get workflow registry by ID
40
+ */
41
+ getRegistryById(id) {
42
+ const url = cidePath.join([
43
+ hostManagerRoutesUrl.cideSuiteHost,
44
+ coreRoutesUrl.module,
45
+ coreRoutesUrl.workflowRegistry,
46
+ id
47
+ ]);
48
+ return this.http.get(url);
49
+ }
50
+ /**
51
+ * Update workflow registry
52
+ */
53
+ updateRegistry(data) {
54
+ if (!data.wfrg_id) {
55
+ throw new Error('Workflow registry ID is required for update');
56
+ }
57
+ const url = cidePath.join([
58
+ hostManagerRoutesUrl.cideSuiteHost,
59
+ coreRoutesUrl.module,
60
+ coreRoutesUrl.workflowRegistry,
61
+ data.wfrg_id
62
+ ]);
63
+ return this.http.put(url, data);
64
+ }
65
+ /**
66
+ * Delete workflow registry
67
+ */
68
+ deleteRegistry(id) {
69
+ const url = cidePath.join([
70
+ hostManagerRoutesUrl.cideSuiteHost,
71
+ coreRoutesUrl.module,
72
+ coreRoutesUrl.workflowRegistry,
73
+ id
74
+ ]);
75
+ return this.http.delete(url);
76
+ }
77
+ /**
78
+ * Get workflow registry by page ID
79
+ */
80
+ getRegistryByPage(pageId) {
81
+ const url = cidePath.join([
82
+ hostManagerRoutesUrl.cideSuiteHost,
83
+ coreRoutesUrl.module,
84
+ coreRoutesUrl.workflowRegistry,
85
+ 'by-page',
86
+ pageId
87
+ ]);
88
+ return this.http.get(url);
89
+ }
90
+ /**
91
+ * Get workflow registry by menu ID
92
+ */
93
+ getRegistryByMenu(menuId) {
94
+ const url = cidePath.join([
95
+ hostManagerRoutesUrl.cideSuiteHost,
96
+ coreRoutesUrl.module,
97
+ coreRoutesUrl.workflowRegistry,
98
+ 'by-menu',
99
+ menuId
100
+ ]);
101
+ return this.http.get(url);
102
+ }
103
+ /**
104
+ * Get workflow registry by category ID
105
+ */
106
+ getRegistryByCategory(categoryId) {
107
+ const url = cidePath.join([
108
+ hostManagerRoutesUrl.cideSuiteHost,
109
+ coreRoutesUrl.module,
110
+ coreRoutesUrl.workflowRegistry,
111
+ 'by-category',
112
+ categoryId
113
+ ]);
114
+ return this.http.get(url);
115
+ }
116
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreWorkflowRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
117
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreWorkflowRegistryService, providedIn: 'root' });
118
+ }
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreWorkflowRegistryService, decorators: [{
120
+ type: Injectable,
121
+ args: [{
122
+ providedIn: 'root'
123
+ }]
124
+ }] });
125
+
126
+ class CideCoreWorkflowRegistryListComponent {
127
+ destroyRef = inject(DestroyRef);
128
+ workflowService = inject(CideCoreWorkflowRegistryService);
129
+ router = inject(Router);
130
+ rightsService = inject(RightsService);
131
+ workflows = signal([], ...(ngDevMode ? [{ debugName: "workflows" }] : []));
132
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
133
+ error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
134
+ canCreate = computed(() => this.rightsService.hasRight('CREATE'), ...(ngDevMode ? [{ debugName: "canCreate" }] : []));
135
+ canEdit = computed(() => this.rightsService.hasRight('EDIT'), ...(ngDevMode ? [{ debugName: "canEdit" }] : []));
136
+ canDelete = computed(() => this.rightsService.hasRight('DELETE'), ...(ngDevMode ? [{ debugName: "canDelete" }] : []));
137
+ gridConfig = signal({
138
+ id: 'workflow-registry-grid',
139
+ columns: [
140
+ { key: 'details', header: 'Workflow Details', type: 'custom', width: 'auto', renderer: 'workflowDetailsRenderer' },
141
+ { key: 'wfrg_component_selector', header: 'Component Selector', type: 'text', width: '200px' },
142
+ { key: 'status', header: 'Status', type: 'custom', width: '100px', renderer: 'statusRenderer' },
143
+ { key: 'actions', header: '', type: 'custom', width: '120px', renderer: 'actionsRenderer' }
144
+ ],
145
+ data: [],
146
+ pagination: {
147
+ enabled: true,
148
+ pageSize: 10,
149
+ pageSizeOptions: [10, 25, 50, 100],
150
+ showQuickJump: true,
151
+ showPageInfo: true,
152
+ showRefresh: true
153
+ },
154
+ search: {
155
+ enabled: true,
156
+ placeholder: 'Search workflows...',
157
+ searchableColumns: [],
158
+ debounceMs: 300
159
+ },
160
+ loading: {
161
+ useDefer: true,
162
+ skeletonRows: 5,
163
+ showOverlay: false
164
+ },
165
+ responsive: true
166
+ }, ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
167
+ ngOnInit() {
168
+ this.loadWorkflows();
169
+ }
170
+ loadWorkflows() {
171
+ this.loading.set(true);
172
+ this.workflowService.getRegistryList()
173
+ .pipe(takeUntilDestroyed(this.destroyRef))
174
+ .subscribe({
175
+ next: (response) => {
176
+ if (response.success) {
177
+ const workflowsData = Array.isArray(response.data) ? response.data : [];
178
+ this.workflows.set(workflowsData);
179
+ // Update grid config with new data
180
+ this.gridConfig.update(config => ({
181
+ ...config,
182
+ data: workflowsData,
183
+ loading: {
184
+ ...config.loading,
185
+ useDefer: true,
186
+ skeletonRows: 5,
187
+ showOverlay: false
188
+ }
189
+ }));
190
+ }
191
+ else {
192
+ this.error.set(response.message || 'Failed to load workflows');
193
+ }
194
+ this.loading.set(false);
195
+ },
196
+ error: (err) => {
197
+ this.error.set('Failed to load workflows');
198
+ this.loading.set(false);
199
+ }
200
+ });
201
+ }
202
+ createNew() {
203
+ this.router.navigate(['/core/workflow-registry/create']);
204
+ }
205
+ editWorkflow(workflow) {
206
+ this.router.navigate(['/core/workflow-registry/edit', workflow.wfrg_id]);
207
+ }
208
+ deleteWorkflow(workflow) {
209
+ if (confirm('Are you sure you want to delete this workflow?')) {
210
+ this.workflowService.deleteRegistry(workflow.wfrg_id)
211
+ .pipe(takeUntilDestroyed(this.destroyRef))
212
+ .subscribe({
213
+ next: (response) => {
214
+ if (response.success) {
215
+ this.loadWorkflows();
216
+ }
217
+ }
218
+ });
219
+ }
220
+ }
221
+ getActionItems(workflow) {
222
+ const items = [];
223
+ if (this.canEdit()) {
224
+ items.push({ label: 'Edit', action: () => this.editWorkflow(workflow) });
225
+ }
226
+ if (this.canDelete()) {
227
+ items.push({ label: 'Delete', action: () => this.deleteWorkflow(workflow) });
228
+ }
229
+ return items;
230
+ }
231
+ onGridEvent(event) {
232
+ // Handle grid events
233
+ }
234
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreWorkflowRegistryListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
235
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CideCoreWorkflowRegistryListComponent, isStandalone: true, selector: "cide-core-workflow-registry-list", ngImport: i0, template: `
236
+ <div class="workflow-registry-list-container">
237
+ <div class="header-actions">
238
+ <cide-ele-button
239
+ *ngIf="canCreate()"
240
+ (click)="createNew()"
241
+ [variant]="'primary'">
242
+ <cide-ele-icon>plus</cide-ele-icon>
243
+ New Workflow Registry
244
+ </cide-ele-button>
245
+ </div>
246
+
247
+ <cide-ele-data-grid
248
+ [config]="gridConfig()"
249
+ (gridEvent)="onGridEvent($event)">
250
+
251
+ <ng-template #workflowDetailsRenderer let-data>
252
+ <div class="workflow-details">
253
+ <div class="workflow-name">{{ data.wfrg_category_id_sygms || 'N/A' }}</div>
254
+ <div class="workflow-meta">
255
+ <span *ngIf="data.wfrg_page_id_sypg">Page: {{ data.wfrg_page_id_sypg }}</span>
256
+ <span *ngIf="data.wfrg_menu_id_symu">Menu: {{ data.wfrg_menu_id_symu }}</span>
257
+ </div>
258
+ </div>
259
+ </ng-template>
260
+
261
+ <ng-template #statusRenderer let-data>
262
+ <span [class]="data.wfrg_is_active ? 'status-active' : 'status-inactive'">
263
+ {{ data.wfrg_is_active ? 'Active' : 'Inactive' }}
264
+ </span>
265
+ </ng-template>
266
+
267
+ <ng-template #actionsRenderer let-data>
268
+ <cide-ele-dropdown [items]="getActionItems(data)"></cide-ele-dropdown>
269
+ </ng-template>
270
+ </cide-ele-data-grid>
271
+ </div>
272
+ `, isInline: true, styles: [".workflow-registry-list-container{padding:1rem;height:100%;display:flex;flex-direction:column}.header-actions{margin-bottom:1rem}.workflow-details{display:flex;flex-direction:column;gap:.25rem}.workflow-name{font-weight:500}.workflow-meta{font-size:.875rem;color:#666;display:flex;gap:1rem}.status-active{color:green}.status-inactive{color:gray}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }] });
273
+ }
274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreWorkflowRegistryListComponent, decorators: [{
275
+ type: Component,
276
+ args: [{ selector: 'cide-core-workflow-registry-list', standalone: true, imports: [
277
+ CommonModule,
278
+ CideEleDataGridComponent,
279
+ CideEleButtonComponent,
280
+ CideIconComponent,
281
+ CideEleDropdownComponent
282
+ ], template: `
283
+ <div class="workflow-registry-list-container">
284
+ <div class="header-actions">
285
+ <cide-ele-button
286
+ *ngIf="canCreate()"
287
+ (click)="createNew()"
288
+ [variant]="'primary'">
289
+ <cide-ele-icon>plus</cide-ele-icon>
290
+ New Workflow Registry
291
+ </cide-ele-button>
292
+ </div>
293
+
294
+ <cide-ele-data-grid
295
+ [config]="gridConfig()"
296
+ (gridEvent)="onGridEvent($event)">
297
+
298
+ <ng-template #workflowDetailsRenderer let-data>
299
+ <div class="workflow-details">
300
+ <div class="workflow-name">{{ data.wfrg_category_id_sygms || 'N/A' }}</div>
301
+ <div class="workflow-meta">
302
+ <span *ngIf="data.wfrg_page_id_sypg">Page: {{ data.wfrg_page_id_sypg }}</span>
303
+ <span *ngIf="data.wfrg_menu_id_symu">Menu: {{ data.wfrg_menu_id_symu }}</span>
304
+ </div>
305
+ </div>
306
+ </ng-template>
307
+
308
+ <ng-template #statusRenderer let-data>
309
+ <span [class]="data.wfrg_is_active ? 'status-active' : 'status-inactive'">
310
+ {{ data.wfrg_is_active ? 'Active' : 'Inactive' }}
311
+ </span>
312
+ </ng-template>
313
+
314
+ <ng-template #actionsRenderer let-data>
315
+ <cide-ele-dropdown [items]="getActionItems(data)"></cide-ele-dropdown>
316
+ </ng-template>
317
+ </cide-ele-data-grid>
318
+ </div>
319
+ `, styles: [".workflow-registry-list-container{padding:1rem;height:100%;display:flex;flex-direction:column}.header-actions{margin-bottom:1rem}.workflow-details{display:flex;flex-direction:column;gap:.25rem}.workflow-name{font-weight:500}.workflow-meta{font-size:.875rem;color:#666;display:flex;gap:1rem}.status-active{color:green}.status-inactive{color:gray}\n"] }]
320
+ }] });
321
+
322
+ export { CideCoreWorkflowRegistryListComponent };
323
+ //# sourceMappingURL=cloud-ide-core-workflow-registry-list.component-B453QJwg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-core-workflow-registry-list.component-B453QJwg.mjs","sources":["../../../projects/cloud-ide-core/src/lib/core/workflow-management/services/workflow-registry.service.ts","../../../projects/cloud-ide-core/src/lib/core/workflow-management/components/workflow-registry-list/workflow-registry-list.component.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { cidePath, coreRoutesUrl, hostManagerRoutesUrl, generateStringFromObject } from 'cloud-ide-lms-model';\r\n\r\nexport interface CreateWorkflowRegistryDto {\r\n wfrg_entity_id_syen?: string;\r\n wfrg_page_id_sypg?: string;\r\n wfrg_menu_id_symu?: string;\r\n wfrg_category_id_sygms?: string;\r\n wfrg_component_selector?: string;\r\n wfrg_component_path?: string;\r\n wfrg_component_query?: string;\r\n wfrg_view_mode_id_sygms?: string;\r\n wfrg_trigger_type_id_sygms?: string;\r\n wfrg_trigger_condition?: string;\r\n wfrg_auto_initialize?: boolean;\r\n wfrg_reinitialize_on_edit?: boolean;\r\n wfrg_notify_approvers_on_final_status?: boolean;\r\n wfrg_show_approver_names?: boolean;\r\n wfrg_mask_approver_info?: boolean;\r\n wfrg_valid_from_date?: Date;\r\n wfrg_valid_to_date?: Date;\r\n wfrg_is_active?: boolean;\r\n}\r\n\r\nexport interface UpdateWorkflowRegistryDto extends CreateWorkflowRegistryDto {\r\n wfrg_id?: string;\r\n}\r\n\r\nexport interface WorkflowRegistryResponse {\r\n success: boolean;\r\n message?: string;\r\n data?: any;\r\n total?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideCoreWorkflowRegistryService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Create workflow registry\r\n */\r\n createRegistry(data: CreateWorkflowRegistryDto): Observable<WorkflowRegistryResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry\r\n ]);\r\n return this.http.post<WorkflowRegistryResponse>(url, data);\r\n }\r\n\r\n /**\r\n * Get workflow registry list\r\n */\r\n getRegistryList(query?: any): Observable<WorkflowRegistryResponse> {\r\n const queryString = query ? generateStringFromObject(query) : '';\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry,\r\n queryString\r\n ]);\r\n return this.http.get<WorkflowRegistryResponse>(url);\r\n }\r\n\r\n /**\r\n * Get workflow registry by ID\r\n */\r\n getRegistryById(id: string): Observable<WorkflowRegistryResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry,\r\n id\r\n ]);\r\n return this.http.get<WorkflowRegistryResponse>(url);\r\n }\r\n\r\n /**\r\n * Update workflow registry\r\n */\r\n updateRegistry(data: UpdateWorkflowRegistryDto): Observable<WorkflowRegistryResponse> {\r\n if (!data.wfrg_id) {\r\n throw new Error('Workflow registry ID is required for update');\r\n }\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry,\r\n data.wfrg_id\r\n ]);\r\n return this.http.put<WorkflowRegistryResponse>(url, data);\r\n }\r\n\r\n /**\r\n * Delete workflow registry\r\n */\r\n deleteRegistry(id: string): Observable<WorkflowRegistryResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry,\r\n id\r\n ]);\r\n return this.http.delete<WorkflowRegistryResponse>(url);\r\n }\r\n\r\n /**\r\n * Get workflow registry by page ID\r\n */\r\n getRegistryByPage(pageId: string): Observable<WorkflowRegistryResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry,\r\n 'by-page',\r\n pageId\r\n ]);\r\n return this.http.get<WorkflowRegistryResponse>(url);\r\n }\r\n\r\n /**\r\n * Get workflow registry by menu ID\r\n */\r\n getRegistryByMenu(menuId: string): Observable<WorkflowRegistryResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry,\r\n 'by-menu',\r\n menuId\r\n ]);\r\n return this.http.get<WorkflowRegistryResponse>(url);\r\n }\r\n\r\n /**\r\n * Get workflow registry by category ID\r\n */\r\n getRegistryByCategory(categoryId: string): Observable<WorkflowRegistryResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.workflowRegistry,\r\n 'by-category',\r\n categoryId\r\n ]);\r\n return this.http.get<WorkflowRegistryResponse>(url);\r\n }\r\n}\r\n\r\n","import { Component, signal, viewChild, TemplateRef, DestroyRef, inject, computed, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CideEleDataGridComponent, CideEleButtonComponent, CideIconComponent, CideEleDropdownComponent, GridConfiguration, TemplateContext } from 'cloud-ide-element';\r\nimport { AppStateHelperService, RightsService } from 'cloud-ide-layout';\r\nimport { CideCoreWorkflowRegistryService } from '../../services/workflow-registry.service';\r\n\r\n@Component({\r\n selector: 'cide-core-workflow-registry-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n CideEleDataGridComponent,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n CideEleDropdownComponent\r\n ],\r\n template: `\r\n <div class=\"workflow-registry-list-container\">\r\n <div class=\"header-actions\">\r\n <cide-ele-button \r\n *ngIf=\"canCreate()\"\r\n (click)=\"createNew()\"\r\n [variant]=\"'primary'\">\r\n <cide-ele-icon>plus</cide-ele-icon>\r\n New Workflow Registry\r\n </cide-ele-button>\r\n </div>\r\n \r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n \r\n <ng-template #workflowDetailsRenderer let-data>\r\n <div class=\"workflow-details\">\r\n <div class=\"workflow-name\">{{ data.wfrg_category_id_sygms || 'N/A' }}</div>\r\n <div class=\"workflow-meta\">\r\n <span *ngIf=\"data.wfrg_page_id_sypg\">Page: {{ data.wfrg_page_id_sypg }}</span>\r\n <span *ngIf=\"data.wfrg_menu_id_symu\">Menu: {{ data.wfrg_menu_id_symu }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template #statusRenderer let-data>\r\n <span [class]=\"data.wfrg_is_active ? 'status-active' : 'status-inactive'\">\r\n {{ data.wfrg_is_active ? 'Active' : 'Inactive' }}\r\n </span>\r\n </ng-template>\r\n \r\n <ng-template #actionsRenderer let-data>\r\n <cide-ele-dropdown [items]=\"getActionItems(data)\"></cide-ele-dropdown>\r\n </ng-template>\r\n </cide-ele-data-grid>\r\n </div>\r\n `,\r\n styles: [`\r\n .workflow-registry-list-container {\r\n padding: 1rem;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .header-actions {\r\n margin-bottom: 1rem;\r\n }\r\n .workflow-details {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.25rem;\r\n }\r\n .workflow-name {\r\n font-weight: 500;\r\n }\r\n .workflow-meta {\r\n font-size: 0.875rem;\r\n color: #666;\r\n display: flex;\r\n gap: 1rem;\r\n }\r\n .status-active {\r\n color: green;\r\n }\r\n .status-inactive {\r\n color: gray;\r\n }\r\n `]\r\n})\r\nexport class CideCoreWorkflowRegistryListComponent implements OnInit {\r\n private destroyRef = inject(DestroyRef);\r\n private workflowService = inject(CideCoreWorkflowRegistryService);\r\n private router = inject(Router);\r\n private rightsService = inject(RightsService);\r\n\r\n workflows = signal<any[]>([]);\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n \r\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\r\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\r\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\r\n\r\n gridConfig = signal<GridConfiguration<any>>({\r\n id: 'workflow-registry-grid',\r\n columns: [\r\n { key: 'details', header: 'Workflow Details', type: 'custom', width: 'auto', renderer: 'workflowDetailsRenderer' },\r\n { key: 'wfrg_component_selector', header: 'Component Selector', type: 'text', width: '200px' },\r\n { key: 'status', header: 'Status', type: 'custom', width: '100px', renderer: 'statusRenderer' },\r\n { key: 'actions', header: '', type: 'custom', width: '120px', renderer: 'actionsRenderer' }\r\n ],\r\n data: [],\r\n pagination: {\r\n enabled: true,\r\n pageSize: 10,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n showQuickJump: true,\r\n showPageInfo: true,\r\n showRefresh: true\r\n },\r\n search: {\r\n enabled: true,\r\n placeholder: 'Search workflows...',\r\n searchableColumns: [],\r\n debounceMs: 300\r\n },\r\n loading: {\r\n useDefer: true,\r\n skeletonRows: 5,\r\n showOverlay: false\r\n },\r\n responsive: true\r\n });\r\n\r\n ngOnInit(): void {\r\n this.loadWorkflows();\r\n }\r\n\r\n loadWorkflows(): void {\r\n this.loading.set(true);\r\n this.workflowService.getRegistryList()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n const workflowsData = Array.isArray(response.data) ? response.data : [];\r\n this.workflows.set(workflowsData);\r\n // Update grid config with new data\r\n this.gridConfig.update(config => ({\r\n ...config,\r\n data: workflowsData,\r\n loading: {\r\n ...config.loading,\r\n useDefer: true,\r\n skeletonRows: 5,\r\n showOverlay: false\r\n }\r\n }));\r\n } else {\r\n this.error.set(response.message || 'Failed to load workflows');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err) => {\r\n this.error.set('Failed to load workflows');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n createNew(): void {\r\n this.router.navigate(['/core/workflow-registry/create']);\r\n }\r\n\r\n editWorkflow(workflow: any): void {\r\n this.router.navigate(['/core/workflow-registry/edit', workflow.wfrg_id]);\r\n }\r\n\r\n deleteWorkflow(workflow: any): void {\r\n if (confirm('Are you sure you want to delete this workflow?')) {\r\n this.workflowService.deleteRegistry(workflow.wfrg_id)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.loadWorkflows();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n getActionItems(workflow: any): any[] {\r\n const items: any[] = [];\r\n if (this.canEdit()) {\r\n items.push({ label: 'Edit', action: () => this.editWorkflow(workflow) });\r\n }\r\n if (this.canDelete()) {\r\n items.push({ label: 'Delete', action: () => this.deleteWorkflow(workflow) });\r\n }\r\n return items;\r\n }\r\n\r\n onGridEvent(event: any): void {\r\n // Handle grid events\r\n }\r\n}\r\n\r\n"],"names":[],"mappings":"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"}
@@ -257,6 +257,16 @@ const coreRoutes = [
257
257
  data: {
258
258
  sypg_page_code: "core_user_role_view"
259
259
  }
260
+ },
261
+ // Workflow Management Routes
262
+ {
263
+ path: 'workflow-registry',
264
+ loadComponent: () => import('./cloud-ide-core-workflow-registry-list.component-B453QJwg.mjs').then(c => c.CideCoreWorkflowRegistryListComponent),
265
+ title: 'Workflow Registry',
266
+ canActivate: [authGuard],
267
+ data: {
268
+ sypg_page_code: "core_workflow_registry"
269
+ }
260
270
  }
261
271
  ];
262
272
 
@@ -6396,7 +6406,7 @@ class CideCorePageListComponent {
6396
6406
  document.dispatchEvent(event);
6397
6407
  }
6398
6408
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCorePageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6399
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideCorePageListComponent, isStandalone: true, selector: "cide-core-page-list", viewQueries: [{ propertyName: "pageDetailsRendererTemplate", first: true, predicate: ["pageDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "pageStatusRendererTemplate", first: true, predicate: ["pageStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Page List Container -->\r\n<div class=\"tw-table tw-w-full tw-h-full\">\r\n\r\n <!-- Header Section with Filters -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\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-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">web</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Page Management</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Add Page Button -->\r\n @if (canCreate()) {\r\n <button\r\n cideEleButton\r\n variant=\"primary\"\r\n size=\"sm\"\r\n (click)=\"createPage()\"\r\n leftIcon=\"add\"\r\n class=\"tw-whitespace-nowrap tw-flex tw-items-center tw-gap-2\">\r\n Create New Page\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n @if (error()) {\r\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\r\n <div class=\"tw-flex tw-items-start\">\r\n <cide-ele-icon class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\">error</cide-ele-icon>\r\n <div class=\"tw-ml-3\">\r\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-h-full tw-relative\">\r\n \r\n <!-- Data Grid Component -->\r\n <div class=\"tw-h-full tw-overflow-auto\">\r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n [templateRenderers]=\"getTemplateRenderers()\"\r\n [actionHandlers]=\"actionHandlers\"\r\n [serverSidePagination]=\"true\"\r\n [totalServerItems]=\"totalItems()\"\r\n [currentServerPage]=\"currentPage()\"\r\n [currentServerPageSize]=\"pageSize()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Page Details Renderer Template -->\r\n<ng-template #pageDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\r\n <!-- Page Icon -->\r\n <div class=\"tw-flex-shrink-0\">\r\n <cide-ele-icon class=\"tw-text-gray-400 tw-w-4 tw-h-4\">web</cide-ele-icon>\r\n </div>\r\n \r\n <!-- Page Details -->\r\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \r\n [title]=\"row.sypg_title\">\r\n {{ row.sypg_title || 'Untitled' }}\r\n </div>\r\n @if (row.sypg_desc) {\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \r\n [title]=\"row.sypg_desc\">\r\n {{ row.sypg_desc }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Page Status Renderer Template -->\r\n<ng-template #pageStatusRendererTemplate let-row=\"row\" let-value=\"value\">\r\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 tw-whitespace-nowrap\"\r\n [ngClass]=\"row.sypg_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ row.sypg_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Actions Dropdown Renderer Template -->\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template> ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }] });
6409
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideCorePageListComponent, isStandalone: true, selector: "cide-core-page-list", viewQueries: [{ propertyName: "pageDetailsRendererTemplate", first: true, predicate: ["pageDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "pageStatusRendererTemplate", first: true, predicate: ["pageStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Page List Container -->\n<div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Header Section with Filters -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-6 tw-py-3 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-3 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-5 tw-h-5\">web</cide-ele-icon>\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Page 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-3 sm:tw-space-y-0 sm:tw-space-x-3\">\n <!-- Add Page Button -->\n @if (canCreate()) {\n <button\n cideEleButton\n variant=\"primary\"\n size=\"sm\"\n (click)=\"createPage()\"\n leftIcon=\"add\"\n class=\"tw-whitespace-nowrap tw-flex tw-items-center tw-gap-2\">\n Create New Page\n </button>\n }\n </div>\n </div>\n\n <!-- Error Message -->\n @if (error()) {\n <div class=\"tw-mt-4 tw-p-4 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 class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\">error</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]=\"getTemplateRenderers()\"\n [actionHandlers]=\"actionHandlers\"\n [serverSidePagination]=\"true\"\n [totalServerItems]=\"totalItems()\"\n [currentServerPage]=\"currentPage()\"\n [currentServerPageSize]=\"pageSize()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n</div>\n\n<!-- Page Details Renderer Template -->\n<ng-template #pageDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\n <!-- Page Icon -->\n <div class=\"tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-text-gray-400 tw-w-4 tw-h-4\">web</cide-ele-icon>\n </div>\n \n <!-- Page Details -->\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \n [title]=\"row.sypg_title\">\n {{ row.sypg_title || 'Untitled' }}\n </div>\n @if (row.sypg_desc) {\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \n [title]=\"row.sypg_desc\">\n {{ row.sypg_desc }}\n </div>\n }\n </div>\n </div>\n</ng-template>\n\n<!-- Page Status Renderer Template -->\n<ng-template #pageStatusRendererTemplate let-row=\"row\" let-value=\"value\">\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 tw-whitespace-nowrap\"\n [ngClass]=\"row.sypg_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n {{ row.sypg_isactive ? 'Active' : 'Inactive' }}\n </span>\n</ng-template>\n\n<!-- Actions Dropdown Renderer Template -->\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template> ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }] });
6400
6410
  }
6401
6411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCorePageListComponent, decorators: [{
6402
6412
  type: Component,
@@ -6406,7 +6416,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
6406
6416
  CideEleButtonComponent,
6407
6417
  CideIconComponent,
6408
6418
  CideEleDropdownComponent
6409
- ], template: "<!-- Page List Container -->\r\n<div class=\"tw-table tw-w-full tw-h-full\">\r\n\r\n <!-- Header Section with Filters -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\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-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">web</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Page Management</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Add Page Button -->\r\n @if (canCreate()) {\r\n <button\r\n cideEleButton\r\n variant=\"primary\"\r\n size=\"sm\"\r\n (click)=\"createPage()\"\r\n leftIcon=\"add\"\r\n class=\"tw-whitespace-nowrap tw-flex tw-items-center tw-gap-2\">\r\n Create New Page\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n @if (error()) {\r\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\r\n <div class=\"tw-flex tw-items-start\">\r\n <cide-ele-icon class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\">error</cide-ele-icon>\r\n <div class=\"tw-ml-3\">\r\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-h-full tw-relative\">\r\n \r\n <!-- Data Grid Component -->\r\n <div class=\"tw-h-full tw-overflow-auto\">\r\n <cide-ele-data-grid\r\n [config]=\"gridConfig()\"\r\n [templateRenderers]=\"getTemplateRenderers()\"\r\n [actionHandlers]=\"actionHandlers\"\r\n [serverSidePagination]=\"true\"\r\n [totalServerItems]=\"totalItems()\"\r\n [currentServerPage]=\"currentPage()\"\r\n [currentServerPageSize]=\"pageSize()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Page Details Renderer Template -->\r\n<ng-template #pageDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\r\n <!-- Page Icon -->\r\n <div class=\"tw-flex-shrink-0\">\r\n <cide-ele-icon class=\"tw-text-gray-400 tw-w-4 tw-h-4\">web</cide-ele-icon>\r\n </div>\r\n \r\n <!-- Page Details -->\r\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \r\n [title]=\"row.sypg_title\">\r\n {{ row.sypg_title || 'Untitled' }}\r\n </div>\r\n @if (row.sypg_desc) {\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \r\n [title]=\"row.sypg_desc\">\r\n {{ row.sypg_desc }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Page Status Renderer Template -->\r\n<ng-template #pageStatusRendererTemplate let-row=\"row\" let-value=\"value\">\r\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 tw-whitespace-nowrap\"\r\n [ngClass]=\"row.sypg_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ row.sypg_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Actions Dropdown Renderer Template -->\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown\r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template> " }]
6419
+ ], template: "<!-- Page List Container -->\n<div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Header Section with Filters -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-6 tw-py-3 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-3 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-5 tw-h-5\">web</cide-ele-icon>\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Page 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-3 sm:tw-space-y-0 sm:tw-space-x-3\">\n <!-- Add Page Button -->\n @if (canCreate()) {\n <button\n cideEleButton\n variant=\"primary\"\n size=\"sm\"\n (click)=\"createPage()\"\n leftIcon=\"add\"\n class=\"tw-whitespace-nowrap tw-flex tw-items-center tw-gap-2\">\n Create New Page\n </button>\n }\n </div>\n </div>\n\n <!-- Error Message -->\n @if (error()) {\n <div class=\"tw-mt-4 tw-p-4 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 class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\">error</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]=\"getTemplateRenderers()\"\n [actionHandlers]=\"actionHandlers\"\n [serverSidePagination]=\"true\"\n [totalServerItems]=\"totalItems()\"\n [currentServerPage]=\"currentPage()\"\n [currentServerPageSize]=\"pageSize()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n</div>\n\n<!-- Page Details Renderer Template -->\n<ng-template #pageDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\n <!-- Page Icon -->\n <div class=\"tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-text-gray-400 tw-w-4 tw-h-4\">web</cide-ele-icon>\n </div>\n \n <!-- Page Details -->\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \n [title]=\"row.sypg_title\">\n {{ row.sypg_title || 'Untitled' }}\n </div>\n @if (row.sypg_desc) {\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \n [title]=\"row.sypg_desc\">\n {{ row.sypg_desc }}\n </div>\n }\n </div>\n </div>\n</ng-template>\n\n<!-- Page Status Renderer Template -->\n<ng-template #pageStatusRendererTemplate let-row=\"row\" let-value=\"value\">\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 tw-whitespace-nowrap\"\n [ngClass]=\"row.sypg_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n {{ row.sypg_isactive ? 'Active' : 'Inactive' }}\n </span>\n</ng-template>\n\n<!-- Actions Dropdown Renderer Template -->\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template> " }]
6410
6420
  }], ctorParameters: () => [] });
6411
6421
 
6412
6422
  var pageList_component = /*#__PURE__*/Object.freeze({
@@ -12154,7 +12164,12 @@ class CideCoreUserCreateComponent {
12154
12164
  }
12155
12165
  /**
12156
12166
  * Process exceptions for each entity mapping based on modified vs actual permissions
12157
- * This method should be called during save to create core_user_role_exceptions
12167
+ * This method should be called during save to create/update/delete core_user_role_exceptions
12168
+ *
12169
+ * Logic:
12170
+ * - If modified !== actual: create/update exception
12171
+ * - If modified === actual BUT exception exists in DB: delete exception
12172
+ * - If modified === actual AND no exception exists: do nothing
12158
12173
  */
12159
12174
  processRoleExceptions() {
12160
12175
  const exceptions = [];
@@ -12162,14 +12177,17 @@ class CideCoreUserCreateComponent {
12162
12177
  // Iterate through all entity mappings
12163
12178
  this.entityMappings().forEach((mapping, mappingIndex) => {
12164
12179
  const menuRights = this.menuRightsMap()[mappingIndex.toString()] || [];
12180
+ const mappingWithExceptions = mapping;
12181
+ const existingExceptions = mappingWithExceptions.exceptions || [];
12165
12182
  menuRights.forEach((menu) => {
12166
12183
  if (menu._permissionValues) {
12167
12184
  Object.keys(menu._permissionValues).forEach(permissionId => {
12168
12185
  const permissionData = menu?._permissionValues?.[permissionId] || {};
12186
+ // Find existing exception for this menu/permission combination
12187
+ const existingException = this.findExistingException(this.userId() || '', mapping._id || '', permissionId, menu._id || '');
12169
12188
  // Check if permission was modified (different from actual role permission)
12170
12189
  if (permissionData.modified !== permissionData.actual) {
12171
- // Check if exception already exists from GET by ID response
12172
- const existingException = this.findExistingException(this.userId() || '', mapping._id || '', permissionId, menu._id || '');
12190
+ // Create or update exception
12173
12191
  const exception = {
12174
12192
  _id: existingException?._id || '', // Use existing _id if found, otherwise empty for new exception
12175
12193
  syusrex_user_id_user: this.userId() || '',
@@ -12181,12 +12199,32 @@ class CideCoreUserCreateComponent {
12181
12199
  syusrex_status: permissionData.modified // Status reflects the checkbox state (true = checked, false = unchecked)
12182
12200
  };
12183
12201
  exceptions.push(exception);
12184
- console.log(`🎭 Exception created for mapping ${mappingIndex}, menu ${menu.syme_title}, permission ${permissionData.permission.sygms_title}:`, {
12202
+ console.log(`🎭 Exception created/updated for mapping ${mappingIndex}, menu ${menu.syme_title}, permission ${permissionData.permission?.sygms_title}:`, {
12185
12203
  actual: permissionData.actual,
12186
12204
  modified: permissionData.modified,
12187
12205
  exception: exception
12188
12206
  });
12189
12207
  }
12208
+ else if (existingException && existingException._id) {
12209
+ // Modified === actual, but exception exists in DB - mark for deletion
12210
+ const exceptionToDelete = {
12211
+ _id: existingException._id,
12212
+ syusrex_user_id_user: this.userId() || '',
12213
+ syusrex_user_entity_mapping_id_syenm: mapping._id || '',
12214
+ syusrex_role_id_syusrol: mapping.syenm_role_id_syusrol?._id || '',
12215
+ syusrex_role_permissions_id_sygms: permissionId,
12216
+ syusrex_menu_id_syme: menu._id || '',
12217
+ syusrex_isactive: true,
12218
+ syusrex_status: false, // Not used for deletion, but required by type
12219
+ isDelete: true
12220
+ };
12221
+ exceptions.push(exceptionToDelete);
12222
+ console.log(`🗑️ Exception marked for deletion (modified === actual) for mapping ${mappingIndex}, menu ${menu.syme_title}, permission ${permissionData.permission?.sygms_title}:`, {
12223
+ actual: permissionData.actual,
12224
+ modified: permissionData.modified,
12225
+ exceptionId: existingException._id
12226
+ });
12227
+ }
12190
12228
  });
12191
12229
  }
12192
12230
  });
@@ -15111,9 +15149,81 @@ class CideCoreUserCreateComponent {
15111
15149
  },
15112
15150
  error: (error) => {
15113
15151
  console.error('❌ Error saving user master:', error);
15114
- this.notificationService.error('Failed to save user. Please try again.', {
15115
- title: 'Save Failed',
15116
- duration: 5000
15152
+ // Extract error message from API response
15153
+ let errorMessage = 'Failed to save user. Please try again.';
15154
+ let errorTitle = 'Save Failed';
15155
+ let duplicateField = null;
15156
+ // Check if error has a response with message (handle both error.error and direct error)
15157
+ const apiError = error?.error || error;
15158
+ if (apiError?.message) {
15159
+ errorMessage = apiError.message;
15160
+ errorTitle = 'Validation Error';
15161
+ // Check if it's a duplicate key error
15162
+ if (apiError?.data?.errorCode === 'DUPLICATE_KEY_ERROR' ||
15163
+ apiError?.code === 409 ||
15164
+ error?.status === 409 ||
15165
+ errorMessage.toLowerCase().includes('already') ||
15166
+ errorMessage.toLowerCase().includes('duplicate') ||
15167
+ errorMessage.toLowerCase().includes('registered') ||
15168
+ errorMessage.toLowerCase().includes('taken')) {
15169
+ errorTitle = 'Duplicate Entry';
15170
+ // Get duplicate field from error data
15171
+ duplicateField = apiError?.data?.duplicateField || null;
15172
+ // Set form field error for the duplicate field
15173
+ if (duplicateField) {
15174
+ const fieldName = duplicateField.toLowerCase().replace(/\s+/g, '_');
15175
+ if (fieldName === 'email_id' || fieldName === 'emailid') {
15176
+ const emailControl = this.userMasterForm.get('user_emailid');
15177
+ if (emailControl) {
15178
+ emailControl.setErrors({
15179
+ duplicate: true,
15180
+ message: errorMessage
15181
+ });
15182
+ emailControl.markAsTouched();
15183
+ }
15184
+ }
15185
+ else if (fieldName === 'username') {
15186
+ const usernameControl = this.userMasterForm.get('user_username');
15187
+ if (usernameControl) {
15188
+ usernameControl.setErrors({
15189
+ duplicate: true,
15190
+ message: errorMessage
15191
+ });
15192
+ usernameControl.markAsTouched();
15193
+ }
15194
+ }
15195
+ else if (fieldName === 'mobile_number' || fieldName === 'mobileno') {
15196
+ const mobileControl = this.userMasterForm.get('user_mobileno');
15197
+ if (mobileControl) {
15198
+ mobileControl.setErrors({
15199
+ duplicate: true,
15200
+ message: errorMessage
15201
+ });
15202
+ mobileControl.markAsTouched();
15203
+ }
15204
+ }
15205
+ }
15206
+ }
15207
+ }
15208
+ else if (error?.message) {
15209
+ errorMessage = error.message;
15210
+ }
15211
+ else if (error?.status === 409) {
15212
+ errorMessage = 'A user with this information already exists. Please check and modify the duplicate field.';
15213
+ errorTitle = 'Duplicate Entry';
15214
+ }
15215
+ else if (error?.status === 400) {
15216
+ errorMessage = 'Invalid data provided. Please check your input.';
15217
+ errorTitle = 'Validation Error';
15218
+ }
15219
+ else if (error?.status === 500) {
15220
+ errorMessage = 'Server error occurred. Please try again later.';
15221
+ errorTitle = 'Server Error';
15222
+ }
15223
+ // Show error notification with the extracted message
15224
+ this.notificationService.error(errorMessage, {
15225
+ title: errorTitle,
15226
+ duration: 7000 // Longer duration for important errors
15117
15227
  });
15118
15228
  this.loading.set(false);
15119
15229
  }