@memberjunction/ng-dashboards 5.10.1 → 5.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +586 -223
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +23 -8
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2 -2
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
- package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
- package/dist/AI/components/system/system-configuration.component.js +2 -2
- package/dist/AI/components/widgets/kpi-card.component.js +7 -7
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +2 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +3 -3
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +3 -3
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +1 -1
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +2 -2
- package/dist/APIKeys/api-usage-panel.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/execution-monitoring.component.js +2 -2
- package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
- package/dist/Actions/components/explorer/action-card.component.js +2 -2
- package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
- package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
- package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
- package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +2 -2
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +3 -3
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +5 -5
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +2 -2
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +6 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +26 -8
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +5 -5
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +31 -2
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +753 -412
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts +0 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +3 -6
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +97 -5
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +5 -1
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +2 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +7 -3
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +27 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +107 -4
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -2
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -2
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -2
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-filter-panel.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +55 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +664 -199
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/index.d.ts +0 -1
- package/dist/Scheduling/components/index.d.ts.map +1 -1
- package/dist/Scheduling/components/index.js +0 -1
- package/dist/Scheduling/components/index.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +2 -2
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +2 -2
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +5 -5
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +2 -2
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +2 -2
- package/dist/VersionHistory/components/diff-resource.component.js +2 -2
- package/dist/VersionHistory/components/graph-resource.component.js +2 -2
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +3 -3
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.js +1 -0
- package/dist/__tests__/integration-data-service.test.js.map +1 -1
- package/dist/module.d.ts +52 -49
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +25 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +42 -40
- package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
- package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
- package/dist/Scheduling/components/job-slideout.component.js +0 -459
- package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
|
@@ -1,459 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../services/scheduling-instrumentation.service";
|
|
4
|
-
import * as i2 from "@angular/forms";
|
|
5
|
-
import * as i3 from "@memberjunction/ng-code-editor";
|
|
6
|
-
import * as i4 from "@angular/common";
|
|
7
|
-
function JobSlideoutComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
8
|
-
i0.ɵɵelementStart(0, "div", 6);
|
|
9
|
-
i0.ɵɵelement(1, "i", 33);
|
|
10
|
-
i0.ɵɵelementStart(2, "span");
|
|
11
|
-
i0.ɵɵtext(3);
|
|
12
|
-
i0.ɵɵelementEnd()();
|
|
13
|
-
} if (rf & 2) {
|
|
14
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
15
|
-
i0.ɵɵadvance(3);
|
|
16
|
-
i0.ɵɵtextInterpolate(ctx_r0.ErrorMessage);
|
|
17
|
-
} }
|
|
18
|
-
function JobSlideoutComponent_For_31_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
-
i0.ɵɵelementStart(0, "option", 16);
|
|
20
|
-
i0.ɵɵtext(1);
|
|
21
|
-
i0.ɵɵelementEnd();
|
|
22
|
-
} if (rf & 2) {
|
|
23
|
-
const t_r2 = ctx.$implicit;
|
|
24
|
-
i0.ɵɵproperty("value", t_r2.id);
|
|
25
|
-
i0.ɵɵadvance();
|
|
26
|
-
i0.ɵɵtextInterpolate(t_r2.name);
|
|
27
|
-
} }
|
|
28
|
-
function JobSlideoutComponent_For_37_Template(rf, ctx) { if (rf & 1) {
|
|
29
|
-
i0.ɵɵelementStart(0, "option", 16);
|
|
30
|
-
i0.ɵɵtext(1);
|
|
31
|
-
i0.ɵɵelementEnd();
|
|
32
|
-
} if (rf & 2) {
|
|
33
|
-
const s_r3 = ctx.$implicit;
|
|
34
|
-
i0.ɵɵproperty("value", s_r3);
|
|
35
|
-
i0.ɵɵadvance();
|
|
36
|
-
i0.ɵɵtextInterpolate(s_r3);
|
|
37
|
-
} }
|
|
38
|
-
function JobSlideoutComponent_For_55_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
-
i0.ɵɵelementStart(0, "option", 16);
|
|
40
|
-
i0.ɵɵtext(1);
|
|
41
|
-
i0.ɵɵelementEnd();
|
|
42
|
-
} if (rf & 2) {
|
|
43
|
-
const tz_r4 = ctx.$implicit;
|
|
44
|
-
i0.ɵɵproperty("value", tz_r4);
|
|
45
|
-
i0.ɵɵadvance();
|
|
46
|
-
i0.ɵɵtextInterpolate(tz_r4);
|
|
47
|
-
} }
|
|
48
|
-
function JobSlideoutComponent_For_61_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
-
i0.ɵɵelementStart(0, "option", 16);
|
|
50
|
-
i0.ɵɵtext(1);
|
|
51
|
-
i0.ɵɵelementEnd();
|
|
52
|
-
} if (rf & 2) {
|
|
53
|
-
const c_r5 = ctx.$implicit;
|
|
54
|
-
i0.ɵɵproperty("value", c_r5);
|
|
55
|
-
i0.ɵɵadvance();
|
|
56
|
-
i0.ɵɵtextInterpolate(c_r5);
|
|
57
|
-
} }
|
|
58
|
-
function JobSlideoutComponent_Conditional_84_Template(rf, ctx) { if (rf & 1) {
|
|
59
|
-
i0.ɵɵelementStart(0, "div", 7)(1, "div", 8);
|
|
60
|
-
i0.ɵɵtext(2, "Statistics");
|
|
61
|
-
i0.ɵɵelementEnd();
|
|
62
|
-
i0.ɵɵelementStart(3, "div", 34)(4, "div", 35)(5, "span", 36);
|
|
63
|
-
i0.ɵɵtext(6, "Total Runs");
|
|
64
|
-
i0.ɵɵelementEnd();
|
|
65
|
-
i0.ɵɵelementStart(7, "span", 37);
|
|
66
|
-
i0.ɵɵtext(8);
|
|
67
|
-
i0.ɵɵelementEnd()();
|
|
68
|
-
i0.ɵɵelementStart(9, "div", 35)(10, "span", 36);
|
|
69
|
-
i0.ɵɵtext(11, "Success");
|
|
70
|
-
i0.ɵɵelementEnd();
|
|
71
|
-
i0.ɵɵelementStart(12, "span", 38);
|
|
72
|
-
i0.ɵɵtext(13);
|
|
73
|
-
i0.ɵɵelementEnd()();
|
|
74
|
-
i0.ɵɵelementStart(14, "div", 35)(15, "span", 36);
|
|
75
|
-
i0.ɵɵtext(16, "Failures");
|
|
76
|
-
i0.ɵɵelementEnd();
|
|
77
|
-
i0.ɵɵelementStart(17, "span", 39);
|
|
78
|
-
i0.ɵɵtext(18);
|
|
79
|
-
i0.ɵɵelementEnd()();
|
|
80
|
-
i0.ɵɵelementStart(19, "div", 35)(20, "span", 36);
|
|
81
|
-
i0.ɵɵtext(21, "Created");
|
|
82
|
-
i0.ɵɵelementEnd();
|
|
83
|
-
i0.ɵɵelementStart(22, "span", 37);
|
|
84
|
-
i0.ɵɵtext(23);
|
|
85
|
-
i0.ɵɵpipe(24, "date");
|
|
86
|
-
i0.ɵɵelementEnd()()()();
|
|
87
|
-
} if (rf & 2) {
|
|
88
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
89
|
-
i0.ɵɵadvance(8);
|
|
90
|
-
i0.ɵɵtextInterpolate(ctx_r0.Job.totalRuns);
|
|
91
|
-
i0.ɵɵadvance(5);
|
|
92
|
-
i0.ɵɵtextInterpolate(ctx_r0.Job.successCount);
|
|
93
|
-
i0.ɵɵadvance(5);
|
|
94
|
-
i0.ɵɵtextInterpolate(ctx_r0.Job.failureCount);
|
|
95
|
-
i0.ɵɵadvance(5);
|
|
96
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(24, 4, ctx_r0.Job.createdAt, "short"));
|
|
97
|
-
} }
|
|
98
|
-
function JobSlideoutComponent_Conditional_87_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
-
const _r6 = i0.ɵɵgetCurrentView();
|
|
100
|
-
i0.ɵɵelementStart(0, "button", 40);
|
|
101
|
-
i0.ɵɵlistener("click", function JobSlideoutComponent_Conditional_87_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ShowDeleteConfirm = true); });
|
|
102
|
-
i0.ɵɵelement(1, "i", 41);
|
|
103
|
-
i0.ɵɵtext(2, " Delete ");
|
|
104
|
-
i0.ɵɵelementEnd();
|
|
105
|
-
} if (rf & 2) {
|
|
106
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
107
|
-
i0.ɵɵproperty("disabled", ctx_r0.IsDeleting);
|
|
108
|
-
} }
|
|
109
|
-
function JobSlideoutComponent_Conditional_92_Template(rf, ctx) { if (rf & 1) {
|
|
110
|
-
i0.ɵɵelement(0, "i", 30);
|
|
111
|
-
} }
|
|
112
|
-
function JobSlideoutComponent_Conditional_93_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
-
i0.ɵɵelement(0, "i", 31);
|
|
114
|
-
} }
|
|
115
|
-
function JobSlideoutComponent_Conditional_95_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
-
i0.ɵɵelement(0, "i", 30);
|
|
117
|
-
} }
|
|
118
|
-
function JobSlideoutComponent_Conditional_95_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
-
const _r7 = i0.ɵɵgetCurrentView();
|
|
120
|
-
i0.ɵɵelementStart(0, "div", 32)(1, "div", 42)(2, "div", 43);
|
|
121
|
-
i0.ɵɵelement(3, "i", 44);
|
|
122
|
-
i0.ɵɵelementEnd();
|
|
123
|
-
i0.ɵɵelementStart(4, "h3");
|
|
124
|
-
i0.ɵɵtext(5, "Delete Job");
|
|
125
|
-
i0.ɵɵelementEnd();
|
|
126
|
-
i0.ɵɵelementStart(6, "p");
|
|
127
|
-
i0.ɵɵtext(7);
|
|
128
|
-
i0.ɵɵelementEnd();
|
|
129
|
-
i0.ɵɵelementStart(8, "div", 45)(9, "button", 46);
|
|
130
|
-
i0.ɵɵlistener("click", function JobSlideoutComponent_Conditional_95_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Delete()); });
|
|
131
|
-
i0.ɵɵconditionalCreate(10, JobSlideoutComponent_Conditional_95_Conditional_10_Template, 1, 0, "i", 30);
|
|
132
|
-
i0.ɵɵtext(11, " Delete ");
|
|
133
|
-
i0.ɵɵelementEnd();
|
|
134
|
-
i0.ɵɵelementStart(12, "button", 28);
|
|
135
|
-
i0.ɵɵlistener("click", function JobSlideoutComponent_Conditional_95_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ShowDeleteConfirm = false); });
|
|
136
|
-
i0.ɵɵtext(13, "Cancel");
|
|
137
|
-
i0.ɵɵelementEnd()()()();
|
|
138
|
-
} if (rf & 2) {
|
|
139
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
140
|
-
i0.ɵɵadvance(7);
|
|
141
|
-
i0.ɵɵtextInterpolate1("Are you sure you want to delete \"", ctx_r0.Name, "\"? This action cannot be undone.");
|
|
142
|
-
i0.ɵɵadvance(2);
|
|
143
|
-
i0.ɵɵproperty("disabled", ctx_r0.IsDeleting);
|
|
144
|
-
i0.ɵɵadvance();
|
|
145
|
-
i0.ɵɵconditional(ctx_r0.IsDeleting ? 10 : -1);
|
|
146
|
-
} }
|
|
147
|
-
export class JobSlideoutComponent {
|
|
148
|
-
schedulingService;
|
|
149
|
-
cdr;
|
|
150
|
-
Mode = 'create';
|
|
151
|
-
Job = null;
|
|
152
|
-
Close = new EventEmitter();
|
|
153
|
-
Saved = new EventEmitter();
|
|
154
|
-
JobTypes = [];
|
|
155
|
-
IsSaving = false;
|
|
156
|
-
IsDeleting = false;
|
|
157
|
-
ShowDeleteConfirm = false;
|
|
158
|
-
ErrorMessage = '';
|
|
159
|
-
// Form fields
|
|
160
|
-
Name = '';
|
|
161
|
-
Description = '';
|
|
162
|
-
JobTypeID = '';
|
|
163
|
-
CronExpression = '';
|
|
164
|
-
Timezone = 'UTC';
|
|
165
|
-
Status = 'Pending';
|
|
166
|
-
ConcurrencyMode = 'Skip';
|
|
167
|
-
Configuration = '';
|
|
168
|
-
NotifyOnSuccess = false;
|
|
169
|
-
NotifyOnFailure = true;
|
|
170
|
-
StatusOptions = ['Pending', 'Active', 'Paused', 'Disabled'];
|
|
171
|
-
ConcurrencyOptions = ['Skip', 'Queue', 'Concurrent'];
|
|
172
|
-
TimezoneOptions = [
|
|
173
|
-
'UTC',
|
|
174
|
-
'America/New_York',
|
|
175
|
-
'America/Chicago',
|
|
176
|
-
'America/Denver',
|
|
177
|
-
'America/Los_Angeles',
|
|
178
|
-
'America/Phoenix',
|
|
179
|
-
'Europe/London',
|
|
180
|
-
'Europe/Paris',
|
|
181
|
-
'Europe/Berlin',
|
|
182
|
-
'Asia/Tokyo',
|
|
183
|
-
'Asia/Shanghai',
|
|
184
|
-
'Australia/Sydney',
|
|
185
|
-
'Pacific/Auckland'
|
|
186
|
-
];
|
|
187
|
-
constructor(schedulingService, cdr) {
|
|
188
|
-
this.schedulingService = schedulingService;
|
|
189
|
-
this.cdr = cdr;
|
|
190
|
-
}
|
|
191
|
-
ngOnInit() {
|
|
192
|
-
this.loadJobTypes();
|
|
193
|
-
if (this.Mode === 'edit' && this.Job) {
|
|
194
|
-
this.populateFromJob();
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
async loadJobTypes() {
|
|
198
|
-
this.JobTypes = await this.schedulingService.loadJobTypesForDropdown();
|
|
199
|
-
if (this.Mode === 'create' && this.JobTypes.length > 0 && !this.JobTypeID) {
|
|
200
|
-
this.JobTypeID = this.JobTypes[0].id;
|
|
201
|
-
}
|
|
202
|
-
this.cdr.markForCheck();
|
|
203
|
-
}
|
|
204
|
-
populateFromJob() {
|
|
205
|
-
if (!this.Job)
|
|
206
|
-
return;
|
|
207
|
-
this.Name = this.Job.jobName;
|
|
208
|
-
this.Description = this.Job.description || '';
|
|
209
|
-
this.JobTypeID = this.Job.jobTypeId;
|
|
210
|
-
this.CronExpression = this.Job.cronExpression;
|
|
211
|
-
this.Timezone = this.Job.timezone;
|
|
212
|
-
this.Status = this.Job.status;
|
|
213
|
-
this.ConcurrencyMode = this.Job.concurrencyMode;
|
|
214
|
-
this.Configuration = this.Job.configuration || '';
|
|
215
|
-
this.NotifyOnSuccess = this.Job.notifyOnSuccess;
|
|
216
|
-
this.NotifyOnFailure = this.Job.notifyOnFailure;
|
|
217
|
-
}
|
|
218
|
-
get IsValid() {
|
|
219
|
-
return !!(this.Name.trim() && this.JobTypeID && this.CronExpression.trim());
|
|
220
|
-
}
|
|
221
|
-
get Title() {
|
|
222
|
-
return this.Mode === 'create' ? 'Create New Job' : 'Edit Job';
|
|
223
|
-
}
|
|
224
|
-
async Save() {
|
|
225
|
-
if (!this.IsValid || this.IsSaving)
|
|
226
|
-
return;
|
|
227
|
-
this.IsSaving = true;
|
|
228
|
-
this.ErrorMessage = '';
|
|
229
|
-
this.cdr.markForCheck();
|
|
230
|
-
const data = {
|
|
231
|
-
Name: this.Name.trim(),
|
|
232
|
-
Description: this.Description.trim() || null,
|
|
233
|
-
JobTypeID: this.JobTypeID,
|
|
234
|
-
CronExpression: this.CronExpression.trim(),
|
|
235
|
-
Timezone: this.Timezone,
|
|
236
|
-
Status: this.Status,
|
|
237
|
-
ConcurrencyMode: this.ConcurrencyMode,
|
|
238
|
-
Configuration: this.Configuration.trim() || null,
|
|
239
|
-
NotifyOnSuccess: this.NotifyOnSuccess,
|
|
240
|
-
NotifyOnFailure: this.NotifyOnFailure
|
|
241
|
-
};
|
|
242
|
-
const jobId = this.Mode === 'edit' && this.Job ? this.Job.jobId : null;
|
|
243
|
-
const success = await this.schedulingService.saveJob(jobId, data);
|
|
244
|
-
this.IsSaving = false;
|
|
245
|
-
if (success) {
|
|
246
|
-
this.Saved.emit();
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
this.ErrorMessage = 'Failed to save job. Please try again.';
|
|
250
|
-
}
|
|
251
|
-
this.cdr.markForCheck();
|
|
252
|
-
}
|
|
253
|
-
async Delete() {
|
|
254
|
-
if (!this.Job || this.IsDeleting)
|
|
255
|
-
return;
|
|
256
|
-
this.IsDeleting = true;
|
|
257
|
-
this.ErrorMessage = '';
|
|
258
|
-
this.cdr.markForCheck();
|
|
259
|
-
const success = await this.schedulingService.deleteJob(this.Job.jobId);
|
|
260
|
-
this.IsDeleting = false;
|
|
261
|
-
if (success) {
|
|
262
|
-
this.Saved.emit();
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
this.ErrorMessage = 'Failed to delete job. It may have dependent records.';
|
|
266
|
-
this.ShowDeleteConfirm = false;
|
|
267
|
-
}
|
|
268
|
-
this.cdr.markForCheck();
|
|
269
|
-
}
|
|
270
|
-
OnConfigurationChange(value) {
|
|
271
|
-
this.Configuration = value;
|
|
272
|
-
this.cdr.markForCheck();
|
|
273
|
-
}
|
|
274
|
-
OnClose() {
|
|
275
|
-
this.Close.emit();
|
|
276
|
-
}
|
|
277
|
-
static ɵfac = function JobSlideoutComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || JobSlideoutComponent)(i0.ɵɵdirectiveInject(i1.SchedulingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
278
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: JobSlideoutComponent, selectors: [["app-job-slideout"]], inputs: { Mode: "Mode", Job: "Job" }, outputs: { Close: "Close", Saved: "Saved" }, standalone: false, decls: 96, vars: 24, consts: [[1, "slideout-container"], [1, "slideout-header"], [1, "slideout-title"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "slideout-body"], [1, "error-banner"], [1, "form-section"], [1, "section-title"], [1, "form-group"], [1, "form-label"], [1, "required"], ["type", "text", "placeholder", "e.g., Daily Data Sync", 1, "form-input", 3, "ngModelChange", "ngModel"], ["rows", "3", "placeholder", "What does this job do?", 1, "form-textarea", 3, "ngModelChange", "ngModel"], [1, "form-row"], [1, "form-input", 3, "ngModelChange", "ngModel"], [3, "value"], ["type", "text", "placeholder", "0 */15 * * * *", 1, "form-input", "mono", 3, "ngModelChange", "ngModel"], [1, "form-hint"], [1, "code-editor-wrapper"], [3, "change", "value", "language", "lineWrapping", "placeholder"], [1, "form-row", "checkboxes"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "slideout-footer"], [1, "footer-left"], [1, "delete-btn", 3, "disabled"], [1, "footer-right"], [1, "cancel-btn", 3, "click"], [1, "save-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"], [1, "confirm-overlay"], [1, "fa-solid", "fa-circle-exclamation"], [1, "stats-grid"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "stat-value", "success"], [1, "stat-value", "failure"], [1, "delete-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-trash-can"], [1, "confirm-dialog"], [1, "confirm-icon"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "confirm-actions"], [1, "delete-confirm-btn", 3, "click", "disabled"]], template: function JobSlideoutComponent_Template(rf, ctx) { if (rf & 1) {
|
|
279
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
|
|
280
|
-
i0.ɵɵelement(3, "i");
|
|
281
|
-
i0.ɵɵelementStart(4, "span");
|
|
282
|
-
i0.ɵɵtext(5);
|
|
283
|
-
i0.ɵɵelementEnd()();
|
|
284
|
-
i0.ɵɵelementStart(6, "button", 3);
|
|
285
|
-
i0.ɵɵlistener("click", function JobSlideoutComponent_Template_button_click_6_listener() { return ctx.OnClose(); });
|
|
286
|
-
i0.ɵɵelement(7, "i", 4);
|
|
287
|
-
i0.ɵɵelementEnd()();
|
|
288
|
-
i0.ɵɵelementStart(8, "div", 5);
|
|
289
|
-
i0.ɵɵconditionalCreate(9, JobSlideoutComponent_Conditional_9_Template, 4, 1, "div", 6);
|
|
290
|
-
i0.ɵɵelementStart(10, "div", 7)(11, "div", 8);
|
|
291
|
-
i0.ɵɵtext(12, "General");
|
|
292
|
-
i0.ɵɵelementEnd();
|
|
293
|
-
i0.ɵɵelementStart(13, "div", 9)(14, "label", 10);
|
|
294
|
-
i0.ɵɵtext(15, "Name ");
|
|
295
|
-
i0.ɵɵelementStart(16, "span", 11);
|
|
296
|
-
i0.ɵɵtext(17, "*");
|
|
297
|
-
i0.ɵɵelementEnd()();
|
|
298
|
-
i0.ɵɵelementStart(18, "input", 12);
|
|
299
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_input_ngModelChange_18_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Name, $event) || (ctx.Name = $event); return $event; });
|
|
300
|
-
i0.ɵɵelementEnd()();
|
|
301
|
-
i0.ɵɵelementStart(19, "div", 9)(20, "label", 10);
|
|
302
|
-
i0.ɵɵtext(21, "Description");
|
|
303
|
-
i0.ɵɵelementEnd();
|
|
304
|
-
i0.ɵɵelementStart(22, "textarea", 13);
|
|
305
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_textarea_ngModelChange_22_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Description, $event) || (ctx.Description = $event); return $event; });
|
|
306
|
-
i0.ɵɵelementEnd()();
|
|
307
|
-
i0.ɵɵelementStart(23, "div", 14)(24, "div", 9)(25, "label", 10);
|
|
308
|
-
i0.ɵɵtext(26, "Job Type ");
|
|
309
|
-
i0.ɵɵelementStart(27, "span", 11);
|
|
310
|
-
i0.ɵɵtext(28, "*");
|
|
311
|
-
i0.ɵɵelementEnd()();
|
|
312
|
-
i0.ɵɵelementStart(29, "select", 15);
|
|
313
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_select_ngModelChange_29_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.JobTypeID, $event) || (ctx.JobTypeID = $event); return $event; });
|
|
314
|
-
i0.ɵɵrepeaterCreate(30, JobSlideoutComponent_For_31_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
|
|
315
|
-
i0.ɵɵelementEnd()();
|
|
316
|
-
i0.ɵɵelementStart(32, "div", 9)(33, "label", 10);
|
|
317
|
-
i0.ɵɵtext(34, "Status");
|
|
318
|
-
i0.ɵɵelementEnd();
|
|
319
|
-
i0.ɵɵelementStart(35, "select", 15);
|
|
320
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_select_ngModelChange_35_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Status, $event) || (ctx.Status = $event); return $event; });
|
|
321
|
-
i0.ɵɵrepeaterCreate(36, JobSlideoutComponent_For_37_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
|
|
322
|
-
i0.ɵɵelementEnd()()()();
|
|
323
|
-
i0.ɵɵelementStart(38, "div", 7)(39, "div", 8);
|
|
324
|
-
i0.ɵɵtext(40, "Schedule");
|
|
325
|
-
i0.ɵɵelementEnd();
|
|
326
|
-
i0.ɵɵelementStart(41, "div", 9)(42, "label", 10);
|
|
327
|
-
i0.ɵɵtext(43, "Cron Expression ");
|
|
328
|
-
i0.ɵɵelementStart(44, "span", 11);
|
|
329
|
-
i0.ɵɵtext(45, "*");
|
|
330
|
-
i0.ɵɵelementEnd()();
|
|
331
|
-
i0.ɵɵelementStart(46, "input", 17);
|
|
332
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_input_ngModelChange_46_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.CronExpression, $event) || (ctx.CronExpression = $event); return $event; });
|
|
333
|
-
i0.ɵɵelementEnd();
|
|
334
|
-
i0.ɵɵelementStart(47, "div", 18);
|
|
335
|
-
i0.ɵɵtext(48, "e.g., 0 */15 * * * * (every 15 minutes)");
|
|
336
|
-
i0.ɵɵelementEnd()();
|
|
337
|
-
i0.ɵɵelementStart(49, "div", 14)(50, "div", 9)(51, "label", 10);
|
|
338
|
-
i0.ɵɵtext(52, "Timezone");
|
|
339
|
-
i0.ɵɵelementEnd();
|
|
340
|
-
i0.ɵɵelementStart(53, "select", 15);
|
|
341
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_select_ngModelChange_53_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Timezone, $event) || (ctx.Timezone = $event); return $event; });
|
|
342
|
-
i0.ɵɵrepeaterCreate(54, JobSlideoutComponent_For_55_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
|
|
343
|
-
i0.ɵɵelementEnd()();
|
|
344
|
-
i0.ɵɵelementStart(56, "div", 9)(57, "label", 10);
|
|
345
|
-
i0.ɵɵtext(58, "Concurrency");
|
|
346
|
-
i0.ɵɵelementEnd();
|
|
347
|
-
i0.ɵɵelementStart(59, "select", 15);
|
|
348
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_select_ngModelChange_59_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.ConcurrencyMode, $event) || (ctx.ConcurrencyMode = $event); return $event; });
|
|
349
|
-
i0.ɵɵrepeaterCreate(60, JobSlideoutComponent_For_61_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
|
|
350
|
-
i0.ɵɵelementEnd()()()();
|
|
351
|
-
i0.ɵɵelementStart(62, "div", 7)(63, "div", 8);
|
|
352
|
-
i0.ɵɵtext(64, "Configuration");
|
|
353
|
-
i0.ɵɵelementEnd();
|
|
354
|
-
i0.ɵɵelementStart(65, "div", 9)(66, "label", 10);
|
|
355
|
-
i0.ɵɵtext(67, "Configuration JSON");
|
|
356
|
-
i0.ɵɵelementEnd();
|
|
357
|
-
i0.ɵɵelementStart(68, "div", 19)(69, "mj-code-editor", 20);
|
|
358
|
-
i0.ɵɵlistener("change", function JobSlideoutComponent_Template_mj_code_editor_change_69_listener($event) { return ctx.OnConfigurationChange($event); });
|
|
359
|
-
i0.ɵɵelementEnd()();
|
|
360
|
-
i0.ɵɵelementStart(70, "div", 18);
|
|
361
|
-
i0.ɵɵtext(71, "Optional JSON configuration for the job type plugin");
|
|
362
|
-
i0.ɵɵelementEnd()()();
|
|
363
|
-
i0.ɵɵelementStart(72, "div", 7)(73, "div", 8);
|
|
364
|
-
i0.ɵɵtext(74, "Notifications");
|
|
365
|
-
i0.ɵɵelementEnd();
|
|
366
|
-
i0.ɵɵelementStart(75, "div", 21)(76, "label", 22)(77, "input", 23);
|
|
367
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_input_ngModelChange_77_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.NotifyOnSuccess, $event) || (ctx.NotifyOnSuccess = $event); return $event; });
|
|
368
|
-
i0.ɵɵelementEnd();
|
|
369
|
-
i0.ɵɵelementStart(78, "span");
|
|
370
|
-
i0.ɵɵtext(79, "Notify on success");
|
|
371
|
-
i0.ɵɵelementEnd()();
|
|
372
|
-
i0.ɵɵelementStart(80, "label", 22)(81, "input", 23);
|
|
373
|
-
i0.ɵɵtwoWayListener("ngModelChange", function JobSlideoutComponent_Template_input_ngModelChange_81_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.NotifyOnFailure, $event) || (ctx.NotifyOnFailure = $event); return $event; });
|
|
374
|
-
i0.ɵɵelementEnd();
|
|
375
|
-
i0.ɵɵelementStart(82, "span");
|
|
376
|
-
i0.ɵɵtext(83, "Notify on failure");
|
|
377
|
-
i0.ɵɵelementEnd()()()();
|
|
378
|
-
i0.ɵɵconditionalCreate(84, JobSlideoutComponent_Conditional_84_Template, 25, 7, "div", 7);
|
|
379
|
-
i0.ɵɵelementEnd();
|
|
380
|
-
i0.ɵɵelementStart(85, "div", 24)(86, "div", 25);
|
|
381
|
-
i0.ɵɵconditionalCreate(87, JobSlideoutComponent_Conditional_87_Template, 3, 1, "button", 26);
|
|
382
|
-
i0.ɵɵelementEnd();
|
|
383
|
-
i0.ɵɵelementStart(88, "div", 27)(89, "button", 28);
|
|
384
|
-
i0.ɵɵlistener("click", function JobSlideoutComponent_Template_button_click_89_listener() { return ctx.OnClose(); });
|
|
385
|
-
i0.ɵɵtext(90, "Cancel");
|
|
386
|
-
i0.ɵɵelementEnd();
|
|
387
|
-
i0.ɵɵelementStart(91, "button", 29);
|
|
388
|
-
i0.ɵɵlistener("click", function JobSlideoutComponent_Template_button_click_91_listener() { return ctx.Save(); });
|
|
389
|
-
i0.ɵɵconditionalCreate(92, JobSlideoutComponent_Conditional_92_Template, 1, 0, "i", 30);
|
|
390
|
-
i0.ɵɵconditionalCreate(93, JobSlideoutComponent_Conditional_93_Template, 1, 0, "i", 31);
|
|
391
|
-
i0.ɵɵtext(94);
|
|
392
|
-
i0.ɵɵelementEnd()()();
|
|
393
|
-
i0.ɵɵconditionalCreate(95, JobSlideoutComponent_Conditional_95_Template, 14, 3, "div", 32);
|
|
394
|
-
i0.ɵɵelementEnd();
|
|
395
|
-
} if (rf & 2) {
|
|
396
|
-
i0.ɵɵadvance(3);
|
|
397
|
-
i0.ɵɵclassMap(ctx.Mode === "create" ? "fa-solid fa-plus-circle" : "fa-solid fa-pen-to-square");
|
|
398
|
-
i0.ɵɵadvance(2);
|
|
399
|
-
i0.ɵɵtextInterpolate(ctx.Title);
|
|
400
|
-
i0.ɵɵadvance(4);
|
|
401
|
-
i0.ɵɵconditional(ctx.ErrorMessage ? 9 : -1);
|
|
402
|
-
i0.ɵɵadvance(9);
|
|
403
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.Name);
|
|
404
|
-
i0.ɵɵadvance(4);
|
|
405
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.Description);
|
|
406
|
-
i0.ɵɵadvance(7);
|
|
407
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.JobTypeID);
|
|
408
|
-
i0.ɵɵadvance();
|
|
409
|
-
i0.ɵɵrepeater(ctx.JobTypes);
|
|
410
|
-
i0.ɵɵadvance(5);
|
|
411
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.Status);
|
|
412
|
-
i0.ɵɵadvance();
|
|
413
|
-
i0.ɵɵrepeater(ctx.StatusOptions);
|
|
414
|
-
i0.ɵɵadvance(10);
|
|
415
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.CronExpression);
|
|
416
|
-
i0.ɵɵadvance(7);
|
|
417
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.Timezone);
|
|
418
|
-
i0.ɵɵadvance();
|
|
419
|
-
i0.ɵɵrepeater(ctx.TimezoneOptions);
|
|
420
|
-
i0.ɵɵadvance(5);
|
|
421
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.ConcurrencyMode);
|
|
422
|
-
i0.ɵɵadvance();
|
|
423
|
-
i0.ɵɵrepeater(ctx.ConcurrencyOptions);
|
|
424
|
-
i0.ɵɵadvance(9);
|
|
425
|
-
i0.ɵɵproperty("value", ctx.Configuration)("language", "json")("lineWrapping", true)("placeholder", "{ }");
|
|
426
|
-
i0.ɵɵadvance(8);
|
|
427
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.NotifyOnSuccess);
|
|
428
|
-
i0.ɵɵadvance(4);
|
|
429
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.NotifyOnFailure);
|
|
430
|
-
i0.ɵɵadvance(3);
|
|
431
|
-
i0.ɵɵconditional(ctx.Mode === "edit" && ctx.Job ? 84 : -1);
|
|
432
|
-
i0.ɵɵadvance(3);
|
|
433
|
-
i0.ɵɵconditional(ctx.Mode === "edit" ? 87 : -1);
|
|
434
|
-
i0.ɵɵadvance(4);
|
|
435
|
-
i0.ɵɵproperty("disabled", !ctx.IsValid || ctx.IsSaving);
|
|
436
|
-
i0.ɵɵadvance();
|
|
437
|
-
i0.ɵɵconditional(ctx.IsSaving ? 92 : -1);
|
|
438
|
-
i0.ɵɵadvance();
|
|
439
|
-
i0.ɵɵconditional(!ctx.IsSaving ? 93 : -1);
|
|
440
|
-
i0.ɵɵadvance();
|
|
441
|
-
i0.ɵɵtextInterpolate1(" ", ctx.Mode === "create" ? "Create Job" : "Save Changes", " ");
|
|
442
|
-
i0.ɵɵadvance();
|
|
443
|
-
i0.ɵɵconditional(ctx.ShowDeleteConfirm ? 95 : -1);
|
|
444
|
-
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.CodeEditorComponent, i4.DatePipe], styles: [".slideout-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid #e2e8f0;\n background: white;\n flex-shrink: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1.1rem;\n font-weight: 700;\n color: #0f172a;\n}\n\n.slideout-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076b6;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n cursor: pointer;\n color: #64748b;\n transition: all 0.2s;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: #f1f5f9;\n color: #0f172a;\n}\n\n\n\n.slideout-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 10px;\n color: #dc2626;\n font-size: 0.85rem;\n font-weight: 500;\n margin-bottom: 20px;\n}\n\n\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n color: #94a3b8;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 16px;\n padding-bottom: 8px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 0.8rem;\n font-weight: 600;\n color: #334155;\n margin-bottom: 6px;\n}\n\n.required[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 0.85rem;\n color: #0f172a;\n background: white;\n outline: none;\n transition: border-color 0.2s;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n border-color: #0076b6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 0.85rem;\n color: #0f172a;\n background: white;\n outline: none;\n transition: border-color 0.2s;\n resize: vertical;\n font-family: inherit;\n box-sizing: border-box;\n}\n\n.form-textarea[_ngcontent-%COMP%]:focus {\n border-color: #0076b6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.form-textarea.mono[_ngcontent-%COMP%], \n.form-input.mono[_ngcontent-%COMP%] {\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n font-size: 0.8rem;\n}\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n color: #94a3b8;\n margin-top: 4px;\n}\n\n.form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n}\n\n.form-row.checkboxes[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.85rem;\n color: #334155;\n cursor: pointer;\n}\n\n.checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n accent-color: #0076b6;\n}\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: #f8fafc;\n border-radius: 10px;\n border: 1px solid #f1f5f9;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n color: #94a3b8;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n display: block;\n margin-bottom: 4px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n font-weight: 800;\n color: #0f172a;\n}\n\n.stat-value.success[_ngcontent-%COMP%] { color: #10b981; }\n.stat-value.failure[_ngcontent-%COMP%] { color: #ef4444; }\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n border-top: 1px solid #e2e8f0;\n background: #f1f5f9;\n flex-shrink: 0;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 1;\n}\n\n.footer-left[_ngcontent-%COMP%], .footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 24px;\n background: linear-gradient(135deg, #0076b6 0%, #005a8c 100%);\n color: white;\n border: none;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.save-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(0, 118, 182, 0.4);\n}\n\n.save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.cancel-btn[_ngcontent-%COMP%] {\n padding: 10px 20px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 500;\n color: #475569;\n transition: all 0.2s;\n}\n\n.cancel-btn[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n}\n\n.delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 16px;\n background: transparent;\n color: #ef4444;\n border: 1px solid #fecaca;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.delete-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #fef2f2;\n}\n\n.delete-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.confirm-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0,0,0,0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n}\n\n.confirm-dialog[_ngcontent-%COMP%] {\n background: white;\n border-radius: 16px;\n padding: 32px;\n max-width: 360px;\n text-align: center;\n box-shadow: 0 20px 40px rgba(0,0,0,0.2);\n}\n\n.confirm-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fef2f2;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 16px;\n}\n\n.confirm-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: #ef4444;\n}\n\n.confirm-dialog[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n font-weight: 700;\n color: #0f172a;\n margin: 0 0 8px;\n}\n\n.confirm-dialog[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: #64748b;\n margin: 0 0 24px;\n line-height: 1.4;\n}\n\n.confirm-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n.delete-confirm-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 24px;\n background: #ef4444;\n color: white;\n border: none;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 600;\n transition: all 0.2s;\n}\n\n.delete-confirm-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #dc2626;\n}\n\n.delete-confirm-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.code-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n overflow: hidden;\n transition: border-color 0.2s;\n}\n\n.code-editor-wrapper[_ngcontent-%COMP%]:focus-within {\n border-color: #0076b6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.code-editor-wrapper[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n display: block;\n height: 180px;\n}\n\n\n\n@media (max-width: 768px) {\n .slideout-body[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .form-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .form-row.checkboxes[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n }\n\n .code-editor-wrapper[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n height: 140px;\n }\n}\n\n@media (max-width: 480px) {\n .slideout-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .slideout-footer[_ngcontent-%COMP%] {\n padding: 12px 16px;\n flex-direction: column;\n gap: 10px;\n }\n\n .footer-left[_ngcontent-%COMP%], .footer-right[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .footer-right[_ngcontent-%COMP%] {\n justify-content: stretch;\n }\n\n .save-btn[_ngcontent-%COMP%], .cancel-btn[_ngcontent-%COMP%], .delete-btn[_ngcontent-%COMP%] {\n flex: 1;\n justify-content: center;\n }\n\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"], changeDetection: 0 });
|
|
445
|
-
}
|
|
446
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(JobSlideoutComponent, [{
|
|
447
|
-
type: Component,
|
|
448
|
-
args: [{ standalone: false, selector: 'app-job-slideout', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"slideout-container\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i [class]=\"Mode === 'create' ? 'fa-solid fa-plus-circle' : 'fa-solid fa-pen-to-square'\"></i>\n <span>{{Title}}</span>\n </div>\n <button class=\"close-btn\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"slideout-body\">\n <!-- Error -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ErrorMessage}}</span>\n </div>\n }\n\n <!-- Form -->\n <div class=\"form-section\">\n <div class=\"section-title\">General</div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Name <span class=\"required\">*</span></label>\n <input class=\"form-input\" type=\"text\" [(ngModel)]=\"Name\" placeholder=\"e.g., Daily Data Sync\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Description</label>\n <textarea class=\"form-textarea\" [(ngModel)]=\"Description\" rows=\"3\"\n placeholder=\"What does this job do?\"></textarea>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label class=\"form-label\">Job Type <span class=\"required\">*</span></label>\n <select class=\"form-input\" [(ngModel)]=\"JobTypeID\">\n @for (t of JobTypes; track t) {\n <option [value]=\"t.id\">{{t.name}}</option>\n }\n </select>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Status</label>\n <select class=\"form-input\" [(ngModel)]=\"Status\">\n @for (s of StatusOptions; track s) {\n <option [value]=\"s\">{{s}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"form-section\">\n <div class=\"section-title\">Schedule</div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Cron Expression <span class=\"required\">*</span></label>\n <input class=\"form-input mono\" type=\"text\" [(ngModel)]=\"CronExpression\"\n placeholder=\"0 */15 * * * *\" />\n <div class=\"form-hint\">e.g., 0 */15 * * * * (every 15 minutes)</div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label class=\"form-label\">Timezone</label>\n <select class=\"form-input\" [(ngModel)]=\"Timezone\">\n @for (tz of TimezoneOptions; track tz) {\n <option [value]=\"tz\">{{tz}}</option>\n }\n </select>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Concurrency</label>\n <select class=\"form-input\" [(ngModel)]=\"ConcurrencyMode\">\n @for (c of ConcurrencyOptions; track c) {\n <option [value]=\"c\">{{c}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"form-section\">\n <div class=\"section-title\">Configuration</div>\n <div class=\"form-group\">\n <label class=\"form-label\">Configuration JSON</label>\n <div class=\"code-editor-wrapper\">\n <mj-code-editor\n [value]=\"Configuration\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n [placeholder]=\"'{ }'\"\n (change)=\"OnConfigurationChange($event)\">\n </mj-code-editor>\n </div>\n <div class=\"form-hint\">Optional JSON configuration for the job type plugin</div>\n </div>\n </div>\n\n <div class=\"form-section\">\n <div class=\"section-title\">Notifications</div>\n <div class=\"form-row checkboxes\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"NotifyOnSuccess\" />\n <span>Notify on success</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"NotifyOnFailure\" />\n <span>Notify on failure</span>\n </label>\n </div>\n </div>\n\n <!-- Job Stats (Edit Mode) -->\n @if (Mode === 'edit' && Job) {\n <div class=\"form-section\">\n <div class=\"section-title\">Statistics</div>\n <div class=\"stats-grid\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Runs</span>\n <span class=\"stat-value\">{{Job.totalRuns}}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Success</span>\n <span class=\"stat-value success\">{{Job.successCount}}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Failures</span>\n <span class=\"stat-value failure\">{{Job.failureCount}}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Created</span>\n <span class=\"stat-value\">{{Job.createdAt | date:'short'}}</span>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <div class=\"footer-left\">\n @if (Mode === 'edit') {\n <button class=\"delete-btn\" (click)=\"ShowDeleteConfirm = true\"\n [disabled]=\"IsDeleting\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n }\n </div>\n <div class=\"footer-right\">\n <button class=\"cancel-btn\" (click)=\"OnClose()\">Cancel</button>\n <button class=\"save-btn\" (click)=\"Save()\" [disabled]=\"!IsValid || IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @if (!IsSaving) {\n <i class=\"fa-solid fa-check\"></i>\n }\n {{Mode === 'create' ? 'Create Job' : 'Save Changes'}}\n </button>\n </div>\n </div>\n\n <!-- Delete Confirmation -->\n @if (ShowDeleteConfirm) {\n <div class=\"confirm-overlay\">\n <div class=\"confirm-dialog\">\n <div class=\"confirm-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3>Delete Job</h3>\n <p>Are you sure you want to delete \"{{Name}}\"? This action cannot be undone.</p>\n <div class=\"confirm-actions\">\n <button class=\"delete-confirm-btn\" (click)=\"Delete()\" [disabled]=\"IsDeleting\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n Delete\n </button>\n <button class=\"cancel-btn\" (click)=\"ShowDeleteConfirm = false\">Cancel</button>\n </div>\n </div>\n </div>\n }\n</div>\n", styles: [".slideout-container {\n display: flex;\n flex-direction: column;\n height: 100%;\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.slideout-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid #e2e8f0;\n background: white;\n flex-shrink: 0;\n}\n\n.slideout-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1.1rem;\n font-weight: 700;\n color: #0f172a;\n}\n\n.slideout-title i {\n color: #0076b6;\n}\n\n.close-btn {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n cursor: pointer;\n color: #64748b;\n transition: all 0.2s;\n}\n\n.close-btn:hover {\n background: #f1f5f9;\n color: #0f172a;\n}\n\n/* \u2500\u2500 Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.slideout-body {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n.error-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 10px;\n color: #dc2626;\n font-size: 0.85rem;\n font-weight: 500;\n margin-bottom: 20px;\n}\n\n/* \u2500\u2500 Form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.form-section {\n margin-bottom: 28px;\n}\n\n.section-title {\n font-size: 0.7rem;\n font-weight: 700;\n color: #94a3b8;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 16px;\n padding-bottom: 8px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.form-group {\n margin-bottom: 16px;\n}\n\n.form-label {\n display: block;\n font-size: 0.8rem;\n font-weight: 600;\n color: #334155;\n margin-bottom: 6px;\n}\n\n.required {\n color: #ef4444;\n}\n\n.form-input {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 0.85rem;\n color: #0f172a;\n background: white;\n outline: none;\n transition: border-color 0.2s;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n border-color: #0076b6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.form-textarea {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 0.85rem;\n color: #0f172a;\n background: white;\n outline: none;\n transition: border-color 0.2s;\n resize: vertical;\n font-family: inherit;\n box-sizing: border-box;\n}\n\n.form-textarea:focus {\n border-color: #0076b6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.form-textarea.mono,\n.form-input.mono {\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n font-size: 0.8rem;\n}\n\n.form-hint {\n font-size: 0.7rem;\n color: #94a3b8;\n margin-top: 4px;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n}\n\n.form-row.checkboxes {\n display: flex;\n gap: 24px;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.85rem;\n color: #334155;\n cursor: pointer;\n}\n\n.checkbox-label input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n accent-color: #0076b6;\n}\n\n/* \u2500\u2500 Stats Grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.stats-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.stat-item {\n padding: 12px 16px;\n background: #f8fafc;\n border-radius: 10px;\n border: 1px solid #f1f5f9;\n}\n\n.stat-label {\n font-size: 0.7rem;\n font-weight: 700;\n color: #94a3b8;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n display: block;\n margin-bottom: 4px;\n}\n\n.stat-value {\n font-size: 1.1rem;\n font-weight: 800;\n color: #0f172a;\n}\n\n.stat-value.success { color: #10b981; }\n.stat-value.failure { color: #ef4444; }\n\n/* \u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.slideout-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n border-top: 1px solid #e2e8f0;\n background: #f1f5f9;\n flex-shrink: 0;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 1;\n}\n\n.footer-left, .footer-right {\n display: flex;\n gap: 8px;\n}\n\n.save-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 24px;\n background: linear-gradient(135deg, #0076b6 0%, #005a8c 100%);\n color: white;\n border: none;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.save-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(0, 118, 182, 0.4);\n}\n\n.save-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.cancel-btn {\n padding: 10px 20px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 500;\n color: #475569;\n transition: all 0.2s;\n}\n\n.cancel-btn:hover {\n background: #f3f4f6;\n}\n\n.delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 16px;\n background: transparent;\n color: #ef4444;\n border: 1px solid #fecaca;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.delete-btn:hover:not(:disabled) {\n background: #fef2f2;\n}\n\n.delete-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* \u2500\u2500 Delete Confirmation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.confirm-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0,0,0,0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n}\n\n.confirm-dialog {\n background: white;\n border-radius: 16px;\n padding: 32px;\n max-width: 360px;\n text-align: center;\n box-shadow: 0 20px 40px rgba(0,0,0,0.2);\n}\n\n.confirm-icon {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fef2f2;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 16px;\n}\n\n.confirm-icon i {\n font-size: 1.5rem;\n color: #ef4444;\n}\n\n.confirm-dialog h3 {\n font-size: 1.1rem;\n font-weight: 700;\n color: #0f172a;\n margin: 0 0 8px;\n}\n\n.confirm-dialog p {\n font-size: 0.85rem;\n color: #64748b;\n margin: 0 0 24px;\n line-height: 1.4;\n}\n\n.confirm-actions {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n.delete-confirm-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 24px;\n background: #ef4444;\n color: white;\n border: none;\n border-radius: 10px;\n cursor: pointer;\n font-size: 0.85rem;\n font-weight: 600;\n transition: all 0.2s;\n}\n\n.delete-confirm-btn:hover:not(:disabled) {\n background: #dc2626;\n}\n\n.delete-confirm-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* \u2500\u2500 Code Editor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.code-editor-wrapper {\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n overflow: hidden;\n transition: border-color 0.2s;\n}\n\n.code-editor-wrapper:focus-within {\n border-color: #0076b6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.code-editor-wrapper mj-code-editor {\n display: block;\n height: 180px;\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 */\n@media (max-width: 768px) {\n .slideout-body {\n padding: 16px;\n }\n\n .form-row {\n grid-template-columns: 1fr;\n }\n\n .form-row.checkboxes {\n flex-direction: column;\n gap: 12px;\n }\n\n .code-editor-wrapper mj-code-editor {\n height: 140px;\n }\n}\n\n@media (max-width: 480px) {\n .slideout-header {\n padding: 16px;\n }\n\n .slideout-footer {\n padding: 12px 16px;\n flex-direction: column;\n gap: 10px;\n }\n\n .footer-left, .footer-right {\n width: 100%;\n }\n\n .footer-right {\n justify-content: stretch;\n }\n\n .save-btn, .cancel-btn, .delete-btn {\n flex: 1;\n justify-content: center;\n }\n\n .stats-grid {\n grid-template-columns: 1fr;\n }\n}\n"] }]
|
|
449
|
-
}], () => [{ type: i1.SchedulingInstrumentationService }, { type: i0.ChangeDetectorRef }], { Mode: [{
|
|
450
|
-
type: Input
|
|
451
|
-
}], Job: [{
|
|
452
|
-
type: Input
|
|
453
|
-
}], Close: [{
|
|
454
|
-
type: Output
|
|
455
|
-
}], Saved: [{
|
|
456
|
-
type: Output
|
|
457
|
-
}] }); })();
|
|
458
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JobSlideoutComponent, { className: "JobSlideoutComponent", filePath: "src/Scheduling/components/job-slideout.component.ts", lineNumber: 11 }); })();
|
|
459
|
-
//# sourceMappingURL=job-slideout.component.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job-slideout.component.js","sourceRoot":"","sources":["../../../src/Scheduling/components/job-slideout.component.ts","../../../src/Scheduling/components/job-slideout.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { SchedulingInstrumentationService, JobStatistics } from '../services/scheduling-instrumentation.service';\n\n@Component({\n standalone: false,\n selector: 'app-job-slideout',\n templateUrl: './job-slideout.component.html',\n styleUrls: ['./job-slideout.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class JobSlideoutComponent implements OnInit {\n @Input() Mode: 'create' | 'edit' = 'create';\n @Input() Job: JobStatistics | null = null;\n @Output() Close = new EventEmitter<void>();\n @Output() Saved = new EventEmitter<void>();\n\n public JobTypes: { id: string; name: string }[] = [];\n public IsSaving = false;\n public IsDeleting = false;\n public ShowDeleteConfirm = false;\n public ErrorMessage = '';\n\n // Form fields\n public Name = '';\n public Description = '';\n public JobTypeID = '';\n public CronExpression = '';\n public Timezone = 'UTC';\n public Status: 'Pending' | 'Active' | 'Paused' | 'Disabled' | 'Expired' = 'Pending';\n public ConcurrencyMode: 'Concurrent' | 'Queue' | 'Skip' = 'Skip';\n public Configuration = '';\n public NotifyOnSuccess = false;\n public NotifyOnFailure = true;\n\n public StatusOptions = ['Pending', 'Active', 'Paused', 'Disabled'];\n public ConcurrencyOptions = ['Skip', 'Queue', 'Concurrent'];\n public TimezoneOptions = [\n 'UTC',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'America/Phoenix',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'Asia/Tokyo',\n 'Asia/Shanghai',\n 'Australia/Sydney',\n 'Pacific/Auckland'\n ];\n\n constructor(\n private schedulingService: SchedulingInstrumentationService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.loadJobTypes();\n if (this.Mode === 'edit' && this.Job) {\n this.populateFromJob();\n }\n }\n\n private async loadJobTypes(): Promise<void> {\n this.JobTypes = await this.schedulingService.loadJobTypesForDropdown();\n if (this.Mode === 'create' && this.JobTypes.length > 0 && !this.JobTypeID) {\n this.JobTypeID = this.JobTypes[0].id;\n }\n this.cdr.markForCheck();\n }\n\n private populateFromJob(): void {\n if (!this.Job) return;\n this.Name = this.Job.jobName;\n this.Description = this.Job.description || '';\n this.JobTypeID = this.Job.jobTypeId;\n this.CronExpression = this.Job.cronExpression;\n this.Timezone = this.Job.timezone;\n this.Status = this.Job.status as 'Pending' | 'Active' | 'Paused' | 'Disabled';\n this.ConcurrencyMode = this.Job.concurrencyMode as 'Concurrent' | 'Queue' | 'Skip';\n this.Configuration = this.Job.configuration || '';\n this.NotifyOnSuccess = this.Job.notifyOnSuccess;\n this.NotifyOnFailure = this.Job.notifyOnFailure;\n }\n\n public get IsValid(): boolean {\n return !!(this.Name.trim() && this.JobTypeID && this.CronExpression.trim());\n }\n\n public get Title(): string {\n return this.Mode === 'create' ? 'Create New Job' : 'Edit Job';\n }\n\n public async Save(): Promise<void> {\n if (!this.IsValid || this.IsSaving) return;\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n this.cdr.markForCheck();\n\n const data = {\n Name: this.Name.trim(),\n Description: this.Description.trim() || null,\n JobTypeID: this.JobTypeID,\n CronExpression: this.CronExpression.trim(),\n Timezone: this.Timezone,\n Status: this.Status,\n ConcurrencyMode: this.ConcurrencyMode,\n Configuration: this.Configuration.trim() || null,\n NotifyOnSuccess: this.NotifyOnSuccess,\n NotifyOnFailure: this.NotifyOnFailure\n };\n\n const jobId = this.Mode === 'edit' && this.Job ? this.Job.jobId : null;\n const success = await this.schedulingService.saveJob(jobId, data);\n\n this.IsSaving = false;\n\n if (success) {\n this.Saved.emit();\n } else {\n this.ErrorMessage = 'Failed to save job. Please try again.';\n }\n this.cdr.markForCheck();\n }\n\n public async Delete(): Promise<void> {\n if (!this.Job || this.IsDeleting) return;\n\n this.IsDeleting = true;\n this.ErrorMessage = '';\n this.cdr.markForCheck();\n\n const success = await this.schedulingService.deleteJob(this.Job.jobId);\n\n this.IsDeleting = false;\n\n if (success) {\n this.Saved.emit();\n } else {\n this.ErrorMessage = 'Failed to delete job. It may have dependent records.';\n this.ShowDeleteConfirm = false;\n }\n this.cdr.markForCheck();\n }\n\n public OnConfigurationChange(value: string): void {\n this.Configuration = value;\n this.cdr.markForCheck();\n }\n\n public OnClose(): void {\n this.Close.emit();\n }\n}\n","<div class=\"slideout-container\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i [class]=\"Mode === 'create' ? 'fa-solid fa-plus-circle' : 'fa-solid fa-pen-to-square'\"></i>\n <span>{{Title}}</span>\n </div>\n <button class=\"close-btn\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"slideout-body\">\n <!-- Error -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ErrorMessage}}</span>\n </div>\n }\n\n <!-- Form -->\n <div class=\"form-section\">\n <div class=\"section-title\">General</div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Name <span class=\"required\">*</span></label>\n <input class=\"form-input\" type=\"text\" [(ngModel)]=\"Name\" placeholder=\"e.g., Daily Data Sync\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Description</label>\n <textarea class=\"form-textarea\" [(ngModel)]=\"Description\" rows=\"3\"\n placeholder=\"What does this job do?\"></textarea>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label class=\"form-label\">Job Type <span class=\"required\">*</span></label>\n <select class=\"form-input\" [(ngModel)]=\"JobTypeID\">\n @for (t of JobTypes; track t) {\n <option [value]=\"t.id\">{{t.name}}</option>\n }\n </select>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Status</label>\n <select class=\"form-input\" [(ngModel)]=\"Status\">\n @for (s of StatusOptions; track s) {\n <option [value]=\"s\">{{s}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"form-section\">\n <div class=\"section-title\">Schedule</div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Cron Expression <span class=\"required\">*</span></label>\n <input class=\"form-input mono\" type=\"text\" [(ngModel)]=\"CronExpression\"\n placeholder=\"0 */15 * * * *\" />\n <div class=\"form-hint\">e.g., 0 */15 * * * * (every 15 minutes)</div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label class=\"form-label\">Timezone</label>\n <select class=\"form-input\" [(ngModel)]=\"Timezone\">\n @for (tz of TimezoneOptions; track tz) {\n <option [value]=\"tz\">{{tz}}</option>\n }\n </select>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Concurrency</label>\n <select class=\"form-input\" [(ngModel)]=\"ConcurrencyMode\">\n @for (c of ConcurrencyOptions; track c) {\n <option [value]=\"c\">{{c}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"form-section\">\n <div class=\"section-title\">Configuration</div>\n <div class=\"form-group\">\n <label class=\"form-label\">Configuration JSON</label>\n <div class=\"code-editor-wrapper\">\n <mj-code-editor\n [value]=\"Configuration\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n [placeholder]=\"'{ }'\"\n (change)=\"OnConfigurationChange($event)\">\n </mj-code-editor>\n </div>\n <div class=\"form-hint\">Optional JSON configuration for the job type plugin</div>\n </div>\n </div>\n\n <div class=\"form-section\">\n <div class=\"section-title\">Notifications</div>\n <div class=\"form-row checkboxes\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"NotifyOnSuccess\" />\n <span>Notify on success</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"NotifyOnFailure\" />\n <span>Notify on failure</span>\n </label>\n </div>\n </div>\n\n <!-- Job Stats (Edit Mode) -->\n @if (Mode === 'edit' && Job) {\n <div class=\"form-section\">\n <div class=\"section-title\">Statistics</div>\n <div class=\"stats-grid\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Runs</span>\n <span class=\"stat-value\">{{Job.totalRuns}}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Success</span>\n <span class=\"stat-value success\">{{Job.successCount}}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Failures</span>\n <span class=\"stat-value failure\">{{Job.failureCount}}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Created</span>\n <span class=\"stat-value\">{{Job.createdAt | date:'short'}}</span>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <div class=\"footer-left\">\n @if (Mode === 'edit') {\n <button class=\"delete-btn\" (click)=\"ShowDeleteConfirm = true\"\n [disabled]=\"IsDeleting\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n }\n </div>\n <div class=\"footer-right\">\n <button class=\"cancel-btn\" (click)=\"OnClose()\">Cancel</button>\n <button class=\"save-btn\" (click)=\"Save()\" [disabled]=\"!IsValid || IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @if (!IsSaving) {\n <i class=\"fa-solid fa-check\"></i>\n }\n {{Mode === 'create' ? 'Create Job' : 'Save Changes'}}\n </button>\n </div>\n </div>\n\n <!-- Delete Confirmation -->\n @if (ShowDeleteConfirm) {\n <div class=\"confirm-overlay\">\n <div class=\"confirm-dialog\">\n <div class=\"confirm-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3>Delete Job</h3>\n <p>Are you sure you want to delete \"{{Name}}\"? This action cannot be undone.</p>\n <div class=\"confirm-actions\">\n <button class=\"delete-confirm-btn\" (click)=\"Delete()\" [disabled]=\"IsDeleting\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n Delete\n </button>\n <button class=\"cancel-btn\" (click)=\"ShowDeleteConfirm = false\">Cancel</button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|