@topvisor/ui 1.4.1-projectSelector.0 → 1.4.1-projectSelector.2
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 → core-BE_-rKvW.es.js} +4 -4
- package/.chunks/core-BE_-rKvW.es.js.map +1 -0
- package/.chunks/{core-D1KnwO7l.amd.js → core-DJS4o9Vt.amd.js} +2 -2
- package/.chunks/core-DJS4o9Vt.amd.js.map +1 -0
- package/.chunks/{datepicker-BPTUHd97.es.js → datepicker-C0jmLfiX.es.js} +2 -2
- package/.chunks/datepicker-C0jmLfiX.es.js.map +1 -0
- package/.chunks/{datepicker-O_SK-Dz4.amd.js → datepicker-ppUhXCHG.amd.js} +2 -2
- package/.chunks/datepicker-ppUhXCHG.amd.js.map +1 -0
- package/.chunks/{dialog_regionSelectorRegions-DA38RsiW.es.js → dialog_regionSelectorRegions-Btp9cfmF.es.js} +4 -4
- package/.chunks/dialog_regionSelectorRegions-Btp9cfmF.es.js.map +1 -0
- package/.chunks/{dialog_regionSelectorRegions-Ba-Eypgv.amd.js → dialog_regionSelectorRegions-C1DNLHM7.amd.js} +2 -2
- package/.chunks/dialog_regionSelectorRegions-C1DNLHM7.amd.js.map +1 -0
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-CWprVs8d.amd.js → dialogs.vue_vue_type_script_setup_true_lang-B3hYoW1m.amd.js} +2 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-B3hYoW1m.amd.js.map +1 -0
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-CzFMOjlE.es.js → dialogs.vue_vue_type_script_setup_true_lang-DMhcuiHP.es.js} +2 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-DMhcuiHP.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-xkXHvvah.es.js → forms-BAUgA7Ct.es.js} +7 -7
- package/.chunks/forms-BAUgA7Ct.es.js.map +1 -0
- package/.chunks/{forms-4D_EVI46.amd.js → forms-B_v2vU59.amd.js} +3 -3
- package/.chunks/forms-B_v2vU59.amd.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-hF3z8ewG.amd.js → notice-6HGA0ECG.amd.js} +2 -2
- package/.chunks/notice-6HGA0ECG.amd.js.map +1 -0
- package/.chunks/{notice-wqZxmsUH.es.js → notice-CGgc2m0q.es.js} +2 -2
- package/.chunks/notice-CGgc2m0q.es.js.map +1 -0
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-rW3w9LMh.es.js → page.vue_vue_type_script_setup_true_lang-BMTt9SU8.es.js} +4 -4
- package/.chunks/page.vue_vue_type_script_setup_true_lang-BMTt9SU8.es.js.map +1 -0
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-tiWuQ_ZK.amd.js → page.vue_vue_type_script_setup_true_lang-WX1HlCFp.amd.js} +2 -2
- package/.chunks/page.vue_vue_type_script_setup_true_lang-WX1HlCFp.amd.js.map +1 -0
- package/.chunks/{policy.vue_vue_type_style_index_0_lang-DABqSSXw.amd.js → policy.vue_vue_type_style_index_0_lang-CO-f4TwZ.amd.js} +2 -2
- package/.chunks/policy.vue_vue_type_style_index_0_lang-CO-f4TwZ.amd.js.map +1 -0
- package/.chunks/{policy.vue_vue_type_style_index_0_lang-C9A--uWd.es.js → policy.vue_vue_type_style_index_0_lang-ClaW4X74.es.js} +4 -4
- package/.chunks/policy.vue_vue_type_style_index_0_lang-ClaW4X74.es.js.map +1 -0
- package/.chunks/{popup-BeLPdHWv.es.js → popup-CVHDbG9h.es.js} +2 -2
- package/.chunks/popup-CVHDbG9h.es.js.map +1 -0
- package/.chunks/{popup-Bwmu8rOb.amd.js → popup-H0d4XQtU.amd.js} +2 -2
- package/.chunks/popup-H0d4XQtU.amd.js.map +1 -0
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-fnjq0yg1.es.js → popupHint.vue_vue_type_style_index_0_lang-BIWw5zUX.es.js} +2 -2
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-BIWw5zUX.es.js.map +1 -0
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-B0BWXhHK.amd.js → popupHint.vue_vue_type_style_index_0_lang-CdIajfDS.amd.js} +2 -2
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-CdIajfDS.amd.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-BRJvuqe_.amd.js → utils-BUMfp_te.amd.js} +2 -2
- package/.chunks/utils-BUMfp_te.amd.js.map +1 -0
- package/.chunks/{utils-ByqQkftW.es.js → utils-BYaZxGC1.es.js} +2 -2
- package/.chunks/utils-BYaZxGC1.es.js.map +1 -0
- package/.chunks/{utils-YVlPlqDK.es.js → utils-DG_W0xvD.es.js} +3 -3
- package/.chunks/utils-DG_W0xvD.es.js.map +1 -0
- package/.chunks/{utils-cAJahDml.amd.js → utils-DNzj9OOY.amd.js} +2 -2
- package/.chunks/utils-DNzj9OOY.amd.js.map +1 -0
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-UUovJzhL.es.js → widgetInput.vue_vue_type_script_setup_true_lang-Brs-RxDI.es.js} +2 -2
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-Brs-RxDI.es.js.map +1 -0
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-D7lVLE3D.amd.js → widgetInput.vue_vue_type_script_setup_true_lang-C4wFo0AR.amd.js} +2 -2
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-C4wFo0AR.amd.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.map +1 -1
- package/api/index.js.map +1 -1
- package/assets/forms.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 +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +2 -2
- package/formsExt/formsExt.js.map +1 -1
- package/icomoon/Read Me.txt +7 -7
- 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.js +30 -30
- 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 +4 -4
- 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 +563 -563
- package/project/project.js.map +1 -1
- package/require/css.amd.js +12 -12
- package/src/components/project/projectSelector/projectSelector.vue.d.ts +1 -1
- package/src/components/project/projectSelector/types.d.ts +2 -8
- package/src/components/project/projectSelector/utils.d.ts +1 -8
- 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.js +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/.chunks/core-BgoBbm_5.es.js.map +0 -1
- package/.chunks/core-D1KnwO7l.amd.js.map +0 -1
- package/.chunks/datepicker-BPTUHd97.es.js.map +0 -1
- package/.chunks/datepicker-O_SK-Dz4.amd.js.map +0 -1
- package/.chunks/dialog_regionSelectorRegions-Ba-Eypgv.amd.js.map +0 -1
- package/.chunks/dialog_regionSelectorRegions-DA38RsiW.es.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-CWprVs8d.amd.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-CzFMOjlE.es.js.map +0 -1
- package/.chunks/forms-4D_EVI46.amd.js.map +0 -1
- package/.chunks/forms-xkXHvvah.es.js.map +0 -1
- package/.chunks/notice-hF3z8ewG.amd.js.map +0 -1
- package/.chunks/notice-wqZxmsUH.es.js.map +0 -1
- package/.chunks/page.vue_vue_type_script_setup_true_lang-rW3w9LMh.es.js.map +0 -1
- package/.chunks/page.vue_vue_type_script_setup_true_lang-tiWuQ_ZK.amd.js.map +0 -1
- package/.chunks/policy.vue_vue_type_style_index_0_lang-C9A--uWd.es.js.map +0 -1
- package/.chunks/policy.vue_vue_type_style_index_0_lang-DABqSSXw.amd.js.map +0 -1
- package/.chunks/popup-BeLPdHWv.es.js.map +0 -1
- package/.chunks/popup-Bwmu8rOb.amd.js.map +0 -1
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-B0BWXhHK.amd.js.map +0 -1
- package/.chunks/popupHint.vue_vue_type_style_index_0_lang-fnjq0yg1.es.js.map +0 -1
- package/.chunks/utils-BRJvuqe_.amd.js.map +0 -1
- package/.chunks/utils-ByqQkftW.es.js.map +0 -1
- package/.chunks/utils-YVlPlqDK.es.js.map +0 -1
- package/.chunks/utils-cAJahDml.amd.js.map +0 -1
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-D7lVLE3D.amd.js.map +0 -1
- package/.chunks/widgetInput.vue_vue_type_script_setup_true_lang-UUovJzhL.es.js.map +0 -1
- package/src/components/project/projectSelector/stories/mocks/projects.d.ts +0 -10
package/charts/charts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts.js","sources":["../../src/components/charts/miniChart/utils/consts.ts","../../src/components/charts/miniChart/miniChart.vue","../../src/components/charts/miniCharts/miniCharts.vue"],"sourcesContent":["/**\r\n * Кол-во столбцов по умолчанию\r\n */\r\nexport const defaultNumberCols = 90;\r\n\r\n/**\r\n * Минимальная высота колонки (в процентах)\r\n */\r\nexport const minHeight = 10; // %","<script setup lang=\"ts\">\r\nimport type { Props } from './types';\r\nimport { computed } from 'vue';\r\nimport { dateFormat } from '@/core/utils/date';\r\nimport { percentOfNumber } from '@/core/utils/number';\r\nimport { defaultNumberCols, minHeight } from './utils/consts';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tcolor: 'blue',\r\n\tnumberCols: defaultNumberCols,\r\n});\r\nconst model = defineModel<Props['modelValue']>();\r\n\r\n/**\r\n * Расчет высоты колонки (в процентах)\r\n */\r\nconst genColHeight = (value: number): number => {\r\n\tlet maximumValue = maxValue.value;\r\n\r\n\t// для графиков средней и медианной делаем максимум 1\r\n\tif (props.isInvert) {\r\n\t\tvalue -= 1;\r\n\t\tmaximumValue -= 1;\r\n\t}\r\n\r\n\tlet height = maximumValue > 0 ? Math.round((value / maximumValue) * (100 - minHeight)) : 0;\r\n\tif (props.isInvert) return 100 - height;\r\n\r\n\treturn height + minHeight;\r\n};\r\n\r\nconst isActiveDate = (date: string) => props.activeDates.includes(date);\r\n\r\nconst maxValue = computed(() => Math.max(...props.values));\r\n\r\n/**\r\n * Из-за стиля .top-miniChart_chartGrid - direction: rtl\r\n */\r\nconst reversedDates = computed(() => props.dates.slice().reverse());\r\n\r\n/**\r\n * Кол-во пустых колонок\r\n */\r\nconst numOfEmptyCols = computed(() => {\r\n\tif (!props.dates.length) return 0;\r\n\r\n\treturn props.numberCols - props.dates.length;\r\n});\r\n\r\nconst resetModel = () => {\r\n\tmodel.value = null;\r\n};\r\n\r\nconst setModel = (e: Event, date: string, value: number | null) => {\r\n\tif (!(e.target instanceof HTMLElement)) return;\r\n\r\n\tmodel.value = {\r\n\t\telCol: e.target,\r\n\t\tdate: dateFormat(date),\r\n\t\tvalue: value === null ? '--' : value + (props.valueSuffix ?? ''),\r\n\t};\r\n};\r\n\r\n/**\r\n * Возвращает численный показатель динамики графика\r\n */\r\nconst localDynamic = computed(() => {\r\n\tlet dynamic = props.dynamic;\r\n\r\n\tif (typeof dynamic === 'undefined') {\r\n\t\tconst prevPeriodValue = props.values[props.keysForDyn.start];\r\n\t\tconst currentValue = props.values[props.keysForDyn.end];\r\n\t\tdynamic = currentValue - prevPeriodValue;\r\n\t}\r\n\r\n\tconst sign = dynamic < 0 ? -1 : 1;\r\n\r\n\treturn sign * (percentOfNumber(Math.abs(dynamic)) as number);\r\n});\r\n\r\nconst dynamicDirection = computed(() => {\r\n\tlet direction: 'up' | 'stay' | 'down' = 'stay';\r\n\r\n\tif (!props.isInvert) {\r\n\t\tif (localDynamic.value > 0) direction = 'up';\r\n\t\tif (localDynamic.value < 0) direction = 'down';\r\n\t} else {\r\n\t\tif (localDynamic.value > 0) direction = 'down';\r\n\t\tif (localDynamic.value < 0) direction = 'up';\r\n\t}\r\n\r\n\treturn direction;\r\n});\r\n\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\t:class=\"{\r\n\t\t\t['top-miniChart']: true,\r\n\t\t\t['top-miniChart_hideChartInMobile']: hideChartInMobile,\r\n\t\t\t[`top-color_${color}`]: true\r\n\t\t}\"\r\n\t>\r\n\t\t<div\r\n\t\t\tclass=\"top-miniChart_title top-ellipsis\"\r\n\t\t\t:data-top-icon=\"gIcon\"\r\n\t\t>\r\n\t\t\t{{ title }}\r\n\t\t</div>\r\n\r\n\t\t<div class=\"top-miniChart_chart\">\r\n\t\t\t<div\r\n\t\t\t\tclass=\"top-miniChart_chartGrid\"\r\n\t\t\t\t@mouseleave=\"resetModel()\"\r\n\t\t\t>\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"(date, i) in reversedDates\"\r\n\t\t\t\t\t:class=\"{\r\n\t\t\t\t\t\t['top-miniChart_chartGridCol']: true,\r\n\t\t\t\t\t\t['top-active']: isActiveDate(date)\r\n\t\t\t\t\t}\"\r\n\t\t\t\t\t@mouseenter=\"setModel($event, date, values[values.length - i - 1])\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<div :style=\"'height:' + genColHeight(values[values.length - i - 1]) + '%'\"/>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"() in numOfEmptyCols\"\r\n\t\t\t\t\tclass=\"top-miniChart_chartGridCol top-miniChart_chartGridCol-none\"\r\n\t\t\t\t\t@mouseenter=\"resetModel()\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<div></div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<div class=\"top-miniChart_data\">\r\n\t\t\t<span :class=\"{\r\n\t\t\t\t['top-miniChart_dataDynamic']: true,\r\n\t\t\t\t[`top-miniChart_dataDynamic-direction_${dynamicDirection}`]: true,\r\n\t\t\t}\">\r\n\t\t\t\t{{ Math.abs(localDynamic) || '' }}\r\n\t\t\t</span>\r\n\t\t\t<span class=\"top-miniChart_dataValue\">\r\n\t\t\t\t{{ percentOfNumber(values[values.length - 1]) || 0 }}\r\n\t\t\t</span>\r\n\t\t</div>\r\n\r\n\t\t<div\r\n\t\t\tv-if=\"additionalHTML\"\r\n\t\t\tv-html=\"additionalHTML\"\r\n\t\t/>\r\n\t</div>\r\n\r\n</template>\r\n<style>\r\n@import \"./styles/miniChart.css\";\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue';\r\nimport type { Props, Style } from './miniCharts';\r\n\r\nconst props = defineProps<Props>();\r\nconst model = defineModel<Props['modelValue']>();\r\n\r\nconst elRef = ref<HTMLElement | null>(null);\r\n\r\nlet pagesResizeObserver: ResizeObserver;\r\n\r\n/**\r\n * Количество страниц\r\n */\r\nconst countPages = ref(1);\r\n\r\n/**\r\n * Активная страница\r\n */\r\nconst activePage = ref(1);\r\n\r\n/**\r\n * Установка количества страниц в блоке\r\n */\r\nconst setCountPages = () => {\r\n\tcountPages.value = Math.round(elRef.value!.scrollHeight / elRef.value!.clientHeight);\r\n};\r\n\r\nwatch(countPages, () => {\r\n\tif (countPages.value < activePage.value) {\r\n\t\tactivePage.value = 1;\r\n\t}\r\n});\r\n\r\nwatch(\r\n\t() => props.countCharts,\r\n\t() => setCountPages(),\r\n\t{ flush: 'post' },\r\n);\r\n\r\n/**\r\n * Расчет положения для подсказки\r\n */\r\nconst tooltipStyle = computed(() => {\r\n\tif (!model.value) return {};\r\n\r\n\tconst box = model.value.elCol.getBoundingClientRect();\r\n\r\n\tconst style: Style = {\r\n\t\ttop: box.bottom + window.scrollY + 'px',\r\n\t};\r\n\r\n\tif (document.documentElement.clientWidth / 2 > box.right) {\r\n\t\tstyle.left = box.right + window.scrollX + 10 + 'px';\r\n\t} else {\r\n\t\tstyle.left = box.left + window.scrollX - 10 + 'px';\r\n\t\tstyle.transform = 'translate(-100%, 0)';\r\n\t}\r\n\r\n\treturn style;\r\n});\r\n\r\nonMounted(() => {\r\n\t/**\r\n\t * Функционал переключения экранов графиков\r\n\t */\r\n\tpagesResizeObserver = new ResizeObserver(() => setCountPages());\r\n\tpagesResizeObserver.observe(elRef.value!);\r\n\r\n\twatch(activePage, () => {\r\n\t\tconst elMiniChart = elRef.value!.children[0];\r\n\t\tconst pageHeight = elMiniChart.clientHeight + parseInt(window.getComputedStyle(elRef.value!).getPropertyValue('row-gap'));\r\n\t\tconst scrollTop = pageHeight * (activePage.value - 1);\r\n\r\n\t\telRef.value!.scrollTo({ top: scrollTop, behavior: 'smooth' });\r\n\t});\r\n});\r\n\r\nonUnmounted(() => {\r\n\tpagesResizeObserver.disconnect();\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tclass=\"top-miniCharts\"\r\n\t\t:class=\"{\r\n\t\t\t['top-miniCharts']: true,\r\n\t\t\t['scrollable']: countPages > 1,\r\n\t\t\t['top-miniCharts_hideChartInMobile']: hideChartInMobile,\r\n\t\t}\"\r\n\t\tref=\"elRef\"\r\n\t>\r\n\r\n\t\t<slot></slot>\r\n\r\n\t\t<div\r\n\t\t\tv-if=\"countPages > 1\"\r\n\t\t\tclass=\"top-miniCharts_pages\"\r\n\t\t>\r\n\t\t\t<span\r\n\t\t\t\tv-for=\"n in countPages\"\r\n\t\t\t\t:class=\"{['top-active']: n === activePage}\"\r\n\t\t\t\t@click=\"activePage = n\"\r\n\t\t\t></span>\r\n\t\t</div>\r\n\r\n\t\t<Teleport to=\"body\">\r\n\t\t\t<div\r\n\t\t\t\tv-if=\"model\"\r\n\t\t\t\tclass=\"top-miniCharts_tooltip\"\r\n\t\t\t\t:style=\"tooltipStyle\"\r\n\t\t\t>\r\n\t\t\t\t<span>{{ model.date }}</span>\r\n\t\t\t\t<span>{{ model.value }}</span>\r\n\t\t\t</div>\r\n\t\t</Teleport>\r\n\t</div>\r\n\r\n</template>\r\n\r\n<style>\r\n@import \"./styles/miniCharts.css\";\r\n</style>\r\n"],"names":["defaultNumberCols","minHeight","props","__props","model","_useModel","genColHeight","value","maximumValue","maxValue","height","isActiveDate","date","computed","reversedDates","numOfEmptyCols","resetModel","setModel","dateFormat","localDynamic","dynamic","prevPeriodValue","percentOfNumber","dynamicDirection","direction","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_Fragment","_renderList","i","$event","_normalizeStyle","_hoisted_4","_hoisted_5","_toDisplayString","_unref","elRef","ref","pagesResizeObserver","countPages","activePage","setCountPages","watch","tooltipStyle","box","style","onMounted","scrollTop","onUnmounted","_renderSlot","_ctx","n","_createBlock","_Teleport"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"charts.js","sources":["../../src/components/charts/miniChart/utils/consts.ts","../../src/components/charts/miniChart/miniChart.vue","../../src/components/charts/miniCharts/miniCharts.vue"],"sourcesContent":["/**\n * Кол-во столбцов по умолчанию\n */\nexport const defaultNumberCols = 90;\n\n/**\n * Минимальная высота колонки (в процентах)\n */\nexport const minHeight = 10; // %","<script setup lang=\"ts\">\nimport type { Props } from './types';\nimport { computed } from 'vue';\nimport { dateFormat } from '@/core/utils/date';\nimport { percentOfNumber } from '@/core/utils/number';\nimport { defaultNumberCols, minHeight } from './utils/consts';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tcolor: 'blue',\n\tnumberCols: defaultNumberCols,\n});\nconst model = defineModel<Props['modelValue']>();\n\n/**\n * Расчет высоты колонки (в процентах)\n */\nconst genColHeight = (value: number): number => {\n\tlet maximumValue = maxValue.value;\n\n\t// для графиков средней и медианной делаем максимум 1\n\tif (props.isInvert) {\n\t\tvalue -= 1;\n\t\tmaximumValue -= 1;\n\t}\n\n\tlet height = maximumValue > 0 ? Math.round((value / maximumValue) * (100 - minHeight)) : 0;\n\tif (props.isInvert) return 100 - height;\n\n\treturn height + minHeight;\n};\n\nconst isActiveDate = (date: string) => props.activeDates.includes(date);\n\nconst maxValue = computed(() => Math.max(...props.values));\n\n/**\n * Из-за стиля .top-miniChart_chartGrid - direction: rtl\n */\nconst reversedDates = computed(() => props.dates.slice().reverse());\n\n/**\n * Кол-во пустых колонок\n */\nconst numOfEmptyCols = computed(() => {\n\tif (!props.dates.length) return 0;\n\n\treturn props.numberCols - props.dates.length;\n});\n\nconst resetModel = () => {\n\tmodel.value = null;\n};\n\nconst setModel = (e: Event, date: string, value: number | null) => {\n\tif (!(e.target instanceof HTMLElement)) return;\n\n\tmodel.value = {\n\t\telCol: e.target,\n\t\tdate: dateFormat(date),\n\t\tvalue: value === null ? '--' : value + (props.valueSuffix ?? ''),\n\t};\n};\n\n/**\n * Возвращает численный показатель динамики графика\n */\nconst localDynamic = computed(() => {\n\tlet dynamic = props.dynamic;\n\n\tif (typeof dynamic === 'undefined') {\n\t\tconst prevPeriodValue = props.values[props.keysForDyn.start];\n\t\tconst currentValue = props.values[props.keysForDyn.end];\n\t\tdynamic = currentValue - prevPeriodValue;\n\t}\n\n\tconst sign = dynamic < 0 ? -1 : 1;\n\n\treturn sign * (percentOfNumber(Math.abs(dynamic)) as number);\n});\n\nconst dynamicDirection = computed(() => {\n\tlet direction: 'up' | 'stay' | 'down' = 'stay';\n\n\tif (!props.isInvert) {\n\t\tif (localDynamic.value > 0) direction = 'up';\n\t\tif (localDynamic.value < 0) direction = 'down';\n\t} else {\n\t\tif (localDynamic.value > 0) direction = 'down';\n\t\tif (localDynamic.value < 0) direction = 'up';\n\t}\n\n\treturn direction;\n});\n\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t['top-miniChart']: true,\n\t\t\t['top-miniChart_hideChartInMobile']: hideChartInMobile,\n\t\t\t[`top-color_${color}`]: true\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tclass=\"top-miniChart_title top-ellipsis\"\n\t\t\t:data-top-icon=\"gIcon\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div class=\"top-miniChart_chart\">\n\t\t\t<div\n\t\t\t\tclass=\"top-miniChart_chartGrid\"\n\t\t\t\t@mouseleave=\"resetModel()\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(date, i) in reversedDates\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t['top-miniChart_chartGridCol']: true,\n\t\t\t\t\t\t['top-active']: isActiveDate(date)\n\t\t\t\t\t}\"\n\t\t\t\t\t@mouseenter=\"setModel($event, date, values[values.length - i - 1])\"\n\t\t\t\t>\n\t\t\t\t\t<div :style=\"'height:' + genColHeight(values[values.length - i - 1]) + '%'\"/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"() in numOfEmptyCols\"\n\t\t\t\t\tclass=\"top-miniChart_chartGridCol top-miniChart_chartGridCol-none\"\n\t\t\t\t\t@mouseenter=\"resetModel()\"\n\t\t\t\t>\n\t\t\t\t\t<div></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"top-miniChart_data\">\n\t\t\t<span :class=\"{\n\t\t\t\t['top-miniChart_dataDynamic']: true,\n\t\t\t\t[`top-miniChart_dataDynamic-direction_${dynamicDirection}`]: true,\n\t\t\t}\">\n\t\t\t\t{{ Math.abs(localDynamic) || '' }}\n\t\t\t</span>\n\t\t\t<span class=\"top-miniChart_dataValue\">\n\t\t\t\t{{ percentOfNumber(values[values.length - 1]) || 0 }}\n\t\t\t</span>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-if=\"additionalHTML\"\n\t\t\tv-html=\"additionalHTML\"\n\t\t/>\n\t</div>\n\n</template>\n<style>\n@import \"./styles/miniChart.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue';\nimport type { Props, Style } from './miniCharts';\n\nconst props = defineProps<Props>();\nconst model = defineModel<Props['modelValue']>();\n\nconst elRef = ref<HTMLElement | null>(null);\n\nlet pagesResizeObserver: ResizeObserver;\n\n/**\n * Количество страниц\n */\nconst countPages = ref(1);\n\n/**\n * Активная страница\n */\nconst activePage = ref(1);\n\n/**\n * Установка количества страниц в блоке\n */\nconst setCountPages = () => {\n\tcountPages.value = Math.round(elRef.value!.scrollHeight / elRef.value!.clientHeight);\n};\n\nwatch(countPages, () => {\n\tif (countPages.value < activePage.value) {\n\t\tactivePage.value = 1;\n\t}\n});\n\nwatch(\n\t() => props.countCharts,\n\t() => setCountPages(),\n\t{ flush: 'post' },\n);\n\n/**\n * Расчет положения для подсказки\n */\nconst tooltipStyle = computed(() => {\n\tif (!model.value) return {};\n\n\tconst box = model.value.elCol.getBoundingClientRect();\n\n\tconst style: Style = {\n\t\ttop: box.bottom + window.scrollY + 'px',\n\t};\n\n\tif (document.documentElement.clientWidth / 2 > box.right) {\n\t\tstyle.left = box.right + window.scrollX + 10 + 'px';\n\t} else {\n\t\tstyle.left = box.left + window.scrollX - 10 + 'px';\n\t\tstyle.transform = 'translate(-100%, 0)';\n\t}\n\n\treturn style;\n});\n\nonMounted(() => {\n\t/**\n\t * Функционал переключения экранов графиков\n\t */\n\tpagesResizeObserver = new ResizeObserver(() => setCountPages());\n\tpagesResizeObserver.observe(elRef.value!);\n\n\twatch(activePage, () => {\n\t\tconst elMiniChart = elRef.value!.children[0];\n\t\tconst pageHeight = elMiniChart.clientHeight + parseInt(window.getComputedStyle(elRef.value!).getPropertyValue('row-gap'));\n\t\tconst scrollTop = pageHeight * (activePage.value - 1);\n\n\t\telRef.value!.scrollTo({ top: scrollTop, behavior: 'smooth' });\n\t});\n});\n\nonUnmounted(() => {\n\tpagesResizeObserver.disconnect();\n});\n</script>\n\n<template>\n\t<div\n\t\tclass=\"top-miniCharts\"\n\t\t:class=\"{\n\t\t\t['top-miniCharts']: true,\n\t\t\t['scrollable']: countPages > 1,\n\t\t\t['top-miniCharts_hideChartInMobile']: hideChartInMobile,\n\t\t}\"\n\t\tref=\"elRef\"\n\t>\n\n\t\t<slot></slot>\n\n\t\t<div\n\t\t\tv-if=\"countPages > 1\"\n\t\t\tclass=\"top-miniCharts_pages\"\n\t\t>\n\t\t\t<span\n\t\t\t\tv-for=\"n in countPages\"\n\t\t\t\t:class=\"{['top-active']: n === activePage}\"\n\t\t\t\t@click=\"activePage = n\"\n\t\t\t></span>\n\t\t</div>\n\n\t\t<Teleport to=\"body\">\n\t\t\t<div\n\t\t\t\tv-if=\"model\"\n\t\t\t\tclass=\"top-miniCharts_tooltip\"\n\t\t\t\t:style=\"tooltipStyle\"\n\t\t\t>\n\t\t\t\t<span>{{ model.date }}</span>\n\t\t\t\t<span>{{ model.value }}</span>\n\t\t\t</div>\n\t\t</Teleport>\n\t</div>\n\n</template>\n\n<style>\n@import \"./styles/miniCharts.css\";\n</style>\n"],"names":["defaultNumberCols","minHeight","props","__props","model","_useModel","genColHeight","value","maximumValue","maxValue","height","isActiveDate","date","computed","reversedDates","numOfEmptyCols","resetModel","setModel","dateFormat","localDynamic","dynamic","prevPeriodValue","percentOfNumber","dynamicDirection","direction","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_Fragment","_renderList","i","$event","_normalizeStyle","_hoisted_4","_hoisted_5","_toDisplayString","_unref","elRef","ref","pagesResizeObserver","countPages","activePage","setCountPages","watch","tooltipStyle","box","style","onMounted","scrollTop","onUnmounted","_renderSlot","_ctx","n","_createBlock","_Teleport"],"mappings":"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"}
|
package/core/app.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-B_v2vU59.amd","../.chunks/core-DJS4o9Vt.amd","vue","../utils/clipboard.amd","../utils/string.amd","../utils/route.amd","../.chunks/utils-DNzj9OOY.amd","../.chunks/dialogs.vue_vue_type_script_setup_true_lang-B3hYoW1m.amd"],(function(E,n,r,g,c,p,f,d,u,m){"use strict";if(typeof c>"u")var c=window.Vue;class S{#s;#t;#e;#a;#c;#i=[];#o=[];#n=[];#r=[];constructor(t){this.#t=t.store,this.#s=this.#t.$id,this.#e=t.options.Page,this.#a=t.options.user,this.#c=t.options.Api,this.#i=t.options.tpaNamesUrlHash||[],this.#o=t.options.tpaNamesStorage||[],this.#n=t.options.tpaNamesStorageLocal||[],this.#r=t.options.tpaNamesGuestLink||[],t.store.genGuestLink=(s,a)=>this.genGuestLink(s,a),this.#a.guest_data?.data||(this.#u(),this.#u(!0),this.#f()),this.#S(),this.#k();const e=r.debounce(()=>{this.#m(),this.#l(),this.#l(!0)});t.store.$subscribe(e)}async genGuestLink(t,e){const s=this.#g();e=Object.assign(e,Object.fromEntries(s));const a=await this.#c.gen(t).setParams(e).call();if(a?.errors)return;const i=a.result;await p.guestLinkToClipboard(i)}#g(){const t=new Map;return this.#r.forEach(e=>{const s=f.camelToSnakeCase(e);t.set(s,this.#t[e])}),t}#h(t){t.forEach((e,s)=>{const a=this.#t[s];if(e!=null&&a!==void 0&&e?.constructor&&e.constructor===a.constructor){if(s.indexOf("date")===0&&!Array.isArray(e)){if(typeof e=="string"&&!/\d\d\d\d-\d\d-\d\d/.test(e))return}this.#t[s]=e}})}#p(t){const e=new Map;return t.forEach((s,a)=>{s!==null&&(s=JSON.stringify(s),e.set(a,s))}),e}#d(t){const e=new Map;return t.forEach((s,a)=>{if(!(s==null||s==="false")){try{if(typeof s=="string"&&!/^\d\d\d\d-\d\d-\d\d$/.test(s)&&(s=JSON.parse(s)),s==null||s==="false")return}catch{}e.set(a,s)}}),e}#f(){let t;try{t=JSON.parse(d.getHash(this.#s))}catch{}if(!t)return;const e=new Map;this.#i.forEach(s=>{const a=t[s];a&&e.set(s,a)}),this.#h(e)}#m(){const t=new Map;this.#i.forEach(a=>{const i=this.#t[a];t.set(a,i)});const e=Object.fromEntries(t),s=JSON.stringify(e);d.setHash(this.#s,s)}#u(t=!1){const e=new Map;let s=this.#o,a="state:"+this.#s;t&&(s=this.#n,a="state:"+this.#s+":"+location.pathname),s.forEach(o=>{const h=localStorage.getItem(a+":"+o);e.set(o,h)});const i=this.#d(e);this.#h(i)}#l(t=!1){const e=new Map;let s=this.#o,a="state:"+this.#s;t&&(s=this.#n,a="state:"+this.#s+":"+location.pathname),s.forEach(o=>{const h=this.#t[o];e.set(o,h)});const i=this.#p(e);s.forEach(o=>{const h=i.get(o);localStorage.setItem(a+":"+o,h)})}#S(){const t=this.#a?.guest_data?.data;if(!t)return;this.#a.id===-1&&(this.#a.positionsReverseDates=t.positionsReverseDates);const e=new Map;this.#r.forEach(i=>{const o=t[i];e.set(i,o)});const s=this.#d(e);this.#h(s);const a=$(".mod_guest_title");if(this.#t.competitorsIds?.length===1&&this.#e.page.data.competitors){let i=this.#e.page.data.competitors.filter(o=>o.id===t.competitorsIds[0]);i.length&&($("a",a).attr("href","http://"+i[0].url),$("a",a).text(i[0].name))}}#k(){this.#t.regionsIndexes&&c.watch(this.#t.regionsIndexes,t=>{if(!t.length)return;t.forEach((a,i)=>t[i]=a);const e=TplProjectSelectorRegion.genSearchersMap(),s=[];e.forEach(a=>{a.regions.forEach(i=>{i.index!==-1&&s.push(i.index)})}),this.#t.regionsIndexes=t.filter(a=>s.includes(a))},{immediate:!0}),this.#t.competitorsIds&&c.watch(this.#t.competitorsIds,t=>{if(!t.length)return;t.forEach((s,a)=>t[a]=s);const e=[this.#e.page.data.project.id];this.#e.page.data.project.competitors.forEach(s=>{s.on>=0&&e.push(s.id)}),this.#t.competitorsIds=t.filter(s=>e.includes(s))},{immediate:!0})}}const k=l=>{const t=l;!t.options.tpaNamesUrlHash?.length&&!t.options.tpaNamesStorage?.length&&!t.options.tpaNamesStorageLocal?.length&&!t.options.tpaNamesGuestLink?.length||new S(t)};n.Core=r.Core,n.i18nPlugin=r.i18n,n.useI18n=r.useI18n,n.useI18nLang=r.useI18nLang,n.corePlugin=g.core,n.useAsyncTopDialog=u.useAsyncTopDialog,n.useTopDialog=u.useTopDialog,n.TopDialogWorker=m.TopDialogWorker,n.piniaTPAPlugin=k,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=app.amd.js.map
|
package/core/app.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.amd.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\r\nimport { watch } from 'vue';\r\nimport { debounce } from '@/core/utils/lodash';\r\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\r\nimport { camelToSnakeCase } from '@/core/utils/string.js';\r\nimport { getHash, setHash } from '@/core/utils/route';\r\n\r\nclass PiniaTPA {\r\n\r\n\treadonly #storeId: string;\r\n\treadonly #store: Store<string, any>;\r\n\r\n\t/**\r\n\t * @deprecated\r\n\t */\r\n\treadonly #Page: any;\r\n\r\n\treadonly #user: any;\r\n\treadonly #Api: Api.Client<Api.TV.Paths, true>;\r\n\r\n\treadonly #namesUrlHash: string[] = [];\r\n\treadonly #namesStorage: string[] = [];\r\n\treadonly #namesStorageLocal: string[] = [];\r\n\treadonly #namesGuestLink: string[] = [];\r\n\r\n\tconstructor(context: Context) {\r\n\t\tthis.#store = context.store;\r\n\t\tthis.#storeId = this.#store.$id;\r\n\r\n\t\tthis.#Page = context.options.Page;\r\n\r\n\t\tthis.#user = context.options.user;\r\n\t\tthis.#Api = context.options.Api;\r\n\r\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\r\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\r\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\r\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\r\n\r\n\t\tcontext.store.genGuestLink = <Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) => this.genGuestLink(path, params);\r\n\r\n\t\tif (!this.#user.guest_data?.data) {\r\n\t\t\tthis.#loadFromStorage();\r\n\t\t\tthis.#loadFromStorage(true);\r\n\r\n\t\t\t// настройки URL hash имеют приоритет\r\n\t\t\tthis.#loadFromHash();\r\n\t\t}\r\n\r\n\t\t// настройки гостевой ссылки имеют приоритет\r\n\t\tthis.#loadFromGuestLink();\r\n\r\n\t\tthis.#prepareParams();\r\n\r\n\t\tconst save = debounce(() => {\r\n\t\t\tthis.#saveInHash();\r\n\t\t\tthis.#saveInStorage();\r\n\t\t\tthis.#saveInStorage(true);\r\n\t\t});\r\n\r\n\t\tcontext.store.$subscribe(save);\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать гостевую ссылку\r\n\t *\r\n\t * Метод, путь к которому указан в path, должен возвращать сгенерированную ссылку\r\n\t */\r\n\tasync genGuestLink<Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) {\r\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\r\n\t\tparams = Object.assign(params, Object.fromEntries(dataGuestLink));\r\n\r\n\t\tconst res = await this.#Api.gen(path).setParams(params).call();\r\n\t\tif (res?.errors) return;\r\n\r\n\t\tconst link = res.result as string;\r\n\r\n\t\tawait guestLinkToClipboard(link);\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать опции для гостевой ссылки\r\n\t */\r\n\t#genOptionsForGuestLink() {\r\n\t\tconst data = new Map();\r\n\r\n\t\tthis.#namesGuestLink.forEach(name => {\r\n\t\t\t// формат параметров API: snake_case\r\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\r\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\r\n\t\t});\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * Установить опции из объекта без фиксации состояния\r\n\t */\r\n\t#setOptions(data: Map<string, any>) {\r\n\t\tdata.forEach((value, name) => {\r\n\t\t\tconst currentValue = this.#store[name];\r\n\r\n\t\t\tif (value === null || value === undefined) return;\r\n\t\t\tif (currentValue === undefined) return;\r\n\t\t\tif (!value?.constructor) return;\r\n\t\t\tif (value.constructor !== currentValue.constructor) return;\r\n\r\n\t\t\t// дополнительная проверка на формат даты\r\n\t\t\tif (name.indexOf('date') === 0) {\r\n\t\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\t\t// value.forEach((valueI) => {\r\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\r\n\t\t\t\t\t// });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (typeof (value) === 'string') {\r\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.#store[name] = value;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\r\n\t */\r\n\t#genDataFormat(data: Map<string, any>) {\r\n\t\tconst dataFormatted = new Map();\r\n\r\n\t\tdata.forEach((value, name) => {\r\n\t\t\tif (value === null) return;\r\n\r\n\t\t\tvalue = JSON.stringify(value);\r\n\r\n\t\t\tdataFormatted.set(name, value);\r\n\t\t});\r\n\r\n\t\treturn dataFormatted;\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\r\n\t */\r\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\r\n\t\tconst data: Map<string, any> = new Map();\r\n\r\n\t\tdataFormatted.forEach((value, name) => {\r\n\t\t\tif (value === null || value === undefined || value === 'false') return;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\r\n\r\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// не json строка\r\n\t\t\t}\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * Установить опции из хеша адреса страницы\r\n\t */\r\n\t#loadFromHash() {\r\n\t\tlet dataHash: any;\r\n\t\ttry {\r\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\r\n\t\t} catch (e) {\r\n\r\n\t\t}\r\n\t\tif (!dataHash) return;\r\n\r\n\t\tconst data: Map<string, any> = new Map();\r\n\r\n\t\tthis.#namesUrlHash.forEach((name) => {\r\n\t\t\tconst value = dataHash[name];\r\n\t\t\tif (!value) return;\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\tthis.#setOptions(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Сохранить опции в хеш адреса страницы\r\n\t */\r\n\t#saveInHash() {\r\n\t\tconst data = new Map();\r\n\r\n\t\tthis.#namesUrlHash.forEach((name) => {\r\n\t\t\tconst value = this.#store[name];\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst dataObject = Object.fromEntries(data);\r\n\t\tconst dataJSON = JSON.stringify(dataObject);\r\n\r\n\t\tsetHash(this.#storeId, dataJSON);\r\n\t};\r\n\r\n\t/**\r\n\t * Установить опции из localStorage\r\n\t * @param isLocal - сохранить с учетом адреса страницы\r\n\t */\r\n\t#loadFromStorage(isLocal = false) {\r\n\t\tconst dataFormatted = new Map();\r\n\r\n\t\tlet names = this.#namesStorage;\r\n\t\tlet storageNamespace = 'state:' + this.#storeId;\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tnames = this.#namesStorageLocal;\r\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\r\n\t\t}\r\n\r\n\t\tnames.forEach((name) => {\r\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\r\n\t\t\tdataFormatted.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\r\n\r\n\t\tthis.#setOptions(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Сохранить опции в localStorage\r\n\t * @param isLocal - сохранить с учетом адреса страницы\r\n\t */\r\n\t#saveInStorage(isLocal = false) {\r\n\t\tconst data = new Map();\r\n\r\n\t\tlet names = this.#namesStorage;\r\n\t\tlet storageNamespace = 'state:' + this.#storeId;\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tnames = this.#namesStorageLocal;\r\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\r\n\t\t}\r\n\r\n\t\tnames.forEach((name) => {\r\n\t\t\tconst value = this.#store[name];\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst dataFormatted = this.#genDataFormat(data);\r\n\r\n\t\tnames.forEach((name) => {\r\n\t\t\tconst value = dataFormatted.get(name);\r\n\r\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Установить опции из гостевой ссылки\r\n\t */\r\n\t#loadFromGuestLink() {\r\n\t\tconst guestData = this.#user?.guest_data?.data;\r\n\t\tif (!guestData) return;\r\n\r\n\t\t// общие правила для гостевых сессий\r\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\r\n\r\n\t\tconst dataFormatted = new Map();\r\n\r\n\t\tthis.#namesGuestLink.forEach((name) => {\r\n\t\t\tconst value = guestData[name];\r\n\t\t\tdataFormatted.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\r\n\r\n\t\tthis.#setOptions(data);\r\n\r\n\t\tconst $guestTitle = $('.mod_guest_title');\r\n\r\n\t\t// TODO: вынести в опции плагина\r\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\r\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\r\n\t\t\tif (competitors.length) {\r\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\r\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Подготовить входные параметры перед инициализацией основного функционала\r\n\t *\r\n\t * Входные параметры устанавливаются при открытии страницы\r\n\t *\r\n\t * Входные параметры могут меняться пользоваталем и устаревать\r\n\t */\r\n\t#prepareParams() {\r\n\t\t// контролль за вводом регионов\r\n\t\t// TODO: вынести в опции плагина\r\n\t\tif (this.#store.regionsIndexes) {\r\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\r\n\t\t\t\tif (!regionsIndexes.length) return;\r\n\r\n\t\t\t\t// приведение типа\r\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\r\n\r\n\t\t\t\t// оставить только включенные регионы\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\r\n\r\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\r\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\r\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\r\n\t\t\t\t\t\tif (region.index === -1) return;\r\n\r\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\r\n\t\t\t}, { immediate: true });\r\n\t\t}\r\n\r\n\t\t// контролль за вводом конкурентов\r\n\t\t// TODO: вынести в опции плагина\r\n\t\tif (this.#store.competitorsIds) {\r\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\r\n\t\t\t\tif (!competitorsIds.length) return;\r\n\r\n\t\t\t\t// приведение типа\r\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\r\n\r\n\t\t\t\t// оставить только включенных конкурентов\r\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\r\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\r\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\r\n\t\t\t}, { immediate: true });\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\ntype Options = {\r\n\t/**\r\n\t * TODO: Убрать из плагина\r\n\t */\r\n\tPage: any,\r\n\r\n\t/**\r\n\t * Объект с настройками пользователя\r\n\t */\r\n\tuser: any,\r\n\r\n\t/**\r\n\t * Объект для работы с API\r\n\t *\r\n\t * См. на сайте: @/component/api/core/api.ts\r\n\t */\r\n\tApi: Api.Client<Api.TV.Paths, true>;\r\n\r\n\t/**\r\n\t * Имена свойств для сохранения в URL\r\n\t */\r\n\ttpaNamesUrlHash?: string[],\r\n\r\n\t/**\r\n\t * Имена свойств для сохранения в localStorage\r\n\t */\r\n\ttpaNamesStorage?: string[],\r\n\r\n\t/**\r\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\r\n\t *\r\n\t * Каждый URL будет работать со своим состоянием\r\n\t */\r\n\ttpaNamesStorageLocal?: string[],\r\n\r\n\t/**\r\n\t * Имена свойств для работы с гостевой ссылкой\r\n\t *\r\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\r\n\t */\r\n\ttpaNamesGuestLink?: string[],\r\n};\r\n\r\ntype Context = PiniaPluginContext & {\r\n\toptions: Options\r\n};\r\n\r\n/**\r\n * Плагин tpa (Third-party access) для pinia\r\n *\r\n * Добавляет возможность сохранять и загружать данные в/из:\r\n * \t- URL hash в адресе страницы\r\n * \t- localStorage\r\n * \t- гостевая ссылка\r\n *\r\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\r\n * - tpaNamesUrlHash\r\n * - tpaNamesStorage\r\n * - tpaNamesStorageLocal\r\n * - tpaNamesGuestLink\r\n */\r\nexport default (contextPinia: PiniaPluginContext) => {\r\n\tconst context = contextPinia as Context;\r\n\r\n\t// плагин подключать не нужно\r\n\tif (\r\n\t\t!context.options.tpaNamesUrlHash?.length &&\r\n\t\t!context.options.tpaNamesStorage?.length &&\r\n\t\t!context.options.tpaNamesStorageLocal?.length &&\r\n\t\t!context.options.tpaNamesGuestLink?.length\r\n\t) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tnew PiniaTPA(context);\r\n}\r\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","context","path","params","#loadFromStorage","save","forms","#saveInStorage","dataGuestLink","#genOptionsForGuestLink","res","link","utils_clipboard","data","nameSnakeCase","utils_string","name","currentValue","value","dataFormatted","#loadFromHash","dataHash","utils_route","#setOptions","#saveInHash","dataJSON","isLocal","names","#namesStorage","storageNamespace","#namesStorageLocal","#loadFromGuestLink","guestData","$guestTitle","competitors","competitor","#prepareParams","regionsIndexes","regionIndex","index","mapSearchers","searcher","region","availableRegionsIndexes","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.amd.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\nimport { watch } from 'vue';\nimport { debounce } from '@/core/utils/lodash';\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\nimport { camelToSnakeCase } from '@/core/utils/string.js';\nimport { getHash, setHash } from '@/core/utils/route';\n\nclass PiniaTPA {\n\n\treadonly #storeId: string;\n\treadonly #store: Store<string, any>;\n\n\t/**\n\t * @deprecated\n\t */\n\treadonly #Page: any;\n\n\treadonly #user: any;\n\treadonly #Api: Api.Client<Api.TV.Paths, true>;\n\n\treadonly #namesUrlHash: string[] = [];\n\treadonly #namesStorage: string[] = [];\n\treadonly #namesStorageLocal: string[] = [];\n\treadonly #namesGuestLink: string[] = [];\n\n\tconstructor(context: Context) {\n\t\tthis.#store = context.store;\n\t\tthis.#storeId = this.#store.$id;\n\n\t\tthis.#Page = context.options.Page;\n\n\t\tthis.#user = context.options.user;\n\t\tthis.#Api = context.options.Api;\n\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\n\n\t\tcontext.store.genGuestLink = <Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) => this.genGuestLink(path, params);\n\n\t\tif (!this.#user.guest_data?.data) {\n\t\t\tthis.#loadFromStorage();\n\t\t\tthis.#loadFromStorage(true);\n\n\t\t\t// настройки URL hash имеют приоритет\n\t\t\tthis.#loadFromHash();\n\t\t}\n\n\t\t// настройки гостевой ссылки имеют приоритет\n\t\tthis.#loadFromGuestLink();\n\n\t\tthis.#prepareParams();\n\n\t\tconst save = debounce(() => {\n\t\t\tthis.#saveInHash();\n\t\t\tthis.#saveInStorage();\n\t\t\tthis.#saveInStorage(true);\n\t\t});\n\n\t\tcontext.store.$subscribe(save);\n\t}\n\n\t/**\n\t * Сгенерировать гостевую ссылку\n\t *\n\t * Метод, путь к которому указан в path, должен возвращать сгенерированную ссылку\n\t */\n\tasync genGuestLink<Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) {\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\n\t\tparams = Object.assign(params, Object.fromEntries(dataGuestLink));\n\n\t\tconst res = await this.#Api.gen(path).setParams(params).call();\n\t\tif (res?.errors) return;\n\n\t\tconst link = res.result as string;\n\n\t\tawait guestLinkToClipboard(link);\n\t}\n\n\t/**\n\t * Сгенерировать опции для гостевой ссылки\n\t */\n\t#genOptionsForGuestLink() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesGuestLink.forEach(name => {\n\t\t\t// формат параметров API: snake_case\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из объекта без фиксации состояния\n\t */\n\t#setOptions(data: Map<string, any>) {\n\t\tdata.forEach((value, name) => {\n\t\t\tconst currentValue = this.#store[name];\n\n\t\t\tif (value === null || value === undefined) return;\n\t\t\tif (currentValue === undefined) return;\n\t\t\tif (!value?.constructor) return;\n\t\t\tif (value.constructor !== currentValue.constructor) return;\n\n\t\t\t// дополнительная проверка на формат даты\n\t\t\tif (name.indexOf('date') === 0) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// value.forEach((valueI) => {\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\n\t\t\t\t\t// });\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof (value) === 'string') {\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#store[name] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\n\t */\n\t#genDataFormat(data: Map<string, any>) {\n\t\tconst dataFormatted = new Map();\n\n\t\tdata.forEach((value, name) => {\n\t\t\tif (value === null) return;\n\n\t\t\tvalue = JSON.stringify(value);\n\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\treturn dataFormatted;\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\n\t */\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tdataFormatted.forEach((value, name) => {\n\t\t\tif (value === null || value === undefined || value === 'false') return;\n\n\t\t\ttry {\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\n\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\n\t\t\t} catch (e) {\n\t\t\t\t// не json строка\n\t\t\t}\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из хеша адреса страницы\n\t */\n\t#loadFromHash() {\n\t\tlet dataHash: any;\n\t\ttry {\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\n\t\t} catch (e) {\n\n\t\t}\n\t\tif (!dataHash) return;\n\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = dataHash[name];\n\t\t\tif (!value) return;\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в хеш адреса страницы\n\t */\n\t#saveInHash() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataObject = Object.fromEntries(data);\n\t\tconst dataJSON = JSON.stringify(dataObject);\n\n\t\tsetHash(this.#storeId, dataJSON);\n\t};\n\n\t/**\n\t * Установить опции из localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#loadFromStorage(isLocal = false) {\n\t\tconst dataFormatted = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#saveInStorage(isLocal = false) {\n\t\tconst data = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataFormatted = this.#genDataFormat(data);\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = dataFormatted.get(name);\n\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\n\t\t});\n\t}\n\n\t/**\n\t * Установить опции из гостевой ссылки\n\t */\n\t#loadFromGuestLink() {\n\t\tconst guestData = this.#user?.guest_data?.data;\n\t\tif (!guestData) return;\n\n\t\t// общие правила для гостевых сессий\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\n\n\t\tconst dataFormatted = new Map();\n\n\t\tthis.#namesGuestLink.forEach((name) => {\n\t\t\tconst value = guestData[name];\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\n\t\tconst $guestTitle = $('.mod_guest_title');\n\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\n\t\t\tif (competitors.length) {\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Подготовить входные параметры перед инициализацией основного функционала\n\t *\n\t * Входные параметры устанавливаются при открытии страницы\n\t *\n\t * Входные параметры могут меняться пользоваталем и устаревать\n\t */\n\t#prepareParams() {\n\t\t// контролль за вводом регионов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.regionsIndexes) {\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\n\t\t\t\tif (!regionsIndexes.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\n\n\t\t\t\t// оставить только включенные регионы\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\n\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\n\t\t\t\t\t\tif (region.index === -1) return;\n\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\n\t\t\t}, { immediate: true });\n\t\t}\n\n\t\t// контролль за вводом конкурентов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds) {\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\n\t\t\t\tif (!competitorsIds.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\n\n\t\t\t\t// оставить только включенных конкурентов\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\n\t\t\t\t});\n\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\n\t\t\t}, { immediate: true });\n\t\t}\n\t}\n\n}\n\ntype Options = {\n\t/**\n\t * TODO: Убрать из плагина\n\t */\n\tPage: any,\n\n\t/**\n\t * Объект с настройками пользователя\n\t */\n\tuser: any,\n\n\t/**\n\t * Объект для работы с API\n\t *\n\t * См. на сайте: @/component/api/core/api.ts\n\t */\n\tApi: Api.Client<Api.TV.Paths, true>;\n\n\t/**\n\t * Имена свойств для сохранения в URL\n\t */\n\ttpaNamesUrlHash?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage\n\t */\n\ttpaNamesStorage?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\n\t *\n\t * Каждый URL будет работать со своим состоянием\n\t */\n\ttpaNamesStorageLocal?: string[],\n\n\t/**\n\t * Имена свойств для работы с гостевой ссылкой\n\t *\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\n\t */\n\ttpaNamesGuestLink?: string[],\n};\n\ntype Context = PiniaPluginContext & {\n\toptions: Options\n};\n\n/**\n * Плагин tpa (Third-party access) для pinia\n *\n * Добавляет возможность сохранять и загружать данные в/из:\n * \t- URL hash в адресе страницы\n * \t- localStorage\n * \t- гостевая ссылка\n *\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\n * - tpaNamesUrlHash\n * - tpaNamesStorage\n * - tpaNamesStorageLocal\n * - tpaNamesGuestLink\n */\nexport default (contextPinia: PiniaPluginContext) => {\n\tconst context = contextPinia as Context;\n\n\t// плагин подключать не нужно\n\tif (\n\t\t!context.options.tpaNamesUrlHash?.length &&\n\t\t!context.options.tpaNamesStorage?.length &&\n\t\t!context.options.tpaNamesStorageLocal?.length &&\n\t\t!context.options.tpaNamesGuestLink?.length\n\t) {\n\t\treturn;\n\t}\n\n\tnew PiniaTPA(context);\n}\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","context","path","params","#loadFromStorage","save","forms","#saveInStorage","dataGuestLink","#genOptionsForGuestLink","res","link","utils_clipboard","data","nameSnakeCase","utils_string","name","currentValue","value","dataFormatted","#loadFromHash","dataHash","utils_route","#setOptions","#saveInHash","dataJSON","isLocal","names","#namesStorage","storageNamespace","#namesStorageLocal","#loadFromGuestLink","guestData","$guestTitle","competitors","competitor","#prepareParams","regionsIndexes","regionIndex","index","mapSearchers","searcher","region","availableRegionsIndexes","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia"],"mappings":"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"}
|
package/core/app.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { d as c } from "../.chunks/forms-
|
|
2
|
-
import { C as O, i as P, u as I, a as T } from "../.chunks/forms-
|
|
3
|
-
import { c as y } from "../.chunks/core-
|
|
1
|
+
import { d as c } from "../.chunks/forms-BAUgA7Ct.es.js";
|
|
2
|
+
import { C as O, i as P, u as I, a as T } from "../.chunks/forms-BAUgA7Ct.es.js";
|
|
3
|
+
import { c as y } from "../.chunks/core-BE_-rKvW.es.js";
|
|
4
4
|
import { watch as h } from "vue";
|
|
5
5
|
import { guestLinkToClipboard as p } from "../utils/clipboard.js";
|
|
6
6
|
import { camelToSnakeCase as d } from "../utils/string.js";
|
|
7
7
|
import { getHash as f, setHash as g } from "../utils/route.js";
|
|
8
|
-
import { u as G, a as M } from "../.chunks/utils-
|
|
9
|
-
import { T as D } from "../.chunks/dialogs.vue_vue_type_script_setup_true_lang-
|
|
8
|
+
import { u as G, a as M } from "../.chunks/utils-BYaZxGC1.es.js";
|
|
9
|
+
import { T as D } from "../.chunks/dialogs.vue_vue_type_script_setup_true_lang-DMhcuiHP.es.js";
|
|
10
10
|
class l {
|
|
11
11
|
#s;
|
|
12
12
|
#t;
|
package/core/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\r\nimport { watch } from 'vue';\r\nimport { debounce } from '@/core/utils/lodash';\r\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\r\nimport { camelToSnakeCase } from '@/core/utils/string.js';\r\nimport { getHash, setHash } from '@/core/utils/route';\r\n\r\nclass PiniaTPA {\r\n\r\n\treadonly #storeId: string;\r\n\treadonly #store: Store<string, any>;\r\n\r\n\t/**\r\n\t * @deprecated\r\n\t */\r\n\treadonly #Page: any;\r\n\r\n\treadonly #user: any;\r\n\treadonly #Api: Api.Client<Api.TV.Paths, true>;\r\n\r\n\treadonly #namesUrlHash: string[] = [];\r\n\treadonly #namesStorage: string[] = [];\r\n\treadonly #namesStorageLocal: string[] = [];\r\n\treadonly #namesGuestLink: string[] = [];\r\n\r\n\tconstructor(context: Context) {\r\n\t\tthis.#store = context.store;\r\n\t\tthis.#storeId = this.#store.$id;\r\n\r\n\t\tthis.#Page = context.options.Page;\r\n\r\n\t\tthis.#user = context.options.user;\r\n\t\tthis.#Api = context.options.Api;\r\n\r\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\r\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\r\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\r\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\r\n\r\n\t\tcontext.store.genGuestLink = <Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) => this.genGuestLink(path, params);\r\n\r\n\t\tif (!this.#user.guest_data?.data) {\r\n\t\t\tthis.#loadFromStorage();\r\n\t\t\tthis.#loadFromStorage(true);\r\n\r\n\t\t\t// настройки URL hash имеют приоритет\r\n\t\t\tthis.#loadFromHash();\r\n\t\t}\r\n\r\n\t\t// настройки гостевой ссылки имеют приоритет\r\n\t\tthis.#loadFromGuestLink();\r\n\r\n\t\tthis.#prepareParams();\r\n\r\n\t\tconst save = debounce(() => {\r\n\t\t\tthis.#saveInHash();\r\n\t\t\tthis.#saveInStorage();\r\n\t\t\tthis.#saveInStorage(true);\r\n\t\t});\r\n\r\n\t\tcontext.store.$subscribe(save);\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать гостевую ссылку\r\n\t *\r\n\t * Метод, путь к которому указан в path, должен возвращать сгенерированную ссылку\r\n\t */\r\n\tasync genGuestLink<Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) {\r\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\r\n\t\tparams = Object.assign(params, Object.fromEntries(dataGuestLink));\r\n\r\n\t\tconst res = await this.#Api.gen(path).setParams(params).call();\r\n\t\tif (res?.errors) return;\r\n\r\n\t\tconst link = res.result as string;\r\n\r\n\t\tawait guestLinkToClipboard(link);\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать опции для гостевой ссылки\r\n\t */\r\n\t#genOptionsForGuestLink() {\r\n\t\tconst data = new Map();\r\n\r\n\t\tthis.#namesGuestLink.forEach(name => {\r\n\t\t\t// формат параметров API: snake_case\r\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\r\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\r\n\t\t});\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * Установить опции из объекта без фиксации состояния\r\n\t */\r\n\t#setOptions(data: Map<string, any>) {\r\n\t\tdata.forEach((value, name) => {\r\n\t\t\tconst currentValue = this.#store[name];\r\n\r\n\t\t\tif (value === null || value === undefined) return;\r\n\t\t\tif (currentValue === undefined) return;\r\n\t\t\tif (!value?.constructor) return;\r\n\t\t\tif (value.constructor !== currentValue.constructor) return;\r\n\r\n\t\t\t// дополнительная проверка на формат даты\r\n\t\t\tif (name.indexOf('date') === 0) {\r\n\t\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\t\t// value.forEach((valueI) => {\r\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\r\n\t\t\t\t\t// });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (typeof (value) === 'string') {\r\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.#store[name] = value;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\r\n\t */\r\n\t#genDataFormat(data: Map<string, any>) {\r\n\t\tconst dataFormatted = new Map();\r\n\r\n\t\tdata.forEach((value, name) => {\r\n\t\t\tif (value === null) return;\r\n\r\n\t\t\tvalue = JSON.stringify(value);\r\n\r\n\t\t\tdataFormatted.set(name, value);\r\n\t\t});\r\n\r\n\t\treturn dataFormatted;\r\n\t}\r\n\r\n\t/**\r\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\r\n\t */\r\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\r\n\t\tconst data: Map<string, any> = new Map();\r\n\r\n\t\tdataFormatted.forEach((value, name) => {\r\n\t\t\tif (value === null || value === undefined || value === 'false') return;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\r\n\r\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// не json строка\r\n\t\t\t}\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * Установить опции из хеша адреса страницы\r\n\t */\r\n\t#loadFromHash() {\r\n\t\tlet dataHash: any;\r\n\t\ttry {\r\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\r\n\t\t} catch (e) {\r\n\r\n\t\t}\r\n\t\tif (!dataHash) return;\r\n\r\n\t\tconst data: Map<string, any> = new Map();\r\n\r\n\t\tthis.#namesUrlHash.forEach((name) => {\r\n\t\t\tconst value = dataHash[name];\r\n\t\t\tif (!value) return;\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\tthis.#setOptions(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Сохранить опции в хеш адреса страницы\r\n\t */\r\n\t#saveInHash() {\r\n\t\tconst data = new Map();\r\n\r\n\t\tthis.#namesUrlHash.forEach((name) => {\r\n\t\t\tconst value = this.#store[name];\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst dataObject = Object.fromEntries(data);\r\n\t\tconst dataJSON = JSON.stringify(dataObject);\r\n\r\n\t\tsetHash(this.#storeId, dataJSON);\r\n\t};\r\n\r\n\t/**\r\n\t * Установить опции из localStorage\r\n\t * @param isLocal - сохранить с учетом адреса страницы\r\n\t */\r\n\t#loadFromStorage(isLocal = false) {\r\n\t\tconst dataFormatted = new Map();\r\n\r\n\t\tlet names = this.#namesStorage;\r\n\t\tlet storageNamespace = 'state:' + this.#storeId;\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tnames = this.#namesStorageLocal;\r\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\r\n\t\t}\r\n\r\n\t\tnames.forEach((name) => {\r\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\r\n\t\t\tdataFormatted.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\r\n\r\n\t\tthis.#setOptions(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Сохранить опции в localStorage\r\n\t * @param isLocal - сохранить с учетом адреса страницы\r\n\t */\r\n\t#saveInStorage(isLocal = false) {\r\n\t\tconst data = new Map();\r\n\r\n\t\tlet names = this.#namesStorage;\r\n\t\tlet storageNamespace = 'state:' + this.#storeId;\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tnames = this.#namesStorageLocal;\r\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\r\n\t\t}\r\n\r\n\t\tnames.forEach((name) => {\r\n\t\t\tconst value = this.#store[name];\r\n\r\n\t\t\tdata.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst dataFormatted = this.#genDataFormat(data);\r\n\r\n\t\tnames.forEach((name) => {\r\n\t\t\tconst value = dataFormatted.get(name);\r\n\r\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Установить опции из гостевой ссылки\r\n\t */\r\n\t#loadFromGuestLink() {\r\n\t\tconst guestData = this.#user?.guest_data?.data;\r\n\t\tif (!guestData) return;\r\n\r\n\t\t// общие правила для гостевых сессий\r\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\r\n\r\n\t\tconst dataFormatted = new Map();\r\n\r\n\t\tthis.#namesGuestLink.forEach((name) => {\r\n\t\t\tconst value = guestData[name];\r\n\t\t\tdataFormatted.set(name, value);\r\n\t\t});\r\n\r\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\r\n\r\n\t\tthis.#setOptions(data);\r\n\r\n\t\tconst $guestTitle = $('.mod_guest_title');\r\n\r\n\t\t// TODO: вынести в опции плагина\r\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\r\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\r\n\t\t\tif (competitors.length) {\r\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\r\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Подготовить входные параметры перед инициализацией основного функционала\r\n\t *\r\n\t * Входные параметры устанавливаются при открытии страницы\r\n\t *\r\n\t * Входные параметры могут меняться пользоваталем и устаревать\r\n\t */\r\n\t#prepareParams() {\r\n\t\t// контролль за вводом регионов\r\n\t\t// TODO: вынести в опции плагина\r\n\t\tif (this.#store.regionsIndexes) {\r\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\r\n\t\t\t\tif (!regionsIndexes.length) return;\r\n\r\n\t\t\t\t// приведение типа\r\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\r\n\r\n\t\t\t\t// оставить только включенные регионы\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\r\n\r\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\r\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\r\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\r\n\t\t\t\t\t\tif (region.index === -1) return;\r\n\r\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\r\n\t\t\t}, { immediate: true });\r\n\t\t}\r\n\r\n\t\t// контролль за вводом конкурентов\r\n\t\t// TODO: вынести в опции плагина\r\n\t\tif (this.#store.competitorsIds) {\r\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\r\n\t\t\t\tif (!competitorsIds.length) return;\r\n\r\n\t\t\t\t// приведение типа\r\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\r\n\r\n\t\t\t\t// оставить только включенных конкурентов\r\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\r\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\r\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\r\n\t\t\t}, { immediate: true });\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\ntype Options = {\r\n\t/**\r\n\t * TODO: Убрать из плагина\r\n\t */\r\n\tPage: any,\r\n\r\n\t/**\r\n\t * Объект с настройками пользователя\r\n\t */\r\n\tuser: any,\r\n\r\n\t/**\r\n\t * Объект для работы с API\r\n\t *\r\n\t * См. на сайте: @/component/api/core/api.ts\r\n\t */\r\n\tApi: Api.Client<Api.TV.Paths, true>;\r\n\r\n\t/**\r\n\t * Имена свойств для сохранения в URL\r\n\t */\r\n\ttpaNamesUrlHash?: string[],\r\n\r\n\t/**\r\n\t * Имена свойств для сохранения в localStorage\r\n\t */\r\n\ttpaNamesStorage?: string[],\r\n\r\n\t/**\r\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\r\n\t *\r\n\t * Каждый URL будет работать со своим состоянием\r\n\t */\r\n\ttpaNamesStorageLocal?: string[],\r\n\r\n\t/**\r\n\t * Имена свойств для работы с гостевой ссылкой\r\n\t *\r\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\r\n\t */\r\n\ttpaNamesGuestLink?: string[],\r\n};\r\n\r\ntype Context = PiniaPluginContext & {\r\n\toptions: Options\r\n};\r\n\r\n/**\r\n * Плагин tpa (Third-party access) для pinia\r\n *\r\n * Добавляет возможность сохранять и загружать данные в/из:\r\n * \t- URL hash в адресе страницы\r\n * \t- localStorage\r\n * \t- гостевая ссылка\r\n *\r\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\r\n * - tpaNamesUrlHash\r\n * - tpaNamesStorage\r\n * - tpaNamesStorageLocal\r\n * - tpaNamesGuestLink\r\n */\r\nexport default (contextPinia: PiniaPluginContext) => {\r\n\tconst context = contextPinia as Context;\r\n\r\n\t// плагин подключать не нужно\r\n\tif (\r\n\t\t!context.options.tpaNamesUrlHash?.length &&\r\n\t\t!context.options.tpaNamesStorage?.length &&\r\n\t\t!context.options.tpaNamesStorageLocal?.length &&\r\n\t\t!context.options.tpaNamesGuestLink?.length\r\n\t) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tnew PiniaTPA(context);\r\n}\r\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","#namesUrlHash","#namesStorage","#namesStorageLocal","#namesGuestLink","context","path","params","#loadFromStorage","#loadFromHash","#loadFromGuestLink","#prepareParams","save","debounce","#saveInHash","#saveInStorage","dataGuestLink","#genOptionsForGuestLink","res","link","guestLinkToClipboard","data","name","nameSnakeCase","camelToSnakeCase","#setOptions","value","currentValue","#genDataFormat","dataFormatted","#genDataUnFormat","dataHash","getHash","dataObject","dataJSON","setHash","isLocal","names","storageNamespace","guestData","$guestTitle","competitors","competitor","watch","regionsIndexes","regionIndex","index","mapSearchers","availableRegionsIndexes","searcher","region","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\nimport { watch } from 'vue';\nimport { debounce } from '@/core/utils/lodash';\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\nimport { camelToSnakeCase } from '@/core/utils/string.js';\nimport { getHash, setHash } from '@/core/utils/route';\n\nclass PiniaTPA {\n\n\treadonly #storeId: string;\n\treadonly #store: Store<string, any>;\n\n\t/**\n\t * @deprecated\n\t */\n\treadonly #Page: any;\n\n\treadonly #user: any;\n\treadonly #Api: Api.Client<Api.TV.Paths, true>;\n\n\treadonly #namesUrlHash: string[] = [];\n\treadonly #namesStorage: string[] = [];\n\treadonly #namesStorageLocal: string[] = [];\n\treadonly #namesGuestLink: string[] = [];\n\n\tconstructor(context: Context) {\n\t\tthis.#store = context.store;\n\t\tthis.#storeId = this.#store.$id;\n\n\t\tthis.#Page = context.options.Page;\n\n\t\tthis.#user = context.options.user;\n\t\tthis.#Api = context.options.Api;\n\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\n\n\t\tcontext.store.genGuestLink = <Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) => this.genGuestLink(path, params);\n\n\t\tif (!this.#user.guest_data?.data) {\n\t\t\tthis.#loadFromStorage();\n\t\t\tthis.#loadFromStorage(true);\n\n\t\t\t// настройки URL hash имеют приоритет\n\t\t\tthis.#loadFromHash();\n\t\t}\n\n\t\t// настройки гостевой ссылки имеют приоритет\n\t\tthis.#loadFromGuestLink();\n\n\t\tthis.#prepareParams();\n\n\t\tconst save = debounce(() => {\n\t\t\tthis.#saveInHash();\n\t\t\tthis.#saveInStorage();\n\t\t\tthis.#saveInStorage(true);\n\t\t});\n\n\t\tcontext.store.$subscribe(save);\n\t}\n\n\t/**\n\t * Сгенерировать гостевую ссылку\n\t *\n\t * Метод, путь к которому указан в path, должен возвращать сгенерированную ссылку\n\t */\n\tasync genGuestLink<Path extends Api.TV.Path>(path: Path, params: Api.TV.Params<Path>) {\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\n\t\tparams = Object.assign(params, Object.fromEntries(dataGuestLink));\n\n\t\tconst res = await this.#Api.gen(path).setParams(params).call();\n\t\tif (res?.errors) return;\n\n\t\tconst link = res.result as string;\n\n\t\tawait guestLinkToClipboard(link);\n\t}\n\n\t/**\n\t * Сгенерировать опции для гостевой ссылки\n\t */\n\t#genOptionsForGuestLink() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesGuestLink.forEach(name => {\n\t\t\t// формат параметров API: snake_case\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из объекта без фиксации состояния\n\t */\n\t#setOptions(data: Map<string, any>) {\n\t\tdata.forEach((value, name) => {\n\t\t\tconst currentValue = this.#store[name];\n\n\t\t\tif (value === null || value === undefined) return;\n\t\t\tif (currentValue === undefined) return;\n\t\t\tif (!value?.constructor) return;\n\t\t\tif (value.constructor !== currentValue.constructor) return;\n\n\t\t\t// дополнительная проверка на формат даты\n\t\t\tif (name.indexOf('date') === 0) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// value.forEach((valueI) => {\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\n\t\t\t\t\t// });\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof (value) === 'string') {\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#store[name] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\n\t */\n\t#genDataFormat(data: Map<string, any>) {\n\t\tconst dataFormatted = new Map();\n\n\t\tdata.forEach((value, name) => {\n\t\t\tif (value === null) return;\n\n\t\t\tvalue = JSON.stringify(value);\n\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\treturn dataFormatted;\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\n\t */\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tdataFormatted.forEach((value, name) => {\n\t\t\tif (value === null || value === undefined || value === 'false') return;\n\n\t\t\ttry {\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\n\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\n\t\t\t} catch (e) {\n\t\t\t\t// не json строка\n\t\t\t}\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из хеша адреса страницы\n\t */\n\t#loadFromHash() {\n\t\tlet dataHash: any;\n\t\ttry {\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\n\t\t} catch (e) {\n\n\t\t}\n\t\tif (!dataHash) return;\n\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = dataHash[name];\n\t\t\tif (!value) return;\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в хеш адреса страницы\n\t */\n\t#saveInHash() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataObject = Object.fromEntries(data);\n\t\tconst dataJSON = JSON.stringify(dataObject);\n\n\t\tsetHash(this.#storeId, dataJSON);\n\t};\n\n\t/**\n\t * Установить опции из localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#loadFromStorage(isLocal = false) {\n\t\tconst dataFormatted = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#saveInStorage(isLocal = false) {\n\t\tconst data = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataFormatted = this.#genDataFormat(data);\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = dataFormatted.get(name);\n\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\n\t\t});\n\t}\n\n\t/**\n\t * Установить опции из гостевой ссылки\n\t */\n\t#loadFromGuestLink() {\n\t\tconst guestData = this.#user?.guest_data?.data;\n\t\tif (!guestData) return;\n\n\t\t// общие правила для гостевых сессий\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\n\n\t\tconst dataFormatted = new Map();\n\n\t\tthis.#namesGuestLink.forEach((name) => {\n\t\t\tconst value = guestData[name];\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\n\t\tconst $guestTitle = $('.mod_guest_title');\n\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\n\t\t\tif (competitors.length) {\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Подготовить входные параметры перед инициализацией основного функционала\n\t *\n\t * Входные параметры устанавливаются при открытии страницы\n\t *\n\t * Входные параметры могут меняться пользоваталем и устаревать\n\t */\n\t#prepareParams() {\n\t\t// контролль за вводом регионов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.regionsIndexes) {\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\n\t\t\t\tif (!regionsIndexes.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\n\n\t\t\t\t// оставить только включенные регионы\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\n\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\n\t\t\t\t\t\tif (region.index === -1) return;\n\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\n\t\t\t}, { immediate: true });\n\t\t}\n\n\t\t// контролль за вводом конкурентов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds) {\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\n\t\t\t\tif (!competitorsIds.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\n\n\t\t\t\t// оставить только включенных конкурентов\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\n\t\t\t\t});\n\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\n\t\t\t}, { immediate: true });\n\t\t}\n\t}\n\n}\n\ntype Options = {\n\t/**\n\t * TODO: Убрать из плагина\n\t */\n\tPage: any,\n\n\t/**\n\t * Объект с настройками пользователя\n\t */\n\tuser: any,\n\n\t/**\n\t * Объект для работы с API\n\t *\n\t * См. на сайте: @/component/api/core/api.ts\n\t */\n\tApi: Api.Client<Api.TV.Paths, true>;\n\n\t/**\n\t * Имена свойств для сохранения в URL\n\t */\n\ttpaNamesUrlHash?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage\n\t */\n\ttpaNamesStorage?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\n\t *\n\t * Каждый URL будет работать со своим состоянием\n\t */\n\ttpaNamesStorageLocal?: string[],\n\n\t/**\n\t * Имена свойств для работы с гостевой ссылкой\n\t *\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\n\t */\n\ttpaNamesGuestLink?: string[],\n};\n\ntype Context = PiniaPluginContext & {\n\toptions: Options\n};\n\n/**\n * Плагин tpa (Third-party access) для pinia\n *\n * Добавляет возможность сохранять и загружать данные в/из:\n * \t- URL hash в адресе страницы\n * \t- localStorage\n * \t- гостевая ссылка\n *\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\n * - tpaNamesUrlHash\n * - tpaNamesStorage\n * - tpaNamesStorageLocal\n * - tpaNamesGuestLink\n */\nexport default (contextPinia: PiniaPluginContext) => {\n\tconst context = contextPinia as Context;\n\n\t// плагин подключать не нужно\n\tif (\n\t\t!context.options.tpaNamesUrlHash?.length &&\n\t\t!context.options.tpaNamesStorage?.length &&\n\t\t!context.options.tpaNamesStorageLocal?.length &&\n\t\t!context.options.tpaNamesGuestLink?.length\n\t) {\n\t\treturn;\n\t}\n\n\tnew PiniaTPA(context);\n}\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","#namesUrlHash","#namesStorage","#namesStorageLocal","#namesGuestLink","context","path","params","#loadFromStorage","#loadFromHash","#loadFromGuestLink","#prepareParams","save","debounce","#saveInHash","#saveInStorage","dataGuestLink","#genOptionsForGuestLink","res","link","guestLinkToClipboard","data","name","nameSnakeCase","camelToSnakeCase","#setOptions","value","currentValue","#genDataFormat","dataFormatted","#genDataUnFormat","dataHash","getHash","dataObject","dataJSON","setHash","isLocal","names","storageNamespace","guestData","$guestTitle","competitors","competitor","watch","regionsIndexes","regionIndex","index","mapSearchers","availableRegionsIndexes","searcher","region","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia"],"mappings":";;;;;;;;;AAOA,MAAMA,EAAS;AAAA,EAELC;AAAA,EACAC;AAAA;AAAA;AAAA;AAAA,EAKAC;AAAA,EAEAC;AAAA,EACAC;AAAA,EAEAC,KAA0B,CAAA;AAAA,EAC1BC,KAA0B,CAAA;AAAA,EAC1BC,KAA+B,CAAA;AAAA,EAC/BC,KAA4B,CAAA;AAAA,EAErC,YAAYC,GAAkB;AAC7B,SAAKR,KAASQ,EAAQ,OACtB,KAAKT,KAAW,KAAKC,GAAO,KAE5B,KAAKC,KAAQO,EAAQ,QAAQ,MAE7B,KAAKN,KAAQM,EAAQ,QAAQ,MAC7B,KAAKL,KAAOK,EAAQ,QAAQ,KAE5B,KAAKJ,KAAgBI,EAAQ,QAAQ,mBAAmB,CAAA,GACxD,KAAKH,KAAgBG,EAAQ,QAAQ,mBAAmB,CAAA,GACxD,KAAKF,KAAqBE,EAAQ,QAAQ,wBAAwB,CAAA,GAClE,KAAKD,KAAkBC,EAAQ,QAAQ,qBAAqB,CAAA,GAE5DA,EAAQ,MAAM,eAAe,CAA2BC,GAAYC,MAAgC,KAAK,aAAaD,GAAMC,CAAM,GAE7H,KAAKR,GAAM,YAAY,SAC3B,KAAKS,GAAA,GACL,KAAKA,GAAiB,EAAI,GAG1B,KAAKC,GAAA,IAIN,KAAKC,GAAA,GAEL,KAAKC,GAAA;AAEL,UAAMC,IAAOC,EAAS,MAAM;AAC3B,WAAKC,GAAA,GACL,KAAKC,GAAA,GACL,KAAKA,GAAe,EAAI;AAAA,IACzB,CAAC;AAED,IAAAV,EAAQ,MAAM,WAAWO,CAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAuCN,GAAYC,GAA6B;AACrF,UAAMS,IAAgB,KAAKC,GAAA;AAC3B,IAAAV,IAAS,OAAO,OAAOA,GAAQ,OAAO,YAAYS,CAAa,CAAC;AAEhE,UAAME,IAAM,MAAM,KAAKlB,GAAK,IAAIM,CAAI,EAAE,UAAUC,CAAM,EAAE,KAAA;AACxD,QAAIW,GAAK,OAAQ;AAEjB,UAAMC,IAAOD,EAAI;AAEjB,UAAME,EAAqBD,CAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKAF,KAA0B;AACzB,UAAMI,wBAAW,IAAA;AAEjB,gBAAKjB,GAAgB,QAAQ,CAAAkB,MAAQ;AAEpC,YAAMC,IAAgBC,EAAiBF,CAAI;AAC3C,MAAAD,EAAK,IAAIE,GAAe,KAAK1B,GAAOyB,CAAI,CAAC;AAAA,IAC1C,CAAC,GAEMD;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKAI,GAAYJ,GAAwB;AACnC,IAAAA,EAAK,QAAQ,CAACK,GAAOJ,MAAS;AAC7B,YAAMK,IAAe,KAAK9B,GAAOyB,CAAI;AAErC,UAAII,KAAU,QACVC,MAAiB,UAChBD,GAAO,eACRA,EAAM,gBAAgBC,EAAa,aAGvC;AAAA,YAAIL,EAAK,QAAQ,MAAM,MAAM,KACxB,OAAM,QAAQI,CAAK;AAKtB,cAAI,OAAQA,KAAW,YAClB,CAAC,qBAAqB,KAAKA,CAAK;AAAG;AAAA;AAK1C,aAAK7B,GAAOyB,CAAI,IAAII;AAAA;AAAA,IACrB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKAE,GAAeP,GAAwB;AACtC,UAAMQ,wBAAoB,IAAA;AAE1B,WAAAR,EAAK,QAAQ,CAACK,GAAOJ,MAAS;AAC7B,MAAII,MAAU,SAEdA,IAAQ,KAAK,UAAUA,CAAK,GAE5BG,EAAc,IAAIP,GAAMI,CAAK;AAAA,IAC9B,CAAC,GAEMG;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKAC,GAAiBD,GAAoC;AACpD,UAAMR,wBAA6B,IAAA;AAEnC,WAAAQ,EAAc,QAAQ,CAACH,GAAOJ,MAAS;AACtC,UAAI,EAAAI,KAAU,QAA+BA,MAAU,UAEvD;AAAA,YAAI;AAGH,cAFI,OAAQA,KAAW,YAAY,CAAC,uBAAuB,KAAKA,CAAK,MAAGA,IAAQ,KAAK,MAAMA,CAAK,IAE5FA,KAAU,QAA+BA,MAAU,QAAS;AAAA,QACjE,QAAY;AAAA,QAEZ;AAEA,QAAAL,EAAK,IAAIC,GAAMI,CAAK;AAAA;AAAA,IACrB,CAAC,GAEML;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKAZ,KAAgB;AACf,QAAIsB;AACJ,QAAI;AACH,MAAAA,IAAW,KAAK,MAAMC,EAAQ,KAAKpC,EAAQ,CAAC;AAAA,IAC7C,QAAY;AAAA,IAEZ;AACA,QAAI,CAACmC,EAAU;AAEf,UAAMV,wBAA6B,IAAA;AAEnC,SAAKpB,GAAc,QAAQ,CAACqB,MAAS;AACpC,YAAMI,IAAQK,EAAST,CAAI;AAC3B,MAAKI,KAELL,EAAK,IAAIC,GAAMI,CAAK;AAAA,IACrB,CAAC,GAED,KAAKD,GAAYJ,CAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKAP,KAAc;AACb,UAAMO,wBAAW,IAAA;AAEjB,SAAKpB,GAAc,QAAQ,CAACqB,MAAS;AACpC,YAAMI,IAAQ,KAAK7B,GAAOyB,CAAI;AAE9B,MAAAD,EAAK,IAAIC,GAAMI,CAAK;AAAA,IACrB,CAAC;AAED,UAAMO,IAAa,OAAO,YAAYZ,CAAI,GACpCa,IAAW,KAAK,UAAUD,CAAU;AAE1C,IAAAE,EAAQ,KAAKvC,IAAUsC,CAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA1B,GAAiB4B,IAAU,IAAO;AACjC,UAAMP,wBAAoB,IAAA;AAE1B,QAAIQ,IAAQ,KAAKnC,IACboC,IAAmB,WAAW,KAAK1C;AAEvC,IAAIwC,MACHC,IAAQ,KAAKlC,IACbmC,IAAmB,WAAW,KAAK1C,KAAW,MAAM,SAAS,WAG9DyC,EAAM,QAAQ,CAACf,MAAS;AACvB,YAAMI,IAAQ,aAAa,QAAQY,IAAmB,MAAMhB,CAAI;AAChE,MAAAO,EAAc,IAAIP,GAAMI,CAAK;AAAA,IAC9B,CAAC;AAED,UAAML,IAAO,KAAKS,GAAiBD,CAAa;AAEhD,SAAKJ,GAAYJ,CAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMAN,GAAeqB,IAAU,IAAO;AAC/B,UAAMf,wBAAW,IAAA;AAEjB,QAAIgB,IAAQ,KAAKnC,IACboC,IAAmB,WAAW,KAAK1C;AAEvC,IAAIwC,MACHC,IAAQ,KAAKlC,IACbmC,IAAmB,WAAW,KAAK1C,KAAW,MAAM,SAAS,WAG9DyC,EAAM,QAAQ,CAACf,MAAS;AACvB,YAAMI,IAAQ,KAAK7B,GAAOyB,CAAI;AAE9B,MAAAD,EAAK,IAAIC,GAAMI,CAAK;AAAA,IACrB,CAAC;AAED,UAAMG,IAAgB,KAAKD,GAAeP,CAAI;AAE9C,IAAAgB,EAAM,QAAQ,CAACf,MAAS;AACvB,YAAMI,IAAQG,EAAc,IAAIP,CAAI;AAEpC,mBAAa,QAAQgB,IAAmB,MAAMhB,GAAMI,CAAK;AAAA,IAC1D,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKAhB,KAAqB;AACpB,UAAM6B,IAAY,KAAKxC,IAAO,YAAY;AAC1C,QAAI,CAACwC,EAAW;AAGhB,IAAI,KAAKxC,GAAM,OAAO,OAAI,KAAKA,GAAM,wBAAwBwC,EAAU;AAEvE,UAAMV,wBAAoB,IAAA;AAE1B,SAAKzB,GAAgB,QAAQ,CAACkB,MAAS;AACtC,YAAMI,IAAQa,EAAUjB,CAAI;AAC5B,MAAAO,EAAc,IAAIP,GAAMI,CAAK;AAAA,IAC9B,CAAC;AAED,UAAML,IAAO,KAAKS,GAAiBD,CAAa;AAEhD,SAAKJ,GAAYJ,CAAI;AAErB,UAAMmB,IAAc,EAAE,kBAAkB;AAGxC,QAAI,KAAK3C,GAAO,gBAAgB,WAAW,KAAK,KAAKC,GAAM,KAAK,KAAK,aAAa;AACjF,UAAI2C,IAAc,KAAK3C,GAAM,KAAK,KAAK,YAAY,OAAO,CAAC4C,MAAoBA,EAAW,OAAOH,EAAU,eAAe,CAAC,CAAC;AAC5H,MAAIE,EAAY,WACf,EAAE,KAAKD,CAAW,EAAE,KAAK,QAAQ,YAAYC,EAAY,CAAC,EAAE,GAAG,GAC/D,EAAE,KAAKD,CAAW,EAAE,KAAKC,EAAY,CAAC,EAAE,IAAI;AAAA,IAE9C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA9B,KAAiB;AAGhB,IAAI,KAAKd,GAAO,kBACf8C,EAAM,KAAK9C,GAAO,gBAAgB,CAAC+C,MAAmB;AACrD,UAAI,CAACA,EAAe,OAAQ;AAG5B,MAAAA,EAAe,QAAQ,CAACC,GAAqBC,MAAkBF,EAAeE,CAAK,IAAID,CAAW;AAIlG,YAAME,IAAe,yBAAyB,gBAAA,GAExCC,IAAoC,CAAA;AAC1C,MAAAD,EAAa,QAAQ,CAACE,MAAkB;AACvC,QAAAA,EAAS,QAAQ,QAAQ,CAACC,MAAgB;AACzC,UAAIA,EAAO,UAAU,MAErBF,EAAwB,KAAKE,EAAO,KAAK;AAAA,QAC1C,CAAC;AAAA,MACF,CAAC,GAED,KAAKrD,GAAO,iBAAiB+C,EAAe,OAAO,CAACC,MAAwBG,EAAwB,SAASH,CAAW,CAAC;AAAA,IAC1H,GAAG,EAAE,WAAW,IAAM,GAKnB,KAAKhD,GAAO,kBACf8C,EAAM,KAAK9C,GAAO,gBAAgB,CAACsD,MAAmB;AACrD,UAAI,CAACA,EAAe,OAAQ;AAG5B,MAAAA,EAAe,QAAQ,CAACC,GAAsBN,MAAkBK,EAAeL,CAAK,IAAIM,CAAY;AAGpG,YAAMC,IAA0B,CAAC,KAAKvD,GAAM,KAAK,KAAK,QAAQ,EAAE;AAChE,WAAKA,GAAM,KAAK,KAAK,QAAQ,YAAY,QAAQ,CAAC4C,MAAoB;AACrE,QAAIA,EAAW,MAAM,KAAGW,EAAwB,KAAKX,EAAW,EAAE;AAAA,MACnE,CAAC,GAED,KAAK7C,GAAO,iBAAiBsD,EAAe,OAAO,CAACC,MAAyBC,EAAwB,SAASD,CAAY,CAAC;AAAA,IAC5H,GAAG,EAAE,WAAW,IAAM;AAAA,EAExB;AAED;AA+DA,MAAAE,IAAe,CAACC,MAAqC;AACpD,QAAMlD,IAAUkD;AAGhB,EACC,CAAClD,EAAQ,QAAQ,iBAAiB,UAClC,CAACA,EAAQ,QAAQ,iBAAiB,UAClC,CAACA,EAAQ,QAAQ,sBAAsB,UACvC,CAACA,EAAQ,QAAQ,mBAAmB,UAKrC,IAAIV,EAASU,CAAO;AACrB;"}
|
package/dialog/dialog.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/page.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
define(["require","exports","../.chunks/page.vue_vue_type_script_setup_true_lang-WX1HlCFp.amd","vue","../.chunks/utils-DNzj9OOY.amd"],(function(d,o,i,e,l){"use strict";if(typeof e>"u")var e=window.Vue;const m={name:{type:String,required:!0},order:{type:Number,required:!0},prevName:String,footerFullWith:Boolean},c=e.defineComponent({__name:"pageComponent",props:{component:{},keepAlive:{type:Boolean,default:!0},props:{},name:{},order:{},prevName:{},footerFullWith:{type:Boolean}},setup(n){const r=n,t=l.useTopDialogSelf(),p=(a,u)=>{if(!u.value){if(a.name!=="AsyncComponentWrapper"){u.value=!0;return}t.needShowPage(r.name)&&(t.isLoadingPage.value=!0,a.__asyncResolved&&(u.value=!0,t.isLoadingPage.value=!1))}};if(r.component.name==="AsyncComponentWrapper"){const a=e.ref(!1);e.onUpdated(()=>{p(r.component,a)})}return(a,u)=>(e.openBlock(),e.createBlock(e.KeepAlive,{include:n.keepAlive?"":"none"},[e.unref(t).needShowPage(n.name)?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.component),e.mergeProps({key:0},r,{name:n.name,order:n.order,prevName:n.prevName}),null,16,["name","order","prevName"])):e.createCommentVNode("",!0)],1032,["include"]))}});o.TopDialog=i._sfc_main,o.TopDialogPage=i._sfc_main$1,o.useTopDialogSelf=l.useTopDialogSelf,o.TopDialogPageComponent=c,o.propsPageCommon=m,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=dialog.amd.js.map
|
package/dialog/dialog.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.amd.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\
|
|
1
|
+
{"version":3,"file":"dialog.amd.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\n\t/**\n\t * Статус загрузки страницы диалогового окна\n\t *\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\n\t */\n\tisLoading?: boolean;\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n */\nexport interface PropsCommon {\n\t/**\n\t * Имя страницы для диалогового окна\n\t *\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\n\t */\n\tname: string,\n\n\t/**\n\t * Порядкой номер страницы в диалоговом окне\n\t *\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\n\t */\n\torder: number,\n\n\t/**\n\t * Имя предыдущей страницы\n\t *\n\t * Для кнопки Назад / Закрыть в мобильной версии\n\t */\n\tprevName?: string,\n\n\t/**\n\t * Стиль отображения футера, при котороым элементы растягиваются на всю ширину\n\t *\n\t * Разрешены переносы\n\t */\n\tfooterFullWith?: boolean,\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n *\n * Для не SFC компонентов\n */\nexport const propsPageCommon = {\n\tname: {\n\t\ttype: String,\n\t\trequired: true,\n\t},\n\n\torder: {\n\t\ttype: Number,\n\t\trequired: true,\n\t},\n\n\tprevName: String,\n\n\tfooterFullWith: Boolean,\n};\n\nexport interface Slots {\n\t/**\n\t * Шапка страницы\n\t */\n\theader(props: {}): any;\n\n\t/**\n\t * Кнопки для шапки страницы\n\t */\n\theaderButtons?(props: {}): any;\n\n\t/**\n\t * Контент страницы\n\t */\n\tbody(props: {}): any;\n\n\t/**\n\t * Футер страницы\n\t */\n\tfooter?(props: {}): any;\n}\n","<script setup lang=\"ts\">\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tkeepAlive: true,\n});\n\nconst dialog = useTopDialogSelf();\n\n/**\n * Статус загрузи асинхронного компонента страницы диалогового окна\n */\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\n\tif (isLoaded.value) return;\n\n\tif (component.name !== 'AsyncComponentWrapper') {\n\t\tisLoaded.value = true;\n\n\t\treturn;\n\t}\n\n\tif (!dialog.needShowPage(props.name as string)) return;\n\n\tdialog.isLoadingPage.value = true;\n\n\t// @ts-ignore\n\tif (component.__asyncResolved) {\n\t\tisLoaded.value = true;\n\n\t\tdialog.isLoadingPage.value = false;\n\t}\n};\n\nif (props.component.name === 'AsyncComponentWrapper') {\n\tconst isLoaded = ref(false);\n\n\tonUpdated(() => {\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\n\t});\n}\n</script>\n\n<template>\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\n\t\t<Component\n\t\t\t:is=\"component\"\n\t\t\tv-if=\"dialog.needShowPage(name)\"\n\t\t\t:=\"props\"\n\t\t\t:name=\"name\"\n\t\t\t:order=\"order\"\n\t\t\t:prevName=\"prevName\"\n\t\t/>\n\t</KeepAlive>\n</template>\n"],"names":["propsPageCommon","dialog","utils","updateIsLoadingAsyncPage","component","isLoaded","vue","props","__props"],"mappings":"yMA+CO,MAAAA,EAAA,CAAwB,KAAA,aAEvB,SAAA,IAEP,MAAA,aAGO,SAAA,oBAIG,eAAA,OAGX,8LCpDAC,EAAAC,EAAA,iBAAA,EAKAC,EAAA,CAAAC,EAAAC,IAAA,CACC,GAAA,CAAAA,EAAA,MAEA,IAAAD,EAAA,OAAA,wBAAA,CACCC,EAAA,MAAA,mCAODJ,EAAA,cAAA,MAAA,GAGAG,EAAA,kBACCC,EAAA,MAAA,GAEAJ,EAAA,cAAA,MAAA,KACD,iDAIA,MAAAI,EAAAC,EAAA,IAAA,EAAA,mBAGCH,EAAAI,EAAA,UAAAF,CAAA,CAAkD,CAAA,yDAgBvC,QAAAG,EAAA,UAAA,GAAA,MATkB,EAAA,6HAIpB,KAAAA,EAAA,KACD,MAAAA,EAAA,yBAEI,CAAA,EAAA,KAAA,GAAA,CAAA,OAAA,QAAA,UAAA,CAAA,GAAAF,EAAA,mBAAA,GAAA,EAAA"}
|
package/dialog/dialog.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ as k, a as B } from "../.chunks/page.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import { _ as k, a as B } from "../.chunks/page.vue_vue_type_script_setup_true_lang-BMTt9SU8.es.js";
|
|
2
2
|
import { defineComponent as l, ref as i, onUpdated as u, createBlock as t, openBlock as m, KeepAlive as c, createCommentVNode as s, unref as d, resolveDynamicComponent as g, mergeProps as f } from "vue";
|
|
3
|
-
import { b as v } from "../.chunks/utils-
|
|
3
|
+
import { b as v } from "../.chunks/utils-BYaZxGC1.es.js";
|
|
4
4
|
const C = {
|
|
5
5
|
name: {
|
|
6
6
|
type: String,
|
package/dialog/dialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\
|
|
1
|
+
{"version":3,"file":"dialog.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\n\t/**\n\t * Статус загрузки страницы диалогового окна\n\t *\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\n\t */\n\tisLoading?: boolean;\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n */\nexport interface PropsCommon {\n\t/**\n\t * Имя страницы для диалогового окна\n\t *\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\n\t */\n\tname: string,\n\n\t/**\n\t * Порядкой номер страницы в диалоговом окне\n\t *\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\n\t */\n\torder: number,\n\n\t/**\n\t * Имя предыдущей страницы\n\t *\n\t * Для кнопки Назад / Закрыть в мобильной версии\n\t */\n\tprevName?: string,\n\n\t/**\n\t * Стиль отображения футера, при котороым элементы растягиваются на всю ширину\n\t *\n\t * Разрешены переносы\n\t */\n\tfooterFullWith?: boolean,\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n *\n * Для не SFC компонентов\n */\nexport const propsPageCommon = {\n\tname: {\n\t\ttype: String,\n\t\trequired: true,\n\t},\n\n\torder: {\n\t\ttype: Number,\n\t\trequired: true,\n\t},\n\n\tprevName: String,\n\n\tfooterFullWith: Boolean,\n};\n\nexport interface Slots {\n\t/**\n\t * Шапка страницы\n\t */\n\theader(props: {}): any;\n\n\t/**\n\t * Кнопки для шапки страницы\n\t */\n\theaderButtons?(props: {}): any;\n\n\t/**\n\t * Контент страницы\n\t */\n\tbody(props: {}): any;\n\n\t/**\n\t * Футер страницы\n\t */\n\tfooter?(props: {}): any;\n}\n","<script setup lang=\"ts\">\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tkeepAlive: true,\n});\n\nconst dialog = useTopDialogSelf();\n\n/**\n * Статус загрузи асинхронного компонента страницы диалогового окна\n */\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\n\tif (isLoaded.value) return;\n\n\tif (component.name !== 'AsyncComponentWrapper') {\n\t\tisLoaded.value = true;\n\n\t\treturn;\n\t}\n\n\tif (!dialog.needShowPage(props.name as string)) return;\n\n\tdialog.isLoadingPage.value = true;\n\n\t// @ts-ignore\n\tif (component.__asyncResolved) {\n\t\tisLoaded.value = true;\n\n\t\tdialog.isLoadingPage.value = false;\n\t}\n};\n\nif (props.component.name === 'AsyncComponentWrapper') {\n\tconst isLoaded = ref(false);\n\n\tonUpdated(() => {\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\n\t});\n}\n</script>\n\n<template>\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\n\t\t<Component\n\t\t\t:is=\"component\"\n\t\t\tv-if=\"dialog.needShowPage(name)\"\n\t\t\t:=\"props\"\n\t\t\t:name=\"name\"\n\t\t\t:order=\"order\"\n\t\t\t:prevName=\"prevName\"\n\t\t/>\n\t</KeepAlive>\n</template>\n"],"names":["propsPageCommon","props","__props","dialog","useTopDialogSelf","updateIsLoadingAsyncPage","component","isLoaded","ref","onUpdated","_createBlock","_KeepAlive","_unref","_openBlock","_resolveDynamicComponent","_mergeProps"],"mappings":";;;AA+CO,MAAMA,IAAkB;AAAA,EAC9B,MAAM;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAGX,OAAO;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAGX,UAAU;AAAA,EAEV,gBAAgB;AACjB;;;;;;;;;;;;ACxDA,UAAMC,IAAQC,GAIRC,IAASC,EAAA,GAKTC,IAA2B,CAACC,GAAsBC,MAAkB;AACzE,UAAI,CAAAA,EAAS,OAEb;AAAA,YAAID,EAAU,SAAS,yBAAyB;AAC/C,UAAAC,EAAS,QAAQ;AAEjB;AAAA,QACD;AAEA,QAAKJ,EAAO,aAAaF,EAAM,IAAc,MAE7CE,EAAO,cAAc,QAAQ,IAGzBG,EAAU,oBACbC,EAAS,QAAQ,IAEjBJ,EAAO,cAAc,QAAQ;AAAA;AAAA,IAE/B;AAEA,QAAIF,EAAM,UAAU,SAAS,yBAAyB;AACrD,YAAMM,IAAWC,EAAI,EAAK;AAE1B,MAAAC,EAAU,MAAM;AACf,QAAAJ,EAAyBJ,EAAM,WAAWM,CAAQ;AAAA,MACnD,CAAC;AAAA,IACF;2BAKCG,EASYC,GAAA;AAAA,MATA,SAAST,EAAA,YAAS,KAAA;AAAA,IAAA;MAGtBU,EAAAT,CAAA,EAAO,aAAaD,EAAA,IAAI,KAF/BW,KAAAH,EAOEI,EANIZ,EAAA,SAAS,GADfa,EAOE,YAJEd,GAAK;AAAA,QACP,MAAMC,EAAA;AAAA,QACN,OAAOA,EAAA;AAAA,QACP,UAAUA,EAAA;AAAA,MAAA;;;;"}
|
package/extra/extra.amd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extra.amd.js","sources":["../../src/components/extra/rive/rive.vue"],"sourcesContent":["<script setup lang=\"ts\">\
|
|
1
|
+
{"version":3,"file":"extra.amd.js","sources":["../../src/components/extra/rive/rive.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onUnmounted, ref, watch } from 'vue';\nimport type { Rive, RiveParameters } from '@rive-app/canvas-lite';\nimport type { Props } from './types';\n\nlet rive: typeof import('@rive-app/canvas-lite');\n\nconst props = withDefaults(defineProps<Props>(), {\n\tautoplay: true,\n});\n\nconst el = ref<HTMLCanvasElement>();\n\nconst topRive = {\n\triveInstance: undefined as Rive | undefined,\n};\n\nwatch([el, props], async () => {\n\tif (!rive) rive = await import('@rive-app/canvas-lite');\n\n\tconst canvas = el.value;\n\tif (!canvas) return;\n\n\ttopRive.riveInstance?.cleanup();\n\n\tconst options: RiveParameters = {\n\t\t...props,\n\t\tcanvas,\n\t\tonLoad: (e) => {\n\t\t\tprops.onLoad?.(e);\n\n\t\t\ttopRive.riveInstance?.resizeDrawingSurfaceToCanvas();\n\t\t},\n\t};\n\n\ttopRive.riveInstance = new rive.Rive(options);\n});\n\nonUnmounted(() => {\n\ttopRive.riveInstance?.cleanup();\n});\n\ndefineExpose(topRive);\n</script>\n\n<template>\n\t<canvas ref=\"el\" class=\"top-rive\"></canvas>\n</template>\n\n<style>\n.top-rive {\n\twidth: 100%;\n\theight: 100%;\n\tflex-grow: 1;\n}\n</style>\n"],"names":["rive","el","vue","canvas","topRive","props","e"],"mappings":"y+BAKA,IAAAA,YAMAC,EAAAC,EAAA,IAAA,KAEgB,aAAA,kHAOf,MAAAC,EAAAF,EAAA,mBAGAG,EAAA,cAAA,QAAA,WAEgC,GAAAC,EAC5B,OAAAF,EACH,OAAAG,GAAA,CAECD,EAAA,SAAAC,CAAA,EAEAF,EAAA,cAAA,6BAAA,gCAI0C,CAAA,qBAI5CA,EAAA,cAAA,QAAA,CAA8B,CAAA,+EAOlB,MAAA,UAAW,EAAA,KAAA,GAAA"}
|
package/extra/extra.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extra.js","sources":["../../src/components/extra/rive/rive.vue"],"sourcesContent":["<script setup lang=\"ts\">\
|
|
1
|
+
{"version":3,"file":"extra.js","sources":["../../src/components/extra/rive/rive.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onUnmounted, ref, watch } from 'vue';\nimport type { Rive, RiveParameters } from '@rive-app/canvas-lite';\nimport type { Props } from './types';\n\nlet rive: typeof import('@rive-app/canvas-lite');\n\nconst props = withDefaults(defineProps<Props>(), {\n\tautoplay: true,\n});\n\nconst el = ref<HTMLCanvasElement>();\n\nconst topRive = {\n\triveInstance: undefined as Rive | undefined,\n};\n\nwatch([el, props], async () => {\n\tif (!rive) rive = await import('@rive-app/canvas-lite');\n\n\tconst canvas = el.value;\n\tif (!canvas) return;\n\n\ttopRive.riveInstance?.cleanup();\n\n\tconst options: RiveParameters = {\n\t\t...props,\n\t\tcanvas,\n\t\tonLoad: (e) => {\n\t\t\tprops.onLoad?.(e);\n\n\t\t\ttopRive.riveInstance?.resizeDrawingSurfaceToCanvas();\n\t\t},\n\t};\n\n\ttopRive.riveInstance = new rive.Rive(options);\n});\n\nonUnmounted(() => {\n\ttopRive.riveInstance?.cleanup();\n});\n\ndefineExpose(topRive);\n</script>\n\n<template>\n\t<canvas ref=\"el\" class=\"top-rive\"></canvas>\n</template>\n\n<style>\n.top-rive {\n\twidth: 100%;\n\theight: 100%;\n\tflex-grow: 1;\n}\n</style>\n"],"names":["rive","props","__props","el","ref","topRive","watch","canvas","options","e","onUnmounted","__expose","_createElementBlock"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,QAAIA;AAEJ,UAAMC,IAAQC,GAIRC,IAAKC,EAAA,GAELC,IAAU;AAAA,MACf,cAAc;AAAA,IAAA;AAGf,WAAAC,EAAM,CAACH,GAAIF,CAAK,GAAG,YAAY;AAC9B,MAAKD,MAAMA,IAAO,MAAM,OAAO,uBAAuB;AAEtD,YAAMO,IAASJ,EAAG;AAClB,UAAI,CAACI,EAAQ;AAEb,MAAAF,EAAQ,cAAc,QAAA;AAEtB,YAAMG,IAA0B;AAAA,QAC/B,GAAGP;AAAA,QACH,QAAAM;AAAA,QACA,QAAQ,CAACE,MAAM;AACd,UAAAR,EAAM,SAASQ,CAAC,GAEhBJ,EAAQ,cAAc,6BAAA;AAAA,QACvB;AAAA,MAAA;AAGD,MAAAA,EAAQ,eAAe,IAAIL,EAAK,KAAKQ,CAAO;AAAA,IAC7C,CAAC,GAEDE,EAAY,MAAM;AACjB,MAAAL,EAAQ,cAAc,QAAA;AAAA,IACvB,CAAC,GAEDM,EAAaN,CAAO,mBAInBO,EAA2C,UAAA;AAAA,eAA/B;AAAA,MAAJ,KAAIT;AAAA,MAAK,OAAM;AAAA,IAAA;;;"}
|
package/forms/forms.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-B_v2vU59.amd"],(function(_,a,n){"use strict";if(typeof i>"u")var i=window.Vue;a.TopAvatar=n._sfc_main$6,a.TopButton=n._sfc_main$1,a.TopCaption=n._sfc_main$13,a.TopCheckbox=n._sfc_main$4,a.TopControlLabel=n._sfc_main$7,a.TopHint=n._sfc_main$2,a.TopInput=n._sfc_main,a.TopInputDate=n._sfc_main$8,a.TopInputRange=n._sfc_main$9,a.TopLoadbar=n.TopLoadbar,a.TopPreloader=n._sfc_main$12,a.TopRadio=n._sfc_main$5,a.TopSelect=n._sfc_main$10,a.TopSwitcher=n._sfc_main$11,a.TopTextarea=n._sfc_main$3,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=forms.amd.js.map
|
package/forms/forms.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { m as p, e as T, Q as s, h as t, n as e, f as r, _ as n, o as i, p as l, T as u, s as b, j as c, q as d, r as h, g as x } from "../.chunks/forms-
|
|
1
|
+
import { m as p, e as T, Q as s, h as t, n as e, f as r, _ as n, o as i, p as l, T as u, s as b, j as c, q as d, r as h, g as x } from "../.chunks/forms-BAUgA7Ct.es.js";
|
|
2
2
|
export {
|
|
3
3
|
p as TopAvatar,
|
|
4
4
|
T as TopButton,
|
package/formsExt/formsExt.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","vue","../.chunks/forms-
|
|
1
|
+
define(["require","exports","vue","../.chunks/forms-B_v2vU59.amd","../.chunks/policy.vue_vue_type_style_index_0_lang-CO-f4TwZ.amd"],(function(z,d,e,m,f){"use strict";if(typeof e>"u")var e=window.Vue;const y={class:"top-editArea_footer"},k=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(t,{emit:o}){const l=t,n=o,i=e.ref(l.defaultValue),s=e.ref(l.isFocused),r=e.computed(()=>i.value!==l.defaultValue),a=p=>{n("submit",p),i.value=l.defaultValue},c=()=>{if(l.forceShowCloseBtn&&!r.value){n("close");return}i.value=l.defaultValue},N=()=>{l.attachToKeyboard&&n("clickOnTitle")};return(p,u)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":t.attachToKeyboard})},[t.title||p.$slots.caption?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_caption",onClick:u[0]||(u[0]=v=>N())},[e.renderSlot(p.$slots,"caption",{},()=>[e.createTextVNode(e.toDisplayString(t.title),1)])])):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-forms-focusable":!0,"top-as-input":!0,"top-error":t.isError,"top-focus":s.value})},[e.createVNode(m._sfc_main$3,{modelValue:i.value,"onUpdate:modelValue":u[1]||(u[1]=v=>i.value=v),name:t.name,placeholder:t.placeholder,rows:t.rows,minHeight:t.minHeight,expandable:t.expandable,disabled:t.disabled,readonly:t.readonly,isError:t.isError,hint:t.hint,class:"top-editArea_element",onFocus:u[2]||(u[2]=()=>s.value=!0),onBlur:u[3]||(u[3]=()=>s.value=!1),onKeyup:[e.withKeys(c,["esc"]),u[4]||(u[4]=e.withKeys(e.withModifiers(v=>a(i.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",y,[r.value||t.forceShowCloseBtn?(e.openBlock(),e.createBlock(m._sfc_main$1,{key:0,icon:p.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:c},e.createSlots({_:2},[p.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),r.value?(e.openBlock(),e.createBlock(m._sfc_main$1,{key:1,class:"top-editArea_button",icon:p.$core.state.isMobile?"":"",onClick:u[5]||(u[5]=v=>a(i.value))},e.createSlots({_:2},[p.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),B={class:"top-editInput"},h=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(t,{emit:o}){const l=t,n=e.ref(l.modelValue);e.watch(e.toRef(l.modelValue),()=>{n.value=l.modelValue});const i=o,s=()=>{i("update:modelValue",n.value)};return(r,a)=>(e.openBlock(),e.createElementBlock("div",B,[e.createVNode(m._sfc_main,e.mergeProps(t.input,{onKeydownCapture:a[0]||(a[0]=e.withKeys(e.withModifiers(c=>n.value=t.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(s,["stop"]),["enter"]),modelValue:n.value,"onUpdate:modelValue":a[1]||(a[1]=c=>n.value=c)}),e.createSlots({_:2},[r.$slots.caption?{name:"caption",fn:e.withCtx(()=>[e.renderSlot(r.$slots,"caption")]),key:"0"}:void 0]),1040,["onKeydown","modelValue"]),n.value!==t.modelValue?(e.openBlock(),e.createBlock(m._sfc_main$1,e.mergeProps({key:0,icon:"",styling:"soft"},t.button,{onClick:s}),null,16)):e.createCommentVNode("",!0)]))}}),V=e.defineComponent({__name:"optionGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),l=t,n=e.ref(null);e.watch(o,()=>{const s=l.items.map(r=>r.value);Array.isArray(o.value)?o.value.find(a=>!s.includes(a))&&(o.value=o.value.filter(a=>s.includes(a))):s.includes(o.value)||(o.value=s[0]??""),n.value?.querySelector(".radioGroup_item-selected")?.scrollIntoView()},{immediate:!0});const i="optionGroup-"+Math.random();return(s,r)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:n,class:e.normalizeClass({"top-optionGroup":!0,["top-optionGroup-showIndicator_"+Number(t.showIndicator)]:!0,"top-scrollBarXHidding":!0,["top-size_"+t.size]:!!t.size,"top-error":t.isError})},[Array.isArray(o.value)?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(t.items,a=>(e.openBlock(),e.createBlock(m._sfc_main$4,{class:e.normalizeClass({"top-optionGroup_item-selected":o.value.includes(a.value),"top-optionGroup_item":!0}),modelValue:o.value,"onUpdate:modelValue":r[0]||(r[0]=c=>o.value=c),value:a.value,title:a.title,disabled:a.disabled,isError:t.isError,"data-top-icon":a.icon},e.createSlots({_:2},[a.label?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.label),1)]),key:"0"}:void 0]),1032,["class","modelValue","value","title","disabled","isError","data-top-icon"]))),256)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(t.items,a=>(e.openBlock(),e.createBlock(m._sfc_main$5,{class:e.normalizeClass({"top-optionGroup_item-selected":a.value===o.value,"top-optionGroup_item":!0}),modelValue:o.value,"onUpdate:modelValue":r[1]||(r[1]=c=>o.value=c),name:i,value:a.value,title:a.title,disabled:a.disabled,isError:t.isError,"data-top-icon":a.icon},e.createSlots({_:2},[a.label?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.label),1)]),key:"0"}:void 0]),1032,["class","modelValue","value","title","disabled","isError","data-top-icon"]))),256))],2))}}),b=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},items:{},size:{},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue");return(l,n)=>(e.openBlock(),e.createBlock(V,{class:"top-radioGroup",modelValue:o.value,"onUpdate:modelValue":n[0]||(n[0]=i=>o.value=i),items:l.$props.items,size:l.$props.size,showIndicator:l.$props.showIndicator,isError:l.$props.isError},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},8,["modelValue","items","size","showIndicator","isError"]))}}),$=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue");return(l,n)=>(e.openBlock(),e.createBlock(V,{class:"top-checkboxGroup",modelValue:o.value,"onUpdate:modelValue":n[0]||(n[0]=i=>o.value=i),items:l.$props.items,size:l.$props.size,showIndicator:l.$props.showIndicator,isError:l.$props.isError},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},8,["modelValue","items","size","showIndicator","isError"]))}}),E=["data-top-icon"],w={class:"top-info_text"},C={key:0,class:"top-info_value"},T=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(t){return(o,l)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+t.size]:!0,["top-info-styling_"+t.styling]:!0}),"data-top-icon":t.icon},[e.createElementVNode("div",w,[e.renderSlot(o.$slots,"default")]),o.$slots.additional?(e.openBlock(),e.createElementBlock("span",C,[e.renderSlot(o.$slots,"additional")])):e.createCommentVNode("",!0)],10,E))}}),S={key:0,class:"top-policy"},g={class:"top-policy_title"},I=["innerHTML"],M=e.defineComponent({__name:"policy",props:{title:{},description:{},acceptText:{}},emits:["accept"],setup(t,{emit:o}){const l=o,n=e.ref(!0),i=()=>{n.value=!1,l("accept")};return(s,r)=>n.value?(e.openBlock(),e.createElementBlock("div",S,[e.createElementVNode("div",g,e.toDisplayString(t.title),1),e.createElementVNode("div",{class:"top-policy_description",innerHTML:t.description},null,8,I),e.createVNode(e.unref(m._sfc_main$1),{size:"m",onClick:i},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.acceptText),1)]),_:1})])):e.createCommentVNode("",!0)}});d.ITEM_ID_ALL=f.ITEM_ID_ALL,d.ITEM_ID_NEW=f.ITEM_ID_NEW,d.TopMenu=f._sfc_main$1,d.TopSelector2=f._sfc_main,d.apiSetSearchParamsFilter=f.apiSetSearchParamsFilter,d.TopCheckboxGroup=$,d.TopEditArea=k,d.TopEditInput=h,d.TopInfo=T,d.TopPolicy=M,d.TopRadioGroup=b,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=formsExt.amd.js.map
|