@donotdev/crud 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/CrudService.d.ts +9 -0
  2. package/dist/CrudService.d.ts.map +1 -1
  3. package/dist/CrudService.js +2 -2
  4. package/dist/CrudStore.d.ts.map +1 -1
  5. package/dist/CrudStore.js +1 -1
  6. package/dist/FieldRegistry.d.ts +2 -12
  7. package/dist/FieldRegistry.d.ts.map +1 -1
  8. package/dist/FieldRegistry.js +1 -1
  9. package/dist/components/CrudButton.d.ts +1 -0
  10. package/dist/components/CrudButton.d.ts.map +1 -1
  11. package/dist/components/CrudCard.d.ts +1 -1
  12. package/dist/components/CrudCard.d.ts.map +1 -1
  13. package/dist/components/CrudCard.js +1 -1
  14. package/dist/components/DisplayFieldRenderer.d.ts +1 -0
  15. package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
  16. package/dist/components/DisplayFieldRenderer.js +1 -1
  17. package/dist/components/DisplayThumbnail.d.ts +1 -9
  18. package/dist/components/DisplayThumbnail.d.ts.map +1 -1
  19. package/dist/components/DisplayThumbnail.js +1 -1
  20. package/dist/components/EntityFilters.d.ts +1 -0
  21. package/dist/components/EntityFilters.d.ts.map +1 -1
  22. package/dist/components/FormFieldRenderer.d.ts +1 -0
  23. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  24. package/dist/components/FormFieldRenderer.js +1 -1
  25. package/dist/components/FormLayout.d.ts +1 -0
  26. package/dist/components/FormLayout.d.ts.map +1 -1
  27. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  28. package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -1
  29. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  30. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  31. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  32. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  33. package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -1
  34. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  35. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  36. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  37. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  38. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  39. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  40. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  41. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  42. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  43. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  44. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  45. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  46. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  47. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  48. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  49. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  50. package/dist/components/controlled/input/ControlledTextField.d.ts +5 -5
  51. package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -1
  52. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  53. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  54. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  55. package/dist/components/controlled/select/ControlledDropdownField.d.ts +2 -4
  56. package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -1
  57. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  58. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +2 -4
  59. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -1
  60. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  61. package/dist/components/controlled/select/ControlledRadioField.d.ts +2 -4
  62. package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -1
  63. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  64. package/dist/components/controlled/select/ControlledReferenceField.js +1 -1
  65. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  66. package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -1
  67. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  68. package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -1
  69. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  70. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -1
  72. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  73. package/dist/components/form/fields/CurrencyFieldComponent.d.ts.map +1 -1
  74. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  75. package/dist/components/form/fields/DateFieldComponent.d.ts +2 -2
  76. package/dist/components/form/fields/DateFieldComponent.d.ts.map +1 -1
  77. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  78. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  79. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  80. package/dist/components/form/fields/ImageFieldComponent.d.ts.map +1 -1
  81. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  82. package/dist/components/form/fields/TextFieldComponent.d.ts +2 -2
  83. package/dist/components/form/fields/TextFieldComponent.d.ts.map +1 -1
  84. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  85. package/dist/components/form/fields/TimestampFieldComponent.d.ts +2 -2
  86. package/dist/components/form/fields/TimestampFieldComponent.d.ts.map +1 -1
  87. package/dist/contexts/UploadContext.d.ts +1 -0
  88. package/dist/contexts/UploadContext.d.ts.map +1 -1
  89. package/dist/fieldTypeRegistry.store.d.ts.map +1 -1
  90. package/dist/fieldTypeRegistry.store.js +1 -1
  91. package/dist/fieldTypeRegistry.types.d.ts +4 -0
  92. package/dist/fieldTypeRegistry.types.d.ts.map +1 -1
  93. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  94. package/dist/forms/hooks/useEntityForm.js +1 -1
  95. package/dist/forms/types.d.ts +5 -0
  96. package/dist/forms/types.d.ts.map +1 -1
  97. package/dist/forms/utils/buildInitialValues.d.ts.map +1 -1
  98. package/dist/forms/utils/buildInitialValues.js +1 -1
  99. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  100. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  101. package/dist/forms/utils/isFieldEditable.d.ts +7 -1
  102. package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
  103. package/dist/forms/utils/isFieldEditable.js +1 -1
  104. package/dist/hooks/index.d.ts +2 -0
  105. package/dist/hooks/index.d.ts.map +1 -1
  106. package/dist/hooks/index.js +1 -1
  107. package/dist/hooks/useCrudFilters.d.ts +2 -0
  108. package/dist/hooks/useCrudFilters.d.ts.map +1 -1
  109. package/dist/hooks/useCrudPageSize.d.ts +29 -0
  110. package/dist/hooks/useCrudPageSize.d.ts.map +1 -0
  111. package/dist/hooks/useCrudPageSize.js +1 -0
  112. package/dist/hooks/useEntityFavorites.d.ts +2 -0
  113. package/dist/hooks/useEntityFavorites.d.ts.map +1 -1
  114. package/dist/hooks/useFileUpload.d.ts.map +1 -1
  115. package/dist/hooks/useFileUpload.js +1 -1
  116. package/dist/hooks/useReferenceResolver.d.ts +1 -1
  117. package/dist/hooks/useReferenceResolver.d.ts.map +1 -1
  118. package/dist/hooks/useReferenceResolver.js +1 -1
  119. package/dist/hooks/useRelatedItems.d.ts +2 -0
  120. package/dist/hooks/useRelatedItems.d.ts.map +1 -1
  121. package/dist/index.d.ts +3 -3
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -1
  124. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
  125. package/dist/registerBuiltinFieldTypes.js +1 -1
  126. package/dist/stores/FormStore.d.ts +2 -0
  127. package/dist/stores/FormStore.d.ts.map +1 -1
  128. package/dist/stores/FormStore.js +1 -1
  129. package/dist/stores/UploadStore.d.ts +9 -3
  130. package/dist/stores/UploadStore.d.ts.map +1 -1
  131. package/dist/stores/UploadStore.js +1 -1
  132. package/dist/symbol-index.json +1 -0
  133. package/dist/tsconfig.tsbuildinfo +1 -1
  134. package/dist/types.d.ts +6 -0
  135. package/dist/types.d.ts.map +1 -1
  136. package/dist/useCrud.d.ts +1 -0
  137. package/dist/useCrud.d.ts.map +1 -1
  138. package/dist/useCrud.js +1 -1
  139. package/dist/useCrudCardList.d.ts +5 -3
  140. package/dist/useCrudCardList.d.ts.map +1 -1
  141. package/dist/useCrudList.d.ts +5 -3
  142. package/dist/useCrudList.d.ts.map +1 -1
  143. package/dist/utils/clientListProcessing.d.ts +21 -2
  144. package/dist/utils/clientListProcessing.d.ts.map +1 -1
  145. package/dist/utils/clientListProcessing.js +1 -1
  146. package/dist/utils/fileStorage.d.ts +2 -0
  147. package/dist/utils/fileStorage.d.ts.map +1 -1
  148. package/dist/utils/fileStorage.js +1 -1
  149. package/dist/utils/imageProcessing.d.ts.map +1 -1
  150. package/dist/utils/imageProcessing.js +1 -1
  151. package/dist/utils/imageStorage.d.ts +2 -0
  152. package/dist/utils/imageStorage.d.ts.map +1 -1
  153. package/dist/utils/imageStorage.js +1 -1
  154. package/guidelines/COMPONENTS.md +234 -0
  155. package/guidelines/CRUD.md +340 -0
  156. package/guidelines/GOTCHAS.md +46 -0
  157. package/package.json +7 -4
@@ -71,6 +71,15 @@ declare class CrudService implements CrudServiceInterface {
71
71
  * after auth state changes to enable per-user isolation.
72
72
  */
73
73
  private _rateLimitKey;
74
+ /** Tracks in-flight mutations to prevent concurrent writes to the same document */
75
+ private _inflightMutations;
76
+ private _mutationKey;
77
+ /**
78
+ * Execute an adapter call with timeout and 1 retry on transient errors.
79
+ * Transient errors: network errors, timeouts, 5xx status codes.
80
+ */
81
+ private _withResilience;
82
+ private _isTransientError;
74
83
  /** Ensure adapter is initialized from provider registry. */
75
84
  private _ensureAdapter;
76
85
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"CrudService.d.ts","sourceRoot":"","sources":["../src/CrudService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CrudService.d.ts","sourceRoot":"","sources":["../src/CrudService.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{toast as w}from"@donotdev/components";import{createSingleton as A,handleError as f,getQueryClient as L,getI18nInstance as m,hasProvider as D,getProvider as T,hasRestrictedVisibility as F,DEFAULT_STATUS_VALUE as q}from"@donotdev/core";import{LIST_SCHEMA_TYPE as _}from"@donotdev/core";import{CRUD_OPERATION as y}from"./types";const S=1/0,P=1e3*60*30;class b{adapter=null;store=null;security=null;currentUserId=null;_shouldShowSuccessToast(t){return t?.showSuccessToast===!0?!0:t?.showSuccessToast===!1?!1:!this.store?.getState().hideSuccessToasts}setStore(t){this.store=t}setSecurity(t){this.security=t}setCurrentUser(t){this.currentUserId=t}_getPiiFields(t){return t?.security?.piiFields??[]}_auditCrud(t,e,s,i){this.security&&this.security.audit({type:t,collection:e,docId:s,userId:i??this.currentUserId??void 0})}_rateLimitKey(t){return this.currentUserId?`${this.currentUserId}:${t}`:t}async _ensureAdapter(){this.adapter||await this.initialize()}_assertCanAccess(t,e){if(this.adapter&&e&&F(e)&&!this.adapter.serverSideOnly&&!this.adapter.dbLevelSecurity)throw new Error(`[dndev] Direct adapter cannot access "${t}": entity has restricted field visibility. Use a server-side adapter (FunctionsAdapter for Firebase, or SupabaseCrudAdapter with RLS enabled) to enforce field-level security (serverSideOnly = true | dbLevelSecurity = true).`)}async initialize(){if(!this.adapter){if(!D("crud"))throw new Error(`[dndev] No CRUD adapter configured. Call configureProviders({ crud: yourAdapter }) at app startup.
1
+ import{toast as _}from"@donotdev/components";import{createSingleton as T,generateUUID as A,handleError as p,getQueryClient as D,getI18nInstance as m,hasProvider as l,getProvider as F,hasRestrictedVisibility as q,DEFAULT_STATUS_VALUE as N,withTimeout as L,DEFAULT_CRUD_TIMEOUT as M}from"@donotdev/core";import{LIST_SCHEMA_TYPE as C}from"@donotdev/core";import{CRUD_OPERATION as o}from"./types";const S=1/0,K=1e3*60*30;class b{adapter=null;store=null;security=null;currentUserId=null;_shouldShowSuccessToast(t){return t?.showSuccessToast===!0?!0:t?.showSuccessToast===!1?!1:!this.store?.getState().hideSuccessToasts}setStore(t){this.store=t}setSecurity(t){this.security=t}setCurrentUser(t){this.currentUserId=t}_getPiiFields(t){return t?.security?.piiFields??[]}_auditCrud(t,e,s,a){this.security&&this.security.audit({type:t,collection:e,docId:s,userId:a??this.currentUserId??void 0})}_rateLimitKey(t){return this.currentUserId?`${this.currentUserId}:${t}`:t}_inflightMutations=new Map;_mutationKey(t,e){return`${t}:${e}`}async _withResilience(t,e=M){try{return await L(t(),e)}catch(s){if(this._isTransientError(s))return await new Promise(a=>setTimeout(a,2e3)),await L(t(),e);throw s}}_isTransientError(t){if(t instanceof Error){if(t.name==="TimeoutError"||t.message.includes("Failed to fetch")||t.message.includes("NetworkError")||t.message.includes("network"))return!0;const e=t.message.match(/(?:status|code)\s*:?\s*(\d{3})/i);if(e?.[1]&&parseInt(e[1])>=500)return!0}return!1}async _ensureAdapter(){this.adapter||await this.initialize()}_assertCanAccess(t,e){if(this.adapter&&e&&q(e)&&!this.adapter.serverSideOnly&&!this.adapter.dbLevelSecurity)throw new Error(`[dndev] Direct adapter cannot access "${t}": entity has restricted field visibility. Use a server-side adapter (FunctionsAdapter for Firebase, or SupabaseCrudAdapter with RLS enabled) to enforce field-level security (serverSideOnly = true | dbLevelSecurity = true).`)}async initialize(){if(!this.adapter){if(!l("crud"))throw new Error(`[dndev] No CRUD adapter configured. Call configureProviders({ crud: yourAdapter }) at app startup.
2
2
  Examples:
3
3
  import { FirestoreAdapter } from "@donotdev/firebase";
4
4
  import { FunctionsAdapter } from "@donotdev/crud";
@@ -6,4 +6,4 @@ Examples:
6
6
 
7
7
  configureProviders({ crud: new FirestoreAdapter() }) // Firebase direct
8
8
  configureProviders({ crud: new FunctionsAdapter() }) // via callable functions
9
- configureProviders({ crud: new SupabaseCrudAdapter(sb) }) // Supabase direct (RLS)`);this.adapter=T("crud"),this.store&&this.store.getState().setCrudService(this)}}getQueryClient(){return L()}getListQueryOptions(t,e,s,i,a=_.LIST){const r=this.adapter,u=()=>this._ensureAdapter();return{queryKey:["crud",t,"query",JSON.stringify(e)],queryFn:async()=>{if(r||await u(),!this.adapter)throw new Error("Adapter not initialized");return this.adapter.query(t,e,s,a)},staleTime:i?.staleTime??S}}getDocQueryOptions(t,e,s,i){const a=this.adapter,r=()=>this._ensureAdapter();return{queryKey:["crud",t,"get",e],queryFn:async()=>{if(a||await r(),!this.adapter)throw new Error("Adapter not initialized");return this.adapter.get(t,e,s)},staleTime:i?.staleTime??S}}_updateGetCache(t,e,s,i){const a=this.getQueryClient(),r=["crud",t,"get",e];i===y.DELETE?a.removeQueries({queryKey:r}):i===y.SET&&s?a.setQueryData(r,s):(i===y.UPDATE||i===y.ADD)&&s&&a.setQueryData(r,u=>u?{...u,...s}:s)}_updateListCaches(t,e,s,i){const a=this.getQueryClient();this._updateGetCache(t,e,s,i),a.setQueriesData({queryKey:["crud",t]},r=>{if(r&&typeof r=="object"&&"items"in r){const u=r;let n=u.items;return i===y.DELETE?(n=u.items.filter(d=>d!=null&&typeof d=="object"&&d.id!==e),{...u,items:n,total:Math.max(0,(u.total??n.length)-1)}):i===y.ADD&&s?(n=[...u.items,{...s,id:e}],{...u,items:n,total:(u.total??u.items.length)+1}):(i===y.UPDATE||i===y.SET)&&s&&u.items.some(h=>h!=null&&typeof h=="object"&&h.id===e)?(n=u.items.map(h=>h==null||typeof h!="object"||h.id!==e?h:i===y.SET?{...s,id:e}:{...h,...s}),{...u,items:n}):r}if(Array.isArray(r)){if(i===y.DELETE)return r.filter(u=>u.id!==e);if(i===y.ADD&&s)return[...r,{...s,id:e}];if((i===y.UPDATE||i===y.SET)&&s)return r.some(n=>n!=null&&typeof n=="object"&&n.id===e)?r.map(n=>n==null||typeof n!="object"||n.id!==e?n:i===y.SET?{...s,id:e}:{...n,...s}):r}return r})}_checkUniquenessFromCache(t,e,s){const a=s.metadata?.uniqueKeys;if(!a||a.length===0)return null;const u=this.getQueryClient().getQueriesData({queryKey:["crud",t]}),n=[];for(const[,h]of u)h&&typeof h=="object"&&"items"in h?n.push(...h.items):Array.isArray(h)&&n.push(...h);if(n.length===0)return null;const d=e;for(const h of a){if(!h.fields.every(g=>d[g]!=null&&d[g]!==""))continue;const p=n.find(g=>h.fields.every(c=>{const E=typeof d[c]=="string"?d[c].toLowerCase():d[c],C=typeof g[c]=="string"?g[c].toLowerCase():g[c];return E===C}));if(p){if(h.findOrCreate)return p.id;const g=h.fields.join(" + ");throw f(new Error(h.errorMessage||`Duplicate ${g}`),{userMessage:h.errorMessage||`A record with this ${g} already exists`,showNotification:!0})}}return null}_getItemFromListCache(t,e){const i=this.getQueryClient().getQueriesData({queryKey:["crud",t]});for(const[,a]of i)if(a?.items){const r=a.items.find(u=>u.id===e);if(r)return r}return null}async invalidateCollection(t){await this.getQueryClient().invalidateQueries({queryKey:["crud",t]})}async get(t,e,s,i){if(await this._ensureAdapter(),i?.noCache)return this._getFromAdapter(t,e,s);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,s,!1),staleTime:i?.staleTime??S})}catch(a){const r=f(a,{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,s,i=!0){this.store&&i&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{if(!this.adapter)throw new Error("Adapter not initialized");this._assertCanAccess(t,s);const a=await this.adapter.get(t,e,s);if(a&&this.security){const r=this._getPiiFields(s);if(r.length>0)return this.security.decryptPii(a,r)}return a}catch(a){const r=f(a,{userMessage:`Failed to fetch ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,r),r}finally{this.store&&i&&this.store.getState().setLoading(t,!1)}}async query(t,e,s,i,a=_.LIST){if(await this._ensureAdapter(),i?.noCache)return this._queryFromAdapter(t,e,s,!0,a);this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{return await this.getQueryClient().fetchQuery({queryKey:["crud",t,"query",JSON.stringify(e)],queryFn:()=>this._queryFromAdapter(t,e,s,!1,a),staleTime:i?.staleTime??S})}catch(r){const u=f(r,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,u),u}finally{this.store&&this.store.getState().setLoading(t,!1)}}async _queryFromAdapter(t,e,s,i=!0,a=_.LIST){this.store&&i&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{if(!this.adapter)throw new Error("Adapter not initialized");this._assertCanAccess(t,s);const r=await this.adapter.query(t,e,s,a);if(this.security&&r.items.length>0){const u=this._getPiiFields(s);u.length>0&&(r.items=r.items.map(n=>this.security.decryptPii(n,u)))}return r}catch(r){const u=f(r,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,u),u}finally{this.store&&i&&this.store.getState().setLoading(t,!1)}}_getEntityName(t){const e=m();let s=`entity-${t}`,i=e.t("name",{ns:s,defaultValue:null});return i&&i!=="name"&&i!==`${s}:name`||t.endsWith("s")&&t.length>1&&(s=`entity-${t.slice(0,-1)}`,i=e.t("name",{ns:s,defaultValue:null}),i&&i!=="name"&&i!==`${s}:name`)?i:t}async set(t,e,s,i,a){await this._ensureAdapter(),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const u=this.getQueryClient().getQueryData(["crud",t,"get",e])??null;this.store&&this.store.getState().updateOptimistic(t,e,s,u);try{if(!this.adapter)throw new Error("Adapter not initialized");this._assertCanAccess(t,i),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const n=this._getPiiFields(i),d=n.length>0&&this.security?this.security.encryptPii(s,n):s;if(await this.adapter.set(t,e,d,i),this._updateListCaches(t,e,s,y.SET),this.store&&this.store.getState().confirmUpdate(t,e),this._auditCrud("crud.update",t,e),this._shouldShowSuccessToast(a)){const h=m(),o=this._getEntityName(t);w("success",h.t("messages.updateSuccess",{ns:"crud",entity:o}))}}catch(n){u&&this._updateListCaches(t,e,u,y.SET),this.store&&this.store.getState().rejectUpdate(t,e);const d=f(n,{userMessage:`Failed to save ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,d),d}finally{this.store&&this.store.getState().setLoading(t,!1)}}async update(t,e,s,i,a){await this._ensureAdapter(),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const u=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),n=u?{...u,...s}:{...s,id:e};this.store&&this.store.getState().updateOptimistic(t,e,n,u??null);try{if(!this.adapter)throw new Error("Adapter not initialized");i&&this._assertCanAccess(t,i),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const d=i?this._getPiiFields(i):[],h=d.length>0&&this.security?this.security.encryptPii(s,d):s;if(await this.adapter.update(t,e,h),this._updateListCaches(t,e,n,y.UPDATE),this.store&&this.store.getState().confirmUpdate(t,e),this._auditCrud("crud.update",t,e),this._shouldShowSuccessToast(a)){const o=m(),p=this._getEntityName(t);w("success",o.t("messages.updateSuccess",{ns:"crud",entity:p}))}}catch(d){u?this._updateListCaches(t,e,u,y.UPDATE):this.invalidateCollection(t),this.store&&this.store.getState().rejectUpdate(t,e);const h=f(d,{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,s){await this._ensureAdapter(),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(this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write"),await this.adapter.delete(t,e),this._updateListCaches(t,e,null,y.DELETE),this.store&&this.store.getState().confirmDelete(t,e),this._auditCrud("crud.delete",t,e),this.security?.recordAnomaly?.("bulk.deletes",this.currentUserId??void 0),this._shouldShowSuccessToast(s)){const r=m(),u=this._getEntityName(t);w("success",r.t("messages.deleteSuccess",{ns:"crud",entity:u}))}}catch(r){a&&this._updateListCaches(t,e,a,y.ADD),this.store&&this.store.getState().rejectDelete(t,e);const u=f(r,{userMessage:`Failed to delete ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,u),u}finally{this.store&&this.store.getState().setLoading(t,!1)}}async add(t,e,s,i){await this._ensureAdapter();const a=this._checkUniquenessFromCache(t,e,s);if(a)return a;this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const r=`temp_${crypto.randomUUID()}`;this.store&&this.store.getState().addOptimistic(t,r,{...e,id:r});try{if(!this.adapter)throw new Error("Adapter not initialized");this._assertCanAccess(t,s),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const u=this._getPiiFields(s),n=u.length>0&&this.security?this.security.encryptPii(e,u):e,d=n;(d.status===void 0||d.status===null)&&(d.status=q);const h=await this.adapter.add(t,n,s),o=h.id,p=h.data;if(this._updateListCaches(t,r,null,y.DELETE),this._updateListCaches(t,o,p,y.ADD),this.store&&this.store.getState().confirmOptimistic(t,r,o,p),this._auditCrud("crud.create",t,o),this._shouldShowSuccessToast(i)){const g=m(),c=this._getEntityName(t);w("success",g.t("messages.createSuccess",{ns:"crud",entity:c}))}return o}catch(u){this._updateListCaches(t,r,null,y.DELETE),this.store&&this.store.getState().rejectOptimistic(t,r);const n=f(u,{userMessage:`Failed to create ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,n),n}finally{this.store&&this.store.getState().setLoading(t,!1)}}subscribe(t,e,s,i){if(!this.adapter){let a=!1,r=null;return this._ensureAdapter().then(()=>{a||(r=this._subscribeSync(t,e,s,i))}).catch(u=>{a||s(null,f(u))}),()=>{a=!0,r?.()}}return this._subscribeSync(t,e,s,i)}_subscribeSync(t,e,s,i){try{const a=this.adapter;return a?a.subscribe?(this._assertCanAccess(t,i),a.subscribe(t,e,(r,u)=>{r&&this.getQueryClient().setQueryData(["crud",t,"get",e],r),s(r,u)},i)):()=>{}:(s(null,new Error("Adapter not initialized")),()=>{})}catch(a){return s(null,f(a)),()=>{}}}subscribeToCollection(t,e,s,i){if(!this.adapter){let a=!1,r=null;return this._ensureAdapter().then(()=>{a||(r=this._subscribeToCollectionSync(t,e,s,i))}).catch(u=>{a||s([],f(u))}),()=>{a=!0,r?.()}}return this._subscribeToCollectionSync(t,e,s,i)}_subscribeToCollectionSync(t,e,s,i){try{const a=this.adapter;return a?a.subscribeToCollection?(this._assertCanAccess(t,i),a.subscribeToCollection(t,e,(r,u)=>{r&&this.getQueryClient().setQueryData(["crud",t,"query",JSON.stringify(e)],n=>n?{...n,items:r}:{items:r}),s(r,u)},i)):()=>{}:(s([],new Error("Adapter not initialized")),()=>{})}catch(a){return s([],f(a)),()=>{}}}async addOptimistic(t,e,s,i){await this._ensureAdapter();const a=this._checkUniquenessFromCache(t,e,s);if(a)return{...e,id:a};this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const r=`temp_${crypto.randomUUID()}`,u={...e,id:r,_optimistic:!0};this.store&&this.store.getState().addOptimistic(t,r,u);try{if(!this.adapter)throw new Error("Adapter not initialized");const n=await this.adapter.add(t,e,s),d=n.id,h=n.data;if(this._updateListCaches(t,r,null,y.DELETE),this._updateListCaches(t,d,h,y.ADD),this.store&&this.store.getState().confirmOptimistic(t,r,d,h),this._auditCrud("crud.create",t,d),this._shouldShowSuccessToast(i)){const o=m(),p=this._getEntityName(t);w("success",o.t("messages.createSuccess",{ns:"crud",entity:p}))}return h}catch(n){throw this._updateListCaches(t,r,null,y.DELETE),this.store&&this.store.getState().rejectOptimistic(t,r),f(n,{userMessage:`Failed to create ${t}`,showNotification:!0})}}async updateOptimistic(t,e,s,i,a){await this._ensureAdapter(),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const u=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),n=u?{...u,...s,_optimistic:!0}:{...s,id:e,_optimistic:!0};this.store&&u&&this.store.getState().updateOptimistic(t,e,n,u);try{if(!this.adapter)throw new Error("Adapter not initialized");await this.adapter.update(t,e,s);const{_optimistic:d,...h}=n;if(this._updateListCaches(t,e,h,y.UPDATE),this.store&&this.store.getState().confirmUpdate(t,e),this._auditCrud("crud.update",t,e),this._shouldShowSuccessToast(a)){const o=m(),p=this._getEntityName(t);w("success",o.t("messages.updateSuccess",{ns:"crud",entity:p}))}return h}catch(d){throw u&&this._updateListCaches(t,e,u,y.UPDATE),this.store&&this.store.getState().rejectUpdate(t,e),f(d,{userMessage:`Failed to update ${t}`,showNotification:!0})}}async deleteOptimistic(t,e,s){await this._ensureAdapter(),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");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,y.DELETE),this.store&&this.store.getState().confirmDelete(t,e),this._auditCrud("crud.delete",t,e),this.security?.recordAnomaly?.("bulk.deletes",this.currentUserId??void 0),this._shouldShowSuccessToast(s)){const r=m(),u=this._getEntityName(t);w("success",r.t("messages.deleteSuccess",{ns:"crud",entity:u}))}}catch(r){throw a&&this._updateListCaches(t,e,a,y.ADD),this.store&&this.store.getState().rejectDelete(t,e),f(r,{userMessage:`Failed to delete ${t}`,showNotification:!0})}}}const l=A(()=>new b);export{l as getCrudService};
9
+ configureProviders({ crud: new SupabaseCrudAdapter(sb) }) // Supabase direct (RLS)`);this.adapter=F("crud"),this.store&&this.store.getState().setCrudService(this)}}getQueryClient(){return D()}getListQueryOptions(t,e,s,a,n=C.LIST){const r=this.adapter,i=()=>this._ensureAdapter();return{queryKey:["crud",t,"query",JSON.stringify(e)],queryFn:async()=>{if(r||await i(),!this.adapter)throw new Error("Adapter not initialized");const u=this.adapter;return this._withResilience(()=>u.query(t,e,s,n))},staleTime:a?.staleTime??S}}getDocQueryOptions(t,e,s,a){const n=this.adapter,r=()=>this._ensureAdapter();return{queryKey:["crud",t,"get",e],queryFn:async()=>{if(n||await r(),!this.adapter)throw new Error("Adapter not initialized");const i=this.adapter;return this._withResilience(()=>i.get(t,e,s))},staleTime:a?.staleTime??S}}_updateGetCache(t,e,s,a){const n=this.getQueryClient(),r=["crud",t,"get",e];a===o.DELETE?n.removeQueries({queryKey:r}):a===o.SET&&s?n.setQueryData(r,s):(a===o.UPDATE||a===o.ADD)&&s&&n.setQueryData(r,i=>i?{...i,...s}:s)}_updateListCaches(t,e,s,a){const n=this.getQueryClient();this._updateGetCache(t,e,s,a),n.setQueriesData({queryKey:["crud",t]},r=>{if(r&&typeof r=="object"&&"items"in r){const i=r;let u=i.items;return a===o.DELETE?(u=i.items.filter(d=>d!=null&&typeof d=="object"&&d.id!==e),{...i,items:u,total:Math.max(0,(i.total??u.length)-1)}):a===o.ADD&&s?(u=[...i.items,{...s,id:e}],{...i,items:u,total:(i.total??i.items.length)+1}):(a===o.UPDATE||a===o.SET)&&s&&i.items.some(h=>h!=null&&typeof h=="object"&&h.id===e)?(u=i.items.map(h=>h==null||typeof h!="object"||h.id!==e?h:a===o.SET?{...s,id:e}:{...h,...s}),{...i,items:u}):r}if(Array.isArray(r)){if(a===o.DELETE)return r.filter(i=>i.id!==e);if(a===o.ADD&&s)return[...r,{...s,id:e}];if((a===o.UPDATE||a===o.SET)&&s)return r.some(u=>u!=null&&typeof u=="object"&&u.id===e)?r.map(u=>u==null||typeof u!="object"||u.id!==e?u:a===o.SET?{...s,id:e}:{...u,...s}):r}return r})}_checkUniquenessFromCache(t,e,s){const n=s.metadata?.uniqueKeys;if(!n||n.length===0)return null;const i=this.getQueryClient().getQueriesData({queryKey:["crud",t]}),u=[];for(const[,h]of i)h&&typeof h=="object"&&"items"in h?u.push(...h.items):Array.isArray(h)&&u.push(...h);if(u.length===0)return null;const d=e;for(const h of n){if(!h.fields.every(g=>d[g]!=null&&d[g]!==""))continue;const f=u.find(g=>h.fields.every(c=>{const w=typeof d[c]=="string"?d[c].toLowerCase():d[c],E=typeof g[c]=="string"?g[c].toLowerCase():g[c];return w===E}));if(f){if(h.findOrCreate)return f.id;const g=h.fields.join(" + ");throw p(new Error(h.errorMessage||`Duplicate ${g}`),{userMessage:h.errorMessage||`A record with this ${g} already exists`,showNotification:!0})}}return null}_getItemFromListCache(t,e){const a=this.getQueryClient().getQueriesData({queryKey:["crud",t]});for(const[,n]of a)if(n?.items){const r=n.items.find(i=>i.id===e);if(r)return r}return null}async invalidateCollection(t){await this.getQueryClient().invalidateQueries({queryKey:["crud",t]})}async get(t,e,s,a){if(await this._ensureAdapter(),a?.noCache)return this._getFromAdapter(t,e,s);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,s,!1),staleTime:a?.staleTime??S})}catch(n){const r=p(n,{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,s,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");this._assertCanAccess(t,s);const n=this.adapter,r=await this._withResilience(()=>n.get(t,e,s));if(r&&this.security){const i=this._getPiiFields(s);if(i.length>0)return this.security.decryptPii(r,i)}return r}catch(n){const r=p(n,{userMessage:`Failed to fetch ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,r),r}finally{this.store&&a&&this.store.getState().setLoading(t,!1)}}async query(t,e,s,a,n=C.LIST){if(await this._ensureAdapter(),a?.noCache)return this._queryFromAdapter(t,e,s,!0,n);this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));try{return await this.getQueryClient().fetchQuery({queryKey:["crud",t,"query",JSON.stringify(e)],queryFn:()=>this._queryFromAdapter(t,e,s,!1,n),staleTime:a?.staleTime??S})}catch(r){const i=p(r,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,i),i}finally{this.store&&this.store.getState().setLoading(t,!1)}}async _queryFromAdapter(t,e,s,a=!0,n=C.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");this._assertCanAccess(t,s);const r=this.adapter,i=await this._withResilience(()=>r.query(t,e,s,n));if(this.security&&i.items.length>0){const u=this._getPiiFields(s);u.length>0&&(i.items=i.items.map(d=>this.security.decryptPii(d,u)))}return i}catch(r){const i=p(r,{userMessage:`Failed to query ${t}`,showNotification:!0});throw this.store&&this.store.getState().setError(t,i),i}finally{this.store&&a&&this.store.getState().setLoading(t,!1)}}_getEntityName(t){const e=m();let s=`entity-${t}`,a=e.t("name",{ns:s,defaultValue:null});return a&&a!=="name"&&a!==`${s}:name`||t.endsWith("s")&&t.length>1&&(s=`entity-${t.slice(0,-1)}`,a=e.t("name",{ns:s,defaultValue:null}),a&&a!=="name"&&a!==`${s}:name`)?a:t}async set(t,e,s,a,n){await this._ensureAdapter(),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,s,i);try{if(!this.adapter)throw new Error("Adapter not initialized");this._assertCanAccess(t,a),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const u=this._getPiiFields(a),d=u.length>0&&this.security?this.security.encryptPii(s,u):s,h=this._mutationKey(t,e),y=this._inflightMutations.get(h);y&&await y.catch(()=>{});const f=this.adapter,g=(async()=>{await this._withResilience(()=>f.set(t,e,d,a))})();this._inflightMutations.set(h,g);try{await g}finally{this._inflightMutations.get(h)===g&&this._inflightMutations.delete(h)}if(this._updateListCaches(t,e,s,o.SET),this.store&&this.store.getState().confirmUpdate(t,e),this._auditCrud("crud.update",t,e),this._shouldShowSuccessToast(n)){const c=m(),w=this._getEntityName(t);_("success",c.t("messages.updateSuccess",{ns:"crud",entity:w}))}}catch(u){i&&this._updateListCaches(t,e,i,o.SET),this.store&&this.store.getState().rejectUpdate(t,e);const d=p(u,{userMessage:`Failed to save ${t}`,showNotification:!0}),h=m(),y=this._getEntityName(t);throw _("error",h.t("messages.updateError",{ns:"crud",entity:y})),this.store&&this.store.getState().setError(t,d),d}finally{this.store&&this.store.getState().setLoading(t,!1)}}async update(t,e,s,a,n){await this._ensureAdapter(),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const i=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),u=i?{...i,...s}:{...s,id:e};this.store&&this.store.getState().updateOptimistic(t,e,u,i??null);try{if(!this.adapter)throw new Error("Adapter not initialized");a&&this._assertCanAccess(t,a),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const d=a?this._getPiiFields(a):[],h=d.length>0&&this.security?this.security.encryptPii(s,d):s,y=this._mutationKey(t,e),f=this._inflightMutations.get(y);f&&await f.catch(()=>{});const g=this.adapter,c=(async()=>{await this._withResilience(()=>g.update(t,e,h))})();this._inflightMutations.set(y,c);try{await c}finally{this._inflightMutations.get(y)===c&&this._inflightMutations.delete(y)}if(this._updateListCaches(t,e,u,o.UPDATE),this.store&&this.store.getState().confirmUpdate(t,e),this._auditCrud("crud.update",t,e),this._shouldShowSuccessToast(n)){const w=m(),E=this._getEntityName(t);_("success",w.t("messages.updateSuccess",{ns:"crud",entity:E}))}}catch(d){i?this._updateListCaches(t,e,i,o.UPDATE):this.invalidateCollection(t),this.store&&this.store.getState().rejectUpdate(t,e);const h=p(d,{userMessage:`Failed to update ${t}`,showNotification:!0}),y=m(),f=this._getEntityName(t);throw _("error",y.t("messages.updateError",{ns:"crud",entity:f})),this.store&&this.store.getState().setError(t,h),h}finally{this.store&&this.store.getState().setLoading(t,!1)}}async delete(t,e,s){await this._ensureAdapter(),this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const n=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e);this.store&&n&&this.store.getState().deleteOptimistic(t,e,n);try{if(!this.adapter)throw new Error("Adapter not initialized");this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const r=this._mutationKey(t,e),i=this._inflightMutations.get(r);i&&await i.catch(()=>{});const u=this.adapter,d=(async()=>{await this._withResilience(()=>u.delete(t,e))})();this._inflightMutations.set(r,d);try{await d}finally{this._inflightMutations.get(r)===d&&this._inflightMutations.delete(r)}if(this._updateListCaches(t,e,null,o.DELETE),this.store&&this.store.getState().confirmDelete(t,e),this._auditCrud("crud.delete",t,e),this.security?.recordAnomaly?.("bulk.deletes",this.currentUserId??void 0),this._shouldShowSuccessToast(s)){const h=m(),y=this._getEntityName(t);_("success",h.t("messages.deleteSuccess",{ns:"crud",entity:y}))}}catch(r){n&&this._updateListCaches(t,e,n,o.ADD),this.store&&this.store.getState().rejectDelete(t,e);const i=p(r,{userMessage:`Failed to delete ${t}`,showNotification:!0}),u=m(),d=this._getEntityName(t);throw _("error",u.t("messages.deleteError",{ns:"crud",entity:d})),this.store&&this.store.getState().setError(t,i),i}finally{this.store&&this.store.getState().setLoading(t,!1)}}async add(t,e,s,a){await this._ensureAdapter();const n=this._checkUniquenessFromCache(t,e,s);if(n)return n;this.store&&(this.store.getState().setLoading(t,!0),this.store.getState().setError(t,null));const r=`temp_${A()}`;this.store&&this.store.getState().addOptimistic(t,r,{...e,id:r});try{if(!this.adapter)throw new Error("Adapter not initialized");this._assertCanAccess(t,s),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const i=this._getPiiFields(s),u=i.length>0&&this.security?this.security.encryptPii(e,i):e,d=u;(d.status===void 0||d.status===null)&&(d.status=N);const h=this.adapter,y=await this._withResilience(()=>h.add(t,u,s)),f=y.id,g=y.data;if(this._updateListCaches(t,r,null,o.DELETE),this._updateListCaches(t,f,g,o.ADD),this.store&&this.store.getState().confirmOptimistic(t,r,f,g),this._auditCrud("crud.create",t,f),this._shouldShowSuccessToast(a)){const c=m(),w=this._getEntityName(t);_("success",c.t("messages.createSuccess",{ns:"crud",entity:w}))}return f}catch(i){this._updateListCaches(t,r,null,o.DELETE),this.store&&this.store.getState().rejectOptimistic(t,r);const u=p(i,{userMessage:`Failed to create ${t}`,showNotification:!0}),d=m(),h=this._getEntityName(t);throw _("error",d.t("messages.createError",{ns:"crud",entity:h})),this.store&&this.store.getState().setError(t,u),u}finally{this.store&&this.store.getState().setLoading(t,!1)}}subscribe(t,e,s,a){if(!this.adapter){let n=!1,r=null;return this._ensureAdapter().then(()=>{n||(r=this._subscribeSync(t,e,s,a))}).catch(i=>{n||s(null,p(i))}),()=>{n=!0,r?.()}}return this._subscribeSync(t,e,s,a)}_subscribeSync(t,e,s,a){try{const n=this.adapter;return n?n.subscribe?(this._assertCanAccess(t,a),n.subscribe(t,e,(r,i)=>{r&&this.getQueryClient().setQueryData(["crud",t,"get",e],r),s(r,i)},a)):()=>{}:(s(null,new Error("Adapter not initialized")),()=>{})}catch(n){return s(null,p(n)),()=>{}}}subscribeToCollection(t,e,s,a){if(!this.adapter){let n=!1,r=null;return this._ensureAdapter().then(()=>{n||(r=this._subscribeToCollectionSync(t,e,s,a))}).catch(i=>{n||s([],p(i))}),()=>{n=!0,r?.()}}return this._subscribeToCollectionSync(t,e,s,a)}_subscribeToCollectionSync(t,e,s,a){try{const n=this.adapter;return n?n.subscribeToCollection?(this._assertCanAccess(t,a),n.subscribeToCollection(t,e,(r,i)=>{r&&this.getQueryClient().setQueryData(["crud",t,"query",JSON.stringify(e)],u=>u?{...u,items:r}:{items:r}),s(r,i)},a)):()=>{}:(s([],new Error("Adapter not initialized")),()=>{})}catch(n){return s([],p(n)),()=>{}}}async addOptimistic(t,e,s,a){await this._ensureAdapter();const n=this._checkUniquenessFromCache(t,e,s);if(n)return{...e,id:n};this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const r=`temp_${A()}`,i={...e,id:r,_optimistic:!0};this.store&&this.store.getState().addOptimistic(t,r,i);try{if(!this.adapter)throw new Error("Adapter not initialized");const u=this.adapter,d=await this._withResilience(()=>u.add(t,e,s)),h=d.id,y=d.data;if(this._updateListCaches(t,r,null,o.DELETE),this._updateListCaches(t,h,y,o.ADD),this.store&&this.store.getState().confirmOptimistic(t,r,h,y),this._auditCrud("crud.create",t,h),this._shouldShowSuccessToast(a)){const f=m(),g=this._getEntityName(t);_("success",f.t("messages.createSuccess",{ns:"crud",entity:g}))}return y}catch(u){this._updateListCaches(t,r,null,o.DELETE),this.store&&this.store.getState().rejectOptimistic(t,r);const d=p(u,{userMessage:`Failed to create ${t}`,showNotification:!0}),h=m(),y=this._getEntityName(t);throw _("error",h.t("messages.createError",{ns:"crud",entity:y})),d}}async updateOptimistic(t,e,s,a,n){await this._ensureAdapter(),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const i=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e),u=i?{...i,...s,_optimistic:!0}:{...s,id:e,_optimistic:!0};this.store&&i&&this.store.getState().updateOptimistic(t,e,u,i);try{if(!this.adapter)throw new Error("Adapter not initialized");const d=this._mutationKey(t,e),h=this._inflightMutations.get(d);h&&await h.catch(()=>{});const y=this.adapter,f=(async()=>{await this._withResilience(()=>y.update(t,e,s))})();this._inflightMutations.set(d,f);try{await f}finally{this._inflightMutations.get(d)===f&&this._inflightMutations.delete(d)}const{_optimistic:g,...c}=u;if(this._updateListCaches(t,e,c,o.UPDATE),this.store&&this.store.getState().confirmUpdate(t,e),this._auditCrud("crud.update",t,e),this._shouldShowSuccessToast(n)){const w=m(),E=this._getEntityName(t);_("success",w.t("messages.updateSuccess",{ns:"crud",entity:E}))}return c}catch(d){i&&this._updateListCaches(t,e,i,o.UPDATE),this.store&&this.store.getState().rejectUpdate(t,e);const h=p(d,{userMessage:`Failed to update ${t}`,showNotification:!0}),y=m(),f=this._getEntityName(t);throw _("error",y.t("messages.updateError",{ns:"crud",entity:f})),h}}async deleteOptimistic(t,e,s){await this._ensureAdapter(),this.security&&await this.security.checkRateLimit(this._rateLimitKey(t),"write");const n=this.getQueryClient().getQueryData(["crud",t,"get",e])??this._getItemFromListCache(t,e);this.store&&n&&this.store.getState().deleteOptimistic(t,e,n);try{if(!this.adapter)throw new Error("Adapter not initialized");const r=this._mutationKey(t,e),i=this._inflightMutations.get(r);i&&await i.catch(()=>{});const u=this.adapter,d=(async()=>{await this._withResilience(()=>u.delete(t,e))})();this._inflightMutations.set(r,d);try{await d}finally{this._inflightMutations.get(r)===d&&this._inflightMutations.delete(r)}if(this._updateListCaches(t,e,null,o.DELETE),this.store&&this.store.getState().confirmDelete(t,e),this._auditCrud("crud.delete",t,e),this.security?.recordAnomaly?.("bulk.deletes",this.currentUserId??void 0),this._shouldShowSuccessToast(s)){const h=m(),y=this._getEntityName(t);_("success",h.t("messages.deleteSuccess",{ns:"crud",entity:y}))}}catch(r){n&&this._updateListCaches(t,e,n,o.ADD),this.store&&this.store.getState().rejectDelete(t,e);const i=p(r,{userMessage:`Failed to delete ${t}`,showNotification:!0}),u=m(),d=this._getEntityName(t);throw _("error",u.t("messages.deleteError",{ns:"crud",entity:d})),i}}}const R=T(()=>new b);export{R as getCrudService};
@@ -1 +1 @@
1
- {"version":3,"file":"CrudStore.d.ts","sourceRoot":"","sources":["../src/CrudStore.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAEV,SAAS,EACT,WAAW,EAIZ,MAAM,SAAS,CAAC;AAyBjB;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,iIAuZvB,CAAC"}
1
+ {"version":3,"file":"CrudStore.d.ts","sourceRoot":"","sources":["../src/CrudStore.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAEV,SAAS,EACT,WAAW,EAIZ,MAAM,SAAS,CAAC;AAyBjB;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,iIA+avB,CAAC"}
package/dist/CrudStore.js CHANGED
@@ -1 +1 @@
1
- import{createDoNotDevStore as d}from"@donotdev/core";import{OPTIMISTIC_STATUSES as m,CRUD_OPERATION as a}from"./types";const S={filters:{},showFavoritesOnly:!1};function r(){return{loading:!1,error:null,lastUpdated:0,optimistic:{},ui:{...S}}}const D={crudService:null,hideSuccessToasts:!1,collections:{}},E=d({name:"crud-store",createStore:(n,s)=>({...D,setCrudService:t=>{n({crudService: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:m.PENDING,operation:a.ADD}},lastUpdated:Date.now()}}}})},confirmOptimistic:(t,c,i,o)=>{n(e=>{const l=e.collections[t];if(!l)return e;const{[c]:p,...u}=l.optimistic;return{collections:{...e.collections,[t]:{...l,optimistic:u,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:m.PENDING,operation:a.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!==a.UPDATE)return i;const{[c]:l,...p}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:p,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:m.PENDING,operation:a.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!==a.DELETE)return i;const{[c]:l,...p}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:p,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{E as useCrudStore};
1
+ import{createDoNotDevStore as S}from"@donotdev/core";import{OPTIMISTIC_STATUSES as m,CRUD_OPERATION as a}from"./types";const d={filters:{},showFavoritesOnly:!1};function r(){return{loading:!1,error:null,lastUpdated:0,optimistic:{},ui:{...d}}}const D={crudService:null,hideSuccessToasts:!1,collections:{}},E=S({name:"crud-store",createStore:(n,s)=>({...D,setCrudService:t=>{n({crudService: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,setPageSize:(t,c)=>{n(i=>{const o=i.collections[t]||r();return{collections:{...i.collections,[t]:{...o,ui:{...o.ui,pageSize:c}}}}})},getPageSize:t=>s().collections[t]?.ui?.pageSize,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:m.PENDING,operation:a.ADD}},lastUpdated:Date.now()}}}})},confirmOptimistic:(t,c,i,o)=>{n(e=>{const l=e.collections[t];if(!l)return e;const{[c]:p,...u}=l.optimistic;return{collections:{...e.collections,[t]:{...l,optimistic:u,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:m.PENDING,operation:a.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!==a.UPDATE)return i;const{[c]:l,...p}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:p,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:m.PENDING,operation:a.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!==a.DELETE)return i;const{[c]:l,...p}=o.optimistic;return{collections:{...i.collections,[t]:{...o,optimistic:p,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{E as useCrudStore};
@@ -1,11 +1,3 @@
1
- /**
2
- * @fileoverview Field Type Registry
3
- * @description UI component registry for field types. Schemas handled by @donotdev/core.
4
- *
5
- * @version 0.1.0
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
9
1
  import type { EntityField, FieldType, ValueTypeForField } from '@donotdev/core';
10
2
  import type { ControlledFieldProps } from './components/controlled/types';
11
3
  import type { ComponentType, ReactElement } from 'react';
@@ -103,10 +95,8 @@ declare class FieldRegistry {
103
95
  clear(): void;
104
96
  }
105
97
  /**
106
- * Get the field registry singleton
107
- *
108
- * Note: Built-in field types are auto-registered via side-effect import in FormFieldRenderer
109
- * This ensures they're registered when the registry is first used, without tree-shaking issues
98
+ * Get the field registry singleton.
99
+ * Backed by globalThis to survive Vite pre-bundling chunk splits and HMR.
110
100
  */
111
101
  export declare function getFieldRegistry(): FieldRegistry;
112
102
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"FieldRegistry.d.ts","sourceRoot":"","sources":["../src/FieldRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FieldRegistry.d.ts","sourceRoot":"","sources":["../src/FieldRegistry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- "use client";class d{components=new Map;displayFormatters=new Map;filterMetadata=new Map;registerComponent(e,t,n){this.components.set(e,{controlled:t,uncontrolled:n})}register(e){const{type:t,controlledComponent:n,uncontrolledComponent:i,displayFormatter:o,filterable:l,filterType:a}=e;(n||i)&&this.components.set(t,{controlled:n,uncontrolled:i}),o&&this.displayFormatters.set(t,o),(l!==void 0||a!==void 0)&&this.filterMetadata.set(t,{filterable:l??!1,filterType:a})}getControlledComponent(e){return this.components.get(e)?.controlled}getUncontrolledComponent(e){return this.components.get(e)?.uncontrolled}getDisplayFormatter(e){return this.displayFormatters.get(e)}getFilterType(e){return this.filterMetadata.get(e)?.filterType}isFilterable(e){return this.filterMetadata.get(e)?.filterable??!1}has(e){return this.components.has(e)}getRegisteredTypes(){return Array.from(this.components.keys())}clear(){this.components.clear(),this.displayFormatters.clear(),this.filterMetadata.clear()}}let s=null;function p(){return s||(s=new d),s}function c(r){p().register(r)}function f(r){return p().has(r)}export{p as getFieldRegistry,f as isFieldTypeRegistered,c as registerFieldType};
1
+ "use client";import{getGlobalSingleton as p}from"@donotdev/core";class d{components=new Map;displayFormatters=new Map;filterMetadata=new Map;registerComponent(e,t,n){this.components.set(e,{controlled:t,uncontrolled:n})}register(e){const{type:t,controlledComponent:n,uncontrolledComponent:o,displayFormatter:i,filterable:s,filterType:l}=e;(n||o)&&this.components.set(t,{controlled:n,uncontrolled:o}),i&&this.displayFormatters.set(t,i),(s!==void 0||l!==void 0)&&this.filterMetadata.set(t,{filterable:s??!1,filterType:l})}getControlledComponent(e){return this.components.get(e)?.controlled}getUncontrolledComponent(e){return this.components.get(e)?.uncontrolled}getDisplayFormatter(e){return this.displayFormatters.get(e)}getFilterType(e){return this.filterMetadata.get(e)?.filterType}isFilterable(e){return this.filterMetadata.get(e)?.filterable??!1}has(e){return this.components.has(e)}getRegisteredTypes(){return Array.from(this.components.keys())}clear(){this.components.clear(),this.displayFormatters.clear(),this.filterMetadata.clear()}}function a(){return p("field-registry",()=>new d)}function f(r){a().register(r)}function g(r){return a().has(r)}export{a as getFieldRegistry,g as isFieldTypeRegistered,f as registerFieldType};
@@ -1,5 +1,6 @@
1
1
  import type { ActionButtonProps } from '@donotdev/components';
2
2
  import type { ReactNode } from 'react';
3
+ /** Props for {@link CrudButton}, an ActionButton variant that auto-checks CRUD availability. */
3
4
  export interface CrudButtonProps<T = unknown> extends Omit<ActionButtonProps<T>, 'disabled'> {
4
5
  /**
5
6
  * Whether user authentication is required for this action.
@@ -1 +1 @@
1
- {"version":3,"file":"CrudButton.d.ts","sourceRoot":"","sources":["../../src/components/CrudButton.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,IAAI,CACxD,iBAAiB,CAAC,CAAC,CAAC,EACpB,UAAU,CACX;IACC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,iBAAS,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,EAC/B,YAAmB,EACnB,IAAI,EACJ,QAAgB,EAChB,QAAQ,EACR,GAAG,iBAAiB,EACrB,EAAE,eAAe,CAAC,CAAC,CAAC,2CAYpB;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"CrudButton.d.ts","sourceRoot":"","sources":["../../src/components/CrudButton.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,gGAAgG;AAChG,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,IAAI,CACxD,iBAAiB,CAAC,CAAC,CAAC,EACpB,UAAU,CACX;IACC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,iBAAS,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,EAC/B,YAAmB,EACnB,IAAI,EACJ,QAAgB,EAChB,QAAQ,EACR,GAAG,iBAAiB,EACrB,EAAE,eAAe,CAAC,CAAC,CAAC,2CAYpB;AAED,eAAe,UAAU,CAAC"}
@@ -3,6 +3,6 @@ import type { CrudCardProps } from '@donotdev/core';
3
3
  * CrudCard — Presentational card from entity + item + field slots.
4
4
  * No routing: use onClick for interaction. Parent wraps with Link if needed.
5
5
  */
6
- export declare function CrudCard({ item, entity, onClick, titleFields: titleFieldsProp, subtitleFields: subtitleFieldsProp, contentFields: contentFieldsProp, footerFields: footerFieldsProp, showDelete, renderActions, className, }: CrudCardProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function CrudCard({ item, entity, onClick, titleFields: titleFieldsProp, subtitleFields: subtitleFieldsProp, contentFields: contentFieldsProp, footerFields: footerFieldsProp, showDelete, renderActions, renderOverlay, className, }: CrudCardProps): import("react/jsx-runtime").JSX.Element;
7
7
  export default CrudCard;
8
8
  //# sourceMappingURL=CrudCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CrudCard.d.ts","sourceRoot":"","sources":["../../src/components/CrudCard.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,gBAAgB,CAAC;AA4C7E;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,WAAW,EAAE,eAAe,EAC5B,cAAc,EAAE,kBAAkB,EAClC,aAAa,EAAE,iBAAiB,EAChC,YAAY,EAAE,gBAAgB,EAC9B,UAAkB,EAClB,aAAa,EACb,SAAS,GACV,EAAE,aAAa,2CA4Lf;AAED,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"CrudCard.d.ts","sourceRoot":"","sources":["../../src/components/CrudCard.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,gBAAgB,CAAC;AA4C7E;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,WAAW,EAAE,eAAe,EAC5B,cAAc,EAAE,kBAAkB,EAClC,aAAa,EAAE,iBAAiB,EAChC,YAAY,EAAE,gBAAgB,EAC9B,UAAkB,EAClB,aAAa,EACb,aAAa,EACb,SAAS,GACV,EAAE,aAAa,2CAgNf;AAED,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- import{jsx as i,jsxs as D}from"react/jsx-runtime";import{Trash2 as E}from"lucide-react";import{useMemo as h}from"react";import{Card as q,Stack as w,Text as A,ActionButton as G}from"@donotdev/components";import{useTranslation as k,getListCardFieldNames as H}from"@donotdev/core";import{formatValue as v}from"./DisplayFieldRenderer";import{DisplayThumbnail as L}from"./DisplayThumbnail";import{translateFieldLabel as J}from"../forms/utils/translateFieldLabel";import{useCrud as K}from"../useCrud";function u(e){return e==="image"||e==="images"}function O(e){return h(()=>{const t=e.listCardFields;if(t&&!Array.isArray(t)){const o=t;return{titleFields:o.title??[],subtitleFields:o.subtitle??[],contentFields:o.content??[],footerFields:o.footer??[]}}const p=H(e),g=p.filter(o=>!u(e.fields[o]?.type)),x=p.filter(o=>u(e.fields[o]?.type)),C=g.length>0?[g[0]]:[],S=[...g.slice(1,4),...x];return{titleFields:C,subtitleFields:[],contentFields:S,footerFields:[]}},[e])}function Q({item:e,entity:t,onClick:p,titleFields:g,subtitleFields:x,contentFields:C,footerFields:S,showDelete:o=!1,renderActions:B,className:R}){const{t:n}=k([t.namespace,"crud"]),{t:m}=k("crud"),b=O(t),I=g??b.titleFields,T=x??b.subtitleFields,j=C??b.contentFields,F=S??b.footerFields,V=h(()=>{if(!I?.length)return e.id??"";const c=I.filter(l=>typeof l=="string").filter(l=>!u(t.fields[l]?.type)).map(l=>{const s=t.fields[l],a=e[l],f=s?v(a,s,n,{compact:!0,asString:!0}):a;return typeof f=="string"?f:String(f??"")}).filter(Boolean),r=!Array.isArray(t.listCardFields)&&t.listCardFields?.titleSeparator!=null?t.listCardFields.titleSeparator:" ";return c.join(r)||String(e.id??"")},[e,t.fields,I,t.listCardFields,n]),M=h(()=>T?.length&&T.filter(r=>typeof r=="string").filter(r=>!u(t.fields[r]?.type)).map(r=>{const l=t.fields[r],s=e[r],a=l?v(s,l,n,{compact:!0,asString:!0}):s;return typeof a=="string"?a:String(a??"")}).filter(Boolean).join(" ")||void 0,[e,t.fields,T,n]),P=h(()=>{if(!j?.length)return null;const c=j.map(r=>{const l=t.fields[r];if(!l)return null;if(u(l.type)){const s=e[r];return s==null?null:i(L,{pictures:s,alt:String(V),aspectRatio:"16/9"},r)}return D("div",{children:[i(A,{level:"small",variant:"muted",children:J(r,l,n)}),i(A,{children:v(e[r],l,n,{compact:!0})})]},r)}).filter(Boolean);return c.length>0?i(w,{direction:"column",gap:"tight",children:c}):null},[e,t.fields,j,V,n]),_=h(()=>{if(!F?.length)return;if(F.some(r=>u(t.fields[r]?.type))){const r=F.map(l=>{const s=t.fields[l];if(!s)return null;if(u(s.type)){const f=e[l];return f==null?null:i(L,{pictures:f,alt:"",aspectRatio:"1"},l)}const a=v(e[l],s,n,{compact:!0});return i("span",{children:a},l)});return i(w,{direction:"row",gap:"tight",align:"center",children:r.filter(Boolean)})}const c=F.map(r=>{const l=t.fields[r];return l?v(e[r],l,n,{compact:!0}):e[r]});return i(A,{level:"small",children:c.join(" \xB7 ")})},[e,t.fields,F,n]),y=K(t).delete,z=B||o?D("div",{style:{position:"absolute",top:"var(--gap-sm)",insetInlineEnd:"var(--gap-sm)",zIndex:10,display:"flex",alignItems:"flex-start",gap:"var(--gap-xs)"},onClick:d=>d.stopPropagation(),onMouseDown:d=>d.stopPropagation(),children:[B,o&&i(G,{action:async()=>{await y(e.id)},confirmText:m("delete.confirm",{defaultValue:"Are you sure you want to delete this item?"}),confirmTitle:m("delete.title",{defaultValue:"Delete Item"}),loadingText:m("delete.loading",{defaultValue:"Deleting..."}),variant:"destructive",icon:E,"aria-label":m("delete",{defaultValue:"Delete"}),children:m("delete",{defaultValue:"Delete"})})]}):null;return i(q,{title:String(V??""),subtitle:M,content:P??void 0,footer:_,clickable:!0,elevated:!0,onClick:p?()=>p(e.id):void 0,className:R,children:z})}var re=Q;export{Q as CrudCard,re as default};
1
+ import{jsx as i,jsxs as B}from"react/jsx-runtime";import{Trash2 as G}from"lucide-react";import{useMemo as v}from"react";import{Card as H,Stack as k,Text as D,ActionButton as J}from"@donotdev/components";import{useTranslation as L,getListCardFieldNames as K}from"@donotdev/core";import{formatValue as x}from"./DisplayFieldRenderer";import{DisplayThumbnail as R}from"./DisplayThumbnail";import{translateFieldLabel as Q}from"../forms/utils/translateFieldLabel";import{useCrud as U}from"../useCrud";function u(t){return t==="image"||t==="images"}function W(t){return v(()=>{const n=t.listCardFields;if(n&&!Array.isArray(n)){const s=n;return{titleFields:s.title??[],subtitleFields:s.subtitle??[],contentFields:s.content??[],footerFields:s.footer??[]}}const g=K(t),m=g.filter(s=>!u(t.fields[s]?.type)),C=g.filter(s=>u(t.fields[s]?.type)),I=m.length>0?[m[0]]:[],S=[...m.slice(1,4),...C];return{titleFields:I,subtitleFields:[],contentFields:S,footerFields:[]}},[t])}function X({item:t,entity:n,onClick:g,titleFields:m,subtitleFields:C,contentFields:I,footerFields:S,showDelete:s=!1,renderActions:w,renderOverlay:y,className:z}){const{t:o}=L([n.namespace,"crud"]),{t:F}=L("crud"),b=W(n),T=m??b.titleFields,j=C??b.subtitleFields,V=I??b.contentFields,h=S??b.footerFields,f=t,A=v(()=>{if(!T?.length)return t.id??"";const c=T.filter(l=>typeof l=="string").filter(l=>!u(n.fields[l]?.type)).map(l=>{const r=n.fields[l],a=t[l],p=r?x(a,r,o,{compact:!0,asString:!0,item:f}):a;return typeof p=="string"?p:String(p??"")}).filter(Boolean),e=!Array.isArray(n.listCardFields)&&n.listCardFields?.titleSeparator!=null?n.listCardFields.titleSeparator:" ";return c.join(e)||String(t.id??"")},[t,n.fields,T,n.listCardFields,o]),E=v(()=>j?.length&&j.filter(e=>typeof e=="string").filter(e=>!u(n.fields[e]?.type)).map(e=>{const l=n.fields[e],r=t[e],a=l?x(r,l,o,{compact:!0,asString:!0,item:f}):r;return typeof a=="string"?a:String(a??"")}).filter(Boolean).join(" ")||void 0,[t,n.fields,j,o]),M=v(()=>{if(!V?.length)return null;const c=V.map(e=>{const l=n.fields[e];if(!l||l.options?.displayValue?.(t[e],f,o)===null)return null;if(u(l.type)){const r=t[e];return r==null?null:i(R,{pictures:r,alt:String(A),aspectRatio:"16/9"},e)}return B("div",{children:[i(D,{level:"small",variant:"muted",children:Q(e,l,o)}),i(D,{children:x(t[e],l,o,{compact:!0,item:f})})]},e)}).filter(Boolean);return c.length>0?i(k,{direction:"column",gap:"tight",children:c}):null},[t,n.fields,V,A,o]),P=v(()=>{if(!h?.length)return;if(h.some(e=>u(n.fields[e]?.type))){const e=h.map(l=>{const r=n.fields[l];if(!r)return null;if(u(r.type)){const p=t[l];return p==null?null:i(R,{pictures:p,alt:"",aspectRatio:"1"},l)}const a=x(t[l],r,o,{compact:!0,item:f});return i("span",{children:a},l)});return i(k,{direction:"row",gap:"tight",align:"center",children:e.filter(Boolean)})}const c=h.map(e=>{const l=n.fields[e];return l?x(t[e],l,o,{compact:!0,item:f}):t[e]});return i(D,{level:"small",children:c.join(" \xB7 ")})},[t,n.fields,h,o]),_=U(n).delete,q=w||s?B("div",{style:{position:"absolute",top:"var(--gap-sm)",insetInlineEnd:"var(--gap-sm)",zIndex:10,display:"flex",alignItems:"flex-start",gap:"var(--gap-xs)"},onClick:d=>d.stopPropagation(),onMouseDown:d=>d.stopPropagation(),children:[w,s&&i(J,{action:async()=>{await _(t.id)},confirmText:F("delete.confirm",{defaultValue:"Are you sure you want to delete this item?"}),confirmTitle:F("delete.title",{defaultValue:"Delete Item"}),loadingText:F("delete.loading",{defaultValue:"Deleting..."}),variant:"destructive",icon:G,"aria-label":F("delete",{defaultValue:"Delete"}),children:F("delete",{defaultValue:"Delete"})})]}):null;return B(H,{title:String(A??""),subtitle:E,content:M??void 0,footer:P,clickable:!0,elevated:!0,onClick:g?()=>g(t.id):void 0,className:z,children:[y&&i("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"none",zIndex:5},children:y}),q]})}var rt=X;export{X as CrudCard,rt as default};
@@ -1,6 +1,7 @@
1
1
  import type { FieldType, EntityField } from '@donotdev/core';
2
2
  import type { DisplayFormatterOptions } from '../fieldTypeRegistry';
3
3
  import type { ReactElement } from 'react';
4
+ /** Props for {@link DisplayFieldRenderer}, renders a field value as read-only text. */
4
5
  export interface DisplayFieldRendererProps<T extends FieldType = FieldType> {
5
6
  /** Field identifier */
6
7
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"DisplayFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/DisplayFieldRenderer.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACxE,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,2BAA2B;IAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,WAAW,EACnB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,EACzD,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,GAAG,YAAY,CA+EvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,EACpE,IAAI,EACJ,MAAM,EACN,KAAK,EACL,CAAC,GACF,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,YAAY,CAyC7C;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"DisplayFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/DisplayFieldRenderer.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,uFAAuF;AACvF,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACxE,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,2BAA2B;IAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,WAAW,EACnB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,EACzD,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,GAAG,YAAY,CA+FvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,EACpE,IAAI,EACJ,MAAM,EACN,KAAK,EACL,CAAC,GACF,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,YAAY,CAyC7C;AAED,eAAe,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as t,jsxs as y}from"react/jsx-runtime";import{Text as o,Stack as u}from"@donotdev/components";import{handleError as f}from"@donotdev/core";import{getDisplayFormatter as g}from"../fieldTypeRegistry";import{translateFieldLabel as h}from"../forms/utils";function x(r,e,a,i){const n=i?.compact??!1,s=i?.asString??!1;if(r==null||r==="")return s?"\u2014":n?t("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):t(o,{variant:"muted",children:"\u2014"});const d=g(e.type),m=e.options?.displayKey;if(m){let l=String(r);if(d)try{const p=d(r,e,a,i);l=typeof p=="string"?p:String(r)}catch{}const c=(Array.isArray(m)?m:[m]).map(p=>p.replace("{{value}}",l));return a(c,{value:l})}if(d)try{return d(r,e,a,i)}catch(l){return f(l,{userMessage:`Error formatting field "${e.label||e.name}"`,context:{fieldType:e.type,fieldName:e.label||"unknown",operation:"display_format"},severity:"warning"}),s?String(r):n?t("span",{style:{color:"var(--muted-foreground)"},children:String(r)}):t(o,{variant:"muted",children:String(r)})}return f(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"}),s?String(r):n?t("span",{style:{color:"var(--muted-foreground)"},children:String(r)}):t(o,{variant:"muted",children:String(r)})}function S({name:r,config:e,value:a,t:i}){const n=x(a,e,i,{compact:!1}),s=h(r,e,i);return y(u,{direction:"row",align:"baseline",style:{marginBottom:"var(--gap-sm)",padding:"var(--gap-sm)",minHeight:"38px",alignItems:"center"},children:[y(o,{variant:"muted",style:{fontSize:"var(--font-size-sm)",fontWeight:500,minWidth:"fit-content",flexShrink:0},children:[s,":"]}),t("div",{style:{flex:1,display:"flex",alignItems:"center"},children:typeof n=="string"?t(o,{children:n}):n})]})}var j=S;export{S as DisplayFieldRenderer,j as default,x as formatValue};
1
+ "use client";import{Fragment as h,jsx as n,jsxs as p}from"react/jsx-runtime";import{Text as d,Stack as x}from"@donotdev/components";import{handleError as c,getI18nInstance as u}from"@donotdev/core";import{getDisplayFormatter as S}from"../fieldTypeRegistry";import{translateFieldLabel as F}from"../forms/utils";function b(e,r,l,t){t&&!t.locale?t.locale=u()?.language:t||(t={locale:u()?.language});const a=t?.compact??!1,s=t?.asString??!1,f=r.options?.displayValue;if(f&&t?.item){const i=f(e,t.item,l);return i===null?s?"":n(h,{}):i}if(e==null||e==="")return s?"\u2014":a?n("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):n(d,{variant:"muted",children:"\u2014"});const o=S(r.type),m=r.options?.displayKey;if(m){let i=String(e);if(o)try{const y=o(e,r,l,t);i=typeof y=="string"?y:String(e)}catch{}const g=(Array.isArray(m)?m:[m]).map(y=>y.replace("{{value}}",i));return l(g,{value:i})}if(o)try{return o(e,r,l,t)}catch(i){return c(i,{userMessage:`Error formatting field "${r.label||r.name}"`,context:{fieldType:r.type,fieldName:r.label||"unknown",operation:"display_format"},severity:"warning"}),s?String(e):a?n("span",{style:{color:"var(--muted-foreground)"},children:String(e)}):n(d,{variant:"muted",children:String(e)})}return c(new Error(`Display formatter not registered for field type: ${r.type}`),{userMessage:`Field type "${r.type}" is missing display formatter`,context:{fieldType:r.type,fieldName:r.label||"unknown",operation:"display_format",fix:"Add displayFormatter to registerBuiltinFieldType() in registerBuiltinFieldTypes.tsx"},severity:"warning"}),s?String(e):a?n("span",{style:{color:"var(--muted-foreground)"},children:String(e)}):n(d,{variant:"muted",children:String(e)})}function w({name:e,config:r,value:l,t}){const a=b(l,r,t,{compact:!1}),s=F(e,r,t);return p(x,{direction:"row",align:"baseline",style:{marginBottom:"var(--gap-sm)",padding:"var(--gap-sm)",minHeight:"38px",alignItems:"center"},children:[p(d,{variant:"muted",style:{fontSize:"var(--font-size-sm)",fontWeight:500,minWidth:"fit-content",flexShrink:0},children:[s,":"]}),n("div",{style:{flex:1,display:"flex",alignItems:"center"},children:typeof a=="string"?n(d,{children:a}):a})]})}var V=w;export{w as DisplayFieldRenderer,V as default,b as formatValue};
@@ -1,13 +1,5 @@
1
- /**
2
- * @fileoverview DisplayThumbnail component
3
- * @description Renders the thumbnail of the first picture (pictures[0]) for list cards and list views.
4
- * Normalizes string (backend-optimized thumbUrl), single Picture, or Picture[].
5
- *
6
- * @version 0.1.0
7
- * @since 0.0.1
8
- * @author AMBROISE PARK Consulting
9
- */
10
1
  import type { Picture } from '@donotdev/core';
2
+ /** Props for {@link DisplayThumbnail}, renders the first picture thumbnail for list/card views. */
11
3
  export interface DisplayThumbnailProps {
12
4
  /** Picture(s) from item — string (optimized thumbUrl), single Picture, or Picture[] */
13
5
  pictures: Picture[] | Picture | string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"DisplayThumbnail.d.ts","sourceRoot":"","sources":["../../src/components/DisplayThumbnail.tsx"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,uFAAuF;IACvF,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9C,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAmBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,GAAQ,EACR,WAAoB,EACpB,SAAS,EACT,KAAK,GACN,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA6BnD;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"DisplayThumbnail.d.ts","sourceRoot":"","sources":["../../src/components/DisplayThumbnail.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,mGAAmG;AACnG,MAAM,WAAW,qBAAqB;IACpC,uFAAuF;IACvF,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9C,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAmBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,GAAQ,EACR,WAAoB,EACpB,SAAS,EACT,KAAK,GACN,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA8BnD;AAED,eAAe,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as e}from"react/jsx-runtime";function u(r){if(r==null)return null;if(typeof r=="string")return r||null;const l=Array.isArray(r)&&r.length>0?r[0]:r;if(!l||typeof l!="object")return null;const t=l.thumbUrl??l.fullUrl;return typeof t=="string"?t:null}function a({pictures:r,alt:l="",aspectRatio:t="16/9",className:o,style:i}){const n=u(r);return n?e("div",{className:o,style:{width:"100%",aspectRatio:t,borderRadius:"var(--radius-md)",overflow:"hidden",backgroundColor:"var(--muted)",position:"relative",...i},children:e("img",{src:n,alt:l,loading:"lazy",style:{width:"100%",height:"100%",objectFit:"cover"}})}):null}var d=a;export{a as DisplayThumbnail,d as default};
1
+ "use client";import{jsx as o}from"react/jsx-runtime";import{handleImageError as a}from"@donotdev/components";function u(r){if(r==null)return null;if(typeof r=="string")return r||null;const l=Array.isArray(r)&&r.length>0?r[0]:r;if(!l||typeof l!="object")return null;const t=l.thumbUrl??l.fullUrl;return typeof t=="string"?t:null}function s({pictures:r,alt:l="",aspectRatio:t="16/9",className:e,style:i}){const n=u(r);return n?o("div",{className:e,style:{width:"100%",aspectRatio:t,borderRadius:"var(--radius-md)",overflow:"hidden",backgroundColor:"var(--muted)",position:"relative",...i},children:o("img",{src:n,alt:l,loading:"lazy",onError:a,style:{width:"100%",height:"100%",objectFit:"cover"}})}):null}var m=s;export{s as DisplayThumbnail,m as default};
@@ -1,6 +1,7 @@
1
1
  import type { GridCols } from '@donotdev/components';
2
2
  import type { Entity } from '@donotdev/core';
3
3
  export { matchesFilter } from '../utils/matchesFilter';
4
+ /** Props for {@link EntityFilters}, auto-generates filter UI based on entity field types. */
4
5
  export interface EntityFiltersProps<T extends Record<string, any> & {
5
6
  id: string;
6
7
  } = Record<string, any> & {
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFilters.d.ts","sourceRoot":"","sources":["../../src/components/EntityFilters.tsx"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAc7C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IACrE,EAAE,EAAE,MAAM,CAAC;CACZ;IAED,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IAEf,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,sFAAsF;IACtF,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAE/B,sFAAsF;IACtF,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB,8GAA8G;IAC9G,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;CACZ;AAED;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IACrE,EAAE,EAAE,MAAM,CAAC;CACZ,EACD,EACA,MAAM,EACN,IAAI,EAAE,QAAQ,EACd,cAAc,EACd,OAAkB,EAClB,IAAI,GACL,EAAE,kBAAkB,CAAC,CAAC,CAAC,kDA0pBvB"}
1
+ {"version":3,"file":"EntityFilters.d.ts","sourceRoot":"","sources":["../../src/components/EntityFilters.tsx"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAc7C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,6FAA6F;AAC7F,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IACrE,EAAE,EAAE,MAAM,CAAC;CACZ;IAED,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IAEf,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,sFAAsF;IACtF,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAE/B,sFAAsF;IACtF,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB,8GAA8G;IAC9G,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;CACZ;AAED;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IACrE,EAAE,EAAE,MAAM,CAAC;CACZ,EACD,EACA,MAAM,EACN,IAAI,EAAE,QAAQ,EACd,cAAc,EACd,OAAkB,EAClB,IAAI,GACL,EAAE,kBAAkB,CAAC,CAAC,CAAC,kDA0pBvB"}
@@ -20,6 +20,7 @@ interface ControlledProps<T extends FieldType, TFieldValues extends FieldValues
20
20
  onChange?: never;
21
21
  error?: never;
22
22
  }
23
+ /** Props for {@link FormFieldRenderer}, dispatches to the correct field component via FieldRegistry. */
23
24
  export type FormFieldRendererProps<T extends FieldType, TFieldValues extends FieldValues = FieldValues> = UncontrolledProps<T> | ControlledProps<T, TFieldValues>;
24
25
  /**
25
26
  * FormFieldRenderer - renders fields via registry lookup
@@ -1 +1 @@
1
- {"version":3,"file":"FormFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FormFieldRenderer.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM5D,UAAU,0BAA0B,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED,UAAU,iBAAiB,CACzB,CAAC,SAAS,SAAS,CACnB,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,UAAU,eAAe,CACvB,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C,iBAAiB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,EACA,IAAI,EACJ,MAAM,EACN,CAAC,EACD,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,YAAY,CA0GxD;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"FormFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FormFieldRenderer.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM5D,UAAU,0BAA0B,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED,UAAU,iBAAiB,CACzB,CAAC,SAAS,SAAS,CACnB,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,UAAU,eAAe,CACvB,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,wGAAwG;AACxG,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C,iBAAiB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,EACA,IAAI,EACJ,MAAM,EACN,CAAC,EACD,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,YAAY,CAwGxD;AAED,eAAe,iBAAiB,CAAC"}
@@ -1 +1 @@
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";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 P=w;export{w as FormFieldRenderer,P 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";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,c=s(v),y=x.getUncontrolledComponent(e.type);return y?l(y,{name:r,label:e.label||r,value:a,onChange:c,error:u,t,config:e,...e.options}):l(g,{label:e.label||r,value:a,onChange:c,error:u||void 0,...e.options})}var P=w;export{w as FormFieldRenderer,P as default};
@@ -1,5 +1,6 @@
1
1
  import type { FormEventHandler, ReactNode } from 'react';
2
2
  import type { UseFormReturn, FieldValues } from 'react-hook-form';
3
+ /** Props for {@link FormLayout}, wraps a form with submit button, loading state, and layout grid. */
3
4
  export interface FormDnDevLayoutProps<T extends FieldValues> {
4
5
  /** The title of the form */
5
6
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/components/FormLayout.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,WAAW;IACzD,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC5C,iCAAiC;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,mIAaxC,oBAAoB,CAAC,CAAC,CAAC,4CAuGzB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/components/FormLayout.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElE,qGAAqG;AACrG,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,WAAW;IACzD,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC5C,iCAAiC;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,mIAaxC,oBAAoB,CAAC,CAAC,CAAC,4CAuGzB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{AddressFieldComponent as m}from"../../form/fields";import{convertValidationRules as u}from"../types";function h(s){const{control:a,errors:r,fieldConfig:n,t:d}=s,{name:e,label:c,validation:o}=n,t=(n.options||{}).fieldSpecific;return l(f,{name:e,control:a,rules:o?u(o):void 0,render:({field:i})=>l(m,{label:d(c),value:i.value??void 0,onChange:p=>i.onChange(p),error:!!r[e],helperText:r[e]?.message,required:o?.required,enableGoogleMaps:t?.enableGoogleMaps,extractDistrictCode:t?.extractDistrictCode})})}export{h as ControlledAddressField};
1
+ "use client";import{jsx as i}from"react/jsx-runtime";import{Controller as m}from"react-hook-form";import{AddressFieldComponent as f}from"../../form/fields";import{convertValidationRules as u}from"../types";function j(l){const{control:s,errors:C,fieldConfig:o,t:a}=l,{name:d,label:c,validation:e}=o,r=(o.options||{}).fieldSpecific;return i(m,{name:d,control:s,rules:e?u(e):void 0,render:({field:n,fieldState:t})=>i(f,{label:a(c),value:n.value??void 0,onChange:p=>n.onChange(p),error:!!t.error,helperText:t.error?.message,required:e?.required,enableGoogleMaps:r?.enableGoogleMaps,extractDistrictCode:r?.extractDistrictCode})})}export{j as ControlledAddressField};
@@ -1 +1 @@
1
- {"version":3,"file":"ControlledDateField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledDateField.tsx"],"names":[],"mappings":"AAMA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C;;;;;;GAMG;AAEH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,CA2C7E"}
1
+ {"version":3,"file":"ControlledDateField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledDateField.tsx"],"names":[],"mappings":"AAMA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C;;;;;;GAMG;AAEH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,CA0C7E"}
@@ -1 +1 @@
1
- "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{DateFieldComponent as f}from"../../form/fields";import{convertValidationRules as C}from"../types";function j(a){const{control:l,errors:r,fieldConfig:m,t:i}=a,{name:e,label:d,validation:o,type:s}=m,c={date:"date","datetime-local":"datetime-local",month:"month",time:"time",week:"week"}[s]||"date";return n(p,{name:e,control:l,rules:o?C(o):void 0,render:({field:t})=>n(f,{...t,label:i(d),value:t.value??null,onChange:u=>t.onChange(u),error:!!r[e],helperText:r[e]?.message,required:o?.required,mode:c})})}export{j as ControlledDateField};
1
+ "use client";import{jsx as t}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 k(r){const{control:n,errors:g,fieldConfig:a,t:l}=r,{name:m,label:i,validation:e,type:d}=a,s={date:"date","datetime-local":"datetime-local",month:"month",time:"time",week:"week"}[d]||"date";return t(p,{name:m,control:n,rules:e?C(e):void 0,render:({field:o,fieldState:c})=>t(f,{...o,label:l(i),value:o.value??null,onChange:u=>o.onChange(u),error:c.error?.message,required:e?.required,mode:s})})}export{k as ControlledDateField};
@@ -1 +1 @@
1
- "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{GeoPointFieldComponent as p}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:g}=l,{name:n,label:m,validation:o}=s;return a(u,{name:n,control:i,rules:o?C(o):void 0,render:({field:e})=>{const c=r=>{if("target"in r)try{const d=JSON.parse(r.target.value);e.onChange(d)}catch{e.onChange({lat:0,lng:0})}else e.onChange(r||{lat:0,lng:0})};return a(p,{label:g(m),value:e.value||{lat:0,lng:0},onChange:c,error:!!t[n],helperText:t[n]?.message,required:o?.required})}})}export{b as ControlledGeoPointField};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{GeoPointFieldComponent as p}from"../../form/fields";import{convertValidationRules as C}from"../types";function j(a){const{control:l,errors:h,fieldConfig:i,t:s}=a,{name:g,label:m,validation:r}=i;return t(d,{name:g,control:l,rules:r?C(r):void 0,render:({field:e,fieldState:o})=>{const c=n=>{if("target"in n)try{const u=JSON.parse(n.target.value);e.onChange(u)}catch{e.onChange({lat:0,lng:0})}else e.onChange(n||{lat:0,lng:0})};return t(p,{label:s(m),value:e.value||{lat:0,lng:0},onChange:c,error:!!o.error,helperText:o.error?.message,required:r?.required})}})}export{j as ControlledGeoPointField};
@@ -1 +1 @@
1
- "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{MapFieldComponent as g}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:m}=l,{name:r,label:c,validation:n}=s;return a(u,{name:r,control:i,rules:n?C(n):void 0,render:({field:e})=>{const p=o=>{if("target"in o)try{const d=JSON.parse(o.target.value);e.onChange(d)}catch{e.onChange({})}else e.onChange(o||{})};return a(g,{label:m(c),value:e.value||{},onChange:p,error:!!t[r],helperText:t[r]?.message,required:n?.required})}})}export{b as ControlledMapField};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{MapFieldComponent as g}from"../../form/fields";import{convertValidationRules as C}from"../types";function j(a){const{control:l,errors:h,fieldConfig:s,t:i}=a,{name:m,label:c,validation:e}=s;return t(d,{name:m,control:l,rules:e?C(e):void 0,render:({field:r,fieldState:n})=>{const p=o=>{if("target"in o)try{const u=JSON.parse(o.target.value);r.onChange(u)}catch{r.onChange({})}else r.onChange(o||{})};return t(g,{label:i(c),value:r.value||{},onChange:p,error:!!n.error,helperText:n.error?.message,required:e?.required})}})}export{j as ControlledMapField};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{RichTextComponent as h}from"../../form/fields";import{convertValidationRules as f}from"../types";function R(a){const{control:i,errors:r,fieldConfig:s,t:m,placeholder:c}=a,{name:e,label:d,validation:o,options:l={}}=s;return t(u,{name:e,control:i,rules:o?f(o):void 0,render:({field:n})=>t(h,{label:m(d),value:n.value??"",onChange:p=>n.onChange(p),error:r[e]?.message,helperText:r[e]?.message,required:o?.required,placeholder:c||l.placeholder,className:l.className})})}export{R as ControlledRichTextField};
1
+ "use client";import{jsx as n}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 T(a){const{control:t,errors:x,fieldConfig:s,t:i,placeholder:m}=a,{name:c,label:d,validation:e,options:r={}}=s;return n(u,{name:c,control:t,rules:e?f(e):void 0,render:({field:o,fieldState:l})=>n(h,{label:i(d),value:o.value??"",onChange:p=>o.onChange(p),error:l.error?.message,helperText:l.error?.message,required:e?.required,placeholder:m||r.placeholder,className:r.className})})}export{T as ControlledRichTextField};
@@ -1 +1 @@
1
- {"version":3,"file":"ControlledTimestampField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledTimestampField.tsx"],"names":[],"mappings":"AAMA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C;;;;;;GAMG;AAEH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAuBd"}
1
+ {"version":3,"file":"ControlledTimestampField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledTimestampField.tsx"],"names":[],"mappings":"AAMA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C;;;;;;GAMG;AAEH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAsBd"}
@@ -1 +1 @@
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
+ "use client";import{jsx as o}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 b(n){const{control:t,errors:f,fieldConfig:l,t:i}=n,{name:a,label:m,validation:e}=l;return o(d,{name:a,control:t,rules:e?c(e):void 0,render:({field:r,fieldState:s})=>o(p,{...r,label:i(m),value:r.value??null,onChange:u=>r.onChange(u),error:s.error?.message,required:e?.required})})}export{b as ControlledTimestampField};
@@ -1 +1 @@
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
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{DocumentFieldComponent as d}from"../../form/fields";import{convertValidationRules as f}from"../types";function F(i){const{control:m,errors:x,fieldConfig:o,t:s}=i,{name:r,label:u,validation:e}=o,n=o.options||{};return a(p,{name:r,control:m,rules:e?f(e):void 0,render:({field:t,fieldState:l})=>a(d,{name:r,label:s(u),value:t.value??null,onChange:c=>t.onChange(c),error:!!l.error,helperText:l.error?.message,required:e?.required,multiple:!1,maxFiles:1,maxSize:n.maxSize,storagePath:n.storagePath})})}export{F as ControlledDocumentField};
@@ -1 +1 @@
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
+ "use client";import{jsx as i}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{FileFieldComponent as c}from"../../form/fields";import{convertValidationRules as f}from"../types";function v(a){const{control:s,errors:x,fieldConfig:o,t:m}=a,{name:r,label:u,validation:e}=o,n=o.options||{};return i(d,{name:r,control:s,rules:e?f(e):void 0,render:({field:l,fieldState:t})=>i(c,{name:r,label:m(u),value:l.value??null,onChange:p=>l.onChange(p),error:!!t.error,helperText:t.error?.message,required:e?.required,multiple:!1,maxFiles:1,maxSize:n.maxSize,storagePath:n.storagePath})})}export{v as ControlledFileField};
@@ -1 +1 @@
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
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{ImageFieldComponent as c}from"../../form/fields";import{convertValidationRules as g}from"../types";function F(i){const{control:m,errors:f,fieldConfig:o,t:s}=i,{name:r,label:u,validation:e}=o,n=o.options||{};return a(d,{name:r,control:m,rules:e?g(e):void 0,render:({field:t,fieldState:l})=>a(c,{name:r,label:s(u),value:t.value??null,onChange:p=>t.onChange(p),error:!!l.error,helperText:l.error?.message,required:e?.required,multiple:!1,maxFiles:1,maxSize:n.maxSize,storagePath:n.storagePath})})}export{F as ControlledImageField};
@@ -1 +1 @@
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
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as x}from"react-hook-form";import{DocumentFieldComponent as v}from"../../form/fields";import{convertValidationRules as d}from"../types";function y(i){const{control:u,errors:g,fieldConfig:n,t:m}=i,{name:t,label:s,validation:r}=n,o=n.options||{};return l(x,{name:t,control:u,rules:r?d(r):void 0,render:({field:e,fieldState:a})=>{const c=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return l(v,{name:t,label:m(s),value:c,onChange:p=>e.onChange(p),error:!!a.error,helperText:a.error?.message,required:r?.required,multiple:!0,maxFiles:o.maxFiles??10,maxSize:o.maxSize,storagePath:o.storagePath})}})}export{y as ControlledMultiDocumentField};
@@ -1 +1 @@
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
+ "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as x}from"react-hook-form";import{FileFieldComponent as v}from"../../form/fields";import{convertValidationRules as d}from"../types";function y(i){const{control:s,errors:g,fieldConfig:n,t:u}=i,{name:a,label:m,validation:r}=n,o=n.options||{};return l(x,{name:a,control:s,rules:r?d(r):void 0,render:({field:e,fieldState:t})=>{const p=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return l(v,{name:a,label:u(m),value:p,onChange:c=>e.onChange(c),error:!!t.error,helperText:t.error?.message,required:r?.required,multiple:!0,maxFiles:o.maxFiles??10,maxSize:o.maxSize,storagePath:o.storagePath})}})}export{y as ControlledMultiFileField};
@@ -1 +1 @@
1
- "use client";import{jsx as l}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{ImageFieldComponent as g}from"../../form/fields";import{convertValidationRules as x}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(d,{name:r,control:m,rules:o?x(o):void 0,render:({field:e})=>{const c=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return l(g,{name:r,label:s(u),value:c,onChange:p=>e.onChange(p),error:!!n[r],helperText:n[r]?.message,required:o?.required,multiple:!0,maxFiles:a.maxFiles??10,maxSize:a.maxSize,storagePath:a.fieldSpecific?.storagePath})}})}export{F 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 y(i){const{control:m,errors:v,fieldConfig:a,t:s}=i,{name:n,label:u,validation:r}=a,o=a.options||{};return l(g,{name:n,control:m,rules:r?d(r):void 0,render:({field:e,fieldState:t})=>{const c=Array.isArray(e.value)?e.value:e.value?[e.value]:null;return l(x,{name:n,label:s(u),value:c,onChange:p=>e.onChange(p),error:!!t.error,helperText:t.error?.message,required:r?.required,multiple:!0,maxFiles:o.maxFiles??10,maxSize:o.maxSize,storagePath:o.fieldSpecific?.storagePath})}})}export{y as ControlledMultiImageField};
@@ -1 +1 @@
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};
1
+ "use client";import{jsx as u}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 q(c){const{control:i,errors:x,fieldConfig:o,t:s,placeholder:p}=c,{name:d,label:m,validation:r}=o,l=(o.options||{}).fieldSpecific;return u(g,{name:d,control:i,rules:r?y(r):void 0,render:({field:e,fieldState:t})=>{const f=h=>{const n=h.target.value;if(n==null||n===""){e.onChange(null);return}const a=typeof n=="number"?n/100:parseFloat(String(n))/100;isNaN(a)?e.onChange(null):e.onChange(a)},C=e.value!=null&&!isNaN(e.value)?Math.round(e.value*100):void 0;return u(v,{label:s(m),value:C,onChange:f,currency:l?.currency||"EUR",locale:l?.locale,error:!!t.error,helperText:t.error?.message,required:r?.required,placeholder:p})}})}export{q as ControlledCurrencyField};
@@ -1 +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
+ "use client";import{jsx as l}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 j(s){const{control:a,errors:x,fieldConfig:n,t:i}=s,{name:m,label:d,validation:e}=n,o=(n.options||{}).fieldSpecific;return l(c,{name:m,control:a,rules:e?f(e):void 0,render:({field:r,fieldState:t})=>l(u,{label:i(d),value:r.value??0,onChange:p=>r.onChange(p),error:!!t.error,helperText:t.error?.message,required:e?.required,disabled:r.disabled,min:o?.min??0,max:o?.max??480,step:o?.step??5,t:i})})}export{j as ControlledDurationField};
@@ -1 +1 @@
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
+ "use client";import{jsx as s}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 j(m){const{control:u,errors:v,fieldConfig:a,t:c,placeholder:x}=m,{name:d,label:p,validation:e}=a,t=a.options||{},n=t.fieldSpecific;return s(g,{name:d,control:u,rules:e?C(e):void 0,render:({field:r,fieldState:l})=>{const f=o=>{if(o.target.value===""||o.target.value===null){r.onChange(null);return}try{const i=parseFloat(o.target.value);isNaN(i)||r.onChange(i)}catch{r.onChange(0)}};return s(h,{...r,label:c(p),value:r.value??void 0,onChange:f,error:!!l.error,helperText:l.error?.message,required:e?.required,min:e?.min,max:e?.max,step:n?.mask==="currency"?.01:n?.mask==="mileage"?1:void 0,mask:n?.mask||"number",className:t.className})}})}export{j as ControlledNumberField};
@@ -1 +1 @@
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
+ "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 h}from"../types";function b(a){const{control:s,errors:C,fieldConfig:t,t:i,placeholder:m}=a,{name:d,label:c,validation:e,options:o={}}=t;return n(p,{name:d,control:s,rules:e?h(e):void 0,render:({field:r,fieldState:l})=>n(u,{...r,label:i(c),value:r.value??"",onChange:r.onChange,error:!!l.error,helperText:l.error?.message,required:e?.required,placeholder:m||o.placeholder,className:o.className})})}export{b 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 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
+ "use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{PhoneNumberComponent as c}from"../../form/fields";import{convertValidationRules as d}from"../types";function x(t){const{control:l,errors:g,fieldConfig:a,t:i}=t,{name:m,label:s,validation:e}=a;return n(p,{name:m,control:l,rules:e?d(e):void 0,render:({field:r,fieldState:o})=>n(c,{label:i(s),value:typeof r.value=="string"?r.value:"",onChange:u=>r.onChange(u.target.value||""),error:o.error?.message,helperText:o.error?.message,required:e?.required})})}export{x as ControlledPhoneField};