@memberjunction/ng-dashboards 5.35.0 → 5.36.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.
Files changed (159) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +3 -3
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  11. package/dist/AI/components/models/model-management.component.js +4 -4
  12. package/dist/AI/components/models/model-management.component.js.map +1 -1
  13. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  14. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  15. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  16. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  17. package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
  18. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  19. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  20. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  22. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +137 -142
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/execution-monitoring.component.js +111 -116
  26. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  27. package/dist/Admin/admin-data-schema.component.js +13 -65
  28. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  29. package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
  30. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  31. package/dist/Admin/admin-identity-access.component.js +13 -65
  32. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  33. package/dist/Admin/admin-monitoring.component.js +13 -65
  34. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  35. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  36. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  37. package/dist/Admin/base-admin-container.component.js +26 -17
  38. package/dist/Admin/base-admin-container.component.js.map +1 -1
  39. package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
  40. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  41. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  42. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  43. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  44. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  45. package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
  46. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  47. package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
  48. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  49. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
  50. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  51. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  52. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  53. package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
  54. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  55. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  56. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  57. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
  58. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  59. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  60. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  61. package/dist/DevTools/app-state-inspector.component.js +46 -72
  62. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  63. package/dist/DevTools/class-registry.component.js +88 -100
  64. package/dist/DevTools/class-registry.component.js.map +1 -1
  65. package/dist/DevTools/event-monitor.component.js +158 -168
  66. package/dist/DevTools/event-monitor.component.js.map +1 -1
  67. package/dist/DevTools/graphql-console.component.js +257 -264
  68. package/dist/DevTools/graphql-console.component.js.map +1 -1
  69. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  70. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  71. package/dist/DevTools/layout-inspector.component.js +46 -64
  72. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  73. package/dist/DevTools/lazy-module-status.component.js +75 -84
  74. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  75. package/dist/DevTools/settings-explorer.component.js +76 -85
  76. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
  80. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  81. package/dist/Integration/components/activity/activity.component.js +97 -99
  82. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  83. package/dist/Integration/components/connections/connections.component.js +842 -855
  84. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  85. package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
  86. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  87. package/dist/Integration/components/schedules/schedules.component.js +78 -89
  88. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  89. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  90. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  91. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
  92. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  93. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  94. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  95. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
  96. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  97. package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
  98. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  99. package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
  100. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  101. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  102. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  103. package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
  104. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  105. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  106. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  107. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  108. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  109. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  110. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  111. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  112. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  113. package/dist/Lists/index.d.ts +1 -0
  114. package/dist/Lists/index.d.ts.map +1 -1
  115. package/dist/Lists/index.js +1 -0
  116. package/dist/Lists/index.js.map +1 -1
  117. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  118. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  119. package/dist/Lists/services/list-set-operations.service.js +236 -10
  120. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  121. package/dist/MCP/mcp-dashboard.component.js +19 -19
  122. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  123. package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
  124. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  125. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  126. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  127. package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
  128. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  129. package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
  130. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  131. package/dist/Testing/components/testing-explorer.component.js +543 -629
  132. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  133. package/dist/Testing/testing-dashboard.component.js +50 -49
  134. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  135. package/dist/ai-dashboards.module.d.ts +1 -1
  136. package/dist/ai-dashboards.module.d.ts.map +1 -1
  137. package/dist/ai-dashboards.module.js +16 -1
  138. package/dist/ai-dashboards.module.js.map +1 -1
  139. package/dist/communication-dashboards.module.d.ts +9 -7
  140. package/dist/communication-dashboards.module.d.ts.map +1 -1
  141. package/dist/communication-dashboards.module.js +13 -4
  142. package/dist/communication-dashboards.module.js.map +1 -1
  143. package/dist/core-dashboards.module.d.ts +1 -1
  144. package/dist/core-dashboards.module.d.ts.map +1 -1
  145. package/dist/core-dashboards.module.js +16 -1
  146. package/dist/core-dashboards.module.js.map +1 -1
  147. package/dist/lists-dashboards.module.d.ts +10 -9
  148. package/dist/lists-dashboards.module.d.ts.map +1 -1
  149. package/dist/lists-dashboards.module.js +13 -2
  150. package/dist/lists-dashboards.module.js.map +1 -1
  151. package/dist/public-api.d.ts +1 -0
  152. package/dist/public-api.d.ts.map +1 -1
  153. package/dist/public-api.js +1 -0
  154. package/dist/public-api.js.map +1 -1
  155. package/dist/testing-dashboards.module.d.ts +1 -1
  156. package/dist/testing-dashboards.module.d.ts.map +1 -1
  157. package/dist/testing-dashboards.module.js +13 -1
  158. package/dist/testing-dashboards.module.js.map +1 -1
  159. package/package.json +53 -52
@@ -12,33 +12,22 @@ import { IntegrationDataService, ResolveIntegrationIcon } from '../../services/i
12
12
  import * as i0 from "@angular/core";
13
13
  import * as i1 from "@memberjunction/ng-ui-components";
14
14
  import * as i2 from "@memberjunction/ng-shared-generic";
15
- function SchedulesComponent_Conditional_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelement(0, "mj-stat-badge", 8);
17
- } if (rf & 2) {
18
- const ctx_r0 = i0.ɵɵnextContext(2);
19
- i0.ɵɵproperty("Count", ctx_r0.LockedCount);
20
- } }
21
15
  function SchedulesComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
22
16
  i0.ɵɵelementStart(0, "div", 1);
23
- i0.ɵɵelement(1, "mj-stat-badge", 6)(2, "mj-stat-badge", 7);
24
- i0.ɵɵconditionalCreate(3, SchedulesComponent_Conditional_2_Conditional_3_Template, 1, 1, "mj-stat-badge", 8);
17
+ i0.ɵɵelement(1, "mj-stat-badge", 6);
25
18
  i0.ɵɵelementEnd();
26
19
  } if (rf & 2) {
27
20
  const ctx_r0 = i0.ɵɵnextContext();
28
21
  i0.ɵɵadvance();
29
- i0.ɵɵproperty("Count", ctx_r0.Schedules.length)("Label", ctx_r0.Schedules.length === 1 ? "integration" : "integrations");
30
- i0.ɵɵadvance();
31
- i0.ɵɵproperty("Count", ctx_r0.ScheduledCount);
32
- i0.ɵɵadvance();
33
- i0.ɵɵconditional(ctx_r0.LockedCount > 0 ? 3 : -1);
22
+ i0.ɵɵproperty("Count", ctx_r0.LockedCount);
34
23
  } }
35
24
  function SchedulesComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
36
25
  i0.ɵɵelementStart(0, "div", 4);
37
- i0.ɵɵelement(1, "mj-loading", 9);
26
+ i0.ɵɵelement(1, "mj-loading", 7);
38
27
  i0.ɵɵelementEnd();
39
28
  } }
40
29
  function SchedulesComponent_Conditional_7_Conditional_1_For_9_Conditional_0_Template(rf, ctx) { if (rf & 1) {
41
- i0.ɵɵelementStart(0, "span", 22);
30
+ i0.ɵɵelementStart(0, "span", 20);
42
31
  i0.ɵɵtext(1);
43
32
  i0.ɵɵelementEnd();
44
33
  } if (rf & 2) {
@@ -49,26 +38,26 @@ function SchedulesComponent_Conditional_7_Conditional_1_For_9_Conditional_0_Temp
49
38
  i0.ɵɵtextInterpolate1(" ", hour_r2, ":00 ");
50
39
  } }
51
40
  function SchedulesComponent_Conditional_7_Conditional_1_For_9_Template(rf, ctx) { if (rf & 1) {
52
- i0.ɵɵconditionalCreate(0, SchedulesComponent_Conditional_7_Conditional_1_For_9_Conditional_0_Template, 2, 3, "span", 21);
41
+ i0.ɵɵconditionalCreate(0, SchedulesComponent_Conditional_7_Conditional_1_For_9_Conditional_0_Template, 2, 3, "span", 19);
53
42
  } if (rf & 2) {
54
43
  const hour_r2 = ctx.$implicit;
55
44
  i0.ɵɵconditional(hour_r2 % 4 === 0 ? 0 : -1);
56
45
  } }
57
46
  function SchedulesComponent_Conditional_7_Conditional_1_For_11_For_5_Conditional_0_Template(rf, ctx) { if (rf & 1) {
58
- i0.ɵɵelement(0, "div", 30);
47
+ i0.ɵɵelement(0, "div", 28);
59
48
  } if (rf & 2) {
60
49
  const hour_r3 = i0.ɵɵnextContext().$implicit;
61
50
  const ctx_r0 = i0.ɵɵnextContext(4);
62
51
  i0.ɵɵstyleProp("left", ctx_r0.ComputeTimelinePosition(hour_r3, 0), "%");
63
52
  } }
64
53
  function SchedulesComponent_Conditional_7_Conditional_1_For_11_For_5_Template(rf, ctx) { if (rf & 1) {
65
- i0.ɵɵconditionalCreate(0, SchedulesComponent_Conditional_7_Conditional_1_For_11_For_5_Conditional_0_Template, 1, 2, "div", 29);
54
+ i0.ɵɵconditionalCreate(0, SchedulesComponent_Conditional_7_Conditional_1_For_11_For_5_Conditional_0_Template, 1, 2, "div", 27);
66
55
  } if (rf & 2) {
67
56
  const hour_r3 = ctx.$implicit;
68
57
  i0.ɵɵconditional(hour_r3 % 4 === 0 ? 0 : -1);
69
58
  } }
70
59
  function SchedulesComponent_Conditional_7_Conditional_1_For_11_For_8_Template(rf, ctx) { if (rf & 1) {
71
- i0.ɵɵelement(0, "div", 31);
60
+ i0.ɵɵelement(0, "div", 29);
72
61
  } if (rf & 2) {
73
62
  const marker_r4 = ctx.$implicit;
74
63
  const ctx_r0 = i0.ɵɵnextContext(4);
@@ -77,20 +66,20 @@ function SchedulesComponent_Conditional_7_Conditional_1_For_11_For_8_Template(rf
77
66
  i0.ɵɵproperty("title", marker_r4.Hour + ":" + ("" + marker_r4.Minute).padStart(2, "0"));
78
67
  } }
79
68
  function SchedulesComponent_Conditional_7_Conditional_1_For_11_Conditional_9_Template(rf, ctx) { if (rf & 1) {
80
- i0.ɵɵelementStart(0, "div", 27);
81
- i0.ɵɵelement(1, "i", 32);
69
+ i0.ɵɵelementStart(0, "div", 25);
70
+ i0.ɵɵelement(1, "i", 30);
82
71
  i0.ɵɵelementEnd();
83
72
  } }
84
73
  function SchedulesComponent_Conditional_7_Conditional_1_For_11_Template(rf, ctx) { if (rf & 1) {
85
- i0.ɵɵelementStart(0, "div", 20)(1, "div", 23);
74
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 21);
86
75
  i0.ɵɵtext(2);
87
76
  i0.ɵɵelementEnd();
88
- i0.ɵɵelementStart(3, "div", 24);
77
+ i0.ɵɵelementStart(3, "div", 22);
89
78
  i0.ɵɵrepeaterCreate(4, SchedulesComponent_Conditional_7_Conditional_1_For_11_For_5_Template, 1, 1, null, null, i0.ɵɵcomponentInstance().TrackHour, true);
90
- i0.ɵɵelement(6, "div", 25);
91
- i0.ɵɵrepeaterCreate(7, SchedulesComponent_Conditional_7_Conditional_1_For_11_For_8_Template, 1, 5, "div", 26, i0.ɵɵcomponentInstance().TrackMarker, true);
92
- i0.ɵɵconditionalCreate(9, SchedulesComponent_Conditional_7_Conditional_1_For_11_Conditional_9_Template, 2, 0, "div", 27);
93
- i0.ɵɵelement(10, "div", 28);
79
+ i0.ɵɵelement(6, "div", 23);
80
+ i0.ɵɵrepeaterCreate(7, SchedulesComponent_Conditional_7_Conditional_1_For_11_For_8_Template, 1, 5, "div", 24, i0.ɵɵcomponentInstance().TrackMarker, true);
81
+ i0.ɵɵconditionalCreate(9, SchedulesComponent_Conditional_7_Conditional_1_For_11_Conditional_9_Template, 2, 0, "div", 25);
82
+ i0.ɵɵelement(10, "div", 26);
94
83
  i0.ɵɵelementEnd()();
95
84
  } if (rf & 2) {
96
85
  const row_r5 = ctx.$implicit;
@@ -107,16 +96,16 @@ function SchedulesComponent_Conditional_7_Conditional_1_For_11_Template(rf, ctx)
107
96
  i0.ɵɵconditional(row_r5.IsLocked ? 9 : -1);
108
97
  } }
109
98
  function SchedulesComponent_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
110
- i0.ɵɵelementStart(0, "div", 10)(1, "div", 14);
111
- i0.ɵɵelement(2, "i", 15);
99
+ i0.ɵɵelementStart(0, "div", 8)(1, "div", 12);
100
+ i0.ɵɵelement(2, "i", 13);
112
101
  i0.ɵɵtext(3, " Next 24 Hours ");
113
102
  i0.ɵɵelementEnd();
114
- i0.ɵɵelementStart(4, "div", 16)(5, "div", 17);
115
- i0.ɵɵelement(6, "div", 18);
116
- i0.ɵɵelementStart(7, "div", 19);
103
+ i0.ɵɵelementStart(4, "div", 14)(5, "div", 15);
104
+ i0.ɵɵelement(6, "div", 16);
105
+ i0.ɵɵelementStart(7, "div", 17);
117
106
  i0.ɵɵrepeaterCreate(8, SchedulesComponent_Conditional_7_Conditional_1_For_9_Template, 1, 1, null, null, i0.ɵɵcomponentInstance().TrackHour, true);
118
107
  i0.ɵɵelementEnd()();
119
- i0.ɵɵrepeaterCreate(10, SchedulesComponent_Conditional_7_Conditional_1_For_11_Template, 11, 3, "div", 20, i0.ɵɵcomponentInstance().TrackTimelineByID, true);
108
+ i0.ɵɵrepeaterCreate(10, SchedulesComponent_Conditional_7_Conditional_1_For_11_Template, 11, 3, "div", 18, i0.ɵɵcomponentInstance().TrackTimelineByID, true);
120
109
  i0.ɵɵelementEnd()();
121
110
  } if (rf & 2) {
122
111
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -126,24 +115,24 @@ function SchedulesComponent_Conditional_7_Conditional_1_Template(rf, ctx) { if (
126
115
  i0.ɵɵrepeater(ctx_r0.TimelineMarkers);
127
116
  } }
128
117
  function SchedulesComponent_Conditional_7_For_4_Conditional_10_Template(rf, ctx) { if (rf & 1) {
129
- i0.ɵɵelementStart(0, "span", 40);
118
+ i0.ɵɵelementStart(0, "span", 38);
130
119
  i0.ɵɵtext(1, "Active");
131
120
  i0.ɵɵelementEnd();
132
121
  } }
133
122
  function SchedulesComponent_Conditional_7_For_4_Conditional_11_Template(rf, ctx) { if (rf & 1) {
134
- i0.ɵɵelementStart(0, "span", 41);
123
+ i0.ɵɵelementStart(0, "span", 39);
135
124
  i0.ɵɵtext(1, "Inactive");
136
125
  i0.ɵɵelementEnd();
137
126
  } }
138
127
  function SchedulesComponent_Conditional_7_For_4_Conditional_12_Template(rf, ctx) { if (rf & 1) {
139
- i0.ɵɵelementStart(0, "span", 42);
140
- i0.ɵɵelement(1, "i", 32);
128
+ i0.ɵɵelementStart(0, "span", 40);
129
+ i0.ɵɵelement(1, "i", 30);
141
130
  i0.ɵɵtext(2, " Running ");
142
131
  i0.ɵɵelementEnd();
143
132
  } }
144
133
  function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_For_3_Template(rf, ctx) { if (rf & 1) {
145
134
  const _r10 = i0.ɵɵgetCurrentView();
146
- i0.ɵɵelementStart(0, "button", 65);
135
+ i0.ɵɵelementStart(0, "button", 63);
147
136
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_For_3_Template_button_click_0_listener() { const preset_r11 = i0.ɵɵrestoreView(_r10).$implicit; const schedule_r7 = i0.ɵɵnextContext(3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SetInterval(schedule_r7.ID, preset_r11.Minutes)); });
148
137
  i0.ɵɵtext(1);
149
138
  i0.ɵɵelementEnd();
@@ -157,13 +146,13 @@ function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_For
157
146
  } }
158
147
  function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_Template(rf, ctx) { if (rf & 1) {
159
148
  const _r9 = i0.ɵɵgetCurrentView();
160
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 60);
161
- i0.ɵɵrepeaterCreate(2, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_For_3_Template, 2, 3, "button", 61, i0.ɵɵcomponentInstance().TrackPresetByMinutes, true);
149
+ i0.ɵɵelementStart(0, "div", 42)(1, "div", 58);
150
+ i0.ɵɵrepeaterCreate(2, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_For_3_Template, 2, 3, "button", 59, i0.ɵɵcomponentInstance().TrackPresetByMinutes, true);
162
151
  i0.ɵɵelementEnd();
163
- i0.ɵɵelementStart(4, "div", 62)(5, "input", 63);
152
+ i0.ɵɵelementStart(4, "div", 60)(5, "input", 61);
164
153
  i0.ɵɵlistener("change", function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_Template_input_change_5_listener($event) { i0.ɵɵrestoreView(_r9); const schedule_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SetCustomInterval(schedule_r7.ID, $event)); });
165
154
  i0.ɵɵelementEnd();
166
- i0.ɵɵelementStart(6, "span", 64);
155
+ i0.ɵɵelementStart(6, "span", 62);
167
156
  i0.ɵɵtext(7, "min");
168
157
  i0.ɵɵelementEnd()()();
169
158
  } if (rf & 2) {
@@ -176,7 +165,7 @@ function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_Tem
176
165
  } }
177
166
  function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_For_3_Template(rf, ctx) { if (rf & 1) {
178
167
  const _r13 = i0.ɵɵgetCurrentView();
179
- i0.ɵɵelementStart(0, "button", 65);
168
+ i0.ɵɵelementStart(0, "button", 63);
180
169
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_For_3_Template_button_click_0_listener() { const preset_r14 = i0.ɵɵrestoreView(_r13).$implicit; const schedule_r7 = i0.ɵɵnextContext(3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SetCronExpression(schedule_r7.ID, preset_r14.Expression)); });
181
170
  i0.ɵɵtext(1);
182
171
  i0.ɵɵelementEnd();
@@ -189,7 +178,7 @@ function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_For
189
178
  i0.ɵɵtextInterpolate1(" ", preset_r14.Label, " ");
190
179
  } }
191
180
  function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
192
- i0.ɵɵelementStart(0, "span", 69);
181
+ i0.ɵɵelementStart(0, "span", 67);
193
182
  i0.ɵɵtext(1);
194
183
  i0.ɵɵelementEnd();
195
184
  } if (rf & 2) {
@@ -200,13 +189,13 @@ function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Con
200
189
  } }
201
190
  function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Template(rf, ctx) { if (rf & 1) {
202
191
  const _r12 = i0.ɵɵgetCurrentView();
203
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 66);
204
- i0.ɵɵrepeaterCreate(2, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_For_3_Template, 2, 3, "button", 61, i0.ɵɵcomponentInstance().TrackCronPresetByExpr, true);
192
+ i0.ɵɵelementStart(0, "div", 42)(1, "div", 64);
193
+ i0.ɵɵrepeaterCreate(2, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_For_3_Template, 2, 3, "button", 59, i0.ɵɵcomponentInstance().TrackCronPresetByExpr, true);
205
194
  i0.ɵɵelementEnd();
206
- i0.ɵɵelementStart(4, "div", 67)(5, "input", 68);
195
+ i0.ɵɵelementStart(4, "div", 65)(5, "input", 66);
207
196
  i0.ɵɵlistener("change", function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Template_input_change_5_listener($event) { i0.ɵɵrestoreView(_r12); const schedule_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnCronInputChange(schedule_r7.ID, $event)); });
208
197
  i0.ɵɵelementEnd();
209
- i0.ɵɵconditionalCreate(6, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Conditional_6_Template, 2, 1, "span", 69);
198
+ i0.ɵɵconditionalCreate(6, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Conditional_6_Template, 2, 1, "span", 67);
210
199
  i0.ɵɵelementEnd()();
211
200
  } if (rf & 2) {
212
201
  const schedule_r7 = i0.ɵɵnextContext(2).$implicit;
@@ -220,20 +209,20 @@ function SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Tem
220
209
  } }
221
210
  function SchedulesComponent_Conditional_7_For_4_Conditional_19_Template(rf, ctx) { if (rf & 1) {
222
211
  const _r8 = i0.ɵɵgetCurrentView();
223
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 58)(2, "button", 59);
212
+ i0.ɵɵelementStart(0, "div", 42)(1, "div", 56)(2, "button", 57);
224
213
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Conditional_19_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r8); const schedule_r7 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SetScheduleType(schedule_r7.ID, "Manual")); });
225
214
  i0.ɵɵtext(3, " Manual ");
226
215
  i0.ɵɵelementEnd();
227
- i0.ɵɵelementStart(4, "button", 59);
216
+ i0.ɵɵelementStart(4, "button", 57);
228
217
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Conditional_19_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r8); const schedule_r7 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SetScheduleType(schedule_r7.ID, "Interval")); });
229
218
  i0.ɵɵtext(5, " Interval ");
230
219
  i0.ɵɵelementEnd();
231
- i0.ɵɵelementStart(6, "button", 59);
220
+ i0.ɵɵelementStart(6, "button", 57);
232
221
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Conditional_19_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r8); const schedule_r7 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SetScheduleType(schedule_r7.ID, "Cron")); });
233
222
  i0.ɵɵtext(7, " Cron ");
234
223
  i0.ɵɵelementEnd()()();
235
- i0.ɵɵconditionalCreate(8, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_Template, 8, 1, "div", 44);
236
- i0.ɵɵconditionalCreate(9, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Template, 7, 2, "div", 44);
224
+ i0.ɵɵconditionalCreate(8, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_8_Template, 8, 1, "div", 42);
225
+ i0.ɵɵconditionalCreate(9, SchedulesComponent_Conditional_7_For_4_Conditional_19_Conditional_9_Template, 7, 2, "div", 42);
237
226
  } if (rf & 2) {
238
227
  const schedule_r7 = i0.ɵɵnextContext().$implicit;
239
228
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -249,27 +238,27 @@ function SchedulesComponent_Conditional_7_For_4_Conditional_19_Template(rf, ctx)
249
238
  i0.ɵɵconditional(ctx_r0.GetEffectiveScheduleType(schedule_r7) === "Cron" ? 9 : -1);
250
239
  } }
251
240
  function SchedulesComponent_Conditional_7_For_4_Conditional_35_Template(rf, ctx) { if (rf & 1) {
252
- i0.ɵɵelementStart(0, "span", 53);
253
- i0.ɵɵelement(1, "i", 32);
241
+ i0.ɵɵelementStart(0, "span", 51);
242
+ i0.ɵɵelement(1, "i", 30);
254
243
  i0.ɵɵtext(2, " Running ");
255
244
  i0.ɵɵelementEnd();
256
245
  } }
257
246
  function SchedulesComponent_Conditional_7_For_4_Conditional_36_Template(rf, ctx) { if (rf & 1) {
258
- i0.ɵɵelementStart(0, "span", 54);
247
+ i0.ɵɵelementStart(0, "span", 52);
259
248
  i0.ɵɵtext(1, "Idle");
260
249
  i0.ɵɵelementEnd();
261
250
  } }
262
251
  function SchedulesComponent_Conditional_7_For_4_Conditional_38_Conditional_1_Template(rf, ctx) { if (rf & 1) {
263
- i0.ɵɵelement(0, "i", 32);
252
+ i0.ɵɵelement(0, "i", 30);
264
253
  i0.ɵɵtext(1, " Saving... ");
265
254
  } }
266
255
  function SchedulesComponent_Conditional_7_For_4_Conditional_38_Conditional_2_Template(rf, ctx) { if (rf & 1) {
267
- i0.ɵɵelement(0, "i", 71);
256
+ i0.ɵɵelement(0, "i", 69);
268
257
  i0.ɵɵtext(1, " Save ");
269
258
  } }
270
259
  function SchedulesComponent_Conditional_7_For_4_Conditional_38_Template(rf, ctx) { if (rf & 1) {
271
260
  const _r15 = i0.ɵɵgetCurrentView();
272
- i0.ɵɵelementStart(0, "button", 70);
261
+ i0.ɵɵelementStart(0, "button", 68);
273
262
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Conditional_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const schedule_r7 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SaveSchedule(schedule_r7.ID)); });
274
263
  i0.ɵɵconditionalCreate(1, SchedulesComponent_Conditional_7_For_4_Conditional_38_Conditional_1_Template, 2, 0)(2, SchedulesComponent_Conditional_7_For_4_Conditional_38_Conditional_2_Template, 2, 0);
275
264
  i0.ɵɵelementEnd();
@@ -281,56 +270,56 @@ function SchedulesComponent_Conditional_7_For_4_Conditional_38_Template(rf, ctx)
281
270
  i0.ɵɵconditional(ctx_r0.IsSaving(schedule_r7.ID) ? 1 : 2);
282
271
  } }
283
272
  function SchedulesComponent_Conditional_7_For_4_Conditional_40_Template(rf, ctx) { if (rf & 1) {
284
- i0.ɵɵelement(0, "i", 32);
273
+ i0.ɵɵelement(0, "i", 30);
285
274
  i0.ɵɵtext(1, " Running... ");
286
275
  } }
287
276
  function SchedulesComponent_Conditional_7_For_4_Conditional_41_Template(rf, ctx) { if (rf & 1) {
288
- i0.ɵɵelement(0, "i", 72);
277
+ i0.ɵɵelement(0, "i", 70);
289
278
  i0.ɵɵtext(1, " Run Now ");
290
279
  } }
291
280
  function SchedulesComponent_Conditional_7_For_4_Template(rf, ctx) { if (rf & 1) {
292
281
  const _r6 = i0.ɵɵgetCurrentView();
293
- i0.ɵɵelementStart(0, "div", 33)(1, "div", 34)(2, "div", 35);
282
+ i0.ɵɵelementStart(0, "div", 31)(1, "div", 32)(2, "div", 33);
294
283
  i0.ɵɵelement(3, "i");
295
284
  i0.ɵɵelementEnd();
296
- i0.ɵɵelementStart(4, "div", 36)(5, "div", 37);
285
+ i0.ɵɵelementStart(4, "div", 34)(5, "div", 35);
297
286
  i0.ɵɵtext(6);
298
287
  i0.ɵɵelementEnd();
299
- i0.ɵɵelementStart(7, "div", 38);
288
+ i0.ɵɵelementStart(7, "div", 36);
300
289
  i0.ɵɵtext(8);
301
290
  i0.ɵɵelementEnd();
302
- i0.ɵɵelementStart(9, "div", 39);
303
- i0.ɵɵconditionalCreate(10, SchedulesComponent_Conditional_7_For_4_Conditional_10_Template, 2, 0, "span", 40)(11, SchedulesComponent_Conditional_7_For_4_Conditional_11_Template, 2, 0, "span", 41);
304
- i0.ɵɵconditionalCreate(12, SchedulesComponent_Conditional_7_For_4_Conditional_12_Template, 3, 0, "span", 42);
291
+ i0.ɵɵelementStart(9, "div", 37);
292
+ i0.ɵɵconditionalCreate(10, SchedulesComponent_Conditional_7_For_4_Conditional_10_Template, 2, 0, "span", 38)(11, SchedulesComponent_Conditional_7_For_4_Conditional_11_Template, 2, 0, "span", 39);
293
+ i0.ɵɵconditionalCreate(12, SchedulesComponent_Conditional_7_For_4_Conditional_12_Template, 3, 0, "span", 40);
305
294
  i0.ɵɵelementEnd()()();
306
- i0.ɵɵelementStart(13, "div", 43)(14, "div", 44)(15, "label", 45);
295
+ i0.ɵɵelementStart(13, "div", 41)(14, "div", 42)(15, "label", 43);
307
296
  i0.ɵɵtext(16, " Auto-sync ");
308
- i0.ɵɵelementStart(17, "button", 46);
297
+ i0.ɵɵelementStart(17, "button", 44);
309
298
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Template_button_click_17_listener() { const schedule_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.ToggleScheduleEnabled(schedule_r7.ID)); });
310
- i0.ɵɵelement(18, "span", 47);
299
+ i0.ɵɵelement(18, "span", 45);
311
300
  i0.ɵɵelementEnd()()();
312
301
  i0.ɵɵconditionalCreate(19, SchedulesComponent_Conditional_7_For_4_Conditional_19_Template, 10, 8);
313
302
  i0.ɵɵelementEnd();
314
- i0.ɵɵelementStart(20, "div", 48)(21, "div", 49)(22, "div", 50)(23, "span", 51);
303
+ i0.ɵɵelementStart(20, "div", 46)(21, "div", 47)(22, "div", 48)(23, "span", 49);
315
304
  i0.ɵɵtext(24, "Next run");
316
305
  i0.ɵɵelementEnd();
317
- i0.ɵɵelementStart(25, "span", 52);
306
+ i0.ɵɵelementStart(25, "span", 50);
318
307
  i0.ɵɵtext(26);
319
308
  i0.ɵɵelementEnd()();
320
- i0.ɵɵelementStart(27, "div", 50)(28, "span", 51);
309
+ i0.ɵɵelementStart(27, "div", 48)(28, "span", 49);
321
310
  i0.ɵɵtext(29, "Last run");
322
311
  i0.ɵɵelementEnd();
323
- i0.ɵɵelementStart(30, "span", 52);
312
+ i0.ɵɵelementStart(30, "span", 50);
324
313
  i0.ɵɵtext(31);
325
314
  i0.ɵɵelementEnd()();
326
- i0.ɵɵelementStart(32, "div", 50)(33, "span", 51);
315
+ i0.ɵɵelementStart(32, "div", 48)(33, "span", 49);
327
316
  i0.ɵɵtext(34, "Status");
328
317
  i0.ɵɵelementEnd();
329
- i0.ɵɵconditionalCreate(35, SchedulesComponent_Conditional_7_For_4_Conditional_35_Template, 3, 0, "span", 53)(36, SchedulesComponent_Conditional_7_For_4_Conditional_36_Template, 2, 0, "span", 54);
318
+ i0.ɵɵconditionalCreate(35, SchedulesComponent_Conditional_7_For_4_Conditional_35_Template, 3, 0, "span", 51)(36, SchedulesComponent_Conditional_7_For_4_Conditional_36_Template, 2, 0, "span", 52);
330
319
  i0.ɵɵelementEnd()();
331
- i0.ɵɵelementStart(37, "div", 55);
332
- i0.ɵɵconditionalCreate(38, SchedulesComponent_Conditional_7_For_4_Conditional_38_Template, 3, 2, "button", 56);
333
- i0.ɵɵelementStart(39, "button", 57);
320
+ i0.ɵɵelementStart(37, "div", 53);
321
+ i0.ɵɵconditionalCreate(38, SchedulesComponent_Conditional_7_For_4_Conditional_38_Template, 3, 2, "button", 54);
322
+ i0.ɵɵelementStart(39, "button", 55);
334
323
  i0.ɵɵlistener("click", function SchedulesComponent_Conditional_7_For_4_Template_button_click_39_listener() { const schedule_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.RunNow(schedule_r7.ID)); });
335
324
  i0.ɵɵconditionalCreate(40, SchedulesComponent_Conditional_7_For_4_Conditional_40_Template, 2, 0)(41, SchedulesComponent_Conditional_7_For_4_Conditional_41_Template, 2, 0);
336
325
  i0.ɵɵelementEnd()()()();
@@ -367,18 +356,18 @@ function SchedulesComponent_Conditional_7_For_4_Template(rf, ctx) { if (rf & 1)
367
356
  i0.ɵɵconditional(ctx_r0.IsRunning(schedule_r7.ID) ? 40 : 41);
368
357
  } }
369
358
  function SchedulesComponent_Conditional_7_Conditional_5_Template(rf, ctx) { if (rf & 1) {
370
- i0.ɵɵelementStart(0, "div", 13);
371
- i0.ɵɵelement(1, "i", 73);
359
+ i0.ɵɵelementStart(0, "div", 11);
360
+ i0.ɵɵelement(1, "i", 71);
372
361
  i0.ɵɵelementStart(2, "p");
373
362
  i0.ɵɵtext(3, "No integrations found");
374
363
  i0.ɵɵelementEnd()();
375
364
  } }
376
365
  function SchedulesComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
377
366
  i0.ɵɵelementStart(0, "div", 5);
378
- i0.ɵɵconditionalCreate(1, SchedulesComponent_Conditional_7_Conditional_1_Template, 12, 0, "div", 10);
379
- i0.ɵɵelementStart(2, "div", 11);
380
- i0.ɵɵrepeaterCreate(3, SchedulesComponent_Conditional_7_For_4_Template, 42, 18, "div", 12, i0.ɵɵcomponentInstance().TrackByID, true);
381
- i0.ɵɵconditionalCreate(5, SchedulesComponent_Conditional_7_Conditional_5_Template, 4, 0, "div", 13);
367
+ i0.ɵɵconditionalCreate(1, SchedulesComponent_Conditional_7_Conditional_1_Template, 12, 0, "div", 8);
368
+ i0.ɵɵelementStart(2, "div", 9);
369
+ i0.ɵɵrepeaterCreate(3, SchedulesComponent_Conditional_7_For_4_Template, 42, 18, "div", 10, i0.ɵɵcomponentInstance().TrackByID, true);
370
+ i0.ɵɵconditionalCreate(5, SchedulesComponent_Conditional_7_Conditional_5_Template, 4, 0, "div", 11);
382
371
  i0.ɵɵelementEnd()();
383
372
  } if (rf & 2) {
384
373
  const ctx_r0 = i0.ɵɵnextContext();
@@ -904,9 +893,9 @@ let SchedulesComponent = class SchedulesComponent extends BaseResourceComponent
904
893
  return `${hours}h ${minutes}m`;
905
894
  }
906
895
  static ɵfac = /*@__PURE__*/ (() => { let ɵSchedulesComponent_BaseFactory; return function SchedulesComponent_Factory(__ngFactoryType__) { return (ɵSchedulesComponent_BaseFactory || (ɵSchedulesComponent_BaseFactory = i0.ɵɵgetInheritedFactory(SchedulesComponent)))(__ngFactoryType__ || SchedulesComponent); }; })();
907
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulesComponent, selectors: [["app-integration-schedules"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 3, consts: [["Title", "Integration Schedules", "Icon", "fa-solid fa-calendar-check", "Subtitle", "When and how often integrations sync"], ["meta", ""], ["actions", ""], [3, "Clicked", "Loading"], [1, "loading-container"], [1, "schedules-root"], [3, "Count", "Label"], ["Label", "scheduled", 3, "Count"], ["Icon", "fa-solid fa-spinner fa-spin", "Label", "running", "Variant", "running", 3, "Count"], ["text", "Loading schedules..."], [1, "timeline-section"], [1, "cards-section"], [1, "schedule-card", 3, "schedule-card-disabled"], [1, "empty-state"], [1, "timeline-title"], [1, "fa-regular", "fa-clock"], [1, "timeline-container"], [1, "timeline-grid-labels"], [1, "timeline-label-spacer"], [1, "timeline-grid-track"], [1, "timeline-row"], [1, "timeline-hour-label", 3, "left"], [1, "timeline-hour-label"], [1, "timeline-row-label", 3, "title"], [1, "timeline-track-container"], [1, "timeline-track"], [1, "timeline-marker", 3, "timeline-marker-next", "left", "title"], [1, "timeline-locked-indicator"], [1, "timeline-now-line"], [1, "timeline-grid-line", 3, "left"], [1, "timeline-grid-line"], [1, "timeline-marker", 3, "title"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "schedule-card"], [1, "card-info"], [1, "card-icon"], [1, "card-details"], [1, "card-name"], [1, "card-company"], [1, "card-badges"], [1, "badge", "badge-success"], [1, "badge", "badge-gray"], [1, "badge", "badge-running"], [1, "card-config"], [1, "config-row"], [1, "toggle-label"], ["role", "switch", 1, "toggle-switch", 3, "click"], [1, "toggle-knob"], [1, "card-status"], [1, "status-items"], [1, "status-item"], [1, "status-label"], [1, "status-value"], [1, "status-value", "status-running"], [1, "status-value", "status-idle"], [1, "card-actions"], [1, "btn", "btn-primary", "btn-save", 3, "disabled"], [1, "btn", "btn-outline", "btn-run", 3, "click", "disabled"], [1, "type-pills"], [1, "type-pill", 3, "click"], [1, "interval-presets"], [1, "preset-btn", 3, "preset-btn-active"], [1, "custom-interval"], ["type", "number", "placeholder", "Custom min", "min", "1", 1, "interval-input", 3, "change", "value"], [1, "interval-unit"], [1, "preset-btn", 3, "click"], [1, "cron-presets"], [1, "cron-input-row"], ["type", "text", "placeholder", "* * * * *", 1, "cron-input", 3, "change", "value"], [1, "cron-description"], [1, "btn", "btn-primary", "btn-save", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-play"], [1, "fa-solid", "fa-calendar-xmark"]], template: function SchedulesComponent_Template(rf, ctx) { if (rf & 1) {
896
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulesComponent, selectors: [["app-integration-schedules"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 3, consts: [["Title", "Integration Schedules", "Icon", "fa-solid fa-calendar-check", "Subtitle", "When and how often integrations sync"], ["meta", ""], ["actions", ""], [3, "Clicked", "Loading"], [1, "loading-container"], [1, "schedules-root"], ["Icon", "fa-solid fa-spinner fa-spin", "Label", "running", "Variant", "running", 3, "Count"], ["text", "Loading schedules..."], [1, "timeline-section"], [1, "cards-section"], [1, "schedule-card", 3, "schedule-card-disabled"], [1, "empty-state"], [1, "timeline-title"], [1, "fa-regular", "fa-clock"], [1, "timeline-container"], [1, "timeline-grid-labels"], [1, "timeline-label-spacer"], [1, "timeline-grid-track"], [1, "timeline-row"], [1, "timeline-hour-label", 3, "left"], [1, "timeline-hour-label"], [1, "timeline-row-label", 3, "title"], [1, "timeline-track-container"], [1, "timeline-track"], [1, "timeline-marker", 3, "timeline-marker-next", "left", "title"], [1, "timeline-locked-indicator"], [1, "timeline-now-line"], [1, "timeline-grid-line", 3, "left"], [1, "timeline-grid-line"], [1, "timeline-marker", 3, "title"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "schedule-card"], [1, "card-info"], [1, "card-icon"], [1, "card-details"], [1, "card-name"], [1, "card-company"], [1, "card-badges"], [1, "badge", "badge-success"], [1, "badge", "badge-gray"], [1, "badge", "badge-running"], [1, "card-config"], [1, "config-row"], [1, "toggle-label"], ["role", "switch", 1, "toggle-switch", 3, "click"], [1, "toggle-knob"], [1, "card-status"], [1, "status-items"], [1, "status-item"], [1, "status-label"], [1, "status-value"], [1, "status-value", "status-running"], [1, "status-value", "status-idle"], [1, "card-actions"], [1, "btn", "btn-primary", "btn-save", 3, "disabled"], [1, "btn", "btn-outline", "btn-run", 3, "click", "disabled"], [1, "type-pills"], [1, "type-pill", 3, "click"], [1, "interval-presets"], [1, "preset-btn", 3, "preset-btn-active"], [1, "custom-interval"], ["type", "number", "placeholder", "Custom min", "min", "1", 1, "interval-input", 3, "change", "value"], [1, "interval-unit"], [1, "preset-btn", 3, "click"], [1, "cron-presets"], [1, "cron-input-row"], ["type", "text", "placeholder", "* * * * *", 1, "cron-input", 3, "change", "value"], [1, "cron-description"], [1, "btn", "btn-primary", "btn-save", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-play"], [1, "fa-solid", "fa-calendar-xmark"]], template: function SchedulesComponent_Template(rf, ctx) { if (rf & 1) {
908
897
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0);
909
- i0.ɵɵconditionalCreate(2, SchedulesComponent_Conditional_2_Template, 4, 4, "div", 1);
898
+ i0.ɵɵconditionalCreate(2, SchedulesComponent_Conditional_2_Template, 2, 1, "div", 1);
910
899
  i0.ɵɵelementStart(3, "div", 2)(4, "mj-refresh-button", 3);
911
900
  i0.ɵɵlistener("Clicked", function SchedulesComponent_Template_mj_refresh_button_Clicked_4_listener() { return ctx.LoadData(); });
912
901
  i0.ɵɵelementEnd()()();
@@ -915,7 +904,7 @@ let SchedulesComponent = class SchedulesComponent extends BaseResourceComponent
915
904
  i0.ɵɵelementEnd()();
916
905
  } if (rf & 2) {
917
906
  i0.ɵɵadvance(2);
918
- i0.ɵɵconditional(!ctx.IsLoading && ctx.Schedules.length > 0 ? 2 : -1);
907
+ i0.ɵɵconditional(ctx.LockedCount > 0 ? 2 : -1);
919
908
  i0.ɵɵadvance(2);
920
909
  i0.ɵɵproperty("Loading", ctx.IsLoading);
921
910
  i0.ɵɵadvance(2);
@@ -928,7 +917,7 @@ SchedulesComponent = __decorate([
928
917
  export { SchedulesComponent };
929
918
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SchedulesComponent, [{
930
919
  type: Component,
931
- args: [{ standalone: false, selector: 'app-integration-schedules', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Integration Schedules\"\n Icon=\"fa-solid fa-calendar-check\"\n Subtitle=\"When and how often integrations sync\">\n @if (!IsLoading && Schedules.length > 0) {\n <div meta>\n <mj-stat-badge\n [Count]=\"Schedules.length\"\n [Label]=\"Schedules.length === 1 ? 'integration' : 'integrations'\">\n </mj-stat-badge>\n <mj-stat-badge [Count]=\"ScheduledCount\" Label=\"scheduled\"></mj-stat-badge>\n @if (LockedCount > 0) {\n <mj-stat-badge\n Icon=\"fa-solid fa-spinner fa-spin\"\n [Count]=\"LockedCount\"\n Label=\"running\"\n Variant=\"running\">\n </mj-stat-badge>\n }\n </div>\n }\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"LoadData()\"></mj-refresh-button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n<!-- Loading state -->\n@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading schedules...\"></mj-loading>\n </div>\n} @else {\n <div class=\"schedules-root\">\n\n\n <!-- ================================================================= -->\n <!-- TIMELINE (24-hour visual) -->\n <!-- ================================================================= -->\n @if (TimelineMarkers.length > 0) {\n <div class=\"timeline-section\">\n <div class=\"timeline-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Next 24 Hours\n </div>\n <div class=\"timeline-container\">\n <!-- Hour grid labels -->\n <div class=\"timeline-grid-labels\">\n <div class=\"timeline-label-spacer\"></div>\n <div class=\"timeline-grid-track\">\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <span class=\"timeline-hour-label\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n {{ hour }}:00\n </span>\n }\n }\n </div>\n </div>\n\n <!-- Integration rows -->\n @for (row of TimelineMarkers; track TrackTimelineByID($index, row)) {\n <div class=\"timeline-row\">\n <div class=\"timeline-row-label\" [title]=\"row.IntegrationName\">\n {{ row.IntegrationName }}\n </div>\n <div class=\"timeline-track-container\">\n <!-- Hour grid lines -->\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <div class=\"timeline-grid-line\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n </div>\n }\n }\n\n <!-- Track bar -->\n <div class=\"timeline-track\"></div>\n\n <!-- Markers -->\n @for (marker of row.Markers; track TrackMarker($index, marker)) {\n <div class=\"timeline-marker\"\n [class.timeline-marker-next]=\"marker.IsNext\"\n [style.left.%]=\"ComputeTimelinePosition(marker.Hour, marker.Minute)\"\n [title]=\"marker.Hour + ':' + ('' + marker.Minute).padStart(2, '0')\">\n </div>\n }\n\n <!-- Locked indicator -->\n @if (row.IsLocked) {\n <div class=\"timeline-locked-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n\n <!-- Current time line -->\n <div class=\"timeline-now-line\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ================================================================= -->\n <!-- SCHEDULE CARDS -->\n <!-- ================================================================= -->\n <div class=\"cards-section\">\n @for (schedule of Schedules; track TrackByID($index, schedule)) {\n <div class=\"schedule-card\" [class.schedule-card-disabled]=\"!schedule.IsActive\">\n\n <!-- LEFT: Icon + Info -->\n <div class=\"card-info\">\n <div class=\"card-icon\">\n <i [class]=\"GetIntegrationIcon(schedule.Integration || schedule.Name)\"></i>\n </div>\n <div class=\"card-details\">\n <div class=\"card-name\">{{ schedule.Integration || schedule.Name }}</div>\n <div class=\"card-company\">{{ schedule.Company }}</div>\n <div class=\"card-badges\">\n @if (schedule.IsActive) {\n <span class=\"badge badge-success\">Active</span>\n } @else {\n <span class=\"badge badge-gray\">Inactive</span>\n }\n @if (schedule.IsLocked) {\n <span class=\"badge badge-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- CENTER: Schedule Configuration -->\n <div class=\"card-config\">\n <!-- Schedule toggle -->\n <div class=\"config-row\">\n <label class=\"toggle-label\">\n Auto-sync\n <button class=\"toggle-switch\"\n [class.toggle-on]=\"GetEffectiveScheduleEnabled(schedule)\"\n (click)=\"ToggleScheduleEnabled(schedule.ID)\"\n [attr.aria-checked]=\"GetEffectiveScheduleEnabled(schedule)\"\n role=\"switch\">\n <span class=\"toggle-knob\"></span>\n </button>\n </label>\n </div>\n\n @if (GetEffectiveScheduleEnabled(schedule)) {\n <!-- Schedule type pills -->\n <div class=\"config-row\">\n <div class=\"type-pills\">\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Manual'\"\n (click)=\"SetScheduleType(schedule.ID, 'Manual')\">\n Manual\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Interval'\"\n (click)=\"SetScheduleType(schedule.ID, 'Interval')\">\n Interval\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Cron'\"\n (click)=\"SetScheduleType(schedule.ID, 'Cron')\">\n Cron\n </button>\n </div>\n </div>\n\n <!-- Interval config -->\n @if (GetEffectiveScheduleType(schedule) === 'Interval') {\n <div class=\"config-row\">\n <div class=\"interval-presets\">\n @for (preset of IntervalPresets; track TrackPresetByMinutes($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"IsIntervalSelected(schedule, preset.Minutes)\"\n (click)=\"SetInterval(schedule.ID, preset.Minutes)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"custom-interval\">\n <input type=\"number\"\n class=\"interval-input\"\n placeholder=\"Custom min\"\n min=\"1\"\n [value]=\"GetEffectiveInterval(schedule)\"\n (change)=\"SetCustomInterval(schedule.ID, $event)\" />\n <span class=\"interval-unit\">min</span>\n </div>\n </div>\n }\n\n <!-- Cron config -->\n @if (GetEffectiveScheduleType(schedule) === 'Cron') {\n <div class=\"config-row\">\n <div class=\"cron-presets\">\n @for (preset of CronPresets; track TrackCronPresetByExpr($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"GetEffectiveCron(schedule) === preset.Expression\"\n (click)=\"SetCronExpression(schedule.ID, preset.Expression)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"cron-input-row\">\n <input type=\"text\"\n class=\"cron-input\"\n placeholder=\"* * * * *\"\n [value]=\"GetEffectiveCron(schedule) ?? ''\"\n (change)=\"OnCronInputChange(schedule.ID, $event)\" />\n @if (GetEffectiveCron(schedule)) {\n <span class=\"cron-description\">\n {{ GetCronDescription(GetEffectiveCron(schedule)) }}\n </span>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- RIGHT: Status + Actions -->\n <div class=\"card-status\">\n <div class=\"status-items\">\n <div class=\"status-item\">\n <span class=\"status-label\">Next run</span>\n <span class=\"status-value\">{{ GetNextRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Last run</span>\n <span class=\"status-value\">{{ GetLastRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Status</span>\n @if (schedule.IsLocked) {\n <span class=\"status-value status-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n } @else {\n <span class=\"status-value status-idle\">Idle</span>\n }\n </div>\n </div>\n\n <div class=\"card-actions\">\n @if (HasChanges(schedule.ID)) {\n <button class=\"btn btn-primary btn-save\"\n [disabled]=\"IsSaving(schedule.ID)\"\n (click)=\"SaveSchedule(schedule.ID)\">\n @if (IsSaving(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Save\n }\n </button>\n }\n <button class=\"btn btn-outline btn-run\"\n [disabled]=\"IsRunning(schedule.ID) || schedule.IsLocked\"\n (click)=\"RunNow(schedule.ID)\">\n @if (IsRunning(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run Now\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (Schedules.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <p>No integrations found</p>\n </div>\n }\n </div>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ==========================================================================\n Schedules Component\n ========================================================================== */\n\n:host {\n display: block;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n}\n\n/* Slot passthrough now in <mj-page-header>; stat badges now via <mj-stat-badge>. */\n\n.schedules-root {\n padding: 24px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 300px;\n}\n\n/* --------------------------------------------------------------------------\n Header\n -------------------------------------------------------------------------- */\n\n/* --------------------------------------------------------------------------\n Buttons (shared)\n -------------------------------------------------------------------------- */\n\n.btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n border: none;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-color-info-700);\n}\n\n.btn-outline {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-strong);\n}\n\n.btn-outline:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-text-disabled);\n}\n\n/* --------------------------------------------------------------------------\n Timeline Section\n -------------------------------------------------------------------------- */\n\n.timeline-section {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n padding: 20px 24px;\n margin-bottom: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--mj-border-default);\n}\n\n.timeline-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-title i {\n color: var(--mj-text-muted);\n}\n\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Grid labels row */\n.timeline-grid-labels {\n display: flex;\n align-items: flex-end;\n height: 20px;\n margin-bottom: 4px;\n}\n\n.timeline-label-spacer {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n}\n\n.timeline-grid-track {\n flex: 1;\n position: relative;\n height: 20px;\n}\n\n.timeline-hour-label {\n position: absolute;\n font-size: 10px;\n color: var(--mj-text-disabled);\n transform: translateX(-50%);\n white-space: nowrap;\n}\n\n/* Individual timeline rows */\n.timeline-row {\n display: flex;\n align-items: center;\n height: 28px;\n}\n\n.timeline-row-label {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-right: 16px;\n}\n\n.timeline-track-container {\n flex: 1;\n position: relative;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n.timeline-track {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n background: var(--mj-border-default);\n border-radius: 2px;\n}\n\n.timeline-grid-line {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 1px;\n background: var(--mj-border-subtle);\n z-index: 0;\n}\n\n/* Markers */\n.timeline-marker {\n position: absolute;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--mj-text-disabled);\n transform: translate(-50%, 0);\n z-index: 2;\n transition: all 0.2s ease;\n}\n\n.timeline-marker:hover {\n transform: translate(-50%, 0) scale(1.4);\n}\n\n.timeline-marker-next {\n width: 12px;\n height: 12px;\n background: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2);\n}\n\n/* Now line */\n.timeline-now-line {\n position: absolute;\n left: 0;\n top: -2px;\n bottom: -2px;\n width: 2px;\n background: var(--mj-status-error);\n z-index: 3;\n border-radius: 1px;\n}\n\n/* Locked indicator */\n.timeline-locked-indicator {\n position: absolute;\n left: -4px;\n font-size: 12px;\n color: var(--mj-color-warning-600);\n z-index: 4;\n animation: pulse-opacity 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-opacity {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n\n/* --------------------------------------------------------------------------\n Schedule Cards\n -------------------------------------------------------------------------- */\n\n.cards-section {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.schedule-card {\n display: flex;\n align-items: flex-start;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--mj-border-default);\n transition: box-shadow 0.2s ease;\n gap: 32px;\n}\n\n.schedule-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n}\n\n.schedule-card-disabled {\n opacity: 0.6;\n}\n\n/* Card: Left (info) */\n.card-info {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n min-width: 220px;\n flex-shrink: 0;\n}\n\n.card-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: var(--mj-status-info-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.card-icon i {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.card-details {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.card-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.card-company {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.card-badges {\n display: flex;\n gap: 6px;\n margin-top: 4px;\n flex-wrap: wrap;\n}\n\n.badge {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 10px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.badge-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.badge-gray {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n}\n\n.badge-running {\n background: var(--mj-color-warning-100);\n color: var(--mj-color-warning-600);\n}\n\n/* Card: Center (config) */\n.card-config {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.config-row {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Toggle switch */\n.toggle-label {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.toggle-switch {\n position: relative;\n width: 40px;\n height: 22px;\n border-radius: 11px;\n background: var(--mj-color-neutral-300);\n border: none;\n cursor: pointer;\n transition: background 0.2s ease;\n padding: 0;\n flex-shrink: 0;\n}\n\n.toggle-switch.toggle-on {\n background: var(--mj-brand-primary);\n}\n\n.toggle-knob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n transition: transform 0.2s ease;\n}\n\n.toggle-on .toggle-knob {\n transform: translateX(18px);\n}\n\n/* Type pills */\n.type-pills {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-hover);\n border-radius: 8px;\n padding: 3px;\n width: fit-content;\n}\n\n.type-pill {\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n background: transparent;\n border: none;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.type-pill:hover {\n color: var(--mj-text-secondary);\n}\n\n.type-pill-active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n/* Interval presets */\n.interval-presets {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.preset-btn {\n padding: 4px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-hover);\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.preset-btn:hover {\n border-color: var(--mj-text-disabled);\n color: var(--mj-text-secondary);\n}\n\n.preset-btn-active {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Custom interval input */\n.custom-interval {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.interval-input {\n width: 100px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.interval-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);\n}\n\n.interval-unit {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n/* Cron config */\n.cron-presets {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.cron-input-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 4px;\n flex-wrap: wrap;\n}\n\n.cron-input {\n width: 180px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;\n color: var(--mj-text-secondary);\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.cron-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);\n}\n\n.cron-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Card: Right (status) */\n.card-status {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 16px;\n min-width: 180px;\n flex-shrink: 0;\n}\n\n.status-items {\n display: flex;\n flex-direction: column;\n gap: 8px;\n text-align: right;\n}\n\n.status-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.status-label {\n font-size: 11px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-value {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.status-running {\n color: var(--mj-color-warning-600);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 6px;\n}\n\n.status-idle {\n color: var(--mj-color-success-600);\n}\n\n/* Card actions */\n.card-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-save {\n animation: slideIn 0.2s ease;\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.btn-run {\n font-size: 12px;\n padding: 6px 12px;\n}\n\n/* --------------------------------------------------------------------------\n Empty State\n -------------------------------------------------------------------------- */\n\n.empty-state {\n text-align: center;\n padding: 60px 24px;\n color: var(--mj-text-disabled);\n}\n\n.empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n display: block;\n}\n\n.empty-state p {\n font-size: 15px;\n margin: 0;\n}\n\n/* --------------------------------------------------------------------------\n Responsive\n -------------------------------------------------------------------------- */\n\n@media (max-width: 900px) {\n .schedule-card {\n flex-direction: column;\n gap: 20px;\n }\n\n .card-info {\n min-width: 0;\n width: 100%;\n }\n\n .card-config {\n width: 100%;\n }\n\n .card-status {\n align-items: flex-start;\n width: 100%;\n min-width: 0;\n }\n\n .status-items {\n text-align: left;\n flex-direction: row;\n gap: 20px;\n flex-wrap: wrap;\n }\n\n .status-running {\n justify-content: flex-start;\n }\n\n .card-actions {\n width: 100%;\n }\n\n .card-actions .btn {\n flex: 1;\n justify-content: center;\n }\n}\n\n@media (max-width: 768px) {\n .timeline-section {\n display: none;\n }\n\n .schedules-root {\n padding: 16px;\n }\n}\n"] }]
920
+ args: [{ standalone: false, selector: 'app-integration-schedules', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Integration Schedules\"\n Icon=\"fa-solid fa-calendar-check\"\n Subtitle=\"When and how often integrations sync\">\n <!-- [meta] retains the conditional \"running\" status pill (genuine\n signal); integrations/scheduled count badges dropped per chrome\n slot discipline audit Task B \u2014 both mirrored the visible list. -->\n @if (LockedCount > 0) {\n <div meta>\n <mj-stat-badge\n Icon=\"fa-solid fa-spinner fa-spin\"\n [Count]=\"LockedCount\"\n Label=\"running\"\n Variant=\"running\">\n </mj-stat-badge>\n </div>\n }\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"LoadData()\"></mj-refresh-button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n<!-- Loading state -->\n@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading schedules...\"></mj-loading>\n </div>\n} @else {\n <div class=\"schedules-root\">\n\n\n <!-- ================================================================= -->\n <!-- TIMELINE (24-hour visual) -->\n <!-- ================================================================= -->\n @if (TimelineMarkers.length > 0) {\n <div class=\"timeline-section\">\n <div class=\"timeline-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Next 24 Hours\n </div>\n <div class=\"timeline-container\">\n <!-- Hour grid labels -->\n <div class=\"timeline-grid-labels\">\n <div class=\"timeline-label-spacer\"></div>\n <div class=\"timeline-grid-track\">\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <span class=\"timeline-hour-label\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n {{ hour }}:00\n </span>\n }\n }\n </div>\n </div>\n\n <!-- Integration rows -->\n @for (row of TimelineMarkers; track TrackTimelineByID($index, row)) {\n <div class=\"timeline-row\">\n <div class=\"timeline-row-label\" [title]=\"row.IntegrationName\">\n {{ row.IntegrationName }}\n </div>\n <div class=\"timeline-track-container\">\n <!-- Hour grid lines -->\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <div class=\"timeline-grid-line\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n </div>\n }\n }\n\n <!-- Track bar -->\n <div class=\"timeline-track\"></div>\n\n <!-- Markers -->\n @for (marker of row.Markers; track TrackMarker($index, marker)) {\n <div class=\"timeline-marker\"\n [class.timeline-marker-next]=\"marker.IsNext\"\n [style.left.%]=\"ComputeTimelinePosition(marker.Hour, marker.Minute)\"\n [title]=\"marker.Hour + ':' + ('' + marker.Minute).padStart(2, '0')\">\n </div>\n }\n\n <!-- Locked indicator -->\n @if (row.IsLocked) {\n <div class=\"timeline-locked-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n\n <!-- Current time line -->\n <div class=\"timeline-now-line\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ================================================================= -->\n <!-- SCHEDULE CARDS -->\n <!-- ================================================================= -->\n <div class=\"cards-section\">\n @for (schedule of Schedules; track TrackByID($index, schedule)) {\n <div class=\"schedule-card\" [class.schedule-card-disabled]=\"!schedule.IsActive\">\n\n <!-- LEFT: Icon + Info -->\n <div class=\"card-info\">\n <div class=\"card-icon\">\n <i [class]=\"GetIntegrationIcon(schedule.Integration || schedule.Name)\"></i>\n </div>\n <div class=\"card-details\">\n <div class=\"card-name\">{{ schedule.Integration || schedule.Name }}</div>\n <div class=\"card-company\">{{ schedule.Company }}</div>\n <div class=\"card-badges\">\n @if (schedule.IsActive) {\n <span class=\"badge badge-success\">Active</span>\n } @else {\n <span class=\"badge badge-gray\">Inactive</span>\n }\n @if (schedule.IsLocked) {\n <span class=\"badge badge-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- CENTER: Schedule Configuration -->\n <div class=\"card-config\">\n <!-- Schedule toggle -->\n <div class=\"config-row\">\n <label class=\"toggle-label\">\n Auto-sync\n <button class=\"toggle-switch\"\n [class.toggle-on]=\"GetEffectiveScheduleEnabled(schedule)\"\n (click)=\"ToggleScheduleEnabled(schedule.ID)\"\n [attr.aria-checked]=\"GetEffectiveScheduleEnabled(schedule)\"\n role=\"switch\">\n <span class=\"toggle-knob\"></span>\n </button>\n </label>\n </div>\n\n @if (GetEffectiveScheduleEnabled(schedule)) {\n <!-- Schedule type pills -->\n <div class=\"config-row\">\n <div class=\"type-pills\">\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Manual'\"\n (click)=\"SetScheduleType(schedule.ID, 'Manual')\">\n Manual\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Interval'\"\n (click)=\"SetScheduleType(schedule.ID, 'Interval')\">\n Interval\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Cron'\"\n (click)=\"SetScheduleType(schedule.ID, 'Cron')\">\n Cron\n </button>\n </div>\n </div>\n\n <!-- Interval config -->\n @if (GetEffectiveScheduleType(schedule) === 'Interval') {\n <div class=\"config-row\">\n <div class=\"interval-presets\">\n @for (preset of IntervalPresets; track TrackPresetByMinutes($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"IsIntervalSelected(schedule, preset.Minutes)\"\n (click)=\"SetInterval(schedule.ID, preset.Minutes)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"custom-interval\">\n <input type=\"number\"\n class=\"interval-input\"\n placeholder=\"Custom min\"\n min=\"1\"\n [value]=\"GetEffectiveInterval(schedule)\"\n (change)=\"SetCustomInterval(schedule.ID, $event)\" />\n <span class=\"interval-unit\">min</span>\n </div>\n </div>\n }\n\n <!-- Cron config -->\n @if (GetEffectiveScheduleType(schedule) === 'Cron') {\n <div class=\"config-row\">\n <div class=\"cron-presets\">\n @for (preset of CronPresets; track TrackCronPresetByExpr($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"GetEffectiveCron(schedule) === preset.Expression\"\n (click)=\"SetCronExpression(schedule.ID, preset.Expression)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"cron-input-row\">\n <input type=\"text\"\n class=\"cron-input\"\n placeholder=\"* * * * *\"\n [value]=\"GetEffectiveCron(schedule) ?? ''\"\n (change)=\"OnCronInputChange(schedule.ID, $event)\" />\n @if (GetEffectiveCron(schedule)) {\n <span class=\"cron-description\">\n {{ GetCronDescription(GetEffectiveCron(schedule)) }}\n </span>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- RIGHT: Status + Actions -->\n <div class=\"card-status\">\n <div class=\"status-items\">\n <div class=\"status-item\">\n <span class=\"status-label\">Next run</span>\n <span class=\"status-value\">{{ GetNextRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Last run</span>\n <span class=\"status-value\">{{ GetLastRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Status</span>\n @if (schedule.IsLocked) {\n <span class=\"status-value status-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n } @else {\n <span class=\"status-value status-idle\">Idle</span>\n }\n </div>\n </div>\n\n <div class=\"card-actions\">\n @if (HasChanges(schedule.ID)) {\n <button class=\"btn btn-primary btn-save\"\n [disabled]=\"IsSaving(schedule.ID)\"\n (click)=\"SaveSchedule(schedule.ID)\">\n @if (IsSaving(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Save\n }\n </button>\n }\n <button class=\"btn btn-outline btn-run\"\n [disabled]=\"IsRunning(schedule.ID) || schedule.IsLocked\"\n (click)=\"RunNow(schedule.ID)\">\n @if (IsRunning(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run Now\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (Schedules.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <p>No integrations found</p>\n </div>\n }\n </div>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ==========================================================================\n Schedules Component\n ========================================================================== */\n\n:host {\n display: block;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n}\n\n/* Slot passthrough now in <mj-page-header>; stat badges now via <mj-stat-badge>. */\n\n.schedules-root {\n padding: 24px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 300px;\n}\n\n/* --------------------------------------------------------------------------\n Header\n -------------------------------------------------------------------------- */\n\n/* --------------------------------------------------------------------------\n Buttons (shared)\n -------------------------------------------------------------------------- */\n\n.btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n border: none;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-color-info-700);\n}\n\n.btn-outline {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-strong);\n}\n\n.btn-outline:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-text-disabled);\n}\n\n/* --------------------------------------------------------------------------\n Timeline Section\n -------------------------------------------------------------------------- */\n\n.timeline-section {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n padding: 20px 24px;\n margin-bottom: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--mj-border-default);\n}\n\n.timeline-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-title i {\n color: var(--mj-text-muted);\n}\n\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Grid labels row */\n.timeline-grid-labels {\n display: flex;\n align-items: flex-end;\n height: 20px;\n margin-bottom: 4px;\n}\n\n.timeline-label-spacer {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n}\n\n.timeline-grid-track {\n flex: 1;\n position: relative;\n height: 20px;\n}\n\n.timeline-hour-label {\n position: absolute;\n font-size: 10px;\n color: var(--mj-text-disabled);\n transform: translateX(-50%);\n white-space: nowrap;\n}\n\n/* Individual timeline rows */\n.timeline-row {\n display: flex;\n align-items: center;\n height: 28px;\n}\n\n.timeline-row-label {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-right: 16px;\n}\n\n.timeline-track-container {\n flex: 1;\n position: relative;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n.timeline-track {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n background: var(--mj-border-default);\n border-radius: 2px;\n}\n\n.timeline-grid-line {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 1px;\n background: var(--mj-border-subtle);\n z-index: 0;\n}\n\n/* Markers */\n.timeline-marker {\n position: absolute;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--mj-text-disabled);\n transform: translate(-50%, 0);\n z-index: 2;\n transition: all 0.2s ease;\n}\n\n.timeline-marker:hover {\n transform: translate(-50%, 0) scale(1.4);\n}\n\n.timeline-marker-next {\n width: 12px;\n height: 12px;\n background: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2);\n}\n\n/* Now line */\n.timeline-now-line {\n position: absolute;\n left: 0;\n top: -2px;\n bottom: -2px;\n width: 2px;\n background: var(--mj-status-error);\n z-index: 3;\n border-radius: 1px;\n}\n\n/* Locked indicator */\n.timeline-locked-indicator {\n position: absolute;\n left: -4px;\n font-size: 12px;\n color: var(--mj-color-warning-600);\n z-index: 4;\n animation: pulse-opacity 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-opacity {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n\n/* --------------------------------------------------------------------------\n Schedule Cards\n -------------------------------------------------------------------------- */\n\n.cards-section {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.schedule-card {\n display: flex;\n align-items: flex-start;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--mj-border-default);\n transition: box-shadow 0.2s ease;\n gap: 32px;\n}\n\n.schedule-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n}\n\n.schedule-card-disabled {\n opacity: 0.6;\n}\n\n/* Card: Left (info) */\n.card-info {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n min-width: 220px;\n flex-shrink: 0;\n}\n\n.card-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: var(--mj-status-info-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.card-icon i {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.card-details {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.card-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.card-company {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.card-badges {\n display: flex;\n gap: 6px;\n margin-top: 4px;\n flex-wrap: wrap;\n}\n\n.badge {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 10px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.badge-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.badge-gray {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n}\n\n.badge-running {\n background: var(--mj-color-warning-100);\n color: var(--mj-color-warning-600);\n}\n\n/* Card: Center (config) */\n.card-config {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.config-row {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Toggle switch */\n.toggle-label {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.toggle-switch {\n position: relative;\n width: 40px;\n height: 22px;\n border-radius: 11px;\n background: var(--mj-color-neutral-300);\n border: none;\n cursor: pointer;\n transition: background 0.2s ease;\n padding: 0;\n flex-shrink: 0;\n}\n\n.toggle-switch.toggle-on {\n background: var(--mj-brand-primary);\n}\n\n.toggle-knob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n transition: transform 0.2s ease;\n}\n\n.toggle-on .toggle-knob {\n transform: translateX(18px);\n}\n\n/* Type pills */\n.type-pills {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-hover);\n border-radius: 8px;\n padding: 3px;\n width: fit-content;\n}\n\n.type-pill {\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n background: transparent;\n border: none;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.type-pill:hover {\n color: var(--mj-text-secondary);\n}\n\n.type-pill-active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n/* Interval presets */\n.interval-presets {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.preset-btn {\n padding: 4px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-hover);\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.preset-btn:hover {\n border-color: var(--mj-text-disabled);\n color: var(--mj-text-secondary);\n}\n\n.preset-btn-active {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Custom interval input */\n.custom-interval {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.interval-input {\n width: 100px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.interval-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);\n}\n\n.interval-unit {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n/* Cron config */\n.cron-presets {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.cron-input-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 4px;\n flex-wrap: wrap;\n}\n\n.cron-input {\n width: 180px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;\n color: var(--mj-text-secondary);\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.cron-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);\n}\n\n.cron-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Card: Right (status) */\n.card-status {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 16px;\n min-width: 180px;\n flex-shrink: 0;\n}\n\n.status-items {\n display: flex;\n flex-direction: column;\n gap: 8px;\n text-align: right;\n}\n\n.status-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.status-label {\n font-size: 11px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-value {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.status-running {\n color: var(--mj-color-warning-600);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 6px;\n}\n\n.status-idle {\n color: var(--mj-color-success-600);\n}\n\n/* Card actions */\n.card-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-save {\n animation: slideIn 0.2s ease;\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.btn-run {\n font-size: 12px;\n padding: 6px 12px;\n}\n\n/* --------------------------------------------------------------------------\n Empty State\n -------------------------------------------------------------------------- */\n\n.empty-state {\n text-align: center;\n padding: 60px 24px;\n color: var(--mj-text-disabled);\n}\n\n.empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n display: block;\n}\n\n.empty-state p {\n font-size: 15px;\n margin: 0;\n}\n\n/* --------------------------------------------------------------------------\n Responsive\n -------------------------------------------------------------------------- */\n\n@media (max-width: 900px) {\n .schedule-card {\n flex-direction: column;\n gap: 20px;\n }\n\n .card-info {\n min-width: 0;\n width: 100%;\n }\n\n .card-config {\n width: 100%;\n }\n\n .card-status {\n align-items: flex-start;\n width: 100%;\n min-width: 0;\n }\n\n .status-items {\n text-align: left;\n flex-direction: row;\n gap: 20px;\n flex-wrap: wrap;\n }\n\n .status-running {\n justify-content: flex-start;\n }\n\n .card-actions {\n width: 100%;\n }\n\n .card-actions .btn {\n flex: 1;\n justify-content: center;\n }\n}\n\n@media (max-width: 768px) {\n .timeline-section {\n display: none;\n }\n\n .schedules-root {\n padding: 16px;\n }\n}\n"] }]
932
921
  }], null, null); })();
933
922
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SchedulesComponent, { className: "SchedulesComponent", filePath: "src/Integration/components/schedules/schedules.component.ts", lineNumber: 63 }); })();
934
923
  export function LoadSchedulesComponent() {