@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.
Files changed (261) hide show
  1. package/dist/action-guard.d.ts +13 -0
  2. package/dist/action-guard.d.ts.map +1 -0
  3. package/dist/action-guard.js +15 -0
  4. package/dist/action-guard.js.map +1 -0
  5. package/dist/action-menu.d.ts +17 -0
  6. package/dist/action-menu.d.ts.map +1 -0
  7. package/dist/action-menu.jsx +80 -0
  8. package/dist/action-menu.jsx.map +1 -0
  9. package/dist/admin-app.d.ts +23 -0
  10. package/dist/admin-app.d.ts.map +1 -0
  11. package/dist/admin-app.jsx +407 -0
  12. package/dist/admin-app.jsx.map +1 -0
  13. package/dist/admin-router.d.ts +29 -0
  14. package/dist/admin-router.d.ts.map +1 -0
  15. package/dist/admin-router.jsx +215 -0
  16. package/dist/admin-router.jsx.map +1 -0
  17. package/dist/breadcrumbs.d.ts +17 -0
  18. package/dist/breadcrumbs.d.ts.map +1 -0
  19. package/dist/breadcrumbs.jsx +40 -0
  20. package/dist/breadcrumbs.jsx.map +1 -0
  21. package/dist/client.d.ts +526 -0
  22. package/dist/client.d.ts.map +1 -0
  23. package/dist/client.js +582 -0
  24. package/dist/client.js.map +1 -0
  25. package/dist/component-loader.d.ts +10 -0
  26. package/dist/component-loader.d.ts.map +1 -0
  27. package/dist/component-loader.js +23 -0
  28. package/dist/component-loader.js.map +1 -0
  29. package/dist/components/ai-assistant-widget.d.ts +3 -0
  30. package/dist/components/ai-assistant-widget.d.ts.map +1 -0
  31. package/dist/components/ai-assistant-widget.jsx +390 -0
  32. package/dist/components/ai-assistant-widget.jsx.map +1 -0
  33. package/dist/components/ai-fill-dialog.d.ts +9 -0
  34. package/dist/components/ai-fill-dialog.d.ts.map +1 -0
  35. package/dist/components/ai-fill-dialog.jsx +105 -0
  36. package/dist/components/ai-fill-dialog.jsx.map +1 -0
  37. package/dist/components/chart-builder-dialog.d.ts +10 -0
  38. package/dist/components/chart-builder-dialog.d.ts.map +1 -0
  39. package/dist/components/chart-builder-dialog.jsx +433 -0
  40. package/dist/components/chart-builder-dialog.jsx.map +1 -0
  41. package/dist/components/chart-widget.d.ts +12 -0
  42. package/dist/components/chart-widget.d.ts.map +1 -0
  43. package/dist/components/chart-widget.jsx +365 -0
  44. package/dist/components/chart-widget.jsx.map +1 -0
  45. package/dist/components/global-search-dialog.d.ts +7 -0
  46. package/dist/components/global-search-dialog.d.ts.map +1 -0
  47. package/dist/components/global-search-dialog.jsx +187 -0
  48. package/dist/components/global-search-dialog.jsx.map +1 -0
  49. package/dist/components/group-settings-dialog.d.ts +13 -0
  50. package/dist/components/group-settings-dialog.d.ts.map +1 -0
  51. package/dist/components/group-settings-dialog.jsx +53 -0
  52. package/dist/components/group-settings-dialog.jsx.map +1 -0
  53. package/dist/components/move-chart-dialog.d.ts +18 -0
  54. package/dist/components/move-chart-dialog.d.ts.map +1 -0
  55. package/dist/components/move-chart-dialog.jsx +68 -0
  56. package/dist/components/move-chart-dialog.jsx.map +1 -0
  57. package/dist/components/reference-multi-table-dialog.d.ts +12 -0
  58. package/dist/components/reference-multi-table-dialog.d.ts.map +1 -0
  59. package/dist/components/reference-multi-table-dialog.jsx +126 -0
  60. package/dist/components/reference-multi-table-dialog.jsx.map +1 -0
  61. package/dist/components/related-records-tabs.d.ts +8 -0
  62. package/dist/components/related-records-tabs.d.ts.map +1 -0
  63. package/dist/components/related-records-tabs.jsx +75 -0
  64. package/dist/components/related-records-tabs.jsx.map +1 -0
  65. package/dist/components/revisions-button.d.ts +7 -0
  66. package/dist/components/revisions-button.d.ts.map +1 -0
  67. package/dist/components/revisions-button.jsx +152 -0
  68. package/dist/components/revisions-button.jsx.map +1 -0
  69. package/dist/components/wizard-form.d.ts +43 -0
  70. package/dist/components/wizard-form.d.ts.map +1 -0
  71. package/dist/components/wizard-form.jsx +136 -0
  72. package/dist/components/wizard-form.jsx.map +1 -0
  73. package/dist/dashboard/time-series.d.ts +20 -0
  74. package/dist/dashboard/time-series.d.ts.map +1 -0
  75. package/dist/dashboard/time-series.js +108 -0
  76. package/dist/dashboard/time-series.js.map +1 -0
  77. package/dist/dialogs.d.ts +35 -0
  78. package/dist/dialogs.d.ts.map +1 -0
  79. package/dist/dialogs.jsx +152 -0
  80. package/dist/dialogs.jsx.map +1 -0
  81. package/dist/export.d.ts +39 -0
  82. package/dist/export.d.ts.map +1 -0
  83. package/dist/export.js +114 -0
  84. package/dist/export.js.map +1 -0
  85. package/dist/extension-registry.d.ts +122 -0
  86. package/dist/extension-registry.d.ts.map +1 -0
  87. package/dist/extension-registry.js +93 -0
  88. package/dist/extension-registry.js.map +1 -0
  89. package/dist/header-controls.d.ts +4 -0
  90. package/dist/header-controls.d.ts.map +1 -0
  91. package/dist/header-controls.jsx +70 -0
  92. package/dist/header-controls.jsx.map +1 -0
  93. package/dist/hooks.d.ts +104 -0
  94. package/dist/hooks.d.ts.map +1 -0
  95. package/dist/hooks.js +374 -0
  96. package/dist/hooks.js.map +1 -0
  97. package/dist/hotkey-help.d.ts +3 -0
  98. package/dist/hotkey-help.d.ts.map +1 -0
  99. package/dist/hotkey-help.jsx +32 -0
  100. package/dist/hotkey-help.jsx.map +1 -0
  101. package/dist/hotkey-registry.d.ts +18 -0
  102. package/dist/hotkey-registry.d.ts.map +1 -0
  103. package/dist/hotkey-registry.jsx +34 -0
  104. package/dist/hotkey-registry.jsx.map +1 -0
  105. package/dist/i18n.d.ts +74 -0
  106. package/dist/i18n.d.ts.map +1 -0
  107. package/dist/i18n.jsx +127 -0
  108. package/dist/i18n.jsx.map +1 -0
  109. package/dist/index.d.ts +35 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +36 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/notify.d.ts +41 -0
  114. package/dist/notify.d.ts.map +1 -0
  115. package/dist/notify.jsx +58 -0
  116. package/dist/notify.jsx.map +1 -0
  117. package/dist/pages/ai-assistant-settings-section.d.ts +3 -0
  118. package/dist/pages/ai-assistant-settings-section.d.ts.map +1 -0
  119. package/dist/pages/ai-assistant-settings-section.jsx +126 -0
  120. package/dist/pages/ai-assistant-settings-section.jsx.map +1 -0
  121. package/dist/pages/audit-log-page.d.ts +3 -0
  122. package/dist/pages/audit-log-page.d.ts.map +1 -0
  123. package/dist/pages/audit-log-page.jsx +354 -0
  124. package/dist/pages/audit-log-page.jsx.map +1 -0
  125. package/dist/pages/edit-page.d.ts +7 -0
  126. package/dist/pages/edit-page.d.ts.map +1 -0
  127. package/dist/pages/edit-page.jsx +614 -0
  128. package/dist/pages/edit-page.jsx.map +1 -0
  129. package/dist/pages/export-dialog.d.ts +11 -0
  130. package/dist/pages/export-dialog.d.ts.map +1 -0
  131. package/dist/pages/export-dialog.jsx +102 -0
  132. package/dist/pages/export-dialog.jsx.map +1 -0
  133. package/dist/pages/home-page.d.ts +3 -0
  134. package/dist/pages/home-page.d.ts.map +1 -0
  135. package/dist/pages/home-page.jsx +211 -0
  136. package/dist/pages/home-page.jsx.map +1 -0
  137. package/dist/pages/list-page.d.ts +42 -0
  138. package/dist/pages/list-page.d.ts.map +1 -0
  139. package/dist/pages/list-page.jsx +1596 -0
  140. package/dist/pages/list-page.jsx.map +1 -0
  141. package/dist/pages/login-page.d.ts +11 -0
  142. package/dist/pages/login-page.d.ts.map +1 -0
  143. package/dist/pages/login-page.jsx +157 -0
  144. package/dist/pages/login-page.jsx.map +1 -0
  145. package/dist/pages/settings-page.d.ts +5 -0
  146. package/dist/pages/settings-page.d.ts.map +1 -0
  147. package/dist/pages/settings-page.jsx +787 -0
  148. package/dist/pages/settings-page.jsx.map +1 -0
  149. package/dist/pages/settings-shared.d.ts +51 -0
  150. package/dist/pages/settings-shared.d.ts.map +1 -0
  151. package/dist/pages/settings-shared.jsx +66 -0
  152. package/dist/pages/settings-shared.jsx.map +1 -0
  153. package/dist/pages/show-page.d.ts +7 -0
  154. package/dist/pages/show-page.d.ts.map +1 -0
  155. package/dist/pages/show-page.jsx +147 -0
  156. package/dist/pages/show-page.jsx.map +1 -0
  157. package/dist/pages/wizard-create-page.d.ts +14 -0
  158. package/dist/pages/wizard-create-page.d.ts.map +1 -0
  159. package/dist/pages/wizard-create-page.jsx +106 -0
  160. package/dist/pages/wizard-create-page.jsx.map +1 -0
  161. package/dist/property-renderer.d.ts +8 -0
  162. package/dist/property-renderer.d.ts.map +1 -0
  163. package/dist/property-renderer.jsx +690 -0
  164. package/dist/property-renderer.jsx.map +1 -0
  165. package/dist/provider.d.ts +20 -0
  166. package/dist/provider.d.ts.map +1 -0
  167. package/dist/provider.jsx +32 -0
  168. package/dist/provider.jsx.map +1 -0
  169. package/dist/realtime.d.ts +22 -0
  170. package/dist/realtime.d.ts.map +1 -0
  171. package/dist/realtime.js +38 -0
  172. package/dist/realtime.js.map +1 -0
  173. package/dist/reference.d.ts +52 -0
  174. package/dist/reference.d.ts.map +1 -0
  175. package/dist/reference.jsx +224 -0
  176. package/dist/reference.jsx.map +1 -0
  177. package/dist/relations.d.ts +11 -0
  178. package/dist/relations.d.ts.map +1 -0
  179. package/dist/relations.js +36 -0
  180. package/dist/relations.js.map +1 -0
  181. package/dist/router.d.ts +82 -0
  182. package/dist/router.d.ts.map +1 -0
  183. package/dist/router.jsx +187 -0
  184. package/dist/router.jsx.map +1 -0
  185. package/dist/show-when.d.ts +7 -0
  186. package/dist/show-when.d.ts.map +1 -0
  187. package/dist/show-when.js +77 -0
  188. package/dist/show-when.js.map +1 -0
  189. package/dist/types.d.ts +194 -0
  190. package/dist/types.d.ts.map +1 -0
  191. package/dist/types.js +18 -0
  192. package/dist/types.js.map +1 -0
  193. package/dist/use-dashboard-charts.d.ts +93 -0
  194. package/dist/use-dashboard-charts.d.ts.map +1 -0
  195. package/dist/use-dashboard-charts.js +263 -0
  196. package/dist/use-dashboard-charts.js.map +1 -0
  197. package/dist/use-hotkey.d.ts +17 -0
  198. package/dist/use-hotkey.d.ts.map +1 -0
  199. package/dist/use-hotkey.js +103 -0
  200. package/dist/use-hotkey.js.map +1 -0
  201. package/dist/user-directory.d.ts +18 -0
  202. package/dist/user-directory.d.ts.map +1 -0
  203. package/dist/user-directory.js +51 -0
  204. package/dist/user-directory.js.map +1 -0
  205. package/dist/validation.d.ts +22 -0
  206. package/dist/validation.d.ts.map +1 -0
  207. package/dist/validation.js +338 -0
  208. package/dist/validation.js.map +1 -0
  209. package/package.json +59 -0
  210. package/src/action-guard.ts +20 -0
  211. package/src/action-menu.tsx +161 -0
  212. package/src/admin-app.tsx +630 -0
  213. package/src/admin-router.tsx +273 -0
  214. package/src/breadcrumbs.tsx +75 -0
  215. package/src/client.ts +1093 -0
  216. package/src/component-loader.ts +33 -0
  217. package/src/components/ai-assistant-widget.tsx +565 -0
  218. package/src/components/ai-fill-dialog.tsx +143 -0
  219. package/src/components/chart-builder-dialog.tsx +618 -0
  220. package/src/components/chart-widget.tsx +654 -0
  221. package/src/components/global-search-dialog.tsx +272 -0
  222. package/src/components/group-settings-dialog.tsx +93 -0
  223. package/src/components/move-chart-dialog.tsx +130 -0
  224. package/src/components/reference-multi-table-dialog.tsx +196 -0
  225. package/src/components/related-records-tabs.tsx +130 -0
  226. package/src/components/revisions-button.tsx +237 -0
  227. package/src/components/wizard-form.tsx +302 -0
  228. package/src/dashboard/time-series.ts +125 -0
  229. package/src/dialogs.tsx +265 -0
  230. package/src/export.ts +140 -0
  231. package/src/extension-registry.ts +195 -0
  232. package/src/header-controls.tsx +125 -0
  233. package/src/hooks.ts +509 -0
  234. package/src/hotkey-help.tsx +56 -0
  235. package/src/hotkey-registry.tsx +60 -0
  236. package/src/i18n.tsx +267 -0
  237. package/src/index.ts +192 -0
  238. package/src/notify.tsx +94 -0
  239. package/src/pages/ai-assistant-settings-section.tsx +167 -0
  240. package/src/pages/audit-log-page.tsx +580 -0
  241. package/src/pages/edit-page.tsx +743 -0
  242. package/src/pages/export-dialog.tsx +154 -0
  243. package/src/pages/home-page.tsx +318 -0
  244. package/src/pages/list-page.tsx +2645 -0
  245. package/src/pages/login-page.tsx +242 -0
  246. package/src/pages/settings-page.tsx +1143 -0
  247. package/src/pages/settings-shared.tsx +134 -0
  248. package/src/pages/show-page.tsx +223 -0
  249. package/src/pages/wizard-create-page.tsx +164 -0
  250. package/src/property-renderer.tsx +1143 -0
  251. package/src/provider.tsx +70 -0
  252. package/src/realtime.ts +55 -0
  253. package/src/reference.tsx +386 -0
  254. package/src/relations.ts +55 -0
  255. package/src/router.tsx +211 -0
  256. package/src/show-when.ts +76 -0
  257. package/src/types.ts +198 -0
  258. package/src/use-dashboard-charts.ts +362 -0
  259. package/src/use-hotkey.ts +128 -0
  260. package/src/user-directory.ts +56 -0
  261. package/src/validation.ts +361 -0
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+ import type { ListQuery, PropertyJSON } from '../types.js';
3
+ export interface ExportDialogProps {
4
+ resourceId: string;
5
+ resourceLabel: string;
6
+ properties: PropertyJSON[];
7
+ query: ListQuery | undefined;
8
+ onClose(): void;
9
+ }
10
+ export declare function ExportDialog({ resourceId, resourceLabel, properties, query, onClose, }: ExportDialogProps): React.ReactElement;
11
+ //# sourceMappingURL=export-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-dialog.d.ts","sourceRoot":"","sources":["../../src/pages/export-dialog.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAoB9B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,KAAK,EAAE,SAAS,GAAG,SAAS,CAAA;IAC5B,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,aAAa,EACb,UAAU,EACV,KAAK,EACL,OAAO,GACR,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAgHxC"}
@@ -0,0 +1,102 @@
1
+ // Export dialog: lets the user download all records matching the current
2
+ // list filters/sorting as CSV or JSON. Rendered inside a generic <Dialog>
3
+ // via useDialogs().open() — the parent passes resourceId + visible
4
+ // properties + the active ListQuery.
5
+ import * as React from 'react';
6
+ import { Button, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@modern-admin/ui';
7
+ import { Download, FileJson, FileSpreadsheet, X } from 'lucide-react';
8
+ import { useAdminClient } from '../provider.js';
9
+ import { useI18n } from '../i18n.js';
10
+ import { useNotify } from '../notify.js';
11
+ import { downloadText, exportFilename, fetchAllRecords, recordsToCsv, recordsToJson, } from '../export.js';
12
+ export function ExportDialog({ resourceId, resourceLabel, properties, query, onClose, }) {
13
+ const client = useAdminClient();
14
+ const { t } = useI18n();
15
+ const notify = useNotify();
16
+ const [busy, setBusy] = React.useState(null);
17
+ const [progress, setProgress] = React.useState(null);
18
+ const abortRef = React.useRef(null);
19
+ React.useEffect(() => {
20
+ return () => abortRef.current?.abort();
21
+ }, []);
22
+ const run = async (format) => {
23
+ if (busy)
24
+ return;
25
+ setBusy(format);
26
+ setProgress({ loaded: 0, total: 0 });
27
+ const ctrl = new AbortController();
28
+ abortRef.current = ctrl;
29
+ try {
30
+ const records = await fetchAllRecords(client, resourceId, query, {
31
+ signal: ctrl.signal,
32
+ onProgress: (loaded, total) => setProgress({ loaded, total }),
33
+ });
34
+ const body = format === 'csv'
35
+ ? recordsToCsv(records, { properties, query })
36
+ : recordsToJson(records, { properties, query });
37
+ const mime = format === 'csv' ? 'text/csv' : 'application/json';
38
+ downloadText(exportFilename(resourceId, format), mime, body);
39
+ notify.success({ key: 'export:exported', params: { count: records.length } });
40
+ onClose();
41
+ }
42
+ catch (err) {
43
+ if (err.name === 'AbortError')
44
+ return;
45
+ notify.error({ key: 'export:exportFailed' }, { description: err instanceof Error ? err.message : String(err) });
46
+ }
47
+ finally {
48
+ setBusy(null);
49
+ setProgress(null);
50
+ abortRef.current = null;
51
+ }
52
+ };
53
+ return (<>
54
+ <DialogHeader>
55
+ <DialogTitle>{t('export:title')}</DialogTitle>
56
+ <DialogDescription>
57
+ {t('export:description', { resource: resourceLabel })}
58
+ </DialogDescription>
59
+ </DialogHeader>
60
+
61
+ <div className="grid grid-cols-1 gap-2 sm:grid-cols-2">
62
+ <Button type="button" variant="outline" className="h-auto justify-start gap-3 py-3" disabled={!!busy} onClick={() => run('csv')}>
63
+ <FileSpreadsheet className="size-5 shrink-0"/>
64
+ <div className="min-w-0 flex flex-col items-start text-left overflow-hidden">
65
+ <span className="font-medium">CSV</span>
66
+ <span className="text-xs text-muted-foreground truncate w-full">
67
+ {t('export:csvHint')}
68
+ </span>
69
+ </div>
70
+ </Button>
71
+ <Button type="button" variant="outline" className="h-auto justify-start gap-3 py-3" disabled={!!busy} onClick={() => run('json')}>
72
+ <FileJson className="size-5 shrink-0"/>
73
+ <div className="min-w-0 flex flex-col items-start text-left overflow-hidden">
74
+ <span className="font-medium">JSON</span>
75
+ <span className="text-xs text-muted-foreground truncate w-full">
76
+ {t('export:jsonHint')}
77
+ </span>
78
+ </div>
79
+ </Button>
80
+ </div>
81
+
82
+ {busy && (<div className="flex items-center gap-2 text-sm text-muted-foreground">
83
+ <Download className="size-4 animate-pulse"/>
84
+ <span>
85
+ {progress && progress.total > 0
86
+ ? t('export:progress', { loaded: progress.loaded, total: progress.total })
87
+ : t('export:downloading')}
88
+ </span>
89
+ </div>)}
90
+
91
+ <DialogFooter>
92
+ <Button type="button" variant="ghost" onClick={() => {
93
+ abortRef.current?.abort();
94
+ onClose();
95
+ }}>
96
+ <X className="size-4"/>
97
+ {busy ? t('common:cancel') : t('common:close')}
98
+ </Button>
99
+ </DialogFooter>
100
+ </>);
101
+ }
102
+ //# sourceMappingURL=export-dialog.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-dialog.jsx","sourceRoot":"","sources":["../../src/pages/export-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ export declare function HomePage(): React.ReactElement;
3
+ //# sourceMappingURL=home-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-page.d.ts","sourceRoot":"","sources":["../../src/pages/home-page.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA6B9B,wBAAgB,QAAQ,IAAI,KAAK,CAAC,YAAY,CA0R7C"}
@@ -0,0 +1,211 @@
1
+ import * as React from 'react';
2
+ import { Plus, Database, BarChart2, FolderPlus, Pencil, Trash2 } from 'lucide-react';
3
+ import { Button, Card, CardContent, CardHeader, CardTitle, Empty, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Tabs, TabsList, TabsTrigger, } from '@modern-admin/ui';
4
+ import { useResources, useCurrentUser } from '../hooks.js';
5
+ import { useI18n } from '../i18n.js';
6
+ import { Link } from '../router.js';
7
+ import { useDashboardCharts, ServerDashboardStore } from '../use-dashboard-charts.js';
8
+ import { useAdminClient } from '../provider.js';
9
+ import { useDialogs } from '../dialogs.js';
10
+ import { ChartWidget } from '../components/chart-widget.js';
11
+ import { ChartBuilderDialog } from '../components/chart-builder-dialog.js';
12
+ import { GroupSettingsDialog } from '../components/group-settings-dialog.js';
13
+ import { MoveChartDialog } from '../components/move-chart-dialog.js';
14
+ export function HomePage() {
15
+ const { t } = useI18n();
16
+ const resources = useResources();
17
+ const { user } = useCurrentUser();
18
+ const adminClient = useAdminClient();
19
+ const dialogs = useDialogs();
20
+ // Use server-backed store so charts persist across devices/browsers.
21
+ // Falls back gracefully when configStore is not configured server-side.
22
+ const serverStore = React.useMemo(() => new ServerDashboardStore(adminClient), [adminClient]);
23
+ const { charts, groups, addChart, updateChart, removeChart, addGroup, updateGroup, removeGroup, } = useDashboardCharts({
24
+ userId: user?.id ?? null,
25
+ store: serverStore,
26
+ });
27
+ // Only show resources explicitly visible in navigation (same rule as sidebar).
28
+ const navResources = React.useMemo(() => resources.filter((r) => r.navigation !== null), [resources]);
29
+ const [building, setBuilding] = React.useState(false);
30
+ const [editingId, setEditingId] = React.useState(null);
31
+ // null = no dialog; 'new' = create; ChartGroup = edit-existing.
32
+ const [groupDialog, setGroupDialog] = React.useState(null);
33
+ const [activeGroupId, setActiveGroupId] = React.useState(null);
34
+ // Chart being moved — null when dialog is closed.
35
+ const [movingChart, setMovingChart] = React.useState(null);
36
+ // Keep `activeGroupId` valid when groups change (group removed, list reloaded
37
+ // from store, etc.). When at least one group exists we always render charts
38
+ // bucketed by group, so we need a definite active id.
39
+ React.useEffect(() => {
40
+ if (groups.length === 0) {
41
+ setActiveGroupId(null);
42
+ return;
43
+ }
44
+ if (!activeGroupId || !groups.some((g) => g.id === activeGroupId)) {
45
+ setActiveGroupId(groups[0].id);
46
+ }
47
+ }, [groups, activeGroupId]);
48
+ const editingChart = editingId ? charts.find((c) => c.id === editingId) : undefined;
49
+ // Build the chart bucket for the active group: charts whose `groupId`
50
+ // matches OR (fallback) ungrouped charts when the active group is the
51
+ // first one. Sorted by `order` then `createdAt`.
52
+ const firstGroupId = groups[0]?.id ?? null;
53
+ const visibleCharts = React.useMemo(() => {
54
+ if (groups.length === 0)
55
+ return [...charts].sort(byChartOrder);
56
+ if (!activeGroupId)
57
+ return [];
58
+ const filtered = charts.filter((c) => {
59
+ if (c.groupId)
60
+ return c.groupId === activeGroupId;
61
+ // Ungrouped charts default into the first group so they remain visible.
62
+ return activeGroupId === firstGroupId;
63
+ });
64
+ return filtered.sort(byChartOrder);
65
+ }, [charts, groups.length, activeGroupId, firstGroupId]);
66
+ const activeGroup = activeGroupId ? groups.find((g) => g.id === activeGroupId) ?? null : null;
67
+ const handleDeleteChart = async (chart) => {
68
+ const ok = await dialogs.confirm({
69
+ title: t('chart:deleteChartConfirm'),
70
+ description: t('chart:deleteChartConfirmHint'),
71
+ confirmLabel: t('common:delete'),
72
+ destructive: true,
73
+ });
74
+ if (ok)
75
+ removeChart(chart.id);
76
+ };
77
+ const handleDeleteGroup = async (group) => {
78
+ const count = charts.filter((c) => {
79
+ if (c.groupId)
80
+ return c.groupId === group.id;
81
+ // Ungrouped charts also belong to the first group at display time.
82
+ return group.id === firstGroupId;
83
+ }).length;
84
+ const ok = await dialogs.confirm({
85
+ title: t('chart:deleteGroupConfirm'),
86
+ description: t('chart:deleteGroupConfirmHint').replace('{count}', String(count)),
87
+ confirmLabel: t('common:delete'),
88
+ destructive: true,
89
+ });
90
+ if (ok)
91
+ removeGroup(group.id);
92
+ };
93
+ return (<div className="space-y-3 sm:space-y-6">
94
+ {/* ── Dashboard charts ──────────────────────────────────────── */}
95
+ <Card>
96
+ <CardHeader className="flex flex-row items-center justify-between p-3 pb-2 space-y-0 gap-2 sm:p-6 sm:pb-2">
97
+ <CardTitle>{t('chart:dashboard')}</CardTitle>
98
+ <div className="flex items-center gap-2">
99
+ <Button size="sm" variant="outline" onClick={() => setGroupDialog('new')}>
100
+ <FolderPlus className="size-4"/>
101
+ <span className="hidden sm:inline ml-1.5">{t('chart:addGroup')}</span>
102
+ </Button>
103
+ <Button size="sm" onClick={() => setBuilding(true)} disabled={navResources.length === 0}>
104
+ <Plus className="size-4"/>
105
+ <span className="hidden sm:inline ml-1.5">{t('chart:addChart')}</span>
106
+ </Button>
107
+ </div>
108
+ </CardHeader>
109
+ <CardContent className="p-3 pt-0 sm:p-6 sm:pt-0">
110
+ {groups.length > 0 && activeGroupId && (<Tabs value={activeGroupId} onValueChange={(v) => setActiveGroupId(v)} className="mb-4">
111
+ <div className="flex items-end justify-between gap-2">
112
+ <TabsList className="flex-1">
113
+ {groups.map((g) => (<TabsTrigger key={g.id} value={g.id}>
114
+ {g.name}
115
+ </TabsTrigger>))}
116
+ </TabsList>
117
+ {activeGroup && (<div className="mb-1 flex shrink-0 items-center gap-1">
118
+ <Button size="sm" variant="ghost" onClick={() => setGroupDialog(activeGroup)} aria-label={t('chart:editGroup')}>
119
+ <Pencil className="size-3.5"/>
120
+ <span className="hidden sm:inline ml-1.5">{t('chart:editGroup')}</span>
121
+ </Button>
122
+ <Button size="sm" variant="ghost" onClick={() => void handleDeleteGroup(activeGroup)} aria-label={t('chart:deleteGroup')}>
123
+ <Trash2 className="size-3.5"/>
124
+ <span className="hidden sm:inline ml-1.5">{t('chart:deleteGroup')}</span>
125
+ </Button>
126
+ </div>)}
127
+ </div>
128
+ </Tabs>)}
129
+
130
+ {visibleCharts.length === 0 ? (<Empty className="border-0 py-4">
131
+ <EmptyHeader>
132
+ <EmptyMedia>
133
+ <BarChart2 />
134
+ </EmptyMedia>
135
+ <EmptyTitle>{t('chart:noCharts')}</EmptyTitle>
136
+ <EmptyDescription>{t('chart:noChartsHint')}</EmptyDescription>
137
+ </EmptyHeader>
138
+ </Empty>) : (<div className="grid gap-3 grid-cols-1 sm:gap-4 md:grid-cols-2">
139
+ {visibleCharts.map((c) => (<div key={c.id} className={c.width === 'full' ? 'md:col-span-2' : undefined}>
140
+ <ChartWidget config={c} onEdit={() => setEditingId(c.id)} onDelete={() => void handleDeleteChart(c)} onMove={() => setMovingChart(c)} onUpdate={(input) => updateChart(c.id, input)}/>
141
+ </div>))}
142
+ </div>)}
143
+ </CardContent>
144
+ </Card>
145
+
146
+ {/* ── Resources list ────────────────────────────────────────── */}
147
+ <Card>
148
+ <CardHeader>
149
+ <CardTitle>{t('common:resources')}</CardTitle>
150
+ </CardHeader>
151
+ <CardContent>
152
+ {navResources.length === 0 ? (<Empty className="border-0">
153
+ <EmptyHeader>
154
+ <EmptyMedia>
155
+ <Database />
156
+ </EmptyMedia>
157
+ <EmptyTitle>{t('common:noRecords')}</EmptyTitle>
158
+ <EmptyDescription>
159
+ {t('common:noRecordsHint', { resource: 'resource' })}
160
+ </EmptyDescription>
161
+ </EmptyHeader>
162
+ </Empty>) : (<ul className="grid gap-2 sm:grid-cols-2 md:grid-cols-3">
163
+ {navResources.map((r) => (<li key={r.id}>
164
+ <Link to={{ name: 'list', resourceId: r.id }} className="block rounded-md border border-border bg-card p-4 hover:border-primary/40 hover:shadow-sm transition-shadow">
165
+ <div className="font-semibold">{r.name}</div>
166
+ {r.name !== r.id && (<div className="text-xs text-muted-foreground">{r.id}</div>)}
167
+ </Link>
168
+ </li>))}
169
+ </ul>)}
170
+ </CardContent>
171
+ </Card>
172
+
173
+ {/* ── Chart builder dialog ──────────────────────────────────── */}
174
+ {building && (<ChartBuilderDialog onSave={(input) => {
175
+ // New charts inherit the active group so the user sees them in
176
+ // the tab they were on. The hook also auto-falls back to the
177
+ // first group if `groupId` is undefined.
178
+ addChart(activeGroupId ? { ...input, groupId: activeGroupId } : input);
179
+ setBuilding(false);
180
+ }} onClose={() => setBuilding(false)}/>)}
181
+ {editingChart && (<ChartBuilderDialog initial={editingChart} onSave={(input) => { updateChart(editingChart.id, input); setEditingId(null); }} onClose={() => setEditingId(null)}/>)}
182
+
183
+ {/* ── Move chart dialog ─────────────────────────────────────── */}
184
+ {movingChart && (<MoveChartDialog groups={groups} initialGroupId={movingChart.groupId} initialOrder={movingChart.order} onSave={({ groupId, order }) => {
185
+ updateChart(movingChart.id, { ...movingChart, groupId, order });
186
+ setMovingChart(null);
187
+ }} onClose={() => setMovingChart(null)} onCreateGroup={() => {
188
+ setMovingChart(null);
189
+ setGroupDialog('new');
190
+ }}/>)}
191
+
192
+ {/* ── Group settings dialog ─────────────────────────────────── */}
193
+ {groupDialog && (<GroupSettingsDialog initial={groupDialog === 'new' ? undefined : groupDialog} onSave={(input) => {
194
+ if (groupDialog === 'new') {
195
+ const newId = addGroup(input);
196
+ setActiveGroupId(newId);
197
+ }
198
+ else {
199
+ updateGroup(groupDialog.id, input);
200
+ }
201
+ setGroupDialog(null);
202
+ }} onClose={() => setGroupDialog(null)}/>)}
203
+ </div>);
204
+ }
205
+ /** Sort charts within a group: by `order` asc, ties broken by `createdAt`. */
206
+ function byChartOrder(a, b) {
207
+ if (a.order !== b.order)
208
+ return a.order - b.order;
209
+ return a.createdAt.localeCompare(b.createdAt);
210
+ }
211
+ //# sourceMappingURL=home-page.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-page.jsx","sourceRoot":"","sources":["../../src/pages/home-page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import * as React from 'react';
2
+ import { type ListQueryState } from '../router.js';
3
+ /** Toggles for individual chrome / toolbar pieces. All default to `true`. */
4
+ export interface ResourceListFeatures {
5
+ breadcrumbs?: boolean;
6
+ title?: boolean;
7
+ refresh?: boolean;
8
+ filters?: boolean;
9
+ columns?: boolean;
10
+ export?: boolean;
11
+ create?: boolean;
12
+ bulk?: boolean;
13
+ /** Toolbar-level "Actions" dropdown for resource-scoped custom actions. */
14
+ actions?: boolean;
15
+ /** Per-column filter popovers in the table header. */
16
+ headerFilters?: boolean;
17
+ /** Wrap table + toolbar in a Card. Set false when embedding inside another card. */
18
+ card?: boolean;
19
+ }
20
+ export interface ResourceListPageProps {
21
+ resourceId: string;
22
+ /** When provided, the table runs in "controlled" mode: query state comes
23
+ * from props instead of the URL hash. Both `query` and `onQueryChange`
24
+ * must be supplied together. */
25
+ query?: ListQueryState;
26
+ onQueryChange?: (next: ListQueryState) => void;
27
+ /** Filters always applied to the data query but hidden from the filter UI
28
+ * and never written to the URL. Used to embed the list as a related-records
29
+ * view filtered by a parent record's id. */
30
+ lockedFilters?: Record<string, string>;
31
+ features?: ResourceListFeatures;
32
+ /** When provided, row selection is controlled from outside. The
33
+ * internal bulk action bar should be hidden (`features.bulk = false`)
34
+ * in this mode — the parent is consuming the selection. */
35
+ selectedIds?: ReadonlyArray<string>;
36
+ onSelectionChange?: (next: string[]) => void;
37
+ /** Disable row click → edit and link cells. Used by the picker dialog
38
+ * so clicking a row just toggles selection. */
39
+ disableRowNavigation?: boolean;
40
+ }
41
+ export declare function ResourceListPage({ resourceId, query: controlledQuery, onQueryChange, lockedFilters, features, selectedIds: controlledSelectedIds, onSelectionChange, disableRowNavigation, }: ResourceListPageProps): React.ReactElement;
42
+ //# sourceMappingURL=list-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-page.d.ts","sourceRoot":"","sources":["../../src/pages/list-page.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA+F9B,OAAO,EAEL,KAAK,cAAc,EAKpB,MAAM,cAAc,CAAA;AAsJrB,6EAA6E;AAC7E,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sDAAsD;IACtD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,oFAAoF;IACpF,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB;;qCAEiC;IACjC,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAA;IAC9C;;iDAE6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B;;gEAE4D;IAC5D,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACnC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC5C;oDACgD;IAChD,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,aAAa,EACb,QAAQ,EACR,WAAW,EAAE,qBAAqB,EAClC,iBAAiB,EACjB,oBAAoB,GACrB,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAunC5C"}