@topvisor/ui 1.0.18-ux-5 → 1.0.19
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/{datepicker-C-QFv8Wm.es.js → datepicker-B8O5mg_G.es.js} +2 -2
- package/.chunks/{datepicker-C-QFv8Wm.es.js.map → datepicker-B8O5mg_G.es.js.map} +1 -1
- package/.chunks/{datepicker-QG5NqyHa.amd.js → datepicker-CFiizYlZ.amd.js} +2 -2
- package/.chunks/{datepicker-QG5NqyHa.amd.js.map → datepicker-CFiizYlZ.amd.js.map} +1 -1
- package/.chunks/{utils-BBVRN-KU.amd.js → dialogs.vue_vue_type_script_setup_true_lang-B55gllXV.amd.js} +2 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-B55gllXV.amd.js.map +1 -0
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BkBYW0yR.es.js +266 -0
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BkBYW0yR.es.js.map +1 -0
- package/.chunks/forms-BWc2kMFD.amd.js +3 -0
- package/.chunks/forms-BWc2kMFD.amd.js.map +1 -0
- package/.chunks/{forms-BeCSWhdZ.es.js → forms-DW_XLzg8.es.js} +264 -241
- package/.chunks/forms-DW_XLzg8.es.js.map +1 -0
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-BC88J71B.amd.js → listItem.vue_vue_type_script_setup_true_lang-naMiJruI.amd.js} +2 -2
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-BC88J71B.amd.js.map → listItem.vue_vue_type_script_setup_true_lang-naMiJruI.amd.js.map} +1 -1
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DN-pHrhc.es.js → listItem.vue_vue_type_script_setup_true_lang-saYIC17M.es.js} +2 -2
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DN-pHrhc.es.js.map → listItem.vue_vue_type_script_setup_true_lang-saYIC17M.es.js.map} +1 -1
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-RE6Dl4Gd.amd.js → menu.vue_vue_type_style_index_0_lang-06YUloqb.amd.js} +2 -2
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-RE6Dl4Gd.amd.js.map → menu.vue_vue_type_style_index_0_lang-06YUloqb.amd.js.map} +1 -1
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-BNzX8C8v.es.js → menu.vue_vue_type_style_index_0_lang-CcspstQc.es.js} +2 -2
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-BNzX8C8v.es.js.map → menu.vue_vue_type_style_index_0_lang-CcspstQc.es.js.map} +1 -1
- package/.chunks/{notice-zqNsNusv.es.js → notice-BQyuy4nF.es.js} +2 -2
- package/.chunks/{notice-zqNsNusv.es.js.map → notice-BQyuy4nF.es.js.map} +1 -1
- package/.chunks/{notice-D41sY-7B.amd.js → notice-zADfJ5TR.amd.js} +2 -2
- package/.chunks/{notice-D41sY-7B.amd.js.map → notice-zADfJ5TR.amd.js.map} +1 -1
- package/.chunks/{popup-CnEewIWQ.amd.js → popup-CPS-7fSX.amd.js} +2 -2
- package/.chunks/popup-CPS-7fSX.amd.js.map +1 -0
- package/.chunks/{popup-CYjUUTBV.es.js → popup-DsVptZvL.es.js} +6 -7
- package/.chunks/popup-DsVptZvL.es.js.map +1 -0
- package/.chunks/utils-B75aamxF.amd.js +2 -0
- package/.chunks/utils-B75aamxF.amd.js.map +1 -0
- package/.chunks/utils-DIP-BdDy.es.js +225 -0
- package/.chunks/utils-DIP-BdDy.es.js.map +1 -0
- package/.chunks/utils-DfYj3r9i.amd.js +2 -0
- package/.chunks/utils-DfYj3r9i.amd.js.map +1 -0
- package/.chunks/utils-h5v4GPgp.es.js +79 -0
- package/.chunks/utils-h5v4GPgp.es.js.map +1 -0
- package/assets/charts.css +1 -1
- package/assets/core.css +1 -1
- package/assets/formsExt.css +1 -1
- package/assets/notice.css +1 -1
- package/charts/charts.amd.js +1 -1
- package/charts/charts.js +1 -1
- package/components/dialog/dialog/dialog.vue.d.ts +1 -1
- package/components/dialog/dialog/page/types.d.ts +7 -0
- package/components/popup/lib/popup.d.ts +2 -3
- package/components/popup/lib/worker.d.ts +7 -7
- package/components/project/selectorRegion/utils/consts.d.ts +0 -2
- package/components/project/tagSelector/tagSelector.vue.d.ts +2 -2
- package/core/app.amd.js +1 -1
- package/core/app.amd.js.map +1 -1
- package/core/app.js +5 -5
- package/core/core/core.d.ts +2 -0
- package/core/core/preloaders.d.ts +19 -0
- package/core/plugins/i18n.d.ts +13 -3
- package/core/utils/searchers.d.ts +0 -2
- package/dialog/dialog.amd.js +1 -1
- package/dialog/dialog.amd.js.map +1 -1
- package/dialog/dialog.js +61 -55
- package/dialog/dialog.js.map +1 -1
- package/forms/forms.amd.js +1 -1
- package/forms/forms.js +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +81 -78
- package/formsExt/formsExt.js.map +1 -1
- 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 +2 -1
- package/popup/popup.amd.js +1 -1
- package/popup/popup.js +2 -2
- package/popup/worker.amd.js +1 -1
- package/popup/worker.amd.js.map +1 -1
- package/popup/worker.js +3 -3
- 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 +19 -21
- package/project/project.js.map +1 -1
- package/tabsView/tabsView.amd.js +1 -1
- package/tabsView/tabsView.js +1 -1
- package/utils/clipboard.amd.js +1 -1
- package/utils/clipboard.js +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/lodash.amd.js +1 -1
- package/utils/lodash.js +1 -1
- package/utils/price.amd.js +1 -1
- package/utils/price.js +1 -1
- package/utils/searchers.amd.js +1 -1
- package/utils/searchers.amd.js.map +1 -1
- package/utils/searchers.js +0 -2
- package/utils/searchers.js.map +1 -1
- package/utils/string.amd.js +1 -1
- package/utils/string.js +1 -1
- package/.chunks/forms-BeCSWhdZ.es.js.map +0 -1
- package/.chunks/forms-DYuU936i.amd.js +0 -3
- package/.chunks/forms-DYuU936i.amd.js.map +0 -1
- package/.chunks/popup-CYjUUTBV.es.js.map +0 -1
- package/.chunks/popup-CnEewIWQ.amd.js.map +0 -1
- package/.chunks/utils-BBVRN-KU.amd.js.map +0 -1
- package/.chunks/utils-ByeZ1FPX.amd.js +0 -2
- package/.chunks/utils-ByeZ1FPX.amd.js.map +0 -1
- package/.chunks/utils-Cbdb1gth.es.js +0 -223
- package/.chunks/utils-Cbdb1gth.es.js.map +0 -1
- package/.chunks/utils-DFkcW3nI.es.js +0 -338
- package/.chunks/utils-DFkcW3nI.es.js.map +0 -1
|
@@ -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\n// TODO: добавить переменную top-forms-fixed-height и использовать ее при добавлении отступов у страницы\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\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\tmargin-bottom: env(keyboard-inset-height, 0);\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\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\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\n\t\t\t// сбросить введенный текст\n\t\t\tif (searchText.value) {\n\t\t\t\tsearchText.value = '';\n\t\t\t\tAPI.items.value = [];\n\t\t\t}\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\t// сбросить введенный текст, только если больше не найдено результатов\n\t\t\t\tif (searchText.value) {\n\t\t\t\t\tif (!itemsForShow.value.length) {\n\t\t\t\t\t\tsearchText.value = '';\n\t\t\t\t\t\tAPI.items.value = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (props.apiRequest) {\n\t\t\t\t\t\t\tisLoading.value = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\t// сбросить введенный текст\n\t\tif (searchText.value) {\n\t\t\tsearchText.value = '';\n\t\t\tAPI.items.value = [];\n\t\t}\n\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</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"isOpened = false, elRef?.focus()\"\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.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\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\t--top-forms-background-color: var(--top-forms-background-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","forms","popupRef","API","useAPI","localItems","itemAll","itemSelected","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","isSelected","selectItem","newModel","getPopup","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\">\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\n// TODO: добавить переменную top-forms-fixed-height и использовать ее при добавлении отступов у страницы\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\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\tmargin-bottom: env(keyboard-inset-height, 0);\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\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\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\n\t\t\t// сбросить введенный текст\n\t\t\tif (searchText.value) {\n\t\t\t\tsearchText.value = '';\n\t\t\t\tAPI.items.value = [];\n\t\t\t}\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\t// сбросить введенный текст, только если больше не найдено результатов\n\t\t\t\tif (searchText.value) {\n\t\t\t\t\tif (!itemsForShow.value.length) {\n\t\t\t\t\t\tsearchText.value = '';\n\t\t\t\t\t\tAPI.items.value = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (props.apiRequest) {\n\t\t\t\t\t\t\tisLoading.value = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\t// сбросить введенный текст\n\t\tif (searchText.value) {\n\t\t\tsearchText.value = '';\n\t\t\tAPI.items.value = [];\n\t\t}\n\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</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"isOpened = false, elRef?.focus()\"\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","forms","popupRef","API","useAPI","localItems","itemAll","itemSelected","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","isSelected","selectItem","newModel","getPopup","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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"}
|
package/formsExt/formsExt.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Core as q } from "../core/app.js";
|
|
2
|
-
import { defineComponent as
|
|
3
|
-
import { x as le, _ as F, c as ae, s as se, a as ne, C as re } from "../.chunks/forms-
|
|
2
|
+
import { defineComponent as _, ref as V, computed as z, openBlock as p, createElementBlock as v, normalizeClass as C, toDisplayString as w, createCommentVNode as A, createElementVNode as E, createVNode as R, withKeys as B, withModifiers as S, createBlock as k, withCtx as $, createTextVNode as L, watch as I, toRef as ee, mergeProps as X, mergeModels as G, useModel as j, Fragment as N, renderList as D, withDirectives as Q, vModelRadio as te, resolveDirective as oe, unref as O, renderSlot as H } from "vue";
|
|
3
|
+
import { x as le, _ as F, c as ae, s as se, a as ne, C as re } from "../.chunks/forms-DW_XLzg8.es.js";
|
|
4
4
|
import { invertKeyboardLayout as ie } from "../utils/keyboard.js";
|
|
5
5
|
import { TopPopup as ue, TopPopupWidgetInput as de, TopPopupListItem as Y } from "../popup/popup.js";
|
|
6
|
-
import { _ as pe } from "../.chunks/menu.vue_vue_type_style_index_0_lang-
|
|
6
|
+
import { _ as pe } from "../.chunks/menu.vue_vue_type_style_index_0_lang-CcspstQc.es.js";
|
|
7
7
|
const x = ["../assets/formsExt.css"].map((n) => import.meta.resolve(n));
|
|
8
8
|
q.insertCSSLinkToPage(x, !0);
|
|
9
|
-
const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */
|
|
9
|
+
const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
10
10
|
__name: "editArea",
|
|
11
11
|
props: {
|
|
12
12
|
defaultValue: { default: "" },
|
|
@@ -30,10 +30,10 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
30
30
|
},
|
|
31
31
|
emits: ["submit", "close", "clickOnTitle"],
|
|
32
32
|
setup(n, { emit: a }) {
|
|
33
|
-
const e = n, l = a, f = V(e.defaultValue), y = V(e.isFocused),
|
|
33
|
+
const e = n, l = a, f = V(e.defaultValue), y = V(e.isFocused), d = z(() => f.value !== e.defaultValue), c = z(() => e.attachToKeyboard ? "" : e.forceShowCloseBtn && !d.value ? e.closeText : e.cancelText), r = (i) => {
|
|
34
34
|
l("submit", i), f.value = e.defaultValue;
|
|
35
35
|
}, h = () => {
|
|
36
|
-
if (e.forceShowCloseBtn && !
|
|
36
|
+
if (e.forceShowCloseBtn && !d.value) {
|
|
37
37
|
l("close");
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
@@ -52,7 +52,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
52
52
|
class: "top-editArea_title",
|
|
53
53
|
onClick: o[0] || (o[0] = (g) => T())
|
|
54
54
|
}, w(i.title), 1)) : A("", !0),
|
|
55
|
-
|
|
55
|
+
E("div", {
|
|
56
56
|
class: C({
|
|
57
57
|
"top-editArea_form": !0,
|
|
58
58
|
"top-error": i.isError,
|
|
@@ -75,31 +75,31 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
75
75
|
onFocus: o[2] || (o[2] = () => y.value = !0),
|
|
76
76
|
onBlur: o[3] || (o[3] = () => y.value = !1),
|
|
77
77
|
onKeyup: [
|
|
78
|
-
|
|
79
|
-
o[4] || (o[4] =
|
|
78
|
+
B(h, ["esc"]),
|
|
79
|
+
o[4] || (o[4] = B(S((g) => r(f.value), ["ctrl"]), ["enter"]))
|
|
80
80
|
]
|
|
81
81
|
}, null, 8, ["modelValue", "name", "placeholder", "rows", "minHeight", "expandable", "disabled", "readonly", "isError", "hint"]),
|
|
82
|
-
|
|
83
|
-
!i.attachToKeyboard && (
|
|
82
|
+
E("div", ce, [
|
|
83
|
+
!i.attachToKeyboard && (d.value || i.forceShowCloseBtn) ? (p(), k(F, {
|
|
84
84
|
key: 0,
|
|
85
85
|
class: "top-editArea_button",
|
|
86
86
|
color: "theme",
|
|
87
87
|
styling: "soft",
|
|
88
88
|
onClick: h
|
|
89
89
|
}, {
|
|
90
|
-
default:
|
|
91
|
-
|
|
90
|
+
default: $(() => [
|
|
91
|
+
L(w(c.value), 1)
|
|
92
92
|
]),
|
|
93
93
|
_: 1
|
|
94
94
|
})) : A("", !0),
|
|
95
|
-
|
|
95
|
+
d.value ? (p(), k(F, {
|
|
96
96
|
key: 1,
|
|
97
97
|
class: "top-editArea_button",
|
|
98
98
|
icon: i.attachToKeyboard ? "" : "",
|
|
99
99
|
onClick: o[5] || (o[5] = (g) => r(f.value))
|
|
100
100
|
}, {
|
|
101
|
-
default:
|
|
102
|
-
|
|
101
|
+
default: $(() => [
|
|
102
|
+
L(w(i.attachToKeyboard ? "" : i.submitText), 1)
|
|
103
103
|
]),
|
|
104
104
|
_: 1
|
|
105
105
|
}, 8, ["icon"])) : A("", !0)
|
|
@@ -107,7 +107,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
107
107
|
], 2)
|
|
108
108
|
], 2));
|
|
109
109
|
}
|
|
110
|
-
}), fe = { class: "top-editInput" }, ve = /* @__PURE__ */
|
|
110
|
+
}), fe = { class: "top-editInput" }, ve = /* @__PURE__ */ _({
|
|
111
111
|
__name: "editInput",
|
|
112
112
|
props: {
|
|
113
113
|
modelValue: {},
|
|
@@ -123,24 +123,24 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
123
123
|
const f = a, y = () => {
|
|
124
124
|
f("update:modelValue", l.value);
|
|
125
125
|
};
|
|
126
|
-
return (
|
|
127
|
-
R(ae, X(
|
|
128
|
-
onKeydownCapture: c[0] || (c[0] =
|
|
129
|
-
onKeydown:
|
|
126
|
+
return (d, c) => (p(), v("div", fe, [
|
|
127
|
+
R(ae, X(d.input, {
|
|
128
|
+
onKeydownCapture: c[0] || (c[0] = B(S((r) => l.value = d.modelValue, ["stop"]), ["esc"])),
|
|
129
|
+
onKeydown: B(S(y, ["stop"]), ["enter"]),
|
|
130
130
|
modelValue: l.value,
|
|
131
131
|
"onUpdate:modelValue": c[1] || (c[1] = (r) => l.value = r)
|
|
132
132
|
}), null, 16, ["onKeydown", "modelValue"]),
|
|
133
|
-
l.value !==
|
|
133
|
+
l.value !== d.modelValue ? (p(), k(F, X({
|
|
134
134
|
key: 0,
|
|
135
135
|
icon: "",
|
|
136
136
|
styling: "soft"
|
|
137
|
-
},
|
|
137
|
+
}, d.button, { onClick: y }), null, 16)) : A("", !0)
|
|
138
138
|
]));
|
|
139
139
|
}
|
|
140
140
|
}), ye = ["data-top-icon", "onClick"], he = {
|
|
141
141
|
key: 0,
|
|
142
142
|
class: "top-radioGroup_circle"
|
|
143
|
-
}, ge = ["value", "disabled"], be = /* @__PURE__ */
|
|
143
|
+
}, ge = ["value", "disabled"], be = /* @__PURE__ */ _({
|
|
144
144
|
__name: "radioGroup",
|
|
145
145
|
props: /* @__PURE__ */ G({
|
|
146
146
|
modelValue: {},
|
|
@@ -158,21 +158,21 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
158
158
|
setup(n, { emit: a }) {
|
|
159
159
|
const e = j(n, "modelValue"), l = n, f = V(null);
|
|
160
160
|
I(e, () => {
|
|
161
|
-
var
|
|
162
|
-
(
|
|
161
|
+
var d, c, r, h, T;
|
|
162
|
+
(d = l.radiosProps) != null && d.some((i) => i.value === e.value) || (e.value = ((r = (c = l.radiosProps) == null ? void 0 : c[0]) == null ? void 0 : r.value) ?? ""), (T = (h = f.value) == null ? void 0 : h.querySelector(".radioGroup_item-selected")) == null || T.scrollIntoView();
|
|
163
163
|
}, { immediate: !0 });
|
|
164
164
|
const y = "radioGroup-" + Math.random();
|
|
165
|
-
return (
|
|
165
|
+
return (d, c) => (p(), v("div", {
|
|
166
166
|
ref_key: "elRef",
|
|
167
167
|
ref: f,
|
|
168
168
|
class: C({
|
|
169
169
|
"top-radioGroup": !0,
|
|
170
170
|
"top-scrollBarXHidding": !0,
|
|
171
|
-
["top-size_" +
|
|
172
|
-
"top-error":
|
|
171
|
+
["top-size_" + d.size]: !!d.size,
|
|
172
|
+
"top-error": d.isError
|
|
173
173
|
})
|
|
174
174
|
}, [
|
|
175
|
-
(p(!0), v(N, null, D(
|
|
175
|
+
(p(!0), v(N, null, D(d.radiosProps, (r) => (p(), v("label", {
|
|
176
176
|
class: C({
|
|
177
177
|
"top-radioGroup_item-selected": r.value === e.value,
|
|
178
178
|
"top-radioGroup_item": !0,
|
|
@@ -182,9 +182,9 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
182
182
|
"data-top-icon": r.icon,
|
|
183
183
|
onClick: (h) => e.value = r.value
|
|
184
184
|
}, [
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
Q(
|
|
185
|
+
L(w(r.title) + " ", 1),
|
|
186
|
+
d.showIndicator ? (p(), v("span", he)) : A("", !0),
|
|
187
|
+
Q(E("input", {
|
|
188
188
|
"onUpdate:modelValue": c[0] || (c[0] = (h) => e.value = h),
|
|
189
189
|
name: y,
|
|
190
190
|
type: "radio",
|
|
@@ -201,7 +201,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
201
201
|
}
|
|
202
202
|
}), Ve = (n, a, e) => {
|
|
203
203
|
const l = V([]), f = V(!1);
|
|
204
|
-
let y = "",
|
|
204
|
+
let y = "", d;
|
|
205
205
|
n && !n.params.limit && (n.params.limit = 100);
|
|
206
206
|
const c = async () => {
|
|
207
207
|
if (!n) return;
|
|
@@ -223,12 +223,12 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
223
223
|
if (!n) return;
|
|
224
224
|
n.params.offset = 0, n.params.search = y;
|
|
225
225
|
const o = await c();
|
|
226
|
-
o && (
|
|
226
|
+
o && (d = o.nextOffset, l.value = o.result);
|
|
227
227
|
}, h = async () => {
|
|
228
|
-
if (!n || !
|
|
229
|
-
n.params.offset =
|
|
228
|
+
if (!n || !d || f.value) return;
|
|
229
|
+
n.params.offset = d, n.params.search = y;
|
|
230
230
|
const o = await c();
|
|
231
|
-
o && (
|
|
231
|
+
o && (d = o.nextOffset, l.value = l.value.concat(o.result));
|
|
232
232
|
}, T = se(() => r(), 200);
|
|
233
233
|
return {
|
|
234
234
|
items: l,
|
|
@@ -238,7 +238,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
238
238
|
n && (o.length < a || o === y && l.value.length || (y = o, g ? T() : r()));
|
|
239
239
|
}
|
|
240
240
|
};
|
|
241
|
-
}, Ae = { class: "top-selector2_itemMulti top-ellipsis" }, Te = /* @__PURE__ */
|
|
241
|
+
}, Ae = { class: "top-selector2_itemMulti top-ellipsis" }, Te = /* @__PURE__ */ _({
|
|
242
242
|
__name: "itemMulti",
|
|
243
243
|
props: {
|
|
244
244
|
id: {},
|
|
@@ -247,8 +247,8 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
247
247
|
emits: ["delete"],
|
|
248
248
|
setup(n) {
|
|
249
249
|
return (a, e) => (p(), v("div", Ae, [
|
|
250
|
-
|
|
251
|
-
|
|
250
|
+
L(w(a.name) + " ", 1),
|
|
251
|
+
E("span", {
|
|
252
252
|
class: "top-selector2_itemMultiDelete",
|
|
253
253
|
"data-top-icon": "",
|
|
254
254
|
onClick: e[0] || (e[0] = (l) => a.$emit("delete", a.id)),
|
|
@@ -263,7 +263,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
263
263
|
}, we = {
|
|
264
264
|
key: 1,
|
|
265
265
|
class: "top-selector2_activeName top-ellipsis"
|
|
266
|
-
},
|
|
266
|
+
}, $e = /* @__PURE__ */ _({
|
|
267
267
|
__name: "selector2",
|
|
268
268
|
props: /* @__PURE__ */ G({
|
|
269
269
|
modelValue: {},
|
|
@@ -289,7 +289,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
289
289
|
const a = n, e = j(n, "modelValue"), l = V(""), f = {
|
|
290
290
|
id: 0,
|
|
291
291
|
name: ne().Common.All
|
|
292
|
-
}, y = V(null),
|
|
292
|
+
}, y = V(null), d = V(null), c = () => {
|
|
293
293
|
var t;
|
|
294
294
|
return (t = y.value) == null ? void 0 : t.popup;
|
|
295
295
|
};
|
|
@@ -306,13 +306,13 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
306
306
|
}), T = (t, s = !0) => s && t.id === null ? Array.isArray(e.value) ? e.value.some((m) => m.id === t.id && m.name === t.name) : t.name === e.value.name : Array.isArray(e.value) ? e.value.some((m) => m.id === t.id) : t.id === e.value.id, i = z(() => {
|
|
307
307
|
const t = l.value.toLowerCase(), s = ie(t);
|
|
308
308
|
let m = [];
|
|
309
|
-
return h.value.forEach((
|
|
310
|
-
const b =
|
|
311
|
-
(
|
|
309
|
+
return h.value.forEach((u) => {
|
|
310
|
+
const b = u.name.toLowerCase();
|
|
311
|
+
(u.id === Number(t) || b.includes(t) || b.includes(s)) && (b === t || b === s ? m.unshift(u) : m.push(u));
|
|
312
312
|
}), m.push(...r.items.value), a.appendSearchToResult && l.value && (!m.length || m[0].name.toLowerCase() !== t) && m.push({
|
|
313
313
|
id: null,
|
|
314
314
|
name: l.value
|
|
315
|
-
}), a.multiselect && (m = m.filter((
|
|
315
|
+
}), a.multiselect && (m = m.filter((u) => !T(u))), m;
|
|
316
316
|
}), o = V(r.isLoading.value);
|
|
317
317
|
I(r.isLoading, () => {
|
|
318
318
|
o.value = r.isLoading.value;
|
|
@@ -323,8 +323,8 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
323
323
|
if (!Array.isArray(e.value) || T(t))
|
|
324
324
|
return;
|
|
325
325
|
a.apiRequest && l.value && (o.value = !0);
|
|
326
|
-
const
|
|
327
|
-
|
|
326
|
+
const u = [...e.value];
|
|
327
|
+
u.push({ ...t }), e.value = u, re.state.isMobile ? ((s = c()) == null || s.close(), l.value && (l.value = "", r.items.value = [])) : setTimeout(() => {
|
|
328
328
|
var b, U, W, J;
|
|
329
329
|
(b = c()) == null || b.recalcPosition(), (J = (W = (U = c()) == null ? void 0 : U.elPopupWidget) == null ? void 0 : W.querySelector("input")) == null || J.focus(), l.value && (i.value.length ? a.apiRequest && (o.value = !1) : (l.value = "", r.items.value = []));
|
|
330
330
|
});
|
|
@@ -350,22 +350,22 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
350
350
|
};
|
|
351
351
|
return (t, s) => {
|
|
352
352
|
const m = oe("top-focus");
|
|
353
|
-
return p(),
|
|
353
|
+
return p(), k(O(ue), {
|
|
354
354
|
ref_key: "popupRef",
|
|
355
355
|
ref: y,
|
|
356
|
-
onOpen: s[
|
|
357
|
-
onClose: s[
|
|
356
|
+
onOpen: s[3] || (s[3] = (u) => M.value = !0),
|
|
357
|
+
onClose: s[4] || (s[4] = (u) => {
|
|
358
358
|
var b;
|
|
359
|
-
return M.value = !1, (b =
|
|
359
|
+
return M.value = !1, (b = d.value) == null ? void 0 : b.focus();
|
|
360
360
|
}),
|
|
361
|
-
onScrollContentList: s[
|
|
361
|
+
onScrollContentList: s[5] || (s[5] = (u) => t.apiRequest ? Z(u) : void 0),
|
|
362
362
|
notch: !1,
|
|
363
363
|
transitionDuration: 0
|
|
364
364
|
}, {
|
|
365
|
-
opener:
|
|
365
|
+
opener: $(() => [
|
|
366
366
|
Q((p(), v("div", {
|
|
367
367
|
ref_key: "elRef",
|
|
368
|
-
ref:
|
|
368
|
+
ref: d,
|
|
369
369
|
class: C({
|
|
370
370
|
"top-selector2": !0,
|
|
371
371
|
"top-selector2-multiselect": t.multiselect,
|
|
@@ -374,13 +374,16 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
374
374
|
"top-forms-focusable": !t.disabled,
|
|
375
375
|
"top-error": t.isError
|
|
376
376
|
}),
|
|
377
|
-
onKeydown:
|
|
377
|
+
onKeydown: [
|
|
378
|
+
s[0] || (s[0] = B(S((u) => u.currentTarget.click(), ["stop", "prevent"]), ["up", "down", "enter", "space"])),
|
|
379
|
+
s[1] || (s[1] = B((u) => e.value = [], ["delete"]))
|
|
380
|
+
],
|
|
378
381
|
tabindex: "0"
|
|
379
382
|
}, [
|
|
380
383
|
t.multiselect ? (p(), v("div", Ce, [
|
|
381
|
-
(p(!0), v(N, null, D(e.value, (
|
|
382
|
-
id:
|
|
383
|
-
name:
|
|
384
|
+
(p(!0), v(N, null, D(e.value, (u) => (p(), k(Te, {
|
|
385
|
+
id: u.id,
|
|
386
|
+
name: u.name,
|
|
384
387
|
onDelete: P
|
|
385
388
|
}, null, 8, ["id", "name"]))), 256))
|
|
386
389
|
])) : A("", !0),
|
|
@@ -399,40 +402,40 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
399
402
|
]
|
|
400
403
|
])
|
|
401
404
|
]),
|
|
402
|
-
widget:
|
|
405
|
+
widget: $(() => [
|
|
403
406
|
R(O(de), {
|
|
404
407
|
title: "Поиск",
|
|
405
408
|
icon: "",
|
|
406
409
|
modelValue: l.value,
|
|
407
|
-
"onUpdate:modelValue": s[
|
|
410
|
+
"onUpdate:modelValue": s[2] || (s[2] = (u) => l.value = u),
|
|
408
411
|
isLoading: o.value,
|
|
409
412
|
placeholder: !Array.isArray(e.value) && !t.multiselect && t.showSelectedInInput ? e.value.name : t.placeholder
|
|
410
413
|
}, null, 8, ["modelValue", "isLoading", "placeholder"])
|
|
411
414
|
]),
|
|
412
|
-
contentList:
|
|
413
|
-
(p(!0), v(N, null, D(i.value, (
|
|
415
|
+
contentList: $(() => [
|
|
416
|
+
(p(!0), v(N, null, D(i.value, (u) => (p(), k(O(Y), {
|
|
414
417
|
class: C({
|
|
415
|
-
"top-active": !Array.isArray(e.value) && !t.multiselect && e.value.name ===
|
|
418
|
+
"top-active": !Array.isArray(e.value) && !t.multiselect && e.value.name === u.name
|
|
416
419
|
}),
|
|
417
|
-
key:
|
|
418
|
-
onClick: S((b) => g(
|
|
420
|
+
key: u.id ?? void 0,
|
|
421
|
+
onClick: S((b) => g(u), ["stop"])
|
|
419
422
|
}, {
|
|
420
|
-
default:
|
|
423
|
+
default: $(() => [
|
|
421
424
|
t.$slots.item ? H(t.$slots, "item", {
|
|
422
425
|
key: 0,
|
|
423
|
-
item:
|
|
426
|
+
item: u
|
|
424
427
|
}) : (p(), v(N, { key: 1 }, [
|
|
425
|
-
|
|
428
|
+
L(w(u.name), 1)
|
|
426
429
|
], 64))
|
|
427
430
|
]),
|
|
428
431
|
_: 2
|
|
429
432
|
}, 1032, ["class", "onClick"]))), 128)),
|
|
430
|
-
!o.value && !i.value.length ? (p(),
|
|
433
|
+
!o.value && !i.value.length ? (p(), k(O(Y), {
|
|
431
434
|
key: 0,
|
|
432
435
|
type: "regular"
|
|
433
436
|
}, {
|
|
434
|
-
default:
|
|
435
|
-
|
|
437
|
+
default: $(() => [
|
|
438
|
+
L(w(t.$i18n.Common.No_results), 1)
|
|
436
439
|
]),
|
|
437
440
|
_: 1
|
|
438
441
|
})) : A("", !0)
|
|
@@ -441,10 +444,10 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
441
444
|
}, 512);
|
|
442
445
|
};
|
|
443
446
|
}
|
|
444
|
-
}),
|
|
447
|
+
}), ke = ["data-top-icon"], Se = { class: "top-info_text" }, Ie = {
|
|
445
448
|
key: 0,
|
|
446
449
|
class: "top-info_value"
|
|
447
|
-
}, Be = /* @__PURE__ */
|
|
450
|
+
}, Be = /* @__PURE__ */ _({
|
|
448
451
|
__name: "info",
|
|
449
452
|
props: {
|
|
450
453
|
icon: {},
|
|
@@ -460,15 +463,15 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ L({
|
|
|
460
463
|
}),
|
|
461
464
|
"data-top-icon": a.icon
|
|
462
465
|
}, [
|
|
463
|
-
|
|
466
|
+
E("div", Se, [
|
|
464
467
|
H(a.$slots, "default")
|
|
465
468
|
]),
|
|
466
469
|
a.$slots.additional ? (p(), v("span", Ie, [
|
|
467
470
|
H(a.$slots, "additional")
|
|
468
471
|
])) : A("", !0)
|
|
469
|
-
], 10,
|
|
472
|
+
], 10, ke));
|
|
470
473
|
}
|
|
471
|
-
}), Oe = me, Ne = ve, ze = be, Ge =
|
|
474
|
+
}), Oe = me, Ne = ve, ze = be, Ge = $e, De = pe, He = Be;
|
|
472
475
|
export {
|
|
473
476
|
Oe as TopEditArea,
|
|
474
477
|
Ne as TopEditInput,
|