@donotdev/crud 0.0.31 → 0.1.1

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 (326) hide show
  1. package/LICENSE.md +3 -3
  2. package/dist/CrudService.d.ts +13 -4
  3. package/dist/CrudService.d.ts.map +1 -1
  4. package/dist/CrudService.js +2 -2
  5. package/dist/CrudStore.d.ts +1 -1
  6. package/dist/CrudStore.d.ts.map +1 -1
  7. package/dist/CrudStore.js +1 -1
  8. package/dist/FieldRegistry.d.ts +2 -12
  9. package/dist/FieldRegistry.d.ts.map +1 -1
  10. package/dist/FieldRegistry.js +1 -1
  11. package/dist/adapters/FunctionsAdapter.d.ts +3 -3
  12. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  13. package/dist/adapters/FunctionsAdapter.js +1 -1
  14. package/dist/adapters/index.d.ts +1 -1
  15. package/dist/builtinFieldTypes.d.ts +1 -1
  16. package/dist/components/CrudButton.d.ts +1 -0
  17. package/dist/components/CrudButton.d.ts.map +1 -1
  18. package/dist/components/CrudButton.js +1 -1
  19. package/dist/components/CrudCard.d.ts +1 -1
  20. package/dist/components/CrudCard.d.ts.map +1 -1
  21. package/dist/components/CrudCard.js +1 -1
  22. package/dist/components/DateFilter.js +1 -1
  23. package/dist/components/DisplayFieldRenderer.d.ts +2 -1
  24. package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
  25. package/dist/components/DisplayFieldRenderer.js +1 -1
  26. package/dist/components/DisplayThumbnail.d.ts +1 -9
  27. package/dist/components/DisplayThumbnail.d.ts.map +1 -1
  28. package/dist/components/DisplayThumbnail.js +1 -1
  29. package/dist/components/EntityFilters.d.ts +1 -0
  30. package/dist/components/EntityFilters.d.ts.map +1 -1
  31. package/dist/components/EntityFilters.js +1 -1
  32. package/dist/components/FormFieldRenderer.d.ts +1 -0
  33. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  34. package/dist/components/FormFieldRenderer.js +1 -1
  35. package/dist/components/FormLayout.d.ts +2 -1
  36. package/dist/components/FormLayout.d.ts.map +1 -1
  37. package/dist/components/FormLayout.js +1 -1
  38. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  39. package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -1
  40. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  41. package/dist/components/controlled/complex/ControlledFieldArrayField.js +1 -1
  42. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  43. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  44. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  45. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  46. package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -1
  47. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  48. package/dist/components/controlled/complex/index.js +1 -1
  49. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  50. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  51. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  52. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  53. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  54. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  55. package/dist/components/controlled/file/index.js +1 -1
  56. package/dist/components/controlled/index.js +1 -1
  57. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  58. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  59. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  60. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  61. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  62. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  63. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  64. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  65. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  66. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  67. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  68. package/dist/components/controlled/input/ControlledTextField.d.ts +5 -5
  69. package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -1
  70. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  71. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  72. package/dist/components/controlled/input/index.js +1 -1
  73. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  74. package/dist/components/controlled/select/ControlledDropdownField.d.ts +2 -4
  75. package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -1
  76. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  77. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +2 -4
  78. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -1
  79. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  80. package/dist/components/controlled/select/ControlledRadioField.d.ts +2 -4
  81. package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -1
  82. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  83. package/dist/components/controlled/select/ControlledReferenceField.js +1 -1
  84. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  85. package/dist/components/controlled/select/index.js +1 -1
  86. package/dist/components/controlled/types.js +1 -1
  87. package/dist/components/fields/display/AvatarFieldDisplay.d.ts +1 -1
  88. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  89. package/dist/components/fields/display/BadgeFieldDisplay.d.ts +1 -1
  90. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  91. package/dist/components/fields/display/ButtonFieldDisplay.d.ts +2 -2
  92. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  93. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +1 -1
  94. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  95. package/dist/components/fields/display/DateFieldDisplay.d.ts +1 -1
  96. package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -1
  97. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  98. package/dist/components/fields/display/DropdownDisplay.d.ts +1 -1
  99. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  100. package/dist/components/fields/display/FileFieldDisplay.d.ts +1 -1
  101. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  102. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +1 -1
  103. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  104. package/dist/components/fields/display/HiddenFieldDisplay.d.ts +2 -2
  105. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  106. package/dist/components/fields/display/ImageFieldDisplay.d.ts +1 -1
  107. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  108. package/dist/components/fields/display/LinkFieldDisplay.d.ts +1 -1
  109. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  110. package/dist/components/fields/display/MapFieldDisplay.d.ts +1 -1
  111. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  112. package/dist/components/fields/display/MultiDropdownDisplay.d.ts +1 -1
  113. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  114. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +1 -1
  115. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  116. package/dist/components/fields/display/NumberFieldDisplay.d.ts +1 -1
  117. package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -1
  118. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  119. package/dist/components/fields/display/PasswordFieldDisplay.d.ts +1 -1
  120. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  121. package/dist/components/fields/display/PhoneNumberDisplay.d.ts +1 -1
  122. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  123. package/dist/components/fields/display/RadioFieldDisplay.d.ts +1 -1
  124. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  125. package/dist/components/fields/display/RangeFieldDisplay.d.ts +1 -1
  126. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  127. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +1 -1
  128. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  129. package/dist/components/fields/display/RichTextDisplay.d.ts +1 -1
  130. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  131. package/dist/components/fields/display/TextAreaDisplay.d.ts +1 -1
  132. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  133. package/dist/components/fields/display/TextFieldDisplay.d.ts +1 -1
  134. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  135. package/dist/components/fields/display/TimestampFieldDisplay.d.ts +1 -1
  136. package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -1
  137. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  138. package/dist/components/fields/display/index.d.ts +1 -1
  139. package/dist/components/fields/display/index.js +1 -1
  140. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  141. package/dist/components/form/fields/AvatarFieldComponent.d.ts +2 -2
  142. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  143. package/dist/components/form/fields/BadgeFieldComponent.d.ts +2 -2
  144. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  145. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  146. package/dist/components/form/fields/CheckboxFieldComponent.d.ts +1 -1
  147. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  148. package/dist/components/form/fields/ComboboxComponent.d.ts +1 -1
  149. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  150. package/dist/components/form/fields/CurrencyFieldComponent.d.ts +1 -1
  151. package/dist/components/form/fields/CurrencyFieldComponent.d.ts.map +1 -1
  152. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  153. package/dist/components/form/fields/DateFieldComponent.d.ts +3 -3
  154. package/dist/components/form/fields/DateFieldComponent.d.ts.map +1 -1
  155. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  156. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  157. package/dist/components/form/fields/DropdownComponent.d.ts +1 -1
  158. package/dist/components/form/fields/DropdownComponent.js +1 -1
  159. package/dist/components/form/fields/DurationFieldComponent.js +1 -1
  160. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  161. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +1 -1
  162. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  163. package/dist/components/form/fields/GeoPointFieldComponent.d.ts +1 -1
  164. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  165. package/dist/components/form/fields/HiddenFieldComponent.d.ts +1 -1
  166. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  167. package/dist/components/form/fields/ImageFieldComponent.d.ts.map +1 -1
  168. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  169. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  170. package/dist/components/form/fields/MultiDropdownComponent.d.ts +1 -1
  171. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  172. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  173. package/dist/components/form/fields/NumberFieldComponent.d.ts +1 -1
  174. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  175. package/dist/components/form/fields/PasswordFieldComponent.d.ts +1 -1
  176. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  177. package/dist/components/form/fields/PhoneNumberComponent.d.ts +1 -1
  178. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  179. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  180. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  181. package/dist/components/form/fields/RangeFieldComponent.d.ts +1 -1
  182. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  183. package/dist/components/form/fields/RatingFieldComponent.d.ts +1 -1
  184. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  185. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  186. package/dist/components/form/fields/RichTextComponent.d.ts +1 -1
  187. package/dist/components/form/fields/RichTextComponent.js +1 -1
  188. package/dist/components/form/fields/SwitchFieldComponent.d.ts +1 -1
  189. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  190. package/dist/components/form/fields/TextAreaComponent.d.ts +1 -1
  191. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  192. package/dist/components/form/fields/TextFieldComponent.d.ts +4 -4
  193. package/dist/components/form/fields/TextFieldComponent.d.ts.map +1 -1
  194. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  195. package/dist/components/form/fields/TimestampFieldComponent.d.ts +2 -2
  196. package/dist/components/form/fields/TimestampFieldComponent.d.ts.map +1 -1
  197. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  198. package/dist/components/form/fields/index.d.ts +1 -1
  199. package/dist/components/form/fields/index.js +1 -1
  200. package/dist/components/form/fields/internal/TiptapEditor.d.ts +1 -1
  201. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  202. package/dist/components/form/fields/types.d.ts +1 -1
  203. package/dist/components/form/index.d.ts +1 -1
  204. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  205. package/dist/components/index.d.ts +1 -1
  206. package/dist/components/index.js +1 -1
  207. package/dist/contexts/UploadContext.d.ts +1 -0
  208. package/dist/contexts/UploadContext.d.ts.map +1 -1
  209. package/dist/contexts/UploadContext.js +1 -1
  210. package/dist/contexts/index.js +1 -1
  211. package/dist/fieldTypeRegistry.d.ts.map +1 -1
  212. package/dist/fieldTypeRegistry.js +1 -1
  213. package/dist/fieldTypeRegistry.store.d.ts.map +1 -1
  214. package/dist/fieldTypeRegistry.store.js +1 -1
  215. package/dist/fieldTypeRegistry.types.d.ts +4 -0
  216. package/dist/fieldTypeRegistry.types.d.ts.map +1 -1
  217. package/dist/forms/hooks/index.d.ts +1 -1
  218. package/dist/forms/hooks/index.js +1 -1
  219. package/dist/forms/hooks/useController.js +1 -1
  220. package/dist/forms/hooks/useEntityField.d.ts +1 -1
  221. package/dist/forms/hooks/useEntityField.js +1 -1
  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 +1 -1
  225. package/dist/forms/index.js +1 -1
  226. package/dist/forms/types.d.ts +12 -7
  227. package/dist/forms/types.d.ts.map +1 -1
  228. package/dist/forms/utils/buildInitialValues.d.ts.map +1 -1
  229. package/dist/forms/utils/buildInitialValues.js +1 -1
  230. package/dist/forms/utils/getFieldsForOperation.d.ts +2 -2
  231. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  232. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  233. package/dist/forms/utils/index.d.ts +1 -1
  234. package/dist/forms/utils/index.js +1 -1
  235. package/dist/forms/utils/isFieldEditable.d.ts +8 -2
  236. package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
  237. package/dist/forms/utils/isFieldEditable.js +1 -1
  238. package/dist/forms/utils/translateFieldLabel.d.ts +3 -3
  239. package/dist/forms/utils/translateFieldLabel.js +1 -1
  240. package/dist/forms/utils/validateEntity.d.ts +1 -1
  241. package/dist/forms/utils/validateEntity.js +1 -1
  242. package/dist/hooks/index.d.ts +2 -0
  243. package/dist/hooks/index.d.ts.map +1 -1
  244. package/dist/hooks/index.js +1 -1
  245. package/dist/hooks/useCrudFilters.d.ts +2 -0
  246. package/dist/hooks/useCrudFilters.d.ts.map +1 -1
  247. package/dist/hooks/useCrudFilters.js +1 -1
  248. package/dist/hooks/useCrudPageSize.d.ts +29 -0
  249. package/dist/hooks/useCrudPageSize.d.ts.map +1 -0
  250. package/dist/hooks/useCrudPageSize.js +1 -0
  251. package/dist/hooks/useEntityFavorites.d.ts +2 -0
  252. package/dist/hooks/useEntityFavorites.d.ts.map +1 -1
  253. package/dist/hooks/useEntityFavorites.js +1 -1
  254. package/dist/hooks/useFieldConditions.js +1 -1
  255. package/dist/hooks/useFileUpload.d.ts.map +1 -1
  256. package/dist/hooks/useFileUpload.js +1 -1
  257. package/dist/hooks/useReferenceResolver.d.ts +1 -1
  258. package/dist/hooks/useReferenceResolver.d.ts.map +1 -1
  259. package/dist/hooks/useReferenceResolver.js +1 -1
  260. package/dist/hooks/useRelatedItems.d.ts +2 -0
  261. package/dist/hooks/useRelatedItems.d.ts.map +1 -1
  262. package/dist/hooks/useRelatedItems.js +1 -1
  263. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  264. package/dist/index.d.ts +4 -4
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +1 -1
  267. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
  268. package/dist/registerBuiltinFieldTypes.js +1 -1
  269. package/dist/stores/FormStore.d.ts +2 -0
  270. package/dist/stores/FormStore.d.ts.map +1 -1
  271. package/dist/stores/FormStore.js +1 -1
  272. package/dist/stores/UploadStore.d.ts +9 -3
  273. package/dist/stores/UploadStore.d.ts.map +1 -1
  274. package/dist/stores/UploadStore.js +1 -1
  275. package/dist/stores/index.d.ts +1 -1
  276. package/dist/stores/index.js +1 -1
  277. package/dist/symbol-index.json +1 -0
  278. package/dist/tsconfig.tsbuildinfo +1 -1
  279. package/dist/types.d.ts +10 -4
  280. package/dist/types.d.ts.map +1 -1
  281. package/dist/types.js +1 -1
  282. package/dist/useBaseCrudList.js +1 -1
  283. package/dist/useCrud.d.ts +1 -0
  284. package/dist/useCrud.d.ts.map +1 -1
  285. package/dist/useCrud.js +1 -1
  286. package/dist/useCrudCardList.d.ts +5 -3
  287. package/dist/useCrudCardList.d.ts.map +1 -1
  288. package/dist/useCrudCardList.js +1 -1
  289. package/dist/useCrudList.d.ts +5 -3
  290. package/dist/useCrudList.d.ts.map +1 -1
  291. package/dist/useCrudList.js +1 -1
  292. package/dist/utils/clientListProcessing.d.ts +22 -3
  293. package/dist/utils/clientListProcessing.d.ts.map +1 -1
  294. package/dist/utils/clientListProcessing.js +1 -1
  295. package/dist/utils/collections.d.ts +6 -6
  296. package/dist/utils/collections.js +1 -1
  297. package/dist/utils/fileStorage.d.ts +2 -0
  298. package/dist/utils/fileStorage.d.ts.map +1 -1
  299. package/dist/utils/fileStorage.js +1 -1
  300. package/dist/utils/imageProcessing.d.ts +1 -1
  301. package/dist/utils/imageProcessing.d.ts.map +1 -1
  302. package/dist/utils/imageProcessing.js +1 -1
  303. package/dist/utils/imageStorage.d.ts +2 -0
  304. package/dist/utils/imageStorage.d.ts.map +1 -1
  305. package/dist/utils/imageStorage.js +1 -1
  306. package/dist/utils/imageUtils.d.ts +1 -1
  307. package/dist/utils/imageUtils.js +1 -1
  308. package/dist/utils/matchesFilter.d.ts.map +1 -1
  309. package/dist/utils/matchesFilter.js +1 -1
  310. package/dist/utils/mergeWithOptimistic.js +1 -1
  311. package/dist/utils/sanitizeHtml.d.ts +0 -5
  312. package/dist/utils/sanitizeHtml.d.ts.map +1 -1
  313. package/dist/utils/sanitizeHtml.js +1 -1
  314. package/dist/utils/scopeUtils.js +1 -1
  315. package/dist/utils/uploadValidation.d.ts +1 -1
  316. package/dist/utils/uploadValidation.js +1 -1
  317. package/dist/workflows/WorkflowPersistence.d.ts +1 -1
  318. package/dist/workflows/WorkflowPersistence.js +1 -1
  319. package/dist/workflows/defineWorkflow.d.ts +1 -1
  320. package/dist/workflows/index.d.ts +1 -1
  321. package/dist/workflows/index.js +1 -1
  322. package/dist/workflows/useEntityWorkflow.js +1 -1
  323. package/guidelines/COMPONENTS.md +234 -0
  324. package/guidelines/CRUD.md +340 -0
  325. package/guidelines/GOTCHAS.md +46 -0
  326. package/package.json +7 -4
@@ -1 +1 @@
1
- "use client";import{jsx as a,jsxs as o}from"react/jsx-runtime";import{CirclePlus as R,CircleMinus as U}from"lucide-react";import{useId as q,useState as z}from"react";import{Input as C,Checkbox as D,Stack as E,Select as A,CollapsiblePrimitive as B,CollapsibleTrigger as G,CollapsibleContent as H}from"@donotdev/components";import{useTranslation as J,getCurrencySymbol as L}from"@donotdev/core";const O=["EUR","USD","GBP","CHF","JPY","KRW"],Y=({label:f,value:n,onChange:I,error:s,helperText:g,required:P=!1,disabled:c=!1,placeholder:N="0",defaultCurrency:i="EUR",optionsTitle:x="Price options",currencies:b})=>{const u=q(),{t:p}=J("crud"),r=b?.length?b:[...O],h=n?.currency??i,m=r.includes(h)?h:r[0]??i,T=n?.vatIncluded??!0,y=n?.discountPercent??0,S=`${f} (${L(m)})`,d=e=>{const l=e.amount!==void 0?e.amount:n?.amount??0;let t=e.currency!==void 0?e.currency:n?.currency??i;r.includes(t)||(t=m);const F=e.vatIncluded!==void 0?e.vatIncluded:n?.vatIncluded??!0,M=e.discountPercent!==void 0?e.discountPercent:n?.discountPercent??0;I({amount:Number(l),currency:t,vatIncluded:F,discountPercent:Number(M)})},k=e=>{const l=e.target.value;if(l===""||l===null){d({amount:0});return}const t=parseFloat(l);d({amount:isNaN(t)?0:t})},V=e=>{d({currency:e||i})},$=e=>{const l=e.target.value;if(l===""||l===null){d({discountPercent:0});return}const t=parseFloat(l);d({discountPercent:isNaN(t)?0:t})},[v,j]=z(!1);return o(B,{open:v,onOpenChange:j,children:[o(E,{children:[o("div",{style:{display:"grid",gridTemplateColumns:"1fr auto",gap:"var(--gap-sm)",alignItems:"end"},children:[a(C,{id:u,type:"number",inputMode:"decimal",label:S,value:n?.amount!==void 0&&n?.amount!==null?n.amount:"",onChange:k,disabled:c,placeholder:N,required:P,min:0,step:.01,"data-variant":s?"destructive":void 0,"aria-invalid":s}),a(G,{asChild:!0,children:a("button",{type:"button","aria-label":x,"aria-expanded":v,className:"dndev-collapsible-trigger",style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"var(--gap-sm)",background:"none",border:"none",cursor:"pointer"},children:v?a(U,{className:"dndev-collapsible-icon","aria-hidden":"true"}):a(R,{className:"dndev-collapsible-icon","aria-hidden":"true"})})})]}),a(H,{className:"dndev-collapsible-content",children:o("div",{style:{display:"grid",gridTemplateColumns:r.length>1?"1fr auto 1fr":"auto 1fr",gap:"var(--gap-sm)",alignItems:"end",paddingTop:"var(--gap-md)"},children:[r.length>1&&a(A,{value:m,onValueChange:V,placeholder:i,options:r.map(e=>({value:e,label:e})),disabled:c,label:p("price.currency",{defaultValue:"Currency"})}),a(D,{id:`${u}-vat`,label:p("price.vatIncluded",{defaultValue:"VAT Incl."}),checked:T,onCheckedChange:e=>d({vatIncluded:e===!0}),disabled:c}),a(C,{id:`${u}-discount`,type:"number",inputMode:"decimal",min:0,max:100,step:1,value:y===0?"":y,onChange:$,disabled:c,placeholder:"0",label:p("price.discountLabel",{defaultValue:"Discount (%)"})})]})})]}),g&&a("p",{style:{fontSize:"var(--font-size-xs)",color:s?"var(--destructive-foreground)":"var(--muted-foreground)"},children:g})]})};var w=Y;export{w as default};
1
+ "use client";import{jsx as t,jsxs as l}from"react/jsx-runtime";import{CirclePlus as U,CircleMinus as D}from"lucide-react";import{useId as E,useState as _}from"react";import{Input as C,Checkbox as $,Stack as A,Select as L,CollapsiblePrimitive as M,CollapsibleTrigger as w,CollapsibleContent as z}from"@donotdev/components";import{useTranslation as Y,getCurrencySymbol as q}from"@donotdev/core";const B=["EUR","USD","GBP","CHF","JPY","KRW"],G=({label:y,value:n,onChange:I,error:s,helperText:h,required:P=!1,disabled:i=!1,placeholder:N="0",defaultCurrency:r="EUR",optionsTitle:x="Price options",currencies:f})=>{const u=E(),{t:m}=Y("crud"),o=f?.length?f:[...B],b=n?.currency??r,p=o.includes(b)?b:o[0]??r,O=n?.vatIncluded??!0,v=n?.discountPercent??0,S=`${y} (${q(p)})`,d=e=>{const c=e.amount!==void 0?e.amount:n?.amount??0;let a=e.currency!==void 0?e.currency:n?.currency??r;o.includes(a)||(a=p);const F=e.vatIncluded!==void 0?e.vatIncluded:n?.vatIncluded??!0,R=e.discountPercent!==void 0?e.discountPercent:n?.discountPercent??0;I({amount:Number(c),currency:a,vatIncluded:F,discountPercent:Number(R)})},T=e=>{const c=e.target.value;if(c===""||c===null){d({amount:0});return}const a=parseFloat(c);d({amount:isNaN(a)?0:a})},V=e=>{d({currency:e||r})},j=e=>{const c=e.target.value;if(c===""||c===null){d({discountPercent:0});return}const a=parseFloat(c);d({discountPercent:isNaN(a)?0:a})},[g,k]=_(!1);return l(M,{open:g,onOpenChange:k,children:[l(A,{children:[l("div",{style:{display:"grid",gridTemplateColumns:"1fr auto",gap:"var(--gap-sm)",alignItems:"end"},children:[t(C,{id:u,type:"number",inputMode:"decimal",label:S,value:n?.amount!==void 0&&n?.amount!==null?n.amount:"",onChange:T,disabled:i,placeholder:N,required:P,min:0,step:.01,"data-variant":s?"destructive":void 0,"aria-invalid":s}),t(w,{asChild:!0,children:t("button",{type:"button","aria-label":x,"aria-expanded":g,className:"dndev-collapsible-trigger",style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"var(--gap-sm)",background:"none",border:"none",cursor:"pointer"},children:g?t(D,{className:"dndev-collapsible-icon","aria-hidden":"true"}):t(U,{className:"dndev-collapsible-icon","aria-hidden":"true"})})})]}),t(z,{className:"dndev-collapsible-content",children:l("div",{style:{display:"grid",gridTemplateColumns:o.length>1?"1fr auto 1fr":"auto 1fr",gap:"var(--gap-sm)",alignItems:"end",paddingTop:"var(--gap-md)"},children:[o.length>1&&t(L,{value:p,onValueChange:V,placeholder:r,options:o.map(e=>({value:e,label:e})),disabled:i,label:m("price.currency",{defaultValue:"Currency"})}),t($,{id:`${u}-vat`,label:m("price.vatIncluded",{defaultValue:"VAT Incl."}),checked:O,onCheckedChange:e=>d({vatIncluded:e===!0}),disabled:i}),t(C,{id:`${u}-discount`,type:"number",inputMode:"decimal",min:0,max:100,step:1,value:v===0?"":v,onChange:j,disabled:i,placeholder:"0",label:m("price.discountLabel",{defaultValue:"Discount (%)"})})]})})]}),h&&t("p",{style:{fontSize:"var(--font-size-xs)",color:s?"var(--destructive-foreground)":"var(--muted-foreground)"},children:h})]})};var X=G;export{X as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as u}from"react/jsx-runtime";import{RadioGroup as f,Label as c,Stack as p}from"@donotdev/components";const v=({label:o,value:t,onChange:a,options:s,error:i,helperText:r,required:l})=>{const n=d=>{a({target:{value:d}})};return u(p,{gap:"tight",children:[e(c,{required:l,style:{display:"block",fontSize:"var(--font-size-sm)",fontWeight:500},children:o}),e(f,{value:t,onValueChange:n,items:s}),r&&e("p",{style:{fontSize:"var(--font-size-xs)",color:i?"var(--destructive-foreground)":"var(--muted-foreground)"},children:r})]})};var h=v;export{h as default};
1
+ import{jsx as e,jsxs as c}from"react/jsx-runtime";import{RadioGroup as u,Label as f,Stack as h}from"@donotdev/components";const v=({label:o,value:n,onChange:r,options:s,error:a,helperText:t,required:i})=>{const d=l=>{r({target:{value:l}})};return c(h,{gap:"tight",children:[e(f,{required:i,style:{display:"block",fontSize:"var(--font-size-sm)",fontWeight:500},children:o}),e(u,{value:n,onValueChange:d,items:s}),t&&e("p",{style:{fontSize:"var(--font-size-xs)",color:a?"var(--destructive-foreground)":"var(--muted-foreground)"},children:t})]})};var x=v;export{x as default};
@@ -26,7 +26,7 @@ export interface RangeFieldComponentProps {
26
26
  /**
27
27
  * RangeFieldComponent renders a slider input with optional value display
28
28
  *
29
- * @version 0.0.1
29
+ * @version 0.1.0
30
30
  * @since 0.0.1
31
31
  * @author AMBROISE PARK Consulting
32
32
  * @param props - RangeFieldComponentProps
@@ -1 +1 @@
1
- import{jsx as e,jsxs as l}from"react/jsx-runtime";import{Label as h,Slider as b,Stack as d}from"@donotdev/components";const x=({label:o,value:i=0,onChange:u,error:n,helperText:s,min:r=0,max:c=100,step:v=1,disabled:a,required:m,showValue:f=!0})=>{const g=t=>{const p={target:{value:t.toString()}};u(p)};return l(d,{gap:"tight",children:[l(d,{direction:"row",justify:"between",align:"center",children:[e(h,{required:m,style:{fontSize:"var(--font-size-sm)",fontWeight:500},children:o}),f&&e("span",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)"},children:i})]}),e(b,{value:[i??r],onValueChange:([t])=>g(t??r),min:r,max:c,step:v,disabled:a,style:{borderColor:n?"var(--destructive)":void 0,opacity:a?"var(--opacity-muted)":void 0,cursor:a?"not-allowed":void 0},"aria-label":o}),s&&e("p",{style:{fontSize:"var(--font-size-xs)",color:n?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:s})]})};var y=x;export{y as default};
1
+ import{jsx as e,jsxs as d}from"react/jsx-runtime";import{Label as h,Slider as y,Stack as c}from"@donotdev/components";const x=({label:o,value:a=0,onChange:l,error:i,helperText:s,min:t=0,max:u=100,step:f=1,disabled:r,required:g,showValue:v=!0})=>{const m=n=>{const p={target:{value:n.toString()}};l(p)};return d(c,{gap:"tight",children:[d(c,{direction:"row",justify:"between",align:"center",children:[e(h,{required:g,style:{fontSize:"var(--font-size-sm)",fontWeight:500},children:o}),v&&e("span",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)"},children:a})]}),e(y,{value:[a??t],onValueChange:([n])=>m(n??t),min:t,max:u,step:f,disabled:r,style:{borderColor:i?"var(--destructive)":void 0,opacity:r?"var(--opacity-muted)":void 0,cursor:r?"not-allowed":void 0},"aria-label":o}),s&&e("p",{style:{fontSize:"var(--font-size-xs)",color:i?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:s})]})};var C=x;export{C as default};
@@ -28,7 +28,7 @@ export interface RatingFieldComponentProps {
28
28
  * (1–max), optional fractional display, and optional numeric value display.
29
29
  *
30
30
  * @see Entity field type: `rating` (registered in registerBuiltinFieldTypes)
31
- * @version 0.0.1
31
+ * @version 0.1.0
32
32
  * @since 0.0.1
33
33
  * @author AMBROISE PARK Consulting
34
34
  */
@@ -1 +1 @@
1
- import{jsx as e,jsxs as g}from"react/jsx-runtime";import{Label as h,Rating as m,Stack as u}from"@donotdev/components";const v=({label:a,value:o=0,onChange:s,error:l,helperText:r,max:t=5,disabled:i,required:n,readonly:d,showValue:f=!1})=>g(u,{gap:"tight",children:[e(h,{required:n,style:{fontSize:"var(--font-size-sm)",fontWeight:500},children:a}),e(m,{value:o,onChange:s,max:t,disabled:i,readonly:d,showValue:f,"aria-label":a}),r&&e("p",{style:{fontSize:"var(--font-size-xs)",color:l?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:r})]});var p=v;export{p as default};
1
+ import{jsx as e,jsxs as g}from"react/jsx-runtime";import{Label as m,Rating as u,Stack as c}from"@donotdev/components";const p=({label:r,value:o=0,onChange:t,error:n,helperText:a,max:s=5,disabled:i,required:d,readonly:l,showValue:f=!1})=>g(c,{gap:"tight",children:[e(m,{required:d,style:{fontSize:"var(--font-size-sm)",fontWeight:500},children:r}),e(u,{value:o,onChange:t,max:s,disabled:i,readonly:l,showValue:f,"aria-label":r}),a&&e("p",{style:{fontSize:"var(--font-size-xs)",color:n?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:a})]});var x=p;export{x as default};
@@ -1 +1 @@
1
- import{jsx as t,jsxs as d}from"react/jsx-runtime";import"lucide-react";import{useMemo as S,useId as A}from"react";import{Combobox as $,Stack as c}from"@donotdev/components";import{useTranslation as j}from"@donotdev/core";const q=({label:r,value:s,onChange:p,options:i,isLoading:u=!1,error:f,helperText:o,required:h,onBlur:m,onCreate:I,placeholder:g})=>{const{t:l}=j("crud"),n=A(),v=S(()=>i.map(e=>({value:e.id,label:e.label,description:e.description})),[i]),b=e=>{const z=Array.isArray(e)?e[0]||"":e;p(z)},x=e=>{e||m?.()},a=!!f,y=`${n}-error`,C=`${n}-helper`;return d(c,{gap:"tight",children:[t($,{label:r,value:s||"",onValueChange:b,onOpenChange:x,placeholder:g||l("reference.placeholder",{label:r})||`Select ${r}`,emptyMessage:l("reference.noResults")||"No results found",options:v,required:h,variant:a?"destructive":void 0,isLoading:u,clearable:!!s}),a&&d(c,{id:y,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[t("span",{children:"\u26A0"}),o]}),o&&!a&&t("p",{id:C,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:o})]})};var L=q;export{L as default};
1
+ import{jsx as t,jsxs as l}from"react/jsx-runtime";import"lucide-react";import{useMemo as z,useId as S}from"react";import{Combobox as A,Stack as d}from"@donotdev/components";import{useTranslation as I}from"@donotdev/core";const O=({label:r,value:s,onChange:u,options:a,isLoading:f=!1,error:p,helperText:o,required:m,onBlur:h,onCreate:$,placeholder:g})=>{const{t:i}=I("crud"),c=S(),v=z(()=>a.map(e=>({value:e.id,label:e.label,description:e.description})),[a]),x=e=>{const j=Array.isArray(e)?e[0]||"":e;u(j)},C=e=>{e||h?.()},n=!!p,b=`${c}-error`,y=`${c}-helper`;return l(d,{gap:"tight",children:[t(A,{label:r,value:s||"",onValueChange:x,onOpenChange:C,placeholder:g||i("reference.placeholder",{label:r})||`Select ${r}`,emptyMessage:i("reference.noResults")||"No results found",options:v,required:m,variant:n?"destructive":void 0,isLoading:f,clearable:!!s}),n&&l(d,{id:b,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[t("span",{children:"\u26A0"}),o]}),o&&!n&&t("p",{id:y,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:o})]})};var F=O;export{F as default};
@@ -4,7 +4,7 @@ import type { ComponentType } from 'react';
4
4
  * RichTextComponent - WYSIWYG editor with Tiptap
5
5
  * Falls back to textarea if Tiptap is not available
6
6
  *
7
- * @version 0.0.1
7
+ * @version 0.1.0
8
8
  * @since 0.0.1
9
9
  * @author AMBROISE PARK Consulting
10
10
  */
@@ -1 +1 @@
1
- "use client";import{jsx as e}from"react/jsx-runtime";import{lazy as m,Suspense as b,useState as f,useEffect as g}from"react";import{Stack as v}from"@donotdev/components";import n from"./TextAreaComponent";const p=m(()=>typeof window<"u"?import("./internal/TiptapEditor").catch(()=>({default:()=>null})):Promise.resolve({default:()=>null})),x=({label:l,value:a="",onChange:r,error:s,helperText:o,required:d,disabled:t,placeholder:i,className:u})=>{const[c,h]=f(!1);return g(()=>{h(!0)},[]),c?e(v,{gap:"tight",children:e(b,{fallback:e(n,{label:l,value:a,onChange:r,error:s,helperText:o,required:d,disabled:t,placeholder:i,className:u}),children:p?e(p,{label:l,value:a,onChange:r,error:s,helperText:o,required:d,disabled:t,placeholder:i,className:u}):e(n,{label:l,value:a,onChange:r,error:s,helperText:o,required:d,disabled:t,placeholder:i,className:u})})}):e(n,{label:l,value:a,onChange:r,error:s,helperText:o,required:d,disabled:t,placeholder:i,className:u})};var C=x;export{C as default};
1
+ "use client";import{jsx as e}from"react/jsx-runtime";import{lazy as m,Suspense as h,useState as x,useEffect as C}from"react";import{Stack as T}from"@donotdev/components";import p from"./TextAreaComponent";const c=m(()=>typeof window<"u"?import("./internal/TiptapEditor").catch(()=>({default:()=>null})):Promise.resolve({default:()=>null})),b=({label:t,value:r="",onChange:l,error:o,helperText:n,required:a,disabled:i,placeholder:s,className:u})=>{const[f,d]=x(!1);return C(()=>{d(!0)},[]),f?e(T,{gap:"tight",children:e(h,{fallback:e(p,{label:t,value:r,onChange:l,error:o,helperText:n,required:a,disabled:i,placeholder:s,className:u}),children:c?e(c,{label:t,value:r,onChange:l,error:o,helperText:n,required:a,disabled:i,placeholder:s,className:u}):e(p,{label:t,value:r,onChange:l,error:o,helperText:n,required:a,disabled:i,placeholder:s,className:u})})}):e(p,{label:t,value:r,onChange:l,error:o,helperText:n,required:a,disabled:i,placeholder:s,className:u})};var v=b;export{v as default};
@@ -17,7 +17,7 @@ export interface SwitchFieldComponentProps {
17
17
  * SwitchFieldComponent renders a switch field for CRUD forms.
18
18
  * Displays field label, delegates switch rendering to Switch component.
19
19
  *
20
- * @version 0.0.2
20
+ * @version 0.1.0
21
21
  * @since 0.0.1
22
22
  * @author AMBROISE PARK Consulting
23
23
  * @param props - SwitchFieldComponentProps
@@ -1 +1 @@
1
- import{jsxs as e,jsx as r}from"react/jsx-runtime";import{Switch as k,Text as l,Stack as n}from"@donotdev/components";const p=({label:a,checked:d=!1,onChange:t,uncheckedLabel:h,checkedLabel:s,helperText:c})=>{const i=o=>{t&&t({target:{checked:o}})};return e(n,{gap:"tight",children:[e(n,{direction:"row",align:"center",style:{flexWrap:"wrap"},children:[e(l,{level:"body",textAlign:"start",children:[a,":"]}),r(k,{checked:d,onCheckedChange:i,"aria-label":a,variant:"muted",uncheckedLabel:h,checkedLabel:s})]}),c&&r(l,{as:"p",variant:"muted",level:"small",children:c})]})};var g=p;export{g as default};
1
+ import{jsxs as e,jsx as l}from"react/jsx-runtime";import{Switch as m,Text as c,Stack as i}from"@donotdev/components";const p=({label:t,checked:n=!1,onChange:a,uncheckedLabel:d,checkedLabel:s,helperText:r})=>{const h=o=>{a&&a({target:{checked:o}})};return e(i,{gap:"tight",children:[e(i,{direction:"row",align:"center",style:{flexWrap:"wrap"},children:[e(c,{level:"body",textAlign:"start",children:[t,":"]}),l(m,{checked:n,onCheckedChange:h,"aria-label":t,variant:"muted",uncheckedLabel:d,checkedLabel:s})]}),r&&l(c,{as:"p",variant:"muted",level:"small",children:r})]})};var g=p;export{g as default};
@@ -29,7 +29,7 @@ export interface TextAreaComponentProps extends Omit<ComponentProps<typeof Texta
29
29
  /**
30
30
  * Enhanced TextAreaComponent with modern UX features
31
31
  *
32
- * @version 0.0.1
32
+ * @version 0.1.0
33
33
  * @since 0.0.1
34
34
  * @author AMBROISE PARK Consulting
35
35
  *
@@ -1 +1 @@
1
- "use client";import{jsx as t,jsxs as n}from"react/jsx-runtime";import{useState as L,useId as N,useRef as F,useEffect as j}from"react";import{Textarea as q,FloatingLabel as A,Spinner as k,cn as m,Stack as p}from"@donotdev/components";const B=({label:x,value:o="",onChange:b,error:h,helperText:s,rows:y=3,loading:l=!1,maxLength:r,showCharCount:v=!1,autoResize:i=!1,required:z=!1,disabled:g=!1,className:w,...S})=>{const e=N(),[I,f]=L(!1),d=F(null),a=!!h,c=o.length,$=r&&c>r*.8,C=r&&c>r;return j(()=>{if(i&&d.current){const u=d.current;u.style.height="auto",u.style.height=`${u.scrollHeight}px`}},[o,i]),n(p,{gap:"tight",children:[t(A,{htmlFor:e,label:x,disabled:g||l,required:z,children:n("div",{className:"dndev-relative",children:[t(q,{ref:d,id:e,value:o,onChange:b,onFocus:()=>f(!0),onBlur:()=>f(!1),disabled:g||l,maxLength:r,rows:i?1:y,bare:!0,"aria-describedby":m(a&&`${e}-error`,s&&!a&&`${e}-helper`,v&&`${e}-count`),"aria-invalid":a,className:m("dndev-w-full",i&&"dndev-overflow-hidden",w),"data-variant":a?"destructive":void 0,style:{resize:i?"none":void 0},...S}),l&&t("div",{className:"dndev-absolute",style:{right:"var(--gap-md)",top:"var(--gap-md)"},children:t(k,{"aria-label":"Loading"})})]})}),v&&r&&n("div",{id:`${e}-count`,style:{fontSize:"var(--font-size-xs)",textAlign:"right",color:C?"var(--destructive-foreground)":$?"var(--warning)":"var(--muted-foreground)"},children:[c,"/",r]}),a&&n(p,{as:"p",id:`${e}-error`,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[t("span",{children:"\u26A0"}),h]}),s&&!a&&t("p",{id:`${e}-helper`,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:s})]})};var E=B;export{E as default};
1
+ "use client";import{jsx as s,jsxs as a}from"react/jsx-runtime";import{useState as N,useId as z,useRef as A,useEffect as B}from"react";import{Textarea as E,FloatingLabel as I,Spinner as _,cn as p,Stack as m}from"@donotdev/components";const k=({label:b,value:i="",onChange:y,error:f,helperText:o,rows:x=3,loading:l=!1,maxLength:r,showCharCount:v=!1,autoResize:n=!1,required:F=!1,disabled:h=!1,className:$,...S})=>{const e=z(),[q,g]=N(!1),d=A(null),t=!!f,c=i.length,j=r&&c>r*.8,w=r&&c>r;return B(()=>{if(n&&d.current){const u=d.current;u.style.height="auto",u.style.height=`${u.scrollHeight}px`}},[i,n]),a(m,{gap:"tight",children:[s(I,{htmlFor:e,label:b,disabled:h||l,required:F,children:a("div",{className:"dndev-relative",children:[s(E,{ref:d,id:e,value:i,onChange:y,onFocus:()=>g(!0),onBlur:()=>g(!1),disabled:h||l,maxLength:r,rows:n?1:x,bare:!0,"aria-describedby":p(t&&`${e}-error`,o&&!t&&`${e}-helper`,v&&`${e}-count`),"aria-invalid":t,className:p("dndev-w-full",n&&"dndev-overflow-hidden",$),"data-variant":t?"destructive":void 0,style:{resize:n?"none":void 0},...S}),l&&s("div",{className:"dndev-absolute",style:{right:"var(--gap-md)",top:"var(--gap-md)"},children:s(_,{"aria-label":"Loading"})})]})}),v&&r&&a("div",{id:`${e}-count`,style:{fontSize:"var(--font-size-xs)",textAlign:"right",color:w?"var(--destructive-foreground)":j?"var(--warning)":"var(--muted-foreground)"},children:[c,"/",r]}),t&&a(m,{as:"p",id:`${e}-error`,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[s("span",{children:"\u26A0"}),f]}),o&&!t&&s("p",{id:`${e}-helper`,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:o})]})};var J=k;export{J as default};
@@ -1,5 +1,5 @@
1
1
  import { Input } from '@donotdev/components';
2
- import type { ChangeEvent, ComponentProps, ComponentType } from 'react';
2
+ import type { ChangeEvent, ComponentProps } from 'react';
3
3
  export interface TextFieldComponentProps extends Omit<ComponentProps<typeof Input>, 'value' | 'onChange'> {
4
4
  /** Field label */
5
5
  label: string;
@@ -27,7 +27,7 @@ export interface TextFieldComponentProps extends Omit<ComponentProps<typeof Inpu
27
27
  /**
28
28
  * Enhanced TextFieldComponent with modern UX features
29
29
  *
30
- * @version 0.0.1
30
+ * @version 0.1.0
31
31
  * @since 0.0.1
32
32
  * @author AMBROISE PARK Consulting
33
33
  *
@@ -35,7 +35,7 @@ export interface TextFieldComponentProps extends Omit<ComponentProps<typeof Inpu
35
35
  * - Full ARIA compliance
36
36
  * - Loading states with spinner
37
37
  *
38
- * @version 0.0.1
38
+ * @version 0.1.0
39
39
  * @since 0.0.1
40
40
  * @author AMBROISE PARK Consulting
41
41
  * - Character counting
@@ -46,6 +46,6 @@ export interface TextFieldComponentProps extends Omit<ComponentProps<typeof Inpu
46
46
  * @param props - TextFieldComponentProps
47
47
  * @returns JSX.Element
48
48
  */
49
- declare const TextFieldComponent: ComponentType<TextFieldComponentProps>;
49
+ declare function TextFieldComponent({ label, value, onChange, error, helperText, type, loading, maxLength, showCharCount, required, disabled, className, ref, ...props }: TextFieldComponentProps): import("react/jsx-runtime").JSX.Element;
50
50
  export default TextFieldComponent;
51
51
  //# sourceMappingURL=TextFieldComponent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/TextFieldComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,EAA6B,MAAM,sBAAsB,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExE,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CACnD,cAAc,CAAC,OAAO,KAAK,CAAC,EAC5B,OAAO,GAAG,UAAU,CACrB;IACC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CACR,KAAK,EAAE,WAAW,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,KACvD,IAAI,CAAC;IACV,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,QAAA,MAAM,kBAAkB,EAAE,aAAa,CAAC,uBAAuB,CAkG9D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"TextFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/TextFieldComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,EAA6B,MAAM,sBAAsB,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEzD,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CACnD,cAAc,CAAC,OAAO,KAAK,CAAC,EAC5B,OAAO,GAAG,UAAU,CACrB;IACC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CACR,KAAK,EAAE,WAAW,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,KACvD,IAAI,CAAC;IACV,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,KAAU,EACV,QAAQ,EACR,KAAK,EACL,UAAU,EACV,IAAa,EACb,OAAe,EACf,SAAS,EACT,aAAqB,EACrB,QAAgB,EAChB,QAAgB,EAChB,SAAS,EACT,GAAG,EACH,GAAG,KAAK,EACT,EAAE,uBAAuB,2CAwFzB;AAED,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as n,jsxs as o}from"react/jsx-runtime";import{useId as w}from"react";import{Input as C,cn as c,Stack as u}from"@donotdev/components";const S=({label:h,value:d="",onChange:v,error:l,helperText:a,type:g="text",loading:f=!1,maxLength:r,showCharCount:s=!1,required:p=!1,disabled:m=!1,className:x,...y})=>{const e=w(),t=!!l,i=d.length,z=r&&i>r*.8,$=r&&i>r,{children:q,...b}=y;return o(u,{gap:"tight",children:[n(C,{id:e,type:g,value:d,onChange:v,label:h,disabled:m||f,maxLength:r,required:p,"aria-describedby":c(t&&`${e}-error`,a&&!t&&`${e}-helper`,s&&`${e}-count`),"aria-invalid":t,className:c("dndev-w-full",x),"data-variant":t?"destructive":void 0,...b}),s&&r&&o("div",{id:`${e}-count`,style:{fontSize:"var(--font-size-xs)",textAlign:"right",color:$?"var(--destructive-foreground)":z?"var(--warning)":"var(--muted-foreground)"},children:[i,"/",r]}),t&&o(u,{id:`${e}-error`,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[n("span",{children:"\u26A0"}),l]}),a&&!t&&n("p",{id:`${e}-helper`,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:a})]})};var j=S;export{j as default};
1
+ "use client";import{jsx as o,jsxs as s}from"react/jsx-runtime";import{useId as x}from"react";import{Input as _,cn as c,Stack as f}from"@donotdev/components";function w({label:u,value:d="",onChange:v,error:a,helperText:t,type:p="text",loading:g=!1,maxLength:r,showCharCount:l=!1,required:h=!1,disabled:m=!1,className:z,ref:$,...b}){const e=x(),i=!!a,n=d.length,y=r&&n>r*.8,S=r&&n>r,{children:A,...j}=b;return s(f,{gap:"tight",children:[o(_,{ref:$,id:e,type:p,value:d,onChange:v,label:u,disabled:m||g,maxLength:r,required:h,"aria-describedby":c(i&&`${e}-error`,t&&!i&&`${e}-helper`,l&&`${e}-count`),"aria-invalid":i,className:c("dndev-w-full",z),"data-variant":i?"destructive":void 0,...j}),l&&r&&s("div",{id:`${e}-count`,style:{fontSize:"var(--font-size-xs)",textAlign:"right",color:S?"var(--destructive-foreground)":y?"var(--warning)":"var(--muted-foreground)"},children:[n,"/",r]}),i&&s(f,{id:`${e}-error`,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[o("span",{children:"\u26A0"}),a]}),t&&!i&&o("p",{id:`${e}-helper`,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:t})]})}var E=w;export{E as default};
@@ -6,8 +6,8 @@ export interface TimestampFieldComponentProps {
6
6
  value?: Date | null;
7
7
  /** Change handler - accepts both event and direct value */
8
8
  onChange: (date: Date | null | ChangeEvent<HTMLInputElement>) => void;
9
- /** Error state */
10
- error?: boolean;
9
+ /** Error message */
10
+ error?: string;
11
11
  /** Helper text */
12
12
  helperText?: string;
13
13
  /** Mode for underlying date field (defaults to "datetime-local") */
@@ -1 +1 @@
1
- {"version":3,"file":"TimestampFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/TimestampFieldComponent.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACtE,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,uBAAuB,EAAE,aAAa,CAAC,4BAA4B,CAuCxE,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"TimestampFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/TimestampFieldComponent.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACtE,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,uBAAuB,EAAE,aAAa,CAAC,4BAA4B,CAuCxE,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- import{jsx as s}from"react/jsx-runtime";import d from"./DateFieldComponent";const g=({label:a,value:e,onChange:r,error:o,helperText:l,mode:n="datetime-local",required:u})=>{const i=e?new Date(e).toISOString():"";return s(d,{label:a,value:i,onChange:t=>{if(t){const m={target:{value:new Date(t).toISOString()}};r(m)}else r({target:{value:""}})},error:o,helperText:l,mode:n,required:u})};var p=g;export{p as default};
1
+ import{jsx as m}from"react/jsx-runtime";import h from"./DateFieldComponent";const p=({label:o,value:e,onChange:t,error:a,helperText:r,mode:s="datetime-local",required:l})=>{const i=e?new Date(e).toISOString():"";return m(h,{label:o,value:i,onChange:n=>{if(n){const d={target:{value:new Date(n).toISOString()}};t(d)}else t({target:{value:""}})},error:a,helperText:r,mode:s,required:l})};var f=p;export{f as default};
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Form field components
3
3
  * @description Form input components for CRUD operations
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -1 +1 @@
1
- import{default as o}from"./AvatarFieldComponent";import{default as t}from"./BadgeFieldComponent";import{default as e}from"./TextFieldComponent";import{default as a}from"./NumberFieldComponent";import{default as m}from"./DateFieldComponent";import{default as r}from"./CheckboxFieldComponent";import{default as n}from"./ComboboxComponent";import{default as p}from"./DropdownComponent";import{default as s}from"./MultiDropdownComponent";import{default as i}from"./FileFieldComponent";import{default as d}from"./ImageFieldComponent";import{default as f}from"./DocumentFieldComponent";import{default as l}from"./TextAreaComponent";import{default as u}from"./SwitchFieldComponent";import{default as C}from"./RadioFieldComponent";import{default as F}from"./RangeFieldComponent";import{default as T}from"./RatingFieldComponent";import{default as R}from"./DurationFieldComponent";import{DURATION_PRESETS as x}from"./DurationFieldComponent";import{default as D}from"./PhoneNumberComponent";import{default as c}from"./GeoPointFieldComponent";import{default as P}from"./MapFieldComponent";import{default as b}from"./TimestampFieldComponent";import{default as A}from"./MultiInputTextFieldComponent";import{default as S}from"./ButtonFieldComponent";import{default as g}from"./HiddenFieldComponent";import{default as h}from"./PasswordFieldComponent";import{default as w}from"./AddressFieldComponent";import{default as E}from"./CurrencyFieldComponent";import{default as I}from"./PriceFieldComponent";import{default as N}from"./RichTextComponent";import{default as M}from"./GdprConsentFieldComponent";export{w as AddressFieldComponent,o as AvatarFieldComponent,t as BadgeFieldComponent,S as ButtonFieldComponent,r as CheckboxFieldComponent,n as ComboboxComponent,E as CurrencyFieldComponent,x as DURATION_PRESETS,m as DateFieldComponent,f as DocumentFieldComponent,p as DropdownComponent,R as DurationFieldComponent,i as FileFieldComponent,M as GdprConsentFieldComponent,c as GeoPointFieldComponent,g as HiddenFieldComponent,d as ImageFieldComponent,P as MapFieldComponent,s as MultiDropdownComponent,A as MultiInputTextFieldComponent,a as NumberFieldComponent,h as PasswordFieldComponent,D as PhoneNumberComponent,I as PriceFieldComponent,C as RadioFieldComponent,F as RangeFieldComponent,T as RatingFieldComponent,N as RichTextComponent,u as SwitchFieldComponent,l as TextAreaComponent,e as TextFieldComponent,b as TimestampFieldComponent};
1
+ import{default as t}from"./AvatarFieldComponent";import{default as n}from"./BadgeFieldComponent";import{default as m}from"./TextFieldComponent";import{default as d}from"./NumberFieldComponent";import{default as l}from"./DateFieldComponent";import{default as x}from"./CheckboxFieldComponent";import{default as s}from"./ComboboxComponent";import{default as F}from"./DropdownComponent";import{default as c}from"./MultiDropdownComponent";import{default as R}from"./FileFieldComponent";import{default as P}from"./ImageFieldComponent";import{default as h}from"./DocumentFieldComponent";import{default as A}from"./TextAreaComponent";import{default as M}from"./SwitchFieldComponent";import{default as S}from"./RadioFieldComponent";import{default as E}from"./RangeFieldComponent";import{default as k}from"./RatingFieldComponent";import{default as y}from"./DurationFieldComponent";import{DURATION_PRESETS as O}from"./DurationFieldComponent";import{default as _}from"./PhoneNumberComponent";import{default as q}from"./GeoPointFieldComponent";import{default as J}from"./MapFieldComponent";import{default as L}from"./TimestampFieldComponent";import{default as V}from"./MultiInputTextFieldComponent";import{default as X}from"./ButtonFieldComponent";import{default as Z}from"./HiddenFieldComponent";import{default as oo}from"./PasswordFieldComponent";import{default as to}from"./AddressFieldComponent";import{default as no}from"./CurrencyFieldComponent";import{default as mo}from"./PriceFieldComponent";import{default as fo}from"./RichTextComponent";import{default as uo}from"./GdprConsentFieldComponent";export{to as AddressFieldComponent,t as AvatarFieldComponent,n as BadgeFieldComponent,X as ButtonFieldComponent,x as CheckboxFieldComponent,s as ComboboxComponent,no as CurrencyFieldComponent,O as DURATION_PRESETS,l as DateFieldComponent,h as DocumentFieldComponent,F as DropdownComponent,y as DurationFieldComponent,R as FileFieldComponent,uo as GdprConsentFieldComponent,q as GeoPointFieldComponent,Z as HiddenFieldComponent,P as ImageFieldComponent,J as MapFieldComponent,c as MultiDropdownComponent,V as MultiInputTextFieldComponent,d as NumberFieldComponent,oo as PasswordFieldComponent,_ as PhoneNumberComponent,mo as PriceFieldComponent,S as RadioFieldComponent,E as RangeFieldComponent,k as RatingFieldComponent,fo as RichTextComponent,M as SwitchFieldComponent,A as TextAreaComponent,m as TextFieldComponent,L as TimestampFieldComponent};
@@ -6,7 +6,7 @@ import type { ComponentType } from 'react';
6
6
  * Delegates to TiptapEditorInner once modules are loaded so that
7
7
  * useEditor (a React hook) is called at the top level of a component.
8
8
  *
9
- * @version 0.0.2
9
+ * @version 0.1.0
10
10
  * @since 0.0.1
11
11
  * @author AMBROISE PARK Consulting
12
12
  */
@@ -1,4 +1,4 @@
1
- "use client";import{jsx as i,jsxs as m}from"react/jsx-runtime";import{useEffect as u,useState as f}from"react";import{Stack as M}from"@donotdev/components";const x=({label:s,value:r="",onChange:d,error:e,helperText:n,required:o,disabled:a,placeholder:l,className:c,modules:g})=>{const{useEditor:v,EditorContent:p,StarterKit:h,Placeholder:b}=g,t=v({extensions:[h.configure({heading:{levels:[1,2,3]}}),b.configure({placeholder:l||"Start typing..."})],content:r,editable:!a,onUpdate:({editor:P})=>{const y={target:{value:P.getHTML()}};d(y)}});return u(()=>{t&&r!==t.getHTML()&&t.commands.setContent(r||"")},[r,t]),t?m(M,{gap:"tight",children:[m("label",{style:{fontSize:"var(--font-size-sm)",fontWeight:500,color:e?"var(--destructive-foreground)":"var(--foreground)"},children:[s,o&&i("span",{style:{color:"var(--destructive)"},children:" *"})]}),i("div",{className:c,"data-variant":e?"destructive":void 0,style:{border:"var(--border-hairline) solid",borderColor:e?"var(--destructive)":"var(--line-2)",borderRadius:"var(--radius-interactive)",padding:"var(--gap-md)",minHeight:"200px",backgroundColor:a?"var(--muted)":"transparent",opacity:a?"var(--opacity-muted)":void 0},children:i(p,{editor:t})}),n&&i("p",{style:{fontSize:"var(--font-size-xs)",color:e?"var(--destructive-foreground)":"var(--muted-foreground)"},children:n}),i("style",{children:`
1
+ "use client";import{jsx as i,jsxs as u}from"react/jsx-runtime";import{useEffect as f,useState as m}from"react";import{Stack as b}from"@donotdev/components";const x=({label:n,value:e="",onChange:d,error:r,helperText:a,required:c,disabled:t,placeholder:s,className:l,modules:p})=>{const{useEditor:g,EditorContent:h,StarterKit:v,Placeholder:M}=p,o=g({extensions:[v.configure({heading:{levels:[1,2,3]}}),M.configure({placeholder:s||"Start typing..."})],content:e,editable:!t,onUpdate:({editor:P})=>{const y={target:{value:P.getHTML()}};d(y)}});return f(()=>{o&&e!==o.getHTML()&&o.commands.setContent(e||"")},[e,o]),o?u(b,{gap:"tight",children:[u("label",{style:{fontSize:"var(--font-size-sm)",fontWeight:500,color:r?"var(--destructive-foreground)":"var(--foreground)"},children:[n,c&&i("span",{style:{color:"var(--destructive)"},children:" *"})]}),i("div",{className:l,"data-variant":r?"destructive":void 0,style:{border:"var(--border-hairline) solid",borderColor:r?"var(--destructive)":"var(--line-2)",borderRadius:"var(--radius-interactive)",padding:"var(--gap-md)",minHeight:"200px",backgroundColor:t?"var(--muted)":"transparent",opacity:t?"var(--opacity-muted)":void 0},children:i(h,{editor:o})}),a&&i("p",{style:{fontSize:"var(--font-size-xs)",color:r?"var(--destructive-foreground)":"var(--muted-foreground)"},children:a}),i("style",{children:`
2
2
  .ProseMirror {
3
3
  outline: none;
4
4
  min-height: 150px;
@@ -49,4 +49,4 @@
49
49
  margin: 0.5em 0;
50
50
  color: var(--muted-foreground);
51
51
  }
52
- `})]}):null},z=s=>{const[r,d]=f(null),[e,n]=f(!1);return u(()=>{r||e||(async()=>{try{const[{useEditor:o,EditorContent:a},l,c]=await Promise.all([import("@tiptap/react"),import("@tiptap/starter-kit"),import("@tiptap/extension-placeholder")]);d({useEditor:o,EditorContent:a,StarterKit:l.default,Placeholder:c.default})}catch(o){o instanceof Error&&(o.message.includes("Cannot find module '@tiptap")||o.message.includes("Failed to fetch dynamically imported module")),n(!0)}})()},[r,e]),e||!r?null:i(x,{...s,modules:r})};var C=z;export{C as default};
52
+ `})]}):null},E=n=>{const[e,d]=m(null),[r,a]=m(!1);return f(()=>{if(e||r)return;(async()=>{try{const[{useEditor:t,EditorContent:s},l,p]=await Promise.all([import("@tiptap/react"),import("@tiptap/starter-kit"),import("@tiptap/extension-placeholder")]);d({useEditor:t,EditorContent:s,StarterKit:l.default,Placeholder:p.default})}catch(t){t instanceof Error&&(t.message.includes("Cannot find module '@tiptap")||t.message.includes("Failed to fetch dynamically imported module")),a(!0)}})()},[e,r]),r||!e?null:i(x,{...n,modules:e})};var C=E;export{C as default};
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Shared Field Component Types
3
3
  * @description Types shared between field components to break circular dependencies
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Form components barrel export
3
3
  * @description Re-exports all form-related components
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -1 +1 @@
1
- "use client";import{jsx as e,Fragment as re,jsxs as a}from"react/jsx-runtime";import{ChevronLeft as ne,ChevronRight as le,RotateCcw as M,RotateCw as B,Trash2 as de,Check as ce,Undo2 as se,ZoomIn as ge,ZoomOut as me,Maximize2 as pe,Grid3X3 as he}from"lucide-react";import{useCallback as g,useEffect as H,useState as c,useRef as ue}from"react";import ve from"react-easy-crop";import{Button as o,BUTTON_VARIANT as r,Sheet as fe,Stack as l,Text as u,Slider as F,ToggleGroup as ye}from"@donotdev/components";import{useTranslation as we}from"@donotdev/core";import{processImage as Ce}from"../../../utils/imageProcessing";import{createPreviewURL as be,revokePreviewURL as ke}from"../../../utils/imageUtils";const xe={free:void 0,"1:1":1,"4:3":4/3,"16:9":16/9,"3:2":3/2};function Y({images:h,selectedIndex:n,open:T,onClose:U,onUpdate:Z,onDelete:E,onNavigate:m,multiple:L=!1}){const{t}=we("crud"),[D,C]=c({x:0,y:0}),[v,p]=c(1),[b,f]=c(0),[N,$]=c(null),[S,z]=c("free"),[k,q]=c(!0),[y,w]=c(!1),[A,G]=c(!1),[X,x]=c(!1),I=ue({crop:{x:0,y:0},zoom:1,rotation:0}),d=h[n],R=L&&n>0,O=L&&n<h.length-1;H(()=>{if(d){const i={x:0,y:0};C(i),p(1),f(d.rotation*90),z("free"),w(!1),x(!1),I.current={crop:i,zoom:1,rotation:d.rotation*90}}},[d]);const _=g((i,s)=>{$(s)},[]),J=g(()=>{C(I.current.crop),p(I.current.zoom),f(I.current.rotation)},[]),P=g(()=>{f(i=>(i-90+360)%360)},[]),V=g(()=>{f(i=>(i+90)%360)},[]),K=g(()=>{p(i=>Math.min(i+.25,3))},[]),Q=g(()=>{p(i=>Math.max(i-.25,1))},[]),ee=g(()=>{p(1),C({x:0,y:0})},[]),ie=async()=>{if(!(!d||!N)){G(!0);try{const i=await Ce(d.file,{crop:N,maxWidth:2048,maxHeight:2048,quality:.95}),s=new File([i.fullBlob],d.file.name,{type:"image/webp"}),oe=be(s);d.previewURL.startsWith("blob:")&&ke(d.previewURL),Z(n,{file:s,previewURL:oe,uploaded:null,uploadProgress:null,error:null,rotation:0}),w(!1)}catch{}finally{G(!1)}}},te=g(()=>{E(n),x(!1),h.length===1?U():n>=h.length-1&&m(n-1)},[n,h.length,E,U,m]);if(H(()=>{if(!T)return;const i=s=>{s.key==="ArrowLeft"&&R?m(n-1):s.key==="ArrowRight"&&O?m(n+1):s.key==="Escape"&&y&&w(!1)};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[T,R,O,n,m,y]),!d)return null;const W=d.uploadProgress!==null&&d.uploadProgress<100,j=d.uploaded?.fullUrl||d.previewURL,ae=L?t("image.editor.titleWithIndex",{current:n+1,total:h.length}):t("image.editor.title");return e(fe,{open:T,onOpenChange:i=>!i&&U(),side:"right",title:ae,description:t("image.editor.description"),noSwipe:y,children:a(l,{gap:"large",style:{height:"100%"},children:[e("div",{style:{position:"relative",flex:1,minHeight:300,backgroundColor:"var(--surface-muted)",borderRadius:"var(--radius-lg)",overflow:"hidden"},children:y?e(ve,{image:j,crop:D,zoom:v,rotation:b,aspect:xe[S],onCropChange:C,onCropComplete:_,onZoomChange:p,showGrid:k,style:{containerStyle:{position:"absolute",top:0,left:0,right:0,bottom:0},cropAreaStyle:{border:"2px solid var(--primary)",boxShadow:"0 0 0 9999px rgba(0,0,0,0.5)"}}}):a(re,{children:[R&&e(o,{variant:r.GHOST,icon:ne,onClick:()=>m(n-1),"aria-label":t("image.editor.previousImage"),style:{position:"absolute",left:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}}),e("img",{src:j,alt:`Image ${n+1}`,style:{width:"100%",height:"100%",objectFit:"contain",transform:`rotate(${b}deg)`,transition:"transform var(--dur-normal) var(--ease-out)"}}),O&&e(o,{variant:r.GHOST,icon:le,onClick:()=>m(n+1),"aria-label":t("image.editor.nextImage"),style:{position:"absolute",right:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}})]})}),y?a(l,{children:[a(l,{gap:"tight",children:[e(u,{level:"small",variant:"muted",children:t("image.editor.aspectRatio")}),e(ye,{type:"single",value:S,onValueChange:i=>i&&z(i),items:[{value:"free",label:t("image.editor.aspectFree")},{value:"1:1",label:"1:1"},{value:"4:3",label:"4:3"},{value:"16:9",label:"16:9"}]})]}),a(l,{gap:"tight",children:[a(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:t("image.editor.zoom")}),a(u,{level:"small",variant:"muted",children:[Math.round(v*100),"%"]})]}),a(l,{direction:"row",gap:"tight",align:"center",children:[e(o,{variant:r.OUTLINE,icon:me,display:"compact",onClick:Q,disabled:v<=1}),e(F,{value:[v],min:1,max:3,step:.05,onValueChange:i=>p(i[0]??1),style:{flex:1}}),e(o,{variant:r.OUTLINE,icon:ge,display:"compact",onClick:K,disabled:v>=3})]})]}),a(l,{gap:"tight",children:[a(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:t("image.editor.rotation")}),a(u,{level:"small",variant:"muted",children:[b,"\xB0"]})]}),a(l,{direction:"row",gap:"tight",align:"center",children:[e(o,{variant:r.OUTLINE,icon:M,display:"compact",onClick:P,tooltip:t("image.editor.rotateLeft")}),e(F,{value:[b],min:0,max:360,step:1,onValueChange:i=>f(i[0]??0),style:{flex:1}}),e(o,{variant:r.OUTLINE,icon:B,display:"compact",onClick:V,tooltip:t("image.editor.rotateRight")})]})]}),a(l,{direction:"row",gap:"tight",children:[e(o,{variant:r.OUTLINE,icon:pe,display:"compact",onClick:ee,tooltip:t("image.editor.fitToView")}),e(o,{variant:r.OUTLINE,icon:he,display:"compact",onClick:()=>q(!k),tooltip:t(k?"image.editor.hideGrid":"image.editor.showGrid"),"data-active":k||void 0}),e(o,{variant:r.OUTLINE,icon:se,display:"compact",onClick:J,tooltip:t("image.editor.reset")})]}),a(l,{direction:"row",style:{marginTop:"var(--gap-md)"},children:[e(o,{variant:r.OUTLINE,onClick:()=>w(!1),fullWidth:!0,children:t("image.editor.cancel")}),e(o,{variant:r.PRIMARY,icon:ce,onClick:ie,disabled:A,fullWidth:!0,children:t(A?"image.editor.processing":"image.editor.apply")})]})]}):a(l,{children:[a(l,{direction:"row",gap:"tight",justify:"center",children:[e(o,{variant:r.OUTLINE,icon:M,display:"compact",onClick:P,tooltip:t("image.editor.rotateLeft")}),e(o,{variant:r.PRIMARY,onClick:()=>w(!0),disabled:W,children:t("image.editor.editButton")}),e(o,{variant:r.OUTLINE,icon:B,display:"compact",onClick:V,tooltip:t("image.editor.rotateRight")})]}),X?a(l,{style:{border:"1px solid var(--destructive)",padding:"var(--gap-md)",borderRadius:"var(--radius-md)"},children:[e(u,{variant:"destructive",level:"small",textAlign:"center",children:t("image.editor.deleteConfirm")}),a(l,{direction:"row",gap:"tight",children:[e(o,{variant:r.OUTLINE,onClick:()=>x(!1),fullWidth:!0,children:t("image.editor.cancel")}),e(o,{variant:r.DESTRUCTIVE,onClick:te,fullWidth:!0,children:t("actions.delete")})]})]}):e(o,{variant:r.GHOST,icon:de,onClick:()=>x(!0),disabled:W,style:{color:"var(--destructive)"},children:t("image.editor.deleteImage")})]})]})})}var Ie=Y;export{Y as ImageViewerDialog,Ie as default};
1
+ "use client";import{jsx as e,Fragment as re,jsxs as o}from"react/jsx-runtime";import{ChevronLeft as ae,ChevronRight as ne,RotateCcw as W,RotateCw as M,Trash2 as le,Check as ce,Undo2 as se,ZoomIn as de,ZoomOut as pe,Maximize2 as me,Grid3X3 as ge}from"lucide-react";import{useCallback as p,useEffect as Z,useState as s,useRef as he}from"react";import ue from"react-easy-crop";import{Button as r,BUTTON_VARIANT as a,Sheet as fe,Stack as l,Text as u,Slider as _,ToggleGroup as ve}from"@donotdev/components";import{useTranslation as we}from"@donotdev/core";import{processImage as ye}from"../../../utils/imageProcessing";import{createPreviewURL as Ce,revokePreviewURL as be}from"../../../utils/imageUtils";const Re={free:void 0,"1:1":1,"4:3":4/3,"16:9":16/9,"3:2":3/2};function ke({images:h,selectedIndex:n,open:L,onClose:U,onUpdate:B,onDelete:S,onNavigate:m,multiple:E=!1}){const{t:i}=we("crud"),[D,C]=s({x:0,y:0}),[f,g]=s(1),[b,v]=s(0),[I,H]=s(null),[A,P]=s("free"),[R,Y]=s(!0),[w,y]=s(!1),[G,z]=s(!1),[$,k]=s(!1),T=he({crop:{x:0,y:0},zoom:1,rotation:0}),c=h[n],O=E&&n>0,x=E&&n<h.length-1;Z(()=>{if(c){const t={x:0,y:0};C(t),g(1),v(c.rotation*90),P("free"),y(!1),k(!1),T.current={crop:t,zoom:1,rotation:c.rotation*90}}},[c]);const q=p((t,d)=>{H(d)},[]),K=p(()=>{C(T.current.crop),g(T.current.zoom),v(T.current.rotation)},[]),j=p(()=>{v(t=>(t-90+360)%360)},[]),F=p(()=>{v(t=>(t+90)%360)},[]),X=p(()=>{g(t=>Math.min(t+.25,3))},[]),J=p(()=>{g(t=>Math.max(t-.25,1))},[]),Q=p(()=>{g(1),C({x:0,y:0})},[]),ee=async()=>{if(!(!c||!I)){z(!0);try{const t=await ye(c.file,{crop:I,maxWidth:2048,maxHeight:2048,quality:.95}),d=new File([t.fullBlob],c.file.name,{type:"image/webp"}),oe=Ce(d);c.previewURL.startsWith("blob:")&&be(c.previewURL),B(n,{file:d,previewURL:oe,uploaded:null,uploadProgress:null,error:null,rotation:0}),y(!1)}catch{}finally{z(!1)}}},te=p(()=>{S(n),k(!1),h.length===1?U():n>=h.length-1&&m(n-1)},[n,h.length,S,U,m]);if(Z(()=>{if(!L)return;const t=d=>{d.key==="ArrowLeft"&&O?m(n-1):d.key==="ArrowRight"&&x?m(n+1):d.key==="Escape"&&w&&y(!1)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[L,O,x,n,m,w]),!c)return null;const N=c.uploadProgress!==null&&c.uploadProgress<100,V=c.uploaded?.fullUrl||c.previewURL,ie=E?i("image.editor.titleWithIndex",{current:n+1,total:h.length}):i("image.editor.title");return e(fe,{open:L,onOpenChange:t=>!t&&U(),side:"right",title:ie,description:i("image.editor.description"),noSwipe:w,children:o(l,{gap:"large",style:{height:"100%"},children:[e("div",{style:{position:"relative",flex:1,minHeight:300,backgroundColor:"var(--surface-muted)",borderRadius:"var(--radius-lg)",overflow:"hidden"},children:w?e(ue,{image:V,crop:D,zoom:f,rotation:b,aspect:Re[A],onCropChange:C,onCropComplete:q,onZoomChange:g,showGrid:R,style:{containerStyle:{position:"absolute",top:0,left:0,right:0,bottom:0},cropAreaStyle:{border:"2px solid var(--primary)",boxShadow:"0 0 0 9999px rgba(0,0,0,0.5)"}}}):o(re,{children:[O&&e(r,{variant:a.GHOST,icon:ae,onClick:()=>m(n-1),"aria-label":i("image.editor.previousImage"),style:{position:"absolute",left:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}}),e("img",{src:V,alt:`Image ${n+1}`,style:{width:"100%",height:"100%",objectFit:"contain",transform:`rotate(${b}deg)`,transition:"transform var(--dur-normal) var(--ease-out)"}}),x&&e(r,{variant:a.GHOST,icon:ne,onClick:()=>m(n+1),"aria-label":i("image.editor.nextImage"),style:{position:"absolute",right:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}})]})}),w?o(l,{children:[o(l,{gap:"tight",children:[e(u,{level:"small",variant:"muted",children:i("image.editor.aspectRatio")}),e(ve,{type:"single",value:A,onValueChange:t=>t&&P(t),items:[{value:"free",label:i("image.editor.aspectFree")},{value:"1:1",label:"1:1"},{value:"4:3",label:"4:3"},{value:"16:9",label:"16:9"}]})]}),o(l,{gap:"tight",children:[o(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:i("image.editor.zoom")}),o(u,{level:"small",variant:"muted",children:[Math.round(f*100),"%"]})]}),o(l,{direction:"row",gap:"tight",align:"center",children:[e(r,{variant:a.OUTLINE,icon:pe,display:"compact",onClick:J,disabled:f<=1}),e(_,{value:[f],min:1,max:3,step:.05,onValueChange:t=>g(t[0]??1),style:{flex:1}}),e(r,{variant:a.OUTLINE,icon:de,display:"compact",onClick:X,disabled:f>=3})]})]}),o(l,{gap:"tight",children:[o(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:i("image.editor.rotation")}),o(u,{level:"small",variant:"muted",children:[b,"\xB0"]})]}),o(l,{direction:"row",gap:"tight",align:"center",children:[e(r,{variant:a.OUTLINE,icon:W,display:"compact",onClick:j,tooltip:i("image.editor.rotateLeft")}),e(_,{value:[b],min:0,max:360,step:1,onValueChange:t=>v(t[0]??0),style:{flex:1}}),e(r,{variant:a.OUTLINE,icon:M,display:"compact",onClick:F,tooltip:i("image.editor.rotateRight")})]})]}),o(l,{direction:"row",gap:"tight",children:[e(r,{variant:a.OUTLINE,icon:me,display:"compact",onClick:Q,tooltip:i("image.editor.fitToView")}),e(r,{variant:a.OUTLINE,icon:ge,display:"compact",onClick:()=>Y(!R),tooltip:i(R?"image.editor.hideGrid":"image.editor.showGrid"),"data-active":R||void 0}),e(r,{variant:a.OUTLINE,icon:se,display:"compact",onClick:K,tooltip:i("image.editor.reset")})]}),o(l,{direction:"row",style:{marginTop:"var(--gap-md)"},children:[e(r,{variant:a.OUTLINE,onClick:()=>y(!1),fullWidth:!0,children:i("image.editor.cancel")}),e(r,{variant:a.PRIMARY,icon:ce,onClick:ee,disabled:G,fullWidth:!0,children:i(G?"image.editor.processing":"image.editor.apply")})]})]}):o(l,{children:[o(l,{direction:"row",gap:"tight",justify:"center",children:[e(r,{variant:a.OUTLINE,icon:W,display:"compact",onClick:j,tooltip:i("image.editor.rotateLeft")}),e(r,{variant:a.PRIMARY,onClick:()=>y(!0),disabled:N,children:i("image.editor.editButton")}),e(r,{variant:a.OUTLINE,icon:M,display:"compact",onClick:F,tooltip:i("image.editor.rotateRight")})]}),$?o(l,{style:{border:"1px solid var(--destructive)",padding:"var(--gap-md)",borderRadius:"var(--radius-md)"},children:[e(u,{variant:"destructive",level:"small",textAlign:"center",children:i("image.editor.deleteConfirm")}),o(l,{direction:"row",gap:"tight",children:[e(r,{variant:a.OUTLINE,onClick:()=>k(!1),fullWidth:!0,children:i("image.editor.cancel")}),e(r,{variant:a.DESTRUCTIVE,onClick:te,fullWidth:!0,children:i("actions.delete")})]})]}):e(r,{variant:a.GHOST,icon:le,onClick:()=>k(!0),disabled:N,style:{color:"var(--destructive)"},children:i("image.editor.deleteImage")})]})]})})}var Ae=ke;export{ke as ImageViewerDialog,Ae as default};
@@ -2,7 +2,7 @@
2
2
  * @fileoverview CRUD components
3
3
  * @description Form renderers and components for CRUD operations
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -1 +1 @@
1
- import{default as r}from"./CrudButton";import{FormFieldRenderer as a}from"./FormFieldRenderer";import{DisplayFieldRenderer as e,formatValue as o}from"./DisplayFieldRenderer";import{default as t}from"./FormLayout";export*from"./controlled";export*from"./form";import{EntityFilters as m}from"./EntityFilters";import{matchesFilter as s}from"../utils/matchesFilter";export*from"./fields/display";import{DisplayThumbnail as i}from"./DisplayThumbnail";import{CrudCard as l}from"./CrudCard";export{r as CrudButton,l as CrudCard,e as DisplayFieldRenderer,i as DisplayThumbnail,m as EntityFilters,a as FormFieldRenderer,t as FormLayout,o as formatValue,s as matchesFilter};
1
+ import{default as e}from"./CrudButton";import{FormFieldRenderer as m}from"./FormFieldRenderer";import{DisplayFieldRenderer as p,formatValue as a}from"./DisplayFieldRenderer";import{default as l}from"./FormLayout";export*from"./controlled";export*from"./form";import{EntityFilters as s}from"./EntityFilters";import{matchesFilter as n}from"../utils/matchesFilter";export*from"./fields/display";import{DisplayThumbnail as h}from"./DisplayThumbnail";import{CrudCard as R}from"./CrudCard";export{e as CrudButton,R as CrudCard,p as DisplayFieldRenderer,h as DisplayThumbnail,s as EntityFilters,m as FormFieldRenderer,l as FormLayout,a as formatValue,n as matchesFilter};
@@ -1,4 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
+ /** Props for the {@link UploadProvider} component. */
2
3
  export interface UploadProviderProps {
3
4
  formId: string | undefined;
4
5
  children: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"UploadContext.d.ts","sourceRoot":"","sources":["../../src/contexts/UploadContext.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAIvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD"}
1
+ {"version":3,"file":"UploadContext.d.ts","sourceRoot":"","sources":["../../src/contexts/UploadContext.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAIvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD"}
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{createContext as n,useContext as i}from"react";const e=n(void 0);function s({formId:o,children:r}){return t(e.Provider,{value:o,children:r})}function a(){return i(e)}export{s as UploadProvider,a as useUploadContext};
1
+ "use client";import{jsx as r}from"react/jsx-runtime";import{createContext as n,useContext as i}from"react";const e=n(void 0);function x({formId:t,children:o}){return r(e.Provider,{value:t,children:o})}function p(){return i(e)}export{x as UploadProvider,p as useUploadContext};
@@ -1 +1 @@
1
- import{UploadProvider as o,useUploadContext as a}from"./UploadContext";export{o as UploadProvider,a as useUploadContext};
1
+ import{UploadProvider as r,useUploadContext as d}from"./UploadContext";export{r as UploadProvider,d as useUploadContext};
@@ -1 +1 @@
1
- {"version":3,"file":"fieldTypeRegistry.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AASnE,YAAY,EACV,UAAU,EACV,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAInC,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAInC;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAa1E"}
1
+ {"version":3,"file":"fieldTypeRegistry.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AASnE,YAAY,EACV,UAAU,EACV,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAInC,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAInC;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAa1E"}
@@ -1 +1 @@
1
- "use client";import{getFieldRegistry as i}from"./FieldRegistry";import{registerAllBuiltinFieldTypes as s}from"./registerBuiltinFieldTypes";import{setRegistrationInit as r,getMetadataRegistry as l}from"./fieldTypeRegistry.store";r(e=>{s(e,i())});import{getFieldTypeMetadata as o,getFilterType as p,getDisplayFormatter as g,isFilterable as y,getValueType as n,clearFieldTypeRegistry as F}from"./fieldTypeRegistry.store";function d(e){const{type:a,components:t}=e;t&&i().registerComponent(a,t.controlled,t.uncontrolled),l().set(a,e)}export{F as clearFieldTypeRegistry,g as getDisplayFormatter,o as getFieldTypeMetadata,p as getFilterType,n as getValueType,y as isFilterable,d as registerBuiltinFieldType};
1
+ "use client";import{getFieldRegistry as r}from"./FieldRegistry";import{registerAllBuiltinFieldTypes as o}from"./registerBuiltinFieldTypes";import{setRegistrationInit as l,getMetadataRegistry as s}from"./fieldTypeRegistry.store";l(e=>{o(e,r())});import{getFieldTypeMetadata as d,getFilterType as F,getDisplayFormatter as f,isFilterable as u,getValueType as T,clearFieldTypeRegistry as R}from"./fieldTypeRegistry.store";function a(e){const{type:i,components:t}=e;t&&r().registerComponent(i,t.controlled,t.uncontrolled),s().set(i,e)}export{R as clearFieldTypeRegistry,f as getDisplayFormatter,d as getFieldTypeMetadata,F as getFilterType,T as getValueType,u as isFilterable,a as registerBuiltinFieldType};
@@ -1 +1 @@
1
- {"version":3,"file":"fieldTypeRegistry.store.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.store.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAW3D;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,IAAI,GACrD,IAAI,CAEN;AAED,wBAAgB,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAOpE;AAID,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAIlE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAI9B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEhE;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
1
+ {"version":3,"file":"fieldTypeRegistry.store.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.store.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAiB3D;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,IAAI,GACrD,IAAI,CAEN;AAED,wBAAgB,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAOpE;AAID,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAIlE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAI9B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEhE;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -1 +1 @@
1
- "use client";import{getFieldRegistry as a}from"./FieldRegistry";var r=null,i=!1,n=null;function l(e){n=e}function t(){return r||(r=new Map),i||(i=!0,n?.(r)),r}function s(e){return t().get(e)}function u(e){return a().getFilterType(e)||t().get(e)?.filterType}function g(e){return a().getDisplayFormatter(e)||t().get(e)?.displayFormatter}function o(e){return a().isFilterable(e)?!0:t().get(e)?.filterable??!1}function p(e){return t().get(e)?.valueType}function y(){t().clear()}export{y as clearFieldTypeRegistry,g as getDisplayFormatter,s as getFieldTypeMetadata,u as getFilterType,t as getMetadataRegistry,p as getValueType,o as isFilterable,l as setRegistrationInit};
1
+ "use client";import{getGlobalSingleton as o}from"@donotdev/core";import{getFieldRegistry as i}from"./FieldRegistry";function n(){return o("field-type-metadata",()=>({registry:new Map,builtinsRegistered:!1,initFn:null}))}function a(t){n().initFn=t}function e(){const t=n();return t.builtinsRegistered||(t.builtinsRegistered=!0,t.initFn?.(t.registry)),t.registry}function s(t){return e().get(t)}function g(t){const r=i().getFilterType(t);return r||e().get(t)?.filterType}function f(t){const r=i().getDisplayFormatter(t);return r||e().get(t)?.displayFormatter}function p(t){return i().isFilterable(t)?!0:e().get(t)?.filterable??!1}function c(t){return e().get(t)?.valueType}function y(){e().clear()}export{y as clearFieldTypeRegistry,f as getDisplayFormatter,s as getFieldTypeMetadata,g as getFilterType,e as getMetadataRegistry,c as getValueType,p as isFilterable,a as setRegistrationInit};
@@ -21,6 +21,10 @@ export type DisplayFormatterOptions = {
21
21
  asString?: boolean;
22
22
  /** Pre-resolved reference data: { collectionName: { id: displayLabel } } */
23
23
  referenceData?: Record<string, Record<string, string>>;
24
+ /** BCP 47 locale tag for date/number formatting (e.g. 'fr', 'ko'). Auto-resolved from i18n when omitted. */
25
+ locale?: string;
26
+ /** Full item record — enables cross-field conditional display via `displayValue` resolver */
27
+ item?: Record<string, unknown>;
24
28
  };
25
29
  export type DisplayFormatter = (value: any, config: EntityField, t: (key: string, options?: Record<string, any>) => string, options?: DisplayFormatterOptions) => string | ReactElement;
26
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"fieldTypeRegistry.types.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.types.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,GACT,aAAa,GACb,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,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,uBAAuB,KAC9B,MAAM,GAAG,YAAY,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;CACtD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yBAAyB;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,oBAAoB;IACpB,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC"}
1
+ {"version":3,"file":"fieldTypeRegistry.types.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.types.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,GACT,aAAa,GACb,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,4GAA4G;IAC5G,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,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,uBAAuB,KAC9B,MAAM,GAAG,YAAY,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;CACtD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yBAAyB;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,oBAAoB;IACpB,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC"}
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Form hooks barrel export
3
3
  * @description Exports all form hooks for custom form building.
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -1 +1 @@
1
- import{useEntityForm as t}from"./useEntityForm";import{useEntityField as o}from"./useEntityField";import{useController as r}from"./useController";export{r as useController,o as useEntityField,t as useEntityForm};
1
+ import{useEntityForm as e}from"./useEntityForm";import{useEntityField as m}from"./useEntityField";import{useController as i}from"./useController";export{i as useController,m as useEntityField,e as useEntityForm};
@@ -1 +1 @@
1
- "use client";import{useController as o}from"react-hook-form";function e(r){return o(r)}export{e as useController};
1
+ "use client";import{useController as e}from"react-hook-form";function t(r){return e(r)}export{t as useController};
@@ -50,7 +50,7 @@ import type { EntityFormReturn, InferEntityData, EntityFieldReturn } from '../ty
50
50
  * @see {@link useEntityForm} for creating the form instance
51
51
  * @see {@link EntityFieldReturn} for return type
52
52
  *
53
- * @version 0.0.2
53
+ * @version 0.1.0
54
54
  * @since 0.0.1
55
55
  * @author AMBROISE PARK Consulting
56
56
  */
@@ -1 +1 @@
1
- "use client";import{useMemo as o,useCallback as p}from"react";import{useController as v}from"./useController";import{formatValue as h}from"../../components/DisplayFieldRenderer";import{isFieldEditable as g}from"../utils";function D(s,e){const{entity:b,operation:r,viewerRole:d,fields:u}=s,l=b.fields[e],i=o(()=>l?{...l,name:l.name||e,label:l.label||e}:{name:e,type:"text",label:e,visibility:"user"},[e,l]),a=o(()=>u.some(n=>n.name===e),[u,e]),c=o(()=>!a||r==="edit"&&i.visibility==="technical"&&i.editable===void 0?!1:g(i.editable,d,r),[a,r,i.visibility,i.editable,d]),{field:m,fieldState:t}=v({name:e,control:s.control}),f=o(()=>({error:t.error?.message,touched:t.isTouched,isDirty:t.isDirty}),[t.error?.message,t.isTouched,t.isDirty]),y=p(n=>h(m.value,i,s.t,n),[m.value,i,s.t]);return{field:m,meta:f,config:i,isEditable:c,isVisible:a,display:y}}export{D as useEntityField};
1
+ "use client";import{useMemo as o,useCallback as p}from"react";import{useController as v}from"./useController";import{formatValue as h}from"../../components/DisplayFieldRenderer";import{isFieldEditable as D}from"../utils";function F(s,e){const{entity:d,operation:n,viewerRole:c,fields:b}=s,r=d.fields[e],t=o(()=>r?{...r,name:r.name||e,label:r.label||e}:{name:e,type:"text",label:e,visibility:"user"},[e,r]),l=o(()=>b.some(u=>u.name===e),[b,e]),y=o(()=>!l||n==="edit"&&t.visibility==="technical"&&t.editable===void 0?!1:D(t.editable,c,n),[l,n,t.visibility,t.editable,c]),{field:a,fieldState:i}=v({name:e,control:s.control}),f=o(()=>({error:i.error?.message,touched:i.isTouched,isDirty:i.isDirty}),[i.error?.message,i.isTouched,i.isDirty]),m=p(u=>h(a.value,t,s.t,u),[a.value,t,s.t]);return{field:a,meta:f,config:t,isEditable:y,isVisible:l,display:m}}export{F as useEntityField};
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AA2ClB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAmerB"}
1
+ {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAyElB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAmkBrB"}
@@ -1 +1 @@
1
- "use client";import{valibotResolver as _}from"@hookform/resolvers/valibot";import{useMemo as d,useEffect as T,useRef as v,useCallback as w,createElement as re}from"react";import{useForm as ae}from"react-hook-form";import{toast as se,ToastAction as oe}from"@donotdev/components";import{useLocalStorage as ne,BACKEND_GENERATED_FIELD_NAMES as ue,createSchemas as ie}from"@donotdev/core";import{useFormStore as j,useFormStatus as ce,useUploadProgress as le}from"../../stores";import{useUploadStore as M}from"../../stores/UploadStore";import{checkForBlobUrls as q}from"../../utils/uploadValidation";import{getFieldsForOperation as de}from"../utils";import{buildInitialFromRecord as fe,buildSchemaDefaults as me}from"../utils/buildInitialValues";const pe=n=>n;function z(n,E){const e={...n};for(const p of Object.keys(E)){const c=n[p],f=E[p];f!==null&&typeof f=="object"&&!Array.isArray(f)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[p]=z(c,f):e[p]=f}return e}function Se(n,E={}){const{formId:e,operation:p,defaultValues:c,viewerRole:f,mode:G="onBlur",t:K}=E,S=K??pe,U=f??"guest",u=p??(c?"edit":"create"),Y=ce(e??""),H=le(e??""),F=d(()=>ie(n),[n.name]),I=d(()=>_(F.create),[F.create]),P=d(()=>_(F.draft),[F.draft]),J=d(()=>async(t,r,a)=>((t?.status??c?.status)==="draft"?P:I)(t,r,a),[I,P,c?.status]),V=d(()=>me(n),[n]),$=c,i=d(()=>{if(u==="create")return V;if($)return fe(n,$)},[u,V,n,$]),o=ae({defaultValues:u==="create"?i:void 0,mode:G,resolver:J,shouldUnregister:!1,shouldFocusError:!0}),D=v(o);T(()=>{D.current=o},[o]);const A=v(null);T(()=>{if(u==="edit"&&i){const t=i.id??null;t&&t!==A.current?(D.current.reset(i),A.current=t):!t&&A.current===null&&(D.current.reset(i),A.current="initialized")}},[u,i]);const k=c?.id,Q=d(()=>{const t=`${n.name.toLowerCase()}-form-draft`;return u==="create"?t:k?`${t}-${k}`:`${t}-edit`},[n.name,u,k]),{value:g,setValue:C,removeValue:b}=ne(Q,{defaultValue:null,syncAcrossTabs:!0}),y=v(!1);T(()=>{if(y.current)return;const t=r=>{const a=()=>{b(),r&&D.current.reset(r)};se({toastType:"info",title:S("draft.restored",{defaultValue:"Draft restored"}),description:S("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:re(oe,{altText:S("draft.discard",{defaultValue:"Discard"}),onClick:a},S("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(u==="create"&&!c){g&&(o.reset(g),t(V)),y.current=!0;return}if(u==="edit"&&i){if(g){const r=z(i,g);o.reset(r),t(i)}y.current=!0}},[u,c,g,o,i,b,S,V]);const O=v(!1),h=v(null);T(()=>{const t=o.watch(r=>{O.current||!y.current||(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{r&&Object.values(r).some(a=>a!=null&&a!=="")&&C(r)},3e3))});return()=>{t.unsubscribe(),h.current&&clearTimeout(h.current)}},[o,C]);const x=w(async()=>{if(!e)return!0;const t=M.getState(),r=j.getState();if(!t.hasPendingUploads(e))return!0;try{r.setUploading(e,0),await t.uploadAll(e),await new Promise(l=>setTimeout(l,50));let a=o.getValues(),s=q(a),m=0;const R=5;for(;s.length>0&&m<R;)m++,await new Promise(l=>setTimeout(l,100)),a=o.getValues(),s=q(a);if(s.length>0){const l=`Upload incomplete: files still pending at ${s.join(", ")}`;return r.setError(e,l),!1}return!0}catch(a){const s=a instanceof Error?a.message:"File upload failed";return j.getState().setError(e,s),!1}},[e,o]),B=w(t=>u!=="create"?t:Object.fromEntries(Object.entries(t).filter(([r])=>!ue.includes(r))),[u]),L=w(t=>{if(typeof window>"u")return;const r=Object.keys(t).find(s=>s!=="root"&&t[s]);if(!r)return;const a=document.querySelector(`input[name="${r}"][aria-invalid="true"], textarea[name="${r}"][aria-invalid="true"], select[name="${r}"][aria-invalid="true"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.focus())},[]),N=o.handleSubmit,W=d(()=>((t,r)=>async a=>{a?.preventDefault?.();const s=e?j.getState():null;await N(async(m,R)=>{O.current=!0;try{if(e&&s&&s.startSubmit(e),!await x()){e&&s&&s.setError(e,"Upload failed");return}e&&s&&s.setSubmitting(e);const l=B(m);await t(l,R),b(),e&&s&&s.setSuccess(e)}catch(l){throw e&&s&&s.setError(e,l instanceof Error?l.message:"Submission failed"),l}finally{O.current=!1}},m=>{L(m),r?.(m)})(a)}),[N,e,x,B,L,b]),X=w(()=>{b(),o.reset(i),y.current=!1},[b,o,i]),Z=w(()=>{e&&(j.getState().cleanup(e),M.getState().cleanup(e))},[e]),ee=d(()=>de(n,{operation:u,viewerRole:U,availableFields:void 0}),[n,u,U]),te=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:W,fields:ee,operation:u,entity:n,t:S,viewerRole:U,formId:e,formStatus:e?Y:"idle",uploadProgress:e?H:0,cleanup:Z,isDirty:o.formState.isDirty,hasUserInteracted:te,resetForm:X,originalValues:i}}export{Se as useEntityForm};
1
+ "use client";import{valibotResolver as X}from"@hookform/resolvers/valibot";import{useMemo as m,useEffect as $,useRef as h,useCallback as E,createElement as me}from"react";import{useForm as pe}from"react-hook-form";import{toast as ge,ToastAction as be}from"@donotdev/components";import{useLocalStorage as Se,BACKEND_GENERATED_FIELD_NAMES as he,createSchemas as ye}from"@donotdev/core";import{useFormStore as b,useFormStatus as De,useUploadProgress as ve}from"../../stores";import{useUploadStore as T}from"../../stores/UploadStore";import{checkForBlobUrls as Z,isStorageUrl as we}from"../../utils/uploadValidation";import{getFieldsForOperation as Ee}from"../utils";import{buildInitialFromRecord as Fe,buildSchemaDefaults as Re}from"../utils/buildInitialValues";const Ve=t=>t;function ee(t,c){const e={...t};for(const p of Object.keys(c)){const u=t[p],S=c[p];S!==null&&typeof S=="object"&&!Array.isArray(S)&&u!==null&&typeof u=="object"&&!Array.isArray(u)?e[p]=ee(u,S):e[p]=S}return e}function K(t){if(t==null)return t;if(typeof t=="string")return t.startsWith("blob:")?null:t;if(Array.isArray(t)){const c=t.map(K).filter(e=>e!==null);return c.length>0?c:null}if(typeof t=="object"){const c=t;if("fullUrl"in c&&typeof c.fullUrl=="string")return we(c.fullUrl)?c:null;const e={};for(const[p,u]of Object.entries(c))e[p]=K(u);return e}return t}function Me(t,c={}){const{formId:e,operation:p,defaultValues:u,viewerRole:S,mode:te="onBlur",t:re}=c,y=re??Ve,C=S??"guest",a=p??(u?"edit":"create"),se=De(e??""),oe=ve(e??""),k=m(()=>ye(t),[t.name]),N=m(()=>X(k.create),[k.create]),W=m(()=>X(k.draft),[k.draft]),ne=m(()=>async(r,s,i)=>((r?.status??u?.status??"draft")==="draft"?W:N)(r,s,i),[N,W,u?.status]),I=m(()=>Re(t),[t]),M=u,l=m(()=>{if(a==="create")return I;if(M)return Fe(t,M)},[a,I,t,M]),n=pe({defaultValues:a==="create"?l:void 0,mode:te,resolver:ne,shouldUnregister:!1,shouldFocusError:!0}),D=h(n);$(()=>{D.current=n},[n]);const O=h(null);$(()=>{if(a==="edit"&&l){const r=l.id??null;r&&r!==O.current?(D.current.reset(l),O.current=r):!r&&O.current===null&&(D.current.reset(l),O.current="initialized")}},[a,l]);const B=u?.id,ae=m(()=>{const r=`${t.name.toLowerCase()}-form-draft`;return a==="create"?r:B?`${r}-${B}`:`${r}-edit`},[t.name,a,B]),{value:F,setValue:q,removeValue:v}=Se(ae,{defaultValue:null,syncAcrossTabs:!0}),R=h(!1);$(()=>{if(R.current)return;const r=s=>{const i=()=>{v(),s&&D.current.reset(s)};ge({toastType:"info",title:y("draft.restored",{defaultValue:"Draft restored"}),description:y("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:me(be,{altText:y("draft.discard",{defaultValue:"Discard"}),onClick:i},y("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(a==="create"&&!u){F&&(n.reset(F),r(I)),R.current=!0;return}if(a==="edit"&&l){if(F){const s=ee(l,F);n.reset(s),r(l)}R.current=!0}},[a,u,F,n,l,v,y,I]);const L=h(!1),V=h(null);$(()=>{const r=n.watch(s=>{L.current||!R.current||(V.current&&clearTimeout(V.current),V.current=setTimeout(()=>{if(!s)return;if(Object.values(s).some(o=>o!=null&&o!=="")){const o=K(s);q(o)}},3e3))});return()=>{r.unsubscribe(),V.current&&clearTimeout(V.current)}},[n,q]);const w=h(null),U=h(!1),z=E(async r=>{if(!e)return!0;const s=T.getState(),i=b.getState();if(!s.hasPendingUploads(e))return!0;const o=setInterval(()=>{const f=T.getState().getTotalProgress(e);b.getState().setUploading(e,f)},200);try{return i.setUploading(e,0),await s.uploadAll(e,r),r?.aborted?!1:(await new Promise(f=>setTimeout(f,50)),!0)}catch(f){const g=T.getState().uploads[e];g&&Object.entries(g).forEach(([_,j])=>{j.status==="error"&&j.error&&n.setError(_,{type:"upload",message:j.error})});const d=f instanceof Error?f.message:"File upload failed";return b.getState().setError(e,d),!1}finally{clearInterval(o)}},[e,n]),G=E(r=>a!=="create"?r:Object.fromEntries(Object.entries(r).filter(([s])=>!he.includes(s))),[a]),H=E(r=>{if(typeof window>"u")return;const s=Object.keys(r).find(o=>o!=="root"&&r[o]);if(!s)return;const i=document.querySelector(`input[name="${s}"][aria-invalid="true"], textarea[name="${s}"][aria-invalid="true"], select[name="${s}"][aria-invalid="true"]`);i&&(i.scrollIntoView({behavior:"smooth",block:"center"}),i.focus())},[]),Y=n.handleSubmit,ue=m(()=>((r,s)=>async i=>{if(i?.preventDefault?.(),U.current)return;const o=e?b.getState():null;await Y(async(f,x)=>{if(U.current)return;U.current=!0,w.current?.abort();const g=new AbortController;w.current=g,L.current=!0;try{if(e&&o&&o.startSubmit(e),!await z(g.signal)||g.signal.aborted)return;e&&o&&o.setSubmitting(e);const _=f,j=n.getValues(),P={..._};for(const A of Object.keys(P))Z(P[A]).length>0&&(P[A]=j[A]);const J=G(P),Q=Z(J);if(Q.length>0){const A=`Cannot save: blob URLs detected at ${Q.join(", ")}. Re-upload the files.`;e&&o&&o.setError(e,A);return}if(g.signal.aborted)return;await r(J,x),v(),D.current.reset(D.current.getValues()),e&&o&&o.setSuccess(e)}catch(d){throw e&&o&&o.setError(e,d instanceof Error?d.message:"Submission failed"),d}finally{if(L.current=!1,U.current=!1,w.current===g&&(w.current=null),e){const d=b.getState().forms[e]?.status;(d==="uploading"||d==="validating"||d==="submitting")&&b.getState().reset(e)}}},f=>{H(f),s?.(f)})(i)}),[Y,e,z,G,H,v]),ce=E(()=>{v(),n.reset(l),R.current=!1},[v,n,l]),le=E(()=>{w.current?.abort(),e&&(b.getState().cleanup(e),T.getState().cleanup(e))},[e]),ie=E(()=>{w.current?.abort(),e&&(T.getState().abortAll(e),b.getState().reset(e)),U.current=!1},[e]),fe=m(()=>Ee(t,{operation:a,viewerRole:C,availableFields:void 0}),[t,a,C]),de=n.formState.isSubmitted||Object.keys(n.formState.touchedFields||{}).length>0;return{...n,handleSubmit:ue,fields:fe,operation:a,entity:t,t:y,viewerRole:C,formId:e,formStatus:e?se:"idle",uploadProgress:e?oe:0,cleanup:le,cancel:ie,isDirty:n.formState.isDirty,hasUserInteracted:de,resetForm:ce,originalValues:l}}export{Me as useEntityForm};
@@ -25,7 +25,7 @@
25
25
  * }
26
26
  * ```
27
27
  *
28
- * @version 0.0.1
28
+ * @version 0.1.0
29
29
  * @since 0.0.1
30
30
  * @author AMBROISE PARK Consulting
31
31
  */