@donotdev/crud 0.0.8 → 0.0.10

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 (370) hide show
  1. package/dist/CrudService.d.ts +30 -60
  2. package/dist/CrudService.d.ts.map +1 -1
  3. package/dist/CrudService.js +1 -1
  4. package/dist/CrudStore.d.ts +1 -94
  5. package/dist/CrudStore.d.ts.map +1 -1
  6. package/dist/CrudStore.js +1 -1
  7. package/dist/FieldRegistry.js +1 -1
  8. package/dist/adapters/FirestoreAdapter.d.ts +3 -1
  9. package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
  10. package/dist/adapters/FirestoreAdapter.js +1 -1
  11. package/dist/adapters/FunctionsAdapter.d.ts +8 -1
  12. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  13. package/dist/adapters/FunctionsAdapter.js +1 -1
  14. package/dist/adapters/index.js +1 -1
  15. package/dist/builtinFieldTypes.d.ts +17 -4
  16. package/dist/builtinFieldTypes.d.ts.map +1 -1
  17. package/dist/builtinFieldTypes.js +1 -1
  18. package/dist/components/CrudButton.js +1 -1
  19. package/dist/components/DisplayFieldRenderer.d.ts +2 -0
  20. package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
  21. package/dist/components/DisplayFieldRenderer.js +1 -1
  22. package/dist/components/EntityDisplayRenderer.d.ts +3 -3
  23. package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
  24. package/dist/components/EntityDisplayRenderer.js +1 -1
  25. package/dist/components/EntityFilters.d.ts +61 -0
  26. package/dist/components/EntityFilters.d.ts.map +1 -0
  27. package/dist/components/EntityFilters.js +1 -0
  28. package/dist/components/EntityFormRenderer.d.ts +22 -1
  29. package/dist/components/EntityFormRenderer.d.ts.map +1 -1
  30. package/dist/components/EntityFormRenderer.js +1 -1
  31. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  32. package/dist/components/FormFieldRenderer.js +1 -1
  33. package/dist/components/FormLayout.js +1 -1
  34. package/dist/components/controlled/complex/ControlledAddressField.d.ts +3 -0
  35. package/dist/components/controlled/complex/ControlledAddressField.d.ts.map +1 -1
  36. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  37. package/dist/components/controlled/complex/ControlledDateField.d.ts +3 -0
  38. package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -1
  39. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  40. package/dist/components/controlled/complex/ControlledGeoPointField.d.ts +3 -0
  41. package/dist/components/controlled/complex/ControlledGeoPointField.d.ts.map +1 -1
  42. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  43. package/dist/components/controlled/complex/ControlledMapField.d.ts +3 -0
  44. package/dist/components/controlled/complex/ControlledMapField.d.ts.map +1 -1
  45. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  46. package/dist/components/controlled/complex/ControlledMultiInputField.d.ts +3 -0
  47. package/dist/components/controlled/complex/ControlledMultiInputField.d.ts.map +1 -1
  48. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  49. package/dist/components/controlled/complex/ControlledRichTextField.d.ts +3 -0
  50. package/dist/components/controlled/complex/ControlledRichTextField.d.ts.map +1 -1
  51. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  52. package/dist/components/controlled/complex/ControlledTimestampField.d.ts +3 -0
  53. package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -1
  54. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  55. package/dist/components/controlled/complex/index.d.ts.map +1 -1
  56. package/dist/components/controlled/complex/index.js +1 -1
  57. package/dist/components/controlled/file/ControlledDocumentField.d.ts +3 -0
  58. package/dist/components/controlled/file/ControlledDocumentField.d.ts.map +1 -1
  59. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  60. package/dist/components/controlled/file/ControlledFileField.d.ts +3 -0
  61. package/dist/components/controlled/file/ControlledFileField.d.ts.map +1 -1
  62. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  63. package/dist/components/controlled/file/ControlledImageField.d.ts +3 -0
  64. package/dist/components/controlled/file/ControlledImageField.d.ts.map +1 -1
  65. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  66. package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts +3 -0
  67. package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts.map +1 -1
  68. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  69. package/dist/components/controlled/file/ControlledMultiFileField.d.ts +3 -0
  70. package/dist/components/controlled/file/ControlledMultiFileField.d.ts.map +1 -1
  71. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  72. package/dist/components/controlled/file/ControlledMultiImageField.d.ts +3 -0
  73. package/dist/components/controlled/file/ControlledMultiImageField.d.ts.map +1 -1
  74. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  75. package/dist/components/controlled/file/index.d.ts.map +1 -1
  76. package/dist/components/controlled/file/index.js +1 -1
  77. package/dist/components/controlled/index.d.ts +4 -0
  78. package/dist/components/controlled/index.d.ts.map +1 -1
  79. package/dist/components/controlled/index.js +1 -1
  80. package/dist/components/controlled/input/ControlledCheckboxField.d.ts +3 -0
  81. package/dist/components/controlled/input/ControlledCheckboxField.d.ts.map +1 -1
  82. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  83. package/dist/components/controlled/input/ControlledCurrencyField.d.ts +8 -0
  84. package/dist/components/controlled/input/ControlledCurrencyField.d.ts.map +1 -0
  85. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -0
  86. package/dist/components/controlled/input/ControlledGdprConsentField.d.ts +8 -0
  87. package/dist/components/controlled/input/ControlledGdprConsentField.d.ts.map +1 -0
  88. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -0
  89. package/dist/components/controlled/input/ControlledNumberField.d.ts +3 -0
  90. package/dist/components/controlled/input/ControlledNumberField.d.ts.map +1 -1
  91. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  92. package/dist/components/controlled/input/ControlledPasswordField.d.ts +3 -0
  93. package/dist/components/controlled/input/ControlledPasswordField.d.ts.map +1 -1
  94. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  95. package/dist/components/controlled/input/ControlledPhoneField.d.ts +3 -0
  96. package/dist/components/controlled/input/ControlledPhoneField.d.ts.map +1 -1
  97. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  98. package/dist/components/controlled/input/ControlledPriceField.d.ts +8 -0
  99. package/dist/components/controlled/input/ControlledPriceField.d.ts.map +1 -0
  100. package/dist/components/controlled/input/ControlledPriceField.js +1 -0
  101. package/dist/components/controlled/input/ControlledRangeField.d.ts +3 -0
  102. package/dist/components/controlled/input/ControlledRangeField.d.ts.map +1 -1
  103. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  104. package/dist/components/controlled/input/ControlledRatingField.d.ts +8 -0
  105. package/dist/components/controlled/input/ControlledRatingField.d.ts.map +1 -0
  106. package/dist/components/controlled/input/ControlledRatingField.js +1 -0
  107. package/dist/components/controlled/input/ControlledSwitchField.d.ts +3 -0
  108. package/dist/components/controlled/input/ControlledSwitchField.d.ts.map +1 -1
  109. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  110. package/dist/components/controlled/input/ControlledTextField.d.ts +3 -0
  111. package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -1
  112. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  113. package/dist/components/controlled/input/ControlledTextareaField.d.ts +3 -0
  114. package/dist/components/controlled/input/ControlledTextareaField.d.ts.map +1 -1
  115. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  116. package/dist/components/controlled/input/index.d.ts +4 -0
  117. package/dist/components/controlled/input/index.d.ts.map +1 -1
  118. package/dist/components/controlled/input/index.js +1 -1
  119. package/dist/components/controlled/select/ControlledComboboxField.d.ts +4 -0
  120. package/dist/components/controlled/select/ControlledComboboxField.d.ts.map +1 -1
  121. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  122. package/dist/components/controlled/select/ControlledDropdownField.d.ts +4 -0
  123. package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -1
  124. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  125. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +4 -0
  126. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -1
  127. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  128. package/dist/components/controlled/select/ControlledRadioField.d.ts +4 -0
  129. package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -1
  130. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  131. package/dist/components/controlled/select/ControlledYearField.d.ts +9 -0
  132. package/dist/components/controlled/select/ControlledYearField.d.ts.map +1 -0
  133. package/dist/components/controlled/select/ControlledYearField.js +1 -0
  134. package/dist/components/controlled/select/index.d.ts +1 -0
  135. package/dist/components/controlled/select/index.d.ts.map +1 -1
  136. package/dist/components/controlled/select/index.js +1 -1
  137. package/dist/components/controlled/types.d.ts +6 -0
  138. package/dist/components/controlled/types.d.ts.map +1 -1
  139. package/dist/components/controlled/types.js +1 -1
  140. package/dist/components/fields/display/AvatarFieldDisplay.d.ts +23 -0
  141. package/dist/components/fields/display/AvatarFieldDisplay.d.ts.map +1 -0
  142. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -0
  143. package/dist/components/fields/display/BadgeFieldDisplay.d.ts +21 -0
  144. package/dist/components/fields/display/BadgeFieldDisplay.d.ts.map +1 -0
  145. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -0
  146. package/dist/components/fields/display/ButtonFieldDisplay.d.ts +29 -0
  147. package/dist/components/fields/display/ButtonFieldDisplay.d.ts.map +1 -0
  148. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -0
  149. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +21 -0
  150. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts.map +1 -0
  151. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -0
  152. package/dist/components/fields/display/DateFieldDisplay.d.ts +24 -0
  153. package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -0
  154. package/dist/components/fields/display/DateFieldDisplay.js +1 -0
  155. package/dist/components/fields/display/DropdownDisplay.d.ts +21 -0
  156. package/dist/components/fields/display/DropdownDisplay.d.ts.map +1 -0
  157. package/dist/components/fields/display/DropdownDisplay.js +1 -0
  158. package/dist/components/fields/display/FileFieldDisplay.d.ts +21 -0
  159. package/dist/components/fields/display/FileFieldDisplay.d.ts.map +1 -0
  160. package/dist/components/fields/display/FileFieldDisplay.js +1 -0
  161. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +25 -0
  162. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -0
  163. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -0
  164. package/dist/components/fields/display/HiddenFieldDisplay.d.ts +30 -0
  165. package/dist/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -0
  166. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -0
  167. package/dist/components/fields/display/ImageFieldDisplay.d.ts +24 -0
  168. package/dist/components/fields/display/ImageFieldDisplay.d.ts.map +1 -0
  169. package/dist/components/fields/display/ImageFieldDisplay.js +1 -0
  170. package/dist/components/fields/display/LinkFieldDisplay.d.ts +22 -0
  171. package/dist/components/fields/display/LinkFieldDisplay.d.ts.map +1 -0
  172. package/dist/components/fields/display/LinkFieldDisplay.js +1 -0
  173. package/dist/components/fields/display/MapFieldDisplay.d.ts +25 -0
  174. package/dist/components/fields/display/MapFieldDisplay.d.ts.map +1 -0
  175. package/dist/components/fields/display/MapFieldDisplay.js +1 -0
  176. package/dist/components/fields/display/MultiDropdownDisplay.d.ts +22 -0
  177. package/dist/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -0
  178. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -0
  179. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +22 -0
  180. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -0
  181. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -0
  182. package/dist/components/fields/display/NumberFieldDisplay.d.ts +24 -0
  183. package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -0
  184. package/dist/components/fields/display/NumberFieldDisplay.js +1 -0
  185. package/dist/components/fields/display/PasswordFieldDisplay.d.ts +24 -0
  186. package/dist/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -0
  187. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -0
  188. package/dist/components/fields/display/PhoneNumberDisplay.d.ts +22 -0
  189. package/dist/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -0
  190. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -0
  191. package/dist/components/fields/display/RadioFieldDisplay.d.ts +22 -0
  192. package/dist/components/fields/display/RadioFieldDisplay.d.ts.map +1 -0
  193. package/dist/components/fields/display/RadioFieldDisplay.js +1 -0
  194. package/dist/components/fields/display/RangeFieldDisplay.d.ts +22 -0
  195. package/dist/components/fields/display/RangeFieldDisplay.d.ts.map +1 -0
  196. package/dist/components/fields/display/RangeFieldDisplay.js +1 -0
  197. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +22 -0
  198. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -0
  199. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -0
  200. package/dist/components/fields/display/RichTextDisplay.d.ts +25 -0
  201. package/dist/components/fields/display/RichTextDisplay.d.ts.map +1 -0
  202. package/dist/components/fields/display/RichTextDisplay.js +61 -0
  203. package/dist/components/fields/display/TextAreaDisplay.d.ts +22 -0
  204. package/dist/components/fields/display/TextAreaDisplay.d.ts.map +1 -0
  205. package/dist/components/fields/display/TextAreaDisplay.js +1 -0
  206. package/dist/components/fields/display/TextFieldDisplay.d.ts +42 -0
  207. package/dist/components/fields/display/TextFieldDisplay.d.ts.map +1 -0
  208. package/dist/components/fields/display/TextFieldDisplay.js +1 -0
  209. package/dist/components/fields/display/TimestampFieldDisplay.d.ts +22 -0
  210. package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -0
  211. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -0
  212. package/dist/components/fields/display/index.d.ts +32 -0
  213. package/dist/components/fields/display/index.d.ts.map +1 -0
  214. package/dist/components/fields/display/index.js +1 -0
  215. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  216. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  217. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  218. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  219. package/dist/components/form/fields/CheckboxFieldComponent.d.ts +3 -3
  220. package/dist/components/form/fields/CheckboxFieldComponent.d.ts.map +1 -1
  221. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  222. package/dist/components/form/fields/ComboboxComponent.d.ts +6 -0
  223. package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
  224. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  225. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  226. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  227. package/dist/components/form/fields/DocumentFieldComponent.d.ts.map +1 -1
  228. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  229. package/dist/components/form/fields/DropdownComponent.js +1 -1
  230. package/dist/components/form/fields/FileFieldComponent.d.ts.map +1 -1
  231. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  232. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +26 -0
  233. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts.map +1 -0
  234. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -0
  235. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  236. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  237. package/dist/components/form/fields/ImageFieldComponent.d.ts +3 -2
  238. package/dist/components/form/fields/ImageFieldComponent.d.ts.map +1 -1
  239. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  240. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  241. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  242. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  243. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  244. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  245. package/dist/components/form/fields/PhoneNumberComponent.d.ts.map +1 -1
  246. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  247. package/dist/components/form/fields/PriceFieldComponent.d.ts +34 -0
  248. package/dist/components/form/fields/PriceFieldComponent.d.ts.map +1 -0
  249. package/dist/components/form/fields/PriceFieldComponent.js +1 -0
  250. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  251. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  252. package/dist/components/form/fields/RatingFieldComponent.d.ts +37 -0
  253. package/dist/components/form/fields/RatingFieldComponent.d.ts.map +1 -0
  254. package/dist/components/form/fields/RatingFieldComponent.js +1 -0
  255. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  256. package/dist/components/form/fields/RichTextComponent.d.ts +2 -21
  257. package/dist/components/form/fields/RichTextComponent.d.ts.map +1 -1
  258. package/dist/components/form/fields/RichTextComponent.js +1 -1
  259. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  260. package/dist/components/form/fields/TextAreaComponent.d.ts.map +1 -1
  261. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  262. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  263. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  264. package/dist/components/form/fields/index.d.ts +7 -1
  265. package/dist/components/form/fields/index.d.ts.map +1 -1
  266. package/dist/components/form/fields/index.js +1 -1
  267. package/dist/components/form/fields/internal/TiptapEditor.d.ts +1 -1
  268. package/dist/components/form/fields/internal/TiptapEditor.d.ts.map +1 -1
  269. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  270. package/dist/components/form/fields/types.d.ts +33 -0
  271. package/dist/components/form/fields/types.d.ts.map +1 -0
  272. package/dist/components/form/fields/types.js +0 -0
  273. package/dist/components/form/internal/ImageViewerDialog.d.ts +2 -1
  274. package/dist/components/form/internal/ImageViewerDialog.d.ts.map +1 -1
  275. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  276. package/dist/components/index.d.ts +4 -8
  277. package/dist/components/index.d.ts.map +1 -1
  278. package/dist/components/index.js +1 -1
  279. package/dist/contexts/UploadContext.d.ts.map +1 -1
  280. package/dist/contexts/UploadContext.js +1 -1
  281. package/dist/contexts/index.js +1 -1
  282. package/dist/fieldTypeRegistry.d.ts +92 -0
  283. package/dist/fieldTypeRegistry.d.ts.map +1 -0
  284. package/dist/fieldTypeRegistry.js +1 -0
  285. package/dist/forms/hooks/index.js +1 -1
  286. package/dist/forms/hooks/useController.js +1 -1
  287. package/dist/forms/hooks/useEntityField.js +1 -1
  288. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  289. package/dist/forms/hooks/useEntityForm.js +1 -1
  290. package/dist/forms/index.d.ts +2 -2
  291. package/dist/forms/index.d.ts.map +1 -1
  292. package/dist/forms/index.js +1 -1
  293. package/dist/forms/types.d.ts +15 -0
  294. package/dist/forms/types.d.ts.map +1 -1
  295. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  296. package/dist/forms/utils/index.d.ts +0 -2
  297. package/dist/forms/utils/index.d.ts.map +1 -1
  298. package/dist/forms/utils/index.js +1 -1
  299. package/dist/forms/utils/isFieldEditable.js +1 -1
  300. package/dist/forms/utils/translateFieldLabel.js +1 -1
  301. package/dist/forms/utils/validateEntity.js +1 -1
  302. package/dist/hooks/index.d.ts +5 -0
  303. package/dist/hooks/index.d.ts.map +1 -1
  304. package/dist/hooks/index.js +1 -1
  305. package/dist/hooks/useEntityFavorites.d.ts +53 -0
  306. package/dist/hooks/useEntityFavorites.d.ts.map +1 -0
  307. package/dist/hooks/useEntityFavorites.js +1 -0
  308. package/dist/hooks/useFileUpload.d.ts.map +1 -1
  309. package/dist/hooks/useFileUpload.js +1 -1
  310. package/dist/hooks/useFormNavigationGuard.d.ts +34 -0
  311. package/dist/hooks/useFormNavigationGuard.d.ts.map +1 -0
  312. package/dist/hooks/useFormNavigationGuard.js +1 -0
  313. package/dist/hooks/useRelatedItems.d.ts +37 -0
  314. package/dist/hooks/useRelatedItems.d.ts.map +1 -0
  315. package/dist/hooks/useRelatedItems.js +1 -0
  316. package/dist/hooks/useUnsavedChangesWarning.d.ts +51 -0
  317. package/dist/hooks/useUnsavedChangesWarning.d.ts.map +1 -0
  318. package/dist/hooks/useUnsavedChangesWarning.js +1 -0
  319. package/dist/index.d.ts +9 -6
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +1 -1
  322. package/dist/registerBuiltinFieldTypes.d.ts +6 -0
  323. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -0
  324. package/dist/registerBuiltinFieldTypes.js +1 -0
  325. package/dist/stores/FormStore.d.ts +17 -0
  326. package/dist/stores/FormStore.d.ts.map +1 -1
  327. package/dist/stores/FormStore.js +1 -1
  328. package/dist/stores/UploadStore.js +1 -1
  329. package/dist/stores/index.d.ts +1 -1
  330. package/dist/stores/index.d.ts.map +1 -1
  331. package/dist/stores/index.js +1 -1
  332. package/dist/tsconfig.tsbuildinfo +1 -1
  333. package/dist/types.d.ts +202 -0
  334. package/dist/types.d.ts.map +1 -0
  335. package/dist/types.js +0 -0
  336. package/dist/useBaseCrudList.d.ts +53 -0
  337. package/dist/useBaseCrudList.d.ts.map +1 -0
  338. package/dist/useBaseCrudList.js +1 -0
  339. package/dist/useCrud.d.ts +4 -8
  340. package/dist/useCrud.d.ts.map +1 -1
  341. package/dist/useCrud.js +1 -1
  342. package/dist/useCrudCardList.d.ts +10 -4
  343. package/dist/useCrudCardList.d.ts.map +1 -1
  344. package/dist/useCrudCardList.js +1 -1
  345. package/dist/useCrudList.d.ts +19 -5
  346. package/dist/useCrudList.d.ts.map +1 -1
  347. package/dist/useCrudList.js +1 -1
  348. package/dist/utils/collections.js +1 -1
  349. package/dist/utils/fileStorage.js +1 -1
  350. package/dist/utils/imageProcessing.js +1 -1
  351. package/dist/utils/imageStorage.js +1 -1
  352. package/dist/utils/imageUtils.js +1 -1
  353. package/dist/utils/mergeWithOptimistic.d.ts +5 -6
  354. package/dist/utils/mergeWithOptimistic.d.ts.map +1 -1
  355. package/dist/utils/mergeWithOptimistic.js +1 -1
  356. package/dist/utils/scopeUtils.d.ts +38 -0
  357. package/dist/utils/scopeUtils.d.ts.map +1 -0
  358. package/dist/utils/scopeUtils.js +1 -0
  359. package/dist/utils/uploadValidation.d.ts.map +1 -1
  360. package/dist/utils/uploadValidation.js +1 -1
  361. package/package.json +24 -17
  362. package/dist/components/EntityCardList.d.ts +0 -27
  363. package/dist/components/EntityCardList.d.ts.map +0 -1
  364. package/dist/components/EntityCardList.js +0 -1
  365. package/dist/components/EntityList.d.ts +0 -24
  366. package/dist/components/EntityList.d.ts.map +0 -1
  367. package/dist/components/EntityList.js +0 -1
  368. package/dist/forms/utils/optionHelpers.d.ts +0 -54
  369. package/dist/forms/utils/optionHelpers.d.ts.map +0 -1
  370. package/dist/forms/utils/optionHelpers.js +0 -1
@@ -1 +1 @@
1
- "use client";import{useState as G,useCallback as R,useEffect as v,useRef as A,startTransition as H}from"react";import{handleError as j}from"@donotdev/core";import{useUploadContext as K}from"../contexts/UploadContext";import{useUploadStore as k}from"../stores/UploadStore";let B=0;function M(l){if(l){const d=l.split("/").pop()?.split("?")[0];if(d)return`file-${d}`}B+=1;const u=typeof performance<"u"?performance.now():Date.now(),g=Math.random().toString(36).slice(2,11);return`file-${B}-${u}-${g}`}function Q(l){return URL.createObjectURL(l)}function V(l){l.startsWith("blob:")&&URL.revokeObjectURL(l)}function X(l,u,g){return u.length>0&&!u.some(m=>{if(m.endsWith("/*")){const L=m.slice(0,-2);return l.type.startsWith(L)}return l.type===m})?{valid:!1,error:`File type ${l.type} not accepted`}:l.size>g?{valid:!1,error:`File exceeds ${(g/1048576).toFixed(0)}MB limit`}:{valid:!0}}function er({name:l,value:u,onChange:g,multiple:d=!1,maxFiles:m=10,maxSize:L=10*1024*1024,accept:x=[],storagePath:Y="uploads",uploadFn:U}){const h=K(),w=!!h,[f,c]=G([]),E=A(!1),P=A(null),F=A(u),$=A([]);v(()=>{if(E.current){E.current=!1;return}const e=u?JSON.stringify((Array.isArray(u)?u:[u]).map(s=>s.fullUrl).filter(Boolean).sort()):null;e!==P.current&&(P.current=e,F.current=u,H(()=>{if(u){const n=(Array.isArray(u)?u:[u]).filter(t=>t.fullUrl).map((t,r)=>({id:`${M(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(n)}else c([])}))},[u]),v(()=>{$.current=f},[f]),v(()=>()=>{$.current.forEach(e=>V(e.previewURL))},[]);const p=R((e,s=!1)=>{const t=(s?e.filter(i=>!i.error):e.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:s&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;d?r=t.length>0?t:null:r=t[0]||null;const o=F.current;(()=>{if(!r&&!o)return!1;if(!r||!o)return!0;if(d&&Array.isArray(r)&&Array.isArray(o)){if(r.length!==o.length)return!0;const i=r.map(b=>b.fullUrl).sort().join(","),y=o.map(b=>b.fullUrl).sort().join(",");return i!==y}return!d&&!Array.isArray(r)&&!Array.isArray(o)?r.fullUrl!==o.fullUrl:!0})()&&(E.current=!0,F.current=r,g(r))},[d,g,w]),S=R(async()=>{if(!U)return;let e=[];if(c(n=>(e=n.filter(t=>!t.uploaded&&!t.error),e.length===0?n:n.map(t=>e.some(r=>r.id===t.id)?{...t,progress:0}:t))),e.length===0)return;const s=await Promise.allSettled(e.map(async n=>{try{const t=await U(n.file,r=>{c(o=>o.map(a=>a.id===n.id?{...a,progress:r}:a))});return{id:n.id,picture:t,error:null}}catch(t){const r=t instanceof Error?t.message:"Upload failed";return{id:n.id,picture:null,error:r}}}));c(n=>{const t=n.map(r=>{const o=s.find(a=>a.status==="fulfilled"&&a.value.id===r.id);if(o&&o.status==="fulfilled"){const a=o.value;return{...r,uploaded:a.picture,progress:a.picture?100:null,error:a.error}}return r});return p(t,!1),t})},[U,p]),C=A(S);C.current=S;const I=k(e=>e.registerUpload),N=k(e=>e.unregisterUpload);v(()=>{if(!(!h||!l))return I(h,l,async()=>{await C.current()},()=>$.current.some(e=>!e.uploaded&&!e.error)),()=>{N(h,l)}},[h,l,I,N]);const T=R(async e=>{if(U){c(s=>s.map(n=>n.id===e.id?{...n,progress:0}:n));try{const s=await U(e.file,n=>{c(t=>t.map(r=>r.id===e.id?{...r,progress:n}:r))});c(n=>{const t=n.map(r=>r.id===e.id?{...r,uploaded:s,progress:100,error:null}:r);return p(t,!1),t})}catch(s){const n=s instanceof Error?s.message:"Upload failed";c(t=>t.map(r=>r.id===e.id?{...r,error:n,progress:null}:r))}}},[U,p]),D=R(e=>{c(s=>{const t=(d?m:1)-s.length;if(t<=0)return j(new Error("Maximum files reached"),{userMessage:d?`Maximum ${m} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),s;const r=e.slice(0,t),o=[];for(const i of r){const y=X(i,x,L);if(!y.valid){j(new Error(y.error),{userMessage:y.error,severity:"warning",showNotification:!0});continue}o.push({id:M(),file:i,previewURL:Q(i),progress:null,uploaded:null,error:null})}if(o.length===0)return s;const a=d?[...s,...o]:o;return w?setTimeout(()=>{p(a,!0)},0):o.forEach(i=>T(i)),a})},[d,m,x,L,w,T,p]),O=R(e=>{c(s=>{const n=s.find(r=>r.id===e);n&&V(n.previewURL);const t=s.filter(r=>r.id!==e);return p(t,!1),t})},[p]),W=f.some(e=>!e.uploaded&&!e.error),J=f.some(e=>e.progress!==null&&e.progress<100),q=f.length>0?f.reduce((e,s)=>e+(s.progress??0),0)/f.length:0;return{files:f,addFiles:D,removeFile:O,hasPending:W,isUploading:J,progress:q,formId:h,isDeferred:w}}export{er as useFileUpload};
1
+ "use client";import{useState as J,useCallback as w,useEffect as A,useRef as v,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let P=0;function W(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}P+=1;const a=typeof performance<"u"?performance.now():Date.now(),d=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${d}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,d){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const y=u.slice(0,-2);return s.type.startsWith(y)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>d?{valid:!1,error:`File exceeds ${(d/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:d,multiple:u=!1,maxFiles:y=10,maxSize:$=10*1024*1024,accept:x=[],storagePath:V="uploads",uploadFn:g}){const h=G(),U=!!h,[f,c]=J([]),R=v(!1),E=v(null),F=v(a),L=v([]);A(()=>{if(R.current){R.current=!1;return}const e=a?JSON.stringify((Array.isArray(a)?a:[a]).map(n=>n.fullUrl).filter(Boolean)):null;e!==E.current&&(E.current=e,F.current=a,q(()=>{if(a){const n=(Array.isArray(a)?a:[a]).filter(i=>i.fullUrl).map((i,r)=>({id:`${W(i.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:i.thumbUrl||i.fullUrl,progress:100,uploaded:i,error:null}));c(n)}else c([])}))},[a]),A(()=>{L.current=f},[f]),A(()=>()=>{L.current.forEach(e=>k(e.previewURL))},[]);const p=w((e,n=!1)=>{const i=(n?e.filter(l=>!l.error):e.filter(l=>l.uploaded&&!l.error)).map(l=>l.uploaded?l.uploaded:n&&U?{fullUrl:l.previewURL,thumbUrl:l.previewURL}:null).filter(l=>l!==null);let r;u?r=i.length>0?i:null:r=i[0]||null;const t=F.current;(()=>{if(!r&&!t)return!1;if(!r||!t)return!0;if(u&&Array.isArray(r)&&Array.isArray(t)){if(r.length!==t.length)return!0;const l=r.map(m=>m.fullUrl).join(","),o=t.map(m=>m.fullUrl).join(",");return l!==o}return!u&&!Array.isArray(r)&&!Array.isArray(t)?r.fullUrl!==t.fullUrl:!0})()&&(R.current=!0,F.current=r,d(r))},[u,d,U]),b=w(async()=>{if(!g)return;let e=[];if(c(i=>(e=i.filter(r=>!r.uploaded&&!r.error),e.length===0?i:i.map(r=>e.some(t=>t.id===r.id)?{...r,progress:0}:r))),e.length===0)return;const n=await Promise.allSettled(e.map(async i=>{try{const r=await g(i.file,t=>{c(l=>l.map(o=>o.id===i.id?{...o,progress:t}:o))});return{id:i.id,picture:r,error:null}}catch(r){const t=r instanceof Error?r.message:"Upload failed";return{id:i.id,picture:null,error:t}}}));c(i=>{const r=i.map(t=>{const l=n.find(o=>o.status==="fulfilled"&&o.value.id===t.id);if(l&&l.status==="fulfilled"){const o=l.value;return{...t,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return t});return p(r,!1),r})},[g,p]),M=v(b);M.current=b;const S=N(e=>e.registerUpload),j=N(e=>e.unregisterUpload);A(()=>{if(!(!h||!s))return S(h,s,async()=>{await M.current()},()=>L.current.some(e=>!e.uploaded&&!e.error)),()=>{j(h,s)}},[h,s,S,j]);const O=w(async e=>{if(g){c(n=>n.map(i=>i.id===e.id?{...i,progress:0}:i));try{const n=await g(e.file,i=>{c(r=>r.map(t=>t.id===e.id?{...t,progress:i}:t))});c(i=>{const r=i.map(t=>t.id===e.id?{...t,uploaded:n,progress:100,error:null}:t);return p(r,!1),r})}catch(n){const i=n instanceof Error?n.message:"Upload failed";c(r=>r.map(t=>t.id===e.id?{...t,error:i,progress:null}:t))}}},[g,p]),B=w(e=>{c(n=>{const i=(u?y:1)-n.length;if(i<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${y} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),n;const r=e.slice(0,i),t=[];for(const o of r){const m=K(o,x,$);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}t.push({id:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(t.length===0)return n;const l=u?[...n,...t]:t;return U?setTimeout(()=>{p(l,!0)},0):t.forEach(o=>O(o)),l})},[u,y,x,$,U,O,p]),D=w(e=>{c(n=>{const i=n.find(t=>t.id===e);i&&k(i.previewURL);const r=n.filter(t=>t.id!==e);return p(r,!1),r})},[p]),T=f.some(e=>!e.uploaded&&!e.error),z=f.some(e=>e.progress!==null&&e.progress<100),I=f.length>0?f.reduce((e,n)=>e+(n.progress??0),0)/f.length:0;return{files:f,addFiles:B,removeFile:D,hasPending:T,isUploading:z,progress:I,formId:h,isDeferred:U}}export{Q as useFileUpload};
@@ -0,0 +1,34 @@
1
+ export interface UseFormNavigationGuardOptions {
2
+ /** Whether the guard is enabled (default: true) */
3
+ enabled?: boolean;
4
+ /** Custom message for navigation confirmation */
5
+ message?: string;
6
+ }
7
+ /**
8
+ * Hook to block SPA navigation when forms are dirty.
9
+ * Uses FormStore as single source of truth.
10
+ *
11
+ * For React Router: Uses useBlocker
12
+ * For Next.js: Intercepts router.push calls
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * // In your app root/layout
17
+ * useFormNavigationGuard({
18
+ * message: 'You have unsaved changes. Are you sure you want to leave?',
19
+ * });
20
+ * ```
21
+ */
22
+ export declare function useFormNavigationGuard({ enabled, message, }?: UseFormNavigationGuardOptions): void;
23
+ /**
24
+ * Check if navigation should be blocked and get confirmation.
25
+ * Used by router navigation hooks.
26
+ *
27
+ * NOTE: For safe access from @donotdev/ui, use checkFormNavigationSafe from useFormStoreSafe.
28
+ * This function is for direct use within CRUD package.
29
+ *
30
+ * @returns Promise<boolean> - true if navigation should proceed, false if blocked
31
+ */
32
+ export declare function checkFormNavigation(message?: string): Promise<boolean>;
33
+ export default useFormNavigationGuard;
34
+ //# sourceMappingURL=useFormNavigationGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormNavigationGuard.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormNavigationGuard.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,6BAA6B;IAC5C,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAc,EACd,OAAqE,GACtE,GAAE,6BAAkC,GAAG,IAAI,CAsB3C;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,SAA4C,GAClD,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{useEffect as i}from"react";import{isClient as n}from"@donotdev/core";import{useFormStore as s}from"../stores";function u({enabled:e=!0,message:o="You have unsaved changes. Are you sure you want to leave?"}={}){const r=s(a=>a.hasDirtyForms());i(()=>{if(!e||!r||!n())return;const a=t=>(t.preventDefault(),t.returnValue=o,o);return window.addEventListener("beforeunload",a),()=>{window.removeEventListener("beforeunload",a)}},[e,r,o])}async function m(e="You have unsaved changes. Discard them?"){return!n()||!s.getState().hasDirtyForms()?!0:window.confirm(e)}var d=u;export{m as checkFormNavigation,d as default,u as useFormNavigationGuard};
@@ -0,0 +1,37 @@
1
+ import type { Entity } from '@donotdev/core';
2
+ export interface UseRelatedItemsOptions {
3
+ /** Maximum number of related items to return (default: 3) */
4
+ limit?: number;
5
+ /** Tolerance for numeric field matching as percentage (default: 0.2 = 20%) */
6
+ tolerance?: number;
7
+ }
8
+ export interface UseRelatedItemsReturn<T> {
9
+ /** Array of related items */
10
+ items: T[];
11
+ /** Whether any related items were found */
12
+ hasItems: boolean;
13
+ }
14
+ /**
15
+ * useRelatedItems - Finds related items based on matching field criteria
16
+ *
17
+ * Matching logic by field type:
18
+ * - String/select fields: exact match
19
+ * - Number fields: within ±tolerance% of current value
20
+ *
21
+ * Items are matched if they satisfy ANY of the specified fields (OR logic).
22
+ * Current item is automatically excluded.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * const { items: relatedCars } = useRelatedItems(
27
+ * carEntity,
28
+ * currentCar,
29
+ * allCars,
30
+ * ['make', 'price'],
31
+ * { limit: 3, tolerance: 0.2 }
32
+ * );
33
+ * ```
34
+ */
35
+ export declare function useRelatedItems<T extends Record<string, any>>(entity: Entity, currentItem: T | null | undefined, allItems: T[] | null | undefined, matchFields: string[], options?: UseRelatedItemsOptions): UseRelatedItemsReturn<T>;
36
+ export default useRelatedItems;
37
+ //# sourceMappingURL=useRelatedItems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRelatedItems.d.ts","sourceRoot":"","sources":["../../src/hooks/useRelatedItems.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,6BAA6B;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3D,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACjC,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,EAChC,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAAC,CAAC,CAAC,CAwD1B;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{useMemo as g}from"react";function h(u,e,t,s,N={}){const{limit:o=3,tolerance:m=.2}=N,c=g(()=>{if(!e||!t||t.length===0||s.length===0)return[];const p=e.id;return t.filter(f=>f.id===p?!1:s.some(n=>{const r=u.fields[n];if(!r)return!1;const i=e[n],a=f[n];if(i==null||a==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(i),d=Number(a);if(isNaN(l)||isNaN(d))return!1;const b=Math.abs(l*m);return Math.abs(d-l)<=b}return String(i)===String(a)})).slice(0,o)},[e,t,s,u.fields,o,m]);return{items:c,hasItems:c.length>0}}var y=h;export{y as default,h as useRelatedItems};
@@ -0,0 +1,51 @@
1
+ export interface UseUnsavedChangesWarningOptions {
2
+ /** Whether the form has unsaved changes */
3
+ isDirty: boolean;
4
+ /** Whether the warning is enabled (default: true) */
5
+ enabled?: boolean;
6
+ /** Custom message for beforeunload (browsers often ignore this) */
7
+ message?: string;
8
+ /** Callback when user tries to navigate away - return false to block, true to allow */
9
+ onBeforeNavigate?: () => boolean | Promise<boolean>;
10
+ }
11
+ /**
12
+ * Hook to warn users about unsaved changes before leaving the page.
13
+ *
14
+ * Handles:
15
+ * - Browser refresh/close (beforeunload event)
16
+ * - Browser back/forward (beforeunload event)
17
+ *
18
+ * For SPA navigation (Next.js router), use the onBeforeNavigate callback
19
+ * with your router's navigation blocking mechanism.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * const { isDirty } = useFormState();
24
+ *
25
+ * useUnsavedChangesWarning({
26
+ * isDirty,
27
+ * message: 'You have unsaved changes. Are you sure you want to leave?',
28
+ * });
29
+ * ```
30
+ */
31
+ export declare function useUnsavedChangesWarning({ isDirty, enabled, message, onBeforeNavigate, }: UseUnsavedChangesWarningOptions): void;
32
+ /**
33
+ * Helper to confirm navigation with unsaved changes.
34
+ * Use this in your router's navigation guard.
35
+ *
36
+ * @example Next.js App Router:
37
+ * ```tsx
38
+ * // In your page/layout
39
+ * const confirmNavigation = useConfirmNavigation(isDirty);
40
+ *
41
+ * // In link click handler
42
+ * const handleNavigation = async (href: string) => {
43
+ * if (await confirmNavigation()) {
44
+ * router.push(href);
45
+ * }
46
+ * };
47
+ * ```
48
+ */
49
+ export declare function useConfirmNavigation(isDirty: boolean, message?: string): () => Promise<boolean>;
50
+ export default useUnsavedChangesWarning;
51
+ //# sourceMappingURL=useUnsavedChangesWarning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUnsavedChangesWarning.d.ts","sourceRoot":"","sources":["../../src/hooks/useUnsavedChangesWarning.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,+BAA+B;IAC9C,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,OAAc,EACd,OAAqE,EACrE,gBAAgB,GACjB,EAAE,+BAA+B,GAAG,IAAI,CAuBxC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,SAA4C,GAClD,MAAM,OAAO,CAAC,OAAO,CAAC,CAWxB;AAED,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{useEffect as u,useCallback as i}from"react";import{isClient as r}from"@donotdev/core";function t({isDirty:e,enabled:a=!0,message:n="You have unsaved changes. Are you sure you want to leave?",onBeforeNavigate:v}){u(()=>{if(!a||!e||!r())return;const s=o=>(o.preventDefault(),o.returnValue=n,n);return window.addEventListener("beforeunload",s),()=>{window.removeEventListener("beforeunload",s)}},[e,a,n])}function f(e,a="You have unsaved changes. Discard them?"){return i(async()=>e?r()?window.confirm(a):!1:!0,[e,a])}var d=t;export{d as default,f as useConfirmNavigation,t as useUnsavedChangesWarning};
package/dist/index.d.ts CHANGED
@@ -11,16 +11,19 @@ export * from './useCrudList';
11
11
  export * from './useCrudCardList';
12
12
  export * from './components';
13
13
  export * from './stores';
14
- export { getCrudService, type CrudServiceInterface, type CacheOptions, type QueryOptions, } from './CrudService';
15
- export { useCrudStore, type CrudState, type CrudActions, type BackendType, type OptimisticStatus, type OptimisticMeta, } from './CrudStore';
14
+ export { getCrudService } from './CrudService';
15
+ export type { QueryOptions } from './CrudService';
16
+ export { useCrudStore } from './CrudStore';
17
+ export type { CrudServiceInterface, CrudState, CrudActions, BackendType, OptimisticStatus, OptimisticMeta, CrudStoreApi, CacheOptions, MutationOptions, FilterState, CollectionUIState, } from './types';
16
18
  export { loadDeterministicRange, upsertDeterministic, appendToCollection, } from './utils/collections';
17
19
  export { getFieldRegistry, registerFieldType, isFieldTypeRegistered, type FieldTypeRegistration, type ControlledFieldProps, type UncontrolledFieldProps, } from './FieldRegistry';
20
+ export { registerBuiltinFieldType, getFieldTypeMetadata, getFilterType, getDisplayFormatter, isFilterable, getValueType, clearFieldTypeRegistry, type FieldTypeMetadata, type FilterType, type ValueType, type DisplayFormatter, type ComponentRegistration, } from './fieldTypeRegistry';
18
21
  export { registerBuiltinFieldTypes } from './builtinFieldTypes';
19
- export { useEntityForm, useEntityField, useController, isFieldEditable, getFieldsForOperation, validateEntity, translateFieldLabel, translateLabel, yearOptions, rangeOptions, } from './forms';
20
- export type { ViewerRole, RenderableField, GetFieldsForOperationOptions, EntityFieldsInput, SchemaOperation, ValidationIssue, ValidationResult, SelectOption, InferEntityData, InferEntityInput, InferEntityOutput, UseEntityFormOptions, EntityFormReturn, EntityFieldReturn, UseControllerProps, UseControllerReturn, ControllerRenderProps, ControllerFieldState, } from './forms';
22
+ export { useEntityForm, useEntityField, useController, isFieldEditable, getFieldsForOperation, validateEntity, translateFieldLabel, translateLabel, } from './forms';
23
+ export type { ViewerRole, RenderableField, GetFieldsForOperationOptions, EntityFieldsInput, SchemaOperation, ValidationIssue, ValidationResult, InferEntityData, InferEntityInput, InferEntityOutput, UseEntityFormOptions, EntityFormReturn, EntityFieldReturn, UseControllerProps, UseControllerReturn, ControllerRenderProps, ControllerFieldState, } from './forms';
21
24
  export { UploadProvider, useUploadContext } from './contexts';
22
25
  export type { UploadProviderProps } from './contexts';
23
- export { useFileUpload } from './hooks';
24
- export type { FileMetadata, UseFileUploadOptions } from './hooks';
26
+ export { useFileUpload, useUnsavedChangesWarning, useConfirmNavigation, useEntityFavorites, useRelatedItems, } from './hooks';
27
+ export type { FileMetadata, UseFileUploadOptions, UseEntityFavoritesOptions, UseEntityFavoritesReturn, UseRelatedItemsOptions, UseRelatedItemsReturn, } from './hooks';
25
28
  export { isStorageUrl, validatePicture, checkForBlobUrls, hasBlobUrls, } from './utils/uploadValidation';
26
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,cAAc,CAAC;AAG7B,cAAc,UAAU,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,YAAY,EACZ,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAEL,aAAa,EACb,cAAc,EACd,aAAa,EAEb,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,cAAc,EAEd,WAAW,EACX,YAAY,GACb,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,UAAU,EACV,eAAe,EACf,4BAA4B,EAC5B,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGlE,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,cAAc,CAAC;AAG7B,cAAc,UAAU,CAAC;AAGzB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EACV,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAEL,aAAa,EACb,cAAc,EACd,aAAa,EAEb,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,UAAU,EACV,eAAe,EACf,4BAA4B,EAC5B,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{getCrudService as s}from"./CrudService";import{useCrudStore as d}from"./CrudStore";import{loadDeterministicRange as n,upsertDeterministic as x,appendToCollection as f}from"./utils/collections";import{getFieldRegistry as u,registerFieldType as g,isFieldTypeRegistered as y}from"./FieldRegistry";import{registerBuiltinFieldTypes as U}from"./builtinFieldTypes";import{useEntityForm as C,useEntityField as v,useController as E,isFieldEditable as T,getFieldsForOperation as B,validateEntity as O,translateFieldLabel as R,translateLabel as S,yearOptions as h,rangeOptions as D}from"./forms";import{UploadProvider as P,useUploadContext as k}from"./contexts";import{useFileUpload as q}from"./hooks";import{isStorageUrl as z,validatePicture as A,checkForBlobUrls as G,hasBlobUrls as H}from"./utils/uploadValidation";export{P as UploadProvider,f as appendToCollection,G as checkForBlobUrls,s as getCrudService,u as getFieldRegistry,B as getFieldsForOperation,H as hasBlobUrls,T as isFieldEditable,y as isFieldTypeRegistered,z as isStorageUrl,n as loadDeterministicRange,D as rangeOptions,U as registerBuiltinFieldTypes,g as registerFieldType,R as translateFieldLabel,S as translateLabel,x as upsertDeterministic,E as useController,d as useCrudStore,v as useEntityField,C as useEntityForm,q as useFileUpload,k as useUploadContext,O as validateEntity,A as validatePicture,h as yearOptions};
1
+ export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{getCrudService as e}from"./CrudService";import{useCrudStore as s}from"./CrudStore";import{loadDeterministicRange as a,upsertDeterministic as t,appendToCollection as i}from"./utils/collections";import{getFieldRegistry as r,registerFieldType as l,isFieldTypeRegistered as o}from"./FieldRegistry";import{registerBuiltinFieldType as d,getFieldTypeMetadata as p,getFilterType as n,getDisplayFormatter as F,isFilterable as m,getValueType as g,clearFieldTypeRegistry as u}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as y}from"./builtinFieldTypes";import{useEntityForm as f,useEntityField as T,useController as c,isFieldEditable as v,getFieldsForOperation as C,validateEntity as U,translateFieldLabel as b,translateLabel as E}from"./forms";import{UploadProvider as R,useUploadContext as x}from"./contexts";import{useFileUpload as B,useUnsavedChangesWarning as h,useConfirmNavigation as S,useEntityFavorites as D,useRelatedItems as L}from"./hooks";import{isStorageUrl as P,validatePicture as k,checkForBlobUrls as I,hasBlobUrls as M}from"./utils/uploadValidation";export{R as UploadProvider,i as appendToCollection,I as checkForBlobUrls,u as clearFieldTypeRegistry,e as getCrudService,F as getDisplayFormatter,r as getFieldRegistry,p as getFieldTypeMetadata,C as getFieldsForOperation,n as getFilterType,g as getValueType,M as hasBlobUrls,v as isFieldEditable,o as isFieldTypeRegistered,m as isFilterable,P as isStorageUrl,a as loadDeterministicRange,d as registerBuiltinFieldType,y as registerBuiltinFieldTypes,l as registerFieldType,b as translateFieldLabel,E as translateLabel,t as upsertDeterministic,S as useConfirmNavigation,c as useController,s as useCrudStore,D as useEntityFavorites,T as useEntityField,f as useEntityForm,B as useFileUpload,L as useRelatedItems,h as useUnsavedChangesWarning,x as useUploadContext,U as validateEntity,k as validatePicture};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Register all built-in field types with unified registry
3
+ * This is the single source of truth for framework built-ins
4
+ */
5
+ export declare function registerAllBuiltinFieldTypes(): void;
6
+ //# sourceMappingURL=registerBuiltinFieldTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AAkuBA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAmqBnD"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as s,jsxs as u}from"react/jsx-runtime";import{Text as m,Stack as g,ImageGallery as I,Rating as $}from"@donotdev/components";import{formatCurrency as T}from"@donotdev/core";import{ControlledCheckboxField as w,ControlledComboboxField as M,ControlledDateField as b,ControlledDropdownField as R,ControlledFileField as N,ControlledMultiFileField as P,ControlledDocumentField as V,ControlledMultiDocumentField as _,ControlledGeoPointField as B,ControlledImageField as E,ControlledMapField as U,ControlledMultiDropdownField as H,ControlledMultiInputField as K,ControlledNumberField as Y,ControlledPasswordField as G,ControlledPhoneField as O,ControlledRangeField as W,ControlledRatingField as q,ControlledRadioField as J,ControlledYearField as Q,ControlledTextField as y,ControlledTextareaField as X,ControlledRichTextField as Z,ControlledTimestampField as ee,ControlledAddressField as te,ControlledSwitchField as re,ControlledMultiImageField as le,ControlledGdprConsentField as ne,ControlledCurrencyField as oe,ControlledPriceField as ae}from"./components/controlled";import{AvatarFieldComponent as ie,BadgeFieldComponent as ce,ButtonFieldComponent as k,HiddenFieldComponent as se,TextAreaComponent as pe,RichTextComponent as de,TextFieldComponent as F}from"./components/form/fields";import{registerBuiltinFieldType as a}from"./fieldTypeRegistry";import{translateLabel as f}from"./forms/utils";function p(e){return e?s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s(m,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):String(e)},month:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):String(e)},boolean:(e,l,n)=>e?"Yes":"No",checkbox:(e,l,n)=>e?"Yes":"No",switch:(e,l,n)=>{const t=l.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,o=t.checkedValue??!0;if(e===o&&t.checkedLabel)return f(t.checkedLabel,n);if(e===r&&t.uncheckedLabel)return f(t.uncheckedLabel,n)}return e?"Yes":"No"},year:(e,l,n)=>String(e),number:(e,l,n)=>typeof e=="number"?e.toLocaleString():String(e),currency:(e,l,n)=>{if(e==null||isNaN(e))return"";const t=(l.options||{}).fieldSpecific?.currency||"EUR";return T(e,t)},price:(e,l,n,t)=>{const r=t?.compact??!1,o=t?.asString??!1,i=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(i==null||typeof i!="object")return p(r);const d=i.amount;if(d==null||isNaN(d))return p(r);const C=i.currency||"EUR",z=i.vatIncluded??!0,v=i.discountPercent??0,D=v>0?d*(1-v/100):d,h=z?` ${n("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(v>0){const L=T(d,C),x=T(D,C),S=` ${n("crud:price.discountPercent",{percent:Math.round(v),defaultValue:"-{{percent}}%"})}`;return o?`${x}${h}${S}`:r?u(m,{variant:"success",weight:"bold",children:[x,h,S]}):u(g,{direction:"column",gap:"tight",align:"end",children:[s(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(m,{variant:"success",weight:"bold",children:[x,h]})]})}return`${T(d,C)}${h}`},range:(e,l,n)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null)return p(r);const o=typeof e=="number"?e:parseFloat(e);if(isNaN(o))return p(r);const i=l.validation?.max??5;return s($,{value:o,max:i,readonly:!0,"aria-label":`${o} out of ${i} stars`})},select:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},radio:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},combobox:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},multiselect:(e,l,n)=>{if(Array.isArray(e)){const t=l.validation?.options;if(Array.isArray(t))return e.map(r=>{const o=t.find(i=>i.value===r)?.label;return o?f(o,n):r}).join(", ")}return String(e)},image:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):typeof e=="string"?s("img",{src:e,alt:l.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):p(r)},images:(e,l,n,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return p(r);const o=e[0],i=typeof o=="object"&&o.thumbUrl?o.thumbUrl:o;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[s("img",{src:i,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):s(I,{images:e,altPrefix:l.label||"Image"})},files:(e,l,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?p(r):s(g,{gap:"tight",children:e.map((o,i)=>u("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${i+1}`,o.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},i))})},documents:(e,l,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?p(r):s(g,{gap:"tight",children:e.map((o,i)=>u("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${i+1}`,o.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},i))})},file:(e,l,n,t)=>{const r=t?.compact??!1;if(!e)return p(r);const o=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,l,n,t)=>{const r=t?.compact??!1;if(!e)return p(r);const o=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,l,n)=>String(e),geopoint:(e,l,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:p(r)},address:(e,l,n)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,l,n,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const o=Object.entries(e);return o.length===0?p(r):u(g,{direction:"column",gap:"tight",children:[o.slice(0,5).map(([i,d])=>u(m,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[i,":"]})," ",String(d)]},i)),o.length>5&&u(m,{variant:"muted",children:["+",o.length-5," more"]})]})}return p(r)},array:(e,l,n,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?p(r):e.join(", "):p(r)},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,l,n)=>s("a",{href:`mailto:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),tel:(e,l,n)=>s("a",{href:`tel:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),url:(e,l,n)=>s("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,l,n)=>u(g,{direction:"row",gap:"tight",align:"center",children:[s("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),s(m,{children:e})]}),textarea:(e,l,n)=>String(e),text:(e,l,n)=>String(e),richtext:(e,l,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s("div",{dangerouslySetInnerHTML:{__html:e},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):p(r)}};function ue(e){return e.type==="avatar"}function ye(e){return e.type==="badge"}let A=!1;function j(){A||(A=!0,a({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"email",...o.options})}}}),a({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"url",...o.options})}}}),a({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"color",...o.options})}}}),a({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:X,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(pe,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:Z,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(de,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:G}}),a({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:O}}),a({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:Y}}),a({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:oe}}),a({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:ae}}),a({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:W}}),a({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:Q}}),a({type:"rating",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.rating,components:{controlled:q}}),a({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:w}}),a({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:w}}),a({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",components:{controlled:ne}}),a({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:re}}),a({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:b}}),a({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:b}}),a({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:b}}),a({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:b}}),a({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:b}}),a({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ee}}),a({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:N}}),a({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:P}}),a({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:V}}),a({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:_}}),a({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:E}}),a({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:le}}),a({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:B}}),a({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:te}}),a({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:U}}),a({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:K}}),a({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:R}}),a({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:M}}),a({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:H}}),a({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:J}}),a({type:"reference",filterable:!0,filterType:"text",valueType:"string",components:{controlled:y}}),a({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,value:n}=e;return s(se,{name:l,value:typeof n=="string"?n:""})}}}),a({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,error:t,config:r,t:o}=e;if(!ue(r))throw new Error("Invalid config type for avatar field");return s(ie,{config:r,value:typeof l=="string"?l:"",onChange:i=>{n(i)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),a({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,error:t,config:r,t:o}=e;if(!ye(r))throw new Error("Invalid config type for badge field");return s(ce,{config:r,value:typeof l=="string"?l:"",onChange:i=>{n(i)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),a({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,label:n,config:t}=e;return s(k,{label:n||l,type:"submit",onClick:()=>{},...t.options})}}}),a({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,label:n,config:t}=e;return s(k,{label:n||l,type:"reset",onClick:()=>{},...t.options})}}}))}j();export{j as registerAllBuiltinFieldTypes};
@@ -10,6 +10,7 @@ interface FormState {
10
10
  status: FormStatus;
11
11
  error: string | null;
12
12
  uploadProgress: number;
13
+ isDirty: boolean;
13
14
  }
14
15
  /**
15
16
  * Form store state interface
@@ -38,6 +39,12 @@ export interface FormStoreActions {
38
39
  reset: (formId: string) => void;
39
40
  /** Clean up form state (on unmount) */
40
41
  cleanup: (formId: string) => void;
42
+ /** Set form dirty state */
43
+ setIsDirty: (formId: string, isDirty: boolean) => void;
44
+ /** Check if any form is dirty */
45
+ hasDirtyForms: () => boolean;
46
+ /** Get all dirty form IDs */
47
+ getDirtyFormIds: () => string[];
41
48
  /** Get form status */
42
49
  getStatus: (formId: string) => FormStatus;
43
50
  /** Check if form is in any loading state */
@@ -46,6 +53,8 @@ export interface FormStoreActions {
46
53
  getUploadProgress: (formId: string) => number;
47
54
  /** Get error message */
48
55
  getError: (formId: string) => string | null;
56
+ /** Check if form is dirty */
57
+ getIsDirty: (formId: string) => boolean;
49
58
  }
50
59
  /**
51
60
  * Form store for managing form submission states
@@ -74,5 +83,13 @@ export declare const useUploadProgress: (formId: string) => number;
74
83
  * Hook to get form error
75
84
  */
76
85
  export declare const useFormError: (formId: string) => string | null;
86
+ /**
87
+ * Hook to check if form is dirty
88
+ */
89
+ export declare const useFormIsDirty: (formId: string) => boolean;
90
+ /**
91
+ * Hook to check if any form is dirty
92
+ */
93
+ export declare const useHasDirtyForms: () => boolean;
77
94
  export {};
78
95
  //# sourceMappingURL=FormStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormStore.d.ts","sourceRoot":"","sources":["../../src/stores/FormStore.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,OAAO,CAAC;AAEZ;;GAEG;AACH,UAAU,SAAS;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAE/B,8EAA8E;IAC9E,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,wCAAwC;IACxC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,2BAA2B;IAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qDAAqD;IACrD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB;IACxB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,sBAAsB;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,+BAA+B;IAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,uCAAuC;IACvC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAGlC,sBAAsB;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;IAC1C,4CAA4C;IAC5C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,0BAA0B;IAC1B,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,wBAAwB;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC7C;AAQD;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,2IAsJvB,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,UACiB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OAQ5C,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,MACgB,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IACM,CAAC"}
1
+ {"version":3,"file":"FormStore.d.ts","sourceRoot":"","sources":["../../src/stores/FormStore.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,OAAO,CAAC;AAEZ;;GAEG;AACH,UAAU,SAAS;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAE/B,8EAA8E;IAC9E,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,wCAAwC;IACxC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,2BAA2B;IAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qDAAqD;IACrD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB;IACxB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,sBAAsB;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,+BAA+B;IAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,uCAAuC;IACvC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAGlC,2BAA2B;IAC3B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,iCAAiC;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,6BAA6B;IAC7B,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAGhC,sBAAsB;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;IAC1C,4CAA4C;IAC5C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,0BAA0B;IAC1B,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,wBAAwB;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,6BAA6B;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AASD;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,2IA6LvB,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,UACiB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OAQ5C,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,MACgB,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IACM,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OACgB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,OACY,CAAC"}
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as a}from"@donotdev/core";const e={status:"idle",error:null,uploadProgress:0},m=a({name:"form-store",createStore:(o,t)=>({forms:{},startSubmit:r=>{o(s=>({forms:{...s.forms,[r]:{status:"uploading",error:null,uploadProgress:0}}}))},setUploading:(r,s)=>{o(u=>{const n=u.forms[r]||e;return{forms:{...u.forms,[r]:{...n,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{o(s=>{const u=s.forms[r]||e;return{forms:{...s.forms,[r]:{...u,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{o(s=>{const u=s.forms[r]||e;return{forms:{...s.forms,[r]:{...u,status:"submitting"}}}})},setSuccess:r=>{o(s=>{const u=s.forms[r]||e;return{forms:{...s.forms,[r]:{...u,status:"success",error:null}}}}),setTimeout(()=>{t().reset(r)},1500)},setError:(r,s)=>{o(u=>{const n=u.forms[r]||e;return{forms:{...u.forms,[r]:{...n,status:"error",error:s}}}})},reset:r=>{o(s=>({forms:{...s.forms,[r]:{...e}}}))},cleanup:r=>{o(s=>{const{[r]:u,...n}=s.forms;return{forms:n}})},getStatus:r=>t().forms[r]?.status??"idle",isLoading:r=>{const s=t().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>t().forms[r]?.uploadProgress??0,getError:r=>t().forms[r]?.error??null})}),l=o=>m(t=>t.forms[o]?.status??"idle"),f=o=>m(t=>{const r=t.forms[o]?.status??"idle";return r==="uploading"||r==="validating"||r==="submitting"}),g=o=>m(t=>t.forms[o]?.uploadProgress??0),c=o=>m(t=>t.forms[o]?.error??null);export{c as useFormError,f as useFormLoading,l as useFormStatus,m as useFormStore,g as useUploadProgress};
1
+ "use client";import{createDoNotDevStore as i}from"@donotdev/core";const m={status:"idle",error:null,uploadProgress:0,isDirty:!1},a=i({name:"form-store",createStore:(t,e)=>({forms:{},startSubmit:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,r))}}}})},setValidating:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"validating",uploadProgress:100}}}})},setSubmitting:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"submitting"}}}})},setSuccess:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"success",error:null}}}}),setTimeout(()=>{e().reset(s)},1500)},setError:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,status:"error",error:r}}}})},reset:s=>{t(r=>({forms:{...r.forms,[s]:{...m}}}))},setIsDirty:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,isDirty:r}}}})},hasDirtyForms:()=>{const s=e().forms;return Object.values(s).some(r=>r.isDirty)},getDirtyFormIds:()=>{const s=e().forms;return Object.entries(s).filter(([r,o])=>o.isDirty).map(([r])=>r)},cleanup:s=>{t(r=>{const{[s]:o,...u}=r.forms;return{forms:u}})},getStatus:s=>e().forms[s]?.status??"idle",isLoading:s=>{const r=e().forms[s]?.status??"idle";return r==="uploading"||r==="validating"||r==="submitting"},getUploadProgress:s=>e().forms[s]?.uploadProgress??0,getError:s=>e().forms[s]?.error??null,getIsDirty:s=>e().forms[s]?.isDirty??!1})}),n=t=>a(e=>e.forms[t]?.status??"idle"),f=t=>a(e=>{const s=e.forms[t]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"}),l=t=>a(e=>e.forms[t]?.uploadProgress??0),g=t=>a(e=>e.forms[t]?.error??null),d=t=>a(e=>e.forms[t]?.isDirty??!1),c=()=>a(t=>t.hasDirtyForms());export{g as useFormError,d as useFormIsDirty,f as useFormLoading,n as useFormStatus,a as useFormStore,c as useHasDirtyForms,l as useUploadProgress};
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as U}from"@donotdev/core";const i={status:"idle",progress:0,error:null},d=U({name:"upload-store",createStore:(u,r)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(s,n,t,o)=>{u(e=>({uploadFunctions:{...e.uploadFunctions,[s]:{...e.uploadFunctions[s]||{},[n]:t}},checkPendingFunctions:{...e.checkPendingFunctions,[s]:{...e.checkPendingFunctions[s]||{},[n]:o||(()=>!1)}}}))},unregisterUpload:(s,n)=>{u(t=>{const o=t.uploadFunctions[s],e=t.checkPendingFunctions[s];if(!o)return t;const{[n]:a,...c}=o,{[n]:g,...l}=e||{},{[n]:h,...F}=t.retryAttempts[s]||{};return{uploadFunctions:{...t.uploadFunctions,[s]:c},checkPendingFunctions:{...t.checkPendingFunctions,[s]:l},retryAttempts:{...t.retryAttempts,[s]:F}}})},startUpload:(s,n)=>{u(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(s,n,t)=>{u(o=>{const e=o.uploads[s]?.[n]||i;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[n]:{...e,progress:Math.min(100,Math.max(0,t))}}}}})},completeUpload:(s,n)=>{u(t=>{const o=t.uploads[s]?.[n]||i;return{uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{...o,status:"complete",progress:100}}}}})},failUpload:(s,n,t)=>{u(o=>{const e=o.uploads[s]?.[n]||i;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[n]:{...e,status:"error",error:t}}}}})},resetUpload:(s,n)=>{u(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{...i}}}}))},resetForm:s=>{u(n=>({uploads:{...n.uploads,[s]:{}}}))},cleanup:s=>{u(n=>{const{[s]:t,...o}=n.uploads,{[s]:e,...a}=n.uploadFunctions;return{uploads:o,uploadFunctions:a}})},uploadAll:async s=>{const t=r().uploadFunctions[s];if(!t)return;const o=Object.entries(t);if(o.length===0)return;const e=async(a,c,g=1)=>{r().startUpload(s,a);try{await c(l=>{r().setProgress(s,a,l)}),r().completeUpload(s,a),u(l=>({retryAttempts:{...l.retryAttempts,[s]:{...l.retryAttempts[s]||{},[a]:0}}}))}catch(l){const h=l instanceof Error?l.message:"Upload failed",F=r().maxRetries,y=r().retryAttempts[s]?.[a]||0;if(y<F){u(p=>({retryAttempts:{...p.retryAttempts,[s]:{...p.retryAttempts[s]||{},[a]:y+1}}}));const P=r().retryDelay*Math.pow(2,g-1);return await new Promise(p=>setTimeout(p,P)),e(a,c,g+1)}else throw r().failUpload(s,a,h),l}};await Promise.all(o.map(async([a,c])=>{await e(a,c)}))},hasPendingUploads:s=>{const n=r(),t=n.uploadFunctions[s],o=n.checkPendingFunctions[s];return t?Object.entries(t).some(([e,a])=>{const c=o?.[e];return c?c():!0}):!1},getStatus:(s,n)=>r().uploads[s]?.[n]?.status??"idle",getProgress:(s,n)=>r().uploads[s]?.[n]?.progress??0,getTotalProgress:s=>{const n=r().uploads[s];if(!n)return 100;const t=Object.values(n);if(t.length===0)return 100;const o=t.reduce((e,a)=>e+a.progress,0);return Math.round(o/t.length)},isUploading:s=>{const n=r().uploads[s];return n?Object.values(n).some(t=>t.status==="uploading"):!1},getError:(s,n)=>r().uploads[s]?.[n]?.error??null})}),k=u=>d(r=>{const s=r.uploads[u];if(!s)return 100;const n=Object.values(s);if(n.length===0)return 100;const t=n.reduce((o,e)=>o+e.progress,0);return Math.round(t/n.length)}),x=u=>d(r=>{const s=r.uploads[u];return s?Object.values(s).some(n=>n.status==="uploading"):!1}),_=(u,r)=>d(s=>s.uploads[u]?.[r]?.progress??0),w=(u,r)=>d(s=>s.uploads[u]?.[r]?.status??"idle");export{_ as useFieldProgress,w as useFieldUploadStatus,x as useIsUploading,k as useTotalProgress,d as useUploadStore};
1
+ "use client";import{createDoNotDevStore as y}from"@donotdev/core";const g={status:"idle",progress:0,error:null},d=y({name:"upload-store",createStore:(a,n)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(t,e,o,r)=>{a(s=>({uploadFunctions:{...s.uploadFunctions,[t]:{...s.uploadFunctions[t]||{},[e]:o}},checkPendingFunctions:{...s.checkPendingFunctions,[t]:{...s.checkPendingFunctions[t]||{},[e]:r||(()=>!1)}}}))},unregisterUpload:(t,e)=>{a(o=>{const r=o.uploadFunctions[t],s=o.checkPendingFunctions[t];if(!r)return o;const{[e]:u,...p}=r,{[e]:l,...m}=s||{},{[e]:F,...c}=o.retryAttempts[t]||{};return{uploadFunctions:{...o.uploadFunctions,[t]:p},checkPendingFunctions:{...o.checkPendingFunctions,[t]:m},retryAttempts:{...o.retryAttempts,[t]:c}}})},startUpload:(t,e)=>{a(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(t,e,o)=>{a(r=>{const s=r.uploads[t]?.[e]||g;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,progress:Math.min(100,Math.max(0,o))}}}}})},completeUpload:(t,e)=>{a(o=>{const r=o.uploads[t]?.[e]||g;return{uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...r,status:"complete",progress:100}}}}})},failUpload:(t,e,o)=>{a(r=>{const s=r.uploads[t]?.[e]||g;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,status:"error",error:o}}}}})},resetUpload:(t,e)=>{a(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...g}}}}))},resetForm:t=>{a(e=>({uploads:{...e.uploads,[t]:{}}}))},cleanup:t=>{a(e=>{const{[t]:o,...r}=e.uploads,{[t]:s,...u}=e.uploadFunctions;return{uploads:r,uploadFunctions:u}})},uploadAll:async t=>{const e=n().uploadFunctions[t];if(!e)return;const o=Object.entries(e);if(o.length===0)return;const r=async(s,u,p=1)=>{n().startUpload(t,s);try{await u(l=>{n().setProgress(t,s,l)}),n().completeUpload(t,s),a(l=>({retryAttempts:{...l.retryAttempts,[t]:{...l.retryAttempts[t]||{},[s]:0}}}))}catch(l){const m=l instanceof Error?l.message:"Upload failed",F=n().maxRetries,c=n().retryAttempts[t]?.[s]||0;if(c<F){a(i=>({retryAttempts:{...i.retryAttempts,[t]:{...i.retryAttempts[t]||{},[s]:c+1}}}));const h=n().retryDelay*Math.pow(2,p-1);return await new Promise(i=>setTimeout(i,h)),r(s,u,p+1)}else throw n().failUpload(t,s,m),l}};await Promise.all(o.map(async([s,u])=>{await r(s,u)}))},hasPendingUploads:t=>{const e=n(),o=e.uploadFunctions[t],r=e.checkPendingFunctions[t];return o?Object.entries(o).some(([s,u])=>{const p=r?.[s];return p?p():!0}):!1},getStatus:(t,e)=>n().uploads[t]?.[e]?.status??"idle",getProgress:(t,e)=>n().uploads[t]?.[e]?.progress??0,getTotalProgress:t=>{const e=n().uploads[t];if(!e)return 100;const o=Object.values(e);if(o.length===0)return 100;const r=o.reduce((s,u)=>s+u.progress,0);return Math.round(r/o.length)},isUploading:t=>{const e=n().uploads[t];return e?Object.values(e).some(o=>o.status==="uploading"):!1},getError:(t,e)=>n().uploads[t]?.[e]?.error??null})}),P=a=>d(n=>{const t=n.uploads[a];if(!t)return 100;const e=Object.values(t);if(e.length===0)return 100;const o=e.reduce((r,s)=>r+s.progress,0);return Math.round(o/e.length)}),U=a=>d(n=>{const t=n.uploads[a];return t?Object.values(t).some(e=>e.status==="uploading"):!1}),f=(a,n)=>d(t=>t.uploads[a]?.[n]?.progress??0),A=(a,n)=>d(t=>t.uploads[a]?.[n]?.status??"idle");export{f as useFieldProgress,A as useFieldUploadStatus,U as useIsUploading,P as useTotalProgress,d as useUploadStore};
@@ -6,6 +6,6 @@
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
9
- export { useFormStore, useFormStatus, useFormLoading, useUploadProgress, useFormError, type FormStatus, type FormStoreState, type FormStoreActions, } from './FormStore';
9
+ export { useFormStore, useFormStatus, useFormLoading, useUploadProgress, useFormError, useFormIsDirty, useHasDirtyForms, type FormStatus, type FormStoreState, type FormStoreActions, } from './FormStore';
10
10
  export { useUploadStore, useTotalProgress, useIsUploading, useFieldProgress, useFieldUploadStatus, type UploadStatus, type UploadFunction, type UploadStoreState, type UploadStoreActions, } from './UploadStore';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC"}
@@ -1 +1 @@
1
- import{useFormStore as r,useFormStatus as s,useFormLoading as u,useUploadProgress as t,useFormError as a}from"./FormStore";import{useUploadStore as l,useTotalProgress as m,useIsUploading as p,useFieldProgress as F,useFieldUploadStatus as g}from"./UploadStore";export{F as useFieldProgress,g as useFieldUploadStatus,a as useFormError,u as useFormLoading,s as useFormStatus,r as useFormStore,p as useIsUploading,m as useTotalProgress,t as useUploadProgress,l as useUploadStore};
1
+ import{useFormStore as s,useFormStatus as a,useFormLoading as r,useUploadProgress as o,useFormError as e,useFormIsDirty as u,useHasDirtyForms as t}from"./FormStore";import{useUploadStore as m,useTotalProgress as F,useIsUploading as i,useFieldProgress as l,useFieldUploadStatus as d}from"./UploadStore";export{l as useFieldProgress,d as useFieldUploadStatus,e as useFormError,u as useFormIsDirty,r as useFormLoading,a as useFormStatus,s as useFormStore,t as useHasDirtyForms,i as useIsUploading,F as useTotalProgress,o as useUploadProgress,m as useUploadStore};