@topvisor/ui 1.0.22-selectorRegion-pr → 1.1.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.
- package/.chunks/{core-DOD2Zduv.amd.js → core-CcWs0qYw.amd.js} +2 -2
- package/.chunks/core-CcWs0qYw.amd.js.map +1 -0
- package/.chunks/{core-Cb1K4rks.es.js → core-Dsl28h7N.es.js} +4 -4
- package/.chunks/core-Dsl28h7N.es.js.map +1 -0
- package/.chunks/{datepicker-DNOnzVIz.amd.js → datepicker-B6kIyIcw.amd.js} +2 -2
- package/.chunks/datepicker-B6kIyIcw.amd.js.map +1 -0
- package/.chunks/{datepicker-BbLOzQtp.es.js → datepicker-BTiE5Grw.es.js} +2 -2
- package/.chunks/datepicker-BTiE5Grw.es.js.map +1 -0
- package/.chunks/{dialog_selectorRegions-BYAZLdbp.es.js → dialog_selectorRegions-BZcnnvJM.es.js} +3 -3
- package/.chunks/dialog_selectorRegions-BZcnnvJM.es.js.map +1 -0
- package/.chunks/{dialog_selectorRegions-D1YE2mYS.amd.js → dialog_selectorRegions-CePGUsCo.amd.js} +2 -2
- package/.chunks/dialog_selectorRegions-CePGUsCo.amd.js.map +1 -0
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-DtLpQTwi.es.js → dialogs.vue_vue_type_script_setup_true_lang-B5hK613K.es.js} +2 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-B5hK613K.es.js.map +1 -0
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-xoE5yB6b.amd.js → dialogs.vue_vue_type_script_setup_true_lang-izSFcRLb.amd.js} +2 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-izSFcRLb.amd.js.map +1 -0
- package/.chunks/{forms-LTK63Ugt.es.js → forms-BsuCen2-.es.js} +7 -7
- package/.chunks/forms-BsuCen2-.es.js.map +1 -0
- package/.chunks/{forms-Dv9L8-AZ.amd.js → forms-BwGakScF.amd.js} +3 -3
- package/.chunks/forms-BwGakScF.amd.js.map +1 -0
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-COGiIcDO.amd.js → listItem.vue_vue_type_script_setup_true_lang-CfM8kOV1.amd.js} +2 -2
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CfM8kOV1.amd.js.map +1 -0
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-UC3o5oK5.es.js → listItem.vue_vue_type_script_setup_true_lang-CszHDnB0.es.js} +2 -2
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CszHDnB0.es.js.map +1 -0
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-BFmZ4tvs.amd.js → menu.vue_vue_type_style_index_0_lang-DQTVNJGq.amd.js} +2 -2
- package/.chunks/menu.vue_vue_type_style_index_0_lang-DQTVNJGq.amd.js.map +1 -0
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-hQu5BJPe.es.js → menu.vue_vue_type_style_index_0_lang-DmY5w4yr.es.js} +2 -2
- package/.chunks/menu.vue_vue_type_style_index_0_lang-DmY5w4yr.es.js.map +1 -0
- package/.chunks/{notice-BoZG4Mg1.amd.js → notice-CJdCc72d.amd.js} +2 -2
- package/.chunks/notice-CJdCc72d.amd.js.map +1 -0
- package/.chunks/{notice-CYutIom0.es.js → notice-Cqs1dKt8.es.js} +2 -2
- package/.chunks/notice-Cqs1dKt8.es.js.map +1 -0
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-CffDh-th.amd.js → page.vue_vue_type_script_setup_true_lang-1JWduCTr.amd.js} +2 -2
- package/.chunks/page.vue_vue_type_script_setup_true_lang-1JWduCTr.amd.js.map +1 -0
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-B2wjrf5z.es.js → page.vue_vue_type_script_setup_true_lang-BCfksgg3.es.js} +4 -4
- package/.chunks/page.vue_vue_type_script_setup_true_lang-BCfksgg3.es.js.map +1 -0
- package/.chunks/{popup-Cg9w4Vy-.amd.js → popup-CLhWWJDe.amd.js} +2 -2
- package/.chunks/popup-CLhWWJDe.amd.js.map +1 -0
- package/.chunks/{popup-ec_xLrTA.es.js → popup-N10MDafw.es.js} +2 -2
- package/.chunks/popup-N10MDafw.es.js.map +1 -0
- package/.chunks/store-CX_6ZXhO.es.js.map +1 -1
- package/.chunks/store-esTid5oI.amd.js.map +1 -1
- package/.chunks/{utils-COoE8KP7.es.js → utils-B1H3EGkg.es.js} +2 -2
- package/.chunks/utils-B1H3EGkg.es.js.map +1 -0
- package/.chunks/{utils-GpKurv7L.amd.js → utils-B7GVqGBH.amd.js} +2 -2
- package/.chunks/utils-B7GVqGBH.amd.js.map +1 -0
- package/.chunks/{utils-z5wL437D.amd.js → utils-DIy2mbYd.amd.js} +2 -2
- package/.chunks/utils-DIy2mbYd.amd.js.map +1 -0
- package/.chunks/{utils-BRLYX_ZC.es.js → utils-bjr7c5my.es.js} +3 -3
- package/.chunks/utils-bjr7c5my.es.js.map +1 -0
- package/CHANGELOG.md +14 -0
- package/README.md +82 -82
- package/assets/forms.css +1 -1
- package/assets/formsExt.css +1 -1
- package/charts/charts.amd.js +1 -1
- package/charts/charts.amd.js.map +1 -1
- package/charts/charts.js +1 -1
- package/charts/charts.js.map +1 -1
- package/components/formsExt/navigationMenu/navigationMenu.d.ts +24 -0
- package/components/formsExt/navigationMenu/stories/items.d.ts +3 -0
- package/core/app.amd.js +1 -1
- package/core/app.amd.js.map +1 -1
- package/core/app.js +5 -5
- package/core/app.js.map +1 -1
- package/dialog/dialog.amd.js +1 -1
- package/dialog/dialog.amd.js.map +1 -1
- package/dialog/dialog.js +2 -2
- package/dialog/dialog.js.map +1 -1
- package/forms/forms.amd.js +1 -1
- package/forms/forms.js +1 -1
- package/forms/helpers.amd.js.map +1 -1
- package/forms/helpers.js.map +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +220 -213
- package/formsExt/formsExt.js.map +1 -1
- package/icomoon/Read Me.txt +7 -7
- package/icomoon/Topvisor icons.json +6259 -6259
- package/icomoon/demo-files/demo.css +158 -158
- package/icomoon/demo-files/demo.js +30 -30
- package/icomoon/demo.html +3558 -3558
- package/icomoon/fonts/Topvisor-2.svg +276 -276
- package/icomoon/style.css +780 -780
- package/jquery-ui.min.css +5 -5
- package/layout/layout.amd.js +1 -1
- package/layout/layout.amd.js.map +1 -1
- package/layout/layout.js +1 -1
- package/layout/layout.js.map +1 -1
- package/package.json +33 -33
- package/popup/popup.amd.js +1 -1
- package/popup/popup.amd.js.map +1 -1
- package/popup/popup.js +2 -2
- package/popup/popup.js.map +1 -1
- package/popup/worker.amd.js +1 -1
- package/popup/worker.amd.js.map +1 -1
- package/popup/worker.js +2 -2
- package/popup/worker.js.map +1 -1
- package/project/project.amd.js +1 -1
- package/project/project.amd.js.map +1 -1
- package/project/project.js +75 -76
- package/project/project.js.map +1 -1
- package/require/css.amd.js +12 -12
- package/tabs/tabs.amd.js.map +1 -1
- package/tabs/tabs.js.map +1 -1
- package/tabsView/tabsView.amd.js +1 -1
- package/tabsView/tabsView.amd.js.map +1 -1
- package/tabsView/tabsView.js +1 -1
- package/tabsView/tabsView.js.map +1 -1
- package/utils/check.amd.js.map +1 -1
- package/utils/check.js.map +1 -1
- package/utils/clipboard.amd.js +1 -1
- package/utils/clipboard.amd.js.map +1 -1
- package/utils/clipboard.js +1 -1
- package/utils/clipboard.js.map +1 -1
- package/utils/date.amd.js +1 -1
- package/utils/date.js +1 -1
- package/utils/device.amd.js +1 -1
- package/utils/device.js +1 -1
- package/utils/dom.amd.js.map +1 -1
- package/utils/dom.js.map +1 -1
- package/utils/image.amd.js.map +1 -1
- package/utils/image.js.map +1 -1
- package/utils/keyboard.amd.js.map +1 -1
- package/utils/keyboard.js.map +1 -1
- package/utils/lodash.amd.js +1 -1
- package/utils/lodash.js +1 -1
- package/utils/number.amd.js.map +1 -1
- package/utils/number.js.map +1 -1
- package/utils/price.amd.js +1 -1
- package/utils/price.amd.js.map +1 -1
- package/utils/price.js +1 -1
- package/utils/price.js.map +1 -1
- package/utils/route.amd.js.map +1 -1
- package/utils/route.js.map +1 -1
- package/utils/scroll.amd.js.map +1 -1
- package/utils/scroll.js.map +1 -1
- package/utils/searchers.amd.js +1 -1
- package/utils/searchers.amd.js.map +1 -1
- package/utils/searchers.js +3 -3
- package/utils/searchers.js.map +1 -1
- package/utils/string.amd.js +1 -1
- package/utils/string.amd.js.map +1 -1
- package/utils/string.js +1 -1
- package/utils/string.js.map +1 -1
- package/utils/system.amd.js.map +1 -1
- package/utils/system.js.map +1 -1
- package/utils/url.amd.js.map +1 -1
- package/utils/url.js.map +1 -1
- package/web-types.json +130 -130
- package/.chunks/core-Cb1K4rks.es.js.map +0 -1
- package/.chunks/core-DOD2Zduv.amd.js.map +0 -1
- package/.chunks/datepicker-BbLOzQtp.es.js.map +0 -1
- package/.chunks/datepicker-DNOnzVIz.amd.js.map +0 -1
- package/.chunks/dialog_selectorRegions-BYAZLdbp.es.js.map +0 -1
- package/.chunks/dialog_selectorRegions-D1YE2mYS.amd.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-DtLpQTwi.es.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-xoE5yB6b.amd.js.map +0 -1
- package/.chunks/forms-Dv9L8-AZ.amd.js.map +0 -1
- package/.chunks/forms-LTK63Ugt.es.js.map +0 -1
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-COGiIcDO.amd.js.map +0 -1
- package/.chunks/listItem.vue_vue_type_script_setup_true_lang-UC3o5oK5.es.js.map +0 -1
- package/.chunks/menu.vue_vue_type_style_index_0_lang-BFmZ4tvs.amd.js.map +0 -1
- package/.chunks/menu.vue_vue_type_style_index_0_lang-hQu5BJPe.es.js.map +0 -1
- package/.chunks/notice-BoZG4Mg1.amd.js.map +0 -1
- package/.chunks/notice-CYutIom0.es.js.map +0 -1
- package/.chunks/page.vue_vue_type_script_setup_true_lang-B2wjrf5z.es.js.map +0 -1
- package/.chunks/page.vue_vue_type_script_setup_true_lang-CffDh-th.amd.js.map +0 -1
- package/.chunks/popup-Cg9w4Vy-.amd.js.map +0 -1
- package/.chunks/popup-ec_xLrTA.es.js.map +0 -1
- package/.chunks/utils-BRLYX_ZC.es.js.map +0 -1
- package/.chunks/utils-COoE8KP7.es.js.map +0 -1
- package/.chunks/utils-GpKurv7L.amd.js.map +0 -1
- package/.chunks/utils-z5wL437D.amd.js.map +0 -1
package/formsExt/formsExt.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","vue","../.chunks/forms-Dv9L8-AZ.amd","../utils/keyboard.amd","../popup/popup.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-BFmZ4tvs.amd","../require/css.amd!../assets/formsExt.css"],function(ae,V,e,B,I,w,$){"use strict";if(typeof e>"u")var e=window.Vue;const N={class:"top-editArea_footer"},M=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{}},emits:["submit","close","clickOnTitle"],setup(s,{emit:r}){const t=s,a=r,m=e.ref(t.defaultValue),y=e.ref(t.isFocused),u=e.computed(()=>m.value!==t.defaultValue),v=e.computed(()=>t.attachToKeyboard?"":t.forceShowCloseBtn&&!u.value?t.closeText:t.cancelText),c=d=>{a("submit",d),m.value=t.defaultValue},f=()=>{if(t.forceShowCloseBtn&&!u.value){a("close");return}m.value=t.defaultValue},k=()=>{t.attachToKeyboard&&a("clickOnTitle")};return(d,l)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":d.attachToKeyboard})},[d.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:l[0]||(l[0]=h=>k())},e.toDisplayString(d.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-error":d.isError,"top-focus":y.value})},[e.createVNode(B._sfc_main$3,{modelValue:m.value,"onUpdate:modelValue":l[1]||(l[1]=h=>m.value=h),name:d.name,placeholder:d.placeholder,rows:d.rows,minHeight:d.minHeight,expandable:d.expandable,disabled:d.disabled,readonly:d.readonly,isError:d.isError,hint:d.hint,class:"top-editArea_element",onFocus:l[2]||(l[2]=()=>y.value=!0),onBlur:l[3]||(l[3]=()=>y.value=!1),onKeyup:[e.withKeys(f,["esc"]),l[4]||(l[4]=e.withKeys(e.withModifiers(h=>c(m.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",N,[!d.attachToKeyboard&&(u.value||d.forceShowCloseBtn)?(e.openBlock(),e.createBlock(B._sfc_main,{key:0,class:"top-editArea_button",color:"theme",styling:"soft",onClick:f},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(v.value),1)]),_:1})):e.createCommentVNode("",!0),u.value?(e.openBlock(),e.createBlock(B._sfc_main,{key:1,class:"top-editArea_button",icon:d.attachToKeyboard?"":"",onClick:l[5]||(l[5]=h=>c(m.value))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.attachToKeyboard?"":d.submitText),1)]),_:1},8,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),L={class:"top-editInput"},_=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(s,{emit:r}){const t=s,a=e.ref(t.modelValue);e.watch(e.toRef(t.modelValue),()=>{a.value=t.modelValue});const m=r,y=()=>{m("update:modelValue",a.value)};return(u,v)=>(e.openBlock(),e.createElementBlock("div",L,[e.createVNode(B._sfc_main$2,e.mergeProps(u.input,{onKeydownCapture:v[0]||(v[0]=e.withKeys(e.withModifiers(c=>a.value=u.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(y,["stop"]),["enter"]),modelValue:a.value,"onUpdate:modelValue":v[1]||(v[1]=c=>a.value=c)}),null,16,["onKeydown","modelValue"]),a.value!==u.modelValue?(e.openBlock(),e.createBlock(B._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},u.button,{onClick:y}),null,16)):e.createCommentVNode("",!0)]))}}),K=["data-top-icon","onClick"],P={key:0,class:"top-radioGroup_circle"},z=["value","disabled"],D=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:e.mergeModels(["update:modelValue"],["update:modelValue"]),setup(s,{emit:r}){const t=e.useModel(s,"modelValue"),a=s,m=e.ref(null);e.watch(t,()=>{var u,v,c,f,k;(u=a.radiosProps)!=null&&u.some(d=>d.value===t.value)||(t.value=((c=(v=a.radiosProps)==null?void 0:v[0])==null?void 0:c.value)??""),(k=(f=m.value)==null?void 0:f.querySelector(".radioGroup_item-selected"))==null||k.scrollIntoView()},{immediate:!0});const y="radioGroup-"+Math.random();return(u,v)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:m,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+u.size]:!!u.size,"top-error":u.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.radiosProps,c=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":c.value===t.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":c.disabled}),"data-top-icon":c.icon,onClick:f=>t.value=c.value},[e.createTextVNode(e.toDisplayString(c.title)+" ",1),u.showIndicator?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":v[0]||(v[0]=f=>t.value=f),name:y,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:c.value,disabled:c.disabled},null,8,z),[[e.vModelRadio,t.value]])],10,K))),256))],2))}}),O=(s,r,t)=>{const a=e.ref([]),m=e.ref(!1);let y="",u;s&&!s.params.limit&&(s.params.limit=100);const v=async()=>{if(!s)return;let l,h;if(t&&(s.cache??=new Map,h=JSON.stringify(s.params),l=s.cache.get(h),l))return l;if(m.value=!0,l=await s.call(),m.value=!1,l.errors)return;if(!Array.isArray(l.result)){console.warn("В result ожидался массив");return}const C=l.result.findIndex(T=>T.id===void 0||T.name===void 0);if(C!==-1){console.warn(`В result[${C}] нет id или name`);return}return t&&s.cache.set(h,l),l},c=async()=>{if(!s)return;s.params.offset=0,s.params.search=y;const l=await v();l&&(u=l.nextOffset,a.value=l.result)},f=async()=>{if(!s||!u||m.value)return;s.params.offset=u,s.params.search=y;const l=await v();l&&(u=l.nextOffset,a.value=a.value.concat(l.result))},k=B.debounce(()=>c(),200);return{items:a,isLoading:m,loadAppend:f,setSearchTextAndLoad:(l,h=!0)=>{s&&(l.length<r||l===y&&a.value.length||(y=l,h?k():c()))}}},F={class:"top-selector2_itemMulti top-ellipsis"},G=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(s){return(r,t)=>(e.openBlock(),e.createElementBlock("div",F,[e.createTextVNode(e.toDisplayString(r.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:t[0]||(t[0]=a=>r.$emit("delete",r.id)),onMousedown:t[1]||(t[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),H={key:0,class:"top-selector2_activeItems"},R={key:1,class:"top-selector2_activeName top-ellipsis"},U=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},multiselect:{type:Boolean},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},placeholder:{},showSelectedInInput:{type:Boolean,default:!0}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(s){const r=s,t=e.useModel(s,"modelValue"),a=e.ref(""),m=()=>{a.value="",f.items.value=[]},y={id:0,name:B.useI18n().Common.All},u=e.ref(null),v=e.ref(null),c=()=>{var o;return(o=u.value)==null?void 0:o.popup};window.__STORYBOOK_PREVIEW__&&!r.modelValue&&e.watch(()=>r.multiselect,()=>{t.value=r.multiselect?[]:{id:null,name:""}},{immediate:!0});const f=O(r.apiRequest,r.minLength,r.useCache),k=e.computed(()=>{const o=[];return!r.multiselect&&r.appendAllValue&&o.push(y),r.items.forEach(n=>o.push({...n})),o}),d=(o,n=!0)=>n&&o.id===null?Array.isArray(t.value)?t.value.some(p=>p.id===o.id&&p.name===o.name):o.name===t.value.name:Array.isArray(t.value)?t.value.some(p=>p.id===o.id):o.id===t.value.id,l=e.computed(()=>{const o=a.value.toLowerCase(),n=I.invertKeyboardLayout(o);let p=[];return k.value.forEach(i=>{const g=i.name.toLowerCase();(i.id===Number(o)||g.includes(o)||g.includes(n))&&(g===o||g===n?p.unshift(i):p.push(i))}),p.push(...f.items.value),r.appendSearchToResult&&a.value&&(!p.length||p[0].name.toLowerCase()!==o)&&p.push({id:null,name:a.value}),r.multiselect&&(p=p.filter(i=>!d(i))),p}),h=e.ref(f.isLoading.value);e.watch(f.isLoading,()=>{h.value=f.isLoading.value});const C=async o=>{var n,p;if(r.multiselect){if(!Array.isArray(t.value)||d(o))return;r.apiRequest&&a.value&&(h.value=!0);const i=[...t.value];i.push({...o}),t.value=i,B.Core.state.isMobile?(n=c())==null||n.close():setTimeout(()=>{var g,A,E,S;(g=c())==null||g.recalcPosition(),(S=(E=(A=c())==null?void 0:A.elPopupWidget)==null?void 0:E.querySelector("input"))==null||S.focus(),a.value&&m()})}else JSON.stringify(o)!==JSON.stringify(t.value)&&(t.value={...o}),(p=c())==null||p.close()},T=()=>{if(!Array.isArray(t.value)){const n=(k.value.findIndex(p=>p.id===t.value.id)+1)%k.value.length;t.value={...k.value[n]}}},te=async o=>{Array.isArray(t.value)&&(t.value=t.value.filter(n=>n.id!==o),setTimeout(()=>{var n;(n=c())==null||n.recalcPosition()}))},b=e.ref(!1);r.apiRequest&&(e.watch(b,()=>{b.value&&f.setSearchTextAndLoad(a.value,!1)}),e.watch(a,()=>f.setSearchTextAndLoad(a.value)));const oe=o=>{const n=o.target;n.scrollTop/(n.scrollHeight-n.offsetHeight)>.8&&f.loadAppend()},le=()=>{var o;b.value=!1,(o=v.value)==null||o.focus(),a.value&&m()};return(o,n)=>{const p=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(w.TopPopup),{ref_key:"popupRef",ref:u,onOpen:n[3]||(n[3]=i=>b.value=!0),onClose:n[4]||(n[4]=i=>le()),onScrollContentList:n[5]||(n[5]=i=>o.apiRequest?oe(i):void 0),notch:!1,transitionDuration:0},{opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:v,class:e.normalizeClass({"top-selector2":!0,"top-selector2-multiselect":o.multiselect,["top-size_"+o.size]:!0,"top-disabled":o.disabled,"top-forms-focusable":!o.disabled,"top-error":o.isError}),onKeydown:[n[0]||(n[0]=e.withKeys(e.withModifiers(i=>i.currentTarget.click(),["stop","prevent"]),["up","down","enter","space"])),n[1]||(n[1]=e.withKeys(i=>t.value=[],["delete"]))],tabindex:"0"},[o.multiselect?(e.openBlock(),e.createElementBlock("div",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value,i=>(e.openBlock(),e.createBlock(G,{id:i.id,name:i.name,onDelete:te},null,8,["id","name"]))),256))])):e.createCommentVNode("",!0),o.multiselect?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",R,e.toDisplayString(Array.isArray(t.value)?"":t.value.name),1)),o.addChanger&&!o.multiselect&&k.value.length>1&&!o.disabled?(e.openBlock(),e.createElementBlock("span",{key:2,class:"top-changer top-changer-selector",onClick:e.withModifiers(T,["stop"])})):e.createCommentVNode("",!0)],34)),[[p,o.isError,void 0,{onupdate:!0}]])]),widget:e.withCtx(()=>[e.createVNode(e.unref(w.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:a.value,"onUpdate:modelValue":n[2]||(n[2]=i=>a.value=i),isLoading:h.value,placeholder:!Array.isArray(t.value)&&!o.multiselect&&o.showSelectedInInput?t.value.name:o.placeholder},null,8,["modelValue","isLoading","placeholder"])]),contentList:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,i=>(e.openBlock(),e.createBlock(e.unref(w.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(t.value)&&!o.multiselect&&t.value.name===i.name}),key:i.id??void 0,onClick:e.withModifiers(g=>C(i),["stop"])},{default:e.withCtx(()=>[o.$slots.item?e.renderSlot(o.$slots,"item",{key:0,item:i}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(i.name),1)],64))]),_:2},1032,["class","onClick"]))),128)),!h.value&&!l.value.length?(e.openBlock(),e.createBlock(e.unref(w.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0)]),_:3},512)}}}),W=["data-top-icon"],J={class:"top-info_text"},j={key:0,class:"top-info_value"},X=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(s){return(r,t)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+r.size]:!0,["top-info-styling_"+r.styling]:!0}),"data-top-icon":r.icon},[e.createElementVNode("div",J,[e.renderSlot(r.$slots,"default")]),r.$slots.additional?(e.openBlock(),e.createElementBlock("span",j,[e.renderSlot(r.$slots,"additional")])):e.createCommentVNode("",!0)],10,W))}}),Y=M,Q=_,Z=D,q=U,x=$._sfc_main,ee=X;V.TopEditArea=Y,V.TopEditInput=Q,V.TopInfo=ee,V.TopMenu=x,V.TopRadioGroup=Z,V.TopSelector2=q,Object.defineProperty(V,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
define(["require","exports","vue","../.chunks/forms-BwGakScF.amd","../utils/keyboard.amd","../popup/popup.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-DQTVNJGq.amd","../require/css.amd!../assets/formsExt.css"],function(ae,V,e,B,$,w,I){"use strict";if(typeof e>"u")var e=window.Vue;const N={class:"top-editArea_footer"},M=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{}},emits:["submit","close","clickOnTitle"],setup(i,{emit:r}){const t=i,l=r,m=e.ref(t.defaultValue),h=e.ref(t.isFocused),d=e.computed(()=>m.value!==t.defaultValue),f=a=>{l("submit",a),m.value=t.defaultValue},c=()=>{if(t.forceShowCloseBtn&&!d.value){l("close");return}m.value=t.defaultValue},v=()=>{t.attachToKeyboard&&l("clickOnTitle")};return(a,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":a.attachToKeyboard})},[a.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:y[0]||(y[0]=s=>v())},e.toDisplayString(a.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-error":a.isError,"top-focus":h.value})},[e.createVNode(B._sfc_main$3,{modelValue:m.value,"onUpdate:modelValue":y[1]||(y[1]=s=>m.value=s),name:a.name,placeholder:a.placeholder,rows:a.rows,minHeight:a.minHeight,expandable:a.expandable,disabled:a.disabled,readonly:a.readonly,isError:a.isError,hint:a.hint,class:"top-editArea_element",onFocus:y[2]||(y[2]=()=>h.value=!0),onBlur:y[3]||(y[3]=()=>h.value=!1),onKeyup:[e.withKeys(c,["esc"]),y[4]||(y[4]=e.withKeys(e.withModifiers(s=>f(m.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",N,[d.value||a.forceShowCloseBtn?(e.openBlock(),e.createBlock(B._sfc_main,{key:0,icon:a.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:c},e.createSlots({_:2},[a.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),d.value?(e.openBlock(),e.createBlock(B._sfc_main,{key:1,class:"top-editArea_button",icon:a.$core.state.isMobile?"":"",onClick:y[5]||(y[5]=s=>f(m.value))},e.createSlots({_:2},[a.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),L={class:"top-editInput"},_=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(i,{emit:r}){const t=i,l=e.ref(t.modelValue);e.watch(e.toRef(t.modelValue),()=>{l.value=t.modelValue});const m=r,h=()=>{m("update:modelValue",l.value)};return(d,f)=>(e.openBlock(),e.createElementBlock("div",L,[e.createVNode(B._sfc_main$2,e.mergeProps(d.input,{onKeydownCapture:f[0]||(f[0]=e.withKeys(e.withModifiers(c=>l.value=d.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(h,["stop"]),["enter"]),modelValue:l.value,"onUpdate:modelValue":f[1]||(f[1]=c=>l.value=c)}),null,16,["onKeydown","modelValue"]),l.value!==d.modelValue?(e.openBlock(),e.createBlock(B._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},d.button,{onClick:h}),null,16)):e.createCommentVNode("",!0)]))}}),K=["data-top-icon","onClick"],P={key:0,class:"top-radioGroup_circle"},z=["value","disabled"],D=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:e.mergeModels(["update:modelValue"],["update:modelValue"]),setup(i,{emit:r}){const t=e.useModel(i,"modelValue"),l=i,m=e.ref(null);e.watch(t,()=>{var d,f,c,v,a;(d=l.radiosProps)!=null&&d.some(y=>y.value===t.value)||(t.value=((c=(f=l.radiosProps)==null?void 0:f[0])==null?void 0:c.value)??""),(a=(v=m.value)==null?void 0:v.querySelector(".radioGroup_item-selected"))==null||a.scrollIntoView()},{immediate:!0});const h="radioGroup-"+Math.random();return(d,f)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:m,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+d.size]:!!d.size,"top-error":d.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.radiosProps,c=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":c.value===t.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":c.disabled}),"data-top-icon":c.icon,onClick:v=>t.value=c.value},[e.createTextVNode(e.toDisplayString(c.title)+" ",1),d.showIndicator?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":f[0]||(f[0]=v=>t.value=v),name:h,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:c.value,disabled:c.disabled},null,8,z),[[e.vModelRadio,t.value]])],10,K))),256))],2))}}),O=(i,r,t)=>{const l=e.ref([]),m=e.ref(!1);let h="",d;i&&!i.params.limit&&(i.params.limit=100);const f=async()=>{if(!i)return;let s,k;if(t&&(i.cache??=new Map,k=JSON.stringify(i.params),s=i.cache.get(k),s))return s;if(m.value=!0,s=await i.call(),m.value=!1,s.errors)return;if(!Array.isArray(s.result)){console.warn("В result ожидался массив");return}const C=s.result.findIndex(b=>b.id===void 0||b.name===void 0);if(C!==-1){console.warn(`В result[${C}] нет id или name`);return}return t&&i.cache.set(k,s),s},c=async()=>{if(!i)return;i.params.offset=0,i.params.search=h;const s=await f();s&&(d=s.nextOffset,l.value=s.result)},v=async()=>{if(!i||!d||m.value)return;i.params.offset=d,i.params.search=h;const s=await f();s&&(d=s.nextOffset,l.value=l.value.concat(s.result))},a=B.debounce(()=>c(),200);return{items:l,isLoading:m,loadAppend:v,setSearchTextAndLoad:(s,k=!0)=>{i&&(s.length<r||s===h&&l.value.length||(h=s,k?a():c()))}}},F={class:"top-selector2_itemMulti top-ellipsis"},G=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(i){return(r,t)=>(e.openBlock(),e.createElementBlock("div",F,[e.createTextVNode(e.toDisplayString(r.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:t[0]||(t[0]=l=>r.$emit("delete",r.id)),onMousedown:t[1]||(t[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),H={key:0,class:"top-selector2_activeItems"},R={key:1,class:"top-selector2_activeName top-ellipsis"},U=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},multiselect:{type:Boolean},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},placeholder:{},showSelectedInInput:{type:Boolean,default:!0}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const r=i,t=e.useModel(i,"modelValue"),l=e.ref(""),m=()=>{l.value="",v.items.value=[]},h={id:0,name:B.useI18n().Common.All},d=e.ref(null),f=e.ref(null),c=()=>{var o;return(o=d.value)==null?void 0:o.popup};window.__STORYBOOK_PREVIEW__&&!r.modelValue&&e.watch(()=>r.multiselect,()=>{t.value=r.multiselect?[]:{id:null,name:""}},{immediate:!0});const v=O(r.apiRequest,r.minLength,r.useCache),a=e.computed(()=>{const o=[];return!r.multiselect&&r.appendAllValue&&o.push(h),r.items.forEach(n=>o.push({...n})),o}),y=(o,n=!0)=>n&&o.id===null?Array.isArray(t.value)?t.value.some(p=>p.id===o.id&&p.name===o.name):o.name===t.value.name:Array.isArray(t.value)?t.value.some(p=>p.id===o.id):o.id===t.value.id,s=e.computed(()=>{const o=l.value.toLowerCase(),n=$.invertKeyboardLayout(o);let p=[];return a.value.forEach(u=>{const g=u.name.toLowerCase();(u.id===Number(o)||g.includes(o)||g.includes(n))&&(g===o||g===n?p.unshift(u):p.push(u))}),p.push(...v.items.value),r.appendSearchToResult&&l.value&&(!p.length||p[0].name.toLowerCase()!==o)&&p.push({id:null,name:l.value}),r.multiselect&&(p=p.filter(u=>!y(u))),p}),k=e.ref(v.isLoading.value);e.watch(v.isLoading,()=>{k.value=v.isLoading.value});const C=async o=>{var n,p;if(r.multiselect){if(!Array.isArray(t.value)||y(o))return;r.apiRequest&&l.value&&(k.value=!0);const u=[...t.value];u.push({...o}),t.value=u,B.Core.state.isMobile?(n=c())==null||n.close():setTimeout(()=>{var g,A,E,S;(g=c())==null||g.recalcPosition(),(S=(E=(A=c())==null?void 0:A.elPopupWidget)==null?void 0:E.querySelector("input"))==null||S.focus(),l.value&&m()})}else JSON.stringify(o)!==JSON.stringify(t.value)&&(t.value={...o}),(p=c())==null||p.close()},b=()=>{if(!Array.isArray(t.value)){const n=(a.value.findIndex(p=>p.id===t.value.id)+1)%a.value.length;t.value={...a.value[n]}}},te=async o=>{Array.isArray(t.value)&&(t.value=t.value.filter(n=>n.id!==o),setTimeout(()=>{var n;(n=c())==null||n.recalcPosition()}))},T=e.ref(!1);r.apiRequest&&(e.watch(T,()=>{T.value&&v.setSearchTextAndLoad(l.value,!1)}),e.watch(l,()=>v.setSearchTextAndLoad(l.value)));const oe=o=>{const n=o.target;n.scrollTop/(n.scrollHeight-n.offsetHeight)>.8&&v.loadAppend()},le=()=>{var o;T.value=!1,(o=f.value)==null||o.focus(),l.value&&m()};return(o,n)=>{const p=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(w.TopPopup),{ref_key:"popupRef",ref:d,onOpen:n[3]||(n[3]=u=>T.value=!0),onClose:n[4]||(n[4]=u=>le()),onScrollContentList:n[5]||(n[5]=u=>o.apiRequest?oe(u):void 0),notch:!1,transitionDuration:0},{opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:f,class:e.normalizeClass({"top-selector2":!0,"top-selector2-multiselect":o.multiselect,["top-size_"+o.size]:!0,"top-disabled":o.disabled,"top-forms-focusable":!o.disabled,"top-error":o.isError}),onKeydown:[n[0]||(n[0]=e.withKeys(e.withModifiers(u=>u.currentTarget.click(),["stop","prevent"]),["up","down","enter","space"])),n[1]||(n[1]=e.withKeys(u=>t.value=[],["delete"]))],tabindex:"0"},[o.multiselect?(e.openBlock(),e.createElementBlock("div",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value,u=>(e.openBlock(),e.createBlock(G,{id:u.id,name:u.name,onDelete:te},null,8,["id","name"]))),256))])):e.createCommentVNode("",!0),o.multiselect?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",R,e.toDisplayString(Array.isArray(t.value)?"":t.value.name),1)),o.addChanger&&!o.multiselect&&a.value.length>1&&!o.disabled?(e.openBlock(),e.createElementBlock("span",{key:2,class:"top-changer top-changer-selector",onClick:e.withModifiers(b,["stop"])})):e.createCommentVNode("",!0)],34)),[[p,o.isError,void 0,{onupdate:!0}]])]),widget:e.withCtx(()=>[e.createVNode(e.unref(w.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:l.value,"onUpdate:modelValue":n[2]||(n[2]=u=>l.value=u),isLoading:k.value,placeholder:!Array.isArray(t.value)&&!o.multiselect&&o.showSelectedInInput?t.value.name:o.placeholder},null,8,["modelValue","isLoading","placeholder"])]),contentList:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,u=>(e.openBlock(),e.createBlock(e.unref(w.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(t.value)&&!o.multiselect&&t.value.name===u.name}),key:u.id??void 0,onClick:e.withModifiers(g=>C(u),["stop"])},{default:e.withCtx(()=>[o.$slots.item?e.renderSlot(o.$slots,"item",{key:0,item:u}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(u.name),1)],64))]),_:2},1032,["class","onClick"]))),128)),!k.value&&!s.value.length?(e.openBlock(),e.createBlock(e.unref(w.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0)]),_:3},512)}}}),W=["data-top-icon"],J={class:"top-info_text"},j={key:0,class:"top-info_value"},X=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(i){return(r,t)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+r.size]:!0,["top-info-styling_"+r.styling]:!0}),"data-top-icon":r.icon},[e.createElementVNode("div",J,[e.renderSlot(r.$slots,"default")]),r.$slots.additional?(e.openBlock(),e.createElementBlock("span",j,[e.renderSlot(r.$slots,"additional")])):e.createCommentVNode("",!0)],10,W))}}),Y=M,Q=_,Z=D,q=U,x=I._sfc_main,ee=X;V.TopEditArea=Y,V.TopEditInput=Q,V.TopInfo=ee,V.TopMenu=x,V.TopRadioGroup=Z,V.TopSelector2=q,Object.defineProperty(V,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=formsExt.amd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/selector2/api.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './editArea';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst cancelBtnText = computed(() => {\n\tif (props.attachToKeyboard) return '';\n\n\tif (props.forceShowCloseBtn && !isChanged.value) return props.closeText;\n\n\treturn props.cancelText;\n});\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"!attachToKeyboard && (isChanged || forceShowCloseBtn)\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t{{ cancelBtnText }}\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"attachToKeyboard ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t{{ attachToKeyboard ? '' : submitText }}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n\toutline: none;\n}\n\n.top-editArea_form:not(.top-error):hover,\n.top-editArea_form:not(.top-error).top-focus {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\tborder: none;\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: var(--top-editArea-bottom);\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button {\n\tmin-width: auto;\n\tpadding: 0;\n}\n\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button:before {\n\t--top-icon-size: 18px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './editInput';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props, Emits } from './radioGroup';\n\nconst model = defineModel<string>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst emit = defineEmits<Emits>();\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n@import \"./styles/top-scrollBar.css\";\n\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","import type { Ref } from 'vue';\nimport { ref } from 'vue';\nimport { debounce } from '@/core/utils/lodash';\nimport type { Item, Props } from './selector2';\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items: Ref<Array<Item>> = ref([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet _searchText = '';\n\tlet _nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Array<Item> } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!_nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = _nextOffset;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\n\t *\n\t * Если текст не изменился, поиск не будет проивзеден\n\t * @param searchText - текст поиска\n\t * @param useDebounce - отложенное выполнение поиска\n\t */\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (searchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (searchText === _searchText && items.value.length) return;\n\n\t\t_searchText = searchText;\n\n\t\tif (useDebounce) {\n\t\t\tloadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","<script setup lang=\"ts\">\nimport type { ComputedRef, ModelRef, ComponentInstance } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport type PopupClass from '@/components/popup/lib/popup';\nimport type { Item, Props, Slots } from './selector2';\nimport { useAPI } from './api';\nimport Selector2ItemMulti from './itemMulti.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Array<Item>,\n\tsize: 's',\n\tminLength: 0,\n\tshowSelectedInInput: true,\n});\n\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\n\ndefineSlots<Slots>();\n\n/**\n * Текст поиска по результатам\n */\nconst searchText = ref('');\n\n/**\n * Сброс поиска\n */\nconst resetSearch = () => {\n\tsearchText.value = '';\n\tAPI.items.value = [];\n};\n\n\nconst itemAll = {\n\tid: 0,\n\tname: useI18n().Common.All!,\n};\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<ComponentInstance<typeof TopPopup> | null>(null);\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): PopupClass | undefined => {\n\treturn popupRef.value?.popup;\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__ && !props.modelValue) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tmodel.value = props.multiselect ? [] : { id: null, name: '' };\n\t\t},\n\t\t{ immediate: true },\n\t);\n}\n\nconst API = useAPI(props.apiRequest, props.minLength, props.useCache);\n\n/**\n * Варианты выбора: props.items + \"Выбрать все\"\n */\nconst localItems: ComputedRef<Array<Item>> = computed(() => {\n\tconst items: Array<Item> = [];\n\n\tif (!props.multiselect && props.appendAllValue) {\n\t\titems.push(itemAll);\n\t}\n\n\tprops.items.forEach(item => items.push({ ...item }));\n\n\treturn items;\n});\n\n/**\n * Проверить, что элемент выбран\n */\nconst isSelected = (item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(model.value)) {\n\t\t\treturn model.value.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === model.value.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(model.value)) {\n\t\treturn model.value.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === model.value.id;\n\t}\n};\n\n/**\n * Варианты выбора, которые выводятся\n */\nconst itemsForShow = computed(() => {\n\tconst searchString = searchText.value.toLowerCase();\n\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\tlet items: typeof localItems.value = [];\n\n\tlocalItems.value.forEach((item) => {\n\t\tconst itemName = item.name.toLowerCase();\n\n\t\tif (\n\t\t\titem.id === Number(searchString) ||\n\t\t\titemName.includes(searchString) ||\n\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t) {\n\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\titems.unshift(item);\n\t\t\t} else {\n\t\t\t\titems.push(item);\n\t\t\t}\n\t\t}\n\t});\n\n\titems.push(...API.items.value);\n\n\tif (\n\t\tprops.appendSearchToResult &&\n\t\t!!searchText.value &&\n\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t) {\n\t\titems.push({\n\t\t\tid: null,\n\t\t\tname: searchText.value,\n\t\t});\n\t}\n\n\tif (props.multiselect) {\n\t\titems = items.filter(item => !isSelected(item));\n\t}\n\n\treturn items;\n});\n\n/**\n * Флаг - идет загрузка\n *\n * Скрывает вывод заглушки \"Нет результатов\" - для загрузки данных через API (multiselect = true) - (см. selectItem)\n */\nconst isLoading = ref(API.isLoading.value);\n\nwatch(API.isLoading, () => {\n\tisLoading.value = API.isLoading.value;\n});\n\n/**\n * Выбрать значение\n *\n * Управляет закрытием окна\n */\nconst selectItem = async (item: Item) => {\n\tif (props.multiselect) {\n\t\tif (!Array.isArray(model.value)) return;\n\n\t\tif (isSelected(item)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (props.apiRequest && searchText.value) {\n\t\t\tisLoading.value = true;\n\t\t}\n\n\t\tconst newModel = [...model.value];\n\t\tnewModel.push({ ...item });\n\t\tmodel.value = newModel;\n\n\t\tif (Core.state.isMobile) {\n\t\t\tgetPopup()?.close();\n\t\t} else {\n\t\t\tsetTimeout(() => {\n\t\t\t\tgetPopup()?.recalcPosition();\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\n\n\t\t\t\tif (searchText.value) resetSearch();\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\n\t\t\tmodel.value = { ...item };\n\t\t}\n\n\t\tgetPopup()?.close();\n\t}\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\n\t\tmodel.value = { ...localItems.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\n * @param id\n */\nconst deleteItemById = async (id: Item['id']) => {\n\tif (Array.isArray(model.value)) {\n\t\tmodel.value = model.value.filter(item => item.id !== id);\n\n\t\tsetTimeout(() => {\n\t\t\tgetPopup()?.recalcPosition();\n\t\t});\n\t}\n};\n\nconst isOpened = ref(false); // флаг попап открыт\n\nif (props.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\n}\n\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tAPI.loadAppend();\n\t}\n};\n\nconst onClose = () => {\n\tisOpened.value = false;\n\n\telRef.value?.focus();\n\n\tif (searchText.value) resetSearch();\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"false\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<div\n\t\t\t\tref=\"elRef\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\n\t\t\t\t@keydown.delete=\"model = []\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Array<Item>\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !multiselect && localItems.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\t@click.stop=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget>\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"searchText\"\n\t\t\t\t:isLoading=\"isLoading\"\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of itemsForShow\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.name === item.name\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t@click.stop=\"selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item=\"item\"\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!isLoading && !itemsForShow.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tmin-height: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: hidden;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n\tcolor: var(--top-forms-placeholder-color);\n\n\tborder-radius: var(--top-radius-2);\n\tborder: 1px solid var(--top-forms-border-color);\n\tbackground: var(--top-forms-background-color);\n}\n\n.top-selector2-multiselect {\n\twidth: unset;\n\tmin-width: 180px;\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\ttransform: translateX(-16px);\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["isChanged","vue","localValue","props","cancelBtnText","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","items","isLoading","_nextOffset","apiRequest","res","cacheKey","indexWithError","_searchText","callAPIRequest","loadAppend","searchText","minLength","loadDebounce","API","forms","popupRef","useAPI","localItems","itemAll","itemSelected","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","isSelected","selectItem","newModel","getPopup","resetSearch","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","TopEditArea","_sfc_main$5","TopEditInput","_sfc_main$4","TopRadioGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/selector2/api.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue';\r\nimport Button from '@/components/forms/button/button.vue';\r\nimport type { Emits, Props } from './editArea';\r\nimport Textarea from '@/components/forms/textarea/textarea.vue';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tdefaultValue: '',\r\n\tcancelText: 'Cancel',\r\n\tsubmitText: 'Send',\r\n\tcloseText: 'Close',\r\n\texpandable: true,\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst localValue = ref(props.defaultValue);\r\n\r\nconst isFocused = ref(props.isFocused);\r\n\r\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\r\n\r\nconst submit = (value: string) => {\r\n\temit('submit', value);\r\n\r\n\tlocalValue.value = props.defaultValue;\r\n};\r\n\r\nconst cancel = () => {\r\n\tif (props.forceShowCloseBtn && !isChanged.value) {\r\n\t\temit('close');\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tlocalValue.value = props.defaultValue;\r\n};\r\n\r\nconst clickOnTitle = () => {\r\n\tif (props.attachToKeyboard) emit('clickOnTitle');\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\t:class=\"{\r\n\t\t\t'top-editArea': true,\r\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\r\n\t\t}\"\r\n\t>\r\n\t\t<div\r\n\t\t\tv-if=\"title\"\r\n\t\t\tclass=\"top-editArea_title\"\r\n\t\t\t@click=\"clickOnTitle()\"\r\n\t\t>\r\n\t\t\t{{ title }}\r\n\t\t</div>\r\n\r\n\t\t<div\r\n\t\t\t:class=\"{\r\n\t\t\t\t'top-editArea_form': true,\r\n\t\t\t\t'top-error': isError,\r\n\t\t\t\t'top-focus': isFocused,\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<Textarea\r\n\t\t\t\tv-model=\"localValue\"\r\n\t\t\t\t:name=\"name\"\r\n\t\t\t\t:placeholder=\"placeholder\"\r\n\t\t\t\t:rows=\"rows\"\r\n\t\t\t\t:minHeight=\"minHeight\"\r\n\t\t\t\t:expandable=\"expandable\"\r\n\t\t\t\t:disabled=\"disabled\"\r\n\t\t\t\t:readonly=\"readonly\"\r\n\t\t\t\t:isError=\"isError\"\r\n\t\t\t\t:hint=\"hint\"\r\n\t\t\t\tclass=\"top-editArea_element\"\r\n\t\t\t\t@focus=\"() => isFocused = true\"\r\n\t\t\t\t@blur=\"() => isFocused = false\"\r\n\t\t\t\t@keyup.esc=\"cancel\"\r\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\r\n\t\t\t/>\r\n\r\n\t\t\t<div class=\"top-editArea_footer\">\r\n\t\t\t\t<Button\r\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\r\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\r\n\t\t\t\t\tclass=\"top-editArea_button\"\r\n\t\t\t\t\tcolor=\"theme\"\r\n\t\t\t\t\tstyling=\"soft\"\r\n\t\t\t\t\t@click=\"cancel\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<template\r\n\t\t\t\t\t\t#default\r\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ cancelText }}\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</Button>\r\n\r\n\t\t\t\t<Button\r\n\t\t\t\t\tclass=\"top-editArea_button\"\r\n\t\t\t\t\tv-if=\"isChanged\"\r\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\r\n\t\t\t\t\t@click=\"submit(localValue)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<template\r\n\t\t\t\t\t\t#default\r\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ submitText }}\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n.top-editArea {\r\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\r\n\t--top-editArea-offset-bottom: 0px;\r\n\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 6px;\r\n}\r\n\r\n.top-editArea_title {\r\n\tfont-size: 12px;\r\n}\r\n\r\n.top-editArea_form {\r\n\tflex-direction: column;\r\n\toutline: none;\r\n}\r\n\r\n.top-editArea_form:not(.top-error):hover,\r\n.top-editArea_form:not(.top-error).top-focus {\r\n\tborder-color: var(--top-forms-border-color-hover);\r\n}\r\n\r\n/* textarea в EditArea */\r\n.top-textarea {\r\n\twidth: 100%;\r\n}\r\n\r\n.top-editArea_element.top-textarea_textarea {\r\n\t--top-forms-border-width: 0px;\r\n\r\n\toutline: none;\r\n\tanimation: none;\r\n}\r\n\r\n/* footer */\r\n.top-editArea_footer {\r\n\tpadding: var(--top-forms-padding);\r\n\tdisplay: flex;\r\n\tmin-height: 32px;\r\n\talign-self: flex-end;\r\n\tjustify-content: flex-end;\r\n\tgap: var(--top-forms-padding);\r\n}\r\n\r\n/* attachedToKeyboard */\r\n.top-editArea-attachedToKeyboard {\r\n\tbackground: var(--top-forms-background-color);\r\n\tposition: fixed;\r\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\r\n\tright: 0;\r\n\tleft: 0;\r\n\tz-index: 2;\r\n\tgap: 0;\r\n\ttransition: bottom var(--transition-fast);\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_form {\r\n\tborder-radius: 0;\r\n\tborder: none;\r\n\tborder-top: 1px solid var(--top-forms-border-color);\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_title {\r\n\tcursor: pointer;\r\n\tborder-top: 1px solid var(--color-line-2-opacity);\r\n\tpadding: var(--top-forms-padding);\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\r\n\tborder-radius: 100%;\r\n}\r\n\r\n@media screen and (max-width: 900px) {\r\n\t.top-editArea_form{\r\n\t\tflex-direction: row;\r\n\t}\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { ref, toRef, watch } from 'vue';\r\nimport type { Emits, Props } from './editInput';\r\nimport TopInput from '@/components/forms/input/input.vue';\r\nimport TopButton from '@/components/forms/button/button.vue';\r\n\r\nconst props = defineProps<Props>();\r\n\r\nconst intermediateValue = ref(props.modelValue);\r\n\r\nwatch(toRef(props.modelValue), () => {\r\n\tintermediateValue.value = props.modelValue;\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst submit = () => {\r\n\temit('update:modelValue', intermediateValue.value);\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<div class=\"top-editInput\">\r\n\t\t<TopInput\r\n\t\t\t:=\"input\"\r\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\r\n\t\t\t@keydown.enter.stop=\"submit\"\r\n\t\t\tv-model=\"intermediateValue\"\r\n\t\t/>\r\n\r\n\t\t<TopButton\r\n\t\t\tv-if=\"intermediateValue !== modelValue\"\r\n\t\t\ticon=\"\"\r\n\t\t\tstyling=\"soft\"\r\n\t\t\t:=\"button\"\r\n\t\t\t@click=\"submit\"\r\n\t\t/>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n.top-editInput {\r\n\twidth: 220px;\r\n\tflex-grow: 1;\r\n\tdisplay: flex;\r\n\talign-items: flex-end;\r\n\tgap: var(--top-gap-1);\r\n}\r\n\r\n.top-editInput .top-input {\r\n\twidth: unset;\r\n\tflex-grow: 1;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport type { Ref } from '@vue/reactivity';\r\nimport { ref, watch } from 'vue';\r\nimport type { Props, Emits } from './radioGroup';\r\n\r\nconst model = defineModel<string>({\r\n\trequired: true,\r\n});\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tsize: 's',\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst elRef: Ref<HTMLElement | null> = ref(null);\r\n\r\nwatch(model, () => {\r\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\r\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\r\n\t}\r\n\r\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\r\n}, { immediate: true });\r\n\r\nconst uid = 'radioGroup-' + Math.random();\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tref=\"elRef\"\r\n\t\t:class=\"{\r\n\t\t\t['top-radioGroup']: true,\r\n\t\t\t['top-scrollBarXHidding']: true,\r\n\t\t\t['top-size_' + size]: !!size,\r\n\t\t\t['top-error']: isError,\r\n\t\t}\"\r\n\t>\r\n\t\t<label\r\n\t\t\tv-for=\"item of radiosProps\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\r\n\t\t\t\t['top-radioGroup_item']: true,\r\n\t\t\t\t['top-forms-focusable']: true,\r\n\t\t\t\t['top-disabled']: item.disabled,\r\n\t\t\t}\"\r\n\t\t\t:data-top-icon=\"item.icon\"\r\n\t\t\t@click=\"model = item.value\"\r\n\t\t>\r\n\t\t\t{{ item.title }}\r\n\r\n\t\t\t<span\r\n\t\t\t\tv-if=\"showIndicator\"\r\n\t\t\t\tclass=\"top-radioGroup_circle\"\r\n\t\t\t></span>\r\n\r\n\t\t\t<!-- Для нативной навигации -->\r\n\t\t\t<input\r\n\t\t\t\tv-model=\"model\"\r\n\t\t\t\t:name=\"uid\"\r\n\t\t\t\ttype=\"radio\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t['top-unvisible']: true,\r\n\t\t\t\t}\"\r\n\t\t\t\t:value=\"item.value\"\r\n\t\t\t\t:disabled=\"item.disabled\"\r\n\t\t\t/>\r\n\t\t</label>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n@import \"./styles/top-scrollBar.css\";\r\n\r\n.top-radioGroup {\r\n\tuser-select: none;\r\n\tbox-sizing: border-box;\r\n\tborder-radius: 8px;\r\n\tbackground-color: var(--color-layout-middle);\r\n\theight: var(--top-forms-base-height);\r\n\tpadding: 2px;\r\n\tgap: 2px;\r\n\tdisplay: flex;\r\n\talign-items: flex-start;\r\n}\r\n\r\n.top-radioGroup_item {\r\n\tcolor: var(--color-text-2);\r\n\tcursor: pointer;\r\n\tbox-sizing: border-box;\r\n\tborder-radius: 6px;\r\n\theight: calc(var(--top-forms-base-height) - 4px);\r\n\tpadding: 0 16px;\r\n\tfont-weight: 400;\r\n\twhite-space: nowrap;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tflex-grow: 1;\r\n\tgap: 4px;\r\n}\r\n\r\n.top-radioGroup_item:hover {\r\n\tbackground-color: var(--color-layout-front-1);\r\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\r\n}\r\n\r\n/* selected */\r\n.top-radioGroup_item-selected {\r\n\tcolor: var(--color-text-1);\r\n\tpointer-events: none;\r\n\tbackground-color: var(--color-bg-lightning-1);\r\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\r\n}\r\n\r\n/* circle */\r\n.top-radioGroup_circle {\r\n\tcontent: \"\";\r\n\tbox-sizing: border-box;\r\n\tborder: 1px solid var(--color-line-3-opacity);\r\n\tborder-radius: 50%;\r\n\tpadding: 3px;\r\n\tmargin-left: auto;\r\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\r\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\r\n}\r\n\r\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\r\n\tborder-color: var(--color-line-primary-1);\r\n}\r\n\r\n/* circle selected */\r\n.top-radioGroup_item-selected .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-primary-1);\r\n\tborder-width: 5px;\r\n}\r\n\r\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-primary-1);\r\n}\r\n\r\n/* top-error */\r\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-negative-1);\r\n}\r\n</style>\r\n","import type { Ref } from 'vue';\r\nimport { ref } from 'vue';\r\nimport { debounce } from '@/core/utils/lodash';\r\nimport type { Item, Props } from './selector2';\r\n\r\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\r\n\t/**\r\n\t * Список, полученный через API\r\n\t */\r\n\tconst items: Ref<Array<Item>> = ref([]);\r\n\r\n\t/**\r\n\t * Флаг - идет загрузка\r\n\t */\r\n\tconst isLoading = ref(false);\r\n\r\n\tlet _searchText = '';\r\n\tlet _nextOffset: number | undefined;\r\n\r\n\tif (apiRequest && !apiRequest.params.limit) {\r\n\t\tapiRequest.params.limit = 100;\r\n\t}\r\n\r\n\t/**\r\n\t * Выполнить обращение к API\r\n\t *\r\n\t * При ошибке вернет undefined\r\n\t */\r\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Array<Item> } | undefined> => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tlet res;\r\n\t\tlet cacheKey;\r\n\r\n\t\tif (useCache) {\r\n\t\t\t// кэш для полученных ответов через apiRequest\r\n\t\t\t// общий для всех компонентов, использующих apiRequest\r\n\t\t\tapiRequest.cache ??= new Map();\r\n\r\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\r\n\t\t\tres = apiRequest.cache.get(cacheKey);\r\n\r\n\t\t\tif (res) {\r\n\t\t\t\treturn res;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tisLoading.value = true;\r\n\t\tres = await apiRequest.call();\r\n\t\tisLoading.value = false;\r\n\r\n\t\tif (res.errors) return;\r\n\r\n\t\tif (!Array.isArray(res.result)) {\r\n\t\t\tconsole.warn(`В result ожидался массив`);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\r\n\t\tif (indexWithError !== -1) {\r\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (useCache) {\r\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\r\n\t\t}\r\n\r\n\t\treturn res;\r\n\t};\r\n\r\n\t/**\r\n\t * Загрузить items\r\n\t */\r\n\tconst load = async () => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tapiRequest.params.offset = 0;\r\n\t\tapiRequest.params.search = _searchText;\r\n\r\n\t\tconst res = await callAPIRequest();\r\n\t\tif (!res) return;\r\n\r\n\t\t_nextOffset = res.nextOffset;\r\n\r\n\t\titems.value = res.result;\r\n\t};\r\n\r\n\t/**\r\n\t * Загрузить следующую страницу items\r\n\t */\r\n\tconst loadAppend = async () => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\t// данных о следующих страницах не обнаружено\r\n\t\tif (!_nextOffset) return;\r\n\r\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\r\n\t\tif (isLoading.value) return;\r\n\r\n\t\tapiRequest.params.offset = _nextOffset;\r\n\t\tapiRequest.params.search = _searchText;\r\n\r\n\t\tconst res = await callAPIRequest();\r\n\t\tif (!res) return;\r\n\r\n\t\t_nextOffset = res.nextOffset;\r\n\r\n\t\titems.value = items.value.concat(res.result);\r\n\t};\r\n\r\n\tconst loadDebounce = debounce(() => load(), 200);\r\n\r\n\t/**\r\n\t * Выполнить поиск по указанному тексту\r\n\t *\r\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\r\n\t *\r\n\t * Если текст не изменился, поиск не будет проивзеден\r\n\t * @param searchText - текст поиска\r\n\t * @param useDebounce - отложенное выполнение поиска\r\n\t */\r\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tif (searchText.length < minLength) return;\r\n\r\n\t\t// условия поиска не поменялись, данные загружены\r\n\t\tif (searchText === _searchText && items.value.length) return;\r\n\r\n\t\t_searchText = searchText;\r\n\r\n\t\tif (useDebounce) {\r\n\t\t\tloadDebounce();\r\n\t\t} else {\r\n\t\t\tvoid load();\r\n\t\t}\r\n\t};\r\n\r\n\treturn {\r\n\t\titems,\r\n\t\tisLoading,\r\n\t\tloadAppend,\r\n\t\tsetSearchTextAndLoad,\r\n\t};\r\n};\r\n","<script setup lang=\"ts\">\r\nimport type { ComputedRef, ModelRef, ComponentInstance } from 'vue';\r\nimport { computed, ref, watch } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\r\nimport { useI18n } from '@/core/plugins/i18n';\r\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\r\nimport type PopupClass from '@/components/popup/lib/popup';\r\nimport type { Item, Props, Slots } from './selector2';\r\nimport { useAPI } from './api';\r\nimport Selector2ItemMulti from './itemMulti.vue';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\titems: () => [] as Array<Item>,\r\n\tsize: 's',\r\n\tminLength: 0,\r\n\tshowSelectedInInput: true,\r\n});\r\n\r\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\r\n\r\ndefineSlots<Slots>();\r\n\r\n/**\r\n * Текст поиска по результатам\r\n */\r\nconst searchText = ref('');\r\n\r\n/**\r\n * Сброс поиска\r\n */\r\nconst resetSearch = () => {\r\n\tsearchText.value = '';\r\n\tAPI.items.value = [];\r\n};\r\n\r\n\r\nconst itemAll = {\r\n\tid: 0,\r\n\tname: useI18n().Common.All!,\r\n};\r\n\r\n/**\r\n * Экземпляр компонента Popup\r\n */\r\nconst popupRef = ref<ComponentInstance<typeof TopPopup> | null>(null);\r\n\r\n/**\r\n * Основной элемент селектора\r\n */\r\nconst elRef = ref<HTMLElement | null>(null);\r\n\r\n/**\r\n * Получить доступ к объекту popup\r\n */\r\nconst getPopup = (): PopupClass | undefined => {\r\n\treturn popupRef.value?.popup;\r\n};\r\n\r\n// для storybook\r\nif ((window as any).__STORYBOOK_PREVIEW__ && !props.modelValue) {\r\n\twatch(\r\n\t\t() => props.multiselect,\r\n\t\t() => {\r\n\t\t\tmodel.value = props.multiselect ? [] : { id: null, name: '' };\r\n\t\t},\r\n\t\t{ immediate: true },\r\n\t);\r\n}\r\n\r\nconst API = useAPI(props.apiRequest, props.minLength, props.useCache);\r\n\r\n/**\r\n * Варианты выбора: props.items + \"Выбрать все\"\r\n */\r\nconst localItems: ComputedRef<Array<Item>> = computed(() => {\r\n\tconst items: Array<Item> = [];\r\n\r\n\tif (!props.multiselect && props.appendAllValue) {\r\n\t\titems.push(itemAll);\r\n\t}\r\n\r\n\tprops.items.forEach(item => items.push({ ...item }));\r\n\r\n\treturn items;\r\n});\r\n\r\n/**\r\n * Проверить, что элемент выбран\r\n */\r\nconst isSelected = (item: Item, checkNameForNullId = true) => {\r\n\tif (checkNameForNullId && item.id === null) {\r\n\t\tif (Array.isArray(model.value)) {\r\n\t\t\treturn model.value.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\r\n\t\t} else {\r\n\t\t\treturn item.name === model.value.name;\r\n\t\t}\r\n\t}\r\n\r\n\tif (Array.isArray(model.value)) {\r\n\t\treturn model.value.some(itemSelected => itemSelected.id === item.id);\r\n\t} else {\r\n\t\treturn item.id === model.value.id;\r\n\t}\r\n};\r\n\r\n/**\r\n * Варианты выбора, которые выводятся\r\n */\r\nconst itemsForShow = computed(() => {\r\n\tconst searchString = searchText.value.toLowerCase();\r\n\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\r\n\r\n\tlet items: typeof localItems.value = [];\r\n\r\n\tlocalItems.value.forEach((item) => {\r\n\t\tconst itemName = item.name.toLowerCase();\r\n\r\n\t\tif (\r\n\t\t\titem.id === Number(searchString) ||\r\n\t\t\titemName.includes(searchString) ||\r\n\t\t\titemName.includes(searchStringInvertKeyboard)\r\n\t\t) {\r\n\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\r\n\t\t\t\titems.unshift(item);\r\n\t\t\t} else {\r\n\t\t\t\titems.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\titems.push(...API.items.value);\r\n\r\n\tif (\r\n\t\tprops.appendSearchToResult &&\r\n\t\t!!searchText.value &&\r\n\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\r\n\t) {\r\n\t\titems.push({\r\n\t\t\tid: null,\r\n\t\t\tname: searchText.value,\r\n\t\t});\r\n\t}\r\n\r\n\tif (props.multiselect) {\r\n\t\titems = items.filter(item => !isSelected(item));\r\n\t}\r\n\r\n\treturn items;\r\n});\r\n\r\n/**\r\n * Флаг - идет загрузка\r\n *\r\n * Скрывает вывод заглушки \"Нет результатов\" - для загрузки данных через API (multiselect = true) - (см. selectItem)\r\n */\r\nconst isLoading = ref(API.isLoading.value);\r\n\r\nwatch(API.isLoading, () => {\r\n\tisLoading.value = API.isLoading.value;\r\n});\r\n\r\n/**\r\n * Выбрать значение\r\n *\r\n * Управляет закрытием окна\r\n */\r\nconst selectItem = async (item: Item) => {\r\n\tif (props.multiselect) {\r\n\t\tif (!Array.isArray(model.value)) return;\r\n\r\n\t\tif (isSelected(item)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (props.apiRequest && searchText.value) {\r\n\t\t\tisLoading.value = true;\r\n\t\t}\r\n\r\n\t\tconst newModel = [...model.value];\r\n\t\tnewModel.push({ ...item });\r\n\t\tmodel.value = newModel;\r\n\r\n\t\tif (Core.state.isMobile) {\r\n\t\t\tgetPopup()?.close();\r\n\t\t} else {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tgetPopup()?.recalcPosition();\r\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\r\n\r\n\t\t\t\tif (searchText.value) resetSearch();\r\n\t\t\t});\r\n\t\t}\r\n\t} else {\r\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\r\n\t\t\tmodel.value = { ...item };\r\n\t\t}\r\n\r\n\t\tgetPopup()?.close();\r\n\t}\r\n};\r\n\r\n/**\r\n * Выбрать следующее значение\r\n */\r\nconst selectNextItem = () => {\r\n\tif (!Array.isArray(model.value)) {\r\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\r\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\r\n\t\tmodel.value = { ...localItems.value[nextIndex] };\r\n\t}\r\n};\r\n\r\n/**\r\n * Удалить выбранное значение по id\r\n * @param id\r\n */\r\nconst deleteItemById = async (id: Item['id']) => {\r\n\tif (Array.isArray(model.value)) {\r\n\t\tmodel.value = model.value.filter(item => item.id !== id);\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tgetPopup()?.recalcPosition();\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst isOpened = ref(false); // флаг попап открыт\r\n\r\nif (props.apiRequest) {\r\n\twatch(isOpened, () => {\r\n\t\tif (isOpened.value) {\r\n\t\t\t// при открытии сразу выполнить поиск\r\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\r\n\t\t}\r\n\t});\r\n\r\n\t// отложенный поиск при вводе текста\r\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\r\n}\r\n\r\nconst onScrollContentList = (e: Event) => {\r\n\tconst el = e.target as HTMLElement;\r\n\r\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\r\n\t\tAPI.loadAppend();\r\n\t}\r\n};\r\n\r\nconst onClose = () => {\r\n\tisOpened.value = false;\r\n\r\n\telRef.value?.focus();\r\n\r\n\tif (searchText.value) resetSearch();\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<TopPopup\r\n\t\tref=\"popupRef\"\r\n\t\t@open=\"isOpened = true\"\r\n\t\t@close=\"onClose()\"\r\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\r\n\t\t:notch=\"false\"\r\n\t\t:transitionDuration=\"0\"\r\n\t>\r\n\t\t<template #opener>\r\n\t\t\t<div\r\n\t\t\t\tref=\"elRef\"\r\n\t\t\t\tv-top-focus.onupdate=\"isError\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t'top-selector2' : true,\r\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\r\n\t\t\t\t\t['top-size_' + size]: true,\r\n\t\t\t\t\t['top-disabled']: disabled,\r\n\t\t\t\t\t['top-forms-focusable']: !disabled,\r\n\t\t\t\t\t['top-error']: isError,\r\n\t\t\t\t}\"\r\n\t\t\t\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\r\n\t\t\t\t@keydown.delete=\"model = []\"\r\n\t\t\t\ttabindex=\"0\"\r\n\t\t\t>\r\n\t\t\t\t<template v-if=\"multiselect\">\r\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\r\n\t\t\t\t\t\t<Selector2ItemMulti\r\n\t\t\t\t\t\t\tv-for=\"item of model as Array<Item>\"\r\n\t\t\t\t\t\t\t:id=\"item.id\"\r\n\t\t\t\t\t\t\t:name=\"item.name\"\r\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</template>\r\n\r\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\r\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\r\n\t\t\t\t</span>\r\n\r\n\t\t\t\t<span\r\n\t\t\t\t\tv-if=\"addChanger && !multiselect && localItems.length > 1 && !disabled\"\r\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\r\n\t\t\t\t\t@click.stop=\"selectNextItem\"\r\n\t\t\t\t></span>\r\n\t\t\t</div>\r\n\t\t</template>\r\n\r\n\t\t<template #widget>\r\n\t\t\t<TopPopupWidgetInput\r\n\t\t\t\ttitle=\"Поиск\"\r\n\t\t\t\ticon=\"\"\r\n\t\t\t\tv-model=\"searchText\"\r\n\t\t\t\t:isLoading=\"isLoading\"\r\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\r\n\t\t\t/>\r\n\t\t</template>\r\n\r\n\t\t<template #contentList>\r\n\t\t\t<TopPopupListItem\r\n\t\t\t\tv-for=\"item of itemsForShow\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.name === item.name\r\n\t\t\t\t}\"\r\n\t\t\t\t:key=\"item.id ?? undefined\"\r\n\t\t\t\t@click.stop=\"selectItem(item)\"\r\n\t\t\t>\r\n\t\t\t\t<slot\r\n\t\t\t\t\tv-if=\"$slots.item\"\r\n\t\t\t\t\tname=\"item\"\r\n\t\t\t\t\t:item=\"item\"\r\n\t\t\t\t></slot>\r\n\r\n\t\t\t\t<template\r\n\t\t\t\t\tv-else\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ item.name }}\r\n\t\t\t\t</template>\r\n\t\t\t</TopPopupListItem>\r\n\r\n\t\t\t<TopPopupListItem\r\n\t\t\t\tv-if=\"!isLoading && !itemsForShow.length\"\r\n\t\t\t\ttype=\"regular\"\r\n\t\t\t>\r\n\t\t\t\t{{ $i18n.Common.No_results }}\r\n\t\t\t</TopPopupListItem>\r\n\t\t</template>\r\n\t</TopPopup>\r\n</template>\r\n\r\n<style>\r\n.top-selector2 {\r\n\twidth: 180px;\r\n\tmin-height: var(--top-forms-base-height);\r\n\tbox-sizing: border-box;\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\toverflow: hidden;\r\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\r\n\tcolor: var(--top-forms-placeholder-color);\r\n\r\n\tborder-radius: var(--top-radius-2);\r\n\tborder: 1px solid var(--top-forms-border-color);\r\n\tbackground: var(--top-forms-background-color);\r\n}\r\n\r\n.top-selector2-multiselect {\r\n\twidth: unset;\r\n\tmin-width: 180px;\r\n\tpadding: var(--top-padding-1);\r\n}\r\n\r\n.top-selector2.top-active {\r\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\r\n}\r\n\r\n.top-selector2_activeItems {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\tgap: var(--top-padding-1);\r\n\tmax-width: 100%;\r\n}\r\n\r\n.top-selector2_activeName {\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.top-changer-selector {\r\n\ttransform: translateX(-16px);\r\n}\r\n</style>\r\n","import type { ComponentCustomProps } from 'vue';\r\n\r\nimport EditArea from './editArea/editArea.vue';\r\nimport EditInput from './editInput/editInput.vue';\r\nimport RadioGroup from './radioGroup/radioGroup.vue';\r\nimport Selector2 from './selector2/selector2.vue';\r\nimport Menu from './menu/menu.vue';\r\nimport Info from './info/info.vue';\r\n\r\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\r\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\r\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\r\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\r\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\r\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\r\n"],"names":["isChanged","vue","localValue","props","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","items","isLoading","_nextOffset","apiRequest","res","cacheKey","indexWithError","_searchText","callAPIRequest","loadAppend","searchText","minLength","loadDebounce","API","forms","popupRef","useAPI","localItems","itemAll","itemSelected","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","isSelected","selectItem","newModel","getPopup","resetSearch","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","TopEditArea","_sfc_main$5","TopEditInput","_sfc_main$4","TopRadioGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main"],"mappings":"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"}
|