@memberjunction/ng-dashboards 2.89.0 → 2.91.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.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +8 -8
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +4 -4
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +3 -3
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management-v2.component.d.ts +4 -4
- package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management-v2.component.js +2 -2
- package/dist/AI/components/models/model-management-v2.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +7 -7
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +4 -4
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.js +1 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +6 -6
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/actions-management-dashboard.component.d.ts +1 -0
- package/dist/Actions/actions-management-dashboard.component.d.ts.map +1 -1
- package/dist/Actions/actions-management-dashboard.component.js +89 -76
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +17 -0
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +303 -83
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +0 -1
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +4 -31
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +5 -5
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +93 -6
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +743 -265
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.d.ts +14 -0
- package/dist/ComponentStudio/components/text-import-dialog.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/text-import-dialog.component.js +121 -0
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -0
- package/dist/module.d.ts +19 -18
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +5 -2
- package/dist/module.js.map +1 -1
- package/package.json +10 -10
|
@@ -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 "@
|
|
7
|
-
import * as i2 from "@progress/kendo-angular-
|
|
8
|
-
import * as i3 from "@progress/kendo-angular-
|
|
9
|
-
import * as i4 from "@progress/kendo-angular-
|
|
10
|
-
import * as i5 from "@angular
|
|
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",
|
|
15
|
+
i0.ɵɵelement(0, "i", 19);
|
|
14
16
|
} }
|
|
15
|
-
function
|
|
16
|
-
i0.ɵɵ
|
|
17
|
-
|
|
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
|
|
24
|
-
i0.ɵɵelementStart(0, "div",
|
|
25
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
146
|
+
const action_r9 = i0.ɵɵnextContext().$implicit;
|
|
32
147
|
i0.ɵɵadvance(3);
|
|
33
|
-
i0.ɵɵtextInterpolate1("Updated ", i0.ɵɵpipeBind2(4, 1,
|
|
148
|
+
i0.ɵɵtextInterpolate1("Updated ", i0.ɵɵpipeBind2(4, 1, action_r9.__mj_UpdatedAt, "MMM d, yyyy"), "");
|
|
34
149
|
} }
|
|
35
|
-
function
|
|
36
|
-
i0.ɵɵelementStart(0, "div",
|
|
37
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
157
|
+
const action_r9 = i0.ɵɵnextContext().$implicit;
|
|
43
158
|
i0.ɵɵadvance(3);
|
|
44
|
-
i0.ɵɵtextInterpolate(
|
|
159
|
+
i0.ɵɵtextInterpolate(action_r9.CodeApprovalStatus);
|
|
45
160
|
} }
|
|
46
|
-
function
|
|
47
|
-
const
|
|
48
|
-
i0.ɵɵelementStart(0, "div",
|
|
49
|
-
i0.ɵɵlistener("click", function
|
|
50
|
-
i0.ɵɵelementStart(1, "div",
|
|
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",
|
|
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",
|
|
171
|
+
i0.ɵɵelementStart(7, "div", 42)(8, "kendo-chip", 43);
|
|
57
172
|
i0.ɵɵtext(9);
|
|
58
173
|
i0.ɵɵelementEnd();
|
|
59
|
-
i0.ɵɵtemplate(10,
|
|
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",
|
|
176
|
+
i0.ɵɵelementStart(11, "div", 45);
|
|
62
177
|
i0.ɵɵtext(12);
|
|
63
178
|
i0.ɵɵelementEnd();
|
|
64
|
-
i0.ɵɵelementStart(13, "div",
|
|
65
|
-
i0.ɵɵelement(15, "i",
|
|
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,
|
|
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",
|
|
72
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
76
|
-
const
|
|
191
|
+
const action_r9 = ctx.$implicit;
|
|
192
|
+
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
77
193
|
i0.ɵɵadvance(2);
|
|
78
|
-
i0.ɵɵclassMap(
|
|
194
|
+
i0.ɵɵclassMap(ctx_r0.getActionIcon(action_r9));
|
|
79
195
|
i0.ɵɵadvance(4);
|
|
80
|
-
i0.ɵɵtextInterpolate(
|
|
196
|
+
i0.ɵɵtextInterpolate(action_r9.Name);
|
|
81
197
|
i0.ɵɵadvance(2);
|
|
82
|
-
i0.ɵɵproperty("themeColor",
|
|
198
|
+
i0.ɵɵproperty("themeColor", ctx_r0.getStatusColor(action_r9.Status))("size", "small");
|
|
83
199
|
i0.ɵɵadvance();
|
|
84
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
200
|
+
i0.ɵɵtextInterpolate1(" ", action_r9.Status, " ");
|
|
85
201
|
i0.ɵɵadvance();
|
|
86
|
-
i0.ɵɵconditional(
|
|
202
|
+
i0.ɵɵconditional(action_r9.Type === "Generated" ? 10 : -1);
|
|
87
203
|
i0.ɵɵadvance(2);
|
|
88
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
204
|
+
i0.ɵɵtextInterpolate1(" ", action_r9.Description || "No description available", " ");
|
|
89
205
|
i0.ɵɵadvance(5);
|
|
90
|
-
i0.ɵɵtextInterpolate(
|
|
206
|
+
i0.ɵɵtextInterpolate(ctx_r0.getCategoryName(action_r9.CategoryID));
|
|
91
207
|
i0.ɵɵadvance();
|
|
92
|
-
i0.ɵɵconditional(
|
|
208
|
+
i0.ɵɵconditional(action_r9.__mj_UpdatedAt ? 18 : -1);
|
|
93
209
|
i0.ɵɵadvance();
|
|
94
|
-
i0.ɵɵconditional(
|
|
210
|
+
i0.ɵɵconditional(action_r9.CodeApprovalStatus && action_r9.Type === "Generated" ? 19 : -1);
|
|
95
211
|
i0.ɵɵadvance(2);
|
|
96
|
-
i0.ɵɵproperty("fillMode", "flat")
|
|
212
|
+
i0.ɵɵproperty("fillMode", "flat");
|
|
97
213
|
} }
|
|
98
|
-
function
|
|
99
|
-
i0.ɵɵrepeaterCreate(0,
|
|
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
|
|
102
|
-
i0.ɵɵrepeater(
|
|
217
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
218
|
+
i0.ɵɵrepeater(ctx_r0.filteredActions);
|
|
103
219
|
} }
|
|
104
|
-
function
|
|
105
|
-
i0.ɵɵelementStart(0, "div",
|
|
106
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
115
|
-
i0.ɵɵelementStart(0, "div",
|
|
116
|
-
i0.ɵɵelement(1, "kendo-loader",
|
|
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
|
-
|
|
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:
|
|
293
|
-
i0.ɵɵelementStart(0, "div",
|
|
294
|
-
i0.ɵɵelement(4, "i",
|
|
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",
|
|
506
|
+
i0.ɵɵelementStart(6, "div", 5);
|
|
298
507
|
i0.ɵɵtext(7);
|
|
299
508
|
i0.ɵɵelementEnd()();
|
|
300
|
-
i0.ɵɵelementStart(8, "div",
|
|
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",
|
|
511
|
+
i0.ɵɵtemplate(11, ActionsListViewComponent_ng_template_11_Template, 1, 0, "ng-template", 9);
|
|
303
512
|
i0.ɵɵelementEnd()();
|
|
304
|
-
i0.ɵɵelementStart(12, "div",
|
|
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",
|
|
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, "
|
|
311
|
-
i0.ɵɵlistener("
|
|
312
|
-
i0.ɵɵ
|
|
313
|
-
i0.ɵɵ
|
|
314
|
-
i0.ɵɵ
|
|
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(
|
|
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("
|
|
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.ɵɵ
|
|
548
|
+
i0.ɵɵconditional(ctx.showCategoryTree ? 21 : -1);
|
|
329
549
|
i0.ɵɵadvance(2);
|
|
330
|
-
i0.ɵɵconditional(ctx.filteredActions.length > 0 ?
|
|
550
|
+
i0.ɵɵconditional(ctx.filteredActions.length > 0 ? 23 : !ctx.isLoading ? 24 : -1);
|
|
331
551
|
i0.ɵɵadvance(2);
|
|
332
|
-
i0.ɵɵconditional(ctx.isLoading ?
|
|
333
|
-
} }, dependencies: [i1.
|
|
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:
|
|
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
|