@donotdev/crud 0.0.9 → 0.0.11

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 (194) hide show
  1. package/dist/CrudService.d.ts +26 -8
  2. package/dist/CrudService.d.ts.map +1 -1
  3. package/dist/CrudService.js +1 -1
  4. package/dist/CrudStore.d.ts.map +1 -1
  5. package/dist/CrudStore.js +1 -1
  6. package/dist/adapters/FirestoreAdapter.d.ts +1 -1
  7. package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
  8. package/dist/adapters/FirestoreAdapter.js +1 -1
  9. package/dist/adapters/FunctionsAdapter.d.ts +1 -1
  10. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  11. package/dist/adapters/FunctionsAdapter.js +1 -1
  12. package/dist/builtinFieldTypes.d.ts +17 -4
  13. package/dist/builtinFieldTypes.d.ts.map +1 -1
  14. package/dist/builtinFieldTypes.js +1 -1
  15. package/dist/components/DisplayFieldRenderer.d.ts +2 -0
  16. package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
  17. package/dist/components/DisplayFieldRenderer.js +1 -1
  18. package/dist/components/EntityDisplayRenderer.d.ts +2 -2
  19. package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
  20. package/dist/components/EntityDisplayRenderer.js +1 -1
  21. package/dist/components/EntityFilters.d.ts +19 -1
  22. package/dist/components/EntityFilters.d.ts.map +1 -1
  23. package/dist/components/EntityFilters.js +1 -1
  24. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  25. package/dist/components/FormFieldRenderer.js +1 -1
  26. package/dist/components/controlled/input/ControlledCurrencyField.d.ts +8 -0
  27. package/dist/components/controlled/input/ControlledCurrencyField.d.ts.map +1 -0
  28. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -0
  29. package/dist/components/controlled/input/ControlledDurationField.d.ts +7 -0
  30. package/dist/components/controlled/input/ControlledDurationField.d.ts.map +1 -0
  31. package/dist/components/controlled/input/ControlledDurationField.js +1 -0
  32. package/dist/components/controlled/input/ControlledGdprConsentField.d.ts.map +1 -1
  33. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  34. package/dist/components/controlled/input/ControlledPriceField.d.ts +8 -0
  35. package/dist/components/controlled/input/ControlledPriceField.d.ts.map +1 -0
  36. package/dist/components/controlled/input/ControlledPriceField.js +1 -0
  37. package/dist/components/controlled/input/ControlledRatingField.d.ts +8 -0
  38. package/dist/components/controlled/input/ControlledRatingField.d.ts.map +1 -0
  39. package/dist/components/controlled/input/ControlledRatingField.js +1 -0
  40. package/dist/components/controlled/input/index.d.ts +4 -0
  41. package/dist/components/controlled/input/index.d.ts.map +1 -1
  42. package/dist/components/controlled/input/index.js +1 -1
  43. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  44. package/dist/components/fields/display/AvatarFieldDisplay.d.ts +23 -0
  45. package/dist/components/fields/display/AvatarFieldDisplay.d.ts.map +1 -0
  46. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -0
  47. package/dist/components/fields/display/BadgeFieldDisplay.d.ts +21 -0
  48. package/dist/components/fields/display/BadgeFieldDisplay.d.ts.map +1 -0
  49. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -0
  50. package/dist/components/fields/display/ButtonFieldDisplay.d.ts +29 -0
  51. package/dist/components/fields/display/ButtonFieldDisplay.d.ts.map +1 -0
  52. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -0
  53. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +21 -0
  54. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts.map +1 -0
  55. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -0
  56. package/dist/components/fields/display/DateFieldDisplay.d.ts +24 -0
  57. package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -0
  58. package/dist/components/fields/display/DateFieldDisplay.js +1 -0
  59. package/dist/components/fields/display/DropdownDisplay.d.ts +21 -0
  60. package/dist/components/fields/display/DropdownDisplay.d.ts.map +1 -0
  61. package/dist/components/fields/display/DropdownDisplay.js +1 -0
  62. package/dist/components/fields/display/FileFieldDisplay.d.ts +21 -0
  63. package/dist/components/fields/display/FileFieldDisplay.d.ts.map +1 -0
  64. package/dist/components/fields/display/FileFieldDisplay.js +1 -0
  65. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +25 -0
  66. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -0
  67. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -0
  68. package/dist/components/fields/display/HiddenFieldDisplay.d.ts +30 -0
  69. package/dist/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -0
  70. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -0
  71. package/dist/components/fields/display/ImageFieldDisplay.d.ts +24 -0
  72. package/dist/components/fields/display/ImageFieldDisplay.d.ts.map +1 -0
  73. package/dist/components/fields/display/ImageFieldDisplay.js +1 -0
  74. package/dist/components/fields/display/LinkFieldDisplay.d.ts +22 -0
  75. package/dist/components/fields/display/LinkFieldDisplay.d.ts.map +1 -0
  76. package/dist/components/fields/display/LinkFieldDisplay.js +1 -0
  77. package/dist/components/fields/display/MapFieldDisplay.d.ts +25 -0
  78. package/dist/components/fields/display/MapFieldDisplay.d.ts.map +1 -0
  79. package/dist/components/fields/display/MapFieldDisplay.js +1 -0
  80. package/dist/components/fields/display/MultiDropdownDisplay.d.ts +22 -0
  81. package/dist/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -0
  82. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -0
  83. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +22 -0
  84. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -0
  85. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -0
  86. package/dist/components/fields/display/NumberFieldDisplay.d.ts +24 -0
  87. package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -0
  88. package/dist/components/fields/display/NumberFieldDisplay.js +1 -0
  89. package/dist/components/fields/display/PasswordFieldDisplay.d.ts +24 -0
  90. package/dist/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -0
  91. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -0
  92. package/dist/components/fields/display/PhoneNumberDisplay.d.ts +22 -0
  93. package/dist/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -0
  94. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -0
  95. package/dist/components/fields/display/RadioFieldDisplay.d.ts +22 -0
  96. package/dist/components/fields/display/RadioFieldDisplay.d.ts.map +1 -0
  97. package/dist/components/fields/display/RadioFieldDisplay.js +1 -0
  98. package/dist/components/fields/display/RangeFieldDisplay.d.ts +22 -0
  99. package/dist/components/fields/display/RangeFieldDisplay.d.ts.map +1 -0
  100. package/dist/components/fields/display/RangeFieldDisplay.js +1 -0
  101. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +22 -0
  102. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -0
  103. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -0
  104. package/dist/components/fields/display/RichTextDisplay.d.ts +25 -0
  105. package/dist/components/fields/display/RichTextDisplay.d.ts.map +1 -0
  106. package/dist/components/fields/display/RichTextDisplay.js +61 -0
  107. package/dist/components/fields/display/TextAreaDisplay.d.ts +22 -0
  108. package/dist/components/fields/display/TextAreaDisplay.d.ts.map +1 -0
  109. package/dist/components/fields/display/TextAreaDisplay.js +1 -0
  110. package/dist/components/fields/display/TextFieldDisplay.d.ts +42 -0
  111. package/dist/components/fields/display/TextFieldDisplay.d.ts.map +1 -0
  112. package/dist/components/fields/display/TextFieldDisplay.js +1 -0
  113. package/dist/components/fields/display/TimestampFieldDisplay.d.ts +22 -0
  114. package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -0
  115. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -0
  116. package/dist/components/fields/display/index.d.ts +32 -0
  117. package/dist/components/fields/display/index.d.ts.map +1 -0
  118. package/dist/components/fields/display/index.js +1 -0
  119. package/dist/components/form/fields/ComboboxComponent.d.ts +6 -0
  120. package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
  121. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  122. package/dist/components/form/fields/DurationFieldComponent.d.ts +42 -0
  123. package/dist/components/form/fields/DurationFieldComponent.d.ts.map +1 -0
  124. package/dist/components/form/fields/DurationFieldComponent.js +1 -0
  125. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +2 -2
  126. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts.map +1 -1
  127. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  128. package/dist/components/form/fields/PriceFieldComponent.d.ts +34 -0
  129. package/dist/components/form/fields/PriceFieldComponent.d.ts.map +1 -0
  130. package/dist/components/form/fields/PriceFieldComponent.js +1 -0
  131. package/dist/components/form/fields/RatingFieldComponent.d.ts +37 -0
  132. package/dist/components/form/fields/RatingFieldComponent.d.ts.map +1 -0
  133. package/dist/components/form/fields/RatingFieldComponent.js +1 -0
  134. package/dist/components/form/fields/index.d.ts +7 -0
  135. package/dist/components/form/fields/index.d.ts.map +1 -1
  136. package/dist/components/form/fields/index.js +1 -1
  137. package/dist/components/index.d.ts +3 -9
  138. package/dist/components/index.d.ts.map +1 -1
  139. package/dist/components/index.js +1 -1
  140. package/dist/fieldTypeRegistry.d.ts +92 -0
  141. package/dist/fieldTypeRegistry.d.ts.map +1 -0
  142. package/dist/fieldTypeRegistry.js +1 -0
  143. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  144. package/dist/forms/hooks/useEntityForm.js +1 -1
  145. package/dist/forms/types.d.ts +5 -3
  146. package/dist/forms/types.d.ts.map +1 -1
  147. package/dist/forms/utils/getFieldsForOperation.d.ts +2 -3
  148. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  149. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  150. package/dist/forms/utils/isFieldEditable.d.ts +1 -1
  151. package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
  152. package/dist/hooks/index.d.ts +5 -0
  153. package/dist/hooks/index.d.ts.map +1 -1
  154. package/dist/hooks/index.js +1 -1
  155. package/dist/hooks/useEntityFavorites.d.ts +53 -0
  156. package/dist/hooks/useEntityFavorites.d.ts.map +1 -0
  157. package/dist/hooks/useEntityFavorites.js +1 -0
  158. package/dist/hooks/useRelatedItems.d.ts +37 -0
  159. package/dist/hooks/useRelatedItems.d.ts.map +1 -0
  160. package/dist/hooks/useRelatedItems.js +1 -0
  161. package/dist/index.d.ts +4 -3
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +1 -1
  164. package/dist/registerBuiltinFieldTypes.d.ts +6 -0
  165. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -0
  166. package/dist/registerBuiltinFieldTypes.js +1 -0
  167. package/dist/tsconfig.tsbuildinfo +1 -1
  168. package/dist/types.d.ts +60 -25
  169. package/dist/types.d.ts.map +1 -1
  170. package/dist/useBaseCrudList.d.ts +53 -0
  171. package/dist/useBaseCrudList.d.ts.map +1 -0
  172. package/dist/useBaseCrudList.js +1 -0
  173. package/dist/useCrud.d.ts +3 -6
  174. package/dist/useCrud.d.ts.map +1 -1
  175. package/dist/useCrud.js +1 -1
  176. package/dist/useCrudCardList.d.ts +10 -4
  177. package/dist/useCrudCardList.d.ts.map +1 -1
  178. package/dist/useCrudCardList.js +1 -1
  179. package/dist/useCrudList.d.ts +12 -5
  180. package/dist/useCrudList.d.ts.map +1 -1
  181. package/dist/useCrudList.js +1 -1
  182. package/dist/utils/mergeWithOptimistic.d.ts +4 -5
  183. package/dist/utils/mergeWithOptimistic.d.ts.map +1 -1
  184. package/dist/utils/mergeWithOptimistic.js +1 -1
  185. package/dist/utils/scopeUtils.d.ts +38 -0
  186. package/dist/utils/scopeUtils.d.ts.map +1 -0
  187. package/dist/utils/scopeUtils.js +1 -0
  188. package/package.json +15 -14
  189. package/dist/components/EntityCardList.d.ts +0 -29
  190. package/dist/components/EntityCardList.d.ts.map +0 -1
  191. package/dist/components/EntityCardList.js +0 -1
  192. package/dist/components/EntityList.d.ts +0 -30
  193. package/dist/components/EntityList.d.ts.map +0 -1
  194. package/dist/components/EntityList.js +0 -1
@@ -0,0 +1,37 @@
1
+ import type { ComponentType } from 'react';
2
+ export interface RatingFieldComponentProps {
3
+ /** Label for the field */
4
+ label: string;
5
+ /** Current rating value (1-5) */
6
+ value?: number;
7
+ /** Change handler */
8
+ onChange: (value: number) => void;
9
+ /** Whether the field is in error state */
10
+ error?: boolean;
11
+ /** Helper text to display */
12
+ helperText?: string;
13
+ /** Maximum rating value */
14
+ max?: number;
15
+ /** Whether the field is disabled */
16
+ disabled?: boolean;
17
+ /** Whether the field is required */
18
+ required?: boolean;
19
+ /** Read-only mode (display only) */
20
+ readonly?: boolean;
21
+ /** Show numeric value next to stars */
22
+ showValue?: boolean;
23
+ }
24
+ /**
25
+ * RatingFieldComponent renders a star rating input
26
+ *
27
+ * Used by the built-in entity field type `rating`. Supports whole-number input
28
+ * (1–max), optional fractional display, and optional numeric value display.
29
+ *
30
+ * @see Entity field type: `rating` (registered in registerBuiltinFieldTypes)
31
+ * @version 0.0.1
32
+ * @since 0.0.1
33
+ * @author AMBROISE PARK Consulting
34
+ */
35
+ declare const RatingFieldComponent: ComponentType<RatingFieldComponentProps>;
36
+ export default RatingFieldComponent;
37
+ //# sourceMappingURL=RatingFieldComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RatingFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/RatingFieldComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,oBAAoB,EAAE,aAAa,CAAC,yBAAyB,CAiDlE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1 @@
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};
@@ -38,6 +38,11 @@ export { default as RadioFieldComponent } from './RadioFieldComponent';
38
38
  export type { RadioFieldComponentProps } from './RadioFieldComponent';
39
39
  export { default as RangeFieldComponent } from './RangeFieldComponent';
40
40
  export type { RangeFieldComponentProps } from './RangeFieldComponent';
41
+ export { default as RatingFieldComponent } from './RatingFieldComponent';
42
+ export type { RatingFieldComponentProps } from './RatingFieldComponent';
43
+ export { default as DurationFieldComponent } from './DurationFieldComponent';
44
+ export type { DurationFieldComponentProps } from './DurationFieldComponent';
45
+ export { DURATION_PRESETS } from './DurationFieldComponent';
41
46
  export { default as PhoneNumberComponent } from './PhoneNumberComponent';
42
47
  export type { PhoneNumberComponentProps } from './PhoneNumberComponent';
43
48
  export { default as GeoPointFieldComponent } from './GeoPointFieldComponent';
@@ -58,6 +63,8 @@ export { default as AddressFieldComponent } from './AddressFieldComponent';
58
63
  export type { AddressFieldComponentProps } from './AddressFieldComponent';
59
64
  export { default as CurrencyFieldComponent } from './CurrencyFieldComponent';
60
65
  export type { CurrencyFieldComponentProps } from './CurrencyFieldComponent';
66
+ export { default as PriceFieldComponent } from './PriceFieldComponent';
67
+ export type { PriceFieldComponentProps, PriceValue, } from './PriceFieldComponent';
61
68
  export { default as RichTextComponent } from './RichTextComponent';
62
69
  export type { RichTextComponentProps } from './types';
63
70
  export { default as GdprConsentFieldComponent } from './GdprConsentFieldComponent';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- import{default as t}from"./AvatarFieldComponent";import{default as a}from"./BadgeFieldComponent";import{default as m}from"./TextFieldComponent";import{default as d}from"./NumberFieldComponent";import{default as l}from"./DateFieldComponent";import{default as s}from"./CheckboxFieldComponent";import{default as C}from"./ComboboxComponent";import{default as F}from"./DropdownComponent";import{default as c}from"./MultiDropdownComponent";import{default as h}from"./FileFieldComponent";import{default as D}from"./ImageFieldComponent";import{default as A}from"./DocumentFieldComponent";import{default as P}from"./TextAreaComponent";import{default as B}from"./SwitchFieldComponent";import{default as I}from"./RadioFieldComponent";import{default as k}from"./RangeFieldComponent";import{default as y}from"./PhoneNumberComponent";import{default as S}from"./GeoPointFieldComponent";import{default as q}from"./MapFieldComponent";import{default as E}from"./TimestampFieldComponent";import{default as K}from"./MultiInputTextFieldComponent";import{default as O}from"./ButtonFieldComponent";import{default as U}from"./HiddenFieldComponent";import{default as W}from"./PasswordFieldComponent";import{default as Y}from"./AddressFieldComponent";import{default as _}from"./CurrencyFieldComponent";import{default as oo}from"./RichTextComponent";import{default as to}from"./GdprConsentFieldComponent";export{Y as AddressFieldComponent,t as AvatarFieldComponent,a as BadgeFieldComponent,O as ButtonFieldComponent,s as CheckboxFieldComponent,C as ComboboxComponent,_ as CurrencyFieldComponent,l as DateFieldComponent,A as DocumentFieldComponent,F as DropdownComponent,h as FileFieldComponent,to as GdprConsentFieldComponent,S as GeoPointFieldComponent,U as HiddenFieldComponent,D as ImageFieldComponent,q as MapFieldComponent,c as MultiDropdownComponent,K as MultiInputTextFieldComponent,d as NumberFieldComponent,W as PasswordFieldComponent,y as PhoneNumberComponent,I as RadioFieldComponent,k as RangeFieldComponent,oo as RichTextComponent,B as SwitchFieldComponent,P as TextAreaComponent,m as TextFieldComponent,E 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};
@@ -8,19 +8,13 @@
8
8
  */
9
9
  export { default as CrudButton } from './CrudButton';
10
10
  export type { CrudButtonProps } from './CrudButton';
11
- export { EntityFormRenderer } from './EntityFormRenderer';
12
11
  export { FormFieldRenderer } from './FormFieldRenderer';
13
- export { DisplayFieldRenderer } from './DisplayFieldRenderer';
12
+ export { DisplayFieldRenderer, formatValue } from './DisplayFieldRenderer';
14
13
  export type { DisplayFieldRendererProps } from './DisplayFieldRenderer';
15
- export { EntityDisplayRenderer } from './EntityDisplayRenderer';
16
- export type { EntityDisplayRendererProps } from './EntityDisplayRenderer';
17
14
  export { default as FormLayout } from './FormLayout';
18
15
  export * from './controlled';
19
16
  export * from './form';
20
- export { EntityList } from './EntityList';
21
- export type { EntityListProps } from './EntityList';
22
- export { EntityCardList } from './EntityCardList';
23
- export type { EntityCardListProps } from './EntityCardList';
24
- export { EntityFilters } from './EntityFilters';
17
+ export { EntityFilters, matchesFilter } from './EntityFilters';
25
18
  export type { EntityFiltersProps } from './EntityFilters';
19
+ export * from './fields/display';
26
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC3E,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,cAAc,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- import{default as e}from"./CrudButton";import{EntityFormRenderer as m}from"./EntityFormRenderer";import{FormFieldRenderer as p}from"./FormFieldRenderer";import{DisplayFieldRenderer as x}from"./DisplayFieldRenderer";import{EntityDisplayRenderer as n}from"./EntityDisplayRenderer";import{default as y}from"./FormLayout";export*from"./controlled";export*from"./form";import{EntityList as u}from"./EntityList";import{EntityCardList as R}from"./EntityCardList";import{EntityFilters as C}from"./EntityFilters";export{e as CrudButton,x as DisplayFieldRenderer,R as EntityCardList,n as EntityDisplayRenderer,C as EntityFilters,m as EntityFormRenderer,u as EntityList,p as FormFieldRenderer,y as FormLayout};
1
+ import{default as o}from"./CrudButton";import{FormFieldRenderer as m}from"./FormFieldRenderer";import{DisplayFieldRenderer as a,formatValue as p}from"./DisplayFieldRenderer";import{default as x}from"./FormLayout";export*from"./controlled";export*from"./form";import{EntityFilters as F,matchesFilter as s}from"./EntityFilters";export*from"./fields/display";export{o as CrudButton,a as DisplayFieldRenderer,F as EntityFilters,m as FormFieldRenderer,x as FormLayout,p as formatValue,s as matchesFilter};
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @fileoverview Unified Field Type Registry
3
+ * @description Single source of truth for framework built-in field types.
4
+ * Coordinates schema registration, UI components, filter metadata, and display formatting.
5
+ *
6
+ * @version 0.0.1
7
+ * @since 0.0.1
8
+ * @author AMBROISE PARK Consulting
9
+ */
10
+ import type { EntityField, FieldType } from '@donotdev/core';
11
+ import type { ComponentType, ReactElement } from 'react';
12
+ import type { ControlledFieldProps, UncontrolledFieldProps } from './FieldRegistry';
13
+ /**
14
+ * Filter type metadata for EntityFilters component
15
+ */
16
+ export type FilterType = 'text' | 'range' | 'select' | 'none' | 'address' | 'multiselect';
17
+ /**
18
+ * Value type for type checking
19
+ */
20
+ export type ValueType = 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array';
21
+ /**
22
+ * Display formatter function
23
+ */
24
+ export type DisplayFormatterOptions = {
25
+ compact?: boolean;
26
+ asString?: boolean;
27
+ };
28
+ export type DisplayFormatter = (value: any, config: EntityField, t: (key: string, options?: Record<string, any>) => string, options?: DisplayFormatterOptions) => string | ReactElement;
29
+ /**
30
+ * Component registration for a field type
31
+ */
32
+ export interface ComponentRegistration {
33
+ controlled: ComponentType<ControlledFieldProps<any, any>>;
34
+ uncontrolled?: ComponentType<UncontrolledFieldProps>;
35
+ }
36
+ /**
37
+ * Complete metadata for a built-in field type
38
+ *
39
+ * NOTE: Schemas are registered separately in @donotdev/core/schemas/getSchemaType.ts
40
+ * This registry only handles UI components + filter/display metadata
41
+ */
42
+ export interface FieldTypeMetadata {
43
+ /** Field type identifier */
44
+ type: FieldType;
45
+ /** Whether this field type is filterable */
46
+ filterable?: boolean;
47
+ /** Filter UI type for EntityFilters */
48
+ filterType?: FilterType;
49
+ /** Display formatter function */
50
+ displayFormatter?: DisplayFormatter;
51
+ /** Runtime value type */
52
+ valueType?: ValueType;
53
+ /** UI components */
54
+ components?: ComponentRegistration;
55
+ }
56
+ /**
57
+ * Register a built-in field type with all metadata
58
+ *
59
+ * This is the single registration point for framework built-ins.
60
+ * It coordinates:
61
+ * - Schema registration (via registerSchemaGenerator)
62
+ * - UI component registration (via FieldRegistry)
63
+ * - Filter/display metadata storage
64
+ *
65
+ * @param metadata - Complete field type metadata
66
+ */
67
+ export declare function registerBuiltinFieldType(metadata: FieldTypeMetadata): void;
68
+ /**
69
+ * Get metadata for a field type
70
+ */
71
+ export declare function getFieldTypeMetadata(type: string): FieldTypeMetadata | undefined;
72
+ /**
73
+ * Get filter type for a field type
74
+ */
75
+ export declare function getFilterType(type: string): FilterType | undefined;
76
+ /**
77
+ * Get display formatter for a field type
78
+ */
79
+ export declare function getDisplayFormatter(type: string): DisplayFormatter | undefined;
80
+ /**
81
+ * Check if a field type is filterable
82
+ */
83
+ export declare function isFilterable(type: string): boolean;
84
+ /**
85
+ * Get value type for a field type
86
+ */
87
+ export declare function getValueType(type: string): ValueType | undefined;
88
+ /**
89
+ * Clear registry (testing)
90
+ */
91
+ export declare function clearFieldTypeRegistry(): void;
92
+ //# sourceMappingURL=fieldTypeRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldTypeRegistry.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI7D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,GACT,aAAa,CAAC;AAElB;;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;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,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;AAOD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAmB1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAE9B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -0,0 +1 @@
1
+ "use client";import{getFieldRegistry as i}from"./FieldRegistry";const t=new Map;function p(e){const{type:n,components:r}=e;r&&i().registerComponent(n,r.controlled,r.uncontrolled),t.set(n,e)}function g(e){return t.get(e)}function s(e){return t.get(e)?.filterType}function u(e){return t.get(e)?.displayFormatter}function c(e){return t.get(e)?.filterable??!1}function a(e){return t.get(e)?.valueType}function y(){t.clear()}export{y as clearFieldTypeRegistry,u as getDisplayFormatter,g as getFieldTypeMetadata,s as getFilterType,a as getValueType,c as isFilterable,p as registerBuiltinFieldType};
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAwcrB"}
1
+ {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAyerB"}
@@ -1 +1 @@
1
- "use client";import{valibotResolver as B}from"@hookform/resolvers/valibot";import{useMemo as d,useEffect as U,useRef as g,useCallback as b}from"react";import{useForm as te,useWatch as re}from"react-hook-form";import{useLocalStorage as se,BACKEND_GENERATED_FIELD_NAMES as ne,createSchemas as oe}from"@donotdev/core";import{useFormStore as y,useFormStatus as ae,useUploadProgress as ie}from"../../stores";import{useUploadStore as L}from"../../stores/UploadStore";import{checkForBlobUrls as N}from"../../utils/uploadValidation";import{getFieldsForOperation as ue}from"../utils";function ve(c,x={}){const{formId:e,operation:J,defaultValues:i,viewerRole:R="admin",mode:_="onBlur",t:C,autoSave:l=!1}=x,o=J??(i?"edit":"create"),K=ae(e??""),W=ie(e??""),v=d(()=>oe(c),[c.name]),j=d(()=>B(v.create),[v.create]),k=d(()=>B(v.draft),[v.draft]),q=d(()=>async(t,n,s)=>((t?.status??i?.status)==="draft"?k:j)(t,n,s),[j,k,i?.status]),u=d(()=>{if(!i)return i;const t={...i};return Object.entries(c.fields).forEach(([n,s])=>{if(s.type==="switch"){const r=t[n];if(r==null){const S=s.options?.fieldSpecific;t[n]=S?.uncheckedValue??!1}}}),t},[i,c.fields]),a=te({defaultValues:u,mode:_,resolver:q,shouldUnregister:!1,shouldFocusError:!0}),E=g(null);U(()=>{if(o==="edit"&&u){const t=u.id??null;t&&t!==E.current?(a.reset(u),E.current=t):!t&&E.current===null&&(a.reset(u),E.current="initialized")}},[o,u,a]);const G=d(()=>`${c.name.toLowerCase()}-form-draft`,[c.name]),{value:O,setValue:I,removeValue:V}=se(G,{defaultValue:null,syncAcrossTabs:!0}),w=g(!1);U(()=>{!l||o!=="create"||i||w.current||(O&&a.reset(O),w.current=!0)},[l,o,i,O,a]);const f=re({control:a.control}),F=g(!1),h=g(null),D=g(void 0),T=g(!0);U(()=>{if(T.current){T.current=!1,D.current=f?JSON.stringify(f):void 0;return}if(!l||o!=="create"||F.current||!w.current)return;const t=f?JSON.stringify(f):void 0;if(D.current!==t)return D.current=t,h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{if(!f)return;Object.values(f).some(s=>s!=null&&s!=="")&&I(f)},3e3),()=>{h.current&&clearTimeout(h.current)}},[f,l,o,I]);const M=b(async()=>{if(!e)return!0;const t=L.getState(),n=y.getState();if(!t.hasPendingUploads(e))return!0;try{n.setUploading(e,0),await t.uploadAll(e),await new Promise(p=>setTimeout(p,50));let s=a.getValues(),r=N(s),S=0;const m=5;for(;r.length>0&&S<m;)S++,await new Promise(p=>setTimeout(p,100)),s=a.getValues(),r=N(s);if(r.length>0){const p=`Upload incomplete: files still pending at ${r.join(", ")}`;return n.setError(e,p),!1}return!0}catch(s){const r=s instanceof Error?s.message:"File upload failed";return y.getState().setError(e,r),!1}},[e,a]),A=b(t=>o!=="create"?t:Object.fromEntries(Object.entries(t).filter(([n])=>!ne.includes(n))),[o]),$=b(t=>{if(typeof window>"u")return;const n=Object.keys(t).find(r=>r!=="root"&&t[r]);if(!n)return;const s=document.querySelector(`input[name="${n}"][aria-invalid="true"], textarea[name="${n}"][aria-invalid="true"], select[name="${n}"][aria-invalid="true"]`);s&&(s.scrollIntoView({behavior:"smooth",block:"center"}),s.focus())},[]),z=a.handleSubmit,H=d(()=>((t,n)=>async s=>{s?.preventDefault?.();const r=e?y.getState():null;e&&r&&r.startSubmit(e),F.current=!0;try{if(!await M()){F.current=!1;return}e&&r&&r.setValidating(e),await z(async(m,p)=>{e&&r&&r.setSubmitting(e);const Z=A(m);try{await t(Z,p),l&&o==="create"&&V(),e&&r&&r.setSuccess(e)}catch(P){const ee=P instanceof Error?P.message:"Submission failed";throw e&&r&&r.setError(e,ee),P}},m=>{e&&r&&r.setError(e,"Validation failed"),$(m),n?.(m)})(s)}finally{F.current=!1}}),[z,e,M,A,$,l,o,V]),Q=b(()=>{l&&o==="create"&&V(),a.reset(u),D.current=u?JSON.stringify(u):void 0,T.current=!0,w.current=!1},[l,o,V,a,u]),X=b(()=>{e&&(y.getState().cleanup(e),L.getState().cleanup(e))},[e]),Y=d(()=>ue(c,{operation:o,viewerRole:R,availableFields:o==="edit"&&i?Object.keys(i):void 0}),[c,o,R,i]);return{...a,handleSubmit:H,fields:Y,operation:o,entity:c,t:C??(t=>t),viewerRole:R,formId:e,formStatus:e?K:"idle",uploadProgress:e?W:0,cleanup:X,isDirty:a.formState.isDirty,resetForm:Q,originalValues:u}}export{ve as useEntityForm};
1
+ "use client";import{valibotResolver as z}from"@hookform/resolvers/valibot";import{useMemo as p,useEffect as U,useRef as S,useCallback as y}from"react";import{useForm as re,useWatch as se}from"react-hook-form";import{useLocalStorage as ne,BACKEND_GENERATED_FIELD_NAMES as oe,createSchemas as ae}from"@donotdev/core";import{useFormStore as F,useFormStatus as ue,useUploadProgress as ce}from"../../stores";import{useUploadStore as B}from"../../stores/UploadStore";import{checkForBlobUrls as L}from"../../utils/uploadValidation";import{getFieldsForOperation as ie}from"../utils";function ve(i,J={}){const{formId:r,operation:_,defaultValues:c,viewerRole:K,mode:W="onBlur",t:q,autoSave:d=!1}=J,R=K??"guest",o=_??(c?"edit":"create"),G=ue(r??""),H=ce(r??""),g=p(()=>ae(i),[i.name]),I=p(()=>z(g.create),[g.create]),k=p(()=>z(g.draft),[g.draft]),Q=p(()=>async(t,n,e)=>((t?.status??c?.status)==="draft"?k:I)(t,n,e),[I,k,c?.status]),u=p(()=>{if(!c)return c;const t={...c};return Object.entries(i.fields).forEach(([n,e])=>{const s=t[n],l=!(n in c)||s===null||s===void 0;if(e.type==="switch"){if(s==null){const f=e.options?.fieldSpecific;t[n]=f?.uncheckedValue??!1}}else l&&(e.type==="price"?t[n]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:e.type==="checkbox"||e.type==="boolean"?t[n]=!1:e.type==="text"||e.type==="textarea"||e.type==="email"||e.type==="url"||e.type==="tel"||e.type==="password"||e.type==="color"?t[n]="":(e.type==="number"||e.type==="range"||e.type==="rating")&&(t[n]=void 0))}),t},[c,i.fields]),a=re({defaultValues:u,mode:W,resolver:Q,shouldUnregister:!1,shouldFocusError:!0}),v=S(null);U(()=>{if(o==="edit"&&u){const t=u.id??null;t&&t!==v.current?(a.reset(u),v.current=t):!t&&v.current===null&&(a.reset(u),v.current="initialized")}},[o,u,a]);const X=p(()=>`${i.name.toLowerCase()}-form-draft`,[i.name]),{value:P,setValue:M,removeValue:w}=ne(X,{defaultValue:null,syncAcrossTabs:!0}),E=S(!1);U(()=>{!d||o!=="create"||c||E.current||(P&&a.reset(P),E.current=!0)},[d,o,c,P,a]);const m=se({control:a.control}),V=S(!1),h=S(null),D=S(void 0),T=S(!0);U(()=>{if(T.current){T.current=!1,D.current=m?JSON.stringify(m):void 0;return}if(!d||o!=="create"||V.current||!E.current)return;const t=m?JSON.stringify(m):void 0;if(D.current!==t)return D.current=t,h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{if(!m)return;Object.values(m).some(e=>e!=null&&e!=="")&&M(m)},3e3),()=>{h.current&&clearTimeout(h.current)}},[m,d,o,M]);const j=y(async()=>{if(!r)return!0;const t=B.getState(),n=F.getState();if(!t.hasPendingUploads(r))return!0;try{n.setUploading(r,0),await t.uploadAll(r),await new Promise(f=>setTimeout(f,50));let e=a.getValues(),s=L(e),b=0;const l=5;for(;s.length>0&&b<l;)b++,await new Promise(f=>setTimeout(f,100)),e=a.getValues(),s=L(e);if(s.length>0){const f=`Upload incomplete: files still pending at ${s.join(", ")}`;return n.setError(r,f),!1}return!0}catch(e){const s=e instanceof Error?e.message:"File upload failed";return F.getState().setError(r,s),!1}},[r,a]),x=y(t=>o!=="create"?t:Object.fromEntries(Object.entries(t).filter(([n])=>!oe.includes(n))),[o]),A=y(t=>{if(typeof window>"u")return;const n=Object.keys(t).find(s=>s!=="root"&&t[s]);if(!n)return;const e=document.querySelector(`input[name="${n}"][aria-invalid="true"], textarea[name="${n}"][aria-invalid="true"], select[name="${n}"][aria-invalid="true"]`);e&&(e.scrollIntoView({behavior:"smooth",block:"center"}),e.focus())},[]),$=a.handleSubmit,Y=p(()=>((t,n)=>async e=>{e?.preventDefault?.();const s=r?F.getState():null;r&&s&&s.startSubmit(r),V.current=!0;try{if(!await j()){V.current=!1;return}r&&s&&s.setValidating(r),await $(async(l,f)=>{r&&s&&s.setSubmitting(r);const ee=x(l);try{await t(ee,f),d&&o==="create"&&w(),r&&s&&s.setSuccess(r)}catch(O){const te=O instanceof Error?O.message:"Submission failed";throw r&&s&&s.setError(r,te),O}},l=>{r&&s&&s.setError(r,"Validation failed"),A(l),n?.(l)})(e)}finally{V.current=!1}}),[$,r,j,x,A,d,o,w]),Z=y(()=>{d&&o==="create"&&w(),a.reset(u),D.current=u?JSON.stringify(u):void 0,T.current=!0,E.current=!1},[d,o,w,a,u]),N=y(()=>{r&&(F.getState().cleanup(r),B.getState().cleanup(r))},[r]),C=p(()=>ie(i,{operation:o,viewerRole:R,availableFields:void 0}),[i,o,R]);return{...a,handleSubmit:Y,fields:C,operation:o,entity:i,t:q??(t=>t),viewerRole:R,formId:r,formStatus:r?G:"idle",uploadProgress:r?H:0,cleanup:N,isDirty:a.formState.isDirty,resetForm:Z,originalValues:u}}export{ve as useEntityForm};
@@ -97,9 +97,10 @@ export interface UseEntityFormOptions<E extends Entity> {
97
97
  /**
98
98
  * Viewer role for editability checks.
99
99
  * Determines which fields render as inputs vs read-only.
100
- * @default 'admin'
100
+ * If not provided, defaults to 'guest' (most restrictive)
101
+ * @default 'guest'
101
102
  */
102
- viewerRole?: ViewerRole;
103
+ viewerRole?: string;
103
104
  /**
104
105
  * React Hook Form mode.
105
106
  * @default 'onSubmit'
@@ -150,8 +151,9 @@ export interface EntityFormReturn<E extends Entity> extends UseFormReturn<InferE
150
151
  t: (key: string, options?: Record<string, unknown>) => string;
151
152
  /**
152
153
  * Current viewer role.
154
+ * Always has a value (defaults to 'guest' if not provided).
153
155
  */
154
- viewerRole: ViewerRole;
156
+ viewerRole: string;
155
157
  /**
156
158
  * Form ID for state tracking.
157
159
  * Undefined if not provided in options.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,6 @@
9
9
  import type { Entity, EntityField, FieldType } from '@donotdev/core';
10
10
  /** Entity fields input - supports Entity, Entity['fields'], or plain Record */
11
11
  export type EntityFieldsInput = Entity | Entity['fields'] | Record<string, EntityField<FieldType>>;
12
- import type { ViewerRole } from './isFieldEditable';
13
12
  /** Field with computed editability for rendering */
14
13
  export interface RenderableField<T extends FieldType = FieldType> {
15
14
  /** Field name/key */
@@ -23,8 +22,8 @@ export interface RenderableField<T extends FieldType = FieldType> {
23
22
  export interface GetFieldsForOperationOptions {
24
23
  /** Form operation type */
25
24
  operation: 'create' | 'edit';
26
- /** Viewer role for editability checks */
27
- viewerRole?: ViewerRole;
25
+ /** Viewer role for editability checks (defaults to 'guest' if undefined) */
26
+ viewerRole?: string;
28
27
  /**
29
28
  * Available field names (for edit mode).
30
29
  * When provided, only fields in this list are returned.
@@ -1 +1 @@
1
- {"version":3,"file":"getFieldsForOperation.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/getFieldsForOperation.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,CAAC,QAAQ,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,oDAAoD;AACpD,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC9D,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,yCAAyC;IACzC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,4BAA4B,GACpC,eAAe,EAAE,CAoDnB"}
1
+ {"version":3,"file":"getFieldsForOperation.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/getFieldsForOperation.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGrE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,CAAC,QAAQ,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAI3C,oDAAoD;AACpD,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC9D,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,4BAA4B,GACpC,eAAe,EAAE,CAmDnB"}
@@ -1 +1 @@
1
- import{isFieldEditable as b}from"./isFieldEditable";function p(e,c){const{operation:l,viewerRole:f="admin",availableFields:o}=c,a=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,r=Object.entries(a),t=[];for(const[s,u]of r){const i=u,n=i.visibility||"user";if(l==="create"){if(n==="technical"||n==="hidden")continue}else if(n==="hidden"||o&&!o.includes(s))continue;let d=b(i.editable,f,l);l==="edit"&&n==="technical"&&i.editable===void 0&&(d=!1),t.push({name:s,config:i,editable:d})}return t}export{p as getFieldsForOperation};
1
+ import{isFieldVisible as p}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",a=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,u=Object.entries(a),s=[];for(const[c,b]of u){const o=b,t=o.visibility||"guest";if(!p(t,n)||i==="create"&&t==="technical"||i==="edit"&&l&&!l.includes(c))continue;let f=m(o.editable,n,i);i==="edit"&&t==="technical"&&o.editable===void 0&&(f=!1),s.push({name:c,config:o,editable:f})}return s}export{g as getFieldsForOperation};
@@ -31,5 +31,5 @@ export type ViewerRole = 'public' | 'guest' | 'user' | 'admin' | 'super';
31
31
  * @since 0.0.1
32
32
  * @author AMBROISE PARK Consulting
33
33
  */
34
- export declare function isFieldEditable(editable: Editable | undefined, viewerRole: ViewerRole, operation: 'create' | 'edit'): boolean;
34
+ export declare function isFieldEditable(editable: Editable | undefined, viewerRole: string, operation: 'create' | 'edit'): boolean;
35
35
  //# sourceMappingURL=isFieldEditable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isFieldEditable.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/isFieldEditable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAC3B,OAAO,CAcT"}
1
+ {"version":3,"file":"isFieldEditable.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/isFieldEditable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAC3B,OAAO,CAcT"}
@@ -1,3 +1,8 @@
1
1
  export { useFileUpload } from './useFileUpload';
2
2
  export type { FileMetadata, UseFileUploadOptions } from './useFileUpload';
3
+ export { useUnsavedChangesWarning, useConfirmNavigation, } from './useUnsavedChangesWarning';
4
+ export { useEntityFavorites } from './useEntityFavorites';
5
+ export type { UseEntityFavoritesOptions, UseEntityFavoritesReturn, } from './useEntityFavorites';
6
+ export { useRelatedItems } from './useRelatedItems';
7
+ export type { UseRelatedItemsOptions, UseRelatedItemsReturn, } from './useRelatedItems';
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- import{useFileUpload as l}from"./useFileUpload";export{l as useFileUpload};
1
+ import{useFileUpload as r}from"./useFileUpload";import{useUnsavedChangesWarning as s,useConfirmNavigation as a}from"./useUnsavedChangesWarning";import{useEntityFavorites as n}from"./useEntityFavorites";import{useRelatedItems as f}from"./useRelatedItems";export{a as useConfirmNavigation,n as useEntityFavorites,r as useFileUpload,f as useRelatedItems,s as useUnsavedChangesWarning};
@@ -0,0 +1,53 @@
1
+ export interface UseEntityFavoritesOptions {
2
+ /** Storage key (default: 'entity-favorites') */
3
+ storageKey?: string;
4
+ /** Entity collection name (e.g., 'cars', 'products') - used to namespace favorites */
5
+ collection?: string;
6
+ }
7
+ export interface UseEntityFavoritesReturn {
8
+ /** Array of favorited entity IDs */
9
+ favorites: string[];
10
+ /** Check if an entity is favorited */
11
+ isFavorite: (id: string) => boolean;
12
+ /** Toggle favorite status for an entity */
13
+ toggleFavorite: (id: string) => void;
14
+ /** Add entity to favorites */
15
+ addFavorite: (id: string) => void;
16
+ /** Remove entity from favorites */
17
+ removeFavorite: (id: string) => void;
18
+ /** Clear all favorites */
19
+ clearFavorites: () => void;
20
+ /** Filter function for use with EntityCardList/EntityList (from @donotdev/ui) filter prop */
21
+ favoritesFilter: (item: {
22
+ id: string;
23
+ }) => boolean;
24
+ /** Whether favorites are loaded from localStorage */
25
+ isLoaded: boolean;
26
+ }
27
+ /**
28
+ * Hook for managing entity favorites
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * // In detail page
33
+ * const { isFavorite, toggleFavorite } = useEntityFavorites({ collection: 'cars' });
34
+ *
35
+ * <Button onClick={() => toggleFavorite(carId)}>
36
+ * {isFavorite(carId) ? 'Saved' : 'Save'}
37
+ * </Button>
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * // In list page with filter (EntityCardList from @donotdev/ui)
43
+ * const { favoritesFilter } = useEntityFavorites({ collection: 'cars' });
44
+ * const [showFavoritesOnly, setShowFavoritesOnly] = useState(false);
45
+ *
46
+ * <EntityCardList
47
+ * entity={carEntity}
48
+ * filter={showFavoritesOnly ? favoritesFilter : undefined}
49
+ * />
50
+ * ```
51
+ */
52
+ export declare function useEntityFavorites(options?: UseEntityFavoritesOptions): UseEntityFavoritesReturn;
53
+ //# sourceMappingURL=useEntityFavorites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEntityFavorites.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntityFavorites.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,yBAAyB;IACxC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,2CAA2C;IAC3C,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,8BAA8B;IAC9B,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,mCAAmC;IACnC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0BAA0B;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,6FAA6F;IAC7F,eAAe,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;IACnD,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CA8E1B"}
@@ -0,0 +1 @@
1
+ import{useCallback as r}from"react";import{useLocalStorage as y}from"@donotdev/core";function V(n={}){const{storageKey:a,collection:c="entities"}=n,u=a||`favorites-${c}`,{value:s,setValue:o,isLoaded:l}=y(u,{defaultValue:[]}),f=r(t=>s.includes(t),[s]),v=r(t=>{o(e=>e.includes(t)?e.filter(i=>i!==t):[...e,t])},[o]),F=r(t=>{o(e=>e.includes(t)?e:[...e,t])},[o]),d=r(t=>{o(e=>e.filter(i=>i!==t))},[o]),m=r(()=>{o([])},[o]),g=r(t=>s.includes(t.id),[s]);return{favorites:s,isFavorite:f,toggleFavorite:v,addFavorite:F,removeFavorite:d,clearFavorites:m,favoritesFilter:g,isLoaded:l}}export{V as useEntityFavorites};
@@ -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 m}from"react";function N(f,e,n,t,b={}){const{limit:l=3,tolerance:a=.2}=b,c=m(()=>{if(!e||!n||n.length===0||t.length===0)return[];const d=e.id;return n.filter(g=>g.id===d?!1:t.some(u=>{const r=f.fields[u];if(!r)return!1;const s=e[u],i=g[u];if(s==null||i==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const o=Number(s),p=Number(i);if(isNaN(o)||isNaN(p))return!1;const h=Math.abs(o*a);return Math.abs(p-o)<=h}return String(s)===String(i)})).slice(0,l)},[e,n,t,f.fields,l,a]);return{items:c,hasItems:c.length>0}}var M=N;export{M as default,N as useRelatedItems};
package/dist/index.d.ts CHANGED
@@ -14,15 +14,16 @@ export * from './stores';
14
14
  export { getCrudService } from './CrudService';
15
15
  export type { QueryOptions } from './CrudService';
16
16
  export { useCrudStore } from './CrudStore';
17
- export type { CrudServiceInterface, CrudState, CrudActions, BackendType, OptimisticStatus, OptimisticMeta, CrudStoreApi, CacheOptions, } from './types';
17
+ export type { CrudServiceInterface, CrudState, CrudActions, BackendType, OptimisticStatus, OptimisticMeta, CrudStoreApi, CacheOptions, MutationOptions, FilterState, CollectionUIState, } from './types';
18
18
  export { loadDeterministicRange, upsertDeterministic, appendToCollection, } from './utils/collections';
19
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';
20
21
  export { registerBuiltinFieldTypes } from './builtinFieldTypes';
21
22
  export { useEntityForm, useEntityField, useController, isFieldEditable, getFieldsForOperation, validateEntity, translateFieldLabel, translateLabel, } from './forms';
22
23
  export type { ViewerRole, RenderableField, GetFieldsForOperationOptions, EntityFieldsInput, SchemaOperation, ValidationIssue, ValidationResult, InferEntityData, InferEntityInput, InferEntityOutput, UseEntityFormOptions, EntityFormReturn, EntityFieldReturn, UseControllerProps, UseControllerReturn, ControllerRenderProps, ControllerFieldState, } from './forms';
23
24
  export { UploadProvider, useUploadContext } from './contexts';
24
25
  export type { UploadProviderProps } from './contexts';
25
- export { useFileUpload } from './hooks';
26
- 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';
27
28
  export { isStorageUrl, validatePicture, checkForBlobUrls, hasBlobUrls, } from './utils/uploadValidation';
28
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,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,GACb,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;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,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,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 x,upsertDeterministic as f,appendToCollection as n}from"./utils/collections";import{getFieldRegistry as u,registerFieldType as g,isFieldTypeRegistered as c}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 R,translateFieldLabel as S,translateLabel as h}from"./forms";import{UploadProvider as L,useUploadContext as P}from"./contexts";import{useFileUpload as O}from"./hooks";import{isStorageUrl as q,validatePicture as w,checkForBlobUrls as z,hasBlobUrls as A}from"./utils/uploadValidation";export{L as UploadProvider,n as appendToCollection,z as checkForBlobUrls,s as getCrudService,u as getFieldRegistry,B as getFieldsForOperation,A as hasBlobUrls,T as isFieldEditable,c as isFieldTypeRegistered,q as isStorageUrl,x as loadDeterministicRange,U as registerBuiltinFieldTypes,g as registerFieldType,S as translateFieldLabel,h as translateLabel,f as upsertDeterministic,E as useController,d as useCrudStore,v as useEntityField,C as useEntityForm,O as useFileUpload,P as useUploadContext,R as validateEntity,w as validatePicture};
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 m,upsertDeterministic as F,appendToCollection as g}from"./utils/collections";import{getFieldRegistry as f,registerFieldType as x,isFieldTypeRegistered as y}from"./FieldRegistry";import{registerBuiltinFieldType as c,getFieldTypeMetadata as v,getFilterType as C,getDisplayFormatter as U,isFilterable as b,getValueType as E,clearFieldTypeRegistry as R}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as h}from"./builtinFieldTypes";import{useEntityForm as S,useEntityField as L,useController as P,isFieldEditable as k,getFieldsForOperation as I,validateEntity as M,translateFieldLabel as N,translateLabel as O}from"./forms";import{UploadProvider as W,useUploadContext as j}from"./contexts";import{useFileUpload as w,useUnsavedChangesWarning as z,useConfirmNavigation as A,useEntityFavorites as G,useRelatedItems as H}from"./hooks";import{isStorageUrl as K,validatePicture as Q,checkForBlobUrls as X,hasBlobUrls as Y}from"./utils/uploadValidation";export{W as UploadProvider,g as appendToCollection,X as checkForBlobUrls,R as clearFieldTypeRegistry,s as getCrudService,U as getDisplayFormatter,f as getFieldRegistry,v as getFieldTypeMetadata,I as getFieldsForOperation,C as getFilterType,E as getValueType,Y as hasBlobUrls,k as isFieldEditable,y as isFieldTypeRegistered,b as isFilterable,K as isStorageUrl,m as loadDeterministicRange,c as registerBuiltinFieldType,h as registerBuiltinFieldTypes,x as registerFieldType,N as translateFieldLabel,O as translateLabel,F as upsertDeterministic,A as useConfirmNavigation,P as useController,d as useCrudStore,G as useEntityFavorites,L as useEntityField,S as useEntityForm,w as useFileUpload,H as useRelatedItems,z as useUnsavedChangesWarning,j as useUploadContext,M as validateEntity,Q 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":"AA6vBA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA8qBnD"}