@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,614 @@
1
+ // Edit / new page driven by react-hook-form + zodResolver. The Zod schema
2
+ // is derived dynamically from the resource's editable PropertyJSON list via
3
+ // `buildValidationSchema()` — every property type maps to the right runtime
4
+ // check, with localized error messages. Field-level server errors from
5
+ // `record.errors` are projected back onto the form via setError, and global
6
+ // success/failure messages surface as toasts.
7
+ import * as React from 'react';
8
+ import { useForm, useWatch } from 'react-hook-form';
9
+ import { zodResolver } from '@hookform/resolvers/zod';
10
+ import { Button, Card, CardContent, CardHeader, CardTitle, Field, FieldError, FieldLabel, Form, FormField, InfoTooltip, Kbd, Tooltip, TooltipContent, TooltipTrigger, getModKeyLabel, } from '@modern-admin/ui';
11
+ import { AlertCircle, Eye, Plus, Save, Sparkles, Trash2, X } from 'lucide-react';
12
+ import { useCreateRecord, useDeleteRecord, useFeatures, useRecord, useResource, useUpdateRecord } from '../hooks.js';
13
+ import { parseApiError } from '../client.js';
14
+ import { PropertyEditor } from '../property-renderer.js';
15
+ import { Link, useNavigate } from '../router.js';
16
+ import { useI18n } from '../i18n.js';
17
+ import { useNotify } from '../notify.js';
18
+ import { useHotkey } from '../use-hotkey.js';
19
+ import { PageBreadcrumbs, homeCrumb } from '../breadcrumbs.js';
20
+ import { buildValidationSchema, defaultValueFor } from '../validation.js';
21
+ import { evaluateShowWhen } from '../show-when.js';
22
+ import { useDialogs } from '../dialogs.js';
23
+ import { RevisionsButton } from '../components/revisions-button.js';
24
+ import { AiFillDialog } from '../components/ai-fill-dialog.js';
25
+ import { visibleRecordProperties } from '../relations.js';
26
+ /**
27
+ * Defensive coercion applied to values returned by `aiFillFromImage` before
28
+ * they reach `form.setValue`. The backend already normalises numbers/dates/
29
+ * enums/references; this is a last-line check so an unexpected stringy
30
+ * number does not poison a numeric field's state and so out-of-domain enum
31
+ * values are dropped rather than silently committed. Returns `undefined` to
32
+ * mean "drop this value, keep the existing form state".
33
+ */
34
+ function coerceAiFillValue(property, value) {
35
+ if (value === null || value === undefined)
36
+ return undefined;
37
+ // Enum-style: snap by exact / case-insensitive value or label.
38
+ if (property.availableValues?.length) {
39
+ if (typeof value !== 'string')
40
+ return undefined;
41
+ const trimmed = value.trim();
42
+ if (trimmed === '')
43
+ return undefined;
44
+ const lower = trimmed.toLowerCase();
45
+ const match = property.availableValues.find((v) => v.value === trimmed)
46
+ ?? property.availableValues.find((v) => v.value.toLowerCase() === lower)
47
+ ?? property.availableValues.find((v) => v.label.toLowerCase() === lower);
48
+ return match?.value;
49
+ }
50
+ // References: keep id-shaped scalars only (string or number).
51
+ if (property.reference) {
52
+ if (typeof value === 'string' || typeof value === 'number')
53
+ return value;
54
+ return undefined;
55
+ }
56
+ switch (property.type) {
57
+ case 'bigint':
58
+ case 'biginteger': {
59
+ // BigInt values are transported as digit strings end-to-end (matches
60
+ // BaseRecord.toJSON + the Prisma adapter's accept-string write path).
61
+ // Never round-trip via Number() — values >2^53 would lose precision.
62
+ if (typeof value === 'bigint')
63
+ return value.toString();
64
+ if (typeof value === 'number') {
65
+ if (!Number.isFinite(value) || !Number.isInteger(value))
66
+ return undefined;
67
+ return String(value);
68
+ }
69
+ if (typeof value !== 'string')
70
+ return undefined;
71
+ const trimmed = value.trim().replace(/[\s_]/g, '');
72
+ return /^-?\d+$/.test(trimmed) ? trimmed : undefined;
73
+ }
74
+ case 'number':
75
+ case 'float':
76
+ case 'currency':
77
+ case 'money':
78
+ case 'decimal':
79
+ case 'integer': {
80
+ if (typeof value === 'number')
81
+ return Number.isFinite(value) ? value : undefined;
82
+ if (typeof value !== 'string')
83
+ return undefined;
84
+ const trimmed = value.trim().replace(/[^\d.,\-+eE]/g, '');
85
+ if (trimmed === '' || trimmed === '-' || trimmed === '+')
86
+ return undefined;
87
+ const lastDot = trimmed.lastIndexOf('.');
88
+ const lastComma = trimmed.lastIndexOf(',');
89
+ const normalised = lastDot >= lastComma
90
+ ? trimmed.replace(/,/g, '')
91
+ : trimmed.replace(/\./g, '').replace(',', '.');
92
+ const n = Number(normalised);
93
+ if (!Number.isFinite(n))
94
+ return undefined;
95
+ return property.type === 'integer' ? Math.trunc(n) : n;
96
+ }
97
+ case 'boolean':
98
+ if (typeof value === 'boolean')
99
+ return value;
100
+ if (typeof value === 'number')
101
+ return value !== 0;
102
+ if (typeof value === 'string') {
103
+ const t = value.trim().toLowerCase();
104
+ if (['true', 'yes', 'y', '1', 'on'].includes(t))
105
+ return true;
106
+ if (['false', 'no', 'n', '0', 'off'].includes(t))
107
+ return false;
108
+ }
109
+ return undefined;
110
+ case 'date':
111
+ case 'datetime':
112
+ case 'datetime-local':
113
+ // Keep ISO-ish strings; date pickers cope with both YYYY-MM-DD and full
114
+ // ISO. Reject anything that doesn't at least look year-prefixed so we
115
+ // don't push "12 March 2026" into a <DatePicker>.
116
+ if (typeof value !== 'string')
117
+ return undefined;
118
+ return /^\d{4}-\d{2}-\d{2}/.test(value.trim()) ? value.trim() : undefined;
119
+ default:
120
+ return value;
121
+ }
122
+ }
123
+ export function ResourceEditPage({ resourceId, recordId, }) {
124
+ const resource = useResource(resourceId);
125
+ const existing = useRecord(resourceId, recordId);
126
+ const create = useCreateRecord(resourceId);
127
+ const update = useUpdateRecord(resourceId);
128
+ const remove = useDeleteRecord(resourceId);
129
+ const features = useFeatures();
130
+ const navigate = useNavigate();
131
+ const { t, locale } = useI18n();
132
+ const notify = useNotify();
133
+ const dialogs = useDialogs();
134
+ const editable = React.useMemo(() => resource
135
+ ? visibleRecordProperties(resource.properties, 'edit').filter((p) => !p.isDisabled)
136
+ : [], [resource]);
137
+ // The validation schema needs to consult the live form values so it can
138
+ // skip required/format checks for fields hidden by `showWhen`. We can't
139
+ // call `form.getValues` here (the form isn't built yet), so we route
140
+ // through a ref filled in below — the schema closure reads from the ref
141
+ // at validation time, not at build time.
142
+ const getValuesRef = React.useRef(() => ({}));
143
+ // Re-build the schema when locale changes so error messages re-translate.
144
+ const schema = React.useMemo(() => buildValidationSchema(editable, t, () => getValuesRef.current()),
145
+ // eslint-disable-next-line react-hooks/exhaustive-deps
146
+ [editable, locale]);
147
+ const defaults = React.useMemo(() => {
148
+ const out = {};
149
+ for (const p of editable)
150
+ out[p.path] = defaultValueFor(p);
151
+ return out;
152
+ }, [editable]);
153
+ const form = useForm({
154
+ resolver: zodResolver(schema),
155
+ defaultValues: defaults,
156
+ });
157
+ // Keep the ref pointing at the latest getValues so the schema closure
158
+ // always sees the current form snapshot.
159
+ getValuesRef.current = form.getValues;
160
+ // Track which recordId has already been hydrated so background refetches
161
+ // don't overwrite user edits after the initial load.
162
+ const hydratedRecordIdRef = React.useRef(undefined);
163
+ const isNew = !recordId;
164
+ // localStorage key for the per-resource new-record draft. We persist the
165
+ // form snapshot here whenever the user has typed anything but not yet
166
+ // submitted, so that closing the tab / navigating away doesn't lose work.
167
+ const draftKey = isNew ? `modern-admin:draft:${resourceId}` : null;
168
+ // Once-per-resource init flag for the new-record form. Gates the whole
169
+ // initialisation block — without this, every dep change in the hydration
170
+ // effect (e.g. a background `useResource` refetch bumping the `defaults`
171
+ // reference) would re-run `form.reset(defaults)` and wipe the user's
172
+ // in-progress input (and any draft we just restored).
173
+ const newFormInitForRef = React.useRef(undefined);
174
+ // When we programmatically reset the form (draft restore / undo), we don't
175
+ // want that synthetic change to trigger the persistence watcher and re-save
176
+ // a draft that we just decided not to keep.
177
+ const skipNextPersistRef = React.useRef(false);
178
+ // Hydrate when the existing record arrives (edit mode) or after the resource
179
+ // schema settles (new mode).
180
+ React.useEffect(() => {
181
+ if (!recordId) {
182
+ // New-record form: initialise exactly once per resource. Second and
183
+ // later runs (triggered by background refetches changing `editable` /
184
+ // `defaults` references) must NOT touch the form — `form.reset(...)`
185
+ // would wipe the user's in-progress input.
186
+ hydratedRecordIdRef.current = undefined;
187
+ if (newFormInitForRef.current === resourceId)
188
+ return;
189
+ // Defer until the schema has loaded — otherwise we'd "initialise"
190
+ // against an empty defaults map and then refuse to ever re-init.
191
+ if (editable.length === 0)
192
+ return;
193
+ newFormInitForRef.current = resourceId;
194
+ // Attempt to restore a saved draft. If we find one, reset to the
195
+ // merged snapshot and surface a bottom-center toast with an Undo
196
+ // action. If not, fall back to a single reset to defaults.
197
+ let draft = null;
198
+ if (draftKey && typeof window !== 'undefined') {
199
+ try {
200
+ const stored = window.localStorage.getItem(draftKey);
201
+ if (stored)
202
+ draft = JSON.parse(stored);
203
+ }
204
+ catch {
205
+ /* corrupted JSON — ignore */
206
+ }
207
+ }
208
+ if (draft && typeof draft === 'object') {
209
+ const merged = { ...defaults };
210
+ for (const p of editable) {
211
+ if (Object.prototype.hasOwnProperty.call(draft, p.path)) {
212
+ merged[p.path] = draft[p.path];
213
+ }
214
+ }
215
+ skipNextPersistRef.current = true;
216
+ form.reset(merged);
217
+ notify.raw(t('common:draftRestored'), {
218
+ position: 'bottom-center',
219
+ duration: 8000,
220
+ action: {
221
+ label: t('common:undoDraftRestore'),
222
+ onClick: () => {
223
+ skipNextPersistRef.current = true;
224
+ form.reset(defaults);
225
+ try {
226
+ if (draftKey)
227
+ window.localStorage.removeItem(draftKey);
228
+ }
229
+ catch {
230
+ /* ignore */
231
+ }
232
+ },
233
+ },
234
+ });
235
+ }
236
+ else {
237
+ form.reset(defaults);
238
+ }
239
+ return;
240
+ }
241
+ // Wait until both the resource schema and the record data are ready.
242
+ // Without this guard an early fire with editable=[] would wipe the form.
243
+ if (editable.length === 0 || !existing.data)
244
+ return;
245
+ // Hydrate only once per record — prevents background refetches from
246
+ // overwriting in-progress user edits.
247
+ if (hydratedRecordIdRef.current === recordId)
248
+ return;
249
+ hydratedRecordIdRef.current = recordId;
250
+ // Switching into edit mode invalidates any prior new-form init — so the
251
+ // next visit to `/new` (potentially in a reused component instance)
252
+ // restores the draft / resets to defaults instead of keeping the edit
253
+ // record's values.
254
+ newFormInitForRef.current = undefined;
255
+ const params = existing.data.record.params;
256
+ const merged = { ...defaults };
257
+ for (const p of editable) {
258
+ const v = params[p.path];
259
+ if (p.type === 'boolean')
260
+ merged[p.path] = Boolean(v);
261
+ else if (v == null)
262
+ merged[p.path] = defaultValueFor(p);
263
+ else
264
+ merged[p.path] = v;
265
+ }
266
+ form.reset(merged);
267
+ }, [recordId, existing.data, editable, defaults, form, draftKey, resourceId, notify, t]);
268
+ // Persist the form snapshot to localStorage on every change in new mode.
269
+ // We only write when at least one field deviates from defaults; when the
270
+ // form is back to pristine state we delete the key so the user isn't
271
+ // greeted with an "empty draft" toast on reopen.
272
+ React.useEffect(() => {
273
+ if (!isNew || !draftKey || editable.length === 0 || typeof window === 'undefined')
274
+ return;
275
+ const subscription = form.watch((values) => {
276
+ if (skipNextPersistRef.current) {
277
+ skipNextPersistRef.current = false;
278
+ return;
279
+ }
280
+ let isDirty = false;
281
+ const sanitized = {};
282
+ for (const p of editable) {
283
+ const v = values[p.path];
284
+ // Skip non-serializable values (File objects from file inputs).
285
+ if (v instanceof File)
286
+ continue;
287
+ if (Array.isArray(v) && v.some((x) => x instanceof File))
288
+ continue;
289
+ sanitized[p.path] = v;
290
+ if (!valuesEqual(v, defaults[p.path]))
291
+ isDirty = true;
292
+ }
293
+ try {
294
+ if (isDirty) {
295
+ window.localStorage.setItem(draftKey, JSON.stringify(sanitized));
296
+ }
297
+ else {
298
+ window.localStorage.removeItem(draftKey);
299
+ }
300
+ }
301
+ catch {
302
+ /* quota / disabled storage — ignore */
303
+ }
304
+ });
305
+ return () => subscription.unsubscribe();
306
+ }, [isNew, draftKey, editable, defaults, form]);
307
+ const clearDraft = React.useCallback(() => {
308
+ // After a successful submit we navigate to the show page, but the
309
+ // component might be reused if the user clicks "back" or follows a
310
+ // Create link again. Clearing the init flag forces the next /new visit
311
+ // to fall back to defaults instead of retaining the just-submitted
312
+ // values.
313
+ newFormInitForRef.current = undefined;
314
+ if (!draftKey || typeof window === 'undefined')
315
+ return;
316
+ try {
317
+ window.localStorage.removeItem(draftKey);
318
+ }
319
+ catch {
320
+ /* ignore */
321
+ }
322
+ }, [draftKey]);
323
+ const [submitError, setSubmitError] = React.useState(null);
324
+ const [aiFillOpen, setAiFillOpen] = React.useState(false);
325
+ // The `aiFill` feature plugin (packages/feature-ai-fill) registers a
326
+ // resource-scoped action whose `custom.aiFill === true` flag tells us
327
+ // the resource opts in. Absent the action, the button is hidden.
328
+ // Detect the aiFill plugin by the `custom.aiFill === true` marker, not by
329
+ // action name, so renaming the action in the future can't silently break this.
330
+ const aiFillEnabled = React.useMemo(() => Boolean(resource?.actions.find((a) => a.custom?.aiFill === true)), [resource]);
331
+ const applyAiFillValues = React.useCallback((values) => {
332
+ // Snapshot the current values of the fields that will be overwritten so
333
+ // the user can undo with a single toast action. Only fields we actually
334
+ // applied are snapshotted — fields skipped due to unknown path or
335
+ // failed coercion must not be "undone" to undefined.
336
+ const known = new Map(editable.map((p) => [p.path, p]));
337
+ const snapshot = {};
338
+ const current = form.getValues();
339
+ const applied = [];
340
+ for (const [path, value] of Object.entries(values)) {
341
+ const property = known.get(path);
342
+ if (!property)
343
+ continue;
344
+ const coerced = coerceAiFillValue(property, value);
345
+ if (coerced === undefined)
346
+ continue;
347
+ applied.push([path, coerced]);
348
+ snapshot[path] = current[path];
349
+ }
350
+ for (const [path, value] of applied) {
351
+ // shouldValidate: true so any value the model returned that does not
352
+ // pass the form schema is highlighted to the user immediately rather
353
+ // than discovered on submit.
354
+ form.setValue(path, value, { shouldDirty: true, shouldValidate: true });
355
+ }
356
+ if (applied.length === 0) {
357
+ notify.error({ key: 'aiFill:noValues' });
358
+ return;
359
+ }
360
+ // Offer a quick undo via a bottom-center toast — same pattern as draft restore.
361
+ notify.raw(t('aiFill:applied', { count: applied.length }), {
362
+ position: 'bottom-center',
363
+ duration: 8000,
364
+ action: {
365
+ label: t('common:undoDraftRestore'),
366
+ onClick: () => {
367
+ for (const [path, prev] of Object.entries(snapshot)) {
368
+ form.setValue(path, prev, { shouldDirty: true, shouldValidate: true });
369
+ }
370
+ },
371
+ },
372
+ });
373
+ }, [editable, form, notify, t]);
374
+ const onSubmit = async (values) => {
375
+ setSubmitError(null);
376
+ try {
377
+ const result = isNew
378
+ ? await create.mutateAsync(values)
379
+ : await update.mutateAsync({ id: recordId, payload: values });
380
+ // Field-level errors come back as 200 with `record.errors`.
381
+ const errors = result.record.errors;
382
+ if (errors && Object.keys(errors).length > 0) {
383
+ for (const [path, err] of Object.entries(errors)) {
384
+ const message = typeof err === 'string' ? err : (err?.message ?? 'Invalid value');
385
+ form.setError(path, { type: 'server', message });
386
+ }
387
+ if (result.record.baseError) {
388
+ setSubmitError(String(result.record.baseError));
389
+ }
390
+ notify.error({ key: 'toast:validationFailed' });
391
+ return;
392
+ }
393
+ // Successful submit — drop the saved draft so we don't restore it on
394
+ // the next visit to the new-form route.
395
+ if (isNew)
396
+ clearDraft();
397
+ notify.success({ key: isNew ? 'toast:created' : 'toast:saved' });
398
+ navigate({ name: 'show', resourceId, recordId: String(result.record.id) });
399
+ }
400
+ catch (err) {
401
+ const message = err instanceof Error ? err.message : String(err);
402
+ setSubmitError(message);
403
+ notify.error({ key: isNew ? 'toast:createFailed' : 'toast:saveFailed' }, { description: message });
404
+ }
405
+ };
406
+ const onInvalid = () => {
407
+ notify.error({ key: 'toast:validationFailed' });
408
+ };
409
+ const handleDelete = async () => {
410
+ if (!recordId)
411
+ return;
412
+ const ok = await dialogs.confirm({
413
+ title: t('common:confirmDelete'),
414
+ confirmLabel: t('common:delete'),
415
+ destructive: true,
416
+ });
417
+ if (!ok)
418
+ return;
419
+ await remove.mutateAsync(recordId);
420
+ navigate({ name: 'list', resourceId });
421
+ };
422
+ // While editing an existing record, block submit/delete until the record
423
+ // has been hydrated. Otherwise the form submits with empty defaults and
424
+ // wipes server-side fields (e.g. enums coerce '' → null).
425
+ const isHydrating = !isNew && (existing.isLoading || hydratedRecordIdRef.current !== recordId);
426
+ // ── Keyboard shortcuts ──
427
+ // Ctrl/Cmd+S submits the form. Submit-on-Ctrl+S works even when focus is
428
+ // in an input — that's the standard "save" gesture across editors.
429
+ useHotkey('mod+s', () => {
430
+ if (form.formState.isSubmitting || isHydrating)
431
+ return;
432
+ void form.handleSubmit(onSubmit, onInvalid)();
433
+ }, { description: isNew ? t('common:create') : t('common:save') });
434
+ if (!resource)
435
+ return <div className="p-6">{t('common:loading')}</div>;
436
+ // When editing an existing record that failed to load (e.g. 404), bail out
437
+ // before rendering the form — there's nothing to edit.
438
+ if (!isNew && existing.isError) {
439
+ const { status, message } = parseApiError(existing.error);
440
+ const title = status === 404
441
+ ? t('errors:notFound')
442
+ : status === 403
443
+ ? t('errors:forbidden')
444
+ : t('errors:server');
445
+ return (<div className="flex min-h-full flex-col gap-4">
446
+ <PageBreadcrumbs items={[
447
+ homeCrumb(t('common:home')),
448
+ { label: resource.name, to: { name: 'list', resourceId } },
449
+ { label: recordId ?? '' },
450
+ ]}/>
451
+ <Card>
452
+ <CardHeader className="flex flex-row items-center justify-between gap-3">
453
+ <CardTitle className="truncate">
454
+ {resource.name} #{recordId}
455
+ </CardTitle>
456
+ <Link to={{ name: 'list', resourceId }}>
457
+ <Button variant="ghost" size="sm">
458
+ {t('common:back')}
459
+ </Button>
460
+ </Link>
461
+ </CardHeader>
462
+ <CardContent>
463
+ <div className="flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15">
464
+ <AlertCircle className="mt-0.5 size-5 shrink-0 text-destructive"/>
465
+ <div className="space-y-1 text-sm">
466
+ <p className="font-semibold text-destructive">{title}</p>
467
+ <p className="text-destructive/90">{message}</p>
468
+ </div>
469
+ </div>
470
+ </CardContent>
471
+ </Card>
472
+ </div>);
473
+ }
474
+ const modLabel = getModKeyLabel();
475
+ const recordLabel = existing.data?.record.title || recordId;
476
+ const crumbs = [
477
+ homeCrumb(t('common:home')),
478
+ { label: resource.name, to: { name: 'list', resourceId } },
479
+ ...(isNew
480
+ ? [{ label: t('common:new') }]
481
+ : [
482
+ {
483
+ label: recordLabel ?? '',
484
+ to: { name: 'show', resourceId, recordId: recordId },
485
+ },
486
+ { label: t('common:edit') },
487
+ ]),
488
+ ];
489
+ return (<div className="flex min-h-full flex-col gap-4">
490
+ <PageBreadcrumbs items={crumbs}/>
491
+ <Card className="flex-1">
492
+ <CardHeader className="flex flex-row items-center justify-between gap-3">
493
+ <CardTitle className="truncate">
494
+ {isNew
495
+ ? t('common:newRecord', { name: resource.name })
496
+ : t('common:editRecord', { name: resource.name, id: recordId ?? '' })}
497
+ </CardTitle>
498
+ <div className="flex shrink-0 gap-2">
499
+ {aiFillEnabled && (<Button type="button" variant="outline" size="sm" disabled={form.formState.isSubmitting || isHydrating} onClick={() => setAiFillOpen(true)}>
500
+ <Sparkles className="size-4"/>
501
+ <span className="hidden sm:inline">{t('aiFill:button')}</span>
502
+ </Button>)}
503
+ {!isNew && (<>
504
+ {features.history && (<RevisionsButton resourceId={resourceId} recordId={recordId}/>)}
505
+ <Link to={{ name: 'show', resourceId, recordId: recordId }}>
506
+ <Button variant="outline" size="sm" aria-label={t('common:show')}>
507
+ <Eye className="size-4"/>
508
+ <span className="hidden sm:inline">{t('common:show')}</span>
509
+ </Button>
510
+ </Link>
511
+ <Button variant="destructive" size="sm" disabled={remove.isPending || form.formState.isSubmitting || isHydrating} onClick={() => void handleDelete()} aria-label={t('common:delete')}>
512
+ <Trash2 className="size-4"/>
513
+ <span className="hidden sm:inline">{t('common:delete')}</span>
514
+ </Button>
515
+ </>)}
516
+ </div>
517
+ </CardHeader>
518
+ <Form {...form}>
519
+ <form id="edit-record-form" onSubmit={form.handleSubmit(onSubmit, onInvalid)}>
520
+ <CardContent className="gap-4 pb-6 [column-fill:_balance] md:columns-2">
521
+ {editable.map((property) => (<ConditionalField key={property.path} control={form.control} property={property}>
522
+ <FormField control={form.control} name={property.path} render={({ field, fieldState }) => (<Field data-invalid={fieldState.error ? true : undefined} className="mb-8 break-inside-avoid">
523
+ <FieldLabel htmlFor={field.name}>
524
+ {property.label}
525
+ {property.description ? (<InfoTooltip content={property.description} ariaLabel={property.description}/>) : null}
526
+ {property.isRequired && (<span className="ml-1 text-destructive">*</span>)}
527
+ </FieldLabel>
528
+ <PropertyEditor property={property} value={field.value} onChange={field.onChange} disabled={form.formState.isSubmitting} resourceId={resourceId}/>
529
+ {fieldState.error?.message && (<FieldError>{fieldState.error.message}</FieldError>)}
530
+ </Field>)}/>
531
+ </ConditionalField>))}
532
+ </CardContent>
533
+ </form>
534
+ </Form>
535
+ </Card>
536
+ {/* Sticky action bar — sibling of Card, same pattern as the list-page
537
+ paginator. Pinned to the viewport bottom while the user scrolls.
538
+ `form="edit-record-form"` ties the submit button to the <form> above
539
+ even though it's not a descendant of that element. */}
540
+ {aiFillOpen && (<AiFillDialog resourceId={resourceId} onClose={() => setAiFillOpen(false)} onFilled={applyAiFillValues}/>)}
541
+ <div className="sticky bottom-0 -mb-px z-20 -mx-2 border-t border-border bg-card px-2 py-3 pr-14 sm:-mx-6 sm:px-6 sm:pr-16">
542
+ <div className="flex items-center justify-between">
543
+ <div>
544
+ {submitError && (<span className="text-sm text-destructive">{submitError}</span>)}
545
+ </div>
546
+ <div className="flex gap-2">
547
+ <Button type="button" variant="ghost" onClick={() => navigate(isNew
548
+ ? { name: 'list', resourceId }
549
+ : { name: 'show', resourceId, recordId: recordId })} aria-label={t('common:cancel')}>
550
+ <X className="size-4"/>
551
+ <span className="hidden sm:inline">{t('common:cancel')}</span>
552
+ </Button>
553
+ <Tooltip>
554
+ <TooltipTrigger asChild>
555
+ <Button type="submit" form="edit-record-form" disabled={form.formState.isSubmitting || isHydrating} aria-label={isNew ? t('common:create') : t('common:save')}>
556
+ {isNew ? <Plus className="size-4"/> : <Save className="size-4"/>}
557
+ <span className="hidden sm:inline">
558
+ {isNew ? t('common:create') : t('common:save')}
559
+ </span>
560
+ </Button>
561
+ </TooltipTrigger>
562
+ <TooltipContent className="flex items-center gap-1.5">
563
+ <span>{isNew ? t('common:create') : t('common:save')}</span>
564
+ <span className="inline-flex items-center gap-0.5">
565
+ <Kbd>{modLabel}</Kbd>
566
+ <span className="text-muted-foreground">+</span>
567
+ <Kbd>S</Kbd>
568
+ </span>
569
+ </TooltipContent>
570
+ </Tooltip>
571
+ </div>
572
+ </div>
573
+ </div>
574
+ </div>);
575
+ }
576
+ function ConditionalField({ control, property, children, }) {
577
+ const rule = property.showWhen;
578
+ // useWatch with `name: undefined` would subscribe to every field, defeating
579
+ // the purpose. Always pass a string when there's no rule we still want a
580
+ // stable hook order, so we subscribe to the property's own path.
581
+ const watched = useWatch({ control, name: rule?.field ?? property.path });
582
+ if (!rule)
583
+ return <>{children}</>;
584
+ const visible = evaluateShowWhen(rule, { [rule.field]: watched });
585
+ if (!visible)
586
+ return null;
587
+ return <>{children}</>;
588
+ }
589
+ // Cheap structural equality for form values. Empty-ish primitives are treated
590
+ // as equal (`''` ≈ `null` ≈ `undefined`) so the persistence watcher does not
591
+ // store a draft for an untouched form whose defaults happen to be `''` vs
592
+ // `undefined`. Falls back to JSON stringify for objects/arrays.
593
+ function valuesEqual(a, b) {
594
+ if (a === b)
595
+ return true;
596
+ const aEmpty = a == null || a === '';
597
+ const bEmpty = b == null || b === '';
598
+ if (aEmpty && bEmpty)
599
+ return true;
600
+ if (aEmpty || bEmpty)
601
+ return false;
602
+ if (typeof a !== typeof b)
603
+ return false;
604
+ if (typeof a === 'object') {
605
+ try {
606
+ return JSON.stringify(a) === JSON.stringify(b);
607
+ }
608
+ catch {
609
+ return false;
610
+ }
611
+ }
612
+ return false;
613
+ }
614
+ //# sourceMappingURL=edit-page.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-page.jsx","sourceRoot":"","sources":["../../src/pages/edit-page.tsx"],"names":[],"mappings":"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"}