@burdenoff/microfe-bigconsole 2026.805.3 → 2026.812.2
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/components/DrilldownDashboardRenderer.js +118 -106
- package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
- package/dist/bigconsole/components/DrilldownModal.js +54 -50
- package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
- package/dist/bigconsole/components/builder/BuilderCanvas.js +2 -2
- package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -1
- package/dist/bigconsole/components/builder/BuilderTopbar.js +3 -3
- package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +24 -25
- package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +40 -29
- package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +135 -97
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/GeneralSection.js +58 -44
- package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -1
- package/dist/bigconsole/components/common/Section.js +70 -0
- package/dist/bigconsole/components/common/Section.js.map +1 -0
- package/dist/bigconsole/components/common/index.js +2 -0
- package/dist/bigconsole/components/common/sectionStyles.js +42 -0
- package/dist/bigconsole/components/common/sectionStyles.js.map +1 -0
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +209 -193
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +213 -231
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardGrid.js +12 -18
- package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +109 -102
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -70
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +125 -159
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +25 -23
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +3 -3
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +5 -3
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +170 -284
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +147 -151
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/LiveBoardBanner.js +45 -53
- package/dist/bigconsole/components/dashboard/LiveBoardBanner.js.map +1 -1
- package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +157 -148
- package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +17 -8
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
- package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
- package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
- package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -231
- package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +29 -29
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
- package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
- package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -56
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -65
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
- package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
- package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
- package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
- package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +263 -243
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
- package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
- package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
- package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +33 -26
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
- package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
- package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
- package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
- package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
- package/dist/bigconsole/components/parser/DataSinkSelector.js +154 -123
- package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
- package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
- package/dist/bigconsole/components/parser/ImportParserDialog.js +235 -275
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserCard.js +133 -114
- package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.js +191 -174
- package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
- package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
- package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
- package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
- package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
- package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
- package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -106
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -152
- package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
- package/dist/bigconsole/components/preview/previewShared.js +41 -23
- package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +342 -308
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +262 -238
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +783 -867
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
- package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
- package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetRegistry.js +4 -4
- package/dist/bigconsole/components/widgets/WidgetRegistry.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
- package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
- package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
- package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +2 -2
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js +11 -5
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js +19 -15
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +154 -102
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/CircularGauge.js +36 -32
- package/dist/bigconsole/components/widgets/gauge/CircularGauge.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +85 -60
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +64 -35
- package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/LinearGauge.js +46 -45
- package/dist/bigconsole/components/widgets/gauge/LinearGauge.js.map +1 -1
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +35 -24
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
- package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +153 -90
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/list/ListConfig.js +8 -2
- package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
- package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +14 -4
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +112 -89
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +21 -13
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/index.js +4 -4
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +3 -3
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +34 -25
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/progress/ProgressWidget.js +129 -114
- package/dist/bigconsole/components/widgets/progress/ProgressWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +3 -3
- package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/states/EmptyState.js +6 -4
- package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
- package/dist/bigconsole/components/widgets/states/ErrorState.js +7 -5
- package/dist/bigconsole/components/widgets/states/ErrorState.js.map +1 -1
- package/dist/bigconsole/components/widgets/states/LoadingState.js +5 -4
- package/dist/bigconsole/components/widgets/states/LoadingState.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableConfig.js +10 -4
- package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableHeader.js +1 -1
- package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableWidget.js +1 -1
- package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
- package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
- package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
- package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
- package/dist/bigconsole/components/widgets/utils/targetProgress.js +13 -0
- package/dist/bigconsole/components/widgets/utils/targetProgress.js.map +1 -0
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +112 -85
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
- package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
- package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
- package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
- package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
- package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
- package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +6 -4
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +360 -338
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
- package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
- package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
- package/dist/bigconsole/pages/DashboardBuilderPage.js +209 -203
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +126 -120
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +838 -800
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +263 -315
- package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +301 -341
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +346 -339
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinksPage.js +356 -458
- package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSourcesPage.js +7 -2
- package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
- package/dist/bigconsole/pages/HomePage.js +186 -193
- package/dist/bigconsole/pages/HomePage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +887 -740
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +679 -637
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +368 -342
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +537 -444
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +412 -377
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +248 -298
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +251 -153
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +381 -371
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +171 -286
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuilderCanvas.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderCanvas.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\n\nexport interface BuilderCanvasProps {\n palette?: ReactNode;\n canvas: ReactNode;\n inspector?: ReactNode;\n}\n\n
|
|
1
|
+
{"version":3,"file":"BuilderCanvas.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderCanvas.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\n\nexport interface BuilderCanvasProps {\n palette?: ReactNode;\n canvas: ReactNode;\n inspector?: ReactNode;\n}\n\n/**\n * Stable pane composition for the builder: palette, canvas, inspector.\n *\n * The three panes sit side by side from `md` up. Below that they stack, because\n * a 300px palette pinned next to a canvas leaves the canvas unusably narrow on a\n * phone (BOFF-5636). The canvas keeps `min-w-0` so a wide widget grid scrolls\n * inside itself instead of pushing the page into horizontal scroll.\n */\nexport const BuilderCanvas: FC<BuilderCanvasProps> = memo(function BuilderCanvas({ palette, canvas, inspector }) {\n return (\n <div\n className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden md:flex-row\"\n data-testid=\"dashboard-editor-panes\"\n >\n {palette}\n <main className=\"relative min-h-0 min-w-0 flex-1 overflow-hidden\">{canvas}</main>\n {inspector}\n </div>\n );\n});\n"],"mappings":";;;AAgBA,IAAa,IAAwC,EAAK,SAAuB,EAAE,YAAS,WAAQ,gBAAa;AAC/G,QACE,kBAAC,OAAD;EACE,WAAU;EACV,eAAY;YAFd;GAIG;GACD,kBAAC,QAAD;IAAM,WAAU;cAAmD;IAAc,CAAA;GAChF;GACG;;EAER"}
|
|
@@ -5,7 +5,7 @@ import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
|
5
5
|
//#region src/bigconsole/components/builder/BuilderTopbar.tsx
|
|
6
6
|
var a = e(function({ title: e, onBack: a, actions: o }) {
|
|
7
7
|
return /* @__PURE__ */ i("header", {
|
|
8
|
-
className: "flex min-h-12 items-center gap-
|
|
8
|
+
className: "flex min-h-12 flex-wrap items-center gap-x-control-gap gap-y-1 border-b border-[var(--color-border-subtle)] bg-bg-surface px-3 py-2",
|
|
9
9
|
children: [
|
|
10
10
|
/* @__PURE__ */ i(n, {
|
|
11
11
|
onClick: a,
|
|
@@ -16,12 +16,12 @@ var a = e(function({ title: e, onBack: a, actions: o }) {
|
|
|
16
16
|
children: [/* @__PURE__ */ r(t, { className: "mr-2 size-4" }), "Back"]
|
|
17
17
|
}),
|
|
18
18
|
/* @__PURE__ */ r("h1", {
|
|
19
|
-
className: "min-w-0 flex-1 truncate text-
|
|
19
|
+
className: "min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-text-primary",
|
|
20
20
|
title: e,
|
|
21
21
|
children: e
|
|
22
22
|
}),
|
|
23
23
|
o && /* @__PURE__ */ r("div", {
|
|
24
|
-
className: "flex flex-shrink-0 items-center gap-2",
|
|
24
|
+
className: "flex flex-shrink-0 flex-wrap items-center gap-2",
|
|
25
25
|
children: o
|
|
26
26
|
})
|
|
27
27
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuilderTopbar.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderTopbar.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nexport interface BuilderTopbarProps {\n title: string;\n onBack: () => void;\n actions?: ReactNode;\n}\n\n
|
|
1
|
+
{"version":3,"file":"BuilderTopbar.js","names":[],"sources":["../../../../src/bigconsole/components/builder/BuilderTopbar.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nexport interface BuilderTopbarProps {\n title: string;\n onBack: () => void;\n actions?: ReactNode;\n}\n\n/**\n * Route-level navigation and identity for the dashboard editor.\n *\n * This is the route's `h1`, so it is set heavier than the section titles below\n * it; previously it was `text-sm`, i.e. lighter than the dashboard title in the\n * toolbar directly beneath, which made two adjacent bars compete (BOFF-5636).\n * The bar is a `bare` structural strip — spacing and a seam, no card surface.\n */\nexport const BuilderTopbar: FC<BuilderTopbarProps> = memo(function BuilderTopbar({ title, onBack, actions }) {\n return (\n <header className=\"flex min-h-12 flex-wrap items-center gap-x-control-gap gap-y-1 border-b border-[var(--color-border-subtle)] bg-bg-surface px-3 py-2\">\n <Button onClick={onBack} variant=\"ghost\" size=\"sm\" title=\"Back to Dashboards\" aria-label=\"Back to Dashboards\">\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n <h1 className=\"min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-text-primary\" title={title}>\n {title}\n </h1>\n {actions && <div className=\"flex flex-shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\n </header>\n );\n});\n"],"mappings":";;;;;AAkBA,IAAa,IAAwC,EAAK,SAAuB,EAAE,UAAO,WAAQ,cAAW;AAC3G,QACE,kBAAC,UAAD;EAAQ,WAAU;YAAlB;GACE,kBAAC,GAAD;IAAQ,SAAS;IAAQ,SAAQ;IAAQ,MAAK;IAAK,OAAM;IAAqB,cAAW;cAAzF,CACE,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EAAA,OAE9B;;GACT,kBAAC,MAAD;IAAI,WAAU;IAA0F;cACrG;IACE,CAAA;GACJ,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAmD;IAAc,CAAA;GACrF;;EAEX"}
|
|
@@ -1,45 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import { Section as e } from "../../common/Section.js";
|
|
2
|
+
import "../../common/index.js";
|
|
3
|
+
import { memo as t } from "react";
|
|
4
|
+
import { Select as n, SelectContent as r, SelectItem as i, SelectTrigger as a, SelectValue as o } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
4
6
|
//#region src/bigconsole/components/builder/inspector/AdvancedSection.tsx
|
|
5
|
-
var
|
|
6
|
-
let
|
|
7
|
-
return /* @__PURE__ */
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
var l = t(function({ renderer: t, rendererOptions: l, onRendererChange: u, templateEditor: d }) {
|
|
8
|
+
let f = l.find((e) => e.value === t);
|
|
9
|
+
return /* @__PURE__ */ c(e, {
|
|
10
|
+
id: "widget-advanced-renderer",
|
|
11
|
+
title: "Renderer",
|
|
12
|
+
description: "Which engine draws this widget's body. Non-native renderers take a JSON template.",
|
|
13
|
+
"data-testid": "widget-inspector-renderer",
|
|
10
14
|
children: [
|
|
11
|
-
/* @__PURE__ */
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
children:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
onValueChange: (e) => l(e),
|
|
19
|
-
children: [/* @__PURE__ */ o(i, {
|
|
20
|
-
className: "h-9 text-sm",
|
|
21
|
-
children: /* @__PURE__ */ o(a, { placeholder: "Select renderer" })
|
|
22
|
-
}), /* @__PURE__ */ o(n, {
|
|
15
|
+
/* @__PURE__ */ c(n, {
|
|
16
|
+
value: t,
|
|
17
|
+
onValueChange: (e) => u(e),
|
|
18
|
+
children: [/* @__PURE__ */ s(a, {
|
|
19
|
+
className: "h-control-md text-sm",
|
|
20
|
+
children: /* @__PURE__ */ s(o, { placeholder: "Select renderer" })
|
|
21
|
+
}), /* @__PURE__ */ s(r, {
|
|
23
22
|
position: "popper",
|
|
24
23
|
side: "bottom",
|
|
25
24
|
sideOffset: 4,
|
|
26
25
|
align: "start",
|
|
27
26
|
className: "max-h-52",
|
|
28
|
-
children:
|
|
27
|
+
children: l.map((e) => /* @__PURE__ */ s(i, {
|
|
29
28
|
value: e.value,
|
|
30
29
|
children: e.label
|
|
31
30
|
}, e.value))
|
|
32
31
|
})]
|
|
33
32
|
}),
|
|
34
|
-
|
|
33
|
+
f && /* @__PURE__ */ s("p", {
|
|
35
34
|
className: "mt-1 text-sm text-text-muted",
|
|
36
|
-
children:
|
|
35
|
+
children: f.description
|
|
37
36
|
}),
|
|
38
|
-
|
|
37
|
+
d
|
|
39
38
|
]
|
|
40
39
|
});
|
|
41
40
|
});
|
|
42
41
|
//#endregion
|
|
43
|
-
export {
|
|
42
|
+
export { l as AdvancedSection };
|
|
44
43
|
|
|
45
44
|
//# sourceMappingURL=AdvancedSection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdvancedSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AdvancedSection.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@burdenoff/fe-libs/ui';\nimport type { RendererType } from '../../../types';\n\nexport interface AdvancedRendererOption {\n value: RendererType;\n label: string;\n description: string;\n}\n\nexport interface AdvancedSectionProps {\n renderer: RendererType;\n rendererOptions: AdvancedRendererOption[];\n onRendererChange: (renderer: RendererType) => void;\n templateEditor?: ReactNode;\n}\n\n/** Renderer/template controls; actions and integrations migrate here next. */\nexport const AdvancedSection: FC<AdvancedSectionProps> = memo(function AdvancedSection({\n renderer,\n rendererOptions,\n onRendererChange,\n templateEditor,\n}) {\n const selectedOption = rendererOptions.find((option) => option.value === renderer);\n\n return (\n <
|
|
1
|
+
{"version":3,"file":"AdvancedSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AdvancedSection.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@burdenoff/fe-libs/ui';\nimport type { RendererType } from '../../../types';\nimport { Section } from '../../common';\n\nexport interface AdvancedRendererOption {\n value: RendererType;\n label: string;\n description: string;\n}\n\nexport interface AdvancedSectionProps {\n renderer: RendererType;\n rendererOptions: AdvancedRendererOption[];\n onRendererChange: (renderer: RendererType) => void;\n templateEditor?: ReactNode;\n}\n\n/** Renderer/template controls; actions and integrations migrate here next. */\nexport const AdvancedSection: FC<AdvancedSectionProps> = memo(function AdvancedSection({\n renderer,\n rendererOptions,\n onRendererChange,\n templateEditor,\n}) {\n const selectedOption = rendererOptions.find((option) => option.value === renderer);\n\n return (\n <Section\n id=\"widget-advanced-renderer\"\n title=\"Renderer\"\n description=\"Which engine draws this widget's body. Non-native renderers take a JSON template.\"\n data-testid=\"widget-inspector-renderer\"\n >\n <Select value={renderer} onValueChange={(value) => onRendererChange(value as RendererType)}>\n <SelectTrigger className=\"h-control-md text-sm\">\n <SelectValue placeholder=\"Select renderer\" />\n </SelectTrigger>\n <SelectContent position=\"popper\" side=\"bottom\" sideOffset={4} align=\"start\" className=\"max-h-52\">\n {rendererOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedOption && <p className=\"mt-1 text-sm text-text-muted\">{selectedOption.description}</p>}\n {templateEditor}\n </Section>\n );\n});\n"],"mappings":";;;;;;AAmBA,IAAa,IAA4C,EAAK,SAAyB,EACrF,aACA,oBACA,qBACA,qBACC;CACD,IAAM,IAAiB,EAAgB,MAAM,MAAW,EAAO,UAAU,EAAS;AAElF,QACE,kBAAC,GAAD;EACE,IAAG;EACH,OAAM;EACN,aAAY;EACZ,eAAY;YAJd;GAME,kBAAC,GAAD;IAAQ,OAAO;IAAU,gBAAgB,MAAU,EAAiB,EAAsB;cAA1F,CACE,kBAAC,GAAD;KAAe,WAAU;eACvB,kBAAC,GAAD,EAAa,aAAY,mBAAoB,CAAA;KAC/B,CAAA,EAChB,kBAAC,GAAD;KAAe,UAAS;KAAS,MAAK;KAAS,YAAY;KAAG,OAAM;KAAQ,WAAU;eACnF,EAAgB,KAAK,MACpB,kBAAC,GAAD;MAA+B,OAAO,EAAO;gBAC1C,EAAO;MACG,EAFI,EAAO,MAEX,CACb;KACY,CAAA,CACT;;GACR,KAAkB,kBAAC,KAAD;IAAG,WAAU;cAAgC,EAAe;IAAgB,CAAA;GAC9F;GACO;;EAEZ"}
|
|
@@ -1,45 +1,56 @@
|
|
|
1
|
-
import e from "../../
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
1
|
+
import { Section as e } from "../../common/Section.js";
|
|
2
|
+
import "../../common/index.js";
|
|
3
|
+
import t from "../../widgets/chart/ChartConfig.js";
|
|
4
|
+
import n from "../../widgets/gauge/GaugeConfig.js";
|
|
5
|
+
import r from "../../widgets/heatmap/HeatmapConfig.js";
|
|
6
|
+
import i from "../../widgets/list/ListConfig.js";
|
|
7
|
+
import a from "../../widgets/metric-card/MetricCardConfig.js";
|
|
8
|
+
import o from "../../widgets/progress/ProgressConfig.js";
|
|
9
|
+
import s from "../../widgets/table/TableConfig.js";
|
|
10
|
+
import { memo as c } from "react";
|
|
11
|
+
import { jsx as l } from "react/jsx-runtime";
|
|
10
12
|
//#region src/bigconsole/components/builder/inspector/AppearanceSection.tsx
|
|
11
|
-
function
|
|
13
|
+
function u(e) {
|
|
12
14
|
return e;
|
|
13
15
|
}
|
|
14
|
-
function
|
|
15
|
-
switch (
|
|
16
|
+
function d(e) {
|
|
17
|
+
switch (e) {
|
|
16
18
|
case "metric_card":
|
|
17
|
-
case "kpi_card_comparison": return
|
|
19
|
+
case "kpi_card_comparison": return u(a);
|
|
18
20
|
case "chart":
|
|
19
|
-
case "funnel_chart": return
|
|
21
|
+
case "funnel_chart": return u(t);
|
|
20
22
|
case "table":
|
|
21
|
-
case "pivot_table": return
|
|
22
|
-
case "gauge": return
|
|
23
|
-
case "progress": return
|
|
24
|
-
case "list": return
|
|
25
|
-
case "heatmap": return
|
|
23
|
+
case "pivot_table": return u(s);
|
|
24
|
+
case "gauge": return u(n);
|
|
25
|
+
case "progress": return u(o);
|
|
26
|
+
case "list": return u(i);
|
|
27
|
+
case "heatmap": return u(r);
|
|
26
28
|
default: return null;
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
|
-
var
|
|
30
|
-
let
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
var f = c(function({ widgetType: t, config: n, onChange: r }) {
|
|
32
|
+
let i = d(t);
|
|
33
|
+
return i ? /* @__PURE__ */ l(e, {
|
|
34
|
+
title: "Style",
|
|
35
|
+
description: "Presentation options for this widget type. Data and identity live on the other tabs.",
|
|
36
|
+
"data-testid": "widget-inspector-style",
|
|
37
|
+
children: /* @__PURE__ */ l(i, {
|
|
38
|
+
config: n,
|
|
39
|
+
onChange: r
|
|
40
|
+
})
|
|
41
|
+
}) : /* @__PURE__ */ l(e, {
|
|
42
|
+
tone: "info",
|
|
43
|
+
padding: "compact",
|
|
44
|
+
title: "No style options",
|
|
45
|
+
headingLevel: 3,
|
|
46
|
+
"data-testid": "widget-inspector-style-empty",
|
|
47
|
+
children: /* @__PURE__ */ l("p", {
|
|
37
48
|
className: "text-sm text-text-secondary",
|
|
38
|
-
children: "
|
|
49
|
+
children: "This widget type renders from its data and template, so there is nothing to style here."
|
|
39
50
|
})
|
|
40
51
|
});
|
|
41
52
|
});
|
|
42
53
|
//#endregion
|
|
43
|
-
export {
|
|
54
|
+
export { f as AppearanceSection };
|
|
44
55
|
|
|
45
56
|
//# sourceMappingURL=AppearanceSection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppearanceSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AppearanceSection.tsx"],"sourcesContent":["import { type ComponentType, type FC, memo } from 'react';\nimport type { WidgetType } from '../../../types';\nimport { MetricCardConfig } from '../../widgets/metric-card/MetricCardConfig';\nimport { ChartConfig } from '../../widgets/chart/ChartConfig';\nimport { TableConfig } from '../../widgets/table/TableConfig';\nimport { GaugeConfig } from '../../widgets/gauge/GaugeConfig';\nimport { ProgressConfig } from '../../widgets/progress/ProgressConfig';\nimport { ListConfig } from '../../widgets/list/ListConfig';\nimport { HeatmapConfig } from '../../widgets/heatmap/HeatmapConfig';\n\ninterface ConfigComponentProps {\n config: never;\n onChange: (config: never) => void;\n}\n\n// Legacy widget config components expose distinct config interfaces even though\n// they share the same runtime { config, onChange } contract. Keep the narrowing\n// cast in this adapter instead of spreading `never` casts across inspector code.\nfunction asConfigComponent(component: ComponentType<unknown>): ComponentType<ConfigComponentProps> {\n return component as unknown as ComponentType<ConfigComponentProps>;\n}\n\nexport interface AppearanceSectionProps {\n widgetType: WidgetType;\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n}\n\nfunction getConfigComponent(type: WidgetType): ComponentType<ConfigComponentProps> | null {\n switch (type) {\n case 'metric_card':\n case 'kpi_card_comparison':\n return asConfigComponent(MetricCardConfig as ComponentType<unknown>);\n case 'chart':\n case 'funnel_chart':\n return asConfigComponent(ChartConfig as ComponentType<unknown>);\n case 'table':\n case 'pivot_table':\n return asConfigComponent(TableConfig as ComponentType<unknown>);\n case 'gauge':\n return asConfigComponent(GaugeConfig as ComponentType<unknown>);\n case 'progress':\n return asConfigComponent(ProgressConfig as ComponentType<unknown>);\n case 'list':\n return asConfigComponent(ListConfig as ComponentType<unknown>);\n case 'heatmap':\n return asConfigComponent(HeatmapConfig as ComponentType<unknown>);\n default:\n return null;\n }\n}\n\n/** Widget-specific visual configuration with a shared empty state. */\nexport const AppearanceSection: FC<AppearanceSectionProps> = memo(function AppearanceSection({\n widgetType,\n config,\n onChange,\n}) {\n const ConfigComponent = getConfigComponent(widgetType);\n\n if (!ConfigComponent) {\n return (\n <
|
|
1
|
+
{"version":3,"file":"AppearanceSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AppearanceSection.tsx"],"sourcesContent":["import { type ComponentType, type FC, memo } from 'react';\nimport type { WidgetType } from '../../../types';\nimport { Section } from '../../common';\nimport { MetricCardConfig } from '../../widgets/metric-card/MetricCardConfig';\nimport { ChartConfig } from '../../widgets/chart/ChartConfig';\nimport { TableConfig } from '../../widgets/table/TableConfig';\nimport { GaugeConfig } from '../../widgets/gauge/GaugeConfig';\nimport { ProgressConfig } from '../../widgets/progress/ProgressConfig';\nimport { ListConfig } from '../../widgets/list/ListConfig';\nimport { HeatmapConfig } from '../../widgets/heatmap/HeatmapConfig';\n\ninterface ConfigComponentProps {\n config: never;\n onChange: (config: never) => void;\n}\n\n// Legacy widget config components expose distinct config interfaces even though\n// they share the same runtime { config, onChange } contract. Keep the narrowing\n// cast in this adapter instead of spreading `never` casts across inspector code.\nfunction asConfigComponent(component: ComponentType<unknown>): ComponentType<ConfigComponentProps> {\n return component as unknown as ComponentType<ConfigComponentProps>;\n}\n\nexport interface AppearanceSectionProps {\n widgetType: WidgetType;\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n}\n\nfunction getConfigComponent(type: WidgetType): ComponentType<ConfigComponentProps> | null {\n switch (type) {\n case 'metric_card':\n case 'kpi_card_comparison':\n return asConfigComponent(MetricCardConfig as ComponentType<unknown>);\n case 'chart':\n case 'funnel_chart':\n return asConfigComponent(ChartConfig as ComponentType<unknown>);\n case 'table':\n case 'pivot_table':\n return asConfigComponent(TableConfig as ComponentType<unknown>);\n case 'gauge':\n return asConfigComponent(GaugeConfig as ComponentType<unknown>);\n case 'progress':\n return asConfigComponent(ProgressConfig as ComponentType<unknown>);\n case 'list':\n return asConfigComponent(ListConfig as ComponentType<unknown>);\n case 'heatmap':\n return asConfigComponent(HeatmapConfig as ComponentType<unknown>);\n default:\n return null;\n }\n}\n\n/** Widget-specific visual configuration with a shared empty state. */\nexport const AppearanceSection: FC<AppearanceSectionProps> = memo(function AppearanceSection({\n widgetType,\n config,\n onChange,\n}) {\n const ConfigComponent = getConfigComponent(widgetType);\n\n if (!ConfigComponent) {\n return (\n <Section\n tone=\"info\"\n padding=\"compact\"\n title=\"No style options\"\n headingLevel={3}\n data-testid=\"widget-inspector-style-empty\"\n >\n <p className=\"text-sm text-text-secondary\">\n This widget type renders from its data and template, so there is nothing to style here.\n </p>\n </Section>\n );\n }\n\n return (\n <Section\n title=\"Style\"\n description=\"Presentation options for this widget type. Data and identity live on the other tabs.\"\n data-testid=\"widget-inspector-style\"\n >\n <ConfigComponent config={config as never} onChange={onChange as (config: never) => void} />\n </Section>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAmBA,SAAS,EAAkB,GAAwE;AACjG,QAAO;;AAST,SAAS,EAAmB,GAA8D;AACxF,SAAQ,GAAR;EACE,KAAK;EACL,KAAK,sBACH,QAAO,EAAkB,EAA2C;EACtE,KAAK;EACL,KAAK,eACH,QAAO,EAAkB,EAAsC;EACjE,KAAK;EACL,KAAK,cACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,QACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,WACH,QAAO,EAAkB,EAAyC;EACpE,KAAK,OACH,QAAO,EAAkB,EAAqC;EAChE,KAAK,UACH,QAAO,EAAkB,EAAwC;EACnE,QACE,QAAO;;;AAKb,IAAa,IAAgD,EAAK,SAA2B,EAC3F,eACA,WACA,eACC;CACD,IAAM,IAAkB,EAAmB,EAAW;AAkBtD,QAhBK,IAiBH,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,eAAY;YAEZ,kBAAC,GAAD;GAAyB;GAA2B;GAAuC,CAAA;EACnF,CAAA,GArBR,kBAAC,GAAD;EACE,MAAK;EACL,SAAQ;EACR,OAAM;EACN,cAAc;EACd,eAAY;YAEZ,kBAAC,KAAD;GAAG,WAAU;aAA8B;GAEvC,CAAA;EACI,CAAA;EAad"}
|
|
@@ -1,120 +1,158 @@
|
|
|
1
|
-
import e from "../../
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
1
|
+
import { Section as e, SectionStack as t } from "../../common/Section.js";
|
|
2
|
+
import "../../common/index.js";
|
|
3
|
+
import n from "../../parser/DataSinkSelector.js";
|
|
4
|
+
import r from "../../parser/ParserSelector.js";
|
|
5
|
+
import { useI18n as i } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { Input as a, Label as o, Spinner as s } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
8
|
//#region src/bigconsole/components/builder/inspector/DataBindingSection.tsx
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
var u = {
|
|
10
|
+
unbound: "info",
|
|
11
|
+
loading: "info",
|
|
12
|
+
bound: "success",
|
|
13
|
+
no_data: "warning",
|
|
14
|
+
parser_error: "danger",
|
|
15
|
+
field_mismatch: "warning"
|
|
16
|
+
}, d = ({ consoleId: d, binding: f, dataSinkKey: p, dataPath: m, status: h, missingFields: g = [], preview: _, error: v, onDataSinkChange: y, onParserChange: b, onDataPathChange: x }) => {
|
|
17
|
+
let { t: S } = i(), C = {
|
|
18
|
+
unbound: S("bigconsole.builder.dataBinding.status.unbound", "Select a DataSink to begin"),
|
|
19
|
+
loading: S("bigconsole.builder.dataBinding.status.loading", "Testing parser and detecting fields…"),
|
|
20
|
+
bound: S("bigconsole.builder.dataBinding.status.bound", "Binding ready"),
|
|
21
|
+
no_data: S("bigconsole.builder.dataBinding.status.noData", "Parser returned no data"),
|
|
22
|
+
parser_error: S("bigconsole.builder.dataBinding.status.parserError", "Parser test failed"),
|
|
23
|
+
field_mismatch: S("bigconsole.builder.dataBinding.status.fieldMismatch", "Some mapped fields were not found")
|
|
15
24
|
};
|
|
16
|
-
return /* @__PURE__ */
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
/* @__PURE__ */ o(i, { children: y("bigconsole.builder.dataBinding.parserLabel", "Parser") }),
|
|
48
|
-
/* @__PURE__ */ o(t, {
|
|
49
|
-
consoleId: c,
|
|
50
|
-
value: l.parserId ?? null,
|
|
51
|
-
onChange: _,
|
|
52
|
-
filterInputSinkKey: u ?? void 0,
|
|
25
|
+
return /* @__PURE__ */ l(t, { children: [
|
|
26
|
+
/* @__PURE__ */ c(e, {
|
|
27
|
+
title: "Data source",
|
|
28
|
+
description: S("bigconsole.builder.dataBinding.intro", "Connect this widget to a DataSink and Parser to display transformed data."),
|
|
29
|
+
"data-testid": "widget-inspector-data-source",
|
|
30
|
+
children: /* @__PURE__ */ l("div", {
|
|
31
|
+
className: "flex flex-col gap-form-gap",
|
|
32
|
+
children: [/* @__PURE__ */ l("div", {
|
|
33
|
+
className: "space-y-2",
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ c(o, { children: S("bigconsole.builder.dataBinding.dataSinkLabel", "DataSink") }),
|
|
36
|
+
/* @__PURE__ */ c(n, {
|
|
37
|
+
value: p,
|
|
38
|
+
onChange: y,
|
|
39
|
+
placeholder: S("bigconsole.builder.dataBinding.dataSinkPlaceholder", "Select a DataSink...")
|
|
40
|
+
}),
|
|
41
|
+
p && /* @__PURE__ */ l("p", {
|
|
42
|
+
className: "text-xs text-text-secondary",
|
|
43
|
+
children: [S("bigconsole.builder.dataBinding.keyLabel", "Key: {{key}}", { key: p }), f.source.ref && /* @__PURE__ */ c("span", {
|
|
44
|
+
className: "ml-2 text-text-muted",
|
|
45
|
+
children: S("bigconsole.builder.dataBinding.idLabel", "ID: {{id}}...", { id: f.source.ref.slice(0, 8) })
|
|
46
|
+
})]
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
}), /* @__PURE__ */ l("div", {
|
|
50
|
+
className: "space-y-2",
|
|
51
|
+
children: [/* @__PURE__ */ c(o, { children: S("bigconsole.builder.dataBinding.parserLabel", "Parser") }), /* @__PURE__ */ c(r, {
|
|
52
|
+
consoleId: d,
|
|
53
|
+
value: f.parserId ?? null,
|
|
54
|
+
onChange: b,
|
|
55
|
+
filterInputSinkKey: p ?? void 0,
|
|
53
56
|
filterStatus: void 0,
|
|
54
|
-
placeholder:
|
|
55
|
-
disabled: !
|
|
57
|
+
placeholder: p ? S("bigconsole.builder.dataBinding.parserPlaceholder", "Select a parser...") : S("bigconsole.builder.dataBinding.parserPlaceholderNoSink", "Select a DataSink first..."),
|
|
58
|
+
disabled: !p
|
|
59
|
+
})]
|
|
60
|
+
})]
|
|
61
|
+
})
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ c(e, {
|
|
64
|
+
title: C[h],
|
|
65
|
+
tone: u[h],
|
|
66
|
+
padding: "compact",
|
|
67
|
+
headingLevel: 3,
|
|
68
|
+
icon: h === "loading" ? /* @__PURE__ */ c(s, { style: {
|
|
69
|
+
width: "14px",
|
|
70
|
+
height: "14px"
|
|
71
|
+
} }) : void 0,
|
|
72
|
+
"data-testid": "widget-inspector-binding-status",
|
|
73
|
+
children: /* @__PURE__ */ l("div", {
|
|
74
|
+
role: "status",
|
|
75
|
+
"aria-live": "polite",
|
|
76
|
+
className: "min-w-0 space-y-1",
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ c("p", {
|
|
79
|
+
className: "sr-only",
|
|
80
|
+
children: C[h]
|
|
56
81
|
}),
|
|
57
|
-
/* @__PURE__ */
|
|
58
|
-
className: "
|
|
59
|
-
|
|
60
|
-
children: [f === "loading" && /* @__PURE__ */ o(a, { style: {
|
|
61
|
-
width: "12px",
|
|
62
|
-
height: "12px"
|
|
63
|
-
} }), b[f]]
|
|
82
|
+
v && /* @__PURE__ */ c("p", {
|
|
83
|
+
className: "break-words text-xs text-[var(--color-status-error-text)]",
|
|
84
|
+
children: v
|
|
64
85
|
}),
|
|
65
|
-
|
|
66
|
-
className: "text-xs text-status-
|
|
67
|
-
children:
|
|
86
|
+
g.length > 0 && /* @__PURE__ */ c("p", {
|
|
87
|
+
className: "break-words text-xs text-[var(--color-status-warning-text)]",
|
|
88
|
+
children: S("bigconsole.builder.dataBinding.missingFields", "Missing: {{fields}}", { fields: g.join(", ") })
|
|
68
89
|
}),
|
|
69
|
-
|
|
70
|
-
className: "text-xs text-
|
|
71
|
-
children:
|
|
90
|
+
!v && g.length === 0 && h === "bound" && /* @__PURE__ */ c("p", {
|
|
91
|
+
className: "text-xs text-text-secondary",
|
|
92
|
+
children: "The parser ran and its output matches the fields this widget expects."
|
|
72
93
|
})
|
|
73
94
|
]
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
95
|
+
})
|
|
96
|
+
}),
|
|
97
|
+
f.parserId && Object.keys(f.fields).length > 0 && /* @__PURE__ */ c(e, {
|
|
98
|
+
emphasis: "muted",
|
|
99
|
+
padding: "compact",
|
|
100
|
+
title: S("bigconsole.builder.dataBinding.fieldMappingsConfigured", "Field mappings configured"),
|
|
101
|
+
headingLevel: 3,
|
|
102
|
+
children: /* @__PURE__ */ c("div", {
|
|
103
|
+
className: "min-w-0 space-y-1 text-xs text-text-secondary",
|
|
104
|
+
children: Object.entries(f.fields).map(([e, t]) => /* @__PURE__ */ l("p", {
|
|
105
|
+
className: "break-words",
|
|
106
|
+
children: [
|
|
83
107
|
e,
|
|
84
108
|
": ",
|
|
85
|
-
/* @__PURE__ */
|
|
86
|
-
className: "rounded bg-bg-
|
|
109
|
+
/* @__PURE__ */ c("code", {
|
|
110
|
+
className: "rounded bg-bg-surface px-1 font-mono",
|
|
87
111
|
children: t
|
|
88
112
|
})
|
|
89
|
-
]
|
|
90
|
-
})
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
/* @__PURE__ */
|
|
113
|
+
]
|
|
114
|
+
}, e))
|
|
115
|
+
})
|
|
116
|
+
}),
|
|
117
|
+
_ !== void 0 && /* @__PURE__ */ c(e, {
|
|
118
|
+
emphasis: "muted",
|
|
119
|
+
padding: "compact",
|
|
120
|
+
title: S("bigconsole.builder.dataBinding.livePreviewLabel", "Live Preview"),
|
|
121
|
+
description: "Raw parser output, exactly as the widget receives it.",
|
|
122
|
+
headingLevel: 3,
|
|
123
|
+
children: /* @__PURE__ */ c("pre", {
|
|
124
|
+
className: "max-h-40 min-w-0 overflow-auto rounded-input border border-[var(--color-border-subtle)] bg-bg-surface p-3 text-xs text-text-secondary",
|
|
125
|
+
children: JSON.stringify(_, null, 2)
|
|
126
|
+
})
|
|
127
|
+
}),
|
|
128
|
+
/* @__PURE__ */ c(e, {
|
|
129
|
+
emphasis: "muted",
|
|
130
|
+
padding: "compact",
|
|
131
|
+
title: "Data path",
|
|
132
|
+
headingLevel: 3,
|
|
133
|
+
children: /* @__PURE__ */ l("div", {
|
|
100
134
|
className: "space-y-2",
|
|
101
135
|
children: [
|
|
102
|
-
/* @__PURE__ */ o
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
136
|
+
/* @__PURE__ */ c(o, {
|
|
137
|
+
htmlFor: "widget-inspector-data-path",
|
|
138
|
+
children: S("bigconsole.builder.dataBinding.dataPathLabel", "Data Path (Optional)")
|
|
139
|
+
}),
|
|
140
|
+
/* @__PURE__ */ c(a, {
|
|
141
|
+
id: "widget-inspector-data-path",
|
|
142
|
+
value: m ?? "",
|
|
143
|
+
onChange: (e) => x(e.target.value || void 0),
|
|
144
|
+
placeholder: S("bigconsole.builder.dataBinding.dataPathPlaceholder", "e.g., summary.totalRevenue")
|
|
107
145
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ c("p", {
|
|
109
147
|
className: "text-xs text-text-secondary",
|
|
110
|
-
children:
|
|
148
|
+
children: S("bigconsole.builder.dataBinding.dataPathHelp", "Path to extract specific data from the parser output (dot notation)")
|
|
111
149
|
})
|
|
112
150
|
]
|
|
113
151
|
})
|
|
114
|
-
|
|
115
|
-
});
|
|
152
|
+
})
|
|
153
|
+
] });
|
|
116
154
|
};
|
|
117
155
|
//#endregion
|
|
118
|
-
export {
|
|
156
|
+
export { d as DataBindingSection };
|
|
119
157
|
|
|
120
158
|
//# sourceMappingURL=DataBindingSection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataBindingSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/DataBindingSection.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Input, Label, Spinner } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { WidgetBinding, WidgetBindingStatus } from '../../../types';\nimport { DataSinkSelector } from '../../parser/DataSinkSelector';\nimport { ParserSelector } from '../../parser/ParserSelector';\n\nexport interface DataBindingSectionProps {\n consoleId: string;\n binding: WidgetBinding;\n dataSinkKey: string | null;\n dataPath?: string;\n status: WidgetBindingStatus;\n missingFields?: string[];\n preview?: unknown;\n error?: string | null;\n onDataSinkChange: (key: string | null) => void;\n onParserChange: (parserId: string | null) => void;\n onDataPathChange: (path: string | undefined) => void;\n}\n\nexport const DataBindingSection: FC<DataBindingSectionProps> = ({\n consoleId,\n binding,\n dataSinkKey,\n dataPath,\n status,\n missingFields = [],\n preview,\n error,\n onDataSinkChange,\n onParserChange,\n onDataPathChange,\n}) => {\n const { t } = useI18n();\n\n const statusLabels: Record<WidgetBindingStatus, string> = {\n unbound: t('bigconsole.builder.dataBinding.status.unbound', 'Select a DataSink to begin'),\n loading: t('bigconsole.builder.dataBinding.status.loading', 'Testing parser and detecting fields…'),\n bound: t('bigconsole.builder.dataBinding.status.bound', 'Binding ready'),\n no_data: t('bigconsole.builder.dataBinding.status.noData', 'Parser returned no data'),\n parser_error: t('bigconsole.builder.dataBinding.status.parserError', 'Parser test failed'),\n field_mismatch: t('bigconsole.builder.dataBinding.status.fieldMismatch', 'Some mapped fields were not found'),\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border border-border-subtle bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'bigconsole.builder.dataBinding.intro',\n 'Connect this widget to a DataSink and Parser to display transformed data.'\n )}\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.dataSinkLabel', 'DataSink')}</Label>\n <DataSinkSelector\n value={dataSinkKey}\n onChange={onDataSinkChange}\n placeholder={t('bigconsole.builder.dataBinding.dataSinkPlaceholder', 'Select a DataSink...')}\n />\n {dataSinkKey && (\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.builder.dataBinding.keyLabel', 'Key: {{key}}', { key: dataSinkKey })}\n {binding.source.ref && (\n <span className=\"ml-2 text-text-tertiary\">\n {t('bigconsole.builder.dataBinding.idLabel', 'ID: {{id}}...', {\n id: binding.source.ref.slice(0, 8),\n })}\n </span>\n )}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.parserLabel', 'Parser')}</Label>\n <ParserSelector\n consoleId={consoleId}\n value={binding.parserId ?? null}\n onChange={onParserChange}\n filterInputSinkKey={dataSinkKey ?? undefined}\n filterStatus={undefined}\n placeholder={\n dataSinkKey\n ? t('bigconsole.builder.dataBinding.parserPlaceholder', 'Select a parser...')\n : t('bigconsole.builder.dataBinding.parserPlaceholderNoSink', 'Select a DataSink first...')\n }\n disabled={!dataSinkKey}\n />\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\" role=\"status\">\n {status === 'loading' && <Spinner style={{ width: '12px', height: '12px' }} />}\n {statusLabels[status]}\n </p>\n {error && <p className=\"text-xs text-status-error-text\">{error}</p>}\n {missingFields.length > 0 && (\n <p className=\"text-xs text-status-warning-text\">\n {t('bigconsole.builder.dataBinding.missingFields', 'Missing: {{fields}}', {\n fields: missingFields.join(', '),\n })}\n </p>\n )}\n </div>\n\n {binding.parserId && Object.keys(binding.fields).length > 0 && (\n <div className=\"rounded-md border border-status-success-border bg-status-success-bg-subtle p-3\">\n <p className=\"mb-2 text-xs font-medium text-status-success-text\">\n {t('bigconsole.builder.dataBinding.fieldMappingsConfigured', 'Field mappings configured')}\n </p>\n <div className=\"space-y-1 text-xs text-text-secondary\">\n {Object.entries(binding.fields).map(([name, path]) => (\n <p key={name}>\n {name}: <code className=\"rounded bg-bg-sunken px-1\">{path}</code>\n </p>\n ))}\n </div>\n </div>\n )}\n\n {preview !== undefined && (\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.livePreviewLabel', 'Live Preview')}</Label>\n <pre className=\"max-h-40 overflow-auto rounded-md border border-border-subtle bg-bg-sunken p-3 text-xs text-text-secondary\">\n {JSON.stringify(preview, null, 2)}\n </pre>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.dataPathLabel', 'Data Path (Optional)')}</Label>\n <Input\n value={dataPath ?? ''}\n onChange={(event) => onDataPathChange(event.target.value || undefined)}\n placeholder={t('bigconsole.builder.dataBinding.dataPathPlaceholder', 'e.g., summary.totalRevenue')}\n />\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'bigconsole.builder.dataBinding.dataPathHelp',\n 'Path to extract specific data from the parser output (dot notation)'\n )}\n </p>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataBindingSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/DataBindingSection.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Input, Label, Spinner } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { WidgetBinding, WidgetBindingStatus } from '../../../types';\nimport { DataSinkSelector } from '../../parser/DataSinkSelector';\nimport { ParserSelector } from '../../parser/ParserSelector';\nimport { Section, SectionStack, type SectionTone } from '../../common';\n\nexport interface DataBindingSectionProps {\n consoleId: string;\n binding: WidgetBinding;\n dataSinkKey: string | null;\n dataPath?: string;\n status: WidgetBindingStatus;\n missingFields?: string[];\n preview?: unknown;\n error?: string | null;\n onDataSinkChange: (key: string | null) => void;\n onParserChange: (parserId: string | null) => void;\n onDataPathChange: (path: string | undefined) => void;\n}\n\n/**\n * Binding health is the single most important signal on this tab, so it gets a\n * toned section of its own instead of the bare `<p class=\"text-xs\">` it used to\n * be (BOFF-5636).\n */\nconst STATUS_TONES: Record<WidgetBindingStatus, SectionTone> = {\n unbound: 'info',\n loading: 'info',\n bound: 'success',\n no_data: 'warning',\n parser_error: 'danger',\n field_mismatch: 'warning',\n};\n\nexport const DataBindingSection: FC<DataBindingSectionProps> = ({\n consoleId,\n binding,\n dataSinkKey,\n dataPath,\n status,\n missingFields = [],\n preview,\n error,\n onDataSinkChange,\n onParserChange,\n onDataPathChange,\n}) => {\n const { t } = useI18n();\n\n const statusLabels: Record<WidgetBindingStatus, string> = {\n unbound: t('bigconsole.builder.dataBinding.status.unbound', 'Select a DataSink to begin'),\n loading: t('bigconsole.builder.dataBinding.status.loading', 'Testing parser and detecting fields…'),\n bound: t('bigconsole.builder.dataBinding.status.bound', 'Binding ready'),\n no_data: t('bigconsole.builder.dataBinding.status.noData', 'Parser returned no data'),\n parser_error: t('bigconsole.builder.dataBinding.status.parserError', 'Parser test failed'),\n field_mismatch: t('bigconsole.builder.dataBinding.status.fieldMismatch', 'Some mapped fields were not found'),\n };\n\n return (\n <SectionStack>\n <Section\n title=\"Data source\"\n description={t(\n 'bigconsole.builder.dataBinding.intro',\n 'Connect this widget to a DataSink and Parser to display transformed data.'\n )}\n data-testid=\"widget-inspector-data-source\"\n >\n <div className=\"flex flex-col gap-form-gap\">\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.dataSinkLabel', 'DataSink')}</Label>\n <DataSinkSelector\n value={dataSinkKey}\n onChange={onDataSinkChange}\n placeholder={t('bigconsole.builder.dataBinding.dataSinkPlaceholder', 'Select a DataSink...')}\n />\n {dataSinkKey && (\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.builder.dataBinding.keyLabel', 'Key: {{key}}', { key: dataSinkKey })}\n {binding.source.ref && (\n <span className=\"ml-2 text-text-muted\">\n {t('bigconsole.builder.dataBinding.idLabel', 'ID: {{id}}...', {\n id: binding.source.ref.slice(0, 8),\n })}\n </span>\n )}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t('bigconsole.builder.dataBinding.parserLabel', 'Parser')}</Label>\n <ParserSelector\n consoleId={consoleId}\n value={binding.parserId ?? null}\n onChange={onParserChange}\n filterInputSinkKey={dataSinkKey ?? undefined}\n filterStatus={undefined}\n placeholder={\n dataSinkKey\n ? t('bigconsole.builder.dataBinding.parserPlaceholder', 'Select a parser...')\n : t('bigconsole.builder.dataBinding.parserPlaceholderNoSink', 'Select a DataSink first...')\n }\n disabled={!dataSinkKey}\n />\n </div>\n </div>\n </Section>\n\n <Section\n title={statusLabels[status]}\n tone={STATUS_TONES[status]}\n padding=\"compact\"\n headingLevel={3}\n icon={status === 'loading' ? <Spinner style={{ width: '14px', height: '14px' }} /> : undefined}\n data-testid=\"widget-inspector-binding-status\"\n >\n <div role=\"status\" aria-live=\"polite\" className=\"min-w-0 space-y-1\">\n {/*\n The status label is the section heading, which sits OUTSIDE this live\n region — without this echo a screen reader would never hear the binding\n flip from \"loading\" to \"bound\".\n */}\n <p className=\"sr-only\">{statusLabels[status]}</p>\n {error && <p className=\"break-words text-xs text-[var(--color-status-error-text)]\">{error}</p>}\n {missingFields.length > 0 && (\n <p className=\"break-words text-xs text-[var(--color-status-warning-text)]\">\n {t('bigconsole.builder.dataBinding.missingFields', 'Missing: {{fields}}', {\n fields: missingFields.join(', '),\n })}\n </p>\n )}\n {!error && missingFields.length === 0 && status === 'bound' && (\n <p className=\"text-xs text-text-secondary\">\n The parser ran and its output matches the fields this widget expects.\n </p>\n )}\n </div>\n </Section>\n\n {binding.parserId && Object.keys(binding.fields).length > 0 && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n title={t('bigconsole.builder.dataBinding.fieldMappingsConfigured', 'Field mappings configured')}\n headingLevel={3}\n >\n <div className=\"min-w-0 space-y-1 text-xs text-text-secondary\">\n {Object.entries(binding.fields).map(([name, path]) => (\n <p key={name} className=\"break-words\">\n {name}: <code className=\"rounded bg-bg-surface px-1 font-mono\">{path}</code>\n </p>\n ))}\n </div>\n </Section>\n )}\n\n {preview !== undefined && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n title={t('bigconsole.builder.dataBinding.livePreviewLabel', 'Live Preview')}\n description=\"Raw parser output, exactly as the widget receives it.\"\n headingLevel={3}\n >\n <pre className=\"max-h-40 min-w-0 overflow-auto rounded-input border border-[var(--color-border-subtle)] bg-bg-surface p-3 text-xs text-text-secondary\">\n {JSON.stringify(preview, null, 2)}\n </pre>\n </Section>\n )}\n\n <Section emphasis=\"muted\" padding=\"compact\" title=\"Data path\" headingLevel={3}>\n <div className=\"space-y-2\">\n <Label htmlFor=\"widget-inspector-data-path\">\n {t('bigconsole.builder.dataBinding.dataPathLabel', 'Data Path (Optional)')}\n </Label>\n <Input\n id=\"widget-inspector-data-path\"\n value={dataPath ?? ''}\n onChange={(event) => onDataPathChange(event.target.value || undefined)}\n placeholder={t('bigconsole.builder.dataBinding.dataPathPlaceholder', 'e.g., summary.totalRevenue')}\n />\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'bigconsole.builder.dataBinding.dataPathHelp',\n 'Path to extract specific data from the parser output (dot notation)'\n )}\n </p>\n </div>\n </Section>\n </SectionStack>\n );\n};\n"],"mappings":"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"}
|