@memberjunction/ng-dashboards 2.47.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.
Files changed (92) hide show
  1. package/README.md +105 -2
  2. package/dist/AI/ai-dashboard.component.d.ts +2 -0
  3. package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
  4. package/dist/AI/ai-dashboard.component.js +66 -43
  5. package/dist/AI/ai-dashboard.component.js.map +1 -1
  6. package/dist/AI/components/agents/agent-configuration.component.js +45 -58
  7. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  8. package/dist/AI/components/agents/agent-editor.component.d.ts +6 -1
  9. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  10. package/dist/AI/components/agents/agent-editor.component.js +368 -366
  11. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  12. package/dist/AI/components/agents/agent-filter-panel.component.js +83 -85
  13. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  14. package/dist/AI/components/charts/performance-heatmap.component.d.ts +66 -0
  15. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -0
  16. package/dist/AI/components/charts/performance-heatmap.component.js +428 -0
  17. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -0
  18. package/dist/AI/components/charts/time-series-chart.component.d.ts +66 -0
  19. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -0
  20. package/dist/AI/components/charts/time-series-chart.component.js +547 -0
  21. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -0
  22. package/dist/AI/components/execution-monitoring.component.d.ts +157 -5
  23. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  24. package/dist/AI/components/execution-monitoring.component.js +2032 -20
  25. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  26. package/dist/AI/components/models/model-management.component.js +211 -237
  27. package/dist/AI/components/models/model-management.component.js.map +1 -1
  28. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +208 -226
  29. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  30. package/dist/AI/components/prompts/prompt-filter-panel.component.js +97 -99
  31. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
  32. package/dist/AI/components/prompts/prompt-management.component.js +381 -424
  33. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  34. package/dist/AI/components/prompts/prompt-version-control.component.js +173 -191
  35. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  36. package/dist/AI/components/system/system-config-filter-panel.component.js +85 -87
  37. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
  38. package/dist/AI/components/system/system-configuration.component.js +86 -99
  39. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  40. package/dist/AI/components/widgets/kpi-card.component.d.ts +25 -0
  41. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -0
  42. package/dist/AI/components/widgets/kpi-card.component.js +163 -0
  43. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -0
  44. package/dist/AI/components/widgets/live-execution-widget.component.d.ts +25 -0
  45. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -0
  46. package/dist/AI/components/widgets/live-execution-widget.component.js +298 -0
  47. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -0
  48. package/dist/AI/index.d.ts +7 -0
  49. package/dist/AI/index.d.ts.map +1 -0
  50. package/dist/AI/index.js +9 -0
  51. package/dist/AI/index.js.map +1 -0
  52. package/dist/AI/services/ai-instrumentation.service.d.ts +109 -0
  53. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -0
  54. package/dist/AI/services/ai-instrumentation.service.js +490 -0
  55. package/dist/AI/services/ai-instrumentation.service.js.map +1 -0
  56. package/dist/Actions/actions-management-dashboard.component.js +40 -41
  57. package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
  58. package/dist/Actions/components/actions-list-view.component.js +117 -134
  59. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  60. package/dist/Actions/components/actions-overview.component.js +274 -296
  61. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  62. package/dist/Actions/components/categories-list-view.component.js +12 -14
  63. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  64. package/dist/Actions/components/code-management.component.js +12 -14
  65. package/dist/Actions/components/code-management.component.js.map +1 -1
  66. package/dist/Actions/components/entity-integration.component.js +12 -14
  67. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  68. package/dist/Actions/components/execution-monitoring.component.js +238 -256
  69. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  70. package/dist/Actions/components/executions-list-view.component.js +12 -14
  71. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  72. package/dist/Actions/components/scheduled-actions.component.js +12 -14
  73. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  74. package/dist/Actions/components/security-permissions.component.js +12 -14
  75. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  76. package/dist/EntityAdmin/components/entity-details.component.js +105 -107
  77. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
  78. package/dist/EntityAdmin/components/entity-filter-panel.component.js +100 -102
  79. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -1
  80. package/dist/EntityAdmin/components/erd-composite.component.js +84 -100
  81. package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -1
  82. package/dist/EntityAdmin/components/erd-diagram.component.js +50 -50
  83. package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -1
  84. package/dist/EntityAdmin/entity-admin-dashboard.component.js +45 -49
  85. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  86. package/dist/generic/base-dashboard.js +28 -40
  87. package/dist/generic/base-dashboard.js.map +1 -1
  88. package/dist/module.d.ts +16 -12
  89. package/dist/module.d.ts.map +1 -1
  90. package/dist/module.js +36 -15
  91. package/dist/module.js.map +1 -1
  92. 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
- constructor() {
144
- this.openEntityRecord = new EventEmitter();
145
- this.stateChange = new EventEmitter();
146
- this.isLoading = false;
147
- this.error = null;
148
- this.filterPanelVisible = true;
149
- this.configurations = [];
150
- this.filteredConfigurations = [];
151
- this.currentFilters = {
152
- searchTerm: '',
153
- status: 'all',
154
- isDefault: 'all'
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
- return __awaiter(this, void 0, void 0, function* () {
162
- try {
163
- this.isLoading = true;
164
- this.error = null;
165
- const rv = new RunView();
166
- const result = yield rv.RunView({
167
- EntityName: 'MJ: AI Configurations',
168
- ExtraFilter: '',
169
- OrderBy: 'Name',
170
- UserSearchString: '',
171
- IgnoreMaxRows: false,
172
- MaxRows: 1000
173
- });
174
- if (result && result.Success && result.Results) {
175
- this.configurations = result.Results;
176
- this.applyFilters();
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
- finally {
188
- this.isLoading = false;
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 = Object.assign({}, filters);
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":"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"}
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"}