@burdenoff/microfe-bigconsole 2026.613.4 → 2026.613.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +163 -151
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +89 -69
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +65 -46
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableCell.js +50 -30
- package/dist/bigconsole/components/widgets/table/TableCell.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableWidget.js +95 -88
- package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
- package/dist/bigconsole/hooks/useDashboardImageExport.js +92 -1
- package/dist/bigconsole/hooks/useDashboardImageExport.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,129 +4,149 @@ import "../../store/index.js";
|
|
|
4
4
|
import n from "./SavedViewsDropdown/SavedViewsDropdown.js";
|
|
5
5
|
import "./SavedViewsDropdown/index.js";
|
|
6
6
|
import { memo as r, useCallback as i } from "react";
|
|
7
|
-
import { Clipboard as a, Download as o, Eye as s,
|
|
8
|
-
import { Fragment as
|
|
9
|
-
import { Button as
|
|
7
|
+
import { Clipboard as a, Download as o, Eye as s, FileText as c, Image as l, Minus as u, PanelLeft as d, PanelLeftClose as f, Pencil as p, Plus as m, RotateCcw as h, Save as g, Share2 as _ } from "lucide-react";
|
|
8
|
+
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
9
|
+
import { Button as x, Spinner as S, Tooltip as C, TooltipContent as w, TooltipProvider as T, TooltipTrigger as E } from "@burdenoff/fe-libs/ui";
|
|
10
10
|
//#region src/bigconsole/components/dashboard/DashboardToolbar.tsx
|
|
11
|
-
var
|
|
12
|
-
let
|
|
13
|
-
|
|
14
|
-
}, [
|
|
15
|
-
return /* @__PURE__ */
|
|
11
|
+
var D = r(function({ dashboardId: r, title: D, onAddWidget: O, onTogglePalette: k, isPaletteOpen: A = !1, onPaste: j, onSave: M, isSaving: N = !1, onExport: P, onExportImage: F, onExportPdf: I, isExportingImage: L = !1, onShare: R }) {
|
|
12
|
+
let z = t((e) => e.viewMode === "edit"), B = t((e) => e.toggleViewMode), V = t((e) => e.zoomLevel), H = t((e) => e.setZoomLevel), U = !!e((e) => e.clipboardWidgetId), W = i(() => {
|
|
13
|
+
U && j && j();
|
|
14
|
+
}, [U, j]);
|
|
15
|
+
return /* @__PURE__ */ y(T, { children: /* @__PURE__ */ b("div", {
|
|
16
16
|
className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2 px-4 py-2 bg-background border-b",
|
|
17
17
|
children: [
|
|
18
|
-
/* @__PURE__ */
|
|
18
|
+
/* @__PURE__ */ b("div", {
|
|
19
19
|
className: "flex min-w-0 items-center gap-4",
|
|
20
|
-
children: [
|
|
20
|
+
children: [D && /* @__PURE__ */ y("h1", {
|
|
21
21
|
className: "min-w-0 truncate text-lg font-semibold",
|
|
22
|
-
title:
|
|
23
|
-
children:
|
|
24
|
-
}), r && /* @__PURE__ */
|
|
22
|
+
title: D,
|
|
23
|
+
children: D
|
|
24
|
+
}), r && /* @__PURE__ */ y(n, { dashboardId: r })]
|
|
25
25
|
}),
|
|
26
|
-
/* @__PURE__ */
|
|
26
|
+
/* @__PURE__ */ b("div", {
|
|
27
27
|
className: "flex flex-shrink-0 items-center gap-1",
|
|
28
28
|
children: [
|
|
29
|
-
/* @__PURE__ */
|
|
29
|
+
/* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
30
30
|
asChild: !0,
|
|
31
|
-
children: /* @__PURE__ */
|
|
31
|
+
children: /* @__PURE__ */ y(x, {
|
|
32
32
|
variant: "ghost",
|
|
33
33
|
size: "icon-sm",
|
|
34
|
-
onClick: () =>
|
|
35
|
-
disabled:
|
|
36
|
-
children: /* @__PURE__ */
|
|
34
|
+
onClick: () => H(Math.max(50, V - 10)),
|
|
35
|
+
disabled: V <= 50,
|
|
36
|
+
children: /* @__PURE__ */ y(u, { className: "size-4" })
|
|
37
37
|
})
|
|
38
|
-
}), /* @__PURE__ */
|
|
39
|
-
/* @__PURE__ */
|
|
38
|
+
}), /* @__PURE__ */ y(w, { children: "Zoom out" })] }),
|
|
39
|
+
/* @__PURE__ */ b("span", {
|
|
40
40
|
className: "text-sm text-muted-foreground w-12 text-center",
|
|
41
|
-
children: [
|
|
41
|
+
children: [V, "%"]
|
|
42
42
|
}),
|
|
43
|
-
/* @__PURE__ */
|
|
43
|
+
/* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
44
44
|
asChild: !0,
|
|
45
|
-
children: /* @__PURE__ */
|
|
45
|
+
children: /* @__PURE__ */ y(x, {
|
|
46
46
|
variant: "ghost",
|
|
47
47
|
size: "icon-sm",
|
|
48
|
-
onClick: () =>
|
|
49
|
-
disabled:
|
|
50
|
-
children: /* @__PURE__ */
|
|
48
|
+
onClick: () => H(Math.min(200, V + 10)),
|
|
49
|
+
disabled: V >= 200,
|
|
50
|
+
children: /* @__PURE__ */ y(m, { className: "size-4" })
|
|
51
51
|
})
|
|
52
|
-
}), /* @__PURE__ */
|
|
53
|
-
/* @__PURE__ */
|
|
52
|
+
}), /* @__PURE__ */ y(w, { children: "Zoom in" })] }),
|
|
53
|
+
/* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
54
54
|
asChild: !0,
|
|
55
|
-
children: /* @__PURE__ */
|
|
55
|
+
children: /* @__PURE__ */ b(x, {
|
|
56
56
|
variant: "ghost",
|
|
57
57
|
size: "sm",
|
|
58
|
-
onClick: () =>
|
|
59
|
-
children: [/* @__PURE__ */
|
|
58
|
+
onClick: () => H(100),
|
|
59
|
+
children: [/* @__PURE__ */ y(h, { className: "size-3.5 mr-1" }), "Reset"]
|
|
60
60
|
})
|
|
61
|
-
}), /* @__PURE__ */
|
|
61
|
+
}), /* @__PURE__ */ y(w, { children: "Reset zoom to 100%" })] })
|
|
62
62
|
]
|
|
63
63
|
}),
|
|
64
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ b("div", {
|
|
65
65
|
className: "flex flex-wrap items-center justify-end gap-2",
|
|
66
66
|
children: [
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
z && /* @__PURE__ */ b(v, { children: [
|
|
68
|
+
k && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
69
69
|
asChild: !0,
|
|
70
|
-
children: /* @__PURE__ */
|
|
71
|
-
variant:
|
|
70
|
+
children: /* @__PURE__ */ b(x, {
|
|
71
|
+
variant: A ? "secondary" : "outline",
|
|
72
72
|
size: "sm",
|
|
73
|
-
onClick:
|
|
74
|
-
children: [
|
|
73
|
+
onClick: k,
|
|
74
|
+
children: [y(A ? f : d, { className: "size-4" }), "Widgets"]
|
|
75
75
|
})
|
|
76
|
-
}), /* @__PURE__ */
|
|
77
|
-
/* @__PURE__ */
|
|
76
|
+
}), /* @__PURE__ */ y(w, { children: A ? "Hide widget palette" : "Show widget palette for drag & drop" })] }),
|
|
77
|
+
/* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
78
78
|
asChild: !0,
|
|
79
|
-
children: /* @__PURE__ */
|
|
79
|
+
children: /* @__PURE__ */ b(x, {
|
|
80
80
|
variant: "ghost",
|
|
81
81
|
size: "sm",
|
|
82
|
-
onClick:
|
|
83
|
-
disabled: !
|
|
84
|
-
children: [/* @__PURE__ */
|
|
82
|
+
onClick: W,
|
|
83
|
+
disabled: !U,
|
|
84
|
+
children: [/* @__PURE__ */ y(a, { className: "size-4" }), "Paste"]
|
|
85
85
|
})
|
|
86
|
-
}), /* @__PURE__ */
|
|
87
|
-
/* @__PURE__ */
|
|
86
|
+
}), /* @__PURE__ */ y(w, { children: "Paste widget from clipboard" })] }),
|
|
87
|
+
/* @__PURE__ */ b(x, {
|
|
88
88
|
size: "sm",
|
|
89
|
-
onClick:
|
|
90
|
-
children: [/* @__PURE__ */
|
|
89
|
+
onClick: O,
|
|
90
|
+
children: [/* @__PURE__ */ y(m, { className: "size-4" }), "Add Widget"]
|
|
91
91
|
})
|
|
92
92
|
] }),
|
|
93
|
-
/* @__PURE__ */
|
|
94
|
-
variant:
|
|
93
|
+
/* @__PURE__ */ y(x, {
|
|
94
|
+
variant: z ? "secondary" : "outline",
|
|
95
95
|
size: "sm",
|
|
96
|
-
onClick:
|
|
97
|
-
children:
|
|
96
|
+
onClick: B,
|
|
97
|
+
children: z ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(s, { className: "size-4" }), "Preview"] }) : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(p, { className: "size-4" }), "Edit"] })
|
|
98
98
|
}),
|
|
99
|
-
|
|
99
|
+
M && /* @__PURE__ */ y(x, {
|
|
100
100
|
variant: "outline",
|
|
101
101
|
size: "sm",
|
|
102
|
-
onClick:
|
|
103
|
-
disabled:
|
|
104
|
-
children:
|
|
102
|
+
onClick: M,
|
|
103
|
+
disabled: N,
|
|
104
|
+
children: N ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(S, { className: "size-4" }), "Saving..."] }) : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(g, { className: "size-4" }), "Save"] })
|
|
105
105
|
}),
|
|
106
|
-
|
|
106
|
+
R && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
107
107
|
asChild: !0,
|
|
108
|
-
children: /* @__PURE__ */
|
|
108
|
+
children: /* @__PURE__ */ b(x, {
|
|
109
109
|
variant: "outline",
|
|
110
110
|
size: "sm",
|
|
111
|
-
onClick:
|
|
112
|
-
children: [/* @__PURE__ */ _
|
|
111
|
+
onClick: R,
|
|
112
|
+
children: [/* @__PURE__ */ y(_, { className: "size-4" }), "Share"]
|
|
113
113
|
})
|
|
114
|
-
}), /* @__PURE__ */
|
|
115
|
-
|
|
114
|
+
}), /* @__PURE__ */ y(w, { children: "Share dashboard with others" })] }),
|
|
115
|
+
P && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
116
116
|
asChild: !0,
|
|
117
|
-
children: /* @__PURE__ */
|
|
117
|
+
children: /* @__PURE__ */ b(x, {
|
|
118
118
|
variant: "outline",
|
|
119
119
|
size: "sm",
|
|
120
|
-
onClick:
|
|
121
|
-
children: [/* @__PURE__ */
|
|
120
|
+
onClick: P,
|
|
121
|
+
children: [/* @__PURE__ */ y(o, { className: "size-4" }), "Export"]
|
|
122
122
|
})
|
|
123
|
-
}), /* @__PURE__ */
|
|
123
|
+
}), /* @__PURE__ */ y(w, { children: "Export dashboard to JSON" })] }),
|
|
124
|
+
F && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
125
|
+
asChild: !0,
|
|
126
|
+
children: /* @__PURE__ */ y(x, {
|
|
127
|
+
variant: "outline",
|
|
128
|
+
size: "icon-sm",
|
|
129
|
+
onClick: F,
|
|
130
|
+
disabled: L,
|
|
131
|
+
children: y(L ? S : l, { className: "size-4" })
|
|
132
|
+
})
|
|
133
|
+
}), /* @__PURE__ */ y(w, { children: "Export board as PNG image" })] }),
|
|
134
|
+
I && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
|
|
135
|
+
asChild: !0,
|
|
136
|
+
children: /* @__PURE__ */ y(x, {
|
|
137
|
+
variant: "outline",
|
|
138
|
+
size: "icon-sm",
|
|
139
|
+
onClick: I,
|
|
140
|
+
disabled: L,
|
|
141
|
+
children: /* @__PURE__ */ y(c, { className: "size-4" })
|
|
142
|
+
})
|
|
143
|
+
}), /* @__PURE__ */ y(w, { children: "Export board as PDF" })] })
|
|
124
144
|
]
|
|
125
145
|
})
|
|
126
146
|
]
|
|
127
147
|
}) });
|
|
128
148
|
});
|
|
129
149
|
//#endregion
|
|
130
|
-
export {
|
|
150
|
+
export { D as default };
|
|
131
151
|
|
|
132
152
|
//# sourceMappingURL=DashboardToolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardToolbar.js","names":[],"sources":["../../../../src/bigconsole/components/dashboard/DashboardToolbar.tsx"],"sourcesContent":["/**\n * DashboardToolbar Component\n *\n * Toolbar for dashboard actions and controls.\n * Uses fe-libs shared components for consistent styling.\n * Phase 2: Added SavedViewsDropdown and Share button.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n Clipboard,\n Eye,\n Pencil,\n Save,\n Download,\n Minus,\n RotateCcw,\n Share2,\n LayoutGrid,\n PanelLeftClose,\n PanelLeft,\n} from 'lucide-react';\nimport { useDashboardStore, useWidgetStore } from '../../store';\nimport { SavedViewsDropdown } from './SavedViewsDropdown';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DashboardToolbarProps {\n /** Dashboard ID for saved views */\n dashboardId?: string;\n /** Dashboard title */\n title?: string;\n /** Callback to add widget */\n onAddWidget: () => void;\n /** Callback to toggle widget palette */\n onTogglePalette?: () => void;\n /** Whether palette is open */\n isPaletteOpen?: boolean;\n /** Callback to paste widget */\n onPaste?: () => void;\n /** Callback to save dashboard */\n onSave?: () => void;\n /** Whether save is in progress */\n isSaving?: boolean;\n /** Callback to export dashboard */\n onExport?: () => void;\n /** Callback to open share dialog */\n onShare?: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DashboardToolbar: FC<DashboardToolbarProps> = memo(function DashboardToolbar({\n dashboardId,\n title,\n onAddWidget,\n onTogglePalette,\n isPaletteOpen = false,\n onPaste,\n onSave,\n isSaving = false,\n onExport,\n onShare,\n}) {\n const isEditMode = useDashboardStore((state) => state.viewMode === 'edit');\n const toggleViewMode = useDashboardStore((state) => state.toggleViewMode);\n const zoomLevel = useDashboardStore((state) => state.zoomLevel);\n const setZoomLevel = useDashboardStore((state) => state.setZoomLevel);\n\n const clipboardWidgetId = useWidgetStore((state) => state.clipboardWidgetId);\n const hasClipboard = !!clipboardWidgetId;\n\n // Handle paste - use provided callback or fallback\n const handlePaste = useCallback(() => {\n if (hasClipboard && onPaste) {\n onPaste();\n }\n }, [hasClipboard, onPaste]);\n\n return (\n <TooltipProvider>\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 px-4 py-2 bg-background border-b\">\n {/* Left section */}\n <div className=\"flex min-w-0 items-center gap-4\">\n {title && (\n <h1 className=\"min-w-0 truncate text-lg font-semibold\" title={title}>\n {title}\n </h1>\n )}\n {/* Saved Views Dropdown */}\n {dashboardId && <SavedViewsDropdown dashboardId={dashboardId} />}\n </div>\n\n {/* Center section - Zoom controls */}\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.max(50, zoomLevel - 10))}\n disabled={zoomLevel <= 50}\n >\n <Minus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom out</TooltipContent>\n </Tooltip>\n\n <span className=\"text-sm text-muted-foreground w-12 text-center\">{zoomLevel}%</span>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.min(200, zoomLevel + 10))}\n disabled={zoomLevel >= 200}\n >\n <Plus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom in</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setZoomLevel(100)}>\n <RotateCcw className=\"size-3.5 mr-1\" />\n Reset\n </Button>\n </TooltipTrigger>\n <TooltipContent>Reset zoom to 100%</TooltipContent>\n </Tooltip>\n </div>\n\n {/* Right section - Actions */}\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {isEditMode && (\n <>\n {/* Widget Palette Toggle */}\n {onTogglePalette && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant={isPaletteOpen ? 'secondary' : 'outline'} size=\"sm\" onClick={onTogglePalette}>\n {isPaletteOpen ? <PanelLeftClose className=\"size-4\" /> : <PanelLeft className=\"size-4\" />}\n Widgets\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {isPaletteOpen ? 'Hide widget palette' : 'Show widget palette for drag & drop'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {/* Paste */}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={handlePaste} disabled={!hasClipboard}>\n <Clipboard className=\"size-4\" />\n Paste\n </Button>\n </TooltipTrigger>\n <TooltipContent>Paste widget from clipboard</TooltipContent>\n </Tooltip>\n\n {/* Add Widget (Dialog) */}\n <Button size=\"sm\" onClick={onAddWidget}>\n <Plus className=\"size-4\" />\n Add Widget\n </Button>\n </>\n )}\n\n {/* Edit/View Mode Toggle */}\n <Button variant={isEditMode ? 'secondary' : 'outline'} size=\"sm\" onClick={toggleViewMode}>\n {isEditMode ? (\n <>\n <Eye className=\"size-4\" />\n Preview\n </>\n ) : (\n <>\n <Pencil className=\"size-4\" />\n Edit\n </>\n )}\n </Button>\n\n {/* Save */}\n {onSave && (\n <Button variant=\"outline\" size=\"sm\" onClick={onSave} disabled={isSaving}>\n {isSaving ? (\n <>\n <Spinner className=\"size-4\" />\n Saving...\n </>\n ) : (\n <>\n <Save className=\"size-4\" />\n Save\n </>\n )}\n </Button>\n )}\n\n {/* Share */}\n {onShare && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onShare}>\n <Share2 className=\"size-4\" />\n Share\n </Button>\n </TooltipTrigger>\n <TooltipContent>Share dashboard with others</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export */}\n {onExport && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onExport}>\n <Download className=\"size-4\" />\n Export\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export dashboard to JSON</TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </TooltipProvider>\n );\n});\n\nexport default DashboardToolbar;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DashboardToolbar.js","names":[],"sources":["../../../../src/bigconsole/components/dashboard/DashboardToolbar.tsx"],"sourcesContent":["/**\n * DashboardToolbar Component\n *\n * Toolbar for dashboard actions and controls.\n * Uses fe-libs shared components for consistent styling.\n * Phase 2: Added SavedViewsDropdown and Share button.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n Clipboard,\n Eye,\n Pencil,\n Save,\n Download,\n Minus,\n RotateCcw,\n Share2,\n PanelLeftClose,\n PanelLeft,\n Image as ImageIcon,\n FileText,\n} from 'lucide-react';\nimport { useDashboardStore, useWidgetStore } from '../../store';\nimport { SavedViewsDropdown } from './SavedViewsDropdown';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DashboardToolbarProps {\n /** Dashboard ID for saved views */\n dashboardId?: string;\n /** Dashboard title */\n title?: string;\n /** Callback to add widget */\n onAddWidget: () => void;\n /** Callback to toggle widget palette */\n onTogglePalette?: () => void;\n /** Whether palette is open */\n isPaletteOpen?: boolean;\n /** Callback to paste widget */\n onPaste?: () => void;\n /** Callback to save dashboard */\n onSave?: () => void;\n /** Whether save is in progress */\n isSaving?: boolean;\n /** Callback to export dashboard (JSON console definition) */\n onExport?: () => void;\n /** Callback to export the board as a PNG image */\n onExportImage?: () => void;\n /** Callback to export the board as a PDF */\n onExportPdf?: () => void;\n /** Whether an image/PDF export is in progress */\n isExportingImage?: boolean;\n /** Callback to open share dialog */\n onShare?: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DashboardToolbar: FC<DashboardToolbarProps> = memo(function DashboardToolbar({\n dashboardId,\n title,\n onAddWidget,\n onTogglePalette,\n isPaletteOpen = false,\n onPaste,\n onSave,\n isSaving = false,\n onExport,\n onExportImage,\n onExportPdf,\n isExportingImage = false,\n onShare,\n}) {\n const isEditMode = useDashboardStore((state) => state.viewMode === 'edit');\n const toggleViewMode = useDashboardStore((state) => state.toggleViewMode);\n const zoomLevel = useDashboardStore((state) => state.zoomLevel);\n const setZoomLevel = useDashboardStore((state) => state.setZoomLevel);\n\n const clipboardWidgetId = useWidgetStore((state) => state.clipboardWidgetId);\n const hasClipboard = !!clipboardWidgetId;\n\n // Handle paste - use provided callback or fallback\n const handlePaste = useCallback(() => {\n if (hasClipboard && onPaste) {\n onPaste();\n }\n }, [hasClipboard, onPaste]);\n\n return (\n <TooltipProvider>\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 px-4 py-2 bg-background border-b\">\n {/* Left section */}\n <div className=\"flex min-w-0 items-center gap-4\">\n {title && (\n <h1 className=\"min-w-0 truncate text-lg font-semibold\" title={title}>\n {title}\n </h1>\n )}\n {/* Saved Views Dropdown */}\n {dashboardId && <SavedViewsDropdown dashboardId={dashboardId} />}\n </div>\n\n {/* Center section - Zoom controls */}\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.max(50, zoomLevel - 10))}\n disabled={zoomLevel <= 50}\n >\n <Minus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom out</TooltipContent>\n </Tooltip>\n\n <span className=\"text-sm text-muted-foreground w-12 text-center\">{zoomLevel}%</span>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.min(200, zoomLevel + 10))}\n disabled={zoomLevel >= 200}\n >\n <Plus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom in</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setZoomLevel(100)}>\n <RotateCcw className=\"size-3.5 mr-1\" />\n Reset\n </Button>\n </TooltipTrigger>\n <TooltipContent>Reset zoom to 100%</TooltipContent>\n </Tooltip>\n </div>\n\n {/* Right section - Actions */}\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {isEditMode && (\n <>\n {/* Widget Palette Toggle */}\n {onTogglePalette && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant={isPaletteOpen ? 'secondary' : 'outline'} size=\"sm\" onClick={onTogglePalette}>\n {isPaletteOpen ? <PanelLeftClose className=\"size-4\" /> : <PanelLeft className=\"size-4\" />}\n Widgets\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {isPaletteOpen ? 'Hide widget palette' : 'Show widget palette for drag & drop'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {/* Paste */}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={handlePaste} disabled={!hasClipboard}>\n <Clipboard className=\"size-4\" />\n Paste\n </Button>\n </TooltipTrigger>\n <TooltipContent>Paste widget from clipboard</TooltipContent>\n </Tooltip>\n\n {/* Add Widget (Dialog) */}\n <Button size=\"sm\" onClick={onAddWidget}>\n <Plus className=\"size-4\" />\n Add Widget\n </Button>\n </>\n )}\n\n {/* Edit/View Mode Toggle */}\n <Button variant={isEditMode ? 'secondary' : 'outline'} size=\"sm\" onClick={toggleViewMode}>\n {isEditMode ? (\n <>\n <Eye className=\"size-4\" />\n Preview\n </>\n ) : (\n <>\n <Pencil className=\"size-4\" />\n Edit\n </>\n )}\n </Button>\n\n {/* Save */}\n {onSave && (\n <Button variant=\"outline\" size=\"sm\" onClick={onSave} disabled={isSaving}>\n {isSaving ? (\n <>\n <Spinner className=\"size-4\" />\n Saving...\n </>\n ) : (\n <>\n <Save className=\"size-4\" />\n Save\n </>\n )}\n </Button>\n )}\n\n {/* Share */}\n {onShare && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onShare}>\n <Share2 className=\"size-4\" />\n Share\n </Button>\n </TooltipTrigger>\n <TooltipContent>Share dashboard with others</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export — JSON definition */}\n {onExport && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onExport}>\n <Download className=\"size-4\" />\n Export\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export dashboard to JSON</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export — board PNG */}\n {onExportImage && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"icon-sm\" onClick={onExportImage} disabled={isExportingImage}>\n {isExportingImage ? <Spinner className=\"size-4\" /> : <ImageIcon className=\"size-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export board as PNG image</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export — board PDF */}\n {onExportPdf && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"icon-sm\" onClick={onExportPdf} disabled={isExportingImage}>\n <FileText className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export board as PDF</TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </TooltipProvider>\n );\n});\n\nexport default DashboardToolbar;\n"],"mappings":"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"}
|
|
@@ -21,13 +21,24 @@ function m(e) {
|
|
|
21
21
|
return typeof e == "number" && Number.isFinite(e);
|
|
22
22
|
}
|
|
23
23
|
function h(e) {
|
|
24
|
+
return e >= .66 ? "var(--color-status-error)" : e >= .33 ? "var(--color-status-warning)" : "var(--color-status-info)";
|
|
25
|
+
}
|
|
26
|
+
function g(e) {
|
|
27
|
+
let t = document.createElement("div"), n = document.createElement("div");
|
|
28
|
+
if (n.style.fontWeight = "600", n.textContent = e.popup || e.name || "Location", t.appendChild(n), m(e.value)) {
|
|
29
|
+
let n = document.createElement("div");
|
|
30
|
+
n.textContent = e.value.toLocaleString(), t.appendChild(n);
|
|
31
|
+
}
|
|
32
|
+
return t;
|
|
33
|
+
}
|
|
34
|
+
function _(e) {
|
|
24
35
|
let t = e;
|
|
25
36
|
return t && m(t.lat) && m(t.lng) ? {
|
|
26
37
|
lat: t.lat,
|
|
27
38
|
lng: t.lng
|
|
28
39
|
} : void 0;
|
|
29
40
|
}
|
|
30
|
-
function
|
|
41
|
+
function v(e, t) {
|
|
31
42
|
let n = Array.isArray(e) ? void 0 : e, r = Array.isArray(e) ? e : e?.markers, i = Array.isArray(r) ? r.filter((e) => e && m(e.lat) && m(e.lng)) : [], a = (n?.geoJson ?? t.geoJson) || void 0, o = t.regionIdField || "id", s = /* @__PURE__ */ new Map(), c = n?.regions ?? t.regions;
|
|
32
43
|
if (Array.isArray(c)) for (let e of c) {
|
|
33
44
|
if (!e) continue;
|
|
@@ -39,18 +50,18 @@ function g(e, t) {
|
|
|
39
50
|
}
|
|
40
51
|
return {
|
|
41
52
|
markers: i,
|
|
42
|
-
center:
|
|
53
|
+
center: _(n?.center),
|
|
43
54
|
zoom: m(n?.zoom) ? n?.zoom : void 0,
|
|
44
|
-
fallbackCenter:
|
|
55
|
+
fallbackCenter: _(t.center),
|
|
45
56
|
fallbackZoom: m(t.zoom) ? t.zoom : void 0,
|
|
46
57
|
geoJson: a && Array.isArray(a.features) ? a : void 0,
|
|
47
58
|
regionValues: s
|
|
48
59
|
};
|
|
49
60
|
}
|
|
50
|
-
var
|
|
51
|
-
let f = r(null),
|
|
61
|
+
var y = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
62
|
+
let f = r(null), _ = r(null), y = r(null), [b, x] = i("loading"), S = n(() => e?.config ?? {}, [e?.config]), C = S.showMarkers !== !1, w = S.mapMode === "heat", T = S.regionIdField || "id", { markers: E, center: D, zoom: O, fallbackCenter: k, fallbackZoom: A, geoJson: j, regionValues: M } = n(() => v(c, S), [c, S]), N = !!(j && M.size > 0), P = r(() => void 0);
|
|
52
63
|
return t(() => {
|
|
53
|
-
|
|
64
|
+
P.current = (e) => {
|
|
54
65
|
u ? u(e) : l && l(e);
|
|
55
66
|
};
|
|
56
67
|
}, [l, u]), t(() => {
|
|
@@ -70,30 +81,30 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
|
70
81
|
maxZoom: 18
|
|
71
82
|
}), r = !1;
|
|
72
83
|
n.on("tileload", () => {
|
|
73
|
-
r = !0,
|
|
84
|
+
r = !0, x((e) => e === "error" ? "ready" : e);
|
|
74
85
|
}), n.on("tileerror", () => {
|
|
75
|
-
r ||
|
|
76
|
-
}), n.addTo(t),
|
|
86
|
+
r || x("error");
|
|
87
|
+
}), n.addTo(t), _.current = t, y.current = null, x("ready");
|
|
77
88
|
} catch {
|
|
78
|
-
|
|
89
|
+
x("error");
|
|
79
90
|
return;
|
|
80
91
|
}
|
|
81
|
-
let n = typeof ResizeObserver < "u" ? new ResizeObserver(() =>
|
|
92
|
+
let n = typeof ResizeObserver < "u" ? new ResizeObserver(() => _.current?.invalidateSize()) : void 0;
|
|
82
93
|
n?.observe(e);
|
|
83
94
|
let r = window.setTimeout(() => t.invalidateSize(), 80);
|
|
84
95
|
return () => {
|
|
85
|
-
window.clearTimeout(r), n?.disconnect(), t.remove(),
|
|
96
|
+
window.clearTimeout(r), n?.disconnect(), t.remove(), _.current = null;
|
|
86
97
|
};
|
|
87
98
|
}, []), t(() => {
|
|
88
|
-
let e =
|
|
99
|
+
let e = _.current;
|
|
89
100
|
if (!e) return;
|
|
90
101
|
let t = s.layerGroup(), n = null;
|
|
91
|
-
if (
|
|
92
|
-
let e = Array.from(
|
|
93
|
-
let t = e.properties ?? {}, n = e.id ?? t[
|
|
94
|
-
return n == null ? void 0 :
|
|
102
|
+
if (j && M.size > 0) {
|
|
103
|
+
let e = Array.from(M.values()).map((e) => e.value), r = Math.min(...e), i = Math.max(...e) - r || 1, a = (e) => {
|
|
104
|
+
let t = e.properties ?? {}, n = e.id ?? t[T] ?? t.id ?? t.code;
|
|
105
|
+
return n == null ? void 0 : M.get(String(n));
|
|
95
106
|
};
|
|
96
|
-
n = s.geoJSON(
|
|
107
|
+
n = s.geoJSON(j, {
|
|
97
108
|
style: (e) => {
|
|
98
109
|
let t = e ? a(e) : void 0, n = t ? (t.value - r) / i : 0;
|
|
99
110
|
return {
|
|
@@ -109,7 +120,7 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
|
109
120
|
let e = document.createElement("div");
|
|
110
121
|
e.textContent = n.value.toLocaleString(), i.appendChild(e);
|
|
111
122
|
}
|
|
112
|
-
t.bindPopup(i), t.on("click", () =>
|
|
123
|
+
t.bindPopup(i), t.on("click", () => P.current({
|
|
113
124
|
name: r,
|
|
114
125
|
lat: NaN,
|
|
115
126
|
lng: NaN,
|
|
@@ -118,7 +129,18 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
|
118
129
|
}
|
|
119
130
|
}), n.addTo(t);
|
|
120
131
|
}
|
|
121
|
-
if (
|
|
132
|
+
if (C && w) {
|
|
133
|
+
let e = E.map((e) => m(e.value) ? e.value : 1), n = e.reduce((e, t) => Math.min(e, t), Infinity), r = e.reduce((e, t) => Math.max(e, t), -Infinity) - n || 1;
|
|
134
|
+
E.forEach((i, a) => {
|
|
135
|
+
let o = (e[a] - n) / r, c = s.circleMarker([i.lat, i.lng], {
|
|
136
|
+
radius: 10 + o * 22,
|
|
137
|
+
fillColor: h(o),
|
|
138
|
+
fillOpacity: .25 + o * .35,
|
|
139
|
+
stroke: !1
|
|
140
|
+
}).addTo(t);
|
|
141
|
+
c.bindPopup(g(i)), c.on("click", () => P.current(i));
|
|
142
|
+
});
|
|
143
|
+
} else if (C) for (let e of E) {
|
|
122
144
|
let n = document.createElement("div");
|
|
123
145
|
Object.assign(n.style, {
|
|
124
146
|
width: "14px",
|
|
@@ -134,51 +156,48 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
|
134
156
|
html: n,
|
|
135
157
|
iconSize: [14, 14],
|
|
136
158
|
iconAnchor: [7, 14]
|
|
137
|
-
}), i = s.marker([e.lat, e.lng], { icon: r }).addTo(t)
|
|
138
|
-
|
|
139
|
-
let t = document.createElement("div");
|
|
140
|
-
t.textContent = e.value.toLocaleString(), a.appendChild(t);
|
|
141
|
-
}
|
|
142
|
-
i.bindPopup(a), i.on("click", () => j.current(e));
|
|
159
|
+
}), i = s.marker([e.lat, e.lng], { icon: r }).addTo(t);
|
|
160
|
+
i.bindPopup(g(e)), i.on("click", () => P.current(e));
|
|
143
161
|
}
|
|
144
162
|
t.addTo(e);
|
|
145
163
|
let r = JSON.stringify({
|
|
146
|
-
m:
|
|
147
|
-
c:
|
|
148
|
-
z:
|
|
149
|
-
fc:
|
|
150
|
-
fz:
|
|
151
|
-
g:
|
|
164
|
+
m: E.map((e) => [e.lat, e.lng]),
|
|
165
|
+
c: D ? [D.lat, D.lng] : null,
|
|
166
|
+
z: O ?? null,
|
|
167
|
+
fc: k ? [k.lat, k.lng] : null,
|
|
168
|
+
fz: A ?? null,
|
|
169
|
+
g: j ? M.size : 0
|
|
152
170
|
});
|
|
153
|
-
if (r !==
|
|
154
|
-
else if (!
|
|
171
|
+
if (r !== y.current) if (y.current = r, D) e.setView([D.lat, D.lng], O ?? e.getZoom());
|
|
172
|
+
else if (!E.length && n) {
|
|
155
173
|
let t = n.getBounds();
|
|
156
174
|
t.isValid() && e.fitBounds(t, {
|
|
157
175
|
padding: [24, 24],
|
|
158
176
|
maxZoom: 12
|
|
159
177
|
});
|
|
160
|
-
} else if (
|
|
161
|
-
else if (
|
|
162
|
-
let t = s.latLngBounds(
|
|
178
|
+
} else if (E.length === 1) e.setView([E[0].lat, E[0].lng], O ?? 8);
|
|
179
|
+
else if (E.length > 1) {
|
|
180
|
+
let t = s.latLngBounds(E.map((e) => [e.lat, e.lng]));
|
|
163
181
|
e.fitBounds(t, {
|
|
164
182
|
padding: [32, 32],
|
|
165
183
|
maxZoom: 12
|
|
166
184
|
});
|
|
167
|
-
} else
|
|
185
|
+
} else k ? e.setView([k.lat, k.lng], O ?? A ?? e.getZoom()) : m(O ?? A) && e.setZoom(O ?? A);
|
|
168
186
|
let i = window.setTimeout(() => e.invalidateSize(), 0);
|
|
169
187
|
return () => {
|
|
170
188
|
window.clearTimeout(i), t.remove();
|
|
171
189
|
};
|
|
172
190
|
}, [
|
|
173
|
-
C,
|
|
174
|
-
w,
|
|
175
|
-
T,
|
|
176
191
|
E,
|
|
177
192
|
D,
|
|
178
|
-
x,
|
|
179
193
|
O,
|
|
180
194
|
k,
|
|
181
|
-
|
|
195
|
+
A,
|
|
196
|
+
C,
|
|
197
|
+
w,
|
|
198
|
+
j,
|
|
199
|
+
M,
|
|
200
|
+
T
|
|
182
201
|
]), /* @__PURE__ */ o("div", {
|
|
183
202
|
className: "relative h-full w-full overflow-hidden rounded-lg bg-bg-muted",
|
|
184
203
|
children: [
|
|
@@ -186,7 +205,7 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
|
186
205
|
ref: f,
|
|
187
206
|
className: "h-full w-full"
|
|
188
207
|
}),
|
|
189
|
-
|
|
208
|
+
b !== "error" && E.length === 0 && !N && /* @__PURE__ */ a("div", {
|
|
190
209
|
className: "pointer-events-none absolute inset-0 z-[500] flex items-center justify-center bg-bg-muted/70 text-sm text-text-secondary",
|
|
191
210
|
children: /* @__PURE__ */ o("div", {
|
|
192
211
|
className: "text-center",
|
|
@@ -209,7 +228,7 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
|
209
228
|
}), /* @__PURE__ */ a("p", { children: "No map data" })]
|
|
210
229
|
})
|
|
211
230
|
}),
|
|
212
|
-
|
|
231
|
+
b === "error" && /* @__PURE__ */ a("div", {
|
|
213
232
|
className: "absolute inset-0 z-[500] flex items-center justify-center bg-bg-muted px-4 text-center text-sm text-text-secondary",
|
|
214
233
|
children: "The map needs an internet connection and couldn’t load."
|
|
215
234
|
})
|
|
@@ -217,6 +236,6 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
|
|
|
217
236
|
});
|
|
218
237
|
});
|
|
219
238
|
//#endregion
|
|
220
|
-
export {
|
|
239
|
+
export { y as default };
|
|
221
240
|
|
|
222
241
|
//# sourceMappingURL=MapWidget.js.map
|