@burdenoff/microfe-bigconsole 2026.805.2 → 2026.805.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 (134) hide show
  1. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +109 -113
  2. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  3. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +115 -113
  4. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  5. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +71 -62
  6. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +90 -89
  8. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  9. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +56 -54
  10. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  11. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +126 -125
  12. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  13. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +151 -150
  14. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +77 -76
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +97 -96
  18. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +172 -191
  20. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  21. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  22. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  23. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +151 -154
  24. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  25. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
  26. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  27. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  28. package/dist/bigconsole/components/dashboard/WidgetPalette.js +110 -108
  29. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  30. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +102 -103
  31. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  32. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +36 -41
  33. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  34. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +38 -37
  35. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  36. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  37. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  38. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +182 -197
  39. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  40. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +166 -168
  41. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  42. package/dist/bigconsole/components/parser/DataSinkSelector.js +87 -86
  43. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  44. package/dist/bigconsole/components/parser/ImportParserDialog.js +196 -211
  45. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  46. package/dist/bigconsole/components/parser/ParserSelector.js +130 -128
  47. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  48. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +66 -63
  49. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  50. package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -91
  51. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  52. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +222 -215
  53. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  54. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +149 -145
  55. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  56. package/dist/bigconsole/components/widgets/PropertiesPanel.js +504 -470
  57. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  58. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +44 -47
  59. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  60. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +143 -142
  61. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  62. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +101 -88
  63. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  64. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +135 -134
  65. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  66. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  67. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  68. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +69 -68
  69. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  70. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +64 -72
  71. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  72. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +60 -59
  73. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  74. package/dist/bigconsole/components/widgets/list/ListConfig.js +57 -56
  75. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  76. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +70 -69
  77. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  78. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  79. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  80. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  81. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  82. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +178 -177
  83. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  84. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +76 -75
  85. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  86. package/dist/bigconsole/components/widgets/table/TableConfig.js +183 -168
  87. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  88. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +187 -180
  89. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  90. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +40 -38
  91. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  92. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +150 -148
  93. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  94. package/dist/bigconsole/pages/DashboardBuilderPage.js +181 -176
  95. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  96. package/dist/bigconsole/pages/DashboardViewPage.js +196 -192
  97. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  98. package/dist/bigconsole/pages/DashboardsPage.js +223 -219
  99. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  100. package/dist/bigconsole/pages/DataParsersPage.js +167 -170
  101. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  102. package/dist/bigconsole/pages/DataSinkBuilderPage.js +204 -189
  103. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  104. package/dist/bigconsole/pages/DataSinkViewPage.js +175 -169
  105. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  106. package/dist/bigconsole/pages/DataSourcesPage.js +8 -7
  107. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  108. package/dist/bigconsole/pages/InsightsPage.js +238 -208
  109. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  110. package/dist/bigconsole/pages/ParserBuilderPage.js +464 -412
  111. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  112. package/dist/bigconsole/pages/ParserViewPage.js +92 -90
  113. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  114. package/dist/bigconsole/pages/PipelineBuilderPage.js +221 -194
  115. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  116. package/dist/bigconsole/pages/PipelineViewPage.js +181 -184
  117. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  118. package/dist/bigconsole/pages/PipelinesPage.js +128 -127
  119. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  120. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  121. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  122. package/dist/bigconsole/pages/WidgetDemoPage.js +121 -83
  123. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  124. package/dist/bigconsole/pages/WorkflowViewPage.js +199 -193
  125. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  126. package/dist/bigconsole/pages/WorkflowsPage.js +129 -128
  127. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  128. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  129. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  130. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  131. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  132. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  133. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  134. package/package.json +2 -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 Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\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 { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { Upload, FileJson, Check, XCircle, ArrowLeft, RefreshCw, Info } from 'lucide-react';\nimport { useImportParser, type ImportParserOptions } from '../../hooks';\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 [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('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('Failed to read file');\n };\n reader.readAsText(file);\n },\n [validateImport]\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 <Dialog open={isOpen} onOpenChange={(open) => !open && canClose && onClose()}>\n <DialogContent className=\"sm:max-w-lg max-h-[85vh] flex flex-col\">\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Upload className=\"size-5 text-primary\" />\n </div>\n <DialogTitle>Import Parser</DialogTitle>\n </div>\n <DialogDescription>Upload a Parser export file to restore it into this workspace.</DialogDescription>\n </DialogHeader>\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=\"border-2 border-dashed rounded-lg p-8 text-center hover:border-primary transition-colors\"\n >\n <FileJson className=\"size-12 mx-auto text-text-secondary mb-4\" />\n <p className=\"text-sm mb-2\">Drag and drop a parser export file here</p>\n <p className=\"text-xs text-text-secondary mb-4\">or</p>\n <input ref={fileInputRef} type=\"file\" accept=\".json\" onChange={handleFileSelect} className=\"hidden\" />\n <Button onClick={() => fileInputRef.current?.click()} disabled={loading}>\n Browse Files\n </Button>\n <p className=\"text-xs text-text-secondary mt-4\">\n Only .json files exported from BigConsole are supported\n </p>\n </div>\n )}\n\n {/* Step 2: Preview & Options */}\n {(step === 'preview' || step === 'importing') && validationResult && (\n <>\n {/* Parser Info */}\n {validationResult.parserInfo && (\n <Card>\n <CardContent className=\"p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Parser</span>\n <span className=\"text-sm font-medium\">{validationResult.parserInfo.name}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Type</span>\n <Badge variant=\"secondary\">{validationResult.parserInfo.type}</Badge>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Input Sink</span>\n <span className=\"text-xs font-mono\">{validationResult.parserInfo.inputSinkKey}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Output Key</span>\n <span className=\"text-xs font-mono\">{validationResult.parserInfo.outputKey}</span>\n </div>\n {validationResult.parserInfo.exportedFrom && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Source ID</span>\n <span className=\"text-xs text-text-secondary font-mono truncate max-w-[180px]\">\n {validationResult.parserInfo.exportedFrom}\n </span>\n </div>\n )}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Schema Version</span>\n <span className=\"text-xs text-text-secondary\">{validationResult.parserInfo.schemaVersion}</span>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Validation Errors */}\n {validationResult.errors.length > 0 && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <XCircle className=\"size-4 text-status-error-text\" />\n <span className=\"text-sm font-medium text-status-error-text\">\n Errors ({validationResult.errors.length})\n </span>\n </div>\n <ul className=\"text-xs text-status-error-text space-y-1\">\n {validationResult.errors.map((err, idx) => (\n <li key={idx}>\n <span className=\"font-mono\">[{err.code}]</span> {err.message}\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )}\n\n {/* Import Options */}\n {validationResult.isValid && (\n <div className=\"space-y-4\">\n <p className=\"text-sm font-medium\">Import Options</p>\n\n {/* Import Info */}\n <Card className=\"border-blue-500/50 bg-blue-500/5\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-start gap-2\">\n <Info className=\"size-4 text-blue-600 mt-0.5 shrink-0\" />\n <div className=\"text-xs text-blue-700 dark:text-blue-400\">\n {parserId ? (\n <>\n <p className=\"font-medium mb-1\">Import will check for existing parser</p>\n <p>\n If the original parser (ID:{' '}\n <code className=\"font-mono bg-blue-200/50 px-1 rounded\">{parserId.slice(0, 8)}...</code>\n ) exists:\n </p>\n <ul className=\"list-disc list-inside mt-1 space-y-0.5\">\n <li>With changes → Update the existing parser</li>\n <li>No changes → Show &quot;already exists&quot; message</li>\n </ul>\n <p className=\"mt-1\">If original doesn&apos;t exist → Create a new parser</p>\n </>\n ) : (\n <>\n <p className=\"font-medium mb-1\">A new parser will be created</p>\n <p>Import as a new parser with the specified configuration.</p>\n </>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-name\">Parser Name</Label>\n <Input\n id=\"import-name\"\n type=\"text\"\n value={nameOverride}\n onChange={(e) => setNameOverride(e.target.value)}\n placeholder={validationResult.parserInfo?.name || 'Parser name'}\n disabled={step === 'importing'}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-input-sink\">Input Sink Key</Label>\n <Input\n id=\"import-input-sink\"\n type=\"text\"\n value={inputSinkKeyOverride}\n onChange={(e) => setInputSinkKeyOverride(e.target.value)}\n placeholder={validationResult.parserInfo?.inputSinkKey || 'Input sink key'}\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">The DataSink key to read input data from.</p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-output-key\">Output Key</Label>\n <Input\n id=\"import-output-key\"\n type=\"text\"\n value={outputKeyOverride}\n onChange={(e) => setOutputKeyOverride(e.target.value)}\n placeholder={validationResult.parserInfo?.outputKey || 'Output key'}\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">The key to store parsed output data under.</p>\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Step 3: Complete */}\n {step === 'complete' && importResult?.success && (\n <div className=\"text-center py-6\">\n {/* Already Exists - No Changes */}\n {importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center\">\n <Info className=\"size-8 text-blue-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">Parser Already Exists</h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n Parser &quot;{importResult.parser?.name}&quot; already exists with the same data. No changes were\n made.\n </p>\n </>\n )}\n\n {/* Updated Existing */}\n {importResult.originalUpdated && !importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <RefreshCw className=\"size-8 text-green-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">Parser Updated!</h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n Parser &quot;{importResult.parser?.name}&quot; has been updated with the imported data.\n </p>\n </>\n )}\n\n {/* Created New */}\n {!importResult.originalUpdated && !importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <Check className=\"size-8 text-green-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">Import Successful!</h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n Parser &quot;{importResult.parser?.name}&quot; has been created.\n </p>\n </>\n )}\n </div>\n )}\n\n {/* Error */}\n {error && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <p className=\"text-sm text-status-error-text\">{error.message}</p>\n </CardContent>\n </Card>\n )}\n\n {importResult && !importResult.success && importResult.errorMessage && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <p className=\"text-sm text-status-error-text\">{importResult.errorMessage}</p>\n </CardContent>\n </Card>\n )}\n </div>\n\n <DialogFooter className=\"flex-row justify-between 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 Back\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {step !== 'complete' && (\n <Button variant=\"outline\" onClick={onClose} disabled={!canClose}>\n Cancel\n </Button>\n )}\n\n {step === 'preview' && validationResult?.isValid && (\n <Button onClick={handleImport} disabled={loading}>\n <Upload className=\"size-4\" />\n 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 Importing...\n </div>\n )}\n\n {step === 'complete' && <Button onClick={onClose}>Done</Button>}\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default ImportParserDialog;\n"],"mappings":"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"}
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 Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\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 { Card, CardContent } 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 { useImportParser, type ImportParserOptions } from '../../hooks';\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 <Dialog open={isOpen} onOpenChange={(open) => !open && canClose && onClose()}>\n <DialogContent className=\"sm:max-w-lg max-h-[85vh] flex flex-col\">\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Upload className=\"size-5 text-primary\" />\n </div>\n <DialogTitle>{t('bigconsole.parsers.import.title', 'Import Parser')}</DialogTitle>\n </div>\n <DialogDescription>\n {t(\n 'bigconsole.parsers.import.description',\n 'Upload a Parser export file to restore it into this workspace.'\n )}\n </DialogDescription>\n </DialogHeader>\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=\"border-2 border-dashed rounded-lg p-8 text-center hover:border-primary transition-colors\"\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 */}\n {validationResult.parserInfo && (\n <Card>\n <CardContent className=\"p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldParser', 'Parser')}\n </span>\n <span className=\"text-sm font-medium\">{validationResult.parserInfo.name}</span>\n </div>\n <div className=\"flex items-center justify-between\">\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=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldInputSink', 'Input Sink')}\n </span>\n <span className=\"text-xs font-mono\">{validationResult.parserInfo.inputSinkKey}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldOutputKey', 'Output Key')}\n </span>\n <span className=\"text-xs font-mono\">{validationResult.parserInfo.outputKey}</span>\n </div>\n {validationResult.parserInfo.exportedFrom && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldSourceId', 'Source ID')}\n </span>\n <span className=\"text-xs text-text-secondary font-mono truncate max-w-[180px]\">\n {validationResult.parserInfo.exportedFrom}\n </span>\n </div>\n )}\n <div className=\"flex items-center justify-between\">\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 </CardContent>\n </Card>\n )}\n\n {/* Validation Errors */}\n {validationResult.errors.length > 0 && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <XCircle className=\"size-4 text-status-error-text\" />\n <span className=\"text-sm font-medium text-status-error-text\">\n {t('bigconsole.parsers.import.errorsCount', 'Errors ({{count}})', {\n count: validationResult.errors.length,\n })}\n </span>\n </div>\n <ul className=\"text-xs text-status-error-text space-y-1\">\n {validationResult.errors.map((err, idx) => (\n <li key={idx}>\n <span className=\"font-mono\">[{err.code}]</span> {err.message}\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )}\n\n {/* Import Options */}\n {validationResult.isValid && (\n <div className=\"space-y-4\">\n <p className=\"text-sm font-medium\">\n {t('bigconsole.parsers.import.optionsHeading', 'Import Options')}\n </p>\n\n {/* Import Info */}\n <Card className=\"border-blue-500/50 bg-blue-500/5\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-start gap-2\">\n <Info className=\"size-4 text-blue-600 mt-0.5 shrink-0\" />\n <div className=\"text-xs text-blue-700 dark:text-blue-400\">\n {parserId ? (\n <>\n <p className=\"font-medium mb-1\">\n {t(\n 'bigconsole.parsers.import.checkExistingTitle',\n 'Import will check for existing parser'\n )}\n </p>\n <p>\n {t('bigconsole.parsers.import.ifOriginalExistsPrefix', 'If the original parser (ID:')}{' '}\n <code className=\"font-mono bg-blue-200/50 px-1 rounded\">{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(\n 'bigconsole.parsers.import.withChanges',\n 'With changes → Update the existing parser'\n )}\n </li>\n <li>\n {t(\n 'bigconsole.parsers.import.noChanges',\n 'No changes → Show \"already exists\" message'\n )}\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 <>\n <p className=\"font-medium mb-1\">\n {t('bigconsole.parsers.import.newParserTitle', 'A new parser will be created')}\n </p>\n <p>\n {t(\n 'bigconsole.parsers.import.newParserBody',\n 'Import as a new parser with the specified configuration.'\n )}\n </p>\n </>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\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 </div>\n )}\n </>\n )}\n\n {/* Step 3: Complete */}\n {step === 'complete' && importResult?.success && (\n <div className=\"text-center py-6\">\n {/* Already Exists - No Changes */}\n {importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center\">\n <Info className=\"size-8 text-blue-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">\n {t('bigconsole.parsers.import.alreadyExistsTitle', 'Parser Already Exists')}\n </h3>\n <p className=\"text-sm text-text-secondary mb-4\">\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 </p>\n </>\n )}\n\n {/* Updated Existing */}\n {importResult.originalUpdated && !importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <RefreshCw className=\"size-8 text-green-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">\n {t('bigconsole.parsers.import.updatedTitle', 'Parser Updated!')}\n </h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n {t(\n 'bigconsole.parsers.import.updatedBody',\n 'Parser \"{{name}}\" has been updated with the imported data.',\n { name: importResult.parser?.name ?? '' }\n )}\n </p>\n </>\n )}\n\n {/* Created New */}\n {!importResult.originalUpdated && !importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <Check className=\"size-8 text-green-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">\n {t('bigconsole.parsers.import.createdTitle', 'Import Successful!')}\n </h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n {t('bigconsole.parsers.import.createdBody', 'Parser \"{{name}}\" has been created.', {\n name: importResult.parser?.name ?? '',\n })}\n </p>\n </>\n )}\n </div>\n )}\n\n {/* Error */}\n {error && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <p className=\"text-sm text-status-error-text\">{error.message}</p>\n </CardContent>\n </Card>\n )}\n\n {importResult && !importResult.success && importResult.errorMessage && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <p className=\"text-sm text-status-error-text\">{importResult.errorMessage}</p>\n </CardContent>\n </Card>\n )}\n </div>\n\n <DialogFooter className=\"flex-row justify-between 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 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 </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default ImportParserDialog;\n"],"mappings":"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"}
@@ -5,46 +5,48 @@ import n from "./ParserTypeBadge.js";
5
5
  import r from "./ParserStatusBadge.js";
6
6
  import { Fragment as i, memo as a, useCallback as o, useEffect as s, useMemo as c, useState as l } from "react";
7
7
  import { Plus as u } from "lucide-react";
8
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
+ import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
9
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
10
  //#region src/bigconsole/components/parser/ParserSelector.tsx
10
- var p = "default", m = ({ className: e }) => /* @__PURE__ */ d("svg", {
11
+ var m = "default", h = ({ className: e }) => /* @__PURE__ */ f("svg", {
11
12
  className: e,
12
13
  fill: "none",
13
14
  stroke: "currentColor",
14
15
  viewBox: "0 0 24 24",
15
- children: /* @__PURE__ */ d("path", {
16
+ children: /* @__PURE__ */ f("path", {
16
17
  strokeLinecap: "round",
17
18
  strokeLinejoin: "round",
18
19
  strokeWidth: 2,
19
20
  d: "M19 9l-7 7-7-7"
20
21
  })
21
- }), h = ({ className: e }) => /* @__PURE__ */ f("svg", {
22
+ }), g = ({ className: e }) => /* @__PURE__ */ p("svg", {
22
23
  className: e,
23
24
  fill: "none",
24
25
  stroke: "currentColor",
25
26
  viewBox: "0 0 24 24",
26
27
  children: [
27
- /* @__PURE__ */ d("path", {
28
+ /* @__PURE__ */ f("path", {
28
29
  strokeLinecap: "round",
29
30
  strokeLinejoin: "round",
30
31
  strokeWidth: 2,
31
32
  d: "M12 21a9 9 0 100-18 9 9 0 000 18z"
32
33
  }),
33
- /* @__PURE__ */ d("path", {
34
+ /* @__PURE__ */ f("path", {
34
35
  strokeLinecap: "round",
35
36
  strokeLinejoin: "round",
36
37
  strokeWidth: 2,
37
38
  d: "M3.6 9h16.8M3.6 15h16.8"
38
39
  }),
39
- /* @__PURE__ */ d("path", {
40
+ /* @__PURE__ */ f("path", {
40
41
  strokeLinecap: "round",
41
42
  strokeLinejoin: "round",
42
43
  strokeWidth: 2,
43
44
  d: "M12 3a15 15 0 014 9 15 15 0 01-4 9 15 15 0 01-4-9 15 15 0 014-9z"
44
45
  })
45
46
  ]
46
- }), g = a(function({ parser: e, isSelected: t, onSelect: i, isGlobal: a = !1 }) {
47
- return /* @__PURE__ */ d("button", {
47
+ }), _ = a(function({ parser: e, isSelected: t, onSelect: i, isGlobal: a = !1 }) {
48
+ let { t: o } = d();
49
+ return /* @__PURE__ */ f("button", {
48
50
  type: "button",
49
51
  onClick: () => i(e.id),
50
52
  className: `
@@ -55,135 +57,135 @@ var p = "default", m = ({ className: e }) => /* @__PURE__ */ d("svg", {
55
57
  border-b border-border-default last:border-b-0
56
58
  ${t ? "bg-action-primary-bg/10" : ""}
57
59
  `,
58
- children: /* @__PURE__ */ f("div", {
60
+ children: /* @__PURE__ */ p("div", {
59
61
  className: "flex items-start justify-between gap-2",
60
- children: [/* @__PURE__ */ f("div", {
62
+ children: [/* @__PURE__ */ p("div", {
61
63
  className: "flex-1 min-w-0",
62
64
  children: [
63
- /* @__PURE__ */ f("div", {
65
+ /* @__PURE__ */ p("div", {
64
66
  className: "flex items-center gap-2 mb-1",
65
67
  children: [
66
- /* @__PURE__ */ d(n, {
68
+ /* @__PURE__ */ f(n, {
67
69
  type: e.type,
68
70
  size: "sm"
69
71
  }),
70
- /* @__PURE__ */ d("span", {
72
+ /* @__PURE__ */ f("span", {
71
73
  className: "text-sm font-medium text-text-primary truncate",
72
74
  children: e.name
73
75
  }),
74
- a && /* @__PURE__ */ f("span", {
76
+ a && /* @__PURE__ */ p("span", {
75
77
  className: "inline-flex items-center gap-1 px-1.5 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded",
76
- children: [/* @__PURE__ */ d(h, { className: "w-3 h-3" }), "Global"]
78
+ children: [/* @__PURE__ */ f(g, { className: "w-3 h-3" }), o("bigconsole.parsers.selector.globalBadge", "Global")]
77
79
  })
78
80
  ]
79
81
  }),
80
- e.description && /* @__PURE__ */ d("p", {
82
+ e.description && /* @__PURE__ */ f("p", {
81
83
  className: "text-xs text-text-secondary line-clamp-1 mb-1",
82
84
  children: e.description
83
85
  }),
84
- /* @__PURE__ */ d("div", {
86
+ /* @__PURE__ */ f("div", {
85
87
  className: "flex items-center gap-2 text-xs text-text-tertiary",
86
- children: /* @__PURE__ */ f("span", { children: [
88
+ children: /* @__PURE__ */ p("span", { children: [
87
89
  e.inputSinkKey,
88
90
  " → ",
89
91
  e.outputKey
90
92
  ] })
91
93
  })
92
94
  ]
93
- }), /* @__PURE__ */ d("div", { children: /* @__PURE__ */ d(r, {
95
+ }), /* @__PURE__ */ f("div", { children: /* @__PURE__ */ f(r, {
94
96
  status: e.status,
95
97
  size: "sm",
96
98
  showIcon: !1
97
99
  }) })]
98
100
  })
99
101
  });
100
- }), _ = a(function({ consoleId: r, value: a, onChange: h, filterType: _, filterStatus: v = "active", filterInputSinkKey: y, placeholder: b = "Select a parser...", disabled: x = !1, error: S = !1, errorMessage: C }) {
101
- let [w, T] = l(!1), [E, D] = l(""), O = e(), k = r === p, { parsers: A, loading: j, fetchParsers: M } = t({
102
+ }), v = a(function({ consoleId: r, value: a, onChange: g, filterType: v, filterStatus: y = "active", filterInputSinkKey: b, placeholder: x, disabled: S = !1, error: C = !1, errorMessage: w }) {
103
+ let { t: T } = d(), [E, D] = l(!1), [O, k] = l(""), A = x ?? T("bigconsole.parsers.selector.placeholder", "Select a parser..."), j = e(), M = r === m, { parsers: N, loading: P, fetchParsers: F } = t({
102
104
  consoleId: r,
103
- skipFetch: k
104
- }), { parsers: N, loading: P, fetchParsers: F } = t({
105
- consoleId: p,
106
- skipFetch: k
107
- }), I = c(() => {
108
- if (k) return A;
109
- let e = new Set(A.map((e) => e.id)), t = N.filter((t) => !e.has(t.id));
110
- return [...A, ...t];
105
+ skipFetch: M
106
+ }), { parsers: I, loading: L, fetchParsers: R } = t({
107
+ consoleId: m,
108
+ skipFetch: M
109
+ }), z = c(() => {
110
+ if (M) return N;
111
+ let e = new Set(N.map((e) => e.id)), t = I.filter((t) => !e.has(t.id));
112
+ return [...N, ...t];
111
113
  }, [
112
- A,
113
114
  N,
114
- k
115
- ]), L = j || P, R = c(() => I.filter((e) => {
116
- if (_ && e.type !== _ || v && e.status !== v || y && e.inputSinkKey !== y) return !1;
117
- if (E) {
118
- let t = E.toLowerCase();
115
+ I,
116
+ M
117
+ ]), B = P || L, V = c(() => z.filter((e) => {
118
+ if (v && e.type !== v || y && e.status !== y || b && e.inputSinkKey !== b) return !1;
119
+ if (O) {
120
+ let t = O.toLowerCase();
119
121
  return e.name.toLowerCase().includes(t) || e.description?.toLowerCase().includes(t) || e.inputSinkKey.toLowerCase().includes(t) || e.outputKey.toLowerCase().includes(t);
120
122
  }
121
123
  return !0;
122
124
  }), [
123
- I,
124
- _,
125
+ z,
125
126
  v,
126
127
  y,
127
- E
128
- ]), { dashboardScopedParsers: z, globalScopedParsers: B } = c(() => ({
129
- dashboardScopedParsers: R.filter((e) => e.consoleId !== p),
130
- globalScopedParsers: R.filter((e) => e.consoleId === p)
131
- }), [R]), V = I.find((e) => e.id === a);
128
+ b,
129
+ O
130
+ ]), { dashboardScopedParsers: H, globalScopedParsers: U } = c(() => ({
131
+ dashboardScopedParsers: V.filter((e) => e.consoleId !== m),
132
+ globalScopedParsers: V.filter((e) => e.consoleId === m)
133
+ }), [V]), W = z.find((e) => e.id === a);
132
134
  s(() => {
133
- r && (M({
134
- type: _,
135
- status: v ?? void 0
136
- }), k || F({
137
- type: _,
138
- status: v ?? void 0
135
+ r && (F({
136
+ type: v,
137
+ status: y ?? void 0
138
+ }), M || R({
139
+ type: v,
140
+ status: y ?? void 0
139
141
  }));
140
142
  }, [
141
143
  r,
142
- _,
143
144
  v,
144
145
  y,
145
- M,
146
+ b,
146
147
  F,
147
- k
148
+ R,
149
+ M
148
150
  ]);
149
- let H = o((e) => {
150
- h(e), T(!1), D("");
151
- }, [h]), U = o(() => {
152
- if (x) return;
153
- let e = !w;
154
- e && (M({
155
- type: _,
156
- status: v ?? void 0
157
- }), k || F({
158
- type: _,
159
- status: v ?? void 0
160
- })), T(e);
151
+ let G = o((e) => {
152
+ g(e), D(!1), k("");
153
+ }, [g]), K = o(() => {
154
+ if (S) return;
155
+ let e = !E;
156
+ e && (F({
157
+ type: v,
158
+ status: y ?? void 0
159
+ }), M || R({
160
+ type: v,
161
+ status: y ?? void 0
162
+ })), D(e);
161
163
  }, [
162
- x,
163
- w,
164
- M,
164
+ S,
165
+ E,
165
166
  F,
166
- _,
167
+ R,
167
168
  v,
168
- k
169
- ]), W = o(() => {
170
- T(!1);
171
- }, []), G = o(() => {
172
- T(!1);
173
- let e = k ? "/parsers/new" : `/dashboards/${r}/parsers/new`;
174
- window.open(O(e), "_blank", "noopener,noreferrer");
169
+ y,
170
+ M
171
+ ]), q = o(() => {
172
+ D(!1);
173
+ }, []), J = o(() => {
174
+ D(!1);
175
+ let e = M ? "/parsers/new" : `/dashboards/${r}/parsers/new`;
176
+ window.open(j(e), "_blank", "noopener,noreferrer");
175
177
  }, [
176
- O,
178
+ j,
177
179
  r,
178
- k
180
+ M
179
181
  ]);
180
- return /* @__PURE__ */ f("div", {
182
+ return /* @__PURE__ */ p("div", {
181
183
  className: "relative",
182
184
  children: [
183
- /* @__PURE__ */ f("button", {
185
+ /* @__PURE__ */ p("button", {
184
186
  type: "button",
185
- onClick: U,
186
- disabled: x,
187
+ onClick: K,
188
+ disabled: S,
187
189
  className: `
188
190
  w-full
189
191
  px-3 py-2
@@ -192,59 +194,59 @@ var p = "default", m = ({ className: e }) => /* @__PURE__ */ d("svg", {
192
194
  text-left
193
195
  flex items-center justify-between gap-2
194
196
  transition-colors
195
- ${x ? "opacity-50 cursor-not-allowed" : "hover:border-action-primary-bg cursor-pointer"}
196
- ${S ? "border-status-error-border" : "border-border-default"}
197
- ${w ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
197
+ ${S ? "opacity-50 cursor-not-allowed" : "hover:border-action-primary-bg cursor-pointer"}
198
+ ${C ? "border-status-error-border" : "border-border-default"}
199
+ ${E ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
198
200
  `,
199
- children: [/* @__PURE__ */ d("div", {
201
+ children: [/* @__PURE__ */ f("div", {
200
202
  className: "flex-1 min-w-0",
201
- children: V ? /* @__PURE__ */ f("div", {
203
+ children: W ? /* @__PURE__ */ p("div", {
202
204
  className: "flex items-center gap-2",
203
- children: [/* @__PURE__ */ d(n, {
204
- type: V.type,
205
+ children: [/* @__PURE__ */ f(n, {
206
+ type: W.type,
205
207
  size: "sm"
206
- }), /* @__PURE__ */ d("span", {
208
+ }), /* @__PURE__ */ f("span", {
207
209
  className: "text-sm text-text-primary truncate",
208
- children: V.name
210
+ children: W.name
209
211
  })]
210
- }) : /* @__PURE__ */ d("span", {
212
+ }) : /* @__PURE__ */ f("span", {
211
213
  className: "text-sm text-text-tertiary",
212
- children: b
214
+ children: A
213
215
  })
214
- }), /* @__PURE__ */ d(m, { className: `w-4 h-4 text-text-secondary transition-transform ${w ? "transform rotate-180" : ""}` })]
216
+ }), /* @__PURE__ */ f(h, { className: `w-4 h-4 text-text-secondary transition-transform ${E ? "transform rotate-180" : ""}` })]
215
217
  }),
216
- S && C && /* @__PURE__ */ d("p", {
218
+ C && w && /* @__PURE__ */ f("p", {
217
219
  className: "mt-1 text-xs text-status-error-text",
218
- children: C
220
+ children: w
219
221
  }),
220
- w && /* @__PURE__ */ f(i, { children: [/* @__PURE__ */ d("div", {
222
+ E && /* @__PURE__ */ p(i, { children: [/* @__PURE__ */ f("div", {
221
223
  className: "fixed inset-0 z-10",
222
- onClick: W
223
- }), /* @__PURE__ */ f("div", {
224
+ onClick: q
225
+ }), /* @__PURE__ */ p("div", {
224
226
  className: "absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-border-default rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden",
225
227
  children: [
226
- /* @__PURE__ */ d("div", {
228
+ /* @__PURE__ */ f("div", {
227
229
  className: "p-2 border-b border-border-default",
228
- children: /* @__PURE__ */ d("input", {
230
+ children: /* @__PURE__ */ f("input", {
229
231
  type: "text",
230
- placeholder: "Search parsers...",
231
- value: E,
232
- onChange: (e) => D(e.target.value),
232
+ placeholder: T("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
233
+ value: O,
234
+ onChange: (e) => k(e.target.value),
233
235
  className: "\n w-full px-3 py-2\n bg-bg-sunken\n border border-border-default\n rounded-md\n text-sm text-text-primary\n placeholder-text-tertiary\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n "
234
236
  })
235
237
  }),
236
- /* @__PURE__ */ d("div", {
238
+ /* @__PURE__ */ f("div", {
237
239
  className: "overflow-y-auto flex-1",
238
- children: L ? /* @__PURE__ */ d("div", {
240
+ children: B ? /* @__PURE__ */ f("div", {
239
241
  className: "p-4 text-center text-sm text-text-secondary",
240
- children: "Loading parsers..."
241
- }) : R.length === 0 ? /* @__PURE__ */ d("div", {
242
+ children: T("bigconsole.parsers.selector.loading", "Loading parsers...")
243
+ }) : V.length === 0 ? /* @__PURE__ */ f("div", {
242
244
  className: "p-4 text-center text-sm text-text-secondary",
243
- children: "No parsers found"
244
- }) : /* @__PURE__ */ f(i, { children: [
245
- /* @__PURE__ */ d("button", {
245
+ children: T("bigconsole.parsers.selector.empty", "No parsers found")
246
+ }) : /* @__PURE__ */ p(i, { children: [
247
+ /* @__PURE__ */ f("button", {
246
248
  type: "button",
247
- onClick: () => H(null),
249
+ onClick: () => G(null),
248
250
  className: `
249
251
  w-full px-3 py-2
250
252
  text-left text-sm
@@ -252,43 +254,43 @@ var p = "default", m = ({ className: e }) => /* @__PURE__ */ d("svg", {
252
254
  transition-colors
253
255
  ${a === null ? "bg-action-primary-bg/10 text-action-primary-bg" : "text-text-secondary"}
254
256
  `,
255
- children: /* @__PURE__ */ d("span", {
257
+ children: /* @__PURE__ */ f("span", {
256
258
  className: "italic",
257
- children: "None"
259
+ children: T("bigconsole.parsers.selector.none", "None")
258
260
  })
259
261
  }),
260
- z.length > 0 && /* @__PURE__ */ f(i, { children: [/* @__PURE__ */ d("div", {
262
+ H.length > 0 && /* @__PURE__ */ p(i, { children: [/* @__PURE__ */ f("div", {
261
263
  className: "px-3 py-1.5 bg-bg-sunken border-y border-border-default",
262
- children: /* @__PURE__ */ d("span", {
264
+ children: /* @__PURE__ */ f("span", {
263
265
  className: "text-xs font-medium text-text-secondary uppercase tracking-wide",
264
- children: "Dashboard Parsers"
266
+ children: T("bigconsole.parsers.selector.dashboardParsers", "Dashboard Parsers")
265
267
  })
266
- }), z.map((e) => /* @__PURE__ */ d(g, {
268
+ }), H.map((e) => /* @__PURE__ */ f(_, {
267
269
  parser: e,
268
270
  isSelected: a === e.id,
269
- onSelect: H
271
+ onSelect: G
270
272
  }, e.id))] }),
271
- B.length > 0 && /* @__PURE__ */ f(i, { children: [/* @__PURE__ */ d("div", {
273
+ U.length > 0 && /* @__PURE__ */ p(i, { children: [/* @__PURE__ */ f("div", {
272
274
  className: "px-3 py-1.5 bg-bg-sunken border-y border-border-default",
273
- children: /* @__PURE__ */ d("span", {
275
+ children: /* @__PURE__ */ f("span", {
274
276
  className: "text-xs font-medium text-text-secondary uppercase tracking-wide",
275
- children: "Global Parsers"
277
+ children: T("bigconsole.parsers.selector.globalParsers", "Global Parsers")
276
278
  })
277
- }), B.map((e) => /* @__PURE__ */ d(g, {
279
+ }), U.map((e) => /* @__PURE__ */ f(_, {
278
280
  parser: e,
279
281
  isSelected: a === e.id,
280
- onSelect: H,
282
+ onSelect: G,
281
283
  isGlobal: !0
282
284
  }, e.id))] })
283
285
  ] })
284
286
  }),
285
- /* @__PURE__ */ d("div", {
287
+ /* @__PURE__ */ f("div", {
286
288
  className: "p-2 border-t border-border-default",
287
- children: /* @__PURE__ */ f("button", {
289
+ children: /* @__PURE__ */ p("button", {
288
290
  type: "button",
289
- onClick: G,
291
+ onClick: J,
290
292
  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 ",
291
- children: [/* @__PURE__ */ d(u, { className: "w-4 h-4" }), "Create new parser"]
293
+ children: [/* @__PURE__ */ f(u, { className: "w-4 h-4" }), T("bigconsole.parsers.selector.createNew", "Create new parser")]
292
294
  })
293
295
  })
294
296
  ]
@@ -297,6 +299,6 @@ var p = "default", m = ({ className: e }) => /* @__PURE__ */ d("svg", {
297
299
  });
298
300
  });
299
301
  //#endregion
300
- export { _ as default };
302
+ export { v as default };
301
303
 
302
304
  //# sourceMappingURL=ParserSelector.js.map