@topvisor/ui 1.1.0-apiClient.13 → 1.1.0-apiClient.26
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/index-BEI7XZmU.amd.js +2 -0
- package/.chunks/index-BEI7XZmU.amd.js.map +1 -0
- package/.chunks/index-igPkes8X.es.js +48 -0
- package/.chunks/index-igPkes8X.es.js.map +1 -0
- package/api/index.amd.js +1 -1
- package/api/index.amd.js.map +1 -1
- package/api/index.js +100 -92
- package/api/index.js.map +1 -1
- package/dialog/dialog.amd.js +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +338 -331
- package/formsExt/formsExt.js.map +1 -1
- package/package.json +2 -1
- package/popup/popup.amd.js +1 -1
- package/types/api/api/mocker/index.d.ts +9 -0
- package/types/api/api/types/api.d.ts +5 -5
- package/types/api/api/types/client/request.d.ts +6 -0
- package/types/api/api/types/field.d.ts +1 -1
- package/types/api/api/types/mocker.d.ts +106 -0
- package/types/api/api/utils/common.d.ts +1 -1
- package/types/api/api/utils/filters.d.ts +1 -1
- package/types/components/formsExt/selector2/composables/useAPI.d.ts +3 -15
- package/types/components/formsExt/selector2/types.d.ts +15 -19
package/formsExt/formsExt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/itemMulti.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/info/info.vue","../../src/components/formsExt/policy/policy.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 './types';\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 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-forms-focusable': true,\n\t\t\t\t'top-as-input': 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=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\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<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\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=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\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}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\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\talign-self: flex-end;\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: calc(var(--top-editArea-offset-bottom) + 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@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\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 } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\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.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","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\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>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { EmitsItemMulti, PropsItemMulti } from './types';\n\ndefineProps<PropsItemMulti>();\ndefineEmits<EmitsItemMulti>();\n</script>\n\n<template>\n\t<div class=\"top-selector2_itemMulti top-ellipsis\">\n\t\t{{ name }}\n\t\t<span\n\t\t\tclass=\"top-selector2_itemMultiDelete\"\n\t\t\tdata-top-icon=\"\"\n\t\t\t@click=\"$emit('delete', id)\"\n\t\t\t@mousedown.stop\n\t\t></span>\n\t</div>\n</template>\n\n<style>\n.top-selector2_itemMulti {\n\tbox-sizing: border-box;\n\tpadding-left: var(--top-padding-2);\n\tborder-radius: var(--top-radius-1, 4px);\n\tborder: 1px solid var(--color-line-primary-1);\n\tbackground: var(--color-layer-primary-2);\n\tmin-height: 22px;\n\tmax-width: 100%;\n\tcolor: var(--color-text-1);\n\tflex-grow: 0;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n.top-selector2_itemMultiDelete {\n\t--top-icon-size: 14px;\n\t--top-icon-width: 18px;\n\t--top-icon-color: var(--color-text-1);\n\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\theight: 100%;\n\tcursor: pointer;\n}\n\n.top-selector2_itemMultiDelete:hover {\n\tbackground: var(--color-layer-primary-2);\n}\n\n@media screen and (min-width: 900px) {\n\t.top-selector2.top-active .top-selector2_itemMultiDelete {\n\t\tz-index: calc(var(--top-popup-z-index) + 1);\n\t}\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\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: 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\tnextOffset = 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\tnextOffset = 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 *\n\t * @param newSearchText - текст поиска\n\t * @param useDebounce - дедупликация загрузки списка\n\t */\n\tconst setSearchTextAndLoad = (newSearchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (newSearchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (newSearchText === searchText && items.value.length) return;\n\n\t\tsearchText = newSearchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tsearchType: Ref<Props['searchType']>,\n\tminLength: number,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Является ли строка поиска достаточной длины для отображения меню\n\t */\n\tconst genIsShort = () => {\n\t\tif (!api.apiRequest) return false;\n\t\tif (searchType.value !== 'inline') return false;\n\t\tif (searchText.value.length >= minLength) return false;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\t/**\n\t * Выбрать элемент\n\t *\n\t * @param item Элемент для выбора\n\t */\n\tconst selectItem = (item: Item) => {\n\t\tif (multiselect && Array.isArray(model.value)) {\n\t\t\tif (!isSelected(model.value, item)) {\n\t\t\t\tmodel.value = [...model.value, item];\n\t\t\t}\n\t\t} else {\n\t\t\tmodel.value = item;\n\t\t}\n\t};\n\n\t/**\n\t * Выбрать следующее значение\n\t */\n\tconst selectNextItem = () => {\n\t\tif (!Array.isArray(model.value)) {\n\t\t\tconst currentIndex = itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\t\tconst nextIndex = (currentIndex + 1) % itemsForShow.value.length;\n\t\t\tmodel.value = { ...itemsForShow.value[nextIndex] };\n\t\t}\n\t};\n\n\t/**\n\t * Удалить выбранное значение по id\n\t *\n\t * @param id Идентификатор элемента для удаления\n\t */\n\tconst deleteItemById = async (id: Item['id']) => {\n\t\tif (Array.isArray(model.value)) {\n\t\t\tmodel.value = model.value.filter(item => item.id !== id);\n\t\t}\n\t};\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\tgenIsShort,\n\t\titems: localItems,\n\t\titemsForShow,\n\t\tselectItem,\n\t\tselectNextItem,\n\t\tdeleteItemById,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Item[],\n\tsize: 's',\n\tminLength: 0,\n\tsearchType: 'popup',\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\nconst searchTypeLocal = computed(() => {\n\t// multiselect не поддерживает inline ввода\n\tif (props.searchType === 'inline' && props.multiselect) return 'popup';\n\n\t// В мобильной версии popup работает в полноэкранном режиме\n\tif (props.searchType === 'inline' && Core.state.isMobile) return 'popup';\n\n\treturn props.searchType;\n});\n\nlet minLength = 0;\nif (searchTypeLocal.value === 'inline' && props.minLength) {\n\tminLength = props.minLength;\n}\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, minLength, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(\n\tmodel,\n\ttoRef(props, 'items'),\n\tprops.multiselect,\n\ttoRef(props, 'appendAllValue'),\n\ttoRef(props, 'appendSearchToResult'),\n\tsearchTypeLocal,\n\tminLength,\n\tapi,\n);\n\nconst component = computed(() => {\n\tif (props.buttonProps) return 'TopButton';\n\tif (searchTypeLocal.value === 'inline') return 'TopInput';\n\n\treturn 'div';\n});\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\nif (api.apiRequest) {\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => {\n\t\tapi.setSearchTextAndLoad(menu.searchText.value);\n\n\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\tif (menu.genIsShort()) {\n\t\t\t\tgetPopup()?.close();\n\t\t\t}\n\t\t}\n\t});\n}\n\nwatch(model, () => {\n\t/**\n\t * При изменении значения модели в режиме inline необходимо очистить поле поиска,\n\t * так как поиск больше не актуален после выбора значения\n\t */\n\tif (searchTypeLocal.value === 'inline') {\n\t\tmenu.resetSearch();\n\t}\n});\n\nconst placeholder = computed(() => {\n\tif (Array.isArray(model.value) || props.multiselect || !props.selectedAsPlaceholder && searchTypeLocal.value !== 'inline') {\n\t\treturn props.placeholder;\n\t}\n\n\treturn model.value?.name || props.placeholder;\n});\n\n/**\n * Обработчик ввода клавиш на кнопке или поле ввода\n */\nconst onOpenerKeydown = (e: KeyboardEvent) => {\n\tlet needOpen = false;\n\n\tswitch (e.key) {\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tmodel.value.pop();\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowRight':\n\t\tcase 'ArrowDown':\n\t\tcase 'ArrowLeft':\n\t\tcase 'Enter':\n\t\tcase ' ':\n\t\t\tneedOpen = true;\n\n\t\t\tbreak;\n\t\tcase 'Escape':\n\t\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\t\t// очистка введенного текста\n\t\t\t\tmenu.resetSearch();\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\t// введен символ\n\tconst symbolPressed = e.key.length === 1 && !e.ctrlKey && !e.metaKey;\n\n\t// введен символ\n\tif (searchTypeLocal.value === 'popup' || searchTypeLocal.value === 'inline') {\n\t\tif (symbolPressed) {\n\t\t\tneedOpen = true;\n\t\t}\n\t}\n\n\t// popup уже открыт\n\tif (getPopup()?.elPopup) {\n\t\tneedOpen = false;\n\t}\n\n\tif (needOpen) {\n\t\tif (searchTypeLocal.value === 'popup') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// введен символ\n\t\t\tif (symbolPressed) {\n\t\t\t\t// начало ввода, сразу ввести первый символ вместе с открытием popup\n\t\t\t\tif (!menu.searchText.value) {\n\t\t\t\t\tmenu.searchText.value = e.key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nlet disabledFocusToOpen = false;\n\nconst onFocus = (e: FocusEvent) => {\n\tif (disabledFocusToOpen) return;\n\n\tif (searchTypeLocal.value === 'inline') {\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nconst onClickChanger = (e: MouseEvent) => {\n\te.preventDefault();\n\n\tdisabledFocusToOpen = true;\n\t(e.currentTarget as HTMLElement)?.parentElement?.focus();\n\tdisabledFocusToOpen = false;\n\n\tmenu.selectNextItem();\n};\n\n/**\n * Обработчик открытия попапа\n */\nconst onOpen = () => {\n\tdisabledFocusToOpen = true;\n\n\tif (api.apiRequest) {\n\t\tif (menu.genIsShort()) {\n\t\t\tgetPopup()?.close();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// при открытии сразу выполнить поиск\n\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tsetTimeout(() => {\n\t\tdisabledFocusToOpen = false;\n\t}, 100);\n\n\t// очистка введенного текста\n\tif (searchTypeLocal.value === 'popup') {\n\t\tif (menu.searchText.value) menu.resetSearch();\n\t}\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\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\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tif (props.multiselect) {\n\t\t\t\tif (!Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\t\tname: 'Выбери меня',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = {\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ immediate: true },\n\t);\n\n\twatch(\n\t\t() => props.searchType,\n\t\t() => {\n\t\t\t// пауза для установки props в адресной строке\n\t\t\tsetTimeout(() => {\n\t\t\t\tlocation.reload();\n\t\t\t}, 500);\n\t\t},\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"onOpen()\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"searchTypeLocal !== 'inline'\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<component\n\t\t\t\t:is=\"component\"\n\n\t\t\t\t:=\"buttonProps\"\n\n\t\t\t\tref=\"subcomponentSelector\"\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-selector2-' + modificator]: !!modificator,\n\t\t\t\t\t'top-as-input': !buttonProps,\n\t\t\t\t\t'top-as-selector': true,\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\ttabindex=\"0\"\n\t\t\t\t@keydown=\"onOpenerKeydown\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\n\t\t\t\t:placeholder\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t@focus=\"onFocus\"\n\t\t\t\t@blur=\"getPopup()?.isClosed ? menu.resetSearch() : ''\"\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 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=\"menu.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=\"searchTypeLocal !== 'inline' && !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 v-if=\"multiselect && !model.length\" class=\"top-selector2_placeholder top-ellipsis\">\n\t\t\t\t\t{{ placeholder }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !buttonProps && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector top-popup_widget\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"onClickChanger\"\n\t\t\t\t></span>\n\t\t\t</component>\n\t\t</template>\n\n\t\t<template #widget v-if=\"searchTypeLocal === 'popup'\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t: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 menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"menu.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\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=\"!api.isLoading.value && !menu.itemsForShow.value.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\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (searchType !== 'popup' || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n}\n\n.top-selector2::placeholder,\n.top-selector2_placeholder {\n\tcolor: var(--color-text-2);\n}\n\n.top-selector2_placeholder {\n\tpadding-left: var(--top-padding-1);\n}\n\n.top-selector2-multiselect {\n\tpadding: var(--top-padding-1);\n\tflex-grow: 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\twidth: auto;\n\tpadding: var(--top-padding-1);\n\tmargin: calc(0px - var(--top-padding-1));\n\ttransform: translateX(0);\n}\n\n.top-selector2.top-button {\n\tjustify-content: start;\n}\n\n.top-selector2.top-input_input ~ .top-changer-selector {\n\ttransform: translateX(-52px);\n}\n\n.top-selector2.top-as-selector {\n\tpadding-right: calc(var(--top-selector-arrow-width) + var(--top-padding-2));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { Props, Slots } from './types';\n\nwithDefaults(defineProps<Props>(), {\n\tstyling: 'default',\n\tsize: 'default',\n});\n\ndefineSlots<Slots>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t['top-info']: true,\n\t\t\t['top-size_' + size]: true,\n\t\t\t['top-info-styling_' + styling]: true,\n\t\t}\"\n\t\t:data-top-icon=\"icon\"\n\t>\n\t\t<div class=\"top-info_text\">\n\t\t\t<slot></slot>\n\t\t</div>\n\n\t\t<span v-if=\"$slots.additional\" class=\"top-info_value\">\n\t\t\t<slot name=\"additional\"></slot>\n\t\t</span>\n\t</div>\n</template>\n\n<style>\n.top-info {\n\t--top-icon-width: var(--top-icon-size);\n\n\tborder-radius: var(--top-forms-radius);\n\tbox-sizing: border-box;\n\tmin-height: var(--top-forms-base-height);\n\tpadding: var(--top-padding-1) var(--top-padding-2);\n\tflex-grow: 5;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: var(--top-gap-2);\n}\n\n.top-info_text {\n\tflex-grow: 1;\n}\n\n.top-info_value {\n\tfont-weight: bold;\n}\n\n/* size */\n.top-info.top-size_default {\n\tborder-radius: var(--top-radius-3);\n\tpadding: var(--top-padding-4);\n}\n\n/* styling */\n.top-info-styling_default {\n\t--top-icon-color: var(--color-text-2);\n\n\tbackground: var(--color-layer-1);\n}\n\n.top-info-styling_info {\n\t--top-icon-color: var(--color-text-primary);\n\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-info-styling_warning {\n\t--top-icon-color: var(--color-text-warning);\n\n\tbackground: var(--color-layer-warning-1);\n}\n\n.top-info-styling_negative {\n\t--top-icon-color: var(--color-text-negative);\n\n\tbackground: var(--color-layer-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { TopButton } from '@/components/forms/forms';\nimport type { Emits, Props } from '@/components/formsExt/policy/types';\n\ndefineProps<Props>();\nconst emits = defineEmits<Emits>();\n\nconst isVisible = ref(true);\n\nconst onAccept = () => {\n\tisVisible.value = false;\n\n\temits('accept');\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"isVisible\"\n\t\tclass=\"top-policy\"\n\t>\n\t\t<div class=\"top-policy_title\">\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"top-policy_description\"\n\t\t\tv-html=\"description\"\n\t\t></div>\n\n\t\t<TopButton\n\t\t\tsize=\"m\"\n\t\t\t@click=\"onAccept\"\n\t\t>\n\t\t\t{{ acceptText }}\n\t\t</TopButton>\n\t</div>\n</template>\n\n<style>\n.top-policy {\n\tbox-sizing: border-box;\n\tbox-shadow: var(--top-shadow-b);\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-lightning-1);\n\twidth: 600px;\n\tpadding: var(--top-padding-4);\n\tposition: fixed;\n\tright: var(--top-gap-10);\n\tbottom: var(--top-gap-10);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-4);\n\tz-index: 10000;\n}\n\n.top-policy_title {\n\tfont-size: 24px;\n\tfont-weight: 700;\n}\n\n.top-policy_description {\n\tfont-size: 14px;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-policy {\n\t\twidth: 100%;\n\t\tright: 0;\n\t\tbottom: calc(var(--top-gap-5) + var(--toolbar-height, 0px));\n\t}\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 CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\nimport Policy from './policy/policy.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 TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & 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;\nexport const TopPolicy = Policy as typeof Policy & ComponentCustomProps;"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","submit","value","cancel","clickOnTitle","normalizeClass","attachToKeyboard","_cache","$event","toDisplayString","_ctx","createCommentVNode","isError","name","placeholder","rows","minHeight","expandable","disabled","readonly","hint","withKeys","withModifiers","openBlock","createBlock","_sfc_main$9","createSlots","withCtx","createTextVNode","intermediateValue","watch","toRef","createElementBlock","_hoisted_1$6","createVNode","_sfc_main$a","mergeProps","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","size","_hoisted_2$4","_hoisted_3$3","onChange","id","newModel","index","_hoisted_2$3","_hoisted_1$4","_hoisted_1$3","createElementVNode","useAPI","apiRequest","minLength","useCache","items","isLoading","searchText","nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","newSearchText","useDebounce","ITEM_ID_ALL","isSelected","modelValue","checkNameForNullId","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","searchType","api","itemAll","useI18n","resetSearch","genIsShort","localItems","localItems2","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","items2","itemName","nextIndex","searchTypeLocal","Core","menu","component","popupRef","getPopup","onOpenerKeydown","needOpen","symbolPressed","disabledFocusToOpen","onFocus","onClickChanger","onOpen","onClose","onScrollContentList","el","withDirectives","resolveDynamicComponent","modificator","buttonProps","unref","_hoisted_1$2","Fragment","renderList","renderSlot","TopPreloader","TopPopupWidgetInput","icon","emits","isVisible","onAccept","_hoisted_2","description","TopEditArea","_sfc_main$7","TopEditInput","_sfc_main$6","TopRadioGroup","_sfc_main$5","TopCheckboxGroup","_sfc_main$4","TopSelector2","_sfc_main$2","TopMenu","_sfc_main$b","TopInfo","_sfc_main$1","TopPolicy","_sfc_main"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/itemMulti.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/info/info.vue","../../src/components/formsExt/policy/policy.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 './types';\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 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-forms-focusable': true,\n\t\t\t\t'top-as-input': 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=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\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<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\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=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\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}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\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\talign-self: flex-end;\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: calc(var(--top-editArea-offset-bottom) + 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@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\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 } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\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.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","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\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>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { EmitsItemMulti, PropsItemMulti } from './types';\n\ndefineProps<PropsItemMulti>();\ndefineEmits<EmitsItemMulti>();\n</script>\n\n<template>\n\t<div class=\"top-selector2_itemMulti top-ellipsis\">\n\t\t{{ name }}\n\t\t<span\n\t\t\tclass=\"top-selector2_itemMultiDelete\"\n\t\t\tdata-top-icon=\"\"\n\t\t\t@click=\"$emit('delete', id)\"\n\t\t\t@mousedown.stop\n\t\t></span>\n\t</div>\n</template>\n\n<style>\n.top-selector2_itemMulti {\n\tbox-sizing: border-box;\n\tpadding-left: var(--top-padding-2);\n\tborder-radius: var(--top-radius-1, 4px);\n\tborder: 1px solid var(--color-line-primary-1);\n\tbackground: var(--color-layer-primary-2);\n\tmin-height: 22px;\n\tmax-width: 100%;\n\tcolor: var(--color-text-1);\n\tflex-grow: 0;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n.top-selector2_itemMultiDelete {\n\t--top-icon-size: 14px;\n\t--top-icon-width: 18px;\n\t--top-icon-color: var(--color-text-1);\n\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\theight: 100%;\n\tcursor: pointer;\n}\n\n.top-selector2_itemMultiDelete:hover {\n\tbackground: var(--color-layer-primary-2);\n}\n\n@media screen and (min-width: 900px) {\n\t.top-selector2.top-active .top-selector2_itemMultiDelete {\n\t\tz-index: calc(var(--top-popup-z-index) + 1);\n\t}\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (api: Props['api'], apiSetSearchParams: Props['apiSetSearchParams'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Кэш для полученных ответов через apiRequest\n\t */\n\tconst cache = new Map<string, any>();\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet searchText = '';\n\tlet nextOffset: number | null | undefined;\n\n\tif (api && !api.params.limit) {\n\t\tapi.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPI = async (): Promise<Api.ResponseSuccess<any, 'get'> | undefined> => {\n\t\tif (!api) return;\n\n\t\tlet cacheKey: string | undefined = undefined;\n\n\t\tif (useCache) {\n\t\t\tcacheKey = JSON.stringify(api.params);\n\t\t\tconst res = 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\tconst res = await api.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('Array expected in `res.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 (cacheKey) {\n\t\t\tcache.set(cacheKey, res);\n\t\t}\n\n\t\treturn res as Api.ResponseSuccess<any, 'get'>;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async (append: boolean) => {\n\t\tif (!api) return;\n\n\t\tif (append) {\n\t\t\t// данных о следующих страницах не обнаружено\n\t\t\tif (!nextOffset) return;\n\n\t\t\t// дозагружать нельзя, если не завершена предыдущая загрузка\n\t\t\tif (isLoading.value) return;\n\n\t\t\tapi.params.offset = nextOffset;\n\t\t} else {\n\t\t\tapi.params.offset = 0;\n\t\t}\n\n\t\tapiSetSearchParams?.(searchText);\n\n\t\tconst res = await callAPI();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\tif (append) {\n\t\t\titems.value = items.value.concat(res.result);\n\t\t} else {\n\t\t\titems.value = res.result;\n\t\t}\n\t};\n\n\tconst loadDebounce = debounce(() => load(false), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет произведен\n\t *\n\t * Если текст не изменился, поиск не будет произведен\n\t *\n\t * @param newSearchText - текст поиска\n\t * @param useDebounce - дедупликация загрузки списка\n\t */\n\tconst setSearchTextAndLoad = (newSearchText: string, useDebounce = true) => {\n\t\tif (!api) return;\n\n\t\tif (newSearchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (newSearchText === searchText && items.value.length) return;\n\n\t\tsearchText = newSearchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load(false);\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest: api,\n\t\titems,\n\t\tisLoading,\n\t\tload,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tsearchType: Ref<Props['searchType']>,\n\tminLength: number,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Является ли строка поиска достаточной длины для отображения меню\n\t */\n\tconst genIsShort = () => {\n\t\tif (!api.apiRequest) return false;\n\t\tif (searchType.value !== 'inline') return false;\n\t\tif (searchText.value.length >= minLength) return false;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\t/**\n\t * Выбрать элемент\n\t *\n\t * @param item Элемент для выбора\n\t */\n\tconst selectItem = (item: Item) => {\n\t\tif (multiselect && Array.isArray(model.value)) {\n\t\t\tif (!isSelected(model.value, item)) {\n\t\t\t\tmodel.value = [...model.value, item];\n\t\t\t}\n\t\t} else {\n\t\t\tmodel.value = item;\n\t\t}\n\t};\n\n\t/**\n\t * Выбрать следующее значение\n\t */\n\tconst selectNextItem = () => {\n\t\tif (!Array.isArray(model.value)) {\n\t\t\tconst currentIndex = itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\t\tconst nextIndex = (currentIndex + 1) % itemsForShow.value.length;\n\t\t\tmodel.value = { ...itemsForShow.value[nextIndex] };\n\t\t}\n\t};\n\n\t/**\n\t * Удалить выбранное значение по id\n\t *\n\t * @param id Идентификатор элемента для удаления\n\t */\n\tconst deleteItemById = async (id: Item['id']) => {\n\t\tif (Array.isArray(model.value)) {\n\t\t\tmodel.value = model.value.filter(item => item.id !== id);\n\t\t}\n\t};\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\tgenIsShort,\n\t\titems: localItems,\n\t\titemsForShow,\n\t\tselectItem,\n\t\tselectNextItem,\n\t\tdeleteItemById,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Item[],\n\tsize: 's',\n\tminLength: 0,\n\tsearchType: 'popup',\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\nconst searchTypeLocal = computed(() => {\n\t// multiselect не поддерживает inline ввода\n\tif (props.searchType === 'inline' && props.multiselect) return 'popup';\n\n\t// В мобильной версии popup работает в полноэкранном режиме\n\tif (props.searchType === 'inline' && Core.state.isMobile) return 'popup';\n\n\treturn props.searchType;\n});\n\nlet minLength = 0;\nif (searchTypeLocal.value === 'inline' && props.minLength) {\n\tminLength = props.minLength;\n}\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.api, props.apiSetSearchParams, minLength, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(\n\tmodel,\n\ttoRef(props, 'items'),\n\tprops.multiselect,\n\ttoRef(props, 'appendAllValue'),\n\ttoRef(props, 'appendSearchToResult'),\n\tsearchTypeLocal,\n\tminLength,\n\tapi,\n);\n\nconst component = computed(() => {\n\tif (props.buttonProps) return 'TopButton';\n\tif (searchTypeLocal.value === 'inline') return 'TopInput';\n\n\treturn 'div';\n});\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\nif (api.apiRequest) {\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => {\n\t\tapi.setSearchTextAndLoad(menu.searchText.value);\n\n\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\tif (menu.genIsShort()) {\n\t\t\t\tgetPopup()?.close();\n\t\t\t}\n\t\t}\n\t});\n}\n\nwatch(model, () => {\n\t/**\n\t * При изменении значения модели в режиме inline необходимо очистить поле поиска,\n\t * так как поиск больше не актуален после выбора значения\n\t */\n\tif (searchTypeLocal.value === 'inline') {\n\t\tmenu.resetSearch();\n\t}\n});\n\nconst placeholder = computed(() => {\n\tif (Array.isArray(model.value) || props.multiselect || !props.selectedAsPlaceholder && searchTypeLocal.value !== 'inline') {\n\t\treturn props.placeholder;\n\t}\n\n\treturn model.value?.name || props.placeholder;\n});\n\n/**\n * Обработчик ввода клавиш на кнопке или поле ввода\n */\nconst onOpenerKeydown = (e: KeyboardEvent) => {\n\tlet needOpen = false;\n\n\tswitch (e.key) {\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tmodel.value.pop();\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowRight':\n\t\tcase 'ArrowDown':\n\t\tcase 'ArrowLeft':\n\t\tcase 'Enter':\n\t\tcase ' ':\n\t\t\tneedOpen = true;\n\n\t\t\tbreak;\n\t\tcase 'Escape':\n\t\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\t\t// очистка введенного текста\n\t\t\t\tmenu.resetSearch();\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\t// введен символ\n\tconst symbolPressed = e.key.length === 1 && !e.ctrlKey && !e.metaKey;\n\n\t// введен символ\n\tif (searchTypeLocal.value === 'popup' || searchTypeLocal.value === 'inline') {\n\t\tif (symbolPressed) {\n\t\t\tneedOpen = true;\n\t\t}\n\t}\n\n\t// popup уже открыт\n\tif (getPopup()?.elPopup) {\n\t\tneedOpen = false;\n\t}\n\n\tif (needOpen) {\n\t\tif (searchTypeLocal.value === 'popup') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// введен символ\n\t\t\tif (symbolPressed) {\n\t\t\t\t// начало ввода, сразу ввести первый символ вместе с открытием popup\n\t\t\t\tif (!menu.searchText.value) {\n\t\t\t\t\tmenu.searchText.value = e.key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nlet disabledFocusToOpen = false;\n\nconst onFocus = (e: FocusEvent) => {\n\tif (disabledFocusToOpen) return;\n\n\tif (searchTypeLocal.value === 'inline') {\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nconst onClickChanger = (e: MouseEvent) => {\n\te.preventDefault();\n\n\tdisabledFocusToOpen = true;\n\t(e.currentTarget as HTMLElement)?.parentElement?.focus();\n\tdisabledFocusToOpen = false;\n\n\tmenu.selectNextItem();\n};\n\n/**\n * Обработчик открытия попапа\n */\nconst onOpen = () => {\n\tdisabledFocusToOpen = true;\n\n\tif (api.apiRequest) {\n\t\tif (menu.genIsShort()) {\n\t\t\tgetPopup()?.close();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// при открытии сразу выполнить поиск\n\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tsetTimeout(() => {\n\t\tdisabledFocusToOpen = false;\n\t}, 100);\n\n\t// очистка введенного текста\n\tif (searchTypeLocal.value === 'popup') {\n\t\tif (menu.searchText.value) menu.resetSearch();\n\t}\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\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.load(true);\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tif (props.multiselect) {\n\t\t\t\tif (!Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\t\tname: 'Выбери меня',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = {\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ immediate: true },\n\t);\n\n\twatch(\n\t\t() => props.searchType,\n\t\t() => {\n\t\t\t// пауза для установки props в адресной строке\n\t\t\tsetTimeout(() => {\n\t\t\t\tlocation.reload();\n\t\t\t}, 500);\n\t\t},\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"onOpen()\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"api ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"searchTypeLocal !== 'inline'\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<component\n\t\t\t\t:is=\"component\"\n\n\t\t\t\t:=\"buttonProps\"\n\n\t\t\t\tref=\"subcomponentSelector\"\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-selector2-' + modificator]: !!modificator,\n\t\t\t\t\t'top-as-input': !buttonProps,\n\t\t\t\t\t'top-as-selector': true,\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\ttabindex=\"0\"\n\t\t\t\t@keydown=\"onOpenerKeydown\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\n\t\t\t\t:placeholder\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t@focus=\"onFocus\"\n\t\t\t\t@blur=\"getPopup()?.isClosed ? menu.resetSearch() : ''\"\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 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=\"menu.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=\"searchTypeLocal !== 'inline' && !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 v-if=\"multiselect && !model.length\" class=\"top-selector2_placeholder top-ellipsis\">\n\t\t\t\t\t{{ placeholder }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !buttonProps && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector top-popup_widget\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"onClickChanger\"\n\t\t\t\t></span>\n\t\t\t</component>\n\t\t</template>\n\n\t\t<template #widget v-if=\"searchTypeLocal === 'popup'\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !api.apiRequest?.params.offset\"\n\t\t\t\t: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 menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"menu.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\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=\"!api.isLoading.value && !menu.itemsForShow.value.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\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (searchType !== 'popup' || api.apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n}\n\n.top-selector2::placeholder,\n.top-selector2_placeholder {\n\tcolor: var(--color-text-2);\n}\n\n.top-selector2_placeholder {\n\tpadding-left: var(--top-padding-1);\n}\n\n.top-selector2-multiselect {\n\tpadding: var(--top-padding-1);\n\tflex-grow: 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\twidth: auto;\n\tpadding: var(--top-padding-1);\n\tmargin: calc(0px - var(--top-padding-1));\n\ttransform: translateX(0);\n}\n\n.top-selector2.top-button {\n\tjustify-content: start;\n}\n\n.top-selector2.top-input_input ~ .top-changer-selector {\n\ttransform: translateX(-52px);\n}\n\n.top-selector2.top-as-selector {\n\tpadding-right: calc(var(--top-selector-arrow-width) + var(--top-padding-2));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { Props, Slots } from './types';\n\nwithDefaults(defineProps<Props>(), {\n\tstyling: 'default',\n\tsize: 'default',\n});\n\ndefineSlots<Slots>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t['top-info']: true,\n\t\t\t['top-size_' + size]: true,\n\t\t\t['top-info-styling_' + styling]: true,\n\t\t}\"\n\t\t:data-top-icon=\"icon\"\n\t>\n\t\t<div class=\"top-info_text\">\n\t\t\t<slot></slot>\n\t\t</div>\n\n\t\t<span v-if=\"$slots.additional\" class=\"top-info_value\">\n\t\t\t<slot name=\"additional\"></slot>\n\t\t</span>\n\t</div>\n</template>\n\n<style>\n.top-info {\n\t--top-icon-width: var(--top-icon-size);\n\n\tborder-radius: var(--top-forms-radius);\n\tbox-sizing: border-box;\n\tmin-height: var(--top-forms-base-height);\n\tpadding: var(--top-padding-1) var(--top-padding-2);\n\tflex-grow: 5;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: var(--top-gap-2);\n}\n\n.top-info_text {\n\tflex-grow: 1;\n}\n\n.top-info_value {\n\tfont-weight: bold;\n}\n\n/* size */\n.top-info.top-size_default {\n\tborder-radius: var(--top-radius-3);\n\tpadding: var(--top-padding-4);\n}\n\n/* styling */\n.top-info-styling_default {\n\t--top-icon-color: var(--color-text-2);\n\n\tbackground: var(--color-layer-1);\n}\n\n.top-info-styling_info {\n\t--top-icon-color: var(--color-text-primary);\n\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-info-styling_warning {\n\t--top-icon-color: var(--color-text-warning);\n\n\tbackground: var(--color-layer-warning-1);\n}\n\n.top-info-styling_negative {\n\t--top-icon-color: var(--color-text-negative);\n\n\tbackground: var(--color-layer-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { TopButton } from '@/components/forms/forms';\nimport type { Emits, Props } from '@/components/formsExt/policy/types';\n\ndefineProps<Props>();\nconst emits = defineEmits<Emits>();\n\nconst isVisible = ref(true);\n\nconst onAccept = () => {\n\tisVisible.value = false;\n\n\temits('accept');\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"isVisible\"\n\t\tclass=\"top-policy\"\n\t>\n\t\t<div class=\"top-policy_title\">\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"top-policy_description\"\n\t\t\tv-html=\"description\"\n\t\t></div>\n\n\t\t<TopButton\n\t\t\tsize=\"m\"\n\t\t\t@click=\"onAccept\"\n\t\t>\n\t\t\t{{ acceptText }}\n\t\t</TopButton>\n\t</div>\n</template>\n\n<style>\n.top-policy {\n\tbox-sizing: border-box;\n\tbox-shadow: var(--top-shadow-b);\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-lightning-1);\n\twidth: 600px;\n\tpadding: var(--top-padding-4);\n\tposition: fixed;\n\tright: var(--top-gap-10);\n\tbottom: var(--top-gap-10);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-4);\n\tz-index: 10000;\n}\n\n.top-policy_title {\n\tfont-size: 24px;\n\tfont-weight: 700;\n}\n\n.top-policy_description {\n\tfont-size: 14px;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-policy {\n\t\twidth: 100%;\n\t\tright: 0;\n\t\tbottom: calc(var(--top-gap-5) + var(--toolbar-height, 0px));\n\t}\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 CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\nimport Policy from './policy/policy.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 TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & 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;\nexport const TopPolicy = Policy as typeof Policy & ComponentCustomProps;"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","submit","value","cancel","clickOnTitle","normalizeClass","attachToKeyboard","_cache","$event","toDisplayString","_ctx","createCommentVNode","isError","name","placeholder","rows","minHeight","expandable","disabled","readonly","hint","withKeys","withModifiers","openBlock","createBlock","_sfc_main$9","createSlots","withCtx","createTextVNode","intermediateValue","watch","toRef","createElementBlock","_hoisted_1$6","createVNode","_sfc_main$a","mergeProps","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","size","_hoisted_2$4","_hoisted_3$3","onChange","id","newModel","index","_hoisted_2$3","_hoisted_1$4","_hoisted_1$3","createElementVNode","useAPI","api","apiSetSearchParams","minLength","useCache","items","cache","isLoading","searchText","nextOffset","callAPI","cacheKey","res2","res","indexWithError","load","append","loadDebounce","debounce","newSearchText","useDebounce","ITEM_ID_ALL","isSelected","modelValue","checkNameForNullId","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","searchType","itemAll","useI18n","resetSearch","genIsShort","localItems","localItems2","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","items2","itemName","nextIndex","searchTypeLocal","Core","menu","component","popupRef","getPopup","onOpenerKeydown","e","needOpen","symbolPressed","disabledFocusToOpen","onFocus","onClickChanger","onOpen","onClose","onScrollContentList","el","unref","withDirectives","resolveDynamicComponent","modificator","buttonProps","_hoisted_1$2","Fragment","renderList","renderSlot","TopPreloader","TopPopupWidgetInput","icon","emits","isVisible","onAccept","_hoisted_2","description","TopEditArea","_sfc_main$7","TopEditInput","_sfc_main$6","TopRadioGroup","_sfc_main$5","TopCheckboxGroup","_sfc_main$4","TopSelector2","_sfc_main$2","TopMenu","_sfc_main$b","TopInfo","_sfc_main$1","TopPolicy","_sfc_main"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@topvisor/ui",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.1.0-apiClient.
|
|
4
|
+
"version": "1.1.0-apiClient.26",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Topvisor UI-kit Vue",
|
|
7
7
|
"author": "Topvisor",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"./tabsView/tabsView.js": "./tabsView/tabsView.js"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
+
"@faker-js/faker": "^9.9.0",
|
|
33
34
|
"@monaco-editor/loader": "^1.5.0",
|
|
34
35
|
"@rive-app/canvas-lite": "^2.30.4",
|
|
35
36
|
"pinia": "2.3.1",
|
package/popup/popup.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/listItem.vue_vue_type_script_setup_true_lang-C8PDRggQ.amd","vue","../.chunks/forms-DRhpgERJ.amd","../require/css.amd!../assets/popup.css"],(function(D,p,c,e,C){"use strict";if(typeof e>"u")var e=window.Vue;const V=e.defineComponent({__name:"widgetInput",props:e.mergeModels({modelValue:{},name:{},disabled:{type:Boolean},readonly:{type:Boolean},modificator:{},size:{},styling:{},isError:{type:Boolean},isLoading:{type:Boolean},icon:{},icon2:{},addCleaner:{type:Boolean,default:!0},title:{},captionType:{}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(m){const a=e.useModel(m,"modelValue");return(i,r)=>(e.openBlock(),e.createBlock(C._sfc_main$2,e.mergeProps(i.$props,{modificator:"popupWidgetInput",modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=o=>a.value=o)}),null,16,["modelValue"]))}}),B=e.defineComponent({__name:"alert",props:{submitText:{},id:{},class:{},transitionDuration:{},footerSupportLink:{},pos:{},notch:{type:Boolean},openByHover:{type:Boolean},posBy:{},data:{}},emits:["open","close","scrollContentList"],setup(m){const a=m,{submitText:i,...r}=a;return(o,l)=>(e.openBlock(),e.createBlock(c._sfc_main,e.mergeProps({class:"top-popupAlert"},r,{onOpen:l[0]||(l[0]=s=>o.$emit("open",s)),onClose:l[1]||(l[1]=s=>o.$emit("close",s)),onScrollContentList:l[2]||(l[2]=(...s)=>o.$emit("scrollContentList",...s))}),e.createSlots({opener:e.withCtx(()=>[e.renderSlot(o.$slots,"opener")]),footer:e.withCtx(()=>[e.renderSlot(o.$slots,"footer"),e.createVNode(C._sfc_main,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(i)||o.$i18n.Common.Close),1)]),_:1})]),_:2},[o.$slots.header?{name:"header",fn:e.withCtx(()=>[e.renderSlot(o.$slots,"header")]),key:"0"}:void 0,o.$slots.default?{name:"content",fn:e.withCtx(()=>[e.renderSlot(o.$slots,"default")]),key:"1"}:void 0]),1040))}}),P=e.defineComponent({__name:"confirm",props:{cancelText:{},submitText:{},isWarning:{type:Boolean},id:{},class:{},transitionDuration:{},footerSupportLink:{},pos:{},notch:{type:Boolean},openByHover:{type:Boolean},posBy:{},data:{}},emits:["open","close","scrollContentList","submit"],setup(m,{emit:a}){const i=m,r=a,o=e.ref(!1),l=()=>{o.value=!0,r("submit")},s=n=>{if(o.value){o.value=!1;return}r("close",n)},{submitText:$,cancelText:S,isWarning:y,...T}=i;return(n,u)=>(e.openBlock(),e.createBlock(c._sfc_main,e.mergeProps({class:"top-popupConfirm"},T,{onOpen:u[0]||(u[0]=t=>n.$emit("open",t)),onClose:u[1]||(u[1]=t=>s(t)),onScrollContentList:u[2]||(u[2]=(...t)=>n.$emit("scrollContentList",...t))}),e.createSlots({opener:e.withCtx(()=>[e.renderSlot(n.$slots,"opener")]),footer:e.withCtx(()=>[e.renderSlot(n.$slots,"footer"),e.createVNode(C._sfc_main,{color:"theme"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(S)||n.$i18n.Common.Cancel),1)]),_:1}),e.createVNode(C._sfc_main,{onClick:l,color:e.unref(y)?"red":"blue"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref($)||n.$i18n.Common.Continue),1)]),_:1},8,["color"])]),_:2},[n.$slots.header?{name:"header",fn:e.withCtx(()=>[e.renderSlot(n.$slots,"header")]),key:"0"}:void 0,n.$slots.default?{name:"content",fn:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),key:"1"}:void 0]),1040))}}),k=e.defineComponent({__name:"prompt",props:{submitText:{},cancelText:{},defaultValue:{},id:{},class:{},transitionDuration:{},footerSupportLink:{},pos:{},notch:{type:Boolean},openByHover:{type:Boolean},posBy:{},data:{}},emits:["open","close","scrollContentList","submit"],setup(m,{emit:a}){const i=m,r=a,o=()=>s.value=i.defaultValue??"",l=e.ref(!1),s=e.ref();e.watch(()=>i.defaultValue,()=>o(),{immediate:!0});const $=()=>{l.value=!0},S=t=>{if(l.value){l.value=!1,r("submit",s.value),o();return}o(),r("close",t)},{submitText:y,cancelText:T,defaultValue:n,...u}=i;return(t,d)=>(e.openBlock(),e.createBlock(c._sfc_main,e.mergeProps({class:"top-popupPrompt"},u,{onOpen:d[1]||(d[1]=f=>t.$emit("open",f)),onClose:d[2]||(d[2]=f=>S(f)),onScrollContentList:d[3]||(d[3]=(...f)=>t.$emit("scrollContentList",...f))}),e.createSlots({opener:e.withCtx(()=>[e.renderSlot(t.$slots,"opener")]),footer:e.withCtx(()=>[e.renderSlot(t.$slots,"footer"),e.createVNode(C._sfc_main,{color:"theme"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(T)||t.$i18n.Common.Cancel),1)]),_:1}),e.createVNode(C._sfc_main,{onClick:$},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(y)||t.$i18n.Common.OK),1)]),_:1})]),_:2},[t.$slots.header?{name:"header",fn:e.withCtx(()=>[e.renderSlot(t.$slots,"header")]),key:"0"}:void 0,t.$slots.default?{name:"content",fn:e.withCtx(()=>[e.renderSlot(t.$slots,"default"),e.createVNode(V,{modelValue:s.value,"onUpdate:modelValue":d[0]||(d[0]=f=>s.value=f),modelModifiers:{trim:!0}},null,8,["modelValue"])]),key:"1"}:void 0]),1040))}}),w=c._sfc_main,b=c._sfc_main$2,v=c._sfc_main$1,
|
|
1
|
+
define(["require","exports","../.chunks/listItem.vue_vue_type_script_setup_true_lang-C8PDRggQ.amd","vue","../.chunks/forms-DRhpgERJ.amd","../require/css.amd!../assets/popup.css"],(function(D,p,c,e,C){"use strict";if(typeof e>"u")var e=window.Vue;const V=e.defineComponent({__name:"widgetInput",props:e.mergeModels({modelValue:{},name:{},disabled:{type:Boolean},readonly:{type:Boolean},modificator:{},size:{},styling:{},isError:{type:Boolean},isLoading:{type:Boolean},icon:{},icon2:{},addCleaner:{type:Boolean,default:!0},title:{},captionType:{}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(m){const a=e.useModel(m,"modelValue");return(i,r)=>(e.openBlock(),e.createBlock(C._sfc_main$2,e.mergeProps(i.$props,{modificator:"popupWidgetInput",modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=o=>a.value=o)}),null,16,["modelValue"]))}}),B=e.defineComponent({__name:"alert",props:{submitText:{},id:{},class:{},transitionDuration:{},footerSupportLink:{},pos:{},notch:{type:Boolean},openByHover:{type:Boolean},posBy:{},data:{}},emits:["open","close","scrollContentList"],setup(m){const a=m,{submitText:i,...r}=a;return(o,l)=>(e.openBlock(),e.createBlock(c._sfc_main,e.mergeProps({class:"top-popupAlert"},r,{onOpen:l[0]||(l[0]=s=>o.$emit("open",s)),onClose:l[1]||(l[1]=s=>o.$emit("close",s)),onScrollContentList:l[2]||(l[2]=(...s)=>o.$emit("scrollContentList",...s))}),e.createSlots({opener:e.withCtx(()=>[e.renderSlot(o.$slots,"opener")]),footer:e.withCtx(()=>[e.renderSlot(o.$slots,"footer"),e.createVNode(C._sfc_main,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(i)||o.$i18n.Common.Close),1)]),_:1})]),_:2},[o.$slots.header?{name:"header",fn:e.withCtx(()=>[e.renderSlot(o.$slots,"header")]),key:"0"}:void 0,o.$slots.default?{name:"content",fn:e.withCtx(()=>[e.renderSlot(o.$slots,"default")]),key:"1"}:void 0]),1040))}}),P=e.defineComponent({__name:"confirm",props:{cancelText:{},submitText:{},isWarning:{type:Boolean},id:{},class:{},transitionDuration:{},footerSupportLink:{},pos:{},notch:{type:Boolean},openByHover:{type:Boolean},posBy:{},data:{}},emits:["open","close","scrollContentList","submit"],setup(m,{emit:a}){const i=m,r=a,o=e.ref(!1),l=()=>{o.value=!0,r("submit")},s=n=>{if(o.value){o.value=!1;return}r("close",n)},{submitText:$,cancelText:S,isWarning:y,...T}=i;return(n,u)=>(e.openBlock(),e.createBlock(c._sfc_main,e.mergeProps({class:"top-popupConfirm"},T,{onOpen:u[0]||(u[0]=t=>n.$emit("open",t)),onClose:u[1]||(u[1]=t=>s(t)),onScrollContentList:u[2]||(u[2]=(...t)=>n.$emit("scrollContentList",...t))}),e.createSlots({opener:e.withCtx(()=>[e.renderSlot(n.$slots,"opener")]),footer:e.withCtx(()=>[e.renderSlot(n.$slots,"footer"),e.createVNode(C._sfc_main,{color:"theme"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(S)||n.$i18n.Common.Cancel),1)]),_:1}),e.createVNode(C._sfc_main,{onClick:l,color:e.unref(y)?"red":"blue"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref($)||n.$i18n.Common.Continue),1)]),_:1},8,["color"])]),_:2},[n.$slots.header?{name:"header",fn:e.withCtx(()=>[e.renderSlot(n.$slots,"header")]),key:"0"}:void 0,n.$slots.default?{name:"content",fn:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),key:"1"}:void 0]),1040))}}),k=e.defineComponent({__name:"prompt",props:{submitText:{},cancelText:{},defaultValue:{},id:{},class:{},transitionDuration:{},footerSupportLink:{},pos:{},notch:{type:Boolean},openByHover:{type:Boolean},posBy:{},data:{}},emits:["open","close","scrollContentList","submit"],setup(m,{emit:a}){const i=m,r=a,o=()=>s.value=i.defaultValue??"",l=e.ref(!1),s=e.ref();e.watch(()=>i.defaultValue,()=>o(),{immediate:!0});const $=()=>{l.value=!0},S=t=>{if(l.value){l.value=!1,r("submit",s.value),o();return}o(),r("close",t)},{submitText:y,cancelText:T,defaultValue:n,...u}=i;return(t,d)=>(e.openBlock(),e.createBlock(c._sfc_main,e.mergeProps({class:"top-popupPrompt"},u,{onOpen:d[1]||(d[1]=f=>t.$emit("open",f)),onClose:d[2]||(d[2]=f=>S(f)),onScrollContentList:d[3]||(d[3]=(...f)=>t.$emit("scrollContentList",...f))}),e.createSlots({opener:e.withCtx(()=>[e.renderSlot(t.$slots,"opener")]),footer:e.withCtx(()=>[e.renderSlot(t.$slots,"footer"),e.createVNode(C._sfc_main,{color:"theme"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(T)||t.$i18n.Common.Cancel),1)]),_:1}),e.createVNode(C._sfc_main,{onClick:$},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(y)||t.$i18n.Common.OK),1)]),_:1})]),_:2},[t.$slots.header?{name:"header",fn:e.withCtx(()=>[e.renderSlot(t.$slots,"header")]),key:"0"}:void 0,t.$slots.default?{name:"content",fn:e.withCtx(()=>[e.renderSlot(t.$slots,"default"),e.createVNode(V,{modelValue:s.value,"onUpdate:modelValue":d[0]||(d[0]=f=>s.value=f),modelModifiers:{trim:!0}},null,8,["modelValue"])]),key:"1"}:void 0]),1040))}}),w=c._sfc_main,b=c._sfc_main$2,v=c._sfc_main$1,h=V,g=B,L=P,N=k;p.TopPopup=w,p.TopPopupAlert=g,p.TopPopupConfirm=L,p.TopPopupListItem=v,p.TopPopupOpener=b,p.TopPopupPrompt=N,p.TopPopupWidgetInput=h,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=popup.amd.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const genMockResponse: (options: Api.Mocker.Options<any, any>, fields?: readonly string[], params?: Api.Mocker.Params) => Promise<{
|
|
2
|
+
result: any;
|
|
3
|
+
errors: undefined;
|
|
4
|
+
nextOffset: number | undefined;
|
|
5
|
+
total: number | undefined;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const genMockResult: <Options extends Api.Mocker.Options<any, any>>(options: Options, fields?: readonly string[], params?: Api.Mocker.Params) => Api.Mocker.ToMockResult<Options["result"]>;
|
|
8
|
+
export declare const genMockItem: <T extends Api.Mocker.Item>(genItem: T, n: number, seed: number, fields?: readonly string[]) => Api.Mocker.ToMockItem<T>;
|
|
9
|
+
export declare const genMockValue: <T extends Api.Mocker.Value>(genValue: T, n?: number) => Api.Mocker.ToMockValue<T>;
|
|
@@ -30,17 +30,17 @@ declare global {
|
|
|
30
30
|
type ParamsOriginal<RequestContext extends Api.ClientRequestContext<any, any, any>> = RequestContext['Schema']['post'] extends {
|
|
31
31
|
requestBody: {
|
|
32
32
|
content: {
|
|
33
|
-
'application/json': infer P extends
|
|
33
|
+
'application/json': infer P extends Record<string, any>;
|
|
34
34
|
};
|
|
35
35
|
};
|
|
36
|
-
} ? P :
|
|
36
|
+
} ? P : Record<string, any>;
|
|
37
37
|
type ParamsOriginalByPath<Paths extends Api.PathsAbstract, Path extends Api.Path<Paths>> = Paths[Path]['post'] extends {
|
|
38
38
|
requestBody: {
|
|
39
39
|
content: {
|
|
40
|
-
'application/json': infer P extends
|
|
40
|
+
'application/json': infer P extends Record<string, any>;
|
|
41
41
|
};
|
|
42
42
|
};
|
|
43
|
-
} ? P :
|
|
43
|
+
} ? P : Record<string, any>;
|
|
44
44
|
/**
|
|
45
45
|
* Получить параметр списка полей без учета дженериков модели и преобразовать его в базовый тип `fields`
|
|
46
46
|
*/
|
|
@@ -79,7 +79,7 @@ declare global {
|
|
|
79
79
|
* @see PathsAbstract
|
|
80
80
|
*/
|
|
81
81
|
type ResponseOriginal<RequestContext extends Api.ClientRequestContext<any, any, any>> = RequestContext['Schema']['post']['responses'][200]['content'] extends {
|
|
82
|
-
'application/json': infer R extends
|
|
82
|
+
'application/json': infer R extends Record<string, any>;
|
|
83
83
|
} ? R : never;
|
|
84
84
|
/**
|
|
85
85
|
* Тип `result` в ответе метода API
|
|
@@ -24,6 +24,7 @@ declare global {
|
|
|
24
24
|
* Опции запроса
|
|
25
25
|
*/
|
|
26
26
|
options: Api.ClientRequestOptions;
|
|
27
|
+
mockerOptions?: Api.Mocker.Options<Api.Mocker.Result, Params>;
|
|
27
28
|
/**
|
|
28
29
|
* Признак загрузки
|
|
29
30
|
*/
|
|
@@ -46,6 +47,10 @@ declare global {
|
|
|
46
47
|
* Установить расширенные настройки запроса
|
|
47
48
|
*/
|
|
48
49
|
setOptions(options: Partial<Api.ClientRequestOptions>): this;
|
|
50
|
+
/**
|
|
51
|
+
* Установить генератор данных вместо реальных запросов к серверу
|
|
52
|
+
*/
|
|
53
|
+
setMocker<MockerResult extends Api.Mocker.Result>(options?: Api.Mocker.Options<MockerResult, Params>): this;
|
|
49
54
|
/**
|
|
50
55
|
* Выполнить обращение к методу API
|
|
51
56
|
*/
|
|
@@ -72,6 +77,7 @@ declare global {
|
|
|
72
77
|
callInSelfWindow(fields?: ParamsFieldsNarrowed & FieldsNarrow): void;
|
|
73
78
|
/** Генерация параметров запроса */
|
|
74
79
|
genData<FetchStyle extends RequestContext['ParamsFetchStyle']>(fields?: FieldsNarrow, fetchStyle?: FetchStyle): Record<string, any>;
|
|
80
|
+
exec(fields?: FieldsNarrow, fetchStyle?: RequestContext['ParamsFetchStyle']): Promise<any>;
|
|
75
81
|
}
|
|
76
82
|
/**
|
|
77
83
|
* Объект с запросом к методу API, не описанному в OpenAPI
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
namespace Api {
|
|
3
|
+
namespace Mocker {
|
|
4
|
+
/**
|
|
5
|
+
* Классический трюк: заставляет TS раскрыть алиас в структурный тип, тем самым устраняя разницу между «инлайн» и «через имя типа».
|
|
6
|
+
*/
|
|
7
|
+
type Expand<T> = T extends infer U ? {
|
|
8
|
+
[K in keyof U]: U[K];
|
|
9
|
+
} : never;
|
|
10
|
+
/**
|
|
11
|
+
* Настройки генерации результата
|
|
12
|
+
*
|
|
13
|
+
* Объект, массив или просто значение
|
|
14
|
+
*
|
|
15
|
+
* Для генерации можно использовать библиотеку **faker-js**
|
|
16
|
+
*
|
|
17
|
+
* Пример:
|
|
18
|
+
*
|
|
19
|
+
* ```
|
|
20
|
+
* [{
|
|
21
|
+
* id: faker.number.int,
|
|
22
|
+
* name: faker.name.firstName,
|
|
23
|
+
* email: faker.internet.email,
|
|
24
|
+
* }]
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @see https://fakerjs.dev/
|
|
28
|
+
*/
|
|
29
|
+
type Result = [Item] | Item | Value;
|
|
30
|
+
/**
|
|
31
|
+
* Генератор элемента результата
|
|
32
|
+
*
|
|
33
|
+
* Пример:
|
|
34
|
+
*
|
|
35
|
+
* ```
|
|
36
|
+
* {
|
|
37
|
+
* id: faker.number.int,
|
|
38
|
+
* name: faker.name.firstName,
|
|
39
|
+
* email: faker.internet.email,
|
|
40
|
+
* }
|
|
41
|
+
*/
|
|
42
|
+
type Item = Record<string, Value>;
|
|
43
|
+
/**
|
|
44
|
+
* Генератор значения
|
|
45
|
+
*
|
|
46
|
+
* Пример:
|
|
47
|
+
*
|
|
48
|
+
* ```
|
|
49
|
+
* faker.number.int
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
type Value = (n: number) => any;
|
|
53
|
+
type Params = Record<string, any>;
|
|
54
|
+
type Options<Result extends Api.Mocker.Result, Params extends Api.Mocker.Params> = {
|
|
55
|
+
/**
|
|
56
|
+
* Шаблон генерации результата
|
|
57
|
+
*
|
|
58
|
+
* Если результат массив, то будут учтены параметры: `fields`, `limit` и настройка `useFilter()`
|
|
59
|
+
*
|
|
60
|
+
* Если результат объект, то будет учтен параметр: `fields`
|
|
61
|
+
*/
|
|
62
|
+
result: Result;
|
|
63
|
+
/**
|
|
64
|
+
* Если указано, будет подключен механизм пагинации с `total` и `nextOffset`
|
|
65
|
+
*
|
|
66
|
+
* Только если `result` массив
|
|
67
|
+
*/
|
|
68
|
+
total?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Функция для фильтра сгенерированных моков
|
|
71
|
+
*
|
|
72
|
+
* Для имитации работы фильтров в методах API
|
|
73
|
+
*
|
|
74
|
+
* Только если `result` массив
|
|
75
|
+
*
|
|
76
|
+
* @return Вернет `true`, если сгенерированный мок должен попасть в результат
|
|
77
|
+
*/
|
|
78
|
+
useFilter?: (resultItem: Result extends [Item] ? ToMockItem<Result[0]> : never, params: Params) => boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Пауза перед возвращением результата
|
|
81
|
+
*
|
|
82
|
+
* @see https://fakerjs.dev/api/simpleFaker.html#delay
|
|
83
|
+
*/
|
|
84
|
+
delay?: number;
|
|
85
|
+
/**
|
|
86
|
+
* Показывать ли лог мокирования запросов
|
|
87
|
+
*/
|
|
88
|
+
showLog?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Начальное значение рандомайзера
|
|
91
|
+
*
|
|
92
|
+
* Установите `-1`, если хотите, чтобы данные менялись каждый запрос, `-1` нельзя использовать в кейсах с фильтрацией, сортировкой и пагинацией
|
|
93
|
+
*
|
|
94
|
+
* @see https://fakerjs.dev/api/simpleFaker.html#seed
|
|
95
|
+
*/
|
|
96
|
+
seed?: number;
|
|
97
|
+
};
|
|
98
|
+
type ToMockItem<T extends Item> = {
|
|
99
|
+
[K in keyof T]: ReturnType<T[K]>;
|
|
100
|
+
};
|
|
101
|
+
type ToMockValue<T extends Value> = ReturnType<T>;
|
|
102
|
+
type ToMockResult<T extends Result> = T extends [infer I extends Item] ? ToMockItem<I>[] : T extends Item ? ToMockItem<T> : T extends Value ? ToMockValue<T> : never;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export {};
|
|
@@ -13,4 +13,4 @@ export declare const isPublicAPI: (path: Api.PathAbstract) => boolean;
|
|
|
13
13
|
/**
|
|
14
14
|
* Сгенерировать baseUrl на основе текущего домена
|
|
15
15
|
*/
|
|
16
|
-
export declare const getBaseDomainUrl: (useMainDomain?: boolean, input?: string) => string;
|
|
16
|
+
export declare const getBaseDomainUrl: (useMainDomain?: boolean, input?: string, subdomain?: string) => string;
|
|
@@ -40,7 +40,7 @@ export declare const pushFilterTagsIds: <Model extends Api.Ext.Schemas["Model"]
|
|
|
40
40
|
/**
|
|
41
41
|
* Сгенерировать API фильтр из простого значения
|
|
42
42
|
*/
|
|
43
|
-
export declare const genFilterPrimitive: <Model extends Api.Ext.Schemas["Model"] = any, FieldName extends Api.Field.Name<Model> = Api.Field.Name<Model>>(name: FieldName, valueWithModifierOperator: number | string | boolean | ValueWithModifierOperator) => Api.Field.Filter<Model,
|
|
43
|
+
export declare const genFilterPrimitive: <Model extends Api.Ext.Schemas["Model"] = any, FieldName extends Api.Field.Name<Model> = Api.Field.Name<Model>>(name: FieldName, valueWithModifierOperator: number | string | boolean | ValueWithModifierOperator) => Api.Field.Filter<Model, Api.Field.Name<Model>>;
|
|
44
44
|
/**
|
|
45
45
|
* Сгенерировать API фильтр IN
|
|
46
46
|
*/
|
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
import { Item, Props } from '../types';
|
|
2
2
|
import { Ref } from 'vue';
|
|
3
3
|
export type API = ReturnType<typeof useAPI>;
|
|
4
|
-
export declare const useAPI: (
|
|
5
|
-
apiRequest:
|
|
6
|
-
[propName: string]: any;
|
|
7
|
-
params: {
|
|
8
|
-
limit?: number;
|
|
9
|
-
offset?: number;
|
|
10
|
-
search?: string;
|
|
11
|
-
};
|
|
12
|
-
call: Function;
|
|
13
|
-
cache: Map<string, {
|
|
14
|
-
result: Array<Item>;
|
|
15
|
-
nextOffset?: number;
|
|
16
|
-
}>;
|
|
17
|
-
} | undefined;
|
|
4
|
+
export declare const useAPI: (api: Props["api"], apiSetSearchParams: Props["apiSetSearchParams"], minLength: number, useCache: Props["useCache"]) => {
|
|
5
|
+
apiRequest: Api.ClientRequest<any, undefined, Api.Params<any, undefined, any, Record<string, any>>, Api.ModelFields<any> | undefined> | Api.ClientRequestCustom<any, any, any> | undefined;
|
|
18
6
|
items: Ref<{
|
|
19
7
|
[x: string]: any;
|
|
20
8
|
id: number | null;
|
|
@@ -25,6 +13,6 @@ export declare const useAPI: (apiRequest: Props["apiRequest"], minLength: number
|
|
|
25
13
|
name: string;
|
|
26
14
|
}[]>;
|
|
27
15
|
isLoading: Ref<boolean, boolean>;
|
|
28
|
-
|
|
16
|
+
load: (append: boolean) => Promise<void>;
|
|
29
17
|
setSearchTextAndLoad: (newSearchText: string, useDebounce?: boolean) => void;
|
|
30
18
|
};
|