@donotdev/crud 0.0.10 → 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 (167) hide show
  1. package/dist/CrudService.js +1 -1
  2. package/dist/CrudStore.js +1 -1
  3. package/dist/FieldRegistry.js +1 -1
  4. package/dist/adapters/FirestoreAdapter.js +1 -1
  5. package/dist/adapters/FunctionsAdapter.js +1 -1
  6. package/dist/adapters/index.js +1 -1
  7. package/dist/components/CrudButton.js +1 -1
  8. package/dist/components/DisplayFieldRenderer.js +1 -1
  9. package/dist/components/EntityDisplayRenderer.d.ts +2 -2
  10. package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
  11. package/dist/components/EntityDisplayRenderer.js +1 -1
  12. package/dist/components/EntityFilters.js +1 -1
  13. package/dist/components/EntityFormRenderer.js +1 -1
  14. package/dist/components/FormFieldRenderer.js +1 -1
  15. package/dist/components/FormLayout.js +1 -1
  16. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  17. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  18. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  19. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  20. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  21. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  22. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  23. package/dist/components/controlled/complex/index.js +1 -1
  24. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  25. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  26. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  27. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  28. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  29. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  30. package/dist/components/controlled/file/index.js +1 -1
  31. package/dist/components/controlled/index.js +1 -1
  32. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  33. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  34. package/dist/components/controlled/input/ControlledDurationField.d.ts +7 -0
  35. package/dist/components/controlled/input/ControlledDurationField.d.ts.map +1 -0
  36. package/dist/components/controlled/input/ControlledDurationField.js +1 -0
  37. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  38. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  39. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  40. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  41. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  42. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  43. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  44. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  45. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  46. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  47. package/dist/components/controlled/input/index.d.ts +1 -0
  48. package/dist/components/controlled/input/index.d.ts.map +1 -1
  49. package/dist/components/controlled/input/index.js +1 -1
  50. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  51. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  52. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  53. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  54. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  55. package/dist/components/controlled/select/index.js +1 -1
  56. package/dist/components/controlled/types.js +1 -1
  57. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  58. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  59. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  60. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  61. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  62. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  63. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  64. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  65. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  66. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  67. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  68. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  69. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  70. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  72. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  73. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  74. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  75. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  76. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  77. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  78. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  79. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  80. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  81. package/dist/components/fields/display/index.js +1 -1
  82. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  83. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  84. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  85. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  86. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  87. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  88. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  89. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  90. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  91. package/dist/components/form/fields/DropdownComponent.js +1 -1
  92. package/dist/components/form/fields/DurationFieldComponent.d.ts +42 -0
  93. package/dist/components/form/fields/DurationFieldComponent.d.ts.map +1 -0
  94. package/dist/components/form/fields/DurationFieldComponent.js +1 -0
  95. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  96. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  97. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  98. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  99. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  100. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  101. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  102. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  103. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  104. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  105. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  106. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  107. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  108. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  109. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  110. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  111. package/dist/components/form/fields/RichTextComponent.js +1 -1
  112. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  113. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  114. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  115. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  116. package/dist/components/form/fields/index.d.ts +3 -0
  117. package/dist/components/form/fields/index.d.ts.map +1 -1
  118. package/dist/components/form/fields/index.js +1 -1
  119. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  120. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  121. package/dist/components/index.js +1 -1
  122. package/dist/contexts/UploadContext.js +1 -1
  123. package/dist/contexts/index.js +1 -1
  124. package/dist/fieldTypeRegistry.js +1 -1
  125. package/dist/forms/hooks/index.js +1 -1
  126. package/dist/forms/hooks/useController.js +1 -1
  127. package/dist/forms/hooks/useEntityField.js +1 -1
  128. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  129. package/dist/forms/hooks/useEntityForm.js +1 -1
  130. package/dist/forms/index.js +1 -1
  131. package/dist/forms/types.d.ts +5 -3
  132. package/dist/forms/types.d.ts.map +1 -1
  133. package/dist/forms/utils/getFieldsForOperation.d.ts +2 -3
  134. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  135. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  136. package/dist/forms/utils/index.js +1 -1
  137. package/dist/forms/utils/isFieldEditable.d.ts +1 -1
  138. package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
  139. package/dist/forms/utils/isFieldEditable.js +1 -1
  140. package/dist/forms/utils/translateFieldLabel.js +1 -1
  141. package/dist/forms/utils/validateEntity.js +1 -1
  142. package/dist/hooks/index.js +1 -1
  143. package/dist/hooks/useEntityFavorites.js +1 -1
  144. package/dist/hooks/useFileUpload.js +1 -1
  145. package/dist/hooks/useFormNavigationGuard.js +1 -1
  146. package/dist/hooks/useRelatedItems.js +1 -1
  147. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  148. package/dist/index.js +1 -1
  149. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
  150. package/dist/registerBuiltinFieldTypes.js +1 -1
  151. package/dist/stores/FormStore.js +1 -1
  152. package/dist/stores/UploadStore.js +1 -1
  153. package/dist/stores/index.js +1 -1
  154. package/dist/tsconfig.tsbuildinfo +1 -1
  155. package/dist/useBaseCrudList.js +1 -1
  156. package/dist/useCrud.js +1 -1
  157. package/dist/useCrudCardList.js +1 -1
  158. package/dist/useCrudList.js +1 -1
  159. package/dist/utils/collections.js +1 -1
  160. package/dist/utils/fileStorage.js +1 -1
  161. package/dist/utils/imageProcessing.js +1 -1
  162. package/dist/utils/imageStorage.js +1 -1
  163. package/dist/utils/imageUtils.js +1 -1
  164. package/dist/utils/mergeWithOptimistic.js +1 -1
  165. package/dist/utils/scopeUtils.js +1 -1
  166. package/dist/utils/uploadValidation.js +1 -1
  167. package/package.json +2 -2
@@ -1 +1 @@
1
- import{toast as u}from"@donotdev/components";import{createSingleton as p,handleError as n,getQueryClient as y,getI18nInstance as c}from"@donotdev/core";import{FirestoreAdapter as m}from"./adapters/FirestoreAdapter";import{FunctionsAdapter as f}from"./adapters/FunctionsAdapter";const l=1/0,F=1e3*60*30;class S{adapter=null;backend=null;store=null;_shouldShowSuccessToast(t){return t?.showSuccessToast===!0?!0:t?.showSuccessToast===!1?!1:!this.store?.getState().hideSuccessToasts}setStore(t){this.store=t}async initialize(t){if(!(this.backend===t&&this.adapter)){if(this.backend=t,t==="functions")this.adapter=new f;else if(t==="firestore")this.adapter=new m;else throw new Error(`Unknown backend: ${t}`);this.store&&(this.store.getState().setBackend(t),this.store.getState().setCrudService(this))}}getQueryClient(){return y()}getListQueryOptions(t,e,r,a,s="list"){const i=this.adapter,o=()=>this.initialize("firestore");return{queryKey:["crud",t,"query",s,JSON.stringify(e)],queryFn:async()=>{if(i||await o(),!this.adapter)throw new Error("Adapter not initialized");return this.adapter.query(t,e,r,s)},staleTime:a?.staleTime??l}}getDocQueryOptions(t,e,r,a){const s=this.adapter,i=()=>this.initialize("firestore");return{queryKey:["crud",t,"get",e],queryFn:async()=>{if(s||await i(),!this.adapter)throw new Error("Adapter not initialized");return this.adapter.get(t,e,r)},staleTime:a?.staleTime??l}}_updateGetCache(t,e,r,a){const s=this.getQueryClient(),i=["crud",t,"get",e];a==="delete"?s.removeQueries({queryKey:i}):(a==="update"||a==="add")&&r&&s.setQueryData(i,o=>o?{...o,...r}:r)}_updateListCaches(t,e,r,a){const s=this.getQueryClient();this._updateGetCache(t,e,r,a),s.setQueriesData({queryKey:["crud",t]},i=>{if(i&&typeof i=="object"&&"items"in i){const o=i;let h=o.items;return a==="delete"?(h=o.items.filter(d=>d.id!==e),{...o,items:h,total:(o.total??h.length)-1}):a==="add"&&r?(h=[...o.items,{...r,id:e}],{...o,items:h,total:(o.total??o.items.length)+1}):a==="update"&&r&&o.items.some(d=>d.id===e)?(h=o.items.map(d=>d.id===e?{...d,...r}:d),{...o,items:h}):i}if(Array.isArray(i)){if(a==="delete")return i.filter(o=>o.id!==e);if(a==="add"&&r)return[...i,{...r,id:e}];if(a==="update"&&r)return i.some(o=>o.id===e)?i.map(o=>o.id===e?{...o,...r}:o):i}return i})}_getItemFromListCache(t,e){const r=this.getQueryClient().getQueriesData({queryKey:["crud",t]});for(const[,a]of r)if(a?.items){const s=a.items.find(i=>i.id===e);if(s)return s}return null}async invalidateCollection(t){await this.getQueryClient().invalidateQueries({queryKey:["crud",t]})}async get(t,e,r,a){if(this.adapter||await this.initialize("firestore"),a?.noCache)return this._getFromAdapter(t,e,r);this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{return await this.getQueryClient().fetchQuery({queryKey:["crud",t,"get",e],queryFn:()=>this._getFromAdapter(t,e,r,!1),staleTime:a?.staleTime??l})}catch(s){const i=n(s,{userMessage:`Failed to fetch ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,i),i}finally{this.store&&this.store.getState().setLoading(t,!1)}}async _getFromAdapter(t,e,r,a=!0){this.store&&a&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{if(!this.adapter)throw new Error("Adapter not initialized");return await this.adapter.get(t,e,r)}catch(s){const i=n(s,{userMessage:`Failed to fetch ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,i),i}finally{this.store&&a&&this.store.getState().setLoading(t,!1)}}async query(t,e,r,a,s="list"){if(this.adapter||await this.initialize("firestore"),a?.noCache)return this._queryFromAdapter(t,e,r,!0,s);this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{return await this.getQueryClient().fetchQuery({queryKey:["crud",t,"query",s,JSON.stringify(e)],queryFn:()=>this._queryFromAdapter(t,e,r,!1,s),staleTime:a?.staleTime??l})}catch(i){const o=n(i,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,o),o}finally{this.store&&this.store.getState().setLoading(t,!1)}}async _queryFromAdapter(t,e,r,a=!0,s="list"){this.store&&a&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{if(!this.adapter)throw new Error("Adapter not initialized");return await this.adapter.query(t,e,r,s)}catch(i){const o=n(i,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,o),o}finally{this.store&&a&&this.store.getState().setLoading(t,!1)}}_getEntityName(t){const e=c();let r=`entity-${t}`,a=e.t("name",{ns:r,defaultValue:null});return a&&a!=="name"&&a!==`${r}:name`||t.endsWith("s")&&t.length>1&&(r=`entity-${t.slice(0,-1)}`,a=e.t("name",{ns:r,defaultValue:null}),a&&a!=="name"&&a!==`${r}:name`)?a:t}async set(t,e,r,a,s){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const i=this.getQueryClient().getQueryData(["crud",t,"get",e])??null;this.store&&this.store.getState().updateOptimistic(t,e,r,i);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.set(t,e,r,a),this._updateListCaches(t,e,r,"update"),this.store&&this.store.getState().confirmUpdate(t,e),this._shouldShowSuccessToast(s)){const o=c(),h=this._getEntityName(t);u("success",o.t("messages.updateSuccess",{ns:"crud",entity:h}))}}catch(o){i&&this._updateListCaches(t,e,i,"update"),this.store&&this.store.getState().rejectUpdate(t,e);const h=n(o,{userMessage:`Failed to save ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,h),h}finally{this.store&&this.store.getState().setLoading(t,!1)}}async update(t,e,r,a){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const s=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),i=s?{...s,...r}:{...r,id:e};this.store&&s&&this.store.getState().updateOptimistic(t,e,i,s);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.update(t,e,r),this._updateListCaches(t,e,i,"update"),this.store&&this.store.getState().confirmUpdate(t,e),this._shouldShowSuccessToast(a)){const o=c(),h=this._getEntityName(t);u("success",o.t("messages.updateSuccess",{ns:"crud",entity:h}))}}catch(o){s&&this._updateListCaches(t,e,s,"update"),this.store&&this.store.getState().rejectUpdate(t,e);const h=n(o,{userMessage:`Failed to update ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,h),h}finally{this.store&&this.store.getState().setLoading(t,!1)}}async delete(t,e,r){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const a=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e);this.store&&a&&this.store.getState().deleteOptimistic(t,e,a);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.delete(t,e),this._updateListCaches(t,e,null,"delete"),this.store&&this.store.getState().confirmDelete(t,e),this._shouldShowSuccessToast(r)){const s=c(),i=this._getEntityName(t);u("success",s.t("messages.deleteSuccess",{ns:"crud",entity:i}))}}catch(s){a&&this._updateListCaches(t,e,a,"add"),this.store&&this.store.getState().rejectDelete(t,e);const i=n(s,{userMessage:`Failed to delete ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,i),i}finally{this.store&&this.store.getState().setLoading(t,!1)}}async add(t,e,r,a){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const s=`temp_${crypto.randomUUID()}`;this.store&&this.store.getState().addOptimistic(t,s,{...e,id:s});try{if(!this.adapter)throw new Error("Adapter not initialized");const i=await this.adapter.add(t,e,r);if(this._updateListCaches(t,s,null,"delete"),this._updateListCaches(t,i,{...e,id:i},"add"),this.store&&this.store.getState().confirmOptimistic(t,s,i,{...e,id:i}),this._shouldShowSuccessToast(a)){const o=c(),h=this._getEntityName(t);u("success",o.t("messages.createSuccess",{ns:"crud",entity:h}))}return i}catch(i){this._updateListCaches(t,s,null,"delete"),this.store&&this.store.getState().rejectOptimistic(t,s);const o=n(i,{userMessage:`Failed to create ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,o),o}finally{this.store&&this.store.getState().setLoading(t,!1)}}subscribe(t,e,r,a){this.adapter||this.initialize("firestore").catch(()=>{});try{return this.adapter?this.adapter.subscribe(t,e,(s,i)=>{s&&this.getQueryClient().setQueryData(["crud",t,"get",e],s),r(s,i)},a):(r(null,new Error("Adapter not initialized")),()=>{})}catch(s){return r(null,n(s)),()=>{}}}subscribeToCollection(t,e,r,a){this.adapter||this.initialize("firestore").catch(()=>{});try{return this.adapter?this.adapter.subscribeToCollection(t,e,(s,i)=>{s&&this.getQueryClient().setQueryData(["crud",t,"query",JSON.stringify(e)],{items:s}),r(s,i)},a):(r([],new Error("Adapter not initialized")),()=>{})}catch(s){return r([],n(s)),()=>{}}}async addOptimistic(t,e,r,a){this.adapter||await this.initialize("firestore");const s=`temp_${crypto.randomUUID()}`,i={...e,id:s,_optimistic:!0};this.store&&this.store.getState().addOptimistic(t,s,i);try{if(!this.adapter)throw new Error("Adapter not initialized");const o=await this.adapter.add(t,e,r),h={...e,id:o};if(this._updateListCaches(t,s,null,"delete"),this._updateListCaches(t,o,h,"add"),this.store&&this.store.getState().confirmOptimistic(t,s,o,h),this._shouldShowSuccessToast(a)){const d=c(),g=this._getEntityName(t);u("success",d.t("messages.createSuccess",{ns:"crud",entity:g}))}return h}catch(o){throw this._updateListCaches(t,s,null,"delete"),this.store&&this.store.getState().rejectOptimistic(t,s),n(o,{userMessage:`Failed to create ${t}`,showNotification:!0})}}async updateOptimistic(t,e,r,a,s){this.adapter||await this.initialize("firestore");const i=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),o=i?{...i,...r,_optimistic:!0}:{...r,id:e,_optimistic:!0};this.store&&i&&this.store.getState().updateOptimistic(t,e,o,i);try{if(!this.adapter)throw new Error("Adapter not initialized");await this.adapter.update(t,e,r);const h={...o,_optimistic:void 0};if(this._updateListCaches(t,e,h,"update"),this.store&&this.store.getState().confirmUpdate(t,e),this._shouldShowSuccessToast(s)){const d=c(),g=this._getEntityName(t);u("success",d.t("messages.updateSuccess",{ns:"crud",entity:g}))}return h}catch(h){throw i&&this._updateListCaches(t,e,i,"update"),this.store&&this.store.getState().rejectUpdate(t,e),n(h,{userMessage:`Failed to update ${t}`,showNotification:!0})}}async deleteOptimistic(t,e,r){this.adapter||await this.initialize("firestore");const a=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e);this.store&&a&&this.store.getState().deleteOptimistic(t,e,a);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.delete(t,e),this._updateListCaches(t,e,null,"delete"),this.store&&this.store.getState().confirmDelete(t,e),this._shouldShowSuccessToast(r)){const s=c(),i=this._getEntityName(t);u("success",s.t("messages.deleteSuccess",{ns:"crud",entity:i}))}}catch(s){throw a&&this._updateListCaches(t,e,a,"add"),this.store&&this.store.getState().rejectDelete(t,e),n(s,{userMessage:`Failed to delete ${t}`,showNotification:!0})}}}const w=p(()=>new S);export{w as getCrudService};
1
+ import{toast as p}from"@donotdev/components";import{createSingleton as m,handleError as d,getQueryClient as w,getI18nInstance as f}from"@donotdev/core";import{FirestoreAdapter as S}from"./adapters/FirestoreAdapter";import{FunctionsAdapter as C}from"./adapters/FunctionsAdapter";const g=1/0,Q=1e3*60*30;class c{adapter=null;backend=null;store=null;_shouldShowSuccessToast(t){return t?.showSuccessToast===!0?!0:t?.showSuccessToast===!1?!1:!this.store?.getState().hideSuccessToasts}setStore(t){this.store=t}async initialize(t){if(!(this.backend===t&&this.adapter)){if(this.backend=t,t==="functions")this.adapter=new C;else if(t==="firestore")this.adapter=new S;else throw new Error(`Unknown backend: ${t}`);this.store&&(this.store.getState().setBackend(t),this.store.getState().setCrudService(this))}}getQueryClient(){return w()}getListQueryOptions(t,e,i,h,s="list"){const r=this.adapter,a=()=>this.initialize("firestore");return{queryKey:["crud",t,"query",s,JSON.stringify(e)],queryFn:async()=>{if(r||await a(),!this.adapter)throw new Error("Adapter not initialized");return this.adapter.query(t,e,i,s)},staleTime:h?.staleTime??g}}getDocQueryOptions(t,e,i,h){const s=this.adapter,r=()=>this.initialize("firestore");return{queryKey:["crud",t,"get",e],queryFn:async()=>{if(s||await r(),!this.adapter)throw new Error("Adapter not initialized");return this.adapter.get(t,e,i)},staleTime:h?.staleTime??g}}_updateGetCache(t,e,i,h){const s=this.getQueryClient(),r=["crud",t,"get",e];h==="delete"?s.removeQueries({queryKey:r}):(h==="update"||h==="add")&&i&&s.setQueryData(r,a=>a?{...a,...i}:i)}_updateListCaches(t,e,i,h){const s=this.getQueryClient();this._updateGetCache(t,e,i,h),s.setQueriesData({queryKey:["crud",t]},r=>{if(r&&typeof r=="object"&&"items"in r){const a=r;let u=a.items;return h==="delete"?(u=a.items.filter(n=>n.id!==e),{...a,items:u,total:(a.total??u.length)-1}):h==="add"&&i?(u=[...a.items,{...i,id:e}],{...a,items:u,total:(a.total??a.items.length)+1}):h==="update"&&i&&a.items.some(o=>o.id===e)?(u=a.items.map(o=>o.id===e?{...o,...i}:o),{...a,items:u}):r}if(Array.isArray(r)){if(h==="delete")return r.filter(a=>a.id!==e);if(h==="add"&&i)return[...r,{...i,id:e}];if(h==="update"&&i)return r.some(u=>u.id===e)?r.map(u=>u.id===e?{...u,...i}:u):r}return r})}_getItemFromListCache(t,e){const h=this.getQueryClient().getQueriesData({queryKey:["crud",t]});for(const[,s]of h)if(s?.items){const r=s.items.find(a=>a.id===e);if(r)return r}return null}async invalidateCollection(t){await this.getQueryClient().invalidateQueries({queryKey:["crud",t]})}async get(t,e,i,h){if(this.adapter||await this.initialize("firestore"),h?.noCache)return this._getFromAdapter(t,e,i);this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{return await this.getQueryClient().fetchQuery({queryKey:["crud",t,"get",e],queryFn:()=>this._getFromAdapter(t,e,i,!1),staleTime:h?.staleTime??g})}catch(s){const r=d(s,{userMessage:`Failed to fetch ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,r),r}finally{this.store&&this.store.getState().setLoading(t,!1)}}async _getFromAdapter(t,e,i,h=!0){this.store&&h&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{if(!this.adapter)throw new Error("Adapter not initialized");return await this.adapter.get(t,e,i)}catch(s){const r=d(s,{userMessage:`Failed to fetch ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,r),r}finally{this.store&&h&&this.store.getState().setLoading(t,!1)}}async query(t,e,i,h,s="list"){if(this.adapter||await this.initialize("firestore"),h?.noCache)return this._queryFromAdapter(t,e,i,!0,s);this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{return await this.getQueryClient().fetchQuery({queryKey:["crud",t,"query",s,JSON.stringify(e)],queryFn:()=>this._queryFromAdapter(t,e,i,!1,s),staleTime:h?.staleTime??g})}catch(r){const a=d(r,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,a),a}finally{this.store&&this.store.getState().setLoading(t,!1)}}async _queryFromAdapter(t,e,i,h=!0,s="list"){this.store&&h&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{if(!this.adapter)throw new Error("Adapter not initialized");return await this.adapter.query(t,e,i,s)}catch(r){const a=d(r,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,a),a}finally{this.store&&h&&this.store.getState().setLoading(t,!1)}}_getEntityName(t){const e=f();let i=`entity-${t}`,h=e.t("name",{ns:i,defaultValue:null});return h&&h!=="name"&&h!==`${i}:name`||t.endsWith("s")&&t.length>1&&(i=`entity-${t.slice(0,-1)}`,h=e.t("name",{ns:i,defaultValue:null}),h&&h!=="name"&&h!==`${i}:name`)?h:t}async set(t,e,i,h,s){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const a=this.getQueryClient().getQueryData(["crud",t,"get",e])??null;this.store&&this.store.getState().updateOptimistic(t,e,i,a);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.set(t,e,i,h),this._updateListCaches(t,e,i,"update"),this.store&&this.store.getState().confirmUpdate(t,e),this._shouldShowSuccessToast(s)){const u=f(),n=this._getEntityName(t);p("success",u.t("messages.updateSuccess",{ns:"crud",entity:n}))}}catch(u){a&&this._updateListCaches(t,e,a,"update"),this.store&&this.store.getState().rejectUpdate(t,e);const n=d(u,{userMessage:`Failed to save ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,n),n}finally{this.store&&this.store.getState().setLoading(t,!1)}}async update(t,e,i,h){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const r=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),a=r?{...r,...i}:{...i,id:e};this.store&&r&&this.store.getState().updateOptimistic(t,e,a,r);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.update(t,e,i),this._updateListCaches(t,e,a,"update"),this.store&&this.store.getState().confirmUpdate(t,e),this._shouldShowSuccessToast(h)){const u=f(),n=this._getEntityName(t);p("success",u.t("messages.updateSuccess",{ns:"crud",entity:n}))}}catch(u){r&&this._updateListCaches(t,e,r,"update"),this.store&&this.store.getState().rejectUpdate(t,e);const n=d(u,{userMessage:`Failed to update ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,n),n}finally{this.store&&this.store.getState().setLoading(t,!1)}}async delete(t,e,i){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const s=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e);this.store&&s&&this.store.getState().deleteOptimistic(t,e,s);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.delete(t,e),this._updateListCaches(t,e,null,"delete"),this.store&&this.store.getState().confirmDelete(t,e),this._shouldShowSuccessToast(i)){const r=f(),a=this._getEntityName(t);p("success",r.t("messages.deleteSuccess",{ns:"crud",entity:a}))}}catch(r){s&&this._updateListCaches(t,e,s,"add"),this.store&&this.store.getState().rejectDelete(t,e);const a=d(r,{userMessage:`Failed to delete ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,a),a}finally{this.store&&this.store.getState().setLoading(t,!1)}}async add(t,e,i,h){this.adapter||await this.initialize("firestore"),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const s=`temp_${crypto.randomUUID()}`;this.store&&this.store.getState().addOptimistic(t,s,{...e,id:s});try{if(!this.adapter)throw new Error("Adapter not initialized");const r=await this.adapter.add(t,e,i);if(this._updateListCaches(t,s,null,"delete"),this._updateListCaches(t,r,{...e,id:r},"add"),this.store&&this.store.getState().confirmOptimistic(t,s,r,{...e,id:r}),this._shouldShowSuccessToast(h)){const a=f(),u=this._getEntityName(t);p("success",a.t("messages.createSuccess",{ns:"crud",entity:u}))}return r}catch(r){this._updateListCaches(t,s,null,"delete"),this.store&&this.store.getState().rejectOptimistic(t,s);const a=d(r,{userMessage:`Failed to create ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,a),a}finally{this.store&&this.store.getState().setLoading(t,!1)}}subscribe(t,e,i,h){this.adapter||this.initialize("firestore").catch(()=>{});try{return this.adapter?this.adapter.subscribe(t,e,(s,r)=>{s&&this.getQueryClient().setQueryData(["crud",t,"get",e],s),i(s,r)},h):(i(null,new Error("Adapter not initialized")),()=>{})}catch(s){return i(null,d(s)),()=>{}}}subscribeToCollection(t,e,i,h){this.adapter||this.initialize("firestore").catch(()=>{});try{return this.adapter?this.adapter.subscribeToCollection(t,e,(s,r)=>{s&&this.getQueryClient().setQueryData(["crud",t,"query",JSON.stringify(e)],{items:s}),i(s,r)},h):(i([],new Error("Adapter not initialized")),()=>{})}catch(s){return i([],d(s)),()=>{}}}async addOptimistic(t,e,i,h){this.adapter||await this.initialize("firestore");const s=`temp_${crypto.randomUUID()}`,r={...e,id:s,_optimistic:!0};this.store&&this.store.getState().addOptimistic(t,s,r);try{if(!this.adapter)throw new Error("Adapter not initialized");const a=await this.adapter.add(t,e,i),u={...e,id:a};if(this._updateListCaches(t,s,null,"delete"),this._updateListCaches(t,a,u,"add"),this.store&&this.store.getState().confirmOptimistic(t,s,a,u),this._shouldShowSuccessToast(h)){const n=f(),o=this._getEntityName(t);p("success",n.t("messages.createSuccess",{ns:"crud",entity:o}))}return u}catch(a){throw this._updateListCaches(t,s,null,"delete"),this.store&&this.store.getState().rejectOptimistic(t,s),d(a,{userMessage:`Failed to create ${t}`,showNotification:!0})}}async updateOptimistic(t,e,i,h,s){this.adapter||await this.initialize("firestore");const a=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),u=a?{...a,...i,_optimistic:!0}:{...i,id:e,_optimistic:!0};this.store&&a&&this.store.getState().updateOptimistic(t,e,u,a);try{if(!this.adapter)throw new Error("Adapter not initialized");await this.adapter.update(t,e,i);const n={...u,_optimistic:void 0};if(this._updateListCaches(t,e,n,"update"),this.store&&this.store.getState().confirmUpdate(t,e),this._shouldShowSuccessToast(s)){const o=f(),y=this._getEntityName(t);p("success",o.t("messages.updateSuccess",{ns:"crud",entity:y}))}return n}catch(n){throw a&&this._updateListCaches(t,e,a,"update"),this.store&&this.store.getState().rejectUpdate(t,e),d(n,{userMessage:`Failed to update ${t}`,showNotification:!0})}}async deleteOptimistic(t,e,i){this.adapter||await this.initialize("firestore");const s=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e);this.store&&s&&this.store.getState().deleteOptimistic(t,e,s);try{if(!this.adapter)throw new Error("Adapter not initialized");if(await this.adapter.delete(t,e),this._updateListCaches(t,e,null,"delete"),this.store&&this.store.getState().confirmDelete(t,e),this._shouldShowSuccessToast(i)){const r=f(),a=this._getEntityName(t);p("success",r.t("messages.deleteSuccess",{ns:"crud",entity:a}))}}catch(r){throw s&&this._updateListCaches(t,e,s,"add"),this.store&&this.store.getState().rejectDelete(t,e),d(r,{userMessage:`Failed to delete ${t}`,showNotification:!0})}}}const N=m(()=>new c);export{N as getCrudService};
package/dist/CrudStore.js CHANGED
@@ -1 +1 @@
1
- import{createDoNotDevStore as u}from"@donotdev/core";const d={filters:{},showFavoritesOnly:!1};function r(){return{loading:!1,error:null,lastUpdated:0,optimistic:{},ui:{...d}}}const m={backend:null,crudService:null,hideSuccessToasts:!1,collections:{}},g=u({name:"crud-store",createStore:(l,n)=>({...m,setCrudService:t=>{l({crudService:t})},setBackend:t=>{l({backend:t})},setHideSuccessToasts:t=>{l({hideSuccessToasts:t})},setLoading:(t,e)=>{l(o=>{const i=o.collections[t]||r();return{collections:{...o.collections,[t]:{...i,loading:e}}}})},setError:(t,e)=>{l(o=>{const i=o.collections[t]||r();return{collections:{...o.collections,[t]:{...i,error:e,loading:!1}}}})},setFilters:(t,e)=>{l(o=>{const i=o.collections[t]||r();return{collections:{...o.collections,[t]:{...i,ui:{...i.ui,filters:e}}}}})},setShowFavoritesOnly:(t,e)=>{l(o=>{const i=o.collections[t]||r();return{collections:{...o.collections,[t]:{...i,ui:{...i.ui,showFavoritesOnly:e}}}}})},getFilters:t=>n().collections[t]?.ui?.filters||{},getShowFavoritesOnly:t=>n().collections[t]?.ui?.showFavoritesOnly||!1,clearCollection:t=>{l(e=>{const{[t]:o,...i}=e.collections;return{collections:i}})},clearError:t=>{l(e=>{const o=e.collections[t];return o?{collections:{...e.collections,[t]:{...o,error:null}}}:e})},addOptimistic:(t,e,o)=>{l(i=>{const c=i.collections[t]||r();return{collections:{...i.collections,[t]:{...c,optimistic:{...c.optimistic,[e]:{tempId:e,originalData:null,optimisticData:o,status:"pending",operation:"add"}},lastUpdated:Date.now()}}}})},confirmOptimistic:(t,e,o,i)=>{l(c=>{const s=c.collections[t];if(!s)return c;const{[e]:a,...p}=s.optimistic;return{collections:{...c.collections,[t]:{...s,optimistic:p,lastUpdated:Date.now()}}}})},rejectOptimistic:(t,e)=>{l(o=>{const i=o.collections[t];if(!i)return o;const{[e]:c,...s}=i.optimistic;return{collections:{...o.collections,[t]:{...i,optimistic:s,lastUpdated:Date.now()}}}})},updateOptimistic:(t,e,o,i)=>{l(c=>{const s=c.collections[t]||r();return{collections:{...c.collections,[t]:{...s,optimistic:{...s.optimistic,[e]:{tempId:e,originalData:i,optimisticData:o,status:"pending",operation:"update"}},lastUpdated:Date.now()}}}})},confirmUpdate:(t,e)=>{l(o=>{const i=o.collections[t];if(!i)return o;const{[e]:c,...s}=i.optimistic;return{collections:{...o.collections,[t]:{...i,optimistic:s}}}})},rejectUpdate:(t,e)=>{l(o=>{const i=o.collections[t];if(!i)return o;const c=i.optimistic[e];if(!c||c.operation!=="update")return o;const{[e]:s,...a}=i.optimistic;return{collections:{...o.collections,[t]:{...i,optimistic:a,lastUpdated:Date.now()}}}})},deleteOptimistic:(t,e,o)=>{l(i=>{const c=i.collections[t];return c?{collections:{...i.collections,[t]:{...c,optimistic:{...c.optimistic,[e]:{tempId:e,originalData:o,optimisticData:null,status:"pending",operation:"delete"}},lastUpdated:Date.now()}}}:i})},confirmDelete:(t,e)=>{l(o=>{const i=o.collections[t];if(!i)return o;const{[e]:c,...s}=i.optimistic;return{collections:{...o.collections,[t]:{...i,optimistic:s}}}})},rejectDelete:(t,e)=>{l(o=>{const i=o.collections[t];if(!i)return o;const c=i.optimistic[e];if(!c||c.operation!=="delete")return o;const{[e]:s,...a}=i.optimistic;return{collections:{...o.collections,[t]:{...i,optimistic:a,lastUpdated:Date.now()}}}})},getLoading:t=>n().collections[t]?.loading||!1,getError:t=>n().collections[t]?.error||null,isOptimistic:(t,e)=>n().collections[t]?.optimistic[e]?.status==="pending",getOptimisticStatus:(t,e)=>n().collections[t]?.optimistic[e]?.status??null,getOptimisticData:(t,e)=>n().collections[t]?.optimistic[e]?.optimisticData??null})});export{g as useCrudStore};
1
+ import{createDoNotDevStore as m}from"@donotdev/core";const u={filters:{},showFavoritesOnly:!1};function r(){return{loading:!1,error:null,lastUpdated:0,optimistic:{},ui:{...u}}}const d={backend:null,crudService:null,hideSuccessToasts:!1,collections:{}},f=m({name:"crud-store",createStore:(n,s)=>({...d,setCrudService:t=>{n({crudService:t})},setBackend:t=>{n({backend:t})},setHideSuccessToasts:t=>{n({hideSuccessToasts:t})},setLoading:(t,c)=>{n(i=>{const o=i.collections[t]||r();return{collections:{...i.collections,[t]:{...o,loading:c}}}})},setError:(t,c)=>{n(i=>{const o=i.collections[t]||r();return{collections:{...i.collections,[t]:{...o,error:c,loading:!1}}}})},setFilters:(t,c)=>{n(i=>{const o=i.collections[t]||r();return{collections:{...i.collections,[t]:{...o,ui:{...o.ui,filters:c}}}}})},setShowFavoritesOnly:(t,c)=>{n(i=>{const o=i.collections[t]||r();return{collections:{...i.collections,[t]:{...o,ui:{...o.ui,showFavoritesOnly:c}}}}})},getFilters:t=>s().collections[t]?.ui?.filters||{},getShowFavoritesOnly:t=>s().collections[t]?.ui?.showFavoritesOnly||!1,clearCollection:t=>{n(c=>{const{[t]:i,...o}=c.collections;return{collections:o}})},clearError:t=>{n(c=>{const i=c.collections[t];return i?{collections:{...c.collections,[t]:{...i,error:null}}}:c})},addOptimistic:(t,c,i)=>{n(o=>{const e=o.collections[t]||r();return{collections:{...o.collections,[t]:{...e,optimistic:{...e.optimistic,[c]:{tempId:c,originalData:null,optimisticData:i,status:"pending",operation:"add"}},lastUpdated:Date.now()}}}})},confirmOptimistic:(t,c,i,o)=>{n(e=>{const l=e.collections[t];if(!l)return e;const{[c]:a,...p}=l.optimistic;return{collections:{...e.collections,[t]:{...l,optimistic:p,lastUpdated:Date.now()}}}})},rejectOptimistic:(t,c)=>{n(i=>{const o=i.collections[t];if(!o)return i;const{[c]:e,...l}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:l,lastUpdated:Date.now()}}}})},updateOptimistic:(t,c,i,o)=>{n(e=>{const l=e.collections[t]||r();return{collections:{...e.collections,[t]:{...l,optimistic:{...l.optimistic,[c]:{tempId:c,originalData:o,optimisticData:i,status:"pending",operation:"update"}},lastUpdated:Date.now()}}}})},confirmUpdate:(t,c)=>{n(i=>{const o=i.collections[t];if(!o)return i;const{[c]:e,...l}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:l}}}})},rejectUpdate:(t,c)=>{n(i=>{const o=i.collections[t];if(!o)return i;const e=o.optimistic[c];if(!e||e.operation!=="update")return i;const{[c]:l,...a}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:a,lastUpdated:Date.now()}}}})},deleteOptimistic:(t,c,i)=>{n(o=>{const e=o.collections[t];return e?{collections:{...o.collections,[t]:{...e,optimistic:{...e.optimistic,[c]:{tempId:c,originalData:i,optimisticData:null,status:"pending",operation:"delete"}},lastUpdated:Date.now()}}}:o})},confirmDelete:(t,c)=>{n(i=>{const o=i.collections[t];if(!o)return i;const{[c]:e,...l}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:l}}}})},rejectDelete:(t,c)=>{n(i=>{const o=i.collections[t];if(!o)return i;const e=o.optimistic[c];if(!e||e.operation!=="delete")return i;const{[c]:l,...a}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:a,lastUpdated:Date.now()}}}})},getLoading:t=>s().collections[t]?.loading||!1,getError:t=>s().collections[t]?.error||null,isOptimistic:(t,c)=>s().collections[t]?.optimistic[c]?.status==="pending",getOptimisticStatus:(t,c)=>s().collections[t]?.optimistic[c]?.status??null,getOptimisticData:(t,c)=>s().collections[t]?.optimistic[c]?.optimisticData??null})});export{f as useCrudStore};
@@ -1 +1 @@
1
- "use client";class c{components=new Map;registerComponent(e,t,o){this.components.set(e,{controlled:t,uncontrolled:o})}register(e){const{type:t,controlledComponent:o,uncontrolledComponent:l}=e;this.components.set(t,{controlled:o,uncontrolled:l})}getControlledComponent(e){return this.components.get(e)?.controlled}getUncontrolledComponent(e){return this.components.get(e)?.uncontrolled}has(e){return this.components.has(e)}getRegisteredTypes(){return Array.from(this.components.keys())}clear(){this.components.clear()}}let r=null;function s(){return r||(r=new c),r}function i(n){s().register(n)}function p(n){return s().has(n)}export{s as getFieldRegistry,p as isFieldTypeRegistered,i as registerFieldType};
1
+ "use client";class i{components=new Map;registerComponent(e,n,o){this.components.set(e,{controlled:n,uncontrolled:o})}register(e){const{type:n,controlledComponent:o,uncontrolledComponent:l}=e;this.components.set(n,{controlled:o,uncontrolled:l})}getControlledComponent(e){return this.components.get(e)?.controlled}getUncontrolledComponent(e){return this.components.get(e)?.uncontrolled}has(e){return this.components.has(e)}getRegisteredTypes(){return Array.from(this.components.keys())}clear(){this.components.clear()}}let r=null;function s(){return r||(r=new i),r}function c(t){s().register(t)}function p(t){return s().has(t)}export{s as getFieldRegistry,p as isFieldTypeRegistered,c as registerFieldType};
@@ -1 +1 @@
1
- import*as d from"valibot";import{handleError as w}from"@donotdev/core";import{getFirestore as b,getFirebaseSDK as v,doc as p,getDoc as g,getDocs as q,setDoc as R,updateDoc as S,deleteDoc as E,addDoc as M,collection as V,query as A,where as D,orderBy as x,limit as B,startAfter as z,onSnapshot as I}from"@donotdev/firebase";import{transformFirestoreData as m,prepareForFirestore as F}from"@donotdev/firebase";class K{firestore;ensureFirestore(){if(this.firestore)return!0;try{return this.firestore=b(),!0}catch{return!1}}getCollectionRef(s){return!this.ensureFirestore()||!this.firestore?null:V(this.firestore,s)}async get(s,t,e){if(!this.ensureFirestore()||!this.firestore)return null;try{const o=p(this.firestore,s,t),i=await g(o);if(!i.exists())return null;let r=i.data();return r=m(r),{...d.parse(e,r),id:t}}catch(o){return w(o,{context:{operation:"FirestoreAdapter.get",collection:s,docId:t},severity:"warning"}),null}}async set(s,t,e,o){if(!(!this.ensureFirestore()||!this.firestore))try{d.parse(o,e);const i=p(this.firestore,s,t),r=F(e);await R(i,r)}catch(i){throw i}}async update(s,t,e){if(!(!this.ensureFirestore()||!this.firestore))try{const o=p(this.firestore,s,t),i=F(e);await S(o,i)}catch(o){throw o}}async delete(s,t){if(!(!this.ensureFirestore()||!this.firestore))try{const e=p(this.firestore,s,t);await E(e)}catch(e){throw e}}async add(s,t,e){if(!this.ensureFirestore())return"";try{d.parse(e,t);const o=this.getCollectionRef(s);if(!o)return"";const i=new Date().toISOString(),r=v().getCurrentUser()?.uid||"anonymous",c={...t,createdAt:i,updatedAt:i,createdById:r,updatedById:r},a=F(c);return(await M(o,a)).id}catch(o){throw o}}async query(s,t,e,o="list"){if(!this.ensureFirestore())return{items:[]};const i=this.getCollectionRef(s);if(!i)return{items:[]};try{const r=[];if(t.where)for(const n of t.where)r.push(D(n.field,n.operator,n.value));if(t.orderBy)for(const n of t.orderBy)r.push(x(n.field,n.direction||"asc"));if(t.startAfterId){const n=await g(p(i,t.startAfterId));n.exists()&&r.push(z(n))}const c=t.limit?t.limit+1:void 0;c&&r.push(B(c));const a=A(i,...r),h=await q(a),u=[];let l=null;h.forEach(n=>{try{let f=n.data();if(!f)return;f=m(f);const C=d.parse(e,f);u.push({...C,id:n.id}),l=n.id}catch(f){w(f,{context:{operation:"FirestoreAdapter.query.parse",docId:n.id,collection:s},showNotification:!1})}});const y=c?u.length>(t.limit||0):!1;return{items:y?u.slice(0,t.limit):u,hasMore:y,lastVisible:l,total:void 0}}catch(r){throw w(r,{context:{operation:"FirestoreAdapter.query",collection:s,options:t}}),r}}subscribe(s,t,e,o){if(!this.ensureFirestore()||!this.firestore)return()=>{};const i=p(this.firestore,s,t);return I(i,r=>{try{if(!r.exists()){e(null);return}let c=r.data();c=m(c);const a=d.parse(o,c);e({...a,id:t})}catch(c){e(null,c)}},r=>{e(null,r)})}subscribeToCollection(s,t,e,o){if(!this.ensureFirestore())return()=>{};const i=this.getCollectionRef(s);if(!i)return()=>{};try{const r=[];if(t.where)for(const a of t.where)r.push(D(a.field,a.operator,a.value));if(t.orderBy)for(const a of t.orderBy)r.push(x(a.field,a.direction||"asc"));t.limit&&r.push(B(t.limit));const c=A(i,...r);return I(c,a=>{try{const h=[];a.forEach(u=>{let l=u.data();l=m(l);const y=d.parse(o,l);h.push({...y,id:u.id})}),e(h)}catch(h){e([],h)}},a=>{e([],a)})}catch(r){return e([],r),()=>{}}}}export{K as FirestoreAdapter};
1
+ import*as h from"valibot";import{handleError as m}from"@donotdev/core";import{getFirestore as B,getFirebaseSDK as C,doc as p,getDoc as w,getDocs as E,setDoc as v,updateDoc as V,deleteDoc as z,addDoc as M,collection as L,query as A,where as D,orderBy as R,limit as I,startAfter as S,onSnapshot as q}from"@donotdev/firebase";import{transformFirestoreData as F,prepareForFirestore as g}from"@donotdev/firebase";class W{firestore;ensureFirestore(){if(this.firestore)return!0;try{return this.firestore=B(),!0}catch{return!1}}getCollectionRef(s){return!this.ensureFirestore()||!this.firestore?null:L(this.firestore,s)}async get(s,e,t){if(!this.ensureFirestore()||!this.firestore)return null;try{const o=p(this.firestore,s,e),i=await w(o);if(!i.exists())return null;let r=i.data();return r=F(r),{...h.parse(t,r),id:e}}catch(o){return m(o,{context:{operation:"FirestoreAdapter.get",collection:s,docId:e},severity:"warning"}),null}}async set(s,e,t,o){if(!(!this.ensureFirestore()||!this.firestore))try{h.parse(o,t);const i=p(this.firestore,s,e),r=g(t);await v(i,r)}catch(i){throw i}}async update(s,e,t){if(!(!this.ensureFirestore()||!this.firestore))try{const o=p(this.firestore,s,e),i=g(t);await V(o,i)}catch(o){throw o}}async delete(s,e){if(!(!this.ensureFirestore()||!this.firestore))try{const t=p(this.firestore,s,e);await z(t)}catch(t){throw t}}async add(s,e,t){if(!this.ensureFirestore())return"";try{h.parse(t,e);const o=this.getCollectionRef(s);if(!o)return"";const i=new Date().toISOString(),r=C().getCurrentUser()?.uid||"anonymous",n={...e,createdAt:i,updatedAt:i,createdById:r,updatedById:r},a=g(n);return(await M(o,a)).id}catch(o){throw o}}async query(s,e,t,o="list"){if(!this.ensureFirestore())return{items:[]};const i=this.getCollectionRef(s);if(!i)return{items:[]};try{const r=[];if(e.where)for(const c of e.where)r.push(D(c.field,c.operator,c.value));if(e.orderBy)for(const c of e.orderBy)r.push(R(c.field,c.direction||"asc"));if(e.startAfterId){const c=await w(p(i,e.startAfterId));c.exists()&&r.push(S(c))}const n=e.limit?e.limit+1:void 0;n&&r.push(I(n));const a=A(i,...r),d=await E(a),f=[];let l=null;d.forEach(c=>{try{let u=c.data();if(!u)return;u=F(u);const x=h.parse(t,u);f.push({...x,id:c.id}),l=c.id}catch(u){m(u,{context:{operation:"FirestoreAdapter.query.parse",docId:c.id,collection:s},showNotification:!1})}});const y=n?f.length>(e.limit||0):!1;return{items:y?f.slice(0,e.limit):f,hasMore:y,lastVisible:l,total:void 0}}catch(r){throw m(r,{context:{operation:"FirestoreAdapter.query",collection:s,options:e}}),r}}subscribe(s,e,t,o){if(!this.ensureFirestore()||!this.firestore)return()=>{};const i=p(this.firestore,s,e);return q(i,r=>{try{if(!r.exists()){t(null);return}let n=r.data();n=F(n);const a=h.parse(o,n);t({...a,id:e})}catch(n){t(null,n)}},r=>{t(null,r)})}subscribeToCollection(s,e,t,o){if(!this.ensureFirestore())return()=>{};const i=this.getCollectionRef(s);if(!i)return()=>{};try{const r=[];if(e.where)for(const a of e.where)r.push(D(a.field,a.operator,a.value));if(e.orderBy)for(const a of e.orderBy)r.push(R(a.field,a.direction||"asc"));e.limit&&r.push(I(e.limit));const n=A(i,...r);return q(n,a=>{try{const d=[];a.forEach(f=>{let l=f.data();l=F(l);const y=h.parse(o,l);d.push({...y,id:f.id})}),t(d)}catch(d){t([],d)}},a=>{t([],a)})}catch(r){return t([],r),()=>{}}}}export{W as FirestoreAdapter};
@@ -1 +1 @@
1
- import{httpsCallable as n}from"firebase/functions";import*as u from"valibot";import{getPlatformEnvVar as d}from"@donotdev/core";import{getFirebaseFunctions as h}from"@donotdev/firebase";class l{functions;region;constructor(){this.region=d("FIREBASE_FUNCTIONS_REGION")||"europe-west1"}async ensureFunctions(){if(this.functions)return!0;try{return this.functions=await h(this.region),!0}catch{return!1}}async get(i,t,a){if(!await this.ensureFunctions())return null;try{const r=`get_${i}`;return(await n(this.functions,r)({id:t})).data}catch(r){throw r}}async set(i,t,a,r){if(await this.ensureFunctions())try{u.parse(r,a);const e=`update_${i}`;await n(this.functions,e)({id:t,payload:a})}catch(e){throw e}}async update(i,t,a){if(await this.ensureFunctions())try{const r=`update_${i}`;await n(this.functions,r)({id:t,payload:a})}catch(r){throw r}}async delete(i,t){if(await this.ensureFunctions())try{const a=`delete_${i}`;await n(this.functions,a)({id:t})}catch(a){throw a}}async add(i,t,a){if(!await this.ensureFunctions())return"";try{u.parse(a,t);const r=`create_${i}`;return(await n(this.functions,r)({payload:t})).data.id}catch(r){throw r}}async query(i,t,a,r="list"){if(!await this.ensureFunctions())return{items:[]};try{const e=r==="listCard"?`listCard_${i}`:`list_${i}`,s={};t.where&&(s.where=t.where.map(o=>[o.field,o.operator,o.value])),t.orderBy&&(s.orderBy=t.orderBy.map(o=>[o.field,o.direction||"asc"])),t.limit&&(s.limit=t.limit),t.startAfterId&&(s.startAfterId=t.startAfterId);const c=await n(this.functions,e)(s);return{items:c.data.items,total:c.data.count,hasMore:c.data.hasMore,lastVisible:c.data.lastVisible}}catch(e){throw e}}async listCard(i,t,a){if(!await this.ensureFunctions())return[];try{const r=`listCard_${i}`,e={};return t.where&&(e.where=t.where.map(s=>[s.field,s.operator,s.value])),t.orderBy&&(e.orderBy=t.orderBy.map(s=>[s.field,s.direction||"asc"])),t.limit&&(e.limit=t.limit),(await n(this.functions,r)(e)).data.items}catch(r){throw r}}subscribe(){throw new Error("Subscriptions are not supported with Functions backend. Use Firestore backend for real-time features.")}subscribeToCollection(){throw new Error("Subscriptions are not supported with Functions backend. Use Firestore backend for real-time features.")}}export{l as FunctionsAdapter};
1
+ import{httpsCallable as c}from"firebase/functions";import*as u from"valibot";import{getPlatformEnvVar as d}from"@donotdev/core";import{getFirebaseFunctions as f}from"@donotdev/firebase";class y{functions;region;constructor(){this.region=d("FIREBASE_FUNCTIONS_REGION")||"europe-west1"}async ensureFunctions(){if(this.functions)return!0;try{return this.functions=await f(this.region),!0}catch{return!1}}async get(e,t,s){if(!await this.ensureFunctions())return null;try{const r=`get_${e}`;return(await c(this.functions,r)({id:t})).data}catch(r){throw r}}async set(e,t,s,r){if(await this.ensureFunctions())try{u.parse(r,s);const a=`update_${e}`;await c(this.functions,a)({id:t,payload:s})}catch(a){throw a}}async update(e,t,s){if(await this.ensureFunctions())try{const r=`update_${e}`;await c(this.functions,r)({id:t,payload:s})}catch(r){throw r}}async delete(e,t){if(await this.ensureFunctions())try{const s=`delete_${e}`;await c(this.functions,s)({id:t})}catch(s){throw s}}async add(e,t,s){if(!await this.ensureFunctions())return"";try{u.parse(s,t);const r=`create_${e}`;return(await c(this.functions,r)({payload:t})).data.id}catch(r){throw r}}async query(e,t,s,r="list"){if(!await this.ensureFunctions())return{items:[]};try{const a=r==="listCard"?`listCard_${e}`:`list_${e}`,i={};t.where&&(i.where=t.where.map(o=>[o.field,o.operator,o.value])),t.orderBy&&(i.orderBy=t.orderBy.map(o=>[o.field,o.direction||"asc"])),t.limit&&(i.limit=t.limit),t.startAfterId&&(i.startAfterId=t.startAfterId);const n=await c(this.functions,a)(i);return{items:n.data.items,total:n.data.count,hasMore:n.data.hasMore,lastVisible:n.data.lastVisible}}catch(a){throw a}}async listCard(e,t,s){if(!await this.ensureFunctions())return[];try{const r=`listCard_${e}`,a={};return t.where&&(a.where=t.where.map(n=>[n.field,n.operator,n.value])),t.orderBy&&(a.orderBy=t.orderBy.map(n=>[n.field,n.direction||"asc"])),t.limit&&(a.limit=t.limit),(await c(this.functions,r)(a)).data.items}catch(r){throw r}}subscribe(){throw new Error("Subscriptions are not supported with Functions backend. Use Firestore backend for real-time features.")}subscribeToCollection(){throw new Error("Subscriptions are not supported with Functions backend. Use Firestore backend for real-time features.")}}export{y as FunctionsAdapter};
@@ -1 +1 @@
1
- export*from"./FirestoreAdapter";import{FunctionsAdapter as o}from"./FunctionsAdapter";export{o as FunctionsAdapter};
1
+ export*from"./FirestoreAdapter";import{FunctionsAdapter as e}from"./FunctionsAdapter";export{e as FunctionsAdapter};
@@ -1 +1 @@
1
- "use client";import{jsx as d}from"react/jsx-runtime";import{ActionButton as n}from"@donotdev/components";import{useCrudStore as a}from"../CrudStore";function c({requiresAuth:r=!0,user:e,disabled:t=!1,children:s,...i}){const o=a(u=>!!u.crudService);return d(n,{...i,disabled:t||!o||r&&!e,children:s})}var l=c;export{l as default};
1
+ "use client";import{jsx as n}from"react/jsx-runtime";import{ActionButton as d}from"@donotdev/components";import{useCrudStore as l}from"../CrudStore";function a({requiresAuth:t=!0,user:e,disabled:r=!1,children:i,...o}){const s=l(u=>!!u.crudService);return n(d,{...o,disabled:r||!s||t&&!e,children:i})}var p=a;export{p as default};
@@ -1 +1 @@
1
- "use client";import{jsx as r,jsxs as s}from"react/jsx-runtime";import{Text as a,Stack as c}from"@donotdev/components";import{handleError as d}from"@donotdev/core";import{translateFieldLabel as u}from"../forms/utils";import{getDisplayFormatter as y}from"../fieldTypeRegistry";function m(t,e,o,n){const i=n?.compact??!1;if(t==null||t==="")return i?r("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):r(a,{variant:"muted",children:"\u2014"});const l=y(e.type);if(l)try{return l(t,e,o,n)}catch(f){return d(f,{userMessage:`Error formatting field "${e.label||e.name}"`,context:{fieldType:e.type,fieldName:e.label||"unknown",operation:"display_format"},severity:"warning"}),i?r("span",{style:{color:"var(--muted-foreground)"},children:String(t)}):r(a,{variant:"muted",children:String(t)})}return d(new Error(`Display formatter not registered for field type: ${e.type}`),{userMessage:`Field type "${e.type}" is missing display formatter`,context:{fieldType:e.type,fieldName:e.label||"unknown",operation:"display_format",fix:"Add displayFormatter to registerBuiltinFieldType() in registerBuiltinFieldTypes.tsx"},severity:"warning"}),i?r("span",{style:{color:"var(--muted-foreground)"},children:String(t)}):r(a,{variant:"muted",children:String(t)})}function p({name:t,config:e,value:o,t:n}){const i=m(o,e,n,{compact:!1}),l=u(t,e,n);return s(c,{direction:"row",align:"baseline",style:{marginBottom:"var(--gap-sm)",padding:"var(--gap-sm)",minHeight:"38px",alignItems:"center"},children:[s(a,{variant:"muted",style:{fontSize:"var(--font-size-sm)",fontWeight:500,minWidth:"fit-content",flexShrink:0},children:[l,":"]}),r("div",{style:{flex:1,display:"flex",alignItems:"center"},children:typeof i=="string"?r(a,{children:i}):i})]})}var g=p;export{p as DisplayFieldRenderer,g as default,m as formatValue};
1
+ "use client";import{jsx as t,jsxs as s}from"react/jsx-runtime";import{Text as a,Stack as p}from"@donotdev/components";import{handleError as d}from"@donotdev/core";import{translateFieldLabel as f}from"../forms/utils";import{getDisplayFormatter as y}from"../fieldTypeRegistry";function c(r,e,o,n){const i=n?.compact??!1;if(r==null||r==="")return i?t("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):t(a,{variant:"muted",children:"\u2014"});const l=y(e.type);if(l)try{return l(r,e,o,n)}catch(m){return d(m,{userMessage:`Error formatting field "${e.label||e.name}"`,context:{fieldType:e.type,fieldName:e.label||"unknown",operation:"display_format"},severity:"warning"}),i?t("span",{style:{color:"var(--muted-foreground)"},children:String(r)}):t(a,{variant:"muted",children:String(r)})}return d(new Error(`Display formatter not registered for field type: ${e.type}`),{userMessage:`Field type "${e.type}" is missing display formatter`,context:{fieldType:e.type,fieldName:e.label||"unknown",operation:"display_format",fix:"Add displayFormatter to registerBuiltinFieldType() in registerBuiltinFieldTypes.tsx"},severity:"warning"}),i?t("span",{style:{color:"var(--muted-foreground)"},children:String(r)}):t(a,{variant:"muted",children:String(r)})}function u({name:r,config:e,value:o,t:n}){const i=c(o,e,n,{compact:!1}),l=f(r,e,n);return s(p,{direction:"row",align:"baseline",style:{marginBottom:"var(--gap-sm)",padding:"var(--gap-sm)",minHeight:"38px",alignItems:"center"},children:[s(a,{variant:"muted",style:{fontSize:"var(--font-size-sm)",fontWeight:500,minWidth:"fit-content",flexShrink:0},children:[l,":"]}),t("div",{style:{flex:1,display:"flex",alignItems:"center"},children:typeof i=="string"?t(a,{children:i}):i})]})}var b=u;export{u as DisplayFieldRenderer,b as default,c as formatValue};
@@ -1,4 +1,4 @@
1
- import type { Entity, UserRole } from '@donotdev/core';
1
+ import type { Entity } from '@donotdev/core';
2
2
  export interface EntityDisplayRendererProps<T extends Record<string, unknown> = Record<string, unknown>> {
3
3
  /** Entity definition - pass the full entity from defineEntity() */
4
4
  entity: Entity;
@@ -20,7 +20,7 @@ export interface EntityDisplayRendererProps<T extends Record<string, unknown> =
20
20
  * If not provided, defaults to 'guest' (most restrictive - shows only public fields)
21
21
  * @default 'guest'
22
22
  */
23
- viewerRole?: UserRole;
23
+ viewerRole?: string;
24
24
  }
25
25
  /**
26
26
  * EntityDisplayRenderer - Automatically fetches and displays entity data
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDisplayRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityDisplayRenderer.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAKvD,MAAM,WAAW,0BAA0B,CACzC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,uEAAuE;IACvE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,EACA,MAAM,EACN,EAAE,EACF,CAAC,EACD,SAAc,EACd,OAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAoB,GACrB,EAAE,0BAA0B,CAAC,CAAC,CAAC,2CAgM/B;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"EntityDisplayRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityDisplayRenderer.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,MAAM,WAAW,0BAA0B,CACzC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,uEAAuE;IACvE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,EACA,MAAM,EACN,EAAE,EACF,CAAC,EACD,SAAc,EACd,OAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAoB,GACrB,EAAE,0BAA0B,CAAC,CAAC,CAAC,2CAgM/B;AAED,eAAe,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as t,jsxs as D}from"react/jsx-runtime";import{useEffect as O,useState as f,useMemo as L}from"react";import{Stack as g,Spinner as T}from"@donotdev/components";import{useTranslation as v,isFieldVisible as $}from"@donotdev/core";import{DisplayFieldRenderer as q}from"./DisplayFieldRenderer";import{useCrud as I}from"../useCrud";function b({entity:i,id:o,t:A,className:c="",backend:E="functions",loadingMessage:S,notFoundMessage:j,viewerRole:p="guest"}){const{get:m,loading:k,data:w,error:x,isAvailable:y}=I(i,{backend:E}),[F,u]=f(!1),[M,a]=f(null),[N,d]=f(null),{t:R}=v([i.namespace,"crud"]),{t:h}=v("crud"),V=A||R;O(()=>{if(!o){d(null),a(null),u(!1);return}if(!y||!m)return;let n=!1;return u(!0),a(null),m(o).then(e=>{n||(u(!1),e?(d(e),a(null)):(d(null),a(new Error("Entity not found"))))}).catch(e=>{n||(u(!1),a(e instanceof Error?e:new Error(String(e))),d(null))}),()=>{n=!0}},[o,m,y]);const l=w||N,s=x||M,z=k||F||!o,C=L(()=>l?Object.entries(i.fields).filter(([n,e])=>{if(!$(e.visibility,p)||e.visibility==="hidden")return!1;const r=l[n];return!(r==null||typeof r=="string"&&r.trim()===""||Array.isArray(r)&&r.length===0||typeof r=="object"&&!Array.isArray(r)&&r!==null&&Object.keys(r).length===0)}):[],[i.fields,p,l]);return z?t("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},className:c,children:t(T,{overlay:!0,"aria-label":S||h("form.loading",{defaultValue:"Loading..."})})}):s||!l?t(g,{align:"center",justify:"center",gap:"medium",style:{padding:"var(--gap-3xl)",textAlign:"center"},className:c,children:D(g,{direction:"column",gap:"tight",children:[t("h3",{style:{color:"var(--muted-foreground)"},children:j||h("errors.notFound",{defaultValue:`${i.name} not found`})}),s&&t("p",{style:{color:"var(--destructive)",fontSize:"var(--font-size-sm)"},children:s instanceof Error?s.message:String(s)})]})}):t(g,{direction:"column",gap:"medium",className:c,children:C.map(([n,e])=>t(q,{name:n,config:e,value:l[n],t:V},n))})}var Q=b;export{b as EntityDisplayRenderer,Q as default};
1
+ "use client";import{jsx as n,jsxs as O}from"react/jsx-runtime";import{useEffect as _,useState as m,useMemo as I}from"react";import{Stack as p,Spinner as M}from"@donotdev/components";import{useTranslation as v,isFieldVisible as R}from"@donotdev/core";import{DisplayFieldRenderer as T}from"./DisplayFieldRenderer";import{useCrud as $}from"../useCrud";function q({entity:i,id:o,t:E,className:f="",backend:b="functions",loadingMessage:j,notFoundMessage:x,viewerRole:g="guest"}){const{get:d,loading:F,data:A,error:S,isAvailable:y}=$(i,{backend:b}),[D,u]=m(!1),[V,s]=m(null),[k,c]=m(null),{t:w}=v([i.namespace,"crud"]),{t:h}=v("crud"),z=E||w;_(()=>{if(!o){c(null),s(null),u(!1);return}if(!y||!d)return;let t=!1;return u(!0),s(null),d(o).then(r=>{t||(u(!1),r?(c(r),s(null)):(c(null),s(new Error("Entity not found"))))}).catch(r=>{t||(u(!1),s(r instanceof Error?r:new Error(String(r))),c(null))}),()=>{t=!0}},[o,d,y]);const l=A||k,a=S||V,C=F||D||!o,L=I(()=>l?Object.entries(i.fields).filter(([t,r])=>{if(!R(r.visibility,g)||r.visibility==="hidden")return!1;const e=l[t];return!(e==null||typeof e=="string"&&e.trim()===""||Array.isArray(e)&&e.length===0||typeof e=="object"&&!Array.isArray(e)&&e!==null&&Object.keys(e).length===0)}):[],[i.fields,g,l]);return C?n("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},className:f,children:n(M,{overlay:!0,"aria-label":j||h("form.loading",{defaultValue:"Loading..."})})}):a||!l?n(p,{align:"center",justify:"center",gap:"medium",style:{padding:"var(--gap-3xl)",textAlign:"center"},className:f,children:O(p,{direction:"column",gap:"tight",children:[n("h3",{style:{color:"var(--muted-foreground)"},children:x||h("errors.notFound",{defaultValue:`${i.name} not found`})}),a&&n("p",{style:{color:"var(--destructive)",fontSize:"var(--font-size-sm)"},children:a instanceof Error?a.message:String(a)})]})}):n(p,{direction:"column",gap:"medium",className:f,children:L.map(([t,r])=>n(T,{name:t,config:r,value:l[t],t:z},t))})}var Q=q;export{q as EntityDisplayRenderer,Q as default};
@@ -1 +1 @@
1
- "use client";import{jsx as f,jsxs as k}from"react/jsx-runtime";import{useMemo as R,useState as J}from"react";import{FilterX as Q}from"lucide-react";import{Button as E,Calendar as U,Combobox as Z,Grid as K,Popover as ee,RangeInput as te,Slider as ie,Stack as W,Text as Y}from"@donotdev/components";import{useTranslation as z,handleError as _}from"@donotdev/core";import{translateFieldLabel as ae,translateLabel as G}from"../forms/utils";import{getFilterType as B,isFilterable as ne}from"../fieldTypeRegistry";function X(e,t,r){if(!t)return!0;if(typeof t=="object"&&"min"in t){const s=B(r);if(!s)throw _(new Error(`Field type "${r}" not registered in field type registry`),{userMessage:`Field type "${r}" is missing from registry`,context:{fieldType:r,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});const F=s==="range"&&(r==="date"||r==="datetime-local"||r==="timestamp"),S=s==="range"&&!F,w=r==="price",c=w&&e!=null&&typeof e=="object"?Number(e.amount):S&&e!=null?typeof e=="number"?e:Number(e):NaN;if(S||w){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";return d&&!y?e==null||isNaN(c)?!1:c>=Number(t.min):!d&&y?e==null?!0:isNaN(c)?!1:c<=Number(t.max):d&&y?e==null||isNaN(c)?!1:c>=Number(t.min)&&c<=Number(t.max):!0}if(F){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";if(d&&!y){if(e==null)return!1;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x>=new Date(t.min)}if(!d&&y){if(e==null)return!0;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x<=new Date(t.max)}if(d&&y){if(e==null)return!1;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x>=new Date(t.min)&&x<=new Date(t.max)}return!0}}const g=B(r);if(!g)throw _(new Error(`Field type "${r}" not registered in field type registry`),{userMessage:`Field type "${r}" is missing from registry`,context:{fieldType:r,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});if(g==="address")return e==null?!1:typeof e=="object"&&"formatted_address"in e?String(e.formatted_address).toLowerCase().includes(String(t).toLowerCase()):!1;if(g==="multiselect"){if(!Array.isArray(e)||e.length===0)return!1;const s=String(t).toLowerCase();return e.some(F=>String(F).toLowerCase().includes(s))}return e==null?!1:String(e).toLowerCase().includes(String(t).toLowerCase())}function re(e,t,r){if(!e&&!t)return r??"From \u2013 To";const g=e?new Date(e+"T00:00:00").toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"",s=t?new Date(t+"T00:00:00").toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"";return g&&s?`${g} \u2013 ${s}`:g?`${g} \u2013 \u2026`:s?`\u2026 \u2013 ${s}`:r??"From \u2013 To"}function le({label:e,rangeFilter:t,onRangeChange:r,onClear:g,tCrud:s}){const[F,S]=J(!1),w=!!(t.min||t.max),c=t.min||t.max?{from:t.min?new Date(t.min+"T00:00:00"):void 0,to:t.max?new Date(t.max+"T00:00:00"):void 0}:void 0,d=l=>{if(!l){g();return}const h=l.from?l.from.toISOString().split("T")[0]:"",N=l.to?l.to.toISOString().split("T")[0]:"";r(h,N),l.from&&l.to&&S(!1)},y=(l,h)=>{r(l,h),S(!1)},x=()=>{g(),S(!1)},C=re(t.min,t.max,s("filter.fromTo",{defaultValue:"From \u2013 To"}));return f(ee,{open:F,onOpenChange:S,trigger:f(E,{variant:"outline",display:"compact",className:"dndev-w-full dndev-justify-between","aria-haspopup":"dialog","aria-expanded":F,"aria-label":e,children:k(Y,{as:"span",level:"small",variant:w?void 0:"muted",children:[e,": ",C]})}),children:k(W,{gap:"medium",style:{padding:"var(--gap-md)"},children:[f(Y,{as:"span",level:"small",variant:"muted",children:e}),k(W,{direction:"row",gap:"tight",children:[f(E,{variant:"outline",display:"compact",onClick:()=>{const l=new Date().toISOString().split("T")[0];y(l,l)},children:s("filter.today",{defaultValue:"Today"})}),f(E,{variant:"outline",display:"compact",onClick:()=>{const l=new Date,h=new Date(l);h.setDate(l.getDate()-l.getDay());const N=new Date(h);N.setDate(h.getDate()+6),y(h.toISOString().split("T")[0],N.toISOString().split("T")[0])},children:s("filter.thisWeek",{defaultValue:"This Week"})}),f(E,{variant:"outline",display:"compact",onClick:()=>{const l=new Date,h=new Date(l.getFullYear(),l.getMonth(),1),N=new Date(l.getFullYear(),l.getMonth()+1,0);y(h.toISOString().split("T")[0],N.toISOString().split("T")[0])},children:s("filter.thisMonth",{defaultValue:"This Month"})})]}),f(U,{mode:"range",selected:c,onSelect:d,defaultMonth:c?.from??c?.to??new Date}),f(E,{variant:"ghost",display:"compact",onClick:x,children:s("filter.clearDate",{defaultValue:"Clear"})})]})})}function oe({entity:e,data:t,filters:r,onFiltersChange:g,fieldsToFilter:s,variant:F="inline"}){const S=F==="sidebar",{t:w}=z("crud"),{t:c}=z(e.namespace),d=R(()=>(s&&s.length>0?s:e.listFields||Object.keys(e.fields)).filter(n=>{const i=e.fields[n]?.type||"text";return ne(i)}),[s,e.listFields,e.fields]),y=R(()=>{const n={};return d.forEach(i=>{const p=Object.fromEntries(Object.entries(r).filter(([o])=>o!==i));if(Object.keys(p).length===0){n[i]=t;return}n[i]=t.filter(o=>Object.entries(p).every(([v,O])=>{const V=o[v],j=e.fields[v]?.type||"text";return X(V,O,j)}))}),n},[t,r,e.fields,d]),x=R(()=>{const n={};return d.forEach(i=>{const p=e.fields[i];if(!p)return;const o=p.type||"text",v=B(o);if(!v){_(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:i,operation:"minmax_computation",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"});return}const O=v==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),V=v==="range"&&!O,j=o==="price";if(V||j){const b=t.map(a=>a[i]).filter(a=>a!=null&&a!=="").map(a=>j&&typeof a=="object"&&a!==null?Number(a.amount):typeof a=="number"?a:Number(a)).filter(a=>!isNaN(a));b.length>0&&(n[i]={min:Math.min(...b),max:Math.max(...b)})}else if(O){const b=t.map(a=>a[i]).filter(a=>a!=null&&a!=="").map(a=>a instanceof Date?a:new Date(a)).filter(a=>!isNaN(a.getTime()));if(b.length>0){const a=new Date(Math.min(...b.map(M=>M.getTime()))),I=new Date(Math.max(...b.map(M=>M.getTime()))),P=a.toISOString().split("T")[0],A=I.toISOString().split("T")[0];n[i]={min:P||"",max:A||""}}}}),n},[t,e.fields,d]),C=(n,i)=>{const p={...r};if(!i||i==="")delete p[n];else if(typeof i=="object"&&"min"in i){const o=i.min&&i.min!=="",v=i.max&&i.max!=="";!o&&!v?delete p[n]:p[n]=i}else p[n]=i;g(p)},l=()=>{g({})},h=R(()=>d.length===0?null:d.map(n=>{const i=e.fields[n];if(!i)return null;const p=ae(n,i,c),o=i.type||"text",v=B(o);if(!v)return _(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:n,operation:"filter_ui_render",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"}),null;const O=v==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),V=v==="range"&&!O,j=v==="select",b=r[n],a=typeof b=="object"&&b!==null&&"min"in b?b:{min:"",max:""};if(V){const u=x[n],T=u?.min??0,m=u?.max??100,D=a.min?Number(a.min):T,L=a.max?Number(a.max):m;return k(W,{gap:"tight",style:{gridColumn:"span 2",gridRow:S?void 0:"span 2"},children:[f(te,{type:"number",label:p,minPlaceholder:w("filter.min",{defaultValue:"Min"}),maxPlaceholder:w("filter.max",{defaultValue:"Max"}),minValue:a.min||"",maxValue:a.max||"",actualMin:T,actualMax:m,onChange:($,H)=>{C(n,{min:$,max:H})},onClear:()=>C(n,void 0)}),f(ie,{value:[D,L],min:T,max:m,step:1,onValueChange:$=>{C(n,{min:String($[0]),max:String($[1])})}})]},n)}if(O)return f("div",{style:{gridColumn:"span 2",gridRow:S?void 0:"span 1"},children:f(le,{label:p,rangeFilter:a,onRangeChange:(u,T)=>C(n,{min:u,max:T}),onClear:()=>C(n,void 0),tCrud:w})},n);const I=j&&i.validation&&"options"in i.validation&&i.validation?Array.isArray(i.validation.options)?i.validation.options:typeof i.validation.options=="function"?i.validation.options():[]:[],P=y[n]||t,A=new Set;P.forEach(u=>{const T=u[n];T!=null&&A.add(String(T))});const M=[{value:"all",label:w("filter.selectPlaceholder",{defaultValue:"All"})}];if(I.length>0){const u=[],T=[];I.forEach(m=>{const D=typeof m=="string"?m:m.value,L=typeof m=="string"?m:m.label;A.has(D)?u.push({value:D,label:L}):T.push({value:D,label:L})}),u.sort((m,D)=>m.label.localeCompare(D.label)),T.sort((m,D)=>m.label.localeCompare(D.label)),u.forEach(m=>{M.push({value:m.value,label:G(m.label,c),disabled:!1})}),T.forEach(m=>{M.push({value:m.value,label:G(m.label,c),disabled:!0})})}else Array.from(A).sort().slice(0,100).forEach(u=>{M.push({value:u,label:u})});return f("div",{style:{gridColumn:"span 2",gridRow:"span 1"},children:f(Z,{label:p,value:typeof b=="string"?b:void 0,onValueChange:u=>{C(n,u==="all"||!u?"":String(u))},options:M,placeholder:w("filter.placeholder",{defaultValue:"Filter..."}),clearable:!0})},n)}),[d,e.fields,t,r,c,w,y]);if(!h||h.length===0)return null;const N=h.filter(Boolean),q=Object.keys(r).length>0;return k(K,{cols:F==="sidebar"?2:[2,4,6,8],gap:"medium",style:{gridAutoRows:"min-content"},children:[N,f(E,{variant:"outline",icon:f(Q,{size:18}),onClick:l,disabled:!q,style:{gridColumn:"1 / -1",gridRow:"span 1"},children:w("filter.clear",{defaultValue:"Clear Filters"})})]})}export{oe as EntityFilters,X as matchesFilter};
1
+ "use client";import{jsx as g,jsxs as R}from"react/jsx-runtime";import{useMemo as B,useState as Q}from"react";import{FilterX as U}from"lucide-react";import{Button as j,Calendar as Z,Combobox as V,Grid as ee,Popover as te,RangeInput as ne,Slider as re,Stack as z,Text as X}from"@donotdev/components";import{useTranslation as q,handleError as N}from"@donotdev/core";import{translateFieldLabel as ie,translateLabel as H}from"../forms/utils";import{getFilterType as W,isFilterable as se}from"../fieldTypeRegistry";function oe(e,t,s){if(!t)return!0;if(typeof t=="object"&&"min"in t){const l=W(s);if(!l)throw N(new Error(`Field type "${s}" not registered in field type registry`),{userMessage:`Field type "${s}" is missing from registry`,context:{fieldType:s,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});const C=l==="range"&&(s==="date"||s==="datetime-local"||s==="timestamp"),F=l==="range"&&!C,S=s==="price",u=S&&e!=null&&typeof e=="object"?Number(e.amount):F&&e!=null?typeof e=="number"?e:Number(e):NaN;if(F||S){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";return d&&!y?e==null||isNaN(u)?!1:u>=Number(t.min):!d&&y?e==null?!0:isNaN(u)?!1:u<=Number(t.max):d&&y?e==null||isNaN(u)?!1:u>=Number(t.min)&&u<=Number(t.max):!0}if(C){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";if(d&&!y){if(e==null)return!1;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x>=new Date(t.min)}if(!d&&y){if(e==null)return!0;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x<=new Date(t.max)}if(d&&y){if(e==null)return!1;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x>=new Date(t.min)&&x<=new Date(t.max)}return!0}}const h=W(s);if(!h)throw N(new Error(`Field type "${s}" not registered in field type registry`),{userMessage:`Field type "${s}" is missing from registry`,context:{fieldType:s,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});if(h==="address")return e==null?!1:typeof e=="object"&&"formatted_address"in e?String(e.formatted_address).toLowerCase().includes(String(t).toLowerCase()):!1;if(h==="multiselect"){if(!Array.isArray(e)||e.length===0)return!1;const l=String(t).toLowerCase();return e.some(C=>String(C).toLowerCase().includes(l))}return e==null?!1:String(e).toLowerCase().includes(String(t).toLowerCase())}function ae(e,t,s){if(!e&&!t)return s??"From \u2013 To";const h=e?new Date(e+"T00:00:00").toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"",l=t?new Date(t+"T00:00:00").toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"";return h&&l?`${h} \u2013 ${l}`:h?`${h} \u2013 \u2026`:l?`\u2026 \u2013 ${l}`:s??"From \u2013 To"}function le({label:e,rangeFilter:t,onRangeChange:s,onClear:h,tCrud:l}){const[C,F]=Q(!1),S=!!(t.min||t.max),u=t.min||t.max?{from:t.min?new Date(t.min+"T00:00:00"):void 0,to:t.max?new Date(t.max+"T00:00:00"):void 0}:void 0,d=a=>{if(!a){h();return}const b=a.from?a.from.toISOString().split("T")[0]:"",O=a.to?a.to.toISOString().split("T")[0]:"";s(b,O),a.from&&a.to&&F(!1)},y=(a,b)=>{s(a,b),F(!1)},x=()=>{h(),F(!1)},E=ae(t.min,t.max,l("filter.fromTo",{defaultValue:"From \u2013 To"}));return g(te,{open:C,onOpenChange:F,trigger:g(j,{variant:"outline",display:"compact",className:"dndev-w-full dndev-justify-between","aria-haspopup":"dialog","aria-expanded":C,"aria-label":e,children:R(X,{as:"span",level:"small",variant:S?void 0:"muted",children:[e,": ",E]})}),children:R(z,{gap:"medium",style:{padding:"var(--gap-md)"},children:[g(X,{as:"span",level:"small",variant:"muted",children:e}),R(z,{direction:"row",gap:"tight",children:[g(j,{variant:"outline",display:"compact",onClick:()=>{const a=new Date().toISOString().split("T")[0];y(a,a)},children:l("filter.today",{defaultValue:"Today"})}),g(j,{variant:"outline",display:"compact",onClick:()=>{const a=new Date,b=new Date(a);b.setDate(a.getDate()-a.getDay());const O=new Date(b);O.setDate(b.getDate()+6),y(b.toISOString().split("T")[0],O.toISOString().split("T")[0])},children:l("filter.thisWeek",{defaultValue:"This Week"})}),g(j,{variant:"outline",display:"compact",onClick:()=>{const a=new Date,b=new Date(a.getFullYear(),a.getMonth(),1),O=new Date(a.getFullYear(),a.getMonth()+1,0);y(b.toISOString().split("T")[0],O.toISOString().split("T")[0])},children:l("filter.thisMonth",{defaultValue:"This Month"})})]}),g(Z,{mode:"range",selected:u,onSelect:d,defaultMonth:u?.from??u?.to??new Date}),g(j,{variant:"ghost",display:"compact",onClick:x,children:l("filter.clearDate",{defaultValue:"Clear"})})]})})}function he({entity:e,data:t,filters:s,onFiltersChange:h,fieldsToFilter:l,variant:C="inline"}){const F=C==="sidebar",{t:S}=q("crud"),{t:u}=q(e.namespace),d=B(()=>(l&&l.length>0?l:e.listFields||Object.keys(e.fields)).filter(n=>{const o=e.fields[n]?.type||"text";return se(o)}),[l,e.listFields,e.fields]),y=B(()=>{const r={};return d.forEach(n=>{const m=Object.fromEntries(Object.entries(s).filter(([o])=>o!==n));if(Object.keys(m).length===0){r[n]=t;return}r[n]=t.filter(o=>Object.entries(m).every(([w,v])=>{const A=o[w],p=e.fields[w]?.type||"text";return oe(A,v,p)}))}),r},[t,s,e.fields,d]),x=B(()=>{const r={};return d.forEach(n=>{const m=e.fields[n];if(!m)return;const o=m.type||"text",w=W(o);if(!w){N(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:n,operation:"minmax_computation",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"});return}const v=w==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),A=w==="range"&&!v,k=o==="price";if(A||k){const p=t.map(i=>i[n]).filter(i=>i!=null&&i!=="").map(i=>k&&typeof i=="object"&&i!==null?Number(i.amount):typeof i=="number"?i:Number(i)).filter(i=>!isNaN(i));p.length>0&&(r[n]={min:Math.min(...p),max:Math.max(...p)})}else if(v){const p=t.map(i=>i[n]).filter(i=>i!=null&&i!=="").map(i=>i instanceof Date?i:new Date(i)).filter(i=>!isNaN(i.getTime()));if(p.length>0){const i=new Date(Math.min(...p.map(L=>L.getTime()))),T=new Date(Math.max(...p.map(L=>L.getTime()))),G=i.toISOString().split("T")[0],I=T.toISOString().split("T")[0];r[n]={min:G||"",max:I||""}}}}),r},[t,e.fields,d]),E=(r,n)=>{const m={...s};if(!n||n==="")delete m[r];else if(typeof n=="object"&&"min"in n){const o=n.min&&n.min!=="",w=n.max&&n.max!=="";!o&&!w?delete m[r]:m[r]=n}else m[r]=n;h(m)},a=()=>{h({})},b=B(()=>d.length===0?null:d.map(r=>{const n=e.fields[r];if(!n)return null;const m=ie(r,n,u),o=n.type||"text",w=W(o);if(!w)return N(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:r,operation:"filter_ui_render",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"}),null;const v=w==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),A=w==="range"&&!v,k=w==="select",p=s[r],T=typeof p=="object"&&p!==null&&"min"in p?p:{min:"",max:""};if(A){const f=x[r],D=f?.min??0,c=f?.max??100,M=T.min?Number(T.min):D,_=T.max?Number(T.max):c;return R(z,{gap:"tight",style:{gridColumn:"span 2",gridRow:F?void 0:"span 2"},children:[g(ne,{type:"number",label:m,minPlaceholder:S("filter.min",{defaultValue:"Min"}),maxPlaceholder:S("filter.max",{defaultValue:"Max"}),minValue:T.min||"",maxValue:T.max||"",actualMin:D,actualMax:c,onChange:($,K)=>{E(r,{min:$,max:K})},onClear:()=>E(r,void 0)}),g(re,{value:[M,_],min:D,max:c,step:1,onValueChange:$=>{E(r,{min:String($[0]),max:String($[1])})}})]},r)}if(v)return g("div",{style:{gridColumn:"span 2",gridRow:F?void 0:"span 1"},children:g(le,{label:m,rangeFilter:T,onRangeChange:(f,D)=>E(r,{min:f,max:D}),onClear:()=>E(r,void 0),tCrud:S})},r);const I=k&&n.validation&&"options"in n.validation&&n.validation?Array.isArray(n.validation.options)?n.validation.options:typeof n.validation.options=="function"?n.validation.options():[]:[],L=y[r]||t,Y=new Set;L.forEach(f=>{const D=f[r];D!=null&&Y.add(String(D))});const P=[{value:"all",label:S("filter.selectPlaceholder",{defaultValue:"All"})}];if(I.length>0){const f=[],D=[];I.forEach(c=>{const M=typeof c=="string"?c:c.value,_=typeof c=="string"?c:c.label;Y.has(M)?f.push({value:M,label:_}):D.push({value:M,label:_})}),f.sort((c,M)=>c.label.localeCompare(M.label)),D.sort((c,M)=>c.label.localeCompare(M.label)),f.forEach(c=>{P.push({value:c.value,label:H(c.label,u),disabled:!1})}),D.forEach(c=>{P.push({value:c.value,label:H(c.label,u),disabled:!0})})}else Array.from(Y).sort().slice(0,100).forEach(f=>{P.push({value:f,label:f})});return g("div",{style:{gridColumn:"span 2",gridRow:"span 1"},children:g(V,{label:m,value:typeof p=="string"?p:void 0,onValueChange:f=>{E(r,f==="all"||!f?"":String(f))},options:P,placeholder:S("filter.placeholder",{defaultValue:"Filter..."}),clearable:!0})},r)}),[d,e.fields,t,s,u,S,y]);if(!b||b.length===0)return null;const O=b.filter(Boolean),J=Object.keys(s).length>0;return R(ee,{cols:C==="sidebar"?2:[2,4,6,8],gap:"medium",style:{gridAutoRows:"min-content"},children:[O,g(j,{variant:"outline",icon:g(U,{size:18}),onClick:a,disabled:!J,style:{gridColumn:"1 / -1",gridRow:"span 1"},children:S("filter.clear",{defaultValue:"Clear Filters"})})]})}export{he as EntityFilters,oe as matchesFilter};
@@ -1 +1 @@
1
- "use client";import{jsx as a,jsxs as p}from"react/jsx-runtime";import{useEffect as w,useId as Z,useMemo as f}from"react";import{FormProvider as _}from"react-hook-form";import{Button as v,Stack as ee,Spinner as ae}from"@donotdev/components";import{useTranslation as F}from"@donotdev/core";import{DisplayFieldRenderer as oe}from"./DisplayFieldRenderer";import{FormFieldRenderer as ne}from"./FormFieldRenderer";import{UploadProvider as re}from"../contexts/UploadContext";import{useEntityForm as te}from"../forms/hooks/useEntityForm";import{useUnsavedChangesWarning as ie,useConfirmNavigation as se}from"../hooks/useUnsavedChangesWarning";import{useFormStore as le}from"../stores";function I({entity:u,onSubmit:k,t:D,className:N="",submitText:M,loading:R=!1,defaultValues:s,submitVariant:B="primary",secondaryButtonText:m,secondaryButtonVariant:P="outline",onSecondarySubmit:y,viewerRole:U,operation:g=s?"edit":"create",autoSave:E=g==="create",formId:Y,cancelText:h,onCancel:$,warnOnUnsavedChanges:j=!0,unsavedChangesMessage:l}){const z=Z(),n=Y??`entity-form-${u.name}-${z}`,{t:A}=F(u.namespace),{t:e}=F("crud"),c=D||A,b=te(u,{formId:n,operation:g,defaultValues:s,viewerRole:U,t:c,autoSave:E}),{control:W,handleSubmit:x,formState:{errors:q},fields:G,formStatus:d,uploadProgress:r,cleanup:C,isDirty:t,resetForm:H}=b;w(()=>{n&&le.getState().setIsDirty(n,t)},[n,t]),w(()=>C,[C]);const J=f(()=>l||e("messages.unsavedChangesLeave",{defaultValue:"You have unsaved changes. Are you sure you want to leave?"}),[l,e]),K=f(()=>l||e("messages.unsavedChangesDiscard",{defaultValue:"You have unsaved changes. Discard them?"}),[l,e]);ie({isDirty:t,enabled:j,message:J});const L=se(t,K),O=async()=>{t&&!await L()||(H(),$?.())},S=h!==null,T=h??e("form.cancel",{defaultValue:"Cancel"}),Q=R||g==="edit"&&!s,o=f(()=>d==="uploading"?{loading:!0,loadingText:r<100?e("form.uploading",{progress:Math.round(r),defaultValue:`Uploading ${Math.round(r)}%...`}):e("form.processing",{defaultValue:"Processing..."}),progress:r}:d==="validating"?{loading:!0,loadingText:e("form.validating",{defaultValue:"Validating..."})}:d==="submitting"?{loading:!0,loadingText:e("form.saving",{defaultValue:"Saving..."})}:{loading:!1},[d,r,e]);return a(_,{...b,children:a(re,{formId:n,children:p("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},children:[Q&&a(ae,{overlay:!0}),p("form",{onSubmit:x(k),noValidate:!0,className:N,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[G.map(({name:i,config:V,editable:X})=>X?a(ne,{name:i,config:V,control:W,errors:q,t:c},i):a(oe,{name:i,config:V,value:s?.[i],t:c},i)),p(ee,{direction:m||S?"row":"column",gap:"tight",style:{gridColumn:"1 / -1",position:"sticky",bottom:0,backgroundColor:"var(--background)",borderTop:"1px solid var(--border)",paddingTop:"var(--gap-md)",paddingBottom:"var(--gap-md)",zIndex:10,marginTop:"var(--gap-lg)"},children:[S&&T&&a(v,{type:"button",onClick:O,disabled:o.loading,variant:"outline",className:"dndev-w-full",children:T}),m&&a(v,{type:"button",onClick:()=>y&&x(y)(),loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:P,className:"dndev-w-full",children:m}),a(v,{type:"submit",loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:B,className:"dndev-w-full",children:M||e("form.submit",{defaultValue:"Submit"})})]})]})]})})})}var de=I;export{I as EntityFormRenderer,de as default};
1
+ "use client";import{jsx as r,jsxs as f}from"react/jsx-runtime";import{useEffect as T,useId as Q,useMemo as p}from"react";import{FormProvider as X}from"react-hook-form";import{Button as v,Stack as Z,Spinner as ee}from"@donotdev/components";import{useTranslation as I}from"@donotdev/core";import{DisplayFieldRenderer as re}from"./DisplayFieldRenderer";import{FormFieldRenderer as oe}from"./FormFieldRenderer";import{UploadProvider as te}from"../contexts/UploadContext";import{useEntityForm as ne}from"../forms/hooks/useEntityForm";import{useUnsavedChangesWarning as ae,useConfirmNavigation as ie}from"../hooks/useUnsavedChangesWarning";import{useFormStore as se}from"../stores";function de({entity:u,onSubmit:V,t:k,className:D="",submitText:N,loading:j=!1,defaultValues:s,submitVariant:P="primary",secondaryButtonText:m,secondaryButtonVariant:E="outline",onSecondarySubmit:h,viewerRole:L,operation:c=s?"edit":"create",autoSave:R=c==="create",formId:U,cancelText:b,onCancel:$,warnOnUnsavedChanges:B=!0,unsavedChangesMessage:d}){const M=Q(),n=U??`entity-form-${u.name}-${M}`,{t:Y}=I(u.namespace),{t:e}=I("crud"),g=k||Y,y=ne(u,{formId:n,operation:c,defaultValues:s,viewerRole:L,t:g,autoSave:R}),{control:_,handleSubmit:x,formState:{errors:z},fields:A,formStatus:l,uploadProgress:a,cleanup:C,isDirty:i,resetForm:W}=y;T(()=>{n&&se.getState().setIsDirty(n,i)},[n,i]),T(()=>C,[C]);const q=p(()=>d||e("messages.unsavedChangesLeave",{defaultValue:"You have unsaved changes. Are you sure you want to leave?"}),[d,e]),G=p(()=>d||e("messages.unsavedChangesDiscard",{defaultValue:"You have unsaved changes. Discard them?"}),[d,e]);ae({isDirty:i,enabled:B,message:q});const H=ie(i,G),J=async()=>{i&&!await H()||(W(),$?.())},F=b!==null,S=b??e("form.cancel",{defaultValue:"Cancel"}),K=j||c==="edit"&&!s,o=p(()=>l==="uploading"?{loading:!0,loadingText:a<100?e("form.uploading",{progress:Math.round(a),defaultValue:`Uploading ${Math.round(a)}%...`}):e("form.processing",{defaultValue:"Processing..."}),progress:a}:l==="validating"?{loading:!0,loadingText:e("form.validating",{defaultValue:"Validating..."})}:l==="submitting"?{loading:!0,loadingText:e("form.saving",{defaultValue:"Saving..."})}:{loading:!1},[l,a,e]);return r(X,{...y,children:r(te,{formId:n,children:f("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},children:[K&&r(ee,{overlay:!0}),f("form",{onSubmit:x(V),noValidate:!0,className:D,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[A.map(({name:t,config:w,editable:O})=>O?r(oe,{name:t,config:w,control:_,errors:z,t:g},t):r(re,{name:t,config:w,value:s?.[t],t:g},t)),f(Z,{direction:m||F?"row":"column",gap:"tight",style:{gridColumn:"1 / -1",position:"sticky",bottom:0,backgroundColor:"var(--background)",borderTop:"1px solid var(--border)",paddingTop:"var(--gap-md)",paddingBottom:"var(--gap-md)",zIndex:10,marginTop:"var(--gap-lg)"},children:[F&&S&&r(v,{type:"button",onClick:J,disabled:o.loading,variant:"outline",className:"dndev-w-full",children:S}),m&&r(v,{type:"button",onClick:()=>h&&x(h)(),loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:E,className:"dndev-w-full",children:m}),r(v,{type:"submit",loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:P,className:"dndev-w-full",children:N||e("form.submit",{defaultValue:"Submit"})})]})]})]})})})}var Ce=de;export{de as EntityFormRenderer,Ce as default};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{handleError as C}from"@donotdev/core";import{getFieldRegistry as F}from"../FieldRegistry";import{ControlledTextField as T}from"./controlled";import{TextFieldComponent as w}from"./form/fields";import"../builtinFieldTypes";const v=F();function h({name:o,config:e,t:r,...n}){const p=l=>i=>{try{l(i)}catch(a){C(a,{userMessage:`Error updating field ${e.label||o}`,context:{fieldName:o,fieldType:e.type},severity:"warning"})}},s="control"in n&&n.control,d=e.type==="submit"||e.type==="reset";if(s&&!d){const{control:l,errors:i}=n,a=e.options?.fieldSpecific?.placeholder,y={control:l,errors:i,fieldConfig:{...e,label:e.label||o},t:r,placeholder:a,onChange:p(()=>{})},u=v.getControlledComponent(e.type);return u?t(u,{...y}):(C(new Error(`Unregistered field type: ${e.type}`),{userMessage:r("errors.unsupportedFieldType",{type:e.type}),context:{fieldName:o,fieldType:e.type},severity:"warning"}),t(T,{...y,fieldConfig:{...e,type:"text"}}))}const b=s&&d?{name:o,config:e,t:r,value:void 0,onChange:()=>{},error:void 0}:n,{value:f,onChange:x,error:c}=b,m=p(x),g=v.getUncontrolledComponent(e.type);return g?t(g,{name:o,label:e.label||o,value:f,onChange:m,error:c,t:r,config:e,...e.options}):t(w,{label:e.label||o,value:f,onChange:m,error:c||void 0,...e.options})}var E=h;export{h as FormFieldRenderer,E as default};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{handleError as h}from"@donotdev/core";import{getFieldRegistry as T}from"../FieldRegistry";import{ControlledTextField as S}from"./controlled";import{TextFieldComponent as g}from"./form/fields";import"../builtinFieldTypes";const x=T();function w({name:r,config:e,t,...o}){const s=n=>d=>{try{n(d)}catch(C){h(C,{userMessage:`Error updating field ${e.label||r}`,context:{fieldName:r,fieldType:e.type},severity:"warning"})}},i="control"in o&&o.control,p=e.type==="submit"||e.type==="reset";if(i&&!p){const{control:n,errors:d}=o,F=e.options?.fieldSpecific?.placeholder,f={control:n,errors:d,fieldConfig:{...e,label:e.label||r},t,placeholder:F,onChange:s(()=>{})},m=x.getControlledComponent(e.type);return m?l(m,{...f}):(h(new Error(`Unregistered field type: ${e.type}`),{userMessage:t("errors.unsupportedFieldType",{type:e.type}),context:{fieldName:r,fieldType:e.type},severity:"warning"}),l(S,{...f,fieldConfig:{...e,type:"text"}}))}const b=i&&p?{name:r,config:e,t,value:void 0,onChange:()=>{},error:void 0}:o,{value:a,onChange:v,error:u}=b,y=s(v),c=x.getUncontrolledComponent(e.type);return c?l(c,{name:r,label:e.label||r,value:a,onChange:y,error:u,t,config:e,...e.options}):l(g,{label:e.label||r,value:a,onChange:y,error:u||void 0,...e.options})}var R=w;export{w as FormFieldRenderer,R as default};
@@ -1 +1 @@
1
- "use client";import{jsx as d,jsxs as r,Fragment as N}from"react/jsx-runtime";import{useState as w}from"react";import{FormProvider as C}from"react-hook-form";import{Button as s,BUTTON_VARIANT as j,Spinner as k,cn as z,Stack as n,Grid as F}from"@donotdev/components";import{useTranslation as I}from"@donotdev/core";const L=({title:m,onSubmit:c,children:g,formMethods:u,loading:a=!1,submitText:f,cancelText:v,showCancel:p=!1,onCancel:h,variant:o="default",columns:b=1,description:t})=>{const{t:e}=I("dndev"),[i,l]=w(!1),y=f||e("form.submit","Submit"),x=v||e("form.cancel","Cancel"),S=async T=>{l(!0);try{await c(T)}finally{l(!1)}},B={1:"dndev-grid-cols-1",2:"dndev-grid-cols-1 dndev-md:grid-cols-2",3:"dndev-grid-cols-1 dndev-md:grid-cols-2 dndev-md:grid-cols-3",4:"dndev-grid-cols-1 dndev-md:grid-cols-2 dndev-md:grid-cols-4"};return d(C,{...u,children:d("form",{onSubmit:S,className:z("dndev-mx-auto",{default:"dndev-surface",card:"dndev-surface",minimal:""}[o]),style:o!=="minimal"?{padding:"var(--gap-lg)"}:void 0,role:"form","aria-labelledby":"form-title",noValidate:!0,children:r(n,{gap:"large",children:[r(n,{gap:"tight",children:[d("h2",{id:"form-title",style:{fontSize:"var(--font-size-2xl)",fontWeight:600,color:"var(--foreground)"},children:m}),t&&d("p",{style:{color:"var(--muted-foreground)"},children:t})]}),d(F,{cols:b,gap:"medium",className:"dndev-w-full dndev-min-w-0",children:g}),r(n,{direction:"row",align:"center",justify:"end",gap:"medium",style:{paddingTop:"var(--gap-md)",borderTop:"1px solid var(--border)"},children:[p&&d(s,{type:"button",variant:j.OUTLINE,onClick:h,disabled:a||i,children:x}),d(s,{type:"submit",disabled:a||i,style:{minWidth:"120px"},children:a||i?r(N,{children:[d(k,{className:"me-component-gap"}),i?e("form.submitting","Submitting..."):e("form.loading","Loading...")]}):y})]})]})})})};var A=L;export{A as default};
1
+ "use client";import{jsx as e,jsxs as r,Fragment as N}from"react/jsx-runtime";import{useState as j}from"react";import{FormProvider as w}from"react-hook-form";import{Button as s,BUTTON_VARIANT as C,Spinner as F,cn as _,Stack as i,Grid as I}from"@donotdev/components";import{useTranslation as L}from"@donotdev/core";const k=({title:m,onSubmit:c,children:u,formMethods:f,loading:n=!1,submitText:g,cancelText:v,showCancel:p=!1,onCancel:b,variant:l="default",columns:h=1,description:o})=>{const{t:d}=L("dndev"),[t,a]=j(!1),y=g||d("form.submit","Submit"),S=v||d("form.cancel","Cancel"),x=async T=>{a(!0);try{await c(T)}finally{a(!1)}},z={1:"dndev-grid-cols-1",2:"dndev-grid-cols-1 dndev-md:grid-cols-2",3:"dndev-grid-cols-1 dndev-md:grid-cols-2 dndev-md:grid-cols-3",4:"dndev-grid-cols-1 dndev-md:grid-cols-2 dndev-md:grid-cols-4"};return e(w,{...f,children:e("form",{onSubmit:x,className:_("dndev-mx-auto",{default:"dndev-surface",card:"dndev-surface",minimal:""}[l]),style:l!=="minimal"?{padding:"var(--gap-lg)"}:void 0,role:"form","aria-labelledby":"form-title",noValidate:!0,children:r(i,{gap:"large",children:[r(i,{gap:"tight",children:[e("h2",{id:"form-title",style:{fontSize:"var(--font-size-2xl)",fontWeight:600,color:"var(--foreground)"},children:m}),o&&e("p",{style:{color:"var(--muted-foreground)"},children:o})]}),e(I,{cols:h,gap:"medium",className:"dndev-w-full dndev-min-w-0",children:u}),r(i,{direction:"row",align:"center",justify:"end",gap:"medium",style:{paddingTop:"var(--gap-md)",borderTop:"1px solid var(--border)"},children:[p&&e(s,{type:"button",variant:C.OUTLINE,onClick:b,disabled:n||t,children:S}),e(s,{type:"submit",disabled:n||t,style:{minWidth:"120px"},children:n||t?r(N,{children:[e(F,{className:"me-component-gap"}),t?d("form.submitting","Submitting..."):d("form.loading","Loading...")]}):y})]})]})})})};var E=k;export{E as default};
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{AddressFieldComponent as p}from"../../form/fields";import{convertValidationRules as u}from"../types";function C(a){const{control:s,errors:r,fieldConfig:t,t:d}=a,{name:e,label:c,validation:o}=t,l=(t.options||{}).fieldSpecific;return n(f,{name:e,control:s,rules:o?u(o):void 0,render:({field:i})=>n(p,{label:d(c),value:i.value??void 0,onChange:m=>i.onChange(m),error:!!r[e],helperText:r[e]?.message,required:o?.required,enableGoogleMaps:l?.enableGoogleMaps,extractDistrictCode:l?.extractDistrictCode})})}export{C as ControlledAddressField};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{AddressFieldComponent as m}from"../../form/fields";import{convertValidationRules as u}from"../types";function h(s){const{control:a,errors:r,fieldConfig:n,t:d}=s,{name:e,label:c,validation:o}=n,t=(n.options||{}).fieldSpecific;return l(f,{name:e,control:a,rules:o?u(o):void 0,render:({field:i})=>l(m,{label:d(c),value:i.value??void 0,onChange:p=>i.onChange(p),error:!!r[e],helperText:r[e]?.message,required:o?.required,enableGoogleMaps:t?.enableGoogleMaps,extractDistrictCode:t?.extractDistrictCode})})}export{h as ControlledAddressField};
@@ -1 +1 @@
1
- "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{DateFieldComponent as p}from"../../form/fields";import{convertValidationRules as C}from"../types";function h(a){const{control:n,errors:t,fieldConfig:i,t:m}=a,{name:e,label:d,validation:o,type:s}=i,u={date:"date","datetime-local":"datetime-local",month:"month",time:"time",week:"week"}[s]||"date";return l(f,{name:e,control:n,rules:o?C(o):void 0,render:({field:r})=>l(p,{...r,label:m(d),value:r.value??null,onChange:c=>r.onChange(c),error:!!t[e],helperText:t[e]?.message,required:o?.required,mode:u})})}export{h as ControlledDateField};
1
+ "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{DateFieldComponent as f}from"../../form/fields";import{convertValidationRules as C}from"../types";function j(a){const{control:l,errors:r,fieldConfig:m,t:i}=a,{name:e,label:d,validation:o,type:s}=m,c={date:"date","datetime-local":"datetime-local",month:"month",time:"time",week:"week"}[s]||"date";return n(p,{name:e,control:l,rules:o?C(o):void 0,render:({field:t})=>n(f,{...t,label:i(d),value:t.value??null,onChange:u=>t.onChange(u),error:!!r[e],helperText:r[e]?.message,required:o?.required,mode:c})})}export{j as ControlledDateField};
@@ -1 +1 @@
1
- "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as c}from"react-hook-form";import{GeoPointFieldComponent as f}from"../../form/fields";import{convertValidationRules as p}from"../types";function C(a){const{control:i,errors:t,fieldConfig:s,t:m}=a,{name:o,label:d,validation:n}=s;return l(c,{name:o,control:i,rules:n?p(n):void 0,render:({field:e})=>{const g=r=>{if("target"in r)try{const u=JSON.parse(r.target.value);e.onChange(u)}catch{e.onChange({lat:0,lng:0})}else e.onChange(r||{lat:0,lng:0})};return l(f,{label:m(d),value:e.value||{lat:0,lng:0},onChange:g,error:!!t[o],helperText:t[o]?.message,required:n?.required})}})}export{C as ControlledGeoPointField};
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{GeoPointFieldComponent as p}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:g}=l,{name:n,label:m,validation:o}=s;return a(u,{name:n,control:i,rules:o?C(o):void 0,render:({field:e})=>{const c=r=>{if("target"in r)try{const d=JSON.parse(r.target.value);e.onChange(d)}catch{e.onChange({lat:0,lng:0})}else e.onChange(r||{lat:0,lng:0})};return a(p,{label:g(m),value:e.value||{lat:0,lng:0},onChange:c,error:!!t[n],helperText:t[n]?.message,required:o?.required})}})}export{b as ControlledGeoPointField};
@@ -1 +1 @@
1
- "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{MapFieldComponent as f}from"../../form/fields";import{convertValidationRules as g}from"../types";function C(l){const{control:i,errors:t,fieldConfig:s,t:m}=l,{name:r,label:d,validation:o}=s;return a(p,{name:r,control:i,rules:o?g(o):void 0,render:({field:e})=>{const u=n=>{if("target"in n)try{const c=JSON.parse(n.target.value);e.onChange(c)}catch{e.onChange({})}else e.onChange(n||{})};return a(f,{label:m(d),value:e.value||{},onChange:u,error:!!t[r],helperText:t[r]?.message,required:o?.required})}})}export{C as ControlledMapField};
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{MapFieldComponent as g}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:m}=l,{name:r,label:c,validation:n}=s;return a(u,{name:r,control:i,rules:n?C(n):void 0,render:({field:e})=>{const p=o=>{if("target"in o)try{const d=JSON.parse(o.target.value);e.onChange(d)}catch{e.onChange({})}else e.onChange(o||{})};return a(g,{label:m(c),value:e.value||{},onChange:p,error:!!t[r],helperText:t[r]?.message,required:n?.required})}})}export{b as ControlledMapField};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{MultiInputTextFieldComponent as f}from"../../form/fields";import{convertValidationRules as C}from"../types";function g(n){const{control:l,errors:v,fieldConfig:i,t:s}=n,{name:u,label:m,validation:r,options:c={}}=i;return t(p,{name:u,control:l,rules:r?C(r):void 0,render:({field:e})=>{const d=o=>{if(Array.isArray(o))e.onChange(o);else try{const a=JSON.parse(o.target.value);e.onChange(Array.isArray(a)?a:[])}catch{e.onChange([])}};return t(f,{label:s(m),value:Array.isArray(e.value)?e.value:[],onChange:d,required:r?.required,className:c.className})}})}export{g as ControlledMultiInputField};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{MultiInputTextFieldComponent as C}from"../../form/fields";import{convertValidationRules as g}from"../types";function x(a){const{control:l,errors:h,fieldConfig:s,t:i}=a,{name:u,label:c,validation:e,options:m={}}=s;return t(d,{name:u,control:l,rules:e?g(e):void 0,render:({field:r})=>{const p=n=>{if(Array.isArray(n))r.onChange(n);else try{const o=JSON.parse(n.target.value);r.onChange(Array.isArray(o)?o:[])}catch{r.onChange([])}};return t(C,{label:i(c),value:Array.isArray(r.value)?r.value:[],onChange:p,required:e?.required,className:m.className})}})}export{x as ControlledMultiInputField};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{RichTextComponent as f}from"../../form/fields";import{convertValidationRules as h}from"../types";function C(n){const{control:i,errors:r,fieldConfig:s,t:m,placeholder:c}=n,{name:e,label:d,validation:o,options:l={}}=s;return t(u,{name:e,control:i,rules:o?h(o):void 0,render:({field:a})=>t(f,{label:m(d),value:a.value??"",onChange:p=>a.onChange(p),error:r[e]?.message,helperText:r[e]?.message,required:o?.required,placeholder:c||l.placeholder,className:l.className})})}export{C as ControlledRichTextField};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{RichTextComponent as h}from"../../form/fields";import{convertValidationRules as f}from"../types";function R(a){const{control:i,errors:r,fieldConfig:s,t:m,placeholder:c}=a,{name:e,label:d,validation:o,options:l={}}=s;return t(u,{name:e,control:i,rules:o?f(o):void 0,render:({field:n})=>t(h,{label:m(d),value:n.value??"",onChange:p=>n.onChange(p),error:r[e]?.message,helperText:r[e]?.message,required:o?.required,placeholder:c||l.placeholder,className:l.className})})}export{R as ControlledRichTextField};
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{TimestampFieldComponent as u}from"../../form/fields";import{convertValidationRules as f}from"../types";function c(t){const{control:a,errors:l,fieldConfig:i,t:m}=t,{name:e,label:s,validation:r}=i;return n(p,{name:e,control:a,rules:r?f(r):void 0,render:({field:o})=>n(u,{...o,label:m(s),value:o.value??null,onChange:d=>o.onChange(d),error:!!l[e],helperText:l[e]?.message,required:r?.required})})}export{c as ControlledTimestampField};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{TimestampFieldComponent as p}from"../../form/fields";import{convertValidationRules as c}from"../types";function x(l){const{control:i,errors:n,fieldConfig:a,t:m}=l,{name:e,label:s,validation:r}=a;return t(d,{name:e,control:i,rules:r?c(r):void 0,render:({field:o})=>t(p,{...o,label:m(s),value:o.value??null,onChange:u=>o.onChange(u),error:!!n[e],helperText:n[e]?.message,required:r?.required})})}export{x as ControlledTimestampField};
@@ -1 +1 @@
1
- import{ControlledAddressField as o}from"./ControlledAddressField";import{ControlledDateField as l}from"./ControlledDateField";import{ControlledGeoPointField as e}from"./ControlledGeoPointField";import{ControlledMapField as t}from"./ControlledMapField";import{ControlledMultiInputField as d}from"./ControlledMultiInputField";import{ControlledRichTextField as r}from"./ControlledRichTextField";import{ControlledTimestampField as i}from"./ControlledTimestampField";export{o as ControlledAddressField,l as ControlledDateField,e as ControlledGeoPointField,t as ControlledMapField,d as ControlledMultiInputField,r as ControlledRichTextField,i as ControlledTimestampField};
1
+ import{ControlledAddressField as l}from"./ControlledAddressField";import{ControlledDateField as t}from"./ControlledDateField";import{ControlledGeoPointField as i}from"./ControlledGeoPointField";import{ControlledMapField as m}from"./ControlledMapField";import{ControlledMultiInputField as x}from"./ControlledMultiInputField";import{ControlledRichTextField as C}from"./ControlledRichTextField";import{ControlledTimestampField as a}from"./ControlledTimestampField";export{l as ControlledAddressField,t as ControlledDateField,i as ControlledGeoPointField,m as ControlledMapField,x as ControlledMultiInputField,C as ControlledRichTextField,a as ControlledTimestampField};
@@ -1 +1 @@
1
- "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{DocumentFieldComponent as f}from"../../form/fields";import{convertValidationRules as c}from"../types";function g(i){const{control:m,errors:r,fieldConfig:n,t:s}=i,{name:e,label:u,validation:o}=n,t=n.options||{};return l(p,{name:e,control:m,rules:o?c(o):void 0,render:({field:a})=>l(f,{name:e,label:s(u),value:a.value??null,onChange:d=>a.onChange(d),error:!!r[e],helperText:r[e]?.message,required:o?.required,multiple:!1,maxFiles:1,maxSize:t.maxSize,storagePath:t.storagePath})})}export{g as ControlledDocumentField};
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{DocumentFieldComponent as p}from"../../form/fields";import{convertValidationRules as f}from"../types";function v(i){const{control:m,errors:r,fieldConfig:n,t:s}=i,{name:e,label:u,validation:o}=n,t=n.options||{};return a(d,{name:e,control:m,rules:o?f(o):void 0,render:({field:l})=>a(p,{name:e,label:s(u),value:l.value??null,onChange:c=>l.onChange(c),error:!!r[e],helperText:r[e]?.message,required:o?.required,multiple:!1,maxFiles:1,maxSize:t.maxSize,storagePath:t.storagePath})})}export{v as ControlledDocumentField};
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{FileFieldComponent as f}from"../../form/fields";import{convertValidationRules as c}from"../types";function g(t){const{control:m,errors:r,fieldConfig:l,t:s}=t,{name:e,label:u,validation:o}=l,a=l.options||{};return n(p,{name:e,control:m,rules:o?c(o):void 0,render:({field:i})=>n(f,{name:e,label:s(u),value:i.value??null,onChange:d=>i.onChange(d),error:!!r[e],helperText:r[e]?.message,required:o?.required,multiple:!1,maxFiles:1,maxSize:a.maxSize,storagePath:a.storagePath})})}export{g as ControlledFileField};
1
+ "use client";import{jsx as i}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{FileFieldComponent as c}from"../../form/fields";import{convertValidationRules as f}from"../types";function F(a){const{control:s,errors:r,fieldConfig:n,t:m}=a,{name:e,label:u,validation:o}=n,l=n.options||{};return i(p,{name:e,control:s,rules:o?f(o):void 0,render:({field:t})=>i(c,{name:e,label:m(u),value:t.value??null,onChange:d=>t.onChange(d),error:!!r[e],helperText:r[e]?.message,required:o?.required,multiple:!1,maxFiles:1,maxSize:l.maxSize,storagePath:l.storagePath})})}export{F as ControlledFileField};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{ImageFieldComponent as f}from"../../form/fields";import{convertValidationRules as g}from"../types";function c(i){const{control:m,errors:r,fieldConfig:a,t:s}=i,{name:e,label:u,validation:o}=a,l=a.options||{};return t(p,{name:e,control:m,rules:o?g(o):void 0,render:({field:n})=>t(f,{name:e,label:s(u),value:n.value??null,onChange:d=>n.onChange(d),error:!!r[e],helperText:r[e]?.message,required:o?.required,multiple:!1,maxFiles:1,maxSize:l.maxSize,storagePath:l.storagePath})})}export{c as ControlledImageField};
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{ImageFieldComponent as c}from"../../form/fields";import{convertValidationRules as f}from"../types";function v(i){const{control:m,errors:r,fieldConfig:n,t:s}=i,{name:e,label:u,validation:o}=n,t=n.options||{};return a(p,{name:e,control:m,rules:o?f(o):void 0,render:({field:l})=>a(c,{name:e,label:s(u),value:l.value??null,onChange:d=>l.onChange(d),error:!!r[e],helperText:r[e]?.message,required:o?.required,multiple:!1,maxFiles:1,maxSize:t.maxSize,storagePath:t.storagePath})})}export{v as ControlledImageField};
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{DocumentFieldComponent as v}from"../../form/fields";import{convertValidationRules as f}from"../types";function x(i){const{control:m,errors:l,fieldConfig:t,t:s}=i,{name:r,label:u,validation:o}=t,a=t.options||{};return n(p,{name:r,control:m,rules:o?f(o):void 0,render:({field:e})=>{const d=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return n(v,{name:r,label:s(u),value:d,onChange:c=>e.onChange(c),error:!!l[r],helperText:l[r]?.message,required:o?.required,multiple:!0,maxFiles:a.maxFiles??10,maxSize:a.maxSize,storagePath:a.storagePath})}})}export{x as ControlledMultiDocumentField};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as x}from"react-hook-form";import{DocumentFieldComponent as d}from"../../form/fields";import{convertValidationRules as v}from"../types";function F(i){const{control:u,errors:t,fieldConfig:a,t:m}=i,{name:r,label:s,validation:o}=a,n=a.options||{};return l(x,{name:r,control:u,rules:o?v(o):void 0,render:({field:e})=>{const c=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return l(d,{name:r,label:m(s),value:c,onChange:p=>e.onChange(p),error:!!t[r],helperText:t[r]?.message,required:o?.required,multiple:!0,maxFiles:n.maxFiles??10,maxSize:n.maxSize,storagePath:n.storagePath})}})}export{F as ControlledMultiDocumentField};
@@ -1 +1 @@
1
- "use client";import{jsx as i}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{FileFieldComponent as v}from"../../form/fields";import{convertValidationRules as x}from"../types";function c(n){const{control:s,errors:a,fieldConfig:t,t:m}=n,{name:r,label:u,validation:o}=t,l=t.options||{};return i(f,{name:r,control:s,rules:o?x(o):void 0,render:({field:e})=>{const d=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return i(v,{name:r,label:m(u),value:d,onChange:p=>e.onChange(p),error:!!a[r],helperText:a[r]?.message,required:o?.required,multiple:!0,maxFiles:l.maxFiles??10,maxSize:l.maxSize,storagePath:l.storagePath})}})}export{c as ControlledMultiFileField};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as x}from"react-hook-form";import{FileFieldComponent as d}from"../../form/fields";import{convertValidationRules as v}from"../types";function f(i){const{control:s,errors:t,fieldConfig:a,t:u}=i,{name:r,label:m,validation:o}=a,n=a.options||{};return l(x,{name:r,control:s,rules:o?v(o):void 0,render:({field:e})=>{const p=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return l(d,{name:r,label:u(m),value:p,onChange:c=>e.onChange(c),error:!!t[r],helperText:t[r]?.message,required:o?.required,multiple:!0,maxFiles:n.maxFiles??10,maxSize:n.maxSize,storagePath:n.storagePath})}})}export{f as ControlledMultiFileField};
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as g}from"react-hook-form";import{ImageFieldComponent as f}from"../../form/fields";import{convertValidationRules as v}from"../types";function x(i){const{control:m,errors:l,fieldConfig:t,t:s}=i,{name:r,label:u,validation:o}=t,a=t.options||{};return n(g,{name:r,control:m,rules:o?v(o):void 0,render:({field:e})=>{const d=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return n(f,{name:r,label:s(u),value:d,onChange:p=>e.onChange(p),error:!!l[r],helperText:l[r]?.message,required:o?.required,multiple:!0,maxFiles:a.maxFiles??10,maxSize:a.maxSize,storagePath:a.storagePath})}})}export{x as ControlledMultiImageField};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as g}from"react-hook-form";import{ImageFieldComponent as x}from"../../form/fields";import{convertValidationRules as d}from"../types";function F(i){const{control:m,errors:n,fieldConfig:t,t:s}=i,{name:r,label:u,validation:o}=t,a=t.options||{};return l(g,{name:r,control:m,rules:o?d(o):void 0,render:({field:e})=>{const p=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return l(x,{name:r,label:s(u),value:p,onChange:c=>e.onChange(c),error:!!n[r],helperText:n[r]?.message,required:o?.required,multiple:!0,maxFiles:a.maxFiles??10,maxSize:a.maxSize,storagePath:a.storagePath})}})}export{F as ControlledMultiImageField};
@@ -1 +1 @@
1
- import{ControlledDocumentField as l}from"./ControlledDocumentField";import{ControlledFileField as o}from"./ControlledFileField";import{ControlledImageField as e}from"./ControlledImageField";import{ControlledMultiDocumentField as t}from"./ControlledMultiDocumentField";import{ControlledMultiFileField as i}from"./ControlledMultiFileField";import{ControlledMultiImageField as r}from"./ControlledMultiImageField";export{l as ControlledDocumentField,o as ControlledFileField,e as ControlledImageField,t as ControlledMultiDocumentField,i as ControlledMultiFileField,r as ControlledMultiImageField};
1
+ import{ControlledDocumentField as l}from"./ControlledDocumentField";import{ControlledFileField as t}from"./ControlledFileField";import{ControlledImageField as i}from"./ControlledImageField";import{ControlledMultiDocumentField as n}from"./ControlledMultiDocumentField";import{ControlledMultiFileField as f}from"./ControlledMultiFileField";import{ControlledMultiImageField as x}from"./ControlledMultiImageField";export{l as ControlledDocumentField,t as ControlledFileField,i as ControlledImageField,n as ControlledMultiDocumentField,f as ControlledMultiFileField,x as ControlledMultiImageField};
@@ -1 +1 @@
1
- import{convertValidationRules as o,convertPatternToRegex as e}from"./types";export*from"./input";export*from"./select";export*from"./file";export*from"./complex";export{e as convertPatternToRegex,o as convertValidationRules};
1
+ import{convertValidationRules as e,convertPatternToRegex as t}from"./types";export*from"./input";export*from"./select";export*from"./file";export*from"./complex";export{t as convertPatternToRegex,e as convertValidationRules};
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as m}from"react-hook-form";import{CheckboxFieldComponent as f}from"../../form/fields";import{convertValidationRules as u}from"../types";function C(t){const{control:l,errors:p,fieldConfig:i,t:a}=t,{name:d,label:e,validation:o}=i,c=typeof e=="string"?a(e):e;return n(m,{name:d,control:l,rules:o?u(o):void 0,render:({field:r})=>n(f,{label:c,checked:!!r.value,onChange:s=>r.onChange(s.target.checked),required:o?.required})})}export{C as ControlledCheckboxField};
1
+ "use client";import{jsx as r}from"react/jsx-runtime";import{Controller as s}from"react-hook-form";import{CheckboxFieldComponent as u}from"../../form/fields";import{convertValidationRules as C}from"../types";function x(t){const{control:l,errors:f,fieldConfig:i,t:a}=t,{name:c,label:e,validation:o}=i,d=typeof e=="string"?a(e):e;return r(s,{name:c,control:l,rules:o?C(o):void 0,render:({field:n})=>r(u,{label:d,checked:!!n.value,onChange:m=>n.onChange(m.target.checked),required:o?.required})})}export{x as ControlledCheckboxField};
@@ -1 +1 @@
1
- "use client";import{jsx as u}from"react/jsx-runtime";import{Controller as g}from"react-hook-form";import{CurrencyFieldComponent as h}from"../../form/fields";import{convertValidationRules as y}from"../types";function N(c){const{control:s,errors:n,fieldConfig:a,t:d,placeholder:m}=c,{name:o,label:p,validation:l}=a,t=(a.options||{}).fieldSpecific;return u(g,{name:o,control:s,rules:l?y(l):void 0,render:({field:e})=>{const f=v=>{const r=v.target.value;if(r==null||r===""){e.onChange(null);return}const i=typeof r=="number"?r/100:parseFloat(String(r))/100;isNaN(i)?e.onChange(null):e.onChange(i)},C=e.value!=null&&!isNaN(e.value)?Math.round(e.value*100):void 0;return u(h,{label:d(p),value:C,onChange:f,currency:t?.currency||"EUR",locale:t?.locale,error:!!n[o],helperText:n[o]?.message,required:l?.required,placeholder:m})}})}export{N as ControlledCurrencyField};
1
+ "use client";import{jsx as c}from"react/jsx-runtime";import{Controller as g}from"react-hook-form";import{CurrencyFieldComponent as v}from"../../form/fields";import{convertValidationRules as y}from"../types";function V(i){const{control:s,errors:l,fieldConfig:t,t:d,placeholder:p}=i,{name:o,label:m,validation:r}=t,a=(t.options||{}).fieldSpecific;return c(g,{name:o,control:s,rules:r?y(r):void 0,render:({field:e})=>{const f=h=>{const n=h.target.value;if(n==null||n===""){e.onChange(null);return}const u=typeof n=="number"?n/100:parseFloat(String(n))/100;isNaN(u)?e.onChange(null):e.onChange(u)},C=e.value!=null&&!isNaN(e.value)?Math.round(e.value*100):void 0;return c(v,{label:d(m),value:C,onChange:f,currency:a?.currency||"EUR",locale:a?.locale,error:!!l[o],helperText:l[o]?.message,required:r?.required,placeholder:p})}})}export{V as ControlledCurrencyField};
@@ -0,0 +1,7 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledDurationField - Controlled component for duration (minutes) with preset chips + custom slider
5
+ */
6
+ export declare function ControlledDurationField(props: ControlledFieldProps): ReactElement;
7
+ //# sourceMappingURL=ControlledDurationField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledDurationField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/input/ControlledDurationField.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CA8Bd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as c}from"react-hook-form";import{DurationFieldComponent as u}from"../../form/fields";import{convertValidationRules as f}from"../types";function h(s){const{control:m,errors:i,fieldConfig:t,t:l}=s,{name:e,label:d,validation:o}=t,n=(t.options||{}).fieldSpecific;return a(c,{name:e,control:m,rules:o?f(o):void 0,render:({field:r})=>a(u,{label:l(d),value:r.value??0,onChange:p=>r.onChange(p),error:!!i[e],helperText:i[e]?.message,required:o?.required,disabled:r.disabled,min:n?.min??0,max:n?.max??480,step:n?.step??5,t:l})})}export{h as ControlledDurationField};
@@ -1 +1 @@
1
- "use client";import{jsx as o}from"react/jsx-runtime";import{Controller as C}from"react-hook-form";import{GdprConsentFieldComponent as u}from"../../form/fields";import{convertValidationRules as h}from"../types";function v(i){const{control:a,errors:y,fieldConfig:l}=i,{name:s,validation:n,options:d={}}=l,r=d.fieldSpecific,c=r?.privacyPolicyPath||"/legal/privacy",p=r?.termsPath||"/legal/terms";return o(C,{name:s,control:a,rules:n?h(n):void 0,render:({field:t})=>{const e=t.value,m=typeof e=="object"&&e!==null?!!e.gdprConsent:!!e;return o(u,{checked:m,onChange:g=>{if(g.target.checked){const f=new Date().toISOString().split("T")[0];t.onChange({gdprConsent:!0,gdprConsentDate:new Date().toISOString(),gdprConsentVersion:f})}else t.onChange(!1)},required:n?.required,privacyPolicyPath:c,termsPath:p})}})}export{v as ControlledGdprConsentField};
1
+ "use client";import{jsx as r}from"react/jsx-runtime";import{Controller as m}from"react-hook-form";import{GdprConsentFieldComponent as u}from"../../form/fields";import{convertValidationRules as f}from"../types";function D(c){const{control:a,errors:y,fieldConfig:i}=c,{name:s,validation:n,options:l={}}=i,t=l.fieldSpecific,d=t?.privacyPolicyPath||"/legal/privacy",p=t?.termsPath||"/legal/terms";return r(m,{name:s,control:a,rules:n?f(n):void 0,render:({field:o})=>{const e=o.value,h=typeof e=="object"&&e!==null?!!e.gdprConsent:!!e;return r(u,{checked:h,onChange:C=>{if(C.target.checked){const g=new Date().toISOString().split("T")[0];o.onChange({gdprConsent:!0,gdprConsentDate:new Date().toISOString(),gdprConsentVersion:g})}else o.onChange(!1)},required:n?.required,privacyPolicyPath:d,termsPath:p})}})}export{D as ControlledGdprConsentField};
@@ -1 +1 @@
1
- "use client";import{jsx as m}from"react/jsx-runtime";import{Controller as g}from"react-hook-form";import{NumberFieldComponent as v}from"../../form/fields";import{convertValidationRules as C}from"../types";function h(u){const{control:c,errors:t,fieldConfig:n,t:d,placeholder:N}=u,{name:o,label:p,validation:e}=n,i=n.options||{},a=i.fieldSpecific;return m(g,{name:o,control:c,rules:e?C(e):void 0,render:({field:r})=>{const f=l=>{if(l.target.value===""||l.target.value===null){r.onChange(null);return}try{const s=parseFloat(l.target.value);isNaN(s)||r.onChange(s)}catch{r.onChange(0)}};return m(v,{...r,label:d(p),value:r.value??void 0,onChange:f,error:!!t[o],helperText:t[o]?.message,required:e?.required,min:e?.min,max:e?.max,step:a?.mask==="currency"?.01:a?.mask==="mileage"?1:void 0,mask:a?.mask||"number",className:i.className})}})}export{h as ControlledNumberField};
1
+ "use client";import{jsx as m}from"react/jsx-runtime";import{Controller as g}from"react-hook-form";import{NumberFieldComponent as h}from"../../form/fields";import{convertValidationRules as C}from"../types";function F(u){const{control:c,errors:t,fieldConfig:l,t:d,placeholder:v}=u,{name:r,label:p,validation:e}=l,i=l.options||{},o=i.fieldSpecific;return m(g,{name:r,control:c,rules:e?C(e):void 0,render:({field:n})=>{const f=a=>{if(a.target.value===""||a.target.value===null){n.onChange(null);return}try{const s=parseFloat(a.target.value);isNaN(s)||n.onChange(s)}catch{n.onChange(0)}};return m(h,{...n,label:d(p),value:n.value??void 0,onChange:f,error:!!t[r],helperText:t[r]?.message,required:e?.required,min:e?.min,max:e?.max,step:o?.mask==="currency"?.01:o?.mask==="mileage"?1:void 0,mask:o?.mask||"number",className:i.className})}})}export{F as ControlledNumberField};
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{PasswordFieldComponent as u}from"../../form/fields";import{convertValidationRules as f}from"../types";function h(s){const{control:i,errors:l,fieldConfig:t,t:d,placeholder:m}=s,{name:e,label:c,validation:o,options:a={}}=t;return n(p,{name:e,control:i,rules:o?f(o):void 0,render:({field:r})=>n(u,{...r,label:d(c),value:r.value??"",onChange:r.onChange,error:!!l[e],helperText:l[e]?.message,required:o?.required,placeholder:m||a.placeholder,className:a.className})})}export{h as ControlledPasswordField};
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{PasswordFieldComponent as u}from"../../form/fields";import{convertValidationRules as f}from"../types";function x(t){const{control:s,errors:l,fieldConfig:i,t:d,placeholder:m}=t,{name:e,label:c,validation:o,options:n={}}=i;return a(p,{name:e,control:s,rules:o?f(o):void 0,render:({field:r})=>a(u,{...r,label:d(c),value:r.value??"",onChange:r.onChange,error:!!l[e],helperText:l[e]?.message,required:o?.required,placeholder:m||n.placeholder,className:n.className})})}export{x as ControlledPasswordField};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{PhoneNumberComponent as f}from"../../form/fields";import{convertValidationRules as p}from"../types";function c(a){const{control:l,errors:n,fieldConfig:i,t:s}=a,{name:e,label:m,validation:r}=i;return t(d,{name:e,control:l,rules:r?p(r):void 0,render:({field:o})=>t(f,{label:s(m),value:typeof o.value=="string"?o.value:"",onChange:u=>o.onChange(u.target.value||""),error:n[e]?.message,helperText:n[e]?.message,required:r?.required})})}export{c as ControlledPhoneField};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{PhoneNumberComponent as p}from"../../form/fields";import{convertValidationRules as c}from"../types";function h(l){const{control:a,errors:n,fieldConfig:i,t:m}=l,{name:e,label:s,validation:r}=i;return t(d,{name:e,control:a,rules:r?c(r):void 0,render:({field:o})=>t(p,{label:m(s),value:typeof o.value=="string"?o.value:"",onChange:u=>o.onChange(u.target.value||""),error:n[e]?.message,helperText:n[e]?.message,required:r?.required})})}export{h as ControlledPhoneField};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as C}from"react-hook-form";import{PriceFieldComponent as h}from"../../form/fields";import{convertValidationRules as v}from"../types";function g(a){const{control:s,errors:i,fieldConfig:l,t:c,placeholder:d}=a,{name:e,label:u,validation:r}=l,o=(l.options||{}).fieldSpecific;return t(C,{name:e,control:s,rules:r?v(r):void 0,render:({field:n})=>{const p=n.value,f=m=>{n.onChange(m)};return t(h,{label:c(u),value:p??void 0,onChange:f,error:!!i[e],helperText:i[e]?.message,required:r?.required,placeholder:d,defaultCurrency:o?.defaultCurrency??"EUR",optionsTitle:o?.optionsTitle,currencies:o?.currencies})}})}export{g as ControlledPriceField};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as C}from"react-hook-form";import{PriceFieldComponent as h}from"../../form/fields";import{convertValidationRules as g}from"../types";function q(c){const{control:s,errors:n,fieldConfig:i,t:a,placeholder:d}=c,{name:e,label:u,validation:o}=i,r=(i.options||{}).fieldSpecific;return l(C,{name:e,control:s,rules:o?g(o):void 0,render:({field:t})=>{const p=t.value,f=m=>{t.onChange(m)};return l(h,{label:a(u),value:p??void 0,onChange:f,error:!!n[e],helperText:n[e]?.message,required:o?.required,placeholder:d,defaultCurrency:r?.defaultCurrency??"EUR",optionsTitle:r?.optionsTitle,currencies:r?.currencies})}})}export{q as ControlledPriceField};