@burdenoff/microfe-bigconsole 2026.1008.10 → 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.
- package/dist/bigconsole/BigConsoleRoutes.d.ts.map +1 -1
- package/dist/bigconsole/BigConsoleRoutes.js +136 -127
- package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
- package/dist/bigconsole/assistant/assistantProduct.d.ts.map +1 -1
- package/dist/bigconsole/assistant/assistantProduct.js +3 -1
- package/dist/bigconsole/assistant/assistantProduct.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +31 -31
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +44 -44
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +36 -36
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +59 -59
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +15 -15
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +41 -41
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +34 -34
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +110 -110
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +21 -21
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +91 -91
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -101
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/TemplateInstallOptions.js +31 -31
- package/dist/bigconsole/components/dashboard/TemplateLayoutPreview.js +15 -15
- package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +46 -46
- package/dist/bigconsole/components/datasink/AlertExecutionHistory.js +37 -37
- package/dist/bigconsole/components/datasink/AlertRuleEditor.js +66 -66
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
- package/dist/bigconsole/components/datasink/DataSinkCard.js +29 -29
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +47 -47
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +91 -91
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
- package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
- package/dist/bigconsole/components/parser/ImportParserDialog.js +120 -120
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
- package/dist/bigconsole/components/pipeline/PipelineScopePicker.js +10 -10
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +27 -27
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +30 -30
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +4 -4
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +93 -93
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.d.ts.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +280 -273
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +4 -4
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
- package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
- package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
- package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
- package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js +15 -15
- package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js +15 -15
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +9 -9
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +67 -67
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
- package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts +15 -0
- package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts.map +1 -0
- package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js +34 -0
- package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js.map +1 -0
- package/dist/bigconsole/hooks/useDrilldown.js +3 -3
- package/dist/bigconsole/hooks/useGlobalFilters.js +3 -3
- package/dist/bigconsole/pages/AdminPage.js +130 -130
- package/dist/bigconsole/pages/DashboardBuilderPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DashboardBuilderPage.js +72 -60
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +1 -1
- package/dist/bigconsole/pages/DataSinkAlertsPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DataSinkAlertsPage.js +30 -23
- package/dist/bigconsole/pages/DataSinkAlertsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +272 -263
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +1 -1
- package/dist/bigconsole/pages/DataSinksPage.js +1 -1
- package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
- package/dist/bigconsole/pages/InsightsPage.js +181 -181
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/OverviewPage.js +47 -47
- package/dist/bigconsole/pages/OverviewPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +227 -211
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +97 -97
- package/dist/bigconsole/pages/PipelineBuilderPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +256 -214
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +146 -146
- package/dist/bigconsole/pages/PipelinesPage.js +88 -88
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +179 -173
- package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
- package/dist/bigconsole/pages/WorkflowViewPage.js +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +141 -141
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +12 -12
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +34 -34
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +79 -79
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
- package/dist/bigconsole/store/widgetStore.d.ts +12 -0
- package/dist/bigconsole/store/widgetStore.d.ts.map +1 -1
- package/dist/bigconsole/store/widgetStore.js +3 -1
- package/dist/bigconsole/store/widgetStore.js.map +1 -1
- package/dist/bigconsole/utils/formDirty.d.ts +83 -0
- package/dist/bigconsole/utils/formDirty.d.ts.map +1 -0
- package/dist/bigconsole/utils/formDirty.js +23 -0
- package/dist/bigconsole/utils/formDirty.js.map +1 -0
- package/dist/bigconsole/utils/layoutBaseline.d.ts +131 -0
- package/dist/bigconsole/utils/layoutBaseline.d.ts.map +1 -0
- package/dist/bigconsole/utils/layoutBaseline.js +98 -0
- package/dist/bigconsole/utils/layoutBaseline.js.map +1 -0
- package/dist/translations/en.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -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":"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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 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 {
|
|
11
|
-
import {
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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 } =
|
|
51
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
63
|
+
children: /* @__PURE__ */ m("div", {
|
|
64
64
|
className: "flex items-start justify-between gap-2",
|
|
65
|
-
children: [/* @__PURE__ */
|
|
65
|
+
children: [/* @__PURE__ */ m("div", {
|
|
66
66
|
className: "flex-1 min-w-0",
|
|
67
67
|
children: [
|
|
68
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ m("div", {
|
|
69
69
|
className: "flex items-center gap-2 mb-1",
|
|
70
70
|
children: [
|
|
71
|
-
/* @__PURE__ */
|
|
71
|
+
/* @__PURE__ */ p(r, {
|
|
72
72
|
type: e.type,
|
|
73
73
|
size: "sm"
|
|
74
74
|
}),
|
|
75
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
89
|
+
/* @__PURE__ */ p("div", {
|
|
90
90
|
className: "flex min-w-0 items-center gap-2 text-xs text-text-muted",
|
|
91
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
101
|
+
}), /* @__PURE__ */ p("div", {
|
|
102
102
|
className: "shrink-0",
|
|
103
|
-
children: /* @__PURE__ */
|
|
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 } =
|
|
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__ */
|
|
191
|
+
return /* @__PURE__ */ m("div", {
|
|
192
192
|
className: "relative",
|
|
193
193
|
children: [
|
|
194
|
-
/* @__PURE__ */
|
|
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__ */
|
|
213
|
+
children: [/* @__PURE__ */ p("div", {
|
|
214
214
|
className: "flex-1 min-w-0",
|
|
215
|
-
children: J ? /* @__PURE__ */
|
|
215
|
+
children: J ? /* @__PURE__ */ m("div", {
|
|
216
216
|
className: "flex min-w-0 items-center gap-2",
|
|
217
|
-
children: [/* @__PURE__ */
|
|
217
|
+
children: [/* @__PURE__ */ p(r, {
|
|
218
218
|
type: J.type,
|
|
219
219
|
size: "sm"
|
|
220
|
-
}), /* @__PURE__ */
|
|
220
|
+
}), /* @__PURE__ */ p("span", {
|
|
221
221
|
className: "text-sm text-text-primary truncate",
|
|
222
222
|
children: J.name
|
|
223
223
|
})]
|
|
224
|
-
}) : /* @__PURE__ */
|
|
224
|
+
}) : /* @__PURE__ */ p("span", {
|
|
225
225
|
className: "text-sm text-text-muted",
|
|
226
226
|
children: P
|
|
227
227
|
})
|
|
228
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
237
|
+
A && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
|
|
238
238
|
className: "fixed inset-0 z-10",
|
|
239
239
|
onClick: Z
|
|
240
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
243
|
+
/* @__PURE__ */ p("div", {
|
|
244
244
|
className: "p-2 border-b border-[var(--color-border-default)]",
|
|
245
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
254
|
+
/* @__PURE__ */ p("div", {
|
|
255
255
|
className: "overflow-y-auto flex-1",
|
|
256
|
-
children: W ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
263
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
279
|
+
K.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
|
|
280
280
|
className: g,
|
|
281
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
290
|
+
q.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
|
|
291
291
|
className: g,
|
|
292
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
304
|
+
/* @__PURE__ */ p("div", {
|
|
305
305
|
className: "p-2 border-t border-border-default",
|
|
306
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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 {
|
|
8
|
-
import {
|
|
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 } =
|
|
12
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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.")
|