@memberjunction/ng-dashboards 5.24.0 → 5.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +233 -493
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +7 -7
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +43 -6
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1135 -864
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +4 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +14 -15
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +4 -4
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +5 -5
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +5 -5
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +9 -11
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +44 -8
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +648 -384
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -0
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +4 -5
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +11 -12
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +2 -3
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +4 -6
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +2 -3
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +4 -6
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +10 -11
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +4 -6
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +2 -3
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +4 -6
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +1 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +4 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +4 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +4 -1
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +4 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +4 -1
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +453 -420
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +4 -4
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -5
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +2 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -3
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +220 -138
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +0 -1
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +0 -1
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -0
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -0
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -0
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +25 -107
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -0
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +2 -0
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +2 -0
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +1 -0
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +9 -10
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +10 -11
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +2 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +19 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +19 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +8 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +2 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +7 -3
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +49 -48
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -166
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -991
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
2
|
import { MJActionExecutionLogEntity, MJActionEntity, ResourceData } from '@memberjunction/core-entities';
|
|
3
|
-
import { BaseResourceComponent
|
|
4
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
4
|
+
import { Subject, BehaviorSubject } from 'rxjs';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
interface ExecutionMetrics {
|
|
7
7
|
totalExecutions: number;
|
|
@@ -22,7 +22,6 @@ interface ExecutionTrend {
|
|
|
22
22
|
* Execution Monitoring Resource - displays action execution logs and metrics
|
|
23
23
|
*/
|
|
24
24
|
export declare class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
25
|
-
private navigationService;
|
|
26
25
|
private cdr;
|
|
27
26
|
isLoading: boolean;
|
|
28
27
|
executions: MJActionExecutionLogEntity[];
|
|
@@ -46,8 +45,8 @@ export declare class ExecutionMonitoringComponent extends BaseResourceComponent
|
|
|
46
45
|
text: string;
|
|
47
46
|
value: string;
|
|
48
47
|
}>;
|
|
49
|
-
|
|
50
|
-
constructor(
|
|
48
|
+
protected destroy$: Subject<void>;
|
|
49
|
+
constructor(cdr: ChangeDetectorRef);
|
|
51
50
|
ngOnInit(): void;
|
|
52
51
|
ngOnDestroy(): void;
|
|
53
52
|
private setupFilters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-monitoring.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/execution-monitoring.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEzG,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"execution-monitoring.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/execution-monitoring.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,11 +11,10 @@ import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
|
11
11
|
import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
|
|
12
12
|
import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@
|
|
15
|
-
import * as i2 from "@
|
|
16
|
-
import * as i3 from "@memberjunction/ng-
|
|
17
|
-
import * as i4 from "@
|
|
18
|
-
import * as i5 from "@angular/common";
|
|
14
|
+
import * as i1 from "@angular/forms";
|
|
15
|
+
import * as i2 from "@memberjunction/ng-ui-components";
|
|
16
|
+
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
17
|
+
import * as i4 from "@angular/common";
|
|
19
18
|
const _forTrack0 = ($index, $item) => $item.date;
|
|
20
19
|
const _forTrack1 = ($index, $item) => $item.ID;
|
|
21
20
|
function ExecutionMonitoringComponent_Conditional_77_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -140,7 +139,6 @@ function ExecutionMonitoringComponent_Conditional_89_Template(rf, ctx) { if (rf
|
|
|
140
139
|
* Execution Monitoring Resource - displays action execution logs and metrics
|
|
141
140
|
*/
|
|
142
141
|
let ExecutionMonitoringComponent = class ExecutionMonitoringComponent extends BaseResourceComponent {
|
|
143
|
-
navigationService;
|
|
144
142
|
cdr;
|
|
145
143
|
isLoading = true;
|
|
146
144
|
executions = [];
|
|
@@ -177,16 +175,17 @@ let ExecutionMonitoringComponent = class ExecutionMonitoringComponent extends Ba
|
|
|
177
175
|
{ text: 'All Actions', value: 'all' }
|
|
178
176
|
];
|
|
179
177
|
destroy$ = new Subject();
|
|
180
|
-
constructor(
|
|
178
|
+
constructor(cdr) {
|
|
181
179
|
super();
|
|
182
|
-
this.navigationService = navigationService;
|
|
183
180
|
this.cdr = cdr;
|
|
184
181
|
}
|
|
185
182
|
ngOnInit() {
|
|
183
|
+
super.ngOnInit();
|
|
186
184
|
this.setupFilters();
|
|
187
185
|
this.loadData();
|
|
188
186
|
}
|
|
189
187
|
ngOnDestroy() {
|
|
188
|
+
super.ngOnDestroy();
|
|
190
189
|
this.destroy$.next();
|
|
191
190
|
this.destroy$.complete();
|
|
192
191
|
}
|
|
@@ -447,7 +446,7 @@ let ExecutionMonitoringComponent = class ExecutionMonitoringComponent extends Ba
|
|
|
447
446
|
async GetResourceIconClass(data) {
|
|
448
447
|
return 'fa-solid fa-chart-line';
|
|
449
448
|
}
|
|
450
|
-
static ɵfac = function ExecutionMonitoringComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ExecutionMonitoringComponent)(i0.ɵɵdirectiveInject(
|
|
449
|
+
static ɵfac = function ExecutionMonitoringComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ExecutionMonitoringComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
451
450
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExecutionMonitoringComponent, selectors: [["mj-execution-monitoring"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 90, vars: 23, consts: [[1, "execution-monitoring"], [1, "monitoring-header"], [1, "header-title"], [1, "fa-solid", "fa-chart-line"], ["mjButton", "", "variant", "primary", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "filters-row"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search executions...", 1, "mj-input", 3, "input", "value"], [1, "filter-group"], ["TextField", "text", "ValueField", "value", 3, "ValueChange", "Data", "ValuePrimitive", "ngModel"], [1, "metrics-summary"], [1, "metric-card", "total", "clickable", 3, "click"], [1, "metric-icon"], [1, "fa-solid", "fa-play-circle"], [1, "metric-content"], [1, "metric-value"], [1, "metric-label"], [1, "metric-card", "success", "clickable", 3, "click"], [1, "fa-solid", "fa-check-circle"], [1, "metric-detail"], [1, "metric-card", "error", "clickable", 3, "click"], [1, "fa-solid", "fa-exclamation-circle"], [1, "metric-card", "duration"], [1, "fa-solid", "fa-clock"], [1, "metric-card", "activity"], [1, "fa-solid", "fa-calendar-day"], [1, "metric-card", "running", "clickable", 3, "click"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "trends-section"], [1, "section-header"], [1, "fa-solid", "fa-chart-area"], [1, "trends-chart"], [1, "empty-chart"], [1, "executions-section"], [1, "fa-solid", "fa-list"], [1, "results-count"], [1, "executions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "trend-bars"], [1, "trend-bar"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "success"], [1, "legend-color", "failed"], [1, "bar-container"], [1, "bar-success"], [1, "bar-failed"], [1, "bar-label"], [1, "bar-total"], [1, "execution-item"], [1, "execution-item", 3, "click"], [1, "execution-status"], [1, "execution-main"], [1, "execution-action", 3, "click"], [1, "execution-details"], [1, "execution-time"], [1, "execution-user"], [1, "execution-duration"], [1, "execution-result"], [1, "status-chip"], [1, "execution-actions"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "fa-solid", "fa-search"], ["size", "medium", 3, "showText"]], template: function ExecutionMonitoringComponent_Template(rf, ctx) { if (rf & 1) {
|
|
452
451
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h3");
|
|
453
452
|
i0.ɵɵelement(4, "i", 3);
|
|
@@ -592,7 +591,7 @@ let ExecutionMonitoringComponent = class ExecutionMonitoringComponent extends Ba
|
|
|
592
591
|
i0.ɵɵconditional(ctx.filteredExecutions.length > 0 ? 87 : 88);
|
|
593
592
|
i0.ɵɵadvance(2);
|
|
594
593
|
i0.ɵɵconditional(ctx.isLoading ? 89 : -1);
|
|
595
|
-
} }, dependencies: [i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i3.MJDropdownComponent, i4.LoadingComponent, i5.DatePipe], styles: [".execution-monitoring[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n color: var(--mj-text-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] .refresh-btn[_ngcontent-%COMP%] {\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .search-container[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 200px;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.75rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1.25rem;\n border-radius: 0.75rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n transition: all 0.2s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.clickable[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.5rem;\n font-size: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n margin-bottom: 0.25rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 0.125rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-detail[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.total[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.success[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.error[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.duration[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.activity[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.running[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n padding: 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: end;\n gap: 1rem;\n height: 120px;\n margin-bottom: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 80px;\n border-radius: 0.25rem;\n overflow: hidden;\n background: var(--mj-border-default);\n position: relative;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-container[_ngcontent-%COMP%] .bar-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-container[_ngcontent-%COMP%] .bar-failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-label[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-total[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n gap: 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] .legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 2px;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] .legend-color.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] .legend-color.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .empty-chart[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 120px;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .empty-chart[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n opacity: 0.5;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .empty-chart[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.875rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n display: flex;\n flex-direction: column;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1.5rem 1.5rem 0;\n margin-bottom: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] .results-count[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 0 1.5rem 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 0.5rem;\n margin-bottom: 0.75rem;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface-elevated);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-check-circle[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-exclamation-circle[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-spinner[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-info-circle[_ngcontent-%COMP%], .execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-question[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] {\n flex: 1;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-action[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-bottom: 0.25rem;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-action[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] .execution-time[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] .execution-user[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] .execution-duration[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-result[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-actions[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%]:hover .execution-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n opacity: 1;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.875rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .loading-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 80%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n@media (max-width: 1200px) {\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n@media (max-width: 768px) {\n .execution-monitoring[_ngcontent-%COMP%] {\n padding: 1rem;\n gap: 1rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n gap: 0.75rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n gap: 1rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .search-container[_ngcontent-%COMP%], \n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n min-width: unset;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] {\n gap: 0.5rem;\n }\n}"] });
|
|
594
|
+
} }, dependencies: [i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJDropdownComponent, i3.LoadingComponent, i4.DatePipe], styles: [".execution-monitoring[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n color: var(--mj-text-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] .refresh-btn[_ngcontent-%COMP%] {\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .search-container[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 200px;\n}\n.execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.75rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1.25rem;\n border-radius: 0.75rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n transition: all 0.2s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.clickable[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.5rem;\n font-size: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n margin-bottom: 0.25rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 0.125rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-detail[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.total[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.success[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.error[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.duration[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.activity[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n.execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card.running[_ngcontent-%COMP%] .metric-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n padding: 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: end;\n gap: 1rem;\n height: 120px;\n margin-bottom: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 80px;\n border-radius: 0.25rem;\n overflow: hidden;\n background: var(--mj-border-default);\n position: relative;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-container[_ngcontent-%COMP%] .bar-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-container[_ngcontent-%COMP%] .bar-failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-label[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] .trend-bar[_ngcontent-%COMP%] .bar-total[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n gap: 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] .legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 2px;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] .legend-color.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .chart-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%] .legend-color.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .empty-chart[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 120px;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .empty-chart[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n opacity: 0.5;\n}\n.execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .empty-chart[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.875rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n display: flex;\n flex-direction: column;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1.5rem 1.5rem 0;\n margin-bottom: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] .results-count[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 0 1.5rem 1.5rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 0.5rem;\n margin-bottom: 0.75rem;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface-elevated);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-check-circle[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-exclamation-circle[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-spinner[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-info-circle[_ngcontent-%COMP%], .execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-status[_ngcontent-%COMP%] i.fa-question[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] {\n flex: 1;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-action[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-bottom: 0.25rem;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-action[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] .execution-time[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] .execution-user[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-main[_ngcontent-%COMP%] .execution-details[_ngcontent-%COMP%] .execution-duration[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-result[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-actions[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%] .execution-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .execution-item[_ngcontent-%COMP%]:hover .execution-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n opacity: 1;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--mj-text-muted);\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n}\n.execution-monitoring[_ngcontent-%COMP%] .executions-section[_ngcontent-%COMP%] .executions-list[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.875rem;\n}\n.execution-monitoring[_ngcontent-%COMP%] .loading-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 80%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n@media (max-width: 1200px) {\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n@media (max-width: 768px) {\n .execution-monitoring[_ngcontent-%COMP%] {\n padding: 1rem;\n gap: 1rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n gap: 0.75rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .metrics-summary[_ngcontent-%COMP%] .metric-card[_ngcontent-%COMP%] .metric-content[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .header-title[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n gap: 1rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .search-container[_ngcontent-%COMP%], \n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n min-width: unset;\n }\n .execution-monitoring[_ngcontent-%COMP%] .monitoring-header[_ngcontent-%COMP%] .filters-row[_ngcontent-%COMP%] .filter-group[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n .execution-monitoring[_ngcontent-%COMP%] .trends-section[_ngcontent-%COMP%] .trends-chart[_ngcontent-%COMP%] .trend-bars[_ngcontent-%COMP%] {\n gap: 0.5rem;\n }\n}"] });
|
|
596
595
|
};
|
|
597
596
|
ExecutionMonitoringComponent = __decorate([
|
|
598
597
|
RegisterClass(BaseResourceComponent, 'ActionsMonitorResource')
|
|
@@ -601,6 +600,6 @@ export { ExecutionMonitoringComponent };
|
|
|
601
600
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExecutionMonitoringComponent, [{
|
|
602
601
|
type: Component,
|
|
603
602
|
args: [{ standalone: false, selector: 'mj-execution-monitoring', template: "<div class=\"execution-monitoring\" >\n <!-- Header with filters -->\n <div class=\"monitoring-header\">\n <div class=\"header-title\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Execution Monitoring</h3>\n <button mjButton variant=\"primary\" (click)=\"refreshData()\" class=\"refresh-btn\">\n <i class=\"fa-solid fa-refresh\"></i> Refresh\n </button>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search executions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n\n <div class=\"filter-group\">\n <mj-dropdown\n [Data]=\"timeRangeOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedTimeRange$.value\"\n (ValueChange)=\"onTimeRangeChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"resultOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedResult$.value\"\n (ValueChange)=\"onResultFilterChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"actionOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedAction$.value\"\n (ValueChange)=\"onActionFilterChange($any($event))\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Metrics Summary -->\n <div class=\"metrics-summary\">\n <div class=\"metric-card total clickable\" (click)=\"onTotalExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalExecutions }}</div>\n <div class=\"metric-label\">Total Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card success clickable\" (click)=\"onSuccessRateClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getSuccessRate() }}%</div>\n <div class=\"metric-label\">Success Rate</div>\n <div class=\"metric-detail\">{{ metrics.successfulExecutions }}/{{ metrics.totalExecutions }}</div>\n </div>\n </div>\n\n <div class=\"metric-card error clickable\" (click)=\"onFailedExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.failedExecutions }}</div>\n <div class=\"metric-label\">Failed Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card duration\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.averageDuration }}s</div>\n <div class=\"metric-label\">Avg Duration</div>\n </div>\n </div>\n\n <div class=\"metric-card activity\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-calendar-day\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.executionsToday }}</div>\n <div class=\"metric-label\">Today</div>\n <div class=\"metric-detail\">{{ metrics.executionsThisWeek }} this week</div>\n </div>\n </div>\n\n <div class=\"metric-card running clickable\" (click)=\"onRunningExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.currentlyRunning }}</div>\n <div class=\"metric-label\">Currently Running</div>\n </div>\n </div>\n </div>\n\n <!-- Execution Trends Chart -->\n <div class=\"trends-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-chart-area\"></i> 7-Day Execution Trends</h4>\n </div>\n <div class=\"trends-chart\">\n @if (executionTrends.length > 0) {\n <div class=\"trend-bars\">\n @for (trend of executionTrends; track trend.date) {\n <div class=\"trend-bar\">\n <div class=\"bar-container\">\n <div class=\"bar-success\" [style.height.%]=\"trend.total > 0 ? (trend.successful / trend.total) * 100 : 0\"></div>\n <div class=\"bar-failed\" [style.height.%]=\"trend.total > 0 ? (trend.failed / trend.total) * 100 : 0\"></div>\n </div>\n <div class=\"bar-label\">{{ trend.date | date:'MMM d' }}</div>\n <div class=\"bar-total\">{{ trend.total }}</div>\n </div>\n }\n </div>\n <div class=\"chart-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-color success\"></div>\n <span>Successful</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color failed\"></div>\n <span>Failed</span>\n </div>\n </div>\n } @else {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <p>No execution trends available</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Execution List -->\n <div class=\"executions-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-list\"></i> Recent Executions</h4>\n <div class=\"results-count\">{{ filteredExecutions.length }} executions</div>\n </div>\n \n <div class=\"executions-list\">\n @if (filteredExecutions.length > 0) {\n @for (execution of filteredExecutions; track execution.ID) {\n <div class=\"execution-item\" (click)=\"openExecution(execution)\">\n <div class=\"execution-status\">\n <i [class]=\"getResultIcon(execution.ResultCode)\"></i>\n </div>\n \n <div class=\"execution-main\">\n <div class=\"execution-action\" (click)=\"openAction(execution.ActionID!); $event.stopPropagation()\">\n {{ getActionName(execution.ActionID!) }}\n </div>\n <div class=\"execution-details\">\n <span class=\"execution-time\">{{ execution.StartedAt | date:'MMM d, HH:mm:ss' }}</span>\n <span class=\"execution-user\">{{ execution.UserID }}</span>\n <span class=\"execution-duration\">{{ getDuration(execution) }}</span>\n </div>\n </div>\n \n <div class=\"execution-result\">\n <span class=\"status-chip\" [attr.data-color]=\"getResultColor(execution.ResultCode)\">\n {{ execution.ResultCode || 'Unknown' }}\n </span>\n </div>\n \n <div class=\"execution-actions\">\n <button mjButton\n variant=\"flat\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h5>No executions found</h5>\n <p>Try adjusting your filters or search terms</p>\n </div>\n }\n </div>\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>", styles: [".execution-monitoring {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n color: var(--mj-text-primary);\n}\n.execution-monitoring .monitoring-header .header-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n}\n.execution-monitoring .monitoring-header .header-title h3 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring .monitoring-header .header-title h3 i {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring .monitoring-header .header-title .refresh-btn {\n gap: 0.5rem;\n}\n.execution-monitoring .monitoring-header .filters-row {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n}\n.execution-monitoring .monitoring-header .filters-row .search-container {\n flex: 1;\n min-width: 200px;\n}\n.execution-monitoring .monitoring-header .filters-row .filter-group {\n display: flex;\n gap: 0.75rem;\n}\n.execution-monitoring .metrics-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;\n}\n.execution-monitoring .metrics-summary .metric-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1.25rem;\n border-radius: 0.75rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n transition: all 0.2s ease;\n}\n.execution-monitoring .metrics-summary .metric-card.clickable {\n cursor: pointer;\n}\n.execution-monitoring .metrics-summary .metric-card.clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n}\n.execution-monitoring .metrics-summary .metric-card .metric-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.5rem;\n font-size: 1rem;\n}\n.execution-monitoring .metrics-summary .metric-card .metric-icon i {\n color: var(--mj-text-inverse);\n}\n.execution-monitoring .metrics-summary .metric-card .metric-content {\n flex: 1;\n}\n.execution-monitoring .metrics-summary .metric-card .metric-content .metric-value {\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n margin-bottom: 0.25rem;\n}\n.execution-monitoring .metrics-summary .metric-card .metric-content .metric-label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 0.125rem;\n}\n.execution-monitoring .metrics-summary .metric-card .metric-content .metric-detail {\n font-size: 0.625rem;\n color: var(--mj-text-muted);\n}\n.execution-monitoring .metrics-summary .metric-card.total .metric-icon {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring .metrics-summary .metric-card.success .metric-icon {\n background: var(--mj-status-success);\n}\n.execution-monitoring .metrics-summary .metric-card.error .metric-icon {\n background: var(--mj-status-error);\n}\n.execution-monitoring .metrics-summary .metric-card.duration .metric-icon {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring .metrics-summary .metric-card.activity .metric-icon {\n background: var(--mj-status-warning);\n}\n.execution-monitoring .metrics-summary .metric-card.running .metric-icon {\n background: var(--mj-brand-primary);\n}\n.execution-monitoring .trends-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n padding: 1.5rem;\n}\n.execution-monitoring .trends-section .section-header {\n margin-bottom: 1.5rem;\n}\n.execution-monitoring .trends-section .section-header h4 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring .trends-section .section-header h4 i {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring .trends-section .trends-chart .trend-bars {\n display: flex;\n align-items: end;\n gap: 1rem;\n height: 120px;\n margin-bottom: 1rem;\n}\n.execution-monitoring .trends-section .trends-chart .trend-bars .trend-bar {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring .trends-section .trends-chart .trend-bars .trend-bar .bar-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 80px;\n border-radius: 0.25rem;\n overflow: hidden;\n background: var(--mj-border-default);\n position: relative;\n}\n.execution-monitoring .trends-section .trends-chart .trend-bars .trend-bar .bar-container .bar-success {\n background: var(--mj-status-success);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.execution-monitoring .trends-section .trends-chart .trend-bars .trend-bar .bar-container .bar-failed {\n background: var(--mj-status-error);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.execution-monitoring .trends-section .trends-chart .trend-bars .trend-bar .bar-label {\n font-size: 0.625rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n.execution-monitoring .trends-section .trends-chart .trend-bars .trend-bar .bar-total {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.execution-monitoring .trends-section .trends-chart .chart-legend {\n display: flex;\n justify-content: center;\n gap: 1.5rem;\n}\n.execution-monitoring .trends-section .trends-chart .chart-legend .legend-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n}\n.execution-monitoring .trends-section .trends-chart .chart-legend .legend-item .legend-color {\n width: 12px;\n height: 12px;\n border-radius: 2px;\n}\n.execution-monitoring .trends-section .trends-chart .chart-legend .legend-item .legend-color.success {\n background: var(--mj-status-success);\n}\n.execution-monitoring .trends-section .trends-chart .chart-legend .legend-item .legend-color.failed {\n background: var(--mj-status-error);\n}\n.execution-monitoring .trends-section .trends-chart .empty-chart {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 120px;\n color: var(--mj-text-muted);\n}\n.execution-monitoring .trends-section .trends-chart .empty-chart i {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n opacity: 0.5;\n}\n.execution-monitoring .trends-section .trends-chart .empty-chart p {\n margin: 0;\n font-size: 0.875rem;\n}\n.execution-monitoring .executions-section {\n flex: 1;\n min-height: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n display: flex;\n flex-direction: column;\n}\n.execution-monitoring .executions-section .section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1.5rem 1.5rem 0;\n margin-bottom: 1rem;\n}\n.execution-monitoring .executions-section .section-header h4 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.execution-monitoring .executions-section .section-header h4 i {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring .executions-section .section-header .results-count {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n.execution-monitoring .executions-section .executions-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 0 1.5rem 1.5rem;\n}\n.execution-monitoring .executions-section .executions-list .execution-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 0.5rem;\n margin-bottom: 0.75rem;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface-elevated);\n}\n.execution-monitoring .executions-section .executions-list .execution-item:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-status {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-status i {\n font-size: 1rem;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-status i.fa-check-circle {\n color: var(--mj-status-success);\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-status i.fa-exclamation-circle {\n color: var(--mj-status-error);\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-status i.fa-spinner {\n color: var(--mj-status-warning);\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-status i.fa-info-circle, .execution-monitoring .executions-section .executions-list .execution-item .execution-status i.fa-question {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-main {\n flex: 1;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-main .execution-action {\n font-weight: 600;\n margin-bottom: 0.25rem;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-main .execution-action:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-main .execution-details {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-main .execution-details .execution-time {\n font-weight: 600;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-main .execution-details .execution-user {\n color: var(--mj-brand-primary);\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-main .execution-details .execution-duration {\n font-weight: 600;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-result {\n flex-shrink: 0;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-actions {\n flex-shrink: 0;\n}\n.execution-monitoring .executions-section .executions-list .execution-item .execution-actions button {\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.execution-monitoring .executions-section .executions-list .execution-item:hover .execution-actions button {\n opacity: 1;\n}\n.execution-monitoring .executions-section .executions-list .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--mj-text-muted);\n}\n.execution-monitoring .executions-section .executions-list .empty-state i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n}\n.execution-monitoring .executions-section .executions-list .empty-state h5 {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n}\n.execution-monitoring .executions-section .executions-list .empty-state p {\n margin: 0;\n font-size: 0.875rem;\n}\n.execution-monitoring .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 80%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n@media (max-width: 1200px) {\n .execution-monitoring .metrics-summary {\n grid-template-columns: repeat(3, 1fr);\n }\n .execution-monitoring .monitoring-header .filters-row .filter-group {\n flex-wrap: wrap;\n }\n}\n@media (max-width: 768px) {\n .execution-monitoring {\n padding: 1rem;\n gap: 1rem;\n }\n .execution-monitoring .metrics-summary {\n grid-template-columns: repeat(2, 1fr);\n gap: 0.75rem;\n }\n .execution-monitoring .metrics-summary .metric-card {\n padding: 1rem;\n }\n .execution-monitoring .metrics-summary .metric-card .metric-content .metric-value {\n font-size: 1.25rem;\n }\n .execution-monitoring .monitoring-header .header-title {\n flex-direction: column;\n align-items: stretch;\n gap: 1rem;\n }\n .execution-monitoring .monitoring-header .filters-row {\n flex-direction: column;\n align-items: stretch;\n }\n .execution-monitoring .monitoring-header .filters-row .search-container,\n .execution-monitoring .monitoring-header .filters-row .filter-group {\n min-width: unset;\n }\n .execution-monitoring .monitoring-header .filters-row .filter-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n .execution-monitoring .trends-section .trends-chart .trend-bars {\n gap: 0.5rem;\n }\n}\n"] }]
|
|
604
|
-
}], () => [{ type:
|
|
603
|
+
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
605
604
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExecutionMonitoringComponent, { className: "ExecutionMonitoringComponent", filePath: "src/Actions/components/execution-monitoring.component.ts", lineNumber: 35 }); })();
|
|
606
605
|
//# sourceMappingURL=execution-monitoring.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-monitoring.component.js","sourceRoot":"","sources":["../../../src/Actions/components/execution-monitoring.component.ts","../../../src/Actions/components/execution-monitoring.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport { MJActionExecutionLogEntity, MJActionEntity, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\ninterface ExecutionMetrics {\n totalExecutions: number;\n successfulExecutions: number;\n failedExecutions: number;\n averageDuration: number;\n executionsToday: number;\n executionsThisWeek: number;\n currentlyRunning: number;\n}\n\ninterface ExecutionTrend {\n date: string;\n successful: number;\n failed: number;\n total: number;\n}\n\n/**\n * Execution Monitoring Resource - displays action execution logs and metrics\n */\n@RegisterClass(BaseResourceComponent, 'ActionsMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-execution-monitoring',\n templateUrl: './execution-monitoring.component.html',\n styleUrls: ['./execution-monitoring.component.css']\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public executions: MJActionExecutionLogEntity[] = [];\n public filteredExecutions: MJActionExecutionLogEntity[] = [];\n public actions: Map<string, MJActionEntity> = new Map();\n \n public metrics: ExecutionMetrics = {\n totalExecutions: 0,\n successfulExecutions: 0,\n failedExecutions: 0,\n averageDuration: 0,\n executionsToday: 0,\n executionsThisWeek: 0,\n currentlyRunning: 0\n };\n\n public executionTrends: ExecutionTrend[] = [];\n \n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedResult$ = new BehaviorSubject<string>('all');\n public selectedTimeRange$ = new BehaviorSubject<string>('7days');\n public selectedAction$ = new BehaviorSubject<string>('all');\n\n public timeRangeOptions = [\n { text: 'Last 24 Hours', value: '24hours' },\n { text: 'Last 7 Days', value: '7days' },\n { text: 'Last 30 Days', value: '30days' },\n { text: 'Last 90 Days', value: '90days' }\n ];\n\n public resultOptions = [\n { text: 'All Results', value: 'all' },\n { text: 'Success', value: 'Success' },\n { text: 'Failed', value: 'Failed' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' }\n ];\n\n public actionOptions: Array<{text: string; value: string}> = [\n { text: 'All Actions', value: 'all' }\n ];\n\n private destroy$ = new Subject<void>();\n\n constructor(private navigationService: NavigationService, private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedResult$.pipe(distinctUntilChanged()),\n this.selectedTimeRange$.pipe(distinctUntilChanged()),\n this.selectedAction$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilters();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n \n const rv = new RunView();\n const [executionsResult, actionsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Action Execution Logs', \n OrderBy: 'StartedAt DESC' \n },\n {\n EntityName: 'MJ: Actions', \n OrderBy: 'Name' \n }\n ]);\n \n if (!executionsResult.Success || !actionsResult.Success) {\n throw new Error('Failed to load data');\n }\n \n const executions = executionsResult.Results as MJActionExecutionLogEntity[];\n const actions = actionsResult.Results as MJActionEntity[];\n\n this.executions = executions;\n this.populateActionsMap(actions);\n this.buildActionOptions(actions);\n this.calculateMetrics();\n this.generateExecutionTrends();\n this.applyFilters();\n\n } catch (error) {\n LogError('Failed to load execution monitoring data', undefined, error);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n }\n }\n\n private populateActionsMap(actions: MJActionEntity[]): void {\n this.actions.clear();\n actions.forEach(action => {\n this.actions.set(action.ID, action);\n });\n }\n\n private buildActionOptions(actions: MJActionEntity[]): void {\n this.actionOptions = [\n { text: 'All Actions', value: 'all' },\n ...actions.map(action => ({\n text: action.Name,\n value: action.ID\n }))\n ];\n }\n\n private calculateMetrics(): void {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const weekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);\n\n this.metrics = {\n totalExecutions: this.executions.length,\n successfulExecutions: this.executions.filter(e => e.ResultCode === 'Success').length,\n failedExecutions: this.executions.filter(e => \n e.ResultCode && ['Failed', 'Error'].includes(e.ResultCode)\n ).length,\n averageDuration: this.calculateAverageDuration(),\n executionsToday: this.executions.filter(e => \n new Date(e.StartedAt!) >= today\n ).length,\n executionsThisWeek: this.executions.filter(e => \n new Date(e.StartedAt!) >= weekAgo\n ).length,\n currentlyRunning: this.executions.filter(e => \n e.ResultCode === 'Running' || !e.EndedAt\n ).length\n };\n }\n\n private calculateAverageDuration(): number {\n const completedExecutions = this.executions.filter(e => \n e.StartedAt && e.EndedAt\n );\n \n if (completedExecutions.length === 0) return 0;\n\n const totalDuration = completedExecutions.reduce((sum, execution) => {\n const start = new Date(execution.StartedAt!).getTime();\n const end = new Date(execution.EndedAt!).getTime();\n return sum + (end - start);\n }, 0);\n\n return Math.round(totalDuration / completedExecutions.length / 1000); // Average in seconds\n }\n\n private generateExecutionTrends(): void {\n const trends = new Map<string, ExecutionTrend>();\n const last7Days = Array.from({ length: 7 }, (_, i) => {\n const date = new Date();\n date.setDate(date.getDate() - i);\n return date.toISOString().split('T')[0];\n }).reverse();\n\n // Initialize trends for last 7 days\n last7Days.forEach(date => {\n trends.set(date, {\n date,\n successful: 0,\n failed: 0,\n total: 0\n });\n });\n\n // Populate trends with execution data\n this.executions.forEach(execution => {\n if (!execution.StartedAt) return;\n \n const date = new Date(execution.StartedAt).toISOString().split('T')[0];\n const trend = trends.get(date);\n \n if (trend) {\n trend.total++;\n if (execution.ResultCode === 'Success') {\n trend.successful++;\n } else if (execution.ResultCode && ['Failed', 'Error'].includes(execution.ResultCode)) {\n trend.failed++;\n }\n }\n });\n\n this.executionTrends = Array.from(trends.values());\n }\n\n private applyFilters(): void {\n let filtered = [...this.executions];\n\n // Apply time range filter\n const timeRange = this.selectedTimeRange$.value;\n if (timeRange !== 'all') {\n const cutoffDate = this.getTimeRangeCutoff(timeRange);\n filtered = filtered.filter(e => \n e.StartedAt && new Date(e.StartedAt) >= cutoffDate\n );\n }\n\n // Apply result filter\n const result = this.selectedResult$.value;\n if (result !== 'all') {\n if (result === 'Running') {\n filtered = filtered.filter(e => !e.EndedAt || e.ResultCode === 'Running');\n } else {\n filtered = filtered.filter(e => e.ResultCode === result);\n }\n }\n\n // Apply action filter\n const actionId = this.selectedAction$.value;\n if (actionId !== 'all') {\n filtered = filtered.filter(e => UUIDsEqual(e.ActionID, actionId));\n }\n\n // Apply search filter\n const searchTerm = this.searchTerm$.value.toLowerCase();\n if (searchTerm) {\n filtered = filtered.filter(e => {\n const action = this.actions.get(e.ActionID!);\n return (\n action?.Name.toLowerCase().includes(searchTerm) ||\n e.ResultCode?.toLowerCase().includes(searchTerm) ||\n e.UserID?.toLowerCase().includes(searchTerm)\n );\n });\n }\n\n this.filteredExecutions = filtered;\n }\n\n private getTimeRangeCutoff(timeRange: string): Date {\n const now = new Date();\n switch (timeRange) {\n case '24hours':\n return new Date(now.getTime() - 24 * 60 * 60 * 1000);\n case '7days':\n return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n case '30days':\n return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n case '90days':\n return new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n default:\n return new Date(0);\n }\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onResultFilterChange(result: string): void {\n this.selectedResult$.next(result);\n }\n\n public onTimeRangeChange(timeRange: string): void {\n this.selectedTimeRange$.next(timeRange);\n }\n\n public onActionFilterChange(actionId: string): void {\n this.selectedAction$.next(actionId);\n }\n\n public openExecution(execution: MJActionExecutionLogEntity): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: execution.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Action Execution Logs', key);\n }\n\n public openAction(actionId: string): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: actionId }]);\n this.navigationService.OpenEntityRecord('MJ: Actions', key);\n }\n\n public getActionName(actionId: string): string {\n return this.actions.get(actionId)?.Name || `Action ${actionId}`;\n }\n\n public getResultColor(resultCode: string | null): 'success' | 'warning' | 'error' | 'info' {\n if (!resultCode) return 'info';\n switch (resultCode.toLowerCase()) {\n case 'success': return 'success';\n case 'failed':\n case 'error': return 'error';\n case 'running': return 'warning';\n default: return 'info';\n }\n }\n\n public getResultIcon(resultCode: string | null): string {\n if (!resultCode) return 'fa-solid fa-question';\n switch (resultCode.toLowerCase()) {\n case 'success': return 'fa-solid fa-check-circle';\n case 'failed':\n case 'error': return 'fa-solid fa-exclamation-circle';\n case 'running': return 'fa-solid fa-spinner fa-spin';\n default: return 'fa-solid fa-info-circle';\n }\n }\n\n public getDuration(execution: MJActionExecutionLogEntity): string {\n if (!execution.StartedAt || !execution.EndedAt) {\n return execution.EndedAt ? 'Unknown' : 'Running';\n }\n\n const start = new Date(execution.StartedAt).getTime();\n const end = new Date(execution.EndedAt).getTime();\n const duration = Math.round((end - start) / 1000);\n\n if (duration < 60) return `${duration}s`;\n if (duration < 3600) return `${Math.round(duration / 60)}m`;\n return `${Math.round(duration / 3600)}h`;\n }\n\n public getSuccessRate(): number {\n if (this.metrics.totalExecutions === 0) return 0;\n return Math.round((this.metrics.successfulExecutions / this.metrics.totalExecutions) * 100);\n }\n\n public refreshData(): void {\n this.loadData();\n }\n\n // Metric card click handlers\n public onTotalExecutionsClick(): void {\n // Reset filters to show all executions\n this.selectedResult$.next('all');\n this.selectedTimeRange$.next('7days');\n this.selectedAction$.next('all');\n }\n\n public onSuccessRateClick(): void {\n this.selectedResult$.next('Success');\n }\n\n public onFailedExecutionsClick(): void {\n this.selectedResult$.next('Failed');\n }\n\n public onRunningExecutionsClick(): void {\n this.selectedResult$.next('Running');\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Execution Monitoring';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}","<div class=\"execution-monitoring\" >\n <!-- Header with filters -->\n <div class=\"monitoring-header\">\n <div class=\"header-title\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Execution Monitoring</h3>\n <button mjButton variant=\"primary\" (click)=\"refreshData()\" class=\"refresh-btn\">\n <i class=\"fa-solid fa-refresh\"></i> Refresh\n </button>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search executions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n\n <div class=\"filter-group\">\n <mj-dropdown\n [Data]=\"timeRangeOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedTimeRange$.value\"\n (ValueChange)=\"onTimeRangeChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"resultOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedResult$.value\"\n (ValueChange)=\"onResultFilterChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"actionOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedAction$.value\"\n (ValueChange)=\"onActionFilterChange($any($event))\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Metrics Summary -->\n <div class=\"metrics-summary\">\n <div class=\"metric-card total clickable\" (click)=\"onTotalExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalExecutions }}</div>\n <div class=\"metric-label\">Total Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card success clickable\" (click)=\"onSuccessRateClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getSuccessRate() }}%</div>\n <div class=\"metric-label\">Success Rate</div>\n <div class=\"metric-detail\">{{ metrics.successfulExecutions }}/{{ metrics.totalExecutions }}</div>\n </div>\n </div>\n\n <div class=\"metric-card error clickable\" (click)=\"onFailedExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.failedExecutions }}</div>\n <div class=\"metric-label\">Failed Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card duration\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.averageDuration }}s</div>\n <div class=\"metric-label\">Avg Duration</div>\n </div>\n </div>\n\n <div class=\"metric-card activity\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-calendar-day\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.executionsToday }}</div>\n <div class=\"metric-label\">Today</div>\n <div class=\"metric-detail\">{{ metrics.executionsThisWeek }} this week</div>\n </div>\n </div>\n\n <div class=\"metric-card running clickable\" (click)=\"onRunningExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.currentlyRunning }}</div>\n <div class=\"metric-label\">Currently Running</div>\n </div>\n </div>\n </div>\n\n <!-- Execution Trends Chart -->\n <div class=\"trends-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-chart-area\"></i> 7-Day Execution Trends</h4>\n </div>\n <div class=\"trends-chart\">\n @if (executionTrends.length > 0) {\n <div class=\"trend-bars\">\n @for (trend of executionTrends; track trend.date) {\n <div class=\"trend-bar\">\n <div class=\"bar-container\">\n <div class=\"bar-success\" [style.height.%]=\"trend.total > 0 ? (trend.successful / trend.total) * 100 : 0\"></div>\n <div class=\"bar-failed\" [style.height.%]=\"trend.total > 0 ? (trend.failed / trend.total) * 100 : 0\"></div>\n </div>\n <div class=\"bar-label\">{{ trend.date | date:'MMM d' }}</div>\n <div class=\"bar-total\">{{ trend.total }}</div>\n </div>\n }\n </div>\n <div class=\"chart-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-color success\"></div>\n <span>Successful</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color failed\"></div>\n <span>Failed</span>\n </div>\n </div>\n } @else {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <p>No execution trends available</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Execution List -->\n <div class=\"executions-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-list\"></i> Recent Executions</h4>\n <div class=\"results-count\">{{ filteredExecutions.length }} executions</div>\n </div>\n \n <div class=\"executions-list\">\n @if (filteredExecutions.length > 0) {\n @for (execution of filteredExecutions; track execution.ID) {\n <div class=\"execution-item\" (click)=\"openExecution(execution)\">\n <div class=\"execution-status\">\n <i [class]=\"getResultIcon(execution.ResultCode)\"></i>\n </div>\n \n <div class=\"execution-main\">\n <div class=\"execution-action\" (click)=\"openAction(execution.ActionID!); $event.stopPropagation()\">\n {{ getActionName(execution.ActionID!) }}\n </div>\n <div class=\"execution-details\">\n <span class=\"execution-time\">{{ execution.StartedAt | date:'MMM d, HH:mm:ss' }}</span>\n <span class=\"execution-user\">{{ execution.UserID }}</span>\n <span class=\"execution-duration\">{{ getDuration(execution) }}</span>\n </div>\n </div>\n \n <div class=\"execution-result\">\n <span class=\"status-chip\" [attr.data-color]=\"getResultColor(execution.ResultCode)\">\n {{ execution.ResultCode || 'Unknown' }}\n </span>\n </div>\n \n <div class=\"execution-actions\">\n <button mjButton\n variant=\"flat\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h5>No executions found</h5>\n <p>Try adjusting your filters or search terms</p>\n </div>\n }\n </div>\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
|
|
1
|
+
{"version":3,"file":"execution-monitoring.component.js","sourceRoot":"","sources":["../../../src/Actions/components/execution-monitoring.component.ts","../../../src/Actions/components/execution-monitoring.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport { MJActionExecutionLogEntity, MJActionEntity, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\ninterface ExecutionMetrics {\n totalExecutions: number;\n successfulExecutions: number;\n failedExecutions: number;\n averageDuration: number;\n executionsToday: number;\n executionsThisWeek: number;\n currentlyRunning: number;\n}\n\ninterface ExecutionTrend {\n date: string;\n successful: number;\n failed: number;\n total: number;\n}\n\n/**\n * Execution Monitoring Resource - displays action execution logs and metrics\n */\n@RegisterClass(BaseResourceComponent, 'ActionsMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-execution-monitoring',\n templateUrl: './execution-monitoring.component.html',\n styleUrls: ['./execution-monitoring.component.css']\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public executions: MJActionExecutionLogEntity[] = [];\n public filteredExecutions: MJActionExecutionLogEntity[] = [];\n public actions: Map<string, MJActionEntity> = new Map();\n \n public metrics: ExecutionMetrics = {\n totalExecutions: 0,\n successfulExecutions: 0,\n failedExecutions: 0,\n averageDuration: 0,\n executionsToday: 0,\n executionsThisWeek: 0,\n currentlyRunning: 0\n };\n\n public executionTrends: ExecutionTrend[] = [];\n \n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedResult$ = new BehaviorSubject<string>('all');\n public selectedTimeRange$ = new BehaviorSubject<string>('7days');\n public selectedAction$ = new BehaviorSubject<string>('all');\n\n public timeRangeOptions = [\n { text: 'Last 24 Hours', value: '24hours' },\n { text: 'Last 7 Days', value: '7days' },\n { text: 'Last 30 Days', value: '30days' },\n { text: 'Last 90 Days', value: '90days' }\n ];\n\n public resultOptions = [\n { text: 'All Results', value: 'all' },\n { text: 'Success', value: 'Success' },\n { text: 'Failed', value: 'Failed' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' }\n ];\n\n public actionOptions: Array<{text: string; value: string}> = [\n { text: 'All Actions', value: 'all' }\n ];\n\n protected override destroy$ = new Subject<void>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedResult$.pipe(distinctUntilChanged()),\n this.selectedTimeRange$.pipe(distinctUntilChanged()),\n this.selectedAction$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilters();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n \n const rv = new RunView();\n const [executionsResult, actionsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Action Execution Logs', \n OrderBy: 'StartedAt DESC' \n },\n {\n EntityName: 'MJ: Actions', \n OrderBy: 'Name' \n }\n ]);\n \n if (!executionsResult.Success || !actionsResult.Success) {\n throw new Error('Failed to load data');\n }\n \n const executions = executionsResult.Results as MJActionExecutionLogEntity[];\n const actions = actionsResult.Results as MJActionEntity[];\n\n this.executions = executions;\n this.populateActionsMap(actions);\n this.buildActionOptions(actions);\n this.calculateMetrics();\n this.generateExecutionTrends();\n this.applyFilters();\n\n } catch (error) {\n LogError('Failed to load execution monitoring data', undefined, error);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n }\n }\n\n private populateActionsMap(actions: MJActionEntity[]): void {\n this.actions.clear();\n actions.forEach(action => {\n this.actions.set(action.ID, action);\n });\n }\n\n private buildActionOptions(actions: MJActionEntity[]): void {\n this.actionOptions = [\n { text: 'All Actions', value: 'all' },\n ...actions.map(action => ({\n text: action.Name,\n value: action.ID\n }))\n ];\n }\n\n private calculateMetrics(): void {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const weekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);\n\n this.metrics = {\n totalExecutions: this.executions.length,\n successfulExecutions: this.executions.filter(e => e.ResultCode === 'Success').length,\n failedExecutions: this.executions.filter(e => \n e.ResultCode && ['Failed', 'Error'].includes(e.ResultCode)\n ).length,\n averageDuration: this.calculateAverageDuration(),\n executionsToday: this.executions.filter(e => \n new Date(e.StartedAt!) >= today\n ).length,\n executionsThisWeek: this.executions.filter(e => \n new Date(e.StartedAt!) >= weekAgo\n ).length,\n currentlyRunning: this.executions.filter(e => \n e.ResultCode === 'Running' || !e.EndedAt\n ).length\n };\n }\n\n private calculateAverageDuration(): number {\n const completedExecutions = this.executions.filter(e => \n e.StartedAt && e.EndedAt\n );\n \n if (completedExecutions.length === 0) return 0;\n\n const totalDuration = completedExecutions.reduce((sum, execution) => {\n const start = new Date(execution.StartedAt!).getTime();\n const end = new Date(execution.EndedAt!).getTime();\n return sum + (end - start);\n }, 0);\n\n return Math.round(totalDuration / completedExecutions.length / 1000); // Average in seconds\n }\n\n private generateExecutionTrends(): void {\n const trends = new Map<string, ExecutionTrend>();\n const last7Days = Array.from({ length: 7 }, (_, i) => {\n const date = new Date();\n date.setDate(date.getDate() - i);\n return date.toISOString().split('T')[0];\n }).reverse();\n\n // Initialize trends for last 7 days\n last7Days.forEach(date => {\n trends.set(date, {\n date,\n successful: 0,\n failed: 0,\n total: 0\n });\n });\n\n // Populate trends with execution data\n this.executions.forEach(execution => {\n if (!execution.StartedAt) return;\n \n const date = new Date(execution.StartedAt).toISOString().split('T')[0];\n const trend = trends.get(date);\n \n if (trend) {\n trend.total++;\n if (execution.ResultCode === 'Success') {\n trend.successful++;\n } else if (execution.ResultCode && ['Failed', 'Error'].includes(execution.ResultCode)) {\n trend.failed++;\n }\n }\n });\n\n this.executionTrends = Array.from(trends.values());\n }\n\n private applyFilters(): void {\n let filtered = [...this.executions];\n\n // Apply time range filter\n const timeRange = this.selectedTimeRange$.value;\n if (timeRange !== 'all') {\n const cutoffDate = this.getTimeRangeCutoff(timeRange);\n filtered = filtered.filter(e => \n e.StartedAt && new Date(e.StartedAt) >= cutoffDate\n );\n }\n\n // Apply result filter\n const result = this.selectedResult$.value;\n if (result !== 'all') {\n if (result === 'Running') {\n filtered = filtered.filter(e => !e.EndedAt || e.ResultCode === 'Running');\n } else {\n filtered = filtered.filter(e => e.ResultCode === result);\n }\n }\n\n // Apply action filter\n const actionId = this.selectedAction$.value;\n if (actionId !== 'all') {\n filtered = filtered.filter(e => UUIDsEqual(e.ActionID, actionId));\n }\n\n // Apply search filter\n const searchTerm = this.searchTerm$.value.toLowerCase();\n if (searchTerm) {\n filtered = filtered.filter(e => {\n const action = this.actions.get(e.ActionID!);\n return (\n action?.Name.toLowerCase().includes(searchTerm) ||\n e.ResultCode?.toLowerCase().includes(searchTerm) ||\n e.UserID?.toLowerCase().includes(searchTerm)\n );\n });\n }\n\n this.filteredExecutions = filtered;\n }\n\n private getTimeRangeCutoff(timeRange: string): Date {\n const now = new Date();\n switch (timeRange) {\n case '24hours':\n return new Date(now.getTime() - 24 * 60 * 60 * 1000);\n case '7days':\n return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n case '30days':\n return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n case '90days':\n return new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n default:\n return new Date(0);\n }\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onResultFilterChange(result: string): void {\n this.selectedResult$.next(result);\n }\n\n public onTimeRangeChange(timeRange: string): void {\n this.selectedTimeRange$.next(timeRange);\n }\n\n public onActionFilterChange(actionId: string): void {\n this.selectedAction$.next(actionId);\n }\n\n public openExecution(execution: MJActionExecutionLogEntity): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: execution.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Action Execution Logs', key);\n }\n\n public openAction(actionId: string): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: actionId }]);\n this.navigationService.OpenEntityRecord('MJ: Actions', key);\n }\n\n public getActionName(actionId: string): string {\n return this.actions.get(actionId)?.Name || `Action ${actionId}`;\n }\n\n public getResultColor(resultCode: string | null): 'success' | 'warning' | 'error' | 'info' {\n if (!resultCode) return 'info';\n switch (resultCode.toLowerCase()) {\n case 'success': return 'success';\n case 'failed':\n case 'error': return 'error';\n case 'running': return 'warning';\n default: return 'info';\n }\n }\n\n public getResultIcon(resultCode: string | null): string {\n if (!resultCode) return 'fa-solid fa-question';\n switch (resultCode.toLowerCase()) {\n case 'success': return 'fa-solid fa-check-circle';\n case 'failed':\n case 'error': return 'fa-solid fa-exclamation-circle';\n case 'running': return 'fa-solid fa-spinner fa-spin';\n default: return 'fa-solid fa-info-circle';\n }\n }\n\n public getDuration(execution: MJActionExecutionLogEntity): string {\n if (!execution.StartedAt || !execution.EndedAt) {\n return execution.EndedAt ? 'Unknown' : 'Running';\n }\n\n const start = new Date(execution.StartedAt).getTime();\n const end = new Date(execution.EndedAt).getTime();\n const duration = Math.round((end - start) / 1000);\n\n if (duration < 60) return `${duration}s`;\n if (duration < 3600) return `${Math.round(duration / 60)}m`;\n return `${Math.round(duration / 3600)}h`;\n }\n\n public getSuccessRate(): number {\n if (this.metrics.totalExecutions === 0) return 0;\n return Math.round((this.metrics.successfulExecutions / this.metrics.totalExecutions) * 100);\n }\n\n public refreshData(): void {\n this.loadData();\n }\n\n // Metric card click handlers\n public onTotalExecutionsClick(): void {\n // Reset filters to show all executions\n this.selectedResult$.next('all');\n this.selectedTimeRange$.next('7days');\n this.selectedAction$.next('all');\n }\n\n public onSuccessRateClick(): void {\n this.selectedResult$.next('Success');\n }\n\n public onFailedExecutionsClick(): void {\n this.selectedResult$.next('Failed');\n }\n\n public onRunningExecutionsClick(): void {\n this.selectedResult$.next('Running');\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Execution Monitoring';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}","<div class=\"execution-monitoring\" >\n <!-- Header with filters -->\n <div class=\"monitoring-header\">\n <div class=\"header-title\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Execution Monitoring</h3>\n <button mjButton variant=\"primary\" (click)=\"refreshData()\" class=\"refresh-btn\">\n <i class=\"fa-solid fa-refresh\"></i> Refresh\n </button>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search executions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n\n <div class=\"filter-group\">\n <mj-dropdown\n [Data]=\"timeRangeOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedTimeRange$.value\"\n (ValueChange)=\"onTimeRangeChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"resultOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedResult$.value\"\n (ValueChange)=\"onResultFilterChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"actionOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedAction$.value\"\n (ValueChange)=\"onActionFilterChange($any($event))\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Metrics Summary -->\n <div class=\"metrics-summary\">\n <div class=\"metric-card total clickable\" (click)=\"onTotalExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalExecutions }}</div>\n <div class=\"metric-label\">Total Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card success clickable\" (click)=\"onSuccessRateClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getSuccessRate() }}%</div>\n <div class=\"metric-label\">Success Rate</div>\n <div class=\"metric-detail\">{{ metrics.successfulExecutions }}/{{ metrics.totalExecutions }}</div>\n </div>\n </div>\n\n <div class=\"metric-card error clickable\" (click)=\"onFailedExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.failedExecutions }}</div>\n <div class=\"metric-label\">Failed Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card duration\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.averageDuration }}s</div>\n <div class=\"metric-label\">Avg Duration</div>\n </div>\n </div>\n\n <div class=\"metric-card activity\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-calendar-day\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.executionsToday }}</div>\n <div class=\"metric-label\">Today</div>\n <div class=\"metric-detail\">{{ metrics.executionsThisWeek }} this week</div>\n </div>\n </div>\n\n <div class=\"metric-card running clickable\" (click)=\"onRunningExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.currentlyRunning }}</div>\n <div class=\"metric-label\">Currently Running</div>\n </div>\n </div>\n </div>\n\n <!-- Execution Trends Chart -->\n <div class=\"trends-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-chart-area\"></i> 7-Day Execution Trends</h4>\n </div>\n <div class=\"trends-chart\">\n @if (executionTrends.length > 0) {\n <div class=\"trend-bars\">\n @for (trend of executionTrends; track trend.date) {\n <div class=\"trend-bar\">\n <div class=\"bar-container\">\n <div class=\"bar-success\" [style.height.%]=\"trend.total > 0 ? (trend.successful / trend.total) * 100 : 0\"></div>\n <div class=\"bar-failed\" [style.height.%]=\"trend.total > 0 ? (trend.failed / trend.total) * 100 : 0\"></div>\n </div>\n <div class=\"bar-label\">{{ trend.date | date:'MMM d' }}</div>\n <div class=\"bar-total\">{{ trend.total }}</div>\n </div>\n }\n </div>\n <div class=\"chart-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-color success\"></div>\n <span>Successful</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color failed\"></div>\n <span>Failed</span>\n </div>\n </div>\n } @else {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <p>No execution trends available</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Execution List -->\n <div class=\"executions-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-list\"></i> Recent Executions</h4>\n <div class=\"results-count\">{{ filteredExecutions.length }} executions</div>\n </div>\n \n <div class=\"executions-list\">\n @if (filteredExecutions.length > 0) {\n @for (execution of filteredExecutions; track execution.ID) {\n <div class=\"execution-item\" (click)=\"openExecution(execution)\">\n <div class=\"execution-status\">\n <i [class]=\"getResultIcon(execution.ResultCode)\"></i>\n </div>\n \n <div class=\"execution-main\">\n <div class=\"execution-action\" (click)=\"openAction(execution.ActionID!); $event.stopPropagation()\">\n {{ getActionName(execution.ActionID!) }}\n </div>\n <div class=\"execution-details\">\n <span class=\"execution-time\">{{ execution.StartedAt | date:'MMM d, HH:mm:ss' }}</span>\n <span class=\"execution-user\">{{ execution.UserID }}</span>\n <span class=\"execution-duration\">{{ getDuration(execution) }}</span>\n </div>\n </div>\n \n <div class=\"execution-result\">\n <span class=\"status-chip\" [attr.data-color]=\"getResultColor(execution.ResultCode)\">\n {{ execution.ResultCode || 'Unknown' }}\n </span>\n </div>\n \n <div class=\"execution-actions\">\n <button mjButton\n variant=\"flat\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h5>No executions found</h5>\n <p>Try adjusting your filters or search terms</p>\n </div>\n }\n </div>\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
3
|
import { MJActionCategoryEntity, MJActionEntity, MJActionParamEntity, ResourceData } from '@memberjunction/core-entities';
|
|
4
4
|
import { MJActionEntityExtended } from '@memberjunction/actions-base';
|
|
5
|
-
import { BaseResourceComponent
|
|
5
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
6
6
|
import { ActionExplorerStateService, ActionViewMode } from '../../services/action-explorer-state.service';
|
|
7
7
|
import { ActionTreePanelComponent } from './action-tree-panel.component';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
export declare class ActionExplorerComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
10
10
|
StateService: ActionExplorerStateService;
|
|
11
|
-
private navigationService;
|
|
12
|
-
private router;
|
|
13
11
|
private cdr;
|
|
14
12
|
TreePanel: ActionTreePanelComponent;
|
|
15
13
|
IsLoading: boolean;
|
|
@@ -23,21 +21,24 @@ export declare class ActionExplorerComponent extends BaseResourceComponent imple
|
|
|
23
21
|
IsRunDialogOpen: boolean;
|
|
24
22
|
SelectedActionForRun: MJActionEntity | null;
|
|
25
23
|
SelectedActionParams: MJActionParamEntity[];
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
private skipUrlUpdate;
|
|
29
|
-
constructor(StateService: ActionExplorerStateService, navigationService: NavigationService, router: Router, cdr: ChangeDetectorRef);
|
|
24
|
+
protected destroy$: Subject<void>;
|
|
25
|
+
constructor(StateService: ActionExplorerStateService, cdr: ChangeDetectorRef);
|
|
30
26
|
ngOnInit(): void;
|
|
31
27
|
ngOnDestroy(): void;
|
|
32
28
|
private subscribeToState;
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Convert the framework's plain-object params into the StateService's URLSearchParams-based parser.
|
|
31
|
+
*/
|
|
32
|
+
private applyQueryParams;
|
|
35
33
|
private loadData;
|
|
36
34
|
private applyFilters;
|
|
37
35
|
private getDescendantCategoryIds;
|
|
38
36
|
private sortActions;
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
/**
|
|
38
|
+
* React to back/forward navigation or deep-link activation.
|
|
39
|
+
* Called by the base class when the URL query params change externally.
|
|
40
|
+
*/
|
|
41
|
+
protected OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void;
|
|
41
42
|
onRefresh(): Promise<void>;
|
|
42
43
|
onCategorySelect(categoryId: string): void;
|
|
43
44
|
onNewCategory(parentId: string | null): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-explorer.component.d.ts","sourceRoot":"","sources":["../../../../src/Actions/components/explorer/action-explorer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EACN,SAAS,EAET,iBAAiB,EAElB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"action-explorer.component.d.ts","sourceRoot":"","sources":["../../../../src/Actions/components/explorer/action-explorer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EACN,SAAS,EAET,iBAAiB,EAElB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC1H,OAAO,EAAoB,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAExF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EACL,0BAA0B,EAC1B,cAAc,EAGf,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AACzE,qBASa,uBAAwB,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAqBpF,YAAY,EAAE,0BAA0B;IAC/C,OAAO,CAAC,GAAG;IArBwB,SAAS,EAAG,wBAAwB,CAAC;IAEnE,SAAS,UAAQ;IACjB,OAAO,EAAE,sBAAsB,EAAE,CAAM;IACvC,eAAe,EAAE,sBAAsB,EAAE,CAAM;IAC/C,UAAU,EAAE,sBAAsB,EAAE,CAAM;IAC1C,aAAa,sCAA6C;IAE1D,QAAQ,EAAE,cAAc,CAAU;IAClC,kBAAkB,SAAS;IAC3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG1C,eAAe,UAAS;IACxB,oBAAoB,EAAE,cAAc,GAAG,IAAI,CAAQ;IACnD,oBAAoB,EAAE,mBAAmB,EAAE,CAAM;IAExD,UAAmB,QAAQ,gBAAuB;gBAGzC,YAAY,EAAE,0BAA0B,EACvC,GAAG,EAAE,iBAAiB;IAKhC,QAAQ,IAAI,IAAI;IAQhB,WAAW,IAAI,IAAI;IAMnB,OAAO,CAAC,gBAAgB;IA+BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;YAUV,QAAQ;IA0CtB,OAAO,CAAC,YAAY;IAuCpB,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,WAAW;IAmCnB;;;OAGG;cACgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAMjG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI1C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAK5C,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKtD,WAAW,IAAI,IAAI;IAInB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAKnD,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAI5C,WAAW,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BhE,gBAAgB,IAAI,IAAI;IAOxB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAInC,iBAAiB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvC,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAxTpD,uBAAuB;2CAAvB,uBAAuB;CA2TnC"}
|