@donotdev/crud 0.0.6 → 0.0.7

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 (304) hide show
  1. package/README.md +18 -2
  2. package/dist/CrudService.d.ts +91 -8
  3. package/dist/CrudService.d.ts.map +1 -1
  4. package/dist/CrudService.js +1 -1
  5. package/dist/CrudStore.d.ts +45 -2
  6. package/dist/CrudStore.d.ts.map +1 -1
  7. package/dist/CrudStore.js +1 -1
  8. package/dist/FieldRegistry.d.ts +56 -20
  9. package/dist/FieldRegistry.d.ts.map +1 -1
  10. package/dist/FieldRegistry.js +1 -1
  11. package/dist/adapters/FirestoreAdapter.d.ts +4 -4
  12. package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
  13. package/dist/adapters/FirestoreAdapter.js +1 -1
  14. package/dist/adapters/FunctionsAdapter.d.ts +3 -2
  15. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  16. package/dist/adapters/FunctionsAdapter.js +1 -1
  17. package/dist/builtinFieldTypes.d.ts +4 -0
  18. package/dist/builtinFieldTypes.d.ts.map +1 -1
  19. package/dist/builtinFieldTypes.js +1 -1
  20. package/dist/components/CrudButton.d.ts +1 -1
  21. package/dist/components/CrudButton.d.ts.map +1 -1
  22. package/dist/components/CrudButton.js +1 -1
  23. package/dist/components/DisplayFieldRenderer.d.ts +15 -11
  24. package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
  25. package/dist/components/DisplayFieldRenderer.js +1 -1
  26. package/dist/components/EntityCardList.d.ts +27 -0
  27. package/dist/components/EntityCardList.d.ts.map +1 -0
  28. package/dist/components/EntityCardList.js +1 -0
  29. package/dist/components/EntityDisplayRenderer.d.ts +43 -0
  30. package/dist/components/EntityDisplayRenderer.d.ts.map +1 -0
  31. package/dist/components/EntityDisplayRenderer.js +1 -0
  32. package/dist/components/EntityFormRenderer.d.ts +21 -26
  33. package/dist/components/EntityFormRenderer.d.ts.map +1 -1
  34. package/dist/components/EntityFormRenderer.js +1 -5
  35. package/dist/components/EntityList.d.ts +24 -0
  36. package/dist/components/EntityList.d.ts.map +1 -0
  37. package/dist/components/EntityList.js +1 -0
  38. package/dist/components/FormFieldRenderer.d.ts +3 -10
  39. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  40. package/dist/components/FormFieldRenderer.js +1 -1
  41. package/dist/components/FormLayout.d.ts +1 -9
  42. package/dist/components/FormLayout.d.ts.map +1 -1
  43. package/dist/components/controlled/complex/ControlledAddressField.d.ts +8 -0
  44. package/dist/components/controlled/complex/ControlledAddressField.d.ts.map +1 -0
  45. package/dist/components/controlled/complex/ControlledAddressField.js +1 -0
  46. package/dist/components/controlled/complex/ControlledDateField.d.ts +8 -0
  47. package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -0
  48. package/dist/components/controlled/complex/ControlledDateField.js +1 -0
  49. package/dist/components/controlled/complex/ControlledGeoPointField.d.ts +8 -0
  50. package/dist/components/controlled/complex/ControlledGeoPointField.d.ts.map +1 -0
  51. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -0
  52. package/dist/components/controlled/complex/ControlledMapField.d.ts +8 -0
  53. package/dist/components/controlled/complex/ControlledMapField.d.ts.map +1 -0
  54. package/dist/components/controlled/complex/ControlledMapField.js +1 -0
  55. package/dist/components/controlled/complex/ControlledMultiInputField.d.ts +8 -0
  56. package/dist/components/controlled/complex/ControlledMultiInputField.d.ts.map +1 -0
  57. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -0
  58. package/dist/components/controlled/complex/ControlledRichTextField.d.ts +8 -0
  59. package/dist/components/controlled/complex/ControlledRichTextField.d.ts.map +1 -0
  60. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -0
  61. package/dist/components/controlled/complex/ControlledTimestampField.d.ts +8 -0
  62. package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -0
  63. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -0
  64. package/dist/components/controlled/complex/index.d.ts +8 -0
  65. package/dist/components/controlled/complex/index.d.ts.map +1 -0
  66. package/dist/components/controlled/complex/index.js +1 -0
  67. package/dist/components/controlled/file/ControlledDocumentField.d.ts +8 -0
  68. package/dist/components/controlled/file/ControlledDocumentField.d.ts.map +1 -0
  69. package/dist/components/controlled/file/ControlledDocumentField.js +1 -0
  70. package/dist/components/controlled/file/ControlledFileField.d.ts +8 -0
  71. package/dist/components/controlled/file/ControlledFileField.d.ts.map +1 -0
  72. package/dist/components/controlled/file/ControlledFileField.js +1 -0
  73. package/dist/components/controlled/file/ControlledImageField.d.ts +8 -0
  74. package/dist/components/controlled/file/ControlledImageField.d.ts.map +1 -0
  75. package/dist/components/controlled/file/ControlledImageField.js +1 -0
  76. package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts +8 -0
  77. package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts.map +1 -0
  78. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -0
  79. package/dist/components/controlled/file/ControlledMultiFileField.d.ts +8 -0
  80. package/dist/components/controlled/file/ControlledMultiFileField.d.ts.map +1 -0
  81. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -0
  82. package/dist/components/controlled/file/ControlledMultiImageField.d.ts +8 -0
  83. package/dist/components/controlled/file/ControlledMultiImageField.d.ts.map +1 -0
  84. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -0
  85. package/dist/components/controlled/file/index.d.ts +7 -0
  86. package/dist/components/controlled/file/index.d.ts.map +1 -0
  87. package/dist/components/controlled/file/index.js +1 -0
  88. package/dist/components/controlled/index.d.ts +12 -0
  89. package/dist/components/controlled/index.d.ts.map +1 -0
  90. package/dist/components/controlled/index.js +1 -0
  91. package/dist/components/controlled/input/ControlledCheckboxField.d.ts +8 -0
  92. package/dist/components/controlled/input/ControlledCheckboxField.d.ts.map +1 -0
  93. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -0
  94. package/dist/components/controlled/input/ControlledNumberField.d.ts +8 -0
  95. package/dist/components/controlled/input/ControlledNumberField.d.ts.map +1 -0
  96. package/dist/components/controlled/input/ControlledNumberField.js +1 -0
  97. package/dist/components/controlled/input/ControlledPasswordField.d.ts +8 -0
  98. package/dist/components/controlled/input/ControlledPasswordField.d.ts.map +1 -0
  99. package/dist/components/controlled/input/ControlledPasswordField.js +1 -0
  100. package/dist/components/controlled/input/ControlledPhoneField.d.ts +8 -0
  101. package/dist/components/controlled/input/ControlledPhoneField.d.ts.map +1 -0
  102. package/dist/components/controlled/input/ControlledPhoneField.js +1 -0
  103. package/dist/components/controlled/input/ControlledRangeField.d.ts +8 -0
  104. package/dist/components/controlled/input/ControlledRangeField.d.ts.map +1 -0
  105. package/dist/components/controlled/input/ControlledRangeField.js +1 -0
  106. package/dist/components/controlled/input/ControlledSwitchField.d.ts +8 -0
  107. package/dist/components/controlled/input/ControlledSwitchField.d.ts.map +1 -0
  108. package/dist/components/controlled/input/ControlledSwitchField.js +1 -0
  109. package/dist/components/controlled/input/ControlledTextField.d.ts +8 -0
  110. package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -0
  111. package/dist/components/controlled/input/ControlledTextField.js +1 -0
  112. package/dist/components/controlled/input/ControlledTextareaField.d.ts +8 -0
  113. package/dist/components/controlled/input/ControlledTextareaField.d.ts.map +1 -0
  114. package/dist/components/controlled/input/ControlledTextareaField.js +1 -0
  115. package/dist/components/controlled/input/index.d.ts +9 -0
  116. package/dist/components/controlled/input/index.d.ts.map +1 -0
  117. package/dist/components/controlled/input/index.js +1 -0
  118. package/dist/components/controlled/select/ControlledComboboxField.d.ts +9 -0
  119. package/dist/components/controlled/select/ControlledComboboxField.d.ts.map +1 -0
  120. package/dist/components/controlled/select/ControlledComboboxField.js +1 -0
  121. package/dist/components/controlled/select/ControlledDropdownField.d.ts +9 -0
  122. package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -0
  123. package/dist/components/controlled/select/ControlledDropdownField.js +1 -0
  124. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +9 -0
  125. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -0
  126. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -0
  127. package/dist/components/controlled/select/ControlledRadioField.d.ts +9 -0
  128. package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -0
  129. package/dist/components/controlled/select/ControlledRadioField.js +1 -0
  130. package/dist/components/controlled/select/index.d.ts +5 -0
  131. package/dist/components/controlled/select/index.d.ts.map +1 -0
  132. package/dist/components/controlled/select/index.js +1 -0
  133. package/dist/components/controlled/types.d.ts +23 -0
  134. package/dist/components/controlled/types.d.ts.map +1 -0
  135. package/dist/components/controlled/types.js +1 -0
  136. package/dist/components/form/fields/AddressFieldComponent.d.ts.map +1 -1
  137. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  138. package/dist/components/form/fields/AvatarFieldComponent.d.ts +2 -2
  139. package/dist/components/form/fields/BadgeFieldComponent.d.ts +2 -2
  140. package/dist/components/form/fields/ButtonFieldComponent.d.ts +1 -9
  141. package/dist/components/form/fields/ButtonFieldComponent.d.ts.map +1 -1
  142. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  143. package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
  144. package/dist/components/form/fields/CurrencyFieldComponent.d.ts +1 -9
  145. package/dist/components/form/fields/CurrencyFieldComponent.d.ts.map +1 -1
  146. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  147. package/dist/components/form/fields/DateFieldComponent.d.ts.map +1 -1
  148. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  149. package/dist/components/form/fields/DocumentFieldComponent.d.ts +47 -0
  150. package/dist/components/form/fields/DocumentFieldComponent.d.ts.map +1 -0
  151. package/dist/components/form/fields/DocumentFieldComponent.js +1 -0
  152. package/dist/components/form/fields/DropdownComponent.d.ts.map +1 -1
  153. package/dist/components/form/fields/DropdownComponent.js +1 -1
  154. package/dist/components/form/fields/FileFieldComponent.d.ts +31 -15
  155. package/dist/components/form/fields/FileFieldComponent.d.ts.map +1 -1
  156. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  157. package/dist/components/form/fields/GeoPointFieldComponent.d.ts.map +1 -1
  158. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  159. package/dist/components/form/fields/HiddenFieldComponent.d.ts +1 -1
  160. package/dist/components/form/fields/HiddenFieldComponent.d.ts.map +1 -1
  161. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  162. package/dist/components/form/fields/ImageFieldComponent.d.ts +8 -14
  163. package/dist/components/form/fields/ImageFieldComponent.d.ts.map +1 -1
  164. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  165. package/dist/components/form/fields/MapFieldComponent.d.ts.map +1 -1
  166. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  167. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  168. package/dist/components/form/fields/MultiInputTextFieldComponent.d.ts +1 -9
  169. package/dist/components/form/fields/MultiInputTextFieldComponent.d.ts.map +1 -1
  170. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  171. package/dist/components/form/fields/NumberFieldComponent.d.ts +2 -0
  172. package/dist/components/form/fields/NumberFieldComponent.d.ts.map +1 -1
  173. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  174. package/dist/components/form/fields/PasswordFieldComponent.d.ts +1 -9
  175. package/dist/components/form/fields/PasswordFieldComponent.d.ts.map +1 -1
  176. package/dist/components/form/fields/PhoneNumberComponent.d.ts +1 -9
  177. package/dist/components/form/fields/PhoneNumberComponent.d.ts.map +1 -1
  178. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  179. package/dist/components/form/fields/RadioFieldComponent.d.ts +1 -9
  180. package/dist/components/form/fields/RadioFieldComponent.d.ts.map +1 -1
  181. package/dist/components/form/fields/ReferenceFieldComponent.d.ts +33 -12
  182. package/dist/components/form/fields/ReferenceFieldComponent.d.ts.map +1 -1
  183. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  184. package/dist/components/form/fields/RichTextComponent.d.ts +32 -0
  185. package/dist/components/form/fields/RichTextComponent.d.ts.map +1 -0
  186. package/dist/components/form/fields/RichTextComponent.js +1 -0
  187. package/dist/components/form/fields/SwitchFieldComponent.d.ts.map +1 -1
  188. package/dist/components/form/fields/TextAreaComponent.d.ts +1 -9
  189. package/dist/components/form/fields/TextAreaComponent.d.ts.map +1 -1
  190. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  191. package/dist/components/form/fields/TextFieldComponent.d.ts +1 -9
  192. package/dist/components/form/fields/TextFieldComponent.d.ts.map +1 -1
  193. package/dist/components/form/fields/index.d.ts +4 -2
  194. package/dist/components/form/fields/index.d.ts.map +1 -1
  195. package/dist/components/form/fields/index.js +1 -1
  196. package/dist/components/form/fields/internal/TiptapEditor.d.ts +13 -0
  197. package/dist/components/form/fields/internal/TiptapEditor.d.ts.map +1 -0
  198. package/dist/components/form/fields/internal/TiptapEditor.js +52 -0
  199. package/dist/components/form/index.d.ts +10 -0
  200. package/dist/components/form/index.d.ts.map +1 -0
  201. package/dist/components/form/index.js +1 -0
  202. package/dist/components/form/internal/ImageViewerDialog.d.ts +1 -1
  203. package/dist/components/form/internal/ImageViewerDialog.d.ts.map +1 -1
  204. package/dist/components/index.d.ts +8 -2
  205. package/dist/components/index.d.ts.map +1 -1
  206. package/dist/components/index.js +1 -1
  207. package/dist/contexts/UploadContext.d.ts +16 -0
  208. package/dist/contexts/UploadContext.d.ts.map +1 -0
  209. package/dist/contexts/UploadContext.js +1 -0
  210. package/dist/contexts/index.d.ts +3 -0
  211. package/dist/contexts/index.d.ts.map +1 -0
  212. package/dist/contexts/index.js +1 -0
  213. package/dist/forms/hooks/index.d.ts +2 -0
  214. package/dist/forms/hooks/index.d.ts.map +1 -1
  215. package/dist/forms/hooks/index.js +1 -1
  216. package/dist/forms/hooks/useController.d.ts +29 -0
  217. package/dist/forms/hooks/useController.d.ts.map +1 -0
  218. package/dist/forms/hooks/useController.js +1 -0
  219. package/dist/forms/hooks/useEntityField.d.ts.map +1 -1
  220. package/dist/forms/hooks/useEntityField.js +1 -1
  221. package/dist/forms/hooks/useEntityForm.d.ts +8 -76
  222. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  223. package/dist/forms/hooks/useEntityForm.js +1 -1
  224. package/dist/forms/index.d.ts +6 -4
  225. package/dist/forms/index.d.ts.map +1 -1
  226. package/dist/forms/index.js +1 -1
  227. package/dist/forms/types.d.ts +31 -5
  228. package/dist/forms/types.d.ts.map +1 -1
  229. package/dist/forms/utils/getFieldsForOperation.d.ts +5 -5
  230. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  231. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  232. package/dist/forms/utils/index.d.ts +9 -5
  233. package/dist/forms/utils/index.d.ts.map +1 -1
  234. package/dist/forms/utils/index.js +1 -1
  235. package/dist/forms/utils/isFieldEditable.d.ts +0 -8
  236. package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
  237. package/dist/forms/utils/optionHelpers.d.ts +54 -0
  238. package/dist/forms/utils/optionHelpers.d.ts.map +1 -0
  239. package/dist/forms/utils/optionHelpers.js +1 -0
  240. package/dist/forms/utils/translateFieldLabel.d.ts +70 -0
  241. package/dist/forms/utils/translateFieldLabel.d.ts.map +1 -0
  242. package/dist/forms/utils/translateFieldLabel.js +1 -0
  243. package/dist/forms/utils/validateEntity.d.ts +5 -2
  244. package/dist/forms/utils/validateEntity.d.ts.map +1 -1
  245. package/dist/forms/utils/validateEntity.js +1 -1
  246. package/dist/hooks/index.d.ts +3 -0
  247. package/dist/hooks/index.d.ts.map +1 -0
  248. package/dist/hooks/index.js +1 -0
  249. package/dist/hooks/useFileUpload.d.ts +67 -0
  250. package/dist/hooks/useFileUpload.d.ts.map +1 -0
  251. package/dist/hooks/useFileUpload.js +1 -0
  252. package/dist/index.d.ts +15 -5
  253. package/dist/index.d.ts.map +1 -1
  254. package/dist/index.js +1 -1
  255. package/dist/stores/FormStore.d.ts +78 -0
  256. package/dist/stores/FormStore.d.ts.map +1 -0
  257. package/dist/stores/FormStore.js +1 -0
  258. package/dist/stores/UploadStore.d.ts +105 -0
  259. package/dist/stores/UploadStore.d.ts.map +1 -0
  260. package/dist/stores/UploadStore.js +1 -0
  261. package/dist/stores/index.d.ts +11 -0
  262. package/dist/stores/index.d.ts.map +1 -0
  263. package/dist/stores/index.js +1 -0
  264. package/dist/tsconfig.tsbuildinfo +1 -1
  265. package/dist/useCrud.d.ts +32 -74
  266. package/dist/useCrud.d.ts.map +1 -1
  267. package/dist/useCrud.js +1 -1
  268. package/dist/useCrudCardList.d.ts +62 -0
  269. package/dist/useCrudCardList.d.ts.map +1 -0
  270. package/dist/useCrudCardList.js +1 -0
  271. package/dist/useCrudList.d.ts +61 -0
  272. package/dist/useCrudList.d.ts.map +1 -0
  273. package/dist/useCrudList.js +1 -0
  274. package/dist/utils/fileStorage.d.ts +58 -0
  275. package/dist/utils/fileStorage.d.ts.map +1 -0
  276. package/dist/utils/fileStorage.js +1 -0
  277. package/dist/utils/imageProcessing.d.ts +1 -1
  278. package/dist/utils/imageProcessing.d.ts.map +1 -1
  279. package/dist/utils/imageProcessing.js +1 -1
  280. package/dist/utils/imageStorage.d.ts +1 -10
  281. package/dist/utils/imageStorage.d.ts.map +1 -1
  282. package/dist/utils/imageStorage.js +1 -1
  283. package/dist/utils/mergeWithOptimistic.d.ts +27 -0
  284. package/dist/utils/mergeWithOptimistic.d.ts.map +1 -0
  285. package/dist/utils/mergeWithOptimistic.js +1 -0
  286. package/dist/utils/uploadValidation.d.ts +37 -0
  287. package/dist/utils/uploadValidation.d.ts.map +1 -0
  288. package/dist/utils/uploadValidation.js +1 -0
  289. package/package.json +22 -5
  290. package/dist/components/ControlledFields.d.ts +0 -49
  291. package/dist/components/ControlledFields.d.ts.map +0 -1
  292. package/dist/components/ControlledFields.js +0 -1
  293. package/dist/context/FormUploadContext.d.ts +0 -36
  294. package/dist/context/FormUploadContext.d.ts.map +0 -1
  295. package/dist/context/FormUploadContext.js +0 -1
  296. package/dist/context/index.d.ts +0 -2
  297. package/dist/context/index.d.ts.map +0 -1
  298. package/dist/context/index.js +0 -1
  299. package/dist/forms/utils/createEntitySchema.d.ts +0 -53
  300. package/dist/forms/utils/createEntitySchema.d.ts.map +0 -1
  301. package/dist/forms/utils/createEntitySchema.js +0 -1
  302. package/dist/forms/utils/normalizeToFieldConfig.d.ts +0 -47
  303. package/dist/forms/utils/normalizeToFieldConfig.d.ts.map +0 -1
  304. package/dist/forms/utils/normalizeToFieldConfig.js +0 -1
@@ -1,5 +1,9 @@
1
1
  /**
2
2
  * Register built-in field types (UI components only)
3
+ *
4
+ * **Note for Consumers:**
5
+ * This function demonstrates the registration pattern. For your own custom field types,
6
+ * use `registerFieldType()` from `@donotdev/crud` instead. See SETUP_CRUD.md for examples.
3
7
  */
4
8
  export declare function registerBuiltinFieldTypes(): void;
5
9
  //# sourceMappingURL=builtinFieldTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtinFieldTypes.d.ts","sourceRoot":"","sources":["../src/builtinFieldTypes.tsx"],"names":[],"mappings":"AAmJA;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAiGhD"}
1
+ {"version":3,"file":"builtinFieldTypes.d.ts","sourceRoot":"","sources":["../src/builtinFieldTypes.tsx"],"names":[],"mappings":"AAyKA;;;;;;GAMG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAyGhD"}
@@ -1 +1 @@
1
- "use client";import{jsx as s}from"react/jsx-runtime";import{getFieldRegistry as u}from"./FieldRegistry";import{ControlledCheckboxField as g,ControlledComboboxField as F,ControlledDateField as a,ControlledDropdownField as f,ControlledFileField as b,ControlledGeoPointField as h,ControlledImageField as x,ControlledMapField as v,ControlledMultiDropdownField as T,ControlledMultiInputField as w,ControlledNumberField as y,ControlledPasswordField as U,ControlledPhoneField as k,ControlledRangeField as R,ControlledRadioField as A,ControlledReferenceField as B,ControlledTextField as i,ControlledTextareaField as M,ControlledTimestampField as D,ControlledAddressField as I,ControlledSwitchField as P,ControlledMultiImageField as j}from"./components/ControlledFields";import{AvatarFieldComponent as H,BadgeFieldComponent as S,ButtonFieldComponent as p,HiddenFieldComponent as G,TextAreaComponent as N,TextFieldComponent as _}from"./components/form/fields";const q=e=>{const{name:t,value:o,onChange:r,error:n,t:d,config:l,...C}=e;return s(H,{config:l,value:o,onChange:r,error:!!n,helperText:n||void 0,t:d,...l.options,...C})},z=e=>{const{name:t,value:o,onChange:r,error:n,t:d,config:l,...C}=e;return s(S,{config:l,value:o,onChange:r,error:!!n,helperText:n||void 0,t:d,...l.options,...C})},E=e=>{const{name:t,label:o,onChange:r,config:n}=e;return s(p,{label:o||t,type:"submit",onClick:()=>r(void 0),...n.options})},J=e=>{const{name:t,label:o,onChange:r,config:n}=e;return s(p,{label:o||t,type:"reset",onClick:()=>r(void 0),...n.options})},K=e=>{const{name:t,value:o}=e;return s(G,{name:t,value:o})},L=e=>{const{name:t,label:o,value:r,onChange:n,error:d,config:l}=e;return s(N,{label:o||t,value:r,onChange:n,error:d||void 0,...l.options})},m=e=>{const{name:t,label:o,value:r,onChange:n,error:d,config:l}=e;return s(_,{label:o||t,value:r,onChange:n,error:d||void 0,...l.options})};let c=!1;function O(){if(c)return;c=!0;const e=u();e.registerComponent("text",i,m),e.registerComponent("email",i,m),e.registerComponent("url",i,m),e.registerComponent("color",i,m),e.registerComponent("textarea",M,L),e.registerComponent("password",U),e.registerComponent("number",y),e.registerComponent("range",R),e.registerComponent("boolean",g),e.registerComponent("checkbox",g),e.registerComponent("switch",P),e.registerComponent("date",a),e.registerComponent("datetime-local",a),e.registerComponent("time",a),e.registerComponent("week",a),e.registerComponent("month",a),e.registerComponent("timestamp",D),e.registerComponent("file",b),e.registerComponent("image",x),e.registerComponent("images",j),e.registerComponent("geopoint",h),e.registerComponent("address",I),e.registerComponent("map",v),e.registerComponent("array",w),e.registerComponent("select",f),e.registerComponent("combobox",F),e.registerComponent("multiselect",T),e.registerComponent("radio",A),e.registerComponent("reference",B),e.registerComponent("tel",k),e.registerComponent("avatar",i,q),e.registerComponent("badge",i,z),e.registerComponent("hidden",i,K),e.registerComponent("submit",i,E),e.registerComponent("reset",i,J)}typeof window<"u"&&O();export{O as registerBuiltinFieldTypes};
1
+ "use client";import{jsx as s}from"react/jsx-runtime";import{ControlledCheckboxField as g,ControlledComboboxField as u,ControlledDateField as m,ControlledDropdownField as F,ControlledFileField as f,ControlledMultiFileField as h,ControlledDocumentField as b,ControlledMultiDocumentField as x,ControlledGeoPointField as v,ControlledImageField as T,ControlledMapField as U,ControlledMultiDropdownField as w,ControlledMultiInputField as R,ControlledNumberField as y,ControlledPasswordField as M,ControlledPhoneField as k,ControlledRangeField as D,ControlledRadioField as A,ControlledTextField as d,ControlledTextareaField as B,ControlledRichTextField as I,ControlledTimestampField as P,ControlledAddressField as j,ControlledSwitchField as H,ControlledMultiImageField as S}from"./components/controlled";import{AvatarFieldComponent as G,BadgeFieldComponent as N,ButtonFieldComponent as p,HiddenFieldComponent as _,TextAreaComponent as q,RichTextComponent as z,TextFieldComponent as E}from"./components/form/fields";import{getFieldRegistry as J}from"./FieldRegistry";const K=e=>{const{name:t,value:o,onChange:r,error:n,t:i,config:l,...a}=e;return s(G,{config:l,value:o,onChange:r,error:!!n,helperText:n||void 0,t:i,...l.options,...a})},L=e=>{const{name:t,value:o,onChange:r,error:n,t:i,config:l,...a}=e;return s(N,{config:l,value:o,onChange:r,error:!!n,helperText:n||void 0,t:i,...l.options,...a})},O=e=>{const{name:t,label:o,onChange:r,config:n}=e;return s(p,{label:o||t,type:"submit",onClick:()=>r(void 0),...n.options})},Q=e=>{const{name:t,label:o,onChange:r,config:n}=e;return s(p,{label:o||t,type:"reset",onClick:()=>r(void 0),...n.options})},V=e=>{const{name:t,value:o}=e;return s(_,{name:t,value:o})},W=e=>{const{name:t,label:o,value:r,onChange:n,error:i,config:l}=e;return s(q,{label:o||t,value:r,onChange:n,error:i||void 0,...l.options})},X=e=>{const{name:t,label:o,value:r,onChange:n,error:i,config:l}=e;return s(z,{label:o||t,value:r,onChange:n,error:i||void 0,...l.options})},C=e=>{const{name:t,label:o,value:r,onChange:n,error:i,config:l}=e;return s(E,{label:o||t,value:r,onChange:n,error:i||void 0,...l.options})};let c=!1;function Y(){if(c)return;c=!0;const e=J();e.registerComponent("text",d,C),e.registerComponent("email",d,C),e.registerComponent("url",d,C),e.registerComponent("color",d,C),e.registerComponent("textarea",B,W),e.registerComponent("richtext",I,X),e.registerComponent("password",M),e.registerComponent("number",y),e.registerComponent("range",D),e.registerComponent("boolean",g),e.registerComponent("checkbox",g),e.registerComponent("switch",H),e.registerComponent("date",m),e.registerComponent("datetime-local",m),e.registerComponent("time",m),e.registerComponent("week",m),e.registerComponent("month",m),e.registerComponent("timestamp",P),e.registerComponent("file",f),e.registerComponent("files",h),e.registerComponent("document",b),e.registerComponent("documents",x),e.registerComponent("image",T),e.registerComponent("images",S),e.registerComponent("geopoint",v),e.registerComponent("address",j),e.registerComponent("map",U),e.registerComponent("array",R),e.registerComponent("select",F),e.registerComponent("combobox",u),e.registerComponent("multiselect",w),e.registerComponent("radio",A),e.registerComponent("tel",k),e.registerComponent("avatar",d,K),e.registerComponent("badge",d,L),e.registerComponent("hidden",d,V),e.registerComponent("submit",d,O),e.registerComponent("reset",d,Q)}Y();export{Y as registerBuiltinFieldTypes};
@@ -34,7 +34,7 @@ export interface CrudButtonProps<T = unknown> extends Omit<ActionButtonProps<T>,
34
34
  *
35
35
  * @example
36
36
  * ```tsx
37
- * const { delete: deleteItem } = useCrud('items', { schema });
37
+ * const { delete: deleteItem } = useCrud(itemEntity);
38
38
  * const user = useAuth('user');
39
39
  *
40
40
  * <CrudButton
@@ -1 +1 @@
1
- {"version":3,"file":"CrudButton.d.ts","sourceRoot":"","sources":["../../src/components/CrudButton.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,IAAI,CACxD,iBAAiB,CAAC,CAAC,CAAC,EACpB,UAAU,CACX;IACC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,iBAAS,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,EAC/B,YAAmB,EACnB,IAAI,EACJ,QAAgB,EAChB,QAAQ,EACR,GAAG,iBAAiB,EACrB,EAAE,eAAe,CAAC,CAAC,CAAC,2CAYpB;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"CrudButton.d.ts","sourceRoot":"","sources":["../../src/components/CrudButton.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,IAAI,CACxD,iBAAiB,CAAC,CAAC,CAAC,EACpB,UAAU,CACX;IACC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,iBAAS,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,EAC/B,YAAmB,EACnB,IAAI,EACJ,QAAgB,EAChB,QAAQ,EACR,GAAG,iBAAiB,EACrB,EAAE,eAAe,CAAC,CAAC,CAAC,2CAYpB;AAED,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as l}from"react/jsx-runtime";import{ActionButton as a}from"@donotdev/components";import{useCrud as n}from"../useCrud";function u({requiresAuth:i=!0,user:t,disabled:s=!1,children:e,...o}){const r=n("isAvailable");return l(a,{...o,disabled:s||!r||i&&!t,children:e})}var b=u;export{b as default};
1
+ "use client";import{jsx as n}from"react/jsx-runtime";import{ActionButton as d}from"@donotdev/components";import{useCrudStore as l}from"../CrudStore";function a({requiresAuth:t=!0,user:e,disabled:r=!1,children:i,...o}){const s=l(u=>!!u.crudService);return n(d,{...o,disabled:r||!s||t&&!e,children:i})}var p=a;export{p as default};
@@ -1,24 +1,28 @@
1
- /**
2
- * @fileoverview DisplayFieldRenderer component
3
- * @description Renders field values as read-only display (not editable inputs)
4
- * Used when editable=false or user doesn't have edit permissions
5
- *
6
- * @version 0.0.1
7
- * @since 0.0.1
8
- * @author AMBROISE PARK Consulting
9
- */
1
+ import type { FieldType, EntityField } from '@donotdev/core';
10
2
  import type { ReactElement } from 'react';
11
- import type { FieldConfig, FieldType } from '@donotdev/core';
12
3
  export interface DisplayFieldRendererProps<T extends FieldType = FieldType> {
13
4
  /** Field identifier */
14
5
  name: string;
15
6
  /** Field configuration */
16
- config: FieldConfig<T>;
7
+ config: EntityField<T>;
17
8
  /** Current field value */
18
9
  value: any;
19
10
  /** Translation function */
20
11
  t: (key: string, options?: Record<string, any>) => string;
21
12
  }
13
+ /**
14
+ * Formats a value for display based on field type
15
+ *
16
+ * @param value - Field value to format
17
+ * @param config - Field configuration
18
+ * @param t - Translation function
19
+ * @param options - Formatting options
20
+ * @param options.compact - Use compact formatting (smaller images, plain spans for empty)
21
+ * @returns Formatted value as string or ReactElement
22
+ */
23
+ export declare function formatValue(value: any, config: EntityField, t: (key: string, options?: Record<string, any>) => string, options?: {
24
+ compact?: boolean;
25
+ }): string | ReactElement;
22
26
  /**
23
27
  * DisplayFieldRenderer - Renders a field value as read-only display
24
28
  *
@@ -1 +1 @@
1
- {"version":3,"file":"DisplayFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/DisplayFieldRenderer.tsx"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACxE,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,2BAA2B;IAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAkND;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,EACpE,IAAI,EACJ,MAAM,EACN,KAAK,EACL,CAAC,GACF,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,YAAY,CAqC7C;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"DisplayFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/DisplayFieldRenderer.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACxE,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,2BAA2B;IAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,WAAW,EACnB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,EACzD,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,MAAM,GAAG,YAAY,CAoYvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,EACpE,IAAI,EACJ,MAAM,EACN,KAAK,EACL,CAAC,GACF,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,YAAY,CAyC7C;AAED,eAAe,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as t,jsxs as o}from"react/jsx-runtime";import{Text as n,Stack as c}from"@donotdev/components";function m(r,a){if(r==null||r==="")return t(n,{variant:"muted",children:"\u2014"});switch(a.type){case"timestamp":case"date":case"datetime-local":try{const e=r instanceof Date?r:new Date(r);return a.type==="date"?e.toLocaleDateString():e.toLocaleString()}catch{return String(r)}case"boolean":case"checkbox":return r?"Yes":"No";case"number":case"range":return typeof r=="number"?r.toLocaleString():String(r);case"select":case"radio":const d=a.validation?.options;return Array.isArray(d)&&d.find(i=>i.value===r)?.label||String(r);case"multiselect":if(Array.isArray(r)){const e=a.validation?.options;if(Array.isArray(e))return r.map(s=>e.find(l=>l.value===s)?.label||s).join(", ")}return String(r);case"image":return typeof r=="string"?t("img",{src:r,alt:a.label,style:{maxWidth:"200px",maxHeight:"150px",objectFit:"cover",borderRadius:"var(--radius-md)"}}):Array.isArray(r)?o(c,{direction:"row",gap:"tight",style:{flexWrap:"wrap"},children:[r.slice(0,4).map((e,i)=>{const s=typeof e=="object"&&e.thumbUrl?e.thumbUrl:e;return t("img",{src:s,alt:`${a.label} ${i+1}`,style:{width:"60px",height:"60px",objectFit:"cover",borderRadius:"var(--radius-sm)"}},i)}),r.length>4&&o(n,{variant:"muted",children:["+",r.length-4," more"]})]}):t(n,{variant:"muted",children:"\u2014"});case"file":return typeof r=="string"?t("a",{href:r,target:"_blank",rel:"noopener noreferrer",children:"View file"}):t(n,{variant:"muted",children:"\u2014"});case"reference":return String(r);case"geopoint":return r&&typeof r=="object"&&"lat"in r&&"lng"in r?`${r.lat.toFixed(6)}, ${r.lng.toFixed(6)}`:t(n,{variant:"muted",children:"\u2014"});case"address":return r&&typeof r=="object"&&"formatted_address"in r?r.formatted_address:String(r);case"map":if(r&&typeof r=="object"){const e=Object.entries(r);return e.length===0?t(n,{variant:"muted",children:"\u2014"}):o(c,{direction:"column",gap:"tight",children:[e.slice(0,5).map(([i,s])=>o(n,{style:{fontSize:"var(--font-size-sm)"},children:[o("strong",{children:[i,":"]})," ",String(s)]},i)),e.length>5&&o(n,{variant:"muted",children:["+",e.length-5," more"]})]})}return t(n,{variant:"muted",children:"\u2014"});case"array":return Array.isArray(r)?r.length===0?t(n,{variant:"muted",children:"\u2014"}):r.join(", "):t(n,{variant:"muted",children:"\u2014"});case"password":return"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";case"email":return t("a",{href:`mailto:${r}`,style:{color:"var(--primary)"},children:r});case"tel":return t("a",{href:`tel:${r}`,style:{color:"var(--primary)"},children:r});case"url":return t("a",{href:r,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:r});case"color":return o(c,{direction:"row",gap:"tight",align:"center",children:[t("div",{style:{width:"20px",height:"20px",backgroundColor:r,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),t(n,{children:r})]});default:return String(r)}}function p({name:r,config:a,value:d,t:e}){const i=m(d,a);return o(c,{direction:"column",gap:"tight",style:{marginBottom:"var(--gap-sm)"},children:[t(n,{variant:"muted",style:{fontSize:"var(--font-size-sm)",fontWeight:500},children:a.label||r}),t("div",{style:{padding:"var(--gap-sm)",backgroundColor:"var(--muted)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",minHeight:"38px",display:"flex",alignItems:"center"},children:typeof i=="string"?t(n,{children:i}):i})]})}var y=p;export{p as DisplayFieldRenderer,y as default};
1
+ "use client";import{jsx as e,jsxs as o}from"react/jsx-runtime";import{Text as i,Stack as d}from"@donotdev/components";import{translateFieldLabel as y,translateLabel as g}from"../forms/utils";function b(r,c,l,m){const n=m?.compact??!1;if(r==null||r==="")return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});switch(c.type){case"timestamp":case"date":case"datetime-local":try{const t=r instanceof Date?r:new Date(r);return c.type==="date"?t.toLocaleDateString():t.toLocaleString()}catch{return String(r)}case"boolean":case"checkbox":return r?"Yes":"No";case"number":case"range":return typeof r=="number"?r.toLocaleString():String(r);case"select":case"radio":const p=c.validation?.options;if(Array.isArray(p)){const a=p.find(s=>s.value===r)?.label;return a?g(a,l):String(r)}return String(r);case"multiselect":if(Array.isArray(r)){const t=c.validation?.options;if(Array.isArray(t))return r.map(s=>{const h=t.find(u=>u.value===s)?.label;return h?g(h,l):s}).join(", ")}return String(r);case"image":case"images":if(typeof r=="string")return e("img",{src:r,alt:c.label||"",style:{width:n?"40px":void 0,height:n?"40px":void 0,maxWidth:n?void 0:"200px",maxHeight:n?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}});if(Array.isArray(r)&&r.length>0){const t=r[0],a=typeof t=="object"&&t.thumbUrl?t.thumbUrl:t;return n?o("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[e("img",{src:a,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),r.length>1&&o("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",r.length-1]})]}):o(d,{direction:"row",gap:"tight",style:{flexWrap:"wrap"},children:[r.slice(0,4).map((s,f)=>{const h=typeof s=="object"&&s.thumbUrl?s.thumbUrl:s;return e("img",{src:h,alt:`${c.label} ${f+1}`,style:{width:"60px",height:"60px",objectFit:"cover",borderRadius:"var(--radius-sm)"}},f)}),r.length>4&&o(i,{variant:"muted",children:["+",r.length-4," more"]})]})}return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"files":case"documents":return Array.isArray(r)?r.length===0?n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"}):e(d,{gap:"tight",children:r.map((t,a)=>o("a",{href:t.url||t,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[t.filename||`File ${a+1}`,t.size&&o(i,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(t.size/1024)," KB)"]})]},a))}):n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"file":case"document":if(r){const t=typeof r=="string"?r:r.url,a=typeof r=="string"?"View file":r.filename||"View file";return o("a",{href:t,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,typeof r=="object"&&r.size&&o("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(r.size/1024)," KB)"]})]})}return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"reference":return String(r);case"geopoint":return r&&typeof r=="object"&&"lat"in r&&"lng"in r?`${r.lat.toFixed(6)}, ${r.lng.toFixed(6)}`:n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"address":return r&&typeof r=="object"&&"formatted_address"in r?r.formatted_address:String(r);case"map":if(r&&typeof r=="object"){const t=Object.entries(r);return t.length===0?n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"}):o(d,{direction:"column",gap:"tight",children:[t.slice(0,5).map(([a,s])=>o(i,{style:{fontSize:"var(--font-size-sm)"},children:[o("strong",{children:[a,":"]})," ",String(s)]},a)),t.length>5&&o(i,{variant:"muted",children:["+",t.length-5," more"]})]})}return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"array":return Array.isArray(r)?r.length===0?n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"}):r.join(", "):n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"password":return"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";case"email":return e("a",{href:`mailto:${r}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:r});case"tel":return e("a",{href:`tel:${r}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:r});case"url":return e("a",{href:r,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:r});case"color":return o(d,{direction:"row",gap:"tight",align:"center",children:[e("div",{style:{width:"20px",height:"20px",backgroundColor:r,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),e(i,{children:r})]});case"textarea":case"text":return String(r);case"richtext":return r&&typeof r=="string"?n?r.replace(/<[^>]*>/g,"").trim()||e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e("div",{dangerouslySetInnerHTML:{__html:r},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});default:return String(r)}}function x({name:r,config:c,value:l,t:m}){const n=b(l,c,m,{compact:!1}),p=y(r,c,m);return o(d,{direction:"row",align:"baseline",style:{marginBottom:"var(--gap-sm)",padding:"var(--gap-sm)",minHeight:"38px",alignItems:"center"},children:[o(i,{variant:"muted",style:{fontSize:"var(--font-size-sm)",fontWeight:500,minWidth:"fit-content",flexShrink:0},children:[p,":"]}),e("div",{style:{flex:1,display:"flex",alignItems:"center"},children:typeof n=="string"?e(i,{children:n}):n})]})}var w=x;export{x as DisplayFieldRenderer,w as default,b as formatValue};
@@ -0,0 +1,27 @@
1
+ import type { Entity } from '@donotdev/core';
2
+ export interface EntityCardListProps {
3
+ /** The entity definition */
4
+ entity: Entity;
5
+ /** Optional view handler. If not provided, defaults to navigate(`/${entity.collection}/${id}`) */
6
+ onView?: (id: string) => void;
7
+ /** Grid columns (responsive) - defaults to [1, 2, 3, 4] */
8
+ cols?: number | [number, number, number, number];
9
+ /** Cache stale time is ms - defaults to 30 mins */
10
+ staleTime?: number;
11
+ /** Optional filter function to filter items client-side */
12
+ filter?: (item: any) => boolean;
13
+ }
14
+ /**
15
+ * Entity Card List Component - Card grid view for public/user-facing browsing
16
+ *
17
+ * Features:
18
+ * - Responsive card grid layout
19
+ * - Image + key fields display
20
+ * - Click card to navigate to detail
21
+ * - Simple formatted text display (no boxes, just labels + values)
22
+ * - Empty state handling
23
+ * - Default routing: `/${entity.collection}/${id}` for view
24
+ */
25
+ export declare function EntityCardList({ entity, onView, cols, staleTime, // 30 minutes default cache
26
+ filter, }: EntityCardListProps): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=EntityCardList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityCardList.d.ts","sourceRoot":"","sources":["../../src/components/EntityCardList.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,kGAAkG;IAClG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,IAAmB,EACnB,SAA0B,EAAE,2BAA2B;AACvD,MAAM,GACP,EAAE,mBAAmB,2CAsKrB"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as l,jsxs as p}from"react/jsx-runtime";import{useMemo as d,useCallback as A}from"react";import{Grid as I,Card as T,Stack as h,Text as c,Spinner as U}from"@donotdev/components";import{useTranslation as k}from"@donotdev/core";import{useNavigate as D}from"@donotdev/ui";import{translateFieldLabel as O}from"../forms/utils";import{useCrudCardList as R}from"../useCrudCardList";import{formatValue as _}from"./DisplayFieldRenderer";function J({entity:r,onView:u,cols:w=[1,2,3,4],staleTime:L=1e3*60*30,filter:m}){const v=D(),{data:S,loading:y}=R(r,{staleTime:L}),f=S?.items||[],C=d(()=>m?f.filter(m):f,[f,m]),$=`entity-${r.name.toLowerCase()}`,{t:F}=k($),{t:b}=k("crud"),V=A(e=>{u?u(e):v(`/${r.collection}/${e}`)},[u,v,r.collection]),s=d(()=>{const e=r.listCardFields??r.listFields;return e&&e.length>0?e:Object.keys(r.fields).slice(0,4)},[r.listCardFields,r.listFields,r.fields]),o=d(()=>{const e=s.filter(a=>{const i=r.fields[a];return i?.type==="image"||i?.type==="images"});return e.length>0?e[0]:Object.keys(r.fields).filter(a=>{const i=r.fields[a];return i?.type==="image"||i?.type==="images"})[0]||null},[s,r.fields]),j=d(()=>s.filter(e=>e!==o),[s,o]);return y?l(U,{overlay:!0}):C.length===0?p(h,{align:"center",justify:"center",gap:"medium",style:{padding:"var(--gap-3xl)",textAlign:"center"},children:[l(c,{level:"h3",style:{color:"var(--muted-foreground)"},children:b("emptyState.title",{defaultValue:`No ${r.name.toLowerCase()} found`})}),l(c,{style:{color:"var(--muted-foreground)"},children:b("emptyState.description",{defaultValue:`No ${r.name.toLowerCase()} available at this time.`})})]}):l(I,{cols:w,gap:"medium",children:C.map(e=>{const t=o?e[o]:null,a=t?typeof t=="string"?t:t?.url||t?.thumbUrl||Array.isArray(t)&&t[0]?.url||t[0]?.thumbUrl||t[0]:null,i=j[0],x=i?e[i]:e.id;return l(T,{title:String(x||""),clickable:!0,onClick:()=>V(e.id),elevated:!0,children:p(h,{direction:"column",gap:"medium",children:[a&&l("div",{style:{width:"100%",aspectRatio:"16/9",borderRadius:"var(--radius-md)",overflow:"hidden",backgroundColor:"var(--muted)"},children:l("img",{src:a,alt:String(x||""),style:{width:"100%",height:"100%",objectFit:"cover"}})}),l(h,{direction:"column",gap:"tight",children:j.slice(1,4).map(n=>{const g=r.fields[n];return g?p("div",{children:[l(c,{level:"small",variant:"muted",children:O(n,g,F)}),l(c,{children:_(e[n],g,F,{compact:!0})})]},n):null})})]})},e.id)})})}export{J as EntityCardList};
@@ -0,0 +1,43 @@
1
+ import type { Entity, UserRole } from '@donotdev/core';
2
+ export interface EntityDisplayRendererProps<T extends Record<string, unknown> = Record<string, unknown>> {
3
+ /** Entity definition - pass the full entity from defineEntity() */
4
+ entity: Entity;
5
+ /** Entity ID to fetch. If not provided, will try to get from route params */
6
+ id?: string;
7
+ /** Translation function (optional - auto-generated if not provided) */
8
+ t?: (key: string, options?: Record<string, unknown>) => string;
9
+ /** Additional CSS classes */
10
+ className?: string;
11
+ /** Backend to use */
12
+ backend?: 'firestore' | 'functions';
13
+ /** Custom loading message */
14
+ loadingMessage?: string;
15
+ /** Custom not found message */
16
+ notFoundMessage?: string;
17
+ /**
18
+ * Current viewer's role for visibility checks
19
+ * Used to determine which fields should be visible based on their visibility setting
20
+ * If not provided, defaults to 'guest' (most restrictive - shows only public fields)
21
+ * @default 'guest'
22
+ */
23
+ viewerRole?: UserRole;
24
+ }
25
+ /**
26
+ * EntityDisplayRenderer - Automatically fetches and displays entity data
27
+ *
28
+ * Features:
29
+ * - Automatic data fetching using useCrud
30
+ * - Loading state handling
31
+ * - Error handling
32
+ * - Automatic field rendering (respects visibility rules)
33
+ * - Full i18n support
34
+ * - No form/submit buttons - pure read-only display
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * <EntityDisplayRenderer entity={carEntity} id={carId} />
39
+ * ```
40
+ */
41
+ export declare function EntityDisplayRenderer<T extends Record<string, unknown> = Record<string, unknown>>({ entity, id: providedId, t, className, backend, loadingMessage, notFoundMessage, viewerRole, }: EntityDisplayRendererProps<T>): import("react/jsx-runtime").JSX.Element;
42
+ export default EntityDisplayRenderer;
43
+ //# sourceMappingURL=EntityDisplayRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityDisplayRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityDisplayRenderer.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAMvD,MAAM,WAAW,0BAA0B,CACzC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,EACA,MAAM,EACN,EAAE,EAAE,UAAU,EACd,CAAC,EACD,SAAc,EACd,OAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAoB,GACrB,EAAE,0BAA0B,CAAC,CAAC,CAAC,2CA4N/B;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as i,jsxs as I}from"react/jsx-runtime";import{useEffect as M,useState as p,useMemo as b}from"react";import{Stack as y}from"@donotdev/components";import{useTranslation as A,isFieldVisible as P}from"@donotdev/core";import{LoadingContainerOverlay as R,useParams as T}from"@donotdev/ui";import{DisplayFieldRenderer as q}from"./DisplayFieldRenderer";import{useCrud as G}from"../useCrud";function H({entity:n,id:d,t:j,className:m="",backend:x="functions",loadingMessage:F,notFoundMessage:S,viewerRole:h="guest"}){const a=T(),u=b(()=>{if(d)return d;if(!a)return;const e=a.id;if(e)return Array.isArray(e)?e[0]:e;const r=a[n.collection];if(r)return Array.isArray(r)?r[0]:r},[d,a,n.collection]),{get:g,loading:w,data:k,error:C,isAvailable:v}=G(n,{backend:x}),[D,c]=p(!1),[L,s]=p(null),[O,f]=p(null),V=`entity-${n.name.toLowerCase()}`,{t:z}=A(V),{t:E}=A("crud"),_=j||z;M(()=>{if(!u){f(null),s(null),c(!1);return}if(!v||!g)return;let e=!1;return c(!0),s(null),g(u).then(r=>{e||(c(!1),r?(f(r),s(null)):(f(null),s(new Error("Entity not found"))))}).catch(r=>{e||(c(!1),s(r instanceof Error?r:new Error(String(r))),f(null))}),()=>{e=!0}},[u,g,v]);const o=k||O,l=C||L,$=w||D||!u,B=b(()=>o?Object.entries(n.fields).filter(([e,r])=>{if(!P(r.visibility,h)||r.visibility==="hidden")return!1;const t=o[e];return!(t==null||typeof t=="string"&&t.trim()===""||Array.isArray(t)&&t.length===0||typeof t=="object"&&!Array.isArray(t)&&t!==null&&Object.keys(t).length===0)}):[],[n.fields,h,o]);return $?i("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},className:m,children:i(R,{show:!0,backdrop:!0,backdropBlur:!0,message:{message:F||E("form.loading",{defaultValue:"Loading..."}),showSpinner:!0}})}):l||!o?i(y,{align:"center",justify:"center",gap:"medium",style:{padding:"var(--gap-3xl)",textAlign:"center"},className:m,children:I(y,{direction:"column",gap:"tight",children:[i("h3",{style:{color:"var(--muted-foreground)"},children:S||E("errors.notFound",{defaultValue:`${n.name} not found`})}),l&&i("p",{style:{color:"var(--destructive)",fontSize:"var(--font-size-sm)"},children:l instanceof Error?l.message:String(l)})]})}):i(y,{direction:"column",gap:"medium",className:m,children:B.map(([e,r])=>i(q,{name:e,config:r,value:o[e],t:_},e))})}var Y=H;export{H as EntityDisplayRenderer,Y as default};
@@ -11,8 +11,11 @@ interface EntityFormRendererProps<T extends Record<string, unknown> = Record<str
11
11
  className?: string;
12
12
  /** Submit button text */
13
13
  submitText?: string;
14
- /** Whether form is loading */
15
- isLoading?: boolean;
14
+ /**
15
+ * Whether form data is loading (shows loading overlay)
16
+ * Use this when fetching existing entity data for edit mode
17
+ */
18
+ loading?: boolean;
16
19
  /** Initial form values */
17
20
  defaultValues?: Partial<T>;
18
21
  /** Submit button variant */
@@ -25,46 +28,38 @@ interface EntityFormRendererProps<T extends Record<string, unknown> = Record<str
25
28
  onSecondarySubmit?: (data: T) => void | Promise<void>;
26
29
  /**
27
30
  * Current viewer's role for editability checks
28
- * Used to determine if fields with editable:'admin' should be inputs or read-only
29
- * If not provided, auto-detected from current user's auth state
30
- * Falls back to 'admin' if auth unavailable (assumes admin context for forms)
31
- * NOTE: Visibility is handled by backend, not this prop
31
+ * @default 'admin'
32
32
  */
33
33
  viewerRole?: ViewerRole;
34
34
  /**
35
35
  * Form operation type
36
- * - 'create': Excludes technical and hidden fields
37
- * - 'edit': Shows all fields from defaultValues, technical fields are read-only
38
- * @default 'create'
36
+ * @default 'create' (or 'edit' if defaultValues provided)
39
37
  */
40
38
  operation?: 'create' | 'edit';
41
39
  /**
42
40
  * Enable auto-save to localStorage for crash recovery.
43
- * Saves form state every 3 seconds (debounced) with multi-tab sync.
44
- * Only works for create mode.
45
- * @default true (auto-enabled for create forms)
41
+ * @default true for create mode
46
42
  */
47
43
  autoSave?: boolean;
44
+ /**
45
+ * Optional form ID for tracking loading state.
46
+ * If not provided, one will be generated automatically.
47
+ */
48
+ formId?: string;
48
49
  }
49
50
  /**
50
- * EntityFormRenderer - High-level component that renders a complete form from an entity definition
51
- *
52
- * Security model:
53
- * - VISIBILITY is handled by BACKEND (filterVisibleFields) - frontend trusts what it receives
54
- * - EDITABILITY is handled by FRONTEND - determines input vs read-only display
51
+ * EntityFormRenderer - Dumb component that renders a form from entity definition.
55
52
  *
56
- * Features:
57
- * - Automatic form setup with react-hook-form
58
- * - Respects editability rules (input vs read-only display based on role)
59
- * - Built-in submit button with loading states
60
- * - Automatic validation from field configs
61
- * - Deferred file uploads (images uploaded on form submit)
62
- * - Full i18n support
53
+ * All orchestration (uploads, validation, status tracking) is handled by useEntityForm.
54
+ * This component just:
55
+ * - Generates formId
56
+ * - Renders fields
57
+ * - Renders submit button with status from useEntityForm
63
58
  *
64
- * @version 0.0.4
59
+ * @version 0.0.6
65
60
  * @since 0.0.1
66
61
  * @author AMBROISE PARK Consulting
67
62
  */
68
- export declare function EntityFormRenderer<T extends Record<string, any> = any>(props: EntityFormRendererProps<T>): import("react/jsx-runtime").JSX.Element;
63
+ export declare function EntityFormRenderer<T extends Record<string, any> = any>({ entity, onSubmit, t, className, submitText, loading, defaultValues, submitVariant, secondaryButtonText, secondaryButtonVariant, onSecondarySubmit, viewerRole, operation, autoSave, formId: externalFormId, }: EntityFormRendererProps<T>): import("react/jsx-runtime").JSX.Element;
69
64
  export default EntityFormRenderer;
70
65
  //# sourceMappingURL=EntityFormRenderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFormRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityFormRenderer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAS7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,UAAU,uBAAuB,CAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,2BAA2B;IAC3B,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACzE,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+BAA+B;IAC/B,sBAAsB,CAAC,EACrB,SAAS,GACT,aAAa,GACb,SAAS,GACT,OAAO,GACP,MAAM,CAAC;IACT,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsRD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EACpE,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CAOlC;AACD,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"EntityFormRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityFormRenderer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,UAAU,uBAAuB,CAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,2BAA2B;IAC3B,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACzE,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+BAA+B;IAC/B,sBAAsB,CAAC,EACnB,SAAS,GACT,aAAa,GACb,SAAS,GACT,OAAO,GACP,MAAM,CAAC;IACX,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,EACtE,MAAM,EACN,QAAQ,EACR,CAAC,EACD,SAAc,EACd,UAAU,EACV,OAAe,EACf,aAAa,EACb,aAAyB,EACzB,mBAAmB,EACnB,sBAAkC,EAClC,iBAAiB,EACjB,UAAU,EACV,SAA6C,EAC7C,QAAiC,EACjC,MAAM,EAAE,cAAc,GACvB,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CAoK5B;AAED,eAAe,kBAAkB,CAAC"}
@@ -1,5 +1 @@
1
- "use client";import{jsx as i,jsxs as O}from"react/jsx-runtime";import{FormProvider as z}from"react-hook-form";import{Button as y,Stack as L,Alert as G}from"@donotdev/components";import{TECHNICAL_FIELD_NAMES as M,useTranslation as J}from"@donotdev/core";import{FormFieldRenderer as K}from"./FormFieldRenderer";import{DisplayFieldRenderer as Q}from"./DisplayFieldRenderer";import{useEntityForm as W}from"../forms/hooks/useEntityForm";import{FormUploadProvider as X,useFormUpload as Y}from"../context/FormUploadContext";function Z({entity:m,onSubmit:N,t:n,className:x="",submitText:b,isLoading:o=!1,defaultValues:d,submitVariant:h="primary",secondaryButtonText:j,secondaryButtonVariant:$="outline",onSecondarySubmit:v,viewerRole:A,operation:f=d?"edit":"create",autoSave:I=f==="create"}){const F=Y(),u=W(m,{operation:f,defaultValues:d,viewerRole:A,t:n,autoSave:I}),{control:P,handleSubmit:k,formState:{errors:a,isSubmitting:l},setError:g}=u,S=u.fields,D=t=>f!=="create"?t:Object.fromEntries(Object.entries(t).filter(([e])=>!M.includes(e))),U=t=>{if(typeof t=="string")return t.trim()||void 0;if(t&&typeof t=="object"){const e=t;if(e.message&&typeof e.message=="string"){const r=e.message.trim();if(r&&!r.includes("[object Object]"))return r}if(e.types&&e.type){const r=e.types[e.type]?.message;if(typeof r=="string"){const s=r.trim();if(s&&!s.includes("[object Object]"))return s}}if(e.types&&typeof e.types=="object"){const r=Object.keys(e.types)[0];if(r){const s=e.types[r]?.message;if(typeof s=="string"){const c=s.trim();if(c&&!c.includes("[object Object]"))return c}}}}},V=t=>{const e=Object.entries(t).filter(([s])=>!M.includes(s)).map(([s,c])=>{const B=S.find(q=>q.name===s)?.config?.label||s,p=U(c);return!p||p==="Invalid value"?null:{field:B,message:p}}).filter(s=>s!==null),r=e.length===0?"Please check the form for errors. Some fields may be missing or invalid.":e.length===1?`${e[0].field}: ${e[0].message}`:`Please fix the following errors:
2
- ${e.map(s=>`\u2022 ${s.field}: ${s.message}`).join(`
3
- `)}`;g("root",{message:r})},E=async()=>{if(!F)return!0;try{return await F.uploadAll(),!0}catch(t){const e=t instanceof Error?t.message:"Upload failed";return g("root",{message:e}),!1}},w=t=>k(async e=>{try{const r=D(e);await t(r)}catch(r){const s=r instanceof Error?r.message:"An error occurred";g("root",{message:s})}},V),_=async t=>{t.preventDefault(),await E()&&w(N)()},R=async()=>{v&&await E()&&w(v)()},H=`entity-${m.name.toLowerCase()}`,{t:T}=J(H),C=n||T;return i(z,{...u,children:O("form",{onSubmit:_,noValidate:!0,className:x,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[a.root?.message&&i(G,{variant:"error",description:typeof a.root.message=="string"&&a.root.message.includes(`
4
- `)?i(L,{as:"ul",gap:"tight",style:{listStyle:"disc",listStylePosition:"inside",margin:0,paddingLeft:"1em"},children:a.root.message.split(`
5
- `).filter(t=>t.trim()).map((t,e)=>i("li",{children:t.replace(/^•\s*/,"")},e))}):a.root.message,style:{marginBottom:"var(--gap-md)",gridColumn:"1 / -1"}}),S.map(({name:t,config:e,editable:r})=>r?i(K,{name:t,config:e,control:P,errors:a,t:C},t):i(Q,{name:t,config:e,value:d?.[t],t:C},t)),j?O(L,{direction:"row",gap:"tight",style:{gridColumn:"1 / -1"},children:[i(y,{type:"submit",disabled:l||o,variant:h,className:"dndev-w-full",children:l||o?n?n("loading",{defaultValue:"Loading..."}):"Loading...":b||(n?n("submit",{defaultValue:"Submit"}):"Submit")}),i(y,{type:"button",onClick:R,disabled:l||o,variant:$,className:"dndev-w-full",children:l||o?n?n("loading",{defaultValue:"Loading..."}):"Loading...":j})]}):i(y,{type:"submit",disabled:l||o,variant:h,className:"dndev-w-full",style:{gridColumn:"1 / -1"},children:l||o?n?n("loading",{defaultValue:"Loading..."}):"Loading...":b||(n?n("submit",{defaultValue:"Submit"}):"Submit")})]})})}function ee(m){return i(X,{children:i(Z,{...m})})}var me=ee;export{ee as EntityFormRenderer,me as default};
1
+ "use client";import{jsx as o,Fragment as z,jsxs as m}from"react/jsx-runtime";import{useEffect as D,useId as q,useMemo as A}from"react";import{FormProvider as B}from"react-hook-form";import{Button as g,Stack as G,Spinner as H}from"@donotdev/components";import{useTranslation as F}from"@donotdev/core";import{DisplayFieldRenderer as J}from"./DisplayFieldRenderer";import{FormFieldRenderer as K}from"./FormFieldRenderer";import{UploadProvider as O}from"../contexts/UploadContext";import{useEntityForm as Q}from"../forms/hooks/useEntityForm";function V({entity:a,onSubmit:T,t:S,className:w="",submitText:u,loading:C=!1,defaultValues:e,submitVariant:p="primary",secondaryButtonText:d,secondaryButtonVariant:I="outline",onSecondarySubmit:c,viewerRole:k,operation:l=e?"edit":"create",autoSave:N=l==="create",formId:j}){const P=q(),f=j??`entity-form-${a.name}-${P}`,$=`entity-${a.name.toLowerCase()}`,{t:E}=F($),{t:v}=F("crud"),s=S||E,b=Q(a,{formId:f,operation:l,defaultValues:e,viewerRole:k,t:s,autoSave:N}),{control:R,handleSubmit:h,formState:{errors:_},fields:L,formStatus:n,uploadProgress:i,cleanup:x}=b;D(()=>x,[x]);const M=C||l==="edit"&&!e,r=A(()=>n==="uploading"?{loading:!0,loadingText:i<100?`Uploading ${Math.round(i)}%...`:"Processing...",progress:i}:n==="validating"?{loading:!0,loadingText:"Validating..."}:n==="submitting"?{loading:!0,loadingText:"Saving..."}:{loading:!1},[n,i]);return o(B,{...b,children:o(O,{formId:f,children:m("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},children:[M&&o(H,{overlay:!0}),m("form",{onSubmit:h(T),noValidate:!0,className:w,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[L.map(({name:t,config:y,editable:U})=>U?o(K,{name:t,config:y,control:R,errors:_,t:s},t):o(J,{name:t,config:y,value:e?.[t],t:s},t)),o(G,{direction:d?"row":"column",gap:"tight",style:{gridColumn:"1 / -1",position:"sticky",bottom:0,backgroundColor:"var(--background)",borderTop:"1px solid var(--border)",paddingTop:"var(--gap-md)",paddingBottom:"var(--gap-md)",zIndex:10,marginTop:"var(--gap-lg)"},children:d?m(z,{children:[o(g,{type:"submit",loading:r.loading,loadingText:r.loadingText,progress:r.progress,variant:p,className:"dndev-w-full",children:u||v("form.submit",{defaultValue:"Submit"})}),o(g,{type:"button",onClick:()=>c&&h(c)(),loading:r.loading,loadingText:r.loadingText,progress:r.progress,variant:I,className:"dndev-w-full",children:d})]}):o(g,{type:"submit",loading:r.loading,loadingText:r.loadingText,progress:r.progress,variant:p,className:"dndev-w-full",children:u||v("form.submit",{defaultValue:"Submit"})})})]})]})})})}var ir=V;export{V as EntityFormRenderer,ir as default};
@@ -0,0 +1,24 @@
1
+ import type { Entity } from '@donotdev/core';
2
+ export interface EntityListProps {
3
+ /** The entity definition */
4
+ entity: Entity;
5
+ /** Current user role (for UI toggle only - backend enforces security) */
6
+ userRole?: string;
7
+ /** Optional edit handler. If not provided, defaults to navigate(`/${entity.collection}/${id}`) */
8
+ onEdit?: (id: string) => void;
9
+ /** Optional view handler (row click). If not provided, defaults to navigate(`/${entity.collection}/${id}`) */
10
+ onView?: (id: string) => void;
11
+ /** Fields to show as filters (array of field names) */
12
+ filterFields?: string[];
13
+ }
14
+ /**
15
+ * Entity List Component - Table view for admin/internal operations
16
+ *
17
+ * Features:
18
+ * - Filters section (collapsible) with actions and filter inputs
19
+ * - Results section (collapsible) with DataTable
20
+ * - Excel-like table display with formatted values
21
+ * - Edit and Delete actions (admin only)
22
+ */
23
+ export declare function EntityList({ entity, userRole, onEdit, onView, filterFields, }: EntityListProps): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=EntityList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityList.d.ts","sourceRoot":"","sources":["../../src/components/EntityList.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAU7C,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,8GAA8G;IAC9G,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,QAAkB,EAClB,MAAM,EACN,MAAM,EACN,YAAiB,GAClB,EAAE,eAAe,2CAsVjB"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as i,jsxs as m,Fragment as K}from"react/jsx-runtime";import{RefreshCw as N,Plus as U,Trash2 as W,Edit as X,Search as Y}from"lucide-react";import{useMemo as y,useCallback as f,useState as I}from"react";import{DataTable as Z,Button as b,Stack as k,ActionButton as ee,Section as R,Input as _,Select as te}from"@donotdev/components";import{useTranslation as B}from"@donotdev/core";import{useNavigate as le}from"@donotdev/ui";import{translateFieldLabel as P}from"../forms/utils";import{useCrud as ae}from"../useCrud";import{useCrudList as ne}from"../useCrudList";import{formatValue as re}from"./DisplayFieldRenderer";function ve({entity:a,userRole:oe="guest",onEdit:w,onView:C,filterFields:h=[]}){const p=le(),{data:E,loading:v,mutate:x}=ne(a),{delete:j}=ae(a),{t}=B("crud"),L=E?.items||[],Q=`entity-${a.name.toLowerCase()}`,{t:c}=B(Q),[s,T]=I({}),[g,M]=I(""),q=f(async()=>{await x()},[x]),F=f(e=>{w?w(e):p(`/${a.collection}/${e}`)},[w,p,a.collection]),z=f(e=>{C?C(e):p(`/${a.collection}/${e}`)},[C,p,a.collection]),D=f(async e=>{await j(e)},[j]),V=f((e,o)=>{T(n=>({...n,[e]:o||void 0}))},[]),$=f(()=>{T({})},[]),O=y(()=>{let e=L;if(g){const o=g.toLowerCase();e=e.filter(n=>Object.values(n).some(l=>l==null?!1:String(l).toLowerCase().includes(o)))}return h.length>0&&Object.keys(s).length>0&&(e=e.filter(o=>Object.entries(s).every(([n,l])=>{if(!l)return!0;const r=o[n];if(r==null)return!1;const u=String(l).toLowerCase();return String(r).toLowerCase().includes(u)}))),e},[L,g,s,h.length]),G=y(()=>h.length===0?null:m(k,{direction:"row",wrap:"wrap",children:[h.map(e=>{const o=a.fields[e];if(!o)return null;const n=P(e,o,c),l=o.type||"text";if(l==="select"||l==="radio"){const r=o.validation?.options||[],u=Array.isArray(r)?r:typeof r=="function"?r():[];return i(te,{label:n,value:s[e]||"",onValueChange:d=>V(e,d),options:u.map(d=>({value:d.value,label:d.label})),placeholder:t("filter.selectPlaceholder",{defaultValue:"All"})},e)}return i(_,{label:n,value:s[e]||"",onChange:r=>V(e,r.target.value),placeholder:t("filter.placeholder",{defaultValue:"Filter..."})},e)}),Object.keys(s).length>0&&i(b,{variant:"outline",onClick:$,children:t("filter.clear",{defaultValue:"Clear Filters"})})]}),[h,a.fields,c,t,s,V,$]),H=y(()=>{const o=(a.listFields||Object.keys(a.fields)).map(n=>{const l=a.fields[n];if(!l)return null;const r=P(n,l,c),u=l.type||"text";return{key:n,title:r,dataIndex:n,sortable:!0,filterable:!0,align:u==="number"||u==="range"?"end":"start",render:(J,se)=>re(J,l,c,{compact:!0})}}).filter(Boolean);return o.unshift({key:"_actions",title:"",dataIndex:void 0,sortable:!1,filterable:!1,width:120,align:"center",render:(n,l)=>m(k,{direction:"row",gap:"tight",align:"center",justify:"center",children:[i(b,{variant:"outline",icon:X,onClick:r=>{r.stopPropagation(),F(l.id)},"aria-label":t("edit",{defaultValue:"Edit"})}),i(ee,{action:async()=>{await D(l.id)},confirmText:t("delete.confirm",{defaultValue:"Are you sure you want to delete this item?"}),confirmTitle:t("delete.title",{defaultValue:"Delete Item"}),loadingText:t("delete.loading",{defaultValue:"Deleting..."}),variant:"destructive",icon:W,"aria-label":t("delete",{defaultValue:"Delete"}),children:t("delete",{defaultValue:"Delete"})})]})}),o},[a,c,t,F,D]),A=c("name",{defaultValue:a.name}),S=O.length;return m(K,{children:[m(R,{title:t("filters.title",{entity:A,defaultValue:`Browse ${A} - Filters`}),collapsible:!0,defaultOpen:!0,children:[m(k,{direction:"row",gap:"tight",align:"center",className:"dndev-w-full",children:[i("div",{className:"dndev-flex-1",children:i(_,{placeholder:t("search.placeholder",{defaultValue:"Search..."}),value:g,onChange:e=>M(e.target.value),icon:Y,className:"dndev-w-full"})}),i(b,{icon:N,variant:"outline",onClick:q,disabled:v,display:"compact","aria-label":t("refresh",{defaultValue:"Refresh"})}),i(b,{icon:U,onClick:()=>p(`/${a.collection}/new`),display:"compact",children:t("addNew",{defaultValue:"Add New"})})]}),G]}),i(R,{title:v?t("results.title.fetching",{defaultValue:"Fetching..."}):t("results.title.count",{count:S,defaultValue:S===1?"Found 1 occurrence":`Found ${S} occurrences`}),collapsible:!0,defaultOpen:!0,children:i(Z,{data:O,columns:H,sortable:!0,filterable:!1,searchable:!1,pagination:!0,loading:v,onRowClick:e=>z(e.id)})})]})}export{ve as EntityList};
@@ -1,17 +1,10 @@
1
- /**
2
- * @fileoverview FormFieldRenderer component
3
- * @description Renders form fields using FieldRegistry - no switch statement
4
- *
5
- * @version 0.0.1
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
1
+ import type { EntityField, FieldType, ValueTypeForField } from '@donotdev/core';
9
2
  import type { ReactElement } from 'react';
10
3
  import type { Control, FieldValues } from 'react-hook-form';
11
- import type { FieldConfig, FieldType, ValueTypeForField } from '@donotdev/core';
4
+ import '../builtinFieldTypes';
12
5
  interface FormFieldRendererBaseProps<T extends FieldType = FieldType> {
13
6
  name: string;
14
- config: FieldConfig<T>;
7
+ config: EntityField<T>;
15
8
  t: (key: string, options?: Record<string, any>) => string;
16
9
  }
17
10
  interface UncontrolledProps<T extends FieldType> extends FormFieldRendererBaseProps<T> {
@@ -1 +1 @@
1
- {"version":3,"file":"FormFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FormFieldRenderer.tsx"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAQ,MAAM,iBAAiB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAoBhF,UAAU,0BAA0B,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED,UAAU,iBAAiB,CACzB,CAAC,SAAS,SAAS,CACnB,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,UAAU,eAAe,CACvB,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C,iBAAiB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,EACA,IAAI,EACJ,MAAM,EACN,CAAC,EACD,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,YAAY,CAwFxD;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"FormFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FormFieldRenderer.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM5D,OAAO,sBAAsB,CAAC;AAM9B,UAAU,0BAA0B,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED,UAAU,iBAAiB,CACzB,CAAC,SAAS,SAAS,CACnB,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,UAAU,eAAe,CACvB,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C,iBAAiB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,EACA,IAAI,EACJ,MAAM,EACN,CAAC,EACD,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,YAAY,CA2FxD;AAED,eAAe,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as l}from"react/jsx-runtime";import{useController as b}from"react-hook-form";import{handleError as f}from"@donotdev/core";import{getFieldRegistry as g}from"../FieldRegistry";import{registerBuiltinFieldTypes as F}from"../builtinFieldTypes";F();import{TextFieldComponent as T}from"./form/fields";import{ControlledTextField as v}from"./ControlledFields";const c=g();function w({name:r,config:e,t:n,...t}){const s=o=>i=>{try{o(i)}catch(d){f(d,{userMessage:`Error updating field ${e.label||r}`,context:{fieldName:r,fieldType:e.type},severity:"warning"})}};if("control"in t&&t.control){const{control:o,errors:i}=t,{field:d,fieldState:h}=b({name:r,control:o}),C={control:o,errors:i,fieldConfig:{...e,label:e.label||r},t:n,onChange:s(()=>{}),field:d,fieldState:h},m=c.getControlledComponent(e.type);return m?l(m,{...C}):(f(new Error(`Unregistered field type: ${e.type}`),{userMessage:n("errors.unsupportedFieldType",{type:e.type}),context:{fieldName:r,fieldType:e.type},severity:"warning"}),l(v,{...C,fieldConfig:{...e,type:"text"}}))}const{value:a,onChange:x,error:p}=t,u=s(x),y=c.getUncontrolledComponent(e.type);return y?l(y,{name:r,label:e.label||r,value:a,onChange:u,error:p,t:n,config:e,...e.options}):l(T,{label:e.label||r,value:a,onChange:u,error:p||void 0,...e.options})}var $=w;export{w as FormFieldRenderer,$ as default};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{handleError as f}from"@donotdev/core";import{getFieldRegistry as v}from"../FieldRegistry";import{ControlledTextField as F}from"./controlled";import{TextFieldComponent as T}from"./form/fields";import"../builtinFieldTypes";const h=v();function g({name:r,config:e,t,...o}){const a=s=>d=>{try{s(d)}catch(n){f(n,{userMessage:`Error updating field ${e.label||r}`,context:{fieldName:r,fieldType:e.type},severity:"warning"})}},i="control"in o&&o.control,p=e.type==="submit"||e.type==="reset";if(i&&!p){const{control:s,errors:d}=o,n={control:s,errors:d,fieldConfig:{...e,label:e.label||r},t,onChange:a(()=>{})},c=h.getControlledComponent(e.type);return c?l(c,{...n}):(f(new Error(`Unregistered field type: ${e.type}`),{userMessage:t("errors.unsupportedFieldType",{type:e.type}),context:{fieldName:r,fieldType:e.type},severity:"warning"}),l(F,{...n,fieldConfig:{...e,type:"text"}}))}const x=i&&p?{name:r,config:e,t,value:void 0,onChange:()=>{},error:void 0}:o,{value:u,onChange:b,error:y}=x,C=a(b),m=h.getUncontrolledComponent(e.type);return m?l(m,{name:r,label:e.label||r,value:u,onChange:C,error:y,t,config:e,...e.options}):l(T,{label:e.label||r,value:u,onChange:C,error:y||void 0,...e.options})}var P=g;export{g as FormFieldRenderer,P as default};
@@ -1,12 +1,4 @@
1
- /**
2
- * @fileoverview FormLayout component
3
- * @description Enhanced form layout with modern UX features
4
- *
5
- * @version 0.0.1
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
9
- import { type FormEventHandler, type ReactNode } from 'react';
1
+ import type { FormEventHandler, ReactNode } from 'react';
10
2
  import type { UseFormReturn, FieldValues } from 'react-hook-form';
11
3
  export interface FormDnDevLayoutProps<T extends FieldValues> {
12
4
  /** The title of the form */
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/components/FormLayout.tsx"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAaf,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,WAAW;IACzD,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC5C,iCAAiC;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,mIAaxC,oBAAoB,CAAC,CAAC,CAAC,4CA4GzB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/components/FormLayout.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,WAAW;IACzD,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC5C,iCAAiC;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,mIAaxC,oBAAoB,CAAC,CAAC,CAAC,4CA4GzB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledAddressField - Explicit controlled component for address inputs
5
+ * NO ref forwarding - complex component handles its own refs
6
+ */
7
+ export declare function ControlledAddressField(props: ControlledFieldProps): ReactElement;
8
+ //# sourceMappingURL=ControlledAddressField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledAddressField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledAddressField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAyBd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{AddressFieldComponent as m}from"../../form/fields";import{convertValidationRules as u}from"../types";function h(s){const{control:a,errors:r,fieldConfig:n,t:d}=s,{name:e,label:c,validation:o}=n,t=(n.options||{}).fieldSpecific;return l(f,{name:e,control:a,rules:o?u(o):void 0,render:({field:i})=>l(m,{label:d(c),value:i.value??void 0,onChange:p=>i.onChange(p),error:!!r[e],helperText:r[e]?.message,required:o?.required,enableGoogleMaps:t?.enableGoogleMaps,extractDistrictCode:t?.extractDistrictCode})})}export{h as ControlledAddressField};
@@ -0,0 +1,8 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledDateField - Explicit controlled component for date inputs
5
+ * Forwards Controller's ref for focus/validation (simple input)
6
+ */
7
+ export declare function ControlledDateField(props: ControlledFieldProps): ReactElement;
8
+ //# sourceMappingURL=ControlledDateField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledDateField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledDateField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAiCd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{DateFieldComponent as f}from"../../form/fields";import{convertValidationRules as C}from"../types";function j(a){const{control:l,errors:r,fieldConfig:m,t:i}=a,{name:e,label:d,validation:o,type:s}=m,c={date:"date","datetime-local":"datetime-local",month:"month",time:"time",week:"week"}[s]||"date";return n(p,{name:e,control:l,rules:o?C(o):void 0,render:({field:t})=>n(f,{...t,label:i(d),value:t.value??null,onChange:u=>t.onChange(u),error:!!r[e],helperText:r[e]?.message,required:o?.required,mode:c})})}export{j as ControlledDateField};
@@ -0,0 +1,8 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledGeoPointField - Explicit controlled component for geographic coordinates
5
+ * NO ref forwarding - complex component handles its own refs
6
+ */
7
+ export declare function ControlledGeoPointField(props: ControlledFieldProps): ReactElement;
8
+ //# sourceMappingURL=ControlledGeoPointField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledGeoPointField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledGeoPointField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAsCd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{GeoPointFieldComponent as p}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:g}=l,{name:n,label:m,validation:o}=s;return a(u,{name:n,control:i,rules:o?C(o):void 0,render:({field:e})=>{const c=r=>{if("target"in r)try{const d=JSON.parse(r.target.value);e.onChange(d)}catch{e.onChange({lat:0,lng:0})}else e.onChange(r||{lat:0,lng:0})};return a(p,{label:g(m),value:e.value||{lat:0,lng:0},onChange:c,error:!!t[n],helperText:t[n]?.message,required:o?.required})}})}export{b as ControlledGeoPointField};
@@ -0,0 +1,8 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledMapField - Explicit controlled component for map data inputs
5
+ * NO ref forwarding - complex component handles its own refs
6
+ */
7
+ export declare function ControlledMapField(props: ControlledFieldProps): ReactElement;
8
+ //# sourceMappingURL=ControlledMapField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledMapField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledMapField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAsCd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{MapFieldComponent as g}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:m}=l,{name:r,label:c,validation:n}=s;return a(u,{name:r,control:i,rules:n?C(n):void 0,render:({field:e})=>{const p=o=>{if("target"in o)try{const d=JSON.parse(o.target.value);e.onChange(d)}catch{e.onChange({})}else e.onChange(o||{})};return a(g,{label:m(c),value:e.value||{},onChange:p,error:!!t[r],helperText:t[r]?.message,required:n?.required})}})}export{b as ControlledMapField};
@@ -0,0 +1,8 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledMultiInputField - Explicit controlled component for array of text inputs
5
+ * NO ref forwarding - complex component handles its own refs
6
+ */
7
+ export declare function ControlledMultiInputField(props: ControlledFieldProps): ReactElement;
8
+ //# sourceMappingURL=ControlledMultiInputField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledMultiInputField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledMultiInputField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAoCd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{MultiInputTextFieldComponent as C}from"../../form/fields";import{convertValidationRules as g}from"../types";function x(a){const{control:l,errors:h,fieldConfig:s,t:i}=a,{name:u,label:c,validation:e,options:m={}}=s;return t(d,{name:u,control:l,rules:e?g(e):void 0,render:({field:r})=>{const p=n=>{if(Array.isArray(n))r.onChange(n);else try{const o=JSON.parse(n.target.value);r.onChange(Array.isArray(o)?o:[])}catch{r.onChange([])}};return t(C,{label:i(c),value:Array.isArray(r.value)?r.value:[],onChange:p,required:e?.required,className:m.className})}})}export{x as ControlledMultiInputField};
@@ -0,0 +1,8 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledRichTextField - Explicit controlled component for rich text editor
5
+ * NO ref forwarding - complex component handles its own refs
6
+ */
7
+ export declare function ControlledRichTextField(props: ControlledFieldProps): ReactElement;
8
+ //# sourceMappingURL=ControlledRichTextField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledRichTextField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledRichTextField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAuBd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{RichTextComponent as h}from"../../form/fields";import{convertValidationRules as f}from"../types";function R(a){const{control:i,errors:r,fieldConfig:s,t:m,placeholder:c}=a,{name:e,label:d,validation:o,options:l={}}=s;return t(u,{name:e,control:i,rules:o?f(o):void 0,render:({field:n})=>t(h,{label:m(d),value:n.value??"",onChange:p=>n.onChange(p),error:r[e]?.message,helperText:r[e]?.message,required:o?.required,placeholder:c||l.placeholder,className:l.className})})}export{R as ControlledRichTextField};