@burdenoff/microfe-bigconsole 2026.805.2 → 2026.812.1

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 (253) hide show
  1. package/dist/bigconsole/components/DrilldownDashboardRenderer.js +118 -106
  2. package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
  3. package/dist/bigconsole/components/DrilldownModal.js +54 -50
  4. package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
  5. package/dist/bigconsole/components/builder/BuilderCanvas.js +2 -2
  6. package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/builder/BuilderTopbar.js +3 -3
  8. package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -1
  9. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +24 -25
  10. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -1
  11. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +40 -29
  12. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -1
  13. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +145 -111
  14. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  15. package/dist/bigconsole/components/builder/inspector/GeneralSection.js +58 -44
  16. package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -1
  17. package/dist/bigconsole/components/common/Section.js +70 -0
  18. package/dist/bigconsole/components/common/Section.js.map +1 -0
  19. package/dist/bigconsole/components/common/index.js +2 -0
  20. package/dist/bigconsole/components/common/sectionStyles.js +42 -0
  21. package/dist/bigconsole/components/common/sectionStyles.js.map +1 -0
  22. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +269 -251
  23. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +214 -223
  25. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/DashboardGrid.js +12 -18
  27. package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
  28. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +110 -102
  29. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  30. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -68
  31. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  32. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +125 -159
  33. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
  34. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +147 -144
  35. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  36. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +154 -153
  37. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  38. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +82 -79
  39. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  40. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +171 -284
  41. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  42. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +250 -273
  43. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  44. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js +45 -53
  45. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js.map +1 -1
  46. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +157 -148
  47. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
  48. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  49. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  50. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +167 -161
  51. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  52. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
  53. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  54. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
  55. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  56. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
  57. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
  58. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  59. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
  60. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
  61. package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -229
  62. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  63. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +128 -129
  64. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  65. package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
  66. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  67. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
  68. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
  69. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -61
  70. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  71. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -64
  72. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  73. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
  74. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  75. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
  76. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
  77. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
  78. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
  79. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  80. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  81. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +312 -307
  82. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  83. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
  84. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
  85. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
  86. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
  87. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +194 -189
  88. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  89. package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
  90. package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
  91. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
  92. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
  93. package/dist/bigconsole/components/parser/DataSinkSelector.js +163 -131
  94. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  95. package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
  96. package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
  97. package/dist/bigconsole/components/parser/ImportParserDialog.js +205 -260
  98. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  99. package/dist/bigconsole/components/parser/ParserCard.js +133 -114
  100. package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
  101. package/dist/bigconsole/components/parser/ParserSelector.js +193 -174
  102. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  103. package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
  104. package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
  105. package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
  106. package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
  107. package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
  108. package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
  109. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
  110. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
  111. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
  112. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
  113. package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
  114. package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
  115. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -103
  116. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  117. package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -148
  118. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  119. package/dist/bigconsole/components/preview/previewShared.js +41 -23
  120. package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
  121. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +405 -364
  122. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  123. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +265 -237
  124. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  125. package/dist/bigconsole/components/widgets/PropertiesPanel.js +764 -821
  126. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  127. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
  128. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
  129. package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
  130. package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
  131. package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
  132. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  133. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
  134. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
  135. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +46 -49
  136. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  137. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +154 -147
  138. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  139. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +118 -101
  140. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  141. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +244 -191
  142. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  143. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  144. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  145. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +92 -76
  146. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  147. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +1 -1
  148. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
  149. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +89 -86
  150. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  151. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
  152. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
  153. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +64 -63
  154. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  155. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +2 -2
  156. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  157. package/dist/bigconsole/components/widgets/list/ListConfig.js +65 -58
  158. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  159. package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
  160. package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
  161. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
  162. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  163. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +79 -72
  164. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  165. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  166. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  167. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  168. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  169. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +181 -180
  170. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  171. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +100 -90
  172. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  173. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +3 -3
  174. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
  175. package/dist/bigconsole/components/widgets/states/EmptyState.js +6 -4
  176. package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
  177. package/dist/bigconsole/components/widgets/states/ErrorState.js +7 -5
  178. package/dist/bigconsole/components/widgets/states/ErrorState.js.map +1 -1
  179. package/dist/bigconsole/components/widgets/states/LoadingState.js +5 -4
  180. package/dist/bigconsole/components/widgets/states/LoadingState.js.map +1 -1
  181. package/dist/bigconsole/components/widgets/table/TableConfig.js +193 -172
  182. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  183. package/dist/bigconsole/components/widgets/table/TableHeader.js +1 -1
  184. package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
  185. package/dist/bigconsole/components/widgets/table/TableWidget.js +1 -1
  186. package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
  187. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
  188. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
  189. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
  190. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
  191. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
  192. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
  193. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +283 -249
  194. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  195. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
  196. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  197. package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
  198. package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
  199. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
  200. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
  201. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
  202. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
  203. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +46 -42
  204. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  205. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +372 -348
  206. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  207. package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
  208. package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
  209. package/dist/bigconsole/pages/DashboardBuilderPage.js +153 -142
  210. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  211. package/dist/bigconsole/pages/DashboardViewPage.js +230 -220
  212. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  213. package/dist/bigconsole/pages/DashboardsPage.js +832 -790
  214. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  215. package/dist/bigconsole/pages/DataParsersPage.js +249 -304
  216. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  217. package/dist/bigconsole/pages/DataSinkBuilderPage.js +324 -349
  218. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  219. package/dist/bigconsole/pages/DataSinkViewPage.js +336 -323
  220. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  221. package/dist/bigconsole/pages/DataSinksPage.js +356 -458
  222. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  223. package/dist/bigconsole/pages/DataSourcesPage.js +14 -8
  224. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  225. package/dist/bigconsole/pages/HomePage.js +186 -193
  226. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  227. package/dist/bigconsole/pages/InsightsPage.js +901 -724
  228. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  229. package/dist/bigconsole/pages/ParserBuilderPage.js +769 -675
  230. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  231. package/dist/bigconsole/pages/ParserViewPage.js +382 -354
  232. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  233. package/dist/bigconsole/pages/PipelineBuilderPage.js +540 -420
  234. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  235. package/dist/bigconsole/pages/PipelineViewPage.js +416 -384
  236. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  237. package/dist/bigconsole/pages/PipelinesPage.js +260 -309
  238. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  239. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  240. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  241. package/dist/bigconsole/pages/WidgetDemoPage.js +278 -142
  242. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  243. package/dist/bigconsole/pages/WorkflowViewPage.js +382 -366
  244. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  245. package/dist/bigconsole/pages/WorkflowsPage.js +202 -316
  246. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  247. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  248. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  249. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  250. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  251. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  252. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  253. package/package.json +2 -1
@@ -1,271 +1,276 @@
1
- import { memo as e, useCallback as t, useEffect as n, useRef as r, useState as i } from "react";
2
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
1
+ import "../common/sectionStyles.js";
2
+ import "../common/index.js";
3
+ import { memo as e, useCallback as t, useEffect as n, useMemo as r, useRef as i, useState as a } from "react";
4
+ import { useI18n as o } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
3
6
  //#region src/bigconsole/components/datasink/RefreshTypeSelector.tsx
4
- var s = [
5
- {
6
- label: "Every 5 minutes",
7
- cron: "*/5 * * * *",
8
- description: "High frequency updates"
9
- },
10
- {
11
- label: "Every 15 minutes",
12
- cron: "*/15 * * * *",
13
- description: "Balanced frequency"
14
- },
15
- {
16
- label: "Every hour",
17
- cron: "0 * * * *",
18
- description: "Hourly updates"
19
- },
20
- {
21
- label: "Every day at midnight",
22
- cron: "0 0 * * *",
23
- description: "Daily updates"
24
- }
25
- ], c = [
26
- {
27
- value: "UTC",
28
- label: "UTC"
29
- },
30
- {
31
- value: "America/New_York",
32
- label: "Eastern Time (US)"
33
- },
34
- {
35
- value: "America/Los_Angeles",
36
- label: "Pacific Time (US)"
37
- },
38
- {
39
- value: "Europe/London",
40
- label: "London (UK)"
41
- },
42
- {
43
- value: "Europe/Paris",
44
- label: "Paris (EU)"
45
- },
46
- {
47
- value: "Asia/Tokyo",
48
- label: "Tokyo (Japan)"
49
- },
50
- {
51
- value: "Asia/Kolkata",
52
- label: "India (IST)"
53
- },
54
- {
55
- value: "Australia/Sydney",
56
- label: "Sydney (Australia)"
57
- }
58
- ];
59
- function l(e) {
60
- return s.find((t) => t.cron === e) || null;
61
- }
62
- var u = e(function({ value: e, onChange: u, disabled: d = !1, error: f }) {
63
- let [p, m] = i(e?.type || "manual"), [h, g] = i(e?.schedule ? l(e.schedule.cron) || null : s[1]), [_, v] = i(e?.schedule ? !l(e.schedule.cron) : !1), [y, b] = i(e?.schedule?.cron || ""), [x, S] = i(e?.schedule?.timezone || "UTC"), C = r(e);
7
+ var l = e(function({ value: e, onChange: l, disabled: u = !1, error: d }) {
8
+ let { t: f } = o(), p = r(() => [
9
+ {
10
+ label: f("bigconsole.dataSinks.refreshType.presetEvery5MinutesLabel", "Every 5 minutes"),
11
+ cron: "*/5 * * * *",
12
+ description: f("bigconsole.dataSinks.refreshType.presetEvery5MinutesDescription", "High frequency updates")
13
+ },
14
+ {
15
+ label: f("bigconsole.dataSinks.refreshType.presetEvery15MinutesLabel", "Every 15 minutes"),
16
+ cron: "*/15 * * * *",
17
+ description: f("bigconsole.dataSinks.refreshType.presetEvery15MinutesDescription", "Balanced frequency")
18
+ },
19
+ {
20
+ label: f("bigconsole.dataSinks.refreshType.presetEveryHourLabel", "Every hour"),
21
+ cron: "0 * * * *",
22
+ description: f("bigconsole.dataSinks.refreshType.presetEveryHourDescription", "Hourly updates")
23
+ },
24
+ {
25
+ label: f("bigconsole.dataSinks.refreshType.presetEveryDayLabel", "Every day at midnight"),
26
+ cron: "0 0 * * *",
27
+ description: f("bigconsole.dataSinks.refreshType.presetEveryDayDescription", "Daily updates")
28
+ }
29
+ ], [f]), m = r(() => [
30
+ {
31
+ value: "UTC",
32
+ label: f("bigconsole.dataSinks.refreshType.timezoneUtc", "UTC")
33
+ },
34
+ {
35
+ value: "America/New_York",
36
+ label: f("bigconsole.dataSinks.refreshType.timezoneEastern", "Eastern Time (US)")
37
+ },
38
+ {
39
+ value: "America/Los_Angeles",
40
+ label: f("bigconsole.dataSinks.refreshType.timezonePacific", "Pacific Time (US)")
41
+ },
42
+ {
43
+ value: "Europe/London",
44
+ label: f("bigconsole.dataSinks.refreshType.timezoneLondon", "London (UK)")
45
+ },
46
+ {
47
+ value: "Europe/Paris",
48
+ label: f("bigconsole.dataSinks.refreshType.timezoneParis", "Paris (EU)")
49
+ },
50
+ {
51
+ value: "Asia/Tokyo",
52
+ label: f("bigconsole.dataSinks.refreshType.timezoneTokyo", "Tokyo (Japan)")
53
+ },
54
+ {
55
+ value: "Asia/Kolkata",
56
+ label: f("bigconsole.dataSinks.refreshType.timezoneKolkata", "India (IST)")
57
+ },
58
+ {
59
+ value: "Australia/Sydney",
60
+ label: f("bigconsole.dataSinks.refreshType.timezoneSydney", "Sydney (Australia)")
61
+ }
62
+ ], [f]), h = t((e) => p.find((t) => t.cron === e) || null, [p]), [g, _] = a(e?.type || "manual"), [v, y] = a(e?.schedule ? h(e.schedule.cron) || null : p[1]), [b, x] = a(e?.schedule ? !h(e.schedule.cron) : !1), [S, C] = a(e?.schedule?.cron || ""), [w, T] = a(e?.schedule?.timezone || "UTC"), E = i(e);
64
63
  n(() => {
65
- C.current !== e && e && (C.current = e, queueMicrotask(() => {
66
- if (m(e.type), e.schedule) {
67
- S(e.schedule.timezone);
68
- let t = l(e.schedule.cron);
69
- t ? (g(t), v(!1)) : (b(e.schedule.cron), v(!0));
64
+ E.current !== e && e && (E.current = e, queueMicrotask(() => {
65
+ if (_(e.type), e.schedule) {
66
+ T(e.schedule.timezone);
67
+ let t = h(e.schedule.cron);
68
+ t ? (y(t), x(!1)) : (C(e.schedule.cron), x(!0));
70
69
  }
71
70
  }));
72
- }, [e]);
73
- let w = t((e) => {
74
- d || (m(e), u(e === "manual" ? { type: "manual" } : {
71
+ }, [e, h]);
72
+ let D = t((e) => {
73
+ u || (_(e), l(e === "manual" ? { type: "manual" } : {
75
74
  type: "scheduled",
76
75
  schedule: {
77
- cron: _ ? y : h?.cron || s[1].cron,
78
- timezone: x
76
+ cron: b ? S : v?.cron || p[1].cron,
77
+ timezone: w
79
78
  }
80
79
  }));
81
80
  }, [
82
- d,
83
81
  u,
84
- _,
85
- y,
86
- h,
87
- x
88
- ]), T = t((e) => {
89
- d || (g(e), v(!1), u({
82
+ l,
83
+ b,
84
+ S,
85
+ v,
86
+ w,
87
+ p
88
+ ]), O = t((e) => {
89
+ u || (y(e), x(!1), l({
90
90
  type: "scheduled",
91
91
  schedule: {
92
92
  cron: e.cron,
93
- timezone: x
93
+ timezone: w
94
94
  }
95
95
  }));
96
96
  }, [
97
- d,
98
97
  u,
99
- x
100
- ]), E = t(() => {
101
- d || (v(!0), g(null), y && u({
98
+ l,
99
+ w
100
+ ]), k = t(() => {
101
+ u || (x(!0), y(null), S && l({
102
102
  type: "scheduled",
103
103
  schedule: {
104
- cron: y,
105
- timezone: x
104
+ cron: S,
105
+ timezone: w
106
106
  }
107
107
  }));
108
108
  }, [
109
- d,
110
109
  u,
111
- y,
112
- x
113
- ]), D = t((e) => {
110
+ l,
111
+ S,
112
+ w
113
+ ]), A = t((e) => {
114
114
  let t = e.target.value;
115
- b(t), t.trim() && u({
115
+ C(t), t.trim() && l({
116
116
  type: "scheduled",
117
117
  schedule: {
118
118
  cron: t,
119
- timezone: x
119
+ timezone: w
120
120
  }
121
121
  });
122
- }, [u, x]), O = t((e) => {
122
+ }, [l, w]), j = t((e) => {
123
123
  let t = e.target.value;
124
- S(t), p === "scheduled" && u({
124
+ T(t), g === "scheduled" && l({
125
125
  type: "scheduled",
126
126
  schedule: {
127
- cron: _ ? y : h?.cron || "",
127
+ cron: b ? S : v?.cron || "",
128
128
  timezone: t
129
129
  }
130
130
  });
131
131
  }, [
132
- u,
133
- p,
134
- _,
135
- y,
136
- h
132
+ l,
133
+ g,
134
+ b,
135
+ S,
136
+ v
137
137
  ]);
138
- return /* @__PURE__ */ o("div", {
138
+ return /* @__PURE__ */ c("div", {
139
139
  className: "space-y-4",
140
140
  children: [
141
- /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
141
+ /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("label", {
142
142
  className: "block text-sm font-medium text-text-primary mb-1",
143
- children: "Refresh Type"
144
- }), /* @__PURE__ */ a("p", {
143
+ children: f("bigconsole.dataSinks.refreshType.heading", "Refresh Type")
144
+ }), /* @__PURE__ */ s("p", {
145
145
  className: "text-xs text-text-secondary",
146
- children: "When should this data be updated?"
146
+ children: f("bigconsole.dataSinks.refreshType.headingDescription", "When should this data be updated?")
147
147
  })] }),
148
- /* @__PURE__ */ o("div", {
149
- className: "space-y-3",
150
- children: [/* @__PURE__ */ o("label", {
148
+ /* @__PURE__ */ c("div", {
149
+ className: "space-y-list-gap",
150
+ children: [/* @__PURE__ */ c("label", {
151
151
  className: `
152
- flex items-start gap-3
153
- p-4
154
- border rounded-lg
155
- cursor-pointer
156
- transition-all
157
- ${d ? "opacity-50 cursor-not-allowed" : ""}
158
- ${p === "manual" ? "border-action-primary-bg bg-action-primary-bg/5" : "border-border-default hover:border-border-hover"}
152
+ flex cursor-pointer items-start gap-3
153
+ rounded-input
154
+ border p-4
155
+ motion-safe:transition-colors
156
+ ${u ? "cursor-not-allowed opacity-50" : ""}
157
+ ${g === "manual" ? "border-[var(--color-action-primary-bg)] bg-bg-accentSubtle" : "border-[var(--color-border-subtle)] hover:border-[var(--color-border-strong)]"}
159
158
  `,
160
- children: [/* @__PURE__ */ a("input", {
159
+ children: [/* @__PURE__ */ s("input", {
161
160
  type: "radio",
162
161
  name: "refresh-type",
163
- checked: p === "manual",
164
- onChange: () => w("manual"),
165
- disabled: d,
166
- className: "\n mt-0.5\n w-4 h-4\n text-action-primary-bg\n border-border-default\n focus:ring-action-primary-bg\n focus:ring-offset-0\n "
167
- }), /* @__PURE__ */ o("div", {
162
+ checked: g === "manual",
163
+ onChange: () => D("manual"),
164
+ disabled: u,
165
+ className: "\n mt-0.5\n h-4 w-4\n border-[var(--color-border-default)]\n text-action-primary-bg\n focus-visible:ring-2\n focus-visible:ring-ring\n "
166
+ }), /* @__PURE__ */ c("div", {
168
167
  className: "flex-1",
169
- children: [/* @__PURE__ */ a("span", {
168
+ children: [/* @__PURE__ */ s("span", {
170
169
  className: "text-sm font-medium text-text-primary",
171
- children: "Manual"
172
- }), /* @__PURE__ */ a("p", {
170
+ children: f("bigconsole.dataSinks.refreshType.manualLabel", "Manual")
171
+ }), /* @__PURE__ */ s("p", {
173
172
  className: "text-xs text-text-secondary mt-0.5",
174
- children: "Data refreshes only when you click the \"Refresh\" button"
173
+ children: f("bigconsole.dataSinks.refreshType.manualDescription", "Data refreshes only when you click the \"Refresh\" button")
175
174
  })]
176
175
  })]
177
- }), /* @__PURE__ */ o("div", {
176
+ }), /* @__PURE__ */ c("div", {
178
177
  className: `
179
- border rounded-lg
180
- transition-all
181
- ${d ? "opacity-50" : ""}
182
- ${p === "scheduled" ? "border-action-primary-bg bg-action-primary-bg/5" : "border-border-default"}
178
+ rounded-input border
179
+ motion-safe:transition-colors
180
+ ${u ? "opacity-50" : ""}
181
+ ${g === "scheduled" ? "border-[var(--color-action-primary-bg)] bg-bg-accentSubtle" : "border-[var(--color-border-subtle)]"}
183
182
  `,
184
- children: [/* @__PURE__ */ o("label", {
183
+ children: [/* @__PURE__ */ c("label", {
185
184
  className: `
186
185
  flex items-start gap-3
187
186
  p-4
188
187
  cursor-pointer
189
- ${d ? "cursor-not-allowed" : ""}
188
+ ${u ? "cursor-not-allowed" : ""}
190
189
  `,
191
- children: [/* @__PURE__ */ a("input", {
190
+ children: [/* @__PURE__ */ s("input", {
192
191
  type: "radio",
193
192
  name: "refresh-type",
194
- checked: p === "scheduled",
195
- onChange: () => w("scheduled"),
196
- disabled: d,
197
- className: "\n mt-0.5\n w-4 h-4\n text-action-primary-bg\n border-border-default\n focus:ring-action-primary-bg\n focus:ring-offset-0\n "
198
- }), /* @__PURE__ */ o("div", {
193
+ checked: g === "scheduled",
194
+ onChange: () => D("scheduled"),
195
+ disabled: u,
196
+ className: "\n mt-0.5\n h-4 w-4\n border-[var(--color-border-default)]\n text-action-primary-bg\n focus-visible:ring-2\n focus-visible:ring-ring\n "
197
+ }), /* @__PURE__ */ c("div", {
199
198
  className: "flex-1",
200
- children: [/* @__PURE__ */ a("span", {
199
+ children: [/* @__PURE__ */ s("span", {
201
200
  className: "text-sm font-medium text-text-primary",
202
- children: "Automatic"
203
- }), /* @__PURE__ */ a("p", {
201
+ children: f("bigconsole.dataSinks.refreshType.automaticLabel", "Automatic")
202
+ }), /* @__PURE__ */ s("p", {
204
203
  className: "text-xs text-text-secondary mt-0.5",
205
- children: "Data refreshes on a schedule"
204
+ children: f("bigconsole.dataSinks.refreshType.automaticDescription", "Data refreshes on a schedule")
206
205
  })]
207
206
  })]
208
- }), p === "scheduled" && /* @__PURE__ */ o("div", {
209
- className: "px-4 pb-4 space-y-4",
207
+ }), g === "scheduled" && /* @__PURE__ */ c("div", {
208
+ className: "space-y-form-gap px-4 pb-4",
210
209
  children: [
211
- /* @__PURE__ */ o("div", {
212
- className: "border-t border-border-default pt-4",
213
- children: [/* @__PURE__ */ a("label", {
214
- className: "block text-xs font-medium text-text-secondary mb-2",
215
- children: "Schedule"
216
- }), /* @__PURE__ */ a("div", {
217
- className: "grid grid-cols-2 gap-2",
218
- children: s.map((e) => /* @__PURE__ */ a("button", {
210
+ /* @__PURE__ */ c("div", {
211
+ className: "border-t border-[var(--color-border-subtle)] pt-4",
212
+ children: [/* @__PURE__ */ s("label", {
213
+ className: "mb-2 block text-xs font-medium text-text-secondary",
214
+ children: f("bigconsole.dataSinks.refreshType.scheduleLabel", "Schedule")
215
+ }), /* @__PURE__ */ s("div", {
216
+ className: "grid grid-cols-1 gap-2 sm:grid-cols-2",
217
+ children: p.map((e) => /* @__PURE__ */ s("button", {
219
218
  type: "button",
220
- onClick: () => T(e),
221
- disabled: d,
219
+ onClick: () => O(e),
220
+ disabled: u,
222
221
  className: `
222
+ min-h-[var(--size-controlHeight-md)] rounded-input
223
+ border
223
224
  px-3 py-2
224
225
  text-left
225
- border rounded-md
226
- transition-colors
227
- ${d ? "cursor-not-allowed" : "cursor-pointer"}
228
- ${!_ && h?.cron === e.cron ? "border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg" : "border-border-default hover:border-border-hover"}
226
+ motion-safe:transition-colors
227
+ focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
228
+ ${u ? "cursor-not-allowed" : "cursor-pointer"}
229
+ ${!b && v?.cron === e.cron ? "border-[var(--color-action-primary-bg)] bg-bg-accentSubtle text-text-link" : "border-[var(--color-border-subtle)] hover:border-[var(--color-border-strong)]"}
229
230
  `,
230
- children: /* @__PURE__ */ a("span", {
231
+ children: /* @__PURE__ */ s("span", {
231
232
  className: "text-sm font-medium",
232
233
  children: e.label
233
234
  })
234
235
  }, e.cron))
235
236
  })]
236
237
  }),
237
- /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("button", {
238
+ /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("button", {
238
239
  type: "button",
239
- onClick: E,
240
- disabled: d,
240
+ onClick: k,
241
+ disabled: u,
241
242
  className: `
242
- text-xs
243
- ${_ ? "text-action-primary-bg" : "text-text-secondary hover:text-text-primary"}
243
+ min-h-[var(--size-controlHeight-md)] rounded-button text-xs
244
+ focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
245
+ ${b ? "text-text-link" : "text-text-secondary hover:text-text-primary"}
244
246
  `,
245
- children: _ ? "Using custom schedule" : "Use custom schedule..."
246
- }), _ && /* @__PURE__ */ o("div", {
247
+ children: b ? f("bigconsole.dataSinks.refreshType.usingCustomSchedule", "Using custom schedule") : f("bigconsole.dataSinks.refreshType.useCustomSchedule", "Use custom schedule...")
248
+ }), b && /* @__PURE__ */ c("div", {
247
249
  className: "mt-2",
248
- children: [/* @__PURE__ */ a("input", {
250
+ children: [/* @__PURE__ */ s("input", {
249
251
  type: "text",
250
- value: y,
251
- onChange: D,
252
- disabled: d,
252
+ "aria-label": "Custom cron expression",
253
+ value: S,
254
+ onChange: A,
255
+ disabled: u,
253
256
  placeholder: "*/15 * * * *",
254
- className: "\n w-full px-3 py-2\n bg-bg-sunken\n border rounded-md\n text-sm text-text-primary\n placeholder-text-tertiary\n font-mono\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n border-border-default\n "
255
- }), /* @__PURE__ */ a("p", {
256
- className: "mt-1 text-xs text-text-tertiary",
257
- children: "Enter a cron expression (e.g., */15 * * * * for every 15 minutes)"
257
+ className: "\n h-control-md w-full min-w-0\n rounded-input\n border border-[var(--color-border-default)]\n bg-bg-sunken\n px-3\n font-mono\n text-sm text-text-primary\n focus-visible:outline-none\n focus-visible:ring-2\n focus-visible:ring-ring\n "
258
+ }), /* @__PURE__ */ s("p", {
259
+ className: "mt-1 text-xs text-text-muted",
260
+ children: f("bigconsole.dataSinks.refreshType.customCronHelp", "Enter a cron expression (e.g., */15 * * * * for every 15 minutes)")
258
261
  })]
259
262
  })] }),
260
- /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
261
- className: "block text-xs font-medium text-text-secondary mb-2",
262
- children: "Timezone"
263
- }), /* @__PURE__ */ a("select", {
264
- value: x,
265
- onChange: O,
266
- disabled: d,
267
- className: "\n w-full px-3 py-2\n bg-bg-sunken\n border border-border-default rounded-md\n text-sm text-text-primary\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n ",
268
- children: c.map((e) => /* @__PURE__ */ a("option", {
263
+ /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("label", {
264
+ htmlFor: "refresh-timezone",
265
+ className: "mb-2 block text-xs font-medium text-text-secondary",
266
+ children: f("bigconsole.dataSinks.refreshType.timezoneLabel", "Timezone")
267
+ }), /* @__PURE__ */ s("select", {
268
+ id: "refresh-timezone",
269
+ value: w,
270
+ onChange: j,
271
+ disabled: u,
272
+ className: "\n h-control-md w-full min-w-0\n rounded-input\n border border-[var(--color-border-default)]\n bg-bg-sunken\n px-3\n text-sm text-text-primary\n focus-visible:outline-none\n focus-visible:ring-2\n focus-visible:ring-ring\n ",
273
+ children: m.map((e) => /* @__PURE__ */ s("option", {
269
274
  value: e.value,
270
275
  children: e.label
271
276
  }, e.value))
@@ -274,28 +279,28 @@ var u = e(function({ value: e, onChange: u, disabled: d = !1, error: f }) {
274
279
  })]
275
280
  })]
276
281
  }),
277
- f && /* @__PURE__ */ o("div", {
282
+ d && /* @__PURE__ */ c("div", {
278
283
  className: "flex items-start gap-2",
279
- children: [/* @__PURE__ */ a("svg", {
284
+ children: [/* @__PURE__ */ s("svg", {
280
285
  className: "w-4 h-4 text-status-error-text flex-shrink-0 mt-0.5",
281
286
  fill: "none",
282
287
  stroke: "currentColor",
283
288
  viewBox: "0 0 24 24",
284
- children: /* @__PURE__ */ a("path", {
289
+ children: /* @__PURE__ */ s("path", {
285
290
  strokeLinecap: "round",
286
291
  strokeLinejoin: "round",
287
292
  strokeWidth: 2,
288
293
  d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
289
294
  })
290
- }), /* @__PURE__ */ a("p", {
295
+ }), /* @__PURE__ */ s("p", {
291
296
  className: "text-xs text-status-error-text",
292
- children: f
297
+ children: d
293
298
  })]
294
299
  })
295
300
  ]
296
301
  });
297
302
  });
298
303
  //#endregion
299
- export { u as default };
304
+ export { l as default };
300
305
 
301
306
  //# sourceMappingURL=RefreshTypeSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RefreshTypeSelector.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/RefreshTypeSelector.tsx"],"sourcesContent":["/**\n * Refresh Type Selector\n *\n * Component for selecting data refresh type (manual or scheduled).\n */\n\nimport { memo, useState, useEffect, useCallback, useRef } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface SchedulePreset {\n label: string;\n cron: string;\n description: string;\n}\n\ninterface TimezoneOption {\n value: string;\n label: string;\n}\n\ninterface RefreshSchedule {\n cron: string;\n timezone: string;\n}\n\ninterface RefreshConfig {\n type: 'manual' | 'scheduled';\n schedule?: RefreshSchedule;\n}\n\ninterface RefreshTypeSelectorProps {\n /** Current refresh configuration */\n value?: RefreshConfig;\n /** Callback when configuration changes */\n onChange: (config: RefreshConfig) => void;\n /** Whether selector is disabled */\n disabled?: boolean;\n /** Error message */\n error?: string;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst SCHEDULE_PRESETS: SchedulePreset[] = [\n {\n label: 'Every 5 minutes',\n cron: '*/5 * * * *',\n description: 'High frequency updates',\n },\n {\n label: 'Every 15 minutes',\n cron: '*/15 * * * *',\n description: 'Balanced frequency',\n },\n {\n label: 'Every hour',\n cron: '0 * * * *',\n description: 'Hourly updates',\n },\n {\n label: 'Every day at midnight',\n cron: '0 0 * * *',\n description: 'Daily updates',\n },\n];\n\nconst TIMEZONE_OPTIONS: TimezoneOption[] = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time (US)' },\n { value: 'America/Los_Angeles', label: 'Pacific Time (US)' },\n { value: 'Europe/London', label: 'London (UK)' },\n { value: 'Europe/Paris', label: 'Paris (EU)' },\n { value: 'Asia/Tokyo', label: 'Tokyo (Japan)' },\n { value: 'Asia/Kolkata', label: 'India (IST)' },\n { value: 'Australia/Sydney', label: 'Sydney (Australia)' },\n];\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Find preset by cron expression\n */\nfunction findPresetByCron(cron: string): SchedulePreset | null {\n return SCHEDULE_PRESETS.find((preset) => preset.cron === cron) || null;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const RefreshTypeSelector = memo(function RefreshTypeSelector({\n value,\n onChange,\n disabled = false,\n error,\n}: RefreshTypeSelectorProps) {\n // State\n const [refreshType, setRefreshType] = useState<'manual' | 'scheduled'>(value?.type || 'manual');\n const [selectedPreset, setSelectedPreset] = useState<SchedulePreset | null>(\n value?.schedule ? findPresetByCron(value.schedule.cron) || null : SCHEDULE_PRESETS[1]\n );\n const [isCustomSchedule, setIsCustomSchedule] = useState(\n value?.schedule ? !findPresetByCron(value.schedule.cron) : false\n );\n const [customCron, setCustomCron] = useState(value?.schedule?.cron || '');\n const [timezone, setTimezone] = useState(value?.schedule?.timezone || 'UTC');\n const prevValueRef = useRef(value);\n\n // Sync state when value changes (using deferred update to avoid cascading renders)\n useEffect(() => {\n if (prevValueRef.current !== value && value) {\n prevValueRef.current = value;\n // Defer state updates to avoid synchronous setState in effect\n queueMicrotask(() => {\n setRefreshType(value.type);\n if (value.schedule) {\n setTimezone(value.schedule.timezone);\n const preset = findPresetByCron(value.schedule.cron);\n if (preset) {\n setSelectedPreset(preset);\n setIsCustomSchedule(false);\n } else {\n setCustomCron(value.schedule.cron);\n setIsCustomSchedule(true);\n }\n }\n });\n }\n }, [value]);\n\n // Handle refresh type change\n const handleTypeChange = useCallback(\n (type: 'manual' | 'scheduled') => {\n if (disabled) return;\n setRefreshType(type);\n if (type === 'manual') {\n onChange({ type: 'manual' });\n } else {\n const cron = isCustomSchedule ? customCron : selectedPreset?.cron || SCHEDULE_PRESETS[1].cron;\n onChange({\n type: 'scheduled',\n schedule: { cron, timezone },\n });\n }\n },\n [disabled, onChange, isCustomSchedule, customCron, selectedPreset, timezone]\n );\n\n // Handle preset selection\n const handlePresetSelect = useCallback(\n (preset: SchedulePreset) => {\n if (disabled) return;\n setSelectedPreset(preset);\n setIsCustomSchedule(false);\n onChange({\n type: 'scheduled',\n schedule: { cron: preset.cron, timezone },\n });\n },\n [disabled, onChange, timezone]\n );\n\n // Handle custom schedule toggle\n const handleCustomToggle = useCallback(() => {\n if (disabled) return;\n setIsCustomSchedule(true);\n setSelectedPreset(null);\n if (customCron) {\n onChange({\n type: 'scheduled',\n schedule: { cron: customCron, timezone },\n });\n }\n }, [disabled, onChange, customCron, timezone]);\n\n // Handle custom cron change\n const handleCustomCronChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const cron = e.target.value;\n setCustomCron(cron);\n if (cron.trim()) {\n onChange({\n type: 'scheduled',\n schedule: { cron, timezone },\n });\n }\n },\n [onChange, timezone]\n );\n\n // Handle timezone change\n const handleTimezoneChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const tz = e.target.value;\n setTimezone(tz);\n if (refreshType === 'scheduled') {\n const cron = isCustomSchedule ? customCron : selectedPreset?.cron || '';\n onChange({\n type: 'scheduled',\n schedule: { cron, timezone: tz },\n });\n }\n },\n [onChange, refreshType, isCustomSchedule, customCron, selectedPreset]\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Label */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Refresh Type</label>\n <p className=\"text-xs text-text-secondary\">When should this data be updated?</p>\n </div>\n\n {/* Options */}\n <div className=\"space-y-3\">\n {/* Manual option */}\n <label\n className={`\n flex items-start gap-3\n p-4\n border rounded-lg\n cursor-pointer\n transition-all\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n ${\n refreshType === 'manual'\n ? 'border-action-primary-bg bg-action-primary-bg/5'\n : 'border-border-default hover:border-border-hover'\n }\n `}\n >\n <input\n type=\"radio\"\n name=\"refresh-type\"\n checked={refreshType === 'manual'}\n onChange={() => handleTypeChange('manual')}\n disabled={disabled}\n className={`\n mt-0.5\n w-4 h-4\n text-action-primary-bg\n border-border-default\n focus:ring-action-primary-bg\n focus:ring-offset-0\n `}\n />\n <div className=\"flex-1\">\n <span className=\"text-sm font-medium text-text-primary\">Manual</span>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Data refreshes only when you click the &quot;Refresh&quot; button\n </p>\n </div>\n </label>\n\n {/* Scheduled option */}\n <div\n className={`\n border rounded-lg\n transition-all\n ${disabled ? 'opacity-50' : ''}\n ${refreshType === 'scheduled' ? 'border-action-primary-bg bg-action-primary-bg/5' : 'border-border-default'}\n `}\n >\n <label\n className={`\n flex items-start gap-3\n p-4\n cursor-pointer\n ${disabled ? 'cursor-not-allowed' : ''}\n `}\n >\n <input\n type=\"radio\"\n name=\"refresh-type\"\n checked={refreshType === 'scheduled'}\n onChange={() => handleTypeChange('scheduled')}\n disabled={disabled}\n className={`\n mt-0.5\n w-4 h-4\n text-action-primary-bg\n border-border-default\n focus:ring-action-primary-bg\n focus:ring-offset-0\n `}\n />\n <div className=\"flex-1\">\n <span className=\"text-sm font-medium text-text-primary\">Automatic</span>\n <p className=\"text-xs text-text-secondary mt-0.5\">Data refreshes on a schedule</p>\n </div>\n </label>\n\n {/* Schedule options (shown when scheduled is selected) */}\n {refreshType === 'scheduled' && (\n <div className=\"px-4 pb-4 space-y-4\">\n {/* Schedule presets */}\n <div className=\"border-t border-border-default pt-4\">\n <label className=\"block text-xs font-medium text-text-secondary mb-2\">Schedule</label>\n <div className=\"grid grid-cols-2 gap-2\">\n {SCHEDULE_PRESETS.map((preset) => (\n <button\n key={preset.cron}\n type=\"button\"\n onClick={() => handlePresetSelect(preset)}\n disabled={disabled}\n className={`\n px-3 py-2\n text-left\n border rounded-md\n transition-colors\n ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}\n ${\n !isCustomSchedule && selectedPreset?.cron === preset.cron\n ? 'border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg'\n : 'border-border-default hover:border-border-hover'\n }\n `}\n >\n <span className=\"text-sm font-medium\">{preset.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Custom schedule */}\n <div>\n <button\n type=\"button\"\n onClick={handleCustomToggle}\n disabled={disabled}\n className={`\n text-xs\n ${isCustomSchedule ? 'text-action-primary-bg' : 'text-text-secondary hover:text-text-primary'}\n `}\n >\n {isCustomSchedule ? 'Using custom schedule' : 'Use custom schedule...'}\n </button>\n {isCustomSchedule && (\n <div className=\"mt-2\">\n <input\n type=\"text\"\n value={customCron}\n onChange={handleCustomCronChange}\n disabled={disabled}\n placeholder=\"*/15 * * * *\"\n className={`\n w-full px-3 py-2\n bg-bg-sunken\n border rounded-md\n text-sm text-text-primary\n placeholder-text-tertiary\n font-mono\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n border-border-default\n `}\n />\n <p className=\"mt-1 text-xs text-text-tertiary\">\n Enter a cron expression (e.g., */15 * * * * for every 15 minutes)\n </p>\n </div>\n )}\n </div>\n\n {/* Timezone */}\n <div>\n <label className=\"block text-xs font-medium text-text-secondary mb-2\">Timezone</label>\n <select\n value={timezone}\n onChange={handleTimezoneChange}\n disabled={disabled}\n className={`\n w-full px-3 py-2\n bg-bg-sunken\n border border-border-default rounded-md\n text-sm text-text-primary\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n `}\n >\n {TIMEZONE_OPTIONS.map((tz) => (\n <option key={tz.value} value={tz.value}>\n {tz.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"flex items-start gap-2\">\n <svg\n className=\"w-4 h-4 text-status-error-text flex-shrink-0 mt-0.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <p className=\"text-xs text-status-error-text\">{error}</p>\n </div>\n )}\n </div>\n );\n});\n\nexport default RefreshTypeSelector;\n"],"mappings":"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"}
1
+ {"version":3,"file":"RefreshTypeSelector.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/RefreshTypeSelector.tsx"],"sourcesContent":["/**\n * Refresh Type Selector\n *\n * Component for selecting data refresh type (manual or scheduled).\n */\n\nimport { memo, useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { SECTION_FOCUS_RING } from '../common';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface SchedulePreset {\n label: string;\n cron: string;\n description: string;\n}\n\ninterface TimezoneOption {\n value: string;\n label: string;\n}\n\ninterface RefreshSchedule {\n cron: string;\n timezone: string;\n}\n\ninterface RefreshConfig {\n type: 'manual' | 'scheduled';\n schedule?: RefreshSchedule;\n}\n\ninterface RefreshTypeSelectorProps {\n /** Current refresh configuration */\n value?: RefreshConfig;\n /** Callback when configuration changes */\n onChange: (config: RefreshConfig) => void;\n /** Whether selector is disabled */\n disabled?: boolean;\n /** Error message */\n error?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const RefreshTypeSelector = memo(function RefreshTypeSelector({\n value,\n onChange,\n disabled = false,\n error,\n}: RefreshTypeSelectorProps) {\n const { t } = useI18n();\n\n const SCHEDULE_PRESETS = useMemo<SchedulePreset[]>(\n () => [\n {\n label: t('bigconsole.dataSinks.refreshType.presetEvery5MinutesLabel', 'Every 5 minutes'),\n cron: '*/5 * * * *',\n description: t('bigconsole.dataSinks.refreshType.presetEvery5MinutesDescription', 'High frequency updates'),\n },\n {\n label: t('bigconsole.dataSinks.refreshType.presetEvery15MinutesLabel', 'Every 15 minutes'),\n cron: '*/15 * * * *',\n description: t('bigconsole.dataSinks.refreshType.presetEvery15MinutesDescription', 'Balanced frequency'),\n },\n {\n label: t('bigconsole.dataSinks.refreshType.presetEveryHourLabel', 'Every hour'),\n cron: '0 * * * *',\n description: t('bigconsole.dataSinks.refreshType.presetEveryHourDescription', 'Hourly updates'),\n },\n {\n label: t('bigconsole.dataSinks.refreshType.presetEveryDayLabel', 'Every day at midnight'),\n cron: '0 0 * * *',\n description: t('bigconsole.dataSinks.refreshType.presetEveryDayDescription', 'Daily updates'),\n },\n ],\n [t]\n );\n\n const TIMEZONE_OPTIONS = useMemo<TimezoneOption[]>(\n () => [\n { value: 'UTC', label: t('bigconsole.dataSinks.refreshType.timezoneUtc', 'UTC') },\n { value: 'America/New_York', label: t('bigconsole.dataSinks.refreshType.timezoneEastern', 'Eastern Time (US)') },\n {\n value: 'America/Los_Angeles',\n label: t('bigconsole.dataSinks.refreshType.timezonePacific', 'Pacific Time (US)'),\n },\n { value: 'Europe/London', label: t('bigconsole.dataSinks.refreshType.timezoneLondon', 'London (UK)') },\n { value: 'Europe/Paris', label: t('bigconsole.dataSinks.refreshType.timezoneParis', 'Paris (EU)') },\n { value: 'Asia/Tokyo', label: t('bigconsole.dataSinks.refreshType.timezoneTokyo', 'Tokyo (Japan)') },\n { value: 'Asia/Kolkata', label: t('bigconsole.dataSinks.refreshType.timezoneKolkata', 'India (IST)') },\n { value: 'Australia/Sydney', label: t('bigconsole.dataSinks.refreshType.timezoneSydney', 'Sydney (Australia)') },\n ],\n [t]\n );\n\n // Find preset by cron expression\n const findPresetByCron = useCallback(\n (cron: string): SchedulePreset | null => SCHEDULE_PRESETS.find((preset) => preset.cron === cron) || null,\n [SCHEDULE_PRESETS]\n );\n\n // State\n const [refreshType, setRefreshType] = useState<'manual' | 'scheduled'>(value?.type || 'manual');\n const [selectedPreset, setSelectedPreset] = useState<SchedulePreset | null>(\n value?.schedule ? findPresetByCron(value.schedule.cron) || null : SCHEDULE_PRESETS[1]\n );\n const [isCustomSchedule, setIsCustomSchedule] = useState(\n value?.schedule ? !findPresetByCron(value.schedule.cron) : false\n );\n const [customCron, setCustomCron] = useState(value?.schedule?.cron || '');\n const [timezone, setTimezone] = useState(value?.schedule?.timezone || 'UTC');\n const prevValueRef = useRef(value);\n\n // Sync state when value changes (using deferred update to avoid cascading renders)\n useEffect(() => {\n if (prevValueRef.current !== value && value) {\n prevValueRef.current = value;\n // Defer state updates to avoid synchronous setState in effect\n queueMicrotask(() => {\n setRefreshType(value.type);\n if (value.schedule) {\n setTimezone(value.schedule.timezone);\n const preset = findPresetByCron(value.schedule.cron);\n if (preset) {\n setSelectedPreset(preset);\n setIsCustomSchedule(false);\n } else {\n setCustomCron(value.schedule.cron);\n setIsCustomSchedule(true);\n }\n }\n });\n }\n }, [value, findPresetByCron]);\n\n // Handle refresh type change\n const handleTypeChange = useCallback(\n (type: 'manual' | 'scheduled') => {\n if (disabled) return;\n setRefreshType(type);\n if (type === 'manual') {\n onChange({ type: 'manual' });\n } else {\n const cron = isCustomSchedule ? customCron : selectedPreset?.cron || SCHEDULE_PRESETS[1].cron;\n onChange({\n type: 'scheduled',\n schedule: { cron, timezone },\n });\n }\n },\n [disabled, onChange, isCustomSchedule, customCron, selectedPreset, timezone, SCHEDULE_PRESETS]\n );\n\n // Handle preset selection\n const handlePresetSelect = useCallback(\n (preset: SchedulePreset) => {\n if (disabled) return;\n setSelectedPreset(preset);\n setIsCustomSchedule(false);\n onChange({\n type: 'scheduled',\n schedule: { cron: preset.cron, timezone },\n });\n },\n [disabled, onChange, timezone]\n );\n\n // Handle custom schedule toggle\n const handleCustomToggle = useCallback(() => {\n if (disabled) return;\n setIsCustomSchedule(true);\n setSelectedPreset(null);\n if (customCron) {\n onChange({\n type: 'scheduled',\n schedule: { cron: customCron, timezone },\n });\n }\n }, [disabled, onChange, customCron, timezone]);\n\n // Handle custom cron change\n const handleCustomCronChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const cron = e.target.value;\n setCustomCron(cron);\n if (cron.trim()) {\n onChange({\n type: 'scheduled',\n schedule: { cron, timezone },\n });\n }\n },\n [onChange, timezone]\n );\n\n // Handle timezone change\n const handleTimezoneChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const tz = e.target.value;\n setTimezone(tz);\n if (refreshType === 'scheduled') {\n const cron = isCustomSchedule ? customCron : selectedPreset?.cron || '';\n onChange({\n type: 'scheduled',\n schedule: { cron, timezone: tz },\n });\n }\n },\n [onChange, refreshType, isCustomSchedule, customCron, selectedPreset]\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Label */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.dataSinks.refreshType.heading', 'Refresh Type')}\n </label>\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.dataSinks.refreshType.headingDescription', 'When should this data be updated?')}\n </p>\n </div>\n\n {/* Options */}\n <div className=\"space-y-list-gap\">\n {/* Manual option */}\n <label\n className={`\n flex cursor-pointer items-start gap-3\n rounded-input\n border p-4\n motion-safe:transition-colors\n ${disabled ? 'cursor-not-allowed opacity-50' : ''}\n ${\n refreshType === 'manual'\n ? 'border-[var(--color-action-primary-bg)] bg-bg-accentSubtle'\n : 'border-[var(--color-border-subtle)] hover:border-[var(--color-border-strong)]'\n }\n `}\n >\n <input\n type=\"radio\"\n name=\"refresh-type\"\n checked={refreshType === 'manual'}\n onChange={() => handleTypeChange('manual')}\n disabled={disabled}\n className={`\n mt-0.5\n h-4 w-4\n border-[var(--color-border-default)]\n text-action-primary-bg\n focus-visible:ring-2\n focus-visible:ring-ring\n `}\n />\n <div className=\"flex-1\">\n <span className=\"text-sm font-medium text-text-primary\">\n {t('bigconsole.dataSinks.refreshType.manualLabel', 'Manual')}\n </span>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {t(\n 'bigconsole.dataSinks.refreshType.manualDescription',\n 'Data refreshes only when you click the \"Refresh\" button'\n )}\n </p>\n </div>\n </label>\n\n {/* Scheduled option */}\n <div\n className={`\n rounded-input border\n motion-safe:transition-colors\n ${disabled ? 'opacity-50' : ''}\n ${\n refreshType === 'scheduled'\n ? 'border-[var(--color-action-primary-bg)] bg-bg-accentSubtle'\n : 'border-[var(--color-border-subtle)]'\n }\n `}\n >\n <label\n className={`\n flex items-start gap-3\n p-4\n cursor-pointer\n ${disabled ? 'cursor-not-allowed' : ''}\n `}\n >\n <input\n type=\"radio\"\n name=\"refresh-type\"\n checked={refreshType === 'scheduled'}\n onChange={() => handleTypeChange('scheduled')}\n disabled={disabled}\n className={`\n mt-0.5\n h-4 w-4\n border-[var(--color-border-default)]\n text-action-primary-bg\n focus-visible:ring-2\n focus-visible:ring-ring\n `}\n />\n <div className=\"flex-1\">\n <span className=\"text-sm font-medium text-text-primary\">\n {t('bigconsole.dataSinks.refreshType.automaticLabel', 'Automatic')}\n </span>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {t('bigconsole.dataSinks.refreshType.automaticDescription', 'Data refreshes on a schedule')}\n </p>\n </div>\n </label>\n\n {/* Schedule options (shown when scheduled is selected) */}\n {refreshType === 'scheduled' && (\n <div className=\"space-y-form-gap px-4 pb-4\">\n {/* Schedule presets */}\n <div className=\"border-t border-[var(--color-border-subtle)] pt-4\">\n <label className=\"mb-2 block text-xs font-medium text-text-secondary\">\n {t('bigconsole.dataSinks.refreshType.scheduleLabel', 'Schedule')}\n </label>\n {/* Single column below `sm`: two \"Every day at midnight\"-length\n buttons never fit side by side inside a card at 390px. */}\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {SCHEDULE_PRESETS.map((preset) => (\n <button\n key={preset.cron}\n type=\"button\"\n onClick={() => handlePresetSelect(preset)}\n disabled={disabled}\n className={`\n min-h-[var(--size-controlHeight-md)] rounded-input\n border\n px-3 py-2\n text-left\n motion-safe:transition-colors\n ${SECTION_FOCUS_RING}\n ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}\n ${\n !isCustomSchedule && selectedPreset?.cron === preset.cron\n ? 'border-[var(--color-action-primary-bg)] bg-bg-accentSubtle text-text-link'\n : 'border-[var(--color-border-subtle)] hover:border-[var(--color-border-strong)]'\n }\n `}\n >\n <span className=\"text-sm font-medium\">{preset.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Custom schedule */}\n <div>\n <button\n type=\"button\"\n onClick={handleCustomToggle}\n disabled={disabled}\n className={`\n min-h-[var(--size-controlHeight-md)] rounded-button text-xs\n ${SECTION_FOCUS_RING}\n ${isCustomSchedule ? 'text-text-link' : 'text-text-secondary hover:text-text-primary'}\n `}\n >\n {isCustomSchedule\n ? t('bigconsole.dataSinks.refreshType.usingCustomSchedule', 'Using custom schedule')\n : t('bigconsole.dataSinks.refreshType.useCustomSchedule', 'Use custom schedule...')}\n </button>\n {isCustomSchedule && (\n <div className=\"mt-2\">\n <input\n type=\"text\"\n aria-label=\"Custom cron expression\"\n value={customCron}\n onChange={handleCustomCronChange}\n disabled={disabled}\n placeholder=\"*/15 * * * *\"\n className={`\n h-control-md w-full min-w-0\n rounded-input\n border border-[var(--color-border-default)]\n bg-bg-sunken\n px-3\n font-mono\n text-sm text-text-primary\n focus-visible:outline-none\n focus-visible:ring-2\n focus-visible:ring-ring\n `}\n />\n <p className=\"mt-1 text-xs text-text-muted\">\n {t(\n 'bigconsole.dataSinks.refreshType.customCronHelp',\n 'Enter a cron expression (e.g., */15 * * * * for every 15 minutes)'\n )}\n </p>\n </div>\n )}\n </div>\n\n {/* Timezone */}\n <div>\n <label htmlFor=\"refresh-timezone\" className=\"mb-2 block text-xs font-medium text-text-secondary\">\n {t('bigconsole.dataSinks.refreshType.timezoneLabel', 'Timezone')}\n </label>\n <select\n id=\"refresh-timezone\"\n value={timezone}\n onChange={handleTimezoneChange}\n disabled={disabled}\n className={`\n h-control-md w-full min-w-0\n rounded-input\n border border-[var(--color-border-default)]\n bg-bg-sunken\n px-3\n text-sm text-text-primary\n focus-visible:outline-none\n focus-visible:ring-2\n focus-visible:ring-ring\n `}\n >\n {TIMEZONE_OPTIONS.map((tz) => (\n <option key={tz.value} value={tz.value}>\n {tz.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"flex items-start gap-2\">\n <svg\n className=\"w-4 h-4 text-status-error-text flex-shrink-0 mt-0.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <p className=\"text-xs text-status-error-text\">{error}</p>\n </div>\n )}\n </div>\n );\n});\n\nexport default RefreshTypeSelector;\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ var r = {
6
6
  label: "Workflow Pending",
7
7
  shortLabel: "Draft",
8
8
  bgColor: "bg-status-warning-bg/10",
9
- textColor: "text-status-warning-text",
9
+ textColor: "text-[var(--color-status-warning-text)]",
10
10
  icon: "pending"
11
11
  },
12
12
  workflow_running: {
@@ -20,14 +20,14 @@ var r = {
20
20
  label: "Workflow Completed",
21
21
  shortLabel: "Config Needed",
22
22
  bgColor: "bg-status-warning-bg/10",
23
- textColor: "text-status-warning-text",
23
+ textColor: "text-[var(--color-status-warning-text)]",
24
24
  icon: "pending"
25
25
  },
26
26
  configuration_pending: {
27
27
  label: "Configuration Pending",
28
28
  shortLabel: "In Progress",
29
29
  bgColor: "bg-status-warning-bg/10",
30
- textColor: "text-status-warning-text",
30
+ textColor: "text-[var(--color-status-warning-text)]",
31
31
  icon: "pending"
32
32
  },
33
33
  completed: {