@mage-ui/components 1.0.184 → 1.0.186
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/components/data-display/description-list/DescriptionList.d.mts.map +1 -1
- package/dist/components/data-display/description-list/DescriptionList.mjs +1 -1
- package/dist/components/data-display/description-list/DescriptionList.mjs.map +1 -1
- package/dist/components/forms/Form.d.mts +3 -0
- package/dist/components/forms/Form.d.mts.map +1 -1
- package/dist/components/forms/Form.mjs +1 -1
- package/dist/components/forms/Form.mjs.map +1 -1
- package/dist/components/forms/FormBase.mjs +1 -1
- package/dist/components/forms/FormBase.mjs.map +1 -1
- package/dist/components/forms/controls/FormAutocomplete.mjs +1 -1
- package/dist/components/forms/controls/FormAutocomplete.mjs.map +1 -1
- package/dist/components/forms/controls/FormDatePicker.mjs +1 -1
- package/dist/components/forms/controls/FormDatePicker.mjs.map +1 -1
- package/dist/components/forms/controls/FormDropzoneS3.mjs +1 -1
- package/dist/components/forms/controls/FormDropzoneS3.mjs.map +1 -1
- package/dist/components/forms/controls/FormRadioGroup.mjs +1 -1
- package/dist/components/forms/controls/FormRadioGroup.mjs.map +1 -1
- package/dist/components/forms/controls/FormSelect.mjs +1 -1
- package/dist/components/forms/controls/FormSelect.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DescriptionList.d.mts","names":[],"sources":["../../../../src/components/data-display/description-list/DescriptionList.tsx"],"mappings":";;;KAWY,yBAAA;EACV,eAAA;EACA,IAAA;EACA,OAAA;EACA,IAAA;EACA,WAAA;AAAA;AAAA,KAGU,oBAAA;EACV,QAAA,EAAU,SAAA;EACV,WAAA;EACA,OAAA;EACA,UAAA,GAAa,yBAAA;AAAA;AAAA,KAGH,wBAAA;EACV,IAAA,EAAM,SAAA;EACN,WAAA,GAAc,SAAA;EACd,QAAA,GAAW,SAAA;EACX,UAAA,GAAa,yBAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"DescriptionList.d.mts","names":[],"sources":["../../../../src/components/data-display/description-list/DescriptionList.tsx"],"mappings":";;;KAWY,yBAAA;EACV,eAAA;EACA,IAAA;EACA,OAAA;EACA,IAAA;EACA,WAAA;AAAA;AAAA,KAGU,oBAAA;EACV,QAAA,EAAU,SAAA;EACV,WAAA;EACA,OAAA;EACA,UAAA,GAAa,yBAAA;AAAA;AAAA,KAGH,wBAAA;EACV,IAAA,EAAM,SAAA;EACN,WAAA,GAAc,SAAA;EACd,QAAA,GAAW,SAAA;EACX,UAAA,GAAa,yBAAA;AAAA;AAAA,cA+CF,eAAA;EAAe,QAAA;EAAA,WAAA;EAAA,OAAA;EAAA;AAAA,GAvCzB,oBAAA,KAAuB,SAAA;;;;;;KAqBvB,wBAAA,KAA2B,SAAA;AAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{cx as e}from"@mage-ui/styled-system/css";import{descriptionList as t,descriptionListDescription as n,descriptionListRoot as r,descriptionListTerm as i,descriptionListWrapper as a}from"@mage-ui/styled-system/recipes";import{jsx as o,jsxs as s}from"react/jsx-runtime";const c=Object.assign(({children:n,orientation:i=`vertical`,display:a=`block`,classNames:s})=>o(`dl`,{"data-orientation":i,"data-display":a,className:e(s?.descriptionList??t(),s?.root??r(),`group`),children:n}),{Item:({term:t,description:r,children:c,classNames:l})=>{let u=r??c;return s(`div`,{className:e(l?.wrapper??a()),children:[o(`dt`,{className:l?.term??i(),children:t}),u&&o(`dd`,{className:l?.description??n(),children:u})]})}});export{c as DescriptionList};
|
|
1
|
+
import{cx as e}from"@mage-ui/styled-system/css";import{descriptionList as t,descriptionListDescription as n,descriptionListRoot as r,descriptionListTerm as i,descriptionListWrapper as a}from"@mage-ui/styled-system/recipes";import{jsx as o,jsxs as s}from"react/jsx-runtime";const c=Object.assign(({children:n,orientation:i=`vertical`,display:a=`block`,classNames:s})=>o(`dl`,{"data-orientation":i,"data-display":a,className:e(s?.descriptionList??t(),s?.root??r(),`group`),children:n}),{Item:({term:t,description:r,children:c,classNames:l})=>{let u=r??c;return s(`div`,{className:e(l?.wrapper??a(),`group`),children:[o(`dt`,{className:l?.term??i(),children:t}),u&&o(`dd`,{className:l?.description??n(),children:u})]})}});export{c as DescriptionList};
|
|
2
2
|
//# sourceMappingURL=DescriptionList.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DescriptionList.mjs","names":[],"sources":["../../../../src/components/data-display/description-list/DescriptionList.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n descriptionList,\n descriptionListDescription,\n descriptionListRoot,\n descriptionListTerm,\n descriptionListWrapper,\n} from '@mage-ui/styled-system/recipes';\n\nexport type DescriptionListClassNames = {\n descriptionList?: string;\n root?: string;\n wrapper?: string;\n term?: string;\n description?: string;\n};\n\nexport type DescriptionListProps = {\n children: ReactNode;\n orientation?: 'horizontal' | 'vertical';\n display?: 'block' | 'inline';\n classNames?: DescriptionListClassNames;\n};\n\nexport type DescriptionListItemProps = {\n term: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n classNames?: DescriptionListClassNames;\n};\n\nconst Root = ({\n children,\n orientation = 'vertical',\n display = 'block',\n classNames,\n}: DescriptionListProps): ReactNode => {\n return (\n <dl\n data-orientation={orientation}\n data-display={display}\n className={cx(\n classNames?.descriptionList ?? descriptionList(),\n classNames?.root ?? descriptionListRoot(),\n 'group',\n )}\n >\n {children}\n </dl>\n );\n};\n\nconst Item = ({\n term,\n description,\n children,\n classNames,\n}: DescriptionListItemProps): ReactNode => {\n const content = description ?? children;\n\n return (\n <div
|
|
1
|
+
{"version":3,"file":"DescriptionList.mjs","names":[],"sources":["../../../../src/components/data-display/description-list/DescriptionList.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n descriptionList,\n descriptionListDescription,\n descriptionListRoot,\n descriptionListTerm,\n descriptionListWrapper,\n} from '@mage-ui/styled-system/recipes';\n\nexport type DescriptionListClassNames = {\n descriptionList?: string;\n root?: string;\n wrapper?: string;\n term?: string;\n description?: string;\n};\n\nexport type DescriptionListProps = {\n children: ReactNode;\n orientation?: 'horizontal' | 'vertical';\n display?: 'block' | 'inline';\n classNames?: DescriptionListClassNames;\n};\n\nexport type DescriptionListItemProps = {\n term: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n classNames?: DescriptionListClassNames;\n};\n\nconst Root = ({\n children,\n orientation = 'vertical',\n display = 'block',\n classNames,\n}: DescriptionListProps): ReactNode => {\n return (\n <dl\n data-orientation={orientation}\n data-display={display}\n className={cx(\n classNames?.descriptionList ?? descriptionList(),\n classNames?.root ?? descriptionListRoot(),\n 'group',\n )}\n >\n {children}\n </dl>\n );\n};\n\nconst Item = ({\n term,\n description,\n children,\n classNames,\n}: DescriptionListItemProps): ReactNode => {\n const content = description ?? children;\n\n return (\n <div\n className={cx(classNames?.wrapper ?? descriptionListWrapper(), 'group')}\n >\n <dt className={classNames?.term ?? descriptionListTerm()}>{term}</dt>\n\n {content && (\n <dd className={classNames?.description ?? descriptionListDescription()}>\n {content}\n </dd>\n )}\n </div>\n );\n};\n\nexport const DescriptionList = Object.assign(Root, {\n Item,\n});\n"],"mappings":"iRA6EA,MAAa,EAAkB,OAAO,QA5CxB,CACZ,WACA,cAAc,WACd,UAAU,QACV,gBAGE,EAAC,KAAD,CACE,mBAAkB,EAClB,eAAc,EACd,UAAW,EACT,GAAY,iBAAmB,GAAiB,CAChD,GAAY,MAAQ,GAAqB,CACzC,QACD,CAEA,WACE,CAAA,CA2B0C,CACjD,MAxBY,CACZ,OACA,cACA,WACA,gBACyC,CACzC,IAAM,EAAU,GAAe,EAE/B,OACE,EAAC,MAAD,CACE,UAAW,EAAG,GAAY,SAAW,GAAwB,CAAE,QAAQ,UADzE,CAGE,EAAC,KAAD,CAAI,UAAW,GAAY,MAAQ,GAAqB,UAAG,EAAU,CAAA,CAEpE,GACC,EAAC,KAAD,CAAI,UAAW,GAAY,aAAe,GAA4B,UACnE,EACE,CAAA,CAEH,IAMT,CAAC"}
|
|
@@ -45,6 +45,7 @@ type FormProps<T extends FieldValues> = {
|
|
|
45
45
|
schema?: ZodObject<Record<string, ZodTypeAny>>;
|
|
46
46
|
t?: (key: string, bindings?: Record<string, string>, fallback?: string) => string | React.ReactNode; /** Mensaje mostrado al usuario si falla la subida de archivos a S3 tras el submit. */
|
|
47
47
|
s3UploadErrorMessage?: string;
|
|
48
|
+
noValidate?: boolean;
|
|
48
49
|
classNames?: {
|
|
49
50
|
form?: string;
|
|
50
51
|
root?: string;
|
|
@@ -60,6 +61,7 @@ declare const Form: {
|
|
|
60
61
|
schema,
|
|
61
62
|
t,
|
|
62
63
|
s3UploadErrorMessage,
|
|
64
|
+
noValidate,
|
|
63
65
|
classNames
|
|
64
66
|
}: FormProps<T>): react_jsx_runtime0.JSX.Element;
|
|
65
67
|
displayName: string;
|
|
@@ -143,6 +145,7 @@ declare const Form: {
|
|
|
143
145
|
defaultValue,
|
|
144
146
|
isSubmitting: _isSubmitting,
|
|
145
147
|
name,
|
|
148
|
+
error,
|
|
146
149
|
...props
|
|
147
150
|
}: FormRadioGroupProps): react_jsx_runtime0.JSX.Element;
|
|
148
151
|
displayName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.d.mts","names":[],"sources":["../../../src/components/forms/Form.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;KAiCK,YAAA;EACH,IAAA;EACA,OAAA;EACA,MAAA;EACA,GAAA;AAAA;AAAA,KAGU,SAAA,WAAoB,WAAA;EAC9B,QAAA,GAAW,MAAA;IAAU,IAAA,EAAM,CAAA;EAAA,MAAQ,OAAA;EACnC,aAAA,IAAiB,QAAA,EAAU,YAAA;EAC3B,eAAA,IAAmB,MAAA;IACjB,OAAA;IACA,QAAA,EAAU,eAAA,CAAgB,CAAA;IAC1B,MAAA;EAAA;EAEF,aAAA;EACA,QAAA,EAAU,SAAA;EACV,MAAA,GAAS,SAAA,CAAU,MAAA,SAAe,UAAA;EAClC,CAAA,IACE,GAAA,UACA,QAAA,GAAW,MAAA,kBACX,QAAA,uBACY,KAAA,CAAM,SAAA;EAEpB,oBAAA;EACA,UAAA;IACE,IAAA;IACA,IAAA;EAAA;AAAA;AAAA,cAYS,IAAA;EAAA,WAAkB,WAAA;IAAW,QAAA;IAAA,aAAA;IAAA,eAAA;IAAA,aAAA;IAAA,QAAA;IAAA,MAAA;IAAA,CAAA;IAAA,oBAAA;IAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"Form.d.mts","names":[],"sources":["../../../src/components/forms/Form.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;KAiCK,YAAA;EACH,IAAA;EACA,OAAA;EACA,MAAA;EACA,GAAA;AAAA;AAAA,KAGU,SAAA,WAAoB,WAAA;EAC9B,QAAA,GAAW,MAAA;IAAU,IAAA,EAAM,CAAA;EAAA,MAAQ,OAAA;EACnC,aAAA,IAAiB,QAAA,EAAU,YAAA;EAC3B,eAAA,IAAmB,MAAA;IACjB,OAAA;IACA,QAAA,EAAU,eAAA,CAAgB,CAAA;IAC1B,MAAA;EAAA;EAEF,aAAA;EACA,QAAA,EAAU,SAAA;EACV,MAAA,GAAS,SAAA,CAAU,MAAA,SAAe,UAAA;EAClC,CAAA,IACE,GAAA,UACA,QAAA,GAAW,MAAA,kBACX,QAAA,uBACY,KAAA,CAAM,SAAA;EAEpB,oBAAA;EACA,UAAA;EACA,UAAA;IACE,IAAA;IACA,IAAA;EAAA;AAAA;AAAA,cAYS,IAAA;EAAA,WAAkB,WAAA;IAAW,QAAA;IAAA,aAAA;IAAA,eAAA;IAAA,aAAA;IAAA,QAAA;IAAA,MAAA;IAAA,CAAA;IAAA,oBAAA;IAAA,UAAA;IAAA;EAAA,GAWvC,SAAA,CAAU,CAAA,IAAE,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{FormAutocomplete as e}from"./controls/FormAutocomplete.mjs";import{FormCheckbox as t}from"./controls/FormCheckbox.mjs";import{FormCheckboxGroup as n}from"./controls/FormCheckboxGroup.mjs";import{FormCheckboxTree as r}from"./controls/FormCheckboxTree.mjs";import{FormCombobox as i}from"./controls/FormCombobox.mjs";import{FormDatePicker as a}from"./controls/FormDatePicker.mjs";import{FormDateTimePicker as o}from"./controls/FormDateTimePicker.mjs";import{FormDropzone as s}from"./controls/FormDropzone.mjs";import{FormS3Context as c}from"./FormS3Context.mjs";import{FormDropzoneS3 as l}from"./controls/FormDropzoneS3.mjs";import{FormFileInput as u}from"./controls/FormFileInput.mjs";import{FormFileInputMultiple as d}from"./controls/FormFileInputMultiple.mjs";import{FormFileInputMultipleS3 as f}from"./controls/FormFileInputMultipleS3.mjs";import{FormFileInputS3 as p}from"./controls/FormFileInputS3.mjs";import{FormHidden as m}from"./controls/FormHidden.mjs";import{FormPassword as h}from"./controls/FormPassword.mjs";import{FormRadioGroup as g}from"./controls/FormRadioGroup.mjs";import{FormSelect as _}from"./controls/FormSelect.mjs";import{FormSubmit as v}from"./controls/FormSubmit.mjs";import{FormTextarea as y}from"./controls/FormTextarea.mjs";import{FormTextInput as b}from"./controls/FormTextInput.mjs";import{FormYearPicker as x}from"./controls/FormYearPicker.mjs";import{FormBase as S}from"./FormBase.mjs";import{FormErrorBox as C}from"./FormErrorBox.mjs";import{form as w,formRoot as T}from"@mage-ui/styled-system/recipes";import{jsx as E}from"react/jsx-runtime";import{useRef as D}from"react";const O=({$fetcher:e,onValidSubmit:t,onInvalidSubmit:n,invalidStatus:r=[],children:i,schema:a,t:o,s3UploadErrorMessage:s,classNames:
|
|
1
|
+
import{FormAutocomplete as e}from"./controls/FormAutocomplete.mjs";import{FormCheckbox as t}from"./controls/FormCheckbox.mjs";import{FormCheckboxGroup as n}from"./controls/FormCheckboxGroup.mjs";import{FormCheckboxTree as r}from"./controls/FormCheckboxTree.mjs";import{FormCombobox as i}from"./controls/FormCombobox.mjs";import{FormDatePicker as a}from"./controls/FormDatePicker.mjs";import{FormDateTimePicker as o}from"./controls/FormDateTimePicker.mjs";import{FormDropzone as s}from"./controls/FormDropzone.mjs";import{FormS3Context as c}from"./FormS3Context.mjs";import{FormDropzoneS3 as l}from"./controls/FormDropzoneS3.mjs";import{FormFileInput as u}from"./controls/FormFileInput.mjs";import{FormFileInputMultiple as d}from"./controls/FormFileInputMultiple.mjs";import{FormFileInputMultipleS3 as f}from"./controls/FormFileInputMultipleS3.mjs";import{FormFileInputS3 as p}from"./controls/FormFileInputS3.mjs";import{FormHidden as m}from"./controls/FormHidden.mjs";import{FormPassword as h}from"./controls/FormPassword.mjs";import{FormRadioGroup as g}from"./controls/FormRadioGroup.mjs";import{FormSelect as _}from"./controls/FormSelect.mjs";import{FormSubmit as v}from"./controls/FormSubmit.mjs";import{FormTextarea as y}from"./controls/FormTextarea.mjs";import{FormTextInput as b}from"./controls/FormTextInput.mjs";import{FormYearPicker as x}from"./controls/FormYearPicker.mjs";import{FormBase as S}from"./FormBase.mjs";import{FormErrorBox as C}from"./FormErrorBox.mjs";import{form as w,formRoot as T}from"@mage-ui/styled-system/recipes";import{jsx as E}from"react/jsx-runtime";import{useRef as D}from"react";const O=({$fetcher:e,onValidSubmit:t,onInvalidSubmit:n,invalidStatus:r=[],children:i,schema:a,t:o,s3UploadErrorMessage:s,noValidate:l,classNames:u})=>{let d=D(new Map),f={registerS3Upload:(e,t)=>{d.current.set(e,t)},unregisterS3Upload:e=>{d.current.delete(e)}},p=async e=>{let t=Array.from(d.current.values());await Promise.all(t.map(t=>t(e)))};return E(c.Provider,{value:f,children:E(S,{onSubmit:async({data:i,setError:a})=>{await e({data:i}).then(async e=>{let n=e;if(n?.statusCode&&n.statusCode>=400)throw n;try{await p(e)}catch(e){console.error(`S3 upload error:`,e),a(`root.serverError`,{type:`s3`,message:s??`Failed to upload files`});return}t?.(e||{})}).catch(e=>{if((e.statusCode===400||e.statusCode===422)&&e.cause?.issues&&Object.keys(e.cause.issues).forEach(t=>{a(t,{type:`server`,message:e.cause?.issues?.[t]})}),r.includes(e.statusCode)&&n)n({message:e?.message??`Something went wrong`,setError:a,status:e.statusCode});else if(e.statusCode===400||e.statusCode===422)a(`root.serverError`,{type:`server`,message:e?.message??`Something went wrong`});else throw e})},schema:a,noValidate:l,errorBox:C,t:o,classNames:{form:u?.form??w(),root:u?.root??T()},children:i})})};O.displayName=`Form`,O.TextInput=b,O.Textarea=y,O.Submit=v,O.Hidden=m,O.Checkbox=t,O.CheckboxGroup=n,O.CheckboxTree=r,O.RadioGroup=g,O.Password=h,O.Select=_,O.Combobox=i,O.Autocomplete=e,O.DatePicker=a,O.YearPicker=x,O.DateTimePicker=o,O.FileInput=u,O.FileInputMultiple=d,O.FileInputS3=p,O.FileInputMultipleS3=f,O.Dropzone=s,O.DropzoneS3=l;export{O as Form};
|
|
2
2
|
//# sourceMappingURL=Form.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.mjs","names":[],"sources":["../../../src/components/forms/Form.tsx"],"sourcesContent":["import type React from 'react';\nimport type { ReactNode } from 'react';\nimport { useRef } from 'react';\nimport type { FieldValues, UseFormSetError } from 'react-hook-form';\nimport type { ZodObject, ZodTypeAny } from 'zod';\n\nimport { form, formRoot } from '@mage-ui/styled-system/recipes';\n\nimport { FormAutocomplete } from './controls/FormAutocomplete';\nimport { FormCheckbox } from './controls/FormCheckbox';\nimport { FormCheckboxGroup } from './controls/FormCheckboxGroup';\nimport { FormCheckboxTree } from './controls/FormCheckboxTree';\nimport { FormCombobox } from './controls/FormCombobox';\nimport { FormDatePicker } from './controls/FormDatePicker';\nimport { FormDateTimePicker } from './controls/FormDateTimePicker';\nimport { FormDropzone } from './controls/FormDropzone';\nimport { FormDropzoneS3 } from './controls/FormDropzoneS3';\nimport { FormFileInput } from './controls/FormFileInput';\nimport { FormFileInputMultiple } from './controls/FormFileInputMultiple';\nimport { FormFileInputMultipleS3 } from './controls/FormFileInputMultipleS3';\nimport { FormFileInputS3 } from './controls/FormFileInputS3';\nimport { FormHidden } from './controls/FormHidden';\nimport { FormPassword } from './controls/FormPassword';\nimport { FormRadioGroup } from './controls/FormRadioGroup';\nimport { FormSelect } from './controls/FormSelect';\nimport { FormSubmit } from './controls/FormSubmit';\nimport { FormTextarea } from './controls/FormTextarea';\nimport { FormTextInput } from './controls/FormTextInput';\nimport { FormYearPicker } from './controls/FormYearPicker';\nimport { FormBase } from './FormBase';\nimport { FormErrorBox } from './FormErrorBox';\nimport { FormS3Context, type S3UploadCallback } from './FormS3Context';\n\ntype FormResponse = {\n body?: object;\n details?: string;\n status?: number;\n url?: string;\n};\n\nexport type FormProps<T extends FieldValues> = {\n $fetcher: (params: { data: T }) => Promise<unknown>;\n onValidSubmit?: (response: FormResponse) => void;\n onInvalidSubmit?: (params: {\n message: string;\n setError: UseFormSetError<T>;\n status: number;\n }) => void;\n invalidStatus?: number[];\n children: ReactNode;\n schema?: ZodObject<Record<string, ZodTypeAny>>;\n t?: (\n key: string,\n bindings?: Record<string, string>,\n fallback?: string,\n ) => string | React.ReactNode;\n /** Mensaje mostrado al usuario si falla la subida de archivos a S3 tras el submit. */\n s3UploadErrorMessage?: string;\n classNames?: {\n form?: string;\n root?: string;\n };\n};\n\ntype FormError = {\n statusCode: number;\n message: string;\n cause?: {\n issues: Record<string, string>;\n };\n};\n\nexport const Form = <T extends FieldValues>({\n $fetcher,\n onValidSubmit,\n onInvalidSubmit,\n invalidStatus = [],\n children,\n schema,\n t,\n s3UploadErrorMessage,\n classNames,\n}: FormProps<T>) => {\n const s3CallbacksRef = useRef<Map<string, S3UploadCallback>>(new Map());\n\n const s3ContextValue = {\n registerS3Upload: (name: string, cb: S3UploadCallback) => {\n s3CallbacksRef.current.set(name, cb);\n },\n unregisterS3Upload: (name: string) => {\n s3CallbacksRef.current.delete(name);\n },\n };\n\n const runS3Uploads = async (response: unknown): Promise<void> => {\n const callbacks = Array.from(s3CallbacksRef.current.values());\n await Promise.all(callbacks.map((cb) => cb(response)));\n };\n\n const onSubmit = async ({\n data,\n setError,\n }: {\n data: FieldValues;\n setError: UseFormSetError<FieldValues>;\n }) => {\n await $fetcher({ data: data as T })\n .then(async (response) => {\n const res = response as FormError & FormResponse;\n if (res?.statusCode && res.statusCode >= 400) {\n throw res;\n }\n\n try {\n await runS3Uploads(response);\n } catch (e) {\n console.error('S3 upload error:', e);\n setError('root.serverError', {\n type: 's3',\n message: s3UploadErrorMessage ?? 'Failed to upload files',\n });\n return;\n }\n onValidSubmit?.((response || {}) as FormResponse);\n })\n .catch((error: FormError) => {\n if (\n (error.statusCode === 400 || error.statusCode === 422) &&\n error.cause?.issues\n ) {\n Object.keys(error.cause.issues).forEach((key) => {\n setError(key, {\n type: 'server',\n message: error.cause?.issues?.[key],\n });\n });\n }\n\n if (invalidStatus.includes(error.statusCode) && onInvalidSubmit) {\n onInvalidSubmit({\n message: error?.message ?? 'Something went wrong',\n setError: setError as UseFormSetError<T>,\n status: error.statusCode,\n });\n } else if (error.statusCode === 400 || error.statusCode === 422) {\n setError('root.serverError', {\n type: 'server',\n message: error?.message ?? 'Something went wrong',\n });\n } else {\n throw error;\n }\n });\n };\n\n return (\n <FormS3Context.Provider value={s3ContextValue}>\n <FormBase\n onSubmit={onSubmit}\n schema={schema}\n errorBox={FormErrorBox}\n t={t}\n classNames={{\n form: classNames?.form ?? form(),\n root: classNames?.root ?? formRoot(),\n }}\n >\n {children}\n </FormBase>\n </FormS3Context.Provider>\n );\n};\n\nForm.displayName = 'Form';\nForm.TextInput = FormTextInput;\nForm.Textarea = FormTextarea;\nForm.Submit = FormSubmit;\nForm.Hidden = FormHidden;\nForm.Checkbox = FormCheckbox;\nForm.CheckboxGroup = FormCheckboxGroup;\nForm.CheckboxTree = FormCheckboxTree;\nForm.RadioGroup = FormRadioGroup;\nForm.Password = FormPassword;\nForm.Select = FormSelect;\nForm.Combobox = FormCombobox;\nForm.Autocomplete = FormAutocomplete;\nForm.DatePicker = FormDatePicker;\nForm.YearPicker = FormYearPicker;\nForm.DateTimePicker = FormDateTimePicker;\nForm.FileInput = FormFileInput;\nForm.FileInputMultiple = FormFileInputMultiple;\nForm.FileInputS3 = FormFileInputS3;\nForm.FileInputMultipleS3 = FormFileInputMultipleS3;\nForm.Dropzone = FormDropzone;\nForm.DropzoneS3 = FormDropzoneS3;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Form.mjs","names":[],"sources":["../../../src/components/forms/Form.tsx"],"sourcesContent":["import type React from 'react';\nimport type { ReactNode } from 'react';\nimport { useRef } from 'react';\nimport type { FieldValues, UseFormSetError } from 'react-hook-form';\nimport type { ZodObject, ZodTypeAny } from 'zod';\n\nimport { form, formRoot } from '@mage-ui/styled-system/recipes';\n\nimport { FormAutocomplete } from './controls/FormAutocomplete';\nimport { FormCheckbox } from './controls/FormCheckbox';\nimport { FormCheckboxGroup } from './controls/FormCheckboxGroup';\nimport { FormCheckboxTree } from './controls/FormCheckboxTree';\nimport { FormCombobox } from './controls/FormCombobox';\nimport { FormDatePicker } from './controls/FormDatePicker';\nimport { FormDateTimePicker } from './controls/FormDateTimePicker';\nimport { FormDropzone } from './controls/FormDropzone';\nimport { FormDropzoneS3 } from './controls/FormDropzoneS3';\nimport { FormFileInput } from './controls/FormFileInput';\nimport { FormFileInputMultiple } from './controls/FormFileInputMultiple';\nimport { FormFileInputMultipleS3 } from './controls/FormFileInputMultipleS3';\nimport { FormFileInputS3 } from './controls/FormFileInputS3';\nimport { FormHidden } from './controls/FormHidden';\nimport { FormPassword } from './controls/FormPassword';\nimport { FormRadioGroup } from './controls/FormRadioGroup';\nimport { FormSelect } from './controls/FormSelect';\nimport { FormSubmit } from './controls/FormSubmit';\nimport { FormTextarea } from './controls/FormTextarea';\nimport { FormTextInput } from './controls/FormTextInput';\nimport { FormYearPicker } from './controls/FormYearPicker';\nimport { FormBase } from './FormBase';\nimport { FormErrorBox } from './FormErrorBox';\nimport { FormS3Context, type S3UploadCallback } from './FormS3Context';\n\ntype FormResponse = {\n body?: object;\n details?: string;\n status?: number;\n url?: string;\n};\n\nexport type FormProps<T extends FieldValues> = {\n $fetcher: (params: { data: T }) => Promise<unknown>;\n onValidSubmit?: (response: FormResponse) => void;\n onInvalidSubmit?: (params: {\n message: string;\n setError: UseFormSetError<T>;\n status: number;\n }) => void;\n invalidStatus?: number[];\n children: ReactNode;\n schema?: ZodObject<Record<string, ZodTypeAny>>;\n t?: (\n key: string,\n bindings?: Record<string, string>,\n fallback?: string,\n ) => string | React.ReactNode;\n /** Mensaje mostrado al usuario si falla la subida de archivos a S3 tras el submit. */\n s3UploadErrorMessage?: string;\n noValidate?: boolean;\n classNames?: {\n form?: string;\n root?: string;\n };\n};\n\ntype FormError = {\n statusCode: number;\n message: string;\n cause?: {\n issues: Record<string, string>;\n };\n};\n\nexport const Form = <T extends FieldValues>({\n $fetcher,\n onValidSubmit,\n onInvalidSubmit,\n invalidStatus = [],\n children,\n schema,\n t,\n s3UploadErrorMessage,\n noValidate,\n classNames,\n}: FormProps<T>) => {\n const s3CallbacksRef = useRef<Map<string, S3UploadCallback>>(new Map());\n\n const s3ContextValue = {\n registerS3Upload: (name: string, cb: S3UploadCallback) => {\n s3CallbacksRef.current.set(name, cb);\n },\n unregisterS3Upload: (name: string) => {\n s3CallbacksRef.current.delete(name);\n },\n };\n\n const runS3Uploads = async (response: unknown): Promise<void> => {\n const callbacks = Array.from(s3CallbacksRef.current.values());\n await Promise.all(callbacks.map((cb) => cb(response)));\n };\n\n const onSubmit = async ({\n data,\n setError,\n }: {\n data: FieldValues;\n setError: UseFormSetError<FieldValues>;\n }) => {\n await $fetcher({ data: data as T })\n .then(async (response) => {\n const res = response as FormError & FormResponse;\n if (res?.statusCode && res.statusCode >= 400) {\n throw res;\n }\n\n try {\n await runS3Uploads(response);\n } catch (e) {\n console.error('S3 upload error:', e);\n setError('root.serverError', {\n type: 's3',\n message: s3UploadErrorMessage ?? 'Failed to upload files',\n });\n return;\n }\n onValidSubmit?.((response || {}) as FormResponse);\n })\n .catch((error: FormError) => {\n if (\n (error.statusCode === 400 || error.statusCode === 422) &&\n error.cause?.issues\n ) {\n Object.keys(error.cause.issues).forEach((key) => {\n setError(key, {\n type: 'server',\n message: error.cause?.issues?.[key],\n });\n });\n }\n\n if (invalidStatus.includes(error.statusCode) && onInvalidSubmit) {\n onInvalidSubmit({\n message: error?.message ?? 'Something went wrong',\n setError: setError as UseFormSetError<T>,\n status: error.statusCode,\n });\n } else if (error.statusCode === 400 || error.statusCode === 422) {\n setError('root.serverError', {\n type: 'server',\n message: error?.message ?? 'Something went wrong',\n });\n } else {\n throw error;\n }\n });\n };\n\n return (\n <FormS3Context.Provider value={s3ContextValue}>\n <FormBase\n onSubmit={onSubmit}\n schema={schema}\n noValidate={noValidate}\n errorBox={FormErrorBox}\n t={t}\n classNames={{\n form: classNames?.form ?? form(),\n root: classNames?.root ?? formRoot(),\n }}\n >\n {children}\n </FormBase>\n </FormS3Context.Provider>\n );\n};\n\nForm.displayName = 'Form';\nForm.TextInput = FormTextInput;\nForm.Textarea = FormTextarea;\nForm.Submit = FormSubmit;\nForm.Hidden = FormHidden;\nForm.Checkbox = FormCheckbox;\nForm.CheckboxGroup = FormCheckboxGroup;\nForm.CheckboxTree = FormCheckboxTree;\nForm.RadioGroup = FormRadioGroup;\nForm.Password = FormPassword;\nForm.Select = FormSelect;\nForm.Combobox = FormCombobox;\nForm.Autocomplete = FormAutocomplete;\nForm.DatePicker = FormDatePicker;\nForm.YearPicker = FormYearPicker;\nForm.DateTimePicker = FormDateTimePicker;\nForm.FileInput = FormFileInput;\nForm.FileInputMultiple = FormFileInputMultiple;\nForm.FileInputS3 = FormFileInputS3;\nForm.FileInputMultipleS3 = FormFileInputMultipleS3;\nForm.Dropzone = FormDropzone;\nForm.DropzoneS3 = FormDropzoneS3;\n"],"mappings":"8kDAyEA,MAAa,GAA+B,CAC1C,WACA,gBACA,kBACA,gBAAgB,EAAE,CAClB,WACA,SACA,IACA,uBACA,aACA,gBACkB,CAClB,IAAM,EAAiB,EAAsC,IAAI,IAAM,CAEjE,EAAiB,CACrB,kBAAmB,EAAc,IAAyB,CACxD,EAAe,QAAQ,IAAI,EAAM,EAAG,EAEtC,mBAAqB,GAAiB,CACpC,EAAe,QAAQ,OAAO,EAAK,EAEtC,CAEK,EAAe,KAAO,IAAqC,CAC/D,IAAM,EAAY,MAAM,KAAK,EAAe,QAAQ,QAAQ,CAAC,CAC7D,MAAM,QAAQ,IAAI,EAAU,IAAK,GAAO,EAAG,EAAS,CAAC,CAAC,EA2DxD,OACE,EAAC,EAAc,SAAf,CAAwB,MAAO,WAC7B,EAAC,EAAD,CACY,SA3DC,MAAO,CACtB,OACA,cAII,CACJ,MAAM,EAAS,CAAQ,OAAW,CAAC,CAChC,KAAK,KAAO,IAAa,CACxB,IAAM,EAAM,EACZ,GAAI,GAAK,YAAc,EAAI,YAAc,IACvC,MAAM,EAGR,GAAI,CACF,MAAM,EAAa,EAAS,OACrB,EAAG,CACV,QAAQ,MAAM,mBAAoB,EAAE,CACpC,EAAS,mBAAoB,CAC3B,KAAM,KACN,QAAS,GAAwB,yBAClC,CAAC,CACF,OAEF,IAAiB,GAAY,EAAE,CAAkB,EACjD,CACD,MAAO,GAAqB,CAa3B,IAXG,EAAM,aAAe,KAAO,EAAM,aAAe,MAClD,EAAM,OAAO,QAEb,OAAO,KAAK,EAAM,MAAM,OAAO,CAAC,QAAS,GAAQ,CAC/C,EAAS,EAAK,CACZ,KAAM,SACN,QAAS,EAAM,OAAO,SAAS,GAChC,CAAC,EACF,CAGA,EAAc,SAAS,EAAM,WAAW,EAAI,EAC9C,EAAgB,CACd,QAAS,GAAO,SAAW,uBACjB,WACV,OAAQ,EAAM,WACf,CAAC,SACO,EAAM,aAAe,KAAO,EAAM,aAAe,IAC1D,EAAS,mBAAoB,CAC3B,KAAM,SACN,QAAS,GAAO,SAAW,uBAC5B,CAAC,MAEF,MAAM,GAER,EAOQ,SACI,aACZ,SAAU,EACP,IACH,WAAY,CACV,KAAM,GAAY,MAAQ,GAAM,CAChC,KAAM,GAAY,MAAQ,GAAU,CACrC,CAEA,WACQ,CAAA,CACY,CAAA,EAI7B,EAAK,YAAc,OACnB,EAAK,UAAY,EACjB,EAAK,SAAW,EAChB,EAAK,OAAS,EACd,EAAK,OAAS,EACd,EAAK,SAAW,EAChB,EAAK,cAAgB,EACrB,EAAK,aAAe,EACpB,EAAK,WAAa,EAClB,EAAK,SAAW,EAChB,EAAK,OAAS,EACd,EAAK,SAAW,EAChB,EAAK,aAAe,EACpB,EAAK,WAAa,EAClB,EAAK,WAAa,EAClB,EAAK,eAAiB,EACtB,EAAK,UAAY,EACjB,EAAK,kBAAoB,EACzB,EAAK,YAAc,EACnB,EAAK,oBAAsB,EAC3B,EAAK,SAAW,EAChB,EAAK,WAAa"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{controls as e}from"./controls/index.mjs";import{RegisteredFormChildren as t}from"./controls/register-components.mjs";import{extractFormRules as n}from"./rules/extract-form-rules.mjs";import{cx as r}from"@mage-ui/styled-system/css";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{useEffect as o}from"react";import{FormProvider as s,useForm as c}from"react-hook-form";import*as l from"zod";import{zodResolver as u}from"@hookform/resolvers/zod";const d=({errorBox:d,onWatch:f,onSubmit:p,children:m,schema:h=l.object({}),t:g,mode:_=`onSubmit`,reValidateMode:v=`onChange`,classNames:
|
|
1
|
+
"use client";import{controls as e}from"./controls/index.mjs";import{RegisteredFormChildren as t}from"./controls/register-components.mjs";import{extractFormRules as n}from"./rules/extract-form-rules.mjs";import{cx as r}from"@mage-ui/styled-system/css";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{useEffect as o}from"react";import{FormProvider as s,useForm as c}from"react-hook-form";import*as l from"zod";import{zodResolver as u}from"@hookform/resolvers/zod";const d=({errorBox:d,onWatch:f,onSubmit:p,children:m,schema:h=l.object({}),t:g,mode:_=`onSubmit`,reValidateMode:v=`onChange`,noValidate:y,classNames:b})=>{let x=c({shouldFocusError:!0,resolver:u(h?h.and(n(m,e)):n(m,e)),mode:_,reValidateMode:v}),{register:S,handleSubmit:C,setError:w,formState:{errors:T},watch:E}=x;return o(()=>{let{unsubscribe:e}=E(e=>{f?.(e)});return()=>e()},[E,f]),a(s,{...x,t:g,children:[i(d,{errors:T}),i(`form`,{noValidate:y,onSubmit:C(e=>p({data:e,setError:w})),className:r(b?.form,b?.root),children:i(t,{register:S,componentTypes:e,errors:T,t:g,children:m})})]})};export{d as FormBase};
|
|
2
2
|
//# sourceMappingURL=FormBase.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormBase.mjs","names":["z"],"sources":["../../../src/components/forms/FormBase.tsx"],"sourcesContent":["'use client';\n\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport type {\n DeepPartialSkipArrayKey,\n FieldErrors,\n FieldValues,\n UseFormSetError,\n} from 'react-hook-form';\nimport { FormProvider, useForm } from 'react-hook-form';\nimport * as z from 'zod';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { cx } from '@mage-ui/styled-system/css';\n\nimport { controls } from './controls';\nimport { RegisteredFormChildren } from './controls/register-components';\nimport { extractFormRules } from './rules/extract-form-rules';\n\ntype FormProps = {\n children: React.ReactNode;\n schema?: z.ZodObject<Record<string, z.ZodTypeAny>>;\n errorBox: React.ComponentType<{ errors: FieldErrors }>;\n onWatch?: (values: DeepPartialSkipArrayKey<FieldValues>) => void;\n onSubmit: (args: {\n data: FieldValues;\n setError: UseFormSetError<FieldValues>;\n }) => void | Promise<void>;\n t?: (\n key: string,\n bindings?: Record<string, string>,\n fallback?: string,\n ) => string | React.ReactNode;\n mode?: 'onBlur' | 'onChange' | 'onSubmit' | 'onTouched' | 'all';\n reValidateMode?: 'onBlur' | 'onChange' | 'onSubmit';\n classNames?: {\n form?: string;\n root?: string;\n };\n};\n\nexport const FormBase = ({\n errorBox: ErrorBox,\n onWatch,\n onSubmit,\n children,\n schema = z.object({}),\n t,\n mode = 'onSubmit',\n reValidateMode = 'onChange',\n classNames,\n}: FormProps) => {\n const rules = (\n schema\n ? schema.and(extractFormRules(children, controls) as z.ZodTypeAny)\n : (extractFormRules(children, controls) as z.ZodTypeAny)\n ) as z.ZodType<FieldValues, FieldValues>;\n\n const form = useForm({\n shouldFocusError: true,\n resolver: zodResolver(rules),\n mode,\n reValidateMode,\n });\n\n const {\n register,\n handleSubmit,\n setError,\n formState: { errors },\n watch,\n } = form;\n\n useEffect(() => {\n const { unsubscribe } = watch((values) => {\n onWatch?.(values);\n });\n return () => unsubscribe();\n }, [watch, onWatch]);\n\n return (\n <FormProvider {...form} {...({ t } as Record<string, unknown>)}>\n <ErrorBox errors={errors} />\n <form\n onSubmit={handleSubmit((data) => onSubmit({ data, setError }))}\n className={cx(classNames?.form, classNames?.root)}\n >\n <RegisteredFormChildren\n register={register}\n componentTypes={controls}\n errors={errors}\n t={t}\n >\n {children}\n </RegisteredFormChildren>\n </form>\n </FormProvider>\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormBase.mjs","names":["z"],"sources":["../../../src/components/forms/FormBase.tsx"],"sourcesContent":["'use client';\n\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport type {\n DeepPartialSkipArrayKey,\n FieldErrors,\n FieldValues,\n UseFormSetError,\n} from 'react-hook-form';\nimport { FormProvider, useForm } from 'react-hook-form';\nimport * as z from 'zod';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { cx } from '@mage-ui/styled-system/css';\n\nimport { controls } from './controls';\nimport { RegisteredFormChildren } from './controls/register-components';\nimport { extractFormRules } from './rules/extract-form-rules';\n\ntype FormProps = {\n children: React.ReactNode;\n schema?: z.ZodObject<Record<string, z.ZodTypeAny>>;\n errorBox: React.ComponentType<{ errors: FieldErrors }>;\n onWatch?: (values: DeepPartialSkipArrayKey<FieldValues>) => void;\n onSubmit: (args: {\n data: FieldValues;\n setError: UseFormSetError<FieldValues>;\n }) => void | Promise<void>;\n t?: (\n key: string,\n bindings?: Record<string, string>,\n fallback?: string,\n ) => string | React.ReactNode;\n mode?: 'onBlur' | 'onChange' | 'onSubmit' | 'onTouched' | 'all';\n reValidateMode?: 'onBlur' | 'onChange' | 'onSubmit';\n noValidate?: boolean;\n classNames?: {\n form?: string;\n root?: string;\n };\n};\n\nexport const FormBase = ({\n errorBox: ErrorBox,\n onWatch,\n onSubmit,\n children,\n schema = z.object({}),\n t,\n mode = 'onSubmit',\n reValidateMode = 'onChange',\n noValidate,\n classNames,\n}: FormProps) => {\n const rules = (\n schema\n ? schema.and(extractFormRules(children, controls) as z.ZodTypeAny)\n : (extractFormRules(children, controls) as z.ZodTypeAny)\n ) as z.ZodType<FieldValues, FieldValues>;\n\n const form = useForm({\n shouldFocusError: true,\n resolver: zodResolver(rules),\n mode,\n reValidateMode,\n });\n\n const {\n register,\n handleSubmit,\n setError,\n formState: { errors },\n watch,\n } = form;\n\n useEffect(() => {\n const { unsubscribe } = watch((values) => {\n onWatch?.(values);\n });\n return () => unsubscribe();\n }, [watch, onWatch]);\n\n return (\n <FormProvider {...form} {...({ t } as Record<string, unknown>)}>\n <ErrorBox errors={errors} />\n <form\n noValidate={noValidate}\n onSubmit={handleSubmit((data) => onSubmit({ data, setError }))}\n className={cx(classNames?.form, classNames?.root)}\n >\n <RegisteredFormChildren\n register={register}\n componentTypes={controls}\n errors={errors}\n t={t}\n >\n {children}\n </RegisteredFormChildren>\n </form>\n </FormProvider>\n );\n};\n"],"mappings":"udA2CA,MAAa,GAAY,CACvB,SAAU,EACV,UACA,WACA,WACA,SAASA,EAAE,OAAO,EAAE,CAAC,CACrB,IACA,OAAO,WACP,iBAAiB,WACjB,aACA,gBACe,CAOf,IAAM,EAAO,EAAQ,CACnB,iBAAkB,GAClB,SAAU,EAPV,EACI,EAAO,IAAI,EAAiB,EAAU,EAAS,CAAiB,CAC/D,EAAiB,EAAU,EAAS,CAKb,CAC5B,OACA,iBACD,CAAC,CAEI,CACJ,WACA,eACA,WACA,UAAW,CAAE,UACb,SACE,EASJ,OAPA,MAAgB,CACd,GAAM,CAAE,eAAgB,EAAO,GAAW,CACxC,IAAU,EAAO,EACjB,CACF,UAAa,GAAa,EACzB,CAAC,EAAO,EAAQ,CAAC,CAGlB,EAAC,EAAD,CAAc,GAAI,EAAa,aAA/B,CACE,EAAC,EAAD,CAAkB,SAAU,CAAA,CAC5B,EAAC,OAAD,CACc,aACZ,SAAU,EAAc,GAAS,EAAS,CAAE,OAAM,WAAU,CAAC,CAAC,CAC9D,UAAW,EAAG,GAAY,KAAM,GAAY,KAAK,UAEjD,EAAC,EAAD,CACY,WACV,eAAgB,EACR,SACL,IAEF,WACsB,CAAA,CACpB,CAAA,CACM"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Autocomplete as e}from"../../controls/dropdown/autocomplete/Autocomplete.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=({$rule:r,isSubmitting:i,name:a,error:o,defaultValue:s,onChange:c,...l})=>t(n,{name:a,...s===void 0?{}:{defaultValue:s},render:({field:{onChange:n,value:r}})=>t(e,{name:a,error:o,value:r,...l,onChange:e=>{n(e),c?.(e)}})});r.displayName=`Form.Autocomplete`;export{r as FormAutocomplete};
|
|
1
|
+
import{Autocomplete as e}from"../../controls/dropdown/autocomplete/Autocomplete.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=({$rule:r,isSubmitting:i,name:a,error:o,defaultValue:s,onChange:c,...l})=>t(n,{name:a,...s===void 0?{}:{defaultValue:s},render:({field:{onChange:n,value:r},fieldState:i})=>t(e,{name:a,error:o??i.error?.message,value:r,...l,onChange:e=>{n(e),c?.(e)}})});r.displayName=`Form.Autocomplete`;export{r as FormAutocomplete};
|
|
2
2
|
//# sourceMappingURL=FormAutocomplete.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormAutocomplete.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormAutocomplete.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport {\n Autocomplete,\n type AutocompleteProps,\n} from '@/components/controls/dropdown/autocomplete/Autocomplete';\nimport type { DropdownValue } from '@/components/controls/dropdown/DropdownContextProvider';\n\nexport type FormAutocompleteProps = Omit<\n AutocompleteProps,\n 'onChange' | 'defaultValue' | 'value'\n> & {\n $rule?: string;\n error?: string;\n isSubmitting?: boolean;\n defaultValue?: DropdownValue;\n onChange?: (value: DropdownValue) => void;\n};\n\nexport const FormAutocomplete = ({\n $rule,\n isSubmitting: _isSubmitting,\n name,\n error,\n defaultValue,\n onChange,\n ...props\n}: FormAutocompleteProps) => {\n const controllerProps = defaultValue === undefined ? {} : { defaultValue };\n\n return (\n <Controller\n name={name}\n {...controllerProps}\n render={({ field: { onChange: fieldOnChange, value } }) => (\n <Autocomplete\n name={name}\n error={error}\n value={value}\n {...props}\n onChange={(val) => {\n fieldOnChange(val);\n onChange?.(val);\n }}\n />\n )}\n />\n );\n};\n\nFormAutocomplete.displayName = 'Form.Autocomplete';\n"],"mappings":"0KAmBA,MAAa,GAAoB,CAC/B,QACA,aAAc,EACd,OACA,QACA,eACA,WACA,GAAG,KAKD,EAAC,EAAD,CACQ,OACN,GALoB,IAAiB,IAAA,GAAY,EAAE,CAAG,CAAE,eAAc,CAMtE,QAAS,CAAE,MAAO,CAAE,SAAU,EAAe,
|
|
1
|
+
{"version":3,"file":"FormAutocomplete.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormAutocomplete.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport {\n Autocomplete,\n type AutocompleteProps,\n} from '@/components/controls/dropdown/autocomplete/Autocomplete';\nimport type { DropdownValue } from '@/components/controls/dropdown/DropdownContextProvider';\n\nexport type FormAutocompleteProps = Omit<\n AutocompleteProps,\n 'onChange' | 'defaultValue' | 'value'\n> & {\n $rule?: string;\n error?: string;\n isSubmitting?: boolean;\n defaultValue?: DropdownValue;\n onChange?: (value: DropdownValue) => void;\n};\n\nexport const FormAutocomplete = ({\n $rule,\n isSubmitting: _isSubmitting,\n name,\n error,\n defaultValue,\n onChange,\n ...props\n}: FormAutocompleteProps) => {\n const controllerProps = defaultValue === undefined ? {} : { defaultValue };\n\n return (\n <Controller\n name={name}\n {...controllerProps}\n render={({ field: { onChange: fieldOnChange, value }, fieldState }) => (\n <Autocomplete\n name={name}\n error={error ?? fieldState.error?.message}\n value={value}\n {...props}\n onChange={(val) => {\n fieldOnChange(val);\n onChange?.(val);\n }}\n />\n )}\n />\n );\n};\n\nFormAutocomplete.displayName = 'Form.Autocomplete';\n"],"mappings":"0KAmBA,MAAa,GAAoB,CAC/B,QACA,aAAc,EACd,OACA,QACA,eACA,WACA,GAAG,KAKD,EAAC,EAAD,CACQ,OACN,GALoB,IAAiB,IAAA,GAAY,EAAE,CAAG,CAAE,eAAc,CAMtE,QAAS,CAAE,MAAO,CAAE,SAAU,EAAe,SAAS,gBACpD,EAAC,EAAD,CACQ,OACN,MAAO,GAAS,EAAW,OAAO,QAC3B,QACP,GAAI,EACJ,SAAW,GAAQ,CACjB,EAAc,EAAI,CAClB,IAAW,EAAI,EAEjB,CAAA,CAEJ,CAAA,CAIN,EAAiB,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DatePicker as e}from"../../controls/date-picker/DatePicker.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=e=>{if(e!==void 0)return e===null||typeof e==`string`?e:`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`},i=({$rule:i,isSubmitting:a,name:o,error:s,defaultValue:c,onChange:l,disabled:u,...d})=>t(n,{name:o,...c===void 0?{}:{defaultValue:r(c)},render:({field:{onChange:n,onBlur:i,value:c}})=>t(e,{name:o,error:s,disabled:u||a,value:r(c),onBlur:i,...d,onChange:e=>{let t=r(e);n(t),l?.(t??null)}})});i.displayName=`Form.DatePicker`;export{i as FormDatePicker};
|
|
1
|
+
import{DatePicker as e}from"../../controls/date-picker/DatePicker.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=e=>{if(e!==void 0)return e===null||typeof e==`string`?e:`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`},i=({$rule:i,isSubmitting:a,name:o,error:s,defaultValue:c,onChange:l,disabled:u,...d})=>t(n,{name:o,...c===void 0?{}:{defaultValue:r(c)},render:({field:{onChange:n,onBlur:i,value:c},fieldState:f})=>t(e,{name:o,error:s??f.error?.message,disabled:u||a,value:r(c),onBlur:i,...d,onChange:e=>{let t=r(e);n(t),l?.(t??null)}})});i.displayName=`Form.DatePicker`;export{i as FormDatePicker};
|
|
2
2
|
//# sourceMappingURL=FormDatePicker.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormDatePicker.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormDatePicker.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport {\n DatePicker,\n type DatePickerProps,\n type DatePickerValue,\n} from '@/components/controls/date-picker/DatePicker';\n\nexport type FormDatePickerValue = string | null;\n\nexport type FormDatePickerProps = Omit<\n DatePickerProps,\n 'defaultValue' | 'onChange' | 'value'\n> & {\n $rule?: string;\n error?: string;\n isSubmitting?: boolean;\n name: string;\n defaultValue?: DatePickerValue;\n onChange?: (date: FormDatePickerValue) => void;\n};\n\nconst toFormDateValue = (\n value: DatePickerValue | undefined,\n): FormDatePickerValue | undefined => {\n if (value === undefined) return undefined;\n if (value === null || typeof value === 'string') return value;\n\n const year = value.getFullYear();\n const month = String(value.getMonth() + 1).padStart(2, '0');\n const day = String(value.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n};\n\nexport const FormDatePicker = ({\n $rule: _$rule,\n isSubmitting,\n name,\n error,\n defaultValue,\n onChange,\n disabled,\n ...props\n}: FormDatePickerProps) => {\n const controllerProps =\n defaultValue === undefined\n ? {}\n : { defaultValue: toFormDateValue(defaultValue) };\n\n return (\n <Controller\n name={name}\n {...controllerProps}\n render={({
|
|
1
|
+
{"version":3,"file":"FormDatePicker.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormDatePicker.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport {\n DatePicker,\n type DatePickerProps,\n type DatePickerValue,\n} from '@/components/controls/date-picker/DatePicker';\n\nexport type FormDatePickerValue = string | null;\n\nexport type FormDatePickerProps = Omit<\n DatePickerProps,\n 'defaultValue' | 'onChange' | 'value'\n> & {\n $rule?: string;\n error?: string;\n isSubmitting?: boolean;\n name: string;\n defaultValue?: DatePickerValue;\n onChange?: (date: FormDatePickerValue) => void;\n};\n\nconst toFormDateValue = (\n value: DatePickerValue | undefined,\n): FormDatePickerValue | undefined => {\n if (value === undefined) return undefined;\n if (value === null || typeof value === 'string') return value;\n\n const year = value.getFullYear();\n const month = String(value.getMonth() + 1).padStart(2, '0');\n const day = String(value.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n};\n\nexport const FormDatePicker = ({\n $rule: _$rule,\n isSubmitting,\n name,\n error,\n defaultValue,\n onChange,\n disabled,\n ...props\n}: FormDatePickerProps) => {\n const controllerProps =\n defaultValue === undefined\n ? {}\n : { defaultValue: toFormDateValue(defaultValue) };\n\n return (\n <Controller\n name={name}\n {...controllerProps}\n render={({\n field: { onChange: fieldOnChange, onBlur, value },\n fieldState,\n }) => (\n <DatePicker\n name={name}\n error={error ?? fieldState.error?.message}\n disabled={disabled || isSubmitting}\n value={toFormDateValue(value)}\n onBlur={onBlur}\n {...props}\n onChange={(date) => {\n const formValue = toFormDateValue(date);\n fieldOnChange(formValue);\n onChange?.(formValue ?? null);\n }}\n />\n )}\n />\n );\n};\n\nFormDatePicker.displayName = 'Form.DatePicker';\n"],"mappings":"4JAsBA,MAAM,EACJ,GACoC,CAChC,OAAU,IAAA,GAOd,OANI,IAAU,MAAQ,OAAO,GAAU,SAAiB,EAMjD,GAJM,EAAM,aAAa,CAIjB,GAHD,OAAO,EAAM,UAAU,CAAG,EAAE,CAAC,SAAS,EAAG,IAAI,CAGnC,GAFZ,OAAO,EAAM,SAAS,CAAC,CAAC,SAAS,EAAG,IAAI,IAKzC,GAAkB,CAC7B,MAAO,EACP,eACA,OACA,QACA,eACA,WACA,WACA,GAAG,KAQD,EAAC,EAAD,CACQ,OACN,GAPF,IAAiB,IAAA,GACb,EAAE,CACF,CAAE,aAAc,EAAgB,EAAa,CAAE,CAMjD,QAAS,CACP,MAAO,CAAE,SAAU,EAAe,SAAQ,SAC1C,gBAEA,EAAC,EAAD,CACQ,OACN,MAAO,GAAS,EAAW,OAAO,QAClC,SAAU,GAAY,EACtB,MAAO,EAAgB,EAAM,CACrB,SACR,GAAI,EACJ,SAAW,GAAS,CAClB,IAAM,EAAY,EAAgB,EAAK,CACvC,EAAc,EAAU,CACxB,IAAW,GAAa,KAAK,EAE/B,CAAA,CAEJ,CAAA,CAIN,EAAe,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{buildAcceptMap as e,resolveMeta as t}from"../../controls/dropzone/use-s3-upload.mjs";import{Dropzone as n}from"../../controls/dropzone/Dropzone.mjs";import{useFormS3Context as r}from"../FormS3Context.mjs";import{jsx as i}from"react/jsx-runtime";import{useEffect as a,useRef as o}from"react";import{Controller as s}from"react-hook-form";const c=e=>{if(!e)return{};let t={};for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r)?r.join(`,`):String(r);return t},l=({name:l,$rule:u,error:d,onChange:f,buildMetadata:p,resolveUploadUrls:m,getHeaders:h,acceptedTypes:g,accept:_,texts:v,...y})=>{let{registerS3Upload:b,unregisterS3Upload:x}=r(),S=o(new Map),C=o(m),w=o(h);C.current=m,w.current=h;let T=_??e(g),E=e=>{let n=t(e,g),r=p?.(e,n)??{};return{name:e.name,size:e.size,mimeType:n.mimeType,extension:n.extension,...r}};return a(()=>(b(l,async e=>{let t=C.current(e),n=Array.from(S.current.values());if(t.length!==n.length)throw Error(`Form.DropzoneS3 "${l}": resolveUploadUrls returned ${t.length} URL(s) but there are ${n.length} file(s).`);let r=w.current?.()??{};await Promise.all(n.map(async(e,n)=>{let i=t[n];if(!i)return;let{url:a,headers:o}=i,s={...c(o),...r},l=await fetch(a,{method:`PUT`,headers:s,body:e});if(!l.ok)throw Error(`Upload failed for "${e.name}" (${l.status} ${l.statusText})`)}))}),()=>{x(l)}),[l,b,x]),i(s,{name:l,render:({field:{onChange:e}})=>i(n,{...y,title:v?.title,subtitle:v?.subtitle,hint:v?.hint,accept:T,autoSend:!1,error:d,onChange:t=>{S.current=new Map(t.map(e=>[e.name,e])),e(t.map(E)),f?.(t)}})})};l.displayName=`Form.DropzoneS3`;export{l as FormDropzoneS3};
|
|
1
|
+
import{buildAcceptMap as e,resolveMeta as t}from"../../controls/dropzone/use-s3-upload.mjs";import{Dropzone as n}from"../../controls/dropzone/Dropzone.mjs";import{useFormS3Context as r}from"../FormS3Context.mjs";import{jsx as i}from"react/jsx-runtime";import{useEffect as a,useRef as o}from"react";import{Controller as s}from"react-hook-form";const c=e=>{if(!e)return{};let t={};for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r)?r.join(`,`):String(r);return t},l=({name:l,$rule:u,error:d,onChange:f,buildMetadata:p,resolveUploadUrls:m,getHeaders:h,acceptedTypes:g,accept:_,texts:v,...y})=>{let{registerS3Upload:b,unregisterS3Upload:x}=r(),S=o(new Map),C=o(m),w=o(h);C.current=m,w.current=h;let T=_??e(g),E=e=>{let n=t(e,g),r=p?.(e,n)??{};return{name:e.name,size:e.size,mimeType:n.mimeType,extension:n.extension,...r}};return a(()=>(b(l,async e=>{let t=C.current(e),n=Array.from(S.current.values());if(t.length!==n.length)throw Error(`Form.DropzoneS3 "${l}": resolveUploadUrls returned ${t.length} URL(s) but there are ${n.length} file(s).`);let r=w.current?.()??{};await Promise.all(n.map(async(e,n)=>{let i=t[n];if(!i)return;let{url:a,headers:o}=i,s={...c(o),...r},l=await fetch(a,{method:`PUT`,headers:s,body:e});if(!l.ok)throw Error(`Upload failed for "${e.name}" (${l.status} ${l.statusText})`)}))}),()=>{x(l)}),[l,b,x]),i(s,{name:l,render:({field:{onChange:e},fieldState:t})=>i(n,{...y,title:v?.title,subtitle:v?.subtitle,hint:v?.hint,accept:T,autoSend:!1,error:d??t.error?.message,onChange:t=>{S.current=new Map(t.map(e=>[e.name,e])),e(t.map(E)),f?.(t)}})})};l.displayName=`Form.DropzoneS3`;export{l as FormDropzoneS3};
|
|
2
2
|
//# sourceMappingURL=FormDropzoneS3.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormDropzoneS3.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormDropzoneS3.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { Controller } from 'react-hook-form';\n\nimport {\n Dropzone,\n type DropzoneProps,\n} from '@/components/controls/dropzone/Dropzone';\nimport {\n buildAcceptMap,\n type DropzoneS3Texts,\n resolveMeta,\n type S3FileMeta,\n} from '@/components/controls/dropzone/use-s3-upload';\n\nimport { useFormS3Context } from '../FormS3Context';\n\nexport type FileMetadata = {\n name: string;\n size: number;\n mimeType: string;\n extension: string;\n} & Record<string, unknown>;\n\nexport type UploadTarget = {\n url: string;\n headers?: Record<string, string | string[]>;\n};\n\nexport type FormDropzoneS3Props = Omit<\n DropzoneProps,\n 'url' | 'autoSend' | 'onChange' | 'uploader'\n> & {\n name: string;\n $rule?: string;\n error?: string;\n onChange?: (files: File[]) => void;\n\n /**\n * Convierte cada archivo en los metadatos que se enviarán con el submit.\n * Por defecto: { name, size, mimeType, extension }.\n */\n buildMetadata?: (file: File, meta: S3FileMeta) => Record<string, unknown>;\n\n /**\n * Extrae del response del $fetcher las URLs presignadas para este campo.\n * Debe devolver un array en el mismo orden que los archivos añadidos.\n */\n resolveUploadUrls: (response: unknown) => UploadTarget[];\n\n /** Headers extra para el PUT a S3 (auth, CSRF…). */\n getHeaders?: () => Record<string, string>;\n\n /** Map de extensión → MIME para aceptación y resolución de tipo. */\n acceptedTypes?: Record<string, string>;\n\n /** Lista explícita de tipos aceptados (tiene precedencia sobre acceptedTypes). */\n accept?: string[] | Record<string, string[]>;\n\n /** Textos del dropzone (título, subtítulo, hint, errores). */\n texts?: DropzoneS3Texts;\n};\n\nconst flattenHeaders = (\n headers: Record<string, string | string[]> | undefined,\n): Record<string, string> => {\n if (!headers) return {};\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = Array.isArray(v) ? v.join(',') : String(v);\n }\n return out;\n};\n\nexport const FormDropzoneS3 = ({\n name,\n $rule: _$rule,\n error,\n onChange,\n buildMetadata,\n resolveUploadUrls,\n getHeaders,\n acceptedTypes,\n accept,\n texts,\n ...dropzoneProps\n}: FormDropzoneS3Props) => {\n const { registerS3Upload, unregisterS3Upload } = useFormS3Context();\n const rawFilesRef = useRef<Map<string, File>>(new Map());\n const resolveUploadUrlsRef = useRef(resolveUploadUrls);\n const getHeadersRef = useRef(getHeaders);\n\n resolveUploadUrlsRef.current = resolveUploadUrls;\n getHeadersRef.current = getHeaders;\n\n const acceptList = accept ?? buildAcceptMap(acceptedTypes);\n\n const buildFileMeta = (file: File): FileMetadata => {\n const meta = resolveMeta(file, acceptedTypes);\n const extra = buildMetadata?.(file, meta) ?? {};\n return {\n name: file.name,\n size: file.size,\n mimeType: meta.mimeType,\n extension: meta.extension,\n ...extra,\n };\n };\n\n useEffect(() => {\n registerS3Upload(name, async (response: unknown) => {\n const targets = resolveUploadUrlsRef.current(response);\n const files = Array.from(rawFilesRef.current.values());\n\n if (targets.length !== files.length) {\n throw new Error(\n `Form.DropzoneS3 \"${name}\": resolveUploadUrls returned ${targets.length} URL(s) but there are ${files.length} file(s).`,\n );\n }\n\n const baseHeaders = getHeadersRef.current?.() ?? {};\n\n await Promise.all(\n files.map(async (file, i) => {\n const target = targets[i];\n if (!target) return;\n const { url, headers: s3Headers } = target;\n const merged = {\n ...flattenHeaders(s3Headers),\n ...baseHeaders,\n };\n\n const res = await fetch(url, {\n method: 'PUT',\n headers: merged,\n body: file,\n });\n\n if (!res.ok) {\n throw new Error(\n `Upload failed for \"${file.name}\" (${res.status} ${res.statusText})`,\n );\n }\n }),\n );\n });\n\n return () => {\n unregisterS3Upload(name);\n };\n }, [name, registerS3Upload, unregisterS3Upload]);\n\n return (\n <Controller\n name={name}\n render={({ field: { onChange: fieldOnChange } }) => (\n <Dropzone\n {...dropzoneProps}\n title={texts?.title}\n subtitle={texts?.subtitle}\n hint={texts?.hint}\n accept={acceptList}\n autoSend={false}\n error={error}\n onChange={(files) => {\n rawFilesRef.current = new Map(files.map((f) => [f.name, f]));\n fieldOnChange(files.map(buildFileMeta));\n onChange?.(files);\n }}\n />\n )}\n />\n );\n};\n\nFormDropzoneS3.displayName = 'Form.DropzoneS3';\n"],"mappings":"uVA8DA,MAAM,EACJ,GAC2B,CAC3B,GAAI,CAAC,EAAS,MAAO,EAAE,CACvB,IAAM,EAA8B,EAAE,CACtC,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,EAAQ,CAC1C,EAAI,GAAK,MAAM,QAAQ,EAAE,CAAG,EAAE,KAAK,IAAI,CAAG,OAAO,EAAE,CAErD,OAAO,GAGI,GAAkB,CAC7B,OACA,MAAO,EACP,QACA,WACA,gBACA,oBACA,aACA,gBACA,SACA,QACA,GAAG,KACsB,CACzB,GAAM,CAAE,mBAAkB,sBAAuB,GAAkB,CAC7D,EAAc,EAA0B,IAAI,IAAM,CAClD,EAAuB,EAAO,EAAkB,CAChD,EAAgB,EAAO,EAAW,CAExC,EAAqB,QAAU,EAC/B,EAAc,QAAU,EAExB,IAAM,EAAa,GAAU,EAAe,EAAc,CAEpD,EAAiB,GAA6B,CAClD,IAAM,EAAO,EAAY,EAAM,EAAc,CACvC,EAAQ,IAAgB,EAAM,EAAK,EAAI,EAAE,CAC/C,MAAO,CACL,KAAM,EAAK,KACX,KAAM,EAAK,KACX,SAAU,EAAK,SACf,UAAW,EAAK,UAChB,GAAG,EACJ,EA8CH,OA3CA,OACE,EAAiB,EAAM,KAAO,IAAsB,CAClD,IAAM,EAAU,EAAqB,QAAQ,EAAS,CAChD,EAAQ,MAAM,KAAK,EAAY,QAAQ,QAAQ,CAAC,CAEtD,GAAI,EAAQ,SAAW,EAAM,OAC3B,MAAU,MACR,oBAAoB,EAAK,gCAAgC,EAAQ,OAAO,wBAAwB,EAAM,OAAO,WAC9G,CAGH,IAAM,EAAc,EAAc,WAAW,EAAI,EAAE,CAEnD,MAAM,QAAQ,IACZ,EAAM,IAAI,MAAO,EAAM,IAAM,CAC3B,IAAM,EAAS,EAAQ,GACvB,GAAI,CAAC,EAAQ,OACb,GAAM,CAAE,MAAK,QAAS,GAAc,EAC9B,EAAS,CACb,GAAG,EAAe,EAAU,CAC5B,GAAG,EACJ,CAEK,EAAM,MAAM,MAAM,EAAK,CAC3B,OAAQ,MACR,QAAS,EACT,KAAM,EACP,CAAC,CAEF,GAAI,CAAC,EAAI,GACP,MAAU,MACR,sBAAsB,EAAK,KAAK,KAAK,EAAI,OAAO,GAAG,EAAI,WAAW,GACnE,EAEH,CACH,EACD,KAEW,CACX,EAAmB,EAAK,GAEzB,CAAC,EAAM,EAAkB,EAAmB,CAAC,CAG9C,EAAC,EAAD,CACQ,OACN,QAAS,CAAE,MAAO,CAAE,SAAU,
|
|
1
|
+
{"version":3,"file":"FormDropzoneS3.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormDropzoneS3.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { Controller } from 'react-hook-form';\n\nimport {\n Dropzone,\n type DropzoneProps,\n} from '@/components/controls/dropzone/Dropzone';\nimport {\n buildAcceptMap,\n type DropzoneS3Texts,\n resolveMeta,\n type S3FileMeta,\n} from '@/components/controls/dropzone/use-s3-upload';\n\nimport { useFormS3Context } from '../FormS3Context';\n\nexport type FileMetadata = {\n name: string;\n size: number;\n mimeType: string;\n extension: string;\n} & Record<string, unknown>;\n\nexport type UploadTarget = {\n url: string;\n headers?: Record<string, string | string[]>;\n};\n\nexport type FormDropzoneS3Props = Omit<\n DropzoneProps,\n 'url' | 'autoSend' | 'onChange' | 'uploader'\n> & {\n name: string;\n $rule?: string;\n error?: string;\n onChange?: (files: File[]) => void;\n\n /**\n * Convierte cada archivo en los metadatos que se enviarán con el submit.\n * Por defecto: { name, size, mimeType, extension }.\n */\n buildMetadata?: (file: File, meta: S3FileMeta) => Record<string, unknown>;\n\n /**\n * Extrae del response del $fetcher las URLs presignadas para este campo.\n * Debe devolver un array en el mismo orden que los archivos añadidos.\n */\n resolveUploadUrls: (response: unknown) => UploadTarget[];\n\n /** Headers extra para el PUT a S3 (auth, CSRF…). */\n getHeaders?: () => Record<string, string>;\n\n /** Map de extensión → MIME para aceptación y resolución de tipo. */\n acceptedTypes?: Record<string, string>;\n\n /** Lista explícita de tipos aceptados (tiene precedencia sobre acceptedTypes). */\n accept?: string[] | Record<string, string[]>;\n\n /** Textos del dropzone (título, subtítulo, hint, errores). */\n texts?: DropzoneS3Texts;\n};\n\nconst flattenHeaders = (\n headers: Record<string, string | string[]> | undefined,\n): Record<string, string> => {\n if (!headers) return {};\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = Array.isArray(v) ? v.join(',') : String(v);\n }\n return out;\n};\n\nexport const FormDropzoneS3 = ({\n name,\n $rule: _$rule,\n error,\n onChange,\n buildMetadata,\n resolveUploadUrls,\n getHeaders,\n acceptedTypes,\n accept,\n texts,\n ...dropzoneProps\n}: FormDropzoneS3Props) => {\n const { registerS3Upload, unregisterS3Upload } = useFormS3Context();\n const rawFilesRef = useRef<Map<string, File>>(new Map());\n const resolveUploadUrlsRef = useRef(resolveUploadUrls);\n const getHeadersRef = useRef(getHeaders);\n\n resolveUploadUrlsRef.current = resolveUploadUrls;\n getHeadersRef.current = getHeaders;\n\n const acceptList = accept ?? buildAcceptMap(acceptedTypes);\n\n const buildFileMeta = (file: File): FileMetadata => {\n const meta = resolveMeta(file, acceptedTypes);\n const extra = buildMetadata?.(file, meta) ?? {};\n return {\n name: file.name,\n size: file.size,\n mimeType: meta.mimeType,\n extension: meta.extension,\n ...extra,\n };\n };\n\n useEffect(() => {\n registerS3Upload(name, async (response: unknown) => {\n const targets = resolveUploadUrlsRef.current(response);\n const files = Array.from(rawFilesRef.current.values());\n\n if (targets.length !== files.length) {\n throw new Error(\n `Form.DropzoneS3 \"${name}\": resolveUploadUrls returned ${targets.length} URL(s) but there are ${files.length} file(s).`,\n );\n }\n\n const baseHeaders = getHeadersRef.current?.() ?? {};\n\n await Promise.all(\n files.map(async (file, i) => {\n const target = targets[i];\n if (!target) return;\n const { url, headers: s3Headers } = target;\n const merged = {\n ...flattenHeaders(s3Headers),\n ...baseHeaders,\n };\n\n const res = await fetch(url, {\n method: 'PUT',\n headers: merged,\n body: file,\n });\n\n if (!res.ok) {\n throw new Error(\n `Upload failed for \"${file.name}\" (${res.status} ${res.statusText})`,\n );\n }\n }),\n );\n });\n\n return () => {\n unregisterS3Upload(name);\n };\n }, [name, registerS3Upload, unregisterS3Upload]);\n\n return (\n <Controller\n name={name}\n render={({ field: { onChange: fieldOnChange }, fieldState }) => (\n <Dropzone\n {...dropzoneProps}\n title={texts?.title}\n subtitle={texts?.subtitle}\n hint={texts?.hint}\n accept={acceptList}\n autoSend={false}\n error={error ?? fieldState.error?.message}\n onChange={(files) => {\n rawFilesRef.current = new Map(files.map((f) => [f.name, f]));\n fieldOnChange(files.map(buildFileMeta));\n onChange?.(files);\n }}\n />\n )}\n />\n );\n};\n\nFormDropzoneS3.displayName = 'Form.DropzoneS3';\n"],"mappings":"uVA8DA,MAAM,EACJ,GAC2B,CAC3B,GAAI,CAAC,EAAS,MAAO,EAAE,CACvB,IAAM,EAA8B,EAAE,CACtC,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,EAAQ,CAC1C,EAAI,GAAK,MAAM,QAAQ,EAAE,CAAG,EAAE,KAAK,IAAI,CAAG,OAAO,EAAE,CAErD,OAAO,GAGI,GAAkB,CAC7B,OACA,MAAO,EACP,QACA,WACA,gBACA,oBACA,aACA,gBACA,SACA,QACA,GAAG,KACsB,CACzB,GAAM,CAAE,mBAAkB,sBAAuB,GAAkB,CAC7D,EAAc,EAA0B,IAAI,IAAM,CAClD,EAAuB,EAAO,EAAkB,CAChD,EAAgB,EAAO,EAAW,CAExC,EAAqB,QAAU,EAC/B,EAAc,QAAU,EAExB,IAAM,EAAa,GAAU,EAAe,EAAc,CAEpD,EAAiB,GAA6B,CAClD,IAAM,EAAO,EAAY,EAAM,EAAc,CACvC,EAAQ,IAAgB,EAAM,EAAK,EAAI,EAAE,CAC/C,MAAO,CACL,KAAM,EAAK,KACX,KAAM,EAAK,KACX,SAAU,EAAK,SACf,UAAW,EAAK,UAChB,GAAG,EACJ,EA8CH,OA3CA,OACE,EAAiB,EAAM,KAAO,IAAsB,CAClD,IAAM,EAAU,EAAqB,QAAQ,EAAS,CAChD,EAAQ,MAAM,KAAK,EAAY,QAAQ,QAAQ,CAAC,CAEtD,GAAI,EAAQ,SAAW,EAAM,OAC3B,MAAU,MACR,oBAAoB,EAAK,gCAAgC,EAAQ,OAAO,wBAAwB,EAAM,OAAO,WAC9G,CAGH,IAAM,EAAc,EAAc,WAAW,EAAI,EAAE,CAEnD,MAAM,QAAQ,IACZ,EAAM,IAAI,MAAO,EAAM,IAAM,CAC3B,IAAM,EAAS,EAAQ,GACvB,GAAI,CAAC,EAAQ,OACb,GAAM,CAAE,MAAK,QAAS,GAAc,EAC9B,EAAS,CACb,GAAG,EAAe,EAAU,CAC5B,GAAG,EACJ,CAEK,EAAM,MAAM,MAAM,EAAK,CAC3B,OAAQ,MACR,QAAS,EACT,KAAM,EACP,CAAC,CAEF,GAAI,CAAC,EAAI,GACP,MAAU,MACR,sBAAsB,EAAK,KAAK,KAAK,EAAI,OAAO,GAAG,EAAI,WAAW,GACnE,EAEH,CACH,EACD,KAEW,CACX,EAAmB,EAAK,GAEzB,CAAC,EAAM,EAAkB,EAAmB,CAAC,CAG9C,EAAC,EAAD,CACQ,OACN,QAAS,CAAE,MAAO,CAAE,SAAU,GAAiB,gBAC7C,EAAC,EAAD,CACE,GAAI,EACJ,MAAO,GAAO,MACd,SAAU,GAAO,SACjB,KAAM,GAAO,KACb,OAAQ,EACR,SAAU,GACV,MAAO,GAAS,EAAW,OAAO,QAClC,SAAW,GAAU,CACnB,EAAY,QAAU,IAAI,IAAI,EAAM,IAAK,GAAM,CAAC,EAAE,KAAM,EAAE,CAAC,CAAC,CAC5D,EAAc,EAAM,IAAI,EAAc,CAAC,CACvC,IAAW,EAAM,EAEnB,CAAA,CAEJ,CAAA,EAIN,EAAe,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{RadioGroup as e}from"../../controls/radio-group/RadioGroup.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=({$rule:r,defaultValue:i,isSubmitting:a,name:o,...
|
|
1
|
+
import{RadioGroup as e}from"../../controls/radio-group/RadioGroup.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=({$rule:r,defaultValue:i,isSubmitting:a,name:o,error:s,...c})=>t(n,{name:o,defaultValue:i,render:({field:{onChange:n,value:r},fieldState:i})=>t(e,{...c,error:s??i.error?.message,value:r,onChange:n})});r.displayName=`Form.RadioGroup`;export{r as FormRadioGroup};
|
|
2
2
|
//# sourceMappingURL=FormRadioGroup.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormRadioGroup.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormRadioGroup.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport {\n RadioGroup,\n type RadioGroupProps,\n} from '@/components/controls/radio-group/RadioGroup';\n\nexport type FormRadioGroupProps = Omit<\n RadioGroupProps,\n 'value' | 'onChange'\n> & {\n $rule?: string;\n defaultValue?: string;\n error?: string;\n isSubmitting?: boolean;\n name: string;\n};\n\nexport const FormRadioGroup = ({\n $rule: _$rule,\n defaultValue,\n isSubmitting: _isSubmitting,\n name,\n ...props\n}: FormRadioGroupProps) => {\n return (\n <Controller\n name={name}\n defaultValue={defaultValue}\n render={({ field: { onChange, value } }) => (\n <RadioGroup
|
|
1
|
+
{"version":3,"file":"FormRadioGroup.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormRadioGroup.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport {\n RadioGroup,\n type RadioGroupProps,\n} from '@/components/controls/radio-group/RadioGroup';\n\nexport type FormRadioGroupProps = Omit<\n RadioGroupProps,\n 'value' | 'onChange'\n> & {\n $rule?: string;\n defaultValue?: string;\n error?: string;\n isSubmitting?: boolean;\n name: string;\n};\n\nexport const FormRadioGroup = ({\n $rule: _$rule,\n defaultValue,\n isSubmitting: _isSubmitting,\n name,\n error,\n ...props\n}: FormRadioGroupProps) => {\n return (\n <Controller\n name={name}\n defaultValue={defaultValue}\n render={({ field: { onChange, value }, fieldState }) => (\n <RadioGroup\n {...props}\n error={error ?? fieldState.error?.message}\n value={value}\n onChange={onChange}\n />\n )}\n />\n );\n};\n\nFormRadioGroup.displayName = 'Form.RadioGroup';\n"],"mappings":"4JAkBA,MAAa,GAAkB,CAC7B,MAAO,EACP,eACA,aAAc,EACd,OACA,QACA,GAAG,KAGD,EAAC,EAAD,CACQ,OACQ,eACd,QAAS,CAAE,MAAO,CAAE,WAAU,SAAS,gBACrC,EAAC,EAAD,CACE,GAAI,EACJ,MAAO,GAAS,EAAW,OAAO,QAC3B,QACG,WACV,CAAA,CAEJ,CAAA,CAIN,EAAe,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Select as e}from"../../controls/dropdown/select/Select.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=({$rule:r,isSubmitting:i,name:a,error:o,defaultValue:s,...c})=>{let l=c.clearable??!1,u=s??(l?void 0:c.options[0]);return t(n,{name:a,...u===void 0?{}:{defaultValue:u},render:({field:{onChange:n,value:r}})=>t(e,{error:o,value:r,...c,onChange:n})})};r.displayName=`Form.Select`;export{r as FormSelect};
|
|
1
|
+
import{Select as e}from"../../controls/dropdown/select/Select.mjs";import{jsx as t}from"react/jsx-runtime";import{Controller as n}from"react-hook-form";const r=({$rule:r,isSubmitting:i,name:a,error:o,defaultValue:s,...c})=>{let l=c.clearable??!1,u=s??(l?void 0:c.options[0]);return t(n,{name:a,...u===void 0?{}:{defaultValue:u},render:({field:{onChange:n,value:r},fieldState:i})=>t(e,{error:o??i.error?.message,value:r,...c,onChange:n})})};r.displayName=`Form.Select`;export{r as FormSelect};
|
|
2
2
|
//# sourceMappingURL=FormSelect.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSelect.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormSelect.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport type { DropdownValue } from '@/components/controls/dropdown/DropdownContextProvider';\nimport {\n Select,\n type SelectProps,\n} from '@/components/controls/dropdown/select/Select';\n\nexport type FormSelectProps = Omit<\n SelectProps,\n 'onChange' | 'defaultValue' | 'value'\n> & {\n $rule?: string;\n error?: string;\n isSubmitting?: boolean;\n name: string;\n defaultValue?: DropdownValue;\n};\n\nexport const FormSelect = ({\n $rule,\n isSubmitting: _isSubmitting,\n name,\n error,\n defaultValue,\n ...props\n}: FormSelectProps) => {\n const isClearable = props.clearable ?? false;\n const resolvedDefaultValue =\n defaultValue ?? (!isClearable ? props.options[0] : undefined);\n const controllerProps =\n resolvedDefaultValue === undefined\n ? {}\n : { defaultValue: resolvedDefaultValue };\n\n return (\n <Controller\n name={name}\n {...controllerProps}\n render={({ field: { onChange, value } }) => (\n <Select
|
|
1
|
+
{"version":3,"file":"FormSelect.mjs","names":[],"sources":["../../../../src/components/forms/controls/FormSelect.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport type { DropdownValue } from '@/components/controls/dropdown/DropdownContextProvider';\nimport {\n Select,\n type SelectProps,\n} from '@/components/controls/dropdown/select/Select';\n\nexport type FormSelectProps = Omit<\n SelectProps,\n 'onChange' | 'defaultValue' | 'value'\n> & {\n $rule?: string;\n error?: string;\n isSubmitting?: boolean;\n name: string;\n defaultValue?: DropdownValue;\n};\n\nexport const FormSelect = ({\n $rule,\n isSubmitting: _isSubmitting,\n name,\n error,\n defaultValue,\n ...props\n}: FormSelectProps) => {\n const isClearable = props.clearable ?? false;\n const resolvedDefaultValue =\n defaultValue ?? (!isClearable ? props.options[0] : undefined);\n const controllerProps =\n resolvedDefaultValue === undefined\n ? {}\n : { defaultValue: resolvedDefaultValue };\n\n return (\n <Controller\n name={name}\n {...controllerProps}\n render={({ field: { onChange, value }, fieldState }) => (\n <Select\n error={error ?? fieldState.error?.message}\n value={value}\n {...props}\n onChange={onChange}\n />\n )}\n />\n );\n};\n\nFormSelect.displayName = 'Form.Select';\n"],"mappings":"wJAmBA,MAAa,GAAc,CACzB,QACA,aAAc,EACd,OACA,QACA,eACA,GAAG,KACkB,CACrB,IAAM,EAAc,EAAM,WAAa,GACjC,EACJ,IAAkB,EAAiC,IAAA,GAAnB,EAAM,QAAQ,IAMhD,OACE,EAAC,EAAD,CACQ,OACN,GAPF,IAAyB,IAAA,GACrB,EAAE,CACF,CAAE,aAAc,EAAsB,CAMxC,QAAS,CAAE,MAAO,CAAE,WAAU,SAAS,gBACrC,EAAC,EAAD,CACE,MAAO,GAAS,EAAW,OAAO,QAC3B,QACP,GAAI,EACM,WACV,CAAA,CAEJ,CAAA,EAIN,EAAW,YAAc"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mage-ui/components",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.186",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "",
|
|
6
6
|
"keywords": [],
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"rimraf": "^6.1.3",
|
|
26
26
|
"tsdown": "^0.21.4",
|
|
27
27
|
"typescript": "^5.9.3",
|
|
28
|
-
"@mage-ui/preset": "1.0.
|
|
28
|
+
"@mage-ui/preset": "1.0.186",
|
|
29
29
|
"@mage-ui/styled-system": "1.0.8"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|