@memberjunction/ng-dashboards 2.90.0 → 2.92.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.
@@ -3,107 +3,223 @@ import { RunView, LogError } from '@memberjunction/core';
3
3
  import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
4
4
  import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
5
5
  import * as i0 from "@angular/core";
6
- import * as i1 from "@progress/kendo-angular-indicators";
7
- import * as i2 from "@progress/kendo-angular-dropdowns";
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;
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@progress/kendo-angular-indicators";
8
+ import * as i3 from "@progress/kendo-angular-dropdowns";
9
+ import * as i4 from "@progress/kendo-angular-inputs";
10
+ import * as i5 from "@progress/kendo-angular-buttons";
11
+ const _forTrack0 = ($index, $item) => $item.category.ID;
12
+ const _forTrack1 = ($index, $item) => $item.ID;
13
+ const _c0 = a0 => ({ nodes: a0 });
12
14
  function ActionsListViewComponent_ng_template_11_Template(rf, ctx) { if (rf & 1) {
13
- i0.ɵɵelement(0, "i", 14);
15
+ i0.ɵɵelement(0, "i", 19);
14
16
  } }
15
- function ActionsListViewComponent_Conditional_17_For_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelementStart(0, "kendo-chip", 23);
17
- i0.ɵɵelement(1, "i", 30);
17
+ function ActionsListViewComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
18
+ i0.ɵɵtext(0, " All Categories ");
19
+ } }
20
+ function ActionsListViewComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵtext(0);
22
+ } if (rf & 2) {
23
+ const ctx_r0 = i0.ɵɵnextContext();
24
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.getCategoryName(ctx_r0.selectedCategory$.value), " ");
25
+ } }
26
+ function ActionsListViewComponent_Conditional_21_ng_container_13_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵelementContainer(0);
28
+ } }
29
+ function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelement(0, "i", 34);
31
+ } }
32
+ function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelement(0, "i", 35);
34
+ } }
35
+ function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
36
+ const _r5 = i0.ɵɵgetCurrentView();
37
+ i0.ɵɵelementStart(0, "button", 33);
38
+ i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_2_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const node_r4 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(3); ctx_r0.toggleCategoryExpanded(node_r4.category.ID); return i0.ɵɵresetView($event.stopPropagation()); });
39
+ i0.ɵɵtemplate(1, ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_2_Conditional_1_Template, 1, 0, "i", 34)(2, ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_2_Conditional_2_Template, 1, 0, "i", 35);
40
+ i0.ɵɵelementEnd();
41
+ } if (rf & 2) {
42
+ const node_r4 = i0.ɵɵnextContext().$implicit;
43
+ const ctx_r0 = i0.ɵɵnextContext(3);
44
+ i0.ɵɵproperty("fillMode", "flat")("size", "small");
45
+ i0.ɵɵadvance();
46
+ i0.ɵɵconditional(ctx_r0.isCategoryExpanded(node_r4.category.ID) ? 1 : 2);
47
+ } }
48
+ function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
49
+ i0.ɵɵelement(0, "span", 31);
50
+ } }
51
+ function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_8_ng_container_0_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵelementContainer(0);
53
+ } }
54
+ function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
55
+ i0.ɵɵtemplate(0, ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_8_ng_container_0_Template, 1, 0, "ng-container", 26);
56
+ } if (rf & 2) {
57
+ const node_r4 = i0.ɵɵnextContext().$implicit;
58
+ i0.ɵɵnextContext(2);
59
+ const categoryTreeTemplate_r6 = i0.ɵɵreference(15);
60
+ i0.ɵɵproperty("ngTemplateOutlet", categoryTreeTemplate_r6)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, node_r4.children));
61
+ } }
62
+ function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Template(rf, ctx) { if (rf & 1) {
63
+ const _r3 = i0.ɵɵgetCurrentView();
64
+ i0.ɵɵelementStart(0, "div", 28)(1, "button", 29);
65
+ i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Template_button_click_1_listener() { const node_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.selectCategory(node_r4.category.ID)); });
66
+ i0.ɵɵtemplate(2, ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_2_Template, 3, 3, "button", 30)(3, ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_3_Template, 1, 0, "span", 31);
67
+ i0.ɵɵelement(4, "i", 32);
68
+ i0.ɵɵtext(5);
69
+ i0.ɵɵelementStart(6, "span", 14);
70
+ i0.ɵɵtext(7);
71
+ i0.ɵɵelementEnd()();
72
+ i0.ɵɵtemplate(8, ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Conditional_8_Template, 1, 4, "ng-container");
73
+ i0.ɵɵelementEnd();
74
+ } if (rf & 2) {
75
+ const node_r4 = ctx.$implicit;
76
+ const ctx_r0 = i0.ɵɵnextContext(3);
77
+ i0.ɵɵstyleProp("padding-left", node_r4.level * 20, "px");
78
+ i0.ɵɵadvance();
79
+ i0.ɵɵclassProp("selected", ctx_r0.selectedCategory$.value === node_r4.category.ID);
80
+ i0.ɵɵproperty("fillMode", "flat")("size", "small");
81
+ i0.ɵɵadvance();
82
+ i0.ɵɵconditional(node_r4.children.length > 0 ? 2 : 3);
83
+ i0.ɵɵadvance(3);
84
+ i0.ɵɵtextInterpolate1(" ", node_r4.category.Name, " ");
85
+ i0.ɵɵadvance(2);
86
+ i0.ɵɵtextInterpolate(ctx_r0.getCategoryActionCount(node_r4.category.ID));
87
+ i0.ɵɵadvance();
88
+ i0.ɵɵconditional(node_r4.children.length > 0 && ctx_r0.isCategoryExpanded(node_r4.category.ID) ? 8 : -1);
89
+ } }
90
+ function ActionsListViewComponent_Conditional_21_ng_template_14_Template(rf, ctx) { if (rf & 1) {
91
+ i0.ɵɵrepeaterCreate(0, ActionsListViewComponent_Conditional_21_ng_template_14_For_1_Template, 9, 10, "div", 27, _forTrack0);
92
+ } if (rf & 2) {
93
+ const nodes_r7 = ctx.nodes;
94
+ i0.ɵɵrepeater(nodes_r7);
95
+ } }
96
+ function ActionsListViewComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
97
+ const _r2 = i0.ɵɵgetCurrentView();
98
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 20)(2, "h3");
99
+ i0.ɵɵtext(3, "Select Category");
100
+ i0.ɵɵelementEnd();
101
+ i0.ɵɵelementStart(4, "button", 21);
102
+ i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_21_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleCategoryTree()); });
103
+ i0.ɵɵelement(5, "i", 22);
104
+ i0.ɵɵelementEnd()();
105
+ i0.ɵɵelementStart(6, "div", 23)(7, "button", 21);
106
+ i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_21_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.selectCategory("all")); });
107
+ i0.ɵɵelement(8, "i", 24);
108
+ i0.ɵɵtext(9, " All Categories ");
109
+ i0.ɵɵelementStart(10, "span", 14);
110
+ i0.ɵɵtext(11);
111
+ i0.ɵɵelementEnd()()();
112
+ i0.ɵɵelementStart(12, "div", 25);
113
+ i0.ɵɵtemplate(13, ActionsListViewComponent_Conditional_21_ng_container_13_Template, 1, 0, "ng-container", 26);
114
+ i0.ɵɵelementEnd();
115
+ i0.ɵɵtemplate(14, ActionsListViewComponent_Conditional_21_ng_template_14_Template, 2, 0, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
116
+ i0.ɵɵelementEnd();
117
+ } if (rf & 2) {
118
+ const categoryTreeTemplate_r6 = i0.ɵɵreference(15);
119
+ const ctx_r0 = i0.ɵɵnextContext();
120
+ i0.ɵɵadvance(4);
121
+ i0.ɵɵproperty("fillMode", "flat")("size", "small");
122
+ i0.ɵɵadvance(3);
123
+ i0.ɵɵclassProp("selected", ctx_r0.selectedCategory$.value === "all");
124
+ i0.ɵɵproperty("fillMode", "flat")("size", "small");
125
+ i0.ɵɵadvance(4);
126
+ i0.ɵɵtextInterpolate(ctx_r0.actions.length);
127
+ i0.ɵɵadvance(2);
128
+ i0.ɵɵproperty("ngTemplateOutlet", categoryTreeTemplate_r6)("ngTemplateOutletContext", i0.ɵɵpureFunction1(9, _c0, ctx_r0.categoryTree));
129
+ } }
130
+ function ActionsListViewComponent_Conditional_23_For_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
131
+ i0.ɵɵelementStart(0, "kendo-chip", 44);
132
+ i0.ɵɵelement(1, "i", 51);
18
133
  i0.ɵɵtext(2, " AI Generated ");
19
134
  i0.ɵɵelementEnd();
20
135
  } if (rf & 2) {
21
136
  i0.ɵɵproperty("size", "small");
22
137
  } }
23
- function ActionsListViewComponent_Conditional_17_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
24
- i0.ɵɵelementStart(0, "div", 26);
25
- i0.ɵɵelement(1, "i", 31);
138
+ function ActionsListViewComponent_Conditional_23_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
139
+ i0.ɵɵelementStart(0, "div", 47);
140
+ i0.ɵɵelement(1, "i", 52);
26
141
  i0.ɵɵelementStart(2, "span");
27
142
  i0.ɵɵtext(3);
28
143
  i0.ɵɵpipe(4, "date");
29
144
  i0.ɵɵelementEnd()();
30
145
  } if (rf & 2) {
31
- const action_r2 = i0.ɵɵnextContext().$implicit;
146
+ const action_r9 = i0.ɵɵnextContext().$implicit;
32
147
  i0.ɵɵadvance(3);
33
- i0.ɵɵtextInterpolate1("Updated ", i0.ɵɵpipeBind2(4, 1, action_r2.__mj_UpdatedAt, "MMM d, yyyy"), "");
148
+ i0.ɵɵtextInterpolate1("Updated ", i0.ɵɵpipeBind2(4, 1, action_r9.__mj_UpdatedAt, "MMM d, yyyy"), "");
34
149
  } }
35
- function ActionsListViewComponent_Conditional_17_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
36
- i0.ɵɵelementStart(0, "div", 26);
37
- i0.ɵɵelement(1, "i", 32);
150
+ function ActionsListViewComponent_Conditional_23_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
151
+ i0.ɵɵelementStart(0, "div", 47);
152
+ i0.ɵɵelement(1, "i", 53);
38
153
  i0.ɵɵelementStart(2, "span");
39
154
  i0.ɵɵtext(3);
40
155
  i0.ɵɵelementEnd()();
41
156
  } if (rf & 2) {
42
- const action_r2 = i0.ɵɵnextContext().$implicit;
157
+ const action_r9 = i0.ɵɵnextContext().$implicit;
43
158
  i0.ɵɵadvance(3);
44
- i0.ɵɵtextInterpolate(action_r2.CodeApprovalStatus);
159
+ i0.ɵɵtextInterpolate(action_r9.CodeApprovalStatus);
45
160
  } }
46
- function ActionsListViewComponent_Conditional_17_For_1_Template(rf, ctx) { if (rf & 1) {
47
- const _r1 = i0.ɵɵgetCurrentView();
48
- i0.ɵɵelementStart(0, "div", 16);
49
- i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_17_For_1_Template_div_click_0_listener() { const action_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openAction(action_r2)); });
50
- i0.ɵɵelementStart(1, "div", 17);
161
+ function ActionsListViewComponent_Conditional_23_For_1_Template(rf, ctx) { if (rf & 1) {
162
+ const _r8 = i0.ɵɵgetCurrentView();
163
+ i0.ɵɵelementStart(0, "div", 37);
164
+ i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_23_For_1_Template_div_click_0_listener() { const action_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openAction(action_r9)); });
165
+ i0.ɵɵelementStart(1, "div", 38);
51
166
  i0.ɵɵelement(2, "i");
52
167
  i0.ɵɵelementEnd();
53
- i0.ɵɵelementStart(3, "div", 18)(4, "div", 19)(5, "h3", 20);
168
+ i0.ɵɵelementStart(3, "div", 39)(4, "div", 40)(5, "h3", 41);
54
169
  i0.ɵɵtext(6);
55
170
  i0.ɵɵelementEnd();
56
- i0.ɵɵelementStart(7, "div", 21)(8, "kendo-chip", 22);
171
+ i0.ɵɵelementStart(7, "div", 42)(8, "kendo-chip", 43);
57
172
  i0.ɵɵtext(9);
58
173
  i0.ɵɵelementEnd();
59
- i0.ɵɵtemplate(10, ActionsListViewComponent_Conditional_17_For_1_Conditional_10_Template, 3, 1, "kendo-chip", 23);
174
+ i0.ɵɵtemplate(10, ActionsListViewComponent_Conditional_23_For_1_Conditional_10_Template, 3, 1, "kendo-chip", 44);
60
175
  i0.ɵɵelementEnd()();
61
- i0.ɵɵelementStart(11, "div", 24);
176
+ i0.ɵɵelementStart(11, "div", 45);
62
177
  i0.ɵɵtext(12);
63
178
  i0.ɵɵelementEnd();
64
- i0.ɵɵelementStart(13, "div", 25)(14, "div", 26);
65
- i0.ɵɵelement(15, "i", 27);
179
+ i0.ɵɵelementStart(13, "div", 46)(14, "div", 47);
180
+ i0.ɵɵelement(15, "i", 32);
66
181
  i0.ɵɵelementStart(16, "span");
67
182
  i0.ɵɵtext(17);
68
183
  i0.ɵɵelementEnd()();
69
- i0.ɵɵtemplate(18, ActionsListViewComponent_Conditional_17_For_1_Conditional_18_Template, 5, 4, "div", 26)(19, ActionsListViewComponent_Conditional_17_For_1_Conditional_19_Template, 4, 1, "div", 26);
184
+ i0.ɵɵtemplate(18, ActionsListViewComponent_Conditional_23_For_1_Conditional_18_Template, 5, 4, "div", 47)(19, ActionsListViewComponent_Conditional_23_For_1_Conditional_19_Template, 4, 1, "div", 47);
70
185
  i0.ɵɵelementEnd()();
71
- i0.ɵɵelementStart(20, "div", 28)(21, "button", 29);
72
- i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_17_For_1_Template_button_click_21_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
186
+ i0.ɵɵelementStart(20, "div", 48)(21, "button", 49);
187
+ i0.ɵɵlistener("click", function ActionsListViewComponent_Conditional_23_For_1_Template_button_click_21_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
188
+ i0.ɵɵelement(22, "i", 50);
73
189
  i0.ɵɵelementEnd()()();
74
190
  } if (rf & 2) {
75
- const action_r2 = ctx.$implicit;
76
- const ctx_r2 = i0.ɵɵnextContext(2);
191
+ const action_r9 = ctx.$implicit;
192
+ const ctx_r0 = i0.ɵɵnextContext(2);
77
193
  i0.ɵɵadvance(2);
78
- i0.ɵɵclassMap(ctx_r2.getActionIcon(action_r2));
194
+ i0.ɵɵclassMap(ctx_r0.getActionIcon(action_r9));
79
195
  i0.ɵɵadvance(4);
80
- i0.ɵɵtextInterpolate(action_r2.Name);
196
+ i0.ɵɵtextInterpolate(action_r9.Name);
81
197
  i0.ɵɵadvance(2);
82
- i0.ɵɵproperty("themeColor", ctx_r2.getStatusColor(action_r2.Status))("size", "small");
198
+ i0.ɵɵproperty("themeColor", ctx_r0.getStatusColor(action_r9.Status))("size", "small");
83
199
  i0.ɵɵadvance();
84
- i0.ɵɵtextInterpolate1(" ", action_r2.Status, " ");
200
+ i0.ɵɵtextInterpolate1(" ", action_r9.Status, " ");
85
201
  i0.ɵɵadvance();
86
- i0.ɵɵconditional(action_r2.Type === "Generated" ? 10 : -1);
202
+ i0.ɵɵconditional(action_r9.Type === "Generated" ? 10 : -1);
87
203
  i0.ɵɵadvance(2);
88
- i0.ɵɵtextInterpolate1(" ", action_r2.Description || "No description available", " ");
204
+ i0.ɵɵtextInterpolate1(" ", action_r9.Description || "No description available", " ");
89
205
  i0.ɵɵadvance(5);
90
- i0.ɵɵtextInterpolate(ctx_r2.getCategoryName(action_r2.CategoryID));
206
+ i0.ɵɵtextInterpolate(ctx_r0.getCategoryName(action_r9.CategoryID));
91
207
  i0.ɵɵadvance();
92
- i0.ɵɵconditional(action_r2.__mj_UpdatedAt ? 18 : -1);
208
+ i0.ɵɵconditional(action_r9.__mj_UpdatedAt ? 18 : -1);
93
209
  i0.ɵɵadvance();
94
- i0.ɵɵconditional(action_r2.CodeApprovalStatus && action_r2.Type === "Generated" ? 19 : -1);
210
+ i0.ɵɵconditional(action_r9.CodeApprovalStatus && action_r9.Type === "Generated" ? 19 : -1);
95
211
  i0.ɵɵadvance(2);
96
- i0.ɵɵproperty("fillMode", "flat")("icon", "more-vertical");
212
+ i0.ɵɵproperty("fillMode", "flat");
97
213
  } }
98
- function ActionsListViewComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
99
- i0.ɵɵrepeaterCreate(0, ActionsListViewComponent_Conditional_17_For_1_Template, 22, 13, "div", 15, _forTrack0);
214
+ function ActionsListViewComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
215
+ i0.ɵɵrepeaterCreate(0, ActionsListViewComponent_Conditional_23_For_1_Template, 23, 12, "div", 36, _forTrack1);
100
216
  } if (rf & 2) {
101
- const ctx_r2 = i0.ɵɵnextContext();
102
- i0.ɵɵrepeater(ctx_r2.filteredActions);
217
+ const ctx_r0 = i0.ɵɵnextContext();
218
+ i0.ɵɵrepeater(ctx_r0.filteredActions);
103
219
  } }
104
- function ActionsListViewComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
105
- i0.ɵɵelementStart(0, "div", 12);
106
- i0.ɵɵelement(1, "i", 14);
220
+ function ActionsListViewComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
221
+ i0.ɵɵelementStart(0, "div", 17);
222
+ i0.ɵɵelement(1, "i", 19);
107
223
  i0.ɵɵelementStart(2, "h3");
108
224
  i0.ɵɵtext(3, "No actions found");
109
225
  i0.ɵɵelementEnd();
@@ -111,9 +227,9 @@ function ActionsListViewComponent_Conditional_18_Template(rf, ctx) { if (rf & 1)
111
227
  i0.ɵɵtext(5, "Try adjusting your search or filter criteria");
112
228
  i0.ɵɵelementEnd()();
113
229
  } }
114
- function ActionsListViewComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
115
- i0.ɵɵelementStart(0, "div", 13);
116
- i0.ɵɵelement(1, "kendo-loader", 33);
230
+ function ActionsListViewComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
231
+ i0.ɵɵelementStart(0, "div", 18);
232
+ i0.ɵɵelement(1, "kendo-loader", 54);
117
233
  i0.ɵɵelementEnd();
118
234
  } if (rf & 2) {
119
235
  i0.ɵɵadvance();
@@ -125,10 +241,13 @@ export class ActionsListViewComponent {
125
241
  actions = [];
126
242
  filteredActions = [];
127
243
  categories = new Map();
244
+ categoryTree = [];
245
+ categoryDescendants = new Map();
128
246
  searchTerm$ = new BehaviorSubject('');
129
247
  selectedStatus$ = new BehaviorSubject('all');
130
248
  selectedType$ = new BehaviorSubject('all');
131
249
  selectedCategory$ = new BehaviorSubject('all');
250
+ expandedCategories = new Set();
132
251
  statusOptions = [
133
252
  { text: 'All Statuses', value: 'all' },
134
253
  { text: 'Active', value: 'Active' },
@@ -167,7 +286,6 @@ export class ActionsListViewComponent {
167
286
  try {
168
287
  this.isLoading = true;
169
288
  const rv = new RunView();
170
- console.log('Loading Actions list data...');
171
289
  const [actionsResult, categoriesResult] = await rv.RunViews([
172
290
  {
173
291
  EntityName: 'Actions',
@@ -206,6 +324,10 @@ export class ActionsListViewComponent {
206
324
  categories.forEach(category => {
207
325
  this.categories.set(category.ID, category);
208
326
  });
327
+ // Build the category tree
328
+ this.buildCategoryTree(categories);
329
+ // Build descendant mapping for efficient filtering
330
+ this.buildDescendantMapping(categories);
209
331
  }
210
332
  buildCategoryOptions(categories) {
211
333
  this.categoryOptions = [
@@ -216,9 +338,64 @@ export class ActionsListViewComponent {
216
338
  }))
217
339
  ];
218
340
  }
341
+ buildCategoryTree(categories) {
342
+ const categoryMap = new Map();
343
+ // First pass: create all nodes
344
+ categories.forEach(category => {
345
+ categoryMap.set(category.ID, {
346
+ category,
347
+ children: [],
348
+ level: 0
349
+ });
350
+ });
351
+ // Second pass: build tree structure
352
+ const rootNodes = [];
353
+ categoryMap.forEach(node => {
354
+ const parentId = node.category.ParentID;
355
+ if (parentId && categoryMap.has(parentId)) {
356
+ const parent = categoryMap.get(parentId);
357
+ parent.children.push(node);
358
+ node.level = parent.level + 1;
359
+ }
360
+ else {
361
+ rootNodes.push(node);
362
+ }
363
+ });
364
+ // Sort children at each level by name
365
+ const sortChildren = (nodes) => {
366
+ nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));
367
+ nodes.forEach(node => sortChildren(node.children));
368
+ };
369
+ sortChildren(rootNodes);
370
+ this.categoryTree = rootNodes;
371
+ }
372
+ buildDescendantMapping(categories) {
373
+ this.categoryDescendants.clear();
374
+ // Initialize each category with itself
375
+ categories.forEach(category => {
376
+ this.categoryDescendants.set(category.ID, new Set([category.ID]));
377
+ });
378
+ // Build descendant sets
379
+ const addDescendants = (categoryId, descendantId) => {
380
+ const descendants = this.categoryDescendants.get(categoryId);
381
+ if (descendants) {
382
+ descendants.add(descendantId);
383
+ }
384
+ };
385
+ categories.forEach(category => {
386
+ if (category.ParentID) {
387
+ // Add this category as a descendant of all its ancestors
388
+ let currentParentId = category.ParentID;
389
+ while (currentParentId) {
390
+ addDescendants(currentParentId, category.ID);
391
+ const parent = this.categories.get(currentParentId);
392
+ currentParentId = parent?.ParentID || null;
393
+ }
394
+ }
395
+ });
396
+ }
219
397
  applyFilters() {
220
398
  let filtered = [...this.actions];
221
- console.log('Applying filters to', this.actions.length, 'actions');
222
399
  // Apply search filter
223
400
  const searchTerm = this.searchTerm$.value.toLowerCase();
224
401
  if (searchTerm) {
@@ -235,13 +412,20 @@ export class ActionsListViewComponent {
235
412
  if (type !== 'all') {
236
413
  filtered = filtered.filter(action => action.Type === type);
237
414
  }
238
- // Apply category filter
415
+ // Apply category filter (includes descendants)
239
416
  const categoryId = this.selectedCategory$.value;
240
417
  if (categoryId !== 'all') {
241
- filtered = filtered.filter(action => action.CategoryID === categoryId);
418
+ const descendantIds = this.categoryDescendants.get(categoryId);
419
+ if (descendantIds) {
420
+ // Filter actions that belong to the selected category or any of its descendants
421
+ filtered = filtered.filter(action => action.CategoryID && descendantIds.has(action.CategoryID));
422
+ }
423
+ else {
424
+ console.warn(`Category ID ${categoryId} not found in category hierarchy`);
425
+ filtered = [];
426
+ }
242
427
  }
243
428
  this.filteredActions = filtered;
244
- console.log('Filtered to', this.filteredActions.length, 'actions');
245
429
  }
246
430
  onSearchChange(searchTerm) {
247
431
  this.searchTerm$.next(searchTerm);
@@ -288,32 +472,62 @@ export class ActionsListViewComponent {
288
472
  getActionIcon(action) {
289
473
  return action?.IconClass || this.getTypeIcon(action.Type);
290
474
  }
475
+ // Tree view methods
476
+ toggleCategoryExpanded(categoryId) {
477
+ if (this.expandedCategories.has(categoryId)) {
478
+ this.expandedCategories.delete(categoryId);
479
+ }
480
+ else {
481
+ this.expandedCategories.add(categoryId);
482
+ }
483
+ }
484
+ isCategoryExpanded(categoryId) {
485
+ return this.expandedCategories.has(categoryId);
486
+ }
487
+ selectCategory(categoryId) {
488
+ this.selectedCategory$.next(categoryId);
489
+ }
490
+ getCategoryActionCount(categoryId) {
491
+ const descendantIds = this.categoryDescendants.get(categoryId);
492
+ if (!descendantIds)
493
+ return 0;
494
+ return this.actions.filter(action => action.CategoryID && descendantIds.has(action.CategoryID)).length;
495
+ }
496
+ showCategoryTree = false;
497
+ toggleCategoryTree() {
498
+ this.showCategoryTree = !this.showCategoryTree;
499
+ }
291
500
  static ɵfac = function ActionsListViewComponent_Factory(t) { return new (t || ActionsListViewComponent)(); };
292
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsListViewComponent, selectors: [["mj-actions-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, decls: 20, vars: 11, consts: [[1, "actions-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-cogs"], [1, "results-count"], [1, "filters-row"], [1, "search-container"], ["placeholder", "Search actions...", 3, "valueChange", "value"], ["kendoTextBoxPrefixTemplate", ""], [1, "filter-group"], ["textField", "text", "valueField", "value", 3, "valueChange", "data", "value"], [1, "actions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "fa-solid", "fa-search"], [1, "action-card"], [1, "action-card", 3, "click"], [1, "action-icon"], [1, "action-main"], [1, "action-header"], [1, "action-name"], [1, "action-badges"], [3, "themeColor", "size"], ["themeColor", "info", 3, "size"], [1, "action-description"], [1, "action-details"], [1, "detail-item"], [1, "fa-solid", "fa-folder"], [1, "action-actions"], ["kendoButton", "", 3, "click", "fillMode", "icon"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-check-circle"], ["type", "converging-spinner", 3, "themeColor"]], template: function ActionsListViewComponent_Template(rf, ctx) { if (rf & 1) {
293
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2");
294
- i0.ɵɵelement(4, "i", 3);
501
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsListViewComponent, selectors: [["mj-actions-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, decls: 26, vars: 15, consts: [["categoryTreeTemplate", ""], [1, "actions-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-cogs"], [1, "results-count"], [1, "filters-row"], [1, "search-container"], ["placeholder", "Search actions...", 3, "valueChange", "value"], ["kendoTextBoxPrefixTemplate", ""], [1, "filter-group"], ["textField", "text", "valueField", "value", 3, "valueChange", "data", "valuePrimitive", "value"], ["kendoButton", "", 1, "category-filter-button", 3, "click", "fillMode"], [1, "fa-solid", "fa-folder-tree"], [1, "badge"], [1, "category-tree-panel"], [1, "actions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "fa-solid", "fa-search"], [1, "tree-header"], ["kendoButton", "", 3, "click", "fillMode", "size"], [1, "fa-solid", "fa-times"], [1, "tree-actions"], [1, "fa-solid", "fa-folder-open"], [1, "tree-content"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node", 3, "padding-left"], [1, "tree-node"], ["kendoButton", "", 1, "tree-node-button", 3, "click", "fillMode", "size"], ["kendoButton", "", 1, "expand-button", 3, "fillMode", "size"], [1, "no-expand"], [1, "fa-solid", "fa-folder"], ["kendoButton", "", 1, "expand-button", 3, "click", "fillMode", "size"], [1, "fa-solid", "fa-chevron-down"], [1, "fa-solid", "fa-chevron-right"], [1, "action-card"], [1, "action-card", 3, "click"], [1, "action-icon"], [1, "action-main"], [1, "action-header"], [1, "action-name"], [1, "action-badges"], [3, "themeColor", "size"], ["themeColor", "info", 3, "size"], [1, "action-description"], [1, "action-details"], [1, "detail-item"], [1, "action-actions"], ["kendoButton", "", 3, "click", "fillMode"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-check-circle"], ["type", "converging-spinner", 3, "themeColor"]], template: function ActionsListViewComponent_Template(rf, ctx) { if (rf & 1) {
502
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "h2");
503
+ i0.ɵɵelement(4, "i", 4);
295
504
  i0.ɵɵtext(5, " Actions");
296
505
  i0.ɵɵelementEnd();
297
- i0.ɵɵelementStart(6, "div", 4);
506
+ i0.ɵɵelementStart(6, "div", 5);
298
507
  i0.ɵɵtext(7);
299
508
  i0.ɵɵelementEnd()();
300
- i0.ɵɵelementStart(8, "div", 5)(9, "div", 6)(10, "kendo-textbox", 7);
509
+ i0.ɵɵelementStart(8, "div", 6)(9, "div", 7)(10, "kendo-textbox", 8);
301
510
  i0.ɵɵlistener("valueChange", function ActionsListViewComponent_Template_kendo_textbox_valueChange_10_listener($event) { return ctx.onSearchChange($event); });
302
- i0.ɵɵtemplate(11, ActionsListViewComponent_ng_template_11_Template, 1, 0, "ng-template", 8);
511
+ i0.ɵɵtemplate(11, ActionsListViewComponent_ng_template_11_Template, 1, 0, "ng-template", 9);
303
512
  i0.ɵɵelementEnd()();
304
- i0.ɵɵelementStart(12, "div", 9)(13, "kendo-dropdownlist", 10);
513
+ i0.ɵɵelementStart(12, "div", 10)(13, "kendo-dropdownlist", 11);
305
514
  i0.ɵɵlistener("valueChange", function ActionsListViewComponent_Template_kendo_dropdownlist_valueChange_13_listener($event) { return ctx.onStatusFilterChange($event); });
306
515
  i0.ɵɵelementEnd();
307
- i0.ɵɵelementStart(14, "kendo-dropdownlist", 10);
516
+ i0.ɵɵelementStart(14, "kendo-dropdownlist", 11);
308
517
  i0.ɵɵlistener("valueChange", function ActionsListViewComponent_Template_kendo_dropdownlist_valueChange_14_listener($event) { return ctx.onTypeFilterChange($event); });
309
518
  i0.ɵɵelementEnd();
310
- i0.ɵɵelementStart(15, "kendo-dropdownlist", 10);
311
- i0.ɵɵlistener("valueChange", function ActionsListViewComponent_Template_kendo_dropdownlist_valueChange_15_listener($event) { return ctx.onCategoryFilterChange($event); });
312
- i0.ɵɵelementEnd()()()();
313
- i0.ɵɵelementStart(16, "div", 11);
314
- i0.ɵɵtemplate(17, ActionsListViewComponent_Conditional_17_Template, 2, 0)(18, ActionsListViewComponent_Conditional_18_Template, 6, 0, "div", 12);
519
+ i0.ɵɵelementStart(15, "button", 12);
520
+ i0.ɵɵlistener("click", function ActionsListViewComponent_Template_button_click_15_listener() { return ctx.toggleCategoryTree(); });
521
+ i0.ɵɵelement(16, "i", 13);
522
+ i0.ɵɵtemplate(17, ActionsListViewComponent_Conditional_17_Template, 1, 0)(18, ActionsListViewComponent_Conditional_18_Template, 1, 1);
523
+ i0.ɵɵelementStart(19, "span", 14);
524
+ i0.ɵɵtext(20);
525
+ i0.ɵɵelementEnd()()()()();
526
+ i0.ɵɵtemplate(21, ActionsListViewComponent_Conditional_21_Template, 16, 11, "div", 15);
527
+ i0.ɵɵelementStart(22, "div", 16);
528
+ i0.ɵɵtemplate(23, ActionsListViewComponent_Conditional_23_Template, 2, 0)(24, ActionsListViewComponent_Conditional_24_Template, 6, 0, "div", 17);
315
529
  i0.ɵɵelementEnd();
316
- i0.ɵɵtemplate(19, ActionsListViewComponent_Conditional_19_Template, 2, 1, "div", 13);
530
+ i0.ɵɵtemplate(25, ActionsListViewComponent_Conditional_25_Template, 2, 1, "div", 18);
317
531
  i0.ɵɵelementEnd();
318
532
  } if (rf & 2) {
319
533
  i0.ɵɵadvance(7);
@@ -321,22 +535,28 @@ export class ActionsListViewComponent {
321
535
  i0.ɵɵadvance(3);
322
536
  i0.ɵɵproperty("value", ctx.searchTerm$.value);
323
537
  i0.ɵɵadvance(3);
324
- i0.ɵɵproperty("data", ctx.statusOptions)("value", ctx.selectedStatus$.value);
538
+ i0.ɵɵproperty("data", ctx.statusOptions)("valuePrimitive", true)("value", ctx.selectedStatus$.value);
539
+ i0.ɵɵadvance();
540
+ i0.ɵɵproperty("data", ctx.typeOptions)("valuePrimitive", true)("value", ctx.selectedType$.value);
325
541
  i0.ɵɵadvance();
326
- i0.ɵɵproperty("data", ctx.typeOptions)("value", ctx.selectedType$.value);
542
+ i0.ɵɵproperty("fillMode", "outline");
543
+ i0.ɵɵadvance(2);
544
+ i0.ɵɵconditional(ctx.selectedCategory$.value === "all" ? 17 : 18);
545
+ i0.ɵɵadvance(3);
546
+ i0.ɵɵtextInterpolate(ctx.getCategoryActionCount(ctx.selectedCategory$.value));
327
547
  i0.ɵɵadvance();
328
- i0.ɵɵproperty("data", ctx.categoryOptions)("value", ctx.selectedCategory$.value);
548
+ i0.ɵɵconditional(ctx.showCategoryTree ? 21 : -1);
329
549
  i0.ɵɵadvance(2);
330
- i0.ɵɵconditional(ctx.filteredActions.length > 0 ? 17 : !ctx.isLoading ? 18 : -1);
550
+ i0.ɵɵconditional(ctx.filteredActions.length > 0 ? 23 : !ctx.isLoading ? 24 : -1);
331
551
  i0.ɵɵadvance(2);
332
- i0.ɵɵconditional(ctx.isLoading ? 19 : -1);
333
- } }, dependencies: [i1.LoaderComponent, i2.DropDownListComponent, i3.TextBoxComponent, i3.TextBoxPrefixTemplateDirective, i4.ButtonComponent, i4.ChipComponent, i5.DatePipe], styles: [".actions-list-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--kendo-color-app-surface);\n\n .list-header {\n padding: 1.5rem;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface);\n\n .header-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n font-size: 0.875rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n\n .filters-row {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n\n .search-container {\n flex: 1;\n min-width: 200px;\n\n kendo-textbox {\n width: 100%;\n }\n }\n\n .filter-group {\n display: flex;\n gap: 0.75rem;\n \n kendo-dropdownlist {\n min-width: 140px;\n }\n }\n }\n }\n\n .actions-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 1.5rem;\n\n .action-card {\n display: flex;\n align-items: flex-start;\n gap: 1rem;\n padding: 1.5rem;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n margin-bottom: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover);\n border-color: var(--kendo-color-primary);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n }\n\n .action-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n border-radius: 0.5rem;\n background: var(--kendo-color-primary-subtle);\n flex-shrink: 0;\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1.25rem;\n }\n }\n\n .action-main {\n flex: 1;\n\n .action-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n\n .action-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n }\n\n .action-badges {\n display: flex;\n gap: 0.5rem;\n flex-shrink: 0;\n\n kendo-chip {\n &:has(i) {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n }\n }\n }\n\n .action-description {\n color: var(--kendo-color-subtle);\n line-height: 1.5;\n margin-bottom: 1rem;\n }\n\n .action-details {\n display: flex;\n gap: 1.5rem;\n flex-wrap: wrap;\n\n .detail-item {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n i {\n color: var(--kendo-color-primary);\n width: 0.75rem;\n }\n }\n }\n }\n\n .action-actions {\n flex-shrink: 0;\n\n button {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n }\n\n &:hover .action-actions button {\n opacity: 1;\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.125rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n//[_ngcontent-%COMP%] Responsive[_ngcontent-%COMP%] design\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 768px)[_ngcontent-%COMP%] {\n .actions-list-view {\n .list-header {\n padding: 1rem;\n\n .header-title {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n }\n\n .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-group {\n min-width: unset;\n }\n\n .filter-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n }\n }\n\n .actions-list {\n padding: 1rem;\n\n .action-card {\n padding: 1rem;\n\n .action-main .action-header {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n\n .action-badges {\n align-self: flex-start;\n }\n }\n\n .action-main .action-details {\n gap: 1rem;\n }\n }\n }\n }\n}"] });
552
+ i0.ɵɵconditional(ctx.isLoading ? 25 : -1);
553
+ } }, dependencies: [i1.NgTemplateOutlet, i2.LoaderComponent, i3.DropDownListComponent, i4.TextBoxComponent, i4.TextBoxPrefixTemplateDirective, i5.ButtonComponent, i5.ChipComponent, i1.DatePipe], styles: [".actions-list-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--kendo-color-app-surface);\n\n .list-header {\n padding: 1.5rem;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface);\n\n .header-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n font-size: 0.875rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n\n .filters-row {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n\n .search-container {\n flex: 1;\n min-width: 200px;\n\n kendo-textbox {\n width: 100%;\n }\n }\n\n .filter-group {\n display: flex;\n gap: 0.75rem;\n \n kendo-dropdownlist {\n min-width: 140px;\n }\n \n .category-filter-button {\n display: flex;\n align-items: center;\n gap: 8px;\n \n i {\n font-size: 14px;\n }\n \n .badge {\n background: var(--kendo-color-primary-subtle);\n color: var(--kendo-color-primary);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n margin-left: 8px;\n }\n }\n }\n }\n }\n \n .category-tree-panel {\n position: absolute;\n top: 120px;\n right: 20px;\n width: 350px;\n max-height: 70vh;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 100;\n display: flex;\n flex-direction: column;\n \n .tree-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid var(--kendo-color-border);\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n }\n \n .tree-actions {\n padding: 8px;\n border-bottom: 1px solid var(--kendo-color-border);\n \n button {\n width: 100%;\n justify-content: flex-start;\n \n &.selected {\n background: var(--kendo-color-primary-subtle);\n }\n \n .badge {\n margin-left: auto;\n background: var(--kendo-color-base-subtle);\n color: var(--kendo-color-on-app-surface);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n }\n }\n }\n \n .tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n \n .tree-node {\n .tree-node-button {\n width: 100%;\n justify-content: flex-start;\n padding-left: 8px;\n margin-bottom: 2px;\n \n &.selected {\n background: var(--kendo-color-primary-subtle);\n color: var(--kendo-color-primary);\n }\n \n .expand-button {\n padding: 0;\n min-width: 20px;\n width: 20px;\n height: 20px;\n margin-right: 4px;\n \n i {\n font-size: 10px;\n }\n }\n \n .no-expand {\n display: inline-block;\n width: 24px;\n }\n \n i.fa-folder {\n margin-right: 6px;\n color: var(--kendo-color-warning);\n }\n \n .badge {\n margin-left: auto;\n background: var(--kendo-color-base-subtle);\n color: var(--kendo-color-on-app-surface);\n padding: 2px 6px;\n border-radius: 12px;\n font-size: 11px;\n }\n }\n }\n }\n }\n\n .actions-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 1.5rem;\n\n .action-card {\n display: flex;\n align-items: flex-start;\n gap: 1rem;\n padding: 1.5rem;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n margin-bottom: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover);\n border-color: var(--kendo-color-primary);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n }\n\n .action-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n border-radius: 0.5rem;\n background: var(--kendo-color-primary-subtle);\n flex-shrink: 0;\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1.25rem;\n }\n }\n\n .action-main {\n flex: 1;\n\n .action-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n\n .action-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n }\n\n .action-badges {\n display: flex;\n gap: 0.5rem;\n flex-shrink: 0;\n\n kendo-chip {\n &:has(i) {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n }\n }\n }\n\n .action-description {\n color: var(--kendo-color-subtle);\n line-height: 1.5;\n margin-bottom: 1rem;\n }\n\n .action-details {\n display: flex;\n gap: 1.5rem;\n flex-wrap: wrap;\n\n .detail-item {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n i {\n color: var(--kendo-color-primary);\n width: 0.75rem;\n }\n }\n }\n }\n\n .action-actions {\n flex-shrink: 0;\n\n button {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n }\n\n &:hover .action-actions button {\n opacity: 1;\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.125rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n//[_ngcontent-%COMP%] Responsive[_ngcontent-%COMP%] design\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 768px)[_ngcontent-%COMP%] {\n .actions-list-view {\n .list-header {\n padding: 1rem;\n\n .header-title {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n }\n\n .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-group {\n min-width: unset;\n }\n\n .filter-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n }\n }\n\n .actions-list {\n padding: 1rem;\n\n .action-card {\n padding: 1rem;\n\n .action-main .action-header {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n\n .action-badges {\n align-self: flex-start;\n }\n }\n\n .action-main .action-details {\n gap: 1rem;\n }\n }\n }\n }\n}"] });
334
554
  }
335
555
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActionsListViewComponent, [{
336
556
  type: Component,
337
- args: [{ selector: 'mj-actions-list-view', template: "<div class=\"actions-list-view\" >\n <!-- Header with filters -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-cogs\"></i> Actions</h2>\n <div class=\"results-count\">{{ filteredActions.length }} of {{ actions.length }} actions</div>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <kendo-textbox \n placeholder=\"Search actions...\" \n [value]=\"searchTerm$.value\"\n (valueChange)=\"onSearchChange($event)\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n \n <div class=\"filter-group\">\n <kendo-dropdownlist \n [data]=\"statusOptions\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedStatus$.value\"\n (valueChange)=\"onStatusFilterChange($event)\">\n </kendo-dropdownlist>\n \n <kendo-dropdownlist \n [data]=\"typeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedType$.value\"\n (valueChange)=\"onTypeFilterChange($event)\">\n </kendo-dropdownlist>\n \n <kendo-dropdownlist \n [data]=\"categoryOptions\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedCategory$.value\"\n (valueChange)=\"onCategoryFilterChange($event)\">\n </kendo-dropdownlist>\n </div>\n </div>\n </div>\n\n <!-- Actions List -->\n <div class=\"actions-list\">\n @if (filteredActions.length > 0) {\n @for (action of filteredActions; track action.ID) {\n <div class=\"action-card\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n \n <div class=\"action-main\">\n <div class=\"action-header\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-badges\">\n <kendo-chip \n [themeColor]=\"getStatusColor(action.Status)\"\n [size]=\"'small'\">\n {{ action.Status }}\n </kendo-chip>\n @if (action.Type === 'Generated') {\n <kendo-chip \n themeColor=\"info\"\n [size]=\"'small'\">\n <i class=\"fa-solid fa-robot\"></i> AI Generated\n </kendo-chip>\n }\n </div>\n </div>\n \n <div class=\"action-description\">\n {{ action.Description || 'No description available' }}\n </div>\n \n <div class=\"action-details\">\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ getCategoryName(action.CategoryID) }}</span>\n </div>\n @if (action.__mj_UpdatedAt) {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Updated {{ action.__mj_UpdatedAt | date:'MMM d, yyyy' }}</span>\n </div>\n }\n @if (action.CodeApprovalStatus && action.Type === 'Generated') {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ action.CodeApprovalStatus }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"action-actions\">\n <button kendoButton \n [fillMode]=\"'flat'\" \n [icon]=\"'more-vertical'\"\n (click)=\"$event.stopPropagation()\">\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search or filter criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <kendo-loader type=\"converging-spinner\" [themeColor]=\"'primary'\"></kendo-loader>\n </div>\n }\n</div>", styles: [".actions-list-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--kendo-color-app-surface);\n\n .list-header {\n padding: 1.5rem;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface);\n\n .header-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n font-size: 0.875rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n\n .filters-row {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n\n .search-container {\n flex: 1;\n min-width: 200px;\n\n kendo-textbox {\n width: 100%;\n }\n }\n\n .filter-group {\n display: flex;\n gap: 0.75rem;\n \n kendo-dropdownlist {\n min-width: 140px;\n }\n }\n }\n }\n\n .actions-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 1.5rem;\n\n .action-card {\n display: flex;\n align-items: flex-start;\n gap: 1rem;\n padding: 1.5rem;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n margin-bottom: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover);\n border-color: var(--kendo-color-primary);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n }\n\n .action-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n border-radius: 0.5rem;\n background: var(--kendo-color-primary-subtle);\n flex-shrink: 0;\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1.25rem;\n }\n }\n\n .action-main {\n flex: 1;\n\n .action-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n\n .action-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n }\n\n .action-badges {\n display: flex;\n gap: 0.5rem;\n flex-shrink: 0;\n\n kendo-chip {\n &:has(i) {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n }\n }\n }\n\n .action-description {\n color: var(--kendo-color-subtle);\n line-height: 1.5;\n margin-bottom: 1rem;\n }\n\n .action-details {\n display: flex;\n gap: 1.5rem;\n flex-wrap: wrap;\n\n .detail-item {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n i {\n color: var(--kendo-color-primary);\n width: 0.75rem;\n }\n }\n }\n }\n\n .action-actions {\n flex-shrink: 0;\n\n button {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n }\n\n &:hover .action-actions button {\n opacity: 1;\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.125rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n// Responsive design\n@media (max-width: 768px) {\n .actions-list-view {\n .list-header {\n padding: 1rem;\n\n .header-title {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n }\n\n .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-group {\n min-width: unset;\n }\n\n .filter-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n }\n }\n\n .actions-list {\n padding: 1rem;\n\n .action-card {\n padding: 1rem;\n\n .action-main .action-header {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n\n .action-badges {\n align-self: flex-start;\n }\n }\n\n .action-main .action-details {\n gap: 1rem;\n }\n }\n }\n }\n}"] }]
557
+ args: [{ selector: 'mj-actions-list-view', template: "<div class=\"actions-list-view\" >\n <!-- Header with filters -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-cogs\"></i> Actions</h2>\n <div class=\"results-count\">{{ filteredActions.length }} of {{ actions.length }} actions</div>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <kendo-textbox \n placeholder=\"Search actions...\" \n [value]=\"searchTerm$.value\"\n (valueChange)=\"onSearchChange($event)\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n \n <div class=\"filter-group\">\n <kendo-dropdownlist \n [data]=\"statusOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"selectedStatus$.value\"\n (valueChange)=\"onStatusFilterChange($event)\">\n </kendo-dropdownlist>\n \n <kendo-dropdownlist \n [data]=\"typeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"selectedType$.value\"\n (valueChange)=\"onTypeFilterChange($event)\">\n </kendo-dropdownlist>\n \n <button kendoButton\n [fillMode]=\"'outline'\"\n (click)=\"toggleCategoryTree()\"\n class=\"category-filter-button\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n @if (selectedCategory$.value === 'all') {\n All Categories\n } @else {\n {{ getCategoryName(selectedCategory$.value) }}\n }\n <span class=\"badge\">{{ getCategoryActionCount(selectedCategory$.value) }}</span>\n </button>\n </div>\n </div>\n </div>\n \n <!-- Category Tree View Panel -->\n @if (showCategoryTree) {\n <div class=\"category-tree-panel\">\n <div class=\"tree-header\">\n <h3>Select Category</h3>\n <button kendoButton\n [fillMode]=\"'flat'\"\n [size]=\"'small'\"\n (click)=\"toggleCategoryTree()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n \n <div class=\"tree-actions\">\n <button kendoButton\n [fillMode]=\"'flat'\"\n [size]=\"'small'\"\n (click)=\"selectCategory('all')\"\n [class.selected]=\"selectedCategory$.value === 'all'\">\n <i class=\"fa-solid fa-folder-open\"></i>\n All Categories\n <span class=\"badge\">{{ actions.length }}</span>\n </button>\n </div>\n \n <div class=\"tree-content\">\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: categoryTree }\"></ng-container>\n </div>\n \n <ng-template #categoryTreeTemplate let-nodes=\"nodes\">\n @for (node of nodes; track node.category.ID) {\n <div class=\"tree-node\" [style.padding-left.px]=\"node.level * 20\">\n <button kendoButton\n [fillMode]=\"'flat'\"\n [size]=\"'small'\"\n class=\"tree-node-button\"\n [class.selected]=\"selectedCategory$.value === node.category.ID\"\n (click)=\"selectCategory(node.category.ID)\">\n \n @if (node.children.length > 0) {\n <button kendoButton\n [fillMode]=\"'flat'\"\n [size]=\"'small'\"\n class=\"expand-button\"\n (click)=\"toggleCategoryExpanded(node.category.ID); $event.stopPropagation()\">\n @if (isCategoryExpanded(node.category.ID)) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-right\"></i>\n }\n </button>\n } @else {\n <span class=\"no-expand\"></span>\n }\n \n <i class=\"fa-solid fa-folder\"></i>\n {{ node.category.Name }}\n <span class=\"badge\">{{ getCategoryActionCount(node.category.ID) }}</span>\n </button>\n \n @if (node.children.length > 0 && isCategoryExpanded(node.category.ID)) {\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: node.children }\"></ng-container>\n }\n </div>\n }\n </ng-template>\n </div>\n }\n\n <!-- Actions List -->\n <div class=\"actions-list\">\n @if (filteredActions.length > 0) {\n @for (action of filteredActions; track action.ID) {\n <div class=\"action-card\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n \n <div class=\"action-main\">\n <div class=\"action-header\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-badges\">\n <kendo-chip \n [themeColor]=\"getStatusColor(action.Status)\"\n [size]=\"'small'\">\n {{ action.Status }}\n </kendo-chip>\n @if (action.Type === 'Generated') {\n <kendo-chip \n themeColor=\"info\"\n [size]=\"'small'\">\n <i class=\"fa-solid fa-robot\"></i> AI Generated\n </kendo-chip>\n }\n </div>\n </div>\n \n <div class=\"action-description\">\n {{ action.Description || 'No description available' }}\n </div>\n \n <div class=\"action-details\">\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ getCategoryName(action.CategoryID) }}</span>\n </div>\n @if (action.__mj_UpdatedAt) {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Updated {{ action.__mj_UpdatedAt | date:'MMM d, yyyy' }}</span>\n </div>\n }\n @if (action.CodeApprovalStatus && action.Type === 'Generated') {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ action.CodeApprovalStatus }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"action-actions\">\n <button kendoButton \n [fillMode]=\"'flat'\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search or filter criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <kendo-loader type=\"converging-spinner\" [themeColor]=\"'primary'\"></kendo-loader>\n </div>\n }\n</div>", styles: [".actions-list-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--kendo-color-app-surface);\n\n .list-header {\n padding: 1.5rem;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface);\n\n .header-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n font-size: 0.875rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n\n .filters-row {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n\n .search-container {\n flex: 1;\n min-width: 200px;\n\n kendo-textbox {\n width: 100%;\n }\n }\n\n .filter-group {\n display: flex;\n gap: 0.75rem;\n \n kendo-dropdownlist {\n min-width: 140px;\n }\n \n .category-filter-button {\n display: flex;\n align-items: center;\n gap: 8px;\n \n i {\n font-size: 14px;\n }\n \n .badge {\n background: var(--kendo-color-primary-subtle);\n color: var(--kendo-color-primary);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n margin-left: 8px;\n }\n }\n }\n }\n }\n \n .category-tree-panel {\n position: absolute;\n top: 120px;\n right: 20px;\n width: 350px;\n max-height: 70vh;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 100;\n display: flex;\n flex-direction: column;\n \n .tree-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid var(--kendo-color-border);\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n }\n \n .tree-actions {\n padding: 8px;\n border-bottom: 1px solid var(--kendo-color-border);\n \n button {\n width: 100%;\n justify-content: flex-start;\n \n &.selected {\n background: var(--kendo-color-primary-subtle);\n }\n \n .badge {\n margin-left: auto;\n background: var(--kendo-color-base-subtle);\n color: var(--kendo-color-on-app-surface);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n }\n }\n }\n \n .tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n \n .tree-node {\n .tree-node-button {\n width: 100%;\n justify-content: flex-start;\n padding-left: 8px;\n margin-bottom: 2px;\n \n &.selected {\n background: var(--kendo-color-primary-subtle);\n color: var(--kendo-color-primary);\n }\n \n .expand-button {\n padding: 0;\n min-width: 20px;\n width: 20px;\n height: 20px;\n margin-right: 4px;\n \n i {\n font-size: 10px;\n }\n }\n \n .no-expand {\n display: inline-block;\n width: 24px;\n }\n \n i.fa-folder {\n margin-right: 6px;\n color: var(--kendo-color-warning);\n }\n \n .badge {\n margin-left: auto;\n background: var(--kendo-color-base-subtle);\n color: var(--kendo-color-on-app-surface);\n padding: 2px 6px;\n border-radius: 12px;\n font-size: 11px;\n }\n }\n }\n }\n }\n\n .actions-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 1.5rem;\n\n .action-card {\n display: flex;\n align-items: flex-start;\n gap: 1rem;\n padding: 1.5rem;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n margin-bottom: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover);\n border-color: var(--kendo-color-primary);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n }\n\n .action-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n border-radius: 0.5rem;\n background: var(--kendo-color-primary-subtle);\n flex-shrink: 0;\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1.25rem;\n }\n }\n\n .action-main {\n flex: 1;\n\n .action-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n\n .action-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n }\n\n .action-badges {\n display: flex;\n gap: 0.5rem;\n flex-shrink: 0;\n\n kendo-chip {\n &:has(i) {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n }\n }\n }\n\n .action-description {\n color: var(--kendo-color-subtle);\n line-height: 1.5;\n margin-bottom: 1rem;\n }\n\n .action-details {\n display: flex;\n gap: 1.5rem;\n flex-wrap: wrap;\n\n .detail-item {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n i {\n color: var(--kendo-color-primary);\n width: 0.75rem;\n }\n }\n }\n }\n\n .action-actions {\n flex-shrink: 0;\n\n button {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n }\n\n &:hover .action-actions button {\n opacity: 1;\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.125rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n// Responsive design\n@media (max-width: 768px) {\n .actions-list-view {\n .list-header {\n padding: 1rem;\n\n .header-title {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n }\n\n .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-group {\n min-width: unset;\n }\n\n .filter-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n }\n }\n\n .actions-list {\n padding: 1rem;\n\n .action-card {\n padding: 1rem;\n\n .action-main .action-header {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n\n .action-badges {\n align-self: flex-start;\n }\n }\n\n .action-main .action-details {\n gap: 1rem;\n }\n }\n }\n }\n}"] }]
338
558
  }], () => [], { openEntityRecord: [{
339
559
  type: Output
340
560
  }] }); })();
341
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActionsListViewComponent, { className: "ActionsListViewComponent", filePath: "src/Actions/components/actions-list-view.component.ts", lineNumber: 12 }); })();
561
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActionsListViewComponent, { className: "ActionsListViewComponent", filePath: "src/Actions/components/actions-list-view.component.ts", lineNumber: 18 }); })();
342
562
  //# sourceMappingURL=actions-list-view.component.js.map