@memberjunction/ng-dashboards 5.37.0 → 5.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- 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 +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.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 +2 -1
- 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 +1 -0
- 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 +55 -36
- 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 +9 -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 +158 -117
- 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 +1 -0
- 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 +22 -8
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +550 -532
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
- package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
- package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
- package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
- package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
- package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
- package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
- package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
- package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
- package/dist/Home/home-application.d.ts +21 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +60 -8
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +47 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +40 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +34 -22
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +65 -9
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +55 -53
|
@@ -15,7 +15,7 @@ function SchedulingOverviewComponent_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
15
15
|
const content_r1 = i0.ɵɵreference(3);
|
|
16
16
|
i0.ɵɵproperty("ngTemplateOutlet", content_r1);
|
|
17
17
|
} }
|
|
18
|
-
function
|
|
18
|
+
function SchedulingOverviewComponent_Conditional_1_ng_container_9_Template(rf, ctx) { if (rf & 1) {
|
|
19
19
|
i0.ɵɵelementContainer(0);
|
|
20
20
|
} }
|
|
21
21
|
function SchedulingOverviewComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -26,44 +26,45 @@ function SchedulingOverviewComponent_Conditional_1_Template(rf, ctx) { if (rf &
|
|
|
26
26
|
i0.ɵɵelementStart(4, "button", 5);
|
|
27
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
28
|
i0.ɵɵelement(5, "i", 6);
|
|
29
|
-
i0.ɵɵ
|
|
30
|
-
i0.ɵɵ
|
|
31
|
-
i0.ɵɵ
|
|
32
|
-
i0.ɵɵ
|
|
29
|
+
i0.ɵɵelementStart(6, "span", 7);
|
|
30
|
+
i0.ɵɵtext(7);
|
|
31
|
+
i0.ɵɵelementEnd()()()();
|
|
32
|
+
i0.ɵɵelementStart(8, "mj-page-body");
|
|
33
|
+
i0.ɵɵtemplate(9, SchedulingOverviewComponent_Conditional_1_ng_container_9_Template, 1, 0, "ng-container", 1);
|
|
33
34
|
i0.ɵɵelementEnd()();
|
|
34
35
|
} if (rf & 2) {
|
|
35
36
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
36
37
|
const content_r1 = i0.ɵɵreference(3);
|
|
37
38
|
i0.ɵɵadvance(4);
|
|
38
39
|
i0.ɵɵproperty("variant", ctx_r2.AutoRefreshEnabled ? "primary" : "secondary");
|
|
39
|
-
i0.ɵɵadvance(
|
|
40
|
-
i0.ɵɵtextInterpolate1("
|
|
40
|
+
i0.ɵɵadvance(3);
|
|
41
|
+
i0.ɵɵtextInterpolate1("Auto: ", ctx_r2.AutoRefreshEnabled ? "ON" : "OFF");
|
|
41
42
|
i0.ɵɵadvance(2);
|
|
42
43
|
i0.ɵɵproperty("ngTemplateOutlet", content_r1);
|
|
43
44
|
} }
|
|
44
45
|
function SchedulingOverviewComponent_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
-
i0.ɵɵelementStart(0, "div",
|
|
46
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
46
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
47
|
+
i0.ɵɵelement(1, "mj-loading", 11);
|
|
47
48
|
i0.ɵɵelementEnd();
|
|
48
49
|
} }
|
|
49
50
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
-
i0.ɵɵelementStart(0, "div",
|
|
51
|
-
i0.ɵɵelement(1, "i",
|
|
51
|
+
i0.ɵɵelementStart(0, "div", 45);
|
|
52
|
+
i0.ɵɵelement(1, "i", 56);
|
|
52
53
|
i0.ɵɵelementStart(2, "span");
|
|
53
54
|
i0.ɵɵtext(3, "No recent executions");
|
|
54
55
|
i0.ɵɵelementEnd()();
|
|
55
56
|
} }
|
|
56
57
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
-
i0.ɵɵelementStart(0, "div",
|
|
58
|
-
i0.ɵɵelement(2, "i",
|
|
58
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "div", 57);
|
|
59
|
+
i0.ɵɵelement(2, "i", 58);
|
|
59
60
|
i0.ɵɵelementEnd();
|
|
60
|
-
i0.ɵɵelementStart(3, "div",
|
|
61
|
+
i0.ɵɵelementStart(3, "div", 59)(4, "div", 60);
|
|
61
62
|
i0.ɵɵtext(5);
|
|
62
63
|
i0.ɵɵelementEnd();
|
|
63
|
-
i0.ɵɵelementStart(6, "div",
|
|
64
|
+
i0.ɵɵelementStart(6, "div", 61);
|
|
64
65
|
i0.ɵɵtext(7);
|
|
65
66
|
i0.ɵɵelementEnd()();
|
|
66
|
-
i0.ɵɵelementStart(8, "div",
|
|
67
|
+
i0.ɵɵelementStart(8, "div", 62);
|
|
67
68
|
i0.ɵɵtext(9);
|
|
68
69
|
i0.ɵɵelementEnd()();
|
|
69
70
|
} if (rf & 2) {
|
|
@@ -82,7 +83,7 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template
|
|
|
82
83
|
i0.ɵɵtextInterpolate1(" ", exec_r4.status, " ");
|
|
83
84
|
} }
|
|
84
85
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
-
i0.ɵɵelementStart(0, "span",
|
|
86
|
+
i0.ɵɵelementStart(0, "span", 49);
|
|
86
87
|
i0.ɵɵtext(1);
|
|
87
88
|
i0.ɵɵelementEnd();
|
|
88
89
|
} if (rf & 2) {
|
|
@@ -91,34 +92,34 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_
|
|
|
91
92
|
i0.ɵɵtextInterpolate(ctx_r2.Alerts.length);
|
|
92
93
|
} }
|
|
93
94
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_75_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
-
i0.ɵɵelementStart(0, "span",
|
|
95
|
+
i0.ɵɵelementStart(0, "span", 50);
|
|
95
96
|
i0.ɵɵtext(1, "0");
|
|
96
97
|
i0.ɵɵelementEnd();
|
|
97
98
|
} }
|
|
98
99
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_77_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
-
i0.ɵɵelementStart(0, "div",
|
|
100
|
-
i0.ɵɵelement(1, "i",
|
|
100
|
+
i0.ɵɵelementStart(0, "div", 51);
|
|
101
|
+
i0.ɵɵelement(1, "i", 63);
|
|
101
102
|
i0.ɵɵelementStart(2, "span");
|
|
102
103
|
i0.ɵɵtext(3, "No active alerts");
|
|
103
104
|
i0.ɵɵelementEnd()();
|
|
104
105
|
} }
|
|
105
106
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
106
107
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
107
|
-
i0.ɵɵelementStart(0, "button",
|
|
108
|
+
i0.ɵɵelementStart(0, "button", 69);
|
|
108
109
|
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)); });
|
|
109
110
|
i0.ɵɵtext(1, " Release ");
|
|
110
111
|
i0.ɵɵelementEnd();
|
|
111
112
|
} }
|
|
112
113
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
-
i0.ɵɵelementStart(0, "div",
|
|
114
|
-
i0.ɵɵelement(1, "i",
|
|
115
|
-
i0.ɵɵelementStart(2, "div",
|
|
114
|
+
i0.ɵɵelementStart(0, "div", 52);
|
|
115
|
+
i0.ɵɵelement(1, "i", 64);
|
|
116
|
+
i0.ɵɵelementStart(2, "div", 65)(3, "div", 66);
|
|
116
117
|
i0.ɵɵtext(4);
|
|
117
118
|
i0.ɵɵelementEnd();
|
|
118
|
-
i0.ɵɵelementStart(5, "div",
|
|
119
|
+
i0.ɵɵelementStart(5, "div", 67);
|
|
119
120
|
i0.ɵɵtext(6);
|
|
120
121
|
i0.ɵɵelementEnd()();
|
|
121
|
-
i0.ɵɵconditionalCreate(7, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template, 2, 0, "button",
|
|
122
|
+
i0.ɵɵconditionalCreate(7, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template, 2, 0, "button", 68);
|
|
122
123
|
i0.ɵɵelementEnd();
|
|
123
124
|
} if (rf & 2) {
|
|
124
125
|
const alert_r6 = ctx.$implicit;
|
|
@@ -134,22 +135,22 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template
|
|
|
134
135
|
i0.ɵɵconditional(alert_r6.type === "stale-lock" && alert_r6.jobId ? 7 : -1);
|
|
135
136
|
} }
|
|
136
137
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_88_Template(rf, ctx) { if (rf & 1) {
|
|
137
|
-
i0.ɵɵelementStart(0, "div",
|
|
138
|
-
i0.ɵɵelement(1, "i",
|
|
138
|
+
i0.ɵɵelementStart(0, "div", 45);
|
|
139
|
+
i0.ɵɵelement(1, "i", 70);
|
|
139
140
|
i0.ɵɵelementStart(2, "span");
|
|
140
141
|
i0.ɵɵtext(3, "No upcoming executions");
|
|
141
142
|
i0.ɵɵelementEnd()();
|
|
142
143
|
} }
|
|
143
144
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
-
i0.ɵɵelementStart(0, "div",
|
|
145
|
+
i0.ɵɵelementStart(0, "div", 54)(1, "div", 71)(2, "div", 72);
|
|
145
146
|
i0.ɵɵtext(3);
|
|
146
147
|
i0.ɵɵelementEnd();
|
|
147
|
-
i0.ɵɵelementStart(4, "div",
|
|
148
|
+
i0.ɵɵelementStart(4, "div", 73);
|
|
148
149
|
i0.ɵɵtext(5);
|
|
149
|
-
i0.ɵɵelementStart(6, "span",
|
|
150
|
+
i0.ɵɵelementStart(6, "span", 74);
|
|
150
151
|
i0.ɵɵtext(7);
|
|
151
152
|
i0.ɵɵelementEnd()()();
|
|
152
|
-
i0.ɵɵelementStart(8, "div",
|
|
153
|
+
i0.ɵɵelementStart(8, "div", 75);
|
|
153
154
|
i0.ɵɵtext(9);
|
|
154
155
|
i0.ɵɵelementEnd()();
|
|
155
156
|
} if (rf & 2) {
|
|
@@ -168,30 +169,30 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template
|
|
|
168
169
|
} }
|
|
169
170
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
170
171
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
171
|
-
i0.ɵɵelementStart(0, "button",
|
|
172
|
+
i0.ɵɵelementStart(0, "button", 83);
|
|
172
173
|
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",
|
|
174
|
+
i0.ɵɵelement(1, "i", 84);
|
|
174
175
|
i0.ɵɵtext(2, " Release ");
|
|
175
176
|
i0.ɵɵelementEnd();
|
|
176
177
|
} }
|
|
177
178
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Template(rf, ctx) { if (rf & 1) {
|
|
178
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
179
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 79);
|
|
179
180
|
i0.ɵɵtext(2);
|
|
180
181
|
i0.ɵɵelementEnd();
|
|
181
|
-
i0.ɵɵelementStart(3, "td",
|
|
182
|
+
i0.ɵɵelementStart(3, "td", 80);
|
|
182
183
|
i0.ɵɵtext(4);
|
|
183
184
|
i0.ɵɵelementEnd();
|
|
184
|
-
i0.ɵɵelementStart(5, "td",
|
|
185
|
+
i0.ɵɵelementStart(5, "td", 80);
|
|
185
186
|
i0.ɵɵtext(6);
|
|
186
187
|
i0.ɵɵelementEnd();
|
|
187
|
-
i0.ɵɵelementStart(7, "td",
|
|
188
|
+
i0.ɵɵelementStart(7, "td", 80);
|
|
188
189
|
i0.ɵɵtext(8);
|
|
189
190
|
i0.ɵɵelementEnd();
|
|
190
|
-
i0.ɵɵelementStart(9, "td")(10, "span",
|
|
191
|
+
i0.ɵɵelementStart(9, "td")(10, "span", 81);
|
|
191
192
|
i0.ɵɵtext(11);
|
|
192
193
|
i0.ɵɵelementEnd()();
|
|
193
194
|
i0.ɵɵelementStart(12, "td");
|
|
194
|
-
i0.ɵɵconditionalCreate(13, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template, 3, 0, "button",
|
|
195
|
+
i0.ɵɵconditionalCreate(13, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template, 3, 0, "button", 82);
|
|
195
196
|
i0.ɵɵelementEnd()();
|
|
196
197
|
} if (rf & 2) {
|
|
197
198
|
const lock_r9 = ctx.$implicit;
|
|
@@ -213,14 +214,14 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_
|
|
|
213
214
|
i0.ɵɵconditional(lock_r9.isStale ? 13 : -1);
|
|
214
215
|
} }
|
|
215
216
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_Template(rf, ctx) { if (rf & 1) {
|
|
216
|
-
i0.ɵɵelementStart(0, "div",
|
|
217
|
-
i0.ɵɵelement(3, "i",
|
|
217
|
+
i0.ɵɵelementStart(0, "div", 55)(1, "div", 40)(2, "div", 41);
|
|
218
|
+
i0.ɵɵelement(3, "i", 76);
|
|
218
219
|
i0.ɵɵtext(4, " Active Locks ");
|
|
219
220
|
i0.ɵɵelementEnd();
|
|
220
|
-
i0.ɵɵelementStart(5, "span",
|
|
221
|
+
i0.ɵɵelementStart(5, "span", 43);
|
|
221
222
|
i0.ɵɵtext(6);
|
|
222
223
|
i0.ɵɵelementEnd()();
|
|
223
|
-
i0.ɵɵelementStart(7, "div",
|
|
224
|
+
i0.ɵɵelementStart(7, "div", 44)(8, "table", 77)(9, "thead")(10, "tr")(11, "th");
|
|
224
225
|
i0.ɵɵtext(12, "Job");
|
|
225
226
|
i0.ɵɵelementEnd();
|
|
226
227
|
i0.ɵɵelementStart(13, "th");
|
|
@@ -238,7 +239,7 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_
|
|
|
238
239
|
i0.ɵɵelement(21, "th");
|
|
239
240
|
i0.ɵɵelementEnd()();
|
|
240
241
|
i0.ɵɵelementStart(22, "tbody");
|
|
241
|
-
i0.ɵɵrepeaterCreate(23, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Template, 14, 10, "tr",
|
|
242
|
+
i0.ɵɵrepeaterCreate(23, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Template, 14, 10, "tr", 78, i0.ɵɵrepeaterTrackByIdentity);
|
|
242
243
|
i0.ɵɵelementEnd()()()();
|
|
243
244
|
} if (rf & 2) {
|
|
244
245
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -248,103 +249,103 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_
|
|
|
248
249
|
i0.ɵɵrepeater(ctx_r2.Locks);
|
|
249
250
|
} }
|
|
250
251
|
function SchedulingOverviewComponent_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
251
|
-
i0.ɵɵelementStart(0, "div",
|
|
252
|
+
i0.ɵɵelementStart(0, "div", 10)(1, "div", 12)(2, "div", 13);
|
|
252
253
|
i0.ɵɵnamespaceSVG();
|
|
253
|
-
i0.ɵɵelementStart(3, "svg",
|
|
254
|
-
i0.ɵɵelement(4, "circle",
|
|
254
|
+
i0.ɵɵelementStart(3, "svg", 14);
|
|
255
|
+
i0.ɵɵelement(4, "circle", 15)(5, "circle", 16);
|
|
255
256
|
i0.ɵɵelementEnd();
|
|
256
257
|
i0.ɵɵnamespaceHTML();
|
|
257
|
-
i0.ɵɵelementStart(6, "div",
|
|
258
|
+
i0.ɵɵelementStart(6, "div", 17);
|
|
258
259
|
i0.ɵɵtext(7);
|
|
259
260
|
i0.ɵɵelementEnd()();
|
|
260
|
-
i0.ɵɵelementStart(8, "div",
|
|
261
|
+
i0.ɵɵelementStart(8, "div", 18)(9, "div", 19);
|
|
261
262
|
i0.ɵɵtext(10, "System Health");
|
|
262
263
|
i0.ɵɵelementEnd();
|
|
263
|
-
i0.ɵɵelementStart(11, "div",
|
|
264
|
-
i0.ɵɵelement(13, "i",
|
|
264
|
+
i0.ɵɵelementStart(11, "div", 20)(12, "span");
|
|
265
|
+
i0.ɵɵelement(13, "i", 21);
|
|
265
266
|
i0.ɵɵtext(14);
|
|
266
267
|
i0.ɵɵelementEnd();
|
|
267
268
|
i0.ɵɵelementStart(15, "span");
|
|
268
|
-
i0.ɵɵelement(16, "i",
|
|
269
|
+
i0.ɵɵelement(16, "i", 22);
|
|
269
270
|
i0.ɵɵtext(17);
|
|
270
271
|
i0.ɵɵelementEnd();
|
|
271
272
|
i0.ɵɵelementStart(18, "span");
|
|
272
|
-
i0.ɵɵelement(19, "i",
|
|
273
|
+
i0.ɵɵelement(19, "i", 23);
|
|
273
274
|
i0.ɵɵtext(20);
|
|
274
275
|
i0.ɵɵelementEnd()()()();
|
|
275
|
-
i0.ɵɵelementStart(21, "div",
|
|
276
|
-
i0.ɵɵelement(24, "i",
|
|
276
|
+
i0.ɵɵelementStart(21, "div", 24)(22, "div", 25)(23, "div", 26);
|
|
277
|
+
i0.ɵɵelement(24, "i", 27);
|
|
277
278
|
i0.ɵɵelementEnd();
|
|
278
|
-
i0.ɵɵelementStart(25, "div",
|
|
279
|
+
i0.ɵɵelementStart(25, "div", 28)(26, "div", 29);
|
|
279
280
|
i0.ɵɵtext(27);
|
|
280
281
|
i0.ɵɵelementEnd();
|
|
281
|
-
i0.ɵɵelementStart(28, "div",
|
|
282
|
+
i0.ɵɵelementStart(28, "div", 30);
|
|
282
283
|
i0.ɵɵtext(29, "Active Jobs");
|
|
283
284
|
i0.ɵɵelementEnd()()();
|
|
284
|
-
i0.ɵɵelementStart(30, "div",
|
|
285
|
-
i0.ɵɵelement(32, "i",
|
|
285
|
+
i0.ɵɵelementStart(30, "div", 25)(31, "div", 31);
|
|
286
|
+
i0.ɵɵelement(32, "i", 32);
|
|
286
287
|
i0.ɵɵelementEnd();
|
|
287
|
-
i0.ɵɵelementStart(33, "div",
|
|
288
|
+
i0.ɵɵelementStart(33, "div", 28)(34, "div", 29);
|
|
288
289
|
i0.ɵɵtext(35);
|
|
289
290
|
i0.ɵɵelementEnd();
|
|
290
|
-
i0.ɵɵelementStart(36, "div",
|
|
291
|
+
i0.ɵɵelementStart(36, "div", 30);
|
|
291
292
|
i0.ɵɵtext(37, "Due Next Hour");
|
|
292
293
|
i0.ɵɵelementEnd()()();
|
|
293
|
-
i0.ɵɵelementStart(38, "div",
|
|
294
|
-
i0.ɵɵelement(40, "i",
|
|
294
|
+
i0.ɵɵelementStart(38, "div", 25)(39, "div", 33);
|
|
295
|
+
i0.ɵɵelement(40, "i", 34);
|
|
295
296
|
i0.ɵɵelementEnd();
|
|
296
|
-
i0.ɵɵelementStart(41, "div",
|
|
297
|
+
i0.ɵɵelementStart(41, "div", 28)(42, "div", 29);
|
|
297
298
|
i0.ɵɵtext(43);
|
|
298
299
|
i0.ɵɵelementEnd();
|
|
299
|
-
i0.ɵɵelementStart(44, "div",
|
|
300
|
+
i0.ɵɵelementStart(44, "div", 30);
|
|
300
301
|
i0.ɵɵtext(45, "Runs (24h)");
|
|
301
302
|
i0.ɵɵelementEnd();
|
|
302
|
-
i0.ɵɵelementStart(46, "div",
|
|
303
|
+
i0.ɵɵelementStart(46, "div", 35);
|
|
303
304
|
i0.ɵɵtext(47);
|
|
304
305
|
i0.ɵɵelementEnd()()();
|
|
305
|
-
i0.ɵɵelementStart(48, "div",
|
|
306
|
-
i0.ɵɵelement(50, "i",
|
|
306
|
+
i0.ɵɵelementStart(48, "div", 25)(49, "div", 36);
|
|
307
|
+
i0.ɵɵelement(50, "i", 37);
|
|
307
308
|
i0.ɵɵelementEnd();
|
|
308
|
-
i0.ɵɵelementStart(51, "div",
|
|
309
|
+
i0.ɵɵelementStart(51, "div", 28)(52, "div", 29);
|
|
309
310
|
i0.ɵɵtext(53);
|
|
310
311
|
i0.ɵɵelementEnd();
|
|
311
|
-
i0.ɵɵelementStart(54, "div",
|
|
312
|
+
i0.ɵɵelementStart(54, "div", 30);
|
|
312
313
|
i0.ɵɵtext(55, "Running Now");
|
|
313
314
|
i0.ɵɵelementEnd()()()();
|
|
314
|
-
i0.ɵɵelementStart(56, "div",
|
|
315
|
-
i0.ɵɵelement(60, "i",
|
|
315
|
+
i0.ɵɵelementStart(56, "div", 38)(57, "div", 39)(58, "div", 40)(59, "div", 41);
|
|
316
|
+
i0.ɵɵelement(60, "i", 42);
|
|
316
317
|
i0.ɵɵtext(61, " Live Executions ");
|
|
317
318
|
i0.ɵɵelementEnd();
|
|
318
|
-
i0.ɵɵelementStart(62, "span",
|
|
319
|
+
i0.ɵɵelementStart(62, "span", 43);
|
|
319
320
|
i0.ɵɵtext(63);
|
|
320
321
|
i0.ɵɵelementEnd()();
|
|
321
|
-
i0.ɵɵelementStart(64, "div",
|
|
322
|
-
i0.ɵɵconditionalCreate(65, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_65_Template, 4, 0, "div",
|
|
323
|
-
i0.ɵɵrepeaterCreate(66, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template, 10, 8, "div",
|
|
322
|
+
i0.ɵɵelementStart(64, "div", 44);
|
|
323
|
+
i0.ɵɵconditionalCreate(65, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_65_Template, 4, 0, "div", 45);
|
|
324
|
+
i0.ɵɵrepeaterCreate(66, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template, 10, 8, "div", 46, i0.ɵɵrepeaterTrackByIdentity);
|
|
324
325
|
i0.ɵɵelementEnd()();
|
|
325
|
-
i0.ɵɵelementStart(68, "div",
|
|
326
|
+
i0.ɵɵelementStart(68, "div", 47)(69, "div", 39)(70, "div", 48)(71, "div", 41);
|
|
326
327
|
i0.ɵɵelement(72, "i");
|
|
327
328
|
i0.ɵɵtext(73);
|
|
328
329
|
i0.ɵɵelementEnd();
|
|
329
|
-
i0.ɵɵconditionalCreate(74, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_Template, 2, 1, "span",
|
|
330
|
-
i0.ɵɵconditionalCreate(75, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_75_Template, 2, 0, "span",
|
|
330
|
+
i0.ɵɵconditionalCreate(74, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_Template, 2, 1, "span", 49);
|
|
331
|
+
i0.ɵɵconditionalCreate(75, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_75_Template, 2, 0, "span", 50);
|
|
331
332
|
i0.ɵɵelementEnd();
|
|
332
|
-
i0.ɵɵelementStart(76, "div",
|
|
333
|
-
i0.ɵɵconditionalCreate(77, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_77_Template, 4, 0, "div",
|
|
334
|
-
i0.ɵɵrepeaterCreate(78, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template, 8, 6, "div",
|
|
333
|
+
i0.ɵɵelementStart(76, "div", 44);
|
|
334
|
+
i0.ɵɵconditionalCreate(77, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_77_Template, 4, 0, "div", 51);
|
|
335
|
+
i0.ɵɵrepeaterCreate(78, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template, 8, 6, "div", 52, i0.ɵɵrepeaterTrackByIdentity);
|
|
335
336
|
i0.ɵɵelementEnd()();
|
|
336
|
-
i0.ɵɵelementStart(80, "div",
|
|
337
|
-
i0.ɵɵelement(83, "i",
|
|
337
|
+
i0.ɵɵelementStart(80, "div", 39)(81, "div", 40)(82, "div", 41);
|
|
338
|
+
i0.ɵɵelement(83, "i", 53);
|
|
338
339
|
i0.ɵɵtext(84, " Upcoming (24h) ");
|
|
339
340
|
i0.ɵɵelementEnd();
|
|
340
|
-
i0.ɵɵelementStart(85, "span",
|
|
341
|
+
i0.ɵɵelementStart(85, "span", 43);
|
|
341
342
|
i0.ɵɵtext(86);
|
|
342
343
|
i0.ɵɵelementEnd()();
|
|
343
|
-
i0.ɵɵelementStart(87, "div",
|
|
344
|
-
i0.ɵɵconditionalCreate(88, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_88_Template, 4, 0, "div",
|
|
345
|
-
i0.ɵɵrepeaterCreate(89, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template, 10, 6, "div",
|
|
344
|
+
i0.ɵɵelementStart(87, "div", 44);
|
|
345
|
+
i0.ɵɵconditionalCreate(88, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_88_Template, 4, 0, "div", 45);
|
|
346
|
+
i0.ɵɵrepeaterCreate(89, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template, 10, 6, "div", 54, i0.ɵɵrepeaterTrackByIdentity);
|
|
346
347
|
i0.ɵɵelementEnd()()()();
|
|
347
|
-
i0.ɵɵconditionalCreate(91, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_Template, 25, 1, "div",
|
|
348
|
+
i0.ɵɵconditionalCreate(91, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_Template, 25, 1, "div", 55);
|
|
348
349
|
i0.ɵɵelementEnd();
|
|
349
350
|
} if (rf & 2) {
|
|
350
351
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -404,9 +405,9 @@ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Template(rf, ct
|
|
|
404
405
|
i0.ɵɵconditional(ctx_r2.Locks.length > 0 ? 91 : -1);
|
|
405
406
|
} }
|
|
406
407
|
function SchedulingOverviewComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
407
|
-
i0.ɵɵelementStart(0, "div",
|
|
408
|
-
i0.ɵɵconditionalCreate(1, SchedulingOverviewComponent_ng_template_2_Conditional_1_Template, 2, 0, "div",
|
|
409
|
-
i0.ɵɵconditionalCreate(2, SchedulingOverviewComponent_ng_template_2_Conditional_2_Template, 92, 29, "div",
|
|
408
|
+
i0.ɵɵelementStart(0, "div", 8);
|
|
409
|
+
i0.ɵɵconditionalCreate(1, SchedulingOverviewComponent_ng_template_2_Conditional_1_Template, 2, 0, "div", 9);
|
|
410
|
+
i0.ɵɵconditionalCreate(2, SchedulingOverviewComponent_ng_template_2_Conditional_2_Template, 92, 29, "div", 10);
|
|
410
411
|
i0.ɵɵelementEnd();
|
|
411
412
|
} if (rf & 2) {
|
|
412
413
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -614,8 +615,8 @@ export class SchedulingOverviewComponent {
|
|
|
614
615
|
});
|
|
615
616
|
}
|
|
616
617
|
static ɵfac = function SchedulingOverviewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SchedulingOverviewComponent)(i0.ɵɵdirectiveInject(i1.SchedulingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
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,
|
|
618
|
+
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, "action-btn-label"], [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) {
|
|
619
|
+
i0.ɵɵconditionalCreate(0, SchedulingOverviewComponent_Conditional_0_Template, 1, 1, "ng-container")(1, SchedulingOverviewComponent_Conditional_1_Template, 10, 3, "mj-page-layout");
|
|
619
620
|
i0.ɵɵtemplate(2, SchedulingOverviewComponent_ng_template_2_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
620
621
|
} if (rf & 2) {
|
|
621
622
|
i0.ɵɵconditional(ctx.HideToolbar ? 0 : 1);
|
|
@@ -623,7 +624,7 @@ export class SchedulingOverviewComponent {
|
|
|
623
624
|
}
|
|
624
625
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SchedulingOverviewComponent, [{
|
|
625
626
|
type: Component,
|
|
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"] }]
|
|
627
|
+
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 <span class=\"action-btn-label\">Auto: {{AutoRefreshEnabled ? 'ON' : 'OFF'}}</span>\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"] }]
|
|
627
628
|
}], () => [{ type: i1.SchedulingInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
|
|
628
629
|
type: Input
|
|
629
630
|
}], HideToolbar: [{
|