@donotdev/crud 0.0.30 → 0.0.31
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.js +2 -2
- package/dist/CrudStore.js +1 -1
- package/dist/FieldRegistry.js +1 -1
- package/dist/adapters/FunctionsAdapter.js +1 -1
- package/dist/components/CrudButton.js +1 -1
- package/dist/components/CrudCard.d.ts.map +1 -1
- package/dist/components/CrudCard.js +1 -1
- package/dist/components/DateFilter.js +1 -1
- package/dist/components/DisplayFieldRenderer.js +1 -1
- package/dist/components/DisplayThumbnail.js +1 -1
- package/dist/components/EntityFilters.js +1 -1
- package/dist/components/FormFieldRenderer.js +1 -1
- package/dist/components/FormLayout.js +1 -1
- package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
- package/dist/components/controlled/complex/ControlledDateField.js +1 -1
- package/dist/components/controlled/complex/ControlledFieldArrayField.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/ControlledMultiInputField.js +1 -1
- package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
- package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
- package/dist/components/controlled/complex/index.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/file/index.js +1 -1
- package/dist/components/controlled/index.js +1 -1
- package/dist/components/controlled/input/ControlledCheckboxField.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/ControlledGdprConsentField.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.js +1 -1
- package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
- package/dist/components/controlled/input/index.js +1 -1
- package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
- package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
- package/dist/components/controlled/select/ControlledMultiDropdownField.js +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/controlled/select/index.js +1 -1
- package/dist/components/controlled/types.js +1 -1
- package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
- package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
- package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
- package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
- package/dist/components/fields/display/DateFieldDisplay.js +1 -1
- package/dist/components/fields/display/DropdownDisplay.js +1 -1
- package/dist/components/fields/display/FileFieldDisplay.js +1 -1
- package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
- package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
- package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
- package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
- package/dist/components/fields/display/MapFieldDisplay.js +1 -1
- package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
- package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
- package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
- package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
- package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
- package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
- package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
- package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
- package/dist/components/fields/display/RichTextDisplay.js +2 -2
- package/dist/components/fields/display/TextAreaDisplay.js +1 -1
- package/dist/components/fields/display/TextFieldDisplay.js +1 -1
- package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
- package/dist/components/fields/display/index.js +1 -1
- package/dist/components/form/fields/AddressFieldComponent.js +1 -1
- package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
- package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
- package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
- package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
- package/dist/components/form/fields/ComboboxComponent.js +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.js +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/DropdownComponent.js +1 -1
- package/dist/components/form/fields/DurationFieldComponent.js +1 -1
- package/dist/components/form/fields/FileFieldComponent.js +1 -1
- package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
- package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
- package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
- package/dist/components/form/fields/ImageFieldComponent.js +1 -1
- package/dist/components/form/fields/MapFieldComponent.js +1 -1
- package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
- package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
- package/dist/components/form/fields/NumberFieldComponent.js +1 -1
- package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
- package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
- package/dist/components/form/fields/PriceFieldComponent.js +1 -1
- package/dist/components/form/fields/RadioFieldComponent.js +1 -1
- package/dist/components/form/fields/RangeFieldComponent.js +1 -1
- package/dist/components/form/fields/RatingFieldComponent.js +1 -1
- package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
- package/dist/components/form/fields/RichTextComponent.js +1 -1
- package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
- package/dist/components/form/fields/TextAreaComponent.js +1 -1
- package/dist/components/form/fields/TextFieldComponent.js +1 -1
- package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
- package/dist/components/form/fields/index.js +1 -1
- package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
- package/dist/components/form/internal/ImageViewerDialog.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/contexts/UploadContext.js +1 -1
- package/dist/contexts/index.js +1 -1
- package/dist/fieldTypeRegistry.js +1 -1
- package/dist/fieldTypeRegistry.store.js +1 -1
- package/dist/forms/hooks/index.js +1 -1
- package/dist/forms/hooks/useController.js +1 -1
- package/dist/forms/hooks/useEntityField.js +1 -1
- package/dist/forms/hooks/useEntityForm.js +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/utils/buildInitialValues.js +1 -1
- package/dist/forms/utils/getFieldsForOperation.js +1 -1
- package/dist/forms/utils/index.js +1 -1
- package/dist/forms/utils/isFieldEditable.js +1 -1
- package/dist/forms/utils/translateFieldLabel.js +1 -1
- package/dist/forms/utils/validateEntity.js +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useCrudFilters.js +1 -1
- package/dist/hooks/useEntityFavorites.js +1 -1
- package/dist/hooks/useFieldConditions.js +1 -1
- package/dist/hooks/useFileUpload.js +1 -1
- package/dist/hooks/useReferenceResolver.js +1 -1
- package/dist/hooks/useRelatedItems.js +1 -1
- package/dist/hooks/useUnsavedChangesWarning.js +1 -1
- package/dist/index.js +1 -1
- package/dist/registerBuiltinFieldTypes.js +1 -1
- package/dist/stores/FormStore.js +1 -1
- package/dist/stores/UploadStore.js +1 -1
- package/dist/stores/index.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.js +1 -1
- package/dist/useBaseCrudList.js +1 -1
- package/dist/useCrud.js +1 -1
- package/dist/useCrudCardList.js +1 -1
- package/dist/useCrudList.js +1 -1
- package/dist/utils/clientListProcessing.js +1 -1
- package/dist/utils/collections.js +1 -1
- package/dist/utils/fileStorage.js +1 -1
- package/dist/utils/imageProcessing.js +1 -1
- package/dist/utils/imageStorage.js +1 -1
- package/dist/utils/imageUtils.js +1 -1
- package/dist/utils/matchesFilter.js +1 -1
- package/dist/utils/mergeWithOptimistic.js +1 -1
- package/dist/utils/scopeUtils.js +1 -1
- package/dist/utils/uploadValidation.js +1 -1
- package/dist/workflows/WorkflowPersistence.js +1 -1
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/useEntityWorkflow.js +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function l(n,c){if(c in n)return n[c];const i=c.replace(/_([a-z])/g,(o,e)=>e.toUpperCase());if(i!==c&&i in n)return n[i]}function s(n,c){if(c in n)return!0;const i=c.replace(/_([a-z])/g,(o,e)=>e.toUpperCase());return i!==c&&i in n}function p(n,c){const i=c??{},o={...i};return Object.entries(n.fields).forEach(([e,t])=>{const r=l(o,e);r!==void 0&&!(e in o)&&(o[e]=r);const a=!s(i,e)||r===null||r===void 0;if(t.type==="switch"){if(r==null){const u=t.options?.fieldSpecific;o[e]=u?.uncheckedValue??!1}}else a&&(t.type==="price"?o[e]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?o[e]=!1:t.type==="text"||t.type==="textarea"||t.type==="email"||t.type==="url"||t.type==="tel"||t.type==="iban"||t.type==="password"||t.type==="color"?o[e]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(o[e]=void 0))}),o}function y(n){return p(n,{})}export{p as buildInitialFromRecord,y as buildSchemaDefaults};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isFieldVisible as
|
|
1
|
+
import{isFieldVisible as u}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",f=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,b=Object.entries(f),s=[];for(const[a,p]of b){const t=p,o=t.visibility||"guest";if(!u(o,n)||i==="create"&&o==="technical"||i==="edit"&&l&&!l.includes(a))continue;let c=m(t.editable,n,i);i==="edit"&&o==="technical"&&t.editable===void 0&&(c=!1),s.push({name:a,config:t,editable:c})}return s}export{g as getFieldsForOperation};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isFieldEditable as
|
|
1
|
+
import{isFieldEditable as a}from"./isFieldEditable";import{getFieldsForOperation as t}from"./getFieldsForOperation";import{validateEntity as e}from"./validateEntity";import{translateFieldLabel as i,translateLabel as l}from"./translateFieldLabel";export{t as getFieldsForOperation,a as isFieldEditable,i as translateFieldLabel,l as translateLabel,e as validateEntity};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasRoleAccess as t,USER_ROLES as
|
|
1
|
+
import{hasRoleAccess as t,USER_ROLES as i}from"@donotdev/core";function r(a,o,s){return a===void 0||a===!0?!0:a===!1?!1:a==="admin"?t(o,i.ADMIN):a==="create-only"?s==="create":!0}export{r as isFieldEditable};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function r(n,s){if(typeof n=="string"&&n.includes(":")){const a=n.split(":"),t=a[1]??n,i=a[0];if(t.startsWith("status.")){const l=s(t);return l!==t&&l!==`${i}:${t}`?l:s(t,{ns:i})}return s(t,{ns:i})}return s(n)}function e(n,s,a){const t=s?.label||n;return r(t,a)}export{e as translateFieldLabel,r as translateLabel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function
|
|
1
|
+
import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function i(t,r,c="create"){const e=p(t),u={create:e.create,draft:e.draft,update:e.update,full:e.get}[c],s=o.safeParse(u,r);return s.success?{success:!0,data:s.output}:{success:!1,issues:s.issues.map(a=>({path:a.path?.map(m=>m.key).join(".")||"",message:a.message}))}}export{i as validateEntity};
|
package/dist/hooks/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useFileUpload as
|
|
1
|
+
import{useFileUpload as e}from"./useFileUpload";import{useUnsavedChangesWarning as s}from"./useUnsavedChangesWarning";import{useEntityFavorites as r}from"./useEntityFavorites";import{useCrudFilters as a}from"./useCrudFilters";import{useRelatedItems as o}from"./useRelatedItems";import{useFieldConditions as i}from"./useFieldConditions";import{useReferenceResolver as t}from"./useReferenceResolver";export{a as useCrudFilters,r as useEntityFavorites,i as useFieldConditions,e as useFileUpload,t as useReferenceResolver,o as useRelatedItems,s as useUnsavedChangesWarning};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const
|
|
1
|
+
import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const c={};function u(r){const{collection:e}=r,i=s(t=>t.collections[e]?.ui?.filters??c),l=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),a=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:i,setFilters:l,showFavoritesOnly:n,setShowFavoritesOnly:a}}export{u as useCrudFilters};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as
|
|
1
|
+
import{useCallback as o}from"react";import{useLocalStorage as p}from"@donotdev/core";function y(s={}){const{storageKey:l,collection:u="entities"}=s,d=l||`favorites-${u}`,{value:i,setValue:a,isLoaded:c}=p(d,{defaultValue:[]}),n=o(e=>i.includes(e),[i]),v=o(e=>{a(t=>t.includes(e)?t.filter(r=>r!==e):[...t,e])},[a]),f=o(e=>{a(t=>t.includes(e)?t:[...t,e])},[a]),F=o(e=>{a(t=>t.filter(r=>r!==e))},[a]),m=o(()=>{a([])},[a]),g=o(e=>i.includes(e.id),[i]);return{favorites:i,isFavorite:n,toggleFavorite:v,addFavorite:f,removeFavorite:F,clearFavorites:m,favoritesFilter:g,isLoaded:c}}export{y as useEntityFavorites};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useMemo as
|
|
1
|
+
"use client";import{useMemo as e}from"react";import{useWatch as c}from"react-hook-form";import{evaluateFieldConditions as f}from"@donotdev/core";function u(o,r){const t=c({control:r}),s=e(()=>o.some(n=>n.config.conditions),[o]);return e(()=>{if(!s)return{};const n={};for(const i of o)i.config.conditions&&(n[i.name]=f(i.config.conditions,t));return n},[o,t,s])}export{u as useFieldConditions};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useState as
|
|
1
|
+
"use client";import{useState as T,useCallback as v,useEffect as A,useRef as g,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let P=0;function W(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}P+=1;const a=typeof performance<"u"?performance.now():Date.now(),p=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${p}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,p){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const U=u.slice(0,-2);return s.type.startsWith(U)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>p?{valid:!1,error:`File exceeds ${(p/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:p,multiple:u=!1,maxFiles:U=10,maxSize:E=10*1024*1024,accept:b=[],storagePath:V="uploads",uploadFn:y}){const h=G(),w=!!h,[d,c]=T([]),R=g(!1),$=g(null),x=g(a),L=g([]),F=g(!1),M=g(null);A(()=>{if(R.current){R.current=!1;return}const l=a?JSON.stringify((Array.isArray(a)?a:[a]).map(n=>n.fullUrl).filter(Boolean)):null;l!==$.current&&($.current=l,x.current=a,q(()=>{if(a){const n=(Array.isArray(a)?a:[a]).filter(t=>t.fullUrl).map((t,r)=>({id:`${W(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(n)}else c([])}))},[a]),A(()=>{L.current=d},[d]),A(()=>{F.current&&(F.current=!1,M.current?.(d,!0))},[d]),A(()=>()=>{L.current.forEach(l=>k(l.previewURL))},[]);const f=v((l,n=!1)=>{const t=(n?l.filter(i=>!i.error):l.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:n&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;u?r=t.length>0?t:null:r=t[0]||null;const e=x.current;(()=>{if(!r&&!e)return!1;if(!r||!e)return!0;if(u&&Array.isArray(r)&&Array.isArray(e)){if(r.length!==e.length)return!0;const i=r.map(m=>m.fullUrl).join(","),o=e.map(m=>m.fullUrl).join(",");return i!==o}return!u&&!Array.isArray(r)&&!Array.isArray(e)?r.fullUrl!==e.fullUrl:!0})()&&(R.current=!0,x.current=r,p(r))},[u,p,w]);M.current=f;const S=v(async()=>{if(!y)return;let l=[];if(c(t=>(l=t.filter(r=>!r.uploaded&&!r.error),l.length===0?t:t.map(r=>l.some(e=>e.id===r.id)?{...r,progress:0}:r))),l.length===0)return;const n=await Promise.allSettled(l.map(async t=>{try{const r=await y(t.file,e=>{c(i=>i.map(o=>o.id===t.id?{...o,progress:e}:o))});return{id:t.id,picture:r,error:null}}catch(r){const e=r instanceof Error?r.message:"Upload failed";return{id:t.id,picture:null,error:e}}}));c(t=>{const r=t.map(e=>{const i=n.find(o=>o.status==="fulfilled"&&o.value.id===e.id);if(i&&i.status==="fulfilled"){const o=i.value;return{...e,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return e});return f(r,!1),r})},[y,f]),j=g(S);j.current=S,A(()=>{if(!(!h||!s))return N.getState().registerUpload(h,s,async()=>{await j.current()},()=>L.current.some(l=>!l.uploaded&&!l.error)),()=>{N.getState().unregisterUpload(h,s)}},[h,s]);const O=v(async l=>{if(y){c(n=>n.map(t=>t.id===l.id?{...t,progress:0}:t));try{const n=await y(l.file,t=>{c(r=>r.map(e=>e.id===l.id?{...e,progress:t}:e))});c(t=>{const r=t.map(e=>e.id===l.id?{...e,uploaded:n,progress:100,error:null}:e);return f(r,!1),r})}catch(n){const t=n instanceof Error?n.message:"Upload failed";c(r=>r.map(e=>e.id===l.id?{...e,error:t,progress:null}:e))}}},[y,f]),z=v(l=>{c(n=>{const t=(u?U:1)-n.length;if(t<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${U} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),n;const r=l.slice(0,t),e=[];for(const o of r){const m=K(o,b,E);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}e.push({id:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(e.length===0)return n;const i=u?[...n,...e]:e;return w?F.current=!0:e.forEach(o=>O(o)),i})},[u,U,b,E,w,O,f]),B=v(l=>{c(n=>{const t=n.find(e=>e.id===l);t&&k(t.previewURL);const r=n.filter(e=>e.id!==l);return f(r,!1),r})},[f]),D=d.some(l=>!l.uploaded&&!l.error),I=d.some(l=>l.progress!==null&&l.progress<100),J=d.length>0?d.reduce((l,n)=>l+(n.progress??0),0)/d.length:0;return{files:d,addFiles:z,removeFile:B,hasPending:D,isUploading:I,progress:J,formId:h,isDeferred:w}}export{Q as useFileUpload};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function
|
|
1
|
+
"use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function R(t){const o=new Map;for(const i of Object.values(t.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(t){const o=p(()=>R(t),[t]),i=o[0],e=o[1],l=o[2],s=o[3],{items:d}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:a}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:f}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:r}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:d},{info:e,items:a},{info:l,items:f},{info:s,items:r}];return p(()=>{const _={};for(const{info:n,items:m}of F){if(!n||!m.length)continue;const b={};for(const y of m){const u=y;b[u.id]=v(u,n.labelFields,n.displayField)}_[n.collection]=b}return _},[i?.collection,d,e?.collection,a,l?.collection,f,s?.collection,r])}export{M as useReferenceResolver};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useMemo as
|
|
1
|
+
"use client";import{useMemo as p}from"react";function N(o,e,t,n,h={}){const{limit:a=3,tolerance:m=.2}=h,c=p(()=>{if(!e||!t||t.length===0||n.length===0)return[];const b=e.id;return t.filter(f=>f.id===b?!1:n.some(s=>{const r=o.fields[s];if(!r)return!1;const i=e[s],u=f[s];if(i==null||u==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(i),g=Number(u);if(isNaN(l)||isNaN(g))return!1;const d=Math.abs(l*m);return Math.abs(g-l)<=d}return String(i)===String(u)})).slice(0,a)},[e,t,n,o.fields,a,m]);return{items:c,hasItems:c.length>0}}export{N as useRelatedItems};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as
|
|
1
|
+
"use client";import{useEffect as s}from"react";import{isClient as o}from"@donotdev/core";function u({isDirty:n,enabled:t=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){s(()=>{if(!t||!n||!o())return;const r=a=>(a.preventDefault(),a.returnValue=e,e);return window.addEventListener("beforeunload",r),()=>{window.removeEventListener("beforeunload",r)}},[n,t,e])}export{u as useUnsavedChangesWarning};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{FunctionsAdapter as
|
|
1
|
+
export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{FunctionsAdapter as e}from"./adapters/FunctionsAdapter";import{getCrudService as a}from"./CrudService";import{useCrudStore as s}from"./CrudStore";import{OPTIMISTIC_STATUSES as t,CRUD_OPERATION as r}from"./types";import{loadDeterministicRange as i,upsertDeterministic as l,appendToCollection as o}from"./utils/collections";import{getFieldRegistry as p,registerFieldType as d,isFieldTypeRegistered as n}from"./FieldRegistry";import{registerBuiltinFieldType as m,getFieldTypeMetadata as F,getFilterType as u,getDisplayFormatter as f,isFilterable as y,getValueType as g,clearFieldTypeRegistry as c}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as T}from"./builtinFieldTypes";import{useEntityForm as S,useEntityField as C,useController as R,isFieldEditable as b,getFieldsForOperation as U,validateEntity as v,translateFieldLabel as E,translateLabel as h}from"./forms";import{UploadProvider as k,useUploadContext as W}from"./contexts";import{useFileUpload as w,useUnsavedChangesWarning as I,useEntityFavorites as x,useRelatedItems as B,useCrudFilters as D,useFieldConditions as O,useReferenceResolver as P}from"./hooks";import{isStorageUrl as A,validatePicture as L,checkForBlobUrls as M,hasBlobUrls as V}from"./utils/uploadValidation";import{defineWorkflow as _,useEntityWorkflow as N,saveWorkflowState as j,loadWorkflowState as q,clearWorkflowState as z}from"./workflows";import{formatValue as H}from"./components/DisplayFieldRenderer";import{buildReferenceLabel as J}from"./components/controlled/select/ControlledReferenceField";import{matchesFilter as K}from"./utils/matchesFilter";import{applyFilters as Q,applySearch as X,applySort as Y,getSearchableFields as Z}from"./utils/clientListProcessing";export{r as CRUD_OPERATION,e as FunctionsAdapter,t as OPTIMISTIC_STATUSES,k as UploadProvider,o as appendToCollection,Q as applyFilters,X as applySearch,Y as applySort,J as buildReferenceLabel,M as checkForBlobUrls,c as clearFieldTypeRegistry,z as clearWorkflowState,_ as defineWorkflow,H as formatValue,a as getCrudService,f as getDisplayFormatter,p as getFieldRegistry,F as getFieldTypeMetadata,U as getFieldsForOperation,u as getFilterType,Z as getSearchableFields,g as getValueType,V as hasBlobUrls,b as isFieldEditable,n as isFieldTypeRegistered,y as isFilterable,A as isStorageUrl,i as loadDeterministicRange,q as loadWorkflowState,K as matchesFilter,m as registerBuiltinFieldType,T as registerBuiltinFieldTypes,d as registerFieldType,j as saveWorkflowState,E as translateFieldLabel,h as translateLabel,l as upsertDeterministic,R as useController,D as useCrudFilters,s as useCrudStore,x as useEntityFavorites,C as useEntityField,S as useEntityForm,N as useEntityWorkflow,O as useFieldConditions,w as useFileUpload,P as useReferenceResolver,B as useRelatedItems,I as useUnsavedChangesWarning,W as useUploadContext,v as validateEntity,L as validatePicture};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as s,jsxs as y}from"react/jsx-runtime";import{Text as g,Stack as h,ImageGallery as L,Rating as I,CopyToClipboard as w}from"@donotdev/components";import{formatCurrency as S}from"@donotdev/core";import{ControlledCheckboxField as k,ControlledComboboxField as $,ControlledDateField as C,ControlledDropdownField as N,ControlledFileField as P,ControlledMultiFileField as M,ControlledDocumentField as R,ControlledMultiDocumentField as _,ControlledGeoPointField as v,ControlledImageField as B,ControlledMapField as E,ControlledMultiDropdownField as O,ControlledMultiInputField as U,ControlledNumberField as H,ControlledPasswordField as K,ControlledPhoneField as Y,ControlledRangeField as G,ControlledRatingField as J,ControlledDurationField as W,ControlledRadioField as q,ControlledReferenceField as Q,ControlledYearField as X,ControlledTextField as b,ControlledTextareaField as Z,ControlledRichTextField as ee,ControlledTimestampField as te,ControlledAddressField as re,ControlledFieldArrayField as ne,ControlledSwitchField as oe,ControlledMultiImageField as le,ControlledGdprConsentField as ie,ControlledCurrencyField as ae,ControlledPriceField as ce}from"./components/controlled";import{AvatarFieldComponent as se,BadgeFieldComponent as pe,ButtonFieldComponent as A,HiddenFieldComponent as de,TextAreaComponent as fe,RichTextComponent as ue,TextFieldComponent as F}from"./components/form/fields";import{translateLabel as T}from"./forms/utils";import{sanitizeHtml as ye}from"./utils/sanitizeHtml";function p(e){return e?s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s(g,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,i,t,r)=>{const n=r?.compact??!1;return e==null||e===""?p(n):String(e)},month:(e,i,t,r)=>{const n=r?.compact??!1;return e==null||e===""?p(n):String(e)},boolean:(e,i,t)=>e?"Yes":"No",checkbox:(e,i,t)=>e?"Yes":"No",switch:(e,i,t)=>{const r=i.options?.fieldSpecific;if(r){const n=r.uncheckedValue??!1,o=r.checkedValue??!0;if(e===o&&r.checkedLabel)return T(r.checkedLabel,t);if(e===n&&r.uncheckedLabel)return T(r.uncheckedLabel,t)}return e?"Yes":"No"},year:(e,i,t)=>String(e),number:e=>e==null||e===""?"\u2014":typeof e=="number"?e.toLocaleString():String(e),currency:(e,i,t)=>{if(e==null||isNaN(e))return"";const o=(i.options||{}).fieldSpecific?.currency||"EUR";return S(e,o)},price:(e,i,t,r)=>{const n=r?.compact??!1,o=r?.asString??!1,l=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(l==null||typeof l!="object")return p(n);const a=l.amount;if(a==null||isNaN(a))return p(n);const f=l.currency||"EUR",u=l.vatIncluded??!0,d=l.discountPercent??0,m=d>0?a*(1-d/100):a,x=u?` ${t("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(d>0){const z=S(a,f),V=S(m,f),j=` ${t("crud:price.discountPercent",{percent:Math.round(d),defaultValue:"-{{percent}}%"})}`;return o?`${V}${x}${j}`:n?y(g,{variant:"success",weight:"bold",children:[V,x,j]}):y(h,{direction:"column",gap:"tight",align:"end",children:[s(g,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:z}),y(g,{variant:"success",weight:"bold",children:[V,x]})]})}return`${S(a,f)}${x}`},range:(e,i,t)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null)return p(n);const o=typeof e=="number"?e:parseFloat(e);if(isNaN(o))return p(n);const l=i.validation?.max??5;return s(I,{value:o,max:l,readonly:!0,"aria-label":`${o} out of ${l} stars`})},duration:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null)return p(n);const o=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(o))return p(n);if(o===0)return t("crud:duration.zero",{defaultValue:"\u2014"});if(o<60)return t("crud:duration.minutes",{count:o,defaultValue:`${o} min`});const l=Math.floor(o/60),a=o%60;return t("crud:duration.hoursMinutes",{hours:l,minutes:a,defaultValue:a===0?`${l}h`:`${l}h ${a}min`})},gdprConsent:(e,i,t,r)=>{const n=r?.compact??!1;if(!e||typeof e!="object")return p(n);const o=e.gdprConsent===!0,l=e.gdprConsentDate,a=e.gdprConsentVersion,f=t("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),u=t("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!o)return u;const d=[f];if(l)try{const m=new Date(l);d.push(m.toLocaleDateString())}catch{d.push(l)}return a&&d.push(`v${a}`),d.join(" \xB7 ")},select:(e,i,t)=>{const r=i.validation?.options;if(Array.isArray(r)){const o=r.find(l=>l.value===e)?.label;return o?T(o,t):String(e)}return String(e)},radio:(e,i,t)=>{const r=i.validation?.options;if(Array.isArray(r)){const o=r.find(l=>l.value===e)?.label;return o?T(o,t):String(e)}return String(e)},combobox:(e,i,t)=>{const r=i.validation?.options;if(Array.isArray(r)){const o=r.find(l=>l.value===e)?.label;return o?T(o,t):String(e)}return String(e)},multiselect:(e,i,t)=>{if(Array.isArray(e)){const r=i.validation?.options;if(Array.isArray(r))return e.map(o=>{const a=r.find(f=>f.value===o)?.label;return a?T(a,t):o}).join(", ")}return String(e)},image:(e,i,t,r)=>{const n=r?.compact??!1;return e==null||e===""?p(n):typeof e=="string"?s("img",{src:e,alt:i.label||"",style:{width:n?"40px":void 0,height:n?"40px":void 0,maxWidth:n?void 0:"200px",maxHeight:n?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):p(n)},images:(e,i,t,r)=>{const n=r?.compact??!1;if(!Array.isArray(e)||e.length===0)return p(n);const o=e[0],l=typeof o=="object"&&o.thumbUrl?o.thumbUrl:o;return n?y("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[s("img",{src:l,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&y("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):s(L,{images:e,altPrefix:i.label||"Image"})},files:(e,i,t,r)=>{const n=r?.compact??!1;return!Array.isArray(e)||e.length===0?p(n):s(h,{gap:"tight",children:e.map((o,l)=>y("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${l+1}`,o.size&&y(g,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},l))})},documents:(e,i,t,r)=>{const n=r?.compact??!1;return!Array.isArray(e)||e.length===0?p(n):s(h,{gap:"tight",children:e.map((o,l)=>y("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${l+1}`,o.size&&y(g,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},l))})},file:(e,i,t,r)=>{const n=r?.compact??!1;if(!e)return p(n);const o=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return y("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&y("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,i,t,r)=>{const n=r?.compact??!1;if(!e)return p(n);const o=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return y("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&y("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,i,t,r)=>{const n=r?.compact??!1;if(!e)return p(n);const o=i.validation?.reference;if(r?.referenceData&&typeof o=="string"){const l=r.referenceData[o]?.[String(e)];if(l)return l}if(typeof e=="object"&&e!==null){const l=e.displayName||e.name||e.id||String(e);return String(l)}return String(e)},geopoint:(e,i,t,r)=>{const n=r?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:p(n)},address:(e,i,t)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,i,t,r)=>{const n=r?.compact??!1;if(e&&typeof e=="object"){const o=Object.entries(e);return o.length===0?p(n):y(h,{direction:"column",gap:"tight",children:[o.slice(0,5).map(([l,a])=>y(g,{style:{fontSize:"var(--font-size-sm)"},children:[y("strong",{children:[l,":"]})," ",String(a)]},l)),o.length>5&&y(g,{variant:"muted",children:["+",o.length-5," more"]})]})}return p(n)},array:(e,i,t,r)=>{const n=r?.compact??!1;return Array.isArray(e)?e.length===0?p(n):e.join(", "):p(n)},"field-array":(e,i,t,r)=>{const n=r?.compact??!1;if(!Array.isArray(e)||e.length===0)return p(n);const o=i.options?.fieldSpecific?.fields;return e.map(l=>{if(typeof l!="object"||l==null)return"";const a=l;return(o?o.map(u=>u.name):Object.keys(a)).map(u=>a[u]).filter(u=>u!=null&&u!=="").map(u=>typeof u=="object"?JSON.stringify(u):String(u)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,i,t)=>y(h,{direction:"row",gap:"tight",align:"center",children:[s("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:r=>r.stopPropagation(),children:e}),s(w,{text:e,tooltipText:t("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:t("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:r=>r.stopPropagation()})]}),tel:(e,i,t)=>y(h,{direction:"row",gap:"tight",align:"center",children:[s("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:r=>r.stopPropagation(),children:e}),s(w,{text:e,tooltipText:t("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:t("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:r=>r.stopPropagation()})]}),iban:(e,i,t,r)=>{const n=r?.compact??!1;return e?y(h,{direction:"row",gap:"tight",align:"center",children:[s(g,{style:{flex:1},children:e}),s(w,{text:e,tooltipText:t("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:t("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:o=>o.stopPropagation()})]}):p(n)},url:(e,i,t)=>s("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,i,t)=>y(h,{direction:"row",gap:"tight",align:"center",children:[s("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),s(g,{children:e})]}),textarea:(e,i,t)=>String(e),text:(e,i,t)=>String(e),richtext:(e,i,t,r)=>{const n=r?.compact??!1;return e&&typeof e=="string"?n?e.replace(/<[^>]*>/g,"").trim()||s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s("div",{dangerouslySetInnerHTML:{__html:ye(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):p(n)}};function me(e){return e.type==="avatar"}function ge(e){return e.type==="badge"}let D=!1;function Ve(e,i){if(D)return;D=!0;const t=r=>{const{type:n,components:o}=r;o&&i.registerComponent(n,o.controlled,o.uncontrolled),e.set(n,r)};t({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,...f.options})}}}),t({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,type:"email",...f.options})}}}),t({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,type:"url",...f.options})}}}),t({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,type:"color",...f.options})}}}),t({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:Z,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(fe,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,...f.options})}}}),t({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:ee,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(ue,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,...f.options})}}}),t({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:K}}),t({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:Y}}),t({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value.replace(/\s/g,"").toUpperCase();o(m)},error:a,...f.options})}}}),t({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:H}}),t({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:ae}}),t({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:ce}}),t({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:G}}),t({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:X}}),t({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:c.rating,components:{controlled:J}}),t({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:W}}),t({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:k}}),t({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:k}}),t({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:ie}}),t({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:oe}}),t({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:C}}),t({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:C}}),t({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:C}}),t({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:C}}),t({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:C}}),t({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:te}}),t({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:P}}),t({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:M}}),t({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:R}}),t({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:_}}),t({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:B}}),t({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:le}}),t({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:v}}),t({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:re}}),t({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:E}}),t({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:U}}),t({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c["field-array"],components:{controlled:ne}}),t({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:N}}),t({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:$}}),t({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:O}}),t({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:q}}),t({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:Q}}),t({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{name:n,value:o}=r;return s(de,{name:n,value:typeof o=="string"?o:""})}}}),t({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,error:l,config:a,t:f}=r;if(!me(a))throw new Error("Invalid config type for avatar field");return s(se,{config:a,value:typeof n=="string"?n:"",onChange:d=>{o(d)},error:!!l,helperText:l||void 0,t:f,...a.options})}}}),t({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,error:l,config:a,t:f}=r;if(!ge(a))throw new Error("Invalid config type for badge field");return s(pe,{config:a,value:typeof n=="string"?n:"",onChange:d=>{o(d)},error:!!l,helperText:l||void 0,t:f,...a.options})}}}),t({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{name:n,label:o,config:l}=r;return s(A,{label:o||n,type:"submit",onClick:()=>{},...l.options})}}}),t({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{name:n,label:o,config:l}=r;return s(A,{label:o||n,type:"reset",onClick:()=>{},...l.options})}}})}export{Ve as registerAllBuiltinFieldTypes};
|
|
1
|
+
"use client";import{jsx as p,jsxs as f}from"react/jsx-runtime";import{Text as m,Stack as b,ImageGallery as V,Rating as L,CopyToClipboard as w}from"@donotdev/components";import{formatCurrency as F}from"@donotdev/core";import{ControlledCheckboxField as k,ControlledComboboxField as $,ControlledDateField as h,ControlledDropdownField as I,ControlledFileField as N,ControlledMultiFileField as M,ControlledDocumentField as P,ControlledMultiDocumentField as R,ControlledGeoPointField as B,ControlledImageField as _,ControlledMapField as E,ControlledMultiDropdownField as U,ControlledMultiInputField as H,ControlledNumberField as K,ControlledPasswordField as Y,ControlledPhoneField as G,ControlledRangeField as O,ControlledRatingField as J,ControlledDurationField as W,ControlledRadioField as q,ControlledReferenceField as Q,ControlledYearField as X,ControlledTextField as g,ControlledTextareaField as Z,ControlledRichTextField as ee,ControlledTimestampField as te,ControlledAddressField as re,ControlledFieldArrayField as oe,ControlledSwitchField as ne,ControlledMultiImageField as le,ControlledGdprConsentField as ae,ControlledCurrencyField as ie,ControlledPriceField as ce}from"./components/controlled";import{AvatarFieldComponent as se,BadgeFieldComponent as pe,ButtonFieldComponent as A,HiddenFieldComponent as de,TextAreaComponent as ue,RichTextComponent as ye,TextFieldComponent as T}from"./components/form/fields";import{translateLabel as v}from"./forms/utils";import{sanitizeHtml as fe}from"./utils/sanitizeHtml";function d(e){return e?p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p(m,{variant:"muted",children:"\u2014"})}const i={timestamp:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,a,r,o)=>{const t=o?.compact??!1;return e==null||e===""?d(t):String(e)},month:(e,a,r,o)=>{const t=o?.compact??!1;return e==null||e===""?d(t):String(e)},boolean:(e,a,r)=>e?"Yes":"No",checkbox:(e,a,r)=>e?"Yes":"No",switch:(e,a,r)=>{const o=a.options?.fieldSpecific;if(o){const t=o.uncheckedValue??!1,n=o.checkedValue??!0;if(e===n&&o.checkedLabel)return v(o.checkedLabel,r);if(e===t&&o.uncheckedLabel)return v(o.uncheckedLabel,r)}return e?"Yes":"No"},year:(e,a,r)=>String(e),number:e=>e==null||e===""?"\u2014":typeof e=="number"?e.toLocaleString():String(e),currency:(e,a,r)=>{if(e==null||isNaN(e))return"";const o=(a.options||{}).fieldSpecific?.currency||"EUR";return F(e,o)},price:(e,a,r,o)=>{const t=o?.compact??!1,n=o?.asString??!1,l=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(l==null||typeof l!="object")return d(t);const c=l.amount;if(c==null||isNaN(c))return d(t);const s=l.currency||"EUR",y=l.vatIncluded??!0,u=l.discountPercent??0,x=u>0?c*(1-u/100):c,C=y?` ${r("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(u>0){const z=F(c,s),S=F(x,s),j=` ${r("crud:price.discountPercent",{percent:Math.round(u),defaultValue:"-{{percent}}%"})}`;return n?`${S}${C}${j}`:t?f(m,{variant:"success",weight:"bold",children:[S,C,j]}):f(b,{direction:"column",gap:"tight",align:"end",children:[p(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:z}),f(m,{variant:"success",weight:"bold",children:[S,C]})]})}return`${F(c,s)}${C}`},range:(e,a,r)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null)return d(t);const n=typeof e=="number"?e:parseFloat(e);if(isNaN(n))return d(t);const l=a.validation?.max??5;return p(L,{value:n,max:l,readonly:!0,"aria-label":`${n} out of ${l} stars`})},duration:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null)return d(t);const n=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(n))return d(t);if(n===0)return r("crud:duration.zero",{defaultValue:"\u2014"});if(n<60)return r("crud:duration.minutes",{count:n,defaultValue:`${n} min`});const l=Math.floor(n/60),c=n%60;return r("crud:duration.hoursMinutes",{hours:l,minutes:c,defaultValue:c===0?`${l}h`:`${l}h ${c}min`})},gdprConsent:(e,a,r,o)=>{const t=o?.compact??!1;if(!e||typeof e!="object")return d(t);const n=e.gdprConsent===!0,l=e.gdprConsentDate,c=e.gdprConsentVersion,s=r("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),y=r("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!n)return y;const u=[s];if(l)try{const x=new Date(l);u.push(x.toLocaleDateString())}catch{u.push(l)}return c&&u.push(`v${c}`),u.join(" \xB7 ")},select:(e,a,r)=>{const o=a.validation?.options;if(Array.isArray(o)){const t=o.find(n=>n.value===e)?.label;return t?v(t,r):String(e)}return String(e)},radio:(e,a,r)=>{const o=a.validation?.options;if(Array.isArray(o)){const t=o.find(n=>n.value===e)?.label;return t?v(t,r):String(e)}return String(e)},combobox:(e,a,r)=>{const o=a.validation?.options;if(Array.isArray(o)){const t=o.find(n=>n.value===e)?.label;return t?v(t,r):String(e)}return String(e)},multiselect:(e,a,r)=>{if(Array.isArray(e)){const o=a.validation?.options;if(Array.isArray(o))return e.map(t=>{const n=o.find(l=>l.value===t)?.label;return n?v(n,r):t}).join(", ")}return String(e)},image:(e,a,r,o)=>{const t=o?.compact??!1;return e==null||e===""?d(t):typeof e=="string"?p("img",{src:e,alt:a.label||"",style:{width:t?"40px":void 0,height:t?"40px":void 0,maxWidth:t?void 0:"200px",maxHeight:t?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):d(t)},images:(e,a,r,o)=>{const t=o?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(t);const n=e[0],l=typeof n=="object"&&n.thumbUrl?n.thumbUrl:n;return t?f("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[p("img",{src:l,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&f("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):p(V,{images:e,altPrefix:a.label||"Image"})},files:(e,a,r,o)=>{const t=o?.compact??!1;return!Array.isArray(e)||e.length===0?d(t):p(b,{gap:"tight",children:e.map((n,l)=>f("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${l+1}`,n.size&&f(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},l))})},documents:(e,a,r,o)=>{const t=o?.compact??!1;return!Array.isArray(e)||e.length===0?d(t):p(b,{gap:"tight",children:e.map((n,l)=>f("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${l+1}`,n.size&&f(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},l))})},file:(e,a,r,o)=>{const t=o?.compact??!1;if(!e)return d(t);const n=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return f("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&f("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,a,r,o)=>{const t=o?.compact??!1;if(!e)return d(t);const n=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return f("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&f("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,a,r,o)=>{const t=o?.compact??!1;if(!e)return d(t);const n=a.validation?.reference;if(o?.referenceData&&typeof n=="string"){const l=o.referenceData[n]?.[String(e)];if(l)return l}if(typeof e=="object"&&e!==null){const l=e.displayName||e.name||e.id||String(e);return String(l)}return String(e)},geopoint:(e,a,r,o)=>{const t=o?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:d(t)},address:(e,a,r)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,a,r,o)=>{const t=o?.compact??!1;if(e&&typeof e=="object"){const n=Object.entries(e);return n.length===0?d(t):f(b,{direction:"column",gap:"tight",children:[n.slice(0,5).map(([l,c])=>f(m,{style:{fontSize:"var(--font-size-sm)"},children:[f("strong",{children:[l,":"]})," ",String(c)]},l)),n.length>5&&f(m,{variant:"muted",children:["+",n.length-5," more"]})]})}return d(t)},array:(e,a,r,o)=>{const t=o?.compact??!1;return Array.isArray(e)?e.length===0?d(t):e.join(", "):d(t)},"field-array":(e,a,r,o)=>{const t=o?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(t);const n=a.options?.fieldSpecific?.fields;return e.map(l=>{if(typeof l!="object"||l==null)return"";const c=l;return(n?n.map(s=>s.name):Object.keys(c)).map(s=>c[s]).filter(s=>s!=null&&s!=="").map(s=>typeof s=="object"?JSON.stringify(s):String(s)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,a,r)=>f(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:o=>o.stopPropagation(),children:e}),p(w,{text:e,tooltipText:r("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:r("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:o=>o.stopPropagation()})]}),tel:(e,a,r)=>f(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:o=>o.stopPropagation(),children:e}),p(w,{text:e,tooltipText:r("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:r("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:o=>o.stopPropagation()})]}),iban:(e,a,r,o)=>{const t=o?.compact??!1;return e?f(b,{direction:"row",gap:"tight",align:"center",children:[p(m,{style:{flex:1},children:e}),p(w,{text:e,tooltipText:r("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:r("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:n=>n.stopPropagation()})]}):d(t)},url:(e,a,r)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,a,r)=>f(b,{direction:"row",gap:"tight",align:"center",children:[p("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),p(m,{children:e})]}),textarea:(e,a,r)=>String(e),text:(e,a,r)=>String(e),richtext:(e,a,r,o)=>{const t=o?.compact??!1;return e&&typeof e=="string"?t?e.replace(/<[^>]*>/g,"").trim()||p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p("div",{dangerouslySetInnerHTML:{__html:fe(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(t)}};function me(e){return e.type==="avatar"}function ge(e){return e.type==="badge"}let D=!1;function be(e,a){if(D)return;D=!0;const r=o=>{const{type:t,components:n}=o;n&&a.registerComponent(t,n.controlled,n.uncontrolled),e.set(t,o)};r({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.text,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,...s.options})}}}),r({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.email,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,type:"email",...s.options})}}}),r({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.url,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,type:"url",...s.options})}}}),r({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.color,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,type:"color",...s.options})}}}),r({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.textarea,components:{controlled:Z,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(ue,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,...s.options})}}}),r({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.richtext,components:{controlled:ee,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(ye,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,...s.options})}}}),r({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:i.password,components:{controlled:Y}}),r({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.tel,components:{controlled:G}}),r({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.iban,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value.replace(/\s/g,"").toUpperCase();n(u)},error:c,...s.options})}}}),r({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.number,components:{controlled:K}}),r({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.currency,components:{controlled:ie}}),r({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:i.price,components:{controlled:ce}}),r({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.range,components:{controlled:O}}),r({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.year,components:{controlled:X}}),r({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:i.rating,components:{controlled:J}}),r({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.duration,components:{controlled:W}}),r({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:i.boolean,components:{controlled:k}}),r({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:i.checkbox,components:{controlled:k}}),r({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:i.gdprConsent,components:{controlled:ae}}),r({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:i.switch,components:{controlled:ne}}),r({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.date,components:{controlled:h}}),r({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i["datetime-local"],components:{controlled:h}}),r({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.time,components:{controlled:h}}),r({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.week,components:{controlled:h}}),r({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.month,components:{controlled:h}}),r({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.timestamp,components:{controlled:te}}),r({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.file,components:{controlled:N}}),r({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.files,components:{controlled:M}}),r({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.document,components:{controlled:P}}),r({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.documents,components:{controlled:R}}),r({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.image,components:{controlled:_}}),r({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.images,components:{controlled:le}}),r({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.geopoint,components:{controlled:B}}),r({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:i.address,components:{controlled:re}}),r({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.map,components:{controlled:E}}),r({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.array,components:{controlled:H}}),r({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i["field-array"],components:{controlled:oe}}),r({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:i.select,components:{controlled:I}}),r({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:i.combobox,components:{controlled:$}}),r({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:i.multiselect,components:{controlled:U}}),r({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:i.radio,components:{controlled:q}}),r({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.reference,components:{controlled:Q}}),r({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{name:t,value:n}=o;return p(de,{name:t,value:typeof n=="string"?n:""})}}}),r({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,error:l,config:c,t:s}=o;if(!me(c))throw new Error("Invalid config type for avatar field");return p(se,{config:c,value:typeof t=="string"?t:"",onChange:y=>{n(y)},error:!!l,helperText:l||void 0,t:s,...c.options})}}}),r({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,error:l,config:c,t:s}=o;if(!ge(c))throw new Error("Invalid config type for badge field");return p(pe,{config:c,value:typeof t=="string"?t:"",onChange:y=>{n(y)},error:!!l,helperText:l||void 0,t:s,...c.options})}}}),r({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{name:t,label:n,config:l}=o;return p(A,{label:n||t,type:"submit",onClick:()=>{},...l.options})}}}),r({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{name:t,label:n,config:l}=o;return p(A,{label:n||t,type:"reset",onClick:()=>{},...l.options})}}})}export{be as registerAllBuiltinFieldTypes};
|
package/dist/stores/FormStore.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{createDoNotDevStore as l}from"@donotdev/core";const i={status:"idle",error:null,uploadProgress:0,isDirty:!1},
|
|
1
|
+
"use client";import{createDoNotDevStore as l}from"@donotdev/core";const i={status:"idle",error:null,uploadProgress:0,isDirty:!1},a=l({name:"form-store",createStore:(o,t)=>{const m=new Map;return{forms:{},startSubmit:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"submitting"}}}})},setSuccess:r=>{o(u=>{const n=u.forms[r]||i;return{forms:{...u.forms,[r]:{...n,status:"success",error:null}}}});const s=m.get(r);s!==void 0&&clearTimeout(s);const e=setTimeout(()=>{m.delete(r),t().reset(r)},1500);m.set(r,e)},setError:(r,s)=>{t().reset(r)},reset:r=>{o(s=>({forms:{...s.forms,[r]:{...i}}}))},setIsDirty:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,isDirty:s}}}})},hasDirtyForms:()=>{const r=t().forms;return Object.values(r).some(s=>s.isDirty)},getDirtyFormIds:()=>{const r=t().forms;return Object.entries(r).filter(([s,e])=>e.isDirty).map(([s])=>s)},cleanup:r=>{const s=m.get(r);s!==void 0&&(clearTimeout(s),m.delete(r)),o(e=>{const{[r]:u,...n}=e.forms;return{forms:n}})},getStatus:r=>t().forms[r]?.status??"idle",isLoading:r=>{const s=t().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>t().forms[r]?.uploadProgress??0,getError:r=>t().forms[r]?.error??null,getIsDirty:r=>t().forms[r]?.isDirty??!1}}}),f=o=>a(t=>t.forms[o]?.status??"idle"),g=o=>a(t=>{const m=t.forms[o]?.status??"idle";return m==="uploading"||m==="validating"||m==="submitting"}),c=o=>a(t=>t.forms[o]?.uploadProgress??0),d=o=>a(t=>t.forms[o]?.error??null),p=o=>a(t=>t.forms[o]?.isDirty??!1),D=()=>a(o=>Object.values(o.forms).some(t=>t.isDirty));export{d as useFormError,p as useFormIsDirty,g as useFormLoading,f as useFormStatus,a as useFormStore,D as useHasDirtyForms,c as useUploadProgress};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{createDoNotDevStore as
|
|
1
|
+
"use client";import{createDoNotDevStore as F}from"@donotdev/core";const m={status:"idle",progress:0,error:null},d=F({name:"upload-store",createStore:(a,n)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(s,e,t,o)=>{a(r=>({uploadFunctions:{...r.uploadFunctions,[s]:{...r.uploadFunctions[s]||{},[e]:t}},checkPendingFunctions:{...r.checkPendingFunctions,[s]:{...r.checkPendingFunctions[s]||{},[e]:o||(()=>!1)}}}))},unregisterUpload:(s,e)=>{a(t=>{const o=t.uploadFunctions[s],r=t.checkPendingFunctions[s];if(!o)return t;const{[e]:l,...p}=o,{[e]:u,...i}=r||{},{[e]:g,...h}=t.retryAttempts[s]||{};return{uploadFunctions:{...t.uploadFunctions,[s]:p},checkPendingFunctions:{...t.checkPendingFunctions,[s]:i},retryAttempts:{...t.retryAttempts,[s]:h}}})},startUpload:(s,e)=>{a(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(s,e,t)=>{a(o=>{const r=o.uploads[s]?.[e]||m;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[e]:{...r,progress:Math.min(100,Math.max(0,t))}}}}})},completeUpload:(s,e)=>{a(t=>{const o=t.uploads[s]?.[e]||m;return{uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{...o,status:"complete",progress:100}}}}})},failUpload:(s,e,t)=>{a(o=>{const r=o.uploads[s]?.[e]||m;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[e]:{...r,status:"error",error:t}}}}})},resetUpload:(s,e)=>{a(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{...m}}}}))},resetForm:s=>{a(e=>({uploads:{...e.uploads,[s]:{}}}))},cleanup:s=>{a(e=>{const{[s]:t,...o}=e.uploads,{[s]:r,...l}=e.uploadFunctions,{[s]:p,...u}=e.checkPendingFunctions,{[s]:i,...g}=e.retryAttempts;return{uploads:o,uploadFunctions:l,checkPendingFunctions:u,retryAttempts:g}})},uploadAll:async s=>{const e=n().uploadFunctions[s];if(!e)return;const t=Object.entries(e);if(t.length===0)return;const o=async(r,l,p=1)=>{n().startUpload(s,r);try{await l(u=>{n().setProgress(s,r,u)}),n().completeUpload(s,r),a(u=>({retryAttempts:{...u.retryAttempts,[s]:{...u.retryAttempts[s]||{},[r]:0}}}))}catch(u){const i=u instanceof Error?u.message:"Upload failed",g=n().maxRetries;if((n().retryAttempts[s]?.[r]??0)<g){a(c=>({retryAttempts:{...c.retryAttempts,[s]:{...c.retryAttempts[s]||{},[r]:(c.retryAttempts[s]?.[r]??0)+1}}}));const h=n().retryDelay*Math.pow(2,p-1);return await new Promise(c=>setTimeout(c,h)),o(r,l,p+1)}else throw n().failUpload(s,r,i),u}};await Promise.all(t.map(async([r,l])=>{await o(r,l)}))},hasPendingUploads:s=>{const e=n(),t=e.uploadFunctions[s],o=e.checkPendingFunctions[s];return t?Object.entries(t).some(([r,l])=>{const p=o?.[r];return p?p():!0}):!1},getStatus:(s,e)=>n().uploads[s]?.[e]?.status??"idle",getProgress:(s,e)=>n().uploads[s]?.[e]?.progress??0,getTotalProgress:s=>{const e=n().uploads[s];if(!e)return 100;const t=Object.values(e);if(t.length===0)return 100;const o=t.reduce((r,l)=>r+l.progress,0);return Math.round(o/t.length)},isUploading:s=>{const e=n().uploads[s];return e?Object.values(e).some(t=>t.status==="uploading"):!1},getError:(s,e)=>n().uploads[s]?.[e]?.error??null})}),y=a=>d(n=>{const s=n.uploads[a];if(!s)return 100;const e=Object.values(s);if(e.length===0)return 100;const t=e.reduce((o,r)=>o+r.progress,0);return Math.round(t/e.length)}),P=a=>d(n=>{const s=n.uploads[a];return s?Object.values(s).some(e=>e.status==="uploading"):!1}),A=(a,n)=>d(s=>s.uploads[a]?.[n]?.progress??0),U=(a,n)=>d(s=>s.uploads[a]?.[n]?.status??"idle");export{A as useFieldProgress,U as useFieldUploadStatus,P as useIsUploading,y as useTotalProgress,d as useUploadStore};
|
package/dist/stores/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useFormStore as
|
|
1
|
+
import{useFormStore as s,useFormStatus as r,useFormLoading as a,useUploadProgress as o,useFormError as e,useFormIsDirty as u,useHasDirtyForms as t}from"./FormStore";import{useUploadStore as m,useTotalProgress as F,useIsUploading as d,useFieldProgress as i,useFieldUploadStatus as l}from"./UploadStore";export{i as useFieldProgress,l as useFieldUploadStatus,e as useFormError,u as useFormIsDirty,a as useFormLoading,r as useFormStatus,s as useFormStore,t as useHasDirtyForms,d as useIsUploading,F as useTotalProgress,o as useUploadProgress,m as useUploadStore};
|