@memberjunction/ng-core-entity-forms 2.70.0 → 2.71.0

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 (64) hide show
  1. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +65 -0
  2. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -0
  3. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +578 -0
  4. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -0
  5. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.d.ts +1 -0
  6. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.d.ts.map +1 -0
  7. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +282 -0
  8. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -0
  9. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +58 -0
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -0
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +400 -0
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -0
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +119 -23
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1815 -924
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +159 -0
  18. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -0
  19. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +315 -0
  20. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -0
  21. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +67 -0
  22. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -0
  23. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +463 -0
  24. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -0
  25. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +82 -0
  26. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -0
  27. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +708 -0
  28. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -0
  29. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
  30. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -0
  31. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -0
  32. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +379 -0
  33. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -0
  34. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +58 -0
  35. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -0
  36. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +373 -0
  37. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -0
  38. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +61 -0
  39. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -0
  40. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +459 -0
  41. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -0
  42. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +90 -10
  43. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  44. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +1159 -687
  45. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  46. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +27 -0
  47. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -0
  48. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +88 -0
  49. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -0
  50. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +69 -0
  51. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -0
  52. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +442 -0
  53. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -0
  54. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
  55. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  56. package/dist/lib/custom/custom-forms.module.d.ts +40 -33
  57. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  58. package/dist/lib/custom/custom-forms.module.js +26 -2
  59. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  60. package/dist/lib/shared/components/template-editor.component.d.ts +8 -2
  61. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  62. package/dist/lib/shared/components/template-editor.component.js +58 -23
  63. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  64. package/package.json +16 -16
@@ -0,0 +1,578 @@
1
+ import { Component } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { Subject, BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, takeUntil, startWith } from 'rxjs';
4
+ import { RunView } from '@memberjunction/core';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@progress/kendo-angular-dialog";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "@progress/kendo-angular-inputs";
9
+ import * as i4 from "@progress/kendo-angular-buttons";
10
+ import * as i5 from "@angular/common";
11
+ const _forTrack0 = ($index, $item) => $item.id;
12
+ const _forTrack1 = ($index, $item) => $item.ID;
13
+ function AddActionDialogComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
14
+ i0.ɵɵelement(0, "i", 27);
15
+ } }
16
+ function AddActionDialogComponent_For_24_Template(rf, ctx) { if (rf & 1) {
17
+ const _r1 = i0.ɵɵgetCurrentView();
18
+ i0.ɵɵelementStart(0, "div", 28);
19
+ i0.ɵɵpipe(1, "async");
20
+ i0.ɵɵlistener("click", function AddActionDialogComponent_For_24_Template_div_click_0_listener() { const category_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectCategory(category_r2.id)); });
21
+ i0.ɵɵelement(2, "i");
22
+ i0.ɵɵelementStart(3, "span", 29);
23
+ i0.ɵɵtext(4);
24
+ i0.ɵɵelementEnd();
25
+ i0.ɵɵelementStart(5, "span", 30);
26
+ i0.ɵɵtext(6);
27
+ i0.ɵɵelementEnd()();
28
+ } if (rf & 2) {
29
+ const category_r2 = ctx.$implicit;
30
+ const ctx_r2 = i0.ɵɵnextContext();
31
+ i0.ɵɵclassProp("selected", i0.ɵɵpipeBind1(1, 7, ctx_r2.selectedCategoryId$) === category_r2.id);
32
+ i0.ɵɵadvance(2);
33
+ i0.ɵɵclassMapInterpolate1("fa-solid ", category_r2.icon, " category-icon");
34
+ i0.ɵɵadvance(2);
35
+ i0.ɵɵtextInterpolate(category_r2.name);
36
+ i0.ɵɵadvance(2);
37
+ i0.ɵɵtextInterpolate(category_r2.count);
38
+ } }
39
+ function AddActionDialogComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 31);
41
+ i0.ɵɵelement(2, "i", 32);
42
+ i0.ɵɵelementEnd();
43
+ i0.ɵɵelementStart(3, "p");
44
+ i0.ɵɵtext(4, "Loading actions...");
45
+ i0.ɵɵelementEnd()();
46
+ } }
47
+ function AddActionDialogComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
48
+ const _r4 = i0.ɵɵgetCurrentView();
49
+ i0.ɵɵelementStart(0, "div", 19);
50
+ i0.ɵɵelement(1, "i", 33);
51
+ i0.ɵɵelementStart(2, "h3");
52
+ i0.ɵɵtext(3, "No actions found");
53
+ i0.ɵɵelementEnd();
54
+ i0.ɵɵelementStart(4, "p");
55
+ i0.ɵɵtext(5, "Try adjusting your search criteria or selecting a different category");
56
+ i0.ɵɵelementEnd();
57
+ i0.ɵɵelementStart(6, "button", 34);
58
+ i0.ɵɵlistener("click", function AddActionDialogComponent_Conditional_29_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearSearch()); });
59
+ i0.ɵɵtext(7, "Clear Search");
60
+ i0.ɵɵelementEnd()();
61
+ } }
62
+ function AddActionDialogComponent_Conditional_31_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
63
+ i0.ɵɵelementStart(0, "div", 43);
64
+ i0.ɵɵelement(1, "i", 46);
65
+ i0.ɵɵtext(2);
66
+ i0.ɵɵelementEnd();
67
+ } if (rf & 2) {
68
+ const action_r6 = i0.ɵɵnextContext().$implicit;
69
+ i0.ɵɵadvance(2);
70
+ i0.ɵɵtextInterpolate1(" ", action_r6.categoryName, " ");
71
+ } }
72
+ function AddActionDialogComponent_Conditional_31_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵelementStart(0, "div", 44);
74
+ i0.ɵɵelement(1, "i", 47);
75
+ i0.ɵɵtext(2);
76
+ i0.ɵɵelementEnd();
77
+ } if (rf & 2) {
78
+ const action_r6 = i0.ɵɵnextContext().$implicit;
79
+ i0.ɵɵadvance(2);
80
+ i0.ɵɵtextInterpolate1(" ", action_r6.Type, " ");
81
+ } }
82
+ function AddActionDialogComponent_Conditional_31_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
83
+ i0.ɵɵelementStart(0, "div", 45);
84
+ i0.ɵɵelement(1, "i", 48);
85
+ i0.ɵɵelementStart(2, "span");
86
+ i0.ɵɵtext(3, "Already Added");
87
+ i0.ɵɵelementEnd()();
88
+ } }
89
+ function AddActionDialogComponent_Conditional_31_For_2_Template(rf, ctx) { if (rf & 1) {
90
+ const _r5 = i0.ɵɵgetCurrentView();
91
+ i0.ɵɵelementStart(0, "div", 36);
92
+ i0.ɵɵlistener("click", function AddActionDialogComponent_Conditional_31_For_2_Template_div_click_0_listener() { const action_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleActionSelection(action_r6)); });
93
+ i0.ɵɵelementStart(1, "div", 37);
94
+ i0.ɵɵelement(2, "i", 7);
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵelementStart(3, "div", 38)(4, "div", 39);
97
+ i0.ɵɵelement(5, "i");
98
+ i0.ɵɵelementEnd();
99
+ i0.ɵɵelementStart(6, "h3", 40);
100
+ i0.ɵɵtext(7);
101
+ i0.ɵɵelementEnd()();
102
+ i0.ɵɵelementStart(8, "div", 41)(9, "p", 42);
103
+ i0.ɵɵtext(10);
104
+ i0.ɵɵelementEnd();
105
+ i0.ɵɵtemplate(11, AddActionDialogComponent_Conditional_31_For_2_Conditional_11_Template, 3, 1, "div", 43)(12, AddActionDialogComponent_Conditional_31_For_2_Conditional_12_Template, 3, 1, "div", 44);
106
+ i0.ɵɵelementEnd();
107
+ i0.ɵɵtemplate(13, AddActionDialogComponent_Conditional_31_For_2_Conditional_13_Template, 4, 0, "div", 45);
108
+ i0.ɵɵelementEnd();
109
+ } if (rf & 2) {
110
+ const action_r6 = ctx.$implicit;
111
+ const ctx_r2 = i0.ɵɵnextContext(2);
112
+ i0.ɵɵclassProp("selected", action_r6.selected)("existing", ctx_r2.existingActionIds.includes(action_r6.ID));
113
+ i0.ɵɵadvance(2);
114
+ i0.ɵɵclassProp("fa-check-circle", action_r6.selected)("fa-circle", !action_r6.selected);
115
+ i0.ɵɵadvance(3);
116
+ i0.ɵɵclassMapInterpolate1("fa-solid ", ctx_r2.getActionIcon(action_r6), "");
117
+ i0.ɵɵadvance(2);
118
+ i0.ɵɵtextInterpolate(action_r6.Name);
119
+ i0.ɵɵadvance(3);
120
+ i0.ɵɵtextInterpolate(action_r6.Description || "No description available");
121
+ i0.ɵɵadvance();
122
+ i0.ɵɵconditional(action_r6.categoryName ? 11 : -1);
123
+ i0.ɵɵadvance();
124
+ i0.ɵɵconditional(action_r6.Type ? 12 : -1);
125
+ i0.ɵɵadvance();
126
+ i0.ɵɵconditional(ctx_r2.existingActionIds.includes(action_r6.ID) ? 13 : -1);
127
+ } }
128
+ function AddActionDialogComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelementStart(0, "div", 20);
130
+ i0.ɵɵrepeaterCreate(1, AddActionDialogComponent_Conditional_31_For_2_Template, 14, 16, "div", 35, _forTrack1);
131
+ i0.ɵɵpipe(3, "async");
132
+ i0.ɵɵelementEnd();
133
+ } if (rf & 2) {
134
+ const ctx_r2 = i0.ɵɵnextContext();
135
+ i0.ɵɵadvance();
136
+ i0.ɵɵrepeater(i0.ɵɵpipeBind1(3, 0, ctx_r2.filteredActions$));
137
+ } }
138
+ function AddActionDialogComponent_Conditional_34_For_14_Conditional_13_Template(rf, ctx) { if (rf & 1) {
139
+ i0.ɵɵelementStart(0, "span", 58);
140
+ i0.ɵɵelement(1, "i", 48);
141
+ i0.ɵɵtext(2, " Added ");
142
+ i0.ɵɵelementEnd();
143
+ } }
144
+ function AddActionDialogComponent_Conditional_34_For_14_Conditional_14_Template(rf, ctx) { if (rf & 1) {
145
+ i0.ɵɵelementStart(0, "span", 59);
146
+ i0.ɵɵelement(1, "i", 26);
147
+ i0.ɵɵtext(2, " Available ");
148
+ i0.ɵɵelementEnd();
149
+ } }
150
+ function AddActionDialogComponent_Conditional_34_For_14_Template(rf, ctx) { if (rf & 1) {
151
+ const _r7 = i0.ɵɵgetCurrentView();
152
+ i0.ɵɵelementStart(0, "div", 57);
153
+ i0.ɵɵlistener("click", function AddActionDialogComponent_Conditional_34_For_14_Template_div_click_0_listener() { const action_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleActionSelection(action_r8)); });
154
+ i0.ɵɵelementStart(1, "span", 50);
155
+ i0.ɵɵelement(2, "i", 7);
156
+ i0.ɵɵelementEnd();
157
+ i0.ɵɵelementStart(3, "span", 51);
158
+ i0.ɵɵelement(4, "i");
159
+ i0.ɵɵtext(5);
160
+ i0.ɵɵelementEnd();
161
+ i0.ɵɵelementStart(6, "span", 52);
162
+ i0.ɵɵtext(7);
163
+ i0.ɵɵelementEnd();
164
+ i0.ɵɵelementStart(8, "span", 53);
165
+ i0.ɵɵtext(9);
166
+ i0.ɵɵelementEnd();
167
+ i0.ɵɵelementStart(10, "span", 54);
168
+ i0.ɵɵtext(11);
169
+ i0.ɵɵelementEnd();
170
+ i0.ɵɵelementStart(12, "span", 55);
171
+ i0.ɵɵtemplate(13, AddActionDialogComponent_Conditional_34_For_14_Conditional_13_Template, 3, 0, "span", 58)(14, AddActionDialogComponent_Conditional_34_For_14_Conditional_14_Template, 3, 0, "span", 59);
172
+ i0.ɵɵelementEnd()();
173
+ } if (rf & 2) {
174
+ const action_r8 = ctx.$implicit;
175
+ const ctx_r2 = i0.ɵɵnextContext(2);
176
+ i0.ɵɵclassProp("selected", action_r8.selected)("existing", ctx_r2.existingActionIds.includes(action_r8.ID));
177
+ i0.ɵɵadvance(2);
178
+ i0.ɵɵclassProp("fa-check-circle", action_r8.selected)("fa-circle", !action_r8.selected);
179
+ i0.ɵɵadvance(2);
180
+ i0.ɵɵclassMapInterpolate1("fa-solid ", ctx_r2.getActionIcon(action_r8), " action-icon");
181
+ i0.ɵɵadvance();
182
+ i0.ɵɵtextInterpolate1(" ", action_r8.Name, " ");
183
+ i0.ɵɵadvance(2);
184
+ i0.ɵɵtextInterpolate(action_r8.categoryName || "-");
185
+ i0.ɵɵadvance(2);
186
+ i0.ɵɵtextInterpolate(action_r8.Type || "-");
187
+ i0.ɵɵadvance(2);
188
+ i0.ɵɵtextInterpolate(action_r8.Description || "-");
189
+ i0.ɵɵadvance(2);
190
+ i0.ɵɵconditional(ctx_r2.existingActionIds.includes(action_r8.ID) ? 13 : 14);
191
+ } }
192
+ function AddActionDialogComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
193
+ i0.ɵɵelementStart(0, "div", 21)(1, "div", 49);
194
+ i0.ɵɵelement(2, "span", 50);
195
+ i0.ɵɵelementStart(3, "span", 51);
196
+ i0.ɵɵtext(4, "Name");
197
+ i0.ɵɵelementEnd();
198
+ i0.ɵɵelementStart(5, "span", 52);
199
+ i0.ɵɵtext(6, "Category");
200
+ i0.ɵɵelementEnd();
201
+ i0.ɵɵelementStart(7, "span", 53);
202
+ i0.ɵɵtext(8, "Type");
203
+ i0.ɵɵelementEnd();
204
+ i0.ɵɵelementStart(9, "span", 54);
205
+ i0.ɵɵtext(10, "Description");
206
+ i0.ɵɵelementEnd();
207
+ i0.ɵɵelementStart(11, "span", 55);
208
+ i0.ɵɵtext(12, "Status");
209
+ i0.ɵɵelementEnd()();
210
+ i0.ɵɵrepeaterCreate(13, AddActionDialogComponent_Conditional_34_For_14_Template, 15, 16, "div", 56, _forTrack1);
211
+ i0.ɵɵpipe(15, "async");
212
+ i0.ɵɵelementEnd();
213
+ } if (rf & 2) {
214
+ const ctx_r2 = i0.ɵɵnextContext();
215
+ i0.ɵɵadvance(13);
216
+ i0.ɵɵrepeater(i0.ɵɵpipeBind1(15, 0, ctx_r2.filteredActions$));
217
+ } }
218
+ function AddActionDialogComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
219
+ i0.ɵɵelementStart(0, "div", 22)(1, "div", 60);
220
+ i0.ɵɵelement(2, "i", 61);
221
+ i0.ɵɵelementStart(3, "span");
222
+ i0.ɵɵtext(4);
223
+ i0.ɵɵelementEnd()()();
224
+ } if (rf & 2) {
225
+ const ctx_r2 = i0.ɵɵnextContext();
226
+ i0.ɵɵadvance(4);
227
+ i0.ɵɵtextInterpolate2("", ctx_r2.selectedCount, " action", ctx_r2.selectedCount === 1 ? "" : "s", " selected");
228
+ } }
229
+ /**
230
+ * Modern, clean dialog for selecting actions to add to an AI Agent.
231
+ * Features searchable action list, category filtering, and multi-select capability.
232
+ */
233
+ export class AddActionDialogComponent {
234
+ // Computed values
235
+ get selectedCount() {
236
+ return this.selectedActions$.value.size;
237
+ }
238
+ get totalActionCount() {
239
+ return this.allActions$.value.length;
240
+ }
241
+ get filteredCount() {
242
+ return this.filteredActions$.value.length;
243
+ }
244
+ constructor(dialogRef, cdr) {
245
+ this.dialogRef = dialogRef;
246
+ this.cdr = cdr;
247
+ // Input properties set by service
248
+ this.agentId = '';
249
+ this.agentName = '';
250
+ this.existingActionIds = [];
251
+ // Reactive state management
252
+ this.destroy$ = new Subject();
253
+ this.result = new Subject();
254
+ // Data streams
255
+ this.allActions$ = new BehaviorSubject([]);
256
+ this.categories$ = new BehaviorSubject([]);
257
+ this.filteredActions$ = new BehaviorSubject([]);
258
+ this.categoryTree$ = new BehaviorSubject([]);
259
+ this.selectedActions$ = new BehaviorSubject(new Set());
260
+ this.isLoading$ = new BehaviorSubject(false);
261
+ // UI state
262
+ this.searchControl = new FormControl('');
263
+ this.selectedCategoryId$ = new BehaviorSubject('all');
264
+ this.viewMode$ = new BehaviorSubject('grid');
265
+ this.expandedCategories = new Set();
266
+ }
267
+ ngOnInit() {
268
+ this.initializeData();
269
+ this.setupFiltering();
270
+ this.preselectExistingActions();
271
+ }
272
+ ngOnDestroy() {
273
+ this.destroy$.next();
274
+ this.destroy$.complete();
275
+ }
276
+ async initializeData() {
277
+ this.isLoading$.next(true);
278
+ try {
279
+ await this.loadActionsAndCategories();
280
+ this.buildCategoryTree();
281
+ }
282
+ catch (error) {
283
+ console.error('Error loading dialog data:', error);
284
+ }
285
+ finally {
286
+ this.isLoading$.next(false);
287
+ }
288
+ }
289
+ async loadActionsAndCategories() {
290
+ const rv = new RunView();
291
+ const [actionsResult, categoriesResult] = await rv.RunViews([
292
+ {
293
+ EntityName: 'Actions',
294
+ ExtraFilter: 'Status = \'Active\'',
295
+ OrderBy: 'Category, Name',
296
+ ResultType: 'entity_object',
297
+ MaxRows: 5000
298
+ },
299
+ {
300
+ EntityName: 'Action Categories',
301
+ ExtraFilter: 'Status = \'Active\'',
302
+ OrderBy: 'Name',
303
+ ResultType: 'entity_object',
304
+ MaxRows: 1000
305
+ }
306
+ ]);
307
+ if (actionsResult.Success) {
308
+ const actions = (actionsResult.Results || []).map(action => ({
309
+ ...action.GetAll(),
310
+ selected: false,
311
+ categoryName: action.Category || 'Uncategorized'
312
+ }));
313
+ this.allActions$.next(actions);
314
+ }
315
+ if (categoriesResult.Success) {
316
+ this.categories$.next(categoriesResult.Results || []);
317
+ }
318
+ }
319
+ buildCategoryTree() {
320
+ const actions = this.allActions$.value;
321
+ const categories = this.categories$.value;
322
+ // Count actions per category
323
+ const categoryCounts = new Map();
324
+ actions.forEach(action => {
325
+ const categoryName = action.categoryName || 'Uncategorized';
326
+ categoryCounts.set(categoryName, (categoryCounts.get(categoryName) || 0) + 1);
327
+ });
328
+ // Build tree nodes
329
+ const treeNodes = [
330
+ {
331
+ id: 'all',
332
+ name: 'All Actions',
333
+ count: actions.length,
334
+ icon: 'fa-th'
335
+ }
336
+ ];
337
+ // Add category nodes
338
+ categories.forEach(category => {
339
+ const count = categoryCounts.get(category.Name) || 0;
340
+ if (count > 0) {
341
+ treeNodes.push({
342
+ id: category.ID,
343
+ name: category.Name,
344
+ count,
345
+ icon: this.getCategoryIcon(category.Name)
346
+ });
347
+ }
348
+ });
349
+ // Add uncategorized if needed
350
+ const uncategorizedCount = categoryCounts.get('Uncategorized') || 0;
351
+ if (uncategorizedCount > 0) {
352
+ treeNodes.push({
353
+ id: 'uncategorized',
354
+ name: 'Uncategorized',
355
+ count: uncategorizedCount,
356
+ icon: 'fa-question-circle'
357
+ });
358
+ }
359
+ this.categoryTree$.next(treeNodes);
360
+ }
361
+ getCategoryIcon(categoryName) {
362
+ const iconMap = {
363
+ 'Data': 'fa-database',
364
+ 'Communication': 'fa-envelope',
365
+ 'Integration': 'fa-plug',
366
+ 'Security': 'fa-shield-alt',
367
+ 'Workflow': 'fa-project-diagram',
368
+ 'AI': 'fa-brain',
369
+ 'Files': 'fa-file-alt',
370
+ 'Utilities': 'fa-tools',
371
+ 'System': 'fa-cog',
372
+ 'Analytics': 'fa-chart-line'
373
+ };
374
+ return iconMap[categoryName] || 'fa-folder';
375
+ }
376
+ setupFiltering() {
377
+ combineLatest([
378
+ this.allActions$,
379
+ this.searchControl.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), startWith('') // Emit initial empty value
380
+ ),
381
+ this.selectedCategoryId$
382
+ ]).pipe(takeUntil(this.destroy$)).subscribe(([actions, searchTerm, categoryId]) => {
383
+ this.filterActions(actions, searchTerm || '', categoryId);
384
+ });
385
+ }
386
+ filterActions(actions, searchTerm, categoryId) {
387
+ let filtered = [...actions];
388
+ // Category filter
389
+ if (categoryId !== 'all') {
390
+ if (categoryId === 'uncategorized') {
391
+ filtered = filtered.filter(action => !action.Category);
392
+ }
393
+ else {
394
+ const categoryName = this.getCategoryNameById(categoryId);
395
+ filtered = filtered.filter(action => action.categoryName === categoryName);
396
+ }
397
+ }
398
+ // Search filter
399
+ if (searchTerm) {
400
+ const term = searchTerm.toLowerCase();
401
+ filtered = filtered.filter(action => action.Name.toLowerCase().includes(term) ||
402
+ (action.Description && action.Description.toLowerCase().includes(term)) ||
403
+ (action.categoryName && action.categoryName.toLowerCase().includes(term)));
404
+ }
405
+ this.filteredActions$.next(filtered);
406
+ }
407
+ getCategoryNameById(categoryId) {
408
+ const category = this.categories$.value.find(c => c.ID === categoryId);
409
+ return category?.Name || '';
410
+ }
411
+ preselectExistingActions() {
412
+ if (this.existingActionIds.length > 0) {
413
+ const selected = new Set(this.existingActionIds);
414
+ this.selectedActions$.next(selected);
415
+ // Update action selection state
416
+ const actions = this.allActions$.value;
417
+ actions.forEach(action => {
418
+ action.selected = selected.has(action.ID);
419
+ });
420
+ this.allActions$.next(actions);
421
+ }
422
+ }
423
+ // === UI Event Handlers ===
424
+ selectCategory(categoryId) {
425
+ this.selectedCategoryId$.next(categoryId);
426
+ }
427
+ toggleViewMode() {
428
+ const currentMode = this.viewMode$.value;
429
+ this.viewMode$.next(currentMode === 'grid' ? 'list' : 'grid');
430
+ }
431
+ toggleActionSelection(action) {
432
+ const selected = this.selectedActions$.value;
433
+ const actions = this.allActions$.value;
434
+ // Find the action and toggle its selection
435
+ const actionToUpdate = actions.find(a => a.ID === action.ID);
436
+ if (actionToUpdate) {
437
+ actionToUpdate.selected = !actionToUpdate.selected;
438
+ if (actionToUpdate.selected) {
439
+ selected.add(action.ID);
440
+ }
441
+ else {
442
+ selected.delete(action.ID);
443
+ }
444
+ this.selectedActions$.next(new Set(selected));
445
+ this.allActions$.next(actions);
446
+ // Update filtered actions to reflect selection state
447
+ const filtered = this.filteredActions$.value;
448
+ const filteredAction = filtered.find(a => a.ID === action.ID);
449
+ if (filteredAction) {
450
+ filteredAction.selected = actionToUpdate.selected;
451
+ this.filteredActions$.next(filtered);
452
+ }
453
+ }
454
+ }
455
+ clearSearch() {
456
+ this.searchControl.reset();
457
+ }
458
+ getActionIcon(action) {
459
+ // Return custom icon if set
460
+ if (action.IconClass) {
461
+ return action.IconClass;
462
+ }
463
+ // Fallback icon mapping based on action name/type
464
+ const name = action.Name.toLowerCase();
465
+ if (name.includes('create') || name.includes('add'))
466
+ return 'fa-plus-circle';
467
+ if (name.includes('update') || name.includes('edit'))
468
+ return 'fa-edit';
469
+ if (name.includes('delete') || name.includes('remove'))
470
+ return 'fa-trash';
471
+ if (name.includes('email') || name.includes('send'))
472
+ return 'fa-envelope';
473
+ if (name.includes('export'))
474
+ return 'fa-file-export';
475
+ if (name.includes('import'))
476
+ return 'fa-file-import';
477
+ if (name.includes('report'))
478
+ return 'fa-file-alt';
479
+ if (name.includes('api'))
480
+ return 'fa-plug';
481
+ return 'fa-bolt'; // Default action icon
482
+ }
483
+ // === Dialog Actions ===
484
+ cancel() {
485
+ this.result.next([]);
486
+ this.dialogRef.close();
487
+ }
488
+ addSelectedActions() {
489
+ const selectedIds = this.selectedActions$.value;
490
+ const allActions = this.allActions$.value;
491
+ // Get the selected action display items (excluding existing ones)
492
+ const selectedDisplayItems = allActions
493
+ .filter(action => selectedIds.has(action.ID) && !this.existingActionIds.includes(action.ID));
494
+ // Convert ActionDisplayItem to ActionEntity by casting (they have the same structure)
495
+ const selectedActions = selectedDisplayItems.map(item => item);
496
+ this.result.next(selectedActions);
497
+ this.dialogRef.close();
498
+ }
499
+ static { this.ɵfac = function AddActionDialogComponent_Factory(t) { return new (t || AddActionDialogComponent)(i0.ɵɵdirectiveInject(i1.DialogRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
500
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AddActionDialogComponent, selectors: [["mj-add-action-dialog"]], decls: 44, vars: 40, consts: [[1, "add-action-dialog"], [1, "dialog-header"], [1, "search-section"], ["placeholder", "Search actions by name, description, or category...", 1, "search-input", 3, "formControl", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "header-actions"], ["kendoButton", "", "size", "small", "kendoTooltip", "", 3, "click", "toggleable", "selected", "title"], [1, "fa-solid"], [1, "stats"], [1, "stat-item"], [1, "fa-solid", "fa-bolt"], [1, "dialog-content"], [1, "category-sidebar"], [1, "sidebar-header"], [1, "fa-solid", "fa-folder-tree"], [1, "category-list"], [1, "category-item", 3, "selected"], [1, "actions-container"], [1, "loading-state"], [1, "empty-state"], [1, "actions-grid"], [1, "actions-list"], [1, "selection-summary"], [1, "dialog-footer"], ["kendoButton", "", "look", "flat", 3, "click"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-search"], [1, "category-item", 3, "click"], [1, "category-name"], [1, "category-count"], [1, "loading-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-2x"], [1, "fa-solid", "fa-search-minus"], ["kendoButton", "", 3, "click"], [1, "action-card", 3, "selected", "existing"], [1, "action-card", 3, "click"], [1, "selection-indicator"], [1, "card-header"], [1, "action-icon"], [1, "action-name"], [1, "card-body"], [1, "action-description"], [1, "category-badge"], [1, "type-badge"], [1, "existing-overlay"], [1, "fa-solid", "fa-folder"], [1, "fa-solid", "fa-tag"], [1, "fa-solid", "fa-check"], [1, "list-header"], [1, "col-select"], [1, "col-name"], [1, "col-category"], [1, "col-type"], [1, "col-description"], [1, "col-status"], [1, "list-item", 3, "selected", "existing"], [1, "list-item", 3, "click"], [1, "status-badge", "existing"], [1, "status-badge", "available"], [1, "summary-content"], [1, "fa-solid", "fa-check-circle"]], template: function AddActionDialogComponent_Template(rf, ctx) { if (rf & 1) {
501
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "kendo-textbox", 3);
502
+ i0.ɵɵtemplate(4, AddActionDialogComponent_ng_template_4_Template, 1, 0, "ng-template", 4);
503
+ i0.ɵɵelementEnd()();
504
+ i0.ɵɵelementStart(5, "div", 5)(6, "button", 6);
505
+ i0.ɵɵpipe(7, "async");
506
+ i0.ɵɵpipe(8, "async");
507
+ i0.ɵɵlistener("click", function AddActionDialogComponent_Template_button_click_6_listener() { return ctx.toggleViewMode(); });
508
+ i0.ɵɵelement(9, "i", 7);
509
+ i0.ɵɵpipe(10, "async");
510
+ i0.ɵɵpipe(11, "async");
511
+ i0.ɵɵelementEnd();
512
+ i0.ɵɵelementStart(12, "div", 8)(13, "span", 9);
513
+ i0.ɵɵelement(14, "i", 10);
514
+ i0.ɵɵtext(15);
515
+ i0.ɵɵelementEnd()()()();
516
+ i0.ɵɵelementStart(16, "div", 11)(17, "div", 12)(18, "div", 13)(19, "h4");
517
+ i0.ɵɵelement(20, "i", 14);
518
+ i0.ɵɵtext(21, " Categories");
519
+ i0.ɵɵelementEnd()();
520
+ i0.ɵɵelementStart(22, "div", 15);
521
+ i0.ɵɵrepeaterCreate(23, AddActionDialogComponent_For_24_Template, 7, 9, "div", 16, _forTrack0);
522
+ i0.ɵɵpipe(25, "async");
523
+ i0.ɵɵelementEnd()();
524
+ i0.ɵɵelementStart(26, "div", 17);
525
+ i0.ɵɵtemplate(27, AddActionDialogComponent_Conditional_27_Template, 5, 0, "div", 18);
526
+ i0.ɵɵpipe(28, "async");
527
+ i0.ɵɵtemplate(29, AddActionDialogComponent_Conditional_29_Template, 8, 0, "div", 19);
528
+ i0.ɵɵpipe(30, "async");
529
+ i0.ɵɵtemplate(31, AddActionDialogComponent_Conditional_31_Template, 4, 2, "div", 20);
530
+ i0.ɵɵpipe(32, "async");
531
+ i0.ɵɵpipe(33, "async");
532
+ i0.ɵɵtemplate(34, AddActionDialogComponent_Conditional_34_Template, 16, 2, "div", 21);
533
+ i0.ɵɵpipe(35, "async");
534
+ i0.ɵɵpipe(36, "async");
535
+ i0.ɵɵelementEnd()();
536
+ i0.ɵɵtemplate(37, AddActionDialogComponent_Conditional_37_Template, 5, 2, "div", 22);
537
+ i0.ɵɵelementStart(38, "div", 23)(39, "button", 24);
538
+ i0.ɵɵlistener("click", function AddActionDialogComponent_Template_button_click_39_listener() { return ctx.cancel(); });
539
+ i0.ɵɵtext(40, " Cancel ");
540
+ i0.ɵɵelementEnd();
541
+ i0.ɵɵelementStart(41, "button", 25);
542
+ i0.ɵɵlistener("click", function AddActionDialogComponent_Template_button_click_41_listener() { return ctx.addSelectedActions(); });
543
+ i0.ɵɵelement(42, "i", 26);
544
+ i0.ɵɵtext(43);
545
+ i0.ɵɵelementEnd()()();
546
+ } if (rf & 2) {
547
+ i0.ɵɵadvance(3);
548
+ i0.ɵɵproperty("formControl", ctx.searchControl)("clearButton", true);
549
+ i0.ɵɵadvance(3);
550
+ i0.ɵɵproperty("toggleable", true)("selected", i0.ɵɵpipeBind1(7, 18, ctx.viewMode$) === "grid")("title", i0.ɵɵpipeBind1(8, 20, ctx.viewMode$) === "grid" ? "Switch to list view" : "Switch to grid view");
551
+ i0.ɵɵadvance(3);
552
+ i0.ɵɵclassProp("fa-th", i0.ɵɵpipeBind1(10, 22, ctx.viewMode$) === "grid")("fa-list", i0.ɵɵpipeBind1(11, 24, ctx.viewMode$) === "list");
553
+ i0.ɵɵadvance(6);
554
+ i0.ɵɵtextInterpolate2(" ", ctx.filteredCount, " of ", ctx.totalActionCount, " actions ");
555
+ i0.ɵɵadvance(8);
556
+ i0.ɵɵrepeater(i0.ɵɵpipeBind1(25, 26, ctx.categoryTree$));
557
+ i0.ɵɵadvance(4);
558
+ i0.ɵɵconditional(i0.ɵɵpipeBind1(28, 28, ctx.isLoading$) ? 27 : -1);
559
+ i0.ɵɵadvance(2);
560
+ i0.ɵɵconditional(!i0.ɵɵpipeBind1(30, 30, ctx.isLoading$) && ctx.filteredCount === 0 ? 29 : -1);
561
+ i0.ɵɵadvance(2);
562
+ i0.ɵɵconditional(!i0.ɵɵpipeBind1(32, 32, ctx.isLoading$) && i0.ɵɵpipeBind1(33, 34, ctx.viewMode$) === "grid" && ctx.filteredCount > 0 ? 31 : -1);
563
+ i0.ɵɵadvance(3);
564
+ i0.ɵɵconditional(!i0.ɵɵpipeBind1(35, 36, ctx.isLoading$) && i0.ɵɵpipeBind1(36, 38, ctx.viewMode$) === "list" && ctx.filteredCount > 0 ? 34 : -1);
565
+ i0.ɵɵadvance(3);
566
+ i0.ɵɵconditional(ctx.selectedCount > 0 ? 37 : -1);
567
+ i0.ɵɵadvance(4);
568
+ i0.ɵɵproperty("disabled", ctx.selectedCount === 0);
569
+ i0.ɵɵadvance(2);
570
+ i0.ɵɵtextInterpolate1(" Add Selected (", ctx.selectedCount, ") ");
571
+ } }, dependencies: [i2.NgControlStatus, i2.FormControlDirective, i3.TextBoxComponent, i3.TextBoxPrefixTemplateDirective, i4.ButtonComponent, i5.AsyncPipe], styles: [".add-action-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .search-section[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .search-section[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 400px;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] .stats[_ngcontent-%COMP%] .stat-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #6c757d;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] .stats[_ngcontent-%COMP%] .stat-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] {\n width: 250px;\n background: #f8f9fa;\n border-right: 1px solid #e0e0e0;\n overflow-y: auto;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] {\n padding: 1rem;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 1rem;\n font-weight: 600;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n color: #6c757d;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-left-color: #2196f3;\n color: #1976d2;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] .category-icon[_ngcontent-%COMP%] {\n color: #1976d2;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-icon[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n margin-right: 0.75rem;\n color: #6c757d;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-count[_ngcontent-%COMP%] {\n background: #dee2e6;\n color: #495057;\n padding: 0.25rem 0.5rem;\n border-radius: 12px;\n font-size: 0.8rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] .category-count[_ngcontent-%COMP%] {\n background: #bbdefb;\n color: #1976d2;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] {\n flex: 1;\n padding: 1.5rem;\n overflow-y: auto;\n background: white;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: #6c757d;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] .loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] .loading-spinner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: #6c757d;\n text-align: center;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3rem;\n margin-bottom: 1rem;\n color: #dee2e6;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem 0;\n color: #495057;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 1.5rem 0;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] {\n position: relative;\n background: white;\n border: 2px solid #e0e0e0;\n border-radius: 8px;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%]:hover {\n border-color: #2196f3;\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.15);\n transform: translateY(-2px);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.selected[_ngcontent-%COMP%] {\n border-color: #28a745;\n background: #f8fff9;\n box-shadow: 0 4px 12px rgba(40, 167, 69, 0.15);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.selected[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.existing[_ngcontent-%COMP%] {\n border-color: #6c757d;\n background: #f8f9fa;\n cursor: default;\n opacity: 0.7;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.existing[_ngcontent-%COMP%]:hover {\n transform: none;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] {\n position: absolute;\n top: 1rem;\n right: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: #dee2e6;\n transition: color 0.2s ease;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-bottom: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n background: #e3f2fd;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: #1976d2;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: #212529;\n line-height: 1.2;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .action-description[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n color: #6c757d;\n line-height: 1.4;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .category-badge[_ngcontent-%COMP%], \n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n background: #f8f9fa;\n color: #495057;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n margin-right: 0.5rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .category-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] {\n background: #fff3cd;\n color: #856404;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(108, 117, 125, 0.9);\n color: white;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n background: #f8f9fa;\n border-radius: 6px;\n font-weight: 600;\n color: #495057;\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n margin-bottom: 0.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n align-items: center;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #2196f3;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.selected[_ngcontent-%COMP%] {\n background: #f8fff9;\n border-color: #28a745;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.selected[_ngcontent-%COMP%] .col-select[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.existing[_ngcontent-%COMP%] {\n background: #f8f9fa;\n opacity: 0.7;\n cursor: default;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.existing[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #e0e0e0;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-select[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: #dee2e6;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-name[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] {\n color: #1976d2;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge.existing[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge.available[_ngcontent-%COMP%] {\n background: #d4edda;\n color: #155724;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: #d4edda;\n border-top: 1px solid #c3e6cb;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] .summary-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #155724;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] .summary-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid #e0e0e0;\n background: #f8f9fa;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] button[kendoButton][_ngcontent-%COMP%] {\n min-width: 120px;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] button[kendoButton][look=\"primary\"][_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n}\n\n\n\n@media (max-width: 768px) {\n .add-action-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] {\n width: 100%;\n max-height: 200px;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] {\n grid-template-columns: 40px 1fr 80px;\n gap: 0.5rem;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-category[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-type[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-category[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-type[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%] {\n display: none;\n }\n}"] }); }
572
+ }
573
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AddActionDialogComponent, [{
574
+ type: Component,
575
+ args: [{ selector: 'mj-add-action-dialog', template: "<!-- Add Action Dialog -->\n<div class=\"add-action-dialog\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <kendo-textbox \n [formControl]=\"searchControl\" \n placeholder=\"Search actions by name, description, or category...\"\n class=\"search-input\"\n [clearButton]=\"true\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n \n <div class=\"header-actions\">\n <!-- View Toggle -->\n <button kendoButton \n [toggleable]=\"true\" \n [selected]=\"(viewMode$ | async) === 'grid'\"\n (click)=\"toggleViewMode()\"\n size=\"small\"\n kendoTooltip\n [title]=\"(viewMode$ | async) === 'grid' ? 'Switch to list view' : 'Switch to grid view'\">\n <i class=\"fa-solid\" \n [class.fa-th]=\"(viewMode$ | async) === 'grid'\" \n [class.fa-list]=\"(viewMode$ | async) === 'list'\"></i>\n </button>\n \n <!-- Stats -->\n <div class=\"stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ filteredCount }} of {{ totalActionCount }} actions\n </span>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"dialog-content\">\n \n <!-- Category Sidebar -->\n <div class=\"category-sidebar\">\n <div class=\"sidebar-header\">\n <h4><i class=\"fa-solid fa-folder-tree\"></i> Categories</h4>\n </div>\n \n <div class=\"category-list\">\n @for (category of categoryTree$ | async; track category.id) {\n <div class=\"category-item\" \n [class.selected]=\"(selectedCategoryId$ | async) === category.id\"\n (click)=\"selectCategory(category.id)\">\n <i class=\"fa-solid {{ category.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ category.name }}</span>\n <span class=\"category-count\">{{ category.count }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Actions Display -->\n <div class=\"actions-container\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading actions...</p>\n </div>\n }\n\n <!-- Empty State -->\n @if (!(isLoading$ | async) && filteredCount === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search-minus\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search criteria or selecting a different category</p>\n <button kendoButton (click)=\"clearSearch()\">Clear Search</button>\n </div>\n }\n\n <!-- Grid View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'grid' && filteredCount > 0) {\n <div class=\"actions-grid\">\n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"action-card\" \n [class.selected]=\"action.selected\"\n [class.existing]=\"existingActionIds.includes(action.ID)\"\n (click)=\"toggleActionSelection(action)\">\n \n <!-- Selection Indicator -->\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" \n [class.fa-check-circle]=\"action.selected\" \n [class.fa-circle]=\"!action.selected\"></i>\n </div>\n \n <!-- Card Content -->\n <div class=\"card-header\">\n <div class=\"action-icon\">\n <i class=\"fa-solid {{ getActionIcon(action) }}\"></i>\n </div>\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n </div>\n \n <div class=\"card-body\">\n <p class=\"action-description\">{{ action.Description || 'No description available' }}</p>\n \n @if (action.categoryName) {\n <div class=\"category-badge\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ action.categoryName }}\n </div>\n }\n \n @if (action.Type) {\n <div class=\"type-badge\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ action.Type }}\n </div>\n }\n </div>\n \n <!-- Existing Action Overlay -->\n @if (existingActionIds.includes(action.ID)) {\n <div class=\"existing-overlay\">\n <i class=\"fa-solid fa-check\"></i>\n <span>Already Added</span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'list' && filteredCount > 0) {\n <div class=\"actions-list\">\n \n <!-- List Header -->\n <div class=\"list-header\">\n <span class=\"col-select\"></span>\n <span class=\"col-name\">Name</span>\n <span class=\"col-category\">Category</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-description\">Description</span>\n <span class=\"col-status\">Status</span>\n </div>\n \n <!-- List Items -->\n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"list-item\" \n [class.selected]=\"action.selected\"\n [class.existing]=\"existingActionIds.includes(action.ID)\"\n (click)=\"toggleActionSelection(action)\">\n \n <span class=\"col-select\">\n <i class=\"fa-solid\" \n [class.fa-check-circle]=\"action.selected\" \n [class.fa-circle]=\"!action.selected\"></i>\n </span>\n \n <span class=\"col-name\">\n <i class=\"fa-solid {{ getActionIcon(action) }} action-icon\"></i>\n {{ action.Name }}\n </span>\n \n <span class=\"col-category\">{{ action.categoryName || '-' }}</span>\n <span class=\"col-type\">{{ action.Type || '-' }}</span>\n <span class=\"col-description\">{{ action.Description || '-' }}</span>\n \n <span class=\"col-status\">\n @if (existingActionIds.includes(action.ID)) {\n <span class=\"status-badge existing\">\n <i class=\"fa-solid fa-check\"></i>\n Added\n </span>\n } @else {\n <span class=\"status-badge available\">\n <i class=\"fa-solid fa-plus\"></i>\n Available\n </span>\n }\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Selected Actions Summary -->\n @if (selectedCount > 0) {\n <div class=\"selection-summary\">\n <div class=\"summary-content\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ selectedCount }} action{{ selectedCount === 1 ? '' : 's' }} selected</span>\n </div>\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <button kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"primary\" \n [disabled]=\"selectedCount === 0\"\n (click)=\"addSelectedActions()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Selected ({{ selectedCount }})\n </button>\n </div>\n</div>", styles: [".add-action-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n/* === Dialog Header === */\n.add-action-dialog .dialog-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n}\n\n.add-action-dialog .dialog-header .search-section {\n flex: 1;\n}\n\n.add-action-dialog .dialog-header .search-section .search-input {\n width: 100%;\n max-width: 400px;\n}\n\n.add-action-dialog .dialog-header .header-actions {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.add-action-dialog .dialog-header .header-actions .stats .stat-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #6c757d;\n font-size: 0.9rem;\n}\n\n.add-action-dialog .dialog-header .header-actions .stats .stat-item i {\n color: #28a745;\n}\n\n/* === Main Content === */\n.add-action-dialog .dialog-content {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n/* === Category Sidebar === */\n.add-action-dialog .category-sidebar {\n width: 250px;\n background: #f8f9fa;\n border-right: 1px solid #e0e0e0;\n overflow-y: auto;\n}\n\n.add-action-dialog .category-sidebar .sidebar-header {\n padding: 1rem;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.add-action-dialog .category-sidebar .sidebar-header h4 {\n margin: 0;\n color: #495057;\n font-size: 1rem;\n font-weight: 600;\n}\n\n.add-action-dialog .category-sidebar .sidebar-header h4 i {\n margin-right: 0.5rem;\n color: #6c757d;\n}\n\n.add-action-dialog .category-sidebar .category-list {\n padding: 0.5rem 0;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item:hover {\n background: #e9ecef;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item.selected {\n background: #e3f2fd;\n border-left-color: #2196f3;\n color: #1976d2;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item.selected .category-icon {\n color: #1976d2;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-icon {\n width: 16px;\n text-align: center;\n margin-right: 0.75rem;\n color: #6c757d;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-name {\n flex: 1;\n font-weight: 500;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-count {\n background: #dee2e6;\n color: #495057;\n padding: 0.25rem 0.5rem;\n border-radius: 12px;\n font-size: 0.8rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item.selected .category-count {\n background: #bbdefb;\n color: #1976d2;\n}\n\n/* === Actions Container === */\n.add-action-dialog .actions-container {\n flex: 1;\n padding: 1.5rem;\n overflow-y: auto;\n background: white;\n}\n\n/* Loading State */\n.add-action-dialog .actions-container .loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: #6c757d;\n}\n\n.add-action-dialog .actions-container .loading-state .loading-spinner {\n margin-bottom: 1rem;\n}\n\n.add-action-dialog .actions-container .loading-state .loading-spinner i {\n color: #2196f3;\n}\n\n.add-action-dialog .actions-container .loading-state p {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n/* Empty State */\n.add-action-dialog .actions-container .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: #6c757d;\n text-align: center;\n}\n\n.add-action-dialog .actions-container .empty-state i {\n font-size: 3rem;\n margin-bottom: 1rem;\n color: #dee2e6;\n}\n\n.add-action-dialog .actions-container .empty-state h3 {\n margin: 0 0 0.5rem 0;\n color: #495057;\n}\n\n.add-action-dialog .actions-container .empty-state p {\n margin: 0 0 1.5rem 0;\n}\n\n/* === Grid View === */\n.add-action-dialog .actions-container .actions-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card {\n position: relative;\n background: white;\n border: 2px solid #e0e0e0;\n border-radius: 8px;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card:hover {\n border-color: #2196f3;\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.15);\n transform: translateY(-2px);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card.selected {\n border-color: #28a745;\n background: #f8fff9;\n box-shadow: 0 4px 12px rgba(40, 167, 69, 0.15);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card.selected .selection-indicator i {\n color: #28a745;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card.existing {\n border-color: #6c757d;\n background: #f8f9fa;\n cursor: default;\n opacity: 0.7;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card.existing:hover {\n transform: none;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .selection-indicator {\n position: absolute;\n top: 1rem;\n right: 1rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .selection-indicator i {\n font-size: 1.25rem;\n color: #dee2e6;\n transition: color 0.2s ease;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header {\n display: flex;\n align-items: center;\n margin-bottom: 1rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header .action-icon {\n width: 40px;\n height: 40px;\n background: #e3f2fd;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 1rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header .action-icon i {\n font-size: 1.25rem;\n color: #1976d2;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header .action-name {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: #212529;\n line-height: 1.2;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .action-description {\n margin: 0 0 1rem 0;\n color: #6c757d;\n line-height: 1.4;\n font-size: 0.9rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .category-badge,\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n background: #f8f9fa;\n color: #495057;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n margin-right: 0.5rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .category-badge i,\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge i {\n font-size: 0.7rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge {\n background: #fff3cd;\n color: #856404;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .existing-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(108, 117, 125, 0.9);\n color: white;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .existing-overlay i {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .existing-overlay span {\n font-weight: 600;\n}\n\n/* === List View === */\n.add-action-dialog .actions-container .actions-list .list-header {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n background: #f8f9fa;\n border-radius: 6px;\n font-weight: 600;\n color: #495057;\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n margin-bottom: 0.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n align-items: center;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item:hover {\n background: #f8f9fa;\n border-color: #2196f3;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.selected {\n background: #f8fff9;\n border-color: #28a745;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.selected .col-select i {\n color: #28a745;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.existing {\n background: #f8f9fa;\n opacity: 0.7;\n cursor: default;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.existing:hover {\n background: #f8f9fa;\n border-color: #e0e0e0;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-select i {\n font-size: 1.25rem;\n color: #dee2e6;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-name {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 500;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-name .action-icon {\n color: #1976d2;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-description {\n color: #6c757d;\n font-size: 0.9rem;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .status-badge.existing {\n background: #6c757d;\n color: white;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .status-badge.available {\n background: #d4edda;\n color: #155724;\n}\n\n/* === Selection Summary === */\n.add-action-dialog .selection-summary {\n padding: 1rem 1.5rem;\n background: #d4edda;\n border-top: 1px solid #c3e6cb;\n}\n\n.add-action-dialog .selection-summary .summary-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #155724;\n font-weight: 500;\n}\n\n.add-action-dialog .selection-summary .summary-content i {\n color: #28a745;\n}\n\n/* === Dialog Footer === */\n.add-action-dialog .dialog-footer {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid #e0e0e0;\n background: #f8f9fa;\n}\n\n.add-action-dialog .dialog-footer button[kendoButton] {\n min-width: 120px;\n}\n\n.add-action-dialog .dialog-footer button[kendoButton][look=\"primary\"] i {\n margin-right: 0.5rem;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .add-action-dialog .dialog-content {\n flex-direction: column;\n }\n\n .add-action-dialog .category-sidebar {\n width: 100%;\n max-height: 200px;\n }\n\n .add-action-dialog .actions-container .actions-grid {\n grid-template-columns: 1fr;\n }\n\n .add-action-dialog .actions-container .actions-list .list-header,\n .add-action-dialog .actions-container .actions-list .list-item {\n grid-template-columns: 40px 1fr 80px;\n gap: 0.5rem;\n }\n\n .add-action-dialog .actions-container .actions-list .list-header .col-category,\n .add-action-dialog .actions-container .actions-list .list-header .col-type,\n .add-action-dialog .actions-container .actions-list .list-header .col-description,\n .add-action-dialog .actions-container .actions-list .list-item .col-category,\n .add-action-dialog .actions-container .actions-list .list-item .col-type,\n .add-action-dialog .actions-container .actions-list .list-item .col-description {\n display: none;\n }\n}"] }]
576
+ }], () => [{ type: i1.DialogRef }, { type: i0.ChangeDetectorRef }], null); })();
577
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AddActionDialogComponent, { className: "AddActionDialogComponent", filePath: "src/lib/custom/AIAgents/add-action-dialog.component.ts", lineNumber: 31 }); })();
578
+ //# sourceMappingURL=add-action-dialog.component.js.map