@memberjunction/ng-dashboards 2.48.0 → 2.49.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/README.md +105 -2
- package/dist/AI/ai-dashboard.component.d.ts +2 -0
- package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
- package/dist/AI/ai-dashboard.component.js +66 -43
- package/dist/AI/ai-dashboard.component.js.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +45 -58
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +6 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +368 -366
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +83 -85
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +66 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.js +428 -0
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts +66 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.js +547 -0
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts +157 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2032 -20
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +211 -237
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +208 -226
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +97 -99
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +381 -424
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +173 -191
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +85 -87
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +86 -99
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts +25 -0
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/kpi-card.component.js +163 -0
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts +25 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js +298 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -0
- package/dist/AI/index.d.ts +7 -0
- package/dist/AI/index.d.ts.map +1 -0
- package/dist/AI/index.js +9 -0
- package/dist/AI/index.js.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts +109 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.js +490 -0
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -0
- package/dist/Actions/actions-management-dashboard.component.js +40 -41
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +117 -134
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +274 -296
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +12 -14
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +12 -14
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +12 -14
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +238 -256
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +12 -14
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +12 -14
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +12 -14
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-details.component.js +105 -107
- package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.js +100 -102
- package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-composite.component.js +84 -100
- package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-diagram.component.js +50 -50
- package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +45 -49
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/generic/base-dashboard.js +28 -40
- package/dist/generic/base-dashboard.js.map +1 -1
- package/dist/module.d.ts +16 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +36 -15
- package/dist/module.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { Component, Output, EventEmitter } from '@angular/core';
|
|
11
2
|
import { RunView, LogError, LogStatus } from '@memberjunction/core';
|
|
12
3
|
import * as i0 from "@angular/core";
|
|
@@ -140,54 +131,50 @@ function SystemConfigurationComponent_Conditional_24_Template(rf, ctx) { if (rf
|
|
|
140
131
|
i0.ɵɵconditional(ctx_r0.filteredConfigurations.length === 0 ? 0 : 1);
|
|
141
132
|
} }
|
|
142
133
|
export class SystemConfigurationComponent {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
};
|
|
156
|
-
}
|
|
134
|
+
openEntityRecord = new EventEmitter();
|
|
135
|
+
stateChange = new EventEmitter();
|
|
136
|
+
isLoading = false;
|
|
137
|
+
error = null;
|
|
138
|
+
filterPanelVisible = true;
|
|
139
|
+
configurations = [];
|
|
140
|
+
filteredConfigurations = [];
|
|
141
|
+
currentFilters = {
|
|
142
|
+
searchTerm: '',
|
|
143
|
+
status: 'all',
|
|
144
|
+
isDefault: 'all'
|
|
145
|
+
};
|
|
157
146
|
ngOnInit() {
|
|
158
147
|
this.loadData();
|
|
159
148
|
}
|
|
160
|
-
loadData() {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
LogStatus('AI Configurations loaded successfully');
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
throw new Error('Failed to load AI configurations');
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
this.error = 'Failed to load AI configurations. Please try again.';
|
|
185
|
-
LogError('Error loading AI configurations', undefined, error);
|
|
149
|
+
async loadData() {
|
|
150
|
+
try {
|
|
151
|
+
this.isLoading = true;
|
|
152
|
+
this.error = null;
|
|
153
|
+
const rv = new RunView();
|
|
154
|
+
const result = await rv.RunView({
|
|
155
|
+
EntityName: 'MJ: AI Configurations',
|
|
156
|
+
ExtraFilter: '',
|
|
157
|
+
OrderBy: 'Name',
|
|
158
|
+
UserSearchString: '',
|
|
159
|
+
IgnoreMaxRows: false,
|
|
160
|
+
MaxRows: 1000
|
|
161
|
+
});
|
|
162
|
+
if (result && result.Success && result.Results) {
|
|
163
|
+
this.configurations = result.Results;
|
|
164
|
+
this.applyFilters();
|
|
165
|
+
LogStatus('AI Configurations loaded successfully');
|
|
186
166
|
}
|
|
187
|
-
|
|
188
|
-
|
|
167
|
+
else {
|
|
168
|
+
throw new Error('Failed to load AI configurations');
|
|
189
169
|
}
|
|
190
|
-
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
this.error = 'Failed to load AI configurations. Please try again.';
|
|
173
|
+
LogError('Error loading AI configurations', undefined, error);
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
this.isLoading = false;
|
|
177
|
+
}
|
|
191
178
|
}
|
|
192
179
|
toggleFilterPanel() {
|
|
193
180
|
this.filterPanelVisible = !this.filterPanelVisible;
|
|
@@ -197,7 +184,7 @@ export class SystemConfigurationComponent {
|
|
|
197
184
|
this.emitStateChange();
|
|
198
185
|
}
|
|
199
186
|
onFiltersChange(filters) {
|
|
200
|
-
this.currentFilters =
|
|
187
|
+
this.currentFilters = { ...filters };
|
|
201
188
|
this.applyFilters();
|
|
202
189
|
}
|
|
203
190
|
onFilterChange() {
|
|
@@ -252,53 +239,53 @@ export class SystemConfigurationComponent {
|
|
|
252
239
|
getConfigIcon() {
|
|
253
240
|
return 'fa-solid fa-cogs';
|
|
254
241
|
}
|
|
242
|
+
static ɵfac = function SystemConfigurationComponent_Factory(t) { return new (t || SystemConfigurationComponent)(); };
|
|
243
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SystemConfigurationComponent, selectors: [["app-system-configuration"]], outputs: { openEntityRecord: "openEntityRecord", stateChange: "stateChange" }, decls: 25, vars: 17, consts: [["mjFillContainer", "", 1, "system-configuration-container", 3, "rightMargin", "bottomMargin"], [1, "dashboard-header"], [1, "header-info"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "config-count"], [1, "header-controls"], ["type", "button", "title", "Refresh", 1, "control-btn", 3, "click"], [1, "fa-solid", "fa-refresh"], ["type", "button", "title", "Create New Configuration", 1, "control-btn"], [1, "fa-solid", "fa-plus"], [1, "main-content"], ["orientation", "horizontal", "mjFillContainer", "", 1, "main-splitter", 3, "layoutChange"], [3, "size", "collapsible", "resizable", "scrollable", "hidden"], [3, "filtersChange", "filterChange", "resetFilters", "closePanel", "configurations", "filteredConfigurations", "filters"], [3, "resizable", "scrollable"], [1, "configurations-content"], [1, "loading-container"], [1, "error-container"], [1, "loading-content"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "empty-state"], [1, "configurations-grid"], [1, "fa-solid", "fa-cogs"], [1, "config-card"], [1, "card-header"], [1, "config-info"], [1, "config-icon"], [1, "config-details"], [1, "config-name"], [1, "config-meta"], [1, "default-badge"], [1, "card-body"], [1, "config-description"], [1, "config-description", "text-muted"], [1, "card-actions", 3, "click"], ["type", "button", 1, "action-btn"], [1, "fa-solid", "fa-eye"], ["type", "button", 1, "action-btn", "action-btn-primary"], [1, "fa-solid", "fa-edit"], ["type", "button", 1, "action-btn", "action-btn-warning"], ["type", "button", 1, "action-btn", "action-btn-danger"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-star"]], template: function SystemConfigurationComponent_Template(rf, ctx) { if (rf & 1) {
|
|
244
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "button", 3);
|
|
245
|
+
i0.ɵɵlistener("click", function SystemConfigurationComponent_Template_button_click_3_listener() { return ctx.toggleFilterPanel(); });
|
|
246
|
+
i0.ɵɵelement(4, "i", 4);
|
|
247
|
+
i0.ɵɵtemplate(5, SystemConfigurationComponent_Conditional_5_Template, 1, 0)(6, SystemConfigurationComponent_Conditional_6_Template, 1, 0);
|
|
248
|
+
i0.ɵɵelementEnd();
|
|
249
|
+
i0.ɵɵelementStart(7, "span", 5);
|
|
250
|
+
i0.ɵɵtext(8);
|
|
251
|
+
i0.ɵɵelementEnd()();
|
|
252
|
+
i0.ɵɵelementStart(9, "div", 6)(10, "button", 7);
|
|
253
|
+
i0.ɵɵlistener("click", function SystemConfigurationComponent_Template_button_click_10_listener() { return ctx.loadData(); });
|
|
254
|
+
i0.ɵɵelement(11, "i", 8);
|
|
255
|
+
i0.ɵɵtext(12, " Refresh ");
|
|
256
|
+
i0.ɵɵelementEnd();
|
|
257
|
+
i0.ɵɵelementStart(13, "button", 9);
|
|
258
|
+
i0.ɵɵelement(14, "i", 10);
|
|
259
|
+
i0.ɵɵtext(15, " New Configuration ");
|
|
260
|
+
i0.ɵɵelementEnd()()();
|
|
261
|
+
i0.ɵɵelementStart(16, "div", 11)(17, "kendo-splitter", 12);
|
|
262
|
+
i0.ɵɵlistener("layoutChange", function SystemConfigurationComponent_Template_kendo_splitter_layoutChange_17_listener($event) { return ctx.onMainSplitterChange($event); });
|
|
263
|
+
i0.ɵɵelementStart(18, "kendo-splitter-pane", 13)(19, "mj-system-config-filter-panel", 14);
|
|
264
|
+
i0.ɵɵlistener("filtersChange", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_filtersChange_19_listener($event) { return ctx.onFiltersChange($event); })("filterChange", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_filterChange_19_listener() { return ctx.onFilterChange(); })("resetFilters", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_resetFilters_19_listener() { return ctx.onResetFilters(); })("closePanel", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_closePanel_19_listener() { return ctx.toggleFilterPanel(); });
|
|
265
|
+
i0.ɵɵelementEnd()();
|
|
266
|
+
i0.ɵɵelementStart(20, "kendo-splitter-pane", 15)(21, "div", 16);
|
|
267
|
+
i0.ɵɵtemplate(22, SystemConfigurationComponent_Conditional_22_Template, 8, 0, "div", 17)(23, SystemConfigurationComponent_Conditional_23_Template, 4, 1, "div", 18)(24, SystemConfigurationComponent_Conditional_24_Template, 2, 1);
|
|
268
|
+
i0.ɵɵelementEnd()()()()();
|
|
269
|
+
} if (rf & 2) {
|
|
270
|
+
i0.ɵɵproperty("rightMargin", 8)("bottomMargin", 8);
|
|
271
|
+
i0.ɵɵadvance(5);
|
|
272
|
+
i0.ɵɵconditional(ctx.filterPanelVisible ? 5 : 6);
|
|
273
|
+
i0.ɵɵadvance(3);
|
|
274
|
+
i0.ɵɵtextInterpolate1("", ctx.filteredConfigurations.length, " configurations");
|
|
275
|
+
i0.ɵɵadvance(10);
|
|
276
|
+
i0.ɵɵproperty("size", ctx.filterPanelVisible ? "320px" : "0px")("collapsible", false)("resizable", ctx.filterPanelVisible)("scrollable", false)("hidden", !ctx.filterPanelVisible);
|
|
277
|
+
i0.ɵɵadvance();
|
|
278
|
+
i0.ɵɵproperty("configurations", ctx.configurations)("filteredConfigurations", ctx.filteredConfigurations)("filters", ctx.currentFilters);
|
|
279
|
+
i0.ɵɵadvance();
|
|
280
|
+
i0.ɵɵproperty("resizable", true)("scrollable", false);
|
|
281
|
+
i0.ɵɵadvance(2);
|
|
282
|
+
i0.ɵɵconditional(ctx.isLoading ? 22 : -1);
|
|
283
|
+
i0.ɵɵadvance();
|
|
284
|
+
i0.ɵɵconditional(ctx.error ? 23 : -1);
|
|
285
|
+
i0.ɵɵadvance();
|
|
286
|
+
i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 24 : -1);
|
|
287
|
+
} }, dependencies: [i1.SplitterComponent, i1.SplitterPaneComponent, i2.FillContainer, i3.SystemConfigFilterPanelComponent], styles: ["@use \"../../../../../../dist/packages/Angular/Explorer/explorer-core/src/generic/generic-browse-list.component\";\n\n.config-content[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n}\n\n.config-cards-container[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n margin-top: 20px;\n}\n\n.config-card[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: box-shadow 0.2s ease;\n position: relative;\n\n &:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n }\n}\n\n.config-card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 12px;\n gap: 10px;\n}\n\n.config-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 16px;\n color: #333;\n margin: 0;\n flex: 1;\n}\n\n.config-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.default-badge[_ngcontent-%COMP%] {\n background: #007bff;\n color: white;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n text-transform: uppercase;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n\n &.active {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n }\n\n &.inactive {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n }\n\n &.deprecated {\n background: #fff3cd;\n color: #856404;\n border: 1px solid #ffeaa7;\n }\n\n &.preview {\n background: #e2e3e5;\n color: #383d41;\n border: 1px solid #d6d8db;\n }\n}\n\n.config-description[_ngcontent-%COMP%] {\n color: #666;\n font-size: 14px;\n line-height: 1.5;\n margin: 0;\n margin-bottom: 16px;\n}\n\n.config-meta[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 12px;\n color: #888;\n border-top: 1px solid #f0f0f0;\n padding-top: 12px;\n}\n\n.config-id[_ngcontent-%COMP%] {\n font-family: monospace;\n background: #f8f9fa;\n padding: 2px 6px;\n border-radius: 3px;\n}\n\n.main-splitter[_ngcontent-%COMP%] {\n height: 100%;\n width: 100%;\n \n .k-pane {\n overflow: hidden;\n }\n}\n\n.no-configs-message[_ngcontent-%COMP%] {\n text-align: center;\n color: #666;\n font-style: italic;\n margin-top: 50px;\n font-size: 16px;\n}\n\n.loading-message[_ngcontent-%COMP%] {\n text-align: center;\n color: #666;\n margin-top: 50px;\n font-size: 16px;\n}"] });
|
|
255
288
|
}
|
|
256
|
-
SystemConfigurationComponent.ɵfac = function SystemConfigurationComponent_Factory(t) { return new (t || SystemConfigurationComponent)(); };
|
|
257
|
-
SystemConfigurationComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SystemConfigurationComponent, selectors: [["app-system-configuration"]], outputs: { openEntityRecord: "openEntityRecord", stateChange: "stateChange" }, decls: 25, vars: 17, consts: [["mjFillContainer", "", 1, "system-configuration-container", 3, "rightMargin", "bottomMargin"], [1, "dashboard-header"], [1, "header-info"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "config-count"], [1, "header-controls"], ["type", "button", "title", "Refresh", 1, "control-btn", 3, "click"], [1, "fa-solid", "fa-refresh"], ["type", "button", "title", "Create New Configuration", 1, "control-btn"], [1, "fa-solid", "fa-plus"], [1, "main-content"], ["orientation", "horizontal", "mjFillContainer", "", 1, "main-splitter", 3, "layoutChange"], [3, "size", "collapsible", "resizable", "scrollable", "hidden"], [3, "filtersChange", "filterChange", "resetFilters", "closePanel", "configurations", "filteredConfigurations", "filters"], [3, "resizable", "scrollable"], [1, "configurations-content"], [1, "loading-container"], [1, "error-container"], [1, "loading-content"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "empty-state"], [1, "configurations-grid"], [1, "fa-solid", "fa-cogs"], [1, "config-card"], [1, "card-header"], [1, "config-info"], [1, "config-icon"], [1, "config-details"], [1, "config-name"], [1, "config-meta"], [1, "default-badge"], [1, "card-body"], [1, "config-description"], [1, "config-description", "text-muted"], [1, "card-actions", 3, "click"], ["type", "button", 1, "action-btn"], [1, "fa-solid", "fa-eye"], ["type", "button", 1, "action-btn", "action-btn-primary"], [1, "fa-solid", "fa-edit"], ["type", "button", 1, "action-btn", "action-btn-warning"], ["type", "button", 1, "action-btn", "action-btn-danger"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-star"]], template: function SystemConfigurationComponent_Template(rf, ctx) { if (rf & 1) {
|
|
258
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "button", 3);
|
|
259
|
-
i0.ɵɵlistener("click", function SystemConfigurationComponent_Template_button_click_3_listener() { return ctx.toggleFilterPanel(); });
|
|
260
|
-
i0.ɵɵelement(4, "i", 4);
|
|
261
|
-
i0.ɵɵtemplate(5, SystemConfigurationComponent_Conditional_5_Template, 1, 0)(6, SystemConfigurationComponent_Conditional_6_Template, 1, 0);
|
|
262
|
-
i0.ɵɵelementEnd();
|
|
263
|
-
i0.ɵɵelementStart(7, "span", 5);
|
|
264
|
-
i0.ɵɵtext(8);
|
|
265
|
-
i0.ɵɵelementEnd()();
|
|
266
|
-
i0.ɵɵelementStart(9, "div", 6)(10, "button", 7);
|
|
267
|
-
i0.ɵɵlistener("click", function SystemConfigurationComponent_Template_button_click_10_listener() { return ctx.loadData(); });
|
|
268
|
-
i0.ɵɵelement(11, "i", 8);
|
|
269
|
-
i0.ɵɵtext(12, " Refresh ");
|
|
270
|
-
i0.ɵɵelementEnd();
|
|
271
|
-
i0.ɵɵelementStart(13, "button", 9);
|
|
272
|
-
i0.ɵɵelement(14, "i", 10);
|
|
273
|
-
i0.ɵɵtext(15, " New Configuration ");
|
|
274
|
-
i0.ɵɵelementEnd()()();
|
|
275
|
-
i0.ɵɵelementStart(16, "div", 11)(17, "kendo-splitter", 12);
|
|
276
|
-
i0.ɵɵlistener("layoutChange", function SystemConfigurationComponent_Template_kendo_splitter_layoutChange_17_listener($event) { return ctx.onMainSplitterChange($event); });
|
|
277
|
-
i0.ɵɵelementStart(18, "kendo-splitter-pane", 13)(19, "mj-system-config-filter-panel", 14);
|
|
278
|
-
i0.ɵɵlistener("filtersChange", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_filtersChange_19_listener($event) { return ctx.onFiltersChange($event); })("filterChange", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_filterChange_19_listener() { return ctx.onFilterChange(); })("resetFilters", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_resetFilters_19_listener() { return ctx.onResetFilters(); })("closePanel", function SystemConfigurationComponent_Template_mj_system_config_filter_panel_closePanel_19_listener() { return ctx.toggleFilterPanel(); });
|
|
279
|
-
i0.ɵɵelementEnd()();
|
|
280
|
-
i0.ɵɵelementStart(20, "kendo-splitter-pane", 15)(21, "div", 16);
|
|
281
|
-
i0.ɵɵtemplate(22, SystemConfigurationComponent_Conditional_22_Template, 8, 0, "div", 17)(23, SystemConfigurationComponent_Conditional_23_Template, 4, 1, "div", 18)(24, SystemConfigurationComponent_Conditional_24_Template, 2, 1);
|
|
282
|
-
i0.ɵɵelementEnd()()()()();
|
|
283
|
-
} if (rf & 2) {
|
|
284
|
-
i0.ɵɵproperty("rightMargin", 8)("bottomMargin", 8);
|
|
285
|
-
i0.ɵɵadvance(5);
|
|
286
|
-
i0.ɵɵconditional(ctx.filterPanelVisible ? 5 : 6);
|
|
287
|
-
i0.ɵɵadvance(3);
|
|
288
|
-
i0.ɵɵtextInterpolate1("", ctx.filteredConfigurations.length, " configurations");
|
|
289
|
-
i0.ɵɵadvance(10);
|
|
290
|
-
i0.ɵɵproperty("size", ctx.filterPanelVisible ? "320px" : "0px")("collapsible", false)("resizable", ctx.filterPanelVisible)("scrollable", false)("hidden", !ctx.filterPanelVisible);
|
|
291
|
-
i0.ɵɵadvance();
|
|
292
|
-
i0.ɵɵproperty("configurations", ctx.configurations)("filteredConfigurations", ctx.filteredConfigurations)("filters", ctx.currentFilters);
|
|
293
|
-
i0.ɵɵadvance();
|
|
294
|
-
i0.ɵɵproperty("resizable", true)("scrollable", false);
|
|
295
|
-
i0.ɵɵadvance(2);
|
|
296
|
-
i0.ɵɵconditional(ctx.isLoading ? 22 : -1);
|
|
297
|
-
i0.ɵɵadvance();
|
|
298
|
-
i0.ɵɵconditional(ctx.error ? 23 : -1);
|
|
299
|
-
i0.ɵɵadvance();
|
|
300
|
-
i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 24 : -1);
|
|
301
|
-
} }, dependencies: [i1.SplitterComponent, i1.SplitterPaneComponent, i2.FillContainer, i3.SystemConfigFilterPanelComponent], styles: ["@use \"../../../../../../dist/packages/Angular/Explorer/explorer-core/src/generic/generic-browse-list.component\";\n\n.config-content[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n}\n\n.config-cards-container[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n margin-top: 20px;\n}\n\n.config-card[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: box-shadow 0.2s ease;\n position: relative;\n\n &:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n }\n}\n\n.config-card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 12px;\n gap: 10px;\n}\n\n.config-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 16px;\n color: #333;\n margin: 0;\n flex: 1;\n}\n\n.config-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.default-badge[_ngcontent-%COMP%] {\n background: #007bff;\n color: white;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n text-transform: uppercase;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n\n &.active {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n }\n\n &.inactive {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n }\n\n &.deprecated {\n background: #fff3cd;\n color: #856404;\n border: 1px solid #ffeaa7;\n }\n\n &.preview {\n background: #e2e3e5;\n color: #383d41;\n border: 1px solid #d6d8db;\n }\n}\n\n.config-description[_ngcontent-%COMP%] {\n color: #666;\n font-size: 14px;\n line-height: 1.5;\n margin: 0;\n margin-bottom: 16px;\n}\n\n.config-meta[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 12px;\n color: #888;\n border-top: 1px solid #f0f0f0;\n padding-top: 12px;\n}\n\n.config-id[_ngcontent-%COMP%] {\n font-family: monospace;\n background: #f8f9fa;\n padding: 2px 6px;\n border-radius: 3px;\n}\n\n.main-splitter[_ngcontent-%COMP%] {\n height: 100%;\n width: 100%;\n \n .k-pane {\n overflow: hidden;\n }\n}\n\n.no-configs-message[_ngcontent-%COMP%] {\n text-align: center;\n color: #666;\n font-style: italic;\n margin-top: 50px;\n font-size: 16px;\n}\n\n.loading-message[_ngcontent-%COMP%] {\n text-align: center;\n color: #666;\n margin-top: 50px;\n font-size: 16px;\n}"] });
|
|
302
289
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SystemConfigurationComponent, [{
|
|
303
290
|
type: Component,
|
|
304
291
|
args: [{ selector: 'app-system-configuration', template: "<div class=\"system-configuration-container\" mjFillContainer [rightMargin]=\"8\" [bottomMargin]=\"8\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <button \n type=\"button\" \n class=\"filter-toggle-btn\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (filterPanelVisible) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"config-count\">{{ filteredConfigurations.length }} configurations</span>\n </div>\n \n <div class=\"header-controls\">\n <button \n type=\"button\" \n class=\"control-btn\"\n (click)=\"loadData()\"\n title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n Refresh\n </button>\n <button \n type=\"button\" \n class=\"control-btn\"\n title=\"Create New Configuration\">\n <i class=\"fa-solid fa-plus\"></i>\n New Configuration\n </button>\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <div class=\"main-content\">\n <kendo-splitter \n class=\"main-splitter\"\n orientation=\"horizontal\"\n (layoutChange)=\"onMainSplitterChange($event)\"\n mjFillContainer>\n \n <!-- Filter Panel (Left) -->\n <kendo-splitter-pane \n [size]=\"filterPanelVisible ? '320px' : '0px'\"\n [collapsible]=\"false\"\n [resizable]=\"filterPanelVisible\"\n [scrollable]=\"false\"\n [hidden]=\"!filterPanelVisible\">\n <mj-system-config-filter-panel\n [configurations]=\"configurations\"\n [filteredConfigurations]=\"filteredConfigurations\"\n [filters]=\"currentFilters\"\n (filtersChange)=\"onFiltersChange($event)\"\n (filterChange)=\"onFilterChange()\"\n (resetFilters)=\"onResetFilters()\"\n (closePanel)=\"toggleFilterPanel()\">\n </mj-system-config-filter-panel>\n </kendo-splitter-pane>\n \n <!-- Configurations List Panel -->\n <kendo-splitter-pane \n [resizable]=\"true\"\n [scrollable]=\"false\">\n <div class=\"configurations-content\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">Loading configurations...</div>\n </div>\n </div>\n }\n\n <!-- Error State -->\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ error }}\n </p>\n </div>\n }\n\n <!-- Configurations List -->\n @if (!isLoading && !error) {\n @if (filteredConfigurations.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cogs\"></i>\n <h3>No configurations found</h3>\n <p>No AI configurations match your current filters. Try adjusting your search criteria or create a new configuration.</p>\n </div>\n } @else {\n <div class=\"configurations-grid\">\n @for (config of filteredConfigurations; track config.ID) {\n <div class=\"config-card\">\n <!-- Card Header -->\n <div class=\"card-header\">\n <div class=\"config-info\">\n <div class=\"config-icon\">\n <i [class]=\"getConfigIcon()\"></i>\n </div>\n <div class=\"config-details\">\n <h4 class=\"config-name\">{{ config.Name }}</h4>\n <div class=\"config-meta\">\n @if (config.IsDefault) {\n <span class=\"default-badge\">\n <i class=\"fa-solid fa-star\"></i>\n Default\n </span>\n }\n </div>\n </div>\n </div>\n \n <div class=\"status-badge status-{{ config.Status.toLowerCase() }}\">\n {{ config.Status }}\n </div>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (config.Description) {\n <p class=\"config-description\">{{ config.Description }}</p>\n } @else {\n <p class=\"config-description text-muted\">No description provided</p>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button \n type=\"button\" \n class=\"action-btn\">\n <i class=\"fa-solid fa-eye\"></i>\n View\n </button>\n \n <button \n type=\"button\" \n class=\"action-btn action-btn-primary\">\n <i class=\"fa-solid fa-edit\"></i>\n Configure\n </button>\n \n @if (!config.IsDefault) {\n <button \n type=\"button\" \n class=\"action-btn action-btn-warning\">\n <i class=\"fa-solid fa-star\"></i>\n Set Default\n </button>\n }\n \n <button \n type=\"button\" \n class=\"action-btn action-btn-danger\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n</div>", styles: ["@use \"../../../../../../dist/packages/Angular/Explorer/explorer-core/src/generic/generic-browse-list.component\";\n\n.config-content {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n}\n\n.config-cards-container {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n margin-top: 20px;\n}\n\n.config-card {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: box-shadow 0.2s ease;\n position: relative;\n\n &:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n }\n}\n\n.config-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 12px;\n gap: 10px;\n}\n\n.config-name {\n font-weight: 600;\n font-size: 16px;\n color: #333;\n margin: 0;\n flex: 1;\n}\n\n.config-badges {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.default-badge {\n background: #007bff;\n color: white;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n text-transform: uppercase;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n\n &.active {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n }\n\n &.inactive {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n }\n\n &.deprecated {\n background: #fff3cd;\n color: #856404;\n border: 1px solid #ffeaa7;\n }\n\n &.preview {\n background: #e2e3e5;\n color: #383d41;\n border: 1px solid #d6d8db;\n }\n}\n\n.config-description {\n color: #666;\n font-size: 14px;\n line-height: 1.5;\n margin: 0;\n margin-bottom: 16px;\n}\n\n.config-meta {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 12px;\n color: #888;\n border-top: 1px solid #f0f0f0;\n padding-top: 12px;\n}\n\n.config-id {\n font-family: monospace;\n background: #f8f9fa;\n padding: 2px 6px;\n border-radius: 3px;\n}\n\n.main-splitter {\n height: 100%;\n width: 100%;\n \n .k-pane {\n overflow: hidden;\n }\n}\n\n.no-configs-message {\n text-align: center;\n color: #666;\n font-style: italic;\n margin-top: 50px;\n font-size: 16px;\n}\n\n.loading-message {\n text-align: center;\n color: #666;\n margin-top: 50px;\n font-size: 16px;\n}"] }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-configuration.component.js","sourceRoot":"","sources":["../../../../src/AI/components/system/system-configuration.component.ts","../../../../src/AI/components/system/system-configuration.component.html"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"system-configuration.component.js","sourceRoot":"","sources":["../../../../src/AI/components/system/system-configuration.component.ts","../../../../src/AI/components/system/system-configuration.component.html"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export interface KPICardData {
|
|
4
|
+
title: string;
|
|
5
|
+
value: string | number;
|
|
6
|
+
subtitle?: string;
|
|
7
|
+
icon: string;
|
|
8
|
+
color: 'primary' | 'success' | 'warning' | 'danger' | 'info';
|
|
9
|
+
trend?: {
|
|
10
|
+
direction: 'up' | 'down' | 'stable';
|
|
11
|
+
percentage: number;
|
|
12
|
+
period: string;
|
|
13
|
+
};
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class KPICardComponent implements OnInit {
|
|
17
|
+
data: KPICardData;
|
|
18
|
+
ngOnInit(): void;
|
|
19
|
+
formatValue(value: string | number): string;
|
|
20
|
+
getTrendIcon(): string;
|
|
21
|
+
getTrendColor(): string;
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<KPICardComponent, never>;
|
|
23
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<KPICardComponent, "app-kpi-card", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, false, never>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=kpi-card.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi-card.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/widgets/kpi-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,MAAM,eAAe,CAAC;;AAEzD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7D,KAAK,CAAC,EAAE;QACN,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBA6Ja,gBAAiB,YAAW,MAAM;IACpC,IAAI,EAAG,WAAW,CAAC;IAE5B,QAAQ;IAMR,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAe3C,YAAY,IAAI,MAAM;IAetB,aAAa,IAAI,MAAM;yCAvCZ,gBAAgB;2CAAhB,gBAAgB;CAqD5B"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
function KPICardComponent_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
5
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
6
|
+
i0.ɵɵtext(1);
|
|
7
|
+
i0.ɵɵelementEnd();
|
|
8
|
+
} if (rf & 2) {
|
|
9
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
10
|
+
i0.ɵɵadvance();
|
|
11
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatValue(ctx_r0.data.value), " ");
|
|
12
|
+
} }
|
|
13
|
+
function KPICardComponent_div_8_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
15
|
+
i0.ɵɵelement(1, "div", 11);
|
|
16
|
+
i0.ɵɵelementEnd();
|
|
17
|
+
} }
|
|
18
|
+
function KPICardComponent_div_9_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 12);
|
|
20
|
+
i0.ɵɵtext(1);
|
|
21
|
+
i0.ɵɵelementEnd();
|
|
22
|
+
} if (rf & 2) {
|
|
23
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
24
|
+
i0.ɵɵadvance();
|
|
25
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.data.subtitle, " ");
|
|
26
|
+
} }
|
|
27
|
+
function KPICardComponent_div_10_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
29
|
+
i0.ɵɵelement(1, "i");
|
|
30
|
+
i0.ɵɵelementStart(2, "span", 14);
|
|
31
|
+
i0.ɵɵtext(3);
|
|
32
|
+
i0.ɵɵelementEnd();
|
|
33
|
+
i0.ɵɵelementStart(4, "span", 15);
|
|
34
|
+
i0.ɵɵtext(5);
|
|
35
|
+
i0.ɵɵelementEnd()();
|
|
36
|
+
} if (rf & 2) {
|
|
37
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
38
|
+
i0.ɵɵadvance();
|
|
39
|
+
i0.ɵɵclassMap(ctx_r0.getTrendIcon());
|
|
40
|
+
i0.ɵɵstyleProp("color", ctx_r0.getTrendColor());
|
|
41
|
+
i0.ɵɵadvance();
|
|
42
|
+
i0.ɵɵstyleProp("color", ctx_r0.getTrendColor());
|
|
43
|
+
i0.ɵɵadvance();
|
|
44
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.data.trend.percentage, "% ");
|
|
45
|
+
i0.ɵɵadvance(2);
|
|
46
|
+
i0.ɵɵtextInterpolate(ctx_r0.data.trend.period);
|
|
47
|
+
} }
|
|
48
|
+
export class KPICardComponent {
|
|
49
|
+
data;
|
|
50
|
+
ngOnInit() {
|
|
51
|
+
if (!this.data) {
|
|
52
|
+
throw new Error('KPICardComponent requires data input');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
formatValue(value) {
|
|
56
|
+
if (typeof value === 'number') {
|
|
57
|
+
// Format large numbers with appropriate suffixes
|
|
58
|
+
if (value >= 1000000) {
|
|
59
|
+
return (value / 1000000).toFixed(1) + 'M';
|
|
60
|
+
}
|
|
61
|
+
else if (value >= 1000) {
|
|
62
|
+
return (value / 1000).toFixed(1) + 'K';
|
|
63
|
+
}
|
|
64
|
+
else if (value % 1 !== 0) {
|
|
65
|
+
return value.toFixed(2);
|
|
66
|
+
}
|
|
67
|
+
return value.toString();
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
getTrendIcon() {
|
|
72
|
+
if (!this.data.trend)
|
|
73
|
+
return '';
|
|
74
|
+
switch (this.data.trend.direction) {
|
|
75
|
+
case 'up':
|
|
76
|
+
return 'fa-solid fa-arrow-up';
|
|
77
|
+
case 'down':
|
|
78
|
+
return 'fa-solid fa-arrow-down';
|
|
79
|
+
case 'stable':
|
|
80
|
+
return 'fa-solid fa-minus';
|
|
81
|
+
default:
|
|
82
|
+
return '';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
getTrendColor() {
|
|
86
|
+
if (!this.data.trend)
|
|
87
|
+
return '#999';
|
|
88
|
+
switch (this.data.trend.direction) {
|
|
89
|
+
case 'up':
|
|
90
|
+
return '#4caf50';
|
|
91
|
+
case 'down':
|
|
92
|
+
return '#f44336';
|
|
93
|
+
case 'stable':
|
|
94
|
+
return '#999';
|
|
95
|
+
default:
|
|
96
|
+
return '#999';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
static ɵfac = function KPICardComponent_Factory(t) { return new (t || KPICardComponent)(); };
|
|
100
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KPICardComponent, selectors: [["app-kpi-card"]], inputs: { data: "data" }, decls: 11, vars: 9, consts: [[1, "kpi-card"], [1, "kpi-card__header"], [1, "kpi-card__icon"], [1, "kpi-card__title"], [1, "kpi-card__content"], ["class", "kpi-card__value", 4, "ngIf"], ["class", "kpi-card__loading", 4, "ngIf"], ["class", "kpi-card__subtitle", 4, "ngIf"], ["class", "kpi-card__trend", 4, "ngIf"], [1, "kpi-card__value"], [1, "kpi-card__loading"], [1, "spinner"], [1, "kpi-card__subtitle"], [1, "kpi-card__trend"], [1, "trend-percentage"], [1, "trend-period"]], template: function KPICardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
101
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
|
|
102
|
+
i0.ɵɵelement(3, "i");
|
|
103
|
+
i0.ɵɵelementEnd();
|
|
104
|
+
i0.ɵɵelementStart(4, "div", 3);
|
|
105
|
+
i0.ɵɵtext(5);
|
|
106
|
+
i0.ɵɵelementEnd()();
|
|
107
|
+
i0.ɵɵelementStart(6, "div", 4);
|
|
108
|
+
i0.ɵɵtemplate(7, KPICardComponent_div_7_Template, 2, 1, "div", 5)(8, KPICardComponent_div_8_Template, 2, 0, "div", 6)(9, KPICardComponent_div_9_Template, 2, 1, "div", 7)(10, KPICardComponent_div_10_Template, 6, 8, "div", 8);
|
|
109
|
+
i0.ɵɵelementEnd()();
|
|
110
|
+
} if (rf & 2) {
|
|
111
|
+
i0.ɵɵclassMap("kpi-card--" + ctx.data.color);
|
|
112
|
+
i0.ɵɵadvance(3);
|
|
113
|
+
i0.ɵɵclassMap("fa-solid " + ctx.data.icon);
|
|
114
|
+
i0.ɵɵadvance(2);
|
|
115
|
+
i0.ɵɵtextInterpolate(ctx.data.title);
|
|
116
|
+
i0.ɵɵadvance(2);
|
|
117
|
+
i0.ɵɵproperty("ngIf", !ctx.data.loading);
|
|
118
|
+
i0.ɵɵadvance();
|
|
119
|
+
i0.ɵɵproperty("ngIf", ctx.data.loading);
|
|
120
|
+
i0.ɵɵadvance();
|
|
121
|
+
i0.ɵɵproperty("ngIf", ctx.data.subtitle && !ctx.data.loading);
|
|
122
|
+
i0.ɵɵadvance();
|
|
123
|
+
i0.ɵɵproperty("ngIf", ctx.data.trend && !ctx.data.loading);
|
|
124
|
+
} }, dependencies: [i1.NgIf], styles: [".kpi-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n padding: 20px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n border-left: 4px solid transparent;\n transition: all 0.3s ease;\n height: 140px;\n display: flex;\n flex-direction: column;\n }\n\n .kpi-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n }\n\n .kpi-card--primary[_ngcontent-%COMP%] { border-left-color: #2196f3; }\n .kpi-card--success[_ngcontent-%COMP%] { border-left-color: #4caf50; }\n .kpi-card--warning[_ngcontent-%COMP%] { border-left-color: #ff9800; }\n .kpi-card--danger[_ngcontent-%COMP%] { border-left-color: #f44336; }\n .kpi-card--info[_ngcontent-%COMP%] { border-left-color: #00bcd4; }\n\n .kpi-card__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 14px;\n }\n\n .kpi-card--primary[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] { background: rgba(33, 150, 243, 0.1); color: #2196f3; }\n .kpi-card--success[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] { background: rgba(76, 175, 80, 0.1); color: #4caf50; }\n .kpi-card--warning[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] { background: rgba(255, 152, 0, 0.1); color: #ff9800; }\n .kpi-card--danger[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] { background: rgba(244, 67, 54, 0.1); color: #f44336; }\n .kpi-card--info[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] { background: rgba(0, 188, 212, 0.1); color: #00bcd4; }\n\n .kpi-card__title[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: #333;\n margin-bottom: 4px;\n line-height: 1;\n }\n\n .kpi-card__subtitle[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #999;\n margin-bottom: 8px;\n }\n\n .kpi-card__trend[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage[_ngcontent-%COMP%] {\n font-weight: 600;\n }\n\n .trend-period[_ngcontent-%COMP%] {\n color: #999;\n }\n\n .kpi-card__loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n .spinner[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: 2px solid #f3f3f3;\n border-top: 2px solid #2196f3;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n }\n\n @keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n @media (max-width: 768px) {\n .kpi-card[_ngcontent-%COMP%] {\n height: auto;\n min-height: 120px;\n }\n \n .kpi-card__value[_ngcontent-%COMP%] {\n font-size: 24px;\n }\n }"] });
|
|
125
|
+
}
|
|
126
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KPICardComponent, [{
|
|
127
|
+
type: Component,
|
|
128
|
+
args: [{ selector: 'app-kpi-card', template: `
|
|
129
|
+
<div class="kpi-card" [class]="'kpi-card--' + data.color">
|
|
130
|
+
<div class="kpi-card__header">
|
|
131
|
+
<div class="kpi-card__icon">
|
|
132
|
+
<i [class]="'fa-solid ' + data.icon"></i>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="kpi-card__title">{{ data.title }}</div>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div class="kpi-card__content">
|
|
138
|
+
<div class="kpi-card__value" *ngIf="!data.loading">
|
|
139
|
+
{{ formatValue(data.value) }}
|
|
140
|
+
</div>
|
|
141
|
+
<div class="kpi-card__loading" *ngIf="data.loading">
|
|
142
|
+
<div class="spinner"></div>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<div class="kpi-card__subtitle" *ngIf="data.subtitle && !data.loading">
|
|
146
|
+
{{ data.subtitle }}
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<div class="kpi-card__trend" *ngIf="data.trend && !data.loading">
|
|
150
|
+
<i [class]="getTrendIcon()" [style.color]="getTrendColor()"></i>
|
|
151
|
+
<span class="trend-percentage" [style.color]="getTrendColor()">
|
|
152
|
+
{{ data.trend.percentage }}%
|
|
153
|
+
</span>
|
|
154
|
+
<span class="trend-period">{{ data.trend.period }}</span>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
`, styles: ["\n .kpi-card {\n background: white;\n border-radius: 8px;\n padding: 20px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n border-left: 4px solid transparent;\n transition: all 0.3s ease;\n height: 140px;\n display: flex;\n flex-direction: column;\n }\n\n .kpi-card:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n }\n\n .kpi-card--primary { border-left-color: #2196f3; }\n .kpi-card--success { border-left-color: #4caf50; }\n .kpi-card--warning { border-left-color: #ff9800; }\n .kpi-card--danger { border-left-color: #f44336; }\n .kpi-card--info { border-left-color: #00bcd4; }\n\n .kpi-card__header {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 14px;\n }\n\n .kpi-card--primary .kpi-card__icon { background: rgba(33, 150, 243, 0.1); color: #2196f3; }\n .kpi-card--success .kpi-card__icon { background: rgba(76, 175, 80, 0.1); color: #4caf50; }\n .kpi-card--warning .kpi-card__icon { background: rgba(255, 152, 0, 0.1); color: #ff9800; }\n .kpi-card--danger .kpi-card__icon { background: rgba(244, 67, 54, 0.1); color: #f44336; }\n .kpi-card--info .kpi-card__icon { background: rgba(0, 188, 212, 0.1); color: #00bcd4; }\n\n .kpi-card__title {\n font-size: 12px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value {\n font-size: 28px;\n font-weight: 700;\n color: #333;\n margin-bottom: 4px;\n line-height: 1;\n }\n\n .kpi-card__subtitle {\n font-size: 11px;\n color: #999;\n margin-bottom: 8px;\n }\n\n .kpi-card__trend {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage {\n font-weight: 600;\n }\n\n .trend-period {\n color: #999;\n }\n\n .kpi-card__loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n .spinner {\n width: 24px;\n height: 24px;\n border: 2px solid #f3f3f3;\n border-top: 2px solid #2196f3;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n @media (max-width: 768px) {\n .kpi-card {\n height: auto;\n min-height: 120px;\n }\n \n .kpi-card__value {\n font-size: 24px;\n }\n }\n "] }]
|
|
159
|
+
}], null, { data: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}] }); })();
|
|
162
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KPICardComponent, { className: "KPICardComponent", filePath: "src/AI/components/widgets/kpi-card.component.ts", lineNumber: 174 }); })();
|
|
163
|
+
//# sourceMappingURL=kpi-card.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi-card.component.js","sourceRoot":"","sources":["../../../../src/AI/components/widgets/kpi-card.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import { LiveExecution } from '../../services/ai-instrumentation.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class LiveExecutionWidgetComponent implements OnInit, OnDestroy {
|
|
5
|
+
executions: LiveExecution[];
|
|
6
|
+
maxVisible: number;
|
|
7
|
+
executionClick: EventEmitter<LiveExecution>;
|
|
8
|
+
showAll: boolean;
|
|
9
|
+
circumference: number;
|
|
10
|
+
ngOnInit(): void;
|
|
11
|
+
ngOnDestroy(): void;
|
|
12
|
+
trackByExecutionId(index: number, execution: LiveExecution): string;
|
|
13
|
+
hasActiveExecutions(): boolean;
|
|
14
|
+
getActiveCount(): number;
|
|
15
|
+
getExecutionIcon(execution: LiveExecution): string;
|
|
16
|
+
getStatusIcon(status: string): string;
|
|
17
|
+
formatDuration(duration?: number): string;
|
|
18
|
+
getProgressOffset(progress: number): number;
|
|
19
|
+
toggleShowAll(): void;
|
|
20
|
+
onExecutionClick(execution: LiveExecution): void;
|
|
21
|
+
formatCurrency(amount: number): string;
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LiveExecutionWidgetComponent, never>;
|
|
23
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LiveExecutionWidgetComponent, "app-live-execution-widget", never, { "executions": { "alias": "executions"; "required": false; }; "maxVisible": { "alias": "maxVisible"; "required": false; }; }, { "executionClick": "executionClick"; }, never, never, false, never>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=live-execution-widget.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-execution-widget.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/widgets/live-execution-widget.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;;AAE1E,qBA0Xa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IAC3D,UAAU,EAAE,aAAa,EAAE,CAAM;IACjC,UAAU,SAAK;IACd,cAAc,8BAAqC;IAE7D,OAAO,UAAS;IAChB,aAAa,SAAoB;IAEjC,QAAQ;IAER,WAAW;IAEX,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,MAAM;IAInE,mBAAmB,IAAI,OAAO;IAI9B,cAAc,IAAI,MAAM;IAIxB,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM;IAQlD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAarC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI3C,aAAa,IAAI,IAAI;IAKrB,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAIhD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;yCA1E3B,4BAA4B;2CAA5B,4BAA4B;CA6ExC"}
|