@burdenoff/microfe-bigconsole 2026.805.1 → 2026.805.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/bigconsole/AdminRoot.js +21 -16
  2. package/dist/bigconsole/AdminRoot.js.map +1 -1
  3. package/dist/bigconsole/BigConsoleRoot.js +44 -39
  4. package/dist/bigconsole/BigConsoleRoot.js.map +1 -1
  5. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +109 -113
  6. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  7. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +115 -113
  8. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  9. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +71 -62
  10. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  11. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +116 -100
  12. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  13. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +56 -54
  14. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +126 -125
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +151 -150
  18. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  19. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +77 -76
  20. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  21. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +97 -96
  22. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  23. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +172 -191
  24. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  25. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +100 -98
  26. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
  27. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  28. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  29. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +151 -154
  30. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  31. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +187 -193
  32. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  33. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  34. package/dist/bigconsole/components/dashboard/WidgetPalette.js +110 -108
  35. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  36. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +102 -103
  37. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  38. package/dist/bigconsole/components/datasink/DataSinkCard.js +20 -20
  39. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  40. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +36 -41
  41. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  42. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +38 -37
  43. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  44. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  45. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  46. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +182 -197
  47. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  48. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +166 -168
  49. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  50. package/dist/bigconsole/components/parser/DataSinkSelector.js +87 -86
  51. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  52. package/dist/bigconsole/components/parser/ImportParserDialog.js +196 -211
  53. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  54. package/dist/bigconsole/components/parser/ParserSelector.js +130 -128
  55. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  56. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +66 -63
  57. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  58. package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -91
  59. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  60. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +243 -230
  61. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  62. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +149 -145
  63. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  64. package/dist/bigconsole/components/widgets/PropertiesPanel.js +504 -470
  65. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  66. package/dist/bigconsole/components/widgets/WidgetMenu.js +87 -76
  67. package/dist/bigconsole/components/widgets/WidgetMenu.js.map +1 -1
  68. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +44 -47
  69. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  70. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +143 -142
  71. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  72. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +101 -88
  73. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  74. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +135 -134
  75. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  76. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  77. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  78. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +69 -68
  79. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  80. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +64 -72
  81. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  82. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +60 -59
  83. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  84. package/dist/bigconsole/components/widgets/list/ListConfig.js +57 -56
  85. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  86. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +70 -69
  87. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  88. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  89. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  90. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  91. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  92. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +178 -177
  93. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  94. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +76 -75
  95. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  96. package/dist/bigconsole/components/widgets/table/TableConfig.js +183 -168
  97. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  98. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +187 -180
  99. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  100. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +120 -118
  101. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  102. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +40 -38
  103. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  104. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +150 -148
  105. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  106. package/dist/bigconsole/pages/DashboardBuilderPage.js +189 -175
  107. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  108. package/dist/bigconsole/pages/DashboardViewPage.js +200 -187
  109. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  110. package/dist/bigconsole/pages/DashboardsPage.js +379 -324
  111. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  112. package/dist/bigconsole/pages/DataParsersPage.js +185 -178
  113. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  114. package/dist/bigconsole/pages/DataSinkBuilderPage.js +195 -170
  115. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  116. package/dist/bigconsole/pages/DataSinkViewPage.js +224 -200
  117. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  118. package/dist/bigconsole/pages/DataSinksPage.js +281 -268
  119. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  120. package/dist/bigconsole/pages/DataSourcesPage.js +8 -7
  121. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  122. package/dist/bigconsole/pages/InsightsPage.js +238 -208
  123. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  124. package/dist/bigconsole/pages/ParserBuilderPage.js +480 -413
  125. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  126. package/dist/bigconsole/pages/ParserViewPage.js +192 -172
  127. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  128. package/dist/bigconsole/pages/PipelineBuilderPage.js +198 -163
  129. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  130. package/dist/bigconsole/pages/PipelineViewPage.js +138 -133
  131. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  132. package/dist/bigconsole/pages/PipelinesPage.js +162 -136
  133. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  134. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  135. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  136. package/dist/bigconsole/pages/WidgetDemoPage.js +121 -83
  137. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  138. package/dist/bigconsole/pages/WorkflowViewPage.js +269 -242
  139. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  140. package/dist/bigconsole/pages/WorkflowsPage.js +153 -138
  141. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  142. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  143. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  144. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  145. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  146. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  147. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  148. package/dist/constants/permissions.js +83 -0
  149. package/dist/constants/permissions.js.map +1 -0
  150. package/package.json +2 -1
@@ -1,167 +1,159 @@
1
1
  import e from "../../hooks/useStoreDashboardTemplates.js";
2
2
  import { memo as t, useCallback as n, useEffect as r, useState as i } from "react";
3
- import { Button as a, Dialog as o, DialogContent as s, DialogDescription as c, DialogFooter as l, DialogHeader as u, DialogTitle as d, Input as f, Spinner as p, Textarea as m } from "@burdenoff/fe-libs/ui";
4
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
3
+ import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
4
+ import { Button as o, Dialog as s, DialogContent as c, DialogDescription as l, DialogFooter as u, DialogHeader as d, DialogTitle as f, Input as p, Spinner as m, Textarea as h } from "@burdenoff/fe-libs/ui";
5
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
5
6
  //#region src/bigconsole/components/dashboard/PublishToStoreDialog.tsx
6
- function _(e) {
7
+ function v(e) {
7
8
  return e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).join("-").slice(0, 60);
8
9
  }
9
- var v = t(function({ isOpen: t, dashboardId: v, dashboardName: y, dashboardDescription: b, onClose: x, onPublished: S }) {
10
- let { publishToStore: C } = e({ autoLoad: !1 }), [w, T] = i(y), [E, D] = i(_(y)), [O, k] = i(b ?? ""), [A, j] = i(!1), [M, N] = i(!1), [P, F] = i(null), [I, L] = i(null);
10
+ var y = t(function({ isOpen: t, dashboardId: y, dashboardName: b, dashboardDescription: x, onClose: S, onPublished: C }) {
11
+ let { t: w } = a(), { publishToStore: T } = e({ autoLoad: !1 }), [E, D] = i(b), [O, k] = i(v(b)), [A, j] = i(x ?? ""), [M, N] = i(!1), [P, F] = i(!1), [I, L] = i(null), [R, z] = i(null);
11
12
  r(() => {
12
- t && (T(y), D(_(y)), k(b ?? ""), j(!1), F(null), L(null));
13
+ t && (D(b), k(v(b)), j(x ?? ""), N(!1), L(null), z(null));
13
14
  }, [
14
15
  t,
15
- y,
16
- b
16
+ b,
17
+ x
17
18
  ]);
18
- let R = n(async () => {
19
- if (!w.trim()) {
20
- F("A template name is required");
21
- return;
22
- }
19
+ let B = n(async () => {
23
20
  if (!E.trim()) {
24
- F("A slug is required");
21
+ L(w("bigconsole.dashboards.publishStore.error.nameRequired", "A template name is required"));
25
22
  return;
26
23
  }
27
24
  if (!O.trim()) {
28
- F("A description is required — it is what people see in the gallery");
25
+ L(w("bigconsole.dashboards.publishStore.error.slugRequired", "A slug is required"));
29
26
  return;
30
27
  }
31
- F(null), N(!0);
28
+ if (!A.trim()) {
29
+ L(w("bigconsole.dashboards.publishStore.error.descriptionRequired", "A description is required — it is what people see in the gallery"));
30
+ return;
31
+ }
32
+ L(null), F(!0);
32
33
  try {
33
- let e = await C({
34
- dashboardId: v,
35
- name: w.trim(),
36
- slug: E.trim(),
37
- description: O.trim(),
38
- includeSampleData: A
34
+ let e = await T({
35
+ dashboardId: y,
36
+ name: E.trim(),
37
+ slug: O.trim(),
38
+ description: A.trim(),
39
+ includeSampleData: M
39
40
  });
40
41
  if (!e.success) {
41
- F(e.errorMessage ?? "Failed to publish to the store");
42
+ L(e.errorMessage ?? w("bigconsole.dashboards.publishStore.error.publishFailed", "Failed to publish to the store"));
42
43
  return;
43
44
  }
44
- L(e), S?.(e);
45
+ z(e), C?.(e);
45
46
  } finally {
46
- N(!1);
47
+ F(!1);
47
48
  }
48
49
  }, [
49
- w,
50
50
  E,
51
51
  O,
52
52
  A,
53
- v,
53
+ M,
54
+ y,
55
+ T,
54
56
  C,
55
- S
56
- ]), z = {
57
+ w
58
+ ]), V = {
57
59
  display: "block",
58
60
  marginBottom: "var(--space-2xs)",
59
61
  fontSize: "var(--font-size-sm)"
60
62
  };
61
- return /* @__PURE__ */ h(o, {
63
+ return /* @__PURE__ */ g(s, {
62
64
  open: t,
63
- onOpenChange: (e) => !e && !M && x(),
64
- children: /* @__PURE__ */ g(s, {
65
+ onOpenChange: (e) => !e && !P && S(),
66
+ children: /* @__PURE__ */ _(c, {
65
67
  style: { maxWidth: "520px" },
66
68
  children: [
67
- /* @__PURE__ */ g(u, { children: [/* @__PURE__ */ h(d, { children: "Publish as Template" }), /* @__PURE__ */ h(c, { children: "Share this dashboard as a reusable template. Your data sources are replaced with named slots, so nothing from this workspace is published." })] }),
68
- I ? /* @__PURE__ */ g("div", {
69
+ /* @__PURE__ */ _(d, { children: [/* @__PURE__ */ g(f, { children: w("bigconsole.dashboards.publishStore.title", "Publish as Template") }), /* @__PURE__ */ g(l, { children: w("bigconsole.dashboards.publishStore.subtitle", "Share this dashboard as a reusable template. Your data sources are replaced with named slots, so nothing from this workspace is published.") })] }),
70
+ R ? /* @__PURE__ */ _("div", {
69
71
  style: { padding: "var(--space-md) 0" },
70
72
  children: [
71
- /* @__PURE__ */ h("p", {
73
+ /* @__PURE__ */ g("p", {
72
74
  style: { fontWeight: "var(--font-weight-medium)" },
73
- children: "Draft template created"
75
+ children: w("bigconsole.dashboards.publishStore.result.title", "Draft template created")
74
76
  }),
75
77
  /* @__PURE__ */ g("p", {
76
78
  style: {
77
79
  fontSize: "var(--font-size-sm)",
78
80
  color: "var(--color-text-muted)"
79
81
  },
80
- children: [
81
- I.sinkCount,
82
- " data source",
83
- I.sinkCount === 1 ? "" : "s",
84
- " turned into slots. Finish in the Developer Portal: review the listing, then submit it for approval. It appears in the gallery once approved."
85
- ]
82
+ children: R.sinkCount === 1 ? w("bigconsole.dashboards.publishStore.result.sinksOne", "{{count}} data source turned into slots. Finish in the Developer Portal: review the listing, then submit it for approval. It appears in the gallery once approved.", { count: R.sinkCount ?? "" }) : w("bigconsole.dashboards.publishStore.result.sinksMany", "{{count}} data sources turned into slots. Finish in the Developer Portal: review the listing, then submit it for approval. It appears in the gallery once approved.", { count: R.sinkCount ?? "" })
86
83
  }),
87
- I.unknownSinkIds.length > 0 && /* @__PURE__ */ g("p", {
84
+ R.unknownSinkIds.length > 0 && /* @__PURE__ */ g("p", {
88
85
  style: {
89
86
  fontSize: "var(--font-size-sm)",
90
87
  color: "var(--color-text-warning)"
91
88
  },
92
- children: [
93
- I.unknownSinkIds.length,
94
- " data source",
95
- I.unknownSinkIds.length === 1 ? "" : "s",
96
- " could not be named — those slots use generic labels."
97
- ]
89
+ children: R.unknownSinkIds.length === 1 ? w("bigconsole.dashboards.publishStore.result.unknownOne", "{{count}} data source could not be named — those slots use generic labels.", { count: R.unknownSinkIds.length ?? "" }) : w("bigconsole.dashboards.publishStore.result.unknownMany", "{{count}} data sources could not be named — those slots use generic labels.", { count: R.unknownSinkIds.length ?? "" })
98
90
  })
99
91
  ]
100
- }) : /* @__PURE__ */ g("div", {
92
+ }) : /* @__PURE__ */ _("div", {
101
93
  style: {
102
94
  display: "flex",
103
95
  flexDirection: "column",
104
96
  gap: "var(--space-sm)"
105
97
  },
106
98
  children: [
107
- /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
99
+ /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
108
100
  htmlFor: "tpl-name",
109
- style: z,
110
- children: "Template name"
111
- }), /* @__PURE__ */ h(f, {
101
+ style: V,
102
+ children: w("bigconsole.dashboards.publishStore.field.name", "Template name")
103
+ }), /* @__PURE__ */ g(p, {
112
104
  id: "tpl-name",
113
- value: w,
114
- disabled: M,
105
+ value: E,
106
+ disabled: P,
115
107
  onChange: (e) => {
116
- T(e.target.value), D(_(e.target.value));
108
+ D(e.target.value), k(v(e.target.value));
117
109
  }
118
110
  })] }),
119
- /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
111
+ /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
120
112
  htmlFor: "tpl-slug",
121
- style: z,
122
- children: "Slug"
123
- }), /* @__PURE__ */ h(f, {
113
+ style: V,
114
+ children: w("bigconsole.dashboards.publishStore.field.slug", "Slug")
115
+ }), /* @__PURE__ */ g(p, {
124
116
  id: "tpl-slug",
125
- value: E,
126
- disabled: M,
127
- onChange: (e) => D(_(e.target.value))
117
+ value: O,
118
+ disabled: P,
119
+ onChange: (e) => k(v(e.target.value))
128
120
  })] }),
129
- /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
121
+ /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
130
122
  htmlFor: "tpl-desc",
131
- style: z,
132
- children: "Description"
133
- }), /* @__PURE__ */ h(m, {
123
+ style: V,
124
+ children: w("bigconsole.dashboards.publishStore.field.description", "Description")
125
+ }), /* @__PURE__ */ g(h, {
134
126
  id: "tpl-desc",
135
127
  rows: 3,
136
- value: O,
137
- disabled: M,
138
- placeholder: "What is this dashboard for, and what data does it need?",
139
- onChange: (e) => k(e.target.value)
128
+ value: A,
129
+ disabled: P,
130
+ placeholder: w("bigconsole.dashboards.publishStore.field.descriptionPlaceholder", "What is this dashboard for, and what data does it need?"),
131
+ onChange: (e) => j(e.target.value)
140
132
  })] }),
141
- P && /* @__PURE__ */ h("p", {
133
+ I && /* @__PURE__ */ g("p", {
142
134
  style: {
143
135
  color: "var(--color-text-danger)",
144
136
  fontSize: "var(--font-size-sm)"
145
137
  },
146
- children: P
138
+ children: I
147
139
  })
148
140
  ]
149
141
  }),
150
- /* @__PURE__ */ g(l, { children: [/* @__PURE__ */ h(a, {
142
+ /* @__PURE__ */ _(u, { children: [/* @__PURE__ */ g(o, {
151
143
  variant: "outline",
152
- onClick: x,
153
- disabled: M,
154
- children: I ? "Done" : "Cancel"
155
- }), !I && /* @__PURE__ */ h(a, {
156
- onClick: R,
157
- disabled: M,
158
- children: M ? /* @__PURE__ */ h(p, {}) : "Publish"
144
+ onClick: S,
145
+ disabled: P,
146
+ children: R ? w("bigconsole.dashboards.publishStore.action.done", "Done") : w("bigconsole.dashboards.publishStore.action.cancel", "Cancel")
147
+ }), !R && /* @__PURE__ */ g(o, {
148
+ onClick: B,
149
+ disabled: P,
150
+ children: P ? /* @__PURE__ */ g(m, {}) : w("bigconsole.dashboards.publishStore.action.publish", "Publish")
159
151
  })] })
160
152
  ]
161
153
  })
162
154
  });
163
155
  });
164
156
  //#endregion
165
- export { v as default };
157
+ export { y as default };
166
158
 
167
159
  //# sourceMappingURL=PublishToStoreDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublishToStoreDialog.js","names":[],"sources":["../../../../src/bigconsole/components/dashboard/PublishToStoreDialog.tsx"],"sourcesContent":["/**\n * PublishToStoreDialog\n *\n * Turns the open dashboard into a store template.\n *\n * WHY THIS EXISTS:\n * A workflow template's {nodes, edges} can plausibly be hand-written into the\n * developer portal. A dashboard export — every widget with its layout\n * coordinates, bindings and filters — cannot. Without this, authoring a\n * dashboard template means hand-crafting a large JSON document, which nobody\n * will do, and the gallery stays empty.\n *\n * The backend tokenises the board (replacing this workspace's data-sink\n * references with named slots), then a DRAFT Dashboard Template application is\n * created in the developer portal from the result. It deliberately stops there\n * rather than writing a store product directly: devportal already owns\n * versioning, review and publisher identity for dashboard templates, and\n * forking that pipeline would orphan the listing.\n *\n * @module bigconsole/components/dashboard/PublishToStoreDialog\n */\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Spinner,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { type FC, memo, useCallback, useEffect, useState } from 'react';\n\nimport { useStoreDashboardTemplates, type PublishToStoreResult } from '../../hooks/useStoreDashboardTemplates';\n\nexport interface PublishToStoreDialogProps {\n isOpen: boolean;\n dashboardId: string;\n dashboardName: string;\n dashboardDescription?: string | null;\n onClose: () => void;\n onPublished?: (result: PublishToStoreResult) => void;\n}\n\n/** Store slugs are lowercase, hyphenated and unique. */\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean)\n .join('-')\n .slice(0, 60);\n}\n\nexport const PublishToStoreDialog: FC<PublishToStoreDialogProps> = memo(function PublishToStoreDialog({\n isOpen,\n dashboardId,\n dashboardName,\n dashboardDescription,\n onClose,\n onPublished,\n}) {\n const { publishToStore } = useStoreDashboardTemplates({ autoLoad: false });\n\n const [name, setName] = useState(dashboardName);\n const [slug, setSlug] = useState(slugify(dashboardName));\n const [description, setDescription] = useState(dashboardDescription ?? '');\n const [includeSampleData, setIncludeSampleData] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<PublishToStoreResult | null>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n setName(dashboardName);\n setSlug(slugify(dashboardName));\n setDescription(dashboardDescription ?? '');\n setIncludeSampleData(false);\n setError(null);\n setResult(null);\n }, [isOpen, dashboardName, dashboardDescription]);\n\n const handlePublish = useCallback(async () => {\n if (!name.trim()) {\n setError('A template name is required');\n return;\n }\n if (!slug.trim()) {\n setError('A slug is required');\n return;\n }\n if (!description.trim()) {\n setError('A description is required — it is what people see in the gallery');\n return;\n }\n\n setError(null);\n setPublishing(true);\n try {\n const published = await publishToStore({\n dashboardId,\n name: name.trim(),\n slug: slug.trim(),\n description: description.trim(),\n includeSampleData,\n });\n if (!published.success) {\n setError(published.errorMessage ?? 'Failed to publish to the store');\n return;\n }\n setResult(published);\n onPublished?.(published);\n } finally {\n setPublishing(false);\n }\n }, [name, slug, description, includeSampleData, dashboardId, publishToStore, onPublished]);\n\n const label = { display: 'block', marginBottom: 'var(--space-2xs)', fontSize: 'var(--font-size-sm)' };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && !publishing && onClose()}>\n <DialogContent style={{ maxWidth: '520px' }}>\n <DialogHeader>\n <DialogTitle>Publish as Template</DialogTitle>\n <DialogDescription>\n Share this dashboard as a reusable template. Your data sources are replaced with named slots, so nothing\n from this workspace is published.\n </DialogDescription>\n </DialogHeader>\n\n {result ? (\n <div style={{ padding: 'var(--space-md) 0' }}>\n <p style={{ fontWeight: 'var(--font-weight-medium)' }}>Draft template created</p>\n <p style={{ fontSize: 'var(--font-size-sm)', color: 'var(--color-text-muted)' }}>\n {result.sinkCount} data source{result.sinkCount === 1 ? '' : 's'} turned into slots. Finish in the\n Developer Portal: review the listing, then submit it for approval. It appears in the gallery once\n approved.\n </p>\n {result.unknownSinkIds.length > 0 && (\n <p style={{ fontSize: 'var(--font-size-sm)', color: 'var(--color-text-warning)' }}>\n {result.unknownSinkIds.length} data source\n {result.unknownSinkIds.length === 1 ? '' : 's'} could not be named — those slots use generic labels.\n </p>\n )}\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-sm)' }}>\n <div>\n <label htmlFor=\"tpl-name\" style={label}>\n Template name\n </label>\n <Input\n id=\"tpl-name\"\n value={name}\n disabled={publishing}\n onChange={(e) => {\n setName(e.target.value);\n setSlug(slugify(e.target.value));\n }}\n />\n </div>\n\n <div>\n <label htmlFor=\"tpl-slug\" style={label}>\n Slug\n </label>\n <Input\n id=\"tpl-slug\"\n value={slug}\n disabled={publishing}\n onChange={(e) => setSlug(slugify(e.target.value))}\n />\n </div>\n\n <div>\n <label htmlFor=\"tpl-desc\" style={label}>\n Description\n </label>\n <Textarea\n id=\"tpl-desc\"\n rows={3}\n value={description}\n disabled={publishing}\n placeholder=\"What is this dashboard for, and what data does it need?\"\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n\n {error && <p style={{ color: 'var(--color-text-danger)', fontSize: 'var(--font-size-sm)' }}>{error}</p>}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={publishing}>\n {result ? 'Done' : 'Cancel'}\n </Button>\n {!result && (\n <Button onClick={handlePublish} disabled={publishing}>\n {publishing ? <Spinner /> : 'Publish'}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default PublishToStoreDialog;\n"],"mappings":"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"}
1
+ {"version":3,"file":"PublishToStoreDialog.js","names":[],"sources":["../../../../src/bigconsole/components/dashboard/PublishToStoreDialog.tsx"],"sourcesContent":["/**\n * PublishToStoreDialog\n *\n * Turns the open dashboard into a store template.\n *\n * WHY THIS EXISTS:\n * A workflow template's {nodes, edges} can plausibly be hand-written into the\n * developer portal. A dashboard export — every widget with its layout\n * coordinates, bindings and filters — cannot. Without this, authoring a\n * dashboard template means hand-crafting a large JSON document, which nobody\n * will do, and the gallery stays empty.\n *\n * The backend tokenises the board (replacing this workspace's data-sink\n * references with named slots), then a DRAFT Dashboard Template application is\n * created in the developer portal from the result. It deliberately stops there\n * rather than writing a store product directly: devportal already owns\n * versioning, review and publisher identity for dashboard templates, and\n * forking that pipeline would orphan the listing.\n *\n * @module bigconsole/components/dashboard/PublishToStoreDialog\n */\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Spinner,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { type FC, memo, useCallback, useEffect, useState } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nimport { useStoreDashboardTemplates, type PublishToStoreResult } from '../../hooks/useStoreDashboardTemplates';\n\nexport interface PublishToStoreDialogProps {\n isOpen: boolean;\n dashboardId: string;\n dashboardName: string;\n dashboardDescription?: string | null;\n onClose: () => void;\n onPublished?: (result: PublishToStoreResult) => void;\n}\n\n/** Store slugs are lowercase, hyphenated and unique. */\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean)\n .join('-')\n .slice(0, 60);\n}\n\nexport const PublishToStoreDialog: FC<PublishToStoreDialogProps> = memo(function PublishToStoreDialog({\n isOpen,\n dashboardId,\n dashboardName,\n dashboardDescription,\n onClose,\n onPublished,\n}) {\n const { t } = useI18n();\n const { publishToStore } = useStoreDashboardTemplates({ autoLoad: false });\n\n const [name, setName] = useState(dashboardName);\n const [slug, setSlug] = useState(slugify(dashboardName));\n const [description, setDescription] = useState(dashboardDescription ?? '');\n const [includeSampleData, setIncludeSampleData] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<PublishToStoreResult | null>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n setName(dashboardName);\n setSlug(slugify(dashboardName));\n setDescription(dashboardDescription ?? '');\n setIncludeSampleData(false);\n setError(null);\n setResult(null);\n }, [isOpen, dashboardName, dashboardDescription]);\n\n const handlePublish = useCallback(async () => {\n if (!name.trim()) {\n setError(t('bigconsole.dashboards.publishStore.error.nameRequired', 'A template name is required'));\n return;\n }\n if (!slug.trim()) {\n setError(t('bigconsole.dashboards.publishStore.error.slugRequired', 'A slug is required'));\n return;\n }\n if (!description.trim()) {\n setError(\n t(\n 'bigconsole.dashboards.publishStore.error.descriptionRequired',\n 'A description is required — it is what people see in the gallery'\n )\n );\n return;\n }\n\n setError(null);\n setPublishing(true);\n try {\n const published = await publishToStore({\n dashboardId,\n name: name.trim(),\n slug: slug.trim(),\n description: description.trim(),\n includeSampleData,\n });\n if (!published.success) {\n setError(\n published.errorMessage ??\n t('bigconsole.dashboards.publishStore.error.publishFailed', 'Failed to publish to the store')\n );\n return;\n }\n setResult(published);\n onPublished?.(published);\n } finally {\n setPublishing(false);\n }\n }, [name, slug, description, includeSampleData, dashboardId, publishToStore, onPublished, t]);\n\n const label = { display: 'block', marginBottom: 'var(--space-2xs)', fontSize: 'var(--font-size-sm)' };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && !publishing && onClose()}>\n <DialogContent style={{ maxWidth: '520px' }}>\n <DialogHeader>\n <DialogTitle>{t('bigconsole.dashboards.publishStore.title', 'Publish as Template')}</DialogTitle>\n <DialogDescription>\n {t(\n 'bigconsole.dashboards.publishStore.subtitle',\n 'Share this dashboard as a reusable template. Your data sources are replaced with named slots, so nothing from this workspace is published.'\n )}\n </DialogDescription>\n </DialogHeader>\n\n {result ? (\n <div style={{ padding: 'var(--space-md) 0' }}>\n <p style={{ fontWeight: 'var(--font-weight-medium)' }}>\n {t('bigconsole.dashboards.publishStore.result.title', 'Draft template created')}\n </p>\n <p style={{ fontSize: 'var(--font-size-sm)', color: 'var(--color-text-muted)' }}>\n {result.sinkCount === 1\n ? t(\n 'bigconsole.dashboards.publishStore.result.sinksOne',\n '{{count}} data source turned into slots. Finish in the Developer Portal: review the listing, then submit it for approval. It appears in the gallery once approved.',\n { count: result.sinkCount ?? '' }\n )\n : t(\n 'bigconsole.dashboards.publishStore.result.sinksMany',\n '{{count}} data sources turned into slots. Finish in the Developer Portal: review the listing, then submit it for approval. It appears in the gallery once approved.',\n { count: result.sinkCount ?? '' }\n )}\n </p>\n {result.unknownSinkIds.length > 0 && (\n <p style={{ fontSize: 'var(--font-size-sm)', color: 'var(--color-text-warning)' }}>\n {result.unknownSinkIds.length === 1\n ? t(\n 'bigconsole.dashboards.publishStore.result.unknownOne',\n '{{count}} data source could not be named — those slots use generic labels.',\n { count: result.unknownSinkIds.length ?? '' }\n )\n : t(\n 'bigconsole.dashboards.publishStore.result.unknownMany',\n '{{count}} data sources could not be named — those slots use generic labels.',\n { count: result.unknownSinkIds.length ?? '' }\n )}\n </p>\n )}\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-sm)' }}>\n <div>\n <label htmlFor=\"tpl-name\" style={label}>\n {t('bigconsole.dashboards.publishStore.field.name', 'Template name')}\n </label>\n <Input\n id=\"tpl-name\"\n value={name}\n disabled={publishing}\n onChange={(e) => {\n setName(e.target.value);\n setSlug(slugify(e.target.value));\n }}\n />\n </div>\n\n <div>\n <label htmlFor=\"tpl-slug\" style={label}>\n {t('bigconsole.dashboards.publishStore.field.slug', 'Slug')}\n </label>\n <Input\n id=\"tpl-slug\"\n value={slug}\n disabled={publishing}\n onChange={(e) => setSlug(slugify(e.target.value))}\n />\n </div>\n\n <div>\n <label htmlFor=\"tpl-desc\" style={label}>\n {t('bigconsole.dashboards.publishStore.field.description', 'Description')}\n </label>\n <Textarea\n id=\"tpl-desc\"\n rows={3}\n value={description}\n disabled={publishing}\n placeholder={t(\n 'bigconsole.dashboards.publishStore.field.descriptionPlaceholder',\n 'What is this dashboard for, and what data does it need?'\n )}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n\n {error && <p style={{ color: 'var(--color-text-danger)', fontSize: 'var(--font-size-sm)' }}>{error}</p>}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={publishing}>\n {result\n ? t('bigconsole.dashboards.publishStore.action.done', 'Done')\n : t('bigconsole.dashboards.publishStore.action.cancel', 'Cancel')}\n </Button>\n {!result && (\n <Button onClick={handlePublish} disabled={publishing}>\n {publishing ? <Spinner /> : t('bigconsole.dashboards.publishStore.action.publish', 'Publish')}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default PublishToStoreDialog;\n"],"mappings":"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"}