@burdenoff/microfe-bigconsole 2026.1011.10 → 2026.1012.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.
Files changed (169) hide show
  1. package/README.md +19 -0
  2. package/dist/bigconsole/BigConsoleRoot.js +88 -82
  3. package/dist/bigconsole/BigConsoleRoutes.js +163 -136
  4. package/dist/bigconsole/assistant/assistantProduct.js +1 -4
  5. package/dist/bigconsole/assistant/pageContext.d.ts +0 -14
  6. package/dist/bigconsole/assistant/pageContext.js +1 -6
  7. package/dist/bigconsole/assistant/recordAdapters.js +26 -27
  8. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +31 -31
  9. package/dist/bigconsole/components/common/index.d.ts +0 -1
  10. package/dist/bigconsole/components/common/index.js +0 -1
  11. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +357 -337
  12. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +36 -36
  13. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +59 -59
  14. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +58 -57
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +41 -41
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
  18. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +34 -34
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +110 -110
  20. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +21 -21
  21. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
  22. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +164 -173
  23. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -101
  24. package/dist/bigconsole/components/dashboard/TemplateInstallOptions.js +31 -31
  25. package/dist/bigconsole/components/dashboard/TemplateLayoutPreview.js +17 -17
  26. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
  27. package/dist/bigconsole/components/dashboard/WidgetPalette.js +165 -163
  28. package/dist/bigconsole/components/datasink/AlertExecutionHistory.js +37 -37
  29. package/dist/bigconsole/components/datasink/AlertRuleEditor.js +66 -66
  30. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
  31. package/dist/bigconsole/components/datasink/DataSinkCard.js +50 -51
  32. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
  33. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
  34. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +47 -47
  35. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +91 -91
  36. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
  37. package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
  38. package/dist/bigconsole/components/parser/ImportParserDialog.js +120 -120
  39. package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
  40. package/dist/bigconsole/components/pipeline/PipelineScopePicker.js +10 -10
  41. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +76 -77
  42. package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -96
  43. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +4 -4
  44. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +93 -93
  45. package/dist/bigconsole/components/widgets/PropertiesPanel.js +499 -507
  46. package/dist/bigconsole/components/widgets/WidgetRegistry.js +0 -1
  47. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +4 -4
  48. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
  49. package/dist/bigconsole/components/widgets/chart/ChartWidget.js +125 -129
  50. package/dist/bigconsole/components/widgets/chart/charts/AreaChart.js +50 -45
  51. package/dist/bigconsole/components/widgets/chart/charts/BarChart.js +40 -35
  52. package/dist/bigconsole/components/widgets/chart/charts/ComboChart.js +41 -48
  53. package/dist/bigconsole/components/widgets/chart/charts/LineChart.js +41 -36
  54. package/dist/bigconsole/components/widgets/chart/charts/numericSeries.d.ts +6 -0
  55. package/dist/bigconsole/components/widgets/chart/charts/numericSeries.js +26 -0
  56. package/dist/bigconsole/components/widgets/chart/charts/types.d.ts +2 -0
  57. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
  58. package/dist/bigconsole/components/widgets/custom/CustomWidget.js +73 -131
  59. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
  60. package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
  61. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
  62. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
  63. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.d.ts +28 -9
  64. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +115 -42
  65. package/dist/bigconsole/components/widgets/iframe-widget/framePolicy.d.ts +20 -0
  66. package/dist/bigconsole/components/widgets/iframe-widget/framePolicy.js +10 -0
  67. package/dist/bigconsole/components/widgets/iframe-widget/index.d.ts +2 -1
  68. package/dist/bigconsole/components/widgets/iframe-widget/index.js +3 -2
  69. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
  70. package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
  71. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
  72. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
  73. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
  74. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
  75. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
  76. package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
  77. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +110 -27
  78. package/dist/bigconsole/components/widgets/text-widget/textData.d.ts +6 -0
  79. package/dist/bigconsole/components/widgets/text-widget/textData.js +17 -14
  80. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
  81. package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js +15 -15
  82. package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js +15 -15
  83. package/dist/bigconsole/context/BigConsoleContext.d.ts +10 -0
  84. package/dist/bigconsole/context/BigConsoleContext.js +47 -30
  85. package/dist/bigconsole/context/index.d.ts +1 -1
  86. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +58 -49
  87. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +74 -72
  88. package/dist/bigconsole/customWidget/proposalPreview.d.ts +5 -0
  89. package/dist/bigconsole/customWidget/proposalPreview.js +31 -0
  90. package/dist/bigconsole/hooks/useDataSinkAlerts.d.ts +0 -23
  91. package/dist/bigconsole/hooks/useDataSinkAlerts.js +113 -138
  92. package/dist/bigconsole/hooks/useDataSinkOperations.d.ts +7 -0
  93. package/dist/bigconsole/hooks/useDataSinkOperations.js +109 -98
  94. package/dist/bigconsole/hooks/useDataSinkSubscription.js +0 -1
  95. package/dist/bigconsole/hooks/useDrilldown.js +68 -67
  96. package/dist/bigconsole/hooks/useExportDataSink.js +1 -1
  97. package/dist/bigconsole/hooks/useGlobalFilters.js +3 -3
  98. package/dist/bigconsole/hooks/useImportDataSink.js +102 -90
  99. package/dist/bigconsole/pages/AdminPage.js +130 -130
  100. package/dist/bigconsole/pages/DashboardBuilderPage.js +60 -72
  101. package/dist/bigconsole/pages/DashboardViewPage.js +235 -258
  102. package/dist/bigconsole/pages/DashboardsPage.js +221 -269
  103. package/dist/bigconsole/pages/DataParsersPage.js +157 -180
  104. package/dist/bigconsole/pages/DataSinkAlertsPage.js +55 -62
  105. package/dist/bigconsole/pages/DataSinkBuilderPage.js +318 -295
  106. package/dist/bigconsole/pages/DataSinkViewPage.js +256 -255
  107. package/dist/bigconsole/pages/DataSinksPage.js +216 -251
  108. package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
  109. package/dist/bigconsole/pages/InsightsPage.js +265 -279
  110. package/dist/bigconsole/pages/OverviewPage.js +47 -47
  111. package/dist/bigconsole/pages/ParserBuilderPage.js +213 -229
  112. package/dist/bigconsole/pages/ParserViewPage.js +97 -97
  113. package/dist/bigconsole/pages/PipelineBuilderPage.js +214 -256
  114. package/dist/bigconsole/pages/PipelineViewPage.js +146 -146
  115. package/dist/bigconsole/pages/PipelinesPage.js +88 -107
  116. package/dist/bigconsole/pages/SettingsPage.js +173 -179
  117. package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
  118. package/dist/bigconsole/pages/WorkflowViewPage.js +1 -1
  119. package/dist/bigconsole/pages/WorkflowsPage.js +141 -141
  120. package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +12 -12
  121. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +235 -122
  122. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.d.ts +6 -1
  123. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +151 -151
  124. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
  125. package/dist/bigconsole/renderers/adapters/adaptiveCardContent.d.ts +29 -0
  126. package/dist/bigconsole/renderers/adapters/adaptiveCardContent.js +51 -0
  127. package/dist/bigconsole/store/widgetStore.d.ts +0 -12
  128. package/dist/bigconsole/store/widgetStore.js +1 -3
  129. package/dist/bigconsole/types/index.d.ts +17 -2
  130. package/dist/bigconsole/utils/backendError.d.ts +0 -18
  131. package/dist/bigconsole/utils/dataSinkPayload.d.ts +48 -0
  132. package/dist/bigconsole/utils/dataSinkPayload.js +38 -0
  133. package/dist/bigconsole/utils/index.d.ts +2 -0
  134. package/dist/bigconsole/utils/safeUrl.d.ts +79 -0
  135. package/dist/bigconsole/utils/safeUrl.js +93 -0
  136. package/dist/bigconsole/utils/sanitizeHtml.d.ts +16 -0
  137. package/dist/bigconsole/utils/sanitizeHtml.js +67 -0
  138. package/dist/bigconsole/workflowOpen.js +14 -15
  139. package/dist/generated/wspace-operations.d.ts +138 -8
  140. package/dist/generated/wspace-operations.js +281 -240
  141. package/dist/node_modules/dompurify/dist/purify.es.js +800 -0
  142. package/package.json +9 -5
  143. package/dist/bigconsole/assistant/displayCopy.d.ts +0 -32
  144. package/dist/bigconsole/assistant/pageControls.d.ts +0 -81
  145. package/dist/bigconsole/assistant/pageControls.js +0 -169
  146. package/dist/bigconsole/assistant/previewControl.d.ts +0 -16
  147. package/dist/bigconsole/assistant/previewControl.js +0 -10
  148. package/dist/bigconsole/assistant/usePreviewControl.d.ts +0 -2
  149. package/dist/bigconsole/assistant/usePreviewControl.js +0 -20
  150. package/dist/bigconsole/components/common/SortBySelect.d.ts +0 -11
  151. package/dist/bigconsole/components/common/SortBySelect.js +0 -29
  152. package/dist/bigconsole/constants/backendErrors.js +0 -94
  153. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts +0 -14
  154. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js +0 -32
  155. package/dist/bigconsole/utils/backendError.js +0 -42
  156. package/dist/bigconsole/utils/dashboardList.d.ts +0 -28
  157. package/dist/bigconsole/utils/dashboardList.js +0 -15
  158. package/dist/bigconsole/utils/dataSinkList.d.ts +0 -15
  159. package/dist/bigconsole/utils/dataSinkList.js +0 -15
  160. package/dist/bigconsole/utils/formDirty.d.ts +0 -82
  161. package/dist/bigconsole/utils/formDirty.js +0 -21
  162. package/dist/bigconsole/utils/insightsDraft.d.ts +0 -29
  163. package/dist/bigconsole/utils/insightsDraft.js +0 -8
  164. package/dist/bigconsole/utils/layoutBaseline.d.ts +0 -130
  165. package/dist/bigconsole/utils/layoutBaseline.js +0 -96
  166. package/dist/bigconsole/utils/listSort.d.ts +0 -80
  167. package/dist/bigconsole/utils/listSort.js +0 -85
  168. package/dist/bigconsole/utils/widgetFormDirty.d.ts +0 -16
  169. package/dist/bigconsole/utils/widgetFormDirty.js +0 -13
@@ -0,0 +1,26 @@
1
+ //#region src/bigconsole/components/widgets/chart/charts/numericSeries.ts
2
+ function e(e, t, n) {
3
+ let r = e[0];
4
+ return r ? [...new Set((n ?? Object.keys(r)).filter((e) => {
5
+ if (typeof e != "string" || e === t) return !1;
6
+ let n = r[e];
7
+ return typeof n == "number" && Number.isFinite(n);
8
+ }))] : [];
9
+ }
10
+ function t(t, n) {
11
+ if (n.series?.length) {
12
+ if (n.selectedFields === void 0) return n.series;
13
+ let r = new Map(n.series.map((e) => [e.field, e]));
14
+ return e(t, n.xAxisKey, n.selectedFields).flatMap((e) => {
15
+ let t = r.get(e);
16
+ return t ? [t] : [];
17
+ });
18
+ }
19
+ return e(t, n.xAxisKey, n.selectedFields).map((e, t) => ({
20
+ field: e,
21
+ type: t === 0 ? "bar" : "line",
22
+ axis: t === 0 ? "left" : "right"
23
+ }));
24
+ }
25
+ //#endregion
26
+ export { t as configuredNumericSeries, e as numericSeriesKeys };
@@ -31,6 +31,8 @@ export interface ChartConfig {
31
31
  type?: ChartType;
32
32
  /** X-axis data key */
33
33
  xAxisKey?: string;
34
+ /** Ordered numeric series selection; undefined auto-detects, an empty list displays no series. */
35
+ selectedFields?: string[];
34
36
  /** X-axis label */
35
37
  xAxisLabel?: string;
36
38
  /** Y-axis label */
@@ -1,8 +1,8 @@
1
1
  import e from "../../../hooks/useWidgetComments.js";
2
2
  import { useCallback as t, useEffect as n, useRef as r, useState as i } from "react";
3
3
  import { Check as a, CornerDownRight as o, Loader2 as s, MessageSquare as c, RotateCcw as l, Send as u, Trash2 as d, X as f } from "lucide-react";
4
- import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
4
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
5
+ import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
6
  //#region src/bigconsole/components/widgets/comments/WidgetComments.tsx
7
7
  function g(e, t) {
8
8
  return e("bigconsole.widget.comments.authorLabel", "User {{id}}", { id: t.slice(0, 6) });
@@ -15,62 +15,62 @@ function _(e) {
15
15
  }).format(t);
16
16
  }
17
17
  var v = ({ comment: e, isReply: t, busy: n, onResolve: r, onDelete: i, onReply: s }) => {
18
- let { t: c } = p(), u = !!e.resolvedAt, f = e.content.text ?? e.content.markdown ?? "";
19
- return /* @__PURE__ */ m("div", {
18
+ let { t: c } = h(), u = !!e.resolvedAt, f = e.content.text ?? e.content.markdown ?? "";
19
+ return /* @__PURE__ */ p("div", {
20
20
  className: t ? "pl-6" : "",
21
- children: /* @__PURE__ */ h("div", {
21
+ children: /* @__PURE__ */ m("div", {
22
22
  className: "rounded-md border border-[var(--color-border-default)] bg-bg-surface p-2.5",
23
23
  children: [
24
- /* @__PURE__ */ h("div", {
24
+ /* @__PURE__ */ m("div", {
25
25
  className: "flex items-center justify-between gap-2",
26
- children: [/* @__PURE__ */ m("span", {
26
+ children: [/* @__PURE__ */ p("span", {
27
27
  className: "text-xs font-medium text-text-primary",
28
28
  children: g(c, e.authorId)
29
- }), /* @__PURE__ */ m("span", {
29
+ }), /* @__PURE__ */ p("span", {
30
30
  className: "text-[10px] text-text-muted tabular-nums",
31
31
  children: _(e.createdAt)
32
32
  })]
33
33
  }),
34
- /* @__PURE__ */ m("p", {
34
+ /* @__PURE__ */ p("p", {
35
35
  className: "mt-1 whitespace-pre-wrap break-words text-sm text-text-secondary",
36
36
  children: f
37
37
  }),
38
- /* @__PURE__ */ h("div", {
38
+ /* @__PURE__ */ m("div", {
39
39
  className: "mt-1.5 flex items-center gap-2",
40
40
  children: [
41
- u && /* @__PURE__ */ h("span", {
41
+ u && /* @__PURE__ */ m("span", {
42
42
  className: "inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-medium bg-status-success-bg text-status-success-text",
43
43
  children: [
44
- /* @__PURE__ */ m(a, { className: "h-3 w-3" }),
44
+ /* @__PURE__ */ p(a, { className: "h-3 w-3" }),
45
45
  " ",
46
46
  c("bigconsole.widget.comments.resolvedBadge", "Resolved")
47
47
  ]
48
48
  }),
49
- s && /* @__PURE__ */ h("button", {
49
+ s && /* @__PURE__ */ m("button", {
50
50
  type: "button",
51
51
  disabled: n,
52
52
  onClick: () => s(e.id),
53
53
  className: "inline-flex items-center gap-1 text-[11px] text-text-muted hover:text-text-primary disabled:opacity-50",
54
54
  children: [
55
- /* @__PURE__ */ m(o, { className: "h-3 w-3" }),
55
+ /* @__PURE__ */ p(o, { className: "h-3 w-3" }),
56
56
  " ",
57
57
  c("bigconsole.widget.comments.reply", "Reply")
58
58
  ]
59
59
  }),
60
- /* @__PURE__ */ h("button", {
60
+ /* @__PURE__ */ m("button", {
61
61
  type: "button",
62
62
  disabled: n,
63
63
  onClick: () => r(e.id, !u),
64
64
  className: "inline-flex items-center gap-1 text-[11px] text-text-muted hover:text-text-primary disabled:opacity-50",
65
- children: [m(u ? l : a, { className: "h-3 w-3" }), u ? c("bigconsole.widget.comments.reopen", "Reopen") : c("bigconsole.widget.comments.resolve", "Resolve")]
65
+ children: [p(u ? l : a, { className: "h-3 w-3" }), u ? c("bigconsole.widget.comments.reopen", "Reopen") : c("bigconsole.widget.comments.resolve", "Resolve")]
66
66
  }),
67
- /* @__PURE__ */ h("button", {
67
+ /* @__PURE__ */ m("button", {
68
68
  type: "button",
69
69
  disabled: n,
70
70
  onClick: () => i(e.id),
71
71
  className: "inline-flex items-center gap-1 text-[11px] text-status-error-text hover:opacity-80 disabled:opacity-50",
72
72
  children: [
73
- /* @__PURE__ */ m(d, { className: "h-3 w-3" }),
73
+ /* @__PURE__ */ p(d, { className: "h-3 w-3" }),
74
74
  " ",
75
75
  c("bigconsole.widget.comments.delete", "Delete")
76
76
  ]
@@ -81,13 +81,13 @@ var v = ({ comment: e, isReply: t, busy: n, onResolve: r, onDelete: i, onReply:
81
81
  })
82
82
  });
83
83
  }, y = ({ placeholder: e, busy: t, autoFocus: n, onSubmit: r, onCancel: a }) => {
84
- let { t: o } = p(), [c, l] = i(""), d = async () => {
84
+ let { t: o } = h(), [c, l] = i(""), d = async () => {
85
85
  let e = c.trim();
86
86
  e && await r(e) !== !1 && l("");
87
87
  };
88
- return /* @__PURE__ */ h("div", {
88
+ return /* @__PURE__ */ m("div", {
89
89
  className: "flex items-end gap-2",
90
- children: [/* @__PURE__ */ m("textarea", {
90
+ children: [/* @__PURE__ */ p("textarea", {
91
91
  autoFocus: n,
92
92
  value: c,
93
93
  onChange: (e) => l(e.target.value),
@@ -97,26 +97,26 @@ var v = ({ comment: e, isReply: t, busy: n, onResolve: r, onDelete: i, onReply:
97
97
  rows: 2,
98
98
  placeholder: e,
99
99
  className: "flex-1 resize-none rounded-md border border-[var(--color-border-default)] bg-bg-surface px-2.5 py-1.5 text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:ring-2 focus:ring-action-primary-bg"
100
- }), /* @__PURE__ */ h("div", {
100
+ }), /* @__PURE__ */ m("div", {
101
101
  className: "flex flex-col gap-1",
102
- children: [/* @__PURE__ */ m("button", {
102
+ children: [/* @__PURE__ */ p("button", {
103
103
  type: "button",
104
104
  disabled: t || !c.trim(),
105
105
  onClick: () => void d(),
106
106
  title: o("bigconsole.widget.comments.postTitle", "Post (⌘/Ctrl + Enter)"),
107
107
  className: "inline-flex items-center justify-center rounded-md bg-action-primary-bg p-1.5 text-action-primary-text hover:opacity-90 disabled:opacity-50",
108
- children: t ? /* @__PURE__ */ m(s, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ m(u, { className: "h-4 w-4" })
109
- }), a && /* @__PURE__ */ m("button", {
108
+ children: t ? /* @__PURE__ */ p(s, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ p(u, { className: "h-4 w-4" })
109
+ }), a && /* @__PURE__ */ p("button", {
110
110
  type: "button",
111
111
  onClick: a,
112
112
  className: "inline-flex items-center justify-center rounded-md border border-[var(--color-border-default)] p-1.5 text-text-muted hover:text-text-primary",
113
113
  title: o("bigconsole.widget.comments.cancelReplyTitle", "Cancel reply"),
114
- children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
114
+ children: /* @__PURE__ */ p(f, { className: "h-4 w-4" })
115
115
  })]
116
116
  })]
117
117
  });
118
118
  }, b = ({ widgetId: a, onClose: o }) => {
119
- let { t: l } = p(), { threads: u, count: d, loading: g, error: _, mutating: b, addComment: x, resolveComment: S, deleteComment: C } = e(a), [w, T] = i(null), [E, D] = i(!1), O = r(null);
119
+ let { t: l } = h(), { threads: u, count: d, loading: g, error: _, mutating: b, addComment: x, resolveComment: S, deleteComment: C } = e(a), [w, T] = i(null), [E, D] = i(!1), O = r(null);
120
120
  n(() => {
121
121
  if (!E) return;
122
122
  let e = O.current;
@@ -129,7 +129,7 @@ var v = ({ comment: e, isReply: t, busy: n, onResolve: r, onDelete: i, onReply:
129
129
  let n = await x(e, t);
130
130
  return n && (t ? T(null) : D(!0)), n;
131
131
  }, [x]);
132
- return /* @__PURE__ */ h("div", {
132
+ return /* @__PURE__ */ m("div", {
133
133
  className: "absolute inset-0 z-40 flex flex-col bg-bg-surface/98 backdrop-blur-sm",
134
134
  role: "dialog",
135
135
  "aria-label": l("bigconsole.widget.comments.dialogAriaLabel", "Widget comments"),
@@ -139,66 +139,66 @@ var v = ({ comment: e, isReply: t, busy: n, onResolve: r, onDelete: i, onReply:
139
139
  e.key === "Escape" && (e.stopPropagation(), o());
140
140
  },
141
141
  children: [
142
- /* @__PURE__ */ h("div", {
142
+ /* @__PURE__ */ m("div", {
143
143
  className: "flex min-w-0 items-center justify-between gap-2 border-b border-[var(--color-border-subtle)] bg-bg-surface px-3 py-2 sm:px-4",
144
- children: [/* @__PURE__ */ h("h3", {
144
+ children: [/* @__PURE__ */ m("h3", {
145
145
  className: "flex min-w-0 items-center gap-2 text-sm font-semibold leading-tight tracking-tight text-text-primary",
146
146
  children: [
147
- /* @__PURE__ */ m(c, {
147
+ /* @__PURE__ */ p(c, {
148
148
  "aria-hidden": "true",
149
149
  className: "h-icon-sm w-icon-sm shrink-0 text-text-secondary"
150
150
  }),
151
151
  l("bigconsole.widget.comments.title", "Comments"),
152
- /* @__PURE__ */ m("span", {
152
+ /* @__PURE__ */ p("span", {
153
153
  className: "rounded-full bg-bg-sunken px-1.5 py-0.5 text-[10px] text-text-secondary tabular-nums",
154
154
  children: d
155
155
  })
156
156
  ]
157
- }), /* @__PURE__ */ m("button", {
157
+ }), /* @__PURE__ */ p("button", {
158
158
  type: "button",
159
159
  onClick: o,
160
160
  "aria-label": l("bigconsole.widget.comments.closeAriaLabel", "Close comments"),
161
161
  className: "shrink-0 rounded-button p-1 text-text-muted hover:bg-bg-sunken hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface",
162
- children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
162
+ children: /* @__PURE__ */ p(f, { className: "h-4 w-4" })
163
163
  })]
164
164
  }),
165
- /* @__PURE__ */ h("div", {
165
+ /* @__PURE__ */ m("div", {
166
166
  ref: O,
167
167
  className: "flex-1 space-y-3 overflow-auto p-3",
168
168
  children: [
169
- g && u.length === 0 && /* @__PURE__ */ m("div", {
169
+ g && u.length === 0 && /* @__PURE__ */ p("div", {
170
170
  className: "flex items-center justify-center py-8 text-text-muted",
171
- children: /* @__PURE__ */ m(s, { className: "h-5 w-5 animate-spin" })
171
+ children: /* @__PURE__ */ p(s, { className: "h-5 w-5 animate-spin" })
172
172
  }),
173
- _ && !g && /* @__PURE__ */ m("p", {
173
+ _ && !g && /* @__PURE__ */ p("p", {
174
174
  role: "alert",
175
175
  className: "rounded-input border border-[var(--color-status-error-border)] bg-status-error-bg-subtle px-2.5 py-2 text-xs text-[var(--color-status-error-text)]",
176
176
  children: l("bigconsole.widget.comments.loadError", "Couldn’t load comments.")
177
177
  }),
178
- !g && !_ && u.length === 0 && /* @__PURE__ */ m("p", {
178
+ !g && !_ && u.length === 0 && /* @__PURE__ */ p("p", {
179
179
  className: "py-8 text-center text-sm text-text-muted",
180
180
  children: l("bigconsole.widget.comments.empty", "No comments yet. Start the conversation.")
181
181
  }),
182
- u.map(({ comment: e, replies: t }) => /* @__PURE__ */ h("div", {
182
+ u.map(({ comment: e, replies: t }) => /* @__PURE__ */ m("div", {
183
183
  className: "space-y-2",
184
184
  children: [
185
- /* @__PURE__ */ m(v, {
185
+ /* @__PURE__ */ p(v, {
186
186
  comment: e,
187
187
  busy: b,
188
188
  onResolve: (e, t) => void S(e, t),
189
189
  onDelete: (e) => void C(e),
190
190
  onReply: (e) => T((t) => t === e ? null : e)
191
191
  }),
192
- t.map((e) => /* @__PURE__ */ m(v, {
192
+ t.map((e) => /* @__PURE__ */ p(v, {
193
193
  comment: e,
194
194
  isReply: !0,
195
195
  busy: b,
196
196
  onResolve: (e, t) => void S(e, t),
197
197
  onDelete: (e) => void C(e)
198
198
  }, e.id)),
199
- w === e.id && /* @__PURE__ */ m("div", {
199
+ w === e.id && /* @__PURE__ */ p("div", {
200
200
  className: "pl-6",
201
- children: /* @__PURE__ */ m(y, {
201
+ children: /* @__PURE__ */ p(y, {
202
202
  placeholder: l("bigconsole.widget.comments.replyPlaceholder", "Write a reply…"),
203
203
  busy: b,
204
204
  autoFocus: !0,
@@ -210,9 +210,9 @@ var v = ({ comment: e, isReply: t, busy: n, onResolve: r, onDelete: i, onReply:
210
210
  }, e.id))
211
211
  ]
212
212
  }),
213
- /* @__PURE__ */ m("div", {
213
+ /* @__PURE__ */ p("div", {
214
214
  className: "border-t border-[var(--color-border-default)] p-3",
215
- children: /* @__PURE__ */ m(y, {
215
+ children: /* @__PURE__ */ p(y, {
216
216
  placeholder: l("bigconsole.widget.comments.addPlaceholder", "Add a comment…"),
217
217
  busy: b,
218
218
  onSubmit: (e) => k(e)
@@ -1,145 +1,87 @@
1
- import { asNonEmptyString as e, asRecord as t } from "./utils.js";
2
- import { getCustomConfigContent as n } from "./config.js";
3
- import { memo as r, useMemo as i } from "react";
4
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
1
+ import { useOptionalBigConsole as e } from "../../../context/BigConsoleContext.js";
2
+ import "../../../context/index.js";
3
+ import { currentAppOrigin as t, resolveFrameSrc as n } from "../../../utils/safeUrl.js";
4
+ import { asNonEmptyString as r, asRecord as i } from "./utils.js";
5
+ import { getCustomConfigContent as a } from "./config.js";
6
+ import { sanitizeWidgetHtml as o } from "../../../utils/sanitizeHtml.js";
7
+ import { FRAME_REFERRER_POLICY as s, FRAME_SANDBOX as c, frameKey as l } from "../iframe-widget/framePolicy.js";
8
+ import { memo as u, useMemo as d } from "react";
9
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
5
10
  //#region src/bigconsole/components/widgets/custom/CustomWidget.tsx
6
- var s = "allow-scripts", c = new Set([
7
- "allow-forms",
8
- "allow-modals",
9
- "allow-orientation-lock",
10
- "allow-pointer-lock",
11
- "allow-popups",
12
- "allow-popups-to-escape-sandbox",
13
- "allow-presentation",
14
- "allow-same-origin",
15
- "allow-scripts",
16
- "allow-storage-access-by-user-activation"
17
- ]);
18
- function l(e) {
19
- let t = e.trim();
20
- if (!t) return !1;
21
- if (t.startsWith("#")) return !0;
22
- if (t.startsWith("/")) return !t.startsWith("//");
23
- try {
24
- let e = new URL(t, window.location.origin);
25
- return e.protocol === "http:" || e.protocol === "https:";
26
- } catch {
27
- return !1;
28
- }
29
- }
30
- function u(e) {
31
- return e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;");
32
- }
33
- function d(e) {
34
- if (typeof window > "u") return u(e);
35
- let t = new DOMParser().parseFromString(e, "text/html");
36
- return t.body.querySelectorAll("script, style, iframe, object, embed, link, meta, base, form").forEach((e) => {
37
- e.remove();
38
- }), t.body.querySelectorAll("*").forEach((e) => {
39
- Array.from(e.attributes).forEach((t) => {
40
- let n = t.name.toLowerCase(), r = t.value.trim();
41
- if (n.startsWith("on")) {
42
- e.removeAttribute(t.name);
43
- return;
44
- }
45
- if (n === "style") {
46
- e.removeAttribute(t.name);
47
- return;
48
- }
49
- [
50
- "src",
51
- "href",
52
- "xlink:href"
53
- ].includes(n) && !l(r) && e.removeAttribute(t.name);
11
+ var m = u(function({ widget: u, data: m, render: h, onClick: g }) {
12
+ let _ = u.config, v = !!(g && u.drilldowns?.length), y = d(() => i(m), [m]), b = d(() => i(_), [_]), x = d(() => i(b?.props), [b]), S = d(() => a(_), [_]), C = S.componentId, w = e()?.iframeAllowedOrigins, T = d(() => {
13
+ let e = r(y?.html) ?? r(y?.contentHtml) ?? S.html;
14
+ if (!e) return null;
15
+ let t = o(e);
16
+ return t.trim().length > 0 ? t : null;
17
+ }, [y, S]), E = d(() => {
18
+ let e = r(y?.iframeUrl) ?? r(y?.url) ?? S.iframeUrl;
19
+ if (!e) return null;
20
+ let i = n(e, {
21
+ appOrigin: t(),
22
+ allowedOrigins: w
54
23
  });
55
- }), t.body.innerHTML;
56
- }
57
- function f(e) {
58
- let t = e.trim();
59
- if (!t || t.startsWith("//")) return null;
60
- if (t.startsWith("/")) return t;
61
- try {
62
- let e = new URL(t);
63
- if (e.protocol === "http:" || e.protocol === "https:") return e.href;
64
- } catch {
65
- return null;
66
- }
67
- return null;
68
- }
69
- function p(e) {
70
- if (!e) return s;
71
- let t = new Set(e.split(/\s+/).filter(Boolean)), n = Array.from(t).filter((e) => c.has(e)), r = n.includes("allow-scripts"), i = n.includes("allow-same-origin"), a = r && i ? n.filter((e) => e !== "allow-same-origin") : n;
72
- return a.length > 0 ? a.join(" ") : s;
73
- }
74
- var m = r(function({ widget: r, data: s, render: c, onClick: l }) {
75
- let u = r.config, m = !!(l && r.drilldowns?.length), h = i(() => t(s), [s]), g = i(() => t(u), [u]), _ = i(() => t(g?.props), [g]), v = i(() => n(u), [u]), y = v.componentId, b = i(() => {
76
- let t = e(h?.html) ?? e(h?.contentHtml) ?? v.html;
77
- if (!t) return null;
78
- let n = d(t);
79
- return n.trim().length > 0 ? n : null;
80
- }, [h, v]), x = i(() => {
81
- let t = e(h?.iframeUrl) ?? e(h?.url) ?? v.iframeUrl;
82
- if (!t) return null;
83
- let n = f(t);
84
- return n ? {
85
- url: n,
86
- title: e(h?.title) ?? e(_?.iframeTitle) ?? e(_?.title) ?? r.title ?? "Custom widget content",
87
- sandbox: p(e(g?.sandbox) ?? e(_?.sandbox))
88
- } : null;
24
+ if (!i.ok) return null;
25
+ let a = r(y?.title) ?? r(x?.iframeTitle) ?? r(x?.title) ?? u.title ?? "Custom widget content";
26
+ return {
27
+ url: i.src,
28
+ title: a
29
+ };
89
30
  }, [
90
- h,
91
- v,
92
- _,
93
- g,
94
- r.title
31
+ y,
32
+ S,
33
+ x,
34
+ u.title,
35
+ w
95
36
  ]);
96
- if (c) return /* @__PURE__ */ a("div", {
37
+ if (h) return /* @__PURE__ */ f("div", {
97
38
  className: `
98
39
  h-full
99
- ${m ? "cursor-pointer" : ""}
40
+ ${v ? "cursor-pointer" : ""}
100
41
  `,
101
- onClick: l,
102
- children: c(r, s)
42
+ onClick: g,
43
+ children: h(u, m)
103
44
  });
104
- if (b) return /* @__PURE__ */ a("div", {
45
+ if (T) return /* @__PURE__ */ f("div", {
105
46
  className: "h-full overflow-auto p-4",
106
- children: /* @__PURE__ */ a("div", {
47
+ children: /* @__PURE__ */ f("div", {
107
48
  className: "prose prose-sm max-w-none text-text-primary",
108
- dangerouslySetInnerHTML: { __html: b }
49
+ dangerouslySetInnerHTML: { __html: T }
109
50
  })
110
51
  });
111
- if (x) return /* @__PURE__ */ a("div", {
52
+ if (E) return /* @__PURE__ */ f("div", {
112
53
  className: "h-full w-full",
113
- children: /* @__PURE__ */ a("iframe", {
114
- src: x.url,
115
- title: x.title,
54
+ children: /* @__PURE__ */ f("iframe", {
55
+ sandbox: c,
56
+ referrerPolicy: s,
57
+ loading: "lazy",
58
+ title: E.title,
116
59
  className: "h-full w-full rounded border-0",
117
- sandbox: x.sandbox,
118
- loading: "lazy"
119
- })
60
+ src: E.url
61
+ }, l(E.url, c))
120
62
  });
121
- if (h && "value" in h) {
122
- let e = h.value, t = h.label || r.title, n = h.data;
123
- return /* @__PURE__ */ o("div", {
124
- className: `flex flex-col items-center justify-center h-full p-4 ${m ? "cursor-pointer hover:bg-bg-sunken/50 transition-colors" : ""}`,
125
- onClick: l,
63
+ if (y && "value" in y) {
64
+ let e = y.value, t = y.label || u.title, n = y.data;
65
+ return /* @__PURE__ */ p("div", {
66
+ className: `flex flex-col items-center justify-center h-full p-4 ${v ? "cursor-pointer hover:bg-bg-sunken/50 transition-colors" : ""}`,
67
+ onClick: g,
126
68
  children: [
127
- /* @__PURE__ */ a("div", {
69
+ /* @__PURE__ */ f("div", {
128
70
  className: "text-4xl font-bold text-text-primary tabular-nums",
129
71
  children: typeof e == "number" ? e.toLocaleString() : String(e)
130
72
  }),
131
- /* @__PURE__ */ a("div", {
73
+ /* @__PURE__ */ f("div", {
132
74
  className: "text-sm text-text-secondary mt-1",
133
75
  children: t
134
76
  }),
135
- n && /* @__PURE__ */ a("div", {
77
+ n && /* @__PURE__ */ f("div", {
136
78
  className: "mt-3 w-full grid grid-cols-2 gap-2 text-xs text-text-secondary",
137
- children: Object.entries(n).filter(([e]) => e !== "value" && e !== "label" && typeof n[e] != "object").slice(0, 4).map(([e, t]) => /* @__PURE__ */ o("div", {
79
+ children: Object.entries(n).filter(([e]) => e !== "value" && e !== "label" && typeof n[e] != "object").slice(0, 4).map(([e, t]) => /* @__PURE__ */ p("div", {
138
80
  className: "flex justify-between px-2 py-1 bg-bg-sunken rounded",
139
- children: [/* @__PURE__ */ a("span", {
81
+ children: [/* @__PURE__ */ f("span", {
140
82
  className: "capitalize",
141
83
  children: e.replace(/([A-Z])/g, " $1").trim()
142
- }), /* @__PURE__ */ a("span", {
84
+ }), /* @__PURE__ */ f("span", {
143
85
  className: "font-medium",
144
86
  children: typeof t == "number" ? t.toLocaleString() : String(t)
145
87
  })]
@@ -148,21 +90,21 @@ var m = r(function({ widget: r, data: s, render: c, onClick: l }) {
148
90
  ]
149
91
  });
150
92
  }
151
- return /* @__PURE__ */ o("div", {
93
+ return /* @__PURE__ */ p("div", {
152
94
  className: `
153
95
  flex flex-col items-center justify-center h-full p-4
154
- ${m ? "cursor-pointer hover:bg-bg-sunken/50 transition-colors" : ""}
96
+ ${v ? "cursor-pointer hover:bg-bg-sunken/50 transition-colors" : ""}
155
97
  `,
156
- onClick: l,
98
+ onClick: g,
157
99
  children: [
158
- /* @__PURE__ */ a("div", {
100
+ /* @__PURE__ */ f("div", {
159
101
  className: "w-16 h-16 mb-4 flex items-center justify-center rounded-lg bg-bg-sunken",
160
- children: /* @__PURE__ */ a("svg", {
102
+ children: /* @__PURE__ */ f("svg", {
161
103
  className: "w-8 h-8 text-text-secondary",
162
104
  fill: "none",
163
105
  stroke: "currentColor",
164
106
  viewBox: "0 0 24 24",
165
- children: /* @__PURE__ */ a("path", {
107
+ children: /* @__PURE__ */ f("path", {
166
108
  strokeLinecap: "round",
167
109
  strokeLinejoin: "round",
168
110
  strokeWidth: 2,
@@ -170,26 +112,26 @@ var m = r(function({ widget: r, data: s, render: c, onClick: l }) {
170
112
  })
171
113
  })
172
114
  }),
173
- /* @__PURE__ */ a("h4", {
115
+ /* @__PURE__ */ f("h4", {
174
116
  className: "text-sm font-medium text-text-primary mb-1",
175
117
  children: "Custom Widget"
176
118
  }),
177
- /* @__PURE__ */ a("p", {
119
+ /* @__PURE__ */ f("p", {
178
120
  className: "text-xs text-text-secondary text-center max-w-[200px]",
179
- children: u?.description || "Provide HTML, an iframe URL, or a registered custom component."
121
+ children: _?.description || "Provide HTML, an iframe URL, or a registered custom component."
180
122
  }),
181
- y ? /* @__PURE__ */ o("p", {
123
+ C ? /* @__PURE__ */ p("p", {
182
124
  className: "text-xs text-text-secondary mt-2",
183
- children: ["Component: ", /* @__PURE__ */ a("code", {
125
+ children: ["Component: ", /* @__PURE__ */ f("code", {
184
126
  className: "font-mono",
185
- children: y
127
+ children: C
186
128
  })]
187
129
  }) : null,
188
- s ? /* @__PURE__ */ a("div", {
130
+ m ? /* @__PURE__ */ f("div", {
189
131
  className: "mt-4 w-full max-h-[100px] overflow-auto",
190
- children: /* @__PURE__ */ a("pre", {
132
+ children: /* @__PURE__ */ f("pre", {
191
133
  className: "text-xs text-text-secondary bg-bg-sunken p-2 rounded",
192
- children: JSON.stringify(s, null, 2)
134
+ children: JSON.stringify(m, null, 2)
193
135
  })
194
136
  }) : null
195
137
  ]