@modern-admin/react 0.1.0
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/action-guard.d.ts +13 -0
- package/dist/action-guard.d.ts.map +1 -0
- package/dist/action-guard.js +15 -0
- package/dist/action-guard.js.map +1 -0
- package/dist/action-menu.d.ts +17 -0
- package/dist/action-menu.d.ts.map +1 -0
- package/dist/action-menu.jsx +80 -0
- package/dist/action-menu.jsx.map +1 -0
- package/dist/admin-app.d.ts +23 -0
- package/dist/admin-app.d.ts.map +1 -0
- package/dist/admin-app.jsx +407 -0
- package/dist/admin-app.jsx.map +1 -0
- package/dist/admin-router.d.ts +29 -0
- package/dist/admin-router.d.ts.map +1 -0
- package/dist/admin-router.jsx +215 -0
- package/dist/admin-router.jsx.map +1 -0
- package/dist/breadcrumbs.d.ts +17 -0
- package/dist/breadcrumbs.d.ts.map +1 -0
- package/dist/breadcrumbs.jsx +40 -0
- package/dist/breadcrumbs.jsx.map +1 -0
- package/dist/client.d.ts +526 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +582 -0
- package/dist/client.js.map +1 -0
- package/dist/component-loader.d.ts +10 -0
- package/dist/component-loader.d.ts.map +1 -0
- package/dist/component-loader.js +23 -0
- package/dist/component-loader.js.map +1 -0
- package/dist/components/ai-assistant-widget.d.ts +3 -0
- package/dist/components/ai-assistant-widget.d.ts.map +1 -0
- package/dist/components/ai-assistant-widget.jsx +390 -0
- package/dist/components/ai-assistant-widget.jsx.map +1 -0
- package/dist/components/ai-fill-dialog.d.ts +9 -0
- package/dist/components/ai-fill-dialog.d.ts.map +1 -0
- package/dist/components/ai-fill-dialog.jsx +105 -0
- package/dist/components/ai-fill-dialog.jsx.map +1 -0
- package/dist/components/chart-builder-dialog.d.ts +10 -0
- package/dist/components/chart-builder-dialog.d.ts.map +1 -0
- package/dist/components/chart-builder-dialog.jsx +433 -0
- package/dist/components/chart-builder-dialog.jsx.map +1 -0
- package/dist/components/chart-widget.d.ts +12 -0
- package/dist/components/chart-widget.d.ts.map +1 -0
- package/dist/components/chart-widget.jsx +365 -0
- package/dist/components/chart-widget.jsx.map +1 -0
- package/dist/components/global-search-dialog.d.ts +7 -0
- package/dist/components/global-search-dialog.d.ts.map +1 -0
- package/dist/components/global-search-dialog.jsx +187 -0
- package/dist/components/global-search-dialog.jsx.map +1 -0
- package/dist/components/group-settings-dialog.d.ts +13 -0
- package/dist/components/group-settings-dialog.d.ts.map +1 -0
- package/dist/components/group-settings-dialog.jsx +53 -0
- package/dist/components/group-settings-dialog.jsx.map +1 -0
- package/dist/components/move-chart-dialog.d.ts +18 -0
- package/dist/components/move-chart-dialog.d.ts.map +1 -0
- package/dist/components/move-chart-dialog.jsx +68 -0
- package/dist/components/move-chart-dialog.jsx.map +1 -0
- package/dist/components/reference-multi-table-dialog.d.ts +12 -0
- package/dist/components/reference-multi-table-dialog.d.ts.map +1 -0
- package/dist/components/reference-multi-table-dialog.jsx +126 -0
- package/dist/components/reference-multi-table-dialog.jsx.map +1 -0
- package/dist/components/related-records-tabs.d.ts +8 -0
- package/dist/components/related-records-tabs.d.ts.map +1 -0
- package/dist/components/related-records-tabs.jsx +75 -0
- package/dist/components/related-records-tabs.jsx.map +1 -0
- package/dist/components/revisions-button.d.ts +7 -0
- package/dist/components/revisions-button.d.ts.map +1 -0
- package/dist/components/revisions-button.jsx +152 -0
- package/dist/components/revisions-button.jsx.map +1 -0
- package/dist/components/wizard-form.d.ts +43 -0
- package/dist/components/wizard-form.d.ts.map +1 -0
- package/dist/components/wizard-form.jsx +136 -0
- package/dist/components/wizard-form.jsx.map +1 -0
- package/dist/dashboard/time-series.d.ts +20 -0
- package/dist/dashboard/time-series.d.ts.map +1 -0
- package/dist/dashboard/time-series.js +108 -0
- package/dist/dashboard/time-series.js.map +1 -0
- package/dist/dialogs.d.ts +35 -0
- package/dist/dialogs.d.ts.map +1 -0
- package/dist/dialogs.jsx +152 -0
- package/dist/dialogs.jsx.map +1 -0
- package/dist/export.d.ts +39 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +114 -0
- package/dist/export.js.map +1 -0
- package/dist/extension-registry.d.ts +122 -0
- package/dist/extension-registry.d.ts.map +1 -0
- package/dist/extension-registry.js +93 -0
- package/dist/extension-registry.js.map +1 -0
- package/dist/header-controls.d.ts +4 -0
- package/dist/header-controls.d.ts.map +1 -0
- package/dist/header-controls.jsx +70 -0
- package/dist/header-controls.jsx.map +1 -0
- package/dist/hooks.d.ts +104 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +374 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotkey-help.d.ts +3 -0
- package/dist/hotkey-help.d.ts.map +1 -0
- package/dist/hotkey-help.jsx +32 -0
- package/dist/hotkey-help.jsx.map +1 -0
- package/dist/hotkey-registry.d.ts +18 -0
- package/dist/hotkey-registry.d.ts.map +1 -0
- package/dist/hotkey-registry.jsx +34 -0
- package/dist/hotkey-registry.jsx.map +1 -0
- package/dist/i18n.d.ts +74 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.jsx +127 -0
- package/dist/i18n.jsx.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/notify.d.ts +41 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.jsx +58 -0
- package/dist/notify.jsx.map +1 -0
- package/dist/pages/ai-assistant-settings-section.d.ts +3 -0
- package/dist/pages/ai-assistant-settings-section.d.ts.map +1 -0
- package/dist/pages/ai-assistant-settings-section.jsx +126 -0
- package/dist/pages/ai-assistant-settings-section.jsx.map +1 -0
- package/dist/pages/audit-log-page.d.ts +3 -0
- package/dist/pages/audit-log-page.d.ts.map +1 -0
- package/dist/pages/audit-log-page.jsx +354 -0
- package/dist/pages/audit-log-page.jsx.map +1 -0
- package/dist/pages/edit-page.d.ts +7 -0
- package/dist/pages/edit-page.d.ts.map +1 -0
- package/dist/pages/edit-page.jsx +614 -0
- package/dist/pages/edit-page.jsx.map +1 -0
- package/dist/pages/export-dialog.d.ts +11 -0
- package/dist/pages/export-dialog.d.ts.map +1 -0
- package/dist/pages/export-dialog.jsx +102 -0
- package/dist/pages/export-dialog.jsx.map +1 -0
- package/dist/pages/home-page.d.ts +3 -0
- package/dist/pages/home-page.d.ts.map +1 -0
- package/dist/pages/home-page.jsx +211 -0
- package/dist/pages/home-page.jsx.map +1 -0
- package/dist/pages/list-page.d.ts +42 -0
- package/dist/pages/list-page.d.ts.map +1 -0
- package/dist/pages/list-page.jsx +1596 -0
- package/dist/pages/list-page.jsx.map +1 -0
- package/dist/pages/login-page.d.ts +11 -0
- package/dist/pages/login-page.d.ts.map +1 -0
- package/dist/pages/login-page.jsx +157 -0
- package/dist/pages/login-page.jsx.map +1 -0
- package/dist/pages/settings-page.d.ts +5 -0
- package/dist/pages/settings-page.d.ts.map +1 -0
- package/dist/pages/settings-page.jsx +787 -0
- package/dist/pages/settings-page.jsx.map +1 -0
- package/dist/pages/settings-shared.d.ts +51 -0
- package/dist/pages/settings-shared.d.ts.map +1 -0
- package/dist/pages/settings-shared.jsx +66 -0
- package/dist/pages/settings-shared.jsx.map +1 -0
- package/dist/pages/show-page.d.ts +7 -0
- package/dist/pages/show-page.d.ts.map +1 -0
- package/dist/pages/show-page.jsx +147 -0
- package/dist/pages/show-page.jsx.map +1 -0
- package/dist/pages/wizard-create-page.d.ts +14 -0
- package/dist/pages/wizard-create-page.d.ts.map +1 -0
- package/dist/pages/wizard-create-page.jsx +106 -0
- package/dist/pages/wizard-create-page.jsx.map +1 -0
- package/dist/property-renderer.d.ts +8 -0
- package/dist/property-renderer.d.ts.map +1 -0
- package/dist/property-renderer.jsx +690 -0
- package/dist/property-renderer.jsx.map +1 -0
- package/dist/provider.d.ts +20 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.jsx +32 -0
- package/dist/provider.jsx.map +1 -0
- package/dist/realtime.d.ts +22 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +38 -0
- package/dist/realtime.js.map +1 -0
- package/dist/reference.d.ts +52 -0
- package/dist/reference.d.ts.map +1 -0
- package/dist/reference.jsx +224 -0
- package/dist/reference.jsx.map +1 -0
- package/dist/relations.d.ts +11 -0
- package/dist/relations.d.ts.map +1 -0
- package/dist/relations.js +36 -0
- package/dist/relations.js.map +1 -0
- package/dist/router.d.ts +82 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.jsx +187 -0
- package/dist/router.jsx.map +1 -0
- package/dist/show-when.d.ts +7 -0
- package/dist/show-when.d.ts.map +1 -0
- package/dist/show-when.js +77 -0
- package/dist/show-when.js.map +1 -0
- package/dist/types.d.ts +194 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/use-dashboard-charts.d.ts +93 -0
- package/dist/use-dashboard-charts.d.ts.map +1 -0
- package/dist/use-dashboard-charts.js +263 -0
- package/dist/use-dashboard-charts.js.map +1 -0
- package/dist/use-hotkey.d.ts +17 -0
- package/dist/use-hotkey.d.ts.map +1 -0
- package/dist/use-hotkey.js +103 -0
- package/dist/use-hotkey.js.map +1 -0
- package/dist/user-directory.d.ts +18 -0
- package/dist/user-directory.d.ts.map +1 -0
- package/dist/user-directory.js +51 -0
- package/dist/user-directory.js.map +1 -0
- package/dist/validation.d.ts +22 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +338 -0
- package/dist/validation.js.map +1 -0
- package/package.json +59 -0
- package/src/action-guard.ts +20 -0
- package/src/action-menu.tsx +161 -0
- package/src/admin-app.tsx +630 -0
- package/src/admin-router.tsx +273 -0
- package/src/breadcrumbs.tsx +75 -0
- package/src/client.ts +1093 -0
- package/src/component-loader.ts +33 -0
- package/src/components/ai-assistant-widget.tsx +565 -0
- package/src/components/ai-fill-dialog.tsx +143 -0
- package/src/components/chart-builder-dialog.tsx +618 -0
- package/src/components/chart-widget.tsx +654 -0
- package/src/components/global-search-dialog.tsx +272 -0
- package/src/components/group-settings-dialog.tsx +93 -0
- package/src/components/move-chart-dialog.tsx +130 -0
- package/src/components/reference-multi-table-dialog.tsx +196 -0
- package/src/components/related-records-tabs.tsx +130 -0
- package/src/components/revisions-button.tsx +237 -0
- package/src/components/wizard-form.tsx +302 -0
- package/src/dashboard/time-series.ts +125 -0
- package/src/dialogs.tsx +265 -0
- package/src/export.ts +140 -0
- package/src/extension-registry.ts +195 -0
- package/src/header-controls.tsx +125 -0
- package/src/hooks.ts +509 -0
- package/src/hotkey-help.tsx +56 -0
- package/src/hotkey-registry.tsx +60 -0
- package/src/i18n.tsx +267 -0
- package/src/index.ts +192 -0
- package/src/notify.tsx +94 -0
- package/src/pages/ai-assistant-settings-section.tsx +167 -0
- package/src/pages/audit-log-page.tsx +580 -0
- package/src/pages/edit-page.tsx +743 -0
- package/src/pages/export-dialog.tsx +154 -0
- package/src/pages/home-page.tsx +318 -0
- package/src/pages/list-page.tsx +2645 -0
- package/src/pages/login-page.tsx +242 -0
- package/src/pages/settings-page.tsx +1143 -0
- package/src/pages/settings-shared.tsx +134 -0
- package/src/pages/show-page.tsx +223 -0
- package/src/pages/wizard-create-page.tsx +164 -0
- package/src/property-renderer.tsx +1143 -0
- package/src/provider.tsx +70 -0
- package/src/realtime.ts +55 -0
- package/src/reference.tsx +386 -0
- package/src/relations.ts +55 -0
- package/src/router.tsx +211 -0
- package/src/show-when.ts +76 -0
- package/src/types.ts +198 -0
- package/src/use-dashboard-charts.ts +362 -0
- package/src/use-hotkey.ts +128 -0
- package/src/user-directory.ts +56 -0
- package/src/validation.ts +361 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
// Phase 10: time-series-first chart builder.
|
|
2
|
+
//
|
|
3
|
+
// X-axis is ALWAYS a date — the user picks `dateField` (required). `groupBy`
|
|
4
|
+
// becomes an optional *secondary* breakdown that produces multiple series
|
|
5
|
+
// (Metabase-style: pick "status" → one line per status value). Pie removed.
|
|
6
|
+
// `width` lets the chart take half or full row on the dashboard grid.
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import { BarChart2, LineChart, AreaChart, Activity, } from 'lucide-react';
|
|
9
|
+
import { Button, Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, InfoTooltip, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Switch, } from '@modern-admin/ui';
|
|
10
|
+
import { chartDefZ, uuidv7, } from '@modern-admin/core';
|
|
11
|
+
import { useI18n } from '../i18n.js';
|
|
12
|
+
import { useResources } from '../hooks.js';
|
|
13
|
+
import { ReferenceCombobox } from '../reference.js';
|
|
14
|
+
const VIS_OPTIONS = [
|
|
15
|
+
{ value: 'kpi', icon: <Activity className="size-4"/>, labelKey: 'dashboard:visKpi' },
|
|
16
|
+
{ value: 'line', icon: <LineChart className="size-4"/>, labelKey: 'dashboard:visLine' },
|
|
17
|
+
{ value: 'area', icon: <AreaChart className="size-4"/>, labelKey: 'dashboard:visArea' },
|
|
18
|
+
{ value: 'bar', icon: <BarChart2 className="size-4"/>, labelKey: 'dashboard:visBar' },
|
|
19
|
+
];
|
|
20
|
+
const NONE = '__none__';
|
|
21
|
+
const METRICS = ['count', 'sum', 'avg', 'min', 'max'];
|
|
22
|
+
// `custom` is intentionally excluded from the builder — the builder sets a
|
|
23
|
+
// default interval; ad-hoc custom ranges are picked on the widget toolbar.
|
|
24
|
+
const PRESETS = ['7d', '30d', '90d', '1y', 'all'];
|
|
25
|
+
/** Date-ish heuristic for the dateField selector when adapter metadata is sparse. */
|
|
26
|
+
function isDateProperty(p) {
|
|
27
|
+
if (p.type === 'date' || p.type === 'datetime')
|
|
28
|
+
return true;
|
|
29
|
+
const lower = p.path.toLowerCase();
|
|
30
|
+
return lower.endsWith('at') || lower.endsWith('_at') || lower.endsWith('date');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Properties that make sense as a `groupBy` axis: anything that resolves to
|
|
34
|
+
* a discrete column value the adapter can group on. Virtual relation columns
|
|
35
|
+
* (`type: 'reference'` with `isArray: false` and no FK suffix) carry full
|
|
36
|
+
* record objects in their values and would serialise to `[object Object]` —
|
|
37
|
+
* exclude them so the user picks the underlying FK column instead.
|
|
38
|
+
*/
|
|
39
|
+
function isGroupable(p) {
|
|
40
|
+
if (isDateProperty(p))
|
|
41
|
+
return false;
|
|
42
|
+
if (p.type === 'reference' && !p.isArray) {
|
|
43
|
+
// Allow scalar FK columns (named `*Id`/`*_id` with type 'reference' set
|
|
44
|
+
// via adapter override) — they group cleanly to id strings. Reject virtual
|
|
45
|
+
// relation fields whose values are objects.
|
|
46
|
+
const path = p.path;
|
|
47
|
+
return path.endsWith('Id') || path.endsWith('_id');
|
|
48
|
+
}
|
|
49
|
+
if (p.type === 'json' || p.type === 'mixed')
|
|
50
|
+
return false;
|
|
51
|
+
if (p.type === 'richtext' || p.type === 'markdown' || p.type === 'textarea')
|
|
52
|
+
return false;
|
|
53
|
+
if (p.type === 'previewMedia' || p.type === 'file')
|
|
54
|
+
return false;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
export function ChartBuilderDialog({ initial, onSave, onClose, }) {
|
|
58
|
+
const { t } = useI18n();
|
|
59
|
+
const resources = useResources();
|
|
60
|
+
const [title, setTitle] = React.useState(initial?.title ?? '');
|
|
61
|
+
const [visualisation, setVisualisation] = React.useState(initial?.visualisation ?? 'area');
|
|
62
|
+
const [resourceId, setResourceId] = React.useState(initial?.resource ?? resources[0]?.id ?? '');
|
|
63
|
+
const [dateField, setDateField] = React.useState(initial?.dateField ?? '');
|
|
64
|
+
const [metric, setMetric] = React.useState(initial?.metric ?? 'count');
|
|
65
|
+
const [field, setField] = React.useState(initial?.field ?? '');
|
|
66
|
+
const [groupBy, setGroupBy] = React.useState(initial?.groupBy ?? '');
|
|
67
|
+
const [groupByLabelResource, setGroupByLabelResource] = React.useState(initial?.groupByLabelResource ?? '');
|
|
68
|
+
const [topN, setTopN] = React.useState(initial?.topN ?? 10);
|
|
69
|
+
// The builder only sets a default time-range preset; custom ranges are
|
|
70
|
+
// picked on the widget toolbar. If the saved chart is on 'custom', fall
|
|
71
|
+
// back to the most useful preset for the builder UI.
|
|
72
|
+
const [preset, setPreset] = React.useState(initial && initial.timeRange.preset !== 'custom' ? initial.timeRange.preset : '30d');
|
|
73
|
+
const [filters, setFilters] = React.useState(initial?.filters ?? {});
|
|
74
|
+
const [quickFilters, setQuickFilters] = React.useState(initial?.quickFilters ?? []);
|
|
75
|
+
const [order, setOrder] = React.useState(initial?.order ?? 0);
|
|
76
|
+
const [errors, setErrors] = React.useState({});
|
|
77
|
+
const resource = resources.find((r) => r.id === resourceId);
|
|
78
|
+
const properties = resource?.properties ?? [];
|
|
79
|
+
const dateProps = properties.filter(isDateProperty);
|
|
80
|
+
const numericProps = properties.filter((p) => p.type === 'number' || p.type === 'float' || p.type === 'currency');
|
|
81
|
+
// Auto-select dateField when resource changes (skip the very first
|
|
82
|
+
// render of edit-mode so we keep the saved value).
|
|
83
|
+
React.useEffect(() => {
|
|
84
|
+
if (initial?.resource === resourceId)
|
|
85
|
+
return;
|
|
86
|
+
setDateField(dateProps[0]?.path ?? '');
|
|
87
|
+
setField('');
|
|
88
|
+
setGroupBy('');
|
|
89
|
+
setGroupByLabelResource('');
|
|
90
|
+
setFilters({});
|
|
91
|
+
setQuickFilters([]);
|
|
92
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
93
|
+
}, [resourceId]);
|
|
94
|
+
// When opening an existing chart that predates the groupByLabelResource
|
|
95
|
+
// feature (groupByLabelResource is empty but groupBy is set): auto-derive
|
|
96
|
+
// the label resource so the user gets resolved labels without re-saving.
|
|
97
|
+
React.useEffect(() => {
|
|
98
|
+
if (groupByLabelResource || !groupBy || properties.length === 0)
|
|
99
|
+
return;
|
|
100
|
+
setGroupByLabelResource(resolveGroupByLabelResource(groupBy, properties));
|
|
101
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
102
|
+
}, [groupBy, properties]);
|
|
103
|
+
const isKpi = visualisation === 'kpi';
|
|
104
|
+
const buildTimeRange = () => ({ preset });
|
|
105
|
+
const handleFilterChange = (path, value) => {
|
|
106
|
+
setFilters((prev) => {
|
|
107
|
+
const next = { ...prev };
|
|
108
|
+
if (value === '')
|
|
109
|
+
delete next[path];
|
|
110
|
+
else
|
|
111
|
+
next[path] = value;
|
|
112
|
+
return next;
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
const toggleQuickFilter = (path) => {
|
|
116
|
+
setQuickFilters((prev) => prev.includes(path) ? prev.filter((p) => p !== path) : [...prev, path]);
|
|
117
|
+
};
|
|
118
|
+
const handleSave = () => {
|
|
119
|
+
const now = new Date().toISOString();
|
|
120
|
+
// step is not user-editable in the builder; keep the previous value (or
|
|
121
|
+
// pick a sane default) so chartDefZ stays valid. The widget toolbar
|
|
122
|
+
// remains the place to tweak step on the fly.
|
|
123
|
+
const savedStep = isKpi
|
|
124
|
+
? 'all'
|
|
125
|
+
: initial && initial.step !== 'all'
|
|
126
|
+
? initial.step
|
|
127
|
+
: 'day';
|
|
128
|
+
const candidate = {
|
|
129
|
+
id: initial?.id ?? uuidv7(),
|
|
130
|
+
title: title.trim() || resource?.name || resourceId,
|
|
131
|
+
resource: resourceId,
|
|
132
|
+
visualisation,
|
|
133
|
+
dateField,
|
|
134
|
+
step: savedStep,
|
|
135
|
+
metric,
|
|
136
|
+
width: initial?.width ?? 'half',
|
|
137
|
+
topN,
|
|
138
|
+
filters,
|
|
139
|
+
quickFilters: quickFilters.filter((p) => properties.some((q) => q.path === p)),
|
|
140
|
+
timeRange: buildTimeRange(),
|
|
141
|
+
order,
|
|
142
|
+
// Preserve groupId on edit — the builder does not (yet) change group
|
|
143
|
+
// membership directly; groups are managed from the dashboard tab strip.
|
|
144
|
+
...(initial?.groupId ? { groupId: initial.groupId } : {}),
|
|
145
|
+
createdAt: initial?.createdAt ?? now,
|
|
146
|
+
updatedAt: now,
|
|
147
|
+
...(metric !== 'count' && field ? { field } : {}),
|
|
148
|
+
...(!isKpi && groupBy ? { groupBy } : {}),
|
|
149
|
+
...(!isKpi && groupBy && groupByLabelResource ? { groupByLabelResource } : {}),
|
|
150
|
+
};
|
|
151
|
+
const result = chartDefZ.safeParse(candidate);
|
|
152
|
+
if (!result.success) {
|
|
153
|
+
const fieldErrs = {};
|
|
154
|
+
for (const issue of result.error.issues) {
|
|
155
|
+
const key = issue.path[0];
|
|
156
|
+
if (typeof key === 'string' && !fieldErrs[key])
|
|
157
|
+
fieldErrs[key] = issue.message;
|
|
158
|
+
}
|
|
159
|
+
setErrors(fieldErrs);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
setErrors({});
|
|
163
|
+
onSave(candidate);
|
|
164
|
+
};
|
|
165
|
+
return (<Dialog open onOpenChange={(open) => { if (!open)
|
|
166
|
+
onClose(); }}>
|
|
167
|
+
<DialogContent className="w-full max-w-2xl max-h-[90vh] overflow-y-auto">
|
|
168
|
+
<DialogHeader>
|
|
169
|
+
<DialogTitle>
|
|
170
|
+
{initial ? t('chart:editChart') : t('chart:newChart')}
|
|
171
|
+
</DialogTitle>
|
|
172
|
+
</DialogHeader>
|
|
173
|
+
|
|
174
|
+
<div className="space-y-4 py-1">
|
|
175
|
+
{/* Title + order */}
|
|
176
|
+
<div className="grid grid-cols-1 gap-3 sm:grid-cols-[1fr_8rem]">
|
|
177
|
+
<div className="space-y-1.5">
|
|
178
|
+
<Label htmlFor="chart-title">{t('chart:title')}</Label>
|
|
179
|
+
<Input id="chart-title" placeholder={t('chart:titlePlaceholder')} value={title} onChange={(e) => setTitle(e.target.value)}/>
|
|
180
|
+
</div>
|
|
181
|
+
<div className="space-y-1.5">
|
|
182
|
+
<div className="flex items-center gap-1.5">
|
|
183
|
+
<Label htmlFor="chart-order">{t('chart:order')}</Label>
|
|
184
|
+
<InfoTooltip content={t('chart:orderHint')}/>
|
|
185
|
+
</div>
|
|
186
|
+
<Input id="chart-order" type="number" step={1} value={order} onChange={(e) => setOrder(Number.isFinite(Number(e.target.value)) ? Math.trunc(Number(e.target.value)) : 0)}/>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
{/* Visualisation (incl. KPI) */}
|
|
191
|
+
<div className="space-y-1.5">
|
|
192
|
+
<Label>{t('dashboard:vis')}</Label>
|
|
193
|
+
<div className="flex flex-wrap gap-2">
|
|
194
|
+
{VIS_OPTIONS.map(({ value, icon, labelKey }) => (<Button key={value} type="button" variant={visualisation === value ? 'default' : 'outline'} size="sm" className="flex-1 min-w-[5rem] gap-1.5 capitalize" onClick={() => setVisualisation(value)}>
|
|
195
|
+
{icon}
|
|
196
|
+
<span className="hidden sm:inline">{t(labelKey)}</span>
|
|
197
|
+
</Button>))}
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
{/* Resource */}
|
|
202
|
+
<div className="space-y-1.5">
|
|
203
|
+
<Label htmlFor="chart-resource">{t('chart:resource')}</Label>
|
|
204
|
+
<Select value={resourceId} onValueChange={(v) => setResourceId(v)}>
|
|
205
|
+
<SelectTrigger id="chart-resource">
|
|
206
|
+
<SelectValue />
|
|
207
|
+
</SelectTrigger>
|
|
208
|
+
<SelectContent>
|
|
209
|
+
{resources.map((r) => (<SelectItem key={r.id} value={r.id}>
|
|
210
|
+
{r.name}
|
|
211
|
+
{r.name !== r.id && (<span className="ml-1.5 text-xs text-muted-foreground">({r.id})</span>)}
|
|
212
|
+
</SelectItem>))}
|
|
213
|
+
</SelectContent>
|
|
214
|
+
</Select>
|
|
215
|
+
{errors.resource && (<p className="text-xs text-destructive">{errors.resource}</p>)}
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
{/* Date field — required, drives the X-axis bucketing */}
|
|
219
|
+
<div className="space-y-1.5">
|
|
220
|
+
<Label htmlFor="chart-datefield">{t('dashboard:builder.dateField')}</Label>
|
|
221
|
+
<Select value={dateField || NONE} onValueChange={(v) => setDateField(v === NONE ? '' : v)}>
|
|
222
|
+
<SelectTrigger id="chart-datefield">
|
|
223
|
+
<SelectValue placeholder={t('chart:selectField')}/>
|
|
224
|
+
</SelectTrigger>
|
|
225
|
+
<SelectContent>
|
|
226
|
+
<SelectItem value={NONE}>{t('chart:selectField')}</SelectItem>
|
|
227
|
+
{(dateProps.length > 0 ? dateProps : properties).map((p) => (<SelectItem key={p.path} value={p.path}>{p.label}</SelectItem>))}
|
|
228
|
+
</SelectContent>
|
|
229
|
+
</Select>
|
|
230
|
+
<p className="text-xs text-muted-foreground">
|
|
231
|
+
{t('dashboard:builder.dateFieldHint')}
|
|
232
|
+
</p>
|
|
233
|
+
{errors.dateField && (<p className="text-xs text-destructive">{errors.dateField}</p>)}
|
|
234
|
+
</div>
|
|
235
|
+
|
|
236
|
+
{/* Metric + field */}
|
|
237
|
+
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
238
|
+
<div className="space-y-1.5">
|
|
239
|
+
<Label htmlFor="chart-metric">{t('chart:metric')}</Label>
|
|
240
|
+
<Select value={metric} onValueChange={(v) => setMetric(v)}>
|
|
241
|
+
<SelectTrigger id="chart-metric">
|
|
242
|
+
<SelectValue />
|
|
243
|
+
</SelectTrigger>
|
|
244
|
+
<SelectContent>
|
|
245
|
+
{METRICS.map((m) => (<SelectItem key={m} value={m}>{t(`dashboard:metric${cap(m)}`)}</SelectItem>))}
|
|
246
|
+
</SelectContent>
|
|
247
|
+
</Select>
|
|
248
|
+
</div>
|
|
249
|
+
|
|
250
|
+
{metric !== 'count' && (<div className="space-y-1.5">
|
|
251
|
+
<Label htmlFor="chart-field">{t('chart:aggregateField')}</Label>
|
|
252
|
+
<Select value={field || NONE} onValueChange={(v) => setField(v === NONE ? '' : v)}>
|
|
253
|
+
<SelectTrigger id="chart-field">
|
|
254
|
+
<SelectValue placeholder={t('chart:selectField')}/>
|
|
255
|
+
</SelectTrigger>
|
|
256
|
+
<SelectContent>
|
|
257
|
+
<SelectItem value={NONE}>{t('chart:selectField')}</SelectItem>
|
|
258
|
+
{numericProps.map((p) => (<SelectItem key={p.path} value={p.path}>{p.label}</SelectItem>))}
|
|
259
|
+
</SelectContent>
|
|
260
|
+
</Select>
|
|
261
|
+
{errors.field && (<p className="text-xs text-destructive">{errors.field}</p>)}
|
|
262
|
+
</div>)}
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
{/* Secondary groupBy + topN — non-KPI only */}
|
|
266
|
+
{!isKpi && (<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
267
|
+
<div className="space-y-1.5">
|
|
268
|
+
<Label htmlFor="chart-groupby">
|
|
269
|
+
{t('dashboard:builder.secondaryGroupBy')}
|
|
270
|
+
</Label>
|
|
271
|
+
<Select value={groupBy || NONE} onValueChange={(v) => {
|
|
272
|
+
const path = v === NONE ? '' : v;
|
|
273
|
+
setGroupBy(path);
|
|
274
|
+
setGroupByLabelResource(resolveGroupByLabelResource(path, properties));
|
|
275
|
+
}}>
|
|
276
|
+
<SelectTrigger id="chart-groupby">
|
|
277
|
+
<SelectValue />
|
|
278
|
+
</SelectTrigger>
|
|
279
|
+
<SelectContent>
|
|
280
|
+
<SelectItem value={NONE}>{t('dashboard:builder.noBreakdown')}</SelectItem>
|
|
281
|
+
{properties
|
|
282
|
+
.filter((p) => isGroupable(p) && p.path !== dateField)
|
|
283
|
+
.map((p) => (<SelectItem key={p.path} value={p.path}>{p.label}</SelectItem>))}
|
|
284
|
+
</SelectContent>
|
|
285
|
+
</Select>
|
|
286
|
+
</div>
|
|
287
|
+
|
|
288
|
+
{groupBy && (<div className="space-y-1.5">
|
|
289
|
+
<Label htmlFor="chart-topn">{t('dashboard:builder.topN')}</Label>
|
|
290
|
+
<Input id="chart-topn" type="number" min={1} max={50} value={topN} onChange={(e) => setTopN(Math.max(1, Math.min(50, Number(e.target.value) || 10)))}/>
|
|
291
|
+
</div>)}
|
|
292
|
+
</div>)}
|
|
293
|
+
|
|
294
|
+
{/* Default time-range preset. Custom ranges are picked on the
|
|
295
|
+
widget toolbar — not in the builder. */}
|
|
296
|
+
<div className="space-y-1.5">
|
|
297
|
+
<Label>{t('dashboard:builder.range')}</Label>
|
|
298
|
+
<div className="flex flex-wrap gap-2">
|
|
299
|
+
{PRESETS.map((p) => (<Button key={p} type="button" variant={preset === p ? 'default' : 'outline'} size="sm" className="flex-1 min-w-[4rem]" onClick={() => setPreset(p)}>
|
|
300
|
+
{t(`dashboard:range.${p}`)}
|
|
301
|
+
</Button>))}
|
|
302
|
+
</div>
|
|
303
|
+
</div>
|
|
304
|
+
|
|
305
|
+
{/* Filters — one row per property, with a checkbox to mark the
|
|
306
|
+
filter as a "quick filter" (exposed above the chart for inline
|
|
307
|
+
tweaking on the dashboard). Reference fields use a combobox. */}
|
|
308
|
+
{properties.length > 0 && (<div className="space-y-1.5">
|
|
309
|
+
<Label>{t('dashboard:builder.filters')}</Label>
|
|
310
|
+
<p className="text-xs text-muted-foreground">
|
|
311
|
+
{t('dashboard:builder.filtersHint')}
|
|
312
|
+
</p>
|
|
313
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-3">
|
|
314
|
+
{properties.filter(isFilterable).map((p) => {
|
|
315
|
+
const exposed = quickFilters.includes(p.path);
|
|
316
|
+
return (<div key={p.path} className="space-y-1">
|
|
317
|
+
<div className="flex items-center justify-between gap-2">
|
|
318
|
+
<Label htmlFor={`flt-${p.path}`} className="text-xs text-muted-foreground">
|
|
319
|
+
{p.label}
|
|
320
|
+
</Label>
|
|
321
|
+
<Switch checked={exposed} onCheckedChange={() => toggleQuickFilter(p.path)} aria-label={t('dashboard:builder.quickFilterToggle').replace('{field}', p.label)} title={t('dashboard:builder.quickFilterHint')}/>
|
|
322
|
+
</div>
|
|
323
|
+
<FilterInput property={p} value={filters[p.path] ?? ''} onChange={(v) => handleFilterChange(p.path, v)}/>
|
|
324
|
+
</div>);
|
|
325
|
+
})}
|
|
326
|
+
</div>
|
|
327
|
+
</div>)}
|
|
328
|
+
</div>
|
|
329
|
+
|
|
330
|
+
<DialogFooter>
|
|
331
|
+
<Button variant="outline" onClick={onClose}>{t('common:cancel')}</Button>
|
|
332
|
+
<Button onClick={handleSave} disabled={!resourceId || !dateField}>
|
|
333
|
+
{t('chart:saveChart')}
|
|
334
|
+
</Button>
|
|
335
|
+
</DialogFooter>
|
|
336
|
+
</DialogContent>
|
|
337
|
+
</Dialog>);
|
|
338
|
+
}
|
|
339
|
+
const cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
340
|
+
/**
|
|
341
|
+
* Property is exposable as a filter. Excludes ids, array fields, free-form
|
|
342
|
+
* blobs (json/mixed/richtext), media fields, and virtual relation columns
|
|
343
|
+
* (we keep the underlying FK column so we don't list `authorId` and `author`
|
|
344
|
+
* twice).
|
|
345
|
+
*/
|
|
346
|
+
function isFilterable(p) {
|
|
347
|
+
if (p.isId)
|
|
348
|
+
return false;
|
|
349
|
+
if (p.isArray)
|
|
350
|
+
return false;
|
|
351
|
+
if (p.type === 'json' || p.type === 'mixed')
|
|
352
|
+
return false;
|
|
353
|
+
if (p.type === 'richtext' || p.type === 'markdown' || p.type === 'textarea')
|
|
354
|
+
return false;
|
|
355
|
+
if (p.type === 'previewMedia' || p.type === 'file')
|
|
356
|
+
return false;
|
|
357
|
+
// Drop virtual relation columns (full objects) — keep FK siblings instead.
|
|
358
|
+
if (p.type === 'reference' && !p.isArray) {
|
|
359
|
+
const path = p.path;
|
|
360
|
+
if (!(path.endsWith('Id') || path.endsWith('_id')))
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Renders an inline input for one filter row in the builder. Reference
|
|
367
|
+
* properties get the same combobox the resource forms use; enums/booleans
|
|
368
|
+
* get a Select; numerics get a number input; everything else falls back to
|
|
369
|
+
* a plain text input.
|
|
370
|
+
*/
|
|
371
|
+
function FilterInput({ property, value, onChange, }) {
|
|
372
|
+
if (property.reference) {
|
|
373
|
+
return (<ReferenceCombobox referenceResourceId={property.reference} value={value || null} onChange={(next) => onChange(next == null ? '' : String(next))}/>);
|
|
374
|
+
}
|
|
375
|
+
if (property.availableValues && property.availableValues.length > 0) {
|
|
376
|
+
return (<Select value={value || NONE} onValueChange={(v) => onChange(v === NONE ? '' : v)}>
|
|
377
|
+
<SelectTrigger id={`flt-${property.path}`}>
|
|
378
|
+
<SelectValue />
|
|
379
|
+
</SelectTrigger>
|
|
380
|
+
<SelectContent>
|
|
381
|
+
<SelectItem value={NONE}>—</SelectItem>
|
|
382
|
+
{property.availableValues.map((opt) => (<SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>))}
|
|
383
|
+
</SelectContent>
|
|
384
|
+
</Select>);
|
|
385
|
+
}
|
|
386
|
+
if (property.type === 'boolean') {
|
|
387
|
+
return (<Select value={value || NONE} onValueChange={(v) => onChange(v === NONE ? '' : v)}>
|
|
388
|
+
<SelectTrigger id={`flt-${property.path}`}>
|
|
389
|
+
<SelectValue />
|
|
390
|
+
</SelectTrigger>
|
|
391
|
+
<SelectContent>
|
|
392
|
+
<SelectItem value={NONE}>—</SelectItem>
|
|
393
|
+
<SelectItem value="true">true</SelectItem>
|
|
394
|
+
<SelectItem value="false">false</SelectItem>
|
|
395
|
+
</SelectContent>
|
|
396
|
+
</Select>);
|
|
397
|
+
}
|
|
398
|
+
const isNumeric = property.type === 'number' || property.type === 'float' || property.type === 'currency';
|
|
399
|
+
return (<Input id={`flt-${property.path}`} type={isNumeric ? 'number' : 'text'} value={value} onChange={(e) => onChange(e.target.value)}/>);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Resolve which resource to use for groupBy label resolution.
|
|
403
|
+
*
|
|
404
|
+
* 1. If the property itself is `type: 'reference'` (virtual relation field),
|
|
405
|
+
* use its `reference` resource id directly — same mechanism as the record
|
|
406
|
+
* title display in resource forms.
|
|
407
|
+
* 2. If it is a raw FK column (e.g. `authorId`), look for a sibling property
|
|
408
|
+
* whose path is the FK name without the trailing `Id`/`_id` suffix AND
|
|
409
|
+
* has `reference` set. Covers the Prisma/Drizzle naming convention.
|
|
410
|
+
*/
|
|
411
|
+
function resolveGroupByLabelResource(path, properties) {
|
|
412
|
+
if (!path)
|
|
413
|
+
return '';
|
|
414
|
+
const prop = properties.find((p) => p.path === path);
|
|
415
|
+
if (!prop)
|
|
416
|
+
return '';
|
|
417
|
+
// Direct reference property (virtual relation).
|
|
418
|
+
if (prop.reference)
|
|
419
|
+
return prop.reference;
|
|
420
|
+
// FK column heuristic: strip Id / _id suffix and look for sibling.
|
|
421
|
+
const base = prop.path.endsWith('_id')
|
|
422
|
+
? prop.path.slice(0, -3)
|
|
423
|
+
: prop.path.endsWith('Id')
|
|
424
|
+
? prop.path.slice(0, -2)
|
|
425
|
+
: '';
|
|
426
|
+
if (base) {
|
|
427
|
+
const sibling = properties.find((p) => p.path === base && p.reference);
|
|
428
|
+
if (sibling?.reference)
|
|
429
|
+
return sibling.reference;
|
|
430
|
+
}
|
|
431
|
+
return '';
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=chart-builder-dialog.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-builder-dialog.jsx","sourceRoot":"","sources":["../../src/components/chart-builder-dialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ChartDef, ChartDefInput } from '@modern-admin/core';
|
|
3
|
+
export interface ChartWidgetProps {
|
|
4
|
+
config: ChartDef;
|
|
5
|
+
onEdit(): void;
|
|
6
|
+
onDelete(): void;
|
|
7
|
+
onMove?(): void;
|
|
8
|
+
/** Called when the user tweaks step / range / width directly on the widget. */
|
|
9
|
+
onUpdate(input: ChartDefInput): void;
|
|
10
|
+
}
|
|
11
|
+
export declare function ChartWidget({ config, onEdit, onDelete, onMove, onUpdate, }: ChartWidgetProps): React.ReactElement;
|
|
12
|
+
//# sourceMappingURL=chart-widget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-widget.d.ts","sourceRoot":"","sources":["../../src/components/chart-widget.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqC9B,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EAKd,MAAM,oBAAoB,CAAA;AAc3B,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,IAAI,IAAI,CAAA;IACd,QAAQ,IAAI,IAAI,CAAA;IAChB,MAAM,CAAC,IAAI,IAAI,CAAA;IACf,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;CACrC;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CA+ZvC"}
|