@topvisor/ui 1.4.0-TopGroupSelector.9 → 1.4.1-projectSelector.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.chunks/core-BgoBbm_5.es.js +242 -0
- package/.chunks/core-BgoBbm_5.es.js.map +1 -0
- package/.chunks/core-D1KnwO7l.amd.js +2 -0
- package/.chunks/core-D1KnwO7l.amd.js.map +1 -0
- package/.chunks/{datepicker-D1Hw3a3o.es.js → datepicker-BPTUHd97.es.js} +2 -2
- package/.chunks/datepicker-BPTUHd97.es.js.map +1 -0
- package/.chunks/{datepicker-3coUsFW2.amd.js → datepicker-O_SK-Dz4.amd.js} +2 -2
- package/.chunks/datepicker-O_SK-Dz4.amd.js.map +1 -0
- package/.chunks/{dialog_regionSelectorRegions-CZ8IX7la.amd.js → dialog_regionSelectorRegions-Ba-Eypgv.amd.js} +2 -2
- package/.chunks/dialog_regionSelectorRegions-Ba-Eypgv.amd.js.map +1 -0
- package/.chunks/{dialog_regionSelectorRegions-1UVhgK2f.es.js → dialog_regionSelectorRegions-DA38RsiW.es.js} +4 -4
- package/.chunks/dialog_regionSelectorRegions-DA38RsiW.es.js.map +1 -0
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-Dq9kWWMg.amd.js → dialogs.vue_vue_type_script_setup_true_lang-CWprVs8d.amd.js} +2 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-CWprVs8d.amd.js.map +1 -0
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-DRbTG0vh.es.js → dialogs.vue_vue_type_script_setup_true_lang-CzFMOjlE.es.js} +2 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-CzFMOjlE.es.js.map +1 -0
- package/.chunks/field-Cvv0SRcJ.amd.js.map +1 -1
- package/.chunks/field-CyyFzM-Y.es.js.map +1 -1
- package/.chunks/{forms-CUSCBQu3.amd.js → forms-4D_EVI46.amd.js} +3 -3
- package/.chunks/forms-4D_EVI46.amd.js.map +1 -0
- package/.chunks/{forms-BseC3Ftz.es.js → forms-xkXHvvah.es.js} +565 -551
- package/.chunks/forms-xkXHvvah.es.js.map +1 -0
- package/.chunks/index-DLUtoTUg.amd.js.map +1 -1
- package/.chunks/index-DkQWJkMc.es.js.map +1 -1
- package/.chunks/lazy-40pjr8cZ.es.js.map +1 -1
- package/.chunks/lazy-DSFLxvj4.amd.js.map +1 -1
- package/.chunks/{notice-DwjipV21.amd.js → notice-hF3z8ewG.amd.js} +2 -2
- package/.chunks/notice-hF3z8ewG.amd.js.map +1 -0
- package/.chunks/{notice-Cl3ZgiHm.es.js → notice-wqZxmsUH.es.js} +2 -2
- package/.chunks/notice-wqZxmsUH.es.js.map +1 -0
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-CpRJQFD1.es.js → page.vue_vue_type_script_setup_true_lang-rW3w9LMh.es.js} +4 -4
- package/.chunks/page.vue_vue_type_script_setup_true_lang-rW3w9LMh.es.js.map +1 -0
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-CjIiZU-D.amd.js → page.vue_vue_type_script_setup_true_lang-tiWuQ_ZK.amd.js} +2 -2
- package/.chunks/page.vue_vue_type_script_setup_true_lang-tiWuQ_ZK.amd.js.map +1 -0
- package/.chunks/policy.vue_vue_type_style_index_0_lang-C9A--uWd.es.js +503 -0
- package/.chunks/policy.vue_vue_type_style_index_0_lang-C9A--uWd.es.js.map +1 -0
- package/.chunks/policy.vue_vue_type_style_index_0_lang-DABqSSXw.amd.js +2 -0
- package/.chunks/policy.vue_vue_type_style_index_0_lang-DABqSSXw.amd.js.map +1 -0
- package/.chunks/{popup-Jw_Yyg3U.es.js → popup-BeLPdHWv.es.js} +2 -2
- package/.chunks/popup-BeLPdHWv.es.js.map +1 -0
- package/.chunks/{popup-DRuyYFGB.amd.js → popup-Bwmu8rOb.amd.js} +2 -2
- package/.chunks/popup-Bwmu8rOb.amd.js.map +1 -0
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-DtiT6NE4.amd.js → popupHint.vue_vue_type_style_index_0_lang-B0BWXhHK.amd.js} +2 -2
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-B0BWXhHK.amd.js.map +1 -0
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-DD59yF6H.es.js → popupHint.vue_vue_type_style_index_0_lang-fnjq0yg1.es.js} +2 -2
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-fnjq0yg1.es.js.map +1 -0
- package/.chunks/store-CX_6ZXhO.es.js.map +1 -1
- package/.chunks/store-YRW59xEF.amd.js.map +1 -1
- package/.chunks/{utils-D9nYQabE.amd.js → utils-BRJvuqe_.amd.js} +2 -2
- package/.chunks/utils-BRJvuqe_.amd.js.map +1 -0
- package/.chunks/{utils-YrUExsH7.es.js → utils-ByqQkftW.es.js} +2 -2
- package/.chunks/utils-ByqQkftW.es.js.map +1 -0
- package/.chunks/{utils-Q69SXlnV.es.js → utils-YVlPlqDK.es.js} +3 -3
- package/.chunks/utils-YVlPlqDK.es.js.map +1 -0
- package/.chunks/{utils-CzHUG_xz.amd.js → utils-cAJahDml.amd.js} +2 -2
- package/.chunks/utils-cAJahDml.amd.js.map +1 -0
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-CkE912ll.amd.js → widgetInput.vue_vue_type_script_setup_true_lang-D7lVLE3D.amd.js} +2 -2
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-D7lVLE3D.amd.js.map +1 -0
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-CDkeKVqY.es.js → widgetInput.vue_vue_type_script_setup_true_lang-UUovJzhL.es.js} +2 -2
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-UUovJzhL.es.js.map +1 -0
- package/README.md +82 -82
- package/api/additional.amd.js.map +1 -1
- package/api/additional.js.map +1 -1
- package/api/index.amd.js +1 -1
- package/api/index.amd.js.map +1 -1
- package/api/index.js +1 -1
- package/api/index.js.map +1 -1
- package/assets/core.css +1 -1
- package/assets/forms.css +1 -1
- package/assets/policy.css +1 -1
- package/assets/project.css +1 -1
- package/charts/charts.amd.js +1 -1
- package/charts/charts.amd.js.map +1 -1
- package/charts/charts.js +1 -1
- package/charts/charts.js.map +1 -1
- package/core/app.amd.js +1 -1
- package/core/app.amd.js.map +1 -1
- package/core/app.js +5 -5
- package/core/app.js.map +1 -1
- package/dialog/dialog.amd.js +1 -1
- package/dialog/dialog.amd.js.map +1 -1
- package/dialog/dialog.js +2 -2
- package/dialog/dialog.js.map +1 -1
- package/extra/extra.amd.js.map +1 -1
- package/extra/extra.js.map +1 -1
- package/forms/forms.amd.js +1 -1
- package/forms/forms.js +3 -3
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +123 -111
- package/formsExt/formsExt.js.map +1 -1
- package/icomoon/Read Me.txt +7 -7
- package/icomoon/Topvisor icons.json +6658 -0
- package/icomoon/demo-files/demo.css +158 -158
- package/icomoon/demo-files/demo.js +30 -30
- package/icomoon/demo.css +158 -158
- package/icomoon/demo.html +15 -1
- package/icomoon/demo.js +30 -30
- package/icomoon/fonts/Topvisor-2.eot +0 -0
- package/icomoon/fonts/Topvisor-2.svg +1 -0
- package/icomoon/fonts/Topvisor-2.ttf +0 -0
- package/icomoon/fonts/Topvisor-2.woff +0 -0
- package/icomoon/selection.json +1 -1
- package/icomoon/style.css +8 -5
- package/jquery-ui.min.css +5 -5
- package/layout/layout.amd.js +1 -1
- package/layout/layout.amd.js.map +1 -1
- package/layout/layout.js +1 -1
- package/layout/layout.js.map +1 -1
- package/package.json +1 -1
- package/popup/popup.amd.js +1 -1
- package/popup/popup.amd.js.map +1 -1
- package/popup/popup.js +6 -6
- package/popup/popup.js.map +1 -1
- package/popup/worker.amd.js +1 -1
- package/popup/worker.amd.js.map +1 -1
- package/popup/worker.js +2 -2
- package/popup/worker.js.map +1 -1
- package/project/project.amd.js +1 -1
- package/project/project.amd.js.map +1 -1
- package/project/project.js +892 -613
- package/project/project.js.map +1 -1
- package/require/css.amd.js +12 -12
- package/src/api/api/types/client/request-options.d.ts +8 -3
- package/src/components/forms/caption/types.d.ts +5 -1
- package/src/components/forms/input/input.vue.d.ts +2 -4
- package/src/components/forms/input/types.d.ts +15 -0
- package/src/components/forms/select/select.vue.d.ts +15 -2
- package/src/components/forms/select/types.d.ts +6 -0
- package/src/components/formsExt/editArea/editArea.vue.d.ts +15 -2
- package/src/components/formsExt/editArea/types.d.ts +6 -0
- package/src/components/formsExt/editInput/editInput.vue.d.ts +16 -1
- package/src/components/formsExt/selector2/composables/useAPI.d.ts +2 -0
- package/src/components/formsExt/selector2/composables/useMenu.d.ts +3 -1
- package/src/components/formsExt/selector2/types.d.ts +14 -0
- package/src/components/popup/popup/listItem.vue.d.ts +24 -4
- package/src/components/popup/popup/types.d.ts +1 -0
- package/src/components/project/groupSelector/groupSelector.vue.d.ts +5 -0
- package/src/components/project/groupSelector/groups/groups.vue.d.ts +2 -0
- package/src/components/project/groupSelector/groups/types.d.ts +4 -0
- package/src/components/project/groupSelector/groups/utils.d.ts +1 -1
- package/src/components/project/groupSelector/types.d.ts +4 -0
- package/src/components/project/project.d.ts +1 -0
- package/src/components/project/projectSelector/projectSelector.vue.d.ts +121 -0
- package/src/components/project/projectSelector/stories/mocks/projects.d.ts +10 -0
- package/src/components/project/projectSelector/submenu/submenu.vue.d.ts +4 -0
- package/src/components/project/projectSelector/submenu/types.d.ts +17 -0
- package/src/components/project/projectSelector/types.d.ts +57 -0
- package/src/components/project/projectSelector/utils.d.ts +206 -0
- package/src/core/directives/shortcut.d.ts +12 -0
- package/src/core/utils/string.d.ts +1 -1
- package/tabs/tabs.amd.js.map +1 -1
- package/tabs/tabs.js.map +1 -1
- package/tabsView/tabsView.amd.js +1 -1
- package/tabsView/tabsView.amd.js.map +1 -1
- package/tabsView/tabsView.js +2 -2
- package/tabsView/tabsView.js.map +1 -1
- package/utils/check.amd.js.map +1 -1
- package/utils/check.js.map +1 -1
- package/utils/clipboard.amd.js +1 -1
- package/utils/clipboard.amd.js.map +1 -1
- package/utils/clipboard.js +1 -1
- package/utils/clipboard.js.map +1 -1
- package/utils/date.amd.js +1 -1
- package/utils/date.js +1 -1
- package/utils/device.amd.js +1 -1
- package/utils/device.js +1 -1
- package/utils/dom.amd.js.map +1 -1
- package/utils/dom.js.map +1 -1
- package/utils/image.amd.js.map +1 -1
- package/utils/image.js.map +1 -1
- package/utils/keyboard.amd.js.map +1 -1
- package/utils/keyboard.js.map +1 -1
- package/utils/lodash.amd.js +1 -1
- package/utils/lodash.js +1 -1
- package/utils/number.amd.js.map +1 -1
- package/utils/number.js.map +1 -1
- package/utils/price.amd.js +1 -1
- package/utils/price.amd.js.map +1 -1
- package/utils/price.js +1 -1
- package/utils/price.js.map +1 -1
- package/utils/route.amd.js.map +1 -1
- package/utils/route.js.map +1 -1
- package/utils/scroll.amd.js.map +1 -1
- package/utils/scroll.js.map +1 -1
- package/utils/searchers.amd.js +1 -1
- package/utils/searchers.amd.js.map +1 -1
- package/utils/searchers.js +3 -3
- package/utils/searchers.js.map +1 -1
- package/utils/string.amd.js +1 -1
- package/utils/string.amd.js.map +1 -1
- package/utils/string.js +50 -50
- package/utils/string.js.map +1 -1
- package/utils/system.amd.js.map +1 -1
- package/utils/system.js.map +1 -1
- package/utils/url.amd.js.map +1 -1
- package/utils/url.js.map +1 -1
- package/web-types.json +31 -0
- package/.chunks/core-BL-38XF7.es.js +0 -196
- package/.chunks/core-BL-38XF7.es.js.map +0 -1
- package/.chunks/core-BsPx05H9.amd.js +0 -2
- package/.chunks/core-BsPx05H9.amd.js.map +0 -1
- package/.chunks/datepicker-3coUsFW2.amd.js.map +0 -1
- package/.chunks/datepicker-D1Hw3a3o.es.js.map +0 -1
- package/.chunks/dialog_regionSelectorRegions-1UVhgK2f.es.js.map +0 -1
- package/.chunks/dialog_regionSelectorRegions-CZ8IX7la.amd.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-DRbTG0vh.es.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-Dq9kWWMg.amd.js.map +0 -1
- package/.chunks/forms-BseC3Ftz.es.js.map +0 -1
- package/.chunks/forms-CUSCBQu3.amd.js.map +0 -1
- package/.chunks/notice-Cl3ZgiHm.es.js.map +0 -1
- package/.chunks/notice-DwjipV21.amd.js.map +0 -1
- package/.chunks/page.vue_vue_type_script_setup_true_lang-CjIiZU-D.amd.js.map +0 -1
- package/.chunks/page.vue_vue_type_script_setup_true_lang-CpRJQFD1.es.js.map +0 -1
- package/.chunks/policy.vue_vue_type_style_index_0_lang-BBDJEs5Q.es.js +0 -496
- package/.chunks/policy.vue_vue_type_style_index_0_lang-BBDJEs5Q.es.js.map +0 -1
- package/.chunks/policy.vue_vue_type_style_index_0_lang-DJOaMdBm.amd.js +0 -2
- package/.chunks/policy.vue_vue_type_style_index_0_lang-DJOaMdBm.amd.js.map +0 -1
- package/.chunks/popup-DRuyYFGB.amd.js.map +0 -1
- package/.chunks/popup-Jw_Yyg3U.es.js.map +0 -1
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-DD59yF6H.es.js.map +0 -1
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-DtiT6NE4.amd.js.map +0 -1
- package/.chunks/utils-CzHUG_xz.amd.js.map +0 -1
- package/.chunks/utils-D9nYQabE.amd.js.map +0 -1
- package/.chunks/utils-Q69SXlnV.es.js.map +0 -1
- package/.chunks/utils-YrUExsH7.es.js.map +0 -1
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-CDkeKVqY.es.js.map +0 -1
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-CkE912ll.amd.js.map +0 -1
package/tabsView/tabsView.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabsView.js","sources":["../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue"],"sourcesContent":["import { watch } from 'vue';\nimport type { Store } from './store';\n\n/**\n * Сгенерировать имя для сохранения данных в localStorage\n * @param stateName - имя свойства состояния\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\n */\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\n\tconst stateNameString = String(stateName);\n\n\treturn `top:${stateNameString}:${stateKey}`;\n};\n\n/**\n * Загрузить состояние\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\ttry {\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\n\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\n\t\t\tstore[stateName] = localStorageValue;\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\n\t}\n};\n\n/**\n * Добавить автосохранение состояние при его изменении\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\twatch(() => store[stateName], () => {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\n\t}, { immediate: true });\n};\n\nexport default {\n\tloadLocalStorge,\n\taddSaverLocalStorge,\n};","import type { InjectionKey, ModelRef, UnwrapNestedRefs } from 'vue';\nimport { computed, ref } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './types';\nimport { getHash } from '@/core/utils/route';\n\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\n\naddEventListener('popstate', (e) => {\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\n});\n\nexport const injectionKey = Symbol() as InjectionKey<Store>;\n\n/**\n * Инициировать Store компонента\n */\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>): UnwrapNestedRefs<Store> & DefineStore => {\n\tconst store = defineStore(injectionKey, () => {\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\n\t\tconst pageMod = computed(() => props.pageMod);\n\t\tconst isShort = ref(false);\n\n\t\tconst component = ref(undefined);\n\t\tconst scrollable = ref(true);\n\n\t\treturn {\n\t\t\tshowMenuInPopup,\n\t\t\tpageMod,\n\t\t\tisShort,\n\t\t\tactiveItemName: model,\n\t\t\tcomponent,\n\t\t\tscrollable,\n\t\t};\n\t}, props.idState);\n\n\tif (props.isShortable) {\n\t\tconst stateName = 'isShort';\n\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\n\t}\n\n\tif (store.$id) {\n\t\tconst popstateCallback = (_e: PopStateEvent) => {\n\t\t\tmodel.value = getHash(store.$id!);\n\t\t};\n\n\t\tpopstateCallbacks.add(popstateCallback);\n\t}\n\n\treturn store;\n};\n\n/**\n * Получить Store компонента\n */\nexport const useTabsStore = () => useStore(injectionKey);\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { TopPopupListItem } from '@/components/popup/popup';\nimport { useTabsStore } from './store';\nimport type { PropsMenuItem } from './types';\n\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\n\tscrollable: true,\n\tcomponent: undefined,\n});\n\nconst store = useTabsStore();\n\nconst href = computed(() => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (props.name && store.$id) {\n\t\treturn genHash(store.$id, props.name);\n\t}\n\n\treturn props.href;\n});\n\nconst tagName = computed(() => {\n\tif (store.showMenuInPopup) {\n\t\treturn TopPopupListItem;\n\t}\n\n\treturn href ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot name=\"default\" v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot name=\"default\"></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-2);\n\t--top-icon-width: calc(var(--top-icon-size));\n\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\n\tborder: none;\n\tborder-radius: var(--top-radius-2);\n\tpadding: var(--top-padding-2);\n\tbackground: transparent;\n\theight: 40px;\n\n\tcolor: var(--color-text-1);\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\n\tdisplay: flex;\n\tgap: var(--top-gap-2);\n\talign-items: center;\n\tjustify-content: flex-start;\n\ttransition: background var(--transition);\n}\n\n.top-tabsView_menuItem:hover {\n\t--top-icon-color: var(--color-text-1);\n\n\tbackground: var(--color-bg-shading-1);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\t--top-icon-color: inherit;\n\n\tbackground: var(--color-layout-front-1);\n\tcolor: inherit;\n}\n\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\n\topacity: unset;\n\tfilter: unset;\n}\n\n.top-tabsView_menuItem.top-disabled {\n\t--top-icon-color: var(--color-text-4);\n\n\tcolor: var(--color-text-4);\n}\n</style>\n","// TODO: Эту функцию можно вынести в глобальный utils\n\nimport { sleepWhile } from '@/core/utils/system';\n\n/**\n * Проверка нахождения компонента в состояние загрузки\n * @param component\n */\nexport const checkComponentIsLoading = (component: any) => {\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\n};\n\n/**\n * Презагрузить компонент\n *\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\n */\nexport const preResolveComponent = async (component: any, condition: Function) => {\n\tif (component?.name !== 'AsyncComponentWrapper') return;\n\tif (component?.__asyncResolved) return;\n\n\tcomponent.__asyncLoader();\n\n\tawait sleepWhile(() => {\n\t\treturn condition() && checkComponentIsLoading(component);\n\t}, 200);\n};\n","<script setup lang=\"ts\">\nimport type { Ref, VNode } from 'vue';\nimport { markRaw, onMounted, onUnmounted, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\nimport { useTabsStore } from './store';\nimport TabsViewMenuItem from './menuItem.vue';\nimport { preResolveComponent } from './utils';\n\ndefineProps<PropsMenu>();\n\nconst isLoading = defineModel('isLoading');\n\nconst store = useTabsStore();\n\nconst slots = useSlots();\n\n// словарь используется для оптимизации получения нужного menuItem\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\n\n// заполнить словарь с menuItem, по элементам в slot default\nconst setMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default({}).find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tsetMenuItemByNameFromItems(component.children);\n};\n\n// заполнить словарь с menuItem, по элементам\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\n\tmenuItems.forEach((subComponent: any) => {\n\t\t// это не компонент элемента меню\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\n\t\t// это не компонент, например template\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subComponent.props?.name || subComponent.props?.disabled) return;\n\n\t\tconst menuItem: MenuItem = {\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\n\t\t\ticon: subComponent.props.icon,\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\n\t\t};\n\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\n\t});\n};\n\n/**\n * activeMenuItem нужен:\n * - для вывода текста активной вкладки в меню с popup\n * - для вывода компонента активной вкладки (store.component)\n * - для установки store.scrollable\n */\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\n\n/**\n * Кол-во изменений активной вкладки\n */\nlet countChanged = 0;\n\n/**\n * Смена активной вкладки\n *\n * TODO: смена slot, например смена языка, требует повторного выполнения setMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tsetMenuItemByName();\n\t\t}\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tstore.activeItemName = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\n\n\t\t// элемент не найден, установить из хеша страницы\n\t\tif (!activeMenuItem.value && store.$id) {\n\t\t\tconst activeItemName = getHash(store.$id);\n\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\n\n\t\t\tif (activeMenuItem.value) {\n\t\t\t\tstore.activeItemName = activeItemName;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// элемент не найден, установить первый доступный\n\t\tif (!activeMenuItem.value) {\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value!;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// запрошена смена на уже активный элемент\n\t\tif (activeMenuItem.value.component === store.component) {\n\t\t\tisLoading.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, false);\n\n\t\t// флаг загрузки будет сброшен при инициализации компонента\n\t\tisLoading.value = true;\n\n\t\t/**\n\t\t * Презагрузить компонент\n\t\t *\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\n\t\t */\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\n\n\t\t// влкадка была сменена еще раз во время sleepWhile\n\t\tif (numberChanged !== countChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\n\t\tstore.component = activeMenuItem.value.component;\n\n\t\tif (activeMenuItem.value && !store.component) {\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\n\t\t}\n\t},\n\t{ immediate: true },\n);\n\nconst elRef = ref();\nlet resizeObserver: ResizeObserver;\n\nonMounted(() => {\n\tresizeObserver = new ResizeObserver(() => {\n\t\telRef.value.parentElement.style.setProperty('--top-tabsView-contents-offset-top', elRef.value.offsetHeight + 'px');\n\t});\n\n\tresizeObserver.observe(elRef.value);\n});\n\nonUnmounted(() => {\n\tresizeObserver.disconnect();\n});\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t'top-tabsView_menu': true,\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<!-- Спрятать меню под кнопку в popup -->\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\n\t\t\t<template #opener>\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<slot></slot>\n\t\t\t</template>\n\t\t</TopPopup>\n\n\t\t<!-- Отобразить меню на странице -->\n\t\t<template v-else>\n\t\t\t<div class=\"top-tabsView_menuList\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"isShortable\"\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\n\t\t\t>\n\t\t\t\t<TabsViewMenuItem\n\t\t\t\t\tv-if=\"isShortable\"\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\n\t\t\t\t>\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\n\t\t\t\t</TabsViewMenuItem>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style>\n/* режим отображение табов в основной области документа */\n.top-tabsView-pageMod .top-tabsView_menu {\n\tbox-sizing: border-box;\n\tposition: sticky;\n\ttop: var(--top-tabsView-top);\n\tz-index: 10;\n}\n\n/* режим отображение табов в основной области документа без popup */\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\n}\n\n/* стантартный режим */\n.top-tabsView_menu-inPopup_0 {\n\tbox-sizing: border-box;\n\twidth: var(--top-tabsView-menu-width);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tflex-shrink: 0;\n}\n\n/* режим вывода в popup */\n.top-tabsView_menu-inPopup_1 {\n\tborder-bottom: 1px solid var(--color-line-2-opacity);\n}\n\n.top-tabsView_menu-short {\n\twidth: auto;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\n\tbackground: var(--color-layer-1);\n}\n\n.top-tabsView_menuOpenerIcon { display: flex; }\n\n.top-tabsView_menuOpenerActiveItem {\n\t--top-forms-padding: 0px;\n\n\tbox-sizing: border-box;\n\tpadding: var(--top-padding-2);\n\tmax-width: calc(100% - var(--top-forms-base-height));\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--top-padding-2);\n}\n\n.top-tabsView_menuList,\n.top-tabsView_menuFooter {\n\tpadding: var(--top-padding-2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-2);\n}\n\n.top-tabsView_menuList {\n\toverflow-y: auto;\n}\n\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\n\t--top-icon-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './types';\nimport { defineTabsStore } from './store';\nimport TabsViewMenu from './menu.vue';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\nimport { checkComponentIsLoading } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowMenuInPopup: undefined,\n\tisShortable: false,\n});\n\nconst model = defineModel<string>();\n\nconst store = defineTabsStore(props, model);\n\nconst uid = Math.random();\n\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\n\nonUnmounted(() => {\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\n\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\n});\n\nconst componentRef = ref();\nconst isLoading = ref(false);\n\nwatch([componentRef, () => store.component], () => {\n\tisLoading.value = checkComponentIsLoading(store.component);\n}, { immediate: true });\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView': true,\n\t\t\t'top-tabsView-pageMod': props.pageMod,\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<TabsViewMenu\n\t\t\t:isShortable=\"isShortable\"\n\t\t\tv-model:isLoading=\"isLoading\"\n\t\t>\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\n\t\t\t<slot name=\"menu\"></slot>\n\t\t</TabsViewMenu>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-tabsView_contents': true,\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\n\t\t\t}\"\n\t\t>\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t\t<keep-alive>\n\t\t\t\t<component\n\t\t\t\t\tref=\"componentRef\"\n\t\t\t\t\t:is=\"store.component\"\n\t\t\t\t/>\n\t\t\t</keep-alive>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n:root {\n\t--top-tabsView-top: 0px;\n\t--top-tabsView-menu-width: 220px;\n\t--top-tabsView-contents-offset-top: 0px;\n}\n\n.top-tabsView {\n\tbackground: var(--color-layout-middle);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n}\n\n.top-tabsView_contents {\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-layout-front-1);\n\tpadding: var(--top-padding-4);\n\tflex-grow: 1;\n\toverflow: auto;\n\tposition: relative;\n}\n\n.top-tabsView_contents-isLoading {\n\tpointer-events: none;\n}\n\n.top-tabsView_contents-noScrollable {\n\twidth: calc(100% - var(--top-tabsView-menu-width));\n\tpadding: 0;\n\toverflow: visible;\n}\n\n/* top-tabsView-inPopup */\n.top-tabsView-inPopup {\n\tbackground: var(--color-layout-front-1);\n\tflex-direction: column;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents {\n\tborder-radius: 0;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\n\twidth: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\n</template>\n\n<style>\n.top-tabsView_menuDelimeter {\n\tpadding: var(--top-padding-1) 0;\n\tdisplay: flex;\n}\n\n.top-tabsView_menuDelimeter:before {\n\tcontent: \"\";\n\theight: 2px;\n\tbackground: var(--color-line-2);\n\tflex-grow: 1;\n}\n\n.top-tabsView_menuDelimeter:first-child,\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\n\tdisplay: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useTabsStore } from './store';\nimport type { PropsMenuTitle } from './types';\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\nimport { TopPopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</TopPopupListItem>\n\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\n\n\t<div\n\t\tv-else\n\t\t:class=\"{\n\t\t\t'top-tabsView_menuTitle': true,\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\n\t\t}\"\n\t>\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style>\n.top-tabsView_menuTitle {\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\n\tfont-weight: 600;\n\tcolor: var(--color-text-1);\n}\n\n.top-tabsView_menuTitle-subtitle {\n\tpadding-top: var(--top-padding-1);\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tcolor: var(--color-text-2);\n}\n</style>\n"],"names":["genStorageKey","stateName","stateKey","loadLocalStorge","store","localStorageKey","localStorageValue","addSaverLocalStorge","watch","StoreLocalStorage","popstateCallbacks","e","popstateCallback","injectionKey","defineTabsStore","props","model","defineStore","showMenuInPopup","computed","Core","pageMod","isShort","ref","component","scrollable","_e","getHash","useTabsStore","useStore","__props","href","genHash","tagName","TopPopupListItem","onClick","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_unref","_renderSlot","_ctx","$slots","_createElementBlock","_hoisted_1","checkComponentIsLoading","preResolveComponent","condition","sleepWhile","isLoading","_useModel","slots","useSlots","menuItemByName","setMenuItemByName","item","setMenuItemByNameFromItems","menuItems","subComponent","TabsViewMenuItem","menuItem","markRaw","activeMenuItem","countChanged","numberChanged","activeItemName","setHash","elRef","resizeObserver","onMounted","onUnmounted","TopPopup","_createElementVNode","_hoisted_3","_toDisplayString","_Fragment","_hoisted_4","_hoisted_5","_createTextVNode","uid","delHash","componentRef","_createVNode","TabsViewMenu","$event","TopLoadbar","_KeepAlive","TabsViewMenuDelimeter"],"mappings":";;;;;;AAQA,MAAMA,IAAgB,CAAkBC,GAAoBC,MAGpD,OAFiB,OAAOD,CAAS,CAEX,IAAIC,CAAQ,IAQpCC,KAAkB,CAAkBF,GAAoBG,MAAa;AAE1E,MAAI,CAACA,EAAM,IAAK;AAEhB,QAAMC,IAAkBL,EAAcC,GAAWG,EAAM,GAAG;AAE1D,MAAI;AACH,UAAME,IAAsD,KAAK,MAAM,aAAa,QAAQD,CAAe,CAAW;AAEtH,IAAI,OAAOC,KAAsB,OAAOF,EAAMH,CAAS,MACtDG,EAAMH,CAAS,IAAIK;AAAA,EAErB,QAAY;AACX,YAAQ,KAAK,IAAI,MAAM,kBAAkBD,CAAe,sBAAsB,CAAC;AAAA,EAChF;AACD,GAOME,KAAsB,CAAkBN,GAAoBG,MAAa;AAE9E,MAAI,CAACA,EAAM,IAAK;AAEhB,QAAMC,IAAkBL,EAAcC,GAAWG,EAAM,GAAG;AAE1D,EAAAI,EAAM,MAAMJ,EAAMH,CAAS,GAAG,MAAM;AACnC,iBAAa,QAAQI,GAAiB,KAAK,UAAUD,EAAMH,CAAS,CAAC,CAAC;AAAA,EACvE,GAAG,EAAE,WAAW,IAAM;AACvB,GAEAQ,IAAe;AAAA,EACd,iBAAAN;AAAA,EACA,qBAAAI;AACD,GC/CMG,wBAAwB,IAAA;AAE9B,iBAAiB,YAAY,CAACC,MAAM;AACnC,EAAAD,EAAkB,QAAQ,CAAAE,MAAoBA,EAAiBD,CAAC,CAAC;AAClE,CAAC;AAEM,MAAME,IAAe,OAAA,GAKfC,KAAkB,CAACC,GAAcC,MAA+E;AAC5H,QAAMZ,IAAQa,GAAYJ,GAAc,MAAM;AAC7C,UAAMK,IAAkBC,EAAS,MAAMJ,EAAM,mBAAmBK,EAAK,MAAM,QAAQ,GAC7EC,IAAUF,EAAS,MAAMJ,EAAM,OAAO,GACtCO,IAAUC,EAAI,EAAK,GAEnBC,IAAYD,EAAI,MAAS,GACzBE,IAAaF,EAAI,EAAI;AAE3B,WAAO;AAAA,MACN,iBAAAL;AAAA,MACA,SAAAG;AAAA,MACA,SAAAC;AAAA,MACA,gBAAgBN;AAAA,MAChB,WAAAQ;AAAA,MACA,YAAAC;AAAA,IAAA;AAAA,EAEF,GAAGV,EAAM,OAAO;AAEhB,MAAIA,EAAM,aAAa;AACtB,UAAMd,IAAY;AAElB,IAAAQ,EAAkB,gBAAgBR,GAAWG,CAAK,GAClDK,EAAkB,oBAAoBR,GAAWG,CAAK;AAAA,EACvD;AAEA,MAAIA,EAAM,KAAK;AACd,UAAMQ,IAAmB,CAACc,MAAsB;AAC/C,MAAAV,EAAM,QAAQW,EAAQvB,EAAM,GAAI;AAAA,IACjC;AAEA,IAAAM,EAAkB,IAAIE,CAAgB;AAAA,EACvC;AAEA,SAAOR;AACR,GAKawB,IAAe,MAAMC,GAAShB,CAAY;;;;;;;;;;;;;;ACpDvD,UAAME,IAAQe,GAKR1B,IAAQwB,EAAA,GAERG,IAAOZ,EAAS,MAEjBJ,EAAM,QAAQX,EAAM,MAChB4B,EAAQ5B,EAAM,KAAKW,EAAM,IAAI,IAG9BA,EAAM,IACb,GAEKkB,IAAUd,EAAS,MACpBf,EAAM,kBACF8B,IAGDH,IAAO,MAAM,QACpB,GAKKI,IAAU,CAACxB,MAAkB;AAElC,MAAI,CAACI,EAAM,QAAQgB,EAAK,SACvBpB,EAAE,eAAA,GAGCI,EAAM,SACTX,EAAM,iBAAiBW,EAAM;AAAA,IAE/B;sBAICqB,KAAAC,EAsBYC,EArBNL,EAAA,KAAO,GAAA;AAAA,MACZ,QAAO;AAAA,MACN,OAAKM,EAAA;AAAA,QAAmC,yBAAA,CAAAC,EAAApC,CAAA,EAAM;AAAA,QAAoC,cAAA0B,EAAA,QAAQU,EAAApC,CAAA,EAAM,mBAAmB0B,EAAA;AAAA,wBAA2BA,EAAA;AAAA;;MAM9I,MAAMC,EAAA;AAAA,MACN,iBAAeD,EAAA,QAAQ;AAAA,MACvB,UAAUA,EAAA,YAAY;AAAA,MACtB,SAAAK;AAAA,IAAA;iBAED,MAAyD;AAAA,QAA9BK,EAAApC,CAAA,EAAM,kBAAjCqC,EAAyDC,EAAA,QAAA,WAAA,EAAA,KAAA,GAAA,IAG7CC,EAAAA,OAAO,WAAO,CAAKH,EAAApC,CAAA,EAAM,WADrCgC,KAAAQ,EAKO,QALPC,IAKO;AAAA,UADNJ,EAA4BC,EAAA,QAAA,SAAA;AAAA,QAAA;;;;;IC3DlBI,IAA0B,CAACtB,MAChCA,GAAW,SAAS,2BAA2B,CAACA,GAAW,iBAQtDuB,KAAsB,OAAOvB,GAAgBwB,MAAwB;AACjF,EAAIxB,GAAW,SAAS,4BACpBA,GAAW,oBAEfA,EAAU,cAAA,GAEV,MAAMyB,GAAW,MACTD,EAAA,KAAeF,EAAwBtB,CAAS,GACrD,GAAG;AACP;;;;;;;;;;;;;;ACbA,UAAM0B,IAAYC,EAAWrB,GAAC,WAAW,GAEnC1B,IAAQwB,EAAA,GAERwB,IAAQC,EAAA,GAGRC,wBAA2D,IAAA,GAG3DC,IAAoB,MAAM;AAC/B,UAAI,CAACH,EAAM,QAAS;AAEpB,YAAM5B,IAAiB4B,EAAM,QAAQ,EAAE,EAAE,KAAK,CAAAI,MAAQA,EAAK,QAAQ,OAAO;AAC1E,MAAKhC,KAELiC,EAA2BjC,EAAU,QAAQ;AAAA,IAC9C,GAGMiC,IAA6B,CAACC,MAAuB;AAC1D,MAAAA,EAAU,QAAQ,CAACC,MAAsB;AAExC,YAAIA,EAAa,KAAK,UAAUA,EAAa,KAAK,WAAWC,EAAiB,OAAQ;AAGtF,YAAI,CAACD,EAAa,KAAK,UAAU,OAAOA,EAAa,YAAa,UAAU;AAC3E,UAAAF,EAA2BE,EAAa,QAAQ;AAEhD;AAAA,QACD;AAEA,YAAI,CAACA,EAAa,OAAO,QAAQA,EAAa,OAAO,SAAU;AAE/D,cAAME,IAAqB;AAAA,UAC1B,QAAQF,EAAa,SAAS,UAAA,EAAY,CAAC,EAAE,UAAoB,KAAA;AAAA,UACjE,MAAMA,EAAa,MAAM;AAAA,UACzB,WAAWA,EAAa,MAAM,YAAYG,EAAQH,EAAa,MAAM,SAAS,IAAIC,EAAiB,MAAM,UAAU;AAAA,UACnH,YAAYD,EAAa,MAAM,cAAcC,EAAiB,MAAM,WAAW;AAAA,QAAA;AAGhF,QAAAN,EAAe,IAAIK,EAAa,MAAM,MAAME,CAAQ;AAAA,MACrD,CAAC;AAAA,IACF,GAQME,IAAuCxC,EAAI,IAAI;AAKrD,QAAIyC,IAAe;AAOnB,IAAAxD;AAAA,MACC,MAAMJ,EAAM;AAAA,MACZ,YAAY;AACX,cAAM6D,IAAgB,EAAED;AAMxB,YAJIV,EAAe,SAAS,KAC3BC,EAAA,GAGGD,EAAe,SAAS,GAAG;AAC9B,UAAAlD,EAAM,iBAAiB;AAEvB;AAAA,QACD;AAKA,YAHA2D,EAAe,QAAQT,EAAe,IAAIlD,EAAM,cAAc,KAAK,MAG/D,CAAC2D,EAAe,SAAS3D,EAAM,KAAK;AACvC,gBAAM8D,IAAiBvC,EAAQvB,EAAM,GAAG;AAIxC,cAFA2D,EAAe,QAAQT,EAAe,IAAIY,CAAc,KAAK,MAEzDH,EAAe,OAAO;AACzB,YAAA3D,EAAM,iBAAiB8D;AAEvB;AAAA,UACD;AAAA,QACD;AAGA,YAAI,CAACH,EAAe,OAAO;AAC1B,UAAA3D,EAAM,iBAAiBkD,EAAe,KAAA,EAAO,OAAO;AAEpD;AAAA,QACD;AAGA,YAAIS,EAAe,MAAM,cAAc3D,EAAM,WAAW;AACvD,UAAA8C,EAAU,QAAQ;AAElB;AAAA,QACD;AAeA,QAbI9C,EAAM,OAAK+D,EAAQ/D,EAAM,KAAKA,EAAM,gBAAgB,EAAK,GAG7D8C,EAAU,QAAQ,IAOlB,MAAMH,GAAoBgB,EAAe,MAAM,WAAW,MAAME,MAAkBD,CAAY,GAG1FC,MAAkBD,MAItB5D,EAAM,aAAa2D,EAAe,MAAM,YACxC3D,EAAM,YAAY2D,EAAe,MAAM,WAEnCA,EAAe,SAAS,CAAC3D,EAAM,aAClC,QAAQ,KAAK,qBAAqBA,EAAM,cAAc,wDAAwDA,EAAM,cAAc,GAAG;AAAA,MAEvI;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAGnB,UAAMgE,IAAQ7C,EAAA;AACd,QAAI8C;AAEJ,WAAAC,EAAU,MAAM;AACf,MAAAD,IAAiB,IAAI,eAAe,MAAM;AACzC,QAAAD,EAAM,MAAM,cAAc,MAAM,YAAY,sCAAsCA,EAAM,MAAM,eAAe,IAAI;AAAA,MAClH,CAAC,GAEDC,EAAe,QAAQD,EAAM,KAAK;AAAA,IACnC,CAAC,GAEDG,EAAY,MAAM;AACjB,MAAAF,EAAe,WAAA;AAAA,IAChB,CAAC,mBAIAzB,EAmDM,OAAA;AAAA,eAlDD;AAAA,MAAJ,KAAIwB;AAAA,MACH,OAAK7B,EAAA;AAAA;QAAqE,+BAAA,CAAAC,EAAApC,CAAA,EAAM;AAAA,QAAmD,+BAAAoC,EAAApC,CAAA,EAAM;AAAA,QAA+C,2BAAAoC,EAAApC,CAAA,EAAM,WAAO,CAAKoC,EAAApC,CAAA,EAAM;AAAA,MAAA;;MAQjMoC,EAAApC,CAAA,EAAM,wBAAtBiC,EAoBWG,EAAAgC,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,QAnBC,UACV,MAYM;AAAA,UAZNC,EAYM,OAZN5B,IAYM;AAAA,YAVEkB,EAAA,cADPnB,EAQM,OAAA;AAAA;cANL,OAAM;AAAA,cACL,iBAAemB,EAAA,MAAe;AAAA,YAAA;cAE/BU,EAEO,QAFPC,IAEOC,EADHZ,EAAA,MAAe,KAAK,GAAA,CAAA;AAAA,YAAA;4BAIzBU,EAAiE,OAAA;AAAA,cAA5D,OAAM;AAAA,cAA8B,iBAAc;AAAA,YAAA;;;QAI9C,eACV,MAAa;AAAA,UAAbhC,EAAaC,EAAA,QAAA,SAAA;AAAA,QAAA;;kBAKfE,EAiBWgC,GAAA,EAAA,KAAA,KAAA;AAAA,QAhBVH,EAEM,OAFNI,IAEM;AAAA,UADLpC,EAAaC,EAAA,QAAA,SAAA;AAAA,QAAA;QAIPZ,EAAA,eADPM,EAAA,GAAAQ,EAWM,OAXNkC,IAWM;AAAA,UANEhD,EAAA,oBADPO,EAMmBuB,GAAA;AAAA;YAJjB,MAAMpB,EAAApC,CAAA,EAAM,UAAO,MAAA;AAAA,YACnB,gCAAOoC,EAAApC,CAAA,EAAM,UAAO,CAAIoC,EAAApC,CAAA,EAAM;AAAA,UAAA;uBAE/B,MAAqC;AAAA,cAAlC2E,EAAAJ,EAAAnC,EAAApC,CAAA,EAAM,UAAO,KAAA,UAAA,GAAA,CAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;ACzMrB,UAAMW,IAAQe,GAKRd,IAAQmC,EAAmBrB,GAAA,YAAC,GAE5B1B,IAAQU,GAAgBC,GAAOC,CAAK,GAEpCgE,IAAM,KAAK,OAAA;AAEjB,IAAIjE,EAAM,WAASK,EAAK,MAAM,0BAA0B,IAAI4D,GAAK,wBAAwB,GAEzFT,EAAY,MAAM;AACjB,MAAIxD,EAAM,WAASK,EAAK,MAAM,0BAA0B,OAAO4D,CAAG,GAE9D5E,EAAM,OAAK6E,EAAQ7E,EAAM,KAAKA,EAAM,gBAAgB,EAAI;AAAA,IAC7D,CAAC;AAED,UAAM8E,IAAe3D,EAAA,GACf2B,IAAY3B,EAAI,EAAK;AAE3B,WAAAf,EAAM,CAAC0E,GAAc,MAAM9E,EAAM,SAAS,GAAG,MAAM;AAClD,MAAA8C,EAAU,QAAQJ,EAAwB1C,EAAM,SAAS;AAAA,IAC1D,GAAG,EAAE,WAAW,IAAM,mBAIrBwC,EA+BM,OAAA;AAAA,MA9BJ,OAAKL,EAAA;AAAA;QAAwD,wBAAAxB,EAAM;AAAA,QAAoC,wBAAAyB,EAAApC,CAAA,EAAM;AAAA,MAAA;;MAM9G+E,EAMeC,IAAA;AAAA,QALb,aAAatD,EAAA;AAAA,QACN,WAAWoB,EAAA;AAAA,qDAAAA,EAAS,QAAAmC;AAAA,MAAA;mBAG5B,MAAyB;AAAA,UAAzB5C,EAAyBC,EAAA,QAAA,MAAA;AAAA,QAAA;;;MAG1B+B,EAeM,OAAA;AAAA,QAdJ,OAAKlC,EAAA;AAAA;6CAA8EW,EAAA;AAAA,UAAsD,sCAAA,CAAAV,EAAApC,CAAA,EAAM;AAAA,QAAA;;QAM9H8C,EAAA,cAAlBb,EAA8BiD,GAAA,EAAA,KAAA,EAAA,CAAA;cAE9BjD,EAKakD,GAAA,MAAA;AAAA,gBAJZlD,EAGEC,EADIE,EAAApC,CAAA,EAAM,SAAS,GAAA;AAAA,qBADhB;AAAA,YAAJ,KAAI8E;AAAA,UAAA;;;;;aC3DHrC,KAAA,EAAA,OAAM,6BAA4B;;AAAvC,SAAAT,EAAA,GAAAQ,EAA8C,OAA9CC,EAA8C;;;;;;;;ACG/C,UAAMzC,IAAQwB,EAAA;qBAKNY,EAAApC,CAAA,EAAM,wBADbiC,EAKmBG,EAAAN,CAAA,GAAA;AAAA;MAHlB,MAAK;AAAA,IAAA;iBAEL,MAAa;AAAA,QAAbO,EAAaC,EAAA,QAAA,SAAA;AAAA,MAAA;;UAGoBF,EAAApC,CAAA,EAAM,gBAAxCiC,EAAkDmD,IAAA,EAAA,KAAA,EAAA,CAAA,WAElD5C,EAQM,OAAA;AAAA;MANJ,OAAKL,EAAA;AAAA;2CAA6ET,EAAA;AAAA,MAAA;;MAKnFW,EAAaC,EAAA,QAAA,SAAA;AAAA,IAAA;;;"}
|
|
1
|
+
{"version":3,"file":"tabsView.js","sources":["../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue"],"sourcesContent":["import { watch } from 'vue';\r\nimport type { Store } from './store';\r\n\r\n/**\r\n * Сгенерировать имя для сохранения данных в localStorage\r\n * @param stateName - имя свойства состояния\r\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\r\n */\r\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\r\n\tconst stateNameString = String(stateName);\r\n\r\n\treturn `top:${stateNameString}:${stateKey}`;\r\n};\r\n\r\n/**\r\n * Загрузить состояние\r\n * @param stateName - имя свойства состояния\r\n * @param store\r\n */\r\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\r\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\r\n\tif (!store.$id) return;\r\n\r\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\r\n\r\n\ttry {\r\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\r\n\r\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\r\n\t\t\tstore[stateName] = localStorageValue;\r\n\t\t}\r\n\t} catch (e) {\r\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\r\n\t}\r\n};\r\n\r\n/**\r\n * Добавить автосохранение состояние при его изменении\r\n * @param stateName - имя свойства состояния\r\n * @param store\r\n */\r\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\r\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\r\n\tif (!store.$id) return;\r\n\r\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\r\n\r\n\twatch(() => store[stateName], () => {\r\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\r\n\t}, { immediate: true });\r\n};\r\n\r\nexport default {\r\n\tloadLocalStorge,\r\n\taddSaverLocalStorge,\r\n};","import type { InjectionKey, ModelRef, UnwrapNestedRefs } from 'vue';\r\nimport { computed, ref } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\r\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\r\nimport type { Props, Store } from './types';\r\nimport { getHash } from '@/core/utils/route';\r\n\r\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\r\n\r\naddEventListener('popstate', (e) => {\r\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\r\n});\r\n\r\nexport const injectionKey = Symbol() as InjectionKey<Store>;\r\n\r\n/**\r\n * Инициировать Store компонента\r\n */\r\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>): UnwrapNestedRefs<Store> & DefineStore => {\r\n\tconst store = defineStore(injectionKey, () => {\r\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\r\n\t\tconst pageMod = computed(() => props.pageMod);\r\n\t\tconst isShort = ref(false);\r\n\r\n\t\tconst component = ref(undefined);\r\n\t\tconst scrollable = ref(true);\r\n\r\n\t\treturn {\r\n\t\t\tshowMenuInPopup,\r\n\t\t\tpageMod,\r\n\t\t\tisShort,\r\n\t\t\tactiveItemName: model,\r\n\t\t\tcomponent,\r\n\t\t\tscrollable,\r\n\t\t};\r\n\t}, props.idState);\r\n\r\n\tif (props.isShortable) {\r\n\t\tconst stateName = 'isShort';\r\n\r\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\r\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\r\n\t}\r\n\r\n\tif (store.$id) {\r\n\t\tconst popstateCallback = (_e: PopStateEvent) => {\r\n\t\t\tmodel.value = getHash(store.$id!);\r\n\t\t};\r\n\r\n\t\tpopstateCallbacks.add(popstateCallback);\r\n\t}\r\n\r\n\treturn store;\r\n};\r\n\r\n/**\r\n * Получить Store компонента\r\n */\r\nexport const useTabsStore = () => useStore(injectionKey);\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\nimport { genHash } from '@/core/utils/route';\r\nimport { TopPopupListItem } from '@/components/popup/popup';\r\nimport { useTabsStore } from './store';\r\nimport type { PropsMenuItem } from './types';\r\n\r\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\r\n\tscrollable: true,\r\n\tcomponent: undefined,\r\n});\r\n\r\nconst store = useTabsStore();\r\n\r\nconst href = computed(() => {\r\n\t// это внутренняя хеш навигация, ссылка на вкладку\r\n\tif (props.name && store.$id) {\r\n\t\treturn genHash(store.$id, props.name);\r\n\t}\r\n\r\n\treturn props.href;\r\n});\r\n\r\nconst tagName = computed(() => {\r\n\tif (store.showMenuInPopup) {\r\n\t\treturn TopPopupListItem;\r\n\t}\r\n\r\n\treturn href ? 'a' : 'button';\r\n});\r\n\r\n/**\r\n * Клик по элементу меню\r\n */\r\nconst onClick = (e: MouseEvent) => {\r\n\t// это внутренняя хеш навигация, ссылка на вкладку\r\n\tif (!props.href && href.value) {\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\tif (props.name) {\r\n\t\tstore.activeItemName = props.name;\r\n\t}\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<component\r\n\t\t:is=\"tagName\"\r\n\t\ttarget=\"_self\"\r\n\t\t:class=\"{\r\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\r\n\t\t\t['top-active']: name && store.activeItemName === name,\r\n\t\t\t['top-disabled']: disabled,\r\n\t\t\t['top-spa-disabled']: true,\r\n\t\t}\"\r\n\t\t:href=\"href\"\r\n\t\t:data-top-icon=\"icon || undefined\"\r\n\t\t:disabled=\"disabled || undefined\"\r\n\t\t@click=\"onClick\"\r\n\t>\r\n\t\t<slot name=\"default\" v-if=\"store.showMenuInPopup\"></slot>\r\n\r\n\t\t<span\r\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\r\n\t\t\tclass=\"top-ellipsis\"\r\n\t\t>\r\n\t\t\t<slot name=\"default\"></slot>\r\n\t\t</span>\r\n\t</component>\r\n</template>\r\n\r\n<style>\r\n.top-tabsView_menuItem {\r\n\t--top-icon-color: var(--color-text-2);\r\n\t--top-icon-width: calc(var(--top-icon-size));\r\n\r\n\tcursor: pointer;\r\n\tbox-sizing: border-box;\r\n\r\n\tborder: none;\r\n\tborder-radius: var(--top-radius-2);\r\n\tpadding: var(--top-padding-2);\r\n\tbackground: transparent;\r\n\theight: 40px;\r\n\r\n\tcolor: var(--color-text-1);\r\n\ttext-decoration: none;\r\n\twhite-space: nowrap;\r\n\r\n\tdisplay: flex;\r\n\tgap: var(--top-gap-2);\r\n\talign-items: center;\r\n\tjustify-content: flex-start;\r\n\ttransition: background var(--transition);\r\n}\r\n\r\n.top-tabsView_menuItem:hover {\r\n\t--top-icon-color: var(--color-text-1);\r\n\r\n\tbackground: var(--color-bg-shading-1);\r\n\ttext-decoration: none;\r\n}\r\n\r\n.top-tabsView_menuItem.top-active {\r\n\t--top-icon-color: inherit;\r\n\r\n\tbackground: var(--color-layout-front-1);\r\n\tcolor: inherit;\r\n}\r\n\r\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\r\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\r\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\r\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\r\n\topacity: unset;\r\n\tfilter: unset;\r\n}\r\n\r\n.top-tabsView_menuItem.top-disabled {\r\n\t--top-icon-color: var(--color-text-4);\r\n\r\n\tcolor: var(--color-text-4);\r\n}\r\n</style>\r\n","// TODO: Эту функцию можно вынести в глобальный utils\r\n\r\nimport { sleepWhile } from '@/core/utils/system';\r\n\r\n/**\r\n * Проверка нахождения компонента в состояние загрузки\r\n * @param component\r\n */\r\nexport const checkComponentIsLoading = (component: any) => {\r\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\r\n};\r\n\r\n/**\r\n * Презагрузить компонент\r\n *\r\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\r\n */\r\nexport const preResolveComponent = async (component: any, condition: Function) => {\r\n\tif (component?.name !== 'AsyncComponentWrapper') return;\r\n\tif (component?.__asyncResolved) return;\r\n\r\n\tcomponent.__asyncLoader();\r\n\r\n\tawait sleepWhile(() => {\r\n\t\treturn condition() && checkComponentIsLoading(component);\r\n\t}, 200);\r\n};\r\n","<script setup lang=\"ts\">\r\nimport type { Ref, VNode } from 'vue';\r\nimport { markRaw, onMounted, onUnmounted, ref, useSlots, watch } from 'vue';\r\nimport { TopPopup } from '../../popup/popup';\r\nimport { getHash, setHash } from '@/core/utils/route';\r\n\r\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\r\nimport { useTabsStore } from './store';\r\nimport TabsViewMenuItem from './menuItem.vue';\r\nimport { preResolveComponent } from './utils';\r\n\r\ndefineProps<PropsMenu>();\r\n\r\nconst isLoading = defineModel('isLoading');\r\n\r\nconst store = useTabsStore();\r\n\r\nconst slots = useSlots();\r\n\r\n// словарь используется для оптимизации получения нужного menuItem\r\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\r\n\r\n// заполнить словарь с menuItem, по элементам в slot default\r\nconst setMenuItemByName = () => {\r\n\tif (!slots.default) return;\r\n\r\n\tconst component: any = slots.default({}).find(item => item.key === '_menu');\r\n\tif (!component) return;\r\n\r\n\tsetMenuItemByNameFromItems(component.children);\r\n};\r\n\r\n// заполнить словарь с menuItem, по элементам\r\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\r\n\tmenuItems.forEach((subComponent: any) => {\r\n\t\t// это не компонент элемента меню\r\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\r\n\r\n\t\t// это не компонент, например template\r\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\r\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!subComponent.props?.name || subComponent.props?.disabled) return;\r\n\r\n\t\tconst menuItem: MenuItem = {\r\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\r\n\t\t\ticon: subComponent.props.icon,\r\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\r\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\r\n\t\t};\r\n\r\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\r\n\t});\r\n};\r\n\r\n/**\r\n * activeMenuItem нужен:\r\n * - для вывода текста активной вкладки в меню с popup\r\n * - для вывода компонента активной вкладки (store.component)\r\n * - для установки store.scrollable\r\n */\r\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\r\n\r\n/**\r\n * Кол-во изменений активной вкладки\r\n */\r\nlet countChanged = 0;\r\n\r\n/**\r\n * Смена активной вкладки\r\n *\r\n * TODO: смена slot, например смена языка, требует повторного выполнения setMenuItemByName()\r\n */\r\nwatch(\r\n\t() => store.activeItemName,\r\n\tasync () => {\r\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\r\n\r\n\t\tif (menuItemByName.size === 0) {\r\n\t\t\tsetMenuItemByName();\r\n\t\t}\r\n\r\n\t\tif (menuItemByName.size === 0) {\r\n\t\t\tstore.activeItemName = '';\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\r\n\r\n\t\t// элемент не найден, установить из хеша страницы\r\n\t\tif (!activeMenuItem.value && store.$id) {\r\n\t\t\tconst activeItemName = getHash(store.$id);\r\n\r\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\r\n\r\n\t\t\tif (activeMenuItem.value) {\r\n\t\t\t\tstore.activeItemName = activeItemName;\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// элемент не найден, установить первый доступный\r\n\t\tif (!activeMenuItem.value) {\r\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value!;\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// запрошена смена на уже активный элемент\r\n\t\tif (activeMenuItem.value.component === store.component) {\r\n\t\t\tisLoading.value = false;\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, false);\r\n\r\n\t\t// флаг загрузки будет сброшен при инициализации компонента\r\n\t\tisLoading.value = true;\r\n\r\n\t\t/**\r\n\t\t * Презагрузить компонент\r\n\t\t *\r\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\r\n\t\t */\r\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\r\n\r\n\t\t// влкадка была сменена еще раз во время sleepWhile\r\n\t\tif (numberChanged !== countChanged) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\r\n\t\tstore.component = activeMenuItem.value.component;\r\n\r\n\t\tif (activeMenuItem.value && !store.component) {\r\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\nconst elRef = ref();\r\nlet resizeObserver: ResizeObserver;\r\n\r\nonMounted(() => {\r\n\tresizeObserver = new ResizeObserver(() => {\r\n\t\telRef.value.parentElement.style.setProperty('--top-tabsView-contents-offset-top', elRef.value.offsetHeight + 'px');\r\n\t});\r\n\r\n\tresizeObserver.observe(elRef.value);\r\n});\r\n\r\nonUnmounted(() => {\r\n\tresizeObserver.disconnect();\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tref=\"elRef\"\r\n\t\t:class=\"{\r\n\t\t\t'top-tabsView_menu': true,\r\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\r\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\r\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\r\n\t\t}\"\r\n\t>\r\n\t\t<!-- Спрятать меню под кнопку в popup -->\r\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\r\n\t\t\t<template #opener>\r\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\r\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\r\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\r\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\r\n\t\t\t\t</div>\r\n\t\t\t</template>\r\n\r\n\t\t\t<template #contentList>\r\n\t\t\t\t<slot></slot>\r\n\t\t\t</template>\r\n\t\t</TopPopup>\r\n\r\n\t\t<!-- Отобразить меню на странице -->\r\n\t\t<template v-else>\r\n\t\t\t<div class=\"top-tabsView_menuList\">\r\n\t\t\t\t<slot></slot>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div\r\n\t\t\t\tv-if=\"isShortable\"\r\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\r\n\t\t\t>\r\n\t\t\t\t<TabsViewMenuItem\r\n\t\t\t\t\tv-if=\"isShortable\"\r\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\r\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\r\n\t\t\t\t</TabsViewMenuItem>\r\n\t\t\t</div>\r\n\t\t</template>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n/* режим отображение табов в основной области документа */\r\n.top-tabsView-pageMod .top-tabsView_menu {\r\n\tbox-sizing: border-box;\r\n\tposition: sticky;\r\n\ttop: var(--top-tabsView-top);\r\n\tz-index: 10;\r\n}\r\n\r\n/* режим отображение табов в основной области документа без popup */\r\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\r\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\r\n}\r\n\r\n/* стантартный режим */\r\n.top-tabsView_menu-inPopup_0 {\r\n\tbox-sizing: border-box;\r\n\twidth: var(--top-tabsView-menu-width);\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tjustify-content: space-between;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n/* режим вывода в popup */\r\n.top-tabsView_menu-inPopup_1 {\r\n\tborder-bottom: 1px solid var(--color-line-2-opacity);\r\n}\r\n\r\n.top-tabsView_menu-short {\r\n\twidth: auto;\r\n}\r\n\r\n.top-tabsView_menu > .top-tabsView_menuOpener {\r\n\tdisplay: flex;\r\n\tjustify-content: flex-end;\r\n}\r\n\r\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\r\n\tbackground: var(--color-layer-1);\r\n}\r\n\r\n.top-tabsView_menuOpenerIcon { display: flex; }\r\n\r\n.top-tabsView_menuOpenerActiveItem {\r\n\t--top-forms-padding: 0px;\r\n\r\n\tbox-sizing: border-box;\r\n\tpadding: var(--top-padding-2);\r\n\tmax-width: calc(100% - var(--top-forms-base-height));\r\n\twhite-space: nowrap;\r\n\tflex-grow: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: var(--top-padding-2);\r\n}\r\n\r\n.top-tabsView_menuList,\r\n.top-tabsView_menuFooter {\r\n\tpadding: var(--top-padding-2);\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: var(--top-gap-2);\r\n}\r\n\r\n.top-tabsView_menuList {\r\n\toverflow-y: auto;\r\n}\r\n\r\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\r\n\t--top-icon-width: 100%;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { delHash } from '@/core/utils/route';\r\nimport type { Props } from './types';\r\nimport { defineTabsStore } from './store';\r\nimport TabsViewMenu from './menu.vue';\r\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\r\nimport { checkComponentIsLoading } from './utils';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tshowMenuInPopup: undefined,\r\n\tisShortable: false,\r\n});\r\n\r\nconst model = defineModel<string>();\r\n\r\nconst store = defineTabsStore(props, model);\r\n\r\nconst uid = Math.random();\r\n\r\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\r\n\r\nonUnmounted(() => {\r\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\r\n\r\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\r\n});\r\n\r\nconst componentRef = ref();\r\nconst isLoading = ref(false);\r\n\r\nwatch([componentRef, () => store.component], () => {\r\n\tisLoading.value = checkComponentIsLoading(store.component);\r\n}, { immediate: true });\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\t:class=\"{\r\n\t\t\t'top-tabsView': true,\r\n\t\t\t'top-tabsView-pageMod': props.pageMod,\r\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\r\n\t\t}\"\r\n\t>\r\n\t\t<TabsViewMenu\r\n\t\t\t:isShortable=\"isShortable\"\r\n\t\t\tv-model:isLoading=\"isLoading\"\r\n\t\t>\r\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\r\n\t\t\t<slot name=\"menu\"></slot>\r\n\t\t</TabsViewMenu>\r\n\r\n\t\t<div\r\n\t\t\t:class=\"{\r\n\t\t\t\t'top-tabsView_contents': true,\r\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\r\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\r\n\r\n\t\t\t<keep-alive>\r\n\t\t\t\t<component\r\n\t\t\t\t\tref=\"componentRef\"\r\n\t\t\t\t\t:is=\"store.component\"\r\n\t\t\t\t/>\r\n\t\t\t</keep-alive>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n:root {\r\n\t--top-tabsView-top: 0px;\r\n\t--top-tabsView-menu-width: 220px;\r\n\t--top-tabsView-contents-offset-top: 0px;\r\n}\r\n\r\n.top-tabsView {\r\n\tbackground: var(--color-layout-middle);\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n}\r\n\r\n.top-tabsView_contents {\r\n\tborder-radius: var(--top-radius-4);\r\n\tbackground: var(--color-layout-front-1);\r\n\tpadding: var(--top-padding-4);\r\n\tflex-grow: 1;\r\n\toverflow: auto;\r\n\tposition: relative;\r\n}\r\n\r\n.top-tabsView_contents-isLoading {\r\n\tpointer-events: none;\r\n}\r\n\r\n.top-tabsView_contents-noScrollable {\r\n\twidth: calc(100% - var(--top-tabsView-menu-width));\r\n\tpadding: 0;\r\n\toverflow: visible;\r\n}\r\n\r\n/* top-tabsView-inPopup */\r\n.top-tabsView-inPopup {\r\n\tbackground: var(--color-layout-front-1);\r\n\tflex-direction: column;\r\n}\r\n\r\n.top-tabsView-inPopup > .top-tabsView_contents {\r\n\tborder-radius: 0;\r\n}\r\n\r\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\r\n\twidth: auto;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n\r\n</script>\r\n\r\n<template>\r\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\r\n</template>\r\n\r\n<style>\r\n.top-tabsView_menuDelimeter {\r\n\tpadding: var(--top-padding-1) 0;\r\n\tdisplay: flex;\r\n}\r\n\r\n.top-tabsView_menuDelimeter:before {\r\n\tcontent: \"\";\r\n\theight: 2px;\r\n\tbackground: var(--color-line-2);\r\n\tflex-grow: 1;\r\n}\r\n\r\n.top-tabsView_menuDelimeter:first-child,\r\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\r\n\tdisplay: none;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { useTabsStore } from './store';\r\nimport type { PropsMenuTitle } from './types';\r\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\r\nimport { TopPopupListItem } from '../../popup/popup';\r\n\r\ndefineProps<PropsMenuTitle>();\r\n\r\nconst store = useTabsStore();\r\n</script>\r\n\r\n<template>\r\n\t<TopPopupListItem\r\n\t\tv-if=\"store.showMenuInPopup\"\r\n\t\ttype=\"title\"\r\n\t>\r\n\t\t<slot></slot>\r\n\t</TopPopupListItem>\r\n\r\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\r\n\r\n\t<div\r\n\t\tv-else\r\n\t\t:class=\"{\r\n\t\t\t'top-tabsView_menuTitle': true,\r\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\r\n\t\t}\"\r\n\t>\r\n\t\t<slot></slot>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n.top-tabsView_menuTitle {\r\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\r\n\tfont-weight: 600;\r\n\tcolor: var(--color-text-1);\r\n}\r\n\r\n.top-tabsView_menuTitle-subtitle {\r\n\tpadding-top: var(--top-padding-1);\r\n\tfont-size: 12px;\r\n\tfont-weight: 400;\r\n\tcolor: var(--color-text-2);\r\n}\r\n</style>\r\n"],"names":["genStorageKey","stateName","stateKey","loadLocalStorge","store","localStorageKey","localStorageValue","addSaverLocalStorge","watch","StoreLocalStorage","popstateCallbacks","e","popstateCallback","injectionKey","defineTabsStore","props","model","defineStore","showMenuInPopup","computed","Core","pageMod","isShort","ref","component","scrollable","_e","getHash","useTabsStore","useStore","__props","href","genHash","tagName","TopPopupListItem","onClick","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_unref","_renderSlot","_ctx","$slots","_createElementBlock","_hoisted_1","checkComponentIsLoading","preResolveComponent","condition","sleepWhile","isLoading","_useModel","slots","useSlots","menuItemByName","setMenuItemByName","item","setMenuItemByNameFromItems","menuItems","subComponent","TabsViewMenuItem","menuItem","markRaw","activeMenuItem","countChanged","numberChanged","activeItemName","setHash","elRef","resizeObserver","onMounted","onUnmounted","TopPopup","_createElementVNode","_hoisted_3","_toDisplayString","_Fragment","_hoisted_4","_hoisted_5","_createTextVNode","uid","delHash","componentRef","_createVNode","TabsViewMenu","$event","TopLoadbar","_KeepAlive","TabsViewMenuDelimeter"],"mappings":"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"}
|
package/utils/check.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.amd.js","sources":["../../src/core/utils/check.ts"],"sourcesContent":["/**\n * Функции для проверки данных\n * @packageDocumentation\n */\n\nimport { toPuny } from '@/core/utils/url';\n\n/**\n * Получить строку с регулярным выражением для домена\n *\n * Разрешена только латиница, в том числе пуни-код\n *\n * Строгая проверка на корректность домена должна происходить в API\n */\nexport const getDomainRegexp = (): string => {\n\treturn `(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+(xn--)?(?:[\\\\w-]+)\\\\/?`;\n};\n\n/**\n * Проверка валидности email\n * @param email\n * @param rus_allow - если true, русскоязычные адреса тоже будут валидны\n */\nexport const isEmail = (email: string, rus_allow: boolean = false): boolean => {\n\temail += '';\n\n\temail = email.toLowerCase();\n\n\tlet emailTest = '^[-0-9a-z_\\\\.\\\\+]+@([-0-9a-z_^\\\\.]+\\\\.)+[a-z]{2,20}$';\n\n\tif (rus_allow) {\n\t\temailTest = '^[-0-9a-zа-яё_\\\\.\\\\+]+@([-0-9a-zа-яё_^\\\\.]+\\\\.)+[a-zа-яё]{2,20}$';\n\t}\n\n\tconst regex = new RegExp(emailTest);\n\treturn regex.test(email);\n};\n\n/**\n * Проверка валидности URL-адреса\n */\nexport const validUrl = (url: string, allowIP = false): boolean => {\n\turl = url.trim();\n\tif (url.includes(' ')) {\n\t\treturn false;\n\t}\n\n\tconst domain = url.replace(/^(https?:\\/\\/)?(www\\.)?([^/]+).*/, '$3');\n\n\tif (allowIP && isIp(domain)) return true;\n\n\treturn isDomain(domain);\n};\n\n/**\n * Проверка валидности домена\n */\nexport const isDomain = (domain: string): boolean => {\n\tdomain = toPuny(domain);\n\n\tconst regexp = new RegExp(`^${getDomainRegexp()}$`, 'u');\n\n\treturn regexp.test(domain);\n};\n\n/**\n * Проверка валидности ip\n */\nexport const isIp = (ip: string): boolean => {\n\tconst regexp = new RegExp('((^\\\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\\\s*$)|(^\\\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:)(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:)))(%.+)?\\\\s*$))');\n\n\treturn regexp.test(ip);\n};\n"],"names":["getDomainRegexp","isEmail","email","rus_allow","emailTest","validUrl","url","allowIP","isDomain","domain","utils_url","isIp","ip"],"mappings":"wGAcO,MAAAA,EAAA,oEASAC,EAAA,CAAAC,EAAAC,EAAA,KAAA,OAGND,EAAAA,EAAA,YAAA,gJAQA,IAAA,OAAAE,CAAA,EACA,KAAAF,CAAA,CACD,EAKOG,EAAA,CAAAC,EAAAC,EAAA,KAAA,CAEN,GADAD,EAAAA,EAAA,KAAA,EACAA,EAAA,SAAA,GAAA,EACC,MAAA,gFAODE,EAAAC,CAAA,CACD,EAKOD,EAAAC,IACNA,EAAAC,EAAA,OAAAD,CAAA,EAEA,IAAA,OAAA,IAAAT,EAAA,CAAA,IAAA,GAAA,EAEA,KAAAS,CAAA,GAMME,EAAAC,GACN,IAAA,OAAA,kvCAAA,EAEA,KAAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"check.amd.js","sources":["../../src/core/utils/check.ts"],"sourcesContent":["/**\r\n * Функции для проверки данных\r\n * @packageDocumentation\r\n */\r\n\r\nimport { toPuny } from '@/core/utils/url';\r\n\r\n/**\r\n * Получить строку с регулярным выражением для домена\r\n *\r\n * Разрешена только латиница, в том числе пуни-код\r\n *\r\n * Строгая проверка на корректность домена должна происходить в API\r\n */\r\nexport const getDomainRegexp = (): string => {\r\n\treturn `(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+(xn--)?(?:[\\\\w-]+)\\\\/?`;\r\n};\r\n\r\n/**\r\n * Проверка валидности email\r\n * @param email\r\n * @param rus_allow - если true, русскоязычные адреса тоже будут валидны\r\n */\r\nexport const isEmail = (email: string, rus_allow: boolean = false): boolean => {\r\n\temail += '';\r\n\r\n\temail = email.toLowerCase();\r\n\r\n\tlet emailTest = '^[-0-9a-z_\\\\.\\\\+]+@([-0-9a-z_^\\\\.]+\\\\.)+[a-z]{2,20}$';\r\n\r\n\tif (rus_allow) {\r\n\t\temailTest = '^[-0-9a-zа-яё_\\\\.\\\\+]+@([-0-9a-zа-яё_^\\\\.]+\\\\.)+[a-zа-яё]{2,20}$';\r\n\t}\r\n\r\n\tconst regex = new RegExp(emailTest);\r\n\treturn regex.test(email);\r\n};\r\n\r\n/**\r\n * Проверка валидности URL-адреса\r\n */\r\nexport const validUrl = (url: string, allowIP = false): boolean => {\r\n\turl = url.trim();\r\n\tif (url.includes(' ')) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst domain = url.replace(/^(https?:\\/\\/)?(www\\.)?([^/]+).*/, '$3');\r\n\r\n\tif (allowIP && isIp(domain)) return true;\r\n\r\n\treturn isDomain(domain);\r\n};\r\n\r\n/**\r\n * Проверка валидности домена\r\n */\r\nexport const isDomain = (domain: string): boolean => {\r\n\tdomain = toPuny(domain);\r\n\r\n\tconst regexp = new RegExp(`^${getDomainRegexp()}$`, 'u');\r\n\r\n\treturn regexp.test(domain);\r\n};\r\n\r\n/**\r\n * Проверка валидности ip\r\n */\r\nexport const isIp = (ip: string): boolean => {\r\n\tconst regexp = new RegExp('((^\\\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\\\s*$)|(^\\\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:)(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:)))(%.+)?\\\\s*$))');\r\n\r\n\treturn regexp.test(ip);\r\n};\r\n"],"names":["getDomainRegexp","isEmail","email","rus_allow","emailTest","validUrl","url","allowIP","isDomain","domain","utils_url","isIp","ip"],"mappings":"wGAcO,MAAAA,EAAA,oEASAC,EAAA,CAAAC,EAAAC,EAAA,KAAA,OAGND,EAAAA,EAAA,YAAA,gJAQA,IAAA,OAAAE,CAAA,EACA,KAAAF,CAAA,CACD,EAKOG,EAAA,CAAAC,EAAAC,EAAA,KAAA,CAEN,GADAD,EAAAA,EAAA,KAAA,EACAA,EAAA,SAAA,GAAA,EACC,MAAA,gFAODE,EAAAC,CAAA,CACD,EAKOD,EAAAC,IACNA,EAAAC,EAAA,OAAAD,CAAA,EAEA,IAAA,OAAA,IAAAT,EAAA,CAAA,IAAA,GAAA,EAEA,KAAAS,CAAA,GAMME,EAAAC,GACN,IAAA,OAAA,kvCAAA,EAEA,KAAAA,CAAA"}
|
package/utils/check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sources":["../../src/core/utils/check.ts"],"sourcesContent":["/**\n * Функции для проверки данных\n * @packageDocumentation\n */\n\nimport { toPuny } from '@/core/utils/url';\n\n/**\n * Получить строку с регулярным выражением для домена\n *\n * Разрешена только латиница, в том числе пуни-код\n *\n * Строгая проверка на корректность домена должна происходить в API\n */\nexport const getDomainRegexp = (): string => {\n\treturn `(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+(xn--)?(?:[\\\\w-]+)\\\\/?`;\n};\n\n/**\n * Проверка валидности email\n * @param email\n * @param rus_allow - если true, русскоязычные адреса тоже будут валидны\n */\nexport const isEmail = (email: string, rus_allow: boolean = false): boolean => {\n\temail += '';\n\n\temail = email.toLowerCase();\n\n\tlet emailTest = '^[-0-9a-z_\\\\.\\\\+]+@([-0-9a-z_^\\\\.]+\\\\.)+[a-z]{2,20}$';\n\n\tif (rus_allow) {\n\t\temailTest = '^[-0-9a-zа-яё_\\\\.\\\\+]+@([-0-9a-zа-яё_^\\\\.]+\\\\.)+[a-zа-яё]{2,20}$';\n\t}\n\n\tconst regex = new RegExp(emailTest);\n\treturn regex.test(email);\n};\n\n/**\n * Проверка валидности URL-адреса\n */\nexport const validUrl = (url: string, allowIP = false): boolean => {\n\turl = url.trim();\n\tif (url.includes(' ')) {\n\t\treturn false;\n\t}\n\n\tconst domain = url.replace(/^(https?:\\/\\/)?(www\\.)?([^/]+).*/, '$3');\n\n\tif (allowIP && isIp(domain)) return true;\n\n\treturn isDomain(domain);\n};\n\n/**\n * Проверка валидности домена\n */\nexport const isDomain = (domain: string): boolean => {\n\tdomain = toPuny(domain);\n\n\tconst regexp = new RegExp(`^${getDomainRegexp()}$`, 'u');\n\n\treturn regexp.test(domain);\n};\n\n/**\n * Проверка валидности ip\n */\nexport const isIp = (ip: string): boolean => {\n\tconst regexp = new RegExp('((^\\\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\\\s*$)|(^\\\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:)(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:)))(%.+)?\\\\s*$))');\n\n\treturn regexp.test(ip);\n};\n"],"names":["getDomainRegexp","isEmail","email","rus_allow","emailTest","validUrl","url","allowIP","domain","isIp","isDomain","toPuny","ip"],"mappings":";AAcO,MAAMA,IAAkB,MACvB,iEAQKC,IAAU,CAACC,GAAeC,IAAqB,OAAmB;AAC9E,EAAAD,KAAS,IAETA,IAAQA,EAAM,YAAA;AAEd,MAAIE,IAAY;AAEhB,SAAID,MACHC,IAAY,qEAGC,IAAI,OAAOA,CAAS,EACrB,KAAKF,CAAK;AACxB,GAKaG,IAAW,CAACC,GAAaC,IAAU,OAAmB;AAElE,MADAD,IAAMA,EAAI,KAAA,GACNA,EAAI,SAAS,GAAG;AACnB,WAAO;AAGR,QAAME,IAASF,EAAI,QAAQ,oCAAoC,IAAI;AAEnE,SAAIC,KAAWE,EAAKD,CAAM,IAAU,KAE7BE,EAASF,CAAM;AACvB,GAKaE,IAAW,CAACF,OACxBA,IAASG,EAAOH,CAAM,GAEP,IAAI,OAAO,IAAIR,GAAiB,KAAK,GAAG,EAEzC,KAAKQ,CAAM,IAMbC,IAAO,CAACG,MACL,IAAI,OAAO,kvCAAkvC,EAE9vC,KAAKA,CAAE;"}
|
|
1
|
+
{"version":3,"file":"check.js","sources":["../../src/core/utils/check.ts"],"sourcesContent":["/**\r\n * Функции для проверки данных\r\n * @packageDocumentation\r\n */\r\n\r\nimport { toPuny } from '@/core/utils/url';\r\n\r\n/**\r\n * Получить строку с регулярным выражением для домена\r\n *\r\n * Разрешена только латиница, в том числе пуни-код\r\n *\r\n * Строгая проверка на корректность домена должна происходить в API\r\n */\r\nexport const getDomainRegexp = (): string => {\r\n\treturn `(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+(xn--)?(?:[\\\\w-]+)\\\\/?`;\r\n};\r\n\r\n/**\r\n * Проверка валидности email\r\n * @param email\r\n * @param rus_allow - если true, русскоязычные адреса тоже будут валидны\r\n */\r\nexport const isEmail = (email: string, rus_allow: boolean = false): boolean => {\r\n\temail += '';\r\n\r\n\temail = email.toLowerCase();\r\n\r\n\tlet emailTest = '^[-0-9a-z_\\\\.\\\\+]+@([-0-9a-z_^\\\\.]+\\\\.)+[a-z]{2,20}$';\r\n\r\n\tif (rus_allow) {\r\n\t\temailTest = '^[-0-9a-zа-яё_\\\\.\\\\+]+@([-0-9a-zа-яё_^\\\\.]+\\\\.)+[a-zа-яё]{2,20}$';\r\n\t}\r\n\r\n\tconst regex = new RegExp(emailTest);\r\n\treturn regex.test(email);\r\n};\r\n\r\n/**\r\n * Проверка валидности URL-адреса\r\n */\r\nexport const validUrl = (url: string, allowIP = false): boolean => {\r\n\turl = url.trim();\r\n\tif (url.includes(' ')) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst domain = url.replace(/^(https?:\\/\\/)?(www\\.)?([^/]+).*/, '$3');\r\n\r\n\tif (allowIP && isIp(domain)) return true;\r\n\r\n\treturn isDomain(domain);\r\n};\r\n\r\n/**\r\n * Проверка валидности домена\r\n */\r\nexport const isDomain = (domain: string): boolean => {\r\n\tdomain = toPuny(domain);\r\n\r\n\tconst regexp = new RegExp(`^${getDomainRegexp()}$`, 'u');\r\n\r\n\treturn regexp.test(domain);\r\n};\r\n\r\n/**\r\n * Проверка валидности ip\r\n */\r\nexport const isIp = (ip: string): boolean => {\r\n\tconst regexp = new RegExp('((^\\\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\\\s*$)|(^\\\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:)(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:)))(%.+)?\\\\s*$))');\r\n\r\n\treturn regexp.test(ip);\r\n};\r\n"],"names":["getDomainRegexp","isEmail","email","rus_allow","emailTest","validUrl","url","allowIP","domain","isIp","isDomain","toPuny","ip"],"mappings":";AAcO,MAAMA,IAAkB,MACvB,iEAQKC,IAAU,CAACC,GAAeC,IAAqB,OAAmB;AAC9E,EAAAD,KAAS,IAETA,IAAQA,EAAM,YAAA;AAEd,MAAIE,IAAY;AAEhB,SAAID,MACHC,IAAY,qEAGC,IAAI,OAAOA,CAAS,EACrB,KAAKF,CAAK;AACxB,GAKaG,IAAW,CAACC,GAAaC,IAAU,OAAmB;AAElE,MADAD,IAAMA,EAAI,KAAA,GACNA,EAAI,SAAS,GAAG;AACnB,WAAO;AAGR,QAAME,IAASF,EAAI,QAAQ,oCAAoC,IAAI;AAEnE,SAAIC,KAAWE,EAAKD,CAAM,IAAU,KAE7BE,EAASF,CAAM;AACvB,GAKaE,IAAW,CAACF,OACxBA,IAASG,EAAOH,CAAM,GAEP,IAAI,OAAO,IAAIR,GAAiB,KAAK,GAAG,EAEzC,KAAKQ,CAAM,IAMbC,IAAO,CAACG,MACL,IAAI,OAAO,kvCAAkvC,EAE9vC,KAAKA,CAAE;"}
|
package/utils/clipboard.amd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-4D_EVI46.amd"],(function(l,t,e){"use strict";if(typeof r>"u")var r=window.Vue;async function a(o,n=!1){let i=!1;return navigator.clipboard&&(await navigator.clipboard.writeText(o),i=!0,n&&e.Core.notice(e.useI18n().Common.Copied_to_clipboard+"","info")),i}async function u(o){let n=!1;e.isSafari()||(n=await a(o));const i='<a href="'+o+'" target="_blank">'+o+"</a>",c=e.useI18n().Common.Copied_to_clipboard+`:
|
|
2
2
|
`+i;if(n)e.Core.notice(c,"info");else{if(!navigator.clipboard){e.Core.notice(e.useI18n().Common.Cannot_copied_to_clipboard+`:
|
|
3
3
|
`+e.useI18n().Common.Copy_guest_link_manually+`
|
|
4
4
|
`+i,"error");return}const d={onclick:()=>a(o).then(()=>e.Core.notice(c,"info")),default:e.useI18n().Common.Copy+"",class:"copy"};await e.Core.notice(e.useI18n().Common.Guest_link_created+`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.amd.js","sources":["../../src/core/utils/clipboard.ts"],"sourcesContent":["import Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { isSafari } from '@/core/utils/device';\n\n/**\n * Работа с буфером обмена\n * @packageDocumentation\n */\n\n/**\n * Скопировать текст в буфер омбена\n */\nexport async function setClipboard(text: string, isInfoShowing = false) {\n\tlet copyOk = false;\n\n\tif (navigator.clipboard) {\n\t\tawait navigator.clipboard.writeText(text);\n\t\tcopyOk = true;\n\t\tif (isInfoShowing) void Core.notice(useI18n().Common.Copied_to_clipboard + '', 'info');\n\t}\n\n\treturn copyOk;\n}\n\n/**\n * Скопировать гостевую ссылку в буфер обмена\n */\nexport async function guestLinkToClipboard(link: string) {\n\tlet isCopied = false;\n\tif (!isSafari()) isCopied = await setClipboard(link);\n\n\tconst aLink = '<a href=\"' + link + '\" target=\"_blank\">' + link + '</a>';\n\tconst copiedMessage = useI18n().Common.Copied_to_clipboard + `:\\n` + aLink;\n\n\tif (isCopied) {\n\t\tvoid Core.notice(copiedMessage, 'info');\n\t} else {\n\t\tif (!navigator.clipboard) {\n\t\t\tvoid Core.notice(useI18n().Common.Cannot_copied_to_clipboard + `:\\n` + useI18n().Common.Copy_guest_link_manually + `\\n` + aLink, 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tconst buttonProps = {\n\t\t\t\tonclick: () => setClipboard(link).then(() => Core.notice(copiedMessage, 'info')),\n\t\t\t\tdefault: useI18n().Common.Copy + '',\n\t\t\t\tclass: 'copy',\n\t\t\t};\n\n\t\tawait Core.notice(useI18n().Common.Guest_link_created + `\\n` + aLink, 'info', { buttonProps });\n\t}\n};\n"],"names":["setClipboard","text","isInfoShowing","forms","copyOk","aLink","link","copiedMessage","buttonProps"],"mappings":"4HAYA,eAAAA,EAAAC,EAAAC,EAAA,GAAA,UAGC,OAAA,UAAA,wDAGCA,GAAAC,EAAA,KAAA,OAAAA,EAAA,QAAA,EAAA,OAAA,oBAAA,GAAA,MAAA,GAGDC,CACD;EAU8DC,mCAGtB,CAEtC,GAAA,CAAA,UAAA,UAAA,CACCF,EAAA,KAAA,OAAAA,EAAA,QAAA,EAAA,OAAA,2BAAA;AAAA,EAA+DA,EAAA,QAAA,EAAA,OAAA,yBAAA;AAAA,EAAoDE,EAAA,OAAA,kBAIhG,QAAA,IAAAL,EAAAM,CAAA,EAAA,KAAA,IAAAH,EAAA,KAAA,OAAAI,EAAA,MAAA,CAAA,qCAEe,MAAA;EAIqBF,EAAA,OAAA,CAAA,YAAAG,CAAA,CAAA,EAE1D"}
|
|
1
|
+
{"version":3,"file":"clipboard.amd.js","sources":["../../src/core/utils/clipboard.ts"],"sourcesContent":["import Core from '@/core/core/core';\r\nimport { useI18n } from '@/core/plugins/i18n';\r\nimport { isSafari } from '@/core/utils/device';\r\n\r\n/**\r\n * Работа с буфером обмена\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Скопировать текст в буфер омбена\r\n */\r\nexport async function setClipboard(text: string, isInfoShowing = false) {\r\n\tlet copyOk = false;\r\n\r\n\tif (navigator.clipboard) {\r\n\t\tawait navigator.clipboard.writeText(text);\r\n\t\tcopyOk = true;\r\n\t\tif (isInfoShowing) void Core.notice(useI18n().Common.Copied_to_clipboard + '', 'info');\r\n\t}\r\n\r\n\treturn copyOk;\r\n}\r\n\r\n/**\r\n * Скопировать гостевую ссылку в буфер обмена\r\n */\r\nexport async function guestLinkToClipboard(link: string) {\r\n\tlet isCopied = false;\r\n\tif (!isSafari()) isCopied = await setClipboard(link);\r\n\r\n\tconst aLink = '<a href=\"' + link + '\" target=\"_blank\">' + link + '</a>';\r\n\tconst copiedMessage = useI18n().Common.Copied_to_clipboard + `:\\n` + aLink;\r\n\r\n\tif (isCopied) {\r\n\t\tvoid Core.notice(copiedMessage, 'info');\r\n\t} else {\r\n\t\tif (!navigator.clipboard) {\r\n\t\t\tvoid Core.notice(useI18n().Common.Cannot_copied_to_clipboard + `:\\n` + useI18n().Common.Copy_guest_link_manually + `\\n` + aLink, 'error');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst buttonProps = {\r\n\t\t\t\tonclick: () => setClipboard(link).then(() => Core.notice(copiedMessage, 'info')),\r\n\t\t\t\tdefault: useI18n().Common.Copy + '',\r\n\t\t\t\tclass: 'copy',\r\n\t\t\t};\r\n\r\n\t\tawait Core.notice(useI18n().Common.Guest_link_created + `\\n` + aLink, 'info', { buttonProps });\r\n\t}\r\n};\r\n"],"names":["setClipboard","text","isInfoShowing","forms","copyOk","aLink","link","copiedMessage","buttonProps"],"mappings":"4HAYA,eAAAA,EAAAC,EAAAC,EAAA,GAAA,UAGC,OAAA,UAAA,wDAGCA,GAAAC,EAAA,KAAA,OAAAA,EAAA,QAAA,EAAA,OAAA,oBAAA,GAAA,MAAA,GAGDC,CACD;EAU8DC,mCAGtB,CAEtC,GAAA,CAAA,UAAA,UAAA,CACCF,EAAA,KAAA,OAAAA,EAAA,QAAA,EAAA,OAAA,2BAAA;AAAA,EAA+DA,EAAA,QAAA,EAAA,OAAA,yBAAA;AAAA,EAAoDE,EAAA,OAAA,kBAIhG,QAAA,IAAAL,EAAAM,CAAA,EAAA,KAAA,IAAAH,EAAA,KAAA,OAAAI,EAAA,MAAA,CAAA,qCAEe,MAAA;EAIqBF,EAAA,OAAA,CAAA,YAAAG,CAAA,CAAA,EAE1D"}
|
package/utils/clipboard.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as t, u as a, b as s } from "../.chunks/forms-
|
|
1
|
+
import { C as t, u as a, b as s } from "../.chunks/forms-xkXHvvah.es.js";
|
|
2
2
|
async function r(o, e = !1) {
|
|
3
3
|
let i = !1;
|
|
4
4
|
return navigator.clipboard && (await navigator.clipboard.writeText(o), i = !0, e && t.notice(a().Common.Copied_to_clipboard + "", "info")), i;
|
package/utils/clipboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.js","sources":["../../src/core/utils/clipboard.ts"],"sourcesContent":["import Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { isSafari } from '@/core/utils/device';\n\n/**\n * Работа с буфером обмена\n * @packageDocumentation\n */\n\n/**\n * Скопировать текст в буфер омбена\n */\nexport async function setClipboard(text: string, isInfoShowing = false) {\n\tlet copyOk = false;\n\n\tif (navigator.clipboard) {\n\t\tawait navigator.clipboard.writeText(text);\n\t\tcopyOk = true;\n\t\tif (isInfoShowing) void Core.notice(useI18n().Common.Copied_to_clipboard + '', 'info');\n\t}\n\n\treturn copyOk;\n}\n\n/**\n * Скопировать гостевую ссылку в буфер обмена\n */\nexport async function guestLinkToClipboard(link: string) {\n\tlet isCopied = false;\n\tif (!isSafari()) isCopied = await setClipboard(link);\n\n\tconst aLink = '<a href=\"' + link + '\" target=\"_blank\">' + link + '</a>';\n\tconst copiedMessage = useI18n().Common.Copied_to_clipboard + `:\\n` + aLink;\n\n\tif (isCopied) {\n\t\tvoid Core.notice(copiedMessage, 'info');\n\t} else {\n\t\tif (!navigator.clipboard) {\n\t\t\tvoid Core.notice(useI18n().Common.Cannot_copied_to_clipboard + `:\\n` + useI18n().Common.Copy_guest_link_manually + `\\n` + aLink, 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tconst buttonProps = {\n\t\t\t\tonclick: () => setClipboard(link).then(() => Core.notice(copiedMessage, 'info')),\n\t\t\t\tdefault: useI18n().Common.Copy + '',\n\t\t\t\tclass: 'copy',\n\t\t\t};\n\n\t\tawait Core.notice(useI18n().Common.Guest_link_created + `\\n` + aLink, 'info', { buttonProps });\n\t}\n};\n"],"names":["setClipboard","text","isInfoShowing","copyOk","Core","useI18n","guestLinkToClipboard","link","isCopied","isSafari","aLink","copiedMessage","buttonProps"],"mappings":";AAYA,eAAsBA,EAAaC,GAAcC,IAAgB,IAAO;AACvE,MAAIC,IAAS;AAEb,SAAI,UAAU,cACb,MAAM,UAAU,UAAU,UAAUF,CAAI,GACxCE,IAAS,IACLD,KAAoBE,EAAK,OAAOC,IAAU,OAAO,sBAAsB,IAAI,MAAM,IAG/EF;AACR;AAKA,eAAsBG,EAAqBC,GAAc;AACxD,MAAIC,IAAW;AACf,EAAKC,EAAA,MAAYD,IAAW,MAAMR,EAAaO,CAAI;AAEnD,QAAMG,IAAQ,cAAcH,IAAO,uBAAuBA,IAAO,QAC3DI,IAAgBN,EAAA,EAAU,OAAO,sBAAsB;AAAA,IAAQK;AAErE,MAAIF;AACH,IAAKJ,EAAK,OAAOO,GAAe,MAAM;AAAA,OAChC;AACN,QAAI,CAAC,UAAU,WAAW;AACzB,MAAKP,EAAK,OAAOC,EAAA,EAAU,OAAO,6BAA6B;AAAA,IAAQA,EAAA,EAAU,OAAO,2BAA2B;AAAA,IAAOK,GAAO,OAAO;AACxI;AAAA,IACD;AAEA,UAAME,IAAc;AAAA,MAClB,SAAS,MAAMZ,EAAaO,CAAI,EAAE,KAAK,MAAMH,EAAK,OAAOO,GAAe,MAAM,CAAC;AAAA,MAC/E,SAASN,EAAA,EAAU,OAAO,OAAO;AAAA,MACjC,OAAO;AAAA,IAAA;AAGT,UAAMD,EAAK,OAAOC,EAAA,EAAU,OAAO,qBAAqB;AAAA,IAAOK,GAAO,QAAQ,EAAE,aAAAE,GAAa;AAAA,EAC9F;AACD;"}
|
|
1
|
+
{"version":3,"file":"clipboard.js","sources":["../../src/core/utils/clipboard.ts"],"sourcesContent":["import Core from '@/core/core/core';\r\nimport { useI18n } from '@/core/plugins/i18n';\r\nimport { isSafari } from '@/core/utils/device';\r\n\r\n/**\r\n * Работа с буфером обмена\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Скопировать текст в буфер омбена\r\n */\r\nexport async function setClipboard(text: string, isInfoShowing = false) {\r\n\tlet copyOk = false;\r\n\r\n\tif (navigator.clipboard) {\r\n\t\tawait navigator.clipboard.writeText(text);\r\n\t\tcopyOk = true;\r\n\t\tif (isInfoShowing) void Core.notice(useI18n().Common.Copied_to_clipboard + '', 'info');\r\n\t}\r\n\r\n\treturn copyOk;\r\n}\r\n\r\n/**\r\n * Скопировать гостевую ссылку в буфер обмена\r\n */\r\nexport async function guestLinkToClipboard(link: string) {\r\n\tlet isCopied = false;\r\n\tif (!isSafari()) isCopied = await setClipboard(link);\r\n\r\n\tconst aLink = '<a href=\"' + link + '\" target=\"_blank\">' + link + '</a>';\r\n\tconst copiedMessage = useI18n().Common.Copied_to_clipboard + `:\\n` + aLink;\r\n\r\n\tif (isCopied) {\r\n\t\tvoid Core.notice(copiedMessage, 'info');\r\n\t} else {\r\n\t\tif (!navigator.clipboard) {\r\n\t\t\tvoid Core.notice(useI18n().Common.Cannot_copied_to_clipboard + `:\\n` + useI18n().Common.Copy_guest_link_manually + `\\n` + aLink, 'error');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst buttonProps = {\r\n\t\t\t\tonclick: () => setClipboard(link).then(() => Core.notice(copiedMessage, 'info')),\r\n\t\t\t\tdefault: useI18n().Common.Copy + '',\r\n\t\t\t\tclass: 'copy',\r\n\t\t\t};\r\n\r\n\t\tawait Core.notice(useI18n().Common.Guest_link_created + `\\n` + aLink, 'info', { buttonProps });\r\n\t}\r\n};\r\n"],"names":["setClipboard","text","isInfoShowing","copyOk","Core","useI18n","guestLinkToClipboard","link","isCopied","isSafari","aLink","copiedMessage","buttonProps"],"mappings":";AAYA,eAAsBA,EAAaC,GAAcC,IAAgB,IAAO;AACvE,MAAIC,IAAS;AAEb,SAAI,UAAU,cACb,MAAM,UAAU,UAAU,UAAUF,CAAI,GACxCE,IAAS,IACLD,KAAoBE,EAAK,OAAOC,IAAU,OAAO,sBAAsB,IAAI,MAAM,IAG/EF;AACR;AAKA,eAAsBG,EAAqBC,GAAc;AACxD,MAAIC,IAAW;AACf,EAAKC,EAAA,MAAYD,IAAW,MAAMR,EAAaO,CAAI;AAEnD,QAAMG,IAAQ,cAAcH,IAAO,uBAAuBA,IAAO,QAC3DI,IAAgBN,EAAA,EAAU,OAAO,sBAAsB;AAAA,IAAQK;AAErE,MAAIF;AACH,IAAKJ,EAAK,OAAOO,GAAe,MAAM;AAAA,OAChC;AACN,QAAI,CAAC,UAAU,WAAW;AACzB,MAAKP,EAAK,OAAOC,EAAA,EAAU,OAAO,6BAA6B;AAAA,IAAQA,EAAA,EAAU,OAAO,2BAA2B;AAAA,IAAOK,GAAO,OAAO;AACxI;AAAA,IACD;AAEA,UAAME,IAAc;AAAA,MAClB,SAAS,MAAMZ,EAAaO,CAAI,EAAE,KAAK,MAAMH,EAAK,OAAOO,GAAe,MAAM,CAAC;AAAA,MAC/E,SAASN,EAAA,EAAU,OAAO,OAAO;AAAA,MACjC,OAAO;AAAA,IAAA;AAGT,UAAMD,EAAK,OAAOC,EAAA,EAAU,OAAO,qBAAqB;AAAA,IAAOK,GAAO,QAAQ,EAAE,aAAAE,GAAa;AAAA,EAC9F;AACD;"}
|
package/utils/date.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-4D_EVI46.amd"],(function(n,e,t){"use strict";if(typeof a>"u")var a=window.Vue;e.dateFormat=t.dateFormat,e.dateToString=t.dateToString,e.dateUnformat=t.dateUnformat,e.genDate=t.genDate,e.genDateMoscow=t.genDateMoscow,e.genUserDate=t.genUserDate,e.getDayOfWeek=t.getDayOfWeek,e.stringToDate=t.stringToDate,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=date.amd.js.map
|
package/utils/date.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as t, K as s, P as o, N as r, O as g, M as n, J as D, L as d } from "../.chunks/forms-
|
|
1
|
+
import { c as t, K as s, P as o, N as r, O as g, M as n, J as D, L as d } from "../.chunks/forms-xkXHvvah.es.js";
|
|
2
2
|
export {
|
|
3
3
|
t as dateFormat,
|
|
4
4
|
s as dateToString,
|
package/utils/device.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-4D_EVI46.amd"],(function(a,e,i){"use strict";if(typeof l>"u")var l=window.Vue;e.get$scroll=i.get$scroll,e.getCommandKeyLabel=i.getCommandKeyLabel,e.getElsScroll=i.getElsScroll,e.getOS=i.getOS,e.getOSAsync=i.getOSAsync,e.getScrollTop=i.getScrollTop,e.isApp=i.isApp,e.isMacOS=i.isMacOS,e.isMobile=i.isMobile,e.isRetina=i.isRetina,e.isSafari=i.isSafari,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=device.amd.js.map
|
package/utils/device.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { z as e, x as l, A as t, B as i, D as o, y as g,
|
|
1
|
+
import { z as e, x as l, A as t, B as i, D as o, y as g, w as r, l as S, v as c, t as p, b } from "../.chunks/forms-xkXHvvah.es.js";
|
|
2
2
|
export {
|
|
3
3
|
e as get$scroll,
|
|
4
4
|
l as getCommandKeyLabel,
|
package/utils/dom.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.amd.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\n * Работа с Document Object Model (DOM)\n * @packageDocumentation\n */\n\n/**\n * Создать элемент\n * @param tagName\n * @param attrs - атрибуты\n * @param elsChildrens\n * @returns - созданный элемент\n */\nexport function genEl(tagName: string, attrs?: Record<string, string>, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\tconst el: any = document.createElement(tagName);\n\n\tfor (const name in attrs) {\n\t\tif (name.indexOf('on') === 0) {\n\t\t\t// events\n\t\t\tel[name] = attrs[name];\n\t\t} else {\n\t\t\tel.setAttribute(name, attrs[name]);\n\t\t}\n\t}\n\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\n\t\tif (typeof (elChildren) === 'string') {\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\n\t\t} else {\n\t\t\tel.append(elChildren);\n\t\t}\n\t});\n\n\treturn el;\n}\n\n/**\n * Проверить видимость элемента\n * @param el\n * @returns - вернет true, если элемент считается видимым\n */\nexport function isVisible(el?: HTMLElement): boolean {\n\tif (!el) {\n\t\treturn false;\n\t}\n\n\tconst boundingClientRect = el.getBoundingClientRect();\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\n}\n\n/**\n * Получить координаты элемента относительно документа\n * @param el\n * @returns - координаты элемента относительно документа\n */\nexport function offset(el: HTMLElement): { top: number, left: number } {\n\tconst boundingClientRect = el.getBoundingClientRect();\n\n\treturn {\n\t\ttop: boundingClientRect.top + window.scrollY,\n\t\tleft: boundingClientRect.left + window.scrollX,\n\t};\n}\n\n/**\n * Получить значение css свойства элемента\n *\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function css(el: HTMLElement, property: string): string {\n\treturn window.getComputedStyle(el).getPropertyValue(property);\n}\n\n/**\n * Получить значение css свойства целочисленного типа\n *\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function cssNumber(el: HTMLElement, property: string): number {\n\treturn parseInt(css(el, property));\n}\n\n/**\n * Обернуть элемент и вернуть только что созданный элемент\n * @param el - элемент, который требуется обернуть\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\n */\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\n\tconst elWrapper = document.createElement(tagName);\n\tel.after(elWrapper);\n\n\telWrapper.append(el);\n\n\treturn elWrapper;\n}\n\n/**\n * Найти и вернуть первый видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\n}\n\n/**\n * Найти и вернуть последний видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\n}\n\n/**\n * Найти видимые элементы\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\n}\n\n/**\n * Найти элементы и вернуть в виде массива\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllArray<El extends HTMLElement = HTMLElement>(el: HTMLElement | Document, selectors: string) {\n\tif (!el) {\n\t\treturn [];\n\t}\n\n\treturn [...el.querySelectorAll<El>(selectors)];\n}\n\n/**\n * Хранилище данных элемента\n * @param el\n * @param contextName - контекст, обычно используется имя компонента\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\n */\nexport function storage(\n\tel?: HTMLElement & { topData?: any },\n\tcontextName: string = 'common',\n\tcontextData: object | null | undefined = undefined,\n): any | undefined {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tif (!el.topData) {\n\t\tel.topData = {};\n\t}\n\n\tif (contextData) {\n\t\tel.topData[contextName] = contextData;\n\t}\n\n\tif (contextData === null) {\n\t\tdelete el.topData[contextName];\n\t}\n\n\treturn el.topData[contextName];\n}\n\n/**\n * Очистить хранилище элемента\n */\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tdelete el.topData;\n}\n\nexport default {\n\tgenEl,\n\tisVisible,\n\toffset,\n\tcss,\n\tcssNumber,\n\twrap,\n\tquerySelectorVisible,\n\tquerySelectorVisibleLast,\n\tquerySelectorAllVisible,\n\tquerySelectorAllArray,\n\tstorage,\n\tstorageClear,\n};\n"],"names":["name","attrs","elsChildrens","elChildren","el","boundingClientRect","css","property","cssNumber","wrap","tagName","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","isVisible","querySelectorVisibleLast","querySelectorAllVisible","contextName","contextData","DOM","genEl","offset","storage"],"mappings":"iJAeC,UAAAA,KAAAC,uDASA,OAAAC,EAAA,QAAAC,GAAA,CACC,OAAAA,GAAA,SACCC,EAAA,mBAAA,YAAAD,CAAA,EAEAC,EAAA,OAAAD,CAAA,CACD,CAAA,EAGDC,CACD,qBASE,MAAA,GAGD,MAAAC,EAAAD,EAAA,sBAAA,6BAED,eAQC,MAAAC,EAAAD,EAAA,sBAAA,EAEA,MAAA,0BACsC,KAAAC,EAAA,KAAA,OAAA,QAGvC,CASO,SAAAC,EAAAF,EAAAG,EAAA,sDAEP,CASO,SAAAC,EAAAJ,EAAAG,EAAA,wBAEP,CAOO,SAAAE,EAAAL,EAAAM,EAAA,mCAEN,OAAAN,EAAA,MAAAO,CAAA,EAEAA,EAAA,OAAAP,CAAA,EAEAO,CACD,CAOO,SAAAC,EAAAR,EAAAS,EAAA,CACN,OAAAC,EAAAV,EAAAS,CAAA,EAAA,KAAAE,CAAA,GAAA,IACD,CAOO,SAAAC,EAAAZ,EAAAS,EAAA,CACN,OAAAC,EAAAV,EAAAS,CAAA,EAAA,SAAAE,CAAA,GAAA,IACD,CAOO,SAAAE,EAAAb,EAAAS,EAAA,wBAEP,CAOO,SAAAC,EAAAV,EAAAS,EAAA,qCAEL,CAAA,CAIF,wCAkBC,OAAAT,EAAA,UACCA,EAAA,QAAA,CAAA,OAIAA,EAAA,QAAAc,CAAA,EAAAC,GAGDA,IAAA,MACC,OAAAf,EAAA,QAAAc,CAAA,EAGDd,EAAA,QAAAc,CAAA,CACD,kCAWA,CAEA,MAAAE,EAAA,CAAe,MAAAC,EACd,UAAAN,EACA,OAAAO,EACA,IAAAhB,EACA,UAAAE,EACA,KAAAC,EACA,qBAAAG,EACA,yBAAAI,EACA,wBAAAC,EACA,sBAAAH,EACA,QAAAS"}
|
|
1
|
+
{"version":3,"file":"dom.amd.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\r\n * Работа с Document Object Model (DOM)\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Создать элемент\r\n * @param tagName\r\n * @param attrs - атрибуты\r\n * @param elsChildrens\r\n * @returns - созданный элемент\r\n */\r\nexport function genEl(tagName: string, attrs?: Record<string, string>, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\r\n\tconst el: any = document.createElement(tagName);\r\n\r\n\tfor (const name in attrs) {\r\n\t\tif (name.indexOf('on') === 0) {\r\n\t\t\t// events\r\n\t\t\tel[name] = attrs[name];\r\n\t\t} else {\r\n\t\t\tel.setAttribute(name, attrs[name]);\r\n\t\t}\r\n\t}\r\n\r\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\r\n\t\tif (typeof (elChildren) === 'string') {\r\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\r\n\t\t} else {\r\n\t\t\tel.append(elChildren);\r\n\t\t}\r\n\t});\r\n\r\n\treturn el;\r\n}\r\n\r\n/**\r\n * Проверить видимость элемента\r\n * @param el\r\n * @returns - вернет true, если элемент считается видимым\r\n */\r\nexport function isVisible(el?: HTMLElement): boolean {\r\n\tif (!el) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst boundingClientRect = el.getBoundingClientRect();\r\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\r\n}\r\n\r\n/**\r\n * Получить координаты элемента относительно документа\r\n * @param el\r\n * @returns - координаты элемента относительно документа\r\n */\r\nexport function offset(el: HTMLElement): { top: number, left: number } {\r\n\tconst boundingClientRect = el.getBoundingClientRect();\r\n\r\n\treturn {\r\n\t\ttop: boundingClientRect.top + window.scrollY,\r\n\t\tleft: boundingClientRect.left + window.scrollX,\r\n\t};\r\n}\r\n\r\n/**\r\n * Получить значение css свойства элемента\r\n *\r\n * @param el\r\n * @param property - имя свойства\r\n * @return - значение css стиля\r\n */\r\nexport function css(el: HTMLElement, property: string): string {\r\n\treturn window.getComputedStyle(el).getPropertyValue(property);\r\n}\r\n\r\n/**\r\n * Получить значение css свойства целочисленного типа\r\n *\r\n * @param el\r\n * @param property - имя свойства\r\n * @return - значение css стиля\r\n */\r\nexport function cssNumber(el: HTMLElement, property: string): number {\r\n\treturn parseInt(css(el, property));\r\n}\r\n\r\n/**\r\n * Обернуть элемент и вернуть только что созданный элемент\r\n * @param el - элемент, который требуется обернуть\r\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\r\n */\r\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\r\n\tconst elWrapper = document.createElement(tagName);\r\n\tel.after(elWrapper);\r\n\r\n\telWrapper.append(el);\r\n\r\n\treturn elWrapper;\r\n}\r\n\r\n/**\r\n * Найти и вернуть первый видимый элемент\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\r\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\r\n}\r\n\r\n/**\r\n * Найти и вернуть последний видимый элемент\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\r\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\r\n}\r\n\r\n/**\r\n * Найти видимые элементы\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\r\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\r\n}\r\n\r\n/**\r\n * Найти элементы и вернуть в виде массива\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorAllArray<El extends HTMLElement = HTMLElement>(el: HTMLElement | Document, selectors: string) {\r\n\tif (!el) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\treturn [...el.querySelectorAll<El>(selectors)];\r\n}\r\n\r\n/**\r\n * Хранилище данных элемента\r\n * @param el\r\n * @param contextName - контекст, обычно используется имя компонента\r\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\r\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\r\n */\r\nexport function storage(\r\n\tel?: HTMLElement & { topData?: any },\r\n\tcontextName: string = 'common',\r\n\tcontextData: object | null | undefined = undefined,\r\n): any | undefined {\r\n\tif (!el) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!el.topData) {\r\n\t\tel.topData = {};\r\n\t}\r\n\r\n\tif (contextData) {\r\n\t\tel.topData[contextName] = contextData;\r\n\t}\r\n\r\n\tif (contextData === null) {\r\n\t\tdelete el.topData[contextName];\r\n\t}\r\n\r\n\treturn el.topData[contextName];\r\n}\r\n\r\n/**\r\n * Очистить хранилище элемента\r\n */\r\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\r\n\tif (!el) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tdelete el.topData;\r\n}\r\n\r\nexport default {\r\n\tgenEl,\r\n\tisVisible,\r\n\toffset,\r\n\tcss,\r\n\tcssNumber,\r\n\twrap,\r\n\tquerySelectorVisible,\r\n\tquerySelectorVisibleLast,\r\n\tquerySelectorAllVisible,\r\n\tquerySelectorAllArray,\r\n\tstorage,\r\n\tstorageClear,\r\n};\r\n"],"names":["name","attrs","elsChildrens","elChildren","el","boundingClientRect","css","property","cssNumber","wrap","tagName","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","isVisible","querySelectorVisibleLast","querySelectorAllVisible","contextName","contextData","DOM","genEl","offset","storage"],"mappings":"iJAeC,UAAAA,KAAAC,uDASA,OAAAC,EAAA,QAAAC,GAAA,CACC,OAAAA,GAAA,SACCC,EAAA,mBAAA,YAAAD,CAAA,EAEAC,EAAA,OAAAD,CAAA,CACD,CAAA,EAGDC,CACD,qBASE,MAAA,GAGD,MAAAC,EAAAD,EAAA,sBAAA,6BAED,eAQC,MAAAC,EAAAD,EAAA,sBAAA,EAEA,MAAA,0BACsC,KAAAC,EAAA,KAAA,OAAA,QAGvC,CASO,SAAAC,EAAAF,EAAAG,EAAA,sDAEP,CASO,SAAAC,EAAAJ,EAAAG,EAAA,wBAEP,CAOO,SAAAE,EAAAL,EAAAM,EAAA,mCAEN,OAAAN,EAAA,MAAAO,CAAA,EAEAA,EAAA,OAAAP,CAAA,EAEAO,CACD,CAOO,SAAAC,EAAAR,EAAAS,EAAA,CACN,OAAAC,EAAAV,EAAAS,CAAA,EAAA,KAAAE,CAAA,GAAA,IACD,CAOO,SAAAC,EAAAZ,EAAAS,EAAA,CACN,OAAAC,EAAAV,EAAAS,CAAA,EAAA,SAAAE,CAAA,GAAA,IACD,CAOO,SAAAE,EAAAb,EAAAS,EAAA,wBAEP,CAOO,SAAAC,EAAAV,EAAAS,EAAA,qCAEL,CAAA,CAIF,wCAkBC,OAAAT,EAAA,UACCA,EAAA,QAAA,CAAA,OAIAA,EAAA,QAAAc,CAAA,EAAAC,GAGDA,IAAA,MACC,OAAAf,EAAA,QAAAc,CAAA,EAGDd,EAAA,QAAAc,CAAA,CACD,kCAWA,CAEA,MAAAE,EAAA,CAAe,MAAAC,EACd,UAAAN,EACA,OAAAO,EACA,IAAAhB,EACA,UAAAE,EACA,KAAAC,EACA,qBAAAG,EACA,yBAAAI,EACA,wBAAAC,EACA,sBAAAH,EACA,QAAAS"}
|
package/utils/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\n * Работа с Document Object Model (DOM)\n * @packageDocumentation\n */\n\n/**\n * Создать элемент\n * @param tagName\n * @param attrs - атрибуты\n * @param elsChildrens\n * @returns - созданный элемент\n */\nexport function genEl(tagName: string, attrs?: Record<string, string>, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\tconst el: any = document.createElement(tagName);\n\n\tfor (const name in attrs) {\n\t\tif (name.indexOf('on') === 0) {\n\t\t\t// events\n\t\t\tel[name] = attrs[name];\n\t\t} else {\n\t\t\tel.setAttribute(name, attrs[name]);\n\t\t}\n\t}\n\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\n\t\tif (typeof (elChildren) === 'string') {\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\n\t\t} else {\n\t\t\tel.append(elChildren);\n\t\t}\n\t});\n\n\treturn el;\n}\n\n/**\n * Проверить видимость элемента\n * @param el\n * @returns - вернет true, если элемент считается видимым\n */\nexport function isVisible(el?: HTMLElement): boolean {\n\tif (!el) {\n\t\treturn false;\n\t}\n\n\tconst boundingClientRect = el.getBoundingClientRect();\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\n}\n\n/**\n * Получить координаты элемента относительно документа\n * @param el\n * @returns - координаты элемента относительно документа\n */\nexport function offset(el: HTMLElement): { top: number, left: number } {\n\tconst boundingClientRect = el.getBoundingClientRect();\n\n\treturn {\n\t\ttop: boundingClientRect.top + window.scrollY,\n\t\tleft: boundingClientRect.left + window.scrollX,\n\t};\n}\n\n/**\n * Получить значение css свойства элемента\n *\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function css(el: HTMLElement, property: string): string {\n\treturn window.getComputedStyle(el).getPropertyValue(property);\n}\n\n/**\n * Получить значение css свойства целочисленного типа\n *\n * @param el\n * @param property - имя свойства\n * @return - значение css стиля\n */\nexport function cssNumber(el: HTMLElement, property: string): number {\n\treturn parseInt(css(el, property));\n}\n\n/**\n * Обернуть элемент и вернуть только что созданный элемент\n * @param el - элемент, который требуется обернуть\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\n */\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\n\tconst elWrapper = document.createElement(tagName);\n\tel.after(elWrapper);\n\n\telWrapper.append(el);\n\n\treturn elWrapper;\n}\n\n/**\n * Найти и вернуть первый видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\n}\n\n/**\n * Найти и вернуть последний видимый элемент\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\n}\n\n/**\n * Найти видимые элементы\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\n}\n\n/**\n * Найти элементы и вернуть в виде массива\n * @param el - корневой элемент поиска\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\n */\nexport function querySelectorAllArray<El extends HTMLElement = HTMLElement>(el: HTMLElement | Document, selectors: string) {\n\tif (!el) {\n\t\treturn [];\n\t}\n\n\treturn [...el.querySelectorAll<El>(selectors)];\n}\n\n/**\n * Хранилище данных элемента\n * @param el\n * @param contextName - контекст, обычно используется имя компонента\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\n */\nexport function storage(\n\tel?: HTMLElement & { topData?: any },\n\tcontextName: string = 'common',\n\tcontextData: object | null | undefined = undefined,\n): any | undefined {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tif (!el.topData) {\n\t\tel.topData = {};\n\t}\n\n\tif (contextData) {\n\t\tel.topData[contextName] = contextData;\n\t}\n\n\tif (contextData === null) {\n\t\tdelete el.topData[contextName];\n\t}\n\n\treturn el.topData[contextName];\n}\n\n/**\n * Очистить хранилище элемента\n */\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\n\tif (!el) {\n\t\treturn;\n\t}\n\n\tdelete el.topData;\n}\n\nexport default {\n\tgenEl,\n\tisVisible,\n\toffset,\n\tcss,\n\tcssNumber,\n\twrap,\n\tquerySelectorVisible,\n\tquerySelectorVisibleLast,\n\tquerySelectorAllVisible,\n\tquerySelectorAllArray,\n\tstorage,\n\tstorageClear,\n};\n"],"names":["genEl","tagName","attrs","elsChildrens","el","name","elChildren","isVisible","boundingClientRect","offset","css","property","cssNumber","wrap","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","querySelectorVisibleLast","querySelectorAllVisible","storage","contextName","contextData","storageClear","DOM"],"mappings":"AAYO,SAASA,EAAMC,GAAiBC,MAAmCC,GAAqD;AAC9H,QAAMC,IAAU,SAAS,cAAcH,CAAO;AAE9C,aAAWI,KAAQH;AAClB,IAAIG,EAAK,QAAQ,IAAI,MAAM,IAE1BD,EAAGC,CAAI,IAAIH,EAAMG,CAAI,IAErBD,EAAG,aAAaC,GAAMH,EAAMG,CAAI,CAAC;AAInC,SAAAF,EAAa,QAAQ,CAACG,MAAqC;AAC1D,IAAI,OAAQA,KAAgB,WAC3BF,EAAG,mBAAmB,aAAaE,CAAU,IAE7CF,EAAG,OAAOE,CAAU;AAAA,EAEtB,CAAC,GAEMF;AACR;AAOO,SAASG,EAAUH,GAA2B;AACpD,MAAI,CAACA;AACJ,WAAO;AAGR,QAAMI,IAAqBJ,EAAG,sBAAA;AAC9B,SAAO,CAAC,EAAEI,EAAmB,SAASA,EAAmB;AAC1D;AAOO,SAASC,EAAOL,GAAgD;AACtE,QAAMI,IAAqBJ,EAAG,sBAAA;AAE9B,SAAO;AAAA,IACN,KAAKI,EAAmB,MAAM,OAAO;AAAA,IACrC,MAAMA,EAAmB,OAAO,OAAO;AAAA,EAAA;AAEzC;AASO,SAASE,EAAIN,GAAiBO,GAA0B;AAC9D,SAAO,OAAO,iBAAiBP,CAAE,EAAE,iBAAiBO,CAAQ;AAC7D;AASO,SAASC,EAAUR,GAAiBO,GAA0B;AACpE,SAAO,SAASD,EAAIN,GAAIO,CAAQ,CAAC;AAClC;AAOO,SAASE,EAAKT,GAAiBH,GAA8B;AACnE,QAAMa,IAAY,SAAS,cAAcb,CAAO;AAChD,SAAAG,EAAG,MAAMU,CAAS,GAElBA,EAAU,OAAOV,CAAE,GAEZU;AACR;AAOO,SAASC,EAAqBX,GAAiBY,GAAuC;AAC5F,SAAOC,EAAsBb,GAAIY,CAAS,EAAE,KAAKT,CAAS,KAAK;AAChE;AAOO,SAASW,EAAyBd,GAAiBY,GAAuC;AAChG,SAAOC,EAAsBb,GAAIY,CAAS,EAAE,SAAST,CAAS,KAAK;AACpE;AAOO,SAASY,EAAwBf,GAA4BY,GAAkC;AACrG,SAAOC,EAAsBb,GAAIY,CAAS,EAAE,OAAOT,CAAS;AAC7D;AAOO,SAASU,EAA4Db,GAA4BY,GAAmB;AAC1H,SAAKZ,IAIE,CAAC,GAAGA,EAAG,iBAAqBY,CAAS,CAAC,IAHrC,CAAA;AAIT;AASO,SAASI,EACfhB,GACAiB,IAAsB,UACtBC,IAAyC,QACvB;AAClB,MAAKlB;AAIL,WAAKA,EAAG,YACPA,EAAG,UAAU,CAAA,IAGVkB,MACHlB,EAAG,QAAQiB,CAAW,IAAIC,IAGvBA,MAAgB,QACnB,OAAOlB,EAAG,QAAQiB,CAAW,GAGvBjB,EAAG,QAAQiB,CAAW;AAC9B;AAKO,SAASE,EAAanB,GAA4C;AACxE,EAAKA,KAIL,OAAOA,EAAG;AACX;AAEA,MAAAoB,IAAe;AAAA,EACd,OAAAxB;AAAA,EACA,WAAAO;AAAA,EACA,QAAAE;AAAA,EACA,KAAAC;AAAA,EACA,WAAAE;AAAA,EACA,MAAAC;AAAA,EACA,sBAAAE;AAAA,EACA,0BAAAG;AAAA,EACA,yBAAAC;AAAA,EACA,uBAAAF;AAAA,EACA,SAAAG;AAAA,EACA,cAAAG;AACD;"}
|
|
1
|
+
{"version":3,"file":"dom.js","sources":["../../src/core/utils/dom.ts"],"sourcesContent":["/**\r\n * Работа с Document Object Model (DOM)\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Создать элемент\r\n * @param tagName\r\n * @param attrs - атрибуты\r\n * @param elsChildrens\r\n * @returns - созданный элемент\r\n */\r\nexport function genEl(tagName: string, attrs?: Record<string, string>, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\r\n\tconst el: any = document.createElement(tagName);\r\n\r\n\tfor (const name in attrs) {\r\n\t\tif (name.indexOf('on') === 0) {\r\n\t\t\t// events\r\n\t\t\tel[name] = attrs[name];\r\n\t\t} else {\r\n\t\t\tel.setAttribute(name, attrs[name]);\r\n\t\t}\r\n\t}\r\n\r\n\telsChildrens.forEach((elChildren: HTMLElement | string) => {\r\n\t\tif (typeof (elChildren) === 'string') {\r\n\t\t\tel.insertAdjacentHTML('beforeend', elChildren);\r\n\t\t} else {\r\n\t\t\tel.append(elChildren);\r\n\t\t}\r\n\t});\r\n\r\n\treturn el;\r\n}\r\n\r\n/**\r\n * Проверить видимость элемента\r\n * @param el\r\n * @returns - вернет true, если элемент считается видимым\r\n */\r\nexport function isVisible(el?: HTMLElement): boolean {\r\n\tif (!el) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst boundingClientRect = el.getBoundingClientRect();\r\n\treturn !!(boundingClientRect.width || boundingClientRect.height);\r\n}\r\n\r\n/**\r\n * Получить координаты элемента относительно документа\r\n * @param el\r\n * @returns - координаты элемента относительно документа\r\n */\r\nexport function offset(el: HTMLElement): { top: number, left: number } {\r\n\tconst boundingClientRect = el.getBoundingClientRect();\r\n\r\n\treturn {\r\n\t\ttop: boundingClientRect.top + window.scrollY,\r\n\t\tleft: boundingClientRect.left + window.scrollX,\r\n\t};\r\n}\r\n\r\n/**\r\n * Получить значение css свойства элемента\r\n *\r\n * @param el\r\n * @param property - имя свойства\r\n * @return - значение css стиля\r\n */\r\nexport function css(el: HTMLElement, property: string): string {\r\n\treturn window.getComputedStyle(el).getPropertyValue(property);\r\n}\r\n\r\n/**\r\n * Получить значение css свойства целочисленного типа\r\n *\r\n * @param el\r\n * @param property - имя свойства\r\n * @return - значение css стиля\r\n */\r\nexport function cssNumber(el: HTMLElement, property: string): number {\r\n\treturn parseInt(css(el, property));\r\n}\r\n\r\n/**\r\n * Обернуть элемент и вернуть только что созданный элемент\r\n * @param el - элемент, который требуется обернуть\r\n * @param tagName - имя тега элемента, в который треубется обернуть элемент\r\n */\r\nexport function wrap(el: HTMLElement, tagName: string): HTMLElement {\r\n\tconst elWrapper = document.createElement(tagName);\r\n\tel.after(elWrapper);\r\n\r\n\telWrapper.append(el);\r\n\r\n\treturn elWrapper;\r\n}\r\n\r\n/**\r\n * Найти и вернуть первый видимый элемент\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorVisible(el: HTMLElement, selectors: string): HTMLElement | null {\r\n\treturn querySelectorAllArray(el, selectors).find(isVisible) || null;\r\n}\r\n\r\n/**\r\n * Найти и вернуть последний видимый элемент\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorVisibleLast(el: HTMLElement, selectors: string): HTMLElement | null {\r\n\treturn querySelectorAllArray(el, selectors).findLast(isVisible) || null;\r\n}\r\n\r\n/**\r\n * Найти видимые элементы\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorAllVisible(el: HTMLElement | Document, selectors: string): HTMLElement[] {\r\n\treturn querySelectorAllArray(el, selectors).filter(isVisible);\r\n}\r\n\r\n/**\r\n * Найти элементы и вернуть в виде массива\r\n * @param el - корневой элемент поиска\r\n * @param selectors - см. параметр selectors в Document.querySelectorAll()\r\n */\r\nexport function querySelectorAllArray<El extends HTMLElement = HTMLElement>(el: HTMLElement | Document, selectors: string) {\r\n\tif (!el) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\treturn [...el.querySelectorAll<El>(selectors)];\r\n}\r\n\r\n/**\r\n * Хранилище данных элемента\r\n * @param el\r\n * @param contextName - контекст, обычно используется имя компонента\r\n * @param contextData - установить объект с данными, предыдущие данные будут заменены, установите null для удаления данных\r\n * @returns - вернет объект контекста или undefined, если данные контекста не найдены\r\n */\r\nexport function storage(\r\n\tel?: HTMLElement & { topData?: any },\r\n\tcontextName: string = 'common',\r\n\tcontextData: object | null | undefined = undefined,\r\n): any | undefined {\r\n\tif (!el) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!el.topData) {\r\n\t\tel.topData = {};\r\n\t}\r\n\r\n\tif (contextData) {\r\n\t\tel.topData[contextName] = contextData;\r\n\t}\r\n\r\n\tif (contextData === null) {\r\n\t\tdelete el.topData[contextName];\r\n\t}\r\n\r\n\treturn el.topData[contextName];\r\n}\r\n\r\n/**\r\n * Очистить хранилище элемента\r\n */\r\nexport function storageClear(el?: HTMLElement & { topData?: any }): void {\r\n\tif (!el) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tdelete el.topData;\r\n}\r\n\r\nexport default {\r\n\tgenEl,\r\n\tisVisible,\r\n\toffset,\r\n\tcss,\r\n\tcssNumber,\r\n\twrap,\r\n\tquerySelectorVisible,\r\n\tquerySelectorVisibleLast,\r\n\tquerySelectorAllVisible,\r\n\tquerySelectorAllArray,\r\n\tstorage,\r\n\tstorageClear,\r\n};\r\n"],"names":["genEl","tagName","attrs","elsChildrens","el","name","elChildren","isVisible","boundingClientRect","offset","css","property","cssNumber","wrap","elWrapper","querySelectorVisible","selectors","querySelectorAllArray","querySelectorVisibleLast","querySelectorAllVisible","storage","contextName","contextData","storageClear","DOM"],"mappings":"AAYO,SAASA,EAAMC,GAAiBC,MAAmCC,GAAqD;AAC9H,QAAMC,IAAU,SAAS,cAAcH,CAAO;AAE9C,aAAWI,KAAQH;AAClB,IAAIG,EAAK,QAAQ,IAAI,MAAM,IAE1BD,EAAGC,CAAI,IAAIH,EAAMG,CAAI,IAErBD,EAAG,aAAaC,GAAMH,EAAMG,CAAI,CAAC;AAInC,SAAAF,EAAa,QAAQ,CAACG,MAAqC;AAC1D,IAAI,OAAQA,KAAgB,WAC3BF,EAAG,mBAAmB,aAAaE,CAAU,IAE7CF,EAAG,OAAOE,CAAU;AAAA,EAEtB,CAAC,GAEMF;AACR;AAOO,SAASG,EAAUH,GAA2B;AACpD,MAAI,CAACA;AACJ,WAAO;AAGR,QAAMI,IAAqBJ,EAAG,sBAAA;AAC9B,SAAO,CAAC,EAAEI,EAAmB,SAASA,EAAmB;AAC1D;AAOO,SAASC,EAAOL,GAAgD;AACtE,QAAMI,IAAqBJ,EAAG,sBAAA;AAE9B,SAAO;AAAA,IACN,KAAKI,EAAmB,MAAM,OAAO;AAAA,IACrC,MAAMA,EAAmB,OAAO,OAAO;AAAA,EAAA;AAEzC;AASO,SAASE,EAAIN,GAAiBO,GAA0B;AAC9D,SAAO,OAAO,iBAAiBP,CAAE,EAAE,iBAAiBO,CAAQ;AAC7D;AASO,SAASC,EAAUR,GAAiBO,GAA0B;AACpE,SAAO,SAASD,EAAIN,GAAIO,CAAQ,CAAC;AAClC;AAOO,SAASE,EAAKT,GAAiBH,GAA8B;AACnE,QAAMa,IAAY,SAAS,cAAcb,CAAO;AAChD,SAAAG,EAAG,MAAMU,CAAS,GAElBA,EAAU,OAAOV,CAAE,GAEZU;AACR;AAOO,SAASC,EAAqBX,GAAiBY,GAAuC;AAC5F,SAAOC,EAAsBb,GAAIY,CAAS,EAAE,KAAKT,CAAS,KAAK;AAChE;AAOO,SAASW,EAAyBd,GAAiBY,GAAuC;AAChG,SAAOC,EAAsBb,GAAIY,CAAS,EAAE,SAAST,CAAS,KAAK;AACpE;AAOO,SAASY,EAAwBf,GAA4BY,GAAkC;AACrG,SAAOC,EAAsBb,GAAIY,CAAS,EAAE,OAAOT,CAAS;AAC7D;AAOO,SAASU,EAA4Db,GAA4BY,GAAmB;AAC1H,SAAKZ,IAIE,CAAC,GAAGA,EAAG,iBAAqBY,CAAS,CAAC,IAHrC,CAAA;AAIT;AASO,SAASI,EACfhB,GACAiB,IAAsB,UACtBC,IAAyC,QACvB;AAClB,MAAKlB;AAIL,WAAKA,EAAG,YACPA,EAAG,UAAU,CAAA,IAGVkB,MACHlB,EAAG,QAAQiB,CAAW,IAAIC,IAGvBA,MAAgB,QACnB,OAAOlB,EAAG,QAAQiB,CAAW,GAGvBjB,EAAG,QAAQiB,CAAW;AAC9B;AAKO,SAASE,EAAanB,GAA4C;AACxE,EAAKA,KAIL,OAAOA,EAAG;AACX;AAEA,MAAAoB,IAAe;AAAA,EACd,OAAAxB;AAAA,EACA,WAAAO;AAAA,EACA,QAAAE;AAAA,EACA,KAAAC;AAAA,EACA,WAAAE;AAAA,EACA,MAAAC;AAAA,EACA,sBAAAE;AAAA,EACA,0BAAAG;AAAA,EACA,yBAAAC;AAAA,EACA,uBAAAF;AAAA,EACA,SAAAG;AAAA,EACA,cAAAG;AACD;"}
|
package/utils/image.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.amd.js","sources":["../../src/core/utils/image.ts"],"sourcesContent":["/**\n * Работа с изображениями\n * @packageDocumentation\n */\n\nimport punycode from 'punycode';\n\n/**\n * Скачать изображение, переданное в виде строки\n * @param imageStr - адресс картинки\n * @param imageName - имя файла при загрузке, по умолчанию download\n */\nexport const downloadImageFromString = (imageStr: string, imageName: string = 'download'): void => {\n\tconst a = document.createElement('a');\n\ta.download = imageName;\n\ta.href = imageStr;\n\ta.click();\n};\n\n/**\n * Сгенерировать html картинку с фавиконкой сайта\n * @param url - адрес сайта\n * @param isBig - если true, картинка будет 120px, иначе 32px\n */\nexport const genFaviconImgHtml = (url: string, isBig: boolean): string => {\n\tlet size = 32;\n\tif (isBig) size = 120;\n\n\turl = url.replace(/^\\w+:\\/\\/|^www\\.|\\/.*/g, '');\n\turl = punycode.toASCII(url);\n\n\tconst onloadAttr = `\n\t\tonload=\"\n\t\t\tvar that = this;\n\t\t\t$.ajax({\n\t\t\t\ttype:'get',\n\t\t\t\turl:this.src,\n\t\t\t\tsuccess:function(res){ if(res.length > 100) that.className='top-favicon'; },\n\t\t\t\terror:function(){ }\n\t\t\t});\n\t\t\"\n\t`;\n\n\t//\treturn '<img src=\"https://www.google.com/s2/favicons?domain=' + url + '\" class=\"top-favicon empty\"> ' + onloadAttr + '>';\n\treturn '<img src=\"https://favicon.yandex.net/favicon/' + url + '?size=' + size + '\" class=\"top-favicon empty\" ' + onloadAttr + ' alt=\"\">';\n};\n"],"names":["downloadImageFromString","imageStr","imageName","a","genFaviconImgHtml","url","isBig","size","punycode_es6"],"mappings":"mIAYO,MAAAA,EAAA,CAAAC,EAAAC,EAAA,aAAA,qCAENC,EAAA,SAAAD,EACAC,EAAA,KAAAF,WAED,EAOOG,EAAA,CAAAC,EAAAC,IAAA,UAEN,OAAAA,IAAAC,EAAA,8CAGAF,EAAAG,EAAA,SAAA,QAAAH,CAAA,EAeA,gDAAAA,EAAA,SAAAE,EAAA;;;;;;;;;;GAAA,UACD"}
|
|
1
|
+
{"version":3,"file":"image.amd.js","sources":["../../src/core/utils/image.ts"],"sourcesContent":["/**\r\n * Работа с изображениями\r\n * @packageDocumentation\r\n */\r\n\r\nimport punycode from 'punycode';\r\n\r\n/**\r\n * Скачать изображение, переданное в виде строки\r\n * @param imageStr - адресс картинки\r\n * @param imageName - имя файла при загрузке, по умолчанию download\r\n */\r\nexport const downloadImageFromString = (imageStr: string, imageName: string = 'download'): void => {\r\n\tconst a = document.createElement('a');\r\n\ta.download = imageName;\r\n\ta.href = imageStr;\r\n\ta.click();\r\n};\r\n\r\n/**\r\n * Сгенерировать html картинку с фавиконкой сайта\r\n * @param url - адрес сайта\r\n * @param isBig - если true, картинка будет 120px, иначе 32px\r\n */\r\nexport const genFaviconImgHtml = (url: string, isBig: boolean): string => {\r\n\tlet size = 32;\r\n\tif (isBig) size = 120;\r\n\r\n\turl = url.replace(/^\\w+:\\/\\/|^www\\.|\\/.*/g, '');\r\n\turl = punycode.toASCII(url);\r\n\r\n\tconst onloadAttr = `\r\n\t\tonload=\"\r\n\t\t\tvar that = this;\r\n\t\t\t$.ajax({\r\n\t\t\t\ttype:'get',\r\n\t\t\t\turl:this.src,\r\n\t\t\t\tsuccess:function(res){ if(res.length > 100) that.className='top-favicon'; },\r\n\t\t\t\terror:function(){ }\r\n\t\t\t});\r\n\t\t\"\r\n\t`;\r\n\r\n\t//\treturn '<img src=\"https://www.google.com/s2/favicons?domain=' + url + '\" class=\"top-favicon empty\"> ' + onloadAttr + '>';\r\n\treturn '<img src=\"https://favicon.yandex.net/favicon/' + url + '?size=' + size + '\" class=\"top-favicon empty\" ' + onloadAttr + ' alt=\"\">';\r\n};\r\n"],"names":["downloadImageFromString","imageStr","imageName","a","genFaviconImgHtml","url","isBig","size","punycode_es6"],"mappings":"mIAYO,MAAAA,EAAA,CAAAC,EAAAC,EAAA,aAAA,qCAENC,EAAA,SAAAD,EACAC,EAAA,KAAAF,WAED,EAOOG,EAAA,CAAAC,EAAAC,IAAA,UAEN,OAAAA,IAAAC,EAAA,8CAGAF,EAAAG,EAAA,SAAA,QAAAH,CAAA,EAeA,gDAAAA,EAAA,SAAAE,EAAA;;;;;;;;;;GAAA,UACD"}
|
package/utils/image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","sources":["../../src/core/utils/image.ts"],"sourcesContent":["/**\n * Работа с изображениями\n * @packageDocumentation\n */\n\nimport punycode from 'punycode';\n\n/**\n * Скачать изображение, переданное в виде строки\n * @param imageStr - адресс картинки\n * @param imageName - имя файла при загрузке, по умолчанию download\n */\nexport const downloadImageFromString = (imageStr: string, imageName: string = 'download'): void => {\n\tconst a = document.createElement('a');\n\ta.download = imageName;\n\ta.href = imageStr;\n\ta.click();\n};\n\n/**\n * Сгенерировать html картинку с фавиконкой сайта\n * @param url - адрес сайта\n * @param isBig - если true, картинка будет 120px, иначе 32px\n */\nexport const genFaviconImgHtml = (url: string, isBig: boolean): string => {\n\tlet size = 32;\n\tif (isBig) size = 120;\n\n\turl = url.replace(/^\\w+:\\/\\/|^www\\.|\\/.*/g, '');\n\turl = punycode.toASCII(url);\n\n\tconst onloadAttr = `\n\t\tonload=\"\n\t\t\tvar that = this;\n\t\t\t$.ajax({\n\t\t\t\ttype:'get',\n\t\t\t\turl:this.src,\n\t\t\t\tsuccess:function(res){ if(res.length > 100) that.className='top-favicon'; },\n\t\t\t\terror:function(){ }\n\t\t\t});\n\t\t\"\n\t`;\n\n\t//\treturn '<img src=\"https://www.google.com/s2/favicons?domain=' + url + '\" class=\"top-favicon empty\"> ' + onloadAttr + '>';\n\treturn '<img src=\"https://favicon.yandex.net/favicon/' + url + '?size=' + size + '\" class=\"top-favicon empty\" ' + onloadAttr + ' alt=\"\">';\n};\n"],"names":["downloadImageFromString","imageStr","imageName","a","genFaviconImgHtml","url","isBig","size","punycode"],"mappings":";AAYO,MAAMA,IAA0B,CAACC,GAAkBC,IAAoB,eAAqB;AAClG,QAAMC,IAAI,SAAS,cAAc,GAAG;AACpC,EAAAA,EAAE,WAAWD,GACbC,EAAE,OAAOF,GACTE,EAAE,MAAA;AACH,GAOaC,IAAoB,CAACC,GAAaC,MAA2B;AACzE,MAAIC,IAAO;AACX,SAAID,MAAOC,IAAO,MAElBF,IAAMA,EAAI,QAAQ,0BAA0B,EAAE,GAC9CA,IAAMG,EAAS,QAAQH,CAAG,GAenB,kDAAkDA,IAAM,WAAWE,IAAO,iCAb9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAa4G;AAChI;"}
|
|
1
|
+
{"version":3,"file":"image.js","sources":["../../src/core/utils/image.ts"],"sourcesContent":["/**\r\n * Работа с изображениями\r\n * @packageDocumentation\r\n */\r\n\r\nimport punycode from 'punycode';\r\n\r\n/**\r\n * Скачать изображение, переданное в виде строки\r\n * @param imageStr - адресс картинки\r\n * @param imageName - имя файла при загрузке, по умолчанию download\r\n */\r\nexport const downloadImageFromString = (imageStr: string, imageName: string = 'download'): void => {\r\n\tconst a = document.createElement('a');\r\n\ta.download = imageName;\r\n\ta.href = imageStr;\r\n\ta.click();\r\n};\r\n\r\n/**\r\n * Сгенерировать html картинку с фавиконкой сайта\r\n * @param url - адрес сайта\r\n * @param isBig - если true, картинка будет 120px, иначе 32px\r\n */\r\nexport const genFaviconImgHtml = (url: string, isBig: boolean): string => {\r\n\tlet size = 32;\r\n\tif (isBig) size = 120;\r\n\r\n\turl = url.replace(/^\\w+:\\/\\/|^www\\.|\\/.*/g, '');\r\n\turl = punycode.toASCII(url);\r\n\r\n\tconst onloadAttr = `\r\n\t\tonload=\"\r\n\t\t\tvar that = this;\r\n\t\t\t$.ajax({\r\n\t\t\t\ttype:'get',\r\n\t\t\t\turl:this.src,\r\n\t\t\t\tsuccess:function(res){ if(res.length > 100) that.className='top-favicon'; },\r\n\t\t\t\terror:function(){ }\r\n\t\t\t});\r\n\t\t\"\r\n\t`;\r\n\r\n\t//\treturn '<img src=\"https://www.google.com/s2/favicons?domain=' + url + '\" class=\"top-favicon empty\"> ' + onloadAttr + '>';\r\n\treturn '<img src=\"https://favicon.yandex.net/favicon/' + url + '?size=' + size + '\" class=\"top-favicon empty\" ' + onloadAttr + ' alt=\"\">';\r\n};\r\n"],"names":["downloadImageFromString","imageStr","imageName","a","genFaviconImgHtml","url","isBig","size","punycode"],"mappings":";AAYO,MAAMA,IAA0B,CAACC,GAAkBC,IAAoB,eAAqB;AAClG,QAAMC,IAAI,SAAS,cAAc,GAAG;AACpC,EAAAA,EAAE,WAAWD,GACbC,EAAE,OAAOF,GACTE,EAAE,MAAA;AACH,GAOaC,IAAoB,CAACC,GAAaC,MAA2B;AACzE,MAAIC,IAAO;AACX,SAAID,MAAOC,IAAO,MAElBF,IAAMA,EAAI,QAAQ,0BAA0B,EAAE,GAC9CA,IAAMG,EAAS,QAAQH,CAAG,GAenB,kDAAkDA,IAAM,WAAWE,IAAO,iCAb9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAa4G;AAChI;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard.amd.js","sources":["../../src/core/utils/keyboard.ts"],"sourcesContent":["/**\n * Утилиты для работы с устройствами ввода\n * @packageDocumentation\n */\n\n/**\n * Перевод строки в другую раскладку\n */\nexport const invertKeyboardLayout = (string: string): string => {\n\tconst a1 = 'qwertyuiop[]asdfghjkl;\\'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL;\"ZXCVBNM<>?';\n\tconst a2 = 'йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДжЭЯЧСМИТЬБЮ,';\n\tlet indexFinded: number;\n\n\tconst chars: Array<string> = string.split('');\n\tchars.forEach((char: string, index: number) => {\n\t\tindexFinded = a1.indexOf(char);\n\t\tif (indexFinded !== -1) {\n\t\t\tchars[index] = a2[indexFinded];\n\t\t} else {\n\t\t\tindexFinded = a2.indexOf(char);\n\t\t\tif (indexFinded !== -1) {\n\t\t\t\tchars[index] = a1[indexFinded];\n\t\t\t}\n\t\t}\n\t});\n\tstring = chars.join('');\n\n\treturn string;\n};\n"],"names":["invertKeyboardLayout","string","a1","indexFinded","char","a2","chars"],"mappings":"0FAQO,MAAAA,EAAAC,GAAA,CACN,MAAAC,EAAA,4IAEA,IAAAC,+CAICA,EAAAD,EAAA,QAAAE,CAAA,EACAD,IAAA,cAGCA,EAAAE,EAAA,QAAAD,CAAA,EACAD,IAAA,gBAGD,CAAA,EAEDF,EAAAK,EAAA,KAAA,EAAA,EAEAL,CACD"}
|
|
1
|
+
{"version":3,"file":"keyboard.amd.js","sources":["../../src/core/utils/keyboard.ts"],"sourcesContent":["/**\r\n * Утилиты для работы с устройствами ввода\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Перевод строки в другую раскладку\r\n */\r\nexport const invertKeyboardLayout = (string: string): string => {\r\n\tconst a1 = 'qwertyuiop[]asdfghjkl;\\'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL;\"ZXCVBNM<>?';\r\n\tconst a2 = 'йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДжЭЯЧСМИТЬБЮ,';\r\n\tlet indexFinded: number;\r\n\r\n\tconst chars: Array<string> = string.split('');\r\n\tchars.forEach((char: string, index: number) => {\r\n\t\tindexFinded = a1.indexOf(char);\r\n\t\tif (indexFinded !== -1) {\r\n\t\t\tchars[index] = a2[indexFinded];\r\n\t\t} else {\r\n\t\t\tindexFinded = a2.indexOf(char);\r\n\t\t\tif (indexFinded !== -1) {\r\n\t\t\t\tchars[index] = a1[indexFinded];\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tstring = chars.join('');\r\n\r\n\treturn string;\r\n};\r\n"],"names":["invertKeyboardLayout","string","a1","indexFinded","char","a2","chars"],"mappings":"0FAQO,MAAAA,EAAAC,GAAA,CACN,MAAAC,EAAA,4IAEA,IAAAC,+CAICA,EAAAD,EAAA,QAAAE,CAAA,EACAD,IAAA,cAGCA,EAAAE,EAAA,QAAAD,CAAA,EACAD,IAAA,gBAGD,CAAA,EAEDF,EAAAK,EAAA,KAAA,EAAA,EAEAL,CACD"}
|
package/utils/keyboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard.js","sources":["../../src/core/utils/keyboard.ts"],"sourcesContent":["/**\n * Утилиты для работы с устройствами ввода\n * @packageDocumentation\n */\n\n/**\n * Перевод строки в другую раскладку\n */\nexport const invertKeyboardLayout = (string: string): string => {\n\tconst a1 = 'qwertyuiop[]asdfghjkl;\\'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL;\"ZXCVBNM<>?';\n\tconst a2 = 'йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДжЭЯЧСМИТЬБЮ,';\n\tlet indexFinded: number;\n\n\tconst chars: Array<string> = string.split('');\n\tchars.forEach((char: string, index: number) => {\n\t\tindexFinded = a1.indexOf(char);\n\t\tif (indexFinded !== -1) {\n\t\t\tchars[index] = a2[indexFinded];\n\t\t} else {\n\t\t\tindexFinded = a2.indexOf(char);\n\t\t\tif (indexFinded !== -1) {\n\t\t\t\tchars[index] = a1[indexFinded];\n\t\t\t}\n\t\t}\n\t});\n\tstring = chars.join('');\n\n\treturn string;\n};\n"],"names":["invertKeyboardLayout","string","a1","a2","indexFinded","chars","char","index"],"mappings":"AAQO,MAAMA,IAAuB,CAACC,MAA2B;AAC/D,QAAMC,IAAK,sEACLC,IAAK;AACX,MAAIC;AAEJ,QAAMC,IAAuBJ,EAAO,MAAM,EAAE;AAC5C,SAAAI,EAAM,QAAQ,CAACC,GAAcC,MAAkB;AAC9C,IAAAH,IAAcF,EAAG,QAAQI,CAAI,GACzBF,MAAgB,KACnBC,EAAME,CAAK,IAAIJ,EAAGC,CAAW,KAE7BA,IAAcD,EAAG,QAAQG,CAAI,GACzBF,MAAgB,OACnBC,EAAME,CAAK,IAAIL,EAAGE,CAAW;AAAA,EAGhC,CAAC,GACDH,IAASI,EAAM,KAAK,EAAE,GAEfJ;AACR;"}
|
|
1
|
+
{"version":3,"file":"keyboard.js","sources":["../../src/core/utils/keyboard.ts"],"sourcesContent":["/**\r\n * Утилиты для работы с устройствами ввода\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Перевод строки в другую раскладку\r\n */\r\nexport const invertKeyboardLayout = (string: string): string => {\r\n\tconst a1 = 'qwertyuiop[]asdfghjkl;\\'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL;\"ZXCVBNM<>?';\r\n\tconst a2 = 'йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДжЭЯЧСМИТЬБЮ,';\r\n\tlet indexFinded: number;\r\n\r\n\tconst chars: Array<string> = string.split('');\r\n\tchars.forEach((char: string, index: number) => {\r\n\t\tindexFinded = a1.indexOf(char);\r\n\t\tif (indexFinded !== -1) {\r\n\t\t\tchars[index] = a2[indexFinded];\r\n\t\t} else {\r\n\t\t\tindexFinded = a2.indexOf(char);\r\n\t\t\tif (indexFinded !== -1) {\r\n\t\t\t\tchars[index] = a1[indexFinded];\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tstring = chars.join('');\r\n\r\n\treturn string;\r\n};\r\n"],"names":["invertKeyboardLayout","string","a1","a2","indexFinded","chars","char","index"],"mappings":"AAQO,MAAMA,IAAuB,CAACC,MAA2B;AAC/D,QAAMC,IAAK,sEACLC,IAAK;AACX,MAAIC;AAEJ,QAAMC,IAAuBJ,EAAO,MAAM,EAAE;AAC5C,SAAAI,EAAM,QAAQ,CAACC,GAAcC,MAAkB;AAC9C,IAAAH,IAAcF,EAAG,QAAQI,CAAI,GACzBF,MAAgB,KACnBC,EAAME,CAAK,IAAIJ,EAAGC,CAAW,KAE7BA,IAAcD,EAAG,QAAQG,CAAI,GACzBF,MAAgB,OACnBC,EAAME,CAAK,IAAIL,EAAGE,CAAW;AAAA,EAGhC,CAAC,GACDH,IAASI,EAAM,KAAK,EAAE,GAEfJ;AACR;"}
|
package/utils/lodash.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-4D_EVI46.amd"],(function(u,e,n){"use strict";if(typeof i>"u")var i=window.Vue;e.cloneDeep=n.cloneDeep,e.debounce=n.debounce,e.memoize=n.memoize,e.merge=n.merge,e.throttle=n.throttle,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=lodash.amd.js.map
|
package/utils/lodash.js
CHANGED
package/utils/number.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.amd.js","sources":["../../src/core/utils/number.ts"],"sourcesContent":["/**\n * Работа с числами\n * @packageDocumentation\n */\n\n/**\n * Посчитать процент от числа (сколько процентов составляет part от full)\n * @param part - первое число\n * @param full - второе число\n * @param precision - точность (колличество знаков после запятой)\n */\nexport const percentOfNumber = (part: '--' | number, full: number = 100, precision: number = 0): '--' | number => {\n\tif (part === '--') return part;\n\n\tlet percent = (full * 1) ? part / full : 0;\n\tpercent *= 100;\n\n\t// если десятичные знаки не выводятся и число при округлении может дать ноль, то округляем в большую сторону\n\tif (!precision && percent < 1) {\n\t\tpercent = Math.round(percent * (Math.pow(10, 2))) / (Math.pow(10, 2));\n\t} else {\n\t\tpercent = Math.round(percent * (Math.pow(10, precision))) / (Math.pow(10, precision));\n\t}\n\n\treturn percent;\n};\n\n/**\n * Генерация псевдорандомного числа\n *\n * Детерменированная функция по параметру seed\n */\nexport const randomBySeed = (seed: number) => {\n\tlet x = Math.sin(seed) * 10000;\n\n\treturn x - Math.floor(x);\n};\n"],"names":["percentOfNumber","part","full","precision","percent","randomBySeed","seed"],"mappings":"0FAWO,MAAAA,EAAA,CAAAC,EAAAC,EAAA,IAAAC,EAAA,IAAA,CACN,GAAAF,IAAA,KAAA,OAAAA,gCAMA,CAAAE,GAAAC,EAAA,8FAMAA,CACD,EAOOC,EAAAC,GAAA,6CAIP"}
|
|
1
|
+
{"version":3,"file":"number.amd.js","sources":["../../src/core/utils/number.ts"],"sourcesContent":["/**\r\n * Работа с числами\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Посчитать процент от числа (сколько процентов составляет part от full)\r\n * @param part - первое число\r\n * @param full - второе число\r\n * @param precision - точность (колличество знаков после запятой)\r\n */\r\nexport const percentOfNumber = (part: '--' | number, full: number = 100, precision: number = 0): '--' | number => {\r\n\tif (part === '--') return part;\r\n\r\n\tlet percent = (full * 1) ? part / full : 0;\r\n\tpercent *= 100;\r\n\r\n\t// если десятичные знаки не выводятся и число при округлении может дать ноль, то округляем в большую сторону\r\n\tif (!precision && percent < 1) {\r\n\t\tpercent = Math.round(percent * (Math.pow(10, 2))) / (Math.pow(10, 2));\r\n\t} else {\r\n\t\tpercent = Math.round(percent * (Math.pow(10, precision))) / (Math.pow(10, precision));\r\n\t}\r\n\r\n\treturn percent;\r\n};\r\n\r\n/**\r\n * Генерация псевдорандомного числа\r\n *\r\n * Детерменированная функция по параметру seed\r\n */\r\nexport const randomBySeed = (seed: number) => {\r\n\tlet x = Math.sin(seed) * 10000;\r\n\r\n\treturn x - Math.floor(x);\r\n};\r\n"],"names":["percentOfNumber","part","full","precision","percent","randomBySeed","seed"],"mappings":"0FAWO,MAAAA,EAAA,CAAAC,EAAAC,EAAA,IAAAC,EAAA,IAAA,CACN,GAAAF,IAAA,KAAA,OAAAA,gCAMA,CAAAE,GAAAC,EAAA,8FAMAA,CACD,EAOOC,EAAAC,GAAA,6CAIP"}
|
package/utils/number.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sources":["../../src/core/utils/number.ts"],"sourcesContent":["/**\n * Работа с числами\n * @packageDocumentation\n */\n\n/**\n * Посчитать процент от числа (сколько процентов составляет part от full)\n * @param part - первое число\n * @param full - второе число\n * @param precision - точность (колличество знаков после запятой)\n */\nexport const percentOfNumber = (part: '--' | number, full: number = 100, precision: number = 0): '--' | number => {\n\tif (part === '--') return part;\n\n\tlet percent = (full * 1) ? part / full : 0;\n\tpercent *= 100;\n\n\t// если десятичные знаки не выводятся и число при округлении может дать ноль, то округляем в большую сторону\n\tif (!precision && percent < 1) {\n\t\tpercent = Math.round(percent * (Math.pow(10, 2))) / (Math.pow(10, 2));\n\t} else {\n\t\tpercent = Math.round(percent * (Math.pow(10, precision))) / (Math.pow(10, precision));\n\t}\n\n\treturn percent;\n};\n\n/**\n * Генерация псевдорандомного числа\n *\n * Детерменированная функция по параметру seed\n */\nexport const randomBySeed = (seed: number) => {\n\tlet x = Math.sin(seed) * 10000;\n\n\treturn x - Math.floor(x);\n};\n"],"names":["percentOfNumber","part","full","precision","percent","randomBySeed","seed","x"],"mappings":"AAWO,MAAMA,IAAkB,CAACC,GAAqBC,IAAe,KAAKC,IAAoB,MAAqB;AACjH,MAAIF,MAAS,KAAM,QAAOA;AAE1B,MAAIG,IAAWF,IAAO,IAAKD,IAAOC,IAAO;AACzC,SAAAE,KAAW,KAGP,CAACD,KAAaC,IAAU,IAC3BA,IAAU,KAAK,MAAMA,IAAW,KAAK,IAAI,IAAI,CAAC,CAAE,IAAK,KAAK,IAAI,IAAI,CAAC,IAEnEA,IAAU,KAAK,MAAMA,IAAW,KAAK,IAAI,IAAID,CAAS,CAAE,IAAK,KAAK,IAAI,IAAIA,CAAS,GAG7EC;AACR,GAOaC,IAAe,CAACC,MAAiB;AAC7C,MAAIC,IAAI,KAAK,IAAID,CAAI,IAAI;AAEzB,SAAOC,IAAI,KAAK,MAAMA,CAAC;AACxB;"}
|
|
1
|
+
{"version":3,"file":"number.js","sources":["../../src/core/utils/number.ts"],"sourcesContent":["/**\r\n * Работа с числами\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Посчитать процент от числа (сколько процентов составляет part от full)\r\n * @param part - первое число\r\n * @param full - второе число\r\n * @param precision - точность (колличество знаков после запятой)\r\n */\r\nexport const percentOfNumber = (part: '--' | number, full: number = 100, precision: number = 0): '--' | number => {\r\n\tif (part === '--') return part;\r\n\r\n\tlet percent = (full * 1) ? part / full : 0;\r\n\tpercent *= 100;\r\n\r\n\t// если десятичные знаки не выводятся и число при округлении может дать ноль, то округляем в большую сторону\r\n\tif (!precision && percent < 1) {\r\n\t\tpercent = Math.round(percent * (Math.pow(10, 2))) / (Math.pow(10, 2));\r\n\t} else {\r\n\t\tpercent = Math.round(percent * (Math.pow(10, precision))) / (Math.pow(10, precision));\r\n\t}\r\n\r\n\treturn percent;\r\n};\r\n\r\n/**\r\n * Генерация псевдорандомного числа\r\n *\r\n * Детерменированная функция по параметру seed\r\n */\r\nexport const randomBySeed = (seed: number) => {\r\n\tlet x = Math.sin(seed) * 10000;\r\n\r\n\treturn x - Math.floor(x);\r\n};\r\n"],"names":["percentOfNumber","part","full","precision","percent","randomBySeed","seed","x"],"mappings":"AAWO,MAAMA,IAAkB,CAACC,GAAqBC,IAAe,KAAKC,IAAoB,MAAqB;AACjH,MAAIF,MAAS,KAAM,QAAOA;AAE1B,MAAIG,IAAWF,IAAO,IAAKD,IAAOC,IAAO;AACzC,SAAAE,KAAW,KAGP,CAACD,KAAaC,IAAU,IAC3BA,IAAU,KAAK,MAAMA,IAAW,KAAK,IAAI,IAAI,CAAC,CAAE,IAAK,KAAK,IAAI,IAAI,CAAC,IAEnEA,IAAU,KAAK,MAAMA,IAAW,KAAK,IAAI,IAAID,CAAS,CAAE,IAAK,KAAK,IAAI,IAAIA,CAAS,GAG7EC;AACR,GAOaC,IAAe,CAACC,MAAiB;AAC7C,MAAIC,IAAI,KAAK,IAAID,CAAI,IAAI;AAEzB,SAAOC,IAAI,KAAK,MAAMA,CAAC;AACxB;"}
|
package/utils/price.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-4D_EVI46.amd"],(function(a,t,i){"use strict";if(typeof n>"u")var n=window.Vue;const u=(c,e,o=i.Core.state.currency)=>{e=e??i.useI18nLang().value;let r=c.toLocaleString(e,{style:"currency",currency:o,maximumFractionDigits:2});return r=r.replace(",","."),r};t.genPrice=u,Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=price.amd.js.map
|
package/utils/price.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"price.amd.js","sources":["../../src/core/utils/price.ts"],"sourcesContent":["/**\n * Работа с ценами\n * @packageDocumentation\n */\n\nimport type { Lang } from '@/core/plugins/i18n';\nimport { useI18nLang } from '@/core/plugins/i18n';\nimport Core from '@/core/core/core';\n\n/**\n * Сгенерировать строку с суммой и валютой\n * @param sum - сумма\n * @param lang - язык, берётся из профиля, если не задано\n * @param currency - валюта, берётся из профиля, если не задано\n * @returns строка с языкозависимым представлением числа sum и знаком валюты\n */\nexport const genPrice = (sum: number, lang?: Lang, currency: typeof Core.state.currency = Core.state.currency): string => {\n\tlang = lang ?? useI18nLang().value;\n\n\tlet sumStr = sum.toLocaleString(lang, { style: 'currency', currency, maximumFractionDigits: 2 });\n\tsumStr = sumStr.replace(',', '.');\n\n\treturn sumStr;\n};\n"],"names":["genPrice","sum","lang","currency","forms","sumStr"],"mappings":"4HAgBO,MAAAA,EAAA,CAAAC,EAAAC,EAAAC,EAAAC,EAAA,KAAA,MAAA,WAAA,CACNF,EAAAA,GAAAE,EAAA,YAAA,EAAA,kHAKAC,CACD"}
|
|
1
|
+
{"version":3,"file":"price.amd.js","sources":["../../src/core/utils/price.ts"],"sourcesContent":["/**\r\n * Работа с ценами\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { Lang } from '@/core/plugins/i18n';\r\nimport { useI18nLang } from '@/core/plugins/i18n';\r\nimport Core from '@/core/core/core';\r\n\r\n/**\r\n * Сгенерировать строку с суммой и валютой\r\n * @param sum - сумма\r\n * @param lang - язык, берётся из профиля, если не задано\r\n * @param currency - валюта, берётся из профиля, если не задано\r\n * @returns строка с языкозависимым представлением числа sum и знаком валюты\r\n */\r\nexport const genPrice = (sum: number, lang?: Lang, currency: typeof Core.state.currency = Core.state.currency): string => {\r\n\tlang = lang ?? useI18nLang().value;\r\n\r\n\tlet sumStr = sum.toLocaleString(lang, { style: 'currency', currency, maximumFractionDigits: 2 });\r\n\tsumStr = sumStr.replace(',', '.');\r\n\r\n\treturn sumStr;\r\n};\r\n"],"names":["genPrice","sum","lang","currency","forms","sumStr"],"mappings":"4HAgBO,MAAAA,EAAA,CAAAC,EAAAC,EAAAC,EAAAC,EAAA,KAAA,MAAA,WAAA,CACNF,EAAAA,GAAAE,EAAA,YAAA,EAAA,kHAKAC,CACD"}
|
package/utils/price.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as a, a as o } from "../.chunks/forms-
|
|
1
|
+
import { C as a, a as o } from "../.chunks/forms-xkXHvvah.es.js";
|
|
2
2
|
const i = (t, e, c = a.state.currency) => {
|
|
3
3
|
e = e ?? o().value;
|
|
4
4
|
let r = t.toLocaleString(e, { style: "currency", currency: c, maximumFractionDigits: 2 });
|
package/utils/price.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"price.js","sources":["../../src/core/utils/price.ts"],"sourcesContent":["/**\n * Работа с ценами\n * @packageDocumentation\n */\n\nimport type { Lang } from '@/core/plugins/i18n';\nimport { useI18nLang } from '@/core/plugins/i18n';\nimport Core from '@/core/core/core';\n\n/**\n * Сгенерировать строку с суммой и валютой\n * @param sum - сумма\n * @param lang - язык, берётся из профиля, если не задано\n * @param currency - валюта, берётся из профиля, если не задано\n * @returns строка с языкозависимым представлением числа sum и знаком валюты\n */\nexport const genPrice = (sum: number, lang?: Lang, currency: typeof Core.state.currency = Core.state.currency): string => {\n\tlang = lang ?? useI18nLang().value;\n\n\tlet sumStr = sum.toLocaleString(lang, { style: 'currency', currency, maximumFractionDigits: 2 });\n\tsumStr = sumStr.replace(',', '.');\n\n\treturn sumStr;\n};\n"],"names":["genPrice","sum","lang","currency","Core","useI18nLang","sumStr"],"mappings":";AAgBO,MAAMA,IAAW,CAACC,GAAaC,GAAaC,IAAuCC,EAAK,MAAM,aAAqB;AACzH,EAAAF,IAAOA,KAAQG,IAAc;AAE7B,MAAIC,IAASL,EAAI,eAAeC,GAAM,EAAE,OAAO,YAAY,UAAAC,GAAU,uBAAuB,GAAG;AAC/F,SAAAG,IAASA,EAAO,QAAQ,KAAK,GAAG,GAEzBA;AACR;"}
|
|
1
|
+
{"version":3,"file":"price.js","sources":["../../src/core/utils/price.ts"],"sourcesContent":["/**\r\n * Работа с ценами\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { Lang } from '@/core/plugins/i18n';\r\nimport { useI18nLang } from '@/core/plugins/i18n';\r\nimport Core from '@/core/core/core';\r\n\r\n/**\r\n * Сгенерировать строку с суммой и валютой\r\n * @param sum - сумма\r\n * @param lang - язык, берётся из профиля, если не задано\r\n * @param currency - валюта, берётся из профиля, если не задано\r\n * @returns строка с языкозависимым представлением числа sum и знаком валюты\r\n */\r\nexport const genPrice = (sum: number, lang?: Lang, currency: typeof Core.state.currency = Core.state.currency): string => {\r\n\tlang = lang ?? useI18nLang().value;\r\n\r\n\tlet sumStr = sum.toLocaleString(lang, { style: 'currency', currency, maximumFractionDigits: 2 });\r\n\tsumStr = sumStr.replace(',', '.');\r\n\r\n\treturn sumStr;\r\n};\r\n"],"names":["genPrice","sum","lang","currency","Core","useI18nLang","sumStr"],"mappings":";AAgBO,MAAMA,IAAW,CAACC,GAAaC,GAAaC,IAAuCC,EAAK,MAAM,aAAqB;AACzH,EAAAF,IAAOA,KAAQG,IAAc;AAE7B,MAAIC,IAASL,EAAI,eAAeC,GAAM,EAAE,OAAO,YAAY,UAAAC,GAAU,uBAAuB,GAAG;AAC/F,SAAAG,IAASA,EAAO,QAAQ,KAAK,GAAG,GAEzBA;AACR;"}
|
package/utils/route.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.amd.js","sources":["../../src/core/utils/route.ts"],"sourcesContent":["/**\n * Управление навигацией страницы, работа с hash параметрами страницы\n * @packageDocumentation\n */\n\n/**\n * Получить значение хэш параметра страницы\n */\nexport const getHash = function (name: string, locationHash: string = location.hash): string {\n\tconst re = new RegExp('[#?&]' + name + '=([^&]*)');\n\tconst value = locationHash.match(re);\n\tif (!value || value.length != 2) return '';\n\n\tvalue[1] = decodeURIComponent(value[1]);\n\tvalue[1] = value[1].replace(/\\+/g, ' ');\n\n\treturn value[1];\n};\n\n/**\n * Установить значение в хэш параметр страницы\n */\nexport const setHash = function (name: string, value: string | number | null, replaceState: boolean = true): void {\n\tlet hash = genHash(name, value);\n\n\tif (replaceState) {\n\t\thistorySetState(true, hash);\n\t} else {\n\t\thistorySetState(false, hash);\n\t}\n};\n\n/**\n * Удалить значение из хэш параметра страницы\n */\nexport const delHash = function (name: string, value: string, replaceState: boolean = true): void {\n\tsetHash(name, null, replaceState);\n};\n\n/**\n * Сгенерировать новое значение для хэш параметра страницы с указанным параметром\n */\nexport const genHash = function (name: string, value: string | number | null, locationHash: string = location.hash): string {\n\tconst re = new RegExp('&?' + name + '=[^&]*', 'g');\n\n\tlocationHash = locationHash.replace(re, '');\n\n\tif (value !== null) {\n\t\tvalue = (value + '').replace(' ', '%20');\n\t\tlocationHash = locationHash.replace(re, '&' + name + '=' + value);\n\n\t\tif (locationHash.indexOf('&' + name + '=') == -1) locationHash += '&' + name + '=' + value;\n\t}\n\n\tlocationHash = locationHash.replace(/&+/g, '&');\n\tlocationHash = locationHash.replace(/^(#)?&|&$/g, '$1');\n\n\tlocationHash = '#' + locationHash;\n\tlocationHash = locationHash.replace(/^#+/, '#');\n\n\tif (locationHash === '#') locationHash = '';\n\n\treturn locationHash;\n};\n\n/**\n * Установить значения в хэш параметр страницы\n */\nexport const setHashs = function (data: Map<string, string> | object | any, replaceState: boolean): void {\n\tif (data instanceof Map) data = Object.fromEntries(data);\n\n\tif (replaceState === undefined) replaceState = true;\n\tlet hash = location.hash;\n\n\tfor (const name in data) {\n\t\tconst re = new RegExp('&?' + name + '=[^&]*', 'g');\n\t\thash = hash.replace(re, '');\n\n\t\tif (data[name] !== null) {\n\t\t\tdata[name] = (data[name] + '').replace(' ', '%20');\n\t\t\thash += '&' + name + '=' + data[name];\n\t\t}\n\t}\n\n\thash = hash.replace(/&+/g, '&');\n\thash = hash.replace(/^(#)?&|&$/g, '$1');\n\n\thash = '#' + hash;\n\thash = hash.replace(/^#+/, '#');\n\n\tif (hash === '#') hash = '';\n\n\tif (replaceState) {\n\t\thistorySetState(true, hash);\n\t} else {\n\t\thistorySetState(false, hash);\n\t}\n};\n\n/**\n * Установть позицию в истории вкладки браузера\n *\n * @see history.replaceState\n * @see history.pushState\n *\n * @todo Объединить с historyPushState() из @/component/vue/app/spa\n */\nexport const historySetState = (replace: boolean = false, hash: string): void => {\n\t// дедупликация хеш навигации\n\t// необходима так как js слушает нативную навигацию и если состояние уже устанолено, оно не должно повторно устанавливаться из js\n\tif (hash === location.hash) return;\n\n\tconst oldURL = location.href;\n\n\tconst url = location.href.replace(/#.*/, '') + hash;\n\n\tif (replace) {\n\t\thistory.replaceState(history.state, '', url);\n\t} else {\n\t\thistory.pushState(history.state, '', url);\n\t}\n\n\t// имитация hashchange, так как при работе с history, он не будет вызван автоматически\n\tconst event = new HashChangeEvent('hashchange', {\n\t\toldURL: oldURL,\n\t\tnewURL: url,\n\t});\n\n\twindow.dispatchEvent(event);\n};\n"],"names":["getHash","name","locationHash","value","setHash","replaceState","historySetState","hash","delHash","genHash","re","setHashs","data","replace","oldURL","url","event"],"mappings":"0FAQO,MAAAA,EAAA,SAAAC,EAAAC,EAAA,SAAA,KAAA,+GAMNC,EAAA,CAAA,EAAAA,EAAA,CAAA,EAAA,QAAA,MAAA,GAAA,EAEAA,EAAA,CAAA,EACD,EAKOC,EAAA,SAAAH,EAAAE,EAAAE,EAAA,GAAA,cAILC,MAAAC,CAAA,CAIF,EAKOC,EAAA,SAAAP,EAAAE,EAAAE,EAAA,GAAA,CACND,EAAAH,EAAA,KAAAI,CAAA,CACD,EAKOI,EAAA,SAAAR,EAAAE,EAAAD,EAAA,SAAA,KAAA,CACN,MAAAQ,EAAA,IAAA,OAAA,KAAAT,EAAA,SAAA,GAAA,2BAIAE,IAAA,OACCA,GAAAA,EAAA,IAAA,QAAA,IAAA,KAAA,EACAD,EAAAA,EAAA,QAAAQ,EAAA,IAAAT,EAAA,IAAAE,CAAA,oGAQDD,EAAA,IAAAA,yBAGAA,IAAA,MAAAA,EAAA,IAEAA,CACD,EAKOS,EAAA,SAAAC,EAAAP,EAAA,CACNO,aAAA,MAAAA,EAAA,OAAA,YAAAA,CAAA,GAEAP,IAAA,SAAAA,EAAA,IACA,IAAAE,EAAA,SAAA,KAEA,UAAAN,KAAAW,EAAA,CACC,MAAAF,EAAA,IAAA,OAAA,KAAAT,EAAA,SAAA,GAAA,oBAGAW,EAAAX,CAAA,IAAA,OACCW,EAAAX,CAAA,GAAAW,EAAAX,CAAA,EAAA,IAAA,QAAA,IAAA,KAAA,2EAQFM,EAAA,IAAAA,yBAGAA,IAAA,MAAAA,EAAA,IAGCD,MAAAC,CAAA,CAIF,EAUOD,EAAA,CAAAO,EAAA,GAAAN,IAAA,CAGN,GAAAA,IAAA,SAAA,KAAA,OAEA,MAAAO,EAAA,SAAA,KAEAC,EAAA,SAAA,KAAA,QAAA,MAAA,EAAA,EAAAR,mFASA,MAAAS,EAAA,IAAA,gBAAA,aAAA,CAAgD,OAAAF,EAC/C,OAAAC,CACQ,CAAA,EAGT,OAAA,cAAAC,CAAA,CACD"}
|
|
1
|
+
{"version":3,"file":"route.amd.js","sources":["../../src/core/utils/route.ts"],"sourcesContent":["/**\r\n * Управление навигацией страницы, работа с hash параметрами страницы\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Получить значение хэш параметра страницы\r\n */\r\nexport const getHash = function (name: string, locationHash: string = location.hash): string {\r\n\tconst re = new RegExp('[#?&]' + name + '=([^&]*)');\r\n\tconst value = locationHash.match(re);\r\n\tif (!value || value.length != 2) return '';\r\n\r\n\tvalue[1] = decodeURIComponent(value[1]);\r\n\tvalue[1] = value[1].replace(/\\+/g, ' ');\r\n\r\n\treturn value[1];\r\n};\r\n\r\n/**\r\n * Установить значение в хэш параметр страницы\r\n */\r\nexport const setHash = function (name: string, value: string | number | null, replaceState: boolean = true): void {\r\n\tlet hash = genHash(name, value);\r\n\r\n\tif (replaceState) {\r\n\t\thistorySetState(true, hash);\r\n\t} else {\r\n\t\thistorySetState(false, hash);\r\n\t}\r\n};\r\n\r\n/**\r\n * Удалить значение из хэш параметра страницы\r\n */\r\nexport const delHash = function (name: string, value: string, replaceState: boolean = true): void {\r\n\tsetHash(name, null, replaceState);\r\n};\r\n\r\n/**\r\n * Сгенерировать новое значение для хэш параметра страницы с указанным параметром\r\n */\r\nexport const genHash = function (name: string, value: string | number | null, locationHash: string = location.hash): string {\r\n\tconst re = new RegExp('&?' + name + '=[^&]*', 'g');\r\n\r\n\tlocationHash = locationHash.replace(re, '');\r\n\r\n\tif (value !== null) {\r\n\t\tvalue = (value + '').replace(' ', '%20');\r\n\t\tlocationHash = locationHash.replace(re, '&' + name + '=' + value);\r\n\r\n\t\tif (locationHash.indexOf('&' + name + '=') == -1) locationHash += '&' + name + '=' + value;\r\n\t}\r\n\r\n\tlocationHash = locationHash.replace(/&+/g, '&');\r\n\tlocationHash = locationHash.replace(/^(#)?&|&$/g, '$1');\r\n\r\n\tlocationHash = '#' + locationHash;\r\n\tlocationHash = locationHash.replace(/^#+/, '#');\r\n\r\n\tif (locationHash === '#') locationHash = '';\r\n\r\n\treturn locationHash;\r\n};\r\n\r\n/**\r\n * Установить значения в хэш параметр страницы\r\n */\r\nexport const setHashs = function (data: Map<string, string> | object | any, replaceState: boolean): void {\r\n\tif (data instanceof Map) data = Object.fromEntries(data);\r\n\r\n\tif (replaceState === undefined) replaceState = true;\r\n\tlet hash = location.hash;\r\n\r\n\tfor (const name in data) {\r\n\t\tconst re = new RegExp('&?' + name + '=[^&]*', 'g');\r\n\t\thash = hash.replace(re, '');\r\n\r\n\t\tif (data[name] !== null) {\r\n\t\t\tdata[name] = (data[name] + '').replace(' ', '%20');\r\n\t\t\thash += '&' + name + '=' + data[name];\r\n\t\t}\r\n\t}\r\n\r\n\thash = hash.replace(/&+/g, '&');\r\n\thash = hash.replace(/^(#)?&|&$/g, '$1');\r\n\r\n\thash = '#' + hash;\r\n\thash = hash.replace(/^#+/, '#');\r\n\r\n\tif (hash === '#') hash = '';\r\n\r\n\tif (replaceState) {\r\n\t\thistorySetState(true, hash);\r\n\t} else {\r\n\t\thistorySetState(false, hash);\r\n\t}\r\n};\r\n\r\n/**\r\n * Установть позицию в истории вкладки браузера\r\n *\r\n * @see history.replaceState\r\n * @see history.pushState\r\n *\r\n * @todo Объединить с historyPushState() из @/component/vue/app/spa\r\n */\r\nexport const historySetState = (replace: boolean = false, hash: string): void => {\r\n\t// дедупликация хеш навигации\r\n\t// необходима так как js слушает нативную навигацию и если состояние уже устанолено, оно не должно повторно устанавливаться из js\r\n\tif (hash === location.hash) return;\r\n\r\n\tconst oldURL = location.href;\r\n\r\n\tconst url = location.href.replace(/#.*/, '') + hash;\r\n\r\n\tif (replace) {\r\n\t\thistory.replaceState(history.state, '', url);\r\n\t} else {\r\n\t\thistory.pushState(history.state, '', url);\r\n\t}\r\n\r\n\t// имитация hashchange, так как при работе с history, он не будет вызван автоматически\r\n\tconst event = new HashChangeEvent('hashchange', {\r\n\t\toldURL: oldURL,\r\n\t\tnewURL: url,\r\n\t});\r\n\r\n\twindow.dispatchEvent(event);\r\n};\r\n"],"names":["getHash","name","locationHash","value","setHash","replaceState","historySetState","hash","delHash","genHash","re","setHashs","data","replace","oldURL","url","event"],"mappings":"0FAQO,MAAAA,EAAA,SAAAC,EAAAC,EAAA,SAAA,KAAA,+GAMNC,EAAA,CAAA,EAAAA,EAAA,CAAA,EAAA,QAAA,MAAA,GAAA,EAEAA,EAAA,CAAA,EACD,EAKOC,EAAA,SAAAH,EAAAE,EAAAE,EAAA,GAAA,cAILC,MAAAC,CAAA,CAIF,EAKOC,EAAA,SAAAP,EAAAE,EAAAE,EAAA,GAAA,CACND,EAAAH,EAAA,KAAAI,CAAA,CACD,EAKOI,EAAA,SAAAR,EAAAE,EAAAD,EAAA,SAAA,KAAA,CACN,MAAAQ,EAAA,IAAA,OAAA,KAAAT,EAAA,SAAA,GAAA,2BAIAE,IAAA,OACCA,GAAAA,EAAA,IAAA,QAAA,IAAA,KAAA,EACAD,EAAAA,EAAA,QAAAQ,EAAA,IAAAT,EAAA,IAAAE,CAAA,oGAQDD,EAAA,IAAAA,yBAGAA,IAAA,MAAAA,EAAA,IAEAA,CACD,EAKOS,EAAA,SAAAC,EAAAP,EAAA,CACNO,aAAA,MAAAA,EAAA,OAAA,YAAAA,CAAA,GAEAP,IAAA,SAAAA,EAAA,IACA,IAAAE,EAAA,SAAA,KAEA,UAAAN,KAAAW,EAAA,CACC,MAAAF,EAAA,IAAA,OAAA,KAAAT,EAAA,SAAA,GAAA,oBAGAW,EAAAX,CAAA,IAAA,OACCW,EAAAX,CAAA,GAAAW,EAAAX,CAAA,EAAA,IAAA,QAAA,IAAA,KAAA,2EAQFM,EAAA,IAAAA,yBAGAA,IAAA,MAAAA,EAAA,IAGCD,MAAAC,CAAA,CAIF,EAUOD,EAAA,CAAAO,EAAA,GAAAN,IAAA,CAGN,GAAAA,IAAA,SAAA,KAAA,OAEA,MAAAO,EAAA,SAAA,KAEAC,EAAA,SAAA,KAAA,QAAA,MAAA,EAAA,EAAAR,mFASA,MAAAS,EAAA,IAAA,gBAAA,aAAA,CAAgD,OAAAF,EAC/C,OAAAC,CACQ,CAAA,EAGT,OAAA,cAAAC,CAAA,CACD"}
|