@burdenoff/microfe-bigconsole 2026.624.1 → 2026.625.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 (186) hide show
  1. package/dist/bigconsole/BigConsoleRoutes.js +94 -94
  2. package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
  3. package/dist/bigconsole/assistant/assistantApi.js +215 -0
  4. package/dist/bigconsole/assistant/assistantApi.js.map +1 -0
  5. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js +119 -0
  6. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js.map +1 -0
  7. package/dist/bigconsole/assistant/index.js +2 -0
  8. package/dist/bigconsole/assistant/pageContext.js +51 -0
  9. package/dist/bigconsole/assistant/pageContext.js.map +1 -0
  10. package/dist/bigconsole/components/DrilldownModal.js +4 -4
  11. package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
  12. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +48 -48
  13. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +1 -1
  14. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  15. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +54 -54
  16. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  17. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +1 -1
  18. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  19. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +33 -33
  20. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +205 -205
  21. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  22. package/dist/bigconsole/components/dashboard/WidgetPalette.js +38 -38
  23. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +1 -1
  24. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  25. package/dist/bigconsole/components/datasink/DataSinkCard.js +4 -4
  26. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  27. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +2 -2
  28. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
  29. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +2 -2
  30. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  31. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +2 -2
  32. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  33. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +34 -34
  34. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
  35. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +31 -31
  36. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +121 -121
  37. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  38. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +1 -1
  39. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
  40. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +3 -3
  41. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
  42. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +2 -2
  43. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  44. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +2 -2
  45. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
  46. package/dist/bigconsole/components/parser/DataSinkSelector.js +3 -3
  47. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  48. package/dist/bigconsole/components/parser/ExportParserDialog.js +31 -31
  49. package/dist/bigconsole/components/parser/ImportParserDialog.js +186 -186
  50. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  51. package/dist/bigconsole/components/parser/ParserCard.js +5 -5
  52. package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
  53. package/dist/bigconsole/components/parser/ParserSelector.js +6 -6
  54. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  55. package/dist/bigconsole/components/parser/ParserStatusBadge.js +1 -1
  56. package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
  57. package/dist/bigconsole/components/parser/ParserTypeBadge.js +1 -1
  58. package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
  59. package/dist/bigconsole/components/pipeline/PipelineCard.js +2 -2
  60. package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
  61. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +1 -1
  62. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
  63. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +1 -1
  64. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
  65. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +79 -79
  66. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  67. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +11 -11
  68. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  69. package/dist/bigconsole/components/widgets/PropertiesPanel.js +322 -322
  70. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  71. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js +234 -234
  72. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js.map +1 -1
  73. package/dist/bigconsole/components/widgets/WidgetHeader.js +4 -4
  74. package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
  75. package/dist/bigconsole/components/widgets/WidgetMenu.js +3 -3
  76. package/dist/bigconsole/components/widgets/WidgetMenu.js.map +1 -1
  77. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +23 -23
  78. package/dist/bigconsole/components/widgets/WidgetWrapper.js +1 -1
  79. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  80. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +1 -1
  81. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  82. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +2 -2
  83. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  84. package/dist/bigconsole/components/widgets/custom/CustomWidget.js +5 -5
  85. package/dist/bigconsole/components/widgets/custom/CustomWidget.js.map +1 -1
  86. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +1 -1
  87. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
  88. package/dist/bigconsole/components/widgets/gauge/LinearGauge.js +1 -1
  89. package/dist/bigconsole/components/widgets/gauge/LinearGauge.js.map +1 -1
  90. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +2 -2
  91. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  92. package/dist/bigconsole/components/widgets/kpi/KPIWidget.js +2 -2
  93. package/dist/bigconsole/components/widgets/kpi/KPIWidget.js.map +1 -1
  94. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +2 -2
  95. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  96. package/dist/bigconsole/components/widgets/list/ListItem.js +3 -3
  97. package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
  98. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +3 -3
  99. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  100. package/dist/bigconsole/components/widgets/metric-card/ComparisonBadge.js +1 -1
  101. package/dist/bigconsole/components/widgets/metric-card/ComparisonBadge.js.map +1 -1
  102. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +2 -2
  103. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
  104. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +12 -12
  105. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  106. package/dist/bigconsole/components/widgets/progress/ProgressBar.js +2 -2
  107. package/dist/bigconsole/components/widgets/progress/ProgressBar.js.map +1 -1
  108. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +1 -1
  109. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  110. package/dist/bigconsole/components/widgets/progress/ProgressWidget.js +1 -1
  111. package/dist/bigconsole/components/widgets/progress/ProgressWidget.js.map +1 -1
  112. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +2 -2
  113. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
  114. package/dist/bigconsole/components/widgets/states/EmptyState.js +1 -1
  115. package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
  116. package/dist/bigconsole/components/widgets/table/TableCell.js +1 -1
  117. package/dist/bigconsole/components/widgets/table/TableCell.js.map +1 -1
  118. package/dist/bigconsole/components/widgets/table/TableConfig.js +1 -1
  119. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  120. package/dist/bigconsole/components/widgets/table/TableHeader.js +2 -2
  121. package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
  122. package/dist/bigconsole/components/widgets/table/TablePagination.js +4 -4
  123. package/dist/bigconsole/components/widgets/table/TablePagination.js.map +1 -1
  124. package/dist/bigconsole/components/widgets/table/TableWidget.js +5 -5
  125. package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
  126. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
  127. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
  128. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
  129. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
  130. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
  131. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
  132. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +3 -3
  133. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  134. package/dist/bigconsole/components/workflow/WorkflowCard.js +2 -2
  135. package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
  136. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +1 -1
  137. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
  138. package/dist/bigconsole/index.js +3 -0
  139. package/dist/bigconsole/pages/DashboardBuilderPage.js +76 -76
  140. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  141. package/dist/bigconsole/pages/DashboardViewPage.js +169 -190
  142. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  143. package/dist/bigconsole/pages/DashboardsPage.js +268 -312
  144. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  145. package/dist/bigconsole/pages/DataParsersPage.js +148 -194
  146. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  147. package/dist/bigconsole/pages/DataSinkBuilderPage.js +254 -248
  148. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  149. package/dist/bigconsole/pages/DataSinkViewPage.js +256 -231
  150. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  151. package/dist/bigconsole/pages/DataSinksPage.js +173 -219
  152. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  153. package/dist/bigconsole/pages/HomePage.js +125 -141
  154. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  155. package/dist/bigconsole/pages/InsightsPage.js +159 -184
  156. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  157. package/dist/bigconsole/pages/ParserBuilderPage.js +404 -396
  158. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  159. package/dist/bigconsole/pages/ParserViewPage.js +221 -202
  160. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  161. package/dist/bigconsole/pages/PipelineBuilderPage.js +216 -210
  162. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  163. package/dist/bigconsole/pages/PipelineViewPage.js +213 -190
  164. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  165. package/dist/bigconsole/pages/PipelinesPage.js +107 -150
  166. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  167. package/dist/bigconsole/pages/SettingsPage.js +184 -171
  168. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  169. package/dist/bigconsole/pages/WidgetDemoPage.js +71 -83
  170. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  171. package/dist/bigconsole/pages/WorkflowViewPage.js +235 -221
  172. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  173. package/dist/bigconsole/pages/WorkflowsPage.js +106 -149
  174. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  175. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +12 -12
  176. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  177. package/dist/bigconsole/renderers/adapters/BigConsoleRenderer.js +2 -2
  178. package/dist/bigconsole/renderers/adapters/BigConsoleRenderer.js.map +1 -1
  179. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +5 -5
  180. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  181. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +2 -2
  182. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  183. package/dist/generated/wspace-operations.js +87 -36
  184. package/dist/generated/wspace-operations.js.map +1 -1
  185. package/dist/index.js +3 -1
  186. package/package.json +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkDeleteDialog.tsx"],"sourcesContent":["/**\n * DataSink Delete Dialog\n *\n * Confirmation dialog for deleting a DataSink.\n */\n\nimport { memo, useCallback } from 'react';\nimport type { DataSink } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkDeleteDialogProps {\n /** DataSink to delete */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when delete is confirmed */\n onConfirm: () => void;\n /** Whether delete is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkDeleteDialog = memo(function DataSinkDeleteDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isDeleting = false,\n}: DataSinkDeleteDialogProps) {\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isDeleting) {\n onClose();\n }\n },\n [isDeleting, onClose]\n );\n\n // Handle escape key\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && !isDeleting) {\n onClose();\n }\n },\n [isDeleting, onClose]\n );\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50\"\n onClick={handleBackdropClick}\n onKeyDown={handleKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-dialog-title\"\n >\n <div className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full\">\n {/* Header */}\n <div className=\"p-6 border-b border-border-default\">\n <h2 id=\"delete-dialog-title\" className=\"text-lg font-semibold text-text-primary\">\n Delete DataSink\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n <p className=\"text-sm text-text-primary mb-4\">Are you sure you want to delete this DataSink?</p>\n\n <div className=\"bg-bg-muted p-3 rounded-md\">\n <p className=\"text-sm font-medium text-text-primary\">{dataSink.name || 'Untitled DataSink'}</p>\n <p className=\"text-xs text-text-secondary mt-1 font-mono\">{dataSink.key}</p>\n </div>\n\n {dataSink.linkedWorkflowCount && dataSink.linkedWorkflowCount > 0 && (\n <div className=\"mt-4 p-3 bg-state-warning/10 border border-state-warning/20 rounded-md\">\n <p className=\"text-sm text-state-warning\">\n This DataSink is linked to {dataSink.linkedWorkflowCount} workflow\n {dataSink.linkedWorkflowCount !== 1 ? 's' : ''}. Deleting it will remove these links.\n </p>\n </div>\n )}\n\n <p className=\"text-sm text-state-error mt-4\">This action cannot be undone.</p>\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t border-border-default flex items-center justify-end gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isDeleting}\n className={`\n px-4 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-muted\n hover:bg-border-default\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n disabled={isDeleting}\n className={`\n px-4 py-2\n text-sm font-medium\n text-white\n bg-state-error\n hover:bg-state-error/90\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {isDeleting ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkDeleteDialog;\n"],"mappings":";;;AA8BA,IAAa,IAAuB,EAAK,SAA8B,EACrE,aACA,WACA,YACA,cACA,gBAAa,MACe;CAE5B,IAAM,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAY,EAAQ,CACtB,EAGK,IAAgB,GACnB,MAA2B;AAC1B,EAAI,EAAE,QAAQ,YAAY,CAAC,KACzB,GAAS;IAGb,CAAC,GAAY,EAAQ,CACtB;AAMD,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,WAAW;EACX,MAAK;EACL,cAAW;EACX,mBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAG;MAAsB,WAAU;gBAA0C;MAE5E,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAiC;OAAkD,CAAA;MAEhG,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAyC,EAAS,QAAQ;QAAwB,CAAA,EAC/F,kBAAC,KAAD;QAAG,WAAU;kBAA8C,EAAS;QAAQ,CAAA,CACxE;;MAEL,EAAS,uBAAuB,EAAS,sBAAsB,KAC9D,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA0C;SACZ,EAAS;SAAoB;SACxD,EAAS,wBAAwB,IAAU,KAAN;SAAS;SAC7C;;OACA,CAAA;MAGR,kBAAC,KAAD;OAAG,WAAU;iBAAgC;OAAiC,CAAA;MAC1E;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAUZ;MAEQ,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,IAAa,gBAAgB;MACvB,CAAA,CACL;;IACF;;EACF,CAAA,GA/EC;EAiFT"}
1
+ {"version":3,"file":"DataSinkDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkDeleteDialog.tsx"],"sourcesContent":["/**\n * DataSink Delete Dialog\n *\n * Confirmation dialog for deleting a DataSink.\n */\n\nimport { memo, useCallback } from 'react';\nimport type { DataSink } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkDeleteDialogProps {\n /** DataSink to delete */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when delete is confirmed */\n onConfirm: () => void;\n /** Whether delete is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkDeleteDialog = memo(function DataSinkDeleteDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isDeleting = false,\n}: DataSinkDeleteDialogProps) {\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isDeleting) {\n onClose();\n }\n },\n [isDeleting, onClose]\n );\n\n // Handle escape key\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && !isDeleting) {\n onClose();\n }\n },\n [isDeleting, onClose]\n );\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50\"\n onClick={handleBackdropClick}\n onKeyDown={handleKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-dialog-title\"\n >\n <div className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full\">\n {/* Header */}\n <div className=\"p-6 border-b border-border-default\">\n <h2 id=\"delete-dialog-title\" className=\"text-lg font-semibold text-text-primary\">\n Delete DataSink\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n <p className=\"text-sm text-text-primary mb-4\">Are you sure you want to delete this DataSink?</p>\n\n <div className=\"bg-bg-sunken p-3 rounded-md\">\n <p className=\"text-sm font-medium text-text-primary\">{dataSink.name || 'Untitled DataSink'}</p>\n <p className=\"text-xs text-text-secondary mt-1 font-mono\">{dataSink.key}</p>\n </div>\n\n {dataSink.linkedWorkflowCount && dataSink.linkedWorkflowCount > 0 && (\n <div className=\"mt-4 p-3 bg-state-warning/10 border border-state-warning/20 rounded-md\">\n <p className=\"text-sm text-state-warning\">\n This DataSink is linked to {dataSink.linkedWorkflowCount} workflow\n {dataSink.linkedWorkflowCount !== 1 ? 's' : ''}. Deleting it will remove these links.\n </p>\n </div>\n )}\n\n <p className=\"text-sm text-state-error mt-4\">This action cannot be undone.</p>\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t border-border-default flex items-center justify-end gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isDeleting}\n className={`\n px-4 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-sunken\n hover:bg-border-default\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n disabled={isDeleting}\n className={`\n px-4 py-2\n text-sm font-medium\n text-white\n bg-state-error\n hover:bg-state-error/90\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {isDeleting ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkDeleteDialog;\n"],"mappings":";;;AA8BA,IAAa,IAAuB,EAAK,SAA8B,EACrE,aACA,WACA,YACA,cACA,gBAAa,MACe;CAE5B,IAAM,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAY,EAAQ,CACtB,EAGK,IAAgB,GACnB,MAA2B;AAC1B,EAAI,EAAE,QAAQ,YAAY,CAAC,KACzB,GAAS;IAGb,CAAC,GAAY,EAAQ,CACtB;AAMD,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,WAAW;EACX,MAAK;EACL,cAAW;EACX,mBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAG;MAAsB,WAAU;gBAA0C;MAE5E,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAiC;OAAkD,CAAA;MAEhG,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAyC,EAAS,QAAQ;QAAwB,CAAA,EAC/F,kBAAC,KAAD;QAAG,WAAU;kBAA8C,EAAS;QAAQ,CAAA,CACxE;;MAEL,EAAS,uBAAuB,EAAS,sBAAsB,KAC9D,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA0C;SACZ,EAAS;SAAoB;SACxD,EAAS,wBAAwB,IAAU,KAAN;SAAS;SAC7C;;OACA,CAAA;MAGR,kBAAC,KAAD;OAAG,WAAU;iBAAgC;OAAiC,CAAA;MAC1E;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAUZ;MAEQ,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,IAAa,gBAAgB;MACvB,CAAA,CACL;;IACF;;EACF,CAAA,GA/EC;EAiFT"}
@@ -28,7 +28,7 @@ var a = e(function({ dataSink: e, isOpen: a, onClose: o, onConfirm: s, isRefresh
28
28
  className: "p-6",
29
29
  children: [
30
30
  /* @__PURE__ */ i("div", {
31
- className: "bg-bg-muted p-3 rounded-md mb-4",
31
+ className: "bg-bg-sunken p-3 rounded-md mb-4",
32
32
  children: [
33
33
  /* @__PURE__ */ r("p", {
34
34
  className: "text-sm font-medium text-text-primary",
@@ -68,7 +68,7 @@ var a = e(function({ dataSink: e, isOpen: a, onClose: o, onConfirm: s, isRefresh
68
68
  type: "button",
69
69
  onClick: o,
70
70
  disabled: c,
71
- className: "\n px-4 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-muted\n hover:bg-border-default\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n ",
71
+ className: "\n px-4 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-sunken\n hover:bg-border-default\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n ",
72
72
  children: "Cancel"
73
73
  }), /* @__PURE__ */ r("button", {
74
74
  type: "button",
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkRefreshDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkRefreshDialog.tsx"],"sourcesContent":["/**\n * DataSink Refresh Dialog\n *\n * Dialog for confirming DataSink refresh with force option.\n */\n\nimport { memo, useState, useCallback } from 'react';\nimport type { DataSink } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkRefreshDialogProps {\n /** DataSink to refresh */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when refresh is confirmed (with force flag) */\n onConfirm: (force: boolean) => void;\n /** Whether refresh is in progress */\n isRefreshing?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkRefreshDialog = memo(function DataSinkRefreshDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isRefreshing = false,\n}: DataSinkRefreshDialogProps) {\n const [forceRefresh, setForceRefresh] = useState(false);\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isRefreshing) {\n onClose();\n }\n },\n [isRefreshing, onClose]\n );\n\n // Format date\n const formatDate = (dateString: string) => {\n return new Date(dateString).toLocaleString();\n };\n\n // Handle confirm\n const handleConfirm = useCallback(() => {\n onConfirm(forceRefresh);\n }, [onConfirm, forceRefresh]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"refresh-dialog-title\"\n >\n <div className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full\">\n {/* Header */}\n <div className=\"p-6 border-b border-border-default\">\n <h2 id=\"refresh-dialog-title\" className=\"text-lg font-semibold text-text-primary\">\n Refresh DataSink\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n {/* DataSink info */}\n <div className=\"bg-bg-muted p-3 rounded-md mb-4\">\n <p className=\"text-sm font-medium text-text-primary\">{dataSink.name || 'Untitled DataSink'}</p>\n <p className=\"text-xs text-text-secondary mt-1 font-mono\">{dataSink.key}</p>\n {dataSink.lastRefreshedAt && (\n <p className=\"text-xs text-text-secondary mt-2\">Last refreshed: {formatDate(dataSink.lastRefreshedAt)}</p>\n )}\n </div>\n\n {/* Force refresh option */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={forceRefresh}\n onChange={(e) => setForceRefresh(e.target.checked)}\n className=\"w-4 h-4 text-action-primary-bg focus:ring-action-primary-bg rounded\"\n />\n <span className=\"text-sm text-text-primary\">Force refresh (bypass cache)</span>\n </label>\n <p className=\"mt-2 text-xs text-text-secondary\">\n Force refresh will re-fetch all data from the source, ignoring any cached values.\n </p>\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t border-border-default flex items-center justify-end gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isRefreshing}\n className={`\n px-4 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-muted\n hover:bg-border-default\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={isRefreshing}\n className={`\n px-4 py-2\n text-sm font-medium\n text-action-primary-fg\n bg-action-primary-bg\n hover:bg-action-primary-bgHover\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {isRefreshing ? 'Refreshing...' : 'Refresh'}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkRefreshDialog;\n"],"mappings":";;;AA8BA,IAAa,IAAwB,EAAK,SAA+B,EACvE,aACA,WACA,YACA,cACA,kBAAe,MACc;CAC7B,IAAM,CAAC,GAAc,KAAmB,EAAS,GAAM,EAGjD,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAc,EAAQ,CACxB,EAGK,KAAc,MACX,IAAI,KAAK,EAAW,CAAC,gBAAgB,EAIxC,IAAgB,QAAkB;AACtC,IAAU,EAAa;IACtB,CAAC,GAAW,EAAa,CAAC;AAM7B,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,MAAK;EACL,cAAW;EACX,mBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAG;MAAuB,WAAU;gBAA0C;MAE7E,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,KAAD;SAAG,WAAU;mBAAyC,EAAS,QAAQ;SAAwB,CAAA;QAC/F,kBAAC,KAAD;SAAG,WAAU;mBAA8C,EAAS;SAAQ,CAAA;QAC3E,EAAS,mBACR,kBAAC,KAAD;SAAG,WAAU;mBAAb,CAAgD,oBAAiB,EAAW,EAAS,gBAAgB,CAAK;;QAExG;;MAGN,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;QAClD,WAAU;QACV,CAAA,EACF,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAAmC,CAAA,CACzE;;MACR,kBAAC,KAAD;OAAG,WAAU;iBAAmC;OAE5C,CAAA;MACA;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAUZ;MAEQ,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,IAAe,kBAAkB;MAC3B,CAAA,CACL;;IACF;;EACF,CAAA,GAnFC;EAqFT"}
1
+ {"version":3,"file":"DataSinkRefreshDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkRefreshDialog.tsx"],"sourcesContent":["/**\n * DataSink Refresh Dialog\n *\n * Dialog for confirming DataSink refresh with force option.\n */\n\nimport { memo, useState, useCallback } from 'react';\nimport type { DataSink } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkRefreshDialogProps {\n /** DataSink to refresh */\n dataSink: DataSink;\n /** Whether dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when refresh is confirmed (with force flag) */\n onConfirm: (force: boolean) => void;\n /** Whether refresh is in progress */\n isRefreshing?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkRefreshDialog = memo(function DataSinkRefreshDialog({\n dataSink,\n isOpen,\n onClose,\n onConfirm,\n isRefreshing = false,\n}: DataSinkRefreshDialogProps) {\n const [forceRefresh, setForceRefresh] = useState(false);\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isRefreshing) {\n onClose();\n }\n },\n [isRefreshing, onClose]\n );\n\n // Format date\n const formatDate = (dateString: string) => {\n return new Date(dateString).toLocaleString();\n };\n\n // Handle confirm\n const handleConfirm = useCallback(() => {\n onConfirm(forceRefresh);\n }, [onConfirm, forceRefresh]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"refresh-dialog-title\"\n >\n <div className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl max-w-md w-full\">\n {/* Header */}\n <div className=\"p-6 border-b border-border-default\">\n <h2 id=\"refresh-dialog-title\" className=\"text-lg font-semibold text-text-primary\">\n Refresh DataSink\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n {/* DataSink info */}\n <div className=\"bg-bg-sunken p-3 rounded-md mb-4\">\n <p className=\"text-sm font-medium text-text-primary\">{dataSink.name || 'Untitled DataSink'}</p>\n <p className=\"text-xs text-text-secondary mt-1 font-mono\">{dataSink.key}</p>\n {dataSink.lastRefreshedAt && (\n <p className=\"text-xs text-text-secondary mt-2\">Last refreshed: {formatDate(dataSink.lastRefreshedAt)}</p>\n )}\n </div>\n\n {/* Force refresh option */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={forceRefresh}\n onChange={(e) => setForceRefresh(e.target.checked)}\n className=\"w-4 h-4 text-action-primary-bg focus:ring-action-primary-bg rounded\"\n />\n <span className=\"text-sm text-text-primary\">Force refresh (bypass cache)</span>\n </label>\n <p className=\"mt-2 text-xs text-text-secondary\">\n Force refresh will re-fetch all data from the source, ignoring any cached values.\n </p>\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t border-border-default flex items-center justify-end gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isRefreshing}\n className={`\n px-4 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-sunken\n hover:bg-border-default\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={isRefreshing}\n className={`\n px-4 py-2\n text-sm font-medium\n text-action-primary-fg\n bg-action-primary-bg\n hover:bg-action-primary-bgHover\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-md\n transition-colors\n `}\n >\n {isRefreshing ? 'Refreshing...' : 'Refresh'}\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default DataSinkRefreshDialog;\n"],"mappings":";;;AA8BA,IAAa,IAAwB,EAAK,SAA+B,EACvE,aACA,WACA,YACA,cACA,kBAAe,MACc;CAC7B,IAAM,CAAC,GAAc,KAAmB,EAAS,GAAM,EAGjD,IAAsB,GACzB,MAAwB;AACvB,EAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,KACnC,GAAS;IAGb,CAAC,GAAc,EAAQ,CACxB,EAGK,KAAc,MACX,IAAI,KAAK,EAAW,CAAC,gBAAgB,EAIxC,IAAgB,QAAkB;AACtC,IAAU,EAAa;IACtB,CAAC,GAAW,EAAa,CAAC;AAM7B,QAJK,IAKH,kBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,MAAK;EACL,cAAW;EACX,mBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,IAAG;MAAuB,WAAU;gBAA0C;MAE7E,CAAA;KACD,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,KAAD;SAAG,WAAU;mBAAyC,EAAS,QAAQ;SAAwB,CAAA;QAC/F,kBAAC,KAAD;SAAG,WAAU;mBAA8C,EAAS;SAAQ,CAAA;QAC3E,EAAS,mBACR,kBAAC,KAAD;SAAG,WAAU;mBAAb,CAAgD,oBAAiB,EAAW,EAAS,gBAAgB,CAAK;;QAExG;;MAGN,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;QAClD,WAAU;QACV,CAAA,EACF,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAAmC,CAAA,CACzE;;MACR,kBAAC,KAAD;OAAG,WAAU;iBAAmC;OAE5C,CAAA;MACA;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAUZ;MAEQ,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAW;gBAWV,IAAe,kBAAkB;MAC3B,CAAA,CACL;;IACF;;EACF,CAAA,GAnFC;EAqFT"}
@@ -1,7 +1,7 @@
1
1
  import { memo as e, useCallback as t, useMemo as n, useState as r } from "react";
2
2
  import { ChevronLeft as i, ChevronRight as a, ChevronsLeft as o, ChevronsRight as s, Settings2 as c, X as l } from "lucide-react";
3
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
4
- import { Button as f } from "@burdenoff/fe-libs/ui";
3
+ import { Button as u } from "@burdenoff/fe-libs/ui";
4
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
5
5
  import { Table as p, TableBody as m, TableCell as h, TableHead as g, TableHeader as _, TableRow as v } from "@burdenoff/fe-libs/ui/table";
6
6
  //#region src/bigconsole/components/datasink/DataSinkTableViewer.tsx
7
7
  function y(e) {
@@ -57,15 +57,15 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
57
57
  }, []), L = t(() => {
58
58
  O(null), A(!1);
59
59
  }, []);
60
- return j.length === 0 ? /* @__PURE__ */ u("div", {
60
+ return j.length === 0 ? /* @__PURE__ */ d("div", {
61
61
  className: "flex items-center justify-center p-8 text-text-secondary text-body-sm",
62
62
  children: "No tabular data available. Data must be an array of objects for table view."
63
- }) : /* @__PURE__ */ d("div", {
63
+ }) : /* @__PURE__ */ f("div", {
64
64
  className: "relative",
65
65
  children: [
66
- /* @__PURE__ */ d("div", {
67
- className: "flex items-center justify-between p-3 bg-bg-muted border-b border-border-default",
68
- children: [/* @__PURE__ */ d("span", {
66
+ /* @__PURE__ */ f("div", {
67
+ className: "flex items-center justify-between p-3 bg-bg-sunken border-b border-border-default",
68
+ children: [/* @__PURE__ */ f("span", {
69
69
  className: "text-xs text-text-secondary",
70
70
  children: [
71
71
  j.length,
@@ -73,39 +73,39 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
73
73
  N.length,
74
74
  " columns"
75
75
  ]
76
- }), /* @__PURE__ */ u("div", {
76
+ }), /* @__PURE__ */ d("div", {
77
77
  className: "flex items-center gap-2",
78
- children: /* @__PURE__ */ u(f, {
78
+ children: /* @__PURE__ */ d(u, {
79
79
  variant: "ghost",
80
80
  size: "sm",
81
81
  onClick: () => A((e) => !e),
82
- children: /* @__PURE__ */ u(c, { className: "w-4 h-4" })
82
+ children: /* @__PURE__ */ d(c, { className: "w-4 h-4" })
83
83
  })
84
84
  })]
85
85
  }),
86
- k && /* @__PURE__ */ d("div", {
86
+ k && /* @__PURE__ */ f("div", {
87
87
  className: "absolute right-0 top-10 z-10 bg-bg-surface border border-border-default rounded-md shadow-lg p-3 min-w-[200px] max-h-[300px] overflow-auto",
88
- children: [/* @__PURE__ */ d("div", {
88
+ children: [/* @__PURE__ */ f("div", {
89
89
  className: "flex items-center justify-between mb-2",
90
- children: [/* @__PURE__ */ u("span", {
90
+ children: [/* @__PURE__ */ d("span", {
91
91
  className: "text-xs font-medium text-text-primary",
92
92
  children: "Select Columns"
93
- }), /* @__PURE__ */ u(f, {
93
+ }), /* @__PURE__ */ d(u, {
94
94
  variant: "ghost",
95
95
  size: "sm",
96
96
  onClick: L,
97
- children: /* @__PURE__ */ u(l, { className: "w-3 h-3" })
97
+ children: /* @__PURE__ */ d(l, { className: "w-3 h-3" })
98
98
  })]
99
- }), /* @__PURE__ */ u("div", {
99
+ }), /* @__PURE__ */ d("div", {
100
100
  className: "space-y-1",
101
- children: M.map((e) => /* @__PURE__ */ d("label", {
101
+ children: M.map((e) => /* @__PURE__ */ f("label", {
102
102
  className: "flex items-center gap-2 text-xs text-text-secondary hover:text-text-primary cursor-pointer",
103
- children: [/* @__PURE__ */ u("input", {
103
+ children: [/* @__PURE__ */ d("input", {
104
104
  type: "checkbox",
105
105
  checked: !D || D.includes(e.key),
106
106
  onChange: () => I(e.key),
107
107
  className: "rounded border-border-default"
108
- }), /* @__PURE__ */ u("span", {
108
+ }), /* @__PURE__ */ d("span", {
109
109
  className: "truncate",
110
110
  title: e.key,
111
111
  children: e.label
@@ -113,17 +113,17 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
113
113
  }, e.key))
114
114
  })]
115
115
  }),
116
- /* @__PURE__ */ u("div", {
116
+ /* @__PURE__ */ d("div", {
117
117
  className: "overflow-auto",
118
118
  style: { maxHeight: w },
119
- children: /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(_, { children: /* @__PURE__ */ u(v, { children: N.map((e) => /* @__PURE__ */ u(g, {
119
+ children: /* @__PURE__ */ f(p, { children: [/* @__PURE__ */ d(_, { children: /* @__PURE__ */ d(v, { children: N.map((e) => /* @__PURE__ */ d(g, {
120
120
  title: e.path,
121
121
  children: e.label
122
- }, e.key)) }) }), /* @__PURE__ */ u(m, { children: P.map((e, t) => /* @__PURE__ */ u(v, { children: N.map((t) => /* @__PURE__ */ u(h, { children: C(S(e, t.path)) }, t.key)) }, t)) })] })
122
+ }, e.key)) }) }), /* @__PURE__ */ d(m, { children: P.map((e, t) => /* @__PURE__ */ d(v, { children: N.map((t) => /* @__PURE__ */ d(h, { children: C(S(e, t.path)) }, t.key)) }, t)) })] })
123
123
  }),
124
- F > 1 && /* @__PURE__ */ d("div", {
125
- className: "flex items-center justify-between p-3 bg-bg-muted border-t border-border-default",
126
- children: [/* @__PURE__ */ d("span", {
124
+ F > 1 && /* @__PURE__ */ f("div", {
125
+ className: "flex items-center justify-between p-3 bg-bg-sunken border-t border-border-default",
126
+ children: [/* @__PURE__ */ f("span", {
127
127
  className: "text-xs text-text-secondary",
128
128
  children: [
129
129
  "Page ",
@@ -131,36 +131,36 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
131
131
  " of ",
132
132
  F
133
133
  ]
134
- }), /* @__PURE__ */ d("div", {
134
+ }), /* @__PURE__ */ f("div", {
135
135
  className: "flex items-center gap-1",
136
136
  children: [
137
- /* @__PURE__ */ u(f, {
137
+ /* @__PURE__ */ d(u, {
138
138
  variant: "ghost",
139
139
  size: "sm",
140
140
  onClick: () => E(0),
141
141
  disabled: T === 0,
142
- children: /* @__PURE__ */ u(o, { className: "w-4 h-4" })
142
+ children: /* @__PURE__ */ d(o, { className: "w-4 h-4" })
143
143
  }),
144
- /* @__PURE__ */ u(f, {
144
+ /* @__PURE__ */ d(u, {
145
145
  variant: "ghost",
146
146
  size: "sm",
147
147
  onClick: () => E((e) => Math.max(0, e - 1)),
148
148
  disabled: T === 0,
149
- children: /* @__PURE__ */ u(i, { className: "w-4 h-4" })
149
+ children: /* @__PURE__ */ d(i, { className: "w-4 h-4" })
150
150
  }),
151
- /* @__PURE__ */ u(f, {
151
+ /* @__PURE__ */ d(u, {
152
152
  variant: "ghost",
153
153
  size: "sm",
154
154
  onClick: () => E((e) => Math.min(F - 1, e + 1)),
155
155
  disabled: T >= F - 1,
156
- children: /* @__PURE__ */ u(a, { className: "w-4 h-4" })
156
+ children: /* @__PURE__ */ d(a, { className: "w-4 h-4" })
157
157
  }),
158
- /* @__PURE__ */ u(f, {
158
+ /* @__PURE__ */ d(u, {
159
159
  variant: "ghost",
160
160
  size: "sm",
161
161
  onClick: () => E(F - 1),
162
162
  disabled: T >= F - 1,
163
- children: /* @__PURE__ */ u(s, { className: "w-4 h-4" })
163
+ children: /* @__PURE__ */ d(s, { className: "w-4 h-4" })
164
164
  })
165
165
  ]
166
166
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkTableViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkTableViewer.tsx"],"sourcesContent":["/**\n * DataSink Table Viewer\n *\n * Component for viewing DataSink data in tabular format with support for\n * nested data, column selection, and multiple view modes.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@burdenoff/fe-libs/ui/table';\n\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Settings2, X } from 'lucide-react';\n\ninterface DataSinkTableViewerProps {\n data: unknown;\n maxHeight?: string;\n}\n\ninterface Column {\n key: string;\n label: string;\n path: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): boolean {\n return Array.isArray(value) && value.length > 0 && isObject(value[0]);\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (isObject(value) && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '-';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport const DataSinkTableViewer = memo(function DataSinkTableViewer({\n data,\n maxHeight = '400px',\n}: DataSinkTableViewerProps) {\n const [page, setPage] = useState(0);\n const PAGE_SIZE = 50;\n const [selectedColumns, setSelectedColumns] = useState<string[] | null>(null);\n const [showColumnPicker, setShowColumnPicker] = useState(false);\n\n const rows = useMemo(() => {\n if (!data) return [];\n if (Array.isArray(data) && isArrayOfObjects(data)) {\n return data as Record<string, unknown>[];\n }\n if (isObject(data)) {\n return [data];\n }\n return [];\n }, [data]);\n\n const allColumns = useMemo(() => {\n if (rows.length === 0) return [];\n\n const columnMap = new Map<string, Column>();\n\n for (const row of rows) {\n const flat = flattenObject(row);\n for (const key of Object.keys(flat)) {\n if (!columnMap.has(key)) {\n const parts = key.split('.');\n const label = parts[parts.length - 1];\n columnMap.set(key, { key, label, path: key });\n }\n }\n }\n\n return Array.from(columnMap.values());\n }, [rows]);\n\n const displayColumns = useMemo(() => {\n if (selectedColumns) {\n return allColumns.filter((col) => selectedColumns.includes(col.key));\n }\n return allColumns.slice(0, 10);\n }, [allColumns, selectedColumns]);\n\n const paginatedRows = useMemo(() => {\n const start = page * PAGE_SIZE;\n return rows.slice(start, start + PAGE_SIZE);\n }, [rows, page]);\n\n const totalPages = Math.ceil(rows.length / PAGE_SIZE);\n\n const handleColumnToggle = useCallback((columnKey: string) => {\n setSelectedColumns((prev) => {\n if (!prev) {\n return [columnKey];\n }\n if (prev.includes(columnKey)) {\n const next = prev.filter((k) => k !== columnKey);\n return next.length > 0 ? next : null;\n }\n return [...prev, columnKey];\n });\n }, []);\n\n const handleResetColumns = useCallback(() => {\n setSelectedColumns(null);\n setShowColumnPicker(false);\n }, []);\n\n if (rows.length === 0) {\n return (\n <div className=\"flex items-center justify-center p-8 text-text-secondary text-body-sm\">\n No tabular data available. Data must be an array of objects for table view.\n </div>\n );\n }\n\n return (\n <div className=\"relative\">\n <div className=\"flex items-center justify-between p-3 bg-bg-muted border-b border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n {rows.length} rows &middot; {displayColumns.length} columns\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowColumnPicker((v) => !v)}>\n <Settings2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {showColumnPicker && (\n <div className=\"absolute right-0 top-10 z-10 bg-bg-surface border border-border-default rounded-md shadow-lg p-3 min-w-[200px] max-h-[300px] overflow-auto\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-medium text-text-primary\">Select Columns</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResetColumns}>\n <X className=\"w-3 h-3\" />\n </Button>\n </div>\n <div className=\"space-y-1\">\n {allColumns.map((col) => {\n const isSelected = !selectedColumns || selectedColumns.includes(col.key);\n return (\n <label\n key={col.key}\n className=\"flex items-center gap-2 text-xs text-text-secondary hover:text-text-primary cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleColumnToggle(col.key)}\n className=\"rounded border-border-default\"\n />\n <span className=\"truncate\" title={col.key}>\n {col.label}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <Table>\n <TableHeader>\n <TableRow>\n {displayColumns.map((col) => (\n <TableHead key={col.key} title={col.path}>\n {col.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {displayColumns.map((col) => (\n <TableCell key={col.key}>{formatCellValue(getNestedValue(row, col.path))}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between p-3 bg-bg-muted border-t border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n Page {page + 1} of {totalPages}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(0)} disabled={page === 0}>\n <ChevronsLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage((p) => Math.max(0, p - 1))} disabled={page === 0}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(totalPages - 1)} disabled={page >= totalPages - 1}>\n <ChevronsRight className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default DataSinkTableViewer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataSinkTableViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkTableViewer.tsx"],"sourcesContent":["/**\n * DataSink Table Viewer\n *\n * Component for viewing DataSink data in tabular format with support for\n * nested data, column selection, and multiple view modes.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@burdenoff/fe-libs/ui/table';\n\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Settings2, X } from 'lucide-react';\n\ninterface DataSinkTableViewerProps {\n data: unknown;\n maxHeight?: string;\n}\n\ninterface Column {\n key: string;\n label: string;\n path: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): boolean {\n return Array.isArray(value) && value.length > 0 && isObject(value[0]);\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (isObject(value) && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '-';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport const DataSinkTableViewer = memo(function DataSinkTableViewer({\n data,\n maxHeight = '400px',\n}: DataSinkTableViewerProps) {\n const [page, setPage] = useState(0);\n const PAGE_SIZE = 50;\n const [selectedColumns, setSelectedColumns] = useState<string[] | null>(null);\n const [showColumnPicker, setShowColumnPicker] = useState(false);\n\n const rows = useMemo(() => {\n if (!data) return [];\n if (Array.isArray(data) && isArrayOfObjects(data)) {\n return data as Record<string, unknown>[];\n }\n if (isObject(data)) {\n return [data];\n }\n return [];\n }, [data]);\n\n const allColumns = useMemo(() => {\n if (rows.length === 0) return [];\n\n const columnMap = new Map<string, Column>();\n\n for (const row of rows) {\n const flat = flattenObject(row);\n for (const key of Object.keys(flat)) {\n if (!columnMap.has(key)) {\n const parts = key.split('.');\n const label = parts[parts.length - 1];\n columnMap.set(key, { key, label, path: key });\n }\n }\n }\n\n return Array.from(columnMap.values());\n }, [rows]);\n\n const displayColumns = useMemo(() => {\n if (selectedColumns) {\n return allColumns.filter((col) => selectedColumns.includes(col.key));\n }\n return allColumns.slice(0, 10);\n }, [allColumns, selectedColumns]);\n\n const paginatedRows = useMemo(() => {\n const start = page * PAGE_SIZE;\n return rows.slice(start, start + PAGE_SIZE);\n }, [rows, page]);\n\n const totalPages = Math.ceil(rows.length / PAGE_SIZE);\n\n const handleColumnToggle = useCallback((columnKey: string) => {\n setSelectedColumns((prev) => {\n if (!prev) {\n return [columnKey];\n }\n if (prev.includes(columnKey)) {\n const next = prev.filter((k) => k !== columnKey);\n return next.length > 0 ? next : null;\n }\n return [...prev, columnKey];\n });\n }, []);\n\n const handleResetColumns = useCallback(() => {\n setSelectedColumns(null);\n setShowColumnPicker(false);\n }, []);\n\n if (rows.length === 0) {\n return (\n <div className=\"flex items-center justify-center p-8 text-text-secondary text-body-sm\">\n No tabular data available. Data must be an array of objects for table view.\n </div>\n );\n }\n\n return (\n <div className=\"relative\">\n <div className=\"flex items-center justify-between p-3 bg-bg-sunken border-b border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n {rows.length} rows &middot; {displayColumns.length} columns\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowColumnPicker((v) => !v)}>\n <Settings2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {showColumnPicker && (\n <div className=\"absolute right-0 top-10 z-10 bg-bg-surface border border-border-default rounded-md shadow-lg p-3 min-w-[200px] max-h-[300px] overflow-auto\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-medium text-text-primary\">Select Columns</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResetColumns}>\n <X className=\"w-3 h-3\" />\n </Button>\n </div>\n <div className=\"space-y-1\">\n {allColumns.map((col) => {\n const isSelected = !selectedColumns || selectedColumns.includes(col.key);\n return (\n <label\n key={col.key}\n className=\"flex items-center gap-2 text-xs text-text-secondary hover:text-text-primary cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleColumnToggle(col.key)}\n className=\"rounded border-border-default\"\n />\n <span className=\"truncate\" title={col.key}>\n {col.label}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <Table>\n <TableHeader>\n <TableRow>\n {displayColumns.map((col) => (\n <TableHead key={col.key} title={col.path}>\n {col.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {displayColumns.map((col) => (\n <TableCell key={col.key}>{formatCellValue(getNestedValue(row, col.path))}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between p-3 bg-bg-sunken border-t border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n Page {page + 1} of {totalPages}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(0)} disabled={page === 0}>\n <ChevronsLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage((p) => Math.max(0, p - 1))} disabled={page === 0}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(totalPages - 1)} disabled={page >= totalPages - 1}>\n <ChevronsRight className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default DataSinkTableViewer;\n"],"mappings":"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"}
@@ -2,8 +2,8 @@ import e from "../../hooks/useExportDataSink.js";
2
2
  import "../../hooks/index.js";
3
3
  import { memo as t, useCallback as n, useEffect as r, useState as i } from "react";
4
4
  import { Check as a, Download as o, FileJson as s } from "lucide-react";
5
- import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
6
- import { Dialog as d, DialogContent as f, DialogDescription as p, DialogTitle as m, Spinner as h } from "@burdenoff/fe-libs/ui";
5
+ import { Dialog as c, DialogContent as l, DialogDescription as u, DialogTitle as d, Spinner as f } from "@burdenoff/fe-libs/ui";
6
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
7
7
  //#region src/bigconsole/components/datasink/ExportDataSinkDialog.tsx
8
8
  var g = {
9
9
  dialogContent: {
@@ -169,7 +169,7 @@ var g = {
169
169
  cursor: "not-allowed"
170
170
  }
171
171
  }, _ = t(function({ checked: e, onChange: t, disabled: n, label: r, description: i }) {
172
- return /* @__PURE__ */ u("div", {
172
+ return /* @__PURE__ */ h("div", {
173
173
  style: {
174
174
  ...g.optionItem,
175
175
  ...e ? g.optionItemActive : {},
@@ -177,22 +177,22 @@ var g = {
177
177
  cursor: n ? "not-allowed" : "pointer"
178
178
  },
179
179
  onClick: () => !n && t(!e),
180
- children: [/* @__PURE__ */ l("div", {
180
+ children: [/* @__PURE__ */ m("div", {
181
181
  style: {
182
182
  ...g.checkbox,
183
183
  ...e ? g.checkboxChecked : {}
184
184
  },
185
- children: e && /* @__PURE__ */ l(a, { style: {
185
+ children: e && /* @__PURE__ */ m(a, { style: {
186
186
  width: "14px",
187
187
  height: "14px",
188
188
  color: "var(--color-action-primary-text)"
189
189
  } })
190
- }), /* @__PURE__ */ u("div", {
190
+ }), /* @__PURE__ */ h("div", {
191
191
  style: g.optionText,
192
- children: [/* @__PURE__ */ l("p", {
192
+ children: [/* @__PURE__ */ m("p", {
193
193
  style: g.optionLabel,
194
194
  children: r
195
- }), /* @__PURE__ */ l("p", {
195
+ }), /* @__PURE__ */ m("p", {
196
196
  style: g.optionDescription,
197
197
  children: i
198
198
  })]
@@ -213,73 +213,73 @@ var g = {
213
213
  b,
214
214
  y
215
215
  ]);
216
- return a ? /* @__PURE__ */ l(d, {
216
+ return a ? /* @__PURE__ */ m(c, {
217
217
  open: t,
218
218
  onOpenChange: (e) => !e && !C && y(),
219
- children: /* @__PURE__ */ u(f, {
219
+ children: /* @__PURE__ */ h(l, {
220
220
  style: g.dialogContent,
221
221
  children: [
222
- /* @__PURE__ */ u("div", {
222
+ /* @__PURE__ */ h("div", {
223
223
  style: g.header,
224
- children: [/* @__PURE__ */ l("div", {
224
+ children: [/* @__PURE__ */ m("div", {
225
225
  style: g.iconWrapper,
226
- children: /* @__PURE__ */ l(s, { style: {
226
+ children: /* @__PURE__ */ m(s, { style: {
227
227
  width: "22px",
228
228
  height: "22px"
229
229
  } })
230
- }), /* @__PURE__ */ u("div", {
230
+ }), /* @__PURE__ */ h("div", {
231
231
  style: g.headerText,
232
- children: [/* @__PURE__ */ l(m, {
232
+ children: [/* @__PURE__ */ m(d, {
233
233
  asChild: !0,
234
- children: /* @__PURE__ */ l("h2", {
234
+ children: /* @__PURE__ */ m("h2", {
235
235
  style: g.title,
236
236
  children: "Export DataSink"
237
237
  })
238
- }), /* @__PURE__ */ l(p, {
238
+ }), /* @__PURE__ */ m(u, {
239
239
  asChild: !0,
240
- children: /* @__PURE__ */ l("p", {
240
+ children: /* @__PURE__ */ m("p", {
241
241
  style: g.description,
242
242
  children: "Export your DataSink configuration to a JSON file."
243
243
  })
244
244
  })]
245
245
  })]
246
246
  }),
247
- /* @__PURE__ */ u("div", {
247
+ /* @__PURE__ */ h("div", {
248
248
  style: g.content,
249
249
  children: [
250
- v && /* @__PURE__ */ u("div", {
250
+ v && /* @__PURE__ */ h("div", {
251
251
  style: g.dataSinkInfo,
252
- children: [/* @__PURE__ */ l("p", {
252
+ children: [/* @__PURE__ */ m("p", {
253
253
  style: g.dataSinkLabel,
254
254
  children: "Exporting:"
255
- }), /* @__PURE__ */ l("p", {
255
+ }), /* @__PURE__ */ m("p", {
256
256
  style: g.dataSinkName,
257
257
  children: v
258
258
  })]
259
259
  }),
260
- /* @__PURE__ */ l("p", {
260
+ /* @__PURE__ */ m("p", {
261
261
  style: g.optionsTitle,
262
262
  children: "Export Options"
263
263
  }),
264
- /* @__PURE__ */ l(_, {
264
+ /* @__PURE__ */ m(_, {
265
265
  checked: x,
266
266
  onChange: S,
267
267
  disabled: C,
268
268
  label: "Format JSON (Pretty Print)",
269
269
  description: "Makes the export file human-readable (larger file size)"
270
270
  }),
271
- w && /* @__PURE__ */ l("div", {
271
+ w && /* @__PURE__ */ m("div", {
272
272
  style: g.error,
273
- children: /* @__PURE__ */ l("p", {
273
+ children: /* @__PURE__ */ m("p", {
274
274
  style: g.errorText,
275
275
  children: w.message
276
276
  })
277
277
  })
278
278
  ]
279
279
  }),
280
- /* @__PURE__ */ u("div", {
280
+ /* @__PURE__ */ h("div", {
281
281
  style: g.footer,
282
- children: [/* @__PURE__ */ l("button", {
282
+ children: [/* @__PURE__ */ m("button", {
283
283
  style: g.cancelButton,
284
284
  onClick: y,
285
285
  disabled: C,
@@ -290,7 +290,7 @@ var g = {
290
290
  e.currentTarget.style.backgroundColor = "var(--color-bg-surface)";
291
291
  },
292
292
  children: "Cancel"
293
- }), /* @__PURE__ */ l("button", {
293
+ }), /* @__PURE__ */ m("button", {
294
294
  style: {
295
295
  ...g.exportButton,
296
296
  ...C ? g.exportButtonDisabled : {}
@@ -303,10 +303,10 @@ var g = {
303
303
  onMouseLeave: (e) => {
304
304
  C || (e.currentTarget.style.opacity = "1");
305
305
  },
306
- children: C ? /* @__PURE__ */ u(c, { children: [/* @__PURE__ */ l(h, { style: {
306
+ children: C ? /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m(f, { style: {
307
307
  width: "16px",
308
308
  height: "16px"
309
- } }), "Exporting..."] }) : /* @__PURE__ */ u(c, { children: [/* @__PURE__ */ l(o, { style: {
309
+ } }), "Exporting..."] }) : /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m(o, { style: {
310
310
  width: "16px",
311
311
  height: "16px"
312
312
  } }), "Download Export"] })