@scbt-ecom/ui 0.121.1 → 0.122.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{jsxs as C,jsx as d}from"react/jsx-runtime";import{cn as x}from"../../utils/cn.js";import"react";import{Button as b}from"../button/Button.js";import{Icon as z}from"../icon/Icon.js";const I=({page:o=1,between:i=3,totalPages:n,changePage:f,next:u=!0,ellipsis:m=0,classes:r})=>{i=i<1?1:i,o=Math.min(Math.max(o,1),n),m=Math.min(Math.max(m,0),i-2);const k=Array.from({length:n},(t,N)=>N),h=i*2+1;let y;return n<h?y=k:o-1<=i?y=k.slice(0,h-(m>0?m+1:0)):o+i>=n?y=k.slice(n-h+(m>0?m+1:0),n):y=k.slice(o-1-(i-(m>0?m+1:0)),o+(i-(m>0?m+1:0))),C("div",{className:x("flex",r==null?void 0:r.root),children:[u&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled",r==null?void 0:r.button),disabled:o<=1,onClick:()=>o>1&&f(o-2),children:d(z,{name:"arrows/arrowRight",className:"rotate-180"})}),n>h&&m>0&&k.slice(0,o-1<=i?0:m).map(t=>d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark",r==null?void 0:r.button),onClick:()=>t!==o-1&&f(t),children:t+1},t)),n>h&&m>0&&o-1>i&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark",r==null?void 0:r.ellipsis),children:"..."}),y.map(t=>{const N=t===o-1;return d(b,{size:"sm",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark",{[`text-color-primary-default ${r==null?void 0:r.active}`]:N},r==null?void 0:r.button),intent:N?"secondary":"ghost",onClick:()=>!N&&f(t),children:t+1},t)}),n>h&&m>0&&o<n-i&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark",r==null?void 0:r.ellipsis),children:"..."}),n>h&&m>0&&k.slice(o>=n-i?n:n-m,n).map(t=>d(b,{size:"sm",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark",r==null?void 0:r.button),intent:"ghost",onClick:()=>t!==o-1&&f(t),children:t+1},t)),u&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled",r==null?void 0:r.button),disabled:o>=n,onClick:()=>o<n&&f(o),children:d(z,{name:"arrows/arrowRight"})})]})};export{I as Pagination};
1
+ import{jsxs as M,jsx as d}from"react/jsx-runtime";import{cn as x}from"../../utils/cn.js";import"react";import{Button as b}from"../button/Button.js";import{Icon as z}from"../icon/Icon.js";const _=({page:o=1,between:i=3,totalPages:n,changePage:f,next:u=!0,ellipsis:m=0,classes:r,...C})=>{i=i<1?1:i,o=Math.min(Math.max(o,1),n),m=Math.min(Math.max(m,0),i-2);const k=Array.from({length:n},(t,N)=>N),h=i*2+1;let y;return n<h?y=k:o-1<=i?y=k.slice(0,h-(m>0?m+1:0)):o+i>=n?y=k.slice(n-h+(m>0?m+1:0),n):y=k.slice(o-1-(i-(m>0?m+1:0)),o+(i-(m>0?m+1:0))),M("div",{...C,className:x("flex",r==null?void 0:r.root),children:[u&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled",r==null?void 0:r.button),disabled:o<=1,onClick:()=>o>1&&f(o-2),children:d(z,{name:"arrows/arrowRight",className:"rotate-180"})}),n>h&&m>0&&k.slice(0,o-1<=i?0:m).map(t=>d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark",r==null?void 0:r.button),onClick:()=>t!==o-1&&f(t),children:t+1},t)),n>h&&m>0&&o-1>i&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark",r==null?void 0:r.ellipsis),children:"..."}),y.map(t=>{const N=t===o-1;return d(b,{size:"sm",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark",{[`text-color-primary-default ${r==null?void 0:r.active}`]:N},r==null?void 0:r.button),intent:N?"secondary":"ghost",onClick:()=>!N&&f(t),children:t+1},t)}),n>h&&m>0&&o<n-i&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark",r==null?void 0:r.ellipsis),children:"..."}),n>h&&m>0&&k.slice(o>=n-i?n:n-m,n).map(t=>d(b,{size:"sm",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark",r==null?void 0:r.button),intent:"ghost",onClick:()=>t!==o-1&&f(t),children:t+1},t)),u&&d(b,{size:"sm",intent:"ghost",className:x("mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled",r==null?void 0:r.button),disabled:o>=n,onClick:()=>o<n&&f(o),children:d(z,{name:"arrows/arrowRight"})})]})};export{_ as Pagination};
2
2
  //# sourceMappingURL=Pagination.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["../../../../../lib/shared/ui/pagination/Pagination.tsx"],"sourcesContent":["import { cn } from '../../utils'\nimport { Button } from '../button'\nimport { Icon } from '../icon'\n\ntype PaginationClasses = {\n root?: string\n button?: string\n ellipsis?: string\n active?: string\n}\n\nexport type PaginationProps = {\n /**\n * активная страница\n */\n page?: number\n /**\n * количество элементов после сужения страниц пример 1 - (1...6 7 8...n)\n * ^ ^\n */\n between?: number\n /**\n * количество элементов на странице\n */\n totalPages: number\n /**\n * функция для переключения страницы\n */\n changePage: (page: number) => void\n /**\n * включить переход на следующую/предыдущую страницу\n */\n next?: boolean\n /**\n * количество страниц для сужения\n */\n ellipsis?: number\n /**\n * дополнительные стили\n */\n classes?: PaginationClasses\n}\n\nexport const Pagination = ({\n page = 1,\n between = 3,\n totalPages,\n changePage,\n next = true,\n ellipsis = 0,\n classes\n}: PaginationProps) => {\n // гарантирует что between никогда не будет меньше 1\n between = between < 1 ? 1 : between\n // ограничиваем текущую страницу от 1 до totalPages\n page = Math.min(Math.max(page, 1), totalPages)\n // ограничиваем количество сужаемых элементов от 0 до between - 2\n ellipsis = Math.min(Math.max(ellipsis, 0), between - 2)\n\n const positions = Array.from({ length: totalPages }, (_, index) => index)\n\n // количество отображаемых страниц (включая активную)\n const visiblePages = between * 2 + 1\n\n let range\n\n if (totalPages < visiblePages) {\n // если общее количество страниц меньше, чем нужно отобразить, то отображаем все страницы\n range = positions\n } else if (page - 1 <= between) {\n // если текущая страница близка к началу, то отображаем страницы с начала\n range = positions.slice(0, visiblePages - (ellipsis > 0 ? ellipsis + 1 : 0))\n } else if (page + between >= totalPages) {\n // если текущая страница близка к концу, то отображаем страницы с конца\n range = positions.slice(totalPages - visiblePages + (ellipsis > 0 ? ellipsis + 1 : 0), totalPages)\n } else {\n // иначе показываем страницы обрезая их слева и справа\n range = positions.slice(\n page - 1 - (between - (ellipsis > 0 ? ellipsis + 1 : 0)),\n page + (between - (ellipsis > 0 ? ellipsis + 1 : 0))\n )\n }\n\n return (\n <div className={cn('flex', classes?.root)}>\n {next && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled', classes?.button)}\n disabled={page <= 1}\n onClick={() => page > 1 && changePage(page - 2)}\n >\n <Icon name='arrows/arrowRight' className='rotate-180' />\n </Button>\n )}\n {totalPages > visiblePages &&\n ellipsis > 0 &&\n positions.slice(0, page - 1 <= between ? 0 : ellipsis).map((value) => (\n <Button\n key={value}\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark', classes?.button)}\n onClick={() => value !== page - 1 && changePage(value)}\n >\n {value + 1}\n </Button>\n ))}\n {totalPages > visiblePages && ellipsis > 0 && page - 1 > between && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark', classes?.ellipsis)}\n >\n ...\n </Button>\n )}\n {range.map((value) => {\n const active = value === page - 1\n\n return (\n <Button\n key={value}\n size='sm'\n className={cn(\n 'mob-body-regular-l w-[40px] p-0 text-color-dark',\n {\n [`text-color-primary-default ${classes?.active}`]: active\n },\n classes?.button\n )}\n intent={active ? 'secondary' : 'ghost'}\n onClick={() => !active && changePage(value)}\n >\n {value + 1}\n </Button>\n )\n })}\n {totalPages > visiblePages && ellipsis > 0 && page < totalPages - between && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark', classes?.ellipsis)}\n >\n ...\n </Button>\n )}\n {totalPages > visiblePages &&\n ellipsis > 0 &&\n positions.slice(page >= totalPages - between ? totalPages : totalPages - ellipsis, totalPages).map((value) => (\n <Button\n key={value}\n size='sm'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark', classes?.button)}\n intent='ghost'\n onClick={() => value !== page - 1 && changePage(value)}\n >\n {value + 1}\n </Button>\n ))}\n {next && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled', classes?.button)}\n disabled={page >= totalPages}\n onClick={() => page < totalPages && changePage(page)}\n >\n <Icon name='arrows/arrowRight' />\n </Button>\n )}\n </div>\n )\n}\n"],"names":["Pagination","page","between","totalPages","changePage","next","ellipsis","classes","positions","_","index","visiblePages","range","cn","jsx","Button","Icon","value","active"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination.js","sources":["../../../../../lib/shared/ui/pagination/Pagination.tsx"],"sourcesContent":["import { type HTMLAttributes } from 'react'\nimport { cn } from '../../utils'\nimport { Button } from '../button'\nimport { Icon } from '../icon'\n\ntype PaginationClasses = {\n root?: string\n button?: string\n ellipsis?: string\n active?: string\n}\n\nexport type PaginationProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * активная страница\n */\n page?: number\n /**\n * количество элементов после сужения страниц пример 1 - (1...6 7 8...n)\n * ^ ^\n */\n between?: number\n /**\n * количество элементов на странице\n */\n totalPages: number\n /**\n * функция для переключения страницы\n */\n changePage: (page: number) => void\n /**\n * включить переход на следующую/предыдущую страницу\n */\n next?: boolean\n /**\n * количество страниц для сужения\n */\n ellipsis?: number\n /**\n * дополнительные стили\n */\n classes?: PaginationClasses\n}\n\nexport const Pagination = ({\n page = 1,\n between = 3,\n totalPages,\n changePage,\n next = true,\n ellipsis = 0,\n classes,\n ...props\n}: PaginationProps) => {\n // гарантирует что between никогда не будет меньше 1\n between = between < 1 ? 1 : between\n // ограничиваем текущую страницу от 1 до totalPages\n page = Math.min(Math.max(page, 1), totalPages)\n // ограничиваем количество сужаемых элементов от 0 до between - 2\n ellipsis = Math.min(Math.max(ellipsis, 0), between - 2)\n\n const positions = Array.from({ length: totalPages }, (_, index) => index)\n\n // количество отображаемых страниц (включая активную)\n const visiblePages = between * 2 + 1\n\n let range\n\n if (totalPages < visiblePages) {\n // если общее количество страниц меньше, чем нужно отобразить, то отображаем все страницы\n range = positions\n } else if (page - 1 <= between) {\n // если текущая страница близка к началу, то отображаем страницы с начала\n range = positions.slice(0, visiblePages - (ellipsis > 0 ? ellipsis + 1 : 0))\n } else if (page + between >= totalPages) {\n // если текущая страница близка к концу, то отображаем страницы с конца\n range = positions.slice(totalPages - visiblePages + (ellipsis > 0 ? ellipsis + 1 : 0), totalPages)\n } else {\n // иначе показываем страницы обрезая их слева и справа\n range = positions.slice(\n page - 1 - (between - (ellipsis > 0 ? ellipsis + 1 : 0)),\n page + (between - (ellipsis > 0 ? ellipsis + 1 : 0))\n )\n }\n\n return (\n <div {...props} className={cn('flex', classes?.root)}>\n {next && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled', classes?.button)}\n disabled={page <= 1}\n onClick={() => page > 1 && changePage(page - 2)}\n >\n <Icon name='arrows/arrowRight' className='rotate-180' />\n </Button>\n )}\n {totalPages > visiblePages &&\n ellipsis > 0 &&\n positions.slice(0, page - 1 <= between ? 0 : ellipsis).map((value) => (\n <Button\n key={value}\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark', classes?.button)}\n onClick={() => value !== page - 1 && changePage(value)}\n >\n {value + 1}\n </Button>\n ))}\n {totalPages > visiblePages && ellipsis > 0 && page - 1 > between && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark', classes?.ellipsis)}\n >\n ...\n </Button>\n )}\n {range.map((value) => {\n const active = value === page - 1\n\n return (\n <Button\n key={value}\n size='sm'\n className={cn(\n 'mob-body-regular-l w-[40px] p-0 text-color-dark',\n {\n [`text-color-primary-default ${classes?.active}`]: active\n },\n classes?.button\n )}\n intent={active ? 'secondary' : 'ghost'}\n onClick={() => !active && changePage(value)}\n >\n {value + 1}\n </Button>\n )\n })}\n {totalPages > visiblePages && ellipsis > 0 && page < totalPages - between && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l pointer-events-none w-[40px] p-0 text-color-dark', classes?.ellipsis)}\n >\n ...\n </Button>\n )}\n {totalPages > visiblePages &&\n ellipsis > 0 &&\n positions.slice(page >= totalPages - between ? totalPages : totalPages - ellipsis, totalPages).map((value) => (\n <Button\n key={value}\n size='sm'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark', classes?.button)}\n intent='ghost'\n onClick={() => value !== page - 1 && changePage(value)}\n >\n {value + 1}\n </Button>\n ))}\n {next && (\n <Button\n size='sm'\n intent='ghost'\n className={cn('mob-body-regular-l w-[40px] p-0 text-color-dark disabled:text-icon-disabled', classes?.button)}\n disabled={page >= totalPages}\n onClick={() => page < totalPages && changePage(page)}\n >\n <Icon name='arrows/arrowRight' />\n </Button>\n )}\n </div>\n )\n}\n"],"names":["Pagination","page","between","totalPages","changePage","next","ellipsis","classes","props","positions","_","index","visiblePages","range","jsxs","cn","jsx","Button","Icon","value","active"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as n}from"react/jsx-runtime";import{useState as I,createElement as z}from"react";import{AuthProvider as h}from"../authProvider/AuthProvider.js";import{HTMLRenderer as g}from"../htmlParser/HTMLRenderer.js";import{widgetIds as y}from"../model/helpers.js";import{getFieldsProgress as H}from"./model/getFieldsProgress.js";import{getDynamicSchema as M}from"../../../src/shared/utils/getDynamicSchema.js";import{cn as m}from"../../shared/utils/cn.js";import{useControlledForm as R}from"../../shared/hooks/useControlledForm.js";import{useFieldsProgress as Z}from"../../shared/hooks/useFieldsProgress.js";import{ResponsiveContainer as E}from"../../shared/ui/responsiveContainer/ResponsiveContainer.js";import{Button as L}from"../../shared/ui/button/Button.js";import"../../shared/ui/buttonIcon/ButtonIcon.js";import"../../shared/ui/calendar/Calendar.js";import"../../shared/ui/calendar/model/utils.js";import"../../shared/ui/accordion/Accordion.js";import{ProgressBar as Q}from"../../shared/ui/progressBar/ProgressBar.js";import"react-dom";import"../../shared/ui/modal/ui/IframeModalContent.js";import"../../../node_modules/react-hot-toast/dist/index.js";import{Icon as T}from"../../shared/ui/icon/Icon.js";import"../../shared/ui/table/ui/primitives/Primitives.js";import{Heading as w}from"../../shared/ui/heading/Heading.js";import"../../shared/ui/carousel/ui/CarouselContent.js";import"../../shared/ui/slot/Slot.js";import"../../shared/ui/formElements/uncontrolled/autocomplete/Autocomplete.js";import{CheckboxBase as U}from"../../shared/ui/formElements/uncontrolled/checkbox/Checkbox.js";import"../../shared/ui/formElements/uncontrolled/combobox/combobox.js";import"../../shared/ui/formElements/uncontrolled/dayPicker/DayPicker.js";import"../../shared/ui/formElements/uncontrolled/input/Input.js";import"../../shared/ui/formElements/uncontrolled/inputOtp/InputOtpBase.js";import"../../shared/ui/formElements/uncontrolled/maskInput/MaskInput.js";import"../../shared/ui/formElements/uncontrolled/radio/RadioGroup.js";import"../../shared/ui/formElements/uncontrolled/radio/ui/RadioItem.js";import"../../shared/ui/formElements/uncontrolled/slider/SliderBase.js";import"../../shared/ui/formElements/uncontrolled/switch/Switch.js";import"../../shared/ui/formElements/uncontrolled/textarea/Textarea.js";import"../../shared/ui/formElements/uncontrolled/uploader/UploaderBase.js";import"../../shared/ui/formElements/uncontrolled/inputCurrency/InputCurrency.js";import"../../../src/configs/api.js";import"../../shared/ui/formElements/controlled/editor/ui/Editor.js";import"../../shared/ui/formElements/controlled/input/MaskInputControl.js";import"../../shared/ui/dropdownList/ui/dropdownItem/DropdownItem.js";import"../../shared/validation/zodValidation/dadataFio.js";import"../../shared/validation/zodValidation/calendar.js";import"../../shared/validation/zodValidation/phone.js";import"../../shared/validation/zodValidation/otpCode.js";import{ZodUtils as V}from"../../shared/validation/utils/zodUtils.js";import{FieldMapper as q}from"../fieldMapper/FieldMapper.js";import{QueryClientProvider as J}from"../queryClientProvider/QueryClientProvider.js";const K=(o,p,i,e)=>o.type==="off"?null:o.type==="text"?r(g,{html:o.message,as:"div",className:e==null?void 0:e.content}):n("label",{className:m("mob-body-regular-s text-color-dark","desktop:desk-body-regular-s desktop:gap-x-4","flex items-center justify-items-start gap-x-3"),children:[r(U,{classes:e==null?void 0:e.checkbox,checked:p,onCheckedChange:i}),r(g,{html:o.content,as:"div",className:e==null?void 0:e.content})]}),O=o=>{switch(o.mode){case"esia":return r(h,{...o,mode:o.mode});case"mobileId":return r(h,{...o,mode:o.mode});case"combine":return r(h,{...o,mode:o.mode});case"off":return null}},qt=({fields:o,title:p,progress:i,approvement:e,chips:f,submitProps:N,auth:P,classes:t,buttonGroup:d})=>{var c,b;const{submitCallback:u}=N||{},[a,C]=I(!1),x=M(o),v=V.getZodDefaults(x),{control:k,handleSubmit:B}=R({schema:x,defaultValues:v,mode:"onBlur"}),j=H(i,o),F=Z({control:k,fields:j||[],schema:x}),S=l=>{u&&u({...l,agree:a})};return r(J,{children:r("section",{id:y.form,"data-test-id":y.form,className:m("w-full",t==null?void 0:t.root),children:n(E,{className:m("border-warm-grey-200 px-4 desktop:w-[636px] desktop:gap-8 desktop:p-14","relative mx-auto flex flex-col gap-6 rounded-sm py-8 desktop:border"),children:[f.enabled&&n("div",{className:m("desk-body-regular-l flex items-center gap-x-2 rounded-sm desktop:absolute","bg-color-blue-grey-100 px-2 py-1 text-color-tetriary","right-4 top-4 w-max",(c=t==null?void 0:t.chips)==null?void 0:c.root),children:[f.image&&r(T,{name:f.image,className:m("size-6",(b=t==null?void 0:t.chips)==null?void 0:b.icon)}),f.content]}),r(w,{as:"h2",className:m("desktop:hidden",t==null?void 0:t.title),children:p}),r(w,{as:"h3",className:m("mobile:hidden",t==null?void 0:t.title),children:p}),n("form",{onSubmit:B(S),className:m("flex w-full flex-col gap-y-6","desktop:gap-y-8",t==null?void 0:t.form),children:[i.enabled&&r(Q,{progress:F,topContent:r(g,{html:i.title}),bottomContent:r(g,{html:i.subtitle}),maxPercent:i.maxPercent,classes:t==null?void 0:t.progressBar}),r(q,{control:k,fields:o}),n("div",{className:m("mob-body-regular-s flex flex-col items-start justify-center gap-4",{"desktop:flex-row desktop:items-center":d.length===1}),children:[K(e,a,C,t==null?void 0:t.approvement),r("div",{className:m("flex w-full flex-col items-center justify-center gap-4 desktop:flex-row",{"desktop:w-fit":d.length===1}),children:d==null?void 0:d.map((l,A)=>{const D=l.type==="submit"&&e.type==="checkbox"?!a:!1;return z(L,{...l,size:"lg",key:A,disabled:D,className:m("w-full whitespace-nowrap",{"desktop:!w-fit":d.length===1},{"w-full":!!e},t==null?void 0:t.submit)})})})]}),O(P)]})]})})})};export{qt as DynamicForm,qt as default};
1
+ import{jsx as t,jsxs as n}from"react/jsx-runtime";import{useState as I,createElement as z}from"react";import{AuthProvider as b}from"../authProvider/AuthProvider.js";import{HTMLRenderer as g}from"../htmlParser/HTMLRenderer.js";import{widgetIds as h}from"../model/helpers.js";import{getFieldsProgress as H}from"./model/getFieldsProgress.js";import{getDynamicSchema as M}from"../../../src/shared/utils/getDynamicSchema.js";import{cn as m}from"../../shared/utils/cn.js";import{useControlledForm as R}from"../../shared/hooks/useControlledForm.js";import{useFieldsProgress as Z}from"../../shared/hooks/useFieldsProgress.js";import{ResponsiveContainer as E}from"../../shared/ui/responsiveContainer/ResponsiveContainer.js";import{Button as L}from"../../shared/ui/button/Button.js";import"../../shared/ui/buttonIcon/ButtonIcon.js";import"../../shared/ui/calendar/Calendar.js";import"../../shared/ui/calendar/model/utils.js";import"../../shared/ui/accordion/Accordion.js";import{ProgressBar as Q}from"../../shared/ui/progressBar/ProgressBar.js";import"react-dom";import"../../shared/ui/modal/ui/IframeModalContent.js";import"../../../node_modules/react-hot-toast/dist/index.js";import{Icon as T}from"../../shared/ui/icon/Icon.js";import"../../shared/ui/table/ui/primitives/Primitives.js";import{Heading as N}from"../../shared/ui/heading/Heading.js";import"../../shared/ui/carousel/ui/CarouselContent.js";import"../../shared/ui/slot/Slot.js";import"../../shared/ui/formElements/uncontrolled/autocomplete/Autocomplete.js";import{CheckboxBase as U}from"../../shared/ui/formElements/uncontrolled/checkbox/Checkbox.js";import"../../shared/ui/formElements/uncontrolled/combobox/combobox.js";import"../../shared/ui/formElements/uncontrolled/dayPicker/DayPicker.js";import"../../shared/ui/formElements/uncontrolled/input/Input.js";import"../../shared/ui/formElements/uncontrolled/inputOtp/InputOtpBase.js";import"../../shared/ui/formElements/uncontrolled/maskInput/MaskInput.js";import"../../shared/ui/formElements/uncontrolled/radio/RadioGroup.js";import"../../shared/ui/formElements/uncontrolled/radio/ui/RadioItem.js";import"../../shared/ui/formElements/uncontrolled/slider/SliderBase.js";import"../../shared/ui/formElements/uncontrolled/switch/Switch.js";import"../../shared/ui/formElements/uncontrolled/textarea/Textarea.js";import"../../shared/ui/formElements/uncontrolled/uploader/UploaderBase.js";import"../../shared/ui/formElements/uncontrolled/inputCurrency/InputCurrency.js";import"../../../src/configs/api.js";import"../../shared/ui/formElements/controlled/editor/ui/Editor.js";import"../../shared/ui/formElements/controlled/input/MaskInputControl.js";import"../../shared/ui/dropdownList/ui/dropdownItem/DropdownItem.js";import"../../shared/validation/zodValidation/dadataFio.js";import"../../shared/validation/zodValidation/calendar.js";import"../../shared/validation/zodValidation/phone.js";import"../../shared/validation/zodValidation/otpCode.js";import{ZodUtils as V}from"../../shared/validation/utils/zodUtils.js";import{FieldMapper as q}from"../fieldMapper/FieldMapper.js";import{QueryClientProvider as J}from"../queryClientProvider/QueryClientProvider.js";const K=(r,p,i,e)=>r.type==="off"?null:r.type==="text"?t(g,{html:r.message,as:"div",className:e==null?void 0:e.content}):n("label",{className:m("mob-body-regular-s text-color-dark","desktop:desk-body-regular-s desktop:gap-x-4","flex items-center justify-items-start gap-x-3"),children:[t(U,{classes:e==null?void 0:e.checkbox,checked:p,onCheckedChange:i}),t(g,{html:r.content,as:"div",className:e==null?void 0:e.content})]}),O=r=>{switch(r==null?void 0:r.mode){case"esia":return t(b,{...r,mode:r==null?void 0:r.mode});case"mobileId":return t(b,{...r,mode:r==null?void 0:r.mode});case"combine":return t(b,{...r,mode:r==null?void 0:r.mode});default:return null}},Jo=({fields:r,title:p,progress:i,approvement:e,chips:f,submitProps:u,auth:P,classes:o,buttonGroup:d})=>{var w,a;const{submitCallback:c}=u||{},[x,C]=I(!1),k=M(r),v=V.getZodDefaults(k),{control:y,handleSubmit:B}=R({schema:k,defaultValues:v,mode:"onBlur"}),j=H(i,r),F=Z({control:y,fields:j||[],schema:k}),S=l=>{c&&c({...l,agree:x})};return t(J,{children:t("section",{id:h.form,"data-test-id":h.form,className:m("w-full",o==null?void 0:o.root),children:n(E,{className:m("border-warm-grey-200 px-4 desktop:w-[636px] desktop:gap-8 desktop:p-14","relative mx-auto flex flex-col gap-6 rounded-sm py-8 desktop:border"),children:[f.enabled&&n("div",{className:m("desk-body-regular-l flex items-center gap-x-2 rounded-sm desktop:absolute","bg-color-blue-grey-100 px-2 py-1 text-color-tetriary","right-4 top-4 w-max",(w=o==null?void 0:o.chips)==null?void 0:w.root),children:[f.image&&t(T,{name:f.image,className:m("size-6",(a=o==null?void 0:o.chips)==null?void 0:a.icon)}),f.content]}),t(N,{as:"h2",className:m("desktop:hidden",o==null?void 0:o.title),children:p}),t(N,{as:"h3",className:m("mobile:hidden",o==null?void 0:o.title),children:p}),n("form",{onSubmit:B(S),className:m("flex w-full flex-col gap-y-6","desktop:gap-y-8",o==null?void 0:o.form),children:[i.enabled&&t(Q,{progress:F,topContent:t(g,{html:i.title}),bottomContent:t(g,{html:i.subtitle}),maxPercent:i.maxPercent,classes:o==null?void 0:o.progressBar}),t(q,{control:y,fields:r}),n("div",{className:m("mob-body-regular-s flex flex-col items-start justify-center gap-4",{"desktop:flex-row desktop:items-center":d.length===1}),children:[K(e,x,C,o==null?void 0:o.approvement),t("div",{className:m("flex w-full flex-col items-center justify-center gap-4 desktop:flex-row",{"desktop:w-fit":d.length===1}),children:d==null?void 0:d.map((l,A)=>{const D=l.type==="submit"&&e.type==="checkbox"?!x:!1;return z(L,{...l,size:"lg",key:A,disabled:D,className:m("w-full whitespace-nowrap",{"desktop:!w-fit":d.length===1},{"w-full":!!e},o==null?void 0:o.submit)})})})]}),O(P)]})]})})})};export{Jo as DynamicForm,Jo as default};
2
2
  //# sourceMappingURL=DynamicForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicForm.js","sources":["../../../../lib/widgets/dynamicForm/DynamicForm.tsx"],"sourcesContent":["'use client'\n\nimport { useState } from 'react'\nimport { type Control, type FieldValues, type SubmitHandler } from 'react-hook-form'\nimport { type TypeOf } from 'zod'\nimport { AuthProvider } from '../authProvider'\nimport { HTMLRenderer } from '../htmlParser'\nimport { widgetIds } from '../model'\nimport {\n type Approvement,\n type ApprovementType,\n type Auth,\n type AuthMode,\n type Chips,\n type ChipsType,\n getFieldsProgress,\n type Progress,\n type ProgressField,\n type ProgressType\n} from './model'\nimport { type FieldValidation, getDynamicSchema } from '@/shared/utils'\nimport { useControlledForm, useFieldsProgress } from '$/shared/hooks'\nimport {\n Button,\n type ButtonProps,\n CheckboxBase,\n type CheckedState,\n Heading,\n Icon,\n ProgressBar,\n ResponsiveContainer\n} from '$/shared/ui'\nimport { cn } from '$/shared/utils'\nimport { ZodUtils } from '$/shared/validation'\nimport { type FieldElement, FieldMapper } from '$/widgets/fieldMapper'\nimport { QueryClientProvider } from '$/widgets/queryClientProvider'\n\ntype SubmitProps = {\n submitCallback: <T extends FieldValues>(values: T) => void\n}\n\ntype ChipsClasses = {\n root?: string\n icon?: string\n}\ntype ApprovementClasses = {\n checkbox?: React.ComponentProps<typeof CheckboxBase>['classes']\n content?: string\n}\n\ntype DynamicFormClasses = {\n root?: string\n title?: string\n fields?: string\n form?: string\n chips?: ChipsClasses\n approvement?: ApprovementClasses\n progressBar?: React.ComponentProps<typeof ProgressBar>['classes']\n submit?: string\n}\n\nexport type DynamicFormProps<\n AType extends ApprovementType,\n CType extends ChipsType,\n PType extends ProgressType,\n AuthType extends AuthMode\n> = {\n fields: FieldElement<any, any, { validation: FieldValidation; progress: ProgressField }>[]\n title: string\n progress: Progress<PType>\n approvement: Approvement<AType>\n chips: Chips<CType>\n submitProps?: SubmitProps\n classes?: DynamicFormClasses\n buttonGroup: ButtonProps[]\n auth: Auth<AuthType>\n}\n\nconst withApprovement = <Type extends ApprovementType>(\n approvement: Approvement<Type>,\n checked: CheckedState,\n onCheckedChange: (checked: CheckedState) => void,\n classes?: ApprovementClasses\n): React.ReactNode => {\n if (approvement.type === 'off') return null\n\n if (approvement.type === 'text') {\n return <HTMLRenderer html={approvement.message} as='div' className={classes?.content} />\n }\n\n return (\n <label\n className={cn(\n 'mob-body-regular-s text-color-dark',\n 'desktop:desk-body-regular-s desktop:gap-x-4',\n 'flex items-center justify-items-start gap-x-3'\n )}\n >\n <CheckboxBase classes={classes?.checkbox} checked={checked} onCheckedChange={onCheckedChange} />\n <HTMLRenderer html={approvement.content} as='div' className={classes?.content} />\n </label>\n )\n}\n\nconst withAuthProvider = <Mode extends AuthMode>(auth: Auth<Mode>) => {\n switch (auth.mode) {\n case 'esia':\n return <AuthProvider {...auth} mode={auth.mode} />\n case 'mobileId':\n return <AuthProvider {...auth} mode={auth.mode} />\n case 'combine':\n return <AuthProvider {...auth} mode={auth.mode} />\n case 'off':\n return null\n }\n}\n\nexport const DynamicForm = <\n AType extends ApprovementType,\n CType extends ChipsType,\n PType extends ProgressType,\n AuthType extends AuthMode\n>({\n fields,\n title,\n progress,\n approvement,\n chips,\n submitProps,\n auth,\n classes,\n buttonGroup\n}: DynamicFormProps<AType, CType, PType, AuthType>) => {\n const { submitCallback } = submitProps || {}\n\n const [checked, onCheckedChange] = useState<CheckedState>(false)\n\n const schema = getDynamicSchema(fields)\n const defaultValues = ZodUtils.getZodDefaults(schema)\n\n const { control, handleSubmit } = useControlledForm({\n schema,\n defaultValues,\n mode: 'onBlur'\n })\n\n const fieldsProgress = getFieldsProgress(progress, fields)\n\n const formattedProgress = useFieldsProgress({ control, fields: fieldsProgress || [], schema })\n\n const onSubmit: SubmitHandler<TypeOf<typeof schema>> = (values) => {\n if (submitCallback) submitCallback({ ...values, agree: checked })\n }\n\n return (\n <QueryClientProvider>\n <section id={widgetIds.form} data-test-id={widgetIds.form} className={cn('w-full', classes?.root)}>\n <ResponsiveContainer\n className={cn(\n 'border-warm-grey-200 px-4 desktop:w-[636px] desktop:gap-8 desktop:p-14',\n 'relative mx-auto flex flex-col gap-6 rounded-sm py-8 desktop:border'\n )}\n >\n {chips.enabled && (\n <div\n className={cn(\n 'desk-body-regular-l flex items-center gap-x-2 rounded-sm desktop:absolute',\n 'bg-color-blue-grey-100 px-2 py-1 text-color-tetriary',\n 'right-4 top-4 w-max',\n classes?.chips?.root\n )}\n >\n {chips.image && <Icon name={chips.image} className={cn('size-6', classes?.chips?.icon)} />}\n {chips.content}\n </div>\n )}\n <Heading as='h2' className={cn('desktop:hidden', classes?.title)}>\n {title}\n </Heading>\n <Heading as='h3' className={cn('mobile:hidden', classes?.title)}>\n {title}\n </Heading>\n <form\n onSubmit={handleSubmit(onSubmit)}\n className={cn('flex w-full flex-col gap-y-6', 'desktop:gap-y-8', classes?.form)}\n >\n {progress.enabled && (\n <ProgressBar\n progress={formattedProgress}\n topContent={<HTMLRenderer html={progress.title} />}\n bottomContent={<HTMLRenderer html={progress.subtitle} />}\n maxPercent={progress.maxPercent}\n classes={classes?.progressBar}\n />\n )}\n <FieldMapper control={control as unknown as Control} fields={fields} />\n <div\n className={cn('mob-body-regular-s flex flex-col items-start justify-center gap-4', {\n ['desktop:flex-row desktop:items-center']: buttonGroup.length === 1\n })}\n >\n {withApprovement(approvement, checked, onCheckedChange, classes?.approvement)}\n <div\n className={cn('flex w-full flex-col items-center justify-center gap-4 desktop:flex-row', {\n 'desktop:w-fit': buttonGroup.length === 1\n })}\n >\n {buttonGroup?.map((button, index) => {\n const disabled = button.type === 'submit' && approvement.type === 'checkbox' ? !checked : false\n\n return (\n <Button\n {...button}\n size='lg'\n key={index}\n disabled={disabled}\n className={cn(\n 'w-full whitespace-nowrap',\n {\n ['desktop:!w-fit']: buttonGroup.length === 1\n },\n {\n 'w-full': Boolean(approvement)\n },\n classes?.submit\n )}\n />\n )\n })}\n </div>\n </div>\n {withAuthProvider(auth)}\n </form>\n </ResponsiveContainer>\n </section>\n </QueryClientProvider>\n )\n}\n\nexport default DynamicForm\n"],"names":["withApprovement","approvement","checked","onCheckedChange","classes","jsx","HTMLRenderer","jsxs","cn","CheckboxBase","withAuthProvider","auth","AuthProvider","DynamicForm","fields","title","progress","chips","submitProps","buttonGroup","submitCallback","useState","schema","getDynamicSchema","defaultValues","ZodUtils","control","handleSubmit","useControlledForm","fieldsProgress","getFieldsProgress","formattedProgress","useFieldsProgress","onSubmit","values","QueryClientProvider","widgetIds","ResponsiveContainer","_a","Icon","_b","Heading","ProgressBar","FieldMapper","button","index","disabled","createElement","Button"],"mappings":"qlGA8EA,MAAMA,EAAkB,CACtBC,EACAC,EACAC,EACAC,IAEIH,EAAY,OAAS,MAAc,KAEnCA,EAAY,OAAS,OAChBI,EAACC,GAAa,KAAML,EAAY,QAAS,GAAG,MAAM,UAAWG,GAAA,YAAAA,EAAS,OAAA,CAAS,EAItFG,EAAC,QAAA,CACC,UAAWC,EACT,qCACA,8CACA,+CAAA,EAGF,SAAA,CAAAH,EAACI,EAAA,CAAa,QAASL,GAAA,YAAAA,EAAS,SAAU,QAAAF,EAAkB,gBAAAC,EAAkC,EAC9FE,EAACC,GAAa,KAAML,EAAY,QAAS,GAAG,MAAM,UAAWG,GAAA,YAAAA,EAAS,OAAA,CAAS,CAAA,CAAA,CAAA,EAK/EM,EAA2CC,GAAqB,CACpE,OAAQA,EAAK,KAAA,CACX,IAAK,OACH,SAAQC,EAAA,CAAc,GAAGD,EAAM,KAAMA,EAAK,KAAM,EAClD,IAAK,WACH,SAAQC,EAAA,CAAc,GAAGD,EAAM,KAAMA,EAAK,KAAM,EAClD,IAAK,UACH,SAAQC,EAAA,CAAc,GAAGD,EAAM,KAAMA,EAAK,KAAM,EAClD,IAAK,MACH,OAAO,IAAA,CAEb,EAEaE,GAAc,CAKzB,CACA,OAAAC,EACA,MAAAC,EACA,SAAAC,EACA,YAAAf,EACA,MAAAgB,EACA,YAAAC,EACA,KAAAP,EACA,QAAAP,EACA,YAAAe,CACF,IAAuD,SACrD,KAAM,CAAE,eAAAC,GAAmBF,GAAe,CAAA,EAEpC,CAAChB,EAASC,CAAe,EAAIkB,EAAuB,EAAK,EAEzDC,EAASC,EAAiBT,CAAM,EAChCU,EAAgBC,EAAS,eAAeH,CAAM,EAE9C,CAAE,QAAAI,EAAS,aAAAC,CAAA,EAAiBC,EAAkB,CAClD,OAAAN,EACA,cAAAE,EACA,KAAM,QAAA,CACP,EAEKK,EAAiBC,EAAkBd,EAAUF,CAAM,EAEnDiB,EAAoBC,EAAkB,CAAE,QAAAN,EAAS,OAAQG,GAAkB,CAAA,EAAI,OAAAP,EAAQ,EAEvFW,EAAkDC,GAAW,CAC7Dd,GAAgBA,EAAe,CAAE,GAAGc,EAAQ,MAAOhC,EAAS,CAClE,EAEA,OACEG,EAAC8B,EAAA,CACC,SAAA9B,EAAC,UAAA,CAAQ,GAAI+B,EAAU,KAAM,eAAcA,EAAU,KAAM,UAAW5B,EAAG,SAAUJ,GAAA,YAAAA,EAAS,IAAI,EAC9F,SAAAG,EAAC8B,EAAA,CACC,UAAW7B,EACT,yEACA,qEAAA,EAGD,SAAA,CAAAS,EAAM,SACLV,EAAC,MAAA,CACC,UAAWC,EACT,4EACA,uDACA,uBACA8B,EAAAlC,GAAA,YAAAA,EAAS,QAAT,YAAAkC,EAAgB,IAAA,EAGjB,SAAA,CAAArB,EAAM,OAASZ,EAACkC,EAAA,CAAK,KAAMtB,EAAM,MAAO,UAAWT,EAAG,UAAUgC,EAAApC,GAAA,YAAAA,EAAS,QAAT,YAAAoC,EAAgB,IAAI,CAAA,CAAG,EACvFvB,EAAM,OAAA,CAAA,CAAA,EAGXZ,EAACoC,EAAA,CAAQ,GAAG,KAAK,UAAWjC,EAAG,iBAAkBJ,GAAA,YAAAA,EAAS,KAAK,EAC5D,SAAAW,CAAA,CACH,EACAV,EAACoC,EAAA,CAAQ,GAAG,KAAK,UAAWjC,EAAG,gBAAiBJ,GAAA,YAAAA,EAAS,KAAK,EAC3D,SAAAW,CAAA,CACH,EACAR,EAAC,OAAA,CACC,SAAUoB,EAAaM,CAAQ,EAC/B,UAAWzB,EAAG,+BAAgC,kBAAmBJ,GAAA,YAAAA,EAAS,IAAI,EAE7E,SAAA,CAAAY,EAAS,SACRX,EAACqC,EAAA,CACC,SAAUX,EACV,WAAY1B,EAACC,EAAA,CAAa,KAAMU,EAAS,MAAO,EAChD,cAAeX,EAACC,EAAA,CAAa,KAAMU,EAAS,SAAU,EACtD,WAAYA,EAAS,WACrB,QAASZ,GAAA,YAAAA,EAAS,WAAA,CAAA,EAGtBC,EAACsC,EAAA,CAAY,QAAAjB,EAAwC,OAAAZ,CAAA,CAAgB,EACrEP,EAAC,MAAA,CACC,UAAWC,EAAG,oEAAqE,CAChF,wCAA0CW,EAAY,SAAW,CAAA,CACnE,EAEA,SAAA,CAAAnB,EAAgBC,EAAaC,EAASC,EAAiBC,GAAA,YAAAA,EAAS,WAAW,EAC5EC,EAAC,MAAA,CACC,UAAWG,EAAG,0EAA2E,CACvF,gBAAiBW,EAAY,SAAW,CAAA,CACzC,EAEA,SAAAA,GAAA,YAAAA,EAAa,IAAI,CAACyB,EAAQC,IAAU,CACnC,MAAMC,EAAWF,EAAO,OAAS,UAAY3C,EAAY,OAAS,WAAa,CAACC,EAAU,GAE1F,OACE6C,EAACC,EAAA,CACE,GAAGJ,EACJ,KAAK,KACL,IAAKC,EACL,SAAAC,EACA,UAAWtC,EACT,2BACA,CACG,iBAAmBW,EAAY,SAAW,CAAA,EAE7C,CACE,SAAU,EAAQlB,CAAW,EAE/BG,GAAA,YAAAA,EAAS,MAAA,CACX,CAAA,CAGN,EAAC,CAAA,CACH,CAAA,CAAA,EAEDM,EAAiBC,CAAI,CAAA,CAAA,CAAA,CACxB,CAAA,CAAA,EAEJ,CAAA,CACF,CAEJ"}
1
+ {"version":3,"file":"DynamicForm.js","sources":["../../../../lib/widgets/dynamicForm/DynamicForm.tsx"],"sourcesContent":["'use client'\n\nimport { useState } from 'react'\nimport { type Control, type FieldValues, type SubmitHandler } from 'react-hook-form'\nimport { type TypeOf } from 'zod'\nimport { AuthProvider } from '../authProvider'\nimport { HTMLRenderer } from '../htmlParser'\nimport { widgetIds } from '../model'\nimport {\n type Approvement,\n type ApprovementType,\n type Auth,\n type AuthMode,\n type Chips,\n type ChipsType,\n getFieldsProgress,\n type Progress,\n type ProgressField,\n type ProgressType\n} from './model'\nimport { type FieldValidation, getDynamicSchema } from '@/shared/utils'\nimport { useControlledForm, useFieldsProgress } from '$/shared/hooks'\nimport {\n Button,\n type ButtonProps,\n CheckboxBase,\n type CheckedState,\n Heading,\n Icon,\n ProgressBar,\n ResponsiveContainer\n} from '$/shared/ui'\nimport { cn } from '$/shared/utils'\nimport { ZodUtils } from '$/shared/validation'\nimport { type FieldElement, FieldMapper } from '$/widgets/fieldMapper'\nimport { QueryClientProvider } from '$/widgets/queryClientProvider'\n\ntype SubmitProps = {\n submitCallback: <T extends FieldValues>(values: T) => void\n}\n\ntype ChipsClasses = {\n root?: string\n icon?: string\n}\ntype ApprovementClasses = {\n checkbox?: React.ComponentProps<typeof CheckboxBase>['classes']\n content?: string\n}\n\ntype DynamicFormClasses = {\n root?: string\n title?: string\n fields?: string\n form?: string\n chips?: ChipsClasses\n approvement?: ApprovementClasses\n progressBar?: React.ComponentProps<typeof ProgressBar>['classes']\n submit?: string\n}\n\nexport type DynamicFormProps<\n AType extends ApprovementType,\n CType extends ChipsType,\n PType extends ProgressType,\n AuthType extends AuthMode\n> = {\n fields: FieldElement<any, any, { validation: FieldValidation; progress: ProgressField }>[]\n title: string\n progress: Progress<PType>\n approvement: Approvement<AType>\n chips: Chips<CType>\n submitProps?: SubmitProps\n classes?: DynamicFormClasses\n buttonGroup: ButtonProps[]\n auth: Auth<AuthType>\n}\n\nconst withApprovement = <Type extends ApprovementType>(\n approvement: Approvement<Type>,\n checked: CheckedState,\n onCheckedChange: (checked: CheckedState) => void,\n classes?: ApprovementClasses\n): React.ReactNode => {\n if (approvement.type === 'off') return null\n\n if (approvement.type === 'text') {\n return <HTMLRenderer html={approvement.message} as='div' className={classes?.content} />\n }\n\n return (\n <label\n className={cn(\n 'mob-body-regular-s text-color-dark',\n 'desktop:desk-body-regular-s desktop:gap-x-4',\n 'flex items-center justify-items-start gap-x-3'\n )}\n >\n <CheckboxBase classes={classes?.checkbox} checked={checked} onCheckedChange={onCheckedChange} />\n <HTMLRenderer html={approvement.content} as='div' className={classes?.content} />\n </label>\n )\n}\n\nconst withAuthProvider = <Mode extends AuthMode>(auth: Auth<Mode>) => {\n switch (auth?.mode) {\n case 'esia':\n return <AuthProvider {...auth} mode={auth?.mode} />\n case 'mobileId':\n return <AuthProvider {...auth} mode={auth?.mode} />\n case 'combine':\n return <AuthProvider {...auth} mode={auth?.mode} />\n\n default:\n return null\n }\n}\n\nexport const DynamicForm = <\n AType extends ApprovementType,\n CType extends ChipsType,\n PType extends ProgressType,\n AuthType extends AuthMode\n>({\n fields,\n title,\n progress,\n approvement,\n chips,\n submitProps,\n auth,\n classes,\n buttonGroup\n}: DynamicFormProps<AType, CType, PType, AuthType>) => {\n const { submitCallback } = submitProps || {}\n\n const [checked, onCheckedChange] = useState<CheckedState>(false)\n\n const schema = getDynamicSchema(fields)\n const defaultValues = ZodUtils.getZodDefaults(schema)\n\n const { control, handleSubmit } = useControlledForm({\n schema,\n defaultValues,\n mode: 'onBlur'\n })\n\n const fieldsProgress = getFieldsProgress(progress, fields)\n\n const formattedProgress = useFieldsProgress({ control, fields: fieldsProgress || [], schema })\n\n const onSubmit: SubmitHandler<TypeOf<typeof schema>> = (values) => {\n if (submitCallback) submitCallback({ ...values, agree: checked })\n }\n\n return (\n <QueryClientProvider>\n <section id={widgetIds.form} data-test-id={widgetIds.form} className={cn('w-full', classes?.root)}>\n <ResponsiveContainer\n className={cn(\n 'border-warm-grey-200 px-4 desktop:w-[636px] desktop:gap-8 desktop:p-14',\n 'relative mx-auto flex flex-col gap-6 rounded-sm py-8 desktop:border'\n )}\n >\n {chips.enabled && (\n <div\n className={cn(\n 'desk-body-regular-l flex items-center gap-x-2 rounded-sm desktop:absolute',\n 'bg-color-blue-grey-100 px-2 py-1 text-color-tetriary',\n 'right-4 top-4 w-max',\n classes?.chips?.root\n )}\n >\n {chips.image && <Icon name={chips.image} className={cn('size-6', classes?.chips?.icon)} />}\n {chips.content}\n </div>\n )}\n <Heading as='h2' className={cn('desktop:hidden', classes?.title)}>\n {title}\n </Heading>\n <Heading as='h3' className={cn('mobile:hidden', classes?.title)}>\n {title}\n </Heading>\n <form\n onSubmit={handleSubmit(onSubmit)}\n className={cn('flex w-full flex-col gap-y-6', 'desktop:gap-y-8', classes?.form)}\n >\n {progress.enabled && (\n <ProgressBar\n progress={formattedProgress}\n topContent={<HTMLRenderer html={progress.title} />}\n bottomContent={<HTMLRenderer html={progress.subtitle} />}\n maxPercent={progress.maxPercent}\n classes={classes?.progressBar}\n />\n )}\n <FieldMapper control={control as unknown as Control} fields={fields} />\n <div\n className={cn('mob-body-regular-s flex flex-col items-start justify-center gap-4', {\n ['desktop:flex-row desktop:items-center']: buttonGroup.length === 1\n })}\n >\n {withApprovement(approvement, checked, onCheckedChange, classes?.approvement)}\n <div\n className={cn('flex w-full flex-col items-center justify-center gap-4 desktop:flex-row', {\n 'desktop:w-fit': buttonGroup.length === 1\n })}\n >\n {buttonGroup?.map((button, index) => {\n const disabled = button.type === 'submit' && approvement.type === 'checkbox' ? !checked : false\n\n return (\n <Button\n {...button}\n size='lg'\n key={index}\n disabled={disabled}\n className={cn(\n 'w-full whitespace-nowrap',\n {\n ['desktop:!w-fit']: buttonGroup.length === 1\n },\n {\n 'w-full': Boolean(approvement)\n },\n classes?.submit\n )}\n />\n )\n })}\n </div>\n </div>\n {withAuthProvider(auth)}\n </form>\n </ResponsiveContainer>\n </section>\n </QueryClientProvider>\n )\n}\n\nexport default DynamicForm\n"],"names":["withApprovement","approvement","checked","onCheckedChange","classes","jsx","HTMLRenderer","jsxs","cn","CheckboxBase","withAuthProvider","auth","AuthProvider","DynamicForm","fields","title","progress","chips","submitProps","buttonGroup","submitCallback","useState","schema","getDynamicSchema","defaultValues","ZodUtils","control","handleSubmit","useControlledForm","fieldsProgress","getFieldsProgress","formattedProgress","useFieldsProgress","onSubmit","values","QueryClientProvider","widgetIds","ResponsiveContainer","_a","Icon","_b","Heading","ProgressBar","FieldMapper","button","index","disabled","createElement","Button"],"mappings":"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"}