@burdenoff/microfe-bigconsole 2026.924.2 → 2026.925.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/bigconsole/BigConsoleRoot.js +94 -84
  2. package/dist/bigconsole/BigConsoleRoot.js.map +1 -1
  3. package/dist/bigconsole/BigConsoleRoutes.js +137 -138
  4. package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
  5. package/dist/bigconsole/assistant/previewController.js +7 -7
  6. package/dist/bigconsole/components/DrilldownDashboardRenderer.js +17 -17
  7. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +32 -32
  8. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +52 -52
  9. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  10. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +7 -7
  11. package/dist/bigconsole/components/dashboard/DashboardStatusPill.js +53 -0
  12. package/dist/bigconsole/components/dashboard/DashboardStatusPill.js.map +1 -0
  13. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +60 -60
  14. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +21 -21
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +36 -36
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
  18. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +38 -38
  19. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  20. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +121 -121
  21. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  22. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +22 -22
  23. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
  24. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +53 -53
  25. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
  26. package/dist/bigconsole/components/dashboard/WidgetPalette.js +47 -47
  27. package/dist/bigconsole/components/dashboard/index.js +1 -0
  28. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
  29. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
  30. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
  31. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +30 -29
  32. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  33. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +48 -48
  34. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +126 -114
  35. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  36. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
  37. package/dist/bigconsole/components/overview/DashboardGuide.js +214 -0
  38. package/dist/bigconsole/components/overview/DashboardGuide.js.map +1 -0
  39. package/dist/bigconsole/components/overview/DataHealthCard.js +97 -0
  40. package/dist/bigconsole/components/overview/DataHealthCard.js.map +1 -0
  41. package/dist/bigconsole/components/overview/OverviewQuickActions.js +32 -0
  42. package/dist/bigconsole/components/overview/OverviewQuickActions.js.map +1 -0
  43. package/dist/bigconsole/components/overview/OverviewStatCard.js +57 -0
  44. package/dist/bigconsole/components/overview/OverviewStatCard.js.map +1 -0
  45. package/dist/bigconsole/components/overview/RecentDashboardsPanel.js +107 -0
  46. package/dist/bigconsole/components/overview/RecentDashboardsPanel.js.map +1 -0
  47. package/dist/bigconsole/components/overview/dashboardGuideSteps.js +119 -0
  48. package/dist/bigconsole/components/overview/dashboardGuideSteps.js.map +1 -0
  49. package/dist/bigconsole/components/overview/index.js +8 -0
  50. package/dist/bigconsole/components/overview/overviewModel.js +119 -0
  51. package/dist/bigconsole/components/overview/overviewModel.js.map +1 -0
  52. package/dist/bigconsole/components/overview/useOverviewData.js +48 -0
  53. package/dist/bigconsole/components/overview/useOverviewData.js.map +1 -0
  54. package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
  55. package/dist/bigconsole/components/parser/ImportParserDialog.js +127 -127
  56. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  57. package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
  58. package/dist/bigconsole/components/preview/AiPreviewContent.js +5 -5
  59. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +32 -32
  60. package/dist/bigconsole/components/preview/AiPreviewPanel.js +37 -37
  61. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +13 -13
  62. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +70 -70
  63. package/dist/bigconsole/components/widgets/PropertiesPanel.js +28 -28
  64. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +25 -25
  65. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
  66. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
  67. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
  68. package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
  69. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
  70. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
  71. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +21 -21
  72. package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
  73. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
  74. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
  75. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
  76. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
  77. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
  78. package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
  79. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
  80. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +10 -10
  81. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +68 -68
  82. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  83. package/dist/bigconsole/hooks/useDataSinkOperations.js +92 -89
  84. package/dist/bigconsole/hooks/useDataSinkOperations.js.map +1 -1
  85. package/dist/bigconsole/hooks/useImportDataSink.js +96 -91
  86. package/dist/bigconsole/hooks/useImportDataSink.js.map +1 -1
  87. package/dist/bigconsole/pages/AdminPage.js +136 -136
  88. package/dist/bigconsole/pages/DashboardBuilderPage.js +10 -10
  89. package/dist/bigconsole/pages/DashboardViewPage.js +61 -61
  90. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  91. package/dist/bigconsole/pages/DashboardsPage.js +327 -348
  92. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  93. package/dist/bigconsole/pages/DataParsersPage.js +5 -5
  94. package/dist/bigconsole/pages/DataSinkBuilderPage.js +82 -80
  95. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  96. package/dist/bigconsole/pages/DataSinkViewPage.js +83 -83
  97. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  98. package/dist/bigconsole/pages/DataSinksPage.js +11 -11
  99. package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
  100. package/dist/bigconsole/pages/InsightsPage.js +315 -315
  101. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  102. package/dist/bigconsole/pages/OverviewPage.js +244 -0
  103. package/dist/bigconsole/pages/OverviewPage.js.map +1 -0
  104. package/dist/bigconsole/pages/ParserBuilderPage.js +5 -5
  105. package/dist/bigconsole/pages/ParserViewPage.js +98 -98
  106. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  107. package/dist/bigconsole/pages/PipelineBuilderPage.js +8 -8
  108. package/dist/bigconsole/pages/PipelineViewPage.js +46 -46
  109. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  110. package/dist/bigconsole/pages/PipelinesPage.js +80 -80
  111. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  112. package/dist/bigconsole/pages/SettingsPage.js +70 -70
  113. package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
  114. package/dist/bigconsole/pages/WorkflowViewPage.js +200 -200
  115. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  116. package/dist/bigconsole/pages/WorkflowsPage.js +78 -78
  117. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  118. package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +36 -35
  119. package/dist/bigconsole/providers/BigConsoleQuotaProvider.js.map +1 -1
  120. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +34 -34
  121. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +79 -79
  122. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
  123. package/dist/bigconsole/utils/createDialogParam.js +14 -0
  124. package/dist/bigconsole/utils/createDialogParam.js.map +1 -0
  125. package/dist/bigconsole/utils/quota.js +51 -23
  126. package/dist/bigconsole/utils/quota.js.map +1 -1
  127. package/dist/generated/global-operations.js +1 -1
  128. package/dist/generated/wspace-operations.js +285 -222
  129. package/dist/generated/wspace-operations.js.map +1 -1
  130. package/dist/shared/hooks/useTr.js +10 -7
  131. package/dist/shared/hooks/useTr.js.map +1 -1
  132. package/package.json +1 -1
  133. package/dist/bigconsole/pages/HomePage.js +0 -318
  134. package/dist/bigconsole/pages/HomePage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineViewPage.js","names":[],"sources":["../../../src/bigconsole/pages/PipelineViewPage.tsx"],"sourcesContent":["/**\n * Pipeline View Page\n *\n * Display Pipeline details, stages, and execution history.\n * Supports testing pipeline with sample input.\n *\n * Section ladder (BOFF-5635):\n * bare — header strip (back / title / status / actions)\n * primary — the block this route exists for. That is the stage chain by\n * default; when the test panel is open (the Test button or\n * `?test=true`) the execution surface takes over as primary and\n * the stages step down to `standard`, so there is always exactly\n * one hero and it is whatever the user just asked for.\n * standard — the other of those two.\n * muted — sidebar metadata, stage cards nested inside the hero.\n * tone — pass/fail result, load failure, \"not found\".\n */\n\nimport { memo, useState, useCallback, useEffect, useId } from 'react';\nimport { useParams, useSearchParams } from 'react-router';\nimport { Button, IllustratedEmptyState, PagePurpose, NextSteps, Spinner } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeNotify } from '../../utils/nativeBridge';\nimport { usePipelineOperations } from '../hooks/usePipelineOperations';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { PipelineStatusBadge } from '../components/pipeline/PipelineStatusBadge';\nimport { PipelineDeleteDialog } from '../components/pipeline/PipelineDeleteDialog';\nimport { Section, SectionStack, SECTION_FOCUS_RING } from '../components/common';\nimport type { Pipeline, PipelineExecution, PipelineStage } from '../types';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Keeps header/panel actions at the 40px touch minimum on mobile. */\nconst TOUCH_TARGET = 'min-h-[var(--size-controlHeight-md)]';\n\n/** Count / timing chip used in section headers. */\nconst META_CHIP = 'rounded-pill bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary';\n\n/** Mono key chip — the data contract of a stage. */\n/** `break-all`: stage keys are user-supplied and are often one long token. */\nconst KEY_CHIP = 'rounded-button bg-bg-surface px-1.5 py-0.5 font-mono break-all text-text-primary';\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst BackIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n);\n\nconst EditIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n);\n\nconst DeleteIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n);\n\nconst PlayIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst ErrorIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n);\n\nconst CheckIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n);\n\nconst ArrowRightIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n);\n\n// ============================================================================\n// STAGE ERROR BADGE\n// ============================================================================\n\n/**\n * The stage's failure policy. Labelled (\"On error\") because an unlabelled\n * `Fail` / `Skip` chip sitting next to the parser-type chip and the mono key\n * chips gave the reader no way to tell state from config.\n */\nconst StageErrorBadge = ({ handling }: { handling: string }) => {\n const { t } = useI18n();\n const config = {\n fail: {\n label: t('bigconsole.pipelines.view.errorHandlingFail', 'Fail'),\n className:\n 'bg-[var(--color-status-error-bgSubtle)] text-status-error-text border-[var(--color-status-error-border)]',\n },\n skip: {\n label: t('bigconsole.pipelines.view.errorHandlingSkip', 'Skip'),\n className:\n 'bg-[var(--color-status-warning-bgSubtle)] text-[var(--color-status-warning-text)] border-[var(--color-status-warning-border)]',\n },\n fallback: {\n label: t('bigconsole.pipelines.view.errorHandlingFallback', 'Fallback'),\n className:\n 'bg-[var(--color-status-info-bgSubtle)] text-[var(--color-status-info-text)] border-[var(--color-status-info-border)]',\n },\n };\n const c = config[handling as keyof typeof config] || config.fail;\n return (\n <span\n className={`inline-flex items-center gap-1 whitespace-nowrap rounded-pill border px-2 py-0.5 text-xs font-medium ${c.className}`}\n >\n <span className=\"font-normal opacity-80\">On error</span>\n {c.label}\n </span>\n );\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineViewPage = memo(function PipelineViewPage() {\n const { pipelineId } = useParams<{ pipelineId: string }>();\n const navigate = useAppNavigate();\n const { t } = useI18n();\n // Use default consoleId for now (should come from context in production)\n const consoleId = 'default';\n const [searchParams] = useSearchParams();\n const testInputId = useId();\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_READ);\n const canUpdate = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_UPDATE);\n const canDelete = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_DELETE);\n const canTest = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_TEST);\n\n // Local state\n const [pipeline, setPipeline] = useState<Pipeline | null>(null);\n const [testInput, setTestInput] = useState('{\\n \"data\": \"sample\"\\n}');\n const [testResult, setTestResult] = useState<PipelineExecution | null>(null);\n const [showTestPanel, setShowTestPanel] = useState(searchParams.get('test') === 'true');\n\n // Store state\n const deleteDialogOpen = usePipelineStore((state) => state.deleteDialogOpen);\n const openDeleteDialog = usePipelineStore((state) => state.openDeleteDialog);\n const closeDeleteDialog = usePipelineStore((state) => state.closeDeleteDialog);\n\n // Operations\n const { loading, error, fetchPipeline, deletePipeline, testPipeline } = usePipelineOperations({\n consoleId,\n skipFetch: true,\n });\n\n // Fetch pipeline on mount\n useEffect(() => {\n if (pipelineId) {\n fetchPipeline(pipelineId).then((result) => {\n if (result) {\n setPipeline(result);\n }\n });\n }\n }, [pipelineId, fetchPipeline]);\n\n // Handlers\n const handleBack = useCallback(() => {\n navigate(`/pipelines`);\n }, [navigate]);\n\n const handleEdit = useCallback(() => {\n navigate(`/pipelines/${pipelineId}/edit`);\n }, [navigate, pipelineId]);\n\n const handleDeleteClick = useCallback(() => {\n if (pipeline) {\n openDeleteDialog(pipeline);\n }\n }, [pipeline, openDeleteDialog]);\n\n const handleDeleteConfirm = useCallback(async () => {\n if (pipeline) {\n const success = await deletePipeline(pipeline.id);\n if (success) {\n if (isNative()) void nativeNotify('success');\n closeDeleteDialog();\n navigate(`/pipelines`);\n } else if (isNative()) {\n void nativeNotify('error');\n }\n }\n }, [pipeline, deletePipeline, closeDeleteDialog, navigate]);\n\n const handleViewParser = useCallback(\n (parserId: string) => {\n navigate(`/dashboards/${consoleId}/parsers/${parserId}`);\n },\n [navigate, consoleId]\n );\n\n const handleTest = useCallback(async () => {\n if (!pipeline) return;\n\n try {\n const result = await testPipeline({\n pipelineId: pipeline.id,\n inputData: testInput,\n });\n if (result) {\n setTestResult(result);\n }\n } catch {\n // Failures surface through the hook's `error` state; the panel keeps the\n // previous result rather than blanking out.\n }\n }, [pipeline, testPipeline, testInput]);\n\n // Loading state\n if (loading && !pipeline) {\n return (\n <div className=\"p-card-padding\">\n <div className=\"flex flex-col items-center justify-center py-16\" role=\"status\">\n <Spinner style={{ height: 'var(--size-icon-xl)', width: 'var(--size-icon-xl)' }} />\n <p className=\"mt-form-gap text-sm text-text-secondary\">\n {t('bigconsole.pipelines.view.loading', 'Loading Pipeline...')}\n </p>\n </div>\n </div>\n );\n }\n\n // Read gate — once permissions have loaded, block actors without read access.\n if (!permissionsLoading && !canRead) {\n return (\n <AccessDenied\n title={t('bigconsole.pipelines.errors.accessDeniedTitle', 'Access Denied')}\n description={t(\n 'bigconsole.pipelines.errors.accessDeniedViewDescription',\n \"You don't have permission to view this pipeline.\"\n )}\n />\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"p-card-padding\">\n <Section\n tone=\"danger\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.loadError', 'Failed to load Pipeline')}\n description={error.message}\n icon={<ErrorIcon className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <Button onClick={handleBack} className={TOUCH_TARGET}>\n {t('bigconsole.pipelines.actions.backToPipelines', 'Back to Pipelines')}\n </Button>\n }\n data-testid=\"pipeline-view-error\"\n >\n <p className=\"text-sm text-text-secondary\">\n The pipeline could not be read from the console service. Nothing was changed.\n </p>\n </Section>\n </div>\n );\n }\n\n // Not found state\n if (!pipeline) {\n return (\n <div className=\"p-card-padding\">\n <Section\n tone=\"warning\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.notFoundTitle', 'Pipeline not found')}\n description={t(\n 'bigconsole.pipelines.view.notFoundDescription',\n \"The pipeline you're looking for doesn't exist or has been deleted.\"\n )}\n icon={<ErrorIcon className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <Button onClick={handleBack} className={TOUCH_TARGET}>\n {t('bigconsole.pipelines.actions.backToPipelines', 'Back to Pipelines')}\n </Button>\n }\n data-testid=\"pipeline-not-found\"\n />\n </div>\n );\n }\n\n const stageCount = pipeline.stages?.length ?? 0;\n const testPassed = testResult?.status === 'completed';\n\n /** Stage chain — hero unless the user opened the execution panel. */\n const stagesSection = (\n <Section\n emphasis={showTestPanel ? 'standard' : 'primary'}\n headingLevel={2}\n title={t('bigconsole.pipelines.view.stagesHeading', 'Pipeline Stages ({{count}})', { count: stageCount })}\n description=\"Data flows top to bottom — each stage reads its input key and writes an output key for the next one.\"\n data-testid=\"pipeline-stages\"\n >\n {stageCount === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title={t('bigconsole.pipelines.view.noStagesTitle', 'No stages defined')}\n description={t('bigconsole.pipelines.view.noStagesDescription', 'Edit the pipeline to add parser stages.')}\n action={\n <Button variant=\"secondary\" onClick={handleEdit} disabled={!canUpdate} className={TOUCH_TARGET}>\n <EditIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.edit', 'Edit')}\n </Button>\n }\n />\n ) : (\n <ol className=\"flex flex-col\">\n {(pipeline.stages ?? []).map((stage: PipelineStage, index: number) => (\n <li key={stage.id} className=\"flex min-w-0 flex-col\">\n {/* Stage card — recessed so the chain reads as N discrete steps\n instead of one stack at the parent's luminance. */}\n <div\n data-testid=\"pipeline-stage\"\n data-enabled={stage.enabled}\n className={`min-w-0 rounded-card border bg-bg-sunken p-4 ${\n stage.enabled\n ? 'border-[var(--color-border-subtle)]'\n : 'border-dashed border-[var(--color-border-strong)]'\n }`}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-control-gap\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-icon-gap\">\n <span\n aria-hidden=\"true\"\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-pill bg-bg-surface text-xs font-semibold text-text-secondary\"\n >\n {index + 1}\n </span>\n <h3 className=\"min-w-0 truncate text-sm font-semibold text-text-primary\">\n {stage.parserName ||\n t('bigconsole.pipelines.view.stageFallbackName', 'Stage {{number}}', { number: index + 1 })}\n </h3>\n {stage.parserType && (\n <span className=\"rounded-pill bg-bg-surface px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {stage.parserType.toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-icon-gap\">\n <StageErrorBadge handling={stage.onError} />\n {!stage.enabled && (\n <span className=\"rounded-pill border border-[var(--color-border-strong)] px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {t('bigconsole.pipelines.view.stageDisabled', 'Disabled')}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-text-secondary\">\n <span className=\"text-text-muted\">Reads</span>\n <code className={KEY_CHIP}>{stage.inputKey}</code>\n <ArrowRightIcon className=\"h-3 w-3 shrink-0\" />\n <span className=\"text-text-muted\">writes</span>\n <code className={KEY_CHIP}>{stage.outputKey}</code>\n </div>\n\n {stage.description && <p className=\"mt-2 text-xs text-text-secondary\">{stage.description}</p>}\n\n {stage.parserId && (\n <button\n type=\"button\"\n onClick={() => handleViewParser(stage.parserId)}\n className={`mt-2 rounded-button text-xs text-text-link hover:underline ${SECTION_FOCUS_RING}`}\n >\n {t('bigconsole.pipelines.view.viewParser', 'View Parser')}\n </button>\n )}\n </div>\n\n {/* Sequence connector — vertical, so the ordering metaphor survives\n below md (the old arrow was `hidden md:block`). */}\n {index < stageCount - 1 && (\n <span aria-hidden=\"true\" className=\"flex justify-center py-1\">\n <ArrowRightIcon className=\"h-icon-sm w-icon-sm rotate-90 text-text-muted\" />\n </span>\n )}\n </li>\n ))}\n </ol>\n )}\n </Section>\n );\n\n /** Execution surface — hero while it is open. */\n const testSection = showTestPanel ? (\n <Section\n id=\"pipeline-test-panel\"\n emphasis=\"primary\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.testPanelHeading', 'Test Pipeline')}\n description=\"Run sample input through every enabled stage. Nothing is written to the connected sink.\"\n actions={\n <Button onClick={handleTest} disabled={loading || !canTest} className={TOUCH_TARGET}>\n <PlayIcon className=\"h-icon-sm w-icon-sm\" />\n {loading\n ? t('bigconsole.pipelines.view.testRunning', 'Running...')\n : t('bigconsole.pipelines.view.runTest', 'Run Test')}\n </Button>\n }\n data-testid=\"pipeline-test-panel\"\n >\n <div className=\"flex flex-col gap-form-gap\">\n <div className=\"min-w-0\">\n <label htmlFor={testInputId} className=\"mb-1 block text-sm font-medium text-text-primary\">\n {t('bigconsole.pipelines.view.inputJsonLabel', 'Input JSON')}\n </label>\n <textarea\n id={testInputId}\n value={testInput}\n onChange={(e) => setTestInput(e.target.value)}\n spellCheck={false}\n className={`min-h-32 w-full resize-y rounded-input border border-[var(--color-border-subtle)] bg-bg-canvas px-3 py-2 font-mono text-sm text-text-primary ${SECTION_FOCUS_RING}`}\n placeholder='{\"key\": \"value\"}'\n />\n </div>\n\n {testResult && (\n <Section\n tone={testPassed ? 'success' : 'danger'}\n headingLevel={3}\n title={\n testPassed\n ? t('bigconsole.pipelines.view.testPassed', 'Test Passed')\n : t('bigconsole.pipelines.view.testFailed', 'Test Failed')\n }\n icon={\n testPassed ? <CheckIcon className=\"h-icon-sm w-icon-sm\" /> : <ErrorIcon className=\"h-icon-sm w-icon-sm\" />\n }\n meta={\n testResult.totalExecutionTimeMs ? (\n <span className={META_CHIP}>{testResult.totalExecutionTimeMs}ms</span>\n ) : null\n }\n data-testid=\"pipeline-test-result\"\n >\n <div className=\"flex flex-col gap-form-gap\">\n <div className=\"min-w-0\">\n <h4 className=\"mb-1 text-sm font-medium text-text-primary\">\n {t('bigconsole.pipelines.view.outputLabel', 'Output')}\n </h4>\n <pre className=\"max-h-64 w-full overflow-auto rounded-input border border-[var(--color-border-subtle)] bg-bg-canvas p-3 font-mono text-xs text-text-primary\">\n {JSON.stringify(testResult.outputData, null, 2) || 'null'}\n </pre>\n </div>\n\n {testResult.error && (\n <div className=\"min-w-0\">\n <h4 className=\"mb-1 text-sm font-medium text-status-error-text\">\n {t('bigconsole.pipelines.view.errorLabel', 'Error')}\n </h4>\n <pre className=\"max-h-64 w-full overflow-auto rounded-input border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bgSubtle)] p-3 font-mono text-xs text-status-error-text\">\n {testResult.error}\n </pre>\n </div>\n )}\n </div>\n </Section>\n )}\n </div>\n </Section>\n ) : null;\n\n return (\n <div className=\"p-card-padding\">\n <SectionStack>\n {/* Header strip — structure only, no surface. */}\n <header className=\"flex flex-col gap-form-gap sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex min-w-0 flex-col gap-control-gap\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBack} className=\"w-fit\">\n <BackIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.backToPipelines', 'Back to Pipelines')}\n </Button>\n <div className=\"flex flex-wrap items-center gap-icon-gap\">\n {/* `break-words`: a pipeline name is user-supplied and can be one\n long unbroken token — without it the h1 pushes the whole page\n into horizontal scroll at 390px. */}\n <h1 className=\"min-w-0 break-words text-2xl font-bold leading-tight text-text-primary\">\n {pipeline.name}\n </h1>\n <PipelineStatusBadge status={pipeline.status} />\n </div>\n {pipeline.description && <p className=\"text-sm text-text-secondary\">{pipeline.description}</p>}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-control-gap\">\n <Button\n onClick={() => setShowTestPanel(!showTestPanel)}\n disabled={!canTest}\n aria-expanded={showTestPanel}\n aria-controls=\"pipeline-test-panel\"\n className={TOUCH_TARGET}\n >\n <PlayIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.test', 'Test')}\n </Button>\n <Button variant=\"secondary\" onClick={handleEdit} disabled={!canUpdate} className={TOUCH_TARGET}>\n <EditIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.edit', 'Edit')}\n </Button>\n {canDelete && (\n <Button variant=\"destructive\" onClick={handleDeleteClick} className={TOUCH_TARGET}>\n <DeleteIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.delete', 'Delete')}\n </Button>\n )}\n </div>\n </header>\n\n <PagePurpose className=\"max-w-[75ch]\">\n {t(\n 'bigconsole.pipelines.view.purpose',\n 'A pipeline chains parsers and a data sink into a repeatable flow. Review its stages here, test it with sample input to confirm the output, then edit the stages or run it to process real data into the connected sink.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"bigconsole-pipeline-view\"\n steps={[\n ...(canTest\n ? [\n {\n id: 'test',\n label: t('bigconsole.pipelines.view.nextStepTestLabel', 'Test with sample input'),\n description: t(\n 'bigconsole.pipelines.view.nextStepTestDescription',\n 'Run the pipeline against a sample to verify each stage.'\n ),\n onClick: () => setShowTestPanel(true),\n },\n ]\n : []),\n ...(canUpdate\n ? [\n {\n id: 'edit',\n label: t('bigconsole.pipelines.view.nextStepEditLabel', 'Edit the stages'),\n description: t(\n 'bigconsole.pipelines.view.nextStepEditDescription',\n 'Add, reorder, or configure the parsers in this pipeline.'\n ),\n onClick: handleEdit,\n },\n ]\n : []),\n {\n id: 'sinks',\n label: t('bigconsole.pipelines.view.nextStepSinksLabel', 'Review the target data sink'),\n description: t(\n 'bigconsole.pipelines.view.nextStepSinksDescription',\n 'See where the processed data lands.'\n ),\n onClick: () => navigate('/datasinks'),\n },\n ]}\n />\n\n <div className=\"grid grid-cols-1 gap-section-gap lg:grid-cols-3\">\n {/* Main column */}\n <div className=\"min-w-0 lg:col-span-2\">\n <SectionStack>\n {testSection}\n {stagesSection}\n </SectionStack>\n </div>\n\n {/* Sidebar — supporting detail only. */}\n <div className=\"min-w-0\">\n <SectionStack>\n <Section\n emphasis=\"muted\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.detailsHeading', 'Details')}\n data-testid=\"pipeline-details\"\n >\n <dl className=\"flex flex-col gap-form-gap text-sm\">\n <div className=\"flex flex-col gap-3\">\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailStatus', 'Status')}\n </dt>\n <dd className=\"mt-1\">\n <PipelineStatusBadge status={pipeline.status} size=\"sm\" />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailStages', 'Stages')}\n </dt>\n <dd className=\"text-text-primary\">{stageCount}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailLastExecuted', 'Last Executed')}\n </dt>\n <dd className=\"break-words text-text-primary\">\n {pipeline.lastExecutedAt\n ? new Date(pipeline.lastExecutedAt).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n : t('bigconsole.pipelines.view.detailNever', 'Never')}\n </dd>\n </div>\n </div>\n\n {/* Lifecycle facts — separated so the sidebar reads as two\n short groups rather than six equal rows. */}\n <div className=\"flex flex-col gap-3 border-t border-[var(--color-border-subtle)] pt-form-gap\">\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailVersion', 'Version')}\n </dt>\n <dd className=\"text-text-primary\">{pipeline.version}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailCreated', 'Created')}\n </dt>\n <dd className=\"break-words text-text-primary\">\n {new Date(pipeline.createdAt).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailUpdated', 'Updated')}\n </dt>\n <dd className=\"break-words text-text-primary\">\n {new Date(pipeline.updatedAt).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })}\n </dd>\n </div>\n </div>\n </dl>\n </Section>\n </SectionStack>\n </div>\n </div>\n </SectionStack>\n\n {/* Delete Dialog */}\n {pipeline && (\n <PipelineDeleteDialog\n pipeline={pipeline}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n </div>\n );\n});\n\nexport default PipelineViewPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"PipelineViewPage.js","names":[],"sources":["../../../src/bigconsole/pages/PipelineViewPage.tsx"],"sourcesContent":["/**\n * Pipeline View Page\n *\n * Display Pipeline details, stages, and execution history.\n * Supports testing pipeline with sample input.\n *\n * Section ladder (BOFF-5635):\n * bare — header strip (back / title / status / actions)\n * primary — the block this route exists for. That is the stage chain by\n * default; when the test panel is open (the Test button or\n * `?test=true`) the execution surface takes over as primary and\n * the stages step down to `standard`, so there is always exactly\n * one hero and it is whatever the user just asked for.\n * standard — the other of those two.\n * muted — sidebar metadata, stage cards nested inside the hero.\n * tone — pass/fail result, load failure, \"not found\".\n */\n\nimport { memo, useState, useCallback, useEffect, useId } from 'react';\nimport { useParams, useSearchParams } from 'react-router';\nimport { Button, IllustratedEmptyState, PagePurpose, NextSteps, Spinner } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeNotify } from '../../utils/nativeBridge';\nimport { usePipelineOperations } from '../hooks/usePipelineOperations';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { PipelineStatusBadge } from '../components/pipeline/PipelineStatusBadge';\nimport { PipelineDeleteDialog } from '../components/pipeline/PipelineDeleteDialog';\nimport { Section, SectionStack, SECTION_FOCUS_RING } from '../components/common';\nimport type { Pipeline, PipelineExecution, PipelineStage } from '../types';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Keeps header/panel actions at the 40px touch minimum on mobile. */\nconst TOUCH_TARGET = 'min-h-[var(--size-controlHeight-md)]';\n\n/** Count / timing chip used in section headers. */\nconst META_CHIP = 'rounded-pill bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary';\n\n/** Mono key chip — the data contract of a stage. */\n/** `break-all`: stage keys are user-supplied and are often one long token. */\nconst KEY_CHIP = 'rounded-button bg-bg-surface px-1.5 py-0.5 font-mono break-all text-text-primary';\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst BackIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n);\n\nconst EditIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n);\n\nconst DeleteIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n);\n\nconst PlayIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst ErrorIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n);\n\nconst CheckIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n);\n\nconst ArrowRightIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n);\n\n// ============================================================================\n// STAGE ERROR BADGE\n// ============================================================================\n\n/**\n * The stage's failure policy. Labelled (\"On error\") because an unlabelled\n * `Fail` / `Skip` chip sitting next to the parser-type chip and the mono key\n * chips gave the reader no way to tell state from config.\n */\nconst StageErrorBadge = ({ handling }: { handling: string }) => {\n const { t } = useI18n();\n const config = {\n fail: {\n label: t('bigconsole.pipelines.view.errorHandlingFail', 'Fail'),\n className:\n 'bg-[var(--color-status-error-bgSubtle)] text-status-error-text border-[var(--color-status-error-border)]',\n },\n skip: {\n label: t('bigconsole.pipelines.view.errorHandlingSkip', 'Skip'),\n className:\n 'bg-[var(--color-status-warning-bgSubtle)] text-[var(--color-status-warning-text)] border-[var(--color-status-warning-border)]',\n },\n fallback: {\n label: t('bigconsole.pipelines.view.errorHandlingFallback', 'Fallback'),\n className:\n 'bg-[var(--color-status-info-bgSubtle)] text-[var(--color-status-info-text)] border-[var(--color-status-info-border)]',\n },\n };\n const c = config[handling as keyof typeof config] || config.fail;\n return (\n <span\n className={`inline-flex items-center gap-1 whitespace-nowrap rounded-pill border px-2 py-0.5 text-xs font-medium ${c.className}`}\n >\n <span className=\"font-normal opacity-80\">On error</span>\n {c.label}\n </span>\n );\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineViewPage = memo(function PipelineViewPage() {\n const { pipelineId } = useParams<{ pipelineId: string }>();\n const navigate = useAppNavigate();\n const { t } = useI18n();\n // Use default consoleId for now (should come from context in production)\n const consoleId = 'default';\n const [searchParams] = useSearchParams();\n const testInputId = useId();\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_READ);\n const canUpdate = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_UPDATE);\n const canDelete = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_DELETE);\n const canTest = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_TEST);\n\n // Local state\n const [pipeline, setPipeline] = useState<Pipeline | null>(null);\n const [testInput, setTestInput] = useState('{\\n \"data\": \"sample\"\\n}');\n const [testResult, setTestResult] = useState<PipelineExecution | null>(null);\n const [showTestPanel, setShowTestPanel] = useState(searchParams.get('test') === 'true');\n\n // Store state\n const deleteDialogOpen = usePipelineStore((state) => state.deleteDialogOpen);\n const openDeleteDialog = usePipelineStore((state) => state.openDeleteDialog);\n const closeDeleteDialog = usePipelineStore((state) => state.closeDeleteDialog);\n\n // Operations\n const { loading, error, fetchPipeline, deletePipeline, testPipeline } = usePipelineOperations({\n consoleId,\n skipFetch: true,\n });\n\n // Fetch pipeline on mount\n useEffect(() => {\n if (pipelineId) {\n fetchPipeline(pipelineId).then((result) => {\n if (result) {\n setPipeline(result);\n }\n });\n }\n }, [pipelineId, fetchPipeline]);\n\n // Handlers\n const handleBack = useCallback(() => {\n navigate(`/pipelines`);\n }, [navigate]);\n\n const handleEdit = useCallback(() => {\n navigate(`/pipelines/${pipelineId}/edit`);\n }, [navigate, pipelineId]);\n\n const handleDeleteClick = useCallback(() => {\n if (pipeline) {\n openDeleteDialog(pipeline);\n }\n }, [pipeline, openDeleteDialog]);\n\n const handleDeleteConfirm = useCallback(async () => {\n if (pipeline) {\n const success = await deletePipeline(pipeline.id);\n if (success) {\n if (isNative()) void nativeNotify('success');\n closeDeleteDialog();\n navigate(`/pipelines`);\n } else if (isNative()) {\n void nativeNotify('error');\n }\n }\n }, [pipeline, deletePipeline, closeDeleteDialog, navigate]);\n\n const handleViewParser = useCallback(\n (parserId: string) => {\n navigate(`/dashboards/${consoleId}/parsers/${parserId}`);\n },\n [navigate, consoleId]\n );\n\n const handleTest = useCallback(async () => {\n if (!pipeline) return;\n\n try {\n const result = await testPipeline({\n pipelineId: pipeline.id,\n inputData: testInput,\n });\n if (result) {\n setTestResult(result);\n }\n } catch {\n // Failures surface through the hook's `error` state; the panel keeps the\n // previous result rather than blanking out.\n }\n }, [pipeline, testPipeline, testInput]);\n\n // Loading state\n if (loading && !pipeline) {\n return (\n <div className=\"p-card-padding\">\n <div className=\"flex flex-col items-center justify-center py-16\" role=\"status\">\n <Spinner style={{ height: 'var(--size-icon-xl)', width: 'var(--size-icon-xl)' }} />\n <p className=\"mt-form-gap text-sm text-text-secondary\">\n {t('bigconsole.pipelines.view.loading', 'Loading Pipeline...')}\n </p>\n </div>\n </div>\n );\n }\n\n // Read gate — once permissions have loaded, block actors without read access.\n if (!permissionsLoading && !canRead) {\n return (\n <AccessDenied\n title={t('bigconsole.pipelines.errors.accessDeniedTitle', 'Access Denied')}\n description={t(\n 'bigconsole.pipelines.errors.accessDeniedViewDescription',\n \"You don't have permission to view this pipeline.\"\n )}\n />\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"p-card-padding\">\n <Section\n tone=\"danger\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.loadError', 'Failed to load Pipeline')}\n description={error.message}\n icon={<ErrorIcon className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <Button onClick={handleBack} className={TOUCH_TARGET}>\n {t('bigconsole.pipelines.actions.backToPipelines', 'Back to Pipelines')}\n </Button>\n }\n data-testid=\"pipeline-view-error\"\n >\n <p className=\"text-sm text-text-secondary\">\n The pipeline could not be read from the console service. Nothing was changed.\n </p>\n </Section>\n </div>\n );\n }\n\n // Not found state\n if (!pipeline) {\n return (\n <div className=\"p-card-padding\">\n <Section\n tone=\"warning\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.notFoundTitle', 'Pipeline not found')}\n description={t(\n 'bigconsole.pipelines.view.notFoundDescription',\n \"The pipeline you're looking for doesn't exist or has been deleted.\"\n )}\n icon={<ErrorIcon className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <Button onClick={handleBack} className={TOUCH_TARGET}>\n {t('bigconsole.pipelines.actions.backToPipelines', 'Back to Pipelines')}\n </Button>\n }\n data-testid=\"pipeline-not-found\"\n />\n </div>\n );\n }\n\n const stageCount = pipeline.stages?.length ?? 0;\n const testPassed = testResult?.status === 'completed';\n\n /** Stage chain — hero unless the user opened the execution panel. */\n const stagesSection = (\n <Section\n emphasis={showTestPanel ? 'standard' : 'primary'}\n headingLevel={2}\n title={t('bigconsole.pipelines.view.stagesHeading', 'Pipeline Stages ({{count}})', { count: stageCount })}\n description=\"Data flows top to bottom — each stage reads its input key and writes an output key for the next one.\"\n data-testid=\"pipeline-stages\"\n >\n {stageCount === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title={t('bigconsole.pipelines.view.noStagesTitle', 'No stages defined')}\n description={t('bigconsole.pipelines.view.noStagesDescription', 'Edit the pipeline to add parser stages.')}\n action={\n <Button variant=\"secondary\" onClick={handleEdit} disabled={!canUpdate} className={TOUCH_TARGET}>\n <EditIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.edit', 'Edit')}\n </Button>\n }\n />\n ) : (\n <ol className=\"flex flex-col\">\n {(pipeline.stages ?? []).map((stage: PipelineStage, index: number) => (\n <li key={stage.id} className=\"flex min-w-0 flex-col\">\n {/* Stage card — recessed so the chain reads as N discrete steps\n instead of one stack at the parent's luminance. */}\n <div\n data-testid=\"pipeline-stage\"\n data-enabled={stage.enabled}\n className={`min-w-0 rounded-card border bg-bg-sunken p-4 ${\n stage.enabled\n ? 'border-[var(--color-border-subtle)]'\n : 'border-dashed border-[var(--color-border-strong)]'\n }`}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-control-gap\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-icon-gap\">\n <span\n aria-hidden=\"true\"\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-pill bg-bg-surface text-xs font-semibold text-text-secondary\"\n >\n {index + 1}\n </span>\n <h3 className=\"min-w-0 truncate text-sm font-semibold text-text-primary\">\n {stage.parserName ||\n t('bigconsole.pipelines.view.stageFallbackName', 'Stage {{number}}', { number: index + 1 })}\n </h3>\n {stage.parserType && (\n <span className=\"rounded-pill bg-bg-surface px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {stage.parserType.toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-icon-gap\">\n <StageErrorBadge handling={stage.onError} />\n {!stage.enabled && (\n <span className=\"rounded-pill border border-[var(--color-border-strong)] px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {t('bigconsole.pipelines.view.stageDisabled', 'Disabled')}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-text-secondary\">\n <span className=\"text-text-muted\">Reads</span>\n <code className={KEY_CHIP}>{stage.inputKey}</code>\n <ArrowRightIcon className=\"h-3 w-3 shrink-0\" />\n <span className=\"text-text-muted\">writes</span>\n <code className={KEY_CHIP}>{stage.outputKey}</code>\n </div>\n\n {stage.description && <p className=\"mt-2 text-xs text-text-secondary\">{stage.description}</p>}\n\n {stage.parserId && (\n <button\n type=\"button\"\n onClick={() => handleViewParser(stage.parserId)}\n className={`mt-2 rounded-button text-xs text-text-link hover:underline ${SECTION_FOCUS_RING}`}\n >\n {t('bigconsole.pipelines.view.viewParser', 'View Parser')}\n </button>\n )}\n </div>\n\n {/* Sequence connector — vertical, so the ordering metaphor survives\n below md (the old arrow was `hidden md:block`). */}\n {index < stageCount - 1 && (\n <span aria-hidden=\"true\" className=\"flex justify-center py-1\">\n <ArrowRightIcon className=\"h-icon-sm w-icon-sm rotate-90 text-text-muted\" />\n </span>\n )}\n </li>\n ))}\n </ol>\n )}\n </Section>\n );\n\n /** Execution surface — hero while it is open. */\n const testSection = showTestPanel ? (\n <Section\n id=\"pipeline-test-panel\"\n emphasis=\"primary\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.testPanelHeading', 'Test Pipeline')}\n description=\"Run sample input through every enabled stage. Nothing is written to the connected sink.\"\n actions={\n <Button onClick={handleTest} disabled={loading || !canTest} className={TOUCH_TARGET}>\n <PlayIcon className=\"h-icon-sm w-icon-sm\" />\n {loading\n ? t('bigconsole.pipelines.view.testRunning', 'Running...')\n : t('bigconsole.pipelines.view.runTest', 'Run Test')}\n </Button>\n }\n data-testid=\"pipeline-test-panel\"\n >\n <div className=\"flex flex-col gap-form-gap\">\n <div className=\"min-w-0\">\n <label htmlFor={testInputId} className=\"mb-1 block text-sm font-medium text-text-primary\">\n {t('bigconsole.pipelines.view.inputJsonLabel', 'Input JSON')}\n </label>\n <textarea\n id={testInputId}\n value={testInput}\n onChange={(e) => setTestInput(e.target.value)}\n spellCheck={false}\n className={`min-h-32 w-full resize-y rounded-input border border-[var(--color-border-subtle)] bg-bg-canvas px-3 py-2 font-mono text-sm text-text-primary ${SECTION_FOCUS_RING}`}\n placeholder='{\"key\": \"value\"}'\n />\n </div>\n\n {testResult && (\n <Section\n tone={testPassed ? 'success' : 'danger'}\n headingLevel={3}\n title={\n testPassed\n ? t('bigconsole.pipelines.view.testPassed', 'Test Passed')\n : t('bigconsole.pipelines.view.testFailed', 'Test Failed')\n }\n icon={\n testPassed ? <CheckIcon className=\"h-icon-sm w-icon-sm\" /> : <ErrorIcon className=\"h-icon-sm w-icon-sm\" />\n }\n meta={\n testResult.totalExecutionTimeMs ? (\n <span className={META_CHIP}>{testResult.totalExecutionTimeMs}ms</span>\n ) : null\n }\n data-testid=\"pipeline-test-result\"\n >\n <div className=\"flex flex-col gap-form-gap\">\n <div className=\"min-w-0\">\n <h4 className=\"mb-1 text-sm font-medium text-text-primary\">\n {t('bigconsole.pipelines.view.outputLabel', 'Output')}\n </h4>\n <pre className=\"max-h-64 w-full overflow-auto rounded-input border border-[var(--color-border-subtle)] bg-bg-canvas p-3 font-mono text-xs text-text-primary\">\n {JSON.stringify(testResult.outputData, null, 2) || 'null'}\n </pre>\n </div>\n\n {testResult.error && (\n <div className=\"min-w-0\">\n <h4 className=\"mb-1 text-sm font-medium text-status-error-text\">\n {t('bigconsole.pipelines.view.errorLabel', 'Error')}\n </h4>\n <pre className=\"max-h-64 w-full overflow-auto rounded-input border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bgSubtle)] p-3 font-mono text-xs text-status-error-text\">\n {testResult.error}\n </pre>\n </div>\n )}\n </div>\n </Section>\n )}\n </div>\n </Section>\n ) : null;\n\n return (\n <div className=\"p-card-padding\">\n <SectionStack>\n {/* Header strip — structure only, no surface. */}\n <header className=\"flex flex-col gap-form-gap sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex min-w-0 flex-col gap-control-gap\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBack} className=\"w-fit\">\n <BackIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.backToPipelines', 'Back to Pipelines')}\n </Button>\n <div className=\"flex flex-wrap items-center gap-icon-gap\">\n {/* `break-words`: a pipeline name is user-supplied and can be one\n long unbroken token — without it the h1 pushes the whole page\n into horizontal scroll at 390px. */}\n <h1 className=\"min-w-0 break-words text-2xl font-bold leading-tight text-text-primary\">\n {pipeline.name}\n </h1>\n <PipelineStatusBadge status={pipeline.status} />\n </div>\n {pipeline.description && <p className=\"text-sm text-text-secondary\">{pipeline.description}</p>}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-control-gap\">\n <Button\n onClick={() => setShowTestPanel(!showTestPanel)}\n disabled={!canTest}\n aria-expanded={showTestPanel}\n aria-controls=\"pipeline-test-panel\"\n className={TOUCH_TARGET}\n >\n <PlayIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.test', 'Test')}\n </Button>\n <Button variant=\"secondary\" onClick={handleEdit} disabled={!canUpdate} className={TOUCH_TARGET}>\n <EditIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.edit', 'Edit')}\n </Button>\n {canDelete && (\n <Button variant=\"destructive\" onClick={handleDeleteClick} className={TOUCH_TARGET}>\n <DeleteIcon className=\"h-icon-sm w-icon-sm\" />\n {t('bigconsole.pipelines.actions.delete', 'Delete')}\n </Button>\n )}\n </div>\n </header>\n\n <PagePurpose className=\"max-w-[75ch]\">\n {t(\n 'bigconsole.pipelines.view.purpose',\n 'A pipeline chains parsers and a data sink into a repeatable flow. Review its stages here, test it with sample input to confirm the output, then edit the stages or run it to process real data into the connected sink.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"bigconsole-pipeline-view\"\n steps={[\n ...(canTest\n ? [\n {\n id: 'test',\n label: t('bigconsole.pipelines.view.nextStepTestLabel', 'Test with sample input'),\n description: t(\n 'bigconsole.pipelines.view.nextStepTestDescription',\n 'Run the pipeline against a sample to verify each stage.'\n ),\n onClick: () => setShowTestPanel(true),\n },\n ]\n : []),\n ...(canUpdate\n ? [\n {\n id: 'edit',\n label: t('bigconsole.pipelines.view.nextStepEditLabel', 'Edit the stages'),\n description: t(\n 'bigconsole.pipelines.view.nextStepEditDescription',\n 'Add, reorder, or configure the parsers in this pipeline.'\n ),\n onClick: handleEdit,\n },\n ]\n : []),\n {\n id: 'sinks',\n label: t('bigconsole.pipelines.view.nextStepSinksLabel', 'Review the target data sink'),\n description: t(\n 'bigconsole.pipelines.view.nextStepSinksDescription',\n 'See where the processed data lands.'\n ),\n onClick: () => navigate('/datasinks'),\n },\n ]}\n />\n\n <div className=\"grid grid-cols-1 gap-section-gap lg:grid-cols-3\">\n {/* Main column */}\n <div className=\"min-w-0 lg:col-span-2\">\n <SectionStack>\n {testSection}\n {stagesSection}\n </SectionStack>\n </div>\n\n {/* Sidebar — supporting detail only. */}\n <div className=\"min-w-0\">\n <SectionStack>\n <Section\n emphasis=\"muted\"\n headingLevel={2}\n title={t('bigconsole.pipelines.view.detailsHeading', 'Details')}\n data-testid=\"pipeline-details\"\n >\n <dl className=\"flex flex-col gap-form-gap text-sm\">\n <div className=\"flex flex-col gap-3\">\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailStatus', 'Status')}\n </dt>\n <dd className=\"mt-1\">\n <PipelineStatusBadge status={pipeline.status} size=\"sm\" />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailStages', 'Stages')}\n </dt>\n <dd className=\"text-text-primary\">{stageCount}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailLastExecuted', 'Last Executed')}\n </dt>\n <dd className=\"break-words text-text-primary\">\n {pipeline.lastExecutedAt\n ? new Date(pipeline.lastExecutedAt).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n : t('bigconsole.pipelines.view.detailNever', 'Never')}\n </dd>\n </div>\n </div>\n\n {/* Lifecycle facts — separated so the sidebar reads as two\n short groups rather than six equal rows. */}\n <div className=\"flex flex-col gap-3 border-t border-[var(--color-border-subtle)] pt-form-gap\">\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailVersion', 'Version')}\n </dt>\n <dd className=\"text-text-primary\">{pipeline.version}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailCreated', 'Created')}\n </dt>\n <dd className=\"break-words text-text-primary\">\n {new Date(pipeline.createdAt).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-muted\">\n {t('bigconsole.pipelines.view.detailUpdated', 'Updated')}\n </dt>\n <dd className=\"break-words text-text-primary\">\n {new Date(pipeline.updatedAt).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })}\n </dd>\n </div>\n </div>\n </dl>\n </Section>\n </SectionStack>\n </div>\n </div>\n </SectionStack>\n\n {/* Delete Dialog */}\n {pipeline && (\n <PipelineDeleteDialog\n pipeline={pipeline}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n </div>\n );\n});\n\nexport default PipelineViewPage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuCA,IAAM,IAAe,wCAGf,KAAY,iFAIZ,IAAW,oFAMX,KAAY,EAAE,mBAClB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EAAM,eAAc;EAAQ,gBAAe;EAAQ,aAAa;EAAG,GAAE;EAAgC,CAAA;CACjG,CAAA,EAGF,KAAY,EAAE,mBAClB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EACE,eAAc;EACd,gBAAe;EACf,aAAa;EACb,GAAE;EACF,CAAA;CACE,CAAA,EAGF,KAAc,EAAE,mBACpB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EACE,eAAc;EACd,gBAAe;EACf,aAAa;EACb,GAAE;EACF,CAAA;CACE,CAAA,EAGF,KAAY,EAAE,mBAClB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WAArE,CACE,kBAAC,QAAD;EACE,eAAc;EACd,gBAAe;EACf,aAAa;EACb,GAAE;EACF,CAAA,EACF,kBAAC,QAAD;EAAM,eAAc;EAAQ,gBAAe;EAAQ,aAAa;EAAG,GAAE;EAAuC,CAAA,CACxG;IAGF,KAAa,EAAE,mBACnB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EACE,eAAc;EACd,gBAAe;EACf,aAAa;EACb,GAAE;EACF,CAAA;CACE,CAAA,EAGF,MAAa,EAAE,mBACnB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EAAM,eAAc;EAAQ,gBAAe;EAAQ,aAAa;EAAG,GAAE;EAAmB,CAAA;CACpF,CAAA,EAGF,KAAkB,EAAE,mBACxB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EAAM,eAAc;EAAQ,gBAAe;EAAQ,aAAa;EAAG,GAAE;EAA6B,CAAA;CAC9F,CAAA,EAYF,MAAmB,EAAE,kBAAqC;CAC9D,IAAM,EAAE,MAAM,GAAS,EACjB,IAAS;EACb,MAAM;GACJ,OAAO,EAAE,+CAA+C,OAAO;GAC/D,WACE;GACH;EACD,MAAM;GACJ,OAAO,EAAE,+CAA+C,OAAO;GAC/D,WACE;GACH;EACD,UAAU;GACR,OAAO,EAAE,mDAAmD,WAAW;GACvE,WACE;GACH;EACF,EACK,IAAI,EAAO,MAAoC,EAAO;AAC5D,QACE,kBAAC,QAAD;EACE,WAAW,wGAAwG,EAAE;YADvH,CAGE,kBAAC,QAAD;GAAM,WAAU;aAAyB;GAAe,CAAA,EACvD,EAAE,MACE;;GAQE,IAAmB,EAAK,WAA4B;CAC/D,IAAM,EAAE,kBAAe,IAAmC,EACpD,IAAW,GAAgB,EAC3B,EAAE,SAAM,GAAS,EAEjB,IAAY,WACZ,CAAC,MAAgB,IAAiB,EAClC,IAAc,IAAO,EAGrB,EAAE,kBAAe,WAAW,OAAuB,GAAgB,EACnE,IAAU,EAAc,EAAuB,cAAc,EAC7D,IAAY,EAAc,EAAuB,gBAAgB,EACjE,IAAY,EAAc,EAAuB,gBAAgB,EACjE,IAAU,EAAc,EAAuB,cAAc,EAG7D,CAAC,GAAU,KAAe,EAA0B,KAAK,EACzD,CAAC,GAAW,KAAgB,EAAS,+BAA2B,EAChE,CAAC,GAAY,MAAiB,EAAmC,KAAK,EACtE,CAAC,GAAe,KAAoB,EAAS,GAAa,IAAI,OAAO,KAAK,OAAO,EAGjF,KAAmB,GAAkB,MAAU,EAAM,iBAAiB,EACtE,IAAmB,GAAkB,MAAU,EAAM,iBAAiB,EACtE,IAAoB,GAAkB,MAAU,EAAM,kBAAkB,EAGxE,EAAE,YAAS,UAAO,kBAAe,mBAAgB,oBAAiB,GAAsB;EAC5F;EACA,WAAW;EACZ,CAAC;AAGF,UAAgB;AACd,EAAI,KACF,EAAc,EAAW,CAAC,MAAM,MAAW;AACzC,GAAI,KACF,EAAY,EAAO;IAErB;IAEH,CAAC,GAAY,EAAc,CAAC;CAG/B,IAAM,IAAa,QAAkB;AACnC,IAAS,aAAa;IACrB,CAAC,EAAS,CAAC,EAER,IAAa,QAAkB;AACnC,IAAS,cAAc,EAAW,OAAO;IACxC,CAAC,GAAU,EAAW,CAAC,EAEpB,KAAoB,QAAkB;AAC1C,EAAI,KACF,EAAiB,EAAS;IAE3B,CAAC,GAAU,EAAiB,CAAC,EAE1B,KAAsB,EAAY,YAAY;AAClD,EAAI,MACc,MAAM,EAAe,EAAS,GAAG,IAE3C,GAAU,IAAO,EAAa,UAAU,EAC5C,GAAmB,EACnB,EAAS,aAAa,IACb,GAAU,IACd,EAAa,QAAQ;IAG7B;EAAC;EAAU;EAAgB;EAAmB;EAAS,CAAC,EAErD,KAAmB,GACtB,MAAqB;AACpB,IAAS,eAAe,EAAU,WAAW,IAAW;IAE1D,CAAC,GAAU,EAAU,CACtB,EAEK,KAAa,EAAY,YAAY;AACpC,QAEL,KAAI;GACF,IAAM,IAAS,MAAM,EAAa;IAChC,YAAY,EAAS;IACrB,WAAW;IACZ,CAAC;AACF,GAAI,KACF,GAAc,EAAO;UAEjB;IAIP;EAAC;EAAU;EAAc;EAAU,CAAC;AAGvC,KAAI,KAAW,CAAC,EACd,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;GAAkD,MAAK;aAAtE,CACE,kBAAC,IAAD,EAAS,OAAO;IAAE,QAAQ;IAAuB,OAAO;IAAuB,EAAI,CAAA,EACnF,kBAAC,KAAD;IAAG,WAAU;cACV,EAAE,qCAAqC,sBAAsB;IAC5D,CAAA,CACA;;EACF,CAAA;AAKV,KAAI,CAAC,MAAsB,CAAC,EAC1B,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,iDAAiD,gBAAgB;EAC1E,aAAa,EACX,2DACA,mDACD;EACD,CAAA;AAKN,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,MAAK;GACL,cAAc;GACd,OAAO,EAAE,uCAAuC,0BAA0B;GAC1E,aAAa,EAAM;GACnB,MAAM,kBAAC,GAAD,EAAW,WAAU,uBAAwB,CAAA;GACnD,SACE,kBAAC,GAAD;IAAQ,SAAS;IAAY,WAAW;cACrC,EAAE,gDAAgD,oBAAoB;IAChE,CAAA;GAEX,eAAY;aAEZ,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAEvC,CAAA;GACI,CAAA;EACN,CAAA;AAKV,KAAI,CAAC,EACH,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,MAAK;GACL,cAAc;GACd,OAAO,EAAE,2CAA2C,qBAAqB;GACzE,aAAa,EACX,iDACA,qEACD;GACD,MAAM,kBAAC,GAAD,EAAW,WAAU,uBAAwB,CAAA;GACnD,SACE,kBAAC,GAAD;IAAQ,SAAS;IAAY,WAAW;cACrC,EAAE,gDAAgD,oBAAoB;IAChE,CAAA;GAEX,eAAY;GACZ,CAAA;EACE,CAAA;CAIV,IAAM,IAAa,EAAS,QAAQ,UAAU,GACxC,IAAa,GAAY,WAAW,aAGpC,KACJ,kBAAC,GAAD;EACE,UAAU,IAAgB,aAAa;EACvC,cAAc;EACd,OAAO,EAAE,2CAA2C,+BAA+B,EAAE,OAAO,GAAY,CAAC;EACzG,aAAY;EACZ,eAAY;YAEX,MAAe,IACd,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,2CAA2C,oBAAoB;GACxE,aAAa,EAAE,iDAAiD,0CAA0C;GAC1G,QACE,kBAAC,GAAD;IAAQ,SAAQ;IAAY,SAAS;IAAY,UAAU,CAAC;IAAW,WAAW;cAAlF,CACE,kBAAC,GAAD,EAAU,WAAU,uBAAwB,CAAA,EAC3C,EAAE,qCAAqC,OAAO,CACxC;;GAEX,CAAA,GAEF,kBAAC,MAAD;GAAI,WAAU;cACV,EAAS,UAAU,EAAE,EAAE,KAAK,GAAsB,MAClD,kBAAC,MAAD;IAAmB,WAAU;cAA7B,CAGE,kBAAC,OAAD;KACE,eAAY;KACZ,gBAAc,EAAM;KACpB,WAAW,gDACT,EAAM,UACF,wCACA;eANR;MASE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,QAAD;UACE,eAAY;UACZ,WAAU;oBAET,IAAQ;UACJ,CAAA;SACP,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAM,cACL,EAAE,+CAA+C,oBAAoB,EAAE,QAAQ,IAAQ,GAAG,CAAC;UAC1F,CAAA;SACJ,EAAM,cACL,kBAAC,QAAD;UAAM,WAAU;oBACb,EAAM,WAAW,aAAa;UAC1B,CAAA;SAEL;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,IAAD,EAAiB,UAAU,EAAM,SAAW,CAAA,EAC3C,CAAC,EAAM,WACN,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAE,2CAA2C,WAAW;SACpD,CAAA,CAEL;UACF;;MAEN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,QAAD;SAAM,WAAU;mBAAkB;SAAY,CAAA;QAC9C,kBAAC,QAAD;SAAM,WAAW;mBAAW,EAAM;SAAgB,CAAA;QAClD,kBAAC,GAAD,EAAgB,WAAU,oBAAqB,CAAA;QAC/C,kBAAC,QAAD;SAAM,WAAU;mBAAkB;SAAa,CAAA;QAC/C,kBAAC,QAAD;SAAM,WAAW;mBAAW,EAAM;SAAiB,CAAA;QAC/C;;MAEL,EAAM,eAAe,kBAAC,KAAD;OAAG,WAAU;iBAAoC,EAAM;OAAgB,CAAA;MAE5F,EAAM,YACL,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,GAAiB,EAAM,SAAS;OAC/C,WAAW;iBAEV,EAAE,wCAAwC,cAAc;OAClD,CAAA;MAEP;QAIL,IAAQ,IAAa,KACpB,kBAAC,QAAD;KAAM,eAAY;KAAO,WAAU;eACjC,kBAAC,GAAD,EAAgB,WAAU,iDAAkD,CAAA;KACvE,CAAA,CAEN;MApEI,EAAM,GAoEV,CACL;GACC,CAAA;EAEC,CAAA,EAIN,KAAc,IAClB,kBAAC,GAAD;EACE,IAAG;EACH,UAAS;EACT,cAAc;EACd,OAAO,EAAE,8CAA8C,gBAAgB;EACvE,aAAY;EACZ,SACE,kBAAC,GAAD;GAAQ,SAAS;GAAY,UAAU,KAAW,CAAC;GAAS,WAAW;aAAvE,CACE,kBAAC,GAAD,EAAU,WAAU,uBAAwB,CAAA,EAC3C,IACG,EAAE,yCAAyC,aAAa,GACxD,EAAE,qCAAqC,WAAW,CAC/C;;EAEX,eAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,SAAD;KAAO,SAAS;KAAa,WAAU;eACpC,EAAE,4CAA4C,aAAa;KACtD,CAAA,EACR,kBAAC,YAAD;KACE,IAAI;KACJ,OAAO;KACP,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;KAC7C,YAAY;KACZ,WAAW,gJAAgJ;KAC3J,aAAY;KACZ,CAAA,CACE;OAEL,KACC,kBAAC,GAAD;IACE,MAAM,IAAa,YAAY;IAC/B,cAAc;IACd,OACE,IACI,EAAE,wCAAwC,cAAc,GACxD,EAAE,wCAAwC,cAAc;IAE9D,MACe,EAAb,IAAc,KAAgD,GAAjD,EAAW,WAAU,uBAAwB,CAAgD;IAE5G,MACE,EAAW,uBACT,kBAAC,QAAD;KAAM,WAAW;eAAjB,CAA6B,EAAW,sBAAqB,KAAS;SACpE;IAEN,eAAY;cAEZ,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAE,yCAAyC,SAAS;OAClD,CAAA,EACL,kBAAC,OAAD;OAAK,WAAU;iBACZ,KAAK,UAAU,EAAW,YAAY,MAAM,EAAE,IAAI;OAC/C,CAAA,CACF;SAEL,EAAW,SACV,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAE,wCAAwC,QAAQ;OAChD,CAAA,EACL,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAW;OACR,CAAA,CACF;QAEJ;;IACE,CAAA,CAER;;EACE,CAAA,GACR;AAEJ,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAA,UAAA;GAEE,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAQ,SAAQ;OAAQ,MAAK;OAAK,SAAS;OAAY,WAAU;iBAAjE,CACE,kBAAC,GAAD,EAAU,WAAU,uBAAwB,CAAA,EAC3C,EAAE,gDAAgD,oBAAoB,CAChE;;MACT,kBAAC,OAAD;OAAK,WAAU;iBAAf,CAIE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAS;QACP,CAAA,EACL,kBAAC,GAAD,EAAqB,QAAQ,EAAS,QAAU,CAAA,CAC5C;;MACL,EAAS,eAAe,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAS;OAAgB,CAAA;MAC1F;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,eAAe,EAAiB,CAAC,EAAc;OAC/C,UAAU,CAAC;OACX,iBAAe;OACf,iBAAc;OACd,WAAW;iBALb,CAOE,kBAAC,GAAD,EAAU,WAAU,uBAAwB,CAAA,EAC3C,EAAE,qCAAqC,OAAO,CACxC;;MACT,kBAAC,GAAD;OAAQ,SAAQ;OAAY,SAAS;OAAY,UAAU,CAAC;OAAW,WAAW;iBAAlF,CACE,kBAAC,GAAD,EAAU,WAAU,uBAAwB,CAAA,EAC3C,EAAE,qCAAqC,OAAO,CACxC;;MACR,KACC,kBAAC,GAAD;OAAQ,SAAQ;OAAc,SAAS;OAAmB,WAAW;iBAArE,CACE,kBAAC,GAAD,EAAY,WAAU,uBAAwB,CAAA,EAC7C,EAAE,uCAAuC,SAAS,CAC5C;;MAEP;OACC;;GAET,kBAAC,IAAD;IAAa,WAAU;cACpB,EACC,qCACA,0NACD;IACW,CAAA;GAEd,kBAAC,IAAD;IACE,YAAW;IACX,OAAO;KACL,GAAI,IACA,CACE;MACE,IAAI;MACJ,OAAO,EAAE,+CAA+C,yBAAyB;MACjF,aAAa,EACX,qDACA,0DACD;MACD,eAAe,EAAiB,GAAK;MACtC,CACF,GACD,EAAE;KACN,GAAI,IACA,CACE;MACE,IAAI;MACJ,OAAO,EAAE,+CAA+C,kBAAkB;MAC1E,aAAa,EACX,qDACA,2DACD;MACD,SAAS;MACV,CACF,GACD,EAAE;KACN;MACE,IAAI;MACJ,OAAO,EAAE,gDAAgD,8BAA8B;MACvF,aAAa,EACX,sDACA,sCACD;MACD,eAAe,EAAS,aAAa;MACtC;KACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAA,UAAA,CACG,IACA,GACY,EAAA,CAAA;KACX,CAAA,EAGN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MACE,UAAS;MACT,cAAc;MACd,OAAO,EAAE,4CAA4C,UAAU;MAC/D,eAAY;gBAEZ,kBAAC,MAAD;OAAI,WAAU;iBAAd,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAE,0CAA0C,SAAS;UACnD,CAAA,EACL,kBAAC,MAAD;UAAI,WAAU;oBACZ,kBAAC,GAAD;WAAqB,QAAQ,EAAS;WAAQ,MAAK;WAAO,CAAA;UACvD,CAAA,CACD,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAE,0CAA0C,SAAS;UACnD,CAAA,EACL,kBAAC,MAAD;UAAI,WAAU;oBAAqB;UAAgB,CAAA,CAC/C,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAE,gDAAgD,gBAAgB;UAChE,CAAA,EACL,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAS,iBACN,IAAI,KAAK,EAAS,eAAe,CAAC,eAAe,KAAA,GAAW;WAC1D,WAAW;WACX,WAAW;WACZ,CAAC,GACF,EAAE,yCAAyC,QAAQ;UACpD,CAAA,CACD,EAAA,CAAA;SACF;WAIN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAE,2CAA2C,UAAU;UACrD,CAAA,EACL,kBAAC,MAAD;UAAI,WAAU;oBAAqB,EAAS;UAAa,CAAA,CACrD,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAE,2CAA2C,UAAU;UACrD,CAAA,EACL,kBAAC,MAAD;UAAI,WAAU;oBACX,IAAI,KAAK,EAAS,UAAU,CAAC,eAAe,KAAA,GAAW;WACtD,WAAW;WACX,WAAW;WACZ,CAAC;UACC,CAAA,CACD,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAE,2CAA2C,UAAU;UACrD,CAAA,EACL,kBAAC,MAAD;UAAI,WAAU;oBACX,IAAI,KAAK,EAAS,UAAU,CAAC,eAAe,KAAA,GAAW;WACtD,WAAW;WACX,WAAW;WACZ,CAAC;UACC,CAAA,CACD,EAAA,CAAA;SACF;UACH;;MACG,CAAA,EACG,CAAA;KACX,CAAA,CACF;;GACO,EAAA,CAAA,EAGd,KACC,kBAAC,IAAD;GACY;GACV,QAAQ;GACR,SAAS;GACT,WAAW;GACX,CAAA,CAEA;;EAER"}
@@ -1,24 +1,24 @@
1
1
  import { usePipelineStore as e } from "../store/pipelineStore.js";
2
2
  import { useAppNavigate as t } from "../contexts/NavigationContext.js";
3
3
  import "../contexts/index.js";
4
- import { SECTION_FOCUS_RING as n, sectionSurfaceClasses as r } from "../components/common/sectionStyles.js";
5
- import { Section as i, SectionStack as a } from "../components/common/Section.js";
4
+ import { SECTION_FOCUS_RING as n, sectionSurfaceClasses as ee } from "../components/common/sectionStyles.js";
5
+ import { Section as r, SectionStack as i } from "../components/common/Section.js";
6
6
  import "../components/common/index.js";
7
- import o from "../hooks/usePipelineOperations.js";
8
- import { BIGCONSOLE_PERMISSIONS as s } from "../../constants/permissions.js";
9
- import { isNative as c, nativeNotify as l } from "../../utils/nativeBridge.js";
10
- import u from "../components/pipeline/PipelineDeleteDialog.js";
11
- import d from "../components/pipeline/PipelineCard.js";
12
- import { memo as f, useCallback as p, useMemo as m, useState as h } from "react";
13
- import { AccessDenied as g, PermissionButton as _ } from "@burdenoff/fe-libs/shared/components";
14
- import { usePermissions as v } from "@burdenoff/fe-libs/shared/providers/shell";
15
- import { AlertCircle as y, GitBranch as b, Plus as x, Search as ee } from "lucide-react";
16
- import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
17
- import { AuroraBackground as C, Button as w, GradientText as T, IllustratedEmptyState as E, Input as D, PagePurpose as te, Spinner as O } from "@burdenoff/fe-libs/ui";
18
- import { jsx as k, jsxs as A } from "react/jsx-runtime";
7
+ import a from "../hooks/usePipelineOperations.js";
8
+ import { BIGCONSOLE_PERMISSIONS as o } from "../../constants/permissions.js";
9
+ import { isNative as s, nativeNotify as c } from "../../utils/nativeBridge.js";
10
+ import l from "../components/pipeline/PipelineDeleteDialog.js";
11
+ import u from "../components/pipeline/PipelineCard.js";
12
+ import { memo as d, useCallback as f, useMemo as p, useState as m } from "react";
13
+ import { AccessDenied as h, PermissionButton as g } from "@burdenoff/fe-libs/shared/components";
14
+ import { usePermissions as _ } from "@burdenoff/fe-libs/shared/providers/shell";
15
+ import { AlertCircle as v, GitBranch as y, Plus as b, Search as te } from "lucide-react";
16
+ import { AuroraBackground as x, Button as S, GradientText as C, IllustratedEmptyState as w, Input as T, PagePurpose as E, Spinner as D } from "@burdenoff/fe-libs/ui";
17
+ import { jsx as O, jsxs as k } from "react/jsx-runtime";
18
+ import { useI18n as A } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
19
19
  //#region src/bigconsole/pages/PipelinesPage.tsx
20
- var j = f(function() {
21
- let f = t(), { t: j } = S(), { hasPermission: M, isLoading: N } = v(), P = M(s.PIPELINE_READ), F = M(s.PIPELINE_UPDATE), I = M(s.PIPELINE_DELETE), L = M(s.PIPELINE_TEST), [R, z] = h("all"), B = e((e) => e.searchQuery), V = e((e) => e.setSearchQuery), H = e((e) => e.deleteDialogOpen), U = e((e) => e.currentPipeline), W = e((e) => e.openDeleteDialog), G = e((e) => e.closeDeleteDialog), { loading: K, error: q, pipelines: J, deletePipeline: Y, refetch: X } = o({ consoleId: "default" }), Z = m(() => {
20
+ var j = d(function() {
21
+ let d = t(), { t: j } = A(), { hasPermission: M, isLoading: N } = _(), P = M(o.PIPELINE_READ), F = M(o.PIPELINE_UPDATE), I = M(o.PIPELINE_DELETE), L = M(o.PIPELINE_TEST), [R, z] = m("all"), B = e((e) => e.searchQuery), V = e((e) => e.setSearchQuery), H = e((e) => e.deleteDialogOpen), U = e((e) => e.currentPipeline), W = e((e) => e.openDeleteDialog), G = e((e) => e.closeDeleteDialog), { loading: K, error: q, pipelines: J, deletePipeline: Y, refetch: X } = a({ consoleId: "default" }), Z = p(() => {
22
22
  let e = [...J];
23
23
  if (R !== "all" && (e = e.filter((e) => e.status === R)), B.trim()) {
24
24
  let t = B.toLowerCase();
@@ -29,23 +29,23 @@ var j = f(function() {
29
29
  J,
30
30
  R,
31
31
  B
32
- ]), Q = p(() => {
33
- f("/pipelines/new");
34
- }, [f]), ne = p((e) => {
35
- f(`/pipelines/${e}`);
36
- }, [f]), re = p((e) => {
37
- f(`/pipelines/${e}/edit`);
38
- }, [f]), ie = p((e) => {
39
- f(`/pipelines/${e}?test=true`);
40
- }, [f]), ae = p((e) => {
32
+ ]), Q = f(() => {
33
+ d("/pipelines/new");
34
+ }, [d]), ne = f((e) => {
35
+ d(`/pipelines/${e}`);
36
+ }, [d]), re = f((e) => {
37
+ d(`/pipelines/${e}/edit`);
38
+ }, [d]), ie = f((e) => {
39
+ d(`/pipelines/${e}?test=true`);
40
+ }, [d]), ae = f((e) => {
41
41
  let t = J.find((t) => t.id === e);
42
42
  t && W(t);
43
- }, [J, W]), oe = p(async () => {
43
+ }, [J, W]), oe = f(async () => {
44
44
  if (U) {
45
45
  try {
46
- await Y(U.id), c() && l("success");
46
+ await Y(U.id), s() && c("success");
47
47
  } catch (e) {
48
- throw c() && l("error"), e;
48
+ throw s() && c("error"), e;
49
49
  }
50
50
  G();
51
51
  }
@@ -53,7 +53,7 @@ var j = f(function() {
53
53
  U,
54
54
  Y,
55
55
  G
56
- ]), se = p(() => {
56
+ ]), se = f(() => {
57
57
  z("all"), V("");
58
58
  }, [V]), ce = [
59
59
  {
@@ -77,30 +77,30 @@ var j = f(function() {
77
77
  label: j("bigconsole.pipelines.filters.error", "Error")
78
78
  }
79
79
  ];
80
- if (N) return /* @__PURE__ */ k("div", {
80
+ if (N) return /* @__PURE__ */ O("div", {
81
81
  style: {
82
82
  display: "flex",
83
83
  alignItems: "center",
84
84
  justifyContent: "center",
85
85
  padding: "80px 0"
86
86
  },
87
- children: /* @__PURE__ */ k(O, { style: {
87
+ children: /* @__PURE__ */ O(D, { style: {
88
88
  height: "var(--size-icon-xl)",
89
89
  width: "var(--size-icon-xl)"
90
90
  } })
91
91
  });
92
- if (!P) return /* @__PURE__ */ k(g, {
92
+ if (!P) return /* @__PURE__ */ O(h, {
93
93
  title: j("bigconsole.pipelines.errors.accessDeniedTitle", "Access Denied"),
94
94
  description: j("bigconsole.pipelines.errors.accessDeniedListDescription", "You don't have permission to view pipelines.")
95
95
  });
96
- let $ = /* @__PURE__ */ A("header", {
96
+ let $ = /* @__PURE__ */ k("header", {
97
97
  className: "relative overflow-hidden border-b border-[var(--color-border-seam)] bg-[image:var(--gradient-gloss-card)]",
98
- children: [/* @__PURE__ */ k(C, { intensity: "subtle" }), /* @__PURE__ */ A("div", {
98
+ children: [/* @__PURE__ */ O(x, { intensity: "subtle" }), /* @__PURE__ */ k("div", {
99
99
  className: "flex flex-col gap-form-gap sm:flex-row sm:items-center sm:justify-between",
100
100
  style: { padding: "var(--space-pagePadding)" },
101
- children: [/* @__PURE__ */ A("div", {
101
+ children: [/* @__PURE__ */ k("div", {
102
102
  className: "flex min-w-0 items-center gap-form-gap",
103
- children: [/* @__PURE__ */ k("span", {
103
+ children: [/* @__PURE__ */ O("span", {
104
104
  "aria-hidden": "true",
105
105
  className: "flex shrink-0 items-center justify-center rounded-card",
106
106
  style: {
@@ -108,77 +108,77 @@ var j = f(function() {
108
108
  width: "var(--size-controlHeight-lg)",
109
109
  backgroundColor: "var(--color-action-primary-bg)"
110
110
  },
111
- children: /* @__PURE__ */ k(b, { style: {
111
+ children: /* @__PURE__ */ O(y, { style: {
112
112
  height: "var(--size-icon-lg)",
113
113
  width: "var(--size-icon-lg)",
114
114
  color: "var(--color-action-primary-text)"
115
115
  } })
116
- }), /* @__PURE__ */ A("div", {
116
+ }), /* @__PURE__ */ k("div", {
117
117
  className: "min-w-0",
118
- children: [/* @__PURE__ */ k("h1", {
118
+ children: [/* @__PURE__ */ O("h1", {
119
119
  className: "text-2xl font-bold leading-tight text-text-primary",
120
- children: /* @__PURE__ */ k(T, { children: j("bigconsole.pipelines.list.heading", "Pipelines") })
121
- }), /* @__PURE__ */ k("p", {
120
+ children: /* @__PURE__ */ O(C, { children: j("bigconsole.pipelines.list.heading", "Pipelines") })
121
+ }), /* @__PURE__ */ O("p", {
122
122
  className: "text-sm text-text-secondary",
123
123
  children: j("bigconsole.pipelines.list.subtitle", "Create and manage sequential parser chains for data transformation")
124
124
  })]
125
125
  })]
126
- }), /* @__PURE__ */ k(_, {
127
- permission: s.PIPELINE_CREATE,
126
+ }), /* @__PURE__ */ O(g, {
127
+ permission: o.PIPELINE_CREATE,
128
128
  deniedBehavior: "disable",
129
- children: /* @__PURE__ */ A(w, {
129
+ children: /* @__PURE__ */ k(S, {
130
130
  onClick: Q,
131
131
  className: "w-full shrink-0 min-h-[var(--size-controlHeight-md)] sm:w-auto",
132
- children: [/* @__PURE__ */ k(x, { className: "h-icon-sm w-icon-sm" }), j("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
132
+ children: [/* @__PURE__ */ O(b, { className: "h-icon-sm w-icon-sm" }), j("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
133
133
  })
134
134
  })]
135
135
  })]
136
136
  });
137
- return q ? /* @__PURE__ */ A("div", {
137
+ return q ? /* @__PURE__ */ k("div", {
138
138
  className: "min-h-screen bg-bg-canvas",
139
- children: [$, /* @__PURE__ */ k("div", {
139
+ children: [$, /* @__PURE__ */ O("div", {
140
140
  style: { padding: "var(--space-pagePadding)" },
141
- children: /* @__PURE__ */ k(i, {
141
+ children: /* @__PURE__ */ O(r, {
142
142
  tone: "danger",
143
143
  headingLevel: 2,
144
144
  title: j("bigconsole.pipelines.errors.loadListTitle", "Failed to load Pipelines"),
145
145
  description: q.message,
146
- icon: /* @__PURE__ */ k(y, { className: "h-icon-sm w-icon-sm" }),
147
- actions: /* @__PURE__ */ k(w, {
146
+ icon: /* @__PURE__ */ O(v, { className: "h-icon-sm w-icon-sm" }),
147
+ actions: /* @__PURE__ */ O(S, {
148
148
  size: "sm",
149
149
  onClick: () => X(),
150
150
  children: j("bigconsole.pipelines.actions.tryAgain", "Try Again")
151
151
  }),
152
152
  "data-testid": "pipelines-error",
153
- children: /* @__PURE__ */ k("p", {
153
+ children: /* @__PURE__ */ O("p", {
154
154
  className: "text-sm text-text-secondary",
155
155
  children: "Nothing was changed. Retry once the console service is reachable again."
156
156
  })
157
157
  })
158
158
  })]
159
- }) : /* @__PURE__ */ A("div", {
159
+ }) : /* @__PURE__ */ k("div", {
160
160
  className: "min-h-screen bg-bg-canvas",
161
161
  children: [
162
162
  $,
163
- /* @__PURE__ */ k("div", {
163
+ /* @__PURE__ */ O("div", {
164
164
  style: { padding: "var(--space-pagePadding)" },
165
- children: /* @__PURE__ */ A(a, { children: [
166
- /* @__PURE__ */ k(te, {
165
+ children: /* @__PURE__ */ k(i, { children: [
166
+ /* @__PURE__ */ O(E, {
167
167
  className: "max-w-[75ch]",
168
168
  children: j("bigconsole.pipelines.list.purpose", "Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into clean, queryable data your dashboards can use.")
169
169
  }),
170
- /* @__PURE__ */ k("section", {
170
+ /* @__PURE__ */ O("section", {
171
171
  "aria-label": "Filter and search pipelines",
172
172
  "data-testid": "pipelines-toolbar",
173
173
  "data-section-emphasis": "bare",
174
- className: r("bare", "neutral", "none"),
175
- children: /* @__PURE__ */ A("div", {
174
+ className: ee("bare", "neutral", "none"),
175
+ children: /* @__PURE__ */ k("div", {
176
176
  className: "flex flex-col gap-control-gap md:flex-row md:items-center md:justify-between",
177
- children: [/* @__PURE__ */ k("div", {
177
+ children: [/* @__PURE__ */ O("div", {
178
178
  role: "group",
179
179
  "aria-label": "Filter by status",
180
180
  className: "flex min-w-0 max-w-full items-center gap-1 overflow-x-auto rounded-card bg-bg-sunken p-1",
181
- children: ce.map((e) => /* @__PURE__ */ k("button", {
181
+ children: ce.map((e) => /* @__PURE__ */ O("button", {
182
182
  type: "button",
183
183
  "aria-pressed": R === e.value,
184
184
  onClick: () => z(e.value),
@@ -194,9 +194,9 @@ var j = f(function() {
194
194
  },
195
195
  children: e.label
196
196
  }, e.value))
197
- }), /* @__PURE__ */ A("div", {
197
+ }), /* @__PURE__ */ k("div", {
198
198
  className: "relative w-full md:max-w-[320px]",
199
- children: [/* @__PURE__ */ k(ee, {
199
+ children: [/* @__PURE__ */ O(te, {
200
200
  "aria-hidden": "true",
201
201
  style: {
202
202
  position: "absolute",
@@ -207,7 +207,7 @@ var j = f(function() {
207
207
  width: "var(--size-icon-sm)",
208
208
  color: "var(--color-text-muted)"
209
209
  }
210
- }), /* @__PURE__ */ k(D, {
210
+ }), /* @__PURE__ */ O(T, {
211
211
  type: "text",
212
212
  "aria-label": j("bigconsole.pipelines.list.searchPlaceholder", "Search pipelines..."),
213
213
  placeholder: j("bigconsole.pipelines.list.searchPlaceholder", "Search pipelines..."),
@@ -221,57 +221,57 @@ var j = f(function() {
221
221
  })]
222
222
  })
223
223
  }),
224
- /* @__PURE__ */ A(i, {
224
+ /* @__PURE__ */ k(r, {
225
225
  emphasis: "primary",
226
226
  headingLevel: 2,
227
227
  title: "Your pipelines",
228
228
  description: "Open one to review its stages, or run a quick test against sample input.",
229
- meta: !K || J.length > 0 ? /* @__PURE__ */ A("span", {
229
+ meta: !K || J.length > 0 ? /* @__PURE__ */ k("span", {
230
230
  className: "rounded-pill bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
231
231
  children: [Z.length, Z.length === J.length ? "" : ` of ${J.length}`]
232
232
  }) : null,
233
233
  "data-testid": "pipelines-results",
234
234
  children: [
235
- K && J.length === 0 && /* @__PURE__ */ k("div", {
235
+ K && J.length === 0 && /* @__PURE__ */ O("div", {
236
236
  className: "flex items-center justify-center py-12",
237
237
  role: "status",
238
- children: /* @__PURE__ */ A("div", {
238
+ children: /* @__PURE__ */ k("div", {
239
239
  className: "text-center",
240
- children: [/* @__PURE__ */ k(O, { style: {
240
+ children: [/* @__PURE__ */ O(D, { style: {
241
241
  height: "var(--size-icon-xl)",
242
242
  width: "var(--size-icon-xl)",
243
243
  margin: "0 auto var(--space-formGap)"
244
- } }), /* @__PURE__ */ k("p", {
244
+ } }), /* @__PURE__ */ O("p", {
245
245
  className: "text-sm text-text-muted",
246
246
  children: j("bigconsole.pipelines.list.loading", "Loading pipelines...")
247
247
  })]
248
248
  })
249
249
  }),
250
- !K && J.length === 0 && /* @__PURE__ */ k("div", {
250
+ !K && J.length === 0 && /* @__PURE__ */ O("div", {
251
251
  "data-testid": "pipelines-empty",
252
- children: /* @__PURE__ */ k(E, {
252
+ children: /* @__PURE__ */ O(w, {
253
253
  illustration: "empty-data",
254
254
  title: j("bigconsole.pipelines.list.emptyTitle", "No Pipelines yet"),
255
255
  description: j("bigconsole.pipelines.list.emptyDescription", "Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage."),
256
- action: /* @__PURE__ */ k(_, {
257
- permission: s.PIPELINE_CREATE,
256
+ action: /* @__PURE__ */ O(g, {
257
+ permission: o.PIPELINE_CREATE,
258
258
  deniedBehavior: "disable",
259
- children: /* @__PURE__ */ A(w, {
259
+ children: /* @__PURE__ */ k(S, {
260
260
  onClick: Q,
261
261
  className: "min-h-[var(--size-controlHeight-md)]",
262
- children: [/* @__PURE__ */ k(x, { className: "h-icon-sm w-icon-sm" }), j("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
262
+ children: [/* @__PURE__ */ O(b, { className: "h-icon-sm w-icon-sm" }), j("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
263
263
  })
264
264
  })
265
265
  })
266
266
  }),
267
- !K && Z.length === 0 && J.length > 0 && /* @__PURE__ */ k(i, {
267
+ !K && Z.length === 0 && J.length > 0 && /* @__PURE__ */ O(r, {
268
268
  emphasis: "muted",
269
269
  tone: "info",
270
270
  padding: "compact",
271
271
  headingLevel: 3,
272
272
  title: j("bigconsole.pipelines.list.noResultsTitle", "No matching pipelines"),
273
273
  description: j("bigconsole.pipelines.list.noResultsDescription", "No pipelines match your filters"),
274
- actions: /* @__PURE__ */ k(w, {
274
+ actions: /* @__PURE__ */ O(S, {
275
275
  size: "sm",
276
276
  variant: "secondary",
277
277
  onClick: se,
@@ -279,9 +279,9 @@ var j = f(function() {
279
279
  }),
280
280
  "data-testid": "pipelines-no-results"
281
281
  }),
282
- Z.length > 0 && /* @__PURE__ */ k("div", {
282
+ Z.length > 0 && /* @__PURE__ */ O("div", {
283
283
  className: "grid grid-cols-1 gap-form-gap sm:grid-cols-2 xl:grid-cols-3",
284
- children: Z.map((e) => /* @__PURE__ */ k(d, {
284
+ children: Z.map((e) => /* @__PURE__ */ O(u, {
285
285
  pipeline: e,
286
286
  onView: ne,
287
287
  onEdit: F ? re : void 0,
@@ -293,7 +293,7 @@ var j = f(function() {
293
293
  })
294
294
  ] })
295
295
  }),
296
- U && /* @__PURE__ */ k(u, {
296
+ U && /* @__PURE__ */ O(l, {
297
297
  pipeline: U,
298
298
  isOpen: H,
299
299
  onClose: G,