@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.
- package/dist/CrudService.d.ts +9 -0
- package/dist/CrudService.d.ts.map +1 -1
- package/dist/CrudService.js +2 -2
- package/dist/CrudStore.d.ts.map +1 -1
- package/dist/CrudStore.js +1 -1
- package/dist/FieldRegistry.d.ts +2 -12
- package/dist/FieldRegistry.d.ts.map +1 -1
- package/dist/FieldRegistry.js +1 -1
- package/dist/components/CrudButton.d.ts +1 -0
- package/dist/components/CrudButton.d.ts.map +1 -1
- package/dist/components/CrudCard.d.ts +1 -1
- package/dist/components/CrudCard.d.ts.map +1 -1
- package/dist/components/CrudCard.js +1 -1
- package/dist/components/DisplayFieldRenderer.d.ts +1 -0
- package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
- package/dist/components/DisplayFieldRenderer.js +1 -1
- package/dist/components/DisplayThumbnail.d.ts +1 -9
- package/dist/components/DisplayThumbnail.d.ts.map +1 -1
- package/dist/components/DisplayThumbnail.js +1 -1
- package/dist/components/EntityFilters.d.ts +1 -0
- package/dist/components/EntityFilters.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.d.ts +1 -0
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +1 -1
- package/dist/components/FormLayout.d.ts +1 -0
- package/dist/components/FormLayout.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
- package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledDateField.js +1 -1
- package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
- package/dist/components/controlled/complex/ControlledMapField.js +1 -1
- package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
- package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
- package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
- package/dist/components/controlled/file/ControlledFileField.js +1 -1
- package/dist/components/controlled/file/ControlledImageField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
- package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
- package/dist/components/controlled/input/ControlledDurationField.js +1 -1
- package/dist/components/controlled/input/ControlledNumberField.js +1 -1
- package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
- package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
- package/dist/components/controlled/input/ControlledPriceField.js +1 -1
- package/dist/components/controlled/input/ControlledRangeField.js +1 -1
- package/dist/components/controlled/input/ControlledRatingField.js +1 -1
- package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
- package/dist/components/controlled/input/ControlledTextField.d.ts +5 -5
- package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledTextField.js +1 -1
- package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
- package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
- package/dist/components/controlled/select/ControlledDropdownField.d.ts +2 -4
- package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -1
- package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
- package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +2 -4
- package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -1
- package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
- package/dist/components/controlled/select/ControlledRadioField.d.ts +2 -4
- package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -1
- package/dist/components/controlled/select/ControlledRadioField.js +1 -1
- package/dist/components/controlled/select/ControlledReferenceField.js +1 -1
- package/dist/components/controlled/select/ControlledYearField.js +1 -1
- package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -1
- package/dist/components/fields/display/DateFieldDisplay.js +1 -1
- package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -1
- package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
- package/dist/components/fields/display/TextFieldDisplay.js +1 -1
- package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -1
- package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
- package/dist/components/form/fields/DateFieldComponent.d.ts +2 -2
- package/dist/components/form/fields/DateFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/DateFieldComponent.js +1 -1
- package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
- package/dist/components/form/fields/FileFieldComponent.js +1 -1
- package/dist/components/form/fields/ImageFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/ImageFieldComponent.js +1 -1
- package/dist/components/form/fields/TextFieldComponent.d.ts +2 -2
- package/dist/components/form/fields/TextFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/TextFieldComponent.js +1 -1
- package/dist/components/form/fields/TimestampFieldComponent.d.ts +2 -2
- package/dist/components/form/fields/TimestampFieldComponent.d.ts.map +1 -1
- package/dist/contexts/UploadContext.d.ts +1 -0
- package/dist/contexts/UploadContext.d.ts.map +1 -1
- package/dist/fieldTypeRegistry.store.d.ts.map +1 -1
- package/dist/fieldTypeRegistry.store.js +1 -1
- package/dist/fieldTypeRegistry.types.d.ts +4 -0
- package/dist/fieldTypeRegistry.types.d.ts.map +1 -1
- package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
- package/dist/forms/hooks/useEntityForm.js +1 -1
- package/dist/forms/types.d.ts +5 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/utils/buildInitialValues.d.ts.map +1 -1
- package/dist/forms/utils/buildInitialValues.js +1 -1
- package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
- package/dist/forms/utils/getFieldsForOperation.js +1 -1
- package/dist/forms/utils/isFieldEditable.d.ts +7 -1
- package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
- package/dist/forms/utils/isFieldEditable.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useCrudFilters.d.ts +2 -0
- package/dist/hooks/useCrudFilters.d.ts.map +1 -1
- package/dist/hooks/useCrudPageSize.d.ts +29 -0
- package/dist/hooks/useCrudPageSize.d.ts.map +1 -0
- package/dist/hooks/useCrudPageSize.js +1 -0
- package/dist/hooks/useEntityFavorites.d.ts +2 -0
- package/dist/hooks/useEntityFavorites.d.ts.map +1 -1
- package/dist/hooks/useFileUpload.d.ts.map +1 -1
- package/dist/hooks/useFileUpload.js +1 -1
- package/dist/hooks/useReferenceResolver.d.ts +1 -1
- package/dist/hooks/useReferenceResolver.d.ts.map +1 -1
- package/dist/hooks/useReferenceResolver.js +1 -1
- package/dist/hooks/useRelatedItems.d.ts +2 -0
- package/dist/hooks/useRelatedItems.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
- package/dist/registerBuiltinFieldTypes.js +1 -1
- package/dist/stores/FormStore.d.ts +2 -0
- package/dist/stores/FormStore.d.ts.map +1 -1
- package/dist/stores/FormStore.js +1 -1
- package/dist/stores/UploadStore.d.ts +9 -3
- package/dist/stores/UploadStore.d.ts.map +1 -1
- package/dist/stores/UploadStore.js +1 -1
- package/dist/symbol-index.json +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/useCrud.d.ts +1 -0
- package/dist/useCrud.d.ts.map +1 -1
- package/dist/useCrud.js +1 -1
- package/dist/useCrudCardList.d.ts +5 -3
- package/dist/useCrudCardList.d.ts.map +1 -1
- package/dist/useCrudList.d.ts +5 -3
- package/dist/useCrudList.d.ts.map +1 -1
- package/dist/utils/clientListProcessing.d.ts +21 -2
- package/dist/utils/clientListProcessing.d.ts.map +1 -1
- package/dist/utils/clientListProcessing.js +1 -1
- package/dist/utils/fileStorage.d.ts +2 -0
- package/dist/utils/fileStorage.d.ts.map +1 -1
- package/dist/utils/fileStorage.js +1 -1
- package/dist/utils/imageProcessing.d.ts.map +1 -1
- package/dist/utils/imageProcessing.js +1 -1
- package/dist/utils/imageStorage.d.ts +2 -0
- package/dist/utils/imageStorage.d.ts.map +1 -1
- package/dist/utils/imageStorage.js +1 -1
- package/guidelines/COMPONENTS.md +234 -0
- package/guidelines/CRUD.md +340 -0
- package/guidelines/GOTCHAS.md +46 -0
- package/package.json +7 -4
package/dist/CrudService.d.ts
CHANGED
|
@@ -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":"AA+CA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,eAAe,EAChB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"CrudService.d.ts","sourceRoot":"","sources":["../src/CrudService.ts"],"names":[],"mappings":"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"}
|
package/dist/CrudService.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{toast as
|
|
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};
|
package/dist/CrudStore.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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};
|
package/dist/FieldRegistry.d.ts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"FieldRegistry.d.ts","sourceRoot":"","sources":["../src/FieldRegistry.ts"],"names":[],"mappings":"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"}
|
package/dist/FieldRegistry.js
CHANGED
|
@@ -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:
|
|
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,
|
|
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
|
|
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+
|
|
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
|
|
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":"
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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};
|