@burdenoff/microfe-bigconsole 2026.712.1 → 2026.713.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 (36) hide show
  1. package/dist/bigconsole/components/builder/BuilderCanvas.js +21 -0
  2. package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -0
  3. package/dist/bigconsole/components/builder/BuilderTopbar.js +33 -0
  4. package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -0
  5. package/dist/bigconsole/components/builder/DashboardEditorShell.js +20 -0
  6. package/dist/bigconsole/components/builder/DashboardEditorShell.js.map +1 -0
  7. package/dist/bigconsole/components/builder/WidgetInspector.js +14 -0
  8. package/dist/bigconsole/components/builder/WidgetInspector.js.map +1 -0
  9. package/dist/bigconsole/components/builder/index.js +4 -0
  10. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +45 -0
  11. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -0
  12. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +43 -0
  13. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -0
  14. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +124 -0
  15. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -0
  16. package/dist/bigconsole/components/builder/inspector/GeneralSection.js +50 -0
  17. package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -0
  18. package/dist/bigconsole/components/builder/inspector/index.js +4 -0
  19. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +221 -199
  20. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  21. package/dist/bigconsole/components/dashboard/WidgetPalette.js +145 -102
  22. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  23. package/dist/bigconsole/components/dashboard/index.js +4 -0
  24. package/dist/bigconsole/components/widgets/PropertiesPanel.js +529 -742
  25. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  26. package/dist/bigconsole/components/widgets/WidgetWrapper.js +227 -226
  27. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  28. package/dist/bigconsole/pages/DashboardBuilderPage.js +221 -316
  29. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  30. package/dist/bigconsole/utils/widgetBinding.js +115 -0
  31. package/dist/bigconsole/utils/widgetBinding.js.map +1 -0
  32. package/package.json +2 -2
  33. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js +0 -883
  34. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js.map +0 -1
  35. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +0 -311
  36. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ import { memo as e } from "react";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/bigconsole/components/builder/BuilderCanvas.tsx
4
+ var r = e(function({ palette: e, canvas: r, inspector: i }) {
5
+ return /* @__PURE__ */ n("div", {
6
+ className: "flex min-h-0 min-w-0 flex-1 overflow-hidden",
7
+ "data-testid": "dashboard-editor-panes",
8
+ children: [
9
+ e,
10
+ /* @__PURE__ */ t("main", {
11
+ className: "relative min-w-0 flex-1 overflow-hidden",
12
+ children: r
13
+ }),
14
+ i
15
+ ]
16
+ });
17
+ });
18
+ //#endregion
19
+ export { r as BuilderCanvas };
20
+
21
+ //# sourceMappingURL=BuilderCanvas.js.map
@@ -0,0 +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/** Stable pane composition. Palette and inspector slots will be migrated here incrementally. */\nexport const BuilderCanvas: FC<BuilderCanvasProps> = memo(function BuilderCanvas({ palette, canvas, inspector }) {\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 overflow-hidden\" data-testid=\"dashboard-editor-panes\">\n {palette}\n <main className=\"relative min-w-0 flex-1 overflow-hidden\">{canvas}</main>\n {inspector}\n </div>\n );\n});\n"],"mappings":";;;AASA,IAAa,IAAwC,EAAK,SAAuB,EAAE,YAAS,WAAQ,gBAAa;AAC/G,QACE,kBAAC,OAAD;EAAK,WAAU;EAA8C,eAAY;YAAzE;GACG;GACD,kBAAC,QAAD;IAAM,WAAU;cAA2C;IAAc,CAAA;GACxE;GACG;;EAER"}
@@ -0,0 +1,33 @@
1
+ import { memo as e } from "react";
2
+ import { ArrowLeft as t } from "lucide-react";
3
+ import { Button as n } from "@burdenoff/fe-libs/ui";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region src/bigconsole/components/builder/BuilderTopbar.tsx
6
+ var a = e(function({ title: e, onBack: a, actions: o }) {
7
+ return /* @__PURE__ */ i("header", {
8
+ className: "flex min-h-12 items-center gap-3 border-b border-border-default bg-bg-surface px-3 py-2",
9
+ children: [
10
+ /* @__PURE__ */ i(n, {
11
+ onClick: a,
12
+ variant: "ghost",
13
+ size: "sm",
14
+ title: "Back to Dashboards",
15
+ "aria-label": "Back to Dashboards",
16
+ children: [/* @__PURE__ */ r(t, { className: "mr-2 size-4" }), "Back"]
17
+ }),
18
+ /* @__PURE__ */ r("h1", {
19
+ className: "min-w-0 flex-1 truncate text-sm font-semibold text-text-primary",
20
+ title: e,
21
+ children: e
22
+ }),
23
+ o && /* @__PURE__ */ r("div", {
24
+ className: "flex flex-shrink-0 items-center gap-2",
25
+ children: o
26
+ })
27
+ ]
28
+ });
29
+ });
30
+ //#endregion
31
+ export { a as BuilderTopbar };
32
+
33
+ //# sourceMappingURL=BuilderTopbar.js.map
@@ -0,0 +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/** Route-level navigation and identity for the dashboard editor. */\nexport const BuilderTopbar: FC<BuilderTopbarProps> = memo(function BuilderTopbar({ title, onBack, actions }) {\n return (\n <header className=\"flex min-h-12 items-center gap-3 border-b border-border-default 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-sm font-semibold text-text-primary\" title={title}>\n {title}\n </h1>\n {actions && <div className=\"flex flex-shrink-0 items-center gap-2\">{actions}</div>}\n </header>\n );\n});\n"],"mappings":";;;;;AAWA,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;IAAyE;cACpF;IACE,CAAA;GACJ,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAyC;IAAc,CAAA;GAC3E;;EAEX"}
@@ -0,0 +1,20 @@
1
+ import { memo as e } from "react";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/bigconsole/components/builder/DashboardEditorShell.tsx
4
+ var r = e(function({ topbar: e, children: r }) {
5
+ return /* @__PURE__ */ n("section", {
6
+ className: "flex h-full min-h-0 min-w-0 flex-col overflow-hidden bg-bg-canvas",
7
+ "data-testid": "dashboard-editor",
8
+ children: [/* @__PURE__ */ t("div", {
9
+ className: "flex-shrink-0",
10
+ children: e
11
+ }), /* @__PURE__ */ t("div", {
12
+ className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden",
13
+ children: r
14
+ })]
15
+ });
16
+ });
17
+ //#endregion
18
+ export { r as DashboardEditorShell };
19
+
20
+ //# sourceMappingURL=DashboardEditorShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardEditorShell.js","names":[],"sources":["../../../../src/bigconsole/components/builder/DashboardEditorShell.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\n\nexport interface DashboardEditorShellProps {\n topbar: ReactNode;\n children: ReactNode;\n}\n\n/** Full-height route shell for the dashboard editing experience. */\nexport const DashboardEditorShell: FC<DashboardEditorShellProps> = memo(function DashboardEditorShell({\n topbar,\n children,\n}) {\n return (\n <section\n className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden bg-bg-canvas\"\n data-testid=\"dashboard-editor\"\n >\n <div className=\"flex-shrink-0\">{topbar}</div>\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">{children}</div>\n </section>\n );\n});\n"],"mappings":";;;AAQA,IAAa,IAAsD,EAAK,SAA8B,EACpG,WACA,eACC;AACD,QACE,kBAAC,WAAD;EACE,WAAU;EACV,eAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAiB;GAAa,CAAA,EAC7C,kBAAC,OAAD;GAAK,WAAU;GAAwD;GAAe,CAAA,CAC9E;;EAEZ"}
@@ -0,0 +1,14 @@
1
+ import e from "../widgets/PropertiesPanel.js";
2
+ import { memo as t } from "react";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ //#region src/bigconsole/components/builder/WidgetInspector.tsx
5
+ var r = t(function({ isOpen: t, onClose: r }) {
6
+ return /* @__PURE__ */ n(e, {
7
+ isOpen: t,
8
+ onClose: r
9
+ });
10
+ });
11
+ //#endregion
12
+ export { r as WidgetInspector };
13
+
14
+ //# sourceMappingURL=WidgetInspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetInspector.js","names":[],"sources":["../../../../src/bigconsole/components/builder/WidgetInspector.tsx"],"sourcesContent":["import { type FC, memo } from 'react';\nimport { PropertiesPanel } from '../widgets/PropertiesPanel';\n\nexport interface WidgetInspectorProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\n/**\n * Canonical add/edit inspector entry point.\n *\n * PropertiesPanel remains the compatibility implementation while its sections\n * are extracted incrementally. Builder callers should depend on this component\n * so that migration does not create a second editing surface.\n */\nexport const WidgetInspector: FC<WidgetInspectorProps> = memo(function WidgetInspector({ isOpen, onClose }) {\n return <PropertiesPanel isOpen={isOpen} onClose={onClose} />;\n});\n"],"mappings":";;;;AAeA,IAAa,IAA4C,EAAK,SAAyB,EAAE,WAAQ,cAAW;AAC1G,QAAO,kBAAC,GAAD;EAAyB;EAAiB;EAAW,CAAA;EAC5D"}
@@ -0,0 +1,4 @@
1
+ import "./BuilderCanvas.js";
2
+ import "./BuilderTopbar.js";
3
+ import "./DashboardEditorShell.js";
4
+ import "./WidgetInspector.js";
@@ -0,0 +1,45 @@
1
+ import { memo as e } from "react";
2
+ import { Select as t, SelectContent as n, SelectItem as r, SelectTrigger as i, SelectValue as a } from "@burdenoff/fe-libs/ui";
3
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
+ //#region src/bigconsole/components/builder/inspector/AdvancedSection.tsx
5
+ var c = e(function({ renderer: e, rendererOptions: c, onRendererChange: l, templateEditor: u }) {
6
+ let d = c.find((t) => t.value === e);
7
+ return /* @__PURE__ */ s("section", {
8
+ className: "border-t border-border-default pt-4",
9
+ "aria-labelledby": "widget-advanced-renderer-heading",
10
+ children: [
11
+ /* @__PURE__ */ o("h3", {
12
+ id: "widget-advanced-renderer-heading",
13
+ className: "mb-1 text-sm font-semibold text-text-primary",
14
+ children: "Renderer"
15
+ }),
16
+ /* @__PURE__ */ s(t, {
17
+ value: e,
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, {
23
+ position: "popper",
24
+ side: "bottom",
25
+ sideOffset: 4,
26
+ align: "start",
27
+ className: "max-h-52",
28
+ children: c.map((e) => /* @__PURE__ */ o(r, {
29
+ value: e.value,
30
+ children: e.label
31
+ }, e.value))
32
+ })]
33
+ }),
34
+ d && /* @__PURE__ */ o("p", {
35
+ className: "mt-1 text-sm text-text-muted",
36
+ children: d.description
37
+ }),
38
+ u
39
+ ]
40
+ });
41
+ });
42
+ //#endregion
43
+ export { c as AdvancedSection };
44
+
45
+ //# sourceMappingURL=AdvancedSection.js.map
@@ -0,0 +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 <section className=\"border-t border-border-default pt-4\" aria-labelledby=\"widget-advanced-renderer-heading\">\n <h3 id=\"widget-advanced-renderer-heading\" className=\"mb-1 text-sm font-semibold text-text-primary\">\n Renderer\n </h3>\n <Select value={renderer} onValueChange={(value) => onRendererChange(value as RendererType)}>\n <SelectTrigger className=\"h-9 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":";;;;AAkBA,IAAa,IAA4C,EAAK,SAAyB,EACrF,aACA,oBACA,qBACA,qBACC;CACD,IAAM,IAAiB,EAAgB,MAAM,MAAW,EAAO,UAAU,EAAS;AAElF,QACE,kBAAC,WAAD;EAAS,WAAU;EAAsC,mBAAgB;YAAzE;GACE,kBAAC,MAAD;IAAI,IAAG;IAAmC,WAAU;cAA+C;IAE9F,CAAA;GACL,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"}
@@ -0,0 +1,43 @@
1
+ import e from "../../widgets/chart/ChartConfig.js";
2
+ import t from "../../widgets/gauge/GaugeConfig.js";
3
+ import n from "../../widgets/list/ListConfig.js";
4
+ import r from "../../widgets/metric-card/MetricCardConfig.js";
5
+ import i from "../../widgets/progress/ProgressConfig.js";
6
+ import a from "../../widgets/table/TableConfig.js";
7
+ import { memo as o } from "react";
8
+ import { jsx as s } from "react/jsx-runtime";
9
+ //#region src/bigconsole/components/builder/inspector/AppearanceSection.tsx
10
+ function c(e) {
11
+ return e;
12
+ }
13
+ function l(o) {
14
+ switch (o) {
15
+ case "metric_card":
16
+ case "kpi_card_comparison": return c(r);
17
+ case "chart":
18
+ case "funnel_chart": return c(e);
19
+ case "table":
20
+ case "pivot_table": return c(a);
21
+ case "gauge": return c(t);
22
+ case "progress": return c(i);
23
+ case "list": return c(n);
24
+ default: return null;
25
+ }
26
+ }
27
+ var u = o(function({ widgetType: e, config: t, onChange: n }) {
28
+ let r = l(e);
29
+ return r ? /* @__PURE__ */ s(r, {
30
+ config: t,
31
+ onChange: n
32
+ }) : /* @__PURE__ */ s("div", {
33
+ className: "rounded-lg bg-bg-sunken p-4 text-center",
34
+ children: /* @__PURE__ */ s("p", {
35
+ className: "text-sm text-text-secondary",
36
+ children: "No style options for this widget type"
37
+ })
38
+ });
39
+ });
40
+ //#endregion
41
+ export { u as AppearanceSection };
42
+
43
+ //# sourceMappingURL=AppearanceSection.js.map
@@ -0,0 +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';\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 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 <div className=\"rounded-lg bg-bg-sunken p-4 text-center\">\n <p className=\"text-sm text-text-secondary\">No style options for this widget type</p>\n </div>\n );\n }\n\n return <ConfigComponent config={config as never} onChange={onChange as (config: never) => void} />;\n});\n"],"mappings":";;;;;;;;;AAiBA,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,QACE,QAAO;;;AAKb,IAAa,IAAgD,EAAK,SAA2B,EAC3F,eACA,WACA,eACC;CACD,IAAM,IAAkB,EAAmB,EAAW;AAUtD,QARK,IAQE,kBAAC,GAAD;EAAyB;EAA2B;EAAuC,CAAA,GAN9F,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,KAAD;GAAG,WAAU;aAA8B;GAAyC,CAAA;EAChF,CAAA;EAKV"}
@@ -0,0 +1,124 @@
1
+ import e from "../../parser/DataSinkSelector.js";
2
+ import t from "../../parser/ParserSelector.js";
3
+ import { Input as n, Label as r, Spinner as i } from "@burdenoff/fe-libs/ui";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ //#region src/bigconsole/components/builder/inspector/DataBindingSection.tsx
6
+ var s = {
7
+ unbound: "Select a DataSink to begin",
8
+ loading: "Testing parser and detecting fields…",
9
+ bound: "Binding ready",
10
+ no_data: "Parser returned no data",
11
+ parser_error: "Parser test failed",
12
+ field_mismatch: "Some mapped fields were not found"
13
+ }, c = ({ consoleId: c, binding: l, dataSinkKey: u, dataPath: d, status: f, missingFields: p = [], preview: m, error: h, onDataSinkChange: g, onParserChange: _, onDataPathChange: v }) => /* @__PURE__ */ o("div", {
14
+ className: "space-y-4",
15
+ children: [
16
+ /* @__PURE__ */ a("div", {
17
+ className: "rounded-md border border-border-subtle bg-bg-sunken p-3",
18
+ children: /* @__PURE__ */ a("p", {
19
+ className: "text-xs text-text-secondary",
20
+ children: "Connect this widget to a DataSink and Parser to display transformed data."
21
+ })
22
+ }),
23
+ /* @__PURE__ */ o("div", {
24
+ className: "space-y-2",
25
+ children: [
26
+ /* @__PURE__ */ a(r, { children: "DataSink" }),
27
+ /* @__PURE__ */ a(e, {
28
+ value: u,
29
+ onChange: g,
30
+ placeholder: "Select a DataSink..."
31
+ }),
32
+ u && /* @__PURE__ */ o("p", {
33
+ className: "text-xs text-text-secondary",
34
+ children: [
35
+ "Key: ",
36
+ u,
37
+ l.source.ref && /* @__PURE__ */ o("span", {
38
+ className: "ml-2 text-text-tertiary",
39
+ children: [
40
+ "ID: ",
41
+ l.source.ref.slice(0, 8),
42
+ "..."
43
+ ]
44
+ })
45
+ ]
46
+ })
47
+ ]
48
+ }),
49
+ /* @__PURE__ */ o("div", {
50
+ className: "space-y-2",
51
+ children: [
52
+ /* @__PURE__ */ a(r, { children: "Parser" }),
53
+ /* @__PURE__ */ a(t, {
54
+ consoleId: c,
55
+ value: l.parserId ?? null,
56
+ onChange: _,
57
+ filterInputSinkKey: u ?? void 0,
58
+ filterStatus: void 0,
59
+ placeholder: u ? "Select a parser..." : "Select a DataSink first...",
60
+ disabled: !u
61
+ }),
62
+ /* @__PURE__ */ o("p", {
63
+ className: "flex items-center gap-1 text-xs text-text-secondary",
64
+ role: "status",
65
+ children: [f === "loading" && /* @__PURE__ */ a(i, { style: {
66
+ width: "12px",
67
+ height: "12px"
68
+ } }), s[f]]
69
+ }),
70
+ h && /* @__PURE__ */ a("p", {
71
+ className: "text-xs text-status-error",
72
+ children: h
73
+ }),
74
+ p.length > 0 && /* @__PURE__ */ o("p", {
75
+ className: "text-xs text-status-warning",
76
+ children: ["Missing: ", p.join(", ")]
77
+ })
78
+ ]
79
+ }),
80
+ l.parserId && Object.keys(l.fields).length > 0 && /* @__PURE__ */ o("div", {
81
+ className: "rounded-md border border-status-success bg-status-success-muted p-3",
82
+ children: [/* @__PURE__ */ a("p", {
83
+ className: "mb-2 text-xs font-medium text-status-success",
84
+ children: "Field mappings configured"
85
+ }), /* @__PURE__ */ a("div", {
86
+ className: "space-y-1 text-xs text-text-secondary",
87
+ children: Object.entries(l.fields).map(([e, t]) => /* @__PURE__ */ o("p", { children: [
88
+ e,
89
+ ": ",
90
+ /* @__PURE__ */ a("code", {
91
+ className: "rounded bg-bg-sunken px-1",
92
+ children: t
93
+ })
94
+ ] }, e))
95
+ })]
96
+ }),
97
+ m !== void 0 && /* @__PURE__ */ o("div", {
98
+ className: "space-y-2",
99
+ children: [/* @__PURE__ */ a(r, { children: "Live Preview" }), /* @__PURE__ */ a("pre", {
100
+ className: "max-h-40 overflow-auto rounded-md border border-border-subtle bg-bg-sunken p-3 text-xs text-text-secondary",
101
+ children: JSON.stringify(m, null, 2)
102
+ })]
103
+ }),
104
+ /* @__PURE__ */ o("div", {
105
+ className: "space-y-2",
106
+ children: [
107
+ /* @__PURE__ */ a(r, { children: "Data Path (Optional)" }),
108
+ /* @__PURE__ */ a(n, {
109
+ value: d ?? "",
110
+ onChange: (e) => v(e.target.value || void 0),
111
+ placeholder: "e.g., summary.totalRevenue"
112
+ }),
113
+ /* @__PURE__ */ a("p", {
114
+ className: "text-xs text-text-secondary",
115
+ children: "Path to extract specific data from the parser output (dot notation)"
116
+ })
117
+ ]
118
+ })
119
+ ]
120
+ });
121
+ //#endregion
122
+ export { c as DataBindingSection };
123
+
124
+ //# sourceMappingURL=DataBindingSection.js.map
@@ -0,0 +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 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\nconst STATUS_LABELS: Record<WidgetBindingStatus, string> = {\n unbound: 'Select a DataSink to begin',\n loading: 'Testing parser and detecting fields…',\n bound: 'Binding ready',\n no_data: 'Parser returned no data',\n parser_error: 'Parser test failed',\n field_mismatch: 'Some mapped fields were not found',\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 <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 Connect this widget to a DataSink and Parser to display transformed data.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label>DataSink</Label>\n <DataSinkSelector value={dataSinkKey} onChange={onDataSinkChange} placeholder=\"Select a DataSink...\" />\n {dataSinkKey && (\n <p className=\"text-xs text-text-secondary\">\n Key: {dataSinkKey}\n {binding.source.ref && (\n <span className=\"ml-2 text-text-tertiary\">ID: {binding.source.ref.slice(0, 8)}...</span>\n )}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label>Parser</Label>\n <ParserSelector\n consoleId={consoleId}\n value={binding.parserId ?? null}\n onChange={onParserChange}\n filterInputSinkKey={dataSinkKey ?? undefined}\n filterStatus={undefined}\n placeholder={dataSinkKey ? 'Select a parser...' : 'Select a DataSink first...'}\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 {STATUS_LABELS[status]}\n </p>\n {error && <p className=\"text-xs text-status-error\">{error}</p>}\n {missingFields.length > 0 && <p className=\"text-xs text-status-warning\">Missing: {missingFields.join(', ')}</p>}\n </div>\n\n {binding.parserId && Object.keys(binding.fields).length > 0 && (\n <div className=\"rounded-md border border-status-success bg-status-success-muted p-3\">\n <p className=\"mb-2 text-xs font-medium text-status-success\">Field mappings configured</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>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>Data Path (Optional)</Label>\n <Input\n value={dataPath ?? ''}\n onChange={(event) => onDataPathChange(event.target.value || undefined)}\n placeholder=\"e.g., summary.totalRevenue\"\n />\n <p className=\"text-xs text-text-secondary\">Path to extract specific data from the parser output (dot notation)</p>\n </div>\n </div>\n);\n"],"mappings":";;;;;AAoBA,IAAM,IAAqD;CACzD,SAAS;CACT,SAAS;CACT,OAAO;CACP,SAAS;CACT,cAAc;CACd,gBAAgB;CACjB,EAEY,KAAmD,EAC9D,cACA,YACA,gBACA,aACA,WACA,mBAAgB,EAAE,EAClB,YACA,UACA,qBACA,mBACA,0BAEA,kBAAC,OAAD;CAAK,WAAU;WAAf;EACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAEvC,CAAA;GACA,CAAA;EAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,YAAgB,CAAA;IACvB,kBAAC,GAAD;KAAkB,OAAO;KAAa,UAAU;KAAkB,aAAY;KAAyB,CAAA;IACtG,KACC,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA2C;MACnC;MACL,EAAQ,OAAO,OACd,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAA0C;QAAK,EAAQ,OAAO,IAAI,MAAM,GAAG,EAAE;QAAC;QAAU;;MAExF;;IAEF;;EAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,UAAc,CAAA;IACrB,kBAAC,GAAD;KACa;KACX,OAAO,EAAQ,YAAY;KAC3B,UAAU;KACV,oBAAoB,KAAe,KAAA;KACnC,cAAc,KAAA;KACd,aAAa,IAAc,uBAAuB;KAClD,UAAU,CAAC;KACX,CAAA;IACF,kBAAC,KAAD;KAAG,WAAU;KAAsD,MAAK;eAAxE,CACG,MAAW,aAAa,kBAAC,GAAD,EAAS,OAAO;MAAE,OAAO;MAAQ,QAAQ;MAAQ,EAAI,CAAA,EAC7E,EAAc,GACb;;IACH,KAAS,kBAAC,KAAD;KAAG,WAAU;eAA6B;KAAU,CAAA;IAC7D,EAAc,SAAS,KAAK,kBAAC,KAAD;KAAG,WAAU;eAAb,CAA2C,aAAU,EAAc,KAAK,KAAK,CAAK;;IAC3G;;EAEL,EAAQ,YAAY,OAAO,KAAK,EAAQ,OAAO,CAAC,SAAS,KACxD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAA+C;IAA6B,CAAA,EACzF,kBAAC,OAAD;IAAK,WAAU;cACZ,OAAO,QAAQ,EAAQ,OAAO,CAAC,KAAK,CAAC,GAAM,OAC1C,kBAAC,KAAD,EAAA,UAAA;KACG;KAAK;KAAE,kBAAC,QAAD;MAAM,WAAU;gBAA6B;MAAY,CAAA;KAC/D,EAAA,EAFI,EAEJ,CACJ;IACE,CAAA,CACF;;EAGP,MAAY,KAAA,KACX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAA,UAAO,gBAAoB,CAAA,EAC3B,kBAAC,OAAD;IAAK,WAAU;cACZ,KAAK,UAAU,GAAS,MAAM,EAAE;IAC7B,CAAA,CACF;;EAGR,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,wBAA4B,CAAA;IACnC,kBAAC,GAAD;KACE,OAAO,KAAY;KACnB,WAAW,MAAU,EAAiB,EAAM,OAAO,SAAS,KAAA,EAAU;KACtE,aAAY;KACZ,CAAA;IACF,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAuE,CAAA;IAC9G;;EACF"}
@@ -0,0 +1,50 @@
1
+ import { memo as e } from "react";
2
+ import { Input as t, Textarea as n } from "@burdenoff/fe-libs/ui";
3
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
+ //#region src/bigconsole/components/builder/inspector/GeneralSection.tsx
5
+ var a = e(function({ title: e, description: a, refreshInterval: o, onTitleChange: s, onDescriptionChange: c, onRefreshIntervalChange: l }) {
6
+ let u = "mb-1 block text-sm font-semibold text-text-primary";
7
+ return /* @__PURE__ */ i("div", {
8
+ className: "flex flex-col gap-4",
9
+ children: [
10
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
11
+ htmlFor: "widget-inspector-title",
12
+ className: u,
13
+ children: "Title"
14
+ }), /* @__PURE__ */ r(t, {
15
+ id: "widget-inspector-title",
16
+ value: e,
17
+ onChange: (e) => s(e.target.value),
18
+ className: "h-9 text-sm"
19
+ })] }),
20
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
21
+ htmlFor: "widget-inspector-description",
22
+ className: u,
23
+ children: "Description"
24
+ }), /* @__PURE__ */ r(n, {
25
+ id: "widget-inspector-description",
26
+ value: a,
27
+ onChange: (e) => c(e.target.value),
28
+ rows: 3,
29
+ className: "resize-none text-sm"
30
+ })] }),
31
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
32
+ htmlFor: "widget-inspector-refresh",
33
+ className: u,
34
+ children: "Auto-Refresh (seconds)"
35
+ }), /* @__PURE__ */ r(t, {
36
+ id: "widget-inspector-refresh",
37
+ type: "number",
38
+ value: o ?? "",
39
+ onChange: (e) => l(e.target.value === "" ? void 0 : Number(e.target.value)),
40
+ min: 0,
41
+ placeholder: "No auto-refresh",
42
+ className: "h-9 text-sm"
43
+ })] })
44
+ ]
45
+ });
46
+ });
47
+ //#endregion
48
+ export { a as GeneralSection };
49
+
50
+ //# sourceMappingURL=GeneralSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneralSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/GeneralSection.tsx"],"sourcesContent":["import { type FC, memo } from 'react';\nimport { Input, Textarea } from '@burdenoff/fe-libs/ui';\n\nexport interface GeneralSectionProps {\n title: string;\n description: string;\n refreshInterval?: number;\n onTitleChange: (title: string) => void;\n onDescriptionChange: (description: string) => void;\n onRefreshIntervalChange: (refreshInterval: number | undefined) => void;\n}\n\n/** Widget identity and refresh settings shared by every widget type. */\nexport const GeneralSection: FC<GeneralSectionProps> = memo(function GeneralSection({\n title,\n description,\n refreshInterval,\n onTitleChange,\n onDescriptionChange,\n onRefreshIntervalChange,\n}) {\n const labelClassName = 'mb-1 block text-sm font-semibold text-text-primary';\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div>\n <label htmlFor=\"widget-inspector-title\" className={labelClassName}>\n Title\n </label>\n <Input\n id=\"widget-inspector-title\"\n value={title}\n onChange={(event) => onTitleChange(event.target.value)}\n className=\"h-9 text-sm\"\n />\n </div>\n\n <div>\n <label htmlFor=\"widget-inspector-description\" className={labelClassName}>\n Description\n </label>\n <Textarea\n id=\"widget-inspector-description\"\n value={description}\n onChange={(event) => onDescriptionChange(event.target.value)}\n rows={3}\n className=\"resize-none text-sm\"\n />\n </div>\n\n <div>\n <label htmlFor=\"widget-inspector-refresh\" className={labelClassName}>\n Auto-Refresh (seconds)\n </label>\n <Input\n id=\"widget-inspector-refresh\"\n type=\"number\"\n value={refreshInterval ?? ''}\n onChange={(event) =>\n onRefreshIntervalChange(event.target.value === '' ? undefined : Number(event.target.value))\n }\n min={0}\n placeholder=\"No auto-refresh\"\n className=\"h-9 text-sm\"\n />\n </div>\n </div>\n );\n});\n"],"mappings":";;;;AAaA,IAAa,IAA0C,EAAK,SAAwB,EAClF,UACA,gBACA,oBACA,kBACA,wBACA,8BACC;CACD,IAAM,IAAiB;AAEvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;IAAO,SAAQ;IAAyB,WAAW;cAAgB;IAE3D,CAAA,EACR,kBAAC,GAAD;IACE,IAAG;IACH,OAAO;IACP,WAAW,MAAU,EAAc,EAAM,OAAO,MAAM;IACtD,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GAEN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;IAAO,SAAQ;IAA+B,WAAW;cAAgB;IAEjE,CAAA,EACR,kBAAC,GAAD;IACE,IAAG;IACH,OAAO;IACP,WAAW,MAAU,EAAoB,EAAM,OAAO,MAAM;IAC5D,MAAM;IACN,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GAEN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;IAAO,SAAQ;IAA2B,WAAW;cAAgB;IAE7D,CAAA,EACR,kBAAC,GAAD;IACE,IAAG;IACH,MAAK;IACL,OAAO,KAAmB;IAC1B,WAAW,MACT,EAAwB,EAAM,OAAO,UAAU,KAAK,KAAA,IAAY,OAAO,EAAM,OAAO,MAAM,CAAC;IAE7F,KAAK;IACL,aAAY;IACZ,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GACF;;EAER"}
@@ -0,0 +1,4 @@
1
+ import "./AdvancedSection.js";
2
+ import "./AppearanceSection.js";
3
+ import "./GeneralSection.js";
4
+ import "./DataBindingSection.js";