drizzle-cube 0.4.3 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/charts.js +13 -13
- package/dist/client/chunks/{RetentionCombinedChart-7bGP_ozM.js → RetentionCombinedChart-CEI8KQ3t.js} +2 -2
- package/dist/client/chunks/{RetentionCombinedChart-7bGP_ozM.js.map → RetentionCombinedChart-CEI8KQ3t.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-BlCXpnDL.js → analysis-builder-CG5VIMYB.js} +8 -9
- package/dist/client/chunks/{analysis-builder-BlCXpnDL.js.map → analysis-builder-CG5VIMYB.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-BOYNJQY8.js → analysis-builder-shared-CjlKJgyA.js} +6 -6
- package/dist/client/chunks/{analysis-builder-shared-BOYNJQY8.js.map → analysis-builder-shared-CjlKJgyA.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-sUkuCJzm.js → chart-activity-grid-DStNr34n.js} +2 -2
- package/dist/client/chunks/{chart-activity-grid-sUkuCJzm.js.map → chart-activity-grid-DStNr34n.js.map} +1 -1
- package/dist/client/chunks/{chart-area-C4DIi9k_.js → chart-area-QKKboTbq.js} +3 -3
- package/dist/client/chunks/{chart-area-C4DIi9k_.js.map → chart-area-QKKboTbq.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-7ZleGCsN.js → chart-bar-HpXF42H1.js} +2 -2
- package/dist/client/chunks/{chart-bar-7ZleGCsN.js.map → chart-bar-HpXF42H1.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-D-auWIjP.js → chart-bubble-Bf42A1-B.js} +2 -2
- package/dist/client/chunks/{chart-bubble-D-auWIjP.js.map → chart-bubble-Bf42A1-B.js.map} +1 -1
- package/dist/client/chunks/{chart-config-markdown-DZxdGNVQ.js → chart-config-markdown-BXKL5TbQ.js} +45 -8
- package/dist/client/chunks/chart-config-markdown-BXKL5TbQ.js.map +1 -0
- package/dist/client/chunks/{chart-data-table-DW6VNGeW.js → chart-data-table-Ch_1c1Zo.js} +3 -3
- package/dist/client/chunks/{chart-data-table-DW6VNGeW.js.map → chart-data-table-Ch_1c1Zo.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-eUJApzmA.js → chart-funnel-C9kenCpp.js} +2 -2
- package/dist/client/chunks/{chart-funnel-eUJApzmA.js.map → chart-funnel-C9kenCpp.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-DR3O3GXx.js → chart-heat-map-CYGemyPB.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-DR3O3GXx.js.map → chart-heat-map-CYGemyPB.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-Bp9Yrgyc.js → chart-kpi-delta-CWCmi8vL.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-Bp9Yrgyc.js.map → chart-kpi-delta-CWCmi8vL.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-B3yvgbr-.js → chart-kpi-number-C-5m3qt5.js} +2 -2
- package/dist/client/chunks/{chart-kpi-number-B3yvgbr-.js.map → chart-kpi-number-C-5m3qt5.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-D0TsUiaO.js → chart-kpi-text--t4ibPmx.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-D0TsUiaO.js.map → chart-kpi-text--t4ibPmx.js.map} +1 -1
- package/dist/client/chunks/{chart-line-C7VStgaJ.js → chart-line-C7YcMWBw.js} +3 -3
- package/dist/client/chunks/{chart-line-C7VStgaJ.js.map → chart-line-C7YcMWBw.js.map} +1 -1
- package/dist/client/chunks/chart-markdown-Rq6ORisB.js +276 -0
- package/dist/client/chunks/chart-markdown-Rq6ORisB.js.map +1 -0
- package/dist/client/chunks/{chart-pie-DPdYJSM3.js → chart-pie-C4SuxKSN.js} +2 -2
- package/dist/client/chunks/{chart-pie-DPdYJSM3.js.map → chart-pie-C4SuxKSN.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-DF6VNSiC.js → chart-radar-BW3Z_-Ly.js} +2 -2
- package/dist/client/chunks/{chart-radar-DF6VNSiC.js.map → chart-radar-BW3Z_-Ly.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-7Ttfz-kO.js → chart-radial-bar-0Fa3aeP5.js} +2 -2
- package/dist/client/chunks/{chart-radial-bar-7Ttfz-kO.js.map → chart-radial-bar-0Fa3aeP5.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-D86RYk9B.js → chart-sankey-DBghfbg1.js} +2 -2
- package/dist/client/chunks/{chart-sankey-D86RYk9B.js.map → chart-sankey-DBghfbg1.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-BUnIiLr_.js → chart-scatter-DOVu1TNq.js} +2 -2
- package/dist/client/chunks/{chart-scatter-BUnIiLr_.js.map → chart-scatter-DOVu1TNq.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-CsHlHfZQ.js → chart-sunburst-LfNthFlZ.js} +2 -2
- package/dist/client/chunks/{chart-sunburst-CsHlHfZQ.js.map → chart-sunburst-LfNthFlZ.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-DFAbkeo1.js → chart-tree-map-DZtQPyWX.js} +2 -2
- package/dist/client/chunks/{chart-tree-map-DFAbkeo1.js.map → chart-tree-map-DZtQPyWX.js.map} +1 -1
- package/dist/client/chunks/{chartConfigRegistry-DNEbwgTc.js → chartConfigRegistry-C5dZm-ZK.js} +2 -2
- package/dist/client/chunks/{chartConfigRegistry-DNEbwgTc.js.map → chartConfigRegistry-C5dZm-ZK.js.map} +1 -1
- package/dist/client/chunks/{charts-core-DAF1iT_h.js → charts-core-DmGfleFz.js} +346 -334
- package/dist/client/chunks/charts-core-DmGfleFz.js.map +1 -0
- package/dist/client/chunks/{charts-loader-7pEaEz-f.js → charts-loader-m5Ussksz.js} +21 -21
- package/dist/client/chunks/{charts-loader-7pEaEz-f.js.map → charts-loader-m5Ussksz.js.map} +1 -1
- package/dist/client/chunks/components-D-5p1LVQ.js +9987 -0
- package/dist/client/chunks/components-D-5p1LVQ.js.map +1 -0
- package/dist/client/chunks/{core-DGLxd5v5.js → core-D_8mkGpQ.js} +2 -2
- package/dist/client/chunks/{core-DGLxd5v5.js.map → core-D_8mkGpQ.js.map} +1 -1
- package/dist/client/chunks/{providers-D2xswCYu.js → providers-CgxXm6Ll.js} +2 -2
- package/dist/client/chunks/{providers-D2xswCYu.js.map → providers-CgxXm6Ll.js.map} +1 -1
- package/dist/client/chunks/{syntaxHighlighting-DAT9C6Ss.js → syntaxHighlighting-BQfjio-i.js} +2 -2
- package/dist/client/chunks/{syntaxHighlighting-DAT9C6Ss.js.map → syntaxHighlighting-BQfjio-i.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-CTS_m9mg.js → useDirtyStateTracking-Cu1HSjmo.js} +9 -9
- package/dist/client/chunks/{useDirtyStateTracking-CTS_m9mg.js.map → useDirtyStateTracking-Cu1HSjmo.js.map} +1 -1
- package/dist/client/chunks/{vendor-DfDLOfBe.js → vendor-AVsJ2ni0.js} +4 -4
- package/dist/client/chunks/{vendor-DfDLOfBe.js.map → vendor-AVsJ2ni0.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +3 -1
- package/dist/client/components/DashboardPortletCard.d.ts +3 -2
- package/dist/client/components/FloatingEditToolbar.d.ts +3 -1
- package/dist/client/components/TextPortletModal.d.ts +12 -0
- package/dist/client/components.js +15 -352
- package/dist/client/components.js.map +1 -1
- package/dist/client/hooks/dashboard/layoutUtils.d.ts +7 -0
- package/dist/client/hooks/dashboard/useDashboardController.d.ts +53 -0
- package/dist/client/hooks/dashboard/useGridLayoutEngine.d.ts +10 -0
- package/dist/client/hooks/dashboard/useRowLayoutEngine.d.ts +18 -0
- package/dist/client/hooks/useDashboardHook.d.ts +7 -2
- package/dist/client/hooks.js +23 -23
- package/dist/client/index.js +8 -8
- package/dist/client/providers.js +1 -1
- package/dist/client/stores/dashboardStore.d.ts +14 -0
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +3 -0
- package/dist/client/utils.js +6 -6
- package/dist/client-bundle-stats.html +1 -1
- package/package.json +1 -1
- package/dist/client/chunks/DashboardEditModal-BGDhxKg1.js +0 -9169
- package/dist/client/chunks/DashboardEditModal-BGDhxKg1.js.map +0 -1
- package/dist/client/chunks/chart-config-markdown-DZxdGNVQ.js.map +0 -1
- package/dist/client/chunks/chart-markdown-Cget3iEq.js +0 -257
- package/dist/client/chunks/chart-markdown-Cget3iEq.js.map +0 -1
- package/dist/client/chunks/charts-core-DAF1iT_h.js.map +0 -1
|
@@ -4,6 +4,8 @@ interface AnalysisDisplayConfigPanelProps {
|
|
|
4
4
|
displayConfig: ChartDisplayConfig;
|
|
5
5
|
colorPalette?: ColorPalette;
|
|
6
6
|
onDisplayConfigChange: (config: ChartDisplayConfig) => void;
|
|
7
|
+
/** Keys to exclude from displayOptionsConfig rendering (e.g., ['content'] when content is managed elsewhere) */
|
|
8
|
+
excludeKeys?: string[];
|
|
7
9
|
}
|
|
8
|
-
export default function AnalysisDisplayConfigPanel({ chartType, displayConfig, colorPalette, onDisplayConfigChange }: AnalysisDisplayConfigPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default function AnalysisDisplayConfigPanel({ chartType, displayConfig, colorPalette, onDisplayConfigChange, excludeKeys, }: AnalysisDisplayConfigPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
9
11
|
export {};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { default as React, HTMLAttributes, ReactNode, CSSProperties, ComponentType } from 'react';
|
|
2
|
-
import { DashboardFilter, PortletConfig } from '../types';
|
|
2
|
+
import { DashboardFilter, DashboardLayoutMode, PortletConfig } from '../types';
|
|
3
3
|
import { ColorPalette } from '../utils/colorPalettes';
|
|
4
4
|
/**
|
|
5
5
|
* Simplified props interface after Zustand migration.
|
|
6
|
-
* State (
|
|
6
|
+
* State (selectedFilterId, debugData) now comes from store.
|
|
7
7
|
* Actions now come from callbacks prop or store.
|
|
8
8
|
*/
|
|
9
9
|
interface DashboardPortletCardProps {
|
|
10
10
|
portlet: PortletConfig;
|
|
11
11
|
editable: boolean;
|
|
12
|
+
layoutMode?: DashboardLayoutMode;
|
|
12
13
|
dashboardFilters?: DashboardFilter[];
|
|
13
14
|
configEagerLoad?: boolean;
|
|
14
15
|
loadingComponent?: ReactNode;
|
|
@@ -23,6 +23,8 @@ interface FloatingEditToolbarProps {
|
|
|
23
23
|
onPaletteChange: (palette: string) => void;
|
|
24
24
|
/** Add new portlet */
|
|
25
25
|
onAddPortlet: () => void;
|
|
26
|
+
/** Add new text portlet */
|
|
27
|
+
onAddText?: () => void;
|
|
26
28
|
}
|
|
27
|
-
export default function FloatingEditToolbar({ isEditBarVisible, position, isEditMode, onEditModeToggle, layoutMode, onLayoutModeChange, allowedModes, canChangeLayoutMode, currentPalette, onPaletteChange, onAddPortlet }: FloatingEditToolbarProps): React.ReactPortal | null;
|
|
29
|
+
export default function FloatingEditToolbar({ isEditBarVisible, position, isEditMode, onEditModeToggle, layoutMode, onLayoutModeChange, allowedModes, canChangeLayoutMode, currentPalette, onPaletteChange, onAddPortlet, onAddText }: FloatingEditToolbarProps): React.ReactPortal | null;
|
|
28
30
|
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PortletConfig } from '../types';
|
|
2
|
+
import { ColorPalette } from '../utils/colorPalettes';
|
|
3
|
+
interface TextPortletModalProps {
|
|
4
|
+
isOpen: boolean;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
onSave: (portlet: PortletConfig | Omit<PortletConfig, 'id' | 'x' | 'y'>) => void;
|
|
7
|
+
portlet?: PortletConfig | null;
|
|
8
|
+
colorPalette?: ColorPalette;
|
|
9
|
+
existingTitles?: string[];
|
|
10
|
+
}
|
|
11
|
+
export default function TextPortletModal({ isOpen, onClose, onSave, portlet, colorPalette, existingTitles, }: TextPortletModalProps): import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
export {};
|
|
@@ -1,355 +1,18 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import {
|
|
3
|
-
import { useState as b, useEffect as o, useCallback as i } from "react";
|
|
4
|
-
import { S as y, A as N } from "./chunks/charts-core-DAF1iT_h.js";
|
|
5
|
-
import { useChartConfig as v } from "./charts.js";
|
|
6
|
-
import { c as $, d as F, b as M, a as z, g as B, v as E } from "./chunks/index-CApFCBF9.js";
|
|
7
|
-
function k({
|
|
8
|
-
label: m,
|
|
9
|
-
value: t,
|
|
10
|
-
onChange: x,
|
|
11
|
-
placeholder: r,
|
|
12
|
-
description: s
|
|
13
|
-
}) {
|
|
14
|
-
const [u, n] = b(() => t.join(`
|
|
15
|
-
`));
|
|
16
|
-
o(() => {
|
|
17
|
-
const d = t.join(`
|
|
18
|
-
`);
|
|
19
|
-
n(d);
|
|
20
|
-
}, [t]);
|
|
21
|
-
const e = i(() => {
|
|
22
|
-
const d = u.split(`
|
|
23
|
-
`).map((l) => l.trim()).filter((l) => l.length > 0);
|
|
24
|
-
x(d);
|
|
25
|
-
}, [u, x]);
|
|
26
|
-
return /* @__PURE__ */ a("div", { className: "dc:space-y-1", children: [
|
|
27
|
-
/* @__PURE__ */ c("label", { className: "dc:text-sm text-dc-text-secondary", children: m }),
|
|
28
|
-
/* @__PURE__ */ c(
|
|
29
|
-
"textarea",
|
|
30
|
-
{
|
|
31
|
-
value: u,
|
|
32
|
-
onChange: (d) => n(d.target.value),
|
|
33
|
-
onBlur: e,
|
|
34
|
-
placeholder: r,
|
|
35
|
-
rows: 4,
|
|
36
|
-
className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text dc:resize-y"
|
|
37
|
-
}
|
|
38
|
-
),
|
|
39
|
-
s && /* @__PURE__ */ c("p", { className: "dc:text-xs text-dc-text-muted", children: s })
|
|
40
|
-
] });
|
|
41
|
-
}
|
|
42
|
-
function O({
|
|
43
|
-
chartType: m,
|
|
44
|
-
displayConfig: t,
|
|
45
|
-
colorPalette: x,
|
|
46
|
-
onDisplayConfigChange: r
|
|
47
|
-
}) {
|
|
48
|
-
const { config: s, loaded: u } = v(m);
|
|
49
|
-
return u ? s.displayOptions && s.displayOptions.length > 0 || s.displayOptionsConfig && s.displayOptionsConfig.length > 0 ? /* @__PURE__ */ c("div", { className: "dc:space-y-6", children: /* @__PURE__ */ a("div", { children: [
|
|
50
|
-
/* @__PURE__ */ c(y, { className: "dc:mb-2", children: "Display Options" }),
|
|
51
|
-
/* @__PURE__ */ a("div", { className: "dc:space-y-2", children: [
|
|
52
|
-
s.displayOptions?.includes("showLegend") && /* @__PURE__ */ a("label", { className: "dc:flex dc:items-center dc:space-x-2", children: [
|
|
53
|
-
/* @__PURE__ */ c(
|
|
54
|
-
"input",
|
|
55
|
-
{
|
|
56
|
-
type: "checkbox",
|
|
57
|
-
checked: t.showLegend ?? !0,
|
|
58
|
-
onChange: (e) => r({
|
|
59
|
-
...t,
|
|
60
|
-
showLegend: e.target.checked
|
|
61
|
-
}),
|
|
62
|
-
className: "dc:rounded border-dc-border focus:ring-dc-accent",
|
|
63
|
-
style: { color: "var(--dc-primary)" }
|
|
64
|
-
}
|
|
65
|
-
),
|
|
66
|
-
/* @__PURE__ */ c("span", { className: "dc:text-sm text-dc-text", children: "Show Legend" })
|
|
67
|
-
] }),
|
|
68
|
-
s.displayOptions?.includes("showGrid") && /* @__PURE__ */ a("label", { className: "dc:flex dc:items-center dc:space-x-2", children: [
|
|
69
|
-
/* @__PURE__ */ c(
|
|
70
|
-
"input",
|
|
71
|
-
{
|
|
72
|
-
type: "checkbox",
|
|
73
|
-
checked: t.showGrid ?? !0,
|
|
74
|
-
onChange: (e) => r({
|
|
75
|
-
...t,
|
|
76
|
-
showGrid: e.target.checked
|
|
77
|
-
}),
|
|
78
|
-
className: "dc:rounded border-dc-border focus:ring-dc-accent",
|
|
79
|
-
style: { color: "var(--dc-primary)" }
|
|
80
|
-
}
|
|
81
|
-
),
|
|
82
|
-
/* @__PURE__ */ c("span", { className: "dc:text-sm text-dc-text", children: "Show Grid" })
|
|
83
|
-
] }),
|
|
84
|
-
s.displayOptions?.includes("showTooltip") && /* @__PURE__ */ a("label", { className: "dc:flex dc:items-center dc:space-x-2", children: [
|
|
85
|
-
/* @__PURE__ */ c(
|
|
86
|
-
"input",
|
|
87
|
-
{
|
|
88
|
-
type: "checkbox",
|
|
89
|
-
checked: t.showTooltip ?? !0,
|
|
90
|
-
onChange: (e) => r({
|
|
91
|
-
...t,
|
|
92
|
-
showTooltip: e.target.checked
|
|
93
|
-
}),
|
|
94
|
-
className: "dc:rounded border-dc-border focus:ring-dc-accent",
|
|
95
|
-
style: { color: "var(--dc-primary)" }
|
|
96
|
-
}
|
|
97
|
-
),
|
|
98
|
-
/* @__PURE__ */ c("span", { className: "dc:text-sm text-dc-text", children: "Show Tooltip" })
|
|
99
|
-
] }),
|
|
100
|
-
s.displayOptions?.includes("stacked") && /* @__PURE__ */ a("label", { className: "dc:flex dc:items-center dc:space-x-2", children: [
|
|
101
|
-
/* @__PURE__ */ c(
|
|
102
|
-
"input",
|
|
103
|
-
{
|
|
104
|
-
type: "checkbox",
|
|
105
|
-
checked: t.stacked ?? !1,
|
|
106
|
-
onChange: (e) => r({
|
|
107
|
-
...t,
|
|
108
|
-
stacked: e.target.checked
|
|
109
|
-
}),
|
|
110
|
-
className: "dc:rounded border-dc-border focus:ring-dc-accent",
|
|
111
|
-
style: { color: "var(--dc-primary)" }
|
|
112
|
-
}
|
|
113
|
-
),
|
|
114
|
-
/* @__PURE__ */ c("span", { className: "dc:text-sm text-dc-text", children: "Stacked" })
|
|
115
|
-
] }),
|
|
116
|
-
s.displayOptions?.includes("hideHeader") && /* @__PURE__ */ a("label", { className: "dc:flex dc:items-center dc:space-x-2", children: [
|
|
117
|
-
/* @__PURE__ */ c(
|
|
118
|
-
"input",
|
|
119
|
-
{
|
|
120
|
-
type: "checkbox",
|
|
121
|
-
checked: t.hideHeader ?? !1,
|
|
122
|
-
onChange: (e) => r({
|
|
123
|
-
...t,
|
|
124
|
-
hideHeader: e.target.checked
|
|
125
|
-
}),
|
|
126
|
-
className: "dc:rounded border-dc-border focus:ring-dc-accent",
|
|
127
|
-
style: { color: "var(--dc-primary)" }
|
|
128
|
-
}
|
|
129
|
-
),
|
|
130
|
-
/* @__PURE__ */ c("span", { className: "dc:text-sm text-dc-text", children: "Hide Header" })
|
|
131
|
-
] }),
|
|
132
|
-
s.displayOptionsConfig?.map((e) => /* @__PURE__ */ a("div", { className: `dc:space-y-1 ${e.type === "axisFormat" ? "dc:mt-6 dc:pt-2" : ""}`, children: [
|
|
133
|
-
e.type === "boolean" && /* @__PURE__ */ a("label", { className: "dc:flex dc:items-center dc:space-x-2", children: [
|
|
134
|
-
/* @__PURE__ */ c(
|
|
135
|
-
"input",
|
|
136
|
-
{
|
|
137
|
-
type: "checkbox",
|
|
138
|
-
checked: t[e.key] ?? e.defaultValue ?? !1,
|
|
139
|
-
onChange: (d) => r({
|
|
140
|
-
...t,
|
|
141
|
-
[e.key]: d.target.checked
|
|
142
|
-
}),
|
|
143
|
-
className: "dc:rounded border-dc-border focus:ring-dc-accent",
|
|
144
|
-
style: { color: "var(--dc-primary)" }
|
|
145
|
-
}
|
|
146
|
-
),
|
|
147
|
-
/* @__PURE__ */ c("span", { className: "dc:text-sm text-dc-text", children: e.label })
|
|
148
|
-
] }),
|
|
149
|
-
e.type === "string" && /* @__PURE__ */ a("div", { className: "dc:space-y-1", children: [
|
|
150
|
-
/* @__PURE__ */ a("label", { className: "dc:text-sm text-dc-text-secondary", children: [
|
|
151
|
-
e.label,
|
|
152
|
-
e.key === "content" && /* @__PURE__ */ c("span", { className: "dc:text-xs text-dc-text-muted dc:ml-1", children: "(only headers, lists and links)" })
|
|
153
|
-
] }),
|
|
154
|
-
e.key === "content" ? /* @__PURE__ */ c(
|
|
155
|
-
"textarea",
|
|
156
|
-
{
|
|
157
|
-
value: t[e.key] ?? e.defaultValue ?? "",
|
|
158
|
-
onChange: (d) => r({
|
|
159
|
-
...t,
|
|
160
|
-
[e.key]: d.target.value
|
|
161
|
-
}),
|
|
162
|
-
placeholder: e.placeholder,
|
|
163
|
-
rows: 8,
|
|
164
|
-
className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent dc:font-mono dc:resize-y bg-dc-surface text-dc-text"
|
|
165
|
-
}
|
|
166
|
-
) : /* @__PURE__ */ c(
|
|
167
|
-
"input",
|
|
168
|
-
{
|
|
169
|
-
type: "text",
|
|
170
|
-
value: t[e.key] ?? e.defaultValue ?? "",
|
|
171
|
-
onChange: (d) => r({
|
|
172
|
-
...t,
|
|
173
|
-
[e.key]: d.target.value
|
|
174
|
-
}),
|
|
175
|
-
placeholder: e.placeholder,
|
|
176
|
-
className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
|
|
177
|
-
}
|
|
178
|
-
),
|
|
179
|
-
e.description && /* @__PURE__ */ c("p", { className: "dc:text-xs text-dc-text-muted", children: e.description })
|
|
180
|
-
] }),
|
|
181
|
-
e.type === "paletteColor" && /* @__PURE__ */ a("div", { className: "dc:space-y-1", children: [
|
|
182
|
-
/* @__PURE__ */ c("label", { className: "dc:text-sm text-dc-text-secondary", children: e.label }),
|
|
183
|
-
/* @__PURE__ */ c("div", { className: "dc:flex dc:flex-wrap dc:gap-2", children: x?.colors.map((d, l) => {
|
|
184
|
-
const h = (t[e.key] ?? e.defaultValue ?? 0) === l;
|
|
185
|
-
return /* @__PURE__ */ c(
|
|
186
|
-
"button",
|
|
187
|
-
{
|
|
188
|
-
type: "button",
|
|
189
|
-
onClick: () => r({
|
|
190
|
-
...t,
|
|
191
|
-
[e.key]: l
|
|
192
|
-
}),
|
|
193
|
-
className: `dc:w-8 dc:h-8 dc:rounded dc:border-2 dc:transition-all dc:duration-200 dc:hover:scale-110 focus:outline-hidden dc:focus:ring-2 focus:ring-dc-accent dc:focus:ring-offset-1 ${h ? "dc:ring-2 dc:ring-offset-1 dc:scale-110" : "hover:border-dc-text-muted"}`,
|
|
194
|
-
style: {
|
|
195
|
-
backgroundColor: d,
|
|
196
|
-
borderColor: h ? "var(--dc-primary)" : "var(--dc-border)"
|
|
197
|
-
},
|
|
198
|
-
title: `Color ${l + 1}: ${d}`
|
|
199
|
-
},
|
|
200
|
-
l
|
|
201
|
-
);
|
|
202
|
-
}) || [
|
|
203
|
-
// Fallback if no palette available
|
|
204
|
-
/* @__PURE__ */ c(
|
|
205
|
-
"button",
|
|
206
|
-
{
|
|
207
|
-
type: "button",
|
|
208
|
-
onClick: () => r({
|
|
209
|
-
...t,
|
|
210
|
-
[e.key]: 0
|
|
211
|
-
}),
|
|
212
|
-
className: "dc:w-8 dc:h-8 dc:rounded-sm dc:border-2 dc:ring-2 dc:ring-offset-1",
|
|
213
|
-
style: {
|
|
214
|
-
backgroundColor: "#8884d8",
|
|
215
|
-
borderColor: "var(--dc-primary)",
|
|
216
|
-
boxShadow: "0 0 0 2px var(--dc-primary)"
|
|
217
|
-
},
|
|
218
|
-
title: "Default Color"
|
|
219
|
-
},
|
|
220
|
-
0
|
|
221
|
-
)
|
|
222
|
-
] }),
|
|
223
|
-
e.description && /* @__PURE__ */ c("p", { className: "dc:text-xs text-dc-text-muted", children: e.description })
|
|
224
|
-
] }),
|
|
225
|
-
e.type === "number" && /* @__PURE__ */ a("div", { className: "dc:space-y-1", children: [
|
|
226
|
-
/* @__PURE__ */ c("label", { className: "dc:text-sm text-dc-text-secondary", children: e.label }),
|
|
227
|
-
/* @__PURE__ */ c(
|
|
228
|
-
"input",
|
|
229
|
-
{
|
|
230
|
-
type: "number",
|
|
231
|
-
value: t[e.key] ?? e.defaultValue ?? 0,
|
|
232
|
-
onChange: (d) => r({
|
|
233
|
-
...t,
|
|
234
|
-
[e.key]: d.target.value === "" ? void 0 : Number(d.target.value)
|
|
235
|
-
}),
|
|
236
|
-
placeholder: e.placeholder,
|
|
237
|
-
min: e.min,
|
|
238
|
-
max: e.max,
|
|
239
|
-
step: e.step,
|
|
240
|
-
className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
|
|
241
|
-
}
|
|
242
|
-
),
|
|
243
|
-
e.description && /* @__PURE__ */ c("p", { className: "dc:text-xs text-dc-text-muted", children: e.description })
|
|
244
|
-
] }),
|
|
245
|
-
e.type === "select" && /* @__PURE__ */ a("div", { className: "dc:space-y-1", children: [
|
|
246
|
-
/* @__PURE__ */ c("label", { className: "dc:text-sm text-dc-text-secondary", children: e.label }),
|
|
247
|
-
/* @__PURE__ */ c(
|
|
248
|
-
"select",
|
|
249
|
-
{
|
|
250
|
-
value: t[e.key] ?? e.defaultValue ?? "",
|
|
251
|
-
onChange: (d) => r({
|
|
252
|
-
...t,
|
|
253
|
-
[e.key]: d.target.value
|
|
254
|
-
}),
|
|
255
|
-
className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text",
|
|
256
|
-
children: e.options?.map((d) => /* @__PURE__ */ c("option", { value: d.value, children: d.label }, d.value))
|
|
257
|
-
}
|
|
258
|
-
),
|
|
259
|
-
e.description && /* @__PURE__ */ c("p", { className: "dc:text-xs text-dc-text-muted", children: e.description })
|
|
260
|
-
] }),
|
|
261
|
-
e.type === "color" && /* @__PURE__ */ a("div", { className: "dc:space-y-1", children: [
|
|
262
|
-
/* @__PURE__ */ c("label", { className: "dc:text-sm text-dc-text-secondary", children: e.label }),
|
|
263
|
-
/* @__PURE__ */ a("div", { className: "dc:flex dc:items-center dc:space-x-2", children: [
|
|
264
|
-
/* @__PURE__ */ c(
|
|
265
|
-
"input",
|
|
266
|
-
{
|
|
267
|
-
type: "color",
|
|
268
|
-
value: t[e.key] ?? e.defaultValue ?? "#8884d8",
|
|
269
|
-
onChange: (d) => r({
|
|
270
|
-
...t,
|
|
271
|
-
[e.key]: d.target.value
|
|
272
|
-
}),
|
|
273
|
-
className: "dc:w-12 dc:h-8 dc:border border-dc-border dc:rounded-sm dc:cursor-pointer"
|
|
274
|
-
}
|
|
275
|
-
),
|
|
276
|
-
/* @__PURE__ */ c(
|
|
277
|
-
"input",
|
|
278
|
-
{
|
|
279
|
-
type: "text",
|
|
280
|
-
value: t[e.key] ?? e.defaultValue ?? "#8884d8",
|
|
281
|
-
onChange: (d) => r({
|
|
282
|
-
...t,
|
|
283
|
-
[e.key]: d.target.value
|
|
284
|
-
}),
|
|
285
|
-
placeholder: e.placeholder || "#8884d8",
|
|
286
|
-
className: "dc:flex-1 dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
|
|
287
|
-
}
|
|
288
|
-
)
|
|
289
|
-
] }),
|
|
290
|
-
e.description && /* @__PURE__ */ c("p", { className: "dc:text-xs text-dc-text-muted", children: e.description })
|
|
291
|
-
] }),
|
|
292
|
-
e.type === "axisFormat" && /* @__PURE__ */ c(
|
|
293
|
-
N,
|
|
294
|
-
{
|
|
295
|
-
axisLabel: e.label,
|
|
296
|
-
value: t[e.key] || {},
|
|
297
|
-
onChange: (d) => r({
|
|
298
|
-
...t,
|
|
299
|
-
[e.key]: Object.keys(d).length > 0 ? d : void 0
|
|
300
|
-
})
|
|
301
|
-
}
|
|
302
|
-
),
|
|
303
|
-
e.type === "stringArray" && /* @__PURE__ */ c(
|
|
304
|
-
k,
|
|
305
|
-
{
|
|
306
|
-
label: e.label,
|
|
307
|
-
value: t[e.key] ?? [],
|
|
308
|
-
onChange: (d) => r({
|
|
309
|
-
...t,
|
|
310
|
-
[e.key]: d.length > 0 ? d : void 0
|
|
311
|
-
}),
|
|
312
|
-
placeholder: e.placeholder,
|
|
313
|
-
description: e.description
|
|
314
|
-
}
|
|
315
|
-
),
|
|
316
|
-
e.type === "buttonGroup" && /* @__PURE__ */ a("div", { className: "dc:space-y-1", children: [
|
|
317
|
-
/* @__PURE__ */ c("label", { className: "dc:text-sm text-dc-text-secondary", children: e.label }),
|
|
318
|
-
/* @__PURE__ */ c("div", { className: "dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden", children: e.options?.map((d) => {
|
|
319
|
-
const l = (t[e.key] ?? e.defaultValue) === d.value;
|
|
320
|
-
return /* @__PURE__ */ c(
|
|
321
|
-
"button",
|
|
322
|
-
{
|
|
323
|
-
type: "button",
|
|
324
|
-
onClick: () => r({
|
|
325
|
-
...t,
|
|
326
|
-
[e.key]: d.value
|
|
327
|
-
}),
|
|
328
|
-
className: `dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${l ? "bg-dc-primary text-white" : "bg-dc-surface text-dc-text hover:bg-dc-border"}`,
|
|
329
|
-
children: d.label
|
|
330
|
-
},
|
|
331
|
-
d.value
|
|
332
|
-
);
|
|
333
|
-
}) }),
|
|
334
|
-
e.description && /* @__PURE__ */ c("p", { className: "dc:text-xs text-dc-text-muted", children: e.description })
|
|
335
|
-
] })
|
|
336
|
-
] }, e.key))
|
|
337
|
-
] })
|
|
338
|
-
] }) }) : /* @__PURE__ */ c("div", { className: "dc:text-center text-dc-text-muted dc:text-sm dc:py-4", children: /* @__PURE__ */ c("p", { children: "No display options available for this chart type." }) }) : /* @__PURE__ */ c("div", { className: "dc:text-center text-dc-text-muted dc:text-sm dc:py-4", children: "Loading display options..." });
|
|
339
|
-
}
|
|
1
|
+
import { a8 as s, a as t, A as o, e as r, D as i, M as l, P as d } from "./chunks/components-D-5p1LVQ.js";
|
|
2
|
+
import { c as y, d as P, b, a as D, g as c, v as p } from "./chunks/index-CApFCBF9.js";
|
|
340
3
|
export {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
4
|
+
s as AnalysisDisplayConfigPanel,
|
|
5
|
+
t as AnalyticsDashboard,
|
|
6
|
+
o as AnalyticsPortlet,
|
|
7
|
+
r as DashboardEditModal,
|
|
8
|
+
i as DashboardGrid,
|
|
9
|
+
l as Modal,
|
|
10
|
+
d as PortletContainer,
|
|
11
|
+
y as createDashboardLayout,
|
|
12
|
+
P as createSamplePortlet,
|
|
13
|
+
b as findNextPosition,
|
|
14
|
+
D as generatePortletId,
|
|
15
|
+
c as generateResponsiveLayouts,
|
|
16
|
+
p as validateCubeQuery
|
|
354
17
|
};
|
|
355
18
|
//# sourceMappingURL=components.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sources":["../../src/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.tsx"],"sourcesContent":["/**\n * AnalysisDisplayConfigPanel Component\n *\n * A panel for configuring chart display options (legend, grid, tooltip, etc.)\n * Extracted from AnalysisChartConfigPanel to be shown in its own tab.\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport SectionHeading from './SectionHeading'\nimport { useChartConfig } from '../../charts/lazyChartConfigRegistry'\nimport type { ChartType, ChartDisplayConfig, ColorPalette, AxisFormatConfig } from '../../types'\nimport { AxisFormatControls } from '../charts/AxisFormatControls'\n\ninterface AnalysisDisplayConfigPanelProps {\n chartType: ChartType\n displayConfig: ChartDisplayConfig\n colorPalette?: ColorPalette\n onDisplayConfigChange: (config: ChartDisplayConfig) => void\n}\n\n/**\n * StringArrayInput - A textarea that edits an array of strings\n * Uses local state while editing and only updates on blur\n */\nfunction StringArrayInput({\n label,\n value,\n onChange,\n placeholder,\n description,\n}: {\n label: string\n value: string[]\n onChange: (value: string[]) => void\n placeholder?: string\n description?: string\n}) {\n // Local state for textarea editing\n const [localText, setLocalText] = useState(() => value.join('\\n'))\n\n // Sync local state when external value changes (e.g., from undo/redo or load)\n useEffect(() => {\n const externalText = value.join('\\n')\n setLocalText(externalText)\n }, [value])\n\n const handleBlur = useCallback(() => {\n // Convert text to array, filtering empty strings\n const arrayValue = localText\n .split('\\n')\n .map(s => s.trim())\n .filter(s => s.length > 0)\n onChange(arrayValue)\n }, [localText, onChange])\n\n return (\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-sm text-dc-text-secondary\">{label}</label>\n <textarea\n value={localText}\n onChange={(e) => setLocalText(e.target.value)}\n onBlur={handleBlur}\n placeholder={placeholder}\n rows={4}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text dc:resize-y\"\n />\n {description && (\n <p className=\"dc:text-xs text-dc-text-muted\">{description}</p>\n )}\n </div>\n )\n}\n\nexport default function AnalysisDisplayConfigPanel({\n chartType,\n displayConfig,\n colorPalette,\n onDisplayConfigChange\n}: AnalysisDisplayConfigPanelProps) {\n // Get configuration for current chart type\n const { config: chartTypeConfig, loaded: chartConfigLoaded } = useChartConfig(chartType)\n\n if (!chartConfigLoaded) {\n return (\n <div className=\"dc:text-center text-dc-text-muted dc:text-sm dc:py-4\">\n Loading display options...\n </div>\n )\n }\n\n // Check if we have any display options to show\n const hasDisplayOptions =\n (chartTypeConfig.displayOptions && chartTypeConfig.displayOptions.length > 0) ||\n (chartTypeConfig.displayOptionsConfig && chartTypeConfig.displayOptionsConfig.length > 0)\n\n if (!hasDisplayOptions) {\n return (\n <div className=\"dc:text-center text-dc-text-muted dc:text-sm dc:py-4\">\n <p>No display options available for this chart type.</p>\n </div>\n )\n }\n\n return (\n <div className=\"dc:space-y-6\">\n <div>\n <SectionHeading className=\"dc:mb-2\">Display Options</SectionHeading>\n <div className=\"dc:space-y-2\">\n {/* Backward compatibility: Simple boolean display options */}\n {chartTypeConfig.displayOptions?.includes('showLegend') && (\n <label className=\"dc:flex dc:items-center dc:space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showLegend ?? true}\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n showLegend: e.target.checked\n })\n }\n className=\"dc:rounded border-dc-border focus:ring-dc-accent\"\n style={{ color: 'var(--dc-primary)' }}\n />\n <span className=\"dc:text-sm text-dc-text\">Show Legend</span>\n </label>\n )}\n\n {chartTypeConfig.displayOptions?.includes('showGrid') && (\n <label className=\"dc:flex dc:items-center dc:space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showGrid ?? true}\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n showGrid: e.target.checked\n })\n }\n className=\"dc:rounded border-dc-border focus:ring-dc-accent\"\n style={{ color: 'var(--dc-primary)' }}\n />\n <span className=\"dc:text-sm text-dc-text\">Show Grid</span>\n </label>\n )}\n\n {chartTypeConfig.displayOptions?.includes('showTooltip') && (\n <label className=\"dc:flex dc:items-center dc:space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showTooltip ?? true}\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n showTooltip: e.target.checked\n })\n }\n className=\"dc:rounded border-dc-border focus:ring-dc-accent\"\n style={{ color: 'var(--dc-primary)' }}\n />\n <span className=\"dc:text-sm text-dc-text\">Show Tooltip</span>\n </label>\n )}\n\n {chartTypeConfig.displayOptions?.includes('stacked') && (\n <label className=\"dc:flex dc:items-center dc:space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.stacked ?? false}\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n stacked: e.target.checked\n })\n }\n className=\"dc:rounded border-dc-border focus:ring-dc-accent\"\n style={{ color: 'var(--dc-primary)' }}\n />\n <span className=\"dc:text-sm text-dc-text\">Stacked</span>\n </label>\n )}\n\n {chartTypeConfig.displayOptions?.includes('hideHeader') && (\n <label className=\"dc:flex dc:items-center dc:space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.hideHeader ?? false}\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n hideHeader: e.target.checked\n })\n }\n className=\"dc:rounded border-dc-border focus:ring-dc-accent\"\n style={{ color: 'var(--dc-primary)' }}\n />\n <span className=\"dc:text-sm text-dc-text\">Hide Header</span>\n </label>\n )}\n\n {/* New structured display options */}\n {chartTypeConfig.displayOptionsConfig?.map((option) => (\n <div key={option.key} className={`dc:space-y-1 ${option.type === 'axisFormat' ? 'dc:mt-6 dc:pt-2' : ''}`}>\n {option.type === 'boolean' && (\n <label className=\"dc:flex dc:items-center dc:space-x-2\">\n <input\n type=\"checkbox\"\n checked={\n (displayConfig[option.key as keyof ChartDisplayConfig] as boolean) ??\n option.defaultValue ??\n false\n }\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: e.target.checked\n })\n }\n className=\"dc:rounded border-dc-border focus:ring-dc-accent\"\n style={{ color: 'var(--dc-primary)' }}\n />\n <span className=\"dc:text-sm text-dc-text\">{option.label}</span>\n </label>\n )}\n\n {option.type === 'string' && (\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-sm text-dc-text-secondary\">\n {option.label}\n {option.key === 'content' && (\n <span className=\"dc:text-xs text-dc-text-muted dc:ml-1\">\n (only headers, lists and links)\n </span>\n )}\n </label>\n {option.key === 'content' ? (\n <textarea\n value={\n (displayConfig[option.key as keyof ChartDisplayConfig] as string) ??\n option.defaultValue ??\n ''\n }\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: e.target.value\n })\n }\n placeholder={option.placeholder}\n rows={8}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent dc:font-mono dc:resize-y bg-dc-surface text-dc-text\"\n />\n ) : (\n <input\n type=\"text\"\n value={\n (displayConfig[option.key as keyof ChartDisplayConfig] as string) ??\n option.defaultValue ??\n ''\n }\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: e.target.value\n })\n }\n placeholder={option.placeholder}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n )}\n {option.description && (\n <p className=\"dc:text-xs text-dc-text-muted\">{option.description}</p>\n )}\n </div>\n )}\n\n {option.type === 'paletteColor' && (\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-sm text-dc-text-secondary\">{option.label}</label>\n <div className=\"dc:flex dc:flex-wrap dc:gap-2\">\n {colorPalette?.colors.map((color, index) => {\n const isSelected =\n ((displayConfig[option.key as keyof ChartDisplayConfig] as number) ??\n option.defaultValue ??\n 0) === index\n return (\n <button\n key={index}\n type=\"button\"\n onClick={() =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: index\n })\n }\n className={`dc:w-8 dc:h-8 dc:rounded dc:border-2 dc:transition-all dc:duration-200 dc:hover:scale-110 focus:outline-hidden dc:focus:ring-2 focus:ring-dc-accent dc:focus:ring-offset-1 ${\n isSelected\n ? 'dc:ring-2 dc:ring-offset-1 dc:scale-110'\n : 'hover:border-dc-text-muted'\n }`}\n style={{\n backgroundColor: color,\n borderColor: isSelected ? 'var(--dc-primary)' : 'var(--dc-border)'\n }}\n title={`Color ${index + 1}: ${color}`}\n />\n )\n }) || [\n // Fallback if no palette available\n <button\n key={0}\n type=\"button\"\n onClick={() =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: 0\n })\n }\n className=\"dc:w-8 dc:h-8 dc:rounded-sm dc:border-2 dc:ring-2 dc:ring-offset-1\"\n style={{\n backgroundColor: '#8884d8',\n borderColor: 'var(--dc-primary)',\n boxShadow: '0 0 0 2px var(--dc-primary)'\n }}\n title=\"Default Color\"\n />\n ]}\n </div>\n {option.description && (\n <p className=\"dc:text-xs text-dc-text-muted\">{option.description}</p>\n )}\n </div>\n )}\n\n {option.type === 'number' && (\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-sm text-dc-text-secondary\">{option.label}</label>\n <input\n type=\"number\"\n value={\n (displayConfig[option.key as keyof ChartDisplayConfig] as number) ??\n option.defaultValue ??\n 0\n }\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: e.target.value === '' ? undefined : Number(e.target.value)\n })\n }\n placeholder={option.placeholder}\n min={option.min}\n max={option.max}\n step={option.step}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n {option.description && (\n <p className=\"dc:text-xs text-dc-text-muted\">{option.description}</p>\n )}\n </div>\n )}\n\n {option.type === 'select' && (\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-sm text-dc-text-secondary\">{option.label}</label>\n <select\n value={\n (displayConfig[option.key as keyof ChartDisplayConfig] as string) ??\n option.defaultValue ??\n ''\n }\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: e.target.value\n })\n }\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n >\n {option.options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n {option.description && (\n <p className=\"dc:text-xs text-dc-text-muted\">{option.description}</p>\n )}\n </div>\n )}\n\n {option.type === 'color' && (\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-sm text-dc-text-secondary\">{option.label}</label>\n <div className=\"dc:flex dc:items-center dc:space-x-2\">\n <input\n type=\"color\"\n value={\n (displayConfig[option.key as keyof ChartDisplayConfig] as string) ??\n option.defaultValue ??\n '#8884d8'\n }\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: e.target.value\n })\n }\n className=\"dc:w-12 dc:h-8 dc:border border-dc-border dc:rounded-sm dc:cursor-pointer\"\n />\n <input\n type=\"text\"\n value={\n (displayConfig[option.key as keyof ChartDisplayConfig] as string) ??\n option.defaultValue ??\n '#8884d8'\n }\n onChange={(e) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: e.target.value\n })\n }\n placeholder={option.placeholder || '#8884d8'}\n className=\"dc:flex-1 dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n {option.description && (\n <p className=\"dc:text-xs text-dc-text-muted\">{option.description}</p>\n )}\n </div>\n )}\n\n {option.type === 'axisFormat' && (\n <AxisFormatControls\n axisLabel={option.label}\n value={(displayConfig[option.key as keyof ChartDisplayConfig] as AxisFormatConfig) || {}}\n onChange={(config) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: Object.keys(config).length > 0 ? config : undefined\n })\n }\n />\n )}\n\n {option.type === 'stringArray' && (\n <StringArrayInput\n label={option.label}\n value={(displayConfig[option.key as keyof ChartDisplayConfig] as string[]) ?? []}\n onChange={(arrayValue) =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: arrayValue.length > 0 ? arrayValue : undefined\n })\n }\n placeholder={option.placeholder}\n description={option.description}\n />\n )}\n\n {option.type === 'buttonGroup' && (\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-sm text-dc-text-secondary\">{option.label}</label>\n <div className=\"dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden\">\n {option.options?.map((opt) => {\n const isSelected = (displayConfig[option.key as keyof ChartDisplayConfig] ?? option.defaultValue) === opt.value\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() =>\n onDisplayConfigChange({\n ...displayConfig,\n [option.key]: opt.value\n })\n }\n className={`dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n isSelected\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n {option.description && (\n <p className=\"dc:text-xs text-dc-text-muted\">{option.description}</p>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["StringArrayInput","label","value","onChange","placeholder","description","localText","setLocalText","useState","useEffect","externalText","handleBlur","useCallback","arrayValue","s","jsxs","jsx","e","AnalysisDisplayConfigPanel","chartType","displayConfig","colorPalette","onDisplayConfigChange","chartTypeConfig","chartConfigLoaded","useChartConfig","SectionHeading","option","color","index","isSelected","opt","AxisFormatControls","config"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DashboardGridSettings, PortletConfig, RowLayout, RowLayoutColumn } from '../../types';
|
|
2
|
+
export declare const createRowId: () => string;
|
|
3
|
+
export declare const equalizeRowColumns: (portletIds: string[], gridSettings: DashboardGridSettings) => RowLayoutColumn[];
|
|
4
|
+
export declare const adjustRowWidths: (columns: RowLayoutColumn[], gridSettings: DashboardGridSettings) => RowLayoutColumn[];
|
|
5
|
+
export declare const convertPortletsToRows: (portlets: PortletConfig[], gridSettings: DashboardGridSettings) => RowLayout[];
|
|
6
|
+
export declare const normalizeRows: (rows: RowLayout[], portlets: PortletConfig[], gridSettings: DashboardGridSettings) => RowLayout[];
|
|
7
|
+
export declare const convertRowsToPortlets: (rows: RowLayout[], portlets: PortletConfig[]) => PortletConfig[];
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { MutableRefObject, RefObject } from 'react';
|
|
2
|
+
import { StoreApi } from 'zustand';
|
|
3
|
+
import { DashboardConfig, DashboardGridSettings, DashboardLayoutMode, PortletConfig, RowLayout, ThumbnailFeatureConfig } from '../../types';
|
|
4
|
+
import { DashboardStore, DashboardStoreActions } from '../../stores/dashboardStore';
|
|
5
|
+
interface UseDashboardControllerOptions {
|
|
6
|
+
allowedModes: DashboardLayoutMode[];
|
|
7
|
+
canChangeLayoutMode: boolean;
|
|
8
|
+
isResponsiveEditable: boolean;
|
|
9
|
+
layoutMode: DashboardLayoutMode;
|
|
10
|
+
resolvedRows: RowLayout[];
|
|
11
|
+
gridSettings: DashboardGridSettings;
|
|
12
|
+
thumbnailConfig?: ThumbnailFeatureConfig;
|
|
13
|
+
dashboardRef?: RefObject<HTMLElement | null>;
|
|
14
|
+
storeApi: StoreApi<DashboardStore>;
|
|
15
|
+
storeActions: Pick<DashboardStoreActions, 'setEditMode' | 'exitFilterSelectionMode' | 'openPortletModal' | 'closePortletModal' | 'openTextModal' | 'closeTextModal' | 'openFilterConfigModal' | 'closeFilterConfigModal' | 'openDeleteConfirm' | 'closeDeleteConfirm' | 'setThumbnailDirty'>;
|
|
16
|
+
configRef: MutableRefObject<DashboardConfig>;
|
|
17
|
+
onConfigChangeRef: MutableRefObject<((config: DashboardConfig) => void) | undefined>;
|
|
18
|
+
onSaveRef: MutableRefObject<((config: DashboardConfig) => Promise<void> | void) | undefined>;
|
|
19
|
+
onSaveThumbnailRef: MutableRefObject<((thumbnailData: string) => Promise<string | void>) | undefined>;
|
|
20
|
+
updateRowLayout: (rows: RowLayout[], save?: boolean, portletsOverride?: PortletConfig[]) => Promise<void>;
|
|
21
|
+
portletComponentRefs?: MutableRefObject<Record<string, {
|
|
22
|
+
refresh: (options?: {
|
|
23
|
+
bustCache?: boolean;
|
|
24
|
+
}) => void;
|
|
25
|
+
} | null>>;
|
|
26
|
+
onPortletRefresh?: (portletId: string, options?: {
|
|
27
|
+
bustCache?: boolean;
|
|
28
|
+
}) => void;
|
|
29
|
+
}
|
|
30
|
+
export declare function useDashboardController({ allowedModes, canChangeLayoutMode, isResponsiveEditable, layoutMode, resolvedRows, gridSettings, thumbnailConfig, dashboardRef, storeApi, storeActions, configRef, onConfigChangeRef, onSaveRef, onSaveThumbnailRef, updateRowLayout, portletComponentRefs, onPortletRefresh, }: UseDashboardControllerOptions): {
|
|
31
|
+
enterEditMode: () => void;
|
|
32
|
+
exitEditMode: () => void;
|
|
33
|
+
toggleEditMode: () => void;
|
|
34
|
+
selectFilter: (filterId: string | null) => void;
|
|
35
|
+
openAddPortlet: () => void;
|
|
36
|
+
openEditPortlet: (portlet: PortletConfig) => void;
|
|
37
|
+
openAddText: () => void;
|
|
38
|
+
openEditText: (portlet: PortletConfig) => void;
|
|
39
|
+
openFilterConfig: (portlet: PortletConfig) => void;
|
|
40
|
+
handleLayoutModeChange: (mode: DashboardLayoutMode) => Promise<void>;
|
|
41
|
+
savePortlet: (portletData: PortletConfig | Omit<PortletConfig, "id" | "x" | "y">) => Promise<string | null>;
|
|
42
|
+
deletePortlet: (portletId: string) => Promise<void>;
|
|
43
|
+
confirmDelete: () => Promise<void>;
|
|
44
|
+
duplicatePortlet: (portletId: string) => Promise<string | undefined>;
|
|
45
|
+
refreshPortlet: (portletId: string, options?: {
|
|
46
|
+
bustCache?: boolean;
|
|
47
|
+
}) => void;
|
|
48
|
+
toggleFilterForPortlet: (portletId: string, filterId: string) => Promise<void>;
|
|
49
|
+
selectAllForFilter: (filterId: string) => Promise<void>;
|
|
50
|
+
saveFilterConfig: (mapping: string[]) => Promise<void>;
|
|
51
|
+
handlePaletteChange: (paletteName: string) => Promise<void>;
|
|
52
|
+
};
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LayoutItem } from 'react-grid-layout';
|
|
2
|
+
import { StoreApi } from 'zustand';
|
|
3
|
+
import { DashboardStore } from '../../stores/dashboardStore';
|
|
4
|
+
interface UseGridLayoutEngineOptions {
|
|
5
|
+
storeApi: StoreApi<DashboardStore>;
|
|
6
|
+
}
|
|
7
|
+
export declare function useGridLayoutEngine({ storeApi }: UseGridLayoutEngineOptions): {
|
|
8
|
+
hasLayoutActuallyChanged: (newLayout: LayoutItem[]) => boolean;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MutableRefObject } from 'react';
|
|
2
|
+
import { DashboardConfig, DashboardGridSettings, DashboardLayoutMode, PortletConfig, RowLayout } from '../../types';
|
|
3
|
+
interface UseRowLayoutEngineOptions {
|
|
4
|
+
layoutMode: DashboardLayoutMode;
|
|
5
|
+
draftRows: RowLayout[] | null;
|
|
6
|
+
config: DashboardConfig;
|
|
7
|
+
gridSettings: DashboardGridSettings;
|
|
8
|
+
configRef: MutableRefObject<DashboardConfig>;
|
|
9
|
+
onConfigChangeRef: MutableRefObject<((config: DashboardConfig) => void) | undefined>;
|
|
10
|
+
onSaveRef: MutableRefObject<((config: DashboardConfig) => Promise<void> | void) | undefined>;
|
|
11
|
+
setDraftRows: (rows: RowLayout[] | null) => void;
|
|
12
|
+
setThumbnailDirty: (dirty: boolean) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function useRowLayoutEngine({ layoutMode, draftRows, config, gridSettings, configRef, onConfigChangeRef, onSaveRef, setDraftRows, setThumbnailDirty, }: UseRowLayoutEngineOptions): {
|
|
15
|
+
resolvedRows: RowLayout[];
|
|
16
|
+
updateRowLayout: (rows: RowLayout[], save?: boolean, portletsOverride?: PortletConfig[]) => Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -45,6 +45,10 @@ export interface UseDashboardResult {
|
|
|
45
45
|
isPortletModalOpen: boolean;
|
|
46
46
|
/** Portlet being edited */
|
|
47
47
|
editingPortlet: PortletConfig | null;
|
|
48
|
+
/** Whether text portlet modal is open */
|
|
49
|
+
isTextModalOpen: boolean;
|
|
50
|
+
/** Portlet being edited in text modal */
|
|
51
|
+
editingTextPortlet: PortletConfig | null;
|
|
48
52
|
/** Whether filter config modal is open */
|
|
49
53
|
isFilterConfigModalOpen: boolean;
|
|
50
54
|
/** Portlet for filter configuration */
|
|
@@ -59,8 +63,6 @@ export interface UseDashboardResult {
|
|
|
59
63
|
lastKnownLayout: LayoutItem[];
|
|
60
64
|
/** Whether component is initialized */
|
|
61
65
|
isInitialized: boolean;
|
|
62
|
-
/** Debug data per portlet */
|
|
63
|
-
debugData: Record<string, PortletDebugDataEntry>;
|
|
64
66
|
/** Whether editing is allowed (editable && isEditMode && desktop && !filterMode) */
|
|
65
67
|
canEdit: boolean;
|
|
66
68
|
/** Whether layout mode can be changed */
|
|
@@ -84,6 +86,9 @@ export interface UseDashboardActions {
|
|
|
84
86
|
openAddPortlet: () => void;
|
|
85
87
|
openEditPortlet: (portlet: PortletConfig) => void;
|
|
86
88
|
closePortletModal: () => void;
|
|
89
|
+
openAddText: () => void;
|
|
90
|
+
openEditText: (portlet: PortletConfig) => void;
|
|
91
|
+
closeTextModal: () => void;
|
|
87
92
|
openFilterConfig: (portlet: PortletConfig) => void;
|
|
88
93
|
closeFilterConfig: () => void;
|
|
89
94
|
setDraftRows: (rows: RowLayout[] | null) => void;
|