@scbt-ecom/ui 0.130.3 → 0.131.0

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.
@@ -1,2 +1,2 @@
1
- import{jsxs as g,jsx as a}from"react/jsx-runtime";import{useRef as C,useEffect as F}from"react";import{useController as I}from"react-hook-form";import{InputBase as j}from"../../uncontrolled/input/Input.js";import{cn as N}from"../../../../utils/cn.js";import{mergeRefs as P}from"../../../../utils/mergeRefs.js";import"../../../button/Button.js";import"../../../buttonIcon/ButtonIcon.js";import"../../../calendar/Calendar.js";import"../../../calendar/model/utils.js";import"../../../accordion/Accordion.js";import"react-dom";import"../../../modal/ui/IframeModalContent.js";import"../../../../../../node_modules/react-hot-toast/dist/index.js";import"../../../table/ui/primitives/Primitives.js";import"../../../carousel/ui/CarouselContent.js";import"../../../slot/Slot.js";import"../../uncontrolled/autocomplete/Autocomplete.js";import"../../uncontrolled/checkbox/Checkbox.js";import"../../uncontrolled/combobox/combobox.js";import"../../uncontrolled/dayPicker/DayPicker.js";import"../../uncontrolled/inputOtp/InputOtpBase.js";import"../../uncontrolled/maskInput/MaskInput.js";import"../../uncontrolled/radio/RadioGroup.js";import"../../uncontrolled/radio/ui/RadioItem.js";import"../../uncontrolled/slider/SliderBase.js";import"../../uncontrolled/switch/Switch.js";import"../../uncontrolled/textarea/Textarea.js";import"../../uncontrolled/uploader/UploaderBase.js";import"../../uncontrolled/inputCurrency/InputCurrency.js";import"../../../../../../src/configs/api.js";import"../editor/ui/Editor.js";import"./MaskInputControl.js";import"../../../dropdownList/ui/dropdownItem/DropdownItem.js";import{MessageView as R}from"../../ui/MessageView.js";class l extends CustomEvent{constructor(i,e){super(i,e)}}const at=({control:m,name:i,defaultValue:e,disabled:p,rules:c,shouldUnregister:f,helperText:u,classes:d,...s})=>{const o=C(null),{field:n,fieldState:v}=I({control:m,name:i,defaultValue:e,disabled:p,rules:c,shouldUnregister:f}),{error:t,invalid:r,isTouched:h}=v,{message:w,root:x,...E}=d||{};return F(()=>{o.current&&(r&&o.current.dispatchEvent(new l("invalidField",{detail:t})),r||o.current.dispatchEvent(new l("validateField",{detail:t})))},[r]),g("div",{className:N("w-full",x),children:[a(j,{...s,...n,ref:P(o,n.ref),classes:E,invalid:r,attachmentProps:{invalid:r,isTouched:h,withValidateIcons:!0,...s.attachmentProps}}),a(R,{text:(t==null?void 0:t.message)||u,className:w,intent:t?"error":"simple",disabled:p})]})};export{at as InputControl};
1
+ import{jsxs as E,jsx as a}from"react/jsx-runtime";import{useRef as C,useEffect as F}from"react";import{useController as I}from"react-hook-form";import{InputBase as j}from"../../uncontrolled/input/Input.js";import{cn as N}from"../../../../utils/cn.js";import{mergeRefs as P}from"../../../../utils/mergeRefs.js";import"../../../button/Button.js";import"../../../buttonIcon/ButtonIcon.js";import"../../../calendar/Calendar.js";import"../../../calendar/model/utils.js";import"../../../accordion/Accordion.js";import"react-dom";import"../../../modal/ui/IframeModalContent.js";import"../../../../../../node_modules/react-hot-toast/dist/index.js";import"../../../table/ui/primitives/Primitives.js";import"../../../carousel/ui/CarouselContent.js";import"../../../slot/Slot.js";import"../../uncontrolled/autocomplete/Autocomplete.js";import"../../uncontrolled/checkbox/Checkbox.js";import"../../uncontrolled/combobox/combobox.js";import"../../uncontrolled/dayPicker/DayPicker.js";import"../../uncontrolled/inputOtp/InputOtpBase.js";import"../../uncontrolled/maskInput/MaskInput.js";import"../../uncontrolled/radio/RadioGroup.js";import"../../uncontrolled/radio/ui/RadioItem.js";import"../../uncontrolled/slider/SliderBase.js";import"../../uncontrolled/switch/Switch.js";import"../../uncontrolled/textarea/Textarea.js";import"../../uncontrolled/uploader/UploaderBase.js";import"../../uncontrolled/inputCurrency/InputCurrency.js";import"../../../../../../src/configs/api.js";import"../editor/ui/Editor.js";import"./MaskInputControl.js";import"../../../dropdownList/ui/dropdownItem/DropdownItem.js";import{MessageView as R}from"../../ui/MessageView.js";class l extends CustomEvent{constructor(i,o){super(i,o)}}const at=({control:m,name:i,defaultValue:o,disabled:s,rules:c,shouldUnregister:f,helperText:u,classes:d,...p})=>{const e=C(null),{field:n,fieldState:v}=I({control:m,name:i,defaultValue:o,disabled:s,rules:c,shouldUnregister:f}),{error:t,invalid:r,isTouched:h}=v,{message:g,root:w,...x}=d||{};return F(()=>{e.current&&(r&&e.current.dispatchEvent(new l("invalidField",{detail:t})),r||e.current.dispatchEvent(new l("validateField",{detail:t})))},[r]),E("div",{className:N("w-full",w),children:[a(j,{...p,...n,ref:P(e,n.ref),classes:x,invalid:r,attachmentProps:{invalid:r,isTouched:h,withValidateIcons:!0,...p.attachmentProps},"data-error-message":t==null?void 0:t.message}),a(R,{text:(t==null?void 0:t.message)||u,className:g,intent:t?"error":"simple",disabled:s})]})};export{at as InputControl};
2
2
  //# sourceMappingURL=InputControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InputControl.js","sources":["../../../../../../../lib/shared/ui/formElements/controlled/input/InputControl.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { type Control, type FieldValues, type Path, useController, type UseControllerProps } from 'react-hook-form'\nimport { InputBase, type InputBaseProps } from '../../uncontrolled/input'\nimport { MessageView } from '$/shared/ui/formElements/ui'\nimport { cn, mergeRefs } from '$/shared/utils'\n\ntype InputControlClasses = InputBaseProps['classes'] & {\n message?: string\n root?: string\n}\n\nexport type InputControlProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends Path<TFieldValues> = Path<TFieldValues>\n> = UseControllerProps<TFieldValues, TName> &\n Omit<InputBaseProps, 'classes'> & {\n /**\n * Контрол объект для управления полем\n */\n control: Control<TFieldValues>\n /**\n * Дополнительный текст\n */\n helperText?: string\n /**\n * Дополнительные стили компонента\n */\n classes?: InputControlClasses\n }\n\nclass DLGAFieldEvent<T extends {}> extends CustomEvent<T> {\n constructor(type: string, options: { bubbles?: boolean; cancelable?: boolean; detail?: T }) {\n super(type, options)\n }\n}\n\nexport const InputControl = <TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister,\n helperText,\n classes,\n ...props\n}: InputControlProps<TFieldValues>) => {\n const ref = useRef<HTMLInputElement>(null)\n const { field, fieldState } = useController({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister\n })\n\n const { error, invalid, isTouched } = fieldState\n const { message, root, ...restClasses } = classes || {}\n\n useEffect(() => {\n if (!ref.current) return\n\n if (invalid) {\n ref.current.dispatchEvent(new DLGAFieldEvent('invalidField', { detail: error }))\n }\n if (!invalid) {\n ref.current.dispatchEvent(new DLGAFieldEvent('validateField', { detail: error }))\n }\n }, [invalid])\n\n return (\n <div className={cn('w-full', root)}>\n <InputBase\n {...props}\n {...field}\n ref={mergeRefs(ref, field.ref)}\n classes={restClasses}\n invalid={invalid}\n attachmentProps={{\n invalid,\n isTouched,\n withValidateIcons: true,\n ...props.attachmentProps\n }}\n />\n <MessageView\n text={error?.message || helperText}\n className={message}\n intent={error ? 'error' : 'simple'}\n disabled={disabled}\n />\n </div>\n )\n}\n"],"names":["DLGAFieldEvent","type","options","InputControl","control","name","defaultValue","disabled","rules","shouldUnregister","helperText","classes","props","ref","useRef","field","fieldState","useController","error","invalid","isTouched","message","root","restClasses","useEffect","cn","jsx","InputBase","mergeRefs","MessageView"],"mappings":"ymDAgCA,MAAMA,UAAqC,WAAe,CACxD,YAAYC,EAAcC,EAAkE,CAC1F,MAAMD,EAAMC,CAAO,CACrB,CACF,CAEO,MAAMC,GAAe,CAAiD,CAC3E,QAAAC,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,QAAAC,EACA,GAAGC,CACL,IAAuC,CACrC,MAAMC,EAAMC,EAAyB,IAAI,EACnC,CAAE,MAAAC,EAAO,WAAAC,CAAA,EAAeC,EAAc,CAC1C,QAAAb,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,CAAA,CACD,EAEK,CAAE,MAAAS,EAAO,QAAAC,EAAS,UAAAC,CAAA,EAAcJ,EAChC,CAAE,QAAAK,EAAS,KAAAC,EAAM,GAAGC,CAAA,EAAgBZ,GAAW,CAAA,EAErD,OAAAa,EAAU,IAAM,CACTX,EAAI,UAELM,GACFN,EAAI,QAAQ,cAAc,IAAIb,EAAe,eAAgB,CAAE,OAAQkB,CAAA,CAAO,CAAC,EAE5EC,GACHN,EAAI,QAAQ,cAAc,IAAIb,EAAe,gBAAiB,CAAE,OAAQkB,CAAA,CAAO,CAAC,EAEpF,EAAG,CAACC,CAAO,CAAC,IAGT,MAAA,CAAI,UAAWM,EAAG,SAAUH,CAAI,EAC/B,SAAA,CAAAI,EAACC,EAAA,CACE,GAAGf,EACH,GAAGG,EACJ,IAAKa,EAAUf,EAAKE,EAAM,GAAG,EAC7B,QAASQ,EACT,QAAAJ,EACA,gBAAiB,CACf,QAAAA,EACA,UAAAC,EACA,kBAAmB,GACnB,GAAGR,EAAM,eAAA,CACX,CAAA,EAEFc,EAACG,EAAA,CACC,MAAMX,GAAA,YAAAA,EAAO,UAAWR,EACxB,UAAWW,EACX,OAAQH,EAAQ,QAAU,SAC1B,SAAAX,CAAA,CAAA,CACF,EACF,CAEJ"}
1
+ {"version":3,"file":"InputControl.js","sources":["../../../../../../../lib/shared/ui/formElements/controlled/input/InputControl.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { type Control, type FieldValues, type Path, useController, type UseControllerProps } from 'react-hook-form'\nimport { InputBase, type InputBaseProps } from '../../uncontrolled/input'\nimport { MessageView } from '$/shared/ui/formElements/ui'\nimport { cn, mergeRefs } from '$/shared/utils'\n\ntype InputControlClasses = InputBaseProps['classes'] & {\n message?: string\n root?: string\n}\n\nexport type InputControlProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends Path<TFieldValues> = Path<TFieldValues>\n> = UseControllerProps<TFieldValues, TName> &\n Omit<InputBaseProps, 'classes'> & {\n /**\n * Контрол объект для управления полем\n */\n control: Control<TFieldValues>\n /**\n * Дополнительный текст\n */\n helperText?: string\n /**\n * Дополнительные стили компонента\n */\n classes?: InputControlClasses\n }\n\nclass DLGAFieldEvent<T extends {}> extends CustomEvent<T> {\n constructor(type: string, options: { bubbles?: boolean; cancelable?: boolean; detail?: T }) {\n super(type, options)\n }\n}\n\nexport const InputControl = <TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister,\n helperText,\n classes,\n ...props\n}: InputControlProps<TFieldValues>) => {\n const ref = useRef<HTMLInputElement>(null)\n const { field, fieldState } = useController({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister\n })\n\n const { error, invalid, isTouched } = fieldState\n const { message, root, ...restClasses } = classes || {}\n\n useEffect(() => {\n if (!ref.current) return\n\n if (invalid) {\n ref.current.dispatchEvent(new DLGAFieldEvent('invalidField', { detail: error }))\n }\n if (!invalid) {\n ref.current.dispatchEvent(new DLGAFieldEvent('validateField', { detail: error }))\n }\n }, [invalid])\n\n return (\n <div className={cn('w-full', root)}>\n <InputBase\n {...props}\n {...field}\n ref={mergeRefs(ref, field.ref)}\n classes={restClasses}\n invalid={invalid}\n attachmentProps={{\n invalid,\n isTouched,\n withValidateIcons: true,\n ...props.attachmentProps\n }}\n data-error-message={error?.message}\n />\n <MessageView\n text={error?.message || helperText}\n className={message}\n intent={error ? 'error' : 'simple'}\n disabled={disabled}\n />\n </div>\n )\n}\n"],"names":["DLGAFieldEvent","type","options","InputControl","control","name","defaultValue","disabled","rules","shouldUnregister","helperText","classes","props","ref","useRef","field","fieldState","useController","error","invalid","isTouched","message","root","restClasses","useEffect","cn","jsx","InputBase","mergeRefs","MessageView"],"mappings":"ymDAgCA,MAAMA,UAAqC,WAAe,CACxD,YAAYC,EAAcC,EAAkE,CAC1F,MAAMD,EAAMC,CAAO,CACrB,CACF,CAEO,MAAMC,GAAe,CAAiD,CAC3E,QAAAC,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,QAAAC,EACA,GAAGC,CACL,IAAuC,CACrC,MAAMC,EAAMC,EAAyB,IAAI,EACnC,CAAE,MAAAC,EAAO,WAAAC,CAAA,EAAeC,EAAc,CAC1C,QAAAb,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,CAAA,CACD,EAEK,CAAE,MAAAS,EAAO,QAAAC,EAAS,UAAAC,CAAA,EAAcJ,EAChC,CAAE,QAAAK,EAAS,KAAAC,EAAM,GAAGC,CAAA,EAAgBZ,GAAW,CAAA,EAErD,OAAAa,EAAU,IAAM,CACTX,EAAI,UAELM,GACFN,EAAI,QAAQ,cAAc,IAAIb,EAAe,eAAgB,CAAE,OAAQkB,CAAA,CAAO,CAAC,EAE5EC,GACHN,EAAI,QAAQ,cAAc,IAAIb,EAAe,gBAAiB,CAAE,OAAQkB,CAAA,CAAO,CAAC,EAEpF,EAAG,CAACC,CAAO,CAAC,IAGT,MAAA,CAAI,UAAWM,EAAG,SAAUH,CAAI,EAC/B,SAAA,CAAAI,EAACC,EAAA,CACE,GAAGf,EACH,GAAGG,EACJ,IAAKa,EAAUf,EAAKE,EAAM,GAAG,EAC7B,QAASQ,EACT,QAAAJ,EACA,gBAAiB,CACf,QAAAA,EACA,UAAAC,EACA,kBAAmB,GACnB,GAAGR,EAAM,eAAA,EAEX,qBAAoBM,GAAA,YAAAA,EAAO,OAAA,CAAA,EAE7BQ,EAACG,EAAA,CACC,MAAMX,GAAA,YAAAA,EAAO,UAAWR,EACxB,UAAWW,EACX,OAAQH,EAAQ,QAAU,SAC1B,SAAAX,CAAA,CAAA,CACF,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{jsxs as I,jsx as i}from"react/jsx-runtime";import{memo as g}from"react";import{useController as w}from"react-hook-form";import{MaskInput as M}from"../../uncontrolled/maskInput/MaskInput.js";import{cn as j}from"../../../../utils/cn.js";import"../../../button/Button.js";import"../../../buttonIcon/ButtonIcon.js";import"../../../calendar/Calendar.js";import"../../../calendar/model/utils.js";import"../../../accordion/Accordion.js";import"react-dom";import"../../../modal/ui/IframeModalContent.js";import"../../../../../../node_modules/react-hot-toast/dist/index.js";import"../../../table/ui/primitives/Primitives.js";import"../../../carousel/ui/CarouselContent.js";import"../../../slot/Slot.js";import"../../uncontrolled/autocomplete/Autocomplete.js";import"../../uncontrolled/checkbox/Checkbox.js";import"../../uncontrolled/combobox/combobox.js";import"../../uncontrolled/dayPicker/DayPicker.js";import"../../uncontrolled/input/Input.js";import"../../uncontrolled/inputOtp/InputOtpBase.js";import"../../uncontrolled/radio/RadioGroup.js";import"../../uncontrolled/radio/ui/RadioItem.js";import"../../uncontrolled/slider/SliderBase.js";import"../../uncontrolled/switch/Switch.js";import"../../uncontrolled/textarea/Textarea.js";import"../../uncontrolled/uploader/UploaderBase.js";import"../../uncontrolled/inputCurrency/InputCurrency.js";import"../../../../../../src/configs/api.js";import"../editor/ui/Editor.js";import"../../../dropdownList/ui/dropdownItem/DropdownItem.js";import{MessageView as k}from"../../ui/MessageView.js";const v=({control:p,name:e,defaultValue:s,disabled:o,rules:n,shouldUnregister:a,classes:c,helperText:l,...r})=>{const{field:f,fieldState:u}=w({control:p,name:e,defaultValue:s,disabled:o,rules:n,shouldUnregister:a}),{error:t,invalid:m,isTouched:d}=u,{message:h,container:x,...C}=c||{};return I("div",{className:j("w-full",x),children:[i(M,{...r,...f,invalid:m,classes:C,attachmentProps:{invalid:m,isTouched:d,withValidateIcons:!0,...r.attachmentProps}}),i(k,{text:(t==null?void 0:t.message)||l,className:h,intent:t?"error":"simple",disabled:o})]})},it=g(v);export{it as MaskInputControl};
1
+ import{jsxs as C,jsx as i}from"react/jsx-runtime";import{memo as I}from"react";import{useController as w}from"react-hook-form";import{MaskInput as M}from"../../uncontrolled/maskInput/MaskInput.js";import{cn as j}from"../../../../utils/cn.js";import"../../../button/Button.js";import"../../../buttonIcon/ButtonIcon.js";import"../../../calendar/Calendar.js";import"../../../calendar/model/utils.js";import"../../../accordion/Accordion.js";import"react-dom";import"../../../modal/ui/IframeModalContent.js";import"../../../../../../node_modules/react-hot-toast/dist/index.js";import"../../../table/ui/primitives/Primitives.js";import"../../../carousel/ui/CarouselContent.js";import"../../../slot/Slot.js";import"../../uncontrolled/autocomplete/Autocomplete.js";import"../../uncontrolled/checkbox/Checkbox.js";import"../../uncontrolled/combobox/combobox.js";import"../../uncontrolled/dayPicker/DayPicker.js";import"../../uncontrolled/input/Input.js";import"../../uncontrolled/inputOtp/InputOtpBase.js";import"../../uncontrolled/radio/RadioGroup.js";import"../../uncontrolled/radio/ui/RadioItem.js";import"../../uncontrolled/slider/SliderBase.js";import"../../uncontrolled/switch/Switch.js";import"../../uncontrolled/textarea/Textarea.js";import"../../uncontrolled/uploader/UploaderBase.js";import"../../uncontrolled/inputCurrency/InputCurrency.js";import"../../../../../../src/configs/api.js";import"../editor/ui/Editor.js";import"../../../dropdownList/ui/dropdownItem/DropdownItem.js";import{MessageView as k}from"../../ui/MessageView.js";const v=({control:p,name:s,defaultValue:e,disabled:o,rules:n,shouldUnregister:a,classes:c,helperText:l,...m})=>{const{field:f,fieldState:u}=w({control:p,name:s,defaultValue:e,disabled:o,rules:n,shouldUnregister:a}),{error:t,invalid:r,isTouched:d}=u,{message:g,container:h,...x}=c||{};return C("div",{className:j("w-full",h),children:[i(M,{...m,...f,invalid:r,classes:x,attachmentProps:{invalid:r,isTouched:d,withValidateIcons:!0,...m.attachmentProps},"data-error-message":t==null?void 0:t.message}),i(k,{text:(t==null?void 0:t.message)||l,className:g,intent:t?"error":"simple",disabled:o})]})},it=I(v);export{it as MaskInputControl};
2
2
  //# sourceMappingURL=MaskInputControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MaskInputControl.js","sources":["../../../../../../../lib/shared/ui/formElements/controlled/input/MaskInputControl.tsx"],"sourcesContent":["'use client'\n\nimport { memo } from 'react'\nimport { type Control, type FieldPath, type FieldValues, useController, type UseControllerProps } from 'react-hook-form'\nimport { MaskInput, type MaskInputProps } from '../../uncontrolled/maskInput'\nimport { MessageView } from '$/shared/ui/formElements/ui'\nimport { cn } from '$/shared/utils'\n\ntype MaskInputClasses = MaskInputProps['classes'] & {\n message?: string\n}\n\nexport type MaskInputControlProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n> = UseControllerProps<TFieldValues, TName> &\n Omit<MaskInputProps, 'classes'> & {\n /**\n * Контрол объект для управления полем\n */\n control: Control<TFieldValues>\n /**\n * Дополнительные стили компонента\n */\n classes?: MaskInputClasses\n /**\n * Дополнительный текст\n */\n helperText?: string\n }\n\nconst InnerComponent = <TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister,\n classes,\n helperText,\n ...props\n}: MaskInputControlProps<TFieldValues>) => {\n const { field, fieldState } = useController({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister\n })\n\n const { error, invalid, isTouched } = fieldState\n const { message, container, ...restClasses } = classes || {}\n\n return (\n <div className={cn('w-full', container)}>\n <MaskInput\n {...props}\n {...field}\n invalid={invalid}\n classes={restClasses}\n attachmentProps={{\n invalid,\n isTouched,\n withValidateIcons: true,\n ...props.attachmentProps\n }}\n />\n <MessageView\n text={error?.message || helperText}\n className={message}\n intent={error ? 'error' : 'simple'}\n disabled={disabled}\n />\n </div>\n )\n}\n\nexport const MaskInputControl = memo(InnerComponent) as typeof InnerComponent\n"],"names":["InnerComponent","control","name","defaultValue","disabled","rules","shouldUnregister","classes","helperText","props","field","fieldState","useController","error","invalid","isTouched","message","container","restClasses","cn","jsx","MaskInput","MessageView","MaskInputControl","memo"],"mappings":"+/CA+BA,MAAMA,EAAiB,CAAiD,CACtE,QAAAC,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,QAAAC,EACA,WAAAC,EACA,GAAGC,CACL,IAA2C,CACzC,KAAM,CAAE,MAAAC,EAAO,WAAAC,CAAA,EAAeC,EAAc,CAC1C,QAAAX,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,CAAA,CACD,EAEK,CAAE,MAAAO,EAAO,QAAAC,EAAS,UAAAC,CAAA,EAAcJ,EAChC,CAAE,QAAAK,EAAS,UAAAC,EAAW,GAAGC,CAAA,EAAgBX,GAAW,CAAA,EAE1D,SACG,MAAA,CAAI,UAAWY,EAAG,SAAUF,CAAS,EACpC,SAAA,CAAAG,EAACC,EAAA,CACE,GAAGZ,EACH,GAAGC,EACJ,QAAAI,EACA,QAASI,EACT,gBAAiB,CACf,QAAAJ,EACA,UAAAC,EACA,kBAAmB,GACnB,GAAGN,EAAM,eAAA,CACX,CAAA,EAEFW,EAACE,EAAA,CACC,MAAMT,GAAA,YAAAA,EAAO,UAAWL,EACxB,UAAWQ,EACX,OAAQH,EAAQ,QAAU,SAC1B,SAAAT,CAAA,CAAA,CACF,EACF,CAEJ,EAEamB,GAAmBC,EAAKxB,CAAc"}
1
+ {"version":3,"file":"MaskInputControl.js","sources":["../../../../../../../lib/shared/ui/formElements/controlled/input/MaskInputControl.tsx"],"sourcesContent":["'use client'\n\nimport { memo } from 'react'\nimport { type Control, type FieldPath, type FieldValues, useController, type UseControllerProps } from 'react-hook-form'\nimport { MaskInput, type MaskInputProps } from '../../uncontrolled/maskInput'\nimport { MessageView } from '$/shared/ui/formElements/ui'\nimport { cn } from '$/shared/utils'\n\ntype MaskInputClasses = MaskInputProps['classes'] & {\n message?: string\n}\n\nexport type MaskInputControlProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n> = UseControllerProps<TFieldValues, TName> &\n Omit<MaskInputProps, 'classes'> & {\n /**\n * Контрол объект для управления полем\n */\n control: Control<TFieldValues>\n /**\n * Дополнительные стили компонента\n */\n classes?: MaskInputClasses\n /**\n * Дополнительный текст\n */\n helperText?: string\n }\n\nconst InnerComponent = <TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister,\n classes,\n helperText,\n ...props\n}: MaskInputControlProps<TFieldValues>) => {\n const { field, fieldState } = useController({\n control,\n name,\n defaultValue,\n disabled,\n rules,\n shouldUnregister\n })\n\n const { error, invalid, isTouched } = fieldState\n const { message, container, ...restClasses } = classes || {}\n\n return (\n <div className={cn('w-full', container)}>\n <MaskInput\n {...props}\n {...field}\n invalid={invalid}\n classes={restClasses}\n attachmentProps={{\n invalid,\n isTouched,\n withValidateIcons: true,\n ...props.attachmentProps\n }}\n data-error-message={error?.message}\n />\n <MessageView\n text={error?.message || helperText}\n className={message}\n intent={error ? 'error' : 'simple'}\n disabled={disabled}\n />\n </div>\n )\n}\n\nexport const MaskInputControl = memo(InnerComponent) as typeof InnerComponent\n"],"names":["InnerComponent","control","name","defaultValue","disabled","rules","shouldUnregister","classes","helperText","props","field","fieldState","useController","error","invalid","isTouched","message","container","restClasses","cn","jsx","MaskInput","MessageView","MaskInputControl","memo"],"mappings":"+/CA+BA,MAAMA,EAAiB,CAAiD,CACtE,QAAAC,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,QAAAC,EACA,WAAAC,EACA,GAAGC,CACL,IAA2C,CACzC,KAAM,CAAE,MAAAC,EAAO,WAAAC,CAAA,EAAeC,EAAc,CAC1C,QAAAX,EACA,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,iBAAAC,CAAA,CACD,EAEK,CAAE,MAAAO,EAAO,QAAAC,EAAS,UAAAC,CAAA,EAAcJ,EAChC,CAAE,QAAAK,EAAS,UAAAC,EAAW,GAAGC,CAAA,EAAgBX,GAAW,CAAA,EAE1D,SACG,MAAA,CAAI,UAAWY,EAAG,SAAUF,CAAS,EACpC,SAAA,CAAAG,EAACC,EAAA,CACE,GAAGZ,EACH,GAAGC,EACJ,QAAAI,EACA,QAASI,EACT,gBAAiB,CACf,QAAAJ,EACA,UAAAC,EACA,kBAAmB,GACnB,GAAGN,EAAM,eAAA,EAEX,qBAAoBI,GAAA,YAAAA,EAAO,OAAA,CAAA,EAE7BO,EAACE,EAAA,CACC,MAAMT,GAAA,YAAAA,EAAO,UAAWL,EACxB,UAAWQ,EACX,OAAQH,EAAQ,QAAU,SAC1B,SAAAT,CAAA,CAAA,CACF,EACF,CAEJ,EAEamB,GAAmBC,EAAKxB,CAAc"}
@@ -1,2 +1,2 @@
1
- import{jsxs as G,jsx as r}from"react/jsx-runtime";import{forwardRef as J}from"react";import{useFloating as Q}from"../../../../../../node_modules/@floating-ui/react/dist/floating-ui.react.js";import{cn as c}from"../../../../utils/cn.js";import"react-hook-form";import{useClickOutsideMany as V}from"../../../../hooks/useClickOutsideMany.js";import{useCombobox as W}from"./hooks/useCombobox.js";import{useKeyboardNavigation as X}from"./hooks/useKeyboardNavigation.js";import"../../../button/Button.js";import"../../../buttonIcon/ButtonIcon.js";import"../../../calendar/Calendar.js";import"../../../calendar/model/utils.js";import"../../../accordion/Accordion.js";import"react-dom";import"../../../modal/ui/IframeModalContent.js";import"../../../../../../node_modules/react-hot-toast/dist/index.js";import{Icon as Y}from"../../../icon/Icon.js";import"../../../table/ui/primitives/Primitives.js";import"../../../carousel/ui/CarouselContent.js";import"../../../slot/Slot.js";import"../autocomplete/Autocomplete.js";import"../checkbox/Checkbox.js";import"../dayPicker/DayPicker.js";import{InputBase as Z}from"../input/Input.js";import"../inputOtp/InputOtpBase.js";import"../maskInput/MaskInput.js";import"../radio/RadioGroup.js";import"../radio/ui/RadioItem.js";import"../slider/SliderBase.js";import"../switch/Switch.js";import"../textarea/Textarea.js";import"../uploader/UploaderBase.js";import"../inputCurrency/InputCurrency.js";import"../../../../../../src/configs/api.js";import"../../controlled/editor/ui/Editor.js";import"../../controlled/input/MaskInputControl.js";import"../../../dropdownList/ui/dropdownItem/DropdownItem.js";import{DropdownList as _}from"../../../dropdownList/DropdownList.js";import{Portal as $}from"../../../portal/Portal.js";import{AnimatePresence as x}from"../../../../../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.js";import{motion as l}from"../../../../../../node_modules/framer-motion/dist/es/render/components/motion/proxy.js";import{autoUpdate as H}from"../../../../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.js";import{flip as oo,offset as to}from"../../../../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js";const io=({options:R,multiple:u,value:e,onChange:k,defaultOpen:v,attachmentProps:N,searchable:m,invalid:h,displayValue:b,label:P,disabled:g,readOnly:w,className:a,externalHandlers:o,inputValue:y,filterDisabled:A,onInputChange:B,empty:F,classes:t,portal:O=globalThis?(z=>(z=globalThis==null?void 0:globalThis.document)==null?void 0:z.body)():void 0},j)=>{var d;const{floating:D,...L}=(t==null?void 0:t.list)??{},{refs:i,floatingStyles:M}=Q({placement:"bottom-start",strategy:"absolute",middleware:[oo({boundary:"clippingAncestors",crossAxis:!1}),to(4)],whileElementsMounted:H}),{open:C,setOpen:p,state:T,changeHandler:E,options:K,search:S,onInputChange:U,comboboxDisplayValue:I}=W({multiple:u,value:e,onChange:k,searchable:m,defaultOpen:v,displayValue:b,initialOptions:R,filterDisabled:A,externalHandlers:o,externalInputValue:y,externalOnInputChange:B});X({ref:i.domReference,openChangeHandler:p});const q=()=>e?u&&m?I(e):m?S:I(e):"";V([i.floating,i.reference],()=>p(!1));const s=O??i.domReference.current;return G("div",{ref:i.setReference,className:c("relative w-full",t==null?void 0:t.root,a),children:[r(Z,{ref:j,label:P,invalid:h,readOnly:w||!m,value:y||q(),onChange:U,disabled:g,onClick:n=>{var f;C||p(!0),(f=o==null?void 0:o.clickHandler)==null||f.call(o,n)},onBlur:n=>{var f;p(!1),(f=o==null?void 0:o.blurHandler)==null||f.call(o,n)},onFocus:o==null?void 0:o.focusHandler,classes:{input:c({"cursor-pointer":!m,"cursor-default":g,"pointer-events-none":g||w}),...t==null?void 0:t.input},autoComplete:"off",attachmentProps:{icon:r(Y,{name:"arrows/arrowRight",className:c("size-6 rotate-90 text-color-blue-grey-600 duration-100",{"-rotate-90":C,"text-color-negative":h})}),onClickIcon:()=>p(n=>!n),...N},"data-test-id":"combobox-input"}),r($,{root:s,children:r(x,{children:C&&r(l.div,{ref:i.setFloating,initial:{opacity:0},animate:{opacity:1},transition:{duration:.1},className:c("z-[1000]",D),style:{...M,width:(d=i.reference.current)==null?void 0:d.getBoundingClientRect().width},children:r(_,{empty:F,options:K,multiple:u,onPick:E,value:T,displayValue:b,classes:L,target:i.domReference})})})})]})},Yo=J(io);export{Yo as Combobox};
1
+ import{jsxs as J,jsx as r}from"react/jsx-runtime";import{forwardRef as Q}from"react";import{useFloating as V}from"../../../../../../node_modules/@floating-ui/react/dist/floating-ui.react.js";import{cn as c}from"../../../../utils/cn.js";import"react-hook-form";import{useClickOutsideMany as W}from"../../../../hooks/useClickOutsideMany.js";import{useCombobox as X}from"./hooks/useCombobox.js";import{useKeyboardNavigation as Y}from"./hooks/useKeyboardNavigation.js";import"../../../button/Button.js";import"../../../buttonIcon/ButtonIcon.js";import"../../../calendar/Calendar.js";import"../../../calendar/model/utils.js";import"../../../accordion/Accordion.js";import"react-dom";import"../../../modal/ui/IframeModalContent.js";import"../../../../../../node_modules/react-hot-toast/dist/index.js";import{Icon as Z}from"../../../icon/Icon.js";import"../../../table/ui/primitives/Primitives.js";import"../../../carousel/ui/CarouselContent.js";import"../../../slot/Slot.js";import"../autocomplete/Autocomplete.js";import"../checkbox/Checkbox.js";import"../dayPicker/DayPicker.js";import{InputBase as _}from"../input/Input.js";import"../inputOtp/InputOtpBase.js";import"../maskInput/MaskInput.js";import"../radio/RadioGroup.js";import"../radio/ui/RadioItem.js";import"../slider/SliderBase.js";import"../switch/Switch.js";import"../textarea/Textarea.js";import"../uploader/UploaderBase.js";import"../inputCurrency/InputCurrency.js";import"../../../../../../src/configs/api.js";import"../../controlled/editor/ui/Editor.js";import"../../controlled/input/MaskInputControl.js";import"../../../dropdownList/ui/dropdownItem/DropdownItem.js";import{DropdownList as $}from"../../../dropdownList/DropdownList.js";import{Portal as s}from"../../../portal/Portal.js";import{AnimatePresence as x}from"../../../../../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.js";import{motion as l}from"../../../../../../node_modules/framer-motion/dist/es/render/components/motion/proxy.js";import{autoUpdate as H}from"../../../../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.js";import{flip as oo,offset as to}from"../../../../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js";const io=({options:R,multiple:u,value:f,onChange:k,defaultOpen:v,attachmentProps:N,searchable:m,invalid:h,displayValue:b,label:P,disabled:g,readOnly:w,className:A,externalHandlers:o,inputValue:y,filterDisabled:B,onInputChange:F,empty:O,classes:t,portal:a=globalThis?(z=>(z=globalThis==null?void 0:globalThis.document)==null?void 0:z.body)():void 0},j)=>{var d;const{floating:D,...L}=(t==null?void 0:t.list)??{},{refs:i,floatingStyles:M}=V({placement:"bottom-start",strategy:"absolute",middleware:[oo({boundary:"clippingAncestors",crossAxis:!1}),to(4)],whileElementsMounted:H}),{open:C,setOpen:e,state:T,changeHandler:E,options:K,search:S,onInputChange:U,comboboxDisplayValue:I}=X({multiple:u,value:f,onChange:k,searchable:m,defaultOpen:v,displayValue:b,initialOptions:R,filterDisabled:B,externalHandlers:o,externalInputValue:y,externalOnInputChange:F});Y({ref:i.domReference,openChangeHandler:e});const q=()=>f?u&&m?I(f):m?S:I(f):"";W([i.floating,i.reference],()=>e(!1));const G=a??i.domReference.current;return J("div",{ref:i.setReference,className:c("relative w-full",t==null?void 0:t.root,A),children:[r(_,{ref:j,label:P,invalid:h,readOnly:w||!m,value:y||q(),onChange:U,disabled:g,onClick:p=>{var n;C||e(!0),(n=o==null?void 0:o.clickHandler)==null||n.call(o,p)},onBlur:p=>{var n;(n=o==null?void 0:o.blurHandler)==null||n.call(o,p)},onFocus:o==null?void 0:o.focusHandler,classes:{input:c({"cursor-pointer":!m,"cursor-default":g,"pointer-events-none":g||w}),...t==null?void 0:t.input},autoComplete:"off",attachmentProps:{icon:r(Z,{name:"arrows/arrowRight",className:c("size-6 rotate-90 text-color-blue-grey-600 duration-100",{"-rotate-90":C,"text-color-negative":h})}),onClickIcon:()=>e(p=>!p),...N},"data-test-id":"combobox-input"}),r(s,{root:G,children:r(x,{children:C&&r(l.div,{ref:i.setFloating,initial:{opacity:0},animate:{opacity:1},transition:{duration:.1},className:c("z-[1000]",D),style:{...M,width:(d=i.reference.current)==null?void 0:d.getBoundingClientRect().width},children:r($,{empty:O,options:K,multiple:u,onPick:E,value:T,displayValue:b,classes:L,target:i.domReference})})})})]})},Zo=Q(io);export{Zo as Combobox};
2
2
  //# sourceMappingURL=combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.js","sources":["../../../../../../../lib/shared/ui/formElements/uncontrolled/combobox/combobox.tsx"],"sourcesContent":["import { type ForwardedRef, forwardRef } from 'react'\nimport { autoUpdate, flip, offset, useFloating } from '@floating-ui/react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { useClickOutsideMany } from '../../../../hooks'\nimport { useCombobox, useKeyboardNavigation } from './hooks'\nimport type { ChangeHandler, ComboboxValue } from './model'\nimport type { ComboboxItemOption } from './ui'\nimport { type DeepPartial } from '$/shared/types'\nimport { DropdownList, Icon, Portal } from '$/shared/ui'\nimport { type DropdownListClasses, type DropdownListProps } from '$/shared/ui/dropdownList'\nimport { type IFieldAttachmentProps } from '$/shared/ui/formElements/ui'\nimport { InputBase, type InputBaseProps } from '$/shared/ui/formElements/uncontrolled/input'\nimport { cn } from '$/shared/utils'\n\nexport type ComboboxClasses = {\n root?: string\n list?: { floating?: string } & DropdownListClasses\n input?: InputBaseProps['classes']\n}\n\nexport type ExternalHandlers<Multi extends boolean> = {\n changeHandler?: ChangeHandler<Multi>\n clickHandler?: (event: React.MouseEvent<HTMLElement>) => void\n blurHandler?: (event: React.FocusEvent<HTMLElement>) => void\n focusHandler?: (event: React.FocusEvent<HTMLElement>) => void\n inputChangeHandler?: (value: string) => void\n}\n\nexport interface ComboboxProps<Multi extends boolean>\n extends Omit<DropdownListProps<Multi>, 'options' | 'value' | 'onChange'>,\n Record<`data-${string}`, unknown> {\n /**\n * Список опций\n */\n options: ComboboxItemOption[]\n /**\n * Выбранное значение\n */\n value?: ComboboxValue<Multi>\n /**\n * Функция для изменения значения\n */\n onChange?: ChangeHandler<Multi>\n /**\n * Свойство управляющее поиском\n */\n searchable?: boolean\n /**\n * Открыть список по умолчанию\n */\n defaultOpen?: boolean\n /**\n * Свойства дополнительной иконки\n */\n attachmentProps?: DeepPartial<IFieldAttachmentProps>\n /**\n * Пометить поле как не валидное\n */\n invalid?: boolean\n /**\n * Функция для управления отображаемым значением\n */\n displayValue?: (option: ComboboxItemOption) => string\n /**\n * Отображаемый лейбл\n */\n label: string\n /**\n * Выключено поле\n */\n disabled?: boolean\n /**\n * Только для чтения\n */\n readOnly?: boolean\n /**\n * Дополнительные стили\n */\n classes?: ComboboxClasses\n /**\n * Дополнительные события\n */\n externalHandlers?: ExternalHandlers<Multi>\n /**\n * Функция для изменения значения поиска\n */\n onInputChange?: (value: string) => void\n /**\n * Значение инпута\n */\n inputValue?: string\n /**\n * Выключить фильтрацию списка\n */\n filterDisabled?: boolean\n /**\n * Включить рендеринг в портале\n * @property {false | HTMLElement} portal document.body\n */\n portal?: false | HTMLElement\n}\n\nconst InnerComponent = <Multi extends boolean>(\n {\n options: initialOptions,\n multiple,\n value,\n onChange,\n defaultOpen,\n attachmentProps,\n searchable,\n invalid,\n displayValue,\n label,\n disabled,\n readOnly,\n className,\n externalHandlers,\n inputValue,\n filterDisabled,\n onInputChange: externalInputChangeHandler,\n empty,\n classes,\n portal = globalThis ? globalThis?.document?.body : undefined\n }: ComboboxProps<Multi>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const { floating, ...dropdownClasses } = classes?.list ?? {}\n\n const { refs, floatingStyles } = useFloating<HTMLDivElement>({\n placement: 'bottom-start',\n strategy: 'absolute',\n middleware: [\n flip({\n boundary: 'clippingAncestors',\n crossAxis: false\n }),\n offset(4)\n ],\n whileElementsMounted: autoUpdate\n })\n\n const { open, setOpen, state, changeHandler, options, search, onInputChange, comboboxDisplayValue } = useCombobox({\n multiple,\n value,\n onChange,\n searchable,\n defaultOpen,\n displayValue,\n initialOptions,\n filterDisabled,\n externalHandlers,\n externalInputValue: inputValue,\n externalOnInputChange: externalInputChangeHandler\n })\n\n useKeyboardNavigation({ ref: refs.domReference, openChangeHandler: setOpen })\n\n const getLabel = () => {\n if (!value) return ''\n\n if (multiple && searchable) {\n return comboboxDisplayValue(value)\n } else if (searchable) {\n return search\n } else {\n return comboboxDisplayValue(value)\n }\n }\n\n useClickOutsideMany([refs.floating, refs.reference as React.MutableRefObject<HTMLElement | null>], () => setOpen(false))\n\n const portalContainer = portal ?? refs.domReference.current!\n\n return (\n <div ref={refs.setReference} className={cn('relative w-full', classes?.root, className)}>\n <InputBase\n ref={ref}\n label={label}\n invalid={invalid}\n readOnly={readOnly || !searchable}\n value={inputValue || getLabel()}\n onChange={onInputChange}\n disabled={disabled}\n onClick={(event) => {\n if (!open) setOpen(true)\n externalHandlers?.clickHandler?.(event)\n }}\n onBlur={(event) => {\n setOpen(false)\n externalHandlers?.blurHandler?.(event)\n }}\n onFocus={externalHandlers?.focusHandler}\n classes={{\n input: cn({\n 'cursor-pointer': !searchable,\n 'cursor-default': disabled,\n 'pointer-events-none': disabled || readOnly\n }),\n ...classes?.input\n }}\n autoComplete='off'\n attachmentProps={{\n icon: (\n <Icon\n name='arrows/arrowRight'\n className={cn('size-6 rotate-90 text-color-blue-grey-600 duration-100', {\n '-rotate-90': open,\n 'text-color-negative': invalid\n })}\n />\n ),\n onClickIcon: () => setOpen((prev) => !prev),\n ...attachmentProps\n }}\n data-test-id='combobox-input'\n />\n\n <Portal root={portalContainer}>\n <AnimatePresence>\n {open && (\n <motion.div\n ref={refs.setFloating}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.1 }}\n className={cn('z-[1000]', floating)}\n style={{\n ...floatingStyles,\n width: refs.reference.current?.getBoundingClientRect().width\n }}\n >\n <DropdownList\n empty={empty}\n options={options}\n multiple={multiple}\n onPick={changeHandler}\n value={state}\n displayValue={displayValue}\n classes={dropdownClasses}\n target={refs.domReference}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </Portal>\n </div>\n )\n}\n\nexport const Combobox = forwardRef(InnerComponent) as <Multi extends boolean>(\n props: ComboboxProps<Multi> & { ref?: ForwardedRef<HTMLInputElement> }\n) => React.JSX.Element\n"],"names":["InnerComponent","initialOptions","multiple","value","onChange","defaultOpen","attachmentProps","searchable","invalid","displayValue","label","disabled","readOnly","className","externalHandlers","inputValue","filterDisabled","externalInputChangeHandler","empty","classes","portal","_a","ref","floating","dropdownClasses","refs","floatingStyles","useFloating","flip","offset","autoUpdate","open","setOpen","state","changeHandler","options","search","onInputChange","comboboxDisplayValue","useCombobox","useKeyboardNavigation","getLabel","useClickOutsideMany","portalContainer","jsxs","cn","jsx","InputBase","event","Icon","prev","Portal","AnimatePresence","motion","DropdownList","Combobox","forwardRef"],"mappings":"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"}
1
+ {"version":3,"file":"combobox.js","sources":["../../../../../../../lib/shared/ui/formElements/uncontrolled/combobox/combobox.tsx"],"sourcesContent":["import { type ForwardedRef, forwardRef } from 'react'\nimport { autoUpdate, flip, offset, useFloating } from '@floating-ui/react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { useClickOutsideMany } from '../../../../hooks'\nimport { useCombobox, useKeyboardNavigation } from './hooks'\nimport type { ChangeHandler, ComboboxValue } from './model'\nimport type { ComboboxItemOption } from './ui'\nimport { type DeepPartial } from '$/shared/types'\nimport { DropdownList, Icon, Portal } from '$/shared/ui'\nimport { type DropdownListClasses, type DropdownListProps } from '$/shared/ui/dropdownList'\nimport { type IFieldAttachmentProps } from '$/shared/ui/formElements/ui'\nimport { InputBase, type InputBaseProps } from '$/shared/ui/formElements/uncontrolled/input'\nimport { cn } from '$/shared/utils'\n\nexport type ComboboxClasses = {\n root?: string\n list?: { floating?: string } & DropdownListClasses\n input?: InputBaseProps['classes']\n}\n\nexport type ExternalHandlers<Multi extends boolean> = {\n changeHandler?: ChangeHandler<Multi>\n clickHandler?: (event: React.MouseEvent<HTMLElement>) => void\n blurHandler?: (event: React.FocusEvent<HTMLElement>) => void\n focusHandler?: (event: React.FocusEvent<HTMLElement>) => void\n inputChangeHandler?: (value: string) => void\n}\n\nexport interface ComboboxProps<Multi extends boolean>\n extends Omit<DropdownListProps<Multi>, 'options' | 'value' | 'onChange'>,\n Record<`data-${string}`, unknown> {\n /**\n * Список опций\n */\n options: ComboboxItemOption[]\n /**\n * Выбранное значение\n */\n value?: ComboboxValue<Multi>\n /**\n * Функция для изменения значения\n */\n onChange?: ChangeHandler<Multi>\n /**\n * Свойство управляющее поиском\n */\n searchable?: boolean\n /**\n * Открыть список по умолчанию\n */\n defaultOpen?: boolean\n /**\n * Свойства дополнительной иконки\n */\n attachmentProps?: DeepPartial<IFieldAttachmentProps>\n /**\n * Пометить поле как не валидное\n */\n invalid?: boolean\n /**\n * Функция для управления отображаемым значением\n */\n displayValue?: (option: ComboboxItemOption) => string\n /**\n * Отображаемый лейбл\n */\n label: string\n /**\n * Выключено поле\n */\n disabled?: boolean\n /**\n * Только для чтения\n */\n readOnly?: boolean\n /**\n * Дополнительные стили\n */\n classes?: ComboboxClasses\n /**\n * Дополнительные события\n */\n externalHandlers?: ExternalHandlers<Multi>\n /**\n * Функция для изменения значения поиска\n */\n onInputChange?: (value: string) => void\n /**\n * Значение инпута\n */\n inputValue?: string\n /**\n * Выключить фильтрацию списка\n */\n filterDisabled?: boolean\n /**\n * Включить рендеринг в портале\n * @property {false | HTMLElement} portal document.body\n */\n portal?: false | HTMLElement\n}\n\nconst InnerComponent = <Multi extends boolean>(\n {\n options: initialOptions,\n multiple,\n value,\n onChange,\n defaultOpen,\n attachmentProps,\n searchable,\n invalid,\n displayValue,\n label,\n disabled,\n readOnly,\n className,\n externalHandlers,\n inputValue,\n filterDisabled,\n onInputChange: externalInputChangeHandler,\n empty,\n classes,\n portal = globalThis ? globalThis?.document?.body : undefined\n }: ComboboxProps<Multi>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const { floating, ...dropdownClasses } = classes?.list ?? {}\n\n const { refs, floatingStyles } = useFloating<HTMLDivElement>({\n placement: 'bottom-start',\n strategy: 'absolute',\n middleware: [\n flip({\n boundary: 'clippingAncestors',\n crossAxis: false\n }),\n offset(4)\n ],\n whileElementsMounted: autoUpdate\n })\n\n const { open, setOpen, state, changeHandler, options, search, onInputChange, comboboxDisplayValue } = useCombobox({\n multiple,\n value,\n onChange,\n searchable,\n defaultOpen,\n displayValue,\n initialOptions,\n filterDisabled,\n externalHandlers,\n externalInputValue: inputValue,\n externalOnInputChange: externalInputChangeHandler\n })\n\n useKeyboardNavigation({ ref: refs.domReference, openChangeHandler: setOpen })\n\n const getLabel = () => {\n if (!value) return ''\n\n if (multiple && searchable) {\n return comboboxDisplayValue(value)\n } else if (searchable) {\n return search\n } else {\n return comboboxDisplayValue(value)\n }\n }\n\n useClickOutsideMany([refs.floating, refs.reference as React.MutableRefObject<HTMLElement | null>], () => setOpen(false))\n\n const portalContainer = portal ?? refs.domReference.current!\n\n return (\n <div ref={refs.setReference} className={cn('relative w-full', classes?.root, className)}>\n <InputBase\n ref={ref}\n label={label}\n invalid={invalid}\n readOnly={readOnly || !searchable}\n value={inputValue || getLabel()}\n onChange={onInputChange}\n disabled={disabled}\n onClick={(event) => {\n if (!open) setOpen(true)\n externalHandlers?.clickHandler?.(event)\n }}\n onBlur={(event) => {\n externalHandlers?.blurHandler?.(event)\n }}\n onFocus={externalHandlers?.focusHandler}\n classes={{\n input: cn({\n 'cursor-pointer': !searchable,\n 'cursor-default': disabled,\n 'pointer-events-none': disabled || readOnly\n }),\n ...classes?.input\n }}\n autoComplete='off'\n attachmentProps={{\n icon: (\n <Icon\n name='arrows/arrowRight'\n className={cn('size-6 rotate-90 text-color-blue-grey-600 duration-100', {\n '-rotate-90': open,\n 'text-color-negative': invalid\n })}\n />\n ),\n onClickIcon: () => setOpen((prev) => !prev),\n ...attachmentProps\n }}\n data-test-id='combobox-input'\n />\n\n <Portal root={portalContainer}>\n <AnimatePresence>\n {open && (\n <motion.div\n ref={refs.setFloating}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.1 }}\n className={cn('z-[1000]', floating)}\n style={{\n ...floatingStyles,\n width: refs.reference.current?.getBoundingClientRect().width\n }}\n >\n <DropdownList\n empty={empty}\n options={options}\n multiple={multiple}\n onPick={changeHandler}\n value={state}\n displayValue={displayValue}\n classes={dropdownClasses}\n target={refs.domReference}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </Portal>\n </div>\n )\n}\n\nexport const Combobox = forwardRef(InnerComponent) as <Multi extends boolean>(\n props: ComboboxProps<Multi> & { ref?: ForwardedRef<HTMLInputElement> }\n) => React.JSX.Element\n"],"names":["InnerComponent","initialOptions","multiple","value","onChange","defaultOpen","attachmentProps","searchable","invalid","displayValue","label","disabled","readOnly","className","externalHandlers","inputValue","filterDisabled","externalInputChangeHandler","empty","classes","portal","_a","ref","floating","dropdownClasses","refs","floatingStyles","useFloating","flip","offset","autoUpdate","open","setOpen","state","changeHandler","options","search","onInputChange","comboboxDisplayValue","useCombobox","useKeyboardNavigation","getLabel","useClickOutsideMany","portalContainer","jsxs","cn","jsx","InputBase","event","Icon","prev","Portal","AnimatePresence","motion","DropdownList","Combobox","forwardRef"],"mappings":"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"}