@burdenoff/microfe-bigconsole 2026.924.2 → 2026.924.3

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 (124) hide show
  1. package/dist/bigconsole/BigConsoleRoutes.js +137 -138
  2. package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
  3. package/dist/bigconsole/assistant/previewController.js +10 -10
  4. package/dist/bigconsole/components/DrilldownDashboardRenderer.js +17 -17
  5. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +32 -32
  6. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +52 -52
  7. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  8. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +7 -7
  9. package/dist/bigconsole/components/dashboard/DashboardStatusPill.js +53 -0
  10. package/dist/bigconsole/components/dashboard/DashboardStatusPill.js.map +1 -0
  11. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +60 -60
  12. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +21 -21
  13. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
  14. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +36 -36
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +38 -38
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  18. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +121 -121
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  20. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +22 -22
  21. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
  22. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +53 -53
  23. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
  24. package/dist/bigconsole/components/dashboard/WidgetPalette.js +47 -47
  25. package/dist/bigconsole/components/dashboard/index.js +1 -0
  26. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
  27. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
  28. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
  29. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +30 -29
  30. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  31. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +48 -48
  32. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +103 -103
  33. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  34. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
  35. package/dist/bigconsole/components/overview/DashboardGuide.js +214 -0
  36. package/dist/bigconsole/components/overview/DashboardGuide.js.map +1 -0
  37. package/dist/bigconsole/components/overview/DataHealthCard.js +97 -0
  38. package/dist/bigconsole/components/overview/DataHealthCard.js.map +1 -0
  39. package/dist/bigconsole/components/overview/OverviewQuickActions.js +32 -0
  40. package/dist/bigconsole/components/overview/OverviewQuickActions.js.map +1 -0
  41. package/dist/bigconsole/components/overview/OverviewStatCard.js +57 -0
  42. package/dist/bigconsole/components/overview/OverviewStatCard.js.map +1 -0
  43. package/dist/bigconsole/components/overview/RecentDashboardsPanel.js +107 -0
  44. package/dist/bigconsole/components/overview/RecentDashboardsPanel.js.map +1 -0
  45. package/dist/bigconsole/components/overview/dashboardGuideSteps.js +119 -0
  46. package/dist/bigconsole/components/overview/dashboardGuideSteps.js.map +1 -0
  47. package/dist/bigconsole/components/overview/index.js +8 -0
  48. package/dist/bigconsole/components/overview/overviewModel.js +119 -0
  49. package/dist/bigconsole/components/overview/overviewModel.js.map +1 -0
  50. package/dist/bigconsole/components/overview/useOverviewData.js +48 -0
  51. package/dist/bigconsole/components/overview/useOverviewData.js.map +1 -0
  52. package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
  53. package/dist/bigconsole/components/parser/ImportParserDialog.js +127 -127
  54. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  55. package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
  56. package/dist/bigconsole/components/preview/AiPreviewContent.js +5 -5
  57. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +33 -33
  58. package/dist/bigconsole/components/preview/AiPreviewPanel.js +38 -38
  59. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +13 -13
  60. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +70 -70
  61. package/dist/bigconsole/components/widgets/PropertiesPanel.js +28 -28
  62. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +25 -25
  63. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
  64. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
  65. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
  66. package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
  67. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
  68. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
  69. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +21 -21
  70. package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
  71. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
  72. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
  73. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
  74. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
  75. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
  76. package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
  77. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
  78. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +10 -10
  79. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +68 -68
  80. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  81. package/dist/bigconsole/pages/AdminPage.js +136 -136
  82. package/dist/bigconsole/pages/DashboardBuilderPage.js +10 -10
  83. package/dist/bigconsole/pages/DashboardViewPage.js +61 -61
  84. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  85. package/dist/bigconsole/pages/DashboardsPage.js +327 -348
  86. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  87. package/dist/bigconsole/pages/DataParsersPage.js +5 -5
  88. package/dist/bigconsole/pages/DataSinkBuilderPage.js +10 -10
  89. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  90. package/dist/bigconsole/pages/DataSinkViewPage.js +83 -83
  91. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  92. package/dist/bigconsole/pages/DataSinksPage.js +11 -11
  93. package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
  94. package/dist/bigconsole/pages/InsightsPage.js +315 -315
  95. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  96. package/dist/bigconsole/pages/OverviewPage.js +244 -0
  97. package/dist/bigconsole/pages/OverviewPage.js.map +1 -0
  98. package/dist/bigconsole/pages/ParserBuilderPage.js +5 -5
  99. package/dist/bigconsole/pages/ParserViewPage.js +98 -98
  100. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  101. package/dist/bigconsole/pages/PipelineBuilderPage.js +8 -8
  102. package/dist/bigconsole/pages/PipelineViewPage.js +46 -46
  103. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  104. package/dist/bigconsole/pages/PipelinesPage.js +80 -80
  105. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  106. package/dist/bigconsole/pages/SettingsPage.js +70 -70
  107. package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
  108. package/dist/bigconsole/pages/WorkflowViewPage.js +200 -200
  109. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  110. package/dist/bigconsole/pages/WorkflowsPage.js +78 -78
  111. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  112. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +34 -34
  113. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +79 -79
  114. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
  115. package/dist/bigconsole/utils/createDialogParam.js +14 -0
  116. package/dist/bigconsole/utils/createDialogParam.js.map +1 -0
  117. package/dist/generated/global-operations.js +1 -1
  118. package/dist/generated/wspace-operations.js +285 -222
  119. package/dist/generated/wspace-operations.js.map +1 -1
  120. package/dist/shared/hooks/useTr.js +10 -7
  121. package/dist/shared/hooks/useTr.js.map +1 -1
  122. package/package.json +1 -1
  123. package/dist/bigconsole/pages/HomePage.js +0 -318
  124. package/dist/bigconsole/pages/HomePage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ImportParserDialog.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ImportParserDialog.tsx"],"sourcesContent":["/**\n * ImportParserDialog Component\n *\n * Modal dialog for importing a parser from JSON file.\n * Supports both creating new parsers and updating existing ones.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect, useRef } from 'react';\nimport {\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Input } from '@burdenoff/fe-libs/ui';\nimport { Label } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { Upload, FileJson, Check, XCircle, ArrowLeft, RefreshCw, Info } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Section } from '../common';\nimport { useImportParser, type ImportParserOptions } from '../../hooks';\n\n/** Key/value row inside the \"parser to import\" summary. Wraps on narrow dialogs. */\nconst SUMMARY_ROW = 'flex flex-wrap items-center justify-between gap-x-2 gap-y-0.5';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ImportParserDialogProps {\n isOpen: boolean;\n onClose: () => void;\n /** Console ID where the parser will be created */\n consoleId: string;\n onSuccess?: (parserId: string, parserName: string, originalUpdated: boolean) => void;\n}\n\ntype ImportStep = 'select' | 'preview' | 'importing' | 'complete';\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ImportParserDialog: FC<ImportParserDialogProps> = memo(function ImportParserDialog({\n isOpen,\n onClose,\n consoleId,\n onSuccess,\n}) {\n const { t } = useI18n();\n const [step, setStep] = useState<ImportStep>('select');\n const [, setSelectedFile] = useState<File | null>(null);\n const [fileContent, setFileContent] = useState<string | null>(null);\n const [nameOverride, setNameOverride] = useState('');\n const [inputSinkKeyOverride, setInputSinkKeyOverride] = useState('');\n const [outputKeyOverride, setOutputKeyOverride] = useState('');\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { loading, error, validationResult, importResult, validateImport, importParser, extractParserId, clearState } =\n useImportParser();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n setNameOverride('');\n setInputSinkKeyOverride('');\n setOutputKeyOverride('');\n clearState();\n }\n }, [isOpen, clearState]);\n\n // Handle file selection\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (!file.name.endsWith('.json')) {\n alert(t('bigconsole.parsers.import.selectJsonFile', 'Please select a JSON file'));\n return;\n }\n\n setSelectedFile(file);\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n const content = event.target?.result as string;\n setFileContent(content);\n\n const result = validateImport(content);\n if (result.isValid && result.parserInfo) {\n setStep('preview');\n setNameOverride(result.parserInfo.name || '');\n setInputSinkKeyOverride(result.parserInfo.inputSinkKey || '');\n setOutputKeyOverride(result.parserInfo.outputKey || '');\n } else {\n setStep('preview');\n }\n };\n reader.onerror = () => {\n alert(t('bigconsole.parsers.import.readFileFailed', 'Failed to read file'));\n };\n reader.readAsText(file);\n },\n [validateImport, t]\n );\n\n // Handle file drop\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n const file = e.dataTransfer.files?.[0];\n if (file) {\n const dt = new DataTransfer();\n dt.items.add(file);\n if (fileInputRef.current) {\n fileInputRef.current.files = dt.files;\n fileInputRef.current.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }, []);\n\n // Handle import\n const handleImport = useCallback(async () => {\n if (!fileContent) return;\n\n setStep('importing');\n\n const options: ImportParserOptions = {\n consoleId,\n name: nameOverride.trim() || undefined,\n inputSinkKey: inputSinkKeyOverride.trim() || undefined,\n outputKey: outputKeyOverride.trim() || undefined,\n };\n\n const result = await importParser(fileContent, options);\n\n if (result?.success && result.parser) {\n setStep('complete');\n onSuccess?.(result.parser.id, result.parser.name, result.originalUpdated ?? false);\n } else {\n setStep('preview');\n }\n }, [fileContent, consoleId, nameOverride, inputSinkKeyOverride, outputKeyOverride, importParser, onSuccess]);\n\n const canClose = !loading && step !== 'importing';\n const parserId = fileContent ? extractParserId(fileContent) : null;\n\n return (\n <ResponsiveDialog open={isOpen} onOpenChange={(open) => !open && canClose && onClose()}>\n <ResponsiveDialogContent className=\"sm:max-w-lg max-h-[85vh] flex flex-col\">\n <ResponsiveDialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Upload className=\"size-5 text-action-primary-bg\" />\n </div>\n <ResponsiveDialogTitle>{t('bigconsole.parsers.import.title', 'Import Parser')}</ResponsiveDialogTitle>\n </div>\n <ResponsiveDialogDescription>\n {t(\n 'bigconsole.parsers.import.description',\n 'Upload a Parser export file to restore it into this workspace.'\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"flex-1 overflow-y-auto py-4 space-y-4\">\n {/* Step 1: File Selection */}\n {step === 'select' && (\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n className=\"rounded-card border-2 border-dashed border-[var(--color-border-subtle)] bg-bg-sunken p-6 text-center hover:border-action-primary-bg motion-safe:transition-colors sm:p-8\"\n >\n <FileJson className=\"size-12 mx-auto text-text-secondary mb-4\" />\n <p className=\"text-sm mb-2\">\n {t('bigconsole.parsers.import.dropzoneTitle', 'Drag and drop a parser export file here')}\n </p>\n <p className=\"text-xs text-text-secondary mb-4\">{t('bigconsole.parsers.import.or', 'or')}</p>\n <input ref={fileInputRef} type=\"file\" accept=\".json\" onChange={handleFileSelect} className=\"hidden\" />\n <Button onClick={() => fileInputRef.current?.click()} disabled={loading}>\n {t('bigconsole.parsers.import.browseFiles', 'Browse Files')}\n </Button>\n <p className=\"text-xs text-text-secondary mt-4\">\n {t(\n 'bigconsole.parsers.import.supportedHint',\n 'Only .json files exported from BigConsole are supported'\n )}\n </p>\n </div>\n )}\n\n {/* Step 2: Preview & Options */}\n {(step === 'preview' || step === 'importing') && validationResult && (\n <>\n {/* Parser Info — read-only summary, so it is recessed */}\n {validationResult.parserInfo && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Parser in this file\"\n bodyClassName=\"space-y-2\"\n data-testid=\"import-parser-summary\"\n >\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldParser', 'Parser')}\n </span>\n <span className=\"min-w-0 break-words text-sm font-medium text-text-primary\">\n {validationResult.parserInfo.name}\n </span>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldType', 'Type')}\n </span>\n <Badge variant=\"secondary\">{validationResult.parserInfo.type}</Badge>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldInputSink', 'Input Sink')}\n </span>\n <span className=\"min-w-0 break-all font-mono text-xs text-text-primary\">\n {validationResult.parserInfo.inputSinkKey}\n </span>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldOutputKey', 'Output Key')}\n </span>\n <span className=\"min-w-0 break-all font-mono text-xs text-text-primary\">\n {validationResult.parserInfo.outputKey}\n </span>\n </div>\n {validationResult.parserInfo.exportedFrom && (\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldSourceId', 'Source ID')}\n </span>\n <span className=\"min-w-0 max-w-full truncate font-mono text-xs text-text-secondary sm:max-w-[180px]\">\n {validationResult.parserInfo.exportedFrom}\n </span>\n </div>\n )}\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldSchemaVersion', 'Schema Version')}\n </span>\n <span className=\"text-xs text-text-secondary\">{validationResult.parserInfo.schemaVersion}</span>\n </div>\n </Section>\n )}\n\n {/* Validation Errors */}\n {validationResult.errors.length > 0 && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title={t('bigconsole.parsers.import.errorsCount', 'Errors ({{count}})', {\n count: validationResult.errors.length,\n })}\n icon={<XCircle className=\"size-4 text-[var(--color-status-error-text)]\" />}\n data-testid=\"import-validation-errors\"\n >\n <ul className=\"space-y-1 text-xs text-status-error-text\">\n {validationResult.errors.map((err, idx) => (\n <li key={idx} className=\"break-words\">\n <span className=\"font-mono\">[{err.code}]</span> {err.message}\n </li>\n ))}\n </ul>\n </Section>\n )}\n\n {/* Import Options — the only interactive block, so it carries the surface */}\n {validationResult.isValid && (\n <Section\n headingLevel={3}\n title={t('bigconsole.parsers.import.optionsHeading', 'Import Options')}\n description=\"Override the imported names before creating the parser.\"\n bodyClassName=\"space-y-4\"\n data-testid=\"import-parser-options\"\n >\n {/* What import will do */}\n <Section\n tone=\"info\"\n padding=\"compact\"\n headingLevel={4}\n title={\n parserId\n ? t('bigconsole.parsers.import.checkExistingTitle', 'Import will check for existing parser')\n : t('bigconsole.parsers.import.newParserTitle', 'A new parser will be created')\n }\n icon={<Info className=\"size-4 text-[var(--color-status-info-text)]\" />}\n >\n <div className=\"text-xs text-text-secondary\">\n {parserId ? (\n <>\n <p>\n {t('bigconsole.parsers.import.ifOriginalExistsPrefix', 'If the original parser (ID:')}{' '}\n <code className=\"rounded bg-bg-sunken px-1 font-mono\">{parserId.slice(0, 8)}...</code>\n {t('bigconsole.parsers.import.ifOriginalExistsSuffix', ') exists:')}\n </p>\n <ul className=\"list-disc list-inside mt-1 space-y-0.5\">\n <li>\n {t('bigconsole.parsers.import.withChanges', 'With changes → Update the existing parser')}\n </li>\n <li>\n {t('bigconsole.parsers.import.noChanges', 'No changes → Show \"already exists\" message')}\n </li>\n </ul>\n <p className=\"mt-1\">\n {t(\n 'bigconsole.parsers.import.ifOriginalMissing',\n \"If original doesn't exist → Create a new parser\"\n )}\n </p>\n </>\n ) : (\n <p>\n {t(\n 'bigconsole.parsers.import.newParserBody',\n 'Import as a new parser with the specified configuration.'\n )}\n </p>\n )}\n </div>\n </Section>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-name\">{t('bigconsole.parsers.import.parserNameLabel', 'Parser Name')}</Label>\n <Input\n id=\"import-name\"\n type=\"text\"\n value={nameOverride}\n onChange={(e) => setNameOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.name ||\n t('bigconsole.parsers.import.parserNamePlaceholder', 'Parser name')\n }\n disabled={step === 'importing'}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-input-sink\">\n {t('bigconsole.parsers.import.inputSinkKeyLabel', 'Input Sink Key')}\n </Label>\n <Input\n id=\"import-input-sink\"\n type=\"text\"\n value={inputSinkKeyOverride}\n onChange={(e) => setInputSinkKeyOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.inputSinkKey ||\n t('bigconsole.parsers.import.inputSinkKeyPlaceholder', 'Input sink key')\n }\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.parsers.import.inputSinkKeyHelp', 'The DataSink key to read input data from.')}\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-output-key\">\n {t('bigconsole.parsers.import.outputKeyLabel', 'Output Key')}\n </Label>\n <Input\n id=\"import-output-key\"\n type=\"text\"\n value={outputKeyOverride}\n onChange={(e) => setOutputKeyOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.outputKey ||\n t('bigconsole.parsers.import.outputKeyPlaceholder', 'Output key')\n }\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.parsers.import.outputKeyHelp', 'The key to store parsed output data under.')}\n </p>\n </div>\n </Section>\n )}\n </>\n )}\n\n {/* Step 3: Complete — one outcome block, toned by result */}\n {step === 'complete' && importResult?.success && (\n <Section\n tone={importResult.alreadyExists ? 'info' : 'success'}\n headingLevel={3}\n title={\n importResult.alreadyExists\n ? t('bigconsole.parsers.import.alreadyExistsTitle', 'Parser Already Exists')\n : importResult.originalUpdated\n ? t('bigconsole.parsers.import.updatedTitle', 'Parser Updated!')\n : t('bigconsole.parsers.import.createdTitle', 'Import Successful!')\n }\n icon={\n importResult.alreadyExists ? (\n <Info className=\"size-5 text-[var(--color-status-info-text)]\" />\n ) : importResult.originalUpdated ? (\n <RefreshCw className=\"size-5 text-[var(--color-status-success-text)]\" />\n ) : (\n <Check className=\"size-5 text-[var(--color-status-success-text)]\" />\n )\n }\n description={\n importResult.alreadyExists\n ? t(\n 'bigconsole.parsers.import.alreadyExistsBody',\n 'Parser \"{{name}}\" already exists with the same data. No changes were made.',\n { name: importResult.parser?.name ?? '' }\n )\n : importResult.originalUpdated\n ? t(\n 'bigconsole.parsers.import.updatedBody',\n 'Parser \"{{name}}\" has been updated with the imported data.',\n { name: importResult.parser?.name ?? '' }\n )\n : t('bigconsole.parsers.import.createdBody', 'Parser \"{{name}}\" has been created.', {\n name: importResult.parser?.name ?? '',\n })\n }\n data-testid=\"import-parser-outcome\"\n />\n )}\n\n {/* Error */}\n {error && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Import failed\"\n data-testid=\"import-parser-error\"\n >\n <p className=\"break-words text-sm text-status-error-text\">{error.message}</p>\n </Section>\n )}\n\n {importResult && !importResult.success && importResult.errorMessage && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Import failed\"\n data-testid=\"import-parser-result-error\"\n >\n <p className=\"break-words text-sm text-status-error-text\">{importResult.errorMessage}</p>\n </Section>\n )}\n </div>\n\n <ResponsiveDialogFooter className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-between\">\n <div>\n {step === 'preview' && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n clearState();\n }}\n disabled={loading}\n >\n <ArrowLeft className=\"size-4\" />\n {t('bigconsole.parsers.import.back', 'Back')}\n </Button>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {step !== 'complete' && (\n <Button variant=\"outline\" onClick={onClose} disabled={!canClose}>\n {t('bigconsole.parsers.import.cancel', 'Cancel')}\n </Button>\n )}\n\n {step === 'preview' && validationResult?.isValid && (\n <Button onClick={handleImport} disabled={loading}>\n <Upload className=\"size-4\" />\n {t('bigconsole.parsers.import.importButton', 'Import Parser')}\n </Button>\n )}\n\n {step === 'importing' && (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Spinner className=\"size-4\" />\n {t('bigconsole.parsers.import.importing', 'Importing...')}\n </div>\n )}\n\n {step === 'complete' && <Button onClick={onClose}>{t('bigconsole.parsers.import.done', 'Done')}</Button>}\n </div>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n});\n\nexport default ImportParserDialog;\n"],"mappings":";;;;;;;;;;AA2BA,IAAM,IAAc,iEAoBP,IAAkD,EAAK,SAA4B,EAC9F,WACA,YACA,cACA,gBACC;CACD,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAM,KAAW,EAAqB,SAAS,EAChD,GAAG,KAAmB,EAAsB,KAAK,EACjD,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAC7D,CAAC,GAAc,KAAmB,EAAS,GAAG,EAC9C,CAAC,GAAsB,KAA2B,EAAS,GAAG,EAC9D,CAAC,GAAmB,KAAwB,EAAS,GAAG,EAExD,IAAe,EAAyB,KAAK,EAE7C,EAAE,YAAS,UAAO,qBAAkB,iBAAc,mBAAgB,iBAAc,oBAAiB,kBACrG,GAAiB;AAGnB,SAAgB;AACd,EAAI,MACF,EAAQ,SAAS,EACjB,EAAgB,KAAK,EACrB,EAAe,KAAK,EACpB,EAAgB,GAAG,EACnB,EAAwB,GAAG,EAC3B,EAAqB,GAAG,EACxB,GAAY;IAEb,CAAC,GAAQ,EAAW,CAAC;CAGxB,IAAM,KAAmB,EACvB,OAAO,MAA2C;EAChD,IAAM,IAAO,EAAE,OAAO,QAAQ;AAC9B,MAAI,CAAC,EAAM;AAEX,MAAI,CAAC,EAAK,KAAK,SAAS,QAAQ,EAAE;AAChC,SAAM,EAAE,4CAA4C,4BAA4B,CAAC;AACjF;;AAGF,IAAgB,EAAK;EAErB,IAAM,IAAS,IAAI,YAAY;AAkB/B,EAjBA,EAAO,SAAS,OAAO,MAAU;GAC/B,IAAM,IAAU,EAAM,QAAQ;AAC9B,KAAe,EAAQ;GAEvB,IAAM,IAAS,EAAe,EAAQ;AACtC,GAAI,EAAO,WAAW,EAAO,cAC3B,EAAQ,UAAU,EAClB,EAAgB,EAAO,WAAW,QAAQ,GAAG,EAC7C,EAAwB,EAAO,WAAW,gBAAgB,GAAG,EAC7D,EAAqB,EAAO,WAAW,aAAa,GAAG,IAEvD,EAAQ,UAAU;KAGtB,EAAO,gBAAgB;AACrB,SAAM,EAAE,4CAA4C,sBAAsB,CAAC;KAE7E,EAAO,WAAW,EAAK;IAEzB,CAAC,GAAgB,EAAE,CACpB,EAGK,KAAa,GAAa,MAAuB;AACrD,IAAE,gBAAgB;EAClB,IAAM,IAAO,EAAE,aAAa,QAAQ;AACpC,MAAI,GAAM;GACR,IAAM,IAAK,IAAI,cAAc;AAE7B,GADA,EAAG,MAAM,IAAI,EAAK,EACd,EAAa,YACf,EAAa,QAAQ,QAAQ,EAAG,OAChC,EAAa,QAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,IAAM,CAAC,CAAC;;IAG7E,EAAE,CAAC,EAGA,KAAe,EAAY,YAAY;AAC3C,MAAI,CAAC,EAAa;AAElB,IAAQ,YAAY;EASpB,IAAM,IAAS,MAAM,EAAa,GAPG;GACnC;GACA,MAAM,EAAa,MAAM,IAAI,KAAA;GAC7B,cAAc,EAAqB,MAAM,IAAI,KAAA;GAC7C,WAAW,EAAkB,MAAM,IAAI,KAAA;GACxC,CAEsD;AAEvD,EAAI,GAAQ,WAAW,EAAO,UAC5B,EAAQ,WAAW,EACnB,IAAY,EAAO,OAAO,IAAI,EAAO,OAAO,MAAM,EAAO,mBAAmB,GAAM,IAElF,EAAQ,UAAU;IAEnB;EAAC;EAAa;EAAW;EAAc;EAAsB;EAAmB;EAAc;EAAU,CAAC,EAEtG,IAAW,CAAC,KAAW,MAAS,aAChC,IAAW,IAAc,EAAgB,EAAY,GAAG;AAE9D,QACE,kBAAC,GAAD;EAAkB,MAAM;EAAQ,eAAe,MAAS,CAAC,KAAQ,KAAY,GAAS;YACpF,kBAAC,IAAD;GAAyB,WAAU;aAAnC;IACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAQ,WAAU,iCAAkC,CAAA;MAChD,CAAA,EACN,kBAAC,GAAD,EAAA,UAAwB,EAAE,mCAAmC,gBAAgB,EAAyB,CAAA,CAClG;QACN,kBAAC,GAAD,EAAA,UACG,EACC,yCACA,iEACD,EAC2B,CAAA,CACP,EAAA,CAAA;IAEzB,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEG,MAAS,YACR,kBAAC,OAAD;OACE,aAAa,MAAM,EAAE,gBAAgB;OACrC,QAAQ;OACR,WAAU;iBAHZ;QAKE,kBAAC,IAAD,EAAU,WAAU,4CAA6C,CAAA;QACjE,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAE,2CAA2C,0CAA0C;SACtF,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;mBAAoC,EAAE,gCAAgC,KAAK;SAAK,CAAA;QAC7F,kBAAC,SAAD;SAAO,KAAK;SAAc,MAAK;SAAO,QAAO;SAAQ,UAAU;SAAkB,WAAU;SAAW,CAAA;QACtG,kBAAC,GAAD;SAAQ,eAAe,EAAa,SAAS,OAAO;SAAE,UAAU;mBAC7D,EAAE,yCAAyC,eAAe;SACpD,CAAA;QACT,kBAAC,KAAD;SAAG,WAAU;mBACV,EACC,2CACA,0DACD;SACC,CAAA;QACA;;OAIN,MAAS,aAAa,MAAS,gBAAgB,KAC/C,kBAAA,GAAA,EAAA,UAAA;OAEG,EAAiB,cAChB,kBAAC,GAAD;QACE,UAAS;QACT,SAAQ;QACR,cAAc;QACd,OAAM;QACN,eAAc;QACd,eAAY;kBANd;SAQE,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,yCAAyC,SAAS;WAChD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SACN,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,uCAAuC,OAAO;WAC5C,CAAA,EACP,kBAAC,GAAD;WAAO,SAAQ;qBAAa,EAAiB,WAAW;WAAa,CAAA,CACjE;;SACN,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,4CAA4C,aAAa;WACvD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SACN,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,4CAA4C,aAAa;WACvD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SACL,EAAiB,WAAW,gBAC3B,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,2CAA2C,YAAY;WACrD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SAER,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,gDAAgD,iBAAiB;WAC/D,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBAA+B,EAAiB,WAAW;WAAqB,CAAA,CAC5F;;SACE;;OAIX,EAAiB,OAAO,SAAS,KAChC,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,cAAc;QACd,OAAO,EAAE,yCAAyC,sBAAsB,EACtE,OAAO,EAAiB,OAAO,QAChC,CAAC;QACF,MAAM,kBAAC,GAAD,EAAS,WAAU,gDAAiD,CAAA;QAC1E,eAAY;kBAEZ,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAiB,OAAO,KAAK,GAAK,MACjC,kBAAC,MAAD;UAAc,WAAU;oBAAxB;WACE,kBAAC,QAAD;YAAM,WAAU;sBAAhB;aAA4B;aAAE,EAAI;aAAK;aAAQ;;;WAAE,EAAI;WAClD;YAFI,EAEJ,CACL;SACC,CAAA;QACG,CAAA;OAIX,EAAiB,WAChB,kBAAC,GAAD;QACE,cAAc;QACd,OAAO,EAAE,4CAA4C,iBAAiB;QACtE,aAAY;QACZ,eAAc;QACd,eAAY;kBALd;SAQE,kBAAC,GAAD;UACE,MAAK;UACL,SAAQ;UACR,cAAc;UACd,OACE,IACI,EAAE,gDAAgD,wCAAwC,GAC1F,EAAE,4CAA4C,+BAA+B;UAEnF,MAAM,kBAAC,GAAD,EAAM,WAAU,+CAAgD,CAAA;oBAEtE,kBAAC,OAAD;WAAK,WAAU;qBACZ,IACC,kBAAA,GAAA,EAAA,UAAA;YACE,kBAAC,KAAD,EAAA,UAAA;aACG,EAAE,oDAAoD,8BAA8B;aAAE;aACvF,kBAAC,QAAD;cAAM,WAAU;wBAAhB,CAAuD,EAAS,MAAM,GAAG,EAAE,EAAC,MAAU;;aACrF,EAAE,oDAAoD,YAAY;aACjE,EAAA,CAAA;YACJ,kBAAC,MAAD;aAAI,WAAU;uBAAd,CACE,kBAAC,MAAD,EAAA,UACG,EAAE,yCAAyC,4CAA4C,EACrF,CAAA,EACL,kBAAC,MAAD,EAAA,UACG,EAAE,uCAAuC,+CAA6C,EACpF,CAAA,CACF;;YACL,kBAAC,KAAD;aAAG,WAAU;uBACV,EACC,+CACA,kDACD;aACC,CAAA;YACH,EAAA,CAAA,GAEH,kBAAC,KAAD,EAAA,UACG,EACC,2CACA,2DACD,EACC,CAAA;WAEF,CAAA;UACE,CAAA;SAEV,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAe,EAAE,6CAA6C,cAAc;WAAS,CAAA,EACpG,kBAAC,GAAD;WACE,IAAG;WACH,MAAK;WACL,OAAO;WACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;WAChD,aACE,EAAiB,YAAY,QAC7B,EAAE,mDAAmD,cAAc;WAErE,UAAU,MAAS;WACnB,CAAA,CACE;;SAEN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YAAO,SAAQ;sBACZ,EAAE,+CAA+C,iBAAiB;YAC7D,CAAA;WACR,kBAAC,GAAD;YACE,IAAG;YACH,MAAK;YACL,OAAO;YACP,WAAW,MAAM,EAAwB,EAAE,OAAO,MAAM;YACxD,aACE,EAAiB,YAAY,gBAC7B,EAAE,qDAAqD,iBAAiB;YAE1E,UAAU,MAAS;YACnB,CAAA;WACF,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAE,8CAA8C,4CAA4C;YAC3F,CAAA;WACA;;SAEN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YAAO,SAAQ;sBACZ,EAAE,4CAA4C,aAAa;YACtD,CAAA;WACR,kBAAC,GAAD;YACE,IAAG;YACH,MAAK;YACL,OAAO;YACP,WAAW,MAAM,EAAqB,EAAE,OAAO,MAAM;YACrD,aACE,EAAiB,YAAY,aAC7B,EAAE,kDAAkD,aAAa;YAEnE,UAAU,MAAS;YACnB,CAAA;WACF,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAE,2CAA2C,6CAA6C;YACzF,CAAA;WACA;;SACE;;OAEX,EAAA,CAAA;MAIJ,MAAS,cAAc,GAAc,WACpC,kBAAC,GAAD;OACE,MAAM,EAAa,gBAAgB,SAAS;OAC5C,cAAc;OACd,OACE,EAAa,gBACT,EAAE,gDAAgD,wBAAwB,GAC1E,EAAa,kBACX,EAAE,0CAA0C,kBAAkB,GAC9D,EAAE,0CAA0C,qBAAqB;OAEzE,MACE,EAAa,gBACX,kBAAC,GAAD,EAAM,WAAU,+CAAgD,CAAA,GAC9D,EAAa,kBACf,kBAAC,GAAD,EAAW,WAAU,kDAAmD,CAAA,GAExE,kBAAC,GAAD,EAAO,WAAU,kDAAmD,CAAA;OAGxE,aACE,EAAa,gBACT,EACE,+CACA,gFACA,EAAE,MAAM,EAAa,QAAQ,QAAQ,IAAI,CAC1C,GACD,EAAa,kBACX,EACE,yCACA,gEACA,EAAE,MAAM,EAAa,QAAQ,QAAQ,IAAI,CAC1C,GACD,EAAE,yCAAyC,yCAAuC,EAChF,MAAM,EAAa,QAAQ,QAAQ,IACpC,CAAC;OAEV,eAAY;OACZ,CAAA;MAIH,KACC,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,cAAc;OACd,OAAM;OACN,eAAY;iBAEZ,kBAAC,KAAD;QAAG,WAAU;kBAA8C,EAAM;QAAY,CAAA;OACrE,CAAA;MAGX,KAAgB,CAAC,EAAa,WAAW,EAAa,gBACrD,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,cAAc;OACd,OAAM;OACN,eAAY;iBAEZ,kBAAC,KAAD;QAAG,WAAU;kBAA8C,EAAa;QAAiB,CAAA;OACjF,CAAA;MAER;;IAEN,kBAAC,GAAD;KAAwB,WAAU;eAAlC,CACE,kBAAC,OAAD,EAAA,UACG,MAAS,aACR,kBAAC,GAAD;MACE,SAAQ;MACR,eAAe;AAIb,OAHA,EAAQ,SAAS,EACjB,EAAgB,KAAK,EACrB,EAAe,KAAK,EACpB,GAAY;;MAEd,UAAU;gBARZ,CAUE,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA,EAC/B,EAAE,kCAAkC,OAAO,CACrC;SAEP,CAAA,EAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,MAAS,cACR,kBAAC,GAAD;QAAQ,SAAQ;QAAU,SAAS;QAAS,UAAU,CAAC;kBACpD,EAAE,oCAAoC,SAAS;QACzC,CAAA;OAGV,MAAS,aAAa,GAAkB,WACvC,kBAAC,GAAD;QAAQ,SAAS;QAAc,UAAU;kBAAzC,CACE,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA,EAC5B,EAAE,0CAA0C,gBAAgB,CACtD;;OAGV,MAAS,eACR,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA,EAC7B,EAAE,uCAAuC,eAAe,CACrD;;OAGP,MAAS,cAAc,kBAAC,GAAD;QAAQ,SAAS;kBAAU,EAAE,kCAAkC,OAAO;QAAU,CAAA;OACpG;QACiB;;IACD;;EACT,CAAA;EAErB"}
1
+ {"version":3,"file":"ImportParserDialog.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ImportParserDialog.tsx"],"sourcesContent":["/**\n * ImportParserDialog Component\n *\n * Modal dialog for importing a parser from JSON file.\n * Supports both creating new parsers and updating existing ones.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect, useRef } from 'react';\nimport {\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Input } from '@burdenoff/fe-libs/ui';\nimport { Label } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { Upload, FileJson, Check, XCircle, ArrowLeft, RefreshCw, Info } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Section } from '../common';\nimport { useImportParser, type ImportParserOptions } from '../../hooks';\n\n/** Key/value row inside the \"parser to import\" summary. Wraps on narrow dialogs. */\nconst SUMMARY_ROW = 'flex flex-wrap items-center justify-between gap-x-2 gap-y-0.5';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ImportParserDialogProps {\n isOpen: boolean;\n onClose: () => void;\n /** Console ID where the parser will be created */\n consoleId: string;\n onSuccess?: (parserId: string, parserName: string, originalUpdated: boolean) => void;\n}\n\ntype ImportStep = 'select' | 'preview' | 'importing' | 'complete';\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ImportParserDialog: FC<ImportParserDialogProps> = memo(function ImportParserDialog({\n isOpen,\n onClose,\n consoleId,\n onSuccess,\n}) {\n const { t } = useI18n();\n const [step, setStep] = useState<ImportStep>('select');\n const [, setSelectedFile] = useState<File | null>(null);\n const [fileContent, setFileContent] = useState<string | null>(null);\n const [nameOverride, setNameOverride] = useState('');\n const [inputSinkKeyOverride, setInputSinkKeyOverride] = useState('');\n const [outputKeyOverride, setOutputKeyOverride] = useState('');\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { loading, error, validationResult, importResult, validateImport, importParser, extractParserId, clearState } =\n useImportParser();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n setNameOverride('');\n setInputSinkKeyOverride('');\n setOutputKeyOverride('');\n clearState();\n }\n }, [isOpen, clearState]);\n\n // Handle file selection\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (!file.name.endsWith('.json')) {\n alert(t('bigconsole.parsers.import.selectJsonFile', 'Please select a JSON file'));\n return;\n }\n\n setSelectedFile(file);\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n const content = event.target?.result as string;\n setFileContent(content);\n\n const result = validateImport(content);\n if (result.isValid && result.parserInfo) {\n setStep('preview');\n setNameOverride(result.parserInfo.name || '');\n setInputSinkKeyOverride(result.parserInfo.inputSinkKey || '');\n setOutputKeyOverride(result.parserInfo.outputKey || '');\n } else {\n setStep('preview');\n }\n };\n reader.onerror = () => {\n alert(t('bigconsole.parsers.import.readFileFailed', 'Failed to read file'));\n };\n reader.readAsText(file);\n },\n [validateImport, t]\n );\n\n // Handle file drop\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n const file = e.dataTransfer.files?.[0];\n if (file) {\n const dt = new DataTransfer();\n dt.items.add(file);\n if (fileInputRef.current) {\n fileInputRef.current.files = dt.files;\n fileInputRef.current.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }, []);\n\n // Handle import\n const handleImport = useCallback(async () => {\n if (!fileContent) return;\n\n setStep('importing');\n\n const options: ImportParserOptions = {\n consoleId,\n name: nameOverride.trim() || undefined,\n inputSinkKey: inputSinkKeyOverride.trim() || undefined,\n outputKey: outputKeyOverride.trim() || undefined,\n };\n\n const result = await importParser(fileContent, options);\n\n if (result?.success && result.parser) {\n setStep('complete');\n onSuccess?.(result.parser.id, result.parser.name, result.originalUpdated ?? false);\n } else {\n setStep('preview');\n }\n }, [fileContent, consoleId, nameOverride, inputSinkKeyOverride, outputKeyOverride, importParser, onSuccess]);\n\n const canClose = !loading && step !== 'importing';\n const parserId = fileContent ? extractParserId(fileContent) : null;\n\n return (\n <ResponsiveDialog open={isOpen} onOpenChange={(open) => !open && canClose && onClose()}>\n <ResponsiveDialogContent className=\"sm:max-w-lg max-h-[85vh] flex flex-col\">\n <ResponsiveDialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Upload className=\"size-5 text-action-primary-bg\" />\n </div>\n <ResponsiveDialogTitle>{t('bigconsole.parsers.import.title', 'Import Parser')}</ResponsiveDialogTitle>\n </div>\n <ResponsiveDialogDescription>\n {t(\n 'bigconsole.parsers.import.description',\n 'Upload a Parser export file to restore it into this workspace.'\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"flex-1 overflow-y-auto py-4 space-y-4\">\n {/* Step 1: File Selection */}\n {step === 'select' && (\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n className=\"rounded-card border-2 border-dashed border-[var(--color-border-subtle)] bg-bg-sunken p-6 text-center hover:border-action-primary-bg motion-safe:transition-colors sm:p-8\"\n >\n <FileJson className=\"size-12 mx-auto text-text-secondary mb-4\" />\n <p className=\"text-sm mb-2\">\n {t('bigconsole.parsers.import.dropzoneTitle', 'Drag and drop a parser export file here')}\n </p>\n <p className=\"text-xs text-text-secondary mb-4\">{t('bigconsole.parsers.import.or', 'or')}</p>\n <input ref={fileInputRef} type=\"file\" accept=\".json\" onChange={handleFileSelect} className=\"hidden\" />\n <Button onClick={() => fileInputRef.current?.click()} disabled={loading}>\n {t('bigconsole.parsers.import.browseFiles', 'Browse Files')}\n </Button>\n <p className=\"text-xs text-text-secondary mt-4\">\n {t(\n 'bigconsole.parsers.import.supportedHint',\n 'Only .json files exported from BigConsole are supported'\n )}\n </p>\n </div>\n )}\n\n {/* Step 2: Preview & Options */}\n {(step === 'preview' || step === 'importing') && validationResult && (\n <>\n {/* Parser Info — read-only summary, so it is recessed */}\n {validationResult.parserInfo && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Parser in this file\"\n bodyClassName=\"space-y-2\"\n data-testid=\"import-parser-summary\"\n >\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldParser', 'Parser')}\n </span>\n <span className=\"min-w-0 break-words text-sm font-medium text-text-primary\">\n {validationResult.parserInfo.name}\n </span>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldType', 'Type')}\n </span>\n <Badge variant=\"secondary\">{validationResult.parserInfo.type}</Badge>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldInputSink', 'Input Sink')}\n </span>\n <span className=\"min-w-0 break-all font-mono text-xs text-text-primary\">\n {validationResult.parserInfo.inputSinkKey}\n </span>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldOutputKey', 'Output Key')}\n </span>\n <span className=\"min-w-0 break-all font-mono text-xs text-text-primary\">\n {validationResult.parserInfo.outputKey}\n </span>\n </div>\n {validationResult.parserInfo.exportedFrom && (\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldSourceId', 'Source ID')}\n </span>\n <span className=\"min-w-0 max-w-full truncate font-mono text-xs text-text-secondary sm:max-w-[180px]\">\n {validationResult.parserInfo.exportedFrom}\n </span>\n </div>\n )}\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldSchemaVersion', 'Schema Version')}\n </span>\n <span className=\"text-xs text-text-secondary\">{validationResult.parserInfo.schemaVersion}</span>\n </div>\n </Section>\n )}\n\n {/* Validation Errors */}\n {validationResult.errors.length > 0 && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title={t('bigconsole.parsers.import.errorsCount', 'Errors ({{count}})', {\n count: validationResult.errors.length,\n })}\n icon={<XCircle className=\"size-4 text-[var(--color-status-error-text)]\" />}\n data-testid=\"import-validation-errors\"\n >\n <ul className=\"space-y-1 text-xs text-status-error-text\">\n {validationResult.errors.map((err, idx) => (\n <li key={idx} className=\"break-words\">\n <span className=\"font-mono\">[{err.code}]</span> {err.message}\n </li>\n ))}\n </ul>\n </Section>\n )}\n\n {/* Import Options — the only interactive block, so it carries the surface */}\n {validationResult.isValid && (\n <Section\n headingLevel={3}\n title={t('bigconsole.parsers.import.optionsHeading', 'Import Options')}\n description=\"Override the imported names before creating the parser.\"\n bodyClassName=\"space-y-4\"\n data-testid=\"import-parser-options\"\n >\n {/* What import will do */}\n <Section\n tone=\"info\"\n padding=\"compact\"\n headingLevel={4}\n title={\n parserId\n ? t('bigconsole.parsers.import.checkExistingTitle', 'Import will check for existing parser')\n : t('bigconsole.parsers.import.newParserTitle', 'A new parser will be created')\n }\n icon={<Info className=\"size-4 text-[var(--color-status-info-text)]\" />}\n >\n <div className=\"text-xs text-text-secondary\">\n {parserId ? (\n <>\n <p>\n {t('bigconsole.parsers.import.ifOriginalExistsPrefix', 'If the original parser (ID:')}{' '}\n <code className=\"rounded bg-bg-sunken px-1 font-mono\">{parserId.slice(0, 8)}...</code>\n {t('bigconsole.parsers.import.ifOriginalExistsSuffix', ') exists:')}\n </p>\n <ul className=\"list-disc list-inside mt-1 space-y-0.5\">\n <li>\n {t('bigconsole.parsers.import.withChanges', 'With changes → Update the existing parser')}\n </li>\n <li>\n {t('bigconsole.parsers.import.noChanges', 'No changes → Show \"already exists\" message')}\n </li>\n </ul>\n <p className=\"mt-1\">\n {t(\n 'bigconsole.parsers.import.ifOriginalMissing',\n \"If original doesn't exist → Create a new parser\"\n )}\n </p>\n </>\n ) : (\n <p>\n {t(\n 'bigconsole.parsers.import.newParserBody',\n 'Import as a new parser with the specified configuration.'\n )}\n </p>\n )}\n </div>\n </Section>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-name\">{t('bigconsole.parsers.import.parserNameLabel', 'Parser Name')}</Label>\n <Input\n id=\"import-name\"\n type=\"text\"\n value={nameOverride}\n onChange={(e) => setNameOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.name ||\n t('bigconsole.parsers.import.parserNamePlaceholder', 'Parser name')\n }\n disabled={step === 'importing'}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-input-sink\">\n {t('bigconsole.parsers.import.inputSinkKeyLabel', 'Input Sink Key')}\n </Label>\n <Input\n id=\"import-input-sink\"\n type=\"text\"\n value={inputSinkKeyOverride}\n onChange={(e) => setInputSinkKeyOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.inputSinkKey ||\n t('bigconsole.parsers.import.inputSinkKeyPlaceholder', 'Input sink key')\n }\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.parsers.import.inputSinkKeyHelp', 'The DataSink key to read input data from.')}\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-output-key\">\n {t('bigconsole.parsers.import.outputKeyLabel', 'Output Key')}\n </Label>\n <Input\n id=\"import-output-key\"\n type=\"text\"\n value={outputKeyOverride}\n onChange={(e) => setOutputKeyOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.outputKey ||\n t('bigconsole.parsers.import.outputKeyPlaceholder', 'Output key')\n }\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.parsers.import.outputKeyHelp', 'The key to store parsed output data under.')}\n </p>\n </div>\n </Section>\n )}\n </>\n )}\n\n {/* Step 3: Complete — one outcome block, toned by result */}\n {step === 'complete' && importResult?.success && (\n <Section\n tone={importResult.alreadyExists ? 'info' : 'success'}\n headingLevel={3}\n title={\n importResult.alreadyExists\n ? t('bigconsole.parsers.import.alreadyExistsTitle', 'Parser Already Exists')\n : importResult.originalUpdated\n ? t('bigconsole.parsers.import.updatedTitle', 'Parser Updated!')\n : t('bigconsole.parsers.import.createdTitle', 'Import Successful!')\n }\n icon={\n importResult.alreadyExists ? (\n <Info className=\"size-5 text-[var(--color-status-info-text)]\" />\n ) : importResult.originalUpdated ? (\n <RefreshCw className=\"size-5 text-[var(--color-status-success-text)]\" />\n ) : (\n <Check className=\"size-5 text-[var(--color-status-success-text)]\" />\n )\n }\n description={\n importResult.alreadyExists\n ? t(\n 'bigconsole.parsers.import.alreadyExistsBody',\n 'Parser \"{{name}}\" already exists with the same data. No changes were made.',\n { name: importResult.parser?.name ?? '' }\n )\n : importResult.originalUpdated\n ? t(\n 'bigconsole.parsers.import.updatedBody',\n 'Parser \"{{name}}\" has been updated with the imported data.',\n { name: importResult.parser?.name ?? '' }\n )\n : t('bigconsole.parsers.import.createdBody', 'Parser \"{{name}}\" has been created.', {\n name: importResult.parser?.name ?? '',\n })\n }\n data-testid=\"import-parser-outcome\"\n />\n )}\n\n {/* Error */}\n {error && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Import failed\"\n data-testid=\"import-parser-error\"\n >\n <p className=\"break-words text-sm text-status-error-text\">{error.message}</p>\n </Section>\n )}\n\n {importResult && !importResult.success && importResult.errorMessage && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Import failed\"\n data-testid=\"import-parser-result-error\"\n >\n <p className=\"break-words text-sm text-status-error-text\">{importResult.errorMessage}</p>\n </Section>\n )}\n </div>\n\n <ResponsiveDialogFooter className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-between\">\n <div>\n {step === 'preview' && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n clearState();\n }}\n disabled={loading}\n >\n <ArrowLeft className=\"size-4\" />\n {t('bigconsole.parsers.import.back', 'Back')}\n </Button>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {step !== 'complete' && (\n <Button variant=\"outline\" onClick={onClose} disabled={!canClose}>\n {t('bigconsole.parsers.import.cancel', 'Cancel')}\n </Button>\n )}\n\n {step === 'preview' && validationResult?.isValid && (\n <Button onClick={handleImport} disabled={loading}>\n <Upload className=\"size-4\" />\n {t('bigconsole.parsers.import.importButton', 'Import Parser')}\n </Button>\n )}\n\n {step === 'importing' && (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Spinner className=\"size-4\" />\n {t('bigconsole.parsers.import.importing', 'Importing...')}\n </div>\n )}\n\n {step === 'complete' && <Button onClick={onClose}>{t('bigconsole.parsers.import.done', 'Done')}</Button>}\n </div>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n});\n\nexport default ImportParserDialog;\n"],"mappings":";;;;;;;;;;AA2BA,IAAM,IAAc,iEAoBP,IAAkD,EAAK,SAA4B,EAC9F,WACA,YACA,cACA,gBACC;CACD,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAM,KAAW,EAAqB,SAAS,EAChD,GAAG,KAAmB,EAAsB,KAAK,EACjD,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAC7D,CAAC,GAAc,KAAmB,EAAS,GAAG,EAC9C,CAAC,GAAsB,KAA2B,EAAS,GAAG,EAC9D,CAAC,GAAmB,KAAwB,EAAS,GAAG,EAExD,IAAe,EAAyB,KAAK,EAE7C,EAAE,YAAS,UAAO,qBAAkB,iBAAc,mBAAgB,iBAAc,qBAAiB,kBACrG,GAAiB;AAGnB,SAAgB;AACd,EAAI,MACF,EAAQ,SAAS,EACjB,EAAgB,KAAK,EACrB,EAAe,KAAK,EACpB,EAAgB,GAAG,EACnB,EAAwB,GAAG,EAC3B,EAAqB,GAAG,EACxB,GAAY;IAEb,CAAC,GAAQ,EAAW,CAAC;CAGxB,IAAM,KAAmB,EACvB,OAAO,MAA2C;EAChD,IAAM,IAAO,EAAE,OAAO,QAAQ;AAC9B,MAAI,CAAC,EAAM;AAEX,MAAI,CAAC,EAAK,KAAK,SAAS,QAAQ,EAAE;AAChC,SAAM,EAAE,4CAA4C,4BAA4B,CAAC;AACjF;;AAGF,IAAgB,EAAK;EAErB,IAAM,IAAS,IAAI,YAAY;AAkB/B,EAjBA,EAAO,SAAS,OAAO,MAAU;GAC/B,IAAM,IAAU,EAAM,QAAQ;AAC9B,KAAe,EAAQ;GAEvB,IAAM,IAAS,EAAe,EAAQ;AACtC,GAAI,EAAO,WAAW,EAAO,cAC3B,EAAQ,UAAU,EAClB,EAAgB,EAAO,WAAW,QAAQ,GAAG,EAC7C,EAAwB,EAAO,WAAW,gBAAgB,GAAG,EAC7D,EAAqB,EAAO,WAAW,aAAa,GAAG,IAEvD,EAAQ,UAAU;KAGtB,EAAO,gBAAgB;AACrB,SAAM,EAAE,4CAA4C,sBAAsB,CAAC;KAE7E,EAAO,WAAW,EAAK;IAEzB,CAAC,GAAgB,EAAE,CACpB,EAGK,KAAa,GAAa,MAAuB;AACrD,IAAE,gBAAgB;EAClB,IAAM,IAAO,EAAE,aAAa,QAAQ;AACpC,MAAI,GAAM;GACR,IAAM,IAAK,IAAI,cAAc;AAE7B,GADA,EAAG,MAAM,IAAI,EAAK,EACd,EAAa,YACf,EAAa,QAAQ,QAAQ,EAAG,OAChC,EAAa,QAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,IAAM,CAAC,CAAC;;IAG7E,EAAE,CAAC,EAGA,KAAe,EAAY,YAAY;AAC3C,MAAI,CAAC,EAAa;AAElB,IAAQ,YAAY;EASpB,IAAM,IAAS,MAAM,EAAa,GAPG;GACnC;GACA,MAAM,EAAa,MAAM,IAAI,KAAA;GAC7B,cAAc,EAAqB,MAAM,IAAI,KAAA;GAC7C,WAAW,EAAkB,MAAM,IAAI,KAAA;GACxC,CAEsD;AAEvD,EAAI,GAAQ,WAAW,EAAO,UAC5B,EAAQ,WAAW,EACnB,IAAY,EAAO,OAAO,IAAI,EAAO,OAAO,MAAM,EAAO,mBAAmB,GAAM,IAElF,EAAQ,UAAU;IAEnB;EAAC;EAAa;EAAW;EAAc;EAAsB;EAAmB;EAAc;EAAU,CAAC,EAEtG,IAAW,CAAC,KAAW,MAAS,aAChC,IAAW,IAAc,GAAgB,EAAY,GAAG;AAE9D,QACE,kBAAC,GAAD;EAAkB,MAAM;EAAQ,eAAe,MAAS,CAAC,KAAQ,KAAY,GAAS;YACpF,kBAAC,GAAD;GAAyB,WAAU;aAAnC;IACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAQ,WAAU,iCAAkC,CAAA;MAChD,CAAA,EACN,kBAAC,GAAD,EAAA,UAAwB,EAAE,mCAAmC,gBAAgB,EAAyB,CAAA,CAClG;QACN,kBAAC,GAAD,EAAA,UACG,EACC,yCACA,iEACD,EAC2B,CAAA,CACP,EAAA,CAAA;IAEzB,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEG,MAAS,YACR,kBAAC,OAAD;OACE,aAAa,MAAM,EAAE,gBAAgB;OACrC,QAAQ;OACR,WAAU;iBAHZ;QAKE,kBAAC,GAAD,EAAU,WAAU,4CAA6C,CAAA;QACjE,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAE,2CAA2C,0CAA0C;SACtF,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;mBAAoC,EAAE,gCAAgC,KAAK;SAAK,CAAA;QAC7F,kBAAC,SAAD;SAAO,KAAK;SAAc,MAAK;SAAO,QAAO;SAAQ,UAAU;SAAkB,WAAU;SAAW,CAAA;QACtG,kBAAC,GAAD;SAAQ,eAAe,EAAa,SAAS,OAAO;SAAE,UAAU;mBAC7D,EAAE,yCAAyC,eAAe;SACpD,CAAA;QACT,kBAAC,KAAD;SAAG,WAAU;mBACV,EACC,2CACA,0DACD;SACC,CAAA;QACA;;OAIN,MAAS,aAAa,MAAS,gBAAgB,KAC/C,kBAAA,GAAA,EAAA,UAAA;OAEG,EAAiB,cAChB,kBAAC,GAAD;QACE,UAAS;QACT,SAAQ;QACR,cAAc;QACd,OAAM;QACN,eAAc;QACd,eAAY;kBANd;SAQE,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,yCAAyC,SAAS;WAChD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SACN,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,uCAAuC,OAAO;WAC5C,CAAA,EACP,kBAAC,GAAD;WAAO,SAAQ;qBAAa,EAAiB,WAAW;WAAa,CAAA,CACjE;;SACN,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,4CAA4C,aAAa;WACvD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SACN,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,4CAA4C,aAAa;WACvD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SACL,EAAiB,WAAW,gBAC3B,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,2CAA2C,YAAY;WACrD,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAiB,WAAW;WACxB,CAAA,CACH;;SAER,kBAAC,OAAD;UAAK,WAAW;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAE,gDAAgD,iBAAiB;WAC/D,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBAA+B,EAAiB,WAAW;WAAqB,CAAA,CAC5F;;SACE;;OAIX,EAAiB,OAAO,SAAS,KAChC,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,cAAc;QACd,OAAO,EAAE,yCAAyC,sBAAsB,EACtE,OAAO,EAAiB,OAAO,QAChC,CAAC;QACF,MAAM,kBAAC,GAAD,EAAS,WAAU,gDAAiD,CAAA;QAC1E,eAAY;kBAEZ,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAiB,OAAO,KAAK,GAAK,MACjC,kBAAC,MAAD;UAAc,WAAU;oBAAxB;WACE,kBAAC,QAAD;YAAM,WAAU;sBAAhB;aAA4B;aAAE,EAAI;aAAK;aAAQ;;;WAAE,EAAI;WAClD;YAFI,EAEJ,CACL;SACC,CAAA;QACG,CAAA;OAIX,EAAiB,WAChB,kBAAC,GAAD;QACE,cAAc;QACd,OAAO,EAAE,4CAA4C,iBAAiB;QACtE,aAAY;QACZ,eAAc;QACd,eAAY;kBALd;SAQE,kBAAC,GAAD;UACE,MAAK;UACL,SAAQ;UACR,cAAc;UACd,OACE,IACI,EAAE,gDAAgD,wCAAwC,GAC1F,EAAE,4CAA4C,+BAA+B;UAEnF,MAAM,kBAAC,GAAD,EAAM,WAAU,+CAAgD,CAAA;oBAEtE,kBAAC,OAAD;WAAK,WAAU;qBACZ,IACC,kBAAA,GAAA,EAAA,UAAA;YACE,kBAAC,KAAD,EAAA,UAAA;aACG,EAAE,oDAAoD,8BAA8B;aAAE;aACvF,kBAAC,QAAD;cAAM,WAAU;wBAAhB,CAAuD,EAAS,MAAM,GAAG,EAAE,EAAC,MAAU;;aACrF,EAAE,oDAAoD,YAAY;aACjE,EAAA,CAAA;YACJ,kBAAC,MAAD;aAAI,WAAU;uBAAd,CACE,kBAAC,MAAD,EAAA,UACG,EAAE,yCAAyC,4CAA4C,EACrF,CAAA,EACL,kBAAC,MAAD,EAAA,UACG,EAAE,uCAAuC,+CAA6C,EACpF,CAAA,CACF;;YACL,kBAAC,KAAD;aAAG,WAAU;uBACV,EACC,+CACA,kDACD;aACC,CAAA;YACH,EAAA,CAAA,GAEH,kBAAC,KAAD,EAAA,UACG,EACC,2CACA,2DACD,EACC,CAAA;WAEF,CAAA;UACE,CAAA;SAEV,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAe,EAAE,6CAA6C,cAAc;WAAS,CAAA,EACpG,kBAAC,GAAD;WACE,IAAG;WACH,MAAK;WACL,OAAO;WACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;WAChD,aACE,EAAiB,YAAY,QAC7B,EAAE,mDAAmD,cAAc;WAErE,UAAU,MAAS;WACnB,CAAA,CACE;;SAEN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YAAO,SAAQ;sBACZ,EAAE,+CAA+C,iBAAiB;YAC7D,CAAA;WACR,kBAAC,GAAD;YACE,IAAG;YACH,MAAK;YACL,OAAO;YACP,WAAW,MAAM,EAAwB,EAAE,OAAO,MAAM;YACxD,aACE,EAAiB,YAAY,gBAC7B,EAAE,qDAAqD,iBAAiB;YAE1E,UAAU,MAAS;YACnB,CAAA;WACF,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAE,8CAA8C,4CAA4C;YAC3F,CAAA;WACA;;SAEN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YAAO,SAAQ;sBACZ,EAAE,4CAA4C,aAAa;YACtD,CAAA;WACR,kBAAC,GAAD;YACE,IAAG;YACH,MAAK;YACL,OAAO;YACP,WAAW,MAAM,EAAqB,EAAE,OAAO,MAAM;YACrD,aACE,EAAiB,YAAY,aAC7B,EAAE,kDAAkD,aAAa;YAEnE,UAAU,MAAS;YACnB,CAAA;WACF,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAE,2CAA2C,6CAA6C;YACzF,CAAA;WACA;;SACE;;OAEX,EAAA,CAAA;MAIJ,MAAS,cAAc,GAAc,WACpC,kBAAC,GAAD;OACE,MAAM,EAAa,gBAAgB,SAAS;OAC5C,cAAc;OACd,OACE,EAAa,gBACT,EAAE,gDAAgD,wBAAwB,GAC1E,EAAa,kBACX,EAAE,0CAA0C,kBAAkB,GAC9D,EAAE,0CAA0C,qBAAqB;OAEzE,MACE,EAAa,gBACX,kBAAC,GAAD,EAAM,WAAU,+CAAgD,CAAA,GAC9D,EAAa,kBACf,kBAAC,IAAD,EAAW,WAAU,kDAAmD,CAAA,GAExE,kBAAC,GAAD,EAAO,WAAU,kDAAmD,CAAA;OAGxE,aACE,EAAa,gBACT,EACE,+CACA,gFACA,EAAE,MAAM,EAAa,QAAQ,QAAQ,IAAI,CAC1C,GACD,EAAa,kBACX,EACE,yCACA,gEACA,EAAE,MAAM,EAAa,QAAQ,QAAQ,IAAI,CAC1C,GACD,EAAE,yCAAyC,yCAAuC,EAChF,MAAM,EAAa,QAAQ,QAAQ,IACpC,CAAC;OAEV,eAAY;OACZ,CAAA;MAIH,KACC,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,cAAc;OACd,OAAM;OACN,eAAY;iBAEZ,kBAAC,KAAD;QAAG,WAAU;kBAA8C,EAAM;QAAY,CAAA;OACrE,CAAA;MAGX,KAAgB,CAAC,EAAa,WAAW,EAAa,gBACrD,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,cAAc;OACd,OAAM;OACN,eAAY;iBAEZ,kBAAC,KAAD;QAAG,WAAU;kBAA8C,EAAa;QAAiB,CAAA;OACjF,CAAA;MAER;;IAEN,kBAAC,GAAD;KAAwB,WAAU;eAAlC,CACE,kBAAC,OAAD,EAAA,UACG,MAAS,aACR,kBAAC,GAAD;MACE,SAAQ;MACR,eAAe;AAIb,OAHA,EAAQ,SAAS,EACjB,EAAgB,KAAK,EACrB,EAAe,KAAK,EACpB,GAAY;;MAEd,UAAU;gBARZ,CAUE,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA,EAC/B,EAAE,kCAAkC,OAAO,CACrC;SAEP,CAAA,EAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,MAAS,cACR,kBAAC,GAAD;QAAQ,SAAQ;QAAU,SAAS;QAAS,UAAU,CAAC;kBACpD,EAAE,oCAAoC,SAAS;QACzC,CAAA;OAGV,MAAS,aAAa,GAAkB,WACvC,kBAAC,GAAD;QAAQ,SAAS;QAAc,UAAU;kBAAzC,CACE,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA,EAC5B,EAAE,0CAA0C,gBAAgB,CACtD;;OAGV,MAAS,eACR,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA,EAC7B,EAAE,uCAAuC,eAAe,CACrD;;OAGP,MAAS,cAAc,kBAAC,GAAD;QAAQ,SAAS;kBAAU,EAAE,kCAAkC,OAAO;QAAU,CAAA;OACpG;QACiB;;IACD;;EACT,CAAA;EAErB"}
@@ -7,39 +7,39 @@ import r from "./ParserTypeBadge.js";
7
7
  import i from "./ParserStatusBadge.js";
8
8
  import { Fragment as a, memo as o, useCallback as s, useEffect as c, useMemo as l, useState as u } from "react";
9
9
  import { Plus as d } from "lucide-react";
10
- import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
10
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
+ import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
12
  //#region src/bigconsole/components/parser/ParserSelector.tsx
13
- var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]", _ = "text-xs font-semibold uppercase tracking-wide text-text-secondary", v = ({ className: e }) => /* @__PURE__ */ p("svg", {
13
+ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]", _ = "text-xs font-semibold uppercase tracking-wide text-text-secondary", v = ({ className: e }) => /* @__PURE__ */ f("svg", {
14
14
  className: e,
15
15
  fill: "none",
16
16
  stroke: "currentColor",
17
17
  viewBox: "0 0 24 24",
18
- children: /* @__PURE__ */ p("path", {
18
+ children: /* @__PURE__ */ f("path", {
19
19
  strokeLinecap: "round",
20
20
  strokeLinejoin: "round",
21
21
  strokeWidth: 2,
22
22
  d: "M19 9l-7 7-7-7"
23
23
  })
24
- }), y = ({ className: e }) => /* @__PURE__ */ m("svg", {
24
+ }), y = ({ className: e }) => /* @__PURE__ */ p("svg", {
25
25
  className: e,
26
26
  fill: "none",
27
27
  stroke: "currentColor",
28
28
  viewBox: "0 0 24 24",
29
29
  children: [
30
- /* @__PURE__ */ p("path", {
30
+ /* @__PURE__ */ f("path", {
31
31
  strokeLinecap: "round",
32
32
  strokeLinejoin: "round",
33
33
  strokeWidth: 2,
34
34
  d: "M12 21a9 9 0 100-18 9 9 0 000 18z"
35
35
  }),
36
- /* @__PURE__ */ p("path", {
36
+ /* @__PURE__ */ f("path", {
37
37
  strokeLinecap: "round",
38
38
  strokeLinejoin: "round",
39
39
  strokeWidth: 2,
40
40
  d: "M3.6 9h16.8M3.6 15h16.8"
41
41
  }),
42
- /* @__PURE__ */ p("path", {
42
+ /* @__PURE__ */ f("path", {
43
43
  strokeLinecap: "round",
44
44
  strokeLinejoin: "round",
45
45
  strokeWidth: 2,
@@ -47,8 +47,8 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
47
47
  })
48
48
  ]
49
49
  }), b = o(function({ parser: e, isSelected: n, onSelect: a, isGlobal: o = !1 }) {
50
- let { t: s } = f();
51
- return /* @__PURE__ */ p("button", {
50
+ let { t: s } = m();
51
+ return /* @__PURE__ */ f("button", {
52
52
  type: "button",
53
53
  onClick: () => a(e.id),
54
54
  className: `
@@ -60,35 +60,35 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
60
60
  ${t}
61
61
  ${n ? "bg-action-primary-bg/10" : ""}
62
62
  `,
63
- children: /* @__PURE__ */ m("div", {
63
+ children: /* @__PURE__ */ p("div", {
64
64
  className: "flex items-start justify-between gap-2",
65
- children: [/* @__PURE__ */ m("div", {
65
+ children: [/* @__PURE__ */ p("div", {
66
66
  className: "flex-1 min-w-0",
67
67
  children: [
68
- /* @__PURE__ */ m("div", {
68
+ /* @__PURE__ */ p("div", {
69
69
  className: "flex items-center gap-2 mb-1",
70
70
  children: [
71
- /* @__PURE__ */ p(r, {
71
+ /* @__PURE__ */ f(r, {
72
72
  type: e.type,
73
73
  size: "sm"
74
74
  }),
75
- /* @__PURE__ */ p("span", {
75
+ /* @__PURE__ */ f("span", {
76
76
  className: "text-sm font-medium text-text-primary truncate",
77
77
  children: e.name
78
78
  }),
79
- o && /* @__PURE__ */ m("span", {
79
+ o && /* @__PURE__ */ p("span", {
80
80
  className: "inline-flex items-center gap-1 px-1.5 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded",
81
- children: [/* @__PURE__ */ p(y, { className: "w-3 h-3" }), s("bigconsole.parsers.selector.globalBadge", "Global")]
81
+ children: [/* @__PURE__ */ f(y, { className: "w-3 h-3" }), s("bigconsole.parsers.selector.globalBadge", "Global")]
82
82
  })
83
83
  ]
84
84
  }),
85
- e.description && /* @__PURE__ */ p("p", {
85
+ e.description && /* @__PURE__ */ f("p", {
86
86
  className: "text-xs text-text-secondary line-clamp-1 mb-1",
87
87
  children: e.description
88
88
  }),
89
- /* @__PURE__ */ p("div", {
89
+ /* @__PURE__ */ f("div", {
90
90
  className: "flex min-w-0 items-center gap-2 text-xs text-text-muted",
91
- children: /* @__PURE__ */ m("span", {
91
+ children: /* @__PURE__ */ p("span", {
92
92
  className: "truncate font-mono",
93
93
  children: [
94
94
  e.inputSinkKey,
@@ -98,9 +98,9 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
98
98
  })
99
99
  })
100
100
  ]
101
- }), /* @__PURE__ */ p("div", {
101
+ }), /* @__PURE__ */ f("div", {
102
102
  className: "shrink-0",
103
- children: /* @__PURE__ */ p(i, {
103
+ children: /* @__PURE__ */ f(i, {
104
104
  status: e.status,
105
105
  size: "sm",
106
106
  showIcon: !1
@@ -109,7 +109,7 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
109
109
  })
110
110
  });
111
111
  }), x = o(function({ consoleId: i, value: o, onChange: y, filterType: x, filterStatus: S = "active", filterInputSinkKey: C, placeholder: w, disabled: T = !1, error: E = !1, errorMessage: D }) {
112
- let { t: O } = f(), [k, A] = u(!1), [j, M] = u(""), N = w ?? O("bigconsole.parsers.selector.placeholder", "Select a parser..."), P = e(), F = i === h, { parsers: I, loading: L, fetchParsers: R } = n({
112
+ let { t: O } = m(), [k, A] = u(!1), [j, M] = u(""), N = w ?? O("bigconsole.parsers.selector.placeholder", "Select a parser..."), P = e(), F = i === h, { parsers: I, loading: L, fetchParsers: R } = n({
113
113
  consoleId: i,
114
114
  skipFetch: F
115
115
  }), { parsers: z, loading: B, fetchParsers: V } = n({
@@ -188,10 +188,10 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
188
188
  i,
189
189
  F
190
190
  ]);
191
- return /* @__PURE__ */ m("div", {
191
+ return /* @__PURE__ */ p("div", {
192
192
  className: "relative",
193
193
  children: [
194
- /* @__PURE__ */ m("button", {
194
+ /* @__PURE__ */ p("button", {
195
195
  type: "button",
196
196
  onClick: Y,
197
197
  disabled: T,
@@ -210,39 +210,39 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
210
210
  ${E ? "border-status-error-border" : "border-[var(--color-border-default)]"}
211
211
  ${k ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
212
212
  `,
213
- children: [/* @__PURE__ */ p("div", {
213
+ children: [/* @__PURE__ */ f("div", {
214
214
  className: "flex-1 min-w-0",
215
- children: q ? /* @__PURE__ */ m("div", {
215
+ children: q ? /* @__PURE__ */ p("div", {
216
216
  className: "flex min-w-0 items-center gap-2",
217
- children: [/* @__PURE__ */ p(r, {
217
+ children: [/* @__PURE__ */ f(r, {
218
218
  type: q.type,
219
219
  size: "sm"
220
- }), /* @__PURE__ */ p("span", {
220
+ }), /* @__PURE__ */ f("span", {
221
221
  className: "text-sm text-text-primary truncate",
222
222
  children: q.name
223
223
  })]
224
- }) : /* @__PURE__ */ p("span", {
224
+ }) : /* @__PURE__ */ f("span", {
225
225
  className: "text-sm text-text-muted",
226
226
  children: N
227
227
  })
228
- }), /* @__PURE__ */ p(v, {
228
+ }), /* @__PURE__ */ f(v, {
229
229
  "aria-hidden": "true",
230
230
  className: `w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${k ? "transform rotate-180" : ""}`
231
231
  })]
232
232
  }),
233
- E && D && /* @__PURE__ */ p("p", {
233
+ E && D && /* @__PURE__ */ f("p", {
234
234
  className: "mt-1 text-xs text-status-error-text",
235
235
  children: D
236
236
  }),
237
- k && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
237
+ k && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
238
238
  className: "fixed inset-0 z-10",
239
239
  onClick: X
240
- }), /* @__PURE__ */ m("div", {
240
+ }), /* @__PURE__ */ p("div", {
241
241
  className: "absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-[var(--color-border-default)] rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden",
242
242
  children: [
243
- /* @__PURE__ */ p("div", {
243
+ /* @__PURE__ */ f("div", {
244
244
  className: "p-2 border-b border-[var(--color-border-default)]",
245
- children: /* @__PURE__ */ p("input", {
245
+ children: /* @__PURE__ */ f("input", {
246
246
  type: "text",
247
247
  "aria-label": O("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
248
248
  placeholder: O("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
@@ -251,16 +251,16 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
251
251
  className: "\n w-full min-w-0 min-h-control-md px-3 py-2\n bg-bg-sunken\n border border-[var(--color-border-default)]\n rounded-md\n text-sm text-text-primary\n placeholder:text-text-muted\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n "
252
252
  })
253
253
  }),
254
- /* @__PURE__ */ p("div", {
254
+ /* @__PURE__ */ f("div", {
255
255
  className: "overflow-y-auto flex-1",
256
- children: U ? /* @__PURE__ */ p("div", {
256
+ children: U ? /* @__PURE__ */ f("div", {
257
257
  className: "p-4 text-center text-sm text-text-secondary",
258
258
  children: O("bigconsole.parsers.selector.loading", "Loading parsers...")
259
- }) : W.length === 0 ? /* @__PURE__ */ p("div", {
259
+ }) : W.length === 0 ? /* @__PURE__ */ f("div", {
260
260
  className: "p-4 text-center text-sm text-text-secondary",
261
261
  children: O("bigconsole.parsers.selector.empty", "No parsers found")
262
- }) : /* @__PURE__ */ m(a, { children: [
263
- /* @__PURE__ */ p("button", {
262
+ }) : /* @__PURE__ */ p(a, { children: [
263
+ /* @__PURE__ */ f("button", {
264
264
  type: "button",
265
265
  onClick: () => J(null),
266
266
  className: `
@@ -271,29 +271,29 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
271
271
  focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
272
272
  ${o === null ? "bg-action-primary-bg/10 text-action-primary-bg" : "text-text-secondary"}
273
273
  `,
274
- children: /* @__PURE__ */ p("span", {
274
+ children: /* @__PURE__ */ f("span", {
275
275
  className: "italic",
276
276
  children: O("bigconsole.parsers.selector.none", "None")
277
277
  })
278
278
  }),
279
- G.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
279
+ G.length > 0 && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
280
280
  className: g,
281
- children: /* @__PURE__ */ p("span", {
281
+ children: /* @__PURE__ */ f("span", {
282
282
  className: _,
283
283
  children: O("bigconsole.parsers.selector.dashboardParsers", "Dashboard Parsers")
284
284
  })
285
- }), G.map((e) => /* @__PURE__ */ p(b, {
285
+ }), G.map((e) => /* @__PURE__ */ f(b, {
286
286
  parser: e,
287
287
  isSelected: o === e.id,
288
288
  onSelect: J
289
289
  }, e.id))] }),
290
- K.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
290
+ K.length > 0 && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
291
291
  className: g,
292
- children: /* @__PURE__ */ p("span", {
292
+ children: /* @__PURE__ */ f("span", {
293
293
  className: _,
294
294
  children: O("bigconsole.parsers.selector.globalParsers", "Global Parsers")
295
295
  })
296
- }), K.map((e) => /* @__PURE__ */ p(b, {
296
+ }), K.map((e) => /* @__PURE__ */ f(b, {
297
297
  parser: e,
298
298
  isSelected: o === e.id,
299
299
  onSelect: J,
@@ -301,13 +301,13 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
301
301
  }, e.id))] })
302
302
  ] })
303
303
  }),
304
- /* @__PURE__ */ p("div", {
304
+ /* @__PURE__ */ f("div", {
305
305
  className: "p-2 border-t border-border-default",
306
- children: /* @__PURE__ */ m("button", {
306
+ children: /* @__PURE__ */ p("button", {
307
307
  type: "button",
308
308
  onClick: Z,
309
309
  className: "\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n ",
310
- children: [/* @__PURE__ */ p(d, { className: "w-4 h-4" }), O("bigconsole.parsers.selector.createNew", "Create new parser")]
310
+ children: [/* @__PURE__ */ f(d, { className: "w-4 h-4" }), O("bigconsole.parsers.selector.createNew", "Create new parser")]
311
311
  })
312
312
  })
313
313
  ]
@@ -5,8 +5,8 @@ import i from "../../hooks/useDataSinkOperations.js";
5
5
  import a from "../widgets/WidgetWrapper.js";
6
6
  import o from "../DrilldownDashboardRenderer.js";
7
7
  import { useEffect as s, useRef as c, useState as l } from "react";
8
- import { useApolloClient as u } from "@apollo/client/react";
9
- import { Spinner as d } from "@burdenoff/fe-libs/ui";
8
+ import { Spinner as u } from "@burdenoff/fe-libs/ui";
9
+ import { useApolloClient as d } from "@apollo/client/react";
10
10
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
11
  //#region src/bigconsole/components/preview/AiPreviewContent.tsx
12
12
  var m = 4e3, h = 6e4, g = "flex min-h-[6rem] min-w-0 items-center justify-center gap-2 rounded-card bg-bg-sunken px-3 py-6 text-center text-sm text-text-muted";
@@ -14,7 +14,7 @@ function _({ label: e, testId: t }) {
14
14
  return /* @__PURE__ */ p("div", {
15
15
  className: g,
16
16
  "data-testid": t,
17
- children: [/* @__PURE__ */ f(d, { className: "size-4 shrink-0" }), e]
17
+ children: [/* @__PURE__ */ f(u, { className: "size-4 shrink-0" }), e]
18
18
  });
19
19
  }
20
20
  function v({ text: e, testId: t }) {
@@ -97,7 +97,7 @@ function S({ dashboardId: e }) {
97
97
  });
98
98
  }
99
99
  function C({ parserId: t, live: r }) {
100
- let a = u(), { getDataSinkData: o } = i({ skipFetch: !0 }), { data: s, loading: c, error: l } = b(async () => {
100
+ let a = d(), { getDataSinkData: o } = i({ skipFetch: !0 }), { data: s, loading: c, error: l } = b(async () => {
101
101
  if (!t) return null;
102
102
  let n = (await a.query({
103
103
  query: e,
@@ -131,7 +131,7 @@ function w(e) {
131
131
  return t.includes("METRIC") || t.includes("KPI") || t.includes("CARD") || t.includes("STAT") ? "min(160px, 40vh)" : t.includes("TABLE") || t.includes("LIST") ? "min(280px, 50vh)" : "min(320px, 50vh)";
132
132
  }
133
133
  function T(e, n) {
134
- let i = u(), { data: a, loading: o, error: s } = b(async () => e ? ((await i.query({
134
+ let i = d(), { data: a, loading: o, error: s } = b(async () => e ? ((await i.query({
135
135
  query: t,
136
136
  variables: { dashboardId: e },
137
137
  fetchPolicy: "network-only"
@@ -1,34 +1,34 @@
1
- import { Section as e } from "../common/Section.js";
1
+ import { useAssistantPanelShowsPreview as e } from "../../assistant/useAssistantPanelShowsPreview.js";
2
+ import { PREVIEW_STEPS as t, useAssistantRunStore as n } from "../../assistant/assistantRunStore.js";
3
+ import { Section as r } from "../common/Section.js";
2
4
  import "../common/index.js";
3
- import { useAssistantPanelShowsPreview as t } from "../../assistant/useAssistantPanelShowsPreview.js";
4
- import { PREVIEW_STEPS as n, useAssistantRunStore as r } from "../../assistant/assistantRunStore.js";
5
5
  import { DOCK_CLEARANCE as i, PreviewMeta as a, STEP_LABEL as o, formatAgo as s, previewLabels as c } from "./previewShared.js";
6
6
  import { ArrowUpRight as l, Braces as u, Database as d, LayoutDashboard as f, Loader2 as p, Sparkles as m, X as h } from "lucide-react";
7
- import { useI18n as g } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { Button as _ } from "@burdenoff/fe-libs/ui";
9
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
10
- import { AssistantEntityPreview as b } from "@burdenoff/fe-libs/shared/assistant";
7
+ import { Button as g } from "@burdenoff/fe-libs/ui";
8
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
9
+ import { AssistantEntityPreview as y } from "@burdenoff/fe-libs/shared/assistant";
10
+ import { useI18n as b } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
11
  //#region src/bigconsole/components/preview/AiPreviewMiniPanel.tsx
12
12
  function x({ onNavigate: x }) {
13
- let { t: S } = g(), C = t(), w = r((e) => e.isRunning), T = r((e) => e.previewOpen), E = r((e) => e.hasRun), D = r((e) => e.richMounted), O = r((e) => e.steps), k = r((e) => e.entityIds), A = r((e) => e.caption), j = r((e) => e.error), M = r((e) => e.updatedAt), N = r((e) => e.openPreview), P = r((e) => e.closePreview), F = (e) => {
13
+ let { t: S } = b(), C = e(), w = n((e) => e.isRunning), T = n((e) => e.previewOpen), E = n((e) => e.hasRun), D = n((e) => e.richMounted), O = n((e) => e.steps), k = n((e) => e.entityIds), A = n((e) => e.caption), j = n((e) => e.error), M = n((e) => e.updatedAt), N = n((e) => e.openPreview), P = n((e) => e.closePreview), F = (e) => {
14
14
  x ? x(e) : typeof window < "u" && window.location.assign(e);
15
15
  };
16
16
  if (!E || D || C) return null;
17
- if (!T) return /* @__PURE__ */ y("div", {
17
+ if (!T) return /* @__PURE__ */ v("div", {
18
18
  className: "flex flex-wrap items-center justify-end gap-control-gap px-4 pt-3 md:px-6",
19
19
  style: { marginRight: i },
20
- children: [/* @__PURE__ */ v("span", {
20
+ children: [/* @__PURE__ */ _("span", {
21
21
  className: "text-xs text-text-muted",
22
22
  children: w ? S("bigconsole.widget.aiPreview.buildRunning", "AI build running") : S("bigconsole.widget.aiPreview.buildFinished", "AI build finished")
23
- }), /* @__PURE__ */ y(_, {
23
+ }), /* @__PURE__ */ v(g, {
24
24
  size: "sm",
25
25
  variant: "outline",
26
26
  onClick: N,
27
27
  "data-testid": "ai-preview-open",
28
28
  children: [
29
- /* @__PURE__ */ v(m, { className: "mr-1.5 size-4" }),
29
+ /* @__PURE__ */ _(m, { className: "mr-1.5 size-4" }),
30
30
  S("bigconsole.widget.aiPreviewMini.previewButton", "Preview"),
31
- w ? /* @__PURE__ */ v(p, { className: "ml-1.5 size-3.5 animate-spin" }) : null
31
+ w ? /* @__PURE__ */ _(p, { className: "ml-1.5 size-3.5 animate-spin" }) : null
32
32
  ]
33
33
  })]
34
34
  });
@@ -37,7 +37,7 @@ function x({ onNavigate: x }) {
37
37
  key: "datasink",
38
38
  label: S("bigconsole.widget.aiPreviewMini.link.dataSink", "Data Sink"),
39
39
  path: `/bigconsole/datasinks/${k.datasink}`,
40
- icon: /* @__PURE__ */ v(d, {
40
+ icon: /* @__PURE__ */ _(d, {
41
41
  className: "size-4 shrink-0 text-text-muted",
42
42
  "aria-hidden": "true"
43
43
  })
@@ -45,7 +45,7 @@ function x({ onNavigate: x }) {
45
45
  key: "dashboard",
46
46
  label: S("bigconsole.widget.aiPreviewMini.link.dashboard", "Dashboard"),
47
47
  path: `/bigconsole/dashboards/${k.dashboard}`,
48
- icon: /* @__PURE__ */ v(f, {
48
+ icon: /* @__PURE__ */ _(f, {
49
49
  className: "size-4 shrink-0 text-text-muted",
50
50
  "aria-hidden": "true"
51
51
  })
@@ -53,79 +53,79 @@ function x({ onNavigate: x }) {
53
53
  key: "parser",
54
54
  label: S("bigconsole.widget.aiPreviewMini.link.parser", "Parser"),
55
55
  path: `/bigconsole/parsers/${k.parser}`,
56
- icon: /* @__PURE__ */ v(u, {
56
+ icon: /* @__PURE__ */ _(u, {
57
57
  className: "size-4 shrink-0 text-text-muted",
58
58
  "aria-hidden": "true"
59
59
  })
60
60
  });
61
- let L = n.map((e) => ({
61
+ let L = t.map((e) => ({
62
62
  id: e,
63
63
  label: S(o[e].key, o[e].fallback),
64
64
  status: O[e]
65
65
  }));
66
- return /* @__PURE__ */ y("div", {
66
+ return /* @__PURE__ */ v("div", {
67
67
  "data-testid": "ai-preview-panel",
68
68
  "data-variant": "mini",
69
69
  style: { paddingRight: i },
70
70
  className: "mx-4 mb-3 mt-3 min-w-0 md:mx-6",
71
- children: [/* @__PURE__ */ v("h2", {
71
+ children: [/* @__PURE__ */ _("h2", {
72
72
  className: "sr-only",
73
73
  children: S("bigconsole.widget.aiPreviewMini.title", "AI Preview")
74
- }), /* @__PURE__ */ v(b, {
74
+ }), /* @__PURE__ */ _(y, {
75
75
  title: S("bigconsole.widget.aiPreviewMini.title", "AI Preview"),
76
76
  steps: L,
77
77
  caption: w ? A || S("bigconsole.widget.aiPreviewMini.working", "Working…") : S("bigconsole.widget.aiPreviewMini.done", "Done"),
78
78
  error: j,
79
- meta: /* @__PURE__ */ v(a, {
79
+ meta: /* @__PURE__ */ _(a, {
80
80
  state: w ? "running" : j ? "stopped" : "idle",
81
81
  stateLabel: w ? S("bigconsole.widget.aiPreviewMini.live", "Live") : j ? S("bigconsole.widget.aiPreviewMini.stopped", "Stopped") : null,
82
82
  updatedLabel: S("bigconsole.widget.aiPreviewMini.updated", "updated"),
83
83
  updatedAt: M,
84
84
  ago: (e) => s(e, S)
85
85
  }),
86
- headerActions: /* @__PURE__ */ v(_, {
86
+ headerActions: /* @__PURE__ */ _(g, {
87
87
  size: "sm",
88
88
  variant: "ghost",
89
89
  onClick: P,
90
90
  "aria-label": S("bigconsole.widget.aiPreviewMini.closeAriaLabel", "Close preview"),
91
91
  "data-testid": "ai-preview-close",
92
- children: /* @__PURE__ */ v(h, { className: "size-4" })
92
+ children: /* @__PURE__ */ _(h, { className: "size-4" })
93
93
  }),
94
94
  labels: c(S),
95
- children: /* @__PURE__ */ v("div", {
95
+ children: /* @__PURE__ */ _("div", {
96
96
  className: "p-3",
97
- children: /* @__PURE__ */ y(e, {
97
+ children: /* @__PURE__ */ v(r, {
98
98
  emphasis: "standard",
99
99
  padding: "compact",
100
100
  headingLevel: 3,
101
101
  title: S("bigconsole.widget.aiPreviewMini.builtSoFar", "Built so far"),
102
102
  description: S("bigconsole.widget.aiPreviewMini.builtSoFarHint", "Open any piece to see the real thing."),
103
103
  bodyClassName: "flex flex-col gap-list-gap",
104
- children: [I.length === 0 ? /* @__PURE__ */ v("p", {
104
+ children: [I.length === 0 ? /* @__PURE__ */ _("p", {
105
105
  className: "text-sm text-text-muted",
106
106
  children: w ? S("bigconsole.widget.aiPreviewMini.building", "Building… links appear here as each piece is created.") : S("bigconsole.widget.aiPreviewMini.nothingBuilt", "Nothing built yet.")
107
- }) : I.map((e) => /* @__PURE__ */ y("div", {
107
+ }) : I.map((e) => /* @__PURE__ */ v("div", {
108
108
  "data-testid": "ai-preview-row",
109
109
  className: "flex min-w-0 items-center justify-between gap-control-gap rounded-card border border-[var(--color-border-subtle)] bg-bg-canvas px-3 py-2",
110
- children: [/* @__PURE__ */ y("p", {
110
+ children: [/* @__PURE__ */ v("p", {
111
111
  className: "flex min-w-0 items-center gap-icon-gap text-sm font-medium text-text-primary",
112
- children: [e.icon, /* @__PURE__ */ v("span", {
112
+ children: [e.icon, /* @__PURE__ */ _("span", {
113
113
  className: "truncate",
114
114
  children: S("bigconsole.widget.aiPreviewMini.linkReady", "{{label}} ready", { label: e.label })
115
115
  })]
116
- }), /* @__PURE__ */ y(_, {
116
+ }), /* @__PURE__ */ v(g, {
117
117
  size: "sm",
118
118
  variant: "ghost",
119
119
  onClick: () => F(e.path),
120
- children: [S("bigconsole.widget.aiPreviewMini.open", "Open"), /* @__PURE__ */ v(l, { className: "ml-1 size-3.5" })]
120
+ children: [S("bigconsole.widget.aiPreviewMini.open", "Open"), /* @__PURE__ */ _(l, { className: "ml-1 size-3.5" })]
121
121
  })]
122
- }, e.key)), k.dashboard ? /* @__PURE__ */ y(_, {
122
+ }, e.key)), k.dashboard ? /* @__PURE__ */ v(g, {
123
123
  size: "sm",
124
124
  variant: "outline",
125
125
  className: "h-auto w-full whitespace-normal py-1.5 text-center",
126
126
  "data-testid": "ai-preview-open-in-bigconsole",
127
127
  onClick: () => F(`/bigconsole/dashboards/${k.dashboard ?? ""}`),
128
- children: [S("bigconsole.widget.aiPreviewMini.openInBigConsole", "Open in BigConsole for the live view"), /* @__PURE__ */ v(l, { className: "ml-1 size-3.5" })]
128
+ children: [S("bigconsole.widget.aiPreviewMini.openInBigConsole", "Open in BigConsole for the live view"), /* @__PURE__ */ _(l, { className: "ml-1 size-3.5" })]
129
129
  }) : null]
130
130
  })
131
131
  })