@memberjunction/ng-dashboards 5.22.0 → 5.23.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 +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +364 -362
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +275 -64
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2645 -436
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +240 -6
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2166 -256
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +191 -197
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +9 -8
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +305 -299
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +319 -313
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -2
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +12 -27
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +10 -12
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +61 -68
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -11
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +82 -96
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +130 -134
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +40 -46
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +2 -2
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +2 -2
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +127 -132
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +2 -2
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +11 -17
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
- package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
- package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +2 -2
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +2 -2
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
- package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -4
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +4 -4
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +246 -259
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +7 -9
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +6 -10
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +12 -20
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +106 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +607 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +7 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +59 -31
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +1 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +1 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +9 -7
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +10 -9
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +6 -9
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +20 -22
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +9 -10
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +8 -13
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +6 -27
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +16 -20
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +23 -44
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +4 -8
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +0 -19
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +7 -11
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +22 -34
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +12 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +15 -31
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +5 -8
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +3 -19
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +7 -13
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +0 -27
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +5 -8
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +3 -19
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +6 -10
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +3 -23
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +7 -13
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +0 -27
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +47 -55
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
2
|
import { ResolveIntegrationIcon } from '../../services/integration-data.service';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@
|
|
4
|
+
import * as i1 from "@memberjunction/ng-ui-components";
|
|
5
5
|
import * as i2 from "@angular/common";
|
|
6
6
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
7
7
|
function IntegrationCardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -109,7 +109,7 @@ export class IntegrationCardComponent {
|
|
|
109
109
|
this.ExpandToggle.emit(this.Summary.Integration.ID);
|
|
110
110
|
}
|
|
111
111
|
static ɵfac = function IntegrationCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || IntegrationCardComponent)(); };
|
|
112
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: IntegrationCardComponent, selectors: [["app-integration-card"]], inputs: { Summary: "Summary", Expanded: "Expanded", ViewProvider: "ViewProvider" }, outputs: { RunNowClick: "RunNowClick", ExpandToggle: "ExpandToggle" }, standalone: false, decls: 29, vars:
|
|
112
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: IntegrationCardComponent, selectors: [["app-integration-card"]], inputs: { Summary: "Summary", Expanded: "Expanded", ViewProvider: "ViewProvider" }, outputs: { RunNowClick: "RunNowClick", ExpandToggle: "ExpandToggle" }, standalone: false, decls: 29, vars: 22, consts: [[1, "integration-card"], [1, "card-header"], [1, "source-icon"], [1, "card-title-area"], [1, "card-title"], [1, "source-type-label"], [1, "status-area"], [1, "status-indicator"], [1, "status-chip"], [1, "card-body"], [1, "stat-row"], [1, "stat-label"], [1, "stat-value"], [1, "sparkline-row"], [1, "card-footer"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [1, "fa-solid", "fa-play"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "fa-solid"], [1, "stat-value", "error-value"], [1, "error-badge"], [1, "sparkline-label"], [1, "sparkline"], [1, "spark-bar", 3, "height", "spark-success", "spark-failed", "spark-pending", "title"], [1, "spark-bar", 3, "title"]], template: function IntegrationCardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
113
113
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
|
|
114
114
|
i0.ɵɵelement(3, "i");
|
|
115
115
|
i0.ɵɵelementEnd();
|
|
@@ -168,12 +168,10 @@ export class IntegrationCardComponent {
|
|
|
168
168
|
i0.ɵɵadvance();
|
|
169
169
|
i0.ɵɵconditional(ctx.Summary.RecentRuns.length > 1 ? 21 : -1);
|
|
170
170
|
i0.ɵɵadvance(2);
|
|
171
|
-
i0.ɵɵproperty("
|
|
172
|
-
i0.ɵɵadvance(
|
|
173
|
-
i0.ɵɵproperty("look", "flat");
|
|
174
|
-
i0.ɵɵadvance();
|
|
171
|
+
i0.ɵɵproperty("disabled", !ctx.Summary.Integration.IsActive);
|
|
172
|
+
i0.ɵɵadvance(4);
|
|
175
173
|
i0.ɵɵclassProp("fa-chevron-down", !ctx.Expanded)("fa-chevron-up", ctx.Expanded);
|
|
176
|
-
} }, dependencies: [i1.
|
|
174
|
+
} }, dependencies: [i1.MJButtonDirective, i2.DecimalPipe], styles: [".integration-card[_ngcontent-%COMP%] {\n background: var(--card-bg, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n padding: 16px;\n transition: box-shadow 0.2s;\n }\n .integration-card[_ngcontent-%COMP%]:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\n .integration-card.inactive[_ngcontent-%COMP%] { opacity: 0.6; }\n\n .card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n .source-icon[_ngcontent-%COMP%] {\n width: 40px; height: 40px;\n border-radius: 8px;\n background: var(--icon-bg, #f0f4ff);\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; color: var(--primary-color, #4a6cf7);\n }\n .card-title-area[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .card-title[_ngcontent-%COMP%] {\n margin: 0; font-size: 14px; font-weight: 600;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .source-type-label[_ngcontent-%COMP%] { font-size: 12px; color: #888; }\n\n .status-area[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n }\n\n .status-indicator[_ngcontent-%COMP%] {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n }\n .indicator-green[_ngcontent-%COMP%] { background: #1b7a3d; }\n .indicator-amber[_ngcontent-%COMP%] { background: #b5850a; }\n .indicator-red[_ngcontent-%COMP%] { background: #c62828; }\n .indicator-gray[_ngcontent-%COMP%] { background: #999; }\n\n .status-indicator.pulsing[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_pulse 1.5s ease-in-out infinite;\n }\n @keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.3); }\n }\n\n .status-chip[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 600; padding: 3px 8px;\n border-radius: 12px; text-transform: uppercase; white-space: nowrap;\n }\n .status-green[_ngcontent-%COMP%] { background: #e6f9ed; color: #1b7a3d; }\n .status-amber[_ngcontent-%COMP%] { background: #fff7e0; color: #b5850a; }\n .status-red[_ngcontent-%COMP%] { background: #fde8e8; color: #c62828; }\n .status-gray[_ngcontent-%COMP%] { background: #f0f0f0; color: #757575; }\n\n .card-body[_ngcontent-%COMP%] { margin-bottom: 12px; }\n .stat-row[_ngcontent-%COMP%] {\n display: flex; justify-content: space-between;\n padding: 4px 0; font-size: 13px;\n }\n .stat-label[_ngcontent-%COMP%] { color: #666; }\n .stat-value[_ngcontent-%COMP%] { font-weight: 500; }\n .error-value[_ngcontent-%COMP%] { color: #c62828; }\n .error-badge[_ngcontent-%COMP%] {\n background: #fde8e8;\n color: #c62828;\n padding: 1px 8px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 700;\n }\n\n \n\n .sparkline-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 8px 0;\n border-top: 1px solid #f0f0f0;\n margin-bottom: 4px;\n }\n .sparkline-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #999;\n white-space: nowrap;\n }\n .sparkline[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n gap: 3px;\n height: 24px;\n flex: 1;\n }\n .spark-bar[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 2px;\n border-radius: 2px 2px 0 0;\n transition: height 0.3s ease;\n }\n .spark-success[_ngcontent-%COMP%] { background: #4a6cf7; }\n .spark-failed[_ngcontent-%COMP%] { background: #c62828; }\n .spark-pending[_ngcontent-%COMP%] { background: #b5850a; }\n\n .card-footer[_ngcontent-%COMP%] {\n display: flex; justify-content: space-between;\n border-top: 1px solid #eee; padding-top: 8px;\n }"] });
|
|
177
175
|
}
|
|
178
176
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(IntegrationCardComponent, [{
|
|
179
177
|
type: Component,
|
|
@@ -240,11 +238,11 @@ export class IntegrationCardComponent {
|
|
|
240
238
|
}
|
|
241
239
|
|
|
242
240
|
<div class="card-footer">
|
|
243
|
-
<button
|
|
241
|
+
<button mjButton variant="primary" size="sm"
|
|
244
242
|
(click)="OnRunNowClick()" [disabled]="!Summary.Integration.IsActive">
|
|
245
243
|
<i class="fa-solid fa-play"></i> Run Now
|
|
246
244
|
</button>
|
|
247
|
-
<button
|
|
245
|
+
<button mjButton variant="flat" size="sm" (click)="OnExpandToggle()">
|
|
248
246
|
<i class="fa-solid" [class.fa-chevron-down]="!Expanded" [class.fa-chevron-up]="Expanded"></i>
|
|
249
247
|
History
|
|
250
248
|
</button>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-card.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/widgets/integration-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { IRunViewProvider } from '@memberjunction/core';\nimport { IntegrationSummary, ResolveIntegrationIcon } from '../../services/integration-data.service';\n\n@Component({\n standalone: false,\n selector: 'app-integration-card',\n template: `\n <div class=\"integration-card\" [class.inactive]=\"!Summary.Integration.IsActive\">\n <div class=\"card-header\">\n <div class=\"source-icon\">\n <i [class]=\"SourceIconClass\"></i>\n </div>\n <div class=\"card-title-area\">\n <h3 class=\"card-title\">{{ Summary.Integration.Name }}</h3>\n <span class=\"source-type-label\">{{ Summary.SourceType?.Name ?? 'Unknown' }}</span>\n </div>\n <div class=\"status-area\">\n <span class=\"status-indicator\" [class]=\"'indicator-' + Summary.StatusColor\"\n [class.pulsing]=\"IsActivelySyncing\"></span>\n <span class=\"status-chip\" [class]=\"'status-' + Summary.StatusColor\">\n {{ StatusLabel }}\n </span>\n </div>\n </div>\n\n <div class=\"card-body\">\n <div class=\"stat-row\">\n <span class=\"stat-label\">Last Run</span>\n <span class=\"stat-value\">{{ Summary.RelativeTime }}</span>\n </div>\n @if (Summary.LatestRun) {\n <div class=\"stat-row\">\n <span class=\"stat-label\">Records Synced</span>\n <span class=\"stat-value\">{{ Summary.LatestRun.TotalRecords | number }}</span>\n </div>\n <div class=\"stat-row\">\n <span class=\"stat-label\">Duration</span>\n <span class=\"stat-value\">{{ FormattedDuration }}</span>\n </div>\n }\n @if (Summary.TotalErrors > 0) {\n <div class=\"stat-row\">\n <span class=\"stat-label\">Errors</span>\n <span class=\"stat-value error-value\">\n <span class=\"error-badge\">{{ Summary.TotalErrors }}</span>\n </span>\n </div>\n }\n </div>\n\n <!-- Sparkline: records synced for last 5 runs -->\n @if (Summary.RecentRuns.length > 1) {\n <div class=\"sparkline-row\">\n <span class=\"sparkline-label\">Recent syncs</span>\n <div class=\"sparkline\">\n @for (run of Summary.RecentRuns; track run.ID) {\n <div class=\"spark-bar\"\n [style.height.%]=\"SparkBarHeight(run.TotalRecords)\"\n [class.spark-success]=\"run.Status === 'Success'\"\n [class.spark-failed]=\"run.Status === 'Failed'\"\n [class.spark-pending]=\"run.Status !== 'Success' && run.Status !== 'Failed'\"\n [title]=\"run.TotalRecords + ' records - ' + run.Status\">\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"card-footer\">\n <button kendoButton [look]=\"'flat'\" [themeColor]=\"'primary'\"\n (click)=\"OnRunNowClick()\" [disabled]=\"!Summary.Integration.IsActive\">\n <i class=\"fa-solid fa-play\"></i> Run Now\n </button>\n <button kendoButton [look]=\"'flat'\" (click)=\"OnExpandToggle()\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!Expanded\" [class.fa-chevron-up]=\"Expanded\"></i>\n History\n </button>\n </div>\n </div>\n `,\n styles: [`\n .integration-card {\n background: var(--card-bg, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n padding: 16px;\n transition: box-shadow 0.2s;\n }\n .integration-card:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\n .integration-card.inactive { opacity: 0.6; }\n\n .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n .source-icon {\n width: 40px; height: 40px;\n border-radius: 8px;\n background: var(--icon-bg, #f0f4ff);\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; color: var(--primary-color, #4a6cf7);\n }\n .card-title-area { flex: 1; min-width: 0; }\n .card-title {\n margin: 0; font-size: 14px; font-weight: 600;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .source-type-label { font-size: 12px; color: #888; }\n\n .status-area {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n }\n\n .status-indicator {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n }\n .indicator-green { background: #1b7a3d; }\n .indicator-amber { background: #b5850a; }\n .indicator-red { background: #c62828; }\n .indicator-gray { background: #999; }\n\n .status-indicator.pulsing {\n animation: pulse 1.5s ease-in-out infinite;\n }\n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.3); }\n }\n\n .status-chip {\n font-size: 11px; font-weight: 600; padding: 3px 8px;\n border-radius: 12px; text-transform: uppercase; white-space: nowrap;\n }\n .status-green { background: #e6f9ed; color: #1b7a3d; }\n .status-amber { background: #fff7e0; color: #b5850a; }\n .status-red { background: #fde8e8; color: #c62828; }\n .status-gray { background: #f0f0f0; color: #757575; }\n\n .card-body { margin-bottom: 12px; }\n .stat-row {\n display: flex; justify-content: space-between;\n padding: 4px 0; font-size: 13px;\n }\n .stat-label { color: #666; }\n .stat-value { font-weight: 500; }\n .error-value { color: #c62828; }\n .error-badge {\n background: #fde8e8;\n color: #c62828;\n padding: 1px 8px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 700;\n }\n\n /* Sparkline */\n .sparkline-row {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 8px 0;\n border-top: 1px solid #f0f0f0;\n margin-bottom: 4px;\n }\n .sparkline-label {\n font-size: 11px;\n color: #999;\n white-space: nowrap;\n }\n .sparkline {\n display: flex;\n align-items: flex-end;\n gap: 3px;\n height: 24px;\n flex: 1;\n }\n .spark-bar {\n flex: 1;\n min-height: 2px;\n border-radius: 2px 2px 0 0;\n transition: height 0.3s ease;\n }\n .spark-success { background: #4a6cf7; }\n .spark-failed { background: #c62828; }\n .spark-pending { background: #b5850a; }\n\n .card-footer {\n display: flex; justify-content: space-between;\n border-top: 1px solid #eee; padding-top: 8px;\n }\n `]\n})\nexport class IntegrationCardComponent {\n @Input() Summary!: IntegrationSummary;\n @Input() Expanded: boolean = false;\n @Input() ViewProvider: IRunViewProvider | null = null;\n @Output() RunNowClick = new EventEmitter<string>();\n @Output() ExpandToggle = new EventEmitter<string>();\n\n get SourceIconClass(): string {\n if (this.Summary.SourceType?.IconClass) {\n return this.Summary.SourceType.IconClass;\n }\n return ResolveIntegrationIcon(\n this.Summary.Integration.Integration ?? this.Summary.Integration.Name,\n this.Summary.Icon\n );\n }\n\n get StatusLabel(): string {\n const color = this.Summary.StatusColor;\n if (color === 'green') return 'Healthy';\n if (color === 'amber') return 'Warning';\n if (color === 'red') return 'Failed';\n return 'Inactive';\n }\n\n get IsActivelySyncing(): boolean {\n return this.Summary.LatestRun?.Status === 'In Progress'\n || this.Summary.LatestRun?.Status === 'Pending';\n }\n\n get FormattedDuration(): string {\n const ms = this.Summary.DurationMs;\n if (ms == null) return '--';\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n }\n\n get MaxSparkRecords(): number {\n const maxVal = Math.max(...this.Summary.RecentRuns.map(r => r.TotalRecords));\n return maxVal > 0 ? maxVal : 1;\n }\n\n SparkBarHeight(records: number): number {\n return Math.max((records / this.MaxSparkRecords) * 100, 8);\n }\n\n OnRunNowClick(): void {\n this.RunNowClick.emit(this.Summary.Integration.ID);\n }\n\n OnExpandToggle(): void {\n this.ExpandToggle.emit(this.Summary.Integration.ID);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"integration-card.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/widgets/integration-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { IRunViewProvider } from '@memberjunction/core';\nimport { IntegrationSummary, ResolveIntegrationIcon } from '../../services/integration-data.service';\n\n@Component({\n standalone: false,\n selector: 'app-integration-card',\n template: `\n <div class=\"integration-card\" [class.inactive]=\"!Summary.Integration.IsActive\">\n <div class=\"card-header\">\n <div class=\"source-icon\">\n <i [class]=\"SourceIconClass\"></i>\n </div>\n <div class=\"card-title-area\">\n <h3 class=\"card-title\">{{ Summary.Integration.Name }}</h3>\n <span class=\"source-type-label\">{{ Summary.SourceType?.Name ?? 'Unknown' }}</span>\n </div>\n <div class=\"status-area\">\n <span class=\"status-indicator\" [class]=\"'indicator-' + Summary.StatusColor\"\n [class.pulsing]=\"IsActivelySyncing\"></span>\n <span class=\"status-chip\" [class]=\"'status-' + Summary.StatusColor\">\n {{ StatusLabel }}\n </span>\n </div>\n </div>\n\n <div class=\"card-body\">\n <div class=\"stat-row\">\n <span class=\"stat-label\">Last Run</span>\n <span class=\"stat-value\">{{ Summary.RelativeTime }}</span>\n </div>\n @if (Summary.LatestRun) {\n <div class=\"stat-row\">\n <span class=\"stat-label\">Records Synced</span>\n <span class=\"stat-value\">{{ Summary.LatestRun.TotalRecords | number }}</span>\n </div>\n <div class=\"stat-row\">\n <span class=\"stat-label\">Duration</span>\n <span class=\"stat-value\">{{ FormattedDuration }}</span>\n </div>\n }\n @if (Summary.TotalErrors > 0) {\n <div class=\"stat-row\">\n <span class=\"stat-label\">Errors</span>\n <span class=\"stat-value error-value\">\n <span class=\"error-badge\">{{ Summary.TotalErrors }}</span>\n </span>\n </div>\n }\n </div>\n\n <!-- Sparkline: records synced for last 5 runs -->\n @if (Summary.RecentRuns.length > 1) {\n <div class=\"sparkline-row\">\n <span class=\"sparkline-label\">Recent syncs</span>\n <div class=\"sparkline\">\n @for (run of Summary.RecentRuns; track run.ID) {\n <div class=\"spark-bar\"\n [style.height.%]=\"SparkBarHeight(run.TotalRecords)\"\n [class.spark-success]=\"run.Status === 'Success'\"\n [class.spark-failed]=\"run.Status === 'Failed'\"\n [class.spark-pending]=\"run.Status !== 'Success' && run.Status !== 'Failed'\"\n [title]=\"run.TotalRecords + ' records - ' + run.Status\">\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"card-footer\">\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"OnRunNowClick()\" [disabled]=\"!Summary.Integration.IsActive\">\n <i class=\"fa-solid fa-play\"></i> Run Now\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnExpandToggle()\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!Expanded\" [class.fa-chevron-up]=\"Expanded\"></i>\n History\n </button>\n </div>\n </div>\n `,\n styles: [`\n .integration-card {\n background: var(--card-bg, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n padding: 16px;\n transition: box-shadow 0.2s;\n }\n .integration-card:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\n .integration-card.inactive { opacity: 0.6; }\n\n .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n .source-icon {\n width: 40px; height: 40px;\n border-radius: 8px;\n background: var(--icon-bg, #f0f4ff);\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; color: var(--primary-color, #4a6cf7);\n }\n .card-title-area { flex: 1; min-width: 0; }\n .card-title {\n margin: 0; font-size: 14px; font-weight: 600;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .source-type-label { font-size: 12px; color: #888; }\n\n .status-area {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n }\n\n .status-indicator {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n }\n .indicator-green { background: #1b7a3d; }\n .indicator-amber { background: #b5850a; }\n .indicator-red { background: #c62828; }\n .indicator-gray { background: #999; }\n\n .status-indicator.pulsing {\n animation: pulse 1.5s ease-in-out infinite;\n }\n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.3); }\n }\n\n .status-chip {\n font-size: 11px; font-weight: 600; padding: 3px 8px;\n border-radius: 12px; text-transform: uppercase; white-space: nowrap;\n }\n .status-green { background: #e6f9ed; color: #1b7a3d; }\n .status-amber { background: #fff7e0; color: #b5850a; }\n .status-red { background: #fde8e8; color: #c62828; }\n .status-gray { background: #f0f0f0; color: #757575; }\n\n .card-body { margin-bottom: 12px; }\n .stat-row {\n display: flex; justify-content: space-between;\n padding: 4px 0; font-size: 13px;\n }\n .stat-label { color: #666; }\n .stat-value { font-weight: 500; }\n .error-value { color: #c62828; }\n .error-badge {\n background: #fde8e8;\n color: #c62828;\n padding: 1px 8px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 700;\n }\n\n /* Sparkline */\n .sparkline-row {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 8px 0;\n border-top: 1px solid #f0f0f0;\n margin-bottom: 4px;\n }\n .sparkline-label {\n font-size: 11px;\n color: #999;\n white-space: nowrap;\n }\n .sparkline {\n display: flex;\n align-items: flex-end;\n gap: 3px;\n height: 24px;\n flex: 1;\n }\n .spark-bar {\n flex: 1;\n min-height: 2px;\n border-radius: 2px 2px 0 0;\n transition: height 0.3s ease;\n }\n .spark-success { background: #4a6cf7; }\n .spark-failed { background: #c62828; }\n .spark-pending { background: #b5850a; }\n\n .card-footer {\n display: flex; justify-content: space-between;\n border-top: 1px solid #eee; padding-top: 8px;\n }\n `]\n})\nexport class IntegrationCardComponent {\n @Input() Summary!: IntegrationSummary;\n @Input() Expanded: boolean = false;\n @Input() ViewProvider: IRunViewProvider | null = null;\n @Output() RunNowClick = new EventEmitter<string>();\n @Output() ExpandToggle = new EventEmitter<string>();\n\n get SourceIconClass(): string {\n if (this.Summary.SourceType?.IconClass) {\n return this.Summary.SourceType.IconClass;\n }\n return ResolveIntegrationIcon(\n this.Summary.Integration.Integration ?? this.Summary.Integration.Name,\n this.Summary.Icon\n );\n }\n\n get StatusLabel(): string {\n const color = this.Summary.StatusColor;\n if (color === 'green') return 'Healthy';\n if (color === 'amber') return 'Warning';\n if (color === 'red') return 'Failed';\n return 'Inactive';\n }\n\n get IsActivelySyncing(): boolean {\n return this.Summary.LatestRun?.Status === 'In Progress'\n || this.Summary.LatestRun?.Status === 'Pending';\n }\n\n get FormattedDuration(): string {\n const ms = this.Summary.DurationMs;\n if (ms == null) return '--';\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n }\n\n get MaxSparkRecords(): number {\n const maxVal = Math.max(...this.Summary.RecentRuns.map(r => r.TotalRecords));\n return maxVal > 0 ? maxVal : 1;\n }\n\n SparkBarHeight(records: number): number {\n return Math.max((records / this.MaxSparkRecords) * 100, 8);\n }\n\n OnRunNowClick(): void {\n this.RunNowClick.emit(this.Summary.Integration.ID);\n }\n\n OnExpandToggle(): void {\n this.ExpandToggle.emit(this.Summary.Integration.ID);\n }\n}\n"]}
|
|
@@ -10,18 +10,14 @@ import * as i8 from "./components/widgets/run-history-panel.component";
|
|
|
10
10
|
import * as i9 from "./components/visual-editor/visual-editor.component";
|
|
11
11
|
import * as i10 from "@angular/common";
|
|
12
12
|
import * as i11 from "@angular/forms";
|
|
13
|
-
import * as i12 from "@
|
|
14
|
-
import * as i13 from "@
|
|
15
|
-
import * as i14 from "@
|
|
16
|
-
import * as i15 from "@
|
|
17
|
-
import * as i16 from "@
|
|
18
|
-
import * as i17 from "@memberjunction/ng-shared-generic";
|
|
19
|
-
import * as i18 from "@memberjunction/ng-credentials";
|
|
20
|
-
import * as i19 from "@memberjunction/ng-trees";
|
|
21
|
-
import * as i20 from "@memberjunction/ng-scheduling";
|
|
13
|
+
import * as i12 from "@memberjunction/ng-ui-components";
|
|
14
|
+
import * as i13 from "@memberjunction/ng-shared-generic";
|
|
15
|
+
import * as i14 from "@memberjunction/ng-credentials";
|
|
16
|
+
import * as i15 from "@memberjunction/ng-trees";
|
|
17
|
+
import * as i16 from "@memberjunction/ng-scheduling";
|
|
22
18
|
export declare class IntegrationModule {
|
|
23
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<IntegrationModule, never>;
|
|
24
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<IntegrationModule, [typeof i1.OverviewComponent, typeof i2.PipelinesComponent, typeof i3.ConnectionsComponent, typeof i4.MappingWorkspaceComponent, typeof i5.ActivityComponent, typeof i6.SchedulesComponent, typeof i7.IntegrationCardComponent, typeof i8.RunHistoryPanelComponent, typeof i9.VisualFieldEditorComponent], [typeof i10.CommonModule, typeof i11.FormsModule, typeof i12.
|
|
20
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<IntegrationModule, [typeof i1.OverviewComponent, typeof i2.PipelinesComponent, typeof i3.ConnectionsComponent, typeof i4.MappingWorkspaceComponent, typeof i5.ActivityComponent, typeof i6.SchedulesComponent, typeof i7.IntegrationCardComponent, typeof i8.RunHistoryPanelComponent, typeof i9.VisualFieldEditorComponent], [typeof i10.CommonModule, typeof i11.FormsModule, typeof i12.MJButtonDirective, typeof i12.MJComboboxComponent, typeof i12.MJDropdownComponent, typeof i12.MJSwitchComponent, typeof i13.SharedGenericModule, typeof i14.CredentialsModule, typeof i15.NgTreesModule, typeof i16.SchedulingModule], [typeof i1.OverviewComponent, typeof i2.PipelinesComponent, typeof i3.ConnectionsComponent, typeof i4.MappingWorkspaceComponent, typeof i5.ActivityComponent, typeof i6.SchedulesComponent, typeof i7.IntegrationCardComponent, typeof i8.RunHistoryPanelComponent, typeof i9.VisualFieldEditorComponent]>;
|
|
25
21
|
static ɵinj: i0.ɵɵInjectorDeclaration<IntegrationModule>;
|
|
26
22
|
}
|
|
27
23
|
//# sourceMappingURL=integration.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.module.d.ts","sourceRoot":"","sources":["../../src/Integration/integration.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"integration.module.d.ts","sourceRoot":"","sources":["../../src/Integration/integration.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAoBA,qBAuCa,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { NgModule } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import {
|
|
5
|
-
import { DropDownsModule } from '@progress/kendo-angular-dropdowns';
|
|
6
|
-
import { InputsModule } from '@progress/kendo-angular-inputs';
|
|
7
|
-
import { GridModule } from '@progress/kendo-angular-grid';
|
|
8
|
-
import { LayoutModule } from '@progress/kendo-angular-layout';
|
|
4
|
+
import { MJButtonDirective, MJComboboxComponent, MJDropdownComponent, MJSwitchComponent } from '@memberjunction/ng-ui-components';
|
|
9
5
|
import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
|
|
10
6
|
import { CredentialsModule } from '@memberjunction/ng-credentials';
|
|
11
7
|
import { NgTreesModule } from '@memberjunction/ng-trees';
|
|
@@ -28,11 +24,9 @@ export class IntegrationModule {
|
|
|
28
24
|
IntegrationDataService
|
|
29
25
|
], imports: [CommonModule,
|
|
30
26
|
FormsModule,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
GridModule,
|
|
35
|
-
LayoutModule,
|
|
27
|
+
MJComboboxComponent,
|
|
28
|
+
MJDropdownComponent,
|
|
29
|
+
MJSwitchComponent,
|
|
36
30
|
SharedGenericModule,
|
|
37
31
|
CredentialsModule,
|
|
38
32
|
NgTreesModule,
|
|
@@ -55,11 +49,10 @@ export class IntegrationModule {
|
|
|
55
49
|
imports: [
|
|
56
50
|
CommonModule,
|
|
57
51
|
FormsModule,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
LayoutModule,
|
|
52
|
+
MJButtonDirective,
|
|
53
|
+
MJComboboxComponent,
|
|
54
|
+
MJDropdownComponent,
|
|
55
|
+
MJSwitchComponent,
|
|
63
56
|
SharedGenericModule,
|
|
64
57
|
CredentialsModule,
|
|
65
58
|
NgTreesModule,
|
|
@@ -91,11 +84,10 @@ export class IntegrationModule {
|
|
|
91
84
|
RunHistoryPanelComponent,
|
|
92
85
|
VisualFieldEditorComponent], imports: [CommonModule,
|
|
93
86
|
FormsModule,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
LayoutModule,
|
|
87
|
+
MJButtonDirective,
|
|
88
|
+
MJComboboxComponent,
|
|
89
|
+
MJDropdownComponent,
|
|
90
|
+
MJSwitchComponent,
|
|
99
91
|
SharedGenericModule,
|
|
100
92
|
CredentialsModule,
|
|
101
93
|
NgTreesModule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.module.js","sourceRoot":"","sources":["../../src/Integration/integration.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"integration.module.js","sourceRoot":"","sources":["../../src/Integration/integration.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAClI,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4DAA4D,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAC5F,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;;AAyC7E,MAAM,OAAO,iBAAiB;2GAAjB,iBAAiB;4DAAjB,iBAAiB;iEAfjB;YACT,sBAAsB;SACvB,YAbC,YAAY;YACZ,WAAW;YAEX,mBAAmB;YACnB,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB;YACnB,iBAAiB;YACjB,aAAa;YACb,gBAAgB;;iFAiBP,iBAAiB;cAvC7B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,iBAAiB;oBACjB,kBAAkB;oBAClB,oBAAoB;oBACpB,yBAAyB;oBACzB,iBAAiB;oBACjB,kBAAkB;oBAClB,wBAAwB;oBACxB,wBAAwB;oBACxB,0BAA0B;iBAC3B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,iBAAiB;oBACjB,mBAAmB;oBACnB,mBAAmB;oBACnB,iBAAiB;oBACjB,mBAAmB;oBACnB,iBAAiB;oBACjB,aAAa;oBACb,gBAAgB;iBACjB;gBACD,SAAS,EAAE;oBACT,sBAAsB;iBACvB;gBACD,OAAO,EAAE;oBACP,iBAAiB;oBACjB,kBAAkB;oBAClB,oBAAoB;oBACpB,yBAAyB;oBACzB,iBAAiB;oBACjB,kBAAkB;oBAClB,wBAAwB;oBACxB,wBAAwB;oBACxB,0BAA0B;iBAC3B;aACF;;wFACY,iBAAiB,mBArC1B,iBAAiB;QACjB,kBAAkB;QAClB,oBAAoB;QACpB,yBAAyB;QACzB,iBAAiB;QACjB,kBAAkB;QAClB,wBAAwB;QACxB,wBAAwB;QACxB,0BAA0B,aAG1B,YAAY;QACZ,WAAW;QACX,iBAAiB;QACjB,mBAAmB;QACnB,mBAAmB;QACnB,iBAAiB;QACjB,mBAAmB;QACnB,iBAAiB;QACjB,aAAa;QACb,gBAAgB,aAMhB,iBAAiB;QACjB,kBAAkB;QAClB,oBAAoB;QACpB,yBAAyB;QACzB,iBAAiB;QACjB,kBAAkB;QAClB,wBAAwB;QACxB,wBAAwB;QACxB,0BAA0B","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MJButtonDirective, MJComboboxComponent, MJDropdownComponent, MJSwitchComponent } from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { CredentialsModule } from '@memberjunction/ng-credentials';\nimport { NgTreesModule } from '@memberjunction/ng-trees';\nimport { SchedulingModule } from '@memberjunction/ng-scheduling';\n\nimport { OverviewComponent } from './components/overview/overview.component';\nimport { PipelinesComponent } from './components/pipelines/pipelines.component';\nimport { ConnectionsComponent } from './components/connections/connections.component';\nimport { MappingWorkspaceComponent } from './components/mapping-workspace/mapping-workspace.component';\nimport { ActivityComponent } from './components/activity/activity.component';\nimport { SchedulesComponent } from './components/schedules/schedules.component';\nimport { IntegrationCardComponent } from './components/widgets/integration-card.component';\nimport { RunHistoryPanelComponent } from './components/widgets/run-history-panel.component';\nimport { VisualFieldEditorComponent } from './components/visual-editor/visual-editor.component';\nimport { IntegrationDataService } from './services/integration-data.service';\n\n@NgModule({\n declarations: [\n OverviewComponent,\n PipelinesComponent,\n ConnectionsComponent,\n MappingWorkspaceComponent,\n ActivityComponent,\n SchedulesComponent,\n IntegrationCardComponent,\n RunHistoryPanelComponent,\n VisualFieldEditorComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n MJButtonDirective,\n MJComboboxComponent,\n MJDropdownComponent,\n MJSwitchComponent,\n SharedGenericModule,\n CredentialsModule,\n NgTreesModule,\n SchedulingModule\n ],\n providers: [\n IntegrationDataService\n ],\n exports: [\n OverviewComponent,\n PipelinesComponent,\n ConnectionsComponent,\n MappingWorkspaceComponent,\n ActivityComponent,\n SchedulesComponent,\n IntegrationCardComponent,\n RunHistoryPanelComponent,\n VisualFieldEditorComponent\n ]\n})\nexport class IntegrationModule { }\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Knowledge Hub Clusters Dashboard Tab
|
|
3
|
+
*
|
|
4
|
+
* Full-page cluster visualization with:
|
|
5
|
+
* - Left sidebar: saved cluster visualizations (persisted via UserInfoEngine)
|
|
6
|
+
* - Main area: SVG scatter plot (mj-cluster-scatter)
|
|
7
|
+
* - Floating config panel (mj-cluster-config-panel)
|
|
8
|
+
* - Top metrics bar
|
|
9
|
+
*
|
|
10
|
+
* Registered as BaseResourceComponent for the Knowledge Hub application.
|
|
11
|
+
*/
|
|
12
|
+
import { OnDestroy, AfterViewInit } from '@angular/core';
|
|
13
|
+
import { ResourceData } from '@memberjunction/core-entities';
|
|
14
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
15
|
+
import { ClusterConfig, ClusterConfigPanelEntityOption, ClusterConfigPanelEntityDocOption, ClusterVisualizationResult, ClusterMetrics, ClusterPoint, ClusterLabel, SavedClusterVisualization } from '@memberjunction/ng-clustering';
|
|
16
|
+
import { ClusterScatterComponent } from '@memberjunction/ng-clustering';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
export declare class ClusterVisualizationResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {
|
|
19
|
+
scatterPlot?: ClusterScatterComponent;
|
|
20
|
+
private cdr;
|
|
21
|
+
private clusteringService;
|
|
22
|
+
private navigationService;
|
|
23
|
+
private destroy$;
|
|
24
|
+
/** LLM-generated cluster labels for the current result */
|
|
25
|
+
ClusterLabels: ClusterLabel[];
|
|
26
|
+
GetResourceDisplayName(_data: ResourceData): Promise<string>;
|
|
27
|
+
GetResourceIconClass(_data: ResourceData): Promise<string>;
|
|
28
|
+
/** Current visualization result */
|
|
29
|
+
Result: ClusterVisualizationResult | null;
|
|
30
|
+
/** Whether a clustering run is in progress */
|
|
31
|
+
IsRunning: boolean;
|
|
32
|
+
/** The active cluster config */
|
|
33
|
+
ActiveConfig: ClusterConfig;
|
|
34
|
+
/** Title for the top bar */
|
|
35
|
+
VisualizationTitle: string;
|
|
36
|
+
/** Entity options for the config panel dropdown */
|
|
37
|
+
EntityOptions: ClusterConfigPanelEntityOption[];
|
|
38
|
+
/** Entity document options for the selected entity (shown when 2+) */
|
|
39
|
+
EntityDocOptions: ClusterConfigPanelEntityDocOption[];
|
|
40
|
+
SavedVisualizations: SavedClusterVisualization[];
|
|
41
|
+
ActiveSavedId: string | null;
|
|
42
|
+
private userSettingEntity;
|
|
43
|
+
ngAfterViewInit(): Promise<void>;
|
|
44
|
+
ngOnDestroy(): void;
|
|
45
|
+
get Metrics(): ClusterMetrics | null;
|
|
46
|
+
get HasResult(): boolean;
|
|
47
|
+
get SilhouetteScoreFormatted(): string;
|
|
48
|
+
get IsSilhouetteGood(): boolean;
|
|
49
|
+
get ComputationTimeFormatted(): string;
|
|
50
|
+
/** Handle "Run Clustering" from the config panel */
|
|
51
|
+
OnRunClustering(config: ClusterConfig): Promise<void>;
|
|
52
|
+
/** Handle point click — log for now */
|
|
53
|
+
OnPointClicked(_point: ClusterPoint): void;
|
|
54
|
+
/** Handle point hover */
|
|
55
|
+
OnPointHovered(_point: ClusterPoint | null): void;
|
|
56
|
+
/** Navigate to the entity record when "Open Record" is clicked in the detail panel */
|
|
57
|
+
OnOpenRecord(point: ClusterPoint): void;
|
|
58
|
+
/** Save the current visualization */
|
|
59
|
+
OnSaveVisualization(): Promise<void>;
|
|
60
|
+
/** Select a saved visualization — restore from cache if available, otherwise re-run */
|
|
61
|
+
OnSelectSaved(saved: SavedClusterVisualization): Promise<void>;
|
|
62
|
+
/** Delete a saved visualization */
|
|
63
|
+
OnDeleteSaved(saved: SavedClusterVisualization, event: MouseEvent): Promise<void>;
|
|
64
|
+
/** Start a new analysis (clear current) */
|
|
65
|
+
OnNewAnalysis(): void;
|
|
66
|
+
IsActiveSaved(saved: SavedClusterVisualization): boolean;
|
|
67
|
+
TrackSavedBy(_index: number, saved: SavedClusterVisualization): string;
|
|
68
|
+
FormatDate(iso: string): string;
|
|
69
|
+
/** Populate the entity options for the config panel dropdown */
|
|
70
|
+
private loadEntityOptions;
|
|
71
|
+
/** Update entity document options when the selected entity changes */
|
|
72
|
+
private updateEntityDocOptions;
|
|
73
|
+
/**
|
|
74
|
+
* Fetch vectors from Entity Document Runs via RunView.
|
|
75
|
+
* Entity Documents store vectorized entity data; we query for runs
|
|
76
|
+
* that match the requested entity.
|
|
77
|
+
*/
|
|
78
|
+
private fetchVectorsForEntity;
|
|
79
|
+
/** Parse the JSON metadata string from the vector DB into a record */
|
|
80
|
+
private parseVectorMetadata;
|
|
81
|
+
/** Build a human-readable label from vector metadata (prefers Name field, falls back to RecordID) */
|
|
82
|
+
private buildLabel;
|
|
83
|
+
/**
|
|
84
|
+
* After clustering completes, send sample records per cluster to an LLM for naming.
|
|
85
|
+
* Updates ClusterLabels and refreshes the view.
|
|
86
|
+
*/
|
|
87
|
+
private requestClusterLabelsFromLLM;
|
|
88
|
+
/** Build a text block describing sample records per cluster for the LLM prompt */
|
|
89
|
+
private buildClusterDataForPrompt;
|
|
90
|
+
/** Apply cluster labels to the result's Clusters array (sets the Label property) */
|
|
91
|
+
private applyLabelsToResult;
|
|
92
|
+
/**
|
|
93
|
+
* Strip full vector arrays from the result before saving (they're large and not needed for display).
|
|
94
|
+
* Keeps points with 2D coordinates and metadata but removes the original high-dimensional vectors.
|
|
95
|
+
*/
|
|
96
|
+
private stripVectorsFromResult;
|
|
97
|
+
/** Load saved visualizations from UserInfoEngine settings */
|
|
98
|
+
private loadSavedVisualizations;
|
|
99
|
+
/** Persist saved visualizations to UserInfoEngine settings */
|
|
100
|
+
private persistSavedVisualizations;
|
|
101
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ClusterVisualizationResourceComponent, never>;
|
|
102
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ClusterVisualizationResourceComponent, "app-cluster-visualization-resource", never, {}, {}, never, never, false, never>;
|
|
103
|
+
}
|
|
104
|
+
/** Tree-shaking prevention */
|
|
105
|
+
export declare function LoadClusterVisualizationResource(): void;
|
|
106
|
+
//# sourceMappingURL=cluster-visualization-resource.component.d.ts.map
|
package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-visualization-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/clusters/cluster-visualization-resource.component.ts"],"names":[],"mappings":"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"}
|