@burdenoff/microfe-bigconsole 2026.1008.11 → 2026.1008.12

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 (131) hide show
  1. package/dist/bigconsole/BigConsoleRoutes.d.ts.map +1 -1
  2. package/dist/bigconsole/BigConsoleRoutes.js +136 -127
  3. package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
  4. package/dist/bigconsole/assistant/assistantProduct.d.ts.map +1 -1
  5. package/dist/bigconsole/assistant/assistantProduct.js +3 -1
  6. package/dist/bigconsole/assistant/assistantProduct.js.map +1 -1
  7. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +31 -31
  8. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +44 -44
  9. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  10. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +36 -36
  11. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  12. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +59 -59
  13. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +15 -15
  14. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +41 -41
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +34 -34
  18. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +110 -110
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  20. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +21 -21
  21. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
  22. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +91 -91
  23. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -101
  25. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/TemplateInstallOptions.js +31 -31
  27. package/dist/bigconsole/components/dashboard/TemplateLayoutPreview.js +15 -15
  28. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
  29. package/dist/bigconsole/components/dashboard/WidgetPalette.js +46 -46
  30. package/dist/bigconsole/components/datasink/AlertExecutionHistory.js +37 -37
  31. package/dist/bigconsole/components/datasink/AlertRuleEditor.js +66 -66
  32. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
  33. package/dist/bigconsole/components/datasink/DataSinkCard.js +29 -29
  34. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
  35. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
  36. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +47 -47
  37. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +91 -91
  38. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
  39. package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
  40. package/dist/bigconsole/components/parser/ImportParserDialog.js +120 -120
  41. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  42. package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
  43. package/dist/bigconsole/components/pipeline/PipelineScopePicker.js +10 -10
  44. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +27 -27
  45. package/dist/bigconsole/components/preview/AiPreviewPanel.js +30 -30
  46. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +4 -4
  47. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +93 -93
  48. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  49. package/dist/bigconsole/components/widgets/PropertiesPanel.d.ts.map +1 -1
  50. package/dist/bigconsole/components/widgets/PropertiesPanel.js +280 -273
  51. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  52. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +4 -4
  53. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
  54. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
  55. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
  56. package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
  57. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
  58. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
  59. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
  60. package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
  61. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
  62. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
  63. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
  64. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
  65. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
  66. package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
  67. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
  68. package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js +15 -15
  69. package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js +15 -15
  70. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +9 -9
  71. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +67 -67
  72. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  73. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts +15 -0
  74. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts.map +1 -0
  75. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js +34 -0
  76. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js.map +1 -0
  77. package/dist/bigconsole/hooks/useDrilldown.js +3 -3
  78. package/dist/bigconsole/hooks/useGlobalFilters.js +3 -3
  79. package/dist/bigconsole/pages/AdminPage.js +130 -130
  80. package/dist/bigconsole/pages/DashboardBuilderPage.d.ts.map +1 -1
  81. package/dist/bigconsole/pages/DashboardBuilderPage.js +72 -60
  82. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  83. package/dist/bigconsole/pages/DashboardViewPage.js +1 -1
  84. package/dist/bigconsole/pages/DataSinkAlertsPage.d.ts.map +1 -1
  85. package/dist/bigconsole/pages/DataSinkAlertsPage.js +30 -23
  86. package/dist/bigconsole/pages/DataSinkAlertsPage.js.map +1 -1
  87. package/dist/bigconsole/pages/DataSinkBuilderPage.d.ts.map +1 -1
  88. package/dist/bigconsole/pages/DataSinkBuilderPage.js +272 -263
  89. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  90. package/dist/bigconsole/pages/DataSinkViewPage.js +1 -1
  91. package/dist/bigconsole/pages/DataSinksPage.js +1 -1
  92. package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
  93. package/dist/bigconsole/pages/InsightsPage.js +181 -181
  94. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  95. package/dist/bigconsole/pages/OverviewPage.js +47 -47
  96. package/dist/bigconsole/pages/OverviewPage.js.map +1 -1
  97. package/dist/bigconsole/pages/ParserBuilderPage.d.ts.map +1 -1
  98. package/dist/bigconsole/pages/ParserBuilderPage.js +227 -211
  99. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  100. package/dist/bigconsole/pages/ParserViewPage.js +97 -97
  101. package/dist/bigconsole/pages/PipelineBuilderPage.d.ts.map +1 -1
  102. package/dist/bigconsole/pages/PipelineBuilderPage.js +256 -214
  103. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  104. package/dist/bigconsole/pages/PipelineViewPage.js +146 -146
  105. package/dist/bigconsole/pages/PipelinesPage.js +88 -88
  106. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  107. package/dist/bigconsole/pages/SettingsPage.d.ts.map +1 -1
  108. package/dist/bigconsole/pages/SettingsPage.js +179 -173
  109. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  110. package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
  111. package/dist/bigconsole/pages/WorkflowViewPage.js +1 -1
  112. package/dist/bigconsole/pages/WorkflowsPage.js +141 -141
  113. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  114. package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +12 -12
  115. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +34 -34
  116. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +79 -79
  117. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
  118. package/dist/bigconsole/store/widgetStore.d.ts +12 -0
  119. package/dist/bigconsole/store/widgetStore.d.ts.map +1 -1
  120. package/dist/bigconsole/store/widgetStore.js +3 -1
  121. package/dist/bigconsole/store/widgetStore.js.map +1 -1
  122. package/dist/bigconsole/utils/formDirty.d.ts +83 -0
  123. package/dist/bigconsole/utils/formDirty.d.ts.map +1 -0
  124. package/dist/bigconsole/utils/formDirty.js +23 -0
  125. package/dist/bigconsole/utils/formDirty.js.map +1 -0
  126. package/dist/bigconsole/utils/layoutBaseline.d.ts +131 -0
  127. package/dist/bigconsole/utils/layoutBaseline.d.ts.map +1 -0
  128. package/dist/bigconsole/utils/layoutBaseline.js +98 -0
  129. package/dist/bigconsole/utils/layoutBaseline.js.map +1 -0
  130. package/dist/translations/en.d.ts.map +1 -1
  131. package/package.json +1 -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,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"}
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":"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"}
@@ -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 { jsx as f, jsxs as p } from "react/jsx-runtime";
11
- import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
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";
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__ */ f("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__ */ p("svg", {
14
14
  className: e,
15
15
  fill: "none",
16
16
  stroke: "currentColor",
17
17
  viewBox: "0 0 24 24",
18
- children: /* @__PURE__ */ f("path", {
18
+ children: /* @__PURE__ */ p("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__ */ p("svg", {
24
+ }), y = ({ className: e }) => /* @__PURE__ */ m("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__ */ f("path", {
30
+ /* @__PURE__ */ p("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__ */ f("path", {
36
+ /* @__PURE__ */ p("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__ */ f("path", {
42
+ /* @__PURE__ */ p("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 } = m();
51
- return /* @__PURE__ */ f("button", {
50
+ let { t: s } = f();
51
+ return /* @__PURE__ */ p("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__ */ p("div", {
63
+ children: /* @__PURE__ */ m("div", {
64
64
  className: "flex items-start justify-between gap-2",
65
- children: [/* @__PURE__ */ p("div", {
65
+ children: [/* @__PURE__ */ m("div", {
66
66
  className: "flex-1 min-w-0",
67
67
  children: [
68
- /* @__PURE__ */ p("div", {
68
+ /* @__PURE__ */ m("div", {
69
69
  className: "flex items-center gap-2 mb-1",
70
70
  children: [
71
- /* @__PURE__ */ f(r, {
71
+ /* @__PURE__ */ p(r, {
72
72
  type: e.type,
73
73
  size: "sm"
74
74
  }),
75
- /* @__PURE__ */ f("span", {
75
+ /* @__PURE__ */ p("span", {
76
76
  className: "text-sm font-medium text-text-primary truncate",
77
77
  children: e.name
78
78
  }),
79
- o && /* @__PURE__ */ p("span", {
79
+ o && /* @__PURE__ */ m("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__ */ f(y, { className: "w-3 h-3" }), s("bigconsole.parsers.selector.globalBadge", "Global")]
81
+ children: [/* @__PURE__ */ p(y, { className: "w-3 h-3" }), s("bigconsole.parsers.selector.globalBadge", "Global")]
82
82
  })
83
83
  ]
84
84
  }),
85
- e.description && /* @__PURE__ */ f("p", {
85
+ e.description && /* @__PURE__ */ p("p", {
86
86
  className: "text-xs text-text-secondary line-clamp-1 mb-1",
87
87
  children: e.description
88
88
  }),
89
- /* @__PURE__ */ f("div", {
89
+ /* @__PURE__ */ p("div", {
90
90
  className: "flex min-w-0 items-center gap-2 text-xs text-text-muted",
91
- children: /* @__PURE__ */ p("span", {
91
+ children: /* @__PURE__ */ m("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__ */ f("div", {
101
+ }), /* @__PURE__ */ p("div", {
102
102
  className: "shrink-0",
103
- children: /* @__PURE__ */ f(i, {
103
+ children: /* @__PURE__ */ p(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, resolvedParser: y, onChange: x, filterType: S, filterStatus: C = "active", filterInputSinkKey: w, placeholder: T, disabled: E = !1, error: D = !1, errorMessage: O }) {
112
- let { t: k } = m(), [A, j] = u(!1), [M, N] = u(""), P = T ?? k("bigconsole.parsers.selector.placeholder", "Select a parser..."), F = e(), I = i === h, { parsers: L, loading: R, fetchParsers: z } = n({
112
+ let { t: k } = f(), [A, j] = u(!1), [M, N] = u(""), P = T ?? k("bigconsole.parsers.selector.placeholder", "Select a parser..."), F = e(), I = i === h, { parsers: L, loading: R, fetchParsers: z } = n({
113
113
  consoleId: i,
114
114
  skipFetch: I
115
115
  }), { parsers: B, loading: V, fetchParsers: H } = 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
  I
190
190
  ]);
191
- return /* @__PURE__ */ p("div", {
191
+ return /* @__PURE__ */ m("div", {
192
192
  className: "relative",
193
193
  children: [
194
- /* @__PURE__ */ p("button", {
194
+ /* @__PURE__ */ m("button", {
195
195
  type: "button",
196
196
  onClick: X,
197
197
  disabled: E,
@@ -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
  ${D ? "border-status-error-border" : "border-[var(--color-border-default)]"}
211
211
  ${A ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
212
212
  `,
213
- children: [/* @__PURE__ */ f("div", {
213
+ children: [/* @__PURE__ */ p("div", {
214
214
  className: "flex-1 min-w-0",
215
- children: J ? /* @__PURE__ */ p("div", {
215
+ children: J ? /* @__PURE__ */ m("div", {
216
216
  className: "flex min-w-0 items-center gap-2",
217
- children: [/* @__PURE__ */ f(r, {
217
+ children: [/* @__PURE__ */ p(r, {
218
218
  type: J.type,
219
219
  size: "sm"
220
- }), /* @__PURE__ */ f("span", {
220
+ }), /* @__PURE__ */ p("span", {
221
221
  className: "text-sm text-text-primary truncate",
222
222
  children: J.name
223
223
  })]
224
- }) : /* @__PURE__ */ f("span", {
224
+ }) : /* @__PURE__ */ p("span", {
225
225
  className: "text-sm text-text-muted",
226
226
  children: P
227
227
  })
228
- }), /* @__PURE__ */ f(v, {
228
+ }), /* @__PURE__ */ p(v, {
229
229
  "aria-hidden": "true",
230
230
  className: `w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${A ? "transform rotate-180" : ""}`
231
231
  })]
232
232
  }),
233
- D && O && /* @__PURE__ */ f("p", {
233
+ D && O && /* @__PURE__ */ p("p", {
234
234
  className: "mt-1 text-xs text-status-error-text",
235
235
  children: O
236
236
  }),
237
- A && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
237
+ A && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
238
238
  className: "fixed inset-0 z-10",
239
239
  onClick: Z
240
- }), /* @__PURE__ */ p("div", {
240
+ }), /* @__PURE__ */ m("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__ */ f("div", {
243
+ /* @__PURE__ */ p("div", {
244
244
  className: "p-2 border-b border-[var(--color-border-default)]",
245
- children: /* @__PURE__ */ f("input", {
245
+ children: /* @__PURE__ */ p("input", {
246
246
  type: "text",
247
247
  "aria-label": k("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
248
248
  placeholder: k("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__ */ f("div", {
254
+ /* @__PURE__ */ p("div", {
255
255
  className: "overflow-y-auto flex-1",
256
- children: W ? /* @__PURE__ */ f("div", {
256
+ children: W ? /* @__PURE__ */ p("div", {
257
257
  className: "p-4 text-center text-sm text-text-secondary",
258
258
  children: k("bigconsole.parsers.selector.loading", "Loading parsers...")
259
- }) : G.length === 0 ? /* @__PURE__ */ f("div", {
259
+ }) : G.length === 0 ? /* @__PURE__ */ p("div", {
260
260
  className: "p-4 text-center text-sm text-text-secondary",
261
261
  children: k("bigconsole.parsers.selector.empty", "No parsers found")
262
- }) : /* @__PURE__ */ p(a, { children: [
263
- /* @__PURE__ */ f("button", {
262
+ }) : /* @__PURE__ */ m(a, { children: [
263
+ /* @__PURE__ */ p("button", {
264
264
  type: "button",
265
265
  onClick: () => Y(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__ */ f("span", {
274
+ children: /* @__PURE__ */ p("span", {
275
275
  className: "italic",
276
276
  children: k("bigconsole.parsers.selector.none", "None")
277
277
  })
278
278
  }),
279
- K.length > 0 && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
279
+ K.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
280
280
  className: g,
281
- children: /* @__PURE__ */ f("span", {
281
+ children: /* @__PURE__ */ p("span", {
282
282
  className: _,
283
283
  children: k("bigconsole.parsers.selector.dashboardParsers", "Dashboard Parsers")
284
284
  })
285
- }), K.map((e) => /* @__PURE__ */ f(b, {
285
+ }), K.map((e) => /* @__PURE__ */ p(b, {
286
286
  parser: e,
287
287
  isSelected: o === e.id,
288
288
  onSelect: Y
289
289
  }, e.id))] }),
290
- q.length > 0 && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
290
+ q.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
291
291
  className: g,
292
- children: /* @__PURE__ */ f("span", {
292
+ children: /* @__PURE__ */ p("span", {
293
293
  className: _,
294
294
  children: k("bigconsole.parsers.selector.globalParsers", "Global Parsers")
295
295
  })
296
- }), q.map((e) => /* @__PURE__ */ f(b, {
296
+ }), q.map((e) => /* @__PURE__ */ p(b, {
297
297
  parser: e,
298
298
  isSelected: o === e.id,
299
299
  onSelect: Y,
@@ -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__ */ f("div", {
304
+ /* @__PURE__ */ p("div", {
305
305
  className: "p-2 border-t border-border-default",
306
- children: /* @__PURE__ */ p("button", {
306
+ children: /* @__PURE__ */ m("button", {
307
307
  type: "button",
308
308
  onClick: Q,
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__ */ f(d, { className: "w-4 h-4" }), k("bigconsole.parsers.selector.createNew", "Create new parser")]
310
+ children: [/* @__PURE__ */ p(d, { className: "w-4 h-4" }), k("bigconsole.parsers.selector.createNew", "Create new parser")]
311
311
  })
312
312
  })
313
313
  ]
@@ -4,41 +4,41 @@ import t from "../../hooks/useDashboardOperations.js";
4
4
  import { BIGCONSOLE_PERMISSIONS as n } from "../../../constants/permissions.js";
5
5
  import { useId as r } from "react";
6
6
  import { usePermissions as i } from "@burdenoff/fe-libs/shared/providers/shell";
7
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
8
- import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
9
9
  //#region src/bigconsole/components/pipeline/PipelineScopePicker.tsx
10
10
  function c({ value: c, onChange: l, disabled: u = !1 }) {
11
- let d = r(), { t: f } = s(), { hasPermission: p, isLoading: m } = i(), { dashboards: h, loading: g, error: _ } = t({ skipFetch: m || !p(n.DASHBOARD_READ) });
12
- return /* @__PURE__ */ o("div", {
11
+ let d = r(), { t: f } = a(), { hasPermission: p, isLoading: m } = i(), { dashboards: h, loading: g, error: _ } = t({ skipFetch: m || !p(n.DASHBOARD_READ) });
12
+ return /* @__PURE__ */ s("div", {
13
13
  className: "min-w-0",
14
14
  children: [
15
- /* @__PURE__ */ a("label", {
15
+ /* @__PURE__ */ o("label", {
16
16
  htmlFor: d,
17
17
  className: "mb-1 block text-sm font-medium text-text-primary",
18
18
  children: f("bigconsole.pipelines.scope.label", "Dashboard scope")
19
19
  }),
20
- /* @__PURE__ */ o("select", {
20
+ /* @__PURE__ */ s("select", {
21
21
  id: d,
22
22
  value: c,
23
23
  onChange: (e) => l(e.target.value),
24
24
  disabled: u || g,
25
25
  className: `w-full min-w-0 rounded-input border border-[var(--color-border-subtle)] bg-bg-canvas px-3 py-2 text-sm text-text-primary ${e}`,
26
26
  children: [
27
- /* @__PURE__ */ a("option", {
27
+ /* @__PURE__ */ o("option", {
28
28
  value: "default",
29
29
  children: f("bigconsole.pipelines.scope.workspace", "Workspace pipelines")
30
30
  }),
31
- c !== "default" && !h.some((e) => e.id === c) && /* @__PURE__ */ a("option", {
31
+ c !== "default" && !h.some((e) => e.id === c) && /* @__PURE__ */ o("option", {
32
32
  value: c,
33
33
  children: c
34
34
  }),
35
- h.map((e) => /* @__PURE__ */ a("option", {
35
+ h.map((e) => /* @__PURE__ */ o("option", {
36
36
  value: e.id,
37
37
  children: e.name
38
38
  }, e.id))
39
39
  ]
40
40
  }),
41
- _ && /* @__PURE__ */ a("p", {
41
+ _ && /* @__PURE__ */ o("p", {
42
42
  role: "alert",
43
43
  className: "mt-1 text-xs text-status-error-text",
44
44
  children: f("bigconsole.pipelines.scope.loadError", "Dashboard scopes could not be loaded.")