@memberjunction/ng-dashboards 5.34.1 → 5.35.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 +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -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 +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +781 -783
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +79 -30
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +196 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +32 -40
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +32 -40
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +32 -40
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- 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 +127 -106
- 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 +44 -45
- 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 +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +309 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +866 -847
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +241 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +486 -532
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -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 +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +234 -246
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.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 +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +587 -608
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.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 +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +107 -93
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +36 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +2 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +24 -3
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +31 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +1 -1
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +28 -1
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +30 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +52 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -5,186 +5,222 @@ import * as i1 from "../services/scheduling-instrumentation.service";
|
|
|
5
5
|
import * as i2 from "@angular/common";
|
|
6
6
|
import * as i3 from "@memberjunction/ng-ui-components";
|
|
7
7
|
import * as i4 from "@memberjunction/ng-shared-generic";
|
|
8
|
-
function
|
|
9
|
-
i0.ɵɵ
|
|
10
|
-
|
|
8
|
+
function SchedulingOverviewComponent_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
9
|
+
i0.ɵɵelementContainer(0);
|
|
10
|
+
} }
|
|
11
|
+
function SchedulingOverviewComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
12
|
+
i0.ɵɵtemplate(0, SchedulingOverviewComponent_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 1);
|
|
13
|
+
} if (rf & 2) {
|
|
14
|
+
i0.ɵɵnextContext();
|
|
15
|
+
const content_r1 = i0.ɵɵreference(3);
|
|
16
|
+
i0.ɵɵproperty("ngTemplateOutlet", content_r1);
|
|
17
|
+
} }
|
|
18
|
+
function SchedulingOverviewComponent_Conditional_1_ng_container_8_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementContainer(0);
|
|
20
|
+
} }
|
|
21
|
+
function SchedulingOverviewComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
23
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 2)(2, "div", 3)(3, "mj-refresh-button", 4);
|
|
24
|
+
i0.ɵɵlistener("Clicked", function SchedulingOverviewComponent_Conditional_1_Template_mj_refresh_button_Clicked_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.Refresh()); });
|
|
25
|
+
i0.ɵɵelementEnd();
|
|
26
|
+
i0.ɵɵelementStart(4, "button", 5);
|
|
27
|
+
i0.ɵɵlistener("click", function SchedulingOverviewComponent_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ToggleAutoRefresh()); });
|
|
28
|
+
i0.ɵɵelement(5, "i", 6);
|
|
29
|
+
i0.ɵɵtext(6);
|
|
30
|
+
i0.ɵɵelementEnd()()();
|
|
31
|
+
i0.ɵɵelementStart(7, "mj-page-body");
|
|
32
|
+
i0.ɵɵtemplate(8, SchedulingOverviewComponent_Conditional_1_ng_container_8_Template, 1, 0, "ng-container", 1);
|
|
33
|
+
i0.ɵɵelementEnd()();
|
|
34
|
+
} if (rf & 2) {
|
|
35
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
36
|
+
const content_r1 = i0.ɵɵreference(3);
|
|
37
|
+
i0.ɵɵadvance(4);
|
|
38
|
+
i0.ɵɵproperty("variant", ctx_r2.AutoRefreshEnabled ? "primary" : "secondary");
|
|
39
|
+
i0.ɵɵadvance(2);
|
|
40
|
+
i0.ɵɵtextInterpolate1(" Auto: ", ctx_r2.AutoRefreshEnabled ? "ON" : "OFF", " ");
|
|
41
|
+
i0.ɵɵadvance(2);
|
|
42
|
+
i0.ɵɵproperty("ngTemplateOutlet", content_r1);
|
|
43
|
+
} }
|
|
44
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
+
i0.ɵɵelementStart(0, "div", 8);
|
|
46
|
+
i0.ɵɵelement(1, "mj-loading", 10);
|
|
11
47
|
i0.ɵɵelementEnd();
|
|
12
48
|
} }
|
|
13
|
-
function
|
|
14
|
-
i0.ɵɵelementStart(0, "div",
|
|
15
|
-
i0.ɵɵelement(1, "i",
|
|
49
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
+
i0.ɵɵelementStart(0, "div", 44);
|
|
51
|
+
i0.ɵɵelement(1, "i", 55);
|
|
16
52
|
i0.ɵɵelementStart(2, "span");
|
|
17
53
|
i0.ɵɵtext(3, "No recent executions");
|
|
18
54
|
i0.ɵɵelementEnd()();
|
|
19
55
|
} }
|
|
20
|
-
function
|
|
21
|
-
i0.ɵɵelementStart(0, "div",
|
|
22
|
-
i0.ɵɵelement(2, "i",
|
|
56
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
+
i0.ɵɵelementStart(0, "div", 45)(1, "div", 56);
|
|
58
|
+
i0.ɵɵelement(2, "i", 57);
|
|
23
59
|
i0.ɵɵelementEnd();
|
|
24
|
-
i0.ɵɵelementStart(3, "div",
|
|
60
|
+
i0.ɵɵelementStart(3, "div", 58)(4, "div", 59);
|
|
25
61
|
i0.ɵɵtext(5);
|
|
26
62
|
i0.ɵɵelementEnd();
|
|
27
|
-
i0.ɵɵelementStart(6, "div",
|
|
63
|
+
i0.ɵɵelementStart(6, "div", 60);
|
|
28
64
|
i0.ɵɵtext(7);
|
|
29
65
|
i0.ɵɵelementEnd()();
|
|
30
|
-
i0.ɵɵelementStart(8, "div",
|
|
66
|
+
i0.ɵɵelementStart(8, "div", 61);
|
|
31
67
|
i0.ɵɵtext(9);
|
|
32
68
|
i0.ɵɵelementEnd()();
|
|
33
69
|
} if (rf & 2) {
|
|
34
|
-
const
|
|
35
|
-
const
|
|
70
|
+
const exec_r4 = ctx.$implicit;
|
|
71
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
36
72
|
i0.ɵɵadvance(2);
|
|
37
|
-
i0.ɵɵclassMap(
|
|
38
|
-
i0.ɵɵproperty("ngClass",
|
|
73
|
+
i0.ɵɵclassMap(ctx_r2.GetStatusIcon(exec_r4.status));
|
|
74
|
+
i0.ɵɵproperty("ngClass", ctx_r2.GetStatusClass(exec_r4.status));
|
|
39
75
|
i0.ɵɵadvance(3);
|
|
40
|
-
i0.ɵɵtextInterpolate(
|
|
76
|
+
i0.ɵɵtextInterpolate(exec_r4.jobName);
|
|
41
77
|
i0.ɵɵadvance(2);
|
|
42
|
-
i0.ɵɵtextInterpolate2("",
|
|
78
|
+
i0.ɵɵtextInterpolate2("", ctx_r2.FormatTimeAgo(exec_r4.startedAt), " \u00B7 ", ctx_r2.FormatDuration(exec_r4.duration));
|
|
43
79
|
i0.ɵɵadvance();
|
|
44
|
-
i0.ɵɵproperty("ngClass",
|
|
80
|
+
i0.ɵɵproperty("ngClass", ctx_r2.GetStatusClass(exec_r4.status));
|
|
45
81
|
i0.ɵɵadvance();
|
|
46
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
82
|
+
i0.ɵɵtextInterpolate1(" ", exec_r4.status, " ");
|
|
47
83
|
} }
|
|
48
|
-
function
|
|
49
|
-
i0.ɵɵelementStart(0, "span",
|
|
84
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
+
i0.ɵɵelementStart(0, "span", 48);
|
|
50
86
|
i0.ɵɵtext(1);
|
|
51
87
|
i0.ɵɵelementEnd();
|
|
52
88
|
} if (rf & 2) {
|
|
53
|
-
const
|
|
89
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
54
90
|
i0.ɵɵadvance();
|
|
55
|
-
i0.ɵɵtextInterpolate(
|
|
91
|
+
i0.ɵɵtextInterpolate(ctx_r2.Alerts.length);
|
|
56
92
|
} }
|
|
57
|
-
function
|
|
58
|
-
i0.ɵɵelementStart(0, "span",
|
|
93
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_75_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
+
i0.ɵɵelementStart(0, "span", 49);
|
|
59
95
|
i0.ɵɵtext(1, "0");
|
|
60
96
|
i0.ɵɵelementEnd();
|
|
61
97
|
} }
|
|
62
|
-
function
|
|
63
|
-
i0.ɵɵelementStart(0, "div",
|
|
64
|
-
i0.ɵɵelement(1, "i",
|
|
98
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_77_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
+
i0.ɵɵelementStart(0, "div", 50);
|
|
100
|
+
i0.ɵɵelement(1, "i", 62);
|
|
65
101
|
i0.ɵɵelementStart(2, "span");
|
|
66
102
|
i0.ɵɵtext(3, "No active alerts");
|
|
67
103
|
i0.ɵɵelementEnd()();
|
|
68
104
|
} }
|
|
69
|
-
function
|
|
70
|
-
const
|
|
71
|
-
i0.ɵɵelementStart(0, "button",
|
|
72
|
-
i0.ɵɵlistener("click", function
|
|
105
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
106
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
107
|
+
i0.ɵɵelementStart(0, "button", 68);
|
|
108
|
+
i0.ɵɵlistener("click", function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const alert_r6 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ReleaseLock(alert_r6.jobId)); });
|
|
73
109
|
i0.ɵɵtext(1, " Release ");
|
|
74
110
|
i0.ɵɵelementEnd();
|
|
75
111
|
} }
|
|
76
|
-
function
|
|
77
|
-
i0.ɵɵelementStart(0, "div",
|
|
78
|
-
i0.ɵɵelement(1, "i",
|
|
79
|
-
i0.ɵɵelementStart(2, "div",
|
|
112
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
+
i0.ɵɵelementStart(0, "div", 51);
|
|
114
|
+
i0.ɵɵelement(1, "i", 63);
|
|
115
|
+
i0.ɵɵelementStart(2, "div", 64)(3, "div", 65);
|
|
80
116
|
i0.ɵɵtext(4);
|
|
81
117
|
i0.ɵɵelementEnd();
|
|
82
|
-
i0.ɵɵelementStart(5, "div",
|
|
118
|
+
i0.ɵɵelementStart(5, "div", 66);
|
|
83
119
|
i0.ɵɵtext(6);
|
|
84
120
|
i0.ɵɵelementEnd()();
|
|
85
|
-
i0.ɵɵconditionalCreate(7,
|
|
121
|
+
i0.ɵɵconditionalCreate(7, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template, 2, 0, "button", 67);
|
|
86
122
|
i0.ɵɵelementEnd();
|
|
87
123
|
} if (rf & 2) {
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
i0.ɵɵproperty("ngClass", "alert-" +
|
|
124
|
+
const alert_r6 = ctx.$implicit;
|
|
125
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
126
|
+
i0.ɵɵproperty("ngClass", "alert-" + alert_r6.severity);
|
|
91
127
|
i0.ɵɵadvance();
|
|
92
|
-
i0.ɵɵclassMap(
|
|
128
|
+
i0.ɵɵclassMap(ctx_r2.GetAlertIcon(alert_r6.severity));
|
|
93
129
|
i0.ɵɵadvance(3);
|
|
94
|
-
i0.ɵɵtextInterpolate(
|
|
130
|
+
i0.ɵɵtextInterpolate(alert_r6.title);
|
|
95
131
|
i0.ɵɵadvance(2);
|
|
96
|
-
i0.ɵɵtextInterpolate(
|
|
132
|
+
i0.ɵɵtextInterpolate(alert_r6.message);
|
|
97
133
|
i0.ɵɵadvance();
|
|
98
|
-
i0.ɵɵconditional(
|
|
134
|
+
i0.ɵɵconditional(alert_r6.type === "stale-lock" && alert_r6.jobId ? 7 : -1);
|
|
99
135
|
} }
|
|
100
|
-
function
|
|
101
|
-
i0.ɵɵelementStart(0, "div",
|
|
102
|
-
i0.ɵɵelement(1, "i",
|
|
136
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_88_Template(rf, ctx) { if (rf & 1) {
|
|
137
|
+
i0.ɵɵelementStart(0, "div", 44);
|
|
138
|
+
i0.ɵɵelement(1, "i", 69);
|
|
103
139
|
i0.ɵɵelementStart(2, "span");
|
|
104
140
|
i0.ɵɵtext(3, "No upcoming executions");
|
|
105
141
|
i0.ɵɵelementEnd()();
|
|
106
142
|
} }
|
|
107
|
-
function
|
|
108
|
-
i0.ɵɵelementStart(0, "div",
|
|
143
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
+
i0.ɵɵelementStart(0, "div", 53)(1, "div", 70)(2, "div", 71);
|
|
109
145
|
i0.ɵɵtext(3);
|
|
110
146
|
i0.ɵɵelementEnd();
|
|
111
|
-
i0.ɵɵelementStart(4, "div",
|
|
147
|
+
i0.ɵɵelementStart(4, "div", 72);
|
|
112
148
|
i0.ɵɵtext(5);
|
|
113
|
-
i0.ɵɵelementStart(6, "span",
|
|
149
|
+
i0.ɵɵelementStart(6, "span", 73);
|
|
114
150
|
i0.ɵɵtext(7);
|
|
115
151
|
i0.ɵɵelementEnd()()();
|
|
116
|
-
i0.ɵɵelementStart(8, "div",
|
|
152
|
+
i0.ɵɵelementStart(8, "div", 74);
|
|
117
153
|
i0.ɵɵtext(9);
|
|
118
154
|
i0.ɵɵelementEnd()();
|
|
119
155
|
} if (rf & 2) {
|
|
120
|
-
const
|
|
121
|
-
const
|
|
156
|
+
const upcoming_r7 = ctx.$implicit;
|
|
157
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
122
158
|
i0.ɵɵadvance(3);
|
|
123
|
-
i0.ɵɵtextInterpolate(
|
|
159
|
+
i0.ɵɵtextInterpolate(upcoming_r7.jobName);
|
|
124
160
|
i0.ɵɵadvance(2);
|
|
125
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
161
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.FormatDateTime(upcoming_r7.nextRunAt), " ");
|
|
126
162
|
i0.ɵɵadvance(2);
|
|
127
|
-
i0.ɵɵtextInterpolate(
|
|
163
|
+
i0.ɵɵtextInterpolate(upcoming_r7.jobType);
|
|
128
164
|
i0.ɵɵadvance();
|
|
129
|
-
i0.ɵɵclassProp("soon",
|
|
165
|
+
i0.ɵɵclassProp("soon", ctx_r2.FormatTimeUntil(upcoming_r7.nextRunAt).includes("m") && !ctx_r2.FormatTimeUntil(upcoming_r7.nextRunAt).includes("h"));
|
|
130
166
|
i0.ɵɵadvance();
|
|
131
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
167
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.FormatTimeUntil(upcoming_r7.nextRunAt), " ");
|
|
132
168
|
} }
|
|
133
|
-
function
|
|
134
|
-
const
|
|
135
|
-
i0.ɵɵelementStart(0, "button",
|
|
136
|
-
i0.ɵɵlistener("click", function
|
|
137
|
-
i0.ɵɵelement(1, "i",
|
|
169
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
170
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
171
|
+
i0.ɵɵelementStart(0, "button", 82);
|
|
172
|
+
i0.ɵɵlistener("click", function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const lock_r9 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ReleaseLock(lock_r9.jobId)); });
|
|
173
|
+
i0.ɵɵelement(1, "i", 83);
|
|
138
174
|
i0.ɵɵtext(2, " Release ");
|
|
139
175
|
i0.ɵɵelementEnd();
|
|
140
176
|
} }
|
|
141
|
-
function
|
|
142
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
177
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Template(rf, ctx) { if (rf & 1) {
|
|
178
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 78);
|
|
143
179
|
i0.ɵɵtext(2);
|
|
144
180
|
i0.ɵɵelementEnd();
|
|
145
|
-
i0.ɵɵelementStart(3, "td",
|
|
181
|
+
i0.ɵɵelementStart(3, "td", 79);
|
|
146
182
|
i0.ɵɵtext(4);
|
|
147
183
|
i0.ɵɵelementEnd();
|
|
148
|
-
i0.ɵɵelementStart(5, "td",
|
|
184
|
+
i0.ɵɵelementStart(5, "td", 79);
|
|
149
185
|
i0.ɵɵtext(6);
|
|
150
186
|
i0.ɵɵelementEnd();
|
|
151
|
-
i0.ɵɵelementStart(7, "td",
|
|
187
|
+
i0.ɵɵelementStart(7, "td", 79);
|
|
152
188
|
i0.ɵɵtext(8);
|
|
153
189
|
i0.ɵɵelementEnd();
|
|
154
|
-
i0.ɵɵelementStart(9, "td")(10, "span",
|
|
190
|
+
i0.ɵɵelementStart(9, "td")(10, "span", 80);
|
|
155
191
|
i0.ɵɵtext(11);
|
|
156
192
|
i0.ɵɵelementEnd()();
|
|
157
193
|
i0.ɵɵelementStart(12, "td");
|
|
158
|
-
i0.ɵɵconditionalCreate(13,
|
|
194
|
+
i0.ɵɵconditionalCreate(13, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template, 3, 0, "button", 81);
|
|
159
195
|
i0.ɵɵelementEnd()();
|
|
160
196
|
} if (rf & 2) {
|
|
161
|
-
const
|
|
162
|
-
const
|
|
163
|
-
i0.ɵɵclassProp("stale-row",
|
|
197
|
+
const lock_r9 = ctx.$implicit;
|
|
198
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
199
|
+
i0.ɵɵclassProp("stale-row", lock_r9.isStale);
|
|
164
200
|
i0.ɵɵadvance(2);
|
|
165
|
-
i0.ɵɵtextInterpolate(
|
|
201
|
+
i0.ɵɵtextInterpolate(lock_r9.jobName);
|
|
166
202
|
i0.ɵɵadvance(2);
|
|
167
|
-
i0.ɵɵtextInterpolate(
|
|
203
|
+
i0.ɵɵtextInterpolate(lock_r9.lockedBy);
|
|
168
204
|
i0.ɵɵadvance(2);
|
|
169
|
-
i0.ɵɵtextInterpolate(
|
|
205
|
+
i0.ɵɵtextInterpolate(ctx_r2.FormatTimeAgo(lock_r9.lockedAt));
|
|
170
206
|
i0.ɵɵadvance(2);
|
|
171
|
-
i0.ɵɵtextInterpolate(
|
|
207
|
+
i0.ɵɵtextInterpolate(ctx_r2.FormatDateTime(lock_r9.expectedCompletion));
|
|
172
208
|
i0.ɵɵadvance(2);
|
|
173
|
-
i0.ɵɵclassProp("stale",
|
|
209
|
+
i0.ɵɵclassProp("stale", lock_r9.isStale);
|
|
174
210
|
i0.ɵɵadvance();
|
|
175
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
211
|
+
i0.ɵɵtextInterpolate1(" ", lock_r9.isStale ? "Stale" : "Active", " ");
|
|
176
212
|
i0.ɵɵadvance(2);
|
|
177
|
-
i0.ɵɵconditional(
|
|
213
|
+
i0.ɵɵconditional(lock_r9.isStale ? 13 : -1);
|
|
178
214
|
} }
|
|
179
|
-
function
|
|
180
|
-
i0.ɵɵelementStart(0, "div",
|
|
181
|
-
i0.ɵɵelement(3, "i",
|
|
215
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_Template(rf, ctx) { if (rf & 1) {
|
|
216
|
+
i0.ɵɵelementStart(0, "div", 54)(1, "div", 39)(2, "div", 40);
|
|
217
|
+
i0.ɵɵelement(3, "i", 75);
|
|
182
218
|
i0.ɵɵtext(4, " Active Locks ");
|
|
183
219
|
i0.ɵɵelementEnd();
|
|
184
|
-
i0.ɵɵelementStart(5, "span",
|
|
220
|
+
i0.ɵɵelementStart(5, "span", 42);
|
|
185
221
|
i0.ɵɵtext(6);
|
|
186
222
|
i0.ɵɵelementEnd()();
|
|
187
|
-
i0.ɵɵelementStart(7, "div",
|
|
223
|
+
i0.ɵɵelementStart(7, "div", 43)(8, "table", 76)(9, "thead")(10, "tr")(11, "th");
|
|
188
224
|
i0.ɵɵtext(12, "Job");
|
|
189
225
|
i0.ɵɵelementEnd();
|
|
190
226
|
i0.ɵɵelementStart(13, "th");
|
|
@@ -202,175 +238,189 @@ function SchedulingOverviewComponent_Conditional_10_Conditional_91_Template(rf,
|
|
|
202
238
|
i0.ɵɵelement(21, "th");
|
|
203
239
|
i0.ɵɵelementEnd()();
|
|
204
240
|
i0.ɵɵelementStart(22, "tbody");
|
|
205
|
-
i0.ɵɵrepeaterCreate(23,
|
|
241
|
+
i0.ɵɵrepeaterCreate(23, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Template, 14, 10, "tr", 77, i0.ɵɵrepeaterTrackByIdentity);
|
|
206
242
|
i0.ɵɵelementEnd()()()();
|
|
207
243
|
} if (rf & 2) {
|
|
208
|
-
const
|
|
244
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
209
245
|
i0.ɵɵadvance(6);
|
|
210
|
-
i0.ɵɵtextInterpolate(
|
|
246
|
+
i0.ɵɵtextInterpolate(ctx_r2.Locks.length);
|
|
211
247
|
i0.ɵɵadvance(17);
|
|
212
|
-
i0.ɵɵrepeater(
|
|
248
|
+
i0.ɵɵrepeater(ctx_r2.Locks);
|
|
213
249
|
} }
|
|
214
|
-
function
|
|
215
|
-
i0.ɵɵelementStart(0, "div",
|
|
250
|
+
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
251
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 11)(2, "div", 12);
|
|
216
252
|
i0.ɵɵnamespaceSVG();
|
|
217
|
-
i0.ɵɵelementStart(3, "svg",
|
|
218
|
-
i0.ɵɵelement(4, "circle",
|
|
253
|
+
i0.ɵɵelementStart(3, "svg", 13);
|
|
254
|
+
i0.ɵɵelement(4, "circle", 14)(5, "circle", 15);
|
|
219
255
|
i0.ɵɵelementEnd();
|
|
220
256
|
i0.ɵɵnamespaceHTML();
|
|
221
|
-
i0.ɵɵelementStart(6, "div",
|
|
257
|
+
i0.ɵɵelementStart(6, "div", 16);
|
|
222
258
|
i0.ɵɵtext(7);
|
|
223
259
|
i0.ɵɵelementEnd()();
|
|
224
|
-
i0.ɵɵelementStart(8, "div",
|
|
260
|
+
i0.ɵɵelementStart(8, "div", 17)(9, "div", 18);
|
|
225
261
|
i0.ɵɵtext(10, "System Health");
|
|
226
262
|
i0.ɵɵelementEnd();
|
|
227
|
-
i0.ɵɵelementStart(11, "div",
|
|
228
|
-
i0.ɵɵelement(13, "i",
|
|
263
|
+
i0.ɵɵelementStart(11, "div", 19)(12, "span");
|
|
264
|
+
i0.ɵɵelement(13, "i", 20);
|
|
229
265
|
i0.ɵɵtext(14);
|
|
230
266
|
i0.ɵɵelementEnd();
|
|
231
267
|
i0.ɵɵelementStart(15, "span");
|
|
232
|
-
i0.ɵɵelement(16, "i",
|
|
268
|
+
i0.ɵɵelement(16, "i", 21);
|
|
233
269
|
i0.ɵɵtext(17);
|
|
234
270
|
i0.ɵɵelementEnd();
|
|
235
271
|
i0.ɵɵelementStart(18, "span");
|
|
236
|
-
i0.ɵɵelement(19, "i",
|
|
272
|
+
i0.ɵɵelement(19, "i", 22);
|
|
237
273
|
i0.ɵɵtext(20);
|
|
238
274
|
i0.ɵɵelementEnd()()()();
|
|
239
|
-
i0.ɵɵelementStart(21, "div",
|
|
240
|
-
i0.ɵɵelement(24, "i",
|
|
275
|
+
i0.ɵɵelementStart(21, "div", 23)(22, "div", 24)(23, "div", 25);
|
|
276
|
+
i0.ɵɵelement(24, "i", 26);
|
|
241
277
|
i0.ɵɵelementEnd();
|
|
242
|
-
i0.ɵɵelementStart(25, "div",
|
|
278
|
+
i0.ɵɵelementStart(25, "div", 27)(26, "div", 28);
|
|
243
279
|
i0.ɵɵtext(27);
|
|
244
280
|
i0.ɵɵelementEnd();
|
|
245
|
-
i0.ɵɵelementStart(28, "div",
|
|
281
|
+
i0.ɵɵelementStart(28, "div", 29);
|
|
246
282
|
i0.ɵɵtext(29, "Active Jobs");
|
|
247
283
|
i0.ɵɵelementEnd()()();
|
|
248
|
-
i0.ɵɵelementStart(30, "div",
|
|
249
|
-
i0.ɵɵelement(32, "i",
|
|
284
|
+
i0.ɵɵelementStart(30, "div", 24)(31, "div", 30);
|
|
285
|
+
i0.ɵɵelement(32, "i", 31);
|
|
250
286
|
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵelementStart(33, "div",
|
|
287
|
+
i0.ɵɵelementStart(33, "div", 27)(34, "div", 28);
|
|
252
288
|
i0.ɵɵtext(35);
|
|
253
289
|
i0.ɵɵelementEnd();
|
|
254
|
-
i0.ɵɵelementStart(36, "div",
|
|
290
|
+
i0.ɵɵelementStart(36, "div", 29);
|
|
255
291
|
i0.ɵɵtext(37, "Due Next Hour");
|
|
256
292
|
i0.ɵɵelementEnd()()();
|
|
257
|
-
i0.ɵɵelementStart(38, "div",
|
|
258
|
-
i0.ɵɵelement(40, "i",
|
|
293
|
+
i0.ɵɵelementStart(38, "div", 24)(39, "div", 32);
|
|
294
|
+
i0.ɵɵelement(40, "i", 33);
|
|
259
295
|
i0.ɵɵelementEnd();
|
|
260
|
-
i0.ɵɵelementStart(41, "div",
|
|
296
|
+
i0.ɵɵelementStart(41, "div", 27)(42, "div", 28);
|
|
261
297
|
i0.ɵɵtext(43);
|
|
262
298
|
i0.ɵɵelementEnd();
|
|
263
|
-
i0.ɵɵelementStart(44, "div",
|
|
299
|
+
i0.ɵɵelementStart(44, "div", 29);
|
|
264
300
|
i0.ɵɵtext(45, "Runs (24h)");
|
|
265
301
|
i0.ɵɵelementEnd();
|
|
266
|
-
i0.ɵɵelementStart(46, "div",
|
|
302
|
+
i0.ɵɵelementStart(46, "div", 34);
|
|
267
303
|
i0.ɵɵtext(47);
|
|
268
304
|
i0.ɵɵelementEnd()()();
|
|
269
|
-
i0.ɵɵelementStart(48, "div",
|
|
270
|
-
i0.ɵɵelement(50, "i",
|
|
305
|
+
i0.ɵɵelementStart(48, "div", 24)(49, "div", 35);
|
|
306
|
+
i0.ɵɵelement(50, "i", 36);
|
|
271
307
|
i0.ɵɵelementEnd();
|
|
272
|
-
i0.ɵɵelementStart(51, "div",
|
|
308
|
+
i0.ɵɵelementStart(51, "div", 27)(52, "div", 28);
|
|
273
309
|
i0.ɵɵtext(53);
|
|
274
310
|
i0.ɵɵelementEnd();
|
|
275
|
-
i0.ɵɵelementStart(54, "div",
|
|
311
|
+
i0.ɵɵelementStart(54, "div", 29);
|
|
276
312
|
i0.ɵɵtext(55, "Running Now");
|
|
277
313
|
i0.ɵɵelementEnd()()()();
|
|
278
|
-
i0.ɵɵelementStart(56, "div",
|
|
279
|
-
i0.ɵɵelement(60, "i",
|
|
314
|
+
i0.ɵɵelementStart(56, "div", 37)(57, "div", 38)(58, "div", 39)(59, "div", 40);
|
|
315
|
+
i0.ɵɵelement(60, "i", 41);
|
|
280
316
|
i0.ɵɵtext(61, " Live Executions ");
|
|
281
317
|
i0.ɵɵelementEnd();
|
|
282
|
-
i0.ɵɵelementStart(62, "span",
|
|
318
|
+
i0.ɵɵelementStart(62, "span", 42);
|
|
283
319
|
i0.ɵɵtext(63);
|
|
284
320
|
i0.ɵɵelementEnd()();
|
|
285
|
-
i0.ɵɵelementStart(64, "div",
|
|
286
|
-
i0.ɵɵconditionalCreate(65,
|
|
287
|
-
i0.ɵɵrepeaterCreate(66,
|
|
321
|
+
i0.ɵɵelementStart(64, "div", 43);
|
|
322
|
+
i0.ɵɵconditionalCreate(65, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_65_Template, 4, 0, "div", 44);
|
|
323
|
+
i0.ɵɵrepeaterCreate(66, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template, 10, 8, "div", 45, i0.ɵɵrepeaterTrackByIdentity);
|
|
288
324
|
i0.ɵɵelementEnd()();
|
|
289
|
-
i0.ɵɵelementStart(68, "div",
|
|
325
|
+
i0.ɵɵelementStart(68, "div", 46)(69, "div", 38)(70, "div", 47)(71, "div", 40);
|
|
290
326
|
i0.ɵɵelement(72, "i");
|
|
291
327
|
i0.ɵɵtext(73);
|
|
292
328
|
i0.ɵɵelementEnd();
|
|
293
|
-
i0.ɵɵconditionalCreate(74,
|
|
294
|
-
i0.ɵɵconditionalCreate(75,
|
|
329
|
+
i0.ɵɵconditionalCreate(74, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_Template, 2, 1, "span", 48);
|
|
330
|
+
i0.ɵɵconditionalCreate(75, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_75_Template, 2, 0, "span", 49);
|
|
295
331
|
i0.ɵɵelementEnd();
|
|
296
|
-
i0.ɵɵelementStart(76, "div",
|
|
297
|
-
i0.ɵɵconditionalCreate(77,
|
|
298
|
-
i0.ɵɵrepeaterCreate(78,
|
|
332
|
+
i0.ɵɵelementStart(76, "div", 43);
|
|
333
|
+
i0.ɵɵconditionalCreate(77, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_77_Template, 4, 0, "div", 50);
|
|
334
|
+
i0.ɵɵrepeaterCreate(78, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template, 8, 6, "div", 51, i0.ɵɵrepeaterTrackByIdentity);
|
|
299
335
|
i0.ɵɵelementEnd()();
|
|
300
|
-
i0.ɵɵelementStart(80, "div",
|
|
301
|
-
i0.ɵɵelement(83, "i",
|
|
336
|
+
i0.ɵɵelementStart(80, "div", 38)(81, "div", 39)(82, "div", 40);
|
|
337
|
+
i0.ɵɵelement(83, "i", 52);
|
|
302
338
|
i0.ɵɵtext(84, " Upcoming (24h) ");
|
|
303
339
|
i0.ɵɵelementEnd();
|
|
304
|
-
i0.ɵɵelementStart(85, "span",
|
|
340
|
+
i0.ɵɵelementStart(85, "span", 42);
|
|
305
341
|
i0.ɵɵtext(86);
|
|
306
342
|
i0.ɵɵelementEnd()();
|
|
307
|
-
i0.ɵɵelementStart(87, "div",
|
|
308
|
-
i0.ɵɵconditionalCreate(88,
|
|
309
|
-
i0.ɵɵrepeaterCreate(89,
|
|
343
|
+
i0.ɵɵelementStart(87, "div", 43);
|
|
344
|
+
i0.ɵɵconditionalCreate(88, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_88_Template, 4, 0, "div", 44);
|
|
345
|
+
i0.ɵɵrepeaterCreate(89, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template, 10, 6, "div", 53, i0.ɵɵrepeaterTrackByIdentity);
|
|
310
346
|
i0.ɵɵelementEnd()()()();
|
|
311
|
-
i0.ɵɵconditionalCreate(91,
|
|
347
|
+
i0.ɵɵconditionalCreate(91, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_Template, 25, 1, "div", 54);
|
|
312
348
|
i0.ɵɵelementEnd();
|
|
313
349
|
} if (rf & 2) {
|
|
314
|
-
const
|
|
350
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
315
351
|
i0.ɵɵadvance();
|
|
316
|
-
i0.ɵɵstyleProp("border-color",
|
|
352
|
+
i0.ɵɵstyleProp("border-color", ctx_r2.GetHealthColor());
|
|
317
353
|
i0.ɵɵadvance(4);
|
|
318
|
-
i0.ɵɵattribute("stroke",
|
|
354
|
+
i0.ɵɵattribute("stroke", ctx_r2.GetHealthColor())("stroke-dasharray", ctx_r2.GetHealthStrokeDasharray());
|
|
319
355
|
i0.ɵɵadvance();
|
|
320
|
-
i0.ɵɵstyleProp("color",
|
|
356
|
+
i0.ɵɵstyleProp("color", ctx_r2.GetHealthColor());
|
|
321
357
|
i0.ɵɵadvance();
|
|
322
|
-
i0.ɵɵtextInterpolate(
|
|
358
|
+
i0.ɵɵtextInterpolate(ctx_r2.GetHealthScore());
|
|
323
359
|
i0.ɵɵadvance(7);
|
|
324
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
360
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.Kpis.totalActiveJobs, " active");
|
|
325
361
|
i0.ɵɵadvance(3);
|
|
326
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
362
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.Kpis.lockedJobs, " locked");
|
|
327
363
|
i0.ɵɵadvance(3);
|
|
328
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
364
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.Kpis.totalFailures7d, " failures (7d)");
|
|
329
365
|
i0.ɵɵadvance(7);
|
|
330
|
-
i0.ɵɵtextInterpolate(
|
|
366
|
+
i0.ɵɵtextInterpolate(ctx_r2.Kpis.totalActiveJobs);
|
|
331
367
|
i0.ɵɵadvance(8);
|
|
332
|
-
i0.ɵɵtextInterpolate(
|
|
368
|
+
i0.ɵɵtextInterpolate(ctx_r2.Kpis.jobsDueInNextHour);
|
|
333
369
|
i0.ɵɵadvance(8);
|
|
334
|
-
i0.ɵɵtextInterpolate(
|
|
370
|
+
i0.ɵɵtextInterpolate(ctx_r2.Kpis.recentExecutions24h);
|
|
335
371
|
i0.ɵɵadvance(3);
|
|
336
|
-
i0.ɵɵstyleProp("color",
|
|
372
|
+
i0.ɵɵstyleProp("color", ctx_r2.GetSuccessRateColor(ctx_r2.Kpis.successRate24h));
|
|
337
373
|
i0.ɵɵadvance();
|
|
338
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
374
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.FormatPercentage(ctx_r2.Kpis.successRate24h), " success ");
|
|
339
375
|
i0.ɵɵadvance(6);
|
|
340
|
-
i0.ɵɵtextInterpolate(
|
|
376
|
+
i0.ɵɵtextInterpolate(ctx_r2.Kpis.currentlyRunning);
|
|
341
377
|
i0.ɵɵadvance(10);
|
|
342
|
-
i0.ɵɵtextInterpolate(
|
|
378
|
+
i0.ɵɵtextInterpolate(ctx_r2.LiveExecutions.length);
|
|
343
379
|
i0.ɵɵadvance(2);
|
|
344
|
-
i0.ɵɵconditional(
|
|
380
|
+
i0.ɵɵconditional(ctx_r2.LiveExecutions.length === 0 ? 65 : -1);
|
|
345
381
|
i0.ɵɵadvance();
|
|
346
|
-
i0.ɵɵrepeater(
|
|
382
|
+
i0.ɵɵrepeater(ctx_r2.LiveExecutions);
|
|
347
383
|
i0.ɵɵadvance(4);
|
|
348
|
-
i0.ɵɵproperty("ngClass",
|
|
384
|
+
i0.ɵɵproperty("ngClass", ctx_r2.Alerts.length > 0 ? "alert-header" : "clear-header");
|
|
349
385
|
i0.ɵɵadvance(2);
|
|
350
|
-
i0.ɵɵclassMap(
|
|
386
|
+
i0.ɵɵclassMap(ctx_r2.Alerts.length > 0 ? "fa-solid fa-triangle-exclamation" : "fa-solid fa-shield-check");
|
|
351
387
|
i0.ɵɵadvance();
|
|
352
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
388
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.Alerts.length > 0 ? "Alerts" : "All Clear", " ");
|
|
353
389
|
i0.ɵɵadvance();
|
|
354
|
-
i0.ɵɵconditional(
|
|
390
|
+
i0.ɵɵconditional(ctx_r2.Alerts.length > 0 ? 74 : -1);
|
|
355
391
|
i0.ɵɵadvance();
|
|
356
|
-
i0.ɵɵconditional(
|
|
392
|
+
i0.ɵɵconditional(ctx_r2.Alerts.length === 0 ? 75 : -1);
|
|
357
393
|
i0.ɵɵadvance(2);
|
|
358
|
-
i0.ɵɵconditional(
|
|
394
|
+
i0.ɵɵconditional(ctx_r2.Alerts.length === 0 ? 77 : -1);
|
|
359
395
|
i0.ɵɵadvance();
|
|
360
|
-
i0.ɵɵrepeater(
|
|
396
|
+
i0.ɵɵrepeater(ctx_r2.Alerts);
|
|
361
397
|
i0.ɵɵadvance(8);
|
|
362
|
-
i0.ɵɵtextInterpolate(
|
|
398
|
+
i0.ɵɵtextInterpolate(ctx_r2.UpcomingExecutions.length);
|
|
363
399
|
i0.ɵɵadvance(2);
|
|
364
|
-
i0.ɵɵconditional(
|
|
400
|
+
i0.ɵɵconditional(ctx_r2.UpcomingExecutions.length === 0 ? 88 : -1);
|
|
365
401
|
i0.ɵɵadvance();
|
|
366
|
-
i0.ɵɵrepeater(
|
|
402
|
+
i0.ɵɵrepeater(ctx_r2.UpcomingExecutions);
|
|
367
403
|
i0.ɵɵadvance(2);
|
|
368
|
-
i0.ɵɵconditional(
|
|
404
|
+
i0.ɵɵconditional(ctx_r2.Locks.length > 0 ? 91 : -1);
|
|
405
|
+
} }
|
|
406
|
+
function SchedulingOverviewComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
407
|
+
i0.ɵɵelementStart(0, "div", 7);
|
|
408
|
+
i0.ɵɵconditionalCreate(1, SchedulingOverviewComponent_ng_template_2_Conditional_1_Template, 2, 0, "div", 8);
|
|
409
|
+
i0.ɵɵconditionalCreate(2, SchedulingOverviewComponent_ng_template_2_Conditional_2_Template, 92, 29, "div", 9);
|
|
410
|
+
i0.ɵɵelementEnd();
|
|
411
|
+
} if (rf & 2) {
|
|
412
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
413
|
+
i0.ɵɵadvance();
|
|
414
|
+
i0.ɵɵconditional(ctx_r2.IsLoading ? 1 : -1);
|
|
415
|
+
i0.ɵɵadvance();
|
|
416
|
+
i0.ɵɵconditional(!ctx_r2.IsLoading && ctx_r2.Kpis ? 2 : -1);
|
|
369
417
|
} }
|
|
370
418
|
export class SchedulingOverviewComponent {
|
|
371
419
|
schedulingService;
|
|
372
420
|
cdr;
|
|
373
421
|
initialState = {};
|
|
422
|
+
/** When true, the inner toolbar is hidden — the parent shell is rendering it in `<mj-page-header>` instead. */
|
|
423
|
+
HideToolbar = false;
|
|
374
424
|
stateChange = new EventEmitter();
|
|
375
425
|
Kpis = null;
|
|
376
426
|
LiveExecutions = [];
|
|
@@ -564,36 +614,20 @@ export class SchedulingOverviewComponent {
|
|
|
564
614
|
});
|
|
565
615
|
}
|
|
566
616
|
static ɵfac = function SchedulingOverviewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SchedulingOverviewComponent)(i0.ɵɵdirectiveInject(i1.SchedulingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
567
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulingOverviewComponent, selectors: [["app-scheduling-overview"]], inputs: { initialState: "initialState" }, outputs: { stateChange: "stateChange" }, standalone: false, decls:
|
|
568
|
-
i0.ɵɵ
|
|
569
|
-
i0.ɵɵ
|
|
570
|
-
i0.ɵɵelement(4, "i", 4);
|
|
571
|
-
i0.ɵɵtext(5, " Refresh ");
|
|
572
|
-
i0.ɵɵelementEnd();
|
|
573
|
-
i0.ɵɵelementStart(6, "button", 5);
|
|
574
|
-
i0.ɵɵlistener("click", function SchedulingOverviewComponent_Template_button_click_6_listener() { return ctx.ToggleAutoRefresh(); });
|
|
575
|
-
i0.ɵɵelement(7, "i", 6);
|
|
576
|
-
i0.ɵɵtext(8);
|
|
577
|
-
i0.ɵɵelementEnd()()();
|
|
578
|
-
i0.ɵɵconditionalCreate(9, SchedulingOverviewComponent_Conditional_9_Template, 2, 0, "div", 7);
|
|
579
|
-
i0.ɵɵconditionalCreate(10, SchedulingOverviewComponent_Conditional_10_Template, 92, 29, "div", 8);
|
|
580
|
-
i0.ɵɵelementEnd();
|
|
617
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulingOverviewComponent, selectors: [["app-scheduling-overview"]], inputs: { initialState: "initialState", HideToolbar: "HideToolbar" }, outputs: { stateChange: "stateChange" }, standalone: false, decls: 4, vars: 1, consts: [["content", ""], [4, "ngTemplateOutlet"], ["Title", "Scheduling Dashboard", "Icon", "fa-solid fa-gauge-high", "Subtitle", "System health, KPIs, and alerts"], ["actions", ""], [3, "Clicked"], ["mjButton", "", "size", "sm", "title", "Toggle auto-refresh", 3, "click", "variant"], [1, "fa-solid", "fa-rotate"], [1, "overview-container"], [1, "loading-container"], [1, "overview-content"], ["text", "Loading dashboard...", "size", "medium"], [1, "health-banner"], [1, "health-ring"], ["viewBox", "0 0 80 80", 1, "health-svg"], ["cx", "40", "cy", "40", "r", "36", "fill", "none", "stroke-width", "6", 1, "health-ring-track"], ["cx", "40", "cy", "40", "r", "36", "fill", "none", "stroke-width", "6", "stroke-linecap", "round", "transform", "rotate(-90 40 40)"], [1, "health-score"], [1, "health-details"], [1, "health-title"], [1, "health-stats"], [1, "fa-solid", "fa-check-circle", "status-success"], [1, "fa-solid", "fa-lock", "status-warning"], [1, "fa-solid", "fa-xmark-circle", "status-error"], [1, "kpi-grid"], [1, "kpi-card"], [1, "kpi-icon", "blue"], [1, "fa-solid", "fa-calendar-check"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "amber"], [1, "fa-solid", "fa-clock"], [1, "kpi-icon", "purple"], [1, "fa-solid", "fa-chart-bar"], [1, "kpi-sub"], [1, "kpi-icon", "green"], [1, "fa-solid", "fa-play"], [1, "panels-grid"], [1, "panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-bolt"], [1, "panel-badge"], [1, "panel-body"], [1, "empty-state-small"], [1, "execution-item"], [1, "right-column"], [1, "panel-header", 3, "ngClass"], [1, "panel-badge", "error"], [1, "panel-badge", "clear"], [1, "empty-state-small", "all-clear"], [1, "alert-item", 3, "ngClass"], [1, "fa-solid", "fa-calendar-day"], [1, "upcoming-item"], [1, "panel", 2, "margin-top", "20px"], [1, "fa-solid", "fa-inbox"], [1, "exec-status"], [3, "ngClass"], [1, "exec-details"], [1, "exec-name"], [1, "exec-meta"], [1, "exec-status-badge", 3, "ngClass"], [1, "fa-solid", "fa-circle-check"], [1, "alert-icon"], [1, "alert-content"], [1, "alert-title"], [1, "alert-message"], [1, "alert-action-btn"], [1, "alert-action-btn", 3, "click"], [1, "fa-solid", "fa-calendar-xmark"], [1, "upcoming-info"], [1, "upcoming-name"], [1, "upcoming-meta"], [1, "upcoming-type"], [1, "upcoming-countdown"], [1, "fa-solid", "fa-lock"], [1, "data-table"], [3, "stale-row"], [1, "cell-name"], [1, "cell-meta"], [1, "lock-status-badge"], [1, "release-btn"], [1, "release-btn", 3, "click"], [1, "fa-solid", "fa-lock-open"]], template: function SchedulingOverviewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
618
|
+
i0.ɵɵconditionalCreate(0, SchedulingOverviewComponent_Conditional_0_Template, 1, 1, "ng-container")(1, SchedulingOverviewComponent_Conditional_1_Template, 9, 3, "mj-page-layout");
|
|
619
|
+
i0.ɵɵtemplate(2, SchedulingOverviewComponent_ng_template_2_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
581
620
|
} if (rf & 2) {
|
|
582
|
-
i0.ɵɵ
|
|
583
|
-
i0.ɵɵproperty("variant", ctx.AutoRefreshEnabled ? "primary" : "secondary");
|
|
584
|
-
i0.ɵɵadvance(2);
|
|
585
|
-
i0.ɵɵtextInterpolate1(" Auto-Refresh: ", ctx.AutoRefreshEnabled ? "ON" : "OFF", " ");
|
|
586
|
-
i0.ɵɵadvance();
|
|
587
|
-
i0.ɵɵconditional(ctx.IsLoading ? 9 : -1);
|
|
588
|
-
i0.ɵɵadvance();
|
|
589
|
-
i0.ɵɵconditional(!ctx.IsLoading && ctx.Kpis ? 10 : -1);
|
|
590
|
-
} }, dependencies: [i2.NgClass, i3.MJButtonDirective, i4.LoadingComponent], styles: [".overview-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.overview-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n\n\n.health-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track[_ngcontent-%COMP%] {\n stroke: var(--mj-border-default);\n}\n\n.health-score[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.health-title[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n\n\n.kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n.kpi-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green[_ngcontent-%COMP%] { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.kpi-value[_ngcontent-%COMP%] {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n\n\n.panels-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.alert-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body[_ngcontent-%COMP%] {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.execution-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.exec-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n}\n\n.exec-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.exec-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n\n\n.status-running[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.status-success[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.status-error[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.status-warning[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n\n\n.alert-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon[_ngcontent-%COMP%] {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.alert-warning[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.alert-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.alert-title[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n}\n\n\n\n.upcoming-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.upcoming-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.empty-state-small[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.stale-row[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n\n\n@media (max-width: 1024px) {\n .panels-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .health-banner[_ngcontent-%COMP%] {\n flex-direction: column;\n text-align: center;\n }\n .health-stats[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n }\n}"], changeDetection: 0 });
|
|
621
|
+
i0.ɵɵconditional(ctx.HideToolbar ? 0 : 1);
|
|
622
|
+
} }, dependencies: [i2.NgClass, i2.NgTemplateOutlet, i3.MJButtonDirective, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageBodyComponent, i3.MJRefreshButtonComponent, i4.LoadingComponent], styles: [".overview-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.overview-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n\n\n.health-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track[_ngcontent-%COMP%] {\n stroke: var(--mj-border-default);\n}\n\n.health-score[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.health-title[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n\n\n.kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n.kpi-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green[_ngcontent-%COMP%] { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.kpi-value[_ngcontent-%COMP%] {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n\n\n.panels-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.alert-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body[_ngcontent-%COMP%] {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.execution-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.exec-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n}\n\n.exec-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.exec-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n\n\n.status-running[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.status-success[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.status-error[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.status-warning[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n\n\n.alert-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon[_ngcontent-%COMP%] {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.alert-warning[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.alert-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.alert-title[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n}\n\n\n\n.upcoming-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.upcoming-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.empty-state-small[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.stale-row[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n\n\n@media (max-width: 1024px) {\n .panels-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .health-banner[_ngcontent-%COMP%] {\n flex-direction: column;\n text-align: center;\n }\n .health-stats[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n }\n}"], changeDetection: 0 });
|
|
591
623
|
}
|
|
592
624
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SchedulingOverviewComponent, [{
|
|
593
625
|
type: Component,
|
|
594
|
-
args: [{ standalone: false, selector: 'app-scheduling-overview', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"overview-container\">\n <!-- Header Controls -->\n <div class=\"overview-header\">\n <div class=\"header-controls\">\n <button mjButton variant=\"secondary\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n <button mjButton [variant]=\"AutoRefreshEnabled ? 'primary' : 'secondary'\" (click)=\"ToggleAutoRefresh()\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto-Refresh: {{AutoRefreshEnabled ? 'ON' : 'OFF'}}\n </button>\n </div>\n </div>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading dashboard...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading && Kpis) {\n <div class=\"overview-content\">\n <!-- Health Banner -->\n <div class=\"health-banner\" [style.border-color]=\"GetHealthColor()\">\n <div class=\"health-ring\">\n <svg viewBox=\"0 0 80 80\" class=\"health-svg\">\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\" class=\"health-ring-track\" stroke-width=\"6\"/>\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\"\n [attr.stroke]=\"GetHealthColor()\"\n stroke-width=\"6\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"GetHealthStrokeDasharray()\"\n transform=\"rotate(-90 40 40)\"/>\n </svg>\n <div class=\"health-score\" [style.color]=\"GetHealthColor()\">{{GetHealthScore()}}</div>\n </div>\n <div class=\"health-details\">\n <div class=\"health-title\">System Health</div>\n <div class=\"health-stats\">\n <span><i class=\"fa-solid fa-check-circle status-success\"></i> {{Kpis.totalActiveJobs}} active</span>\n <span><i class=\"fa-solid fa-lock status-warning\"></i> {{Kpis.lockedJobs}} locked</span>\n <span><i class=\"fa-solid fa-xmark-circle status-error\"></i> {{Kpis.totalFailures7d}} failures (7d)</span>\n </div>\n </div>\n </div>\n <!-- KPI Cards -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon blue\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.totalActiveJobs}}</div>\n <div class=\"kpi-label\">Active Jobs</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon amber\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.jobsDueInNextHour}}</div>\n <div class=\"kpi-label\">Due Next Hour</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon purple\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.recentExecutions24h}}</div>\n <div class=\"kpi-label\">Runs (24h)</div>\n <div class=\"kpi-sub\" [style.color]=\"GetSuccessRateColor(Kpis.successRate24h)\">\n {{FormatPercentage(Kpis.successRate24h)}} success\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon green\">\n <i class=\"fa-solid fa-play\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.currentlyRunning}}</div>\n <div class=\"kpi-label\">Running Now</div>\n </div>\n </div>\n </div>\n <!-- Two-Column Layout: Live Executions + Alerts/Upcoming -->\n <div class=\"panels-grid\">\n <!-- Live Executions -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i> Live Executions\n </div>\n <span class=\"panel-badge\">{{LiveExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (LiveExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No recent executions</span>\n </div>\n }\n @for (exec of LiveExecutions; track exec) {\n <div class=\"execution-item\">\n <div class=\"exec-status\">\n <i [class]=\"GetStatusIcon(exec.status)\" [ngClass]=\"GetStatusClass(exec.status)\"></i>\n </div>\n <div class=\"exec-details\">\n <div class=\"exec-name\">{{exec.jobName}}</div>\n <div class=\"exec-meta\">{{FormatTimeAgo(exec.startedAt)}} · {{FormatDuration(exec.duration)}}</div>\n </div>\n <div class=\"exec-status-badge\" [ngClass]=\"GetStatusClass(exec.status)\">\n {{exec.status}}\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Right Column: Alerts + Upcoming -->\n <div class=\"right-column\">\n <!-- Alerts -->\n <div class=\"panel\">\n <div class=\"panel-header\" [ngClass]=\"Alerts.length > 0 ? 'alert-header' : 'clear-header'\">\n <div class=\"panel-title\">\n <i [class]=\"Alerts.length > 0 ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-shield-check'\"></i>\n {{Alerts.length > 0 ? 'Alerts' : 'All Clear'}}\n </div>\n @if (Alerts.length > 0) {\n <span class=\"panel-badge error\">{{Alerts.length}}</span>\n }\n @if (Alerts.length === 0) {\n <span class=\"panel-badge clear\">0</span>\n }\n </div>\n <div class=\"panel-body\">\n @if (Alerts.length === 0) {\n <div class=\"empty-state-small all-clear\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>No active alerts</span>\n </div>\n }\n @for (alert of Alerts; track alert) {\n <div class=\"alert-item\" [ngClass]=\"'alert-' + alert.severity\">\n <i [class]=\"GetAlertIcon(alert.severity)\" class=\"alert-icon\"></i>\n <div class=\"alert-content\">\n <div class=\"alert-title\">{{alert.title}}</div>\n <div class=\"alert-message\">{{alert.message}}</div>\n </div>\n @if (alert.type === 'stale-lock' && alert.jobId) {\n <button\n class=\"alert-action-btn\"\n (click)=\"ReleaseLock(alert.jobId!)\">\n Release\n </button>\n }\n </div>\n }\n </div>\n </div>\n <!-- Upcoming -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-calendar-day\"></i> Upcoming (24h)\n </div>\n <span class=\"panel-badge\">{{UpcomingExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (UpcomingExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <span>No upcoming executions</span>\n </div>\n }\n @for (upcoming of UpcomingExecutions; track upcoming) {\n <div class=\"upcoming-item\">\n <div class=\"upcoming-info\">\n <div class=\"upcoming-name\">{{upcoming.jobName}}</div>\n <div class=\"upcoming-meta\">\n {{FormatDateTime(upcoming.nextRunAt)}}\n <span class=\"upcoming-type\">{{upcoming.jobType}}</span>\n </div>\n </div>\n <div class=\"upcoming-countdown\" [class.soon]=\"FormatTimeUntil(upcoming.nextRunAt).includes('m') && !FormatTimeUntil(upcoming.nextRunAt).includes('h')\">\n {{FormatTimeUntil(upcoming.nextRunAt)}}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- Locks Section -->\n @if (Locks.length > 0) {\n <div class=\"panel\" style=\"margin-top: 20px;\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-lock\"></i> Active Locks\n </div>\n <span class=\"panel-badge\">{{Locks.length}}</span>\n </div>\n <div class=\"panel-body\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Job</th>\n <th>Locked By</th>\n <th>Locked At</th>\n <th>Expected Completion</th>\n <th>Status</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (lock of Locks; track lock) {\n <tr [class.stale-row]=\"lock.isStale\">\n <td class=\"cell-name\">{{lock.jobName}}</td>\n <td class=\"cell-meta\">{{lock.lockedBy}}</td>\n <td class=\"cell-meta\">{{FormatTimeAgo(lock.lockedAt)}}</td>\n <td class=\"cell-meta\">{{FormatDateTime(lock.expectedCompletion)}}</td>\n <td>\n <span class=\"lock-status-badge\" [class.stale]=\"lock.isStale\">\n {{lock.isStale ? 'Stale' : 'Active'}}\n </span>\n </td>\n <td>\n @if (lock.isStale) {\n <button class=\"release-btn\" (click)=\"ReleaseLock(lock.jobId)\">\n <i class=\"fa-solid fa-lock-open\"></i> Release\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".overview-container {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.overview-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls {\n display: flex;\n gap: 8px;\n}\n\n.control-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n/* \u2500\u2500 Health Banner \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.health-banner {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track {\n stroke: var(--mj-border-default);\n}\n\n.health-score {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details {\n flex: 1;\n}\n\n.health-title {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats span {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n/* \u2500\u2500 KPI Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n.kpi-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content {\n flex: 1;\n}\n\n.kpi-value {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Panels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.panels-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header .panel-title i {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear i {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear span {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.alert-header .panel-title i {\n color: var(--mj-status-error);\n}\n\n.panel-badge {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Execution Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.execution-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item:last-child {\n border-bottom: none;\n}\n\n.exec-status i {\n font-size: 1.1rem;\n}\n\n.exec-details {\n flex: 1;\n}\n\n.exec-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n/* Status Colors */\n.status-running { color: var(--mj-brand-primary); }\n.status-success { color: var(--mj-status-success); }\n.status-error { color: var(--mj-status-error); }\n.status-warning { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n/* \u2500\u2500 Alert Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.alert-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error .alert-icon { color: var(--mj-status-error); }\n.alert-warning .alert-icon { color: var(--mj-status-warning); }\n\n.alert-content {\n flex: 1;\n}\n\n.alert-title {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn:hover {\n background: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Upcoming Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.upcoming-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item:last-child {\n border-bottom: none;\n}\n\n.upcoming-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon {\n color: var(--mj-status-warning);\n}\n\n/* \u2500\u2500 Empty State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.empty-state-small {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small i {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small span {\n font-size: 0.85rem;\n}\n\n/* \u2500\u2500 Data Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table td {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta {\n color: var(--mj-text-secondary);\n}\n\n.stale-row {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 1024px) {\n .panels-grid {\n grid-template-columns: 1fr;\n }\n .kpi-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid {\n grid-template-columns: 1fr;\n }\n .health-banner {\n flex-direction: column;\n text-align: center;\n }\n .health-stats {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table {\n font-size: 0.8rem;\n }\n}\n"] }]
|
|
626
|
+
args: [{ standalone: false, selector: 'app-scheduling-overview', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (HideToolbar) {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n} @else {\n <mj-page-layout>\n <mj-page-header\n Title=\"Scheduling Dashboard\"\n Icon=\"fa-solid fa-gauge-high\"\n Subtitle=\"System health, KPIs, and alerts\">\n <div actions>\n <mj-refresh-button (Clicked)=\"Refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"AutoRefreshEnabled ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"ToggleAutoRefresh()\"\n title=\"Toggle auto-refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto: {{AutoRefreshEnabled ? 'ON' : 'OFF'}}\n </button>\n </div>\n </mj-page-header>\n <mj-page-body>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </mj-page-body>\n </mj-page-layout>\n}\n\n<ng-template #content>\n<div class=\"overview-container\">\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading dashboard...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading && Kpis) {\n <div class=\"overview-content\">\n <!-- Health Banner -->\n <div class=\"health-banner\" [style.border-color]=\"GetHealthColor()\">\n <div class=\"health-ring\">\n <svg viewBox=\"0 0 80 80\" class=\"health-svg\">\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\" class=\"health-ring-track\" stroke-width=\"6\"/>\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\"\n [attr.stroke]=\"GetHealthColor()\"\n stroke-width=\"6\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"GetHealthStrokeDasharray()\"\n transform=\"rotate(-90 40 40)\"/>\n </svg>\n <div class=\"health-score\" [style.color]=\"GetHealthColor()\">{{GetHealthScore()}}</div>\n </div>\n <div class=\"health-details\">\n <div class=\"health-title\">System Health</div>\n <div class=\"health-stats\">\n <span><i class=\"fa-solid fa-check-circle status-success\"></i> {{Kpis.totalActiveJobs}} active</span>\n <span><i class=\"fa-solid fa-lock status-warning\"></i> {{Kpis.lockedJobs}} locked</span>\n <span><i class=\"fa-solid fa-xmark-circle status-error\"></i> {{Kpis.totalFailures7d}} failures (7d)</span>\n </div>\n </div>\n </div>\n <!-- KPI Cards -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon blue\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.totalActiveJobs}}</div>\n <div class=\"kpi-label\">Active Jobs</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon amber\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.jobsDueInNextHour}}</div>\n <div class=\"kpi-label\">Due Next Hour</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon purple\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.recentExecutions24h}}</div>\n <div class=\"kpi-label\">Runs (24h)</div>\n <div class=\"kpi-sub\" [style.color]=\"GetSuccessRateColor(Kpis.successRate24h)\">\n {{FormatPercentage(Kpis.successRate24h)}} success\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon green\">\n <i class=\"fa-solid fa-play\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.currentlyRunning}}</div>\n <div class=\"kpi-label\">Running Now</div>\n </div>\n </div>\n </div>\n <!-- Two-Column Layout: Live Executions + Alerts/Upcoming -->\n <div class=\"panels-grid\">\n <!-- Live Executions -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i> Live Executions\n </div>\n <span class=\"panel-badge\">{{LiveExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (LiveExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No recent executions</span>\n </div>\n }\n @for (exec of LiveExecutions; track exec) {\n <div class=\"execution-item\">\n <div class=\"exec-status\">\n <i [class]=\"GetStatusIcon(exec.status)\" [ngClass]=\"GetStatusClass(exec.status)\"></i>\n </div>\n <div class=\"exec-details\">\n <div class=\"exec-name\">{{exec.jobName}}</div>\n <div class=\"exec-meta\">{{FormatTimeAgo(exec.startedAt)}} · {{FormatDuration(exec.duration)}}</div>\n </div>\n <div class=\"exec-status-badge\" [ngClass]=\"GetStatusClass(exec.status)\">\n {{exec.status}}\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Right Column: Alerts + Upcoming -->\n <div class=\"right-column\">\n <!-- Alerts -->\n <div class=\"panel\">\n <div class=\"panel-header\" [ngClass]=\"Alerts.length > 0 ? 'alert-header' : 'clear-header'\">\n <div class=\"panel-title\">\n <i [class]=\"Alerts.length > 0 ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-shield-check'\"></i>\n {{Alerts.length > 0 ? 'Alerts' : 'All Clear'}}\n </div>\n @if (Alerts.length > 0) {\n <span class=\"panel-badge error\">{{Alerts.length}}</span>\n }\n @if (Alerts.length === 0) {\n <span class=\"panel-badge clear\">0</span>\n }\n </div>\n <div class=\"panel-body\">\n @if (Alerts.length === 0) {\n <div class=\"empty-state-small all-clear\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>No active alerts</span>\n </div>\n }\n @for (alert of Alerts; track alert) {\n <div class=\"alert-item\" [ngClass]=\"'alert-' + alert.severity\">\n <i [class]=\"GetAlertIcon(alert.severity)\" class=\"alert-icon\"></i>\n <div class=\"alert-content\">\n <div class=\"alert-title\">{{alert.title}}</div>\n <div class=\"alert-message\">{{alert.message}}</div>\n </div>\n @if (alert.type === 'stale-lock' && alert.jobId) {\n <button\n class=\"alert-action-btn\"\n (click)=\"ReleaseLock(alert.jobId!)\">\n Release\n </button>\n }\n </div>\n }\n </div>\n </div>\n <!-- Upcoming -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-calendar-day\"></i> Upcoming (24h)\n </div>\n <span class=\"panel-badge\">{{UpcomingExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (UpcomingExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <span>No upcoming executions</span>\n </div>\n }\n @for (upcoming of UpcomingExecutions; track upcoming) {\n <div class=\"upcoming-item\">\n <div class=\"upcoming-info\">\n <div class=\"upcoming-name\">{{upcoming.jobName}}</div>\n <div class=\"upcoming-meta\">\n {{FormatDateTime(upcoming.nextRunAt)}}\n <span class=\"upcoming-type\">{{upcoming.jobType}}</span>\n </div>\n </div>\n <div class=\"upcoming-countdown\" [class.soon]=\"FormatTimeUntil(upcoming.nextRunAt).includes('m') && !FormatTimeUntil(upcoming.nextRunAt).includes('h')\">\n {{FormatTimeUntil(upcoming.nextRunAt)}}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- Locks Section -->\n @if (Locks.length > 0) {\n <div class=\"panel\" style=\"margin-top: 20px;\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-lock\"></i> Active Locks\n </div>\n <span class=\"panel-badge\">{{Locks.length}}</span>\n </div>\n <div class=\"panel-body\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Job</th>\n <th>Locked By</th>\n <th>Locked At</th>\n <th>Expected Completion</th>\n <th>Status</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (lock of Locks; track lock) {\n <tr [class.stale-row]=\"lock.isStale\">\n <td class=\"cell-name\">{{lock.jobName}}</td>\n <td class=\"cell-meta\">{{lock.lockedBy}}</td>\n <td class=\"cell-meta\">{{FormatTimeAgo(lock.lockedAt)}}</td>\n <td class=\"cell-meta\">{{FormatDateTime(lock.expectedCompletion)}}</td>\n <td>\n <span class=\"lock-status-badge\" [class.stale]=\"lock.isStale\">\n {{lock.isStale ? 'Stale' : 'Active'}}\n </span>\n </td>\n <td>\n @if (lock.isStale) {\n <button class=\"release-btn\" (click)=\"ReleaseLock(lock.jobId)\">\n <i class=\"fa-solid fa-lock-open\"></i> Release\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n }\n</div>\n</ng-template>\n", styles: [".overview-container {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.overview-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls {\n display: flex;\n gap: 8px;\n}\n\n.control-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n/* \u2500\u2500 Health Banner \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.health-banner {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track {\n stroke: var(--mj-border-default);\n}\n\n.health-score {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details {\n flex: 1;\n}\n\n.health-title {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats span {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n/* \u2500\u2500 KPI Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n.kpi-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content {\n flex: 1;\n}\n\n.kpi-value {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Panels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.panels-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header .panel-title i {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear i {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear span {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.alert-header .panel-title i {\n color: var(--mj-status-error);\n}\n\n.panel-badge {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Execution Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.execution-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item:last-child {\n border-bottom: none;\n}\n\n.exec-status i {\n font-size: 1.1rem;\n}\n\n.exec-details {\n flex: 1;\n}\n\n.exec-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n/* Status Colors */\n.status-running { color: var(--mj-brand-primary); }\n.status-success { color: var(--mj-status-success); }\n.status-error { color: var(--mj-status-error); }\n.status-warning { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n/* \u2500\u2500 Alert Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.alert-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error .alert-icon { color: var(--mj-status-error); }\n.alert-warning .alert-icon { color: var(--mj-status-warning); }\n\n.alert-content {\n flex: 1;\n}\n\n.alert-title {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn:hover {\n background: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Upcoming Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.upcoming-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item:last-child {\n border-bottom: none;\n}\n\n.upcoming-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon {\n color: var(--mj-status-warning);\n}\n\n/* \u2500\u2500 Empty State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.empty-state-small {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small i {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small span {\n font-size: 0.85rem;\n}\n\n/* \u2500\u2500 Data Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table td {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta {\n color: var(--mj-text-secondary);\n}\n\n.stale-row {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 1024px) {\n .panels-grid {\n grid-template-columns: 1fr;\n }\n .kpi-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid {\n grid-template-columns: 1fr;\n }\n .health-banner {\n flex-direction: column;\n text-align: center;\n }\n .health-stats {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table {\n font-size: 0.8rem;\n }\n}\n"] }]
|
|
595
627
|
}], () => [{ type: i1.SchedulingInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
|
|
596
628
|
type: Input
|
|
629
|
+
}], HideToolbar: [{
|
|
630
|
+
type: Input
|
|
597
631
|
}], stateChange: [{
|
|
598
632
|
type: Output
|
|
599
633
|
}] }); })();
|