@topvisor/ui 1.5.6-topSelectorReactive.0 → 1.5.6-topSelectorReactive.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/api-DZQlrC2R.amd.js +2 -0
- package/.chunks/api-DZQlrC2R.amd.js.map +1 -0
- package/.chunks/{api-D5wIZnrK.esm.js → api-DZQlrC2R.esm.js} +21 -18
- package/.chunks/api-DZQlrC2R.esm.js.map +1 -0
- package/.chunks/{app-CQnQGya1.amd.js → app-DinkodXi.amd.js} +2 -2
- package/.chunks/{app-CQnQGya1.amd.js.map → app-DinkodXi.amd.js.map} +1 -1
- package/.chunks/{app-CQnQGya1.esm.js → app-DinkodXi.esm.js} +11 -11
- package/.chunks/app-DinkodXi.esm.js.map +1 -0
- package/.chunks/{datepicker-CYAhR3K9.amd.js → datepicker-bozIEbDA.amd.js} +2 -2
- package/.chunks/{datepicker-CYAhR3K9.amd.js.map → datepicker-bozIEbDA.amd.js.map} +1 -1
- package/.chunks/{datepicker-CYAhR3K9.esm.js → datepicker-bozIEbDA.esm.js} +2 -2
- package/.chunks/{datepicker-CYAhR3K9.esm.js.map → datepicker-bozIEbDA.esm.js.map} +1 -1
- package/.chunks/{dialog-B7DkbSQZ.amd.js → dialog-BCDVMWG1.amd.js} +2 -2
- package/.chunks/{dialog-B7DkbSQZ.amd.js.map → dialog-BCDVMWG1.amd.js.map} +1 -1
- package/.chunks/{dialog-B7DkbSQZ.esm.js → dialog-BCDVMWG1.esm.js} +3 -3
- package/.chunks/{dialog-B7DkbSQZ.esm.js.map → dialog-BCDVMWG1.esm.js.map} +1 -1
- package/.chunks/{dialog_regionSelectorRegions-DnDFRV42.amd.js → dialog_regionSelectorRegions-0M1fMu1a.amd.js} +2 -2
- package/.chunks/dialog_regionSelectorRegions-0M1fMu1a.amd.js.map +1 -0
- package/.chunks/{dialog_regionSelectorRegions-DnDFRV42.esm.js → dialog_regionSelectorRegions-0M1fMu1a.esm.js} +6 -6
- package/.chunks/dialog_regionSelectorRegions-0M1fMu1a.esm.js.map +1 -0
- package/.chunks/forms-CY5MOh7a.amd.js +2 -0
- package/.chunks/forms-CY5MOh7a.amd.js.map +1 -0
- package/.chunks/{forms-BiKUURH4.esm.js → forms-CY5MOh7a.esm.js} +16 -14
- package/.chunks/forms-CY5MOh7a.esm.js.map +1 -0
- package/.chunks/formsExt-C9r4Gz9y.amd.js +2 -0
- package/.chunks/formsExt-C9r4Gz9y.amd.js.map +1 -0
- package/.chunks/{formsExt-kZL0--bf.esm.js → formsExt-C9r4Gz9y.esm.js} +162 -162
- package/.chunks/formsExt-C9r4Gz9y.esm.js.map +1 -0
- package/.chunks/{mocker-C3O-c0Np.amd.js → mocker-Bl1SzAJY.amd.js} +2 -2
- package/.chunks/mocker-Bl1SzAJY.amd.js.map +1 -0
- package/.chunks/{mocker-C3O-c0Np.esm.js → mocker-Bl1SzAJY.esm.js} +6 -2
- package/.chunks/mocker-Bl1SzAJY.esm.js.map +1 -0
- package/.chunks/notice-bro62vCA.amd.js +4 -0
- package/.chunks/notice-bro62vCA.amd.js.map +1 -0
- package/.chunks/{notice-LFdPfo-5.esm.js → notice-bro62vCA.esm.js} +3 -3
- package/.chunks/notice-bro62vCA.esm.js.map +1 -0
- package/.chunks/popup-3cwJ8Hev.amd.js +2 -0
- package/.chunks/popup-3cwJ8Hev.amd.js.map +1 -0
- package/.chunks/{popup-KKfSSrM6.esm.js → popup-3cwJ8Hev.esm.js} +5 -3
- package/.chunks/popup-3cwJ8Hev.esm.js.map +1 -0
- package/.chunks/popup-CzhBQhVH.amd.js +2 -0
- package/.chunks/popup-CzhBQhVH.amd.js.map +1 -0
- package/.chunks/{popup-DB5g_8kB.esm.js → popup-CzhBQhVH.esm.js} +5 -5
- package/.chunks/popup-CzhBQhVH.esm.js.map +1 -0
- package/.chunks/punycode.es6-CMafsPEb.amd.js +2 -0
- package/.chunks/punycode.es6-CMafsPEb.amd.js.map +1 -0
- package/.chunks/punycode.es6-CMafsPEb.esm.js +105 -0
- package/.chunks/{punycode.es6-BZRFIj88.esm.js.map → punycode.es6-CMafsPEb.esm.js.map} +1 -1
- package/.chunks/store-DjQAOnrn.esm.js.map +1 -1
- package/.chunks/{utils-D4nhUVHm.amd.js → utils-Be-ScFyj.amd.js} +2 -2
- package/.chunks/{utils-D4nhUVHm.amd.js.map → utils-Be-ScFyj.amd.js.map} +1 -1
- package/.chunks/{utils-D4nhUVHm.esm.js → utils-Be-ScFyj.esm.js} +3 -3
- package/.chunks/{utils-D4nhUVHm.esm.js.map → utils-Be-ScFyj.esm.js.map} +1 -1
- package/.chunks/{utils-DKbnf1Th.amd.js → utils-ds_g-L_r.amd.js} +2 -2
- package/.chunks/{utils-DKbnf1Th.amd.js.map → utils-ds_g-L_r.amd.js.map} +1 -1
- package/.chunks/{utils-DKbnf1Th.esm.js → utils-ds_g-L_r.esm.js} +4 -4
- package/.chunks/{utils-DKbnf1Th.esm.js.map → utils-ds_g-L_r.esm.js.map} +1 -1
- package/.chunks/{worker-BufdAd-a.amd.js → worker-Bv_yPPMv.amd.js} +2 -2
- package/.chunks/{worker-BufdAd-a.amd.js.map → worker-Bv_yPPMv.amd.js.map} +1 -1
- package/.chunks/{worker-BufdAd-a.esm.js → worker-Bv_yPPMv.esm.js} +3 -3
- package/.chunks/{worker-BufdAd-a.esm.js.map → worker-Bv_yPPMv.esm.js.map} +1 -1
- package/api/additional.js.map +1 -1
- package/api/index.amd.js +1 -1
- package/api/index.amd.js.map +1 -1
- package/api/index.js +1 -1
- package/assets/formsExt.css +1 -1
- package/assets/project.css +1 -1
- package/autoload-css-manifest.amd.json +4 -4
- package/autoload-css-manifest.json +4 -4
- 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 +3 -3
- package/dialog/dialog.amd.js +1 -1
- package/dialog/dialog.amd.js.map +1 -1
- package/dialog/dialog.js +2 -2
- package/forms/forms.amd.js +1 -1
- package/forms/forms.amd.js.map +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 +1 -1
- package/layout/layout.amd.js +1 -1
- package/layout/layout.amd.js.map +1 -1
- package/layout/layout.js +1 -1
- package/package.json +2 -2
- package/popup/popup.amd.js +1 -1
- package/popup/popup.amd.js.map +1 -1
- package/popup/popup.js +1 -1
- package/popup/worker.amd.js +1 -1
- package/popup/worker.amd.js.map +1 -1
- package/popup/worker.js +1 -1
- package/project/project.amd.js +1 -1
- package/project/project.amd.js.map +1 -1
- package/project/project.js +458 -459
- package/project/project.js.map +1 -1
- package/schedule/schedule.amd.js +1 -1
- package/schedule/schedule.amd.js.map +1 -1
- package/schedule/schedule.js +8 -6
- package/schedule/schedule.js.map +1 -1
- package/src/api/api/mocker/index.d.ts +1 -6
- package/src/api/api/types/api.d.ts +1 -1
- package/src/components/formsExt/selector2/composables/useAPI.d.ts +406 -0
- package/src/components/formsExt/selector2/composables/useMenu.d.ts +412 -0
- package/src/components/formsExt/selector2/types.d.ts +17 -11
- package/src/components/popup/popup/types.d.ts +6 -1
- package/src/components/project/project.d.ts +1 -1
- package/src/components/project/projectSelector/cache.d.ts +14 -12
- package/src/components/project/projectSelector/submenu/types.d.ts +7 -14
- package/src/components/project/projectSelector/types.d.ts +22 -9
- package/src/components/project/projectSelector/utils.d.ts +8 -4
- package/src/core/core/core.d.ts +2 -3
- package/src/core/core/options.d.ts +26 -19
- package/src/core/core/state.d.ts +3 -4
- package/src/core/plugins/core.d.ts +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.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.amd.js.map +1 -1
- package/utils/date.js +1 -1
- package/utils/device.amd.js +1 -1
- package/utils/device.amd.js.map +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 +1 -1
- package/utils/image.amd.js.map +1 -1
- package/utils/image.js +1 -1
- package/utils/lodash.amd.js +1 -1
- package/utils/lodash.amd.js.map +1 -1
- package/utils/lodash.js +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.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 +1 -1
- package/utils/searchers.js.map +1 -1
- package/utils/string.amd.js +1 -1
- package/utils/string.amd.js.map +1 -1
- package/utils/string.js +2 -2
- package/utils/string.js.map +1 -1
- package/utils/url.amd.js +1 -1
- package/utils/url.amd.js.map +1 -1
- package/utils/url.js +1 -1
- package/utils/url.js.map +1 -1
- package/.chunks/api-D5wIZnrK.amd.js +0 -2
- package/.chunks/api-D5wIZnrK.amd.js.map +0 -1
- package/.chunks/api-D5wIZnrK.esm.js.map +0 -1
- package/.chunks/app-CQnQGya1.esm.js.map +0 -1
- package/.chunks/dialog_regionSelectorRegions-DnDFRV42.amd.js.map +0 -1
- package/.chunks/dialog_regionSelectorRegions-DnDFRV42.esm.js.map +0 -1
- package/.chunks/forms-BiKUURH4.amd.js +0 -2
- package/.chunks/forms-BiKUURH4.amd.js.map +0 -1
- package/.chunks/forms-BiKUURH4.esm.js.map +0 -1
- package/.chunks/formsExt-kZL0--bf.amd.js +0 -2
- package/.chunks/formsExt-kZL0--bf.amd.js.map +0 -1
- package/.chunks/formsExt-kZL0--bf.esm.js.map +0 -1
- package/.chunks/mocker-C3O-c0Np.amd.js.map +0 -1
- package/.chunks/mocker-C3O-c0Np.esm.js.map +0 -1
- package/.chunks/notice-LFdPfo-5.amd.js +0 -4
- package/.chunks/notice-LFdPfo-5.amd.js.map +0 -1
- package/.chunks/notice-LFdPfo-5.esm.js.map +0 -1
- package/.chunks/popup-DB5g_8kB.amd.js +0 -2
- package/.chunks/popup-DB5g_8kB.amd.js.map +0 -1
- package/.chunks/popup-DB5g_8kB.esm.js.map +0 -1
- package/.chunks/popup-KKfSSrM6.amd.js +0 -2
- package/.chunks/popup-KKfSSrM6.amd.js.map +0 -1
- package/.chunks/popup-KKfSSrM6.esm.js.map +0 -1
- package/.chunks/punycode.es6-BZRFIj88.amd.js +0 -2
- package/.chunks/punycode.es6-BZRFIj88.amd.js.map +0 -1
- package/.chunks/punycode.es6-BZRFIj88.esm.js +0 -105
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { Props } from '../../formsExt/selector2/types';
|
|
2
|
+
import { Item, Project } from './types';
|
|
2
3
|
import { paths } from 'topvisor-openapi/src/ts/Topvisor';
|
|
3
4
|
import { components } from 'topvisor-openapi/src/ts/TV/API/Types/UrlShort';
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
+
* Сгенерировать элемент для TopSelector
|
|
6
7
|
*/
|
|
7
|
-
export declare const
|
|
8
|
+
export declare const genProjectItem: (project: Project) => Item;
|
|
9
|
+
export declare const navigateToProject: (projectId: number) => void;
|
|
8
10
|
/**
|
|
9
|
-
* Сгенерировать ссылку на
|
|
11
|
+
* Сгенерировать ссылку на страницу проекта с инструментом
|
|
12
|
+
*
|
|
13
|
+
* @note Ссылка сейчас пересчитывается только в момент открытия меню
|
|
10
14
|
*/
|
|
11
|
-
export declare const
|
|
15
|
+
export declare const genLinkToProjectMod: (projectId: number) => string;
|
|
12
16
|
/**
|
|
13
17
|
* Вернуть базовый хост без поддомена
|
|
14
18
|
*/
|
package/src/core/core/core.d.ts
CHANGED
|
@@ -11,10 +11,9 @@ export default class Core {
|
|
|
11
11
|
documentClassModificators: Map<string | number, string> & Omit<Map<string | number, string>, keyof Map<any, any>>;
|
|
12
12
|
dateFormat: string;
|
|
13
13
|
currency: "USD" | "RUB" | "EUR";
|
|
14
|
-
|
|
15
|
-
id: number;
|
|
16
|
-
};
|
|
14
|
+
userId: number;
|
|
17
15
|
timezoneOffset: number;
|
|
16
|
+
closedByMod: Record<string, boolean>;
|
|
18
17
|
showGlobalRegionForKeywordsStats: boolean;
|
|
19
18
|
forceSearchersKeysForKeywordsStats: number[];
|
|
20
19
|
isMobile: boolean;
|
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Конфигурация UI
|
|
3
3
|
*
|
|
4
|
-
* Начальные
|
|
4
|
+
* Начальные значения устанавливаются при подключении Core во Vue приложение через app.use(PluginCore, options)
|
|
5
5
|
*/
|
|
6
6
|
declare const _default: {
|
|
7
|
-
/**
|
|
8
|
-
* Имя темы оформления
|
|
9
|
-
*
|
|
10
|
-
* В данный момент не используется для загрузки css
|
|
11
|
-
*
|
|
12
|
-
* @todo Реализовать загрузки и замену css темы на стороне UI
|
|
13
|
-
*
|
|
14
|
-
* @see https://ui.topvisor.com/?path=/docs/core-theme--docs
|
|
15
|
-
*/
|
|
16
|
-
themeName: "light" | "dark" | string;
|
|
17
7
|
/**
|
|
18
8
|
* CSS-классы модификаторы для документа страницы
|
|
19
9
|
*
|
|
@@ -24,6 +14,16 @@ declare const _default: {
|
|
|
24
14
|
* - Значение - класс модификатора
|
|
25
15
|
*/
|
|
26
16
|
documentClassModificators: Map<string | number, string>;
|
|
17
|
+
/**
|
|
18
|
+
* Имя темы оформления
|
|
19
|
+
*
|
|
20
|
+
* В данный момент не используется для загрузки css
|
|
21
|
+
*
|
|
22
|
+
* @todo Реализовать загрузки и замену css темы на стороне UI
|
|
23
|
+
*
|
|
24
|
+
* @see https://ui.topvisor.com/?path=/docs/core-theme--docs
|
|
25
|
+
*/
|
|
26
|
+
themeName: "light" | "dark" | string;
|
|
27
27
|
/**
|
|
28
28
|
* Базовая ширина страницы для отображения ПК / Мобильной версии сайта
|
|
29
29
|
*
|
|
@@ -31,24 +31,31 @@ declare const _default: {
|
|
|
31
31
|
*/
|
|
32
32
|
widthForMobile: number;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* Id авторизованного пользователя
|
|
35
|
+
*
|
|
36
|
+
* `-1` - означает, что пользователь не авторизован
|
|
37
|
+
*/
|
|
38
|
+
userId: number;
|
|
39
|
+
/**
|
|
40
|
+
* Текущий пользователь
|
|
35
41
|
*/
|
|
36
42
|
dateFormat: string;
|
|
37
43
|
/**
|
|
38
44
|
* Валюта, которая будет использоваться по умолчанию, как правило, зависит от текущего пользователя
|
|
39
45
|
*/
|
|
40
46
|
currency: "RUB" | "USD" | "EUR";
|
|
41
|
-
/**
|
|
42
|
-
* Текущий пользователь
|
|
43
|
-
*/
|
|
44
|
-
user: {
|
|
45
|
-
id: number;
|
|
46
|
-
};
|
|
47
47
|
/**
|
|
48
48
|
* Смещение timezone относительно UTC в минутах
|
|
49
|
-
*
|
|
49
|
+
*
|
|
50
|
+
* Для Москвы: `-180`
|
|
50
51
|
*/
|
|
51
52
|
timezoneOffset: number;
|
|
53
|
+
/**
|
|
54
|
+
* Модули, которые необходимо скрыть
|
|
55
|
+
*
|
|
56
|
+
* Для компонентов, связанных с навигацией, например `TopProjectSelector`
|
|
57
|
+
*/
|
|
58
|
+
closedByMod: Record<string, boolean>;
|
|
52
59
|
/**
|
|
53
60
|
* Нужно ли в компонентах, связанных с выводом статистика запросов отображать регион `Без региона`
|
|
54
61
|
*
|
package/src/core/core/state.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* State UI для
|
|
2
|
+
* State UI для взаимодействия с приложениями Vue
|
|
3
3
|
*/
|
|
4
4
|
declare const state: {
|
|
5
5
|
/**
|
|
@@ -8,10 +8,9 @@ declare const state: {
|
|
|
8
8
|
documentClassModificators: Map<string | number, string>;
|
|
9
9
|
dateFormat: string;
|
|
10
10
|
currency: "USD" | "RUB" | "EUR";
|
|
11
|
-
|
|
12
|
-
id: number;
|
|
13
|
-
};
|
|
11
|
+
userId: number;
|
|
14
12
|
timezoneOffset: number;
|
|
13
|
+
closedByMod: Record<string, boolean>;
|
|
15
14
|
showGlobalRegionForKeywordsStats: boolean;
|
|
16
15
|
forceSearchersKeysForKeywordsStats: number[];
|
|
17
16
|
/**
|
|
@@ -41,7 +41,7 @@ declare module '@vue/runtime-core' {
|
|
|
41
41
|
TopDialogs: typeof TopDialogs;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
-
type CoreOptions = PartialBy<typeof coreDefaultOptions, '
|
|
44
|
+
type CoreOptions = PartialBy<typeof coreDefaultOptions, 'documentClassModificators' | 'userId' | 'timezoneOffset' | 'closedByMod' | 'showGlobalRegionForKeywordsStats' | 'forceSearchersKeysForKeywordsStats'>;
|
|
45
45
|
type Options = CoreOptions & {
|
|
46
46
|
topPopupOptions?: TopPopupOptions;
|
|
47
47
|
topDialogOptions?: TopDialogOptions;
|
package/tabsView/tabsView.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define([`require`,`exports`,`../.chunks/forms-
|
|
1
|
+
define([`require`,`exports`,`../.chunks/forms-CY5MOh7a.amd`,`../utils/system.amd`,`../utils/route.amd`,`../.chunks/store-DjQAOnrn.amd`,`../.chunks/popup-3cwJ8Hev.amd`,`vue`,`../require/css.amd!../assets/tabsView.css`],function(e,t,n,r,i,a,o,s){"use strict";if(c===void 0)var c=window.Vue;Object.defineProperty(t,"__esModule",{value:!0}),t.TopTabsViewMenuTitle=t.TopTabsViewMenuItem=t.TopTabsView=void 0;var l=(e,t)=>`top:${String(e)}:${t}`,u={loadLocalStorge:(e,t)=>{if(!t.$id)return;let n=l(e,t.$id);try{let r=JSON.parse(localStorage.getItem(n));typeof r==typeof t[e]&&(t[e]=r)}catch{console.warn(Error(`В localStorage[${n}] не корректный json`))}},addSaverLocalStorge:(e,t)=>{if(!t.$id)return;let n=l(e,t.$id);(0,s.watch)(()=>t[e],()=>{localStorage.setItem(n,JSON.stringify(t[e]))},{immediate:!0})}},d=new Set;addEventListener(`popstate`,e=>{d.forEach(t=>t(e))});var f=Symbol(),p=(e,t)=>{let r=(0,a.t)(f,()=>({showMenuInPopup:(0,s.computed)(()=>e.showMenuInPopup??n.O.state.isMobile),pageMod:(0,s.computed)(()=>e.pageMod),isShort:(0,s.ref)(!1),activeItemName:t,component:(0,s.ref)(void 0),scrollable:(0,s.ref)(!0)}),e.idState);if(e.isShortable){let e=`isShort`;u.loadLocalStorge(e,r),u.addSaverLocalStorge(e,r)}return r.$id&&d.add(e=>{t.value=(0,i.getHash)(r.$id)}),r},m=()=>(0,a.r)(f),h={key:1,class:`top-ellipsis`},g=(0,s.defineComponent)({__name:`menuItem`,props:{name:{},href:{},icon:{},disabled:{type:Boolean},component:{default:void 0},scrollable:{type:Boolean,default:!0}},setup(e){let t=e,n=m(),r=(0,s.computed)(()=>t.name&&n.$id?(0,i.genHash)(n.$id,t.name):t.href),a=(0,s.computed)(()=>n.showMenuInPopup?o.o:r.value?`a`:`button`),c=e=>{!t.href&&r.value&&e.preventDefault(),t.name&&(n.activeItemName=t.name)};return(t,i)=>((0,s.openBlock)(),(0,s.createBlock)((0,s.resolveDynamicComponent)(a.value),{target:`_self`,class:(0,s.normalizeClass)({"top-tabsView_menuItem":!(0,s.unref)(n).showMenuInPopup,"top-active":e.name&&(0,s.unref)(n).activeItemName===e.name,"top-disabled":e.disabled,"top-spa-disabled":!0}),href:r.value,"data-top-icon":e.icon||void 0,disabled:e.disabled||void 0,onClick:c},{default:(0,s.withCtx)(()=>[(0,s.unref)(n).showMenuInPopup?(0,s.renderSlot)(t.$slots,`default`,{key:0}):t.$slots.default&&!(0,s.unref)(n).isShort?((0,s.openBlock)(),(0,s.createElementBlock)(`span`,h,[(0,s.renderSlot)(t.$slots,`default`)])):(0,s.createCommentVNode)(``,!0)]),_:3},8,[`class`,`href`,`data-top-icon`,`disabled`]))}}),_=e=>e?.name===`AsyncComponentWrapper`&&!e?.__asyncResolved,v=async(e,t)=>{e?.name===`AsyncComponentWrapper`&&(e?.__asyncResolved||(e.__asyncLoader(),await(0,r.sleepWhile)(()=>t()&&_(e),200)))},y={class:`top-tabsView_menuOpener`},b=[`data-top-icon`],x={class:`top-ellipsis`},S={class:`top-tabsView_menuList`},C={key:0,class:`top-tabsView_menuFooter`},w=(0,s.defineComponent)({__name:`menu`,props:(0,s.mergeModels)({isShortable:{type:Boolean},isLoading:{type:Boolean}},{isLoading:{},isLoadingModifiers:{}}),emits:[`update:isLoading`],setup(e){let t=(0,s.useModel)(e,`isLoading`),n=m(),r=(0,s.useSlots)(),a=new Map,c=()=>{if(!r.default)return;let e=r.default({}).find(e=>e.key===`_menu`);e&&l(e.children)},l=e=>{e.forEach(e=>{if(e.type.__name&&e.type.__name!==g.__name)return;if(!e.type.__name&&typeof e.children==`object`){l(e.children);return}if(!e.props?.name||e.props?.disabled)return;let t={title:(e.children.default?.()[0].children).trim(),icon:e.props.icon,component:e.props.component?(0,s.markRaw)(e.props.component):g.props.component.default,scrollable:e.props.scrollable??g.props.scrollable.default};a.set(e.props.name,t)})},u=(0,s.ref)(null),d=0;return(0,s.watch)(()=>n.activeItemName,async()=>{let e=++d;if(a.size===0&&c(),a.size===0){n.activeItemName=``;return}if(u.value=a.get(n.activeItemName)??null,!u.value&&n.$id){let e=(0,i.getHash)(n.$id);if(u.value=a.get(e)??null,u.value){n.activeItemName=e;return}}if(!u.value){n.activeItemName=a.keys().next().value;return}if(u.value.component===n.component){t.value=!1;return}n.$id&&(0,i.setHash)(n.$id,n.activeItemName,!1),t.value=!0,await v(u.value.component,()=>e===d),e===d&&(n.scrollable=u.value.scrollable,n.component=u.value.component,u.value&&!n.component&&console.warn(`Компонент вкладки ${n.activeItemName} не найден. Добавьте props.component для пункта меню ${n.activeItemName}.`))},{immediate:!0}),(t,r)=>((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{class:(0,s.normalizeClass)({"top-tabsView_menu":!0,"top-tabsView_menu-inPopup_0":!(0,s.unref)(n).showMenuInPopup,"top-tabsView_menu-inPopup_1":(0,s.unref)(n).showMenuInPopup,"top-tabsView_menu-short":(0,s.unref)(n).isShort&&!(0,s.unref)(n).showMenuInPopup})},[(0,s.unref)(n).showMenuInPopup?((0,s.openBlock)(),(0,s.createBlock)((0,s.unref)(o.s),{key:0},{opener:(0,s.withCtx)(()=>[(0,s.createElementVNode)(`div`,y,[u.value?((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{key:0,class:`top-tabsView_menuOpenerActiveItem`,"data-top-icon":u.value.icon},[(0,s.createElementVNode)(`span`,x,(0,s.toDisplayString)(u.value.title),1)],8,b)):(0,s.createCommentVNode)(``,!0),r[1]||=(0,s.createElementVNode)(`div`,{class:`top-tabsView_menuOpenerIcon`,"data-top-icon":``},null,-1)])]),contentList:(0,s.withCtx)(()=>[(0,s.renderSlot)(t.$slots,`default`)]),_:3})):((0,s.openBlock)(),(0,s.createElementBlock)(s.Fragment,{key:1},[(0,s.createElementVNode)(`div`,S,[(0,s.renderSlot)(t.$slots,`default`)]),e.isShortable?((0,s.openBlock)(),(0,s.createElementBlock)(`div`,C,[e.isShortable?((0,s.openBlock)(),(0,s.createBlock)(g,{key:0,icon:(0,s.unref)(n).isShort?``:``,onClick:r[0]||=e=>(0,s.unref)(n).isShort=!(0,s.unref)(n).isShort},{default:(0,s.withCtx)(()=>[(0,s.createTextVNode)((0,s.toDisplayString)((0,s.unref)(n).isShort?``:`Свернуть`),1)]),_:1},8,[`icon`])):(0,s.createCommentVNode)(``,!0)])):(0,s.createCommentVNode)(``,!0)],64))],2))}}),T=(0,s.defineComponent)({__name:`tabsView`,props:(0,s.mergeModels)({modelValue:{},pageMod:{type:Boolean},showMenuInPopup:{type:Boolean,default:void 0},isShortable:{type:Boolean,default:!1},idState:{}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,r=p(t,(0,s.useModel)(e,`modelValue`)),a=Math.random();t.pageMod&&n.O.state.documentClassModificators.set(a,`top-hasTabsViewPageMod`),(0,s.onUnmounted)(()=>{t.pageMod&&n.O.state.documentClassModificators.delete(a),r.$id&&(0,i.delHash)(r.$id,r.activeItemName,!0)});let o=(0,s.ref)(),c=(0,s.ref)(!1);return(0,s.watch)([o,()=>r.component],()=>{c.value=_(r.component)},{immediate:!0}),(i,a)=>((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{class:(0,s.normalizeClass)({"top-tabsView":!0,"top-tabsView-pageMod":t.pageMod,"top-tabsView-inPopup":(0,s.unref)(r).showMenuInPopup})},[(0,s.createVNode)(w,{isShortable:e.isShortable,isLoading:c.value,"onUpdate:isLoading":a[0]||=e=>c.value=e},{default:(0,s.withCtx)(()=>[(0,s.renderSlot)(i.$slots,`menu`)]),_:3},8,[`isShortable`,`isLoading`]),(0,s.createElementVNode)(`div`,{class:(0,s.normalizeClass)({"top-tabsView_contents":!0,"top-tabsView_contents-isLoading":c.value,"top-tabsView_contents-noScrollable":!(0,s.unref)(r).scrollable})},[c.value?((0,s.openBlock)(),(0,s.createBlock)(n.l,{key:0})):(0,s.createCommentVNode)(``,!0),((0,s.openBlock)(),(0,s.createBlock)(s.KeepAlive,null,[((0,s.openBlock)(),(0,s.createBlock)((0,s.resolveDynamicComponent)((0,s.unref)(r).component),{ref_key:`componentRef`,ref:o},null,512))],1024))],2)],2))}}),E={},D={class:`top-tabsView_menuDelimeter`};t.TopTabsViewMenuItem=g,t.TopTabsView=T;function O(e,t){return(0,s.openBlock)(),(0,s.createElementBlock)(`div`,D)}var k=(0,n.u)(E,[[`render`,O]]);t.TopTabsViewMenuTitle=(0,s.defineComponent)({__name:`menuTitle`,props:{isSubtitle:{type:Boolean}},setup(e){let t=m();return(n,r)=>(0,s.unref)(t).showMenuInPopup?((0,s.openBlock)(),(0,s.createBlock)((0,s.unref)(o.o),{key:0,type:`title`},{default:(0,s.withCtx)(()=>[(0,s.renderSlot)(n.$slots,`default`)]),_:3})):(0,s.unref)(t).isShort?((0,s.openBlock)(),(0,s.createBlock)(k,{key:1})):((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{key:2,class:(0,s.normalizeClass)({"top-tabsView_menuTitle":!0,"top-tabsView_menuTitle-subtitle":e.isSubtitle})},[(0,s.renderSlot)(n.$slots,`default`)],2))}})});
|
|
2
2
|
//# sourceMappingURL=tabsView.amd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["tabsView/tabsView.js","../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue"],"names":["vue","exports","I","L","vue_1","R","z","B","store_DjQAOnrn_esm_js_1","t","forms_BiKUURH4_esm_js_1","n","route_js_1","V","H","U","i","popup_KKfSSrM6_esm_js_1","o","W","G","system_js_1","K","q","J","Y","X","Z","a","c","l","u","Q","r","s","e","$","ee","te","ne"],"mappings":"AAAA,OAAO,CAAC,UAAW,UAAW,gCAAoC,sBAAsB,qBAAqB,gCAAoC,gCAAoC,MAAK,2CAAA,EAAA,SAAa,EAAS,EAAS,EAAyB,EAAa,EAAY,EAAyB,EAAyB,EAAO,CAChU,aAAA,GAAAA,IAAA,OAAA,IAAAA,EAAA,OAAA,IACA,OAAO,eAAeC,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,EAAQ,qBAAuB,EAAQ,oBAAsB,EAAQ,YAAc,IAAK,GAExF,IAAIC,GAAK,EAAG,IAAM,OAAO,OAAO,CAAC,EAAE,GAAG,IAAKC,EAAI,CAC3C,iBAAkB,EAAG,IAAM,CCEyB,GAAA,CAAA,EAGpD,IA0CP,OAhCW,IAAK,EAAAD,EAAA,EAAA,EAAA,GAAA,EAEsB,GAAW,CAE7C,IAAA,EAAA,KAAA,MAAA,aAAA,QAAA,CAAA,CAAA,EAC8D,OAAM,GAAA,OAAa,EAAA,KAAuB,EAAW,GAAA,EAE3G,MAGA,CACE,QAAA,KAAU,MAAA,kBAAkC,EAAA,qBAAsB,CAAA,CAChF,CACD,EAoBC,qBAbiE,EAAa,IAAA,CAEnE,GAAK,CAAA,EAAA,IAEiC,OAE/B,IAAA,EAAAA,EAAkB,EAAA,EAAA,GAAA,GACnC,EAAaE,EAAA,MAAyB,KAAK,EAAA,OAA2B,CAClE,aAAiB,QAAA,EAAA,KAAA,UAAA,EAAA,EAAA,CAAA,CACvB,EAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CC1CM,CAEN,EAAAC,EAAiB,IAAa,IACX,iBAA8C,WAAC,GAAA,CACjEA,EAAA,QAAA,GAAA,EAAA,CAAA,CAAA,CAEY,CAAA,EAMZ,IAAMC,EAAoB,OAAA,EAQlBC,GAAA,EAAA,IAAA,CACN,IAAA,GAAA,EARuBC,EAAqB,EAAA,CAAAF,OAA8B,CAC3D,iBAQf,EAAAF,EAAA,SAAA,KAAAK,EAAA,iBAAAC,EAAA,EAAA,MAAA,QAAA,EAPe,SAQf,EAAAN,EAAA,SAAA,KAAAK,EAAA,OAAA,EACA,SAAgB,EAAAL,EAAA,IAAA,CAAA,CAAA,CAAA,EAChB,eAAAO,EACA,WAAA,EAAAP,EAAA,IAAA,CAAA,IAAA,EAAA,EAEO,YAAO,EAAAA,EAAA,IAAA,CAAA,CAAA,CAAA,CAEN,GAAAK,EAAA,OAAa,EAChB,GAAYA,EAAA,YAAA,CAEA,IAAA,EAAgB,UAEnCN,EAAA,gBAAA,EAAA,CAAA,EAAAA,EAAA,oBAAA,EAAA,CAAA,CAEI,CAEI,OAAgB,EAAM,KAAIE,EAAA,IAAA,GAAA,CAM3B,EAAA,OAAA,EAAAO,EAAA,QAAA,CAAA,EAAA,GAAA,CAMK,CAAA,EAAA,CFbT,EAAGC,OAAW,EAAGL,EAAwB,EAAC,CAAEF,CAAC,EAAGQ,EAAI,CAChD,IAAK,EACL,MAAO,cACX,EAAGC,GAAqB,EAAGX,EAAM,gBAAe,CAAE,CAC9C,OAAQ,WACR,MAAO,CACH,KAAM,CAAC,EACP,KAAM,CAAC,EACP,KAAM,CAAC,EACP,SAAU,CAAE,KAAM,OAAQ,EAC1B,UAAW,CAAE,QAAS,IAAK,EAAE,EAC7B,WAAY,CACR,KAAM,QACN,QAAS,CAAC,CACd,CACJ,EGtDF,MAKA,EAAQ,CAwBF,IAAa,EAAA,EAAA,EACrBS,EAAA,EAAA,GAAA,EAAAT,EAGC,SAAM,KACH,EAAA,MAAA,EAAA,KAAuB,EAAAQ,EAAA,QAAA,CAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAAI,GAAA,EAAAZ,EAAA,SAAA,KAAA,EAAA,gBAAAa,EAAA,EAAA,EAAA,MAAA,IAAA,QAAA,EAAAC,EAAA,GAAA,CAE/B,CAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,KHsBY,EGhBH,OAAA,EAAA,MAAA,EAAAd,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,EAAA,EAAAA,EAAA,wBAAA,CAAAY,EAAA,KAAA,EAAA,CACD,OAAA,QHkBQ,OAAQ,EAAGZ,EGlBgB,eAAM,CAAA,CAAoC,wBAAc,EAAA,EAAAA,EAAmB,MAAA,CAAA,CAAA,CAAA,CAAA,gBAA2B,aAAA,EAAA,OAAA,EAAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,iBAAA,EAAA,KHqB7H,eAAgB,EAAE,SAClB,mBAAoB,CAAC,CGhBhC,CAAA,EACN,KAAe,EAAA,MACL,gBAAY,EAAA,MAAA,IAAA,GACf,SAAA,EAAA,UAAA,IAAA,GHkBM,QAASc,CACb,EAAG,CACC,SAAU,EAAGd,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,MAAK,CAAE,CAAC,CAAC,CAAC,iBAAmB,EAAGA,EAAM,WAAU,CAAE,EAAE,OAAQ,UAAW,CAAE,IAAK,CAAE,CAAC,EAAI,EAAE,OAAO,SAAW,EAAE,EAAGA,EAAM,MAAK,CAAE,CAAC,CAAC,CAAC,UAAY,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAE,OAAQU,EAAG,EAAE,EAAGV,EAAM,WAAU,CAAE,EAAE,OAAQ,SAAS,CAAC,CAAC,IAAM,EAAGA,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CAAC,CAAC,EAC9U,EAAG,CACP,EAAG,EAAG,CACF,QACA,OACA,gBACA,UACJ,CAAC,EI9EA,CAUG,CAAA,EAAAe,EAAS,GAAA,GAAA,OAAA,yBACT,CAAA,GAAA,gBAELC,EAEV,MAAM,EAAA,IACY,CAEnB,GAAA,OAAA,0BAAA,GAAA,kBAAA,EAAA,cAAA,EAAA,MAAA,EAAAC,EAAA,WAAA,KAAA,EAAA,GAAAF,EAAA,CAAA,EAAA,GAAA,GJgEI,EAAGG,EAAI,CAAE,MAAO,yBAA0B,EAAGC,EAAI,CAAC,eAAe,EAAGC,EAAI,CAAE,MAAO,cAAe,EAAGC,EAAI,CAAE,MAAO,uBAAwB,EAAGC,EAAI,CAC3I,IAAK,EACL,MAAO,yBACX,EAAGC,GAAqB,EAAGvB,EAAM,gBAAe,CAAE,CAC9C,OAAQ,OACR,OAAsB,EAAGA,EAAM,YAAW,CAAE,CACxC,YAAa,CAAE,KAAM,OAAQ,EAC7B,UAAW,CAAE,KAAM,OAAQ,CAC/B,EAAG,CACC,UAAW,CAAC,EACZ,mBAAoB,CAAC,CACzB,CAAC,EACD,MAAO,CAAC,kBAAkB,EKzF5B,MAAuB,EAAC,CAWlB,IAAA,GAAS,EAAAA,EAAA,SAAA,CAAA,EAAA,WAAA,EAAA,EAAAS,EAAA,EAAA,GAAA,EAAAT,EAAA,SAAA,CAAA,EAAAY,EAAA,IAAA,IAAAY,MAAA,CAES,GAAA,CAAQ,EAAE,QAGM,OAIa,IAAA,EAAA,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA,KAAA,GAAA,EAAA,MAAA,OAAA,EACvC,GAAsBC,EAAA,EAAA,QAAA,CAEvB,EAAKA,EAAA,GAAU,CAGT,EAAA,QAAU,GAAO,CACS,GAAA,EAAA,KAAA,QAAA,EAAA,KAAA,SAAAd,EAAA,OAEhD,OACD,GAAA,CAAA,EAAA,KAAA,QAAA,OAAA,EAAA,UAAA,SAAA,CAEyBc,EAAQ,EAAa,QAAO,EAE1B,MACL,CACI,GAAA,CAAA,EAAA,OAAA,MAAA,EAAA,OAAA,SACK,OACL,IAAA,EAAM,CAChC,OAAA,EAAA,SAAA,UAAA,CAAA,CAAA,EAAA,CAAA,SAAA,CAAA,KAAA,EAE4C,KAAQ,EAAA,MAAA,KACpD,UAAA,EAAA,MAAA,WAAA,EAAAzB,EAAA,QAAA,CAAA,EAAA,MAAA,SAAA,EAAAW,EAAA,MAAA,UAAA,QAciB,WAAA,EAAA,MAAA,YAAAA,EAAA,MAAA,WAAA,OAQN,EAEaC,EAAA,IAAA,EAAA,MAAA,KAAA,CAAA,CAEL,CAAA,CAKZ,EAAAc,GAAA,EAAiB1B,EAAA,IAAA,CAAA,IAAA,EAAA2B,EAAA,EAEvB,OAAA,EAAA3B,EAAA,MAAA,KAAA,EAAA,eAAA,SAAA,CACD,IAAA,EAAA,EAAA2B,EAEe,GAAuBf,EAAA,OAAU,GAAAY,EAAA,EAAcZ,EAAA,OAGzD,EAAe,CACqB,EAAA,eAAA,GAEF,MAG/B,CAEN,GAAA,EAAA,MAAAA,EAAA,IAAA,EAAA,cAAA,GAAA,KAAA,CAAAc,EAAA,OAAA,EAAA,IAAA,CACD,IAAA,GAAA,EAAAlB,EAAA,QAAA,CAAA,EAAA,GAAA,EACD,GAAA,EAAA,MAAAI,EAAA,IAAA,CAAA,GAAA,KAAAc,EAAA,MAAA,CAG2B,EAAA,eAAA,EACH,MAEvB,CACD,CAGyB,GAAA,CAAAA,EAAA,MAAc,CACpB,EAAA,eAAAd,EAAA,KAAA,CAAA,CAAA,KAAA,CAAA,CAAA,MAElB,MACD,CAE6B,GAAAc,EAAK,MAAM,YAAqB,EAG7D,UAAkB,CAqBN,EACd,MAAA,CAAA,ELEoB,MACJ,CACA,EAAE,MAAQ,EAAGlB,EKE+G,QAAA,CAAA,EAAA,IAAA,EAAA,eAAA,CAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EAAA,MAAAQ,EAAAU,EAAA,MAAA,cAAA,IAAAC,CAAA,EAAA,IAAAA,IAAA,EAAA,WAAAD,EAAA,MAAA,WAAA,EAAA,UAAAA,EAAA,MAAA,UAAAA,EAAA,OAAA,CAAA,EAAA,WAAA,QAAA,KAAA,qBAAA,EAAA,eAAA,uDAAA,EAAA,eAAA,EAAA,ELDhI,EAAG,CAAE,UAAW,CAAC,CKC8J,CAAA,GAAM,EAAA,MAAY,EAAA1B,EAAM,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAA,CAAA,OAAA,EAAAA,EAAA,eAAA,CAAA,CAQ3L,oBAoBX,CAAA,EAlBT,8BASO,EAAA,EAAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,gBLjBS,+BAAgC,EAAGA,EAAM,MAAK,CAAE,CAAC,CAAC,CAAC,gBKW3D,2BAAA,EAAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,SAAA,EAAA,EAAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,eACL,CAAA,CAAA,EAAe,EAAA,EAAAA,EAAe,MAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,EAAA,EAAAA,EAAA,MAAA,CAAAa,EAAA,CAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAIxB,QADH,EAAeb,EAAK,QAAA,KAAA,EAAA,EAAAA,EAAA,mBAIwC,CAAA,MAAAkB,EAAA,CAAAQ,EAAA,QAAA,EAAA1B,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAA,CAAtD,IAAA,EAA4C,MAAA,oCLb5B,gBAAiB0B,EAAE,MAAM,IKkBxC,EAAA,EAAA,EAAA1B,EAAA,mBAAA,CAAA,OAAAoB,GAAA,EAAApB,EAAA,gBAAA,CAAA0B,EAAA,MAAA,KAAA,EAAA,CAAA,CAAA,EAAA,EAAAP,CAAA,IAAA,EAAAnB,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,EAAA,EAAA,MAAA,EAAAA,EAAA,mBAAA,CAAA,MAAA,CLhBe,MAAO,8BKsBpC,gBACc,GLrBW,EAAG,KAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EK8BzB,aAAO,EAAAA,EAAA,QAAA,KAAA,EAAA,EAAAA,EAAA,WAAA,CAAA,EAAA,OAAA,SAAA,CAAA,CAAA,EACd,EAAA,CL5BK,CAAC,KAAO,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAEA,EAAM,SAAU,CAAE,IAAK,CAAE,EAAG,EAAE,EAAGA,EAAM,mBAAkB,CAAE,MAAOqB,EAAG,EAAE,EAAGrB,EAAM,WAAU,CAAE,EAAE,OAAQ,SAAS,CAAC,CAAC,EAAG,EAAE,cAAgB,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAE,MAAOsB,EAAG,CAAC,EAAE,cAAgB,EAAGtB,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEW,EAAG,CK8B9U,IAAM,EL5Bc,MAAO,EAAGX,EAAM,MAAK,CAAE,CAAC,CAAC,CAAC,QAAU,IAAM,IAC1C,QAAS,EAAE,KAAQ,GAAM,CAAC,EAAGA,EAAM,MAAK,CAAE,CAAC,CAAC,CAAC,QAAU,EAAE,EAAGA,EAAM,MAAK,CAAE,CAAC,CAAC,CAAC,OAChF,EAAG,CACC,SAAU,EAAGA,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,gBAAe,EAAG,EAAGA,EAAM,gBAAe,EAAG,EAAGA,EAAM,MAAK,CAAE,CAAC,CAAC,CAAC,QAAU,GAAK,UAAU,EAAG,CAAC,CAAC,CAAC,EAC5I,EAAG,CACP,EAAG,EAAG,CAAC,MAAM,CAAC,IAAM,EAAGA,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CAAC,CAAC,IAAM,EAAGA,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CAAC,EAAG,EAAE,EAAE,EAAG,CAAC,EAC9H,CACJ,CAAC,EAAG4B,GAAqB,EAAG5B,EAAM,gBAAe,CAAE,CAC/C,OAAQ,WACR,OAAsB,EAAGA,EAAM,YAAW,CAAE,CACxC,WAAY,CAAC,EACb,QAAS,CAAE,KAAM,OAAQ,EACzB,gBAAiB,CACb,KAAM,QACN,QAAS,IAAK,EAClB,EACA,YAAa,CACT,KAAM,QACN,QAAS,CAAC,CACd,EACA,QAAS,CAAC,CACd,EAAG,CACC,WAAY,CAAC,EMpLX,eAKmB,CAAA,CAMvB,CAAA,EAGC,MAAA,CAAS,mBAAW,EAG9B,MAAA,EAAA,CAEwB,IACnB6B,EAAYtB,EAASiB,EAAArB,EAAA0B,GAAA,EAAA7B,EAAA,SAAA,CAAAO,EAAA,YAAA,CAAA,EAAAO,EAAA,KAAA,OAAA,EAEpBe,EAAA,SAA0BvB,EAAkB,EAAA,MAAA,0BAAA,IAAAQ,EAAA,wBAAA,GAAA,EAAAd,EAAA,YAAA,KAAA,CACR6B,EAAM,SAASvB,EAAA,EAAA,MAAA,0BAAA,OAAAQ,CAAA,EAAAU,EAAA,MAAA,EAAAhB,EAAA,QAAA,CAAAgB,EAAA,IAAAA,EAAA,eAAA,CAAA,CAAA,CACrD,CAAA,ENqKO,IAAIM,GAAK,EAAG9B,EAAM,IAAG,CAAE,EAAG,GAAK,EAAGA,EAAM,IAAG,CAAE,CAAC,CAAC,EAC/C,OAAQ,EAAGA,EMjK+C,MAAA,CAAA,CAAA8B,MAAAN,EAAA,SAAA,MAAA,CNkKtD,EAAE,MAAQT,EMlKgFS,EAAA,SAAM,CAY/F,EAAA,CAAA,UAAA,CAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAAxB,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAA,CAAA,OAAA,EAAAA,EAAA,eAAA,CAAA,CALA,eAAA,CAAA,EACK,uBAAA6B,EAAA,QN8JF,wBM9JW,EAAA7B,EAAA,MAAA,CAAAwB,CAAA,CAAA,CAAA,eN+Jf,CAAC,CAAE,EAAG,EAAE,EAAGxB,EAAM,YAAW,CAAEuB,EAAG,CM5JrB,YAAAhB,EAAA,YN8JR,UAAW,EAAE,MACb,qBM7IZ,EAAA,KAdJ,GAAK,EAAA,MAAA,CN4JO,EAAG,CACC,SAAU,EAAGP,EM7JsD,QAAA,KAAA,EAAA,EAAAA,EAAA,WAAA,CAAA+B,EAAA,OAAA,MAAA,CAAA,CAAA,EN8JnE,EAAG,CMxJF,EAAA,EAAA,CAAA,cAAY,WAAA,CAAA,GAAA,EAAA/B,EAE9B,mBACC,CAGE,MADU,CAAA,OAAS,EAAAA,EAAA,eAAA,CAAA,CADhB,wBAAA,CAAA,EAAA,kCAAA,EAAA,MNwJe,qCAAsC,EAAE,EAAGA,EAAM,MAAK,CAAEwB,CAAC,CAAC,CAAC,UAC/D,CAAC,CAAE,EAAG,CAAC,EAAE,QAAU,EAAGxB,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEM,EAAwB,EAAG,CAAE,IAAK,CAAE,CAAC,IAAM,EAAGN,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,IAAK,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEA,EAAM,UAAW,KAAM,GAAG,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,EAAG,EAAGA,EAAM,wBAAuB,EAAG,EAAGA,EAAM,MAAK,CAAEwB,CAAC,CAAC,CAAC,SAAS,EAAG,COpNrV,QAAA,ePsNgB,IAAKM,COtNc,EAAA,KAAA,GAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,CAAA,EAAA,CAAA,EPwNvC,CACJ,CAAC,EAAGE,EAAI,CAAC,EAAGC,EAAK,CAAE,MAAO,4BAA6B,EACvD,EAAQ,oBAAsBtB,EAC9B,EAAQ,YAAciB,EACtB,SAASM,EAAG,EAAG,EAAG,CQzNhB,OAAqB,EAAAlC,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAAiC,CAAA,CR2NvB,CACA,IAAIE,GAAoB,EAAG7B,EAAwB,EAAC,CAAE0B,EAAG,CAAC,CAAC,SAAUE,CAAE,CAAC,CAAC,EAoBzE,EAAQ,sBApB0F,EAAGlC,EAAM,gBAAe,CAAE,CQtN9H,OAAK,YRwNC,MAAO,CAAE,WAAY,CAAE,KAAM,OAAQ,CAAE,EACvC,MAAM,EAAG,CACL,IAAI,EAAIS,EAAE,EQrNa,OAAM,EAAA,KAAxC,EAAkDT,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,kBAU5C,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,EAAA,EAAAA,EAAA,MAAA,CAAAa,EAAA,CAAA,EAAA,CR6MS,IAAK,EQnNb,KAAA,ORqNI,EAAG,CACC,SAAU,EAAGb,EAAM,QQtNkD,KAAA,EAAA,EAAAA,EAAA,WAAA,CAAA,EAAA,OAAA,SAAA,CAAA,CAAA,ERuNrE,EAAG,CQlNJ,CAAA,IAAA,EAAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,UAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAmC,EAAA,CAAA,IAAA,CAAA,CAAA,KAAA,EAAAnC,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAA,CRoNC,IAAK,EACL,OAAQ,EAAGA,EAAM,eAAc,CAAE,CAC7B,yBAA0B,CAAC,EAC3B,kCAAmC,EAAE,UACzC,CAAC,CACL,EAAG,EAAE,EAAGA,EAAM,WAAU,CAAE,EAAE,OAAQ,SAAS,CAAC,EAAG,CAAC,EACtD,CACJ,CACgC,CACpC,CAAC","sourcesContent":["define([\"require\", \"exports\", \"../.chunks/forms-BiKUURH4.esm.js\", \"../utils/system.js\", \"../utils/route.js\", \"../.chunks/store-DjQAOnrn.esm.js\", \"../.chunks/popup-KKfSSrM6.esm.js\", \"vue\"], function (require, exports, forms_BiKUURH4_esm_js_1, system_js_1, route_js_1, store_DjQAOnrn_esm_js_1, popup_KKfSSrM6_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.TopTabsViewMenuTitle = exports.TopTabsViewMenuItem = exports.TopTabsView = void 0;\n //#region src/core/utils/store/localStorage.ts\n var I = (e, t) => `top:${String(e)}:${t}`, L = {\n loadLocalStorge: (e, t) => {\n if (!t.$id)\n return;\n let n = I(e, t.$id);\n try {\n let r = JSON.parse(localStorage.getItem(n));\n typeof r == typeof t[e] && (t[e] = r);\n }\n catch {\n console.warn(/* @__PURE__ */ Error(`В localStorage[${n}] не корректный json`));\n }\n },\n addSaverLocalStorge: (e, t) => {\n if (!t.$id)\n return;\n let n = I(e, t.$id);\n (0, vue_1.watch)(() => t[e], () => {\n localStorage.setItem(n, JSON.stringify(t[e]));\n }, { immediate: !0 });\n }\n }, R = /* @__PURE__ */ new Set();\n addEventListener(\"popstate\", (e) => {\n R.forEach((t) => t(e));\n });\n var z = Symbol(), B = (t, n) => {\n let r = (0, store_DjQAOnrn_esm_js_1.t)(z, () => ({\n showMenuInPopup: (0, vue_1.computed)(() => t.showMenuInPopup ?? forms_BiKUURH4_esm_js_1.O.state.isMobile),\n pageMod: (0, vue_1.computed)(() => t.pageMod),\n isShort: (0, vue_1.ref)(!1),\n activeItemName: n,\n component: (0, vue_1.ref)(void 0),\n scrollable: (0, vue_1.ref)(!0)\n }), t.idState);\n if (t.isShortable) {\n let e = \"isShort\";\n L.loadLocalStorge(e, r), L.addSaverLocalStorge(e, r);\n }\n return r.$id && R.add((e) => {\n n.value = (0, route_js_1.getHash)(r.$id);\n }), r;\n }, V = () => (0, store_DjQAOnrn_esm_js_1.r)(z), H = {\n key: 1,\n class: \"top-ellipsis\"\n }, U = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menuItem\",\n props: {\n name: {},\n href: {},\n icon: {},\n disabled: { type: Boolean },\n component: { default: void 0 },\n scrollable: {\n type: Boolean,\n default: !0\n }\n },\n setup(e) {\n let t = e, n = V(), r = (0, vue_1.computed)(() => t.name && n.$id ? (0, route_js_1.genHash)(n.$id, t.name) : t.href), i = (0, vue_1.computed)(() => n.showMenuInPopup ? popup_KKfSSrM6_esm_js_1.o : r.value ? \"a\" : \"button\"), o = (e) => {\n !t.href && r.value && e.preventDefault(), t.name && (n.activeItemName = t.name);\n };\n return (t, a) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)(i.value), {\n target: \"_self\",\n class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menuItem\": !(0, vue_1.unref)(n).showMenuInPopup,\n \"top-active\": e.name && (0, vue_1.unref)(n).activeItemName === e.name,\n \"top-disabled\": e.disabled,\n \"top-spa-disabled\": !0\n }),\n href: r.value,\n \"data-top-icon\": e.icon || void 0,\n disabled: e.disabled || void 0,\n onClick: o\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.unref)(n).showMenuInPopup ? (0, vue_1.renderSlot)(t.$slots, \"default\", { key: 0 }) : t.$slots.default && !(0, vue_1.unref)(n).isShort ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", H, [(0, vue_1.renderSlot)(t.$slots, \"default\")])) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 3\n }, 8, [\n \"class\",\n \"href\",\n \"data-top-icon\",\n \"disabled\"\n ]));\n }\n }), W = (e) => e?.name === \"AsyncComponentWrapper\" && !e?.__asyncResolved, G = async (e, t) => {\n e?.name === \"AsyncComponentWrapper\" && (e?.__asyncResolved || (e.__asyncLoader(), await (0, system_js_1.sleepWhile)(() => t() && W(e), 200)));\n }, K = { class: \"top-tabsView_menuOpener\" }, q = [\"data-top-icon\"], J = { class: \"top-ellipsis\" }, Y = { class: \"top-tabsView_menuList\" }, X = {\n key: 0,\n class: \"top-tabsView_menuFooter\"\n }, Z = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menu\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n isShortable: { type: Boolean },\n isLoading: { type: Boolean }\n }, {\n isLoading: {},\n isLoadingModifiers: {}\n }),\n emits: [\"update:isLoading\"],\n setup(e) {\n let t = (0, vue_1.useModel)(e, \"isLoading\"), n = V(), r = (0, vue_1.useSlots)(), i = /* @__PURE__ */ new Map(), a = () => {\n if (!r.default)\n return;\n let e = r.default({}).find((e) => e.key === \"_menu\");\n e && c(e.children);\n }, c = (e) => {\n e.forEach((e) => {\n if (e.type.__name && e.type.__name !== U.__name)\n return;\n if (!e.type.__name && typeof e.children == \"object\") {\n c(e.children);\n return;\n }\n if (!e.props?.name || e.props?.disabled)\n return;\n let t = {\n title: (e.children.default?.()[0].children).trim(),\n icon: e.props.icon,\n component: e.props.component ? (0, vue_1.markRaw)(e.props.component) : U.props.component.default,\n scrollable: e.props.scrollable ?? U.props.scrollable.default\n };\n i.set(e.props.name, t);\n });\n }, l = (0, vue_1.ref)(null), u = 0;\n return (0, vue_1.watch)(() => n.activeItemName, async () => {\n let e = ++u;\n if (i.size === 0 && a(), i.size === 0) {\n n.activeItemName = \"\";\n return;\n }\n if (l.value = i.get(n.activeItemName) ?? null, !l.value && n.$id) {\n let e = (0, route_js_1.getHash)(n.$id);\n if (l.value = i.get(e) ?? null, l.value) {\n n.activeItemName = e;\n return;\n }\n }\n if (!l.value) {\n n.activeItemName = i.keys().next().value;\n return;\n }\n if (l.value.component === n.component) {\n t.value = !1;\n return;\n }\n n.$id && (0, route_js_1.setHash)(n.$id, n.activeItemName, !1), t.value = !0, await G(l.value.component, () => e === u), e === u && (n.scrollable = l.value.scrollable, n.component = l.value.component, l.value && !n.component && console.warn(`Компонент вкладки ${n.activeItemName} не найден. Добавьте props.component для пункта меню ${n.activeItemName}.`));\n }, { immediate: !0 }), (t, r) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menu\": !0,\n \"top-tabsView_menu-inPopup_0\": !(0, vue_1.unref)(n).showMenuInPopup,\n \"top-tabsView_menu-inPopup_1\": (0, vue_1.unref)(n).showMenuInPopup,\n \"top-tabsView_menu-short\": (0, vue_1.unref)(n).isShort && !(0, vue_1.unref)(n).showMenuInPopup\n }) }, [(0, vue_1.unref)(n).showMenuInPopup ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_KKfSSrM6_esm_js_1.s), { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"div\", K, [l.value ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n key: 0,\n class: \"top-tabsView_menuOpenerActiveItem\",\n \"data-top-icon\": l.value.icon\n }, [(0, vue_1.createElementVNode)(\"span\", J, (0, vue_1.toDisplayString)(l.value.title), 1)], 8, q)) : (0, vue_1.createCommentVNode)(\"\", !0), r[1] ||= (0, vue_1.createElementVNode)(\"div\", {\n class: \"top-tabsView_menuOpenerIcon\",\n \"data-top-icon\": \"\"\n }, null, -1)])]),\n contentList: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(t.$slots, \"default\")]),\n _: 3\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 1 }, [(0, vue_1.createElementVNode)(\"div\", Y, [(0, vue_1.renderSlot)(t.$slots, \"default\")]), e.isShortable ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", X, [e.isShortable ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(U, {\n key: 0,\n icon: (0, vue_1.unref)(n).isShort ? \"\" : \"\",\n onClick: r[0] ||= (e) => (0, vue_1.unref)(n).isShort = !(0, vue_1.unref)(n).isShort\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)((0, vue_1.unref)(n).isShort ? \"\" : \"Свернуть\"), 1)]),\n _: 1\n }, 8, [\"icon\"])) : (0, vue_1.createCommentVNode)(\"\", !0)])) : (0, vue_1.createCommentVNode)(\"\", !0)], 64))], 2));\n }\n }), Q = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tabsView\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n pageMod: { type: Boolean },\n showMenuInPopup: {\n type: Boolean,\n default: void 0\n },\n isShortable: {\n type: Boolean,\n default: !1\n },\n idState: {}\n }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let r = n, a = B(r, (0, vue_1.useModel)(n, \"modelValue\")), o = Math.random();\n r.pageMod && forms_BiKUURH4_esm_js_1.O.state.documentClassModificators.set(o, \"top-hasTabsViewPageMod\"), (0, vue_1.onUnmounted)(() => {\n r.pageMod && forms_BiKUURH4_esm_js_1.O.state.documentClassModificators.delete(o), a.$id && (0, route_js_1.delHash)(a.$id, a.activeItemName, !0);\n });\n let s = (0, vue_1.ref)(), c = (0, vue_1.ref)(!1);\n return (0, vue_1.watch)([s, () => a.component], () => {\n c.value = W(a.component);\n }, { immediate: !0 }), (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView\": !0,\n \"top-tabsView-pageMod\": r.pageMod,\n \"top-tabsView-inPopup\": (0, vue_1.unref)(a).showMenuInPopup\n }) }, [(0, vue_1.createVNode)(Z, {\n isShortable: n.isShortable,\n isLoading: c.value,\n \"onUpdate:isLoading\": i[0] ||= (e) => c.value = e\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(e.$slots, \"menu\")]),\n _: 3\n }, 8, [\"isShortable\", \"isLoading\"]), (0, vue_1.createElementVNode)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView_contents\": !0,\n \"top-tabsView_contents-isLoading\": c.value,\n \"top-tabsView_contents-noScrollable\": !(0, vue_1.unref)(a).scrollable\n }) }, [c.value ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_BiKUURH4_esm_js_1.l, { key: 0 })) : (0, vue_1.createCommentVNode)(\"\", !0), ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(vue_1.KeepAlive, null, [((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(a).component), {\n ref_key: \"componentRef\",\n ref: s\n }, null, 512))], 1024))], 2)], 2));\n }\n }), $ = {}, ee = { class: \"top-tabsView_menuDelimeter\" };\n exports.TopTabsViewMenuItem = U;\n exports.TopTabsView = Q;\n function te(e, t) {\n return (0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", ee);\n }\n var ne = /*#__PURE__*/ (0, forms_BiKUURH4_esm_js_1.u)($, [[\"render\", te]]), re = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menuTitle\",\n props: { isSubtitle: { type: Boolean } },\n setup(e) {\n let t = V();\n return (n, r) => (0, vue_1.unref)(t).showMenuInPopup ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_KKfSSrM6_esm_js_1.o), {\n key: 0,\n type: \"title\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(n.$slots, \"default\")]),\n _: 3\n })) : (0, vue_1.unref)(t).isShort ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(ne, { key: 1 })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n key: 2,\n class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menuTitle\": !0,\n \"top-tabsView_menuTitle-subtitle\": e.isSubtitle\n })\n }, [(0, vue_1.renderSlot)(n.$slots, \"default\")], 2));\n }\n });\n exports.TopTabsViewMenuTitle = re;\n});\n//# sourceMappingURL=tabsView.js.map\n","import { watch } from 'vue';\nimport type { Store } from './store';\n\n/**\n * Сгенерировать имя для сохранения данных в localStorage\n * @param stateName - имя свойства состояния\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\n */\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\n\tconst stateNameString = String(stateName);\n\n\treturn `top:${stateNameString}:${stateKey}`;\n};\n\n/**\n * Загрузить состояние\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\ttry {\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\n\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\n\t\t\tstore[stateName] = localStorageValue;\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\n\t}\n};\n\n/**\n * Добавить автосохранение состояние при его изменении\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\twatch(() => store[stateName], () => {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\n\t}, { immediate: true });\n};\n\nexport default {\n\tloadLocalStorge,\n\taddSaverLocalStorge,\n};","import type { InjectionKey, ModelRef, UnwrapNestedRefs } from 'vue';\nimport { computed, ref } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './types';\nimport { getHash } from '@/core/utils/route';\n\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\n\naddEventListener('popstate', (e) => {\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\n});\n\nexport const injectionKey = Symbol() as InjectionKey<Store>;\n\n/**\n * Инициировать Store компонента\n */\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>): UnwrapNestedRefs<Store> & DefineStore => {\n\tconst store = defineStore(injectionKey, () => {\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\n\t\tconst pageMod = computed(() => props.pageMod);\n\t\tconst isShort = ref(false);\n\n\t\tconst component = ref(undefined);\n\t\tconst scrollable = ref(true);\n\n\t\treturn {\n\t\t\tshowMenuInPopup,\n\t\t\tpageMod,\n\t\t\tisShort,\n\t\t\tactiveItemName: model,\n\t\t\tcomponent,\n\t\t\tscrollable,\n\t\t};\n\t}, props.idState);\n\n\tif (props.isShortable) {\n\t\tconst stateName = 'isShort';\n\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\n\t}\n\n\tif (store.$id) {\n\t\tconst popstateCallback = (_e: PopStateEvent) => {\n\t\t\tmodel.value = getHash(store.$id!);\n\t\t};\n\n\t\tpopstateCallbacks.add(popstateCallback);\n\t}\n\n\treturn store;\n};\n\n/**\n * Получить Store компонента\n */\nexport const useTabsStore = () => useStore(injectionKey);\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { TopPopupListItem } from '@/components/popup/popup';\nimport { useTabsStore } from './store';\nimport type { PropsMenuItem } from './types';\n\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\n\tscrollable: true,\n\tcomponent: undefined,\n});\n\nconst store = useTabsStore();\n\nconst href = computed(() => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (props.name && store.$id) {\n\t\treturn genHash(store.$id, props.name);\n\t}\n\n\treturn props.href;\n});\n\nconst tagName = computed(() => {\n\tif (store.showMenuInPopup) {\n\t\treturn TopPopupListItem;\n\t}\n\n\treturn href.value ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot name=\"default\" v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot name=\"default\"></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-2);\n\t--top-icon-width: calc(var(--top-icon-size));\n\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\n\tborder: none;\n\tborder-radius: var(--top-radius-2);\n\tpadding: var(--top-padding-2);\n\tbackground: transparent;\n\theight: 40px;\n\n\tcolor: var(--color-text-1);\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\n\tdisplay: flex;\n\tgap: var(--top-gap-2);\n\talign-items: center;\n\tjustify-content: flex-start;\n\ttransition: background var(--transition);\n}\n\n.top-tabsView_menuItem:hover {\n\t--top-icon-color: var(--color-text-1);\n\n\tbackground: var(--color-bg-shading-1);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\t--top-icon-color: inherit;\n\n\tbackground: var(--color-layout-front-1);\n\tcolor: inherit;\n}\n\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\n\topacity: unset;\n\tfilter: unset;\n}\n\n.top-tabsView_menuItem.top-disabled {\n\t--top-icon-color: var(--color-text-4);\n\n\tcolor: var(--color-text-4);\n}\n</style>\n","// TODO: Эту функцию можно вынести в глобальный utils\n\nimport { sleepWhile } from '@/core/utils/system';\n\n/**\n * Проверка нахождения компонента в состояние загрузки\n * @param component\n */\nexport const checkComponentIsLoading = (component: any) => {\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\n};\n\n/**\n * Презагрузить компонент\n *\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\n */\nexport const preResolveComponent = async (component: any, condition: Function) => {\n\tif (component?.name !== 'AsyncComponentWrapper') return;\n\tif (component?.__asyncResolved) return;\n\n\tcomponent.__asyncLoader();\n\n\tawait sleepWhile(() => {\n\t\treturn condition() && checkComponentIsLoading(component);\n\t}, 200);\n};\n","<script setup lang=\"ts\">\nimport type { Ref, VNode } from 'vue';\nimport { markRaw, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\nimport { useTabsStore } from './store';\nimport TabsViewMenuItem from './menuItem.vue';\nimport { preResolveComponent } from './utils';\n\ndefineProps<PropsMenu>();\n\nconst isLoading = defineModel('isLoading');\n\nconst store = useTabsStore();\n\nconst slots = useSlots();\n\n// словарь используется для оптимизации получения нужного menuItem\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\n\n// заполнить словарь с menuItem, по элементам в slot default\nconst setMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default({}).find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tsetMenuItemByNameFromItems(component.children);\n};\n\n// заполнить словарь с menuItem, по элементам\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\n\tmenuItems.forEach((subComponent: any) => {\n\t\t// это не компонент элемента меню\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\n\t\t// это не компонент, например template\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subComponent.props?.name || subComponent.props?.disabled) return;\n\n\t\tconst menuItem: MenuItem = {\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\n\t\t\ticon: subComponent.props.icon,\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\n\t\t};\n\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\n\t});\n};\n\n/**\n * activeMenuItem нужен:\n * - для вывода текста активной вкладки в меню с popup\n * - для вывода компонента активной вкладки (store.component)\n * - для установки store.scrollable\n */\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\n\n/**\n * Кол-во изменений активной вкладки\n */\nlet countChanged = 0;\n\n/**\n * Смена активной вкладки\n *\n * TODO: смена slot, например смена языка, требует повторного выполнения setMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tsetMenuItemByName();\n\t\t}\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tstore.activeItemName = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\n\n\t\t// элемент не найден, установить из хеша страницы\n\t\tif (!activeMenuItem.value && store.$id) {\n\t\t\tconst activeItemName = getHash(store.$id);\n\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\n\n\t\t\tif (activeMenuItem.value) {\n\t\t\t\tstore.activeItemName = activeItemName;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// элемент не найден, установить первый доступный\n\t\tif (!activeMenuItem.value) {\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value!;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// запрошена смена на уже активный элемент\n\t\tif (activeMenuItem.value.component === store.component) {\n\t\t\tisLoading.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, false);\n\n\t\t// флаг загрузки будет сброшен при инициализации компонента\n\t\tisLoading.value = true;\n\n\t\t/**\n\t\t * Презагрузить компонент\n\t\t *\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\n\t\t */\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\n\n\t\t// влкадка была сменена еще раз во время sleepWhile\n\t\tif (numberChanged !== countChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\n\t\tstore.component = activeMenuItem.value.component;\n\n\t\tif (activeMenuItem.value && !store.component) {\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\n\t\t}\n\t},\n\t{ immediate: true },\n);\n\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView_menu': true,\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<!-- Спрятать меню под кнопку в popup -->\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\n\t\t\t<template #opener>\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<slot></slot>\n\t\t\t</template>\n\t\t</TopPopup>\n\n\t\t<!-- Отобразить меню на странице -->\n\t\t<template v-else>\n\t\t\t<div class=\"top-tabsView_menuList\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"isShortable\"\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\n\t\t\t>\n\t\t\t\t<TabsViewMenuItem\n\t\t\t\t\tv-if=\"isShortable\"\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\n\t\t\t\t>\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\n\t\t\t\t</TabsViewMenuItem>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style>\n/* режим отображение табов в основной области документа */\n.top-tabsView-pageMod .top-tabsView_menu {\n\tbox-sizing: border-box;\n\tposition: sticky;\n\ttop: var(--top-tabsView-top);\n\tz-index: 10;\n}\n\n/* режим отображение табов в основной области документа без popup */\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\n}\n\n/* стантартный режим */\n.top-tabsView_menu-inPopup_0 {\n\tbox-sizing: border-box;\n\twidth: var(--top-tabsView-menu-width);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tflex-shrink: 0;\n}\n\n/* режим вывода в popup */\n.top-tabsView_menu-inPopup_1 {\n\tborder-bottom: var(--top-tabsView-menu-border-bottom-width) solid var(--color-line-2-opacity);\n}\n\n.top-tabsView_menu-short {\n\twidth: auto;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\n\tbackground: var(--color-layer-1);\n}\n\n.top-tabsView_menuOpenerIcon { display: flex; }\n\n.top-tabsView_menuOpenerActiveItem {\n\t--top-forms-padding: 0px;\n\n\tbox-sizing: border-box;\n\tpadding: var(--top-tabsView-menu-opener-padding);\n\tmax-width: calc(100% - var(--top-forms-base-height));\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--top-padding-2);\n}\n\n.top-tabsView_menuList,\n.top-tabsView_menuFooter {\n\tpadding: var(--top-padding-2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-2);\n}\n\n.top-tabsView_menuList {\n\toverflow-y: auto;\n}\n\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\n\t--top-icon-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './types';\nimport { defineTabsStore } from './store';\nimport TabsViewMenu from './menu.vue';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\nimport { checkComponentIsLoading } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowMenuInPopup: undefined,\n\tisShortable: false,\n});\n\nconst model = defineModel<string>();\n\nconst store = defineTabsStore(props, model);\n\nconst uid = Math.random();\n\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\n\nonUnmounted(() => {\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\n\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\n});\n\nconst componentRef = ref();\nconst isLoading = ref(false);\n\nwatch([componentRef, () => store.component], () => {\n\tisLoading.value = checkComponentIsLoading(store.component);\n}, { immediate: true });\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView': true,\n\t\t\t'top-tabsView-pageMod': props.pageMod,\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<TabsViewMenu\n\t\t\t:isShortable=\"isShortable\"\n\t\t\tv-model:isLoading=\"isLoading\"\n\t\t>\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\n\t\t\t<slot name=\"menu\"></slot>\n\t\t</TabsViewMenu>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-tabsView_contents': true,\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\n\t\t\t}\"\n\t\t>\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t\t<keep-alive>\n\t\t\t\t<component\n\t\t\t\t\tref=\"componentRef\"\n\t\t\t\t\t:is=\"store.component\"\n\t\t\t\t/>\n\t\t\t</keep-alive>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n:root {\n\t--top-tabsView-top: 0px;\n\t--top-tabsView-menu-width: 220px;\n\t--top-tabsView-contents-offset-top: 0px;\n\t--top-tabsView-menu-border-bottom-width: 1px;\n\t--top-tabsView-menu-opener-padding: var(--top-padding-2);\n}\n\n.top-tabsView {\n\tbackground: var(--color-layout-middle);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n}\n\n.top-tabsView_contents {\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-layout-front-1);\n\tpadding: var(--top-padding-4);\n\tflex-grow: 1;\n\toverflow: auto;\n\tposition: relative;\n}\n\n.top-tabsView_contents-isLoading {\n\tpointer-events: none;\n}\n\n.top-tabsView_contents-noScrollable {\n\twidth: calc(100% - var(--top-tabsView-menu-width));\n\tpadding: 0;\n\toverflow: visible;\n}\n\n/* top-tabsView-inPopup */\n.top-tabsView-inPopup {\n\tbackground: var(--color-layout-front-1);\n\tflex-direction: column;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents {\n\tborder-radius: 0;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\n\twidth: auto;\n}\n\n@media only screen and (max-width: 900px) {\n\t:root {\n\t\t/* Суммарно должна быть высота элемента \".top-tabsView_menu\" */\n\t\t--top-tabsView-contents-offset-top: calc(var(--top-icon-size) + var(--top-tabsView-menu-opener-padding) * 2 + var(--top-tabsView-menu-border-bottom-width));\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\n</template>\n\n<style>\n.top-tabsView_menuDelimeter {\n\tpadding: var(--top-padding-1) 0;\n\tdisplay: flex;\n}\n\n.top-tabsView_menuDelimeter:before {\n\tcontent: \"\";\n\theight: 2px;\n\tbackground: var(--color-line-2);\n\tflex-grow: 1;\n}\n\n.top-tabsView_menuDelimeter:first-child,\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\n\tdisplay: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useTabsStore } from './store';\nimport type { PropsMenuTitle } from './types';\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\nimport { TopPopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</TopPopupListItem>\n\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\n\n\t<div\n\t\tv-else\n\t\t:class=\"{\n\t\t\t'top-tabsView_menuTitle': true,\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\n\t\t}\"\n\t>\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style>\n.top-tabsView_menuTitle {\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\n\tfont-weight: 600;\n\tcolor: var(--color-text-1);\n}\n\n.top-tabsView_menuTitle-subtitle {\n\tpadding-top: var(--top-padding-1);\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tcolor: var(--color-text-2);\n}\n</style>\n"]}
|
|
1
|
+
{"version":3,"sources":["tabsView/tabsView.js","../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue"],"names":["vue","exports","I","L","vue_1","R","z","B","store_DjQAOnrn_esm_js_1","t","forms_CY5MOh7a_esm_js_1","n","route_js_1","V","H","U","i","popup_3cwJ8Hev_esm_js_1","o","W","G","system_js_1","K","q","J","Y","X","Z","a","c","l","u","Q","r","s","e","$","ee","te","ne"],"mappings":"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","sourcesContent":["define([\"require\", \"exports\", \"../.chunks/forms-CY5MOh7a.esm.js\", \"../utils/system.js\", \"../utils/route.js\", \"../.chunks/store-DjQAOnrn.esm.js\", \"../.chunks/popup-3cwJ8Hev.esm.js\", \"vue\"], function (require, exports, forms_CY5MOh7a_esm_js_1, system_js_1, route_js_1, store_DjQAOnrn_esm_js_1, popup_3cwJ8Hev_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.TopTabsViewMenuTitle = exports.TopTabsViewMenuItem = exports.TopTabsView = void 0;\n //#region src/core/utils/store/localStorage.ts\n var I = (e, t) => `top:${String(e)}:${t}`, L = {\n loadLocalStorge: (e, t) => {\n if (!t.$id)\n return;\n let n = I(e, t.$id);\n try {\n let r = JSON.parse(localStorage.getItem(n));\n typeof r == typeof t[e] && (t[e] = r);\n }\n catch {\n console.warn(/* @__PURE__ */ Error(`В localStorage[${n}] не корректный json`));\n }\n },\n addSaverLocalStorge: (e, t) => {\n if (!t.$id)\n return;\n let n = I(e, t.$id);\n (0, vue_1.watch)(() => t[e], () => {\n localStorage.setItem(n, JSON.stringify(t[e]));\n }, { immediate: !0 });\n }\n }, R = /* @__PURE__ */ new Set();\n addEventListener(\"popstate\", (e) => {\n R.forEach((t) => t(e));\n });\n var z = Symbol(), B = (t, n) => {\n let r = (0, store_DjQAOnrn_esm_js_1.t)(z, () => ({\n showMenuInPopup: (0, vue_1.computed)(() => t.showMenuInPopup ?? forms_CY5MOh7a_esm_js_1.O.state.isMobile),\n pageMod: (0, vue_1.computed)(() => t.pageMod),\n isShort: (0, vue_1.ref)(!1),\n activeItemName: n,\n component: (0, vue_1.ref)(void 0),\n scrollable: (0, vue_1.ref)(!0)\n }), t.idState);\n if (t.isShortable) {\n let e = \"isShort\";\n L.loadLocalStorge(e, r), L.addSaverLocalStorge(e, r);\n }\n return r.$id && R.add((e) => {\n n.value = (0, route_js_1.getHash)(r.$id);\n }), r;\n }, V = () => (0, store_DjQAOnrn_esm_js_1.r)(z), H = {\n key: 1,\n class: \"top-ellipsis\"\n }, U = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menuItem\",\n props: {\n name: {},\n href: {},\n icon: {},\n disabled: { type: Boolean },\n component: { default: void 0 },\n scrollable: {\n type: Boolean,\n default: !0\n }\n },\n setup(e) {\n let t = e, n = V(), r = (0, vue_1.computed)(() => t.name && n.$id ? (0, route_js_1.genHash)(n.$id, t.name) : t.href), i = (0, vue_1.computed)(() => n.showMenuInPopup ? popup_3cwJ8Hev_esm_js_1.o : r.value ? \"a\" : \"button\"), o = (e) => {\n !t.href && r.value && e.preventDefault(), t.name && (n.activeItemName = t.name);\n };\n return (t, a) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)(i.value), {\n target: \"_self\",\n class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menuItem\": !(0, vue_1.unref)(n).showMenuInPopup,\n \"top-active\": e.name && (0, vue_1.unref)(n).activeItemName === e.name,\n \"top-disabled\": e.disabled,\n \"top-spa-disabled\": !0\n }),\n href: r.value,\n \"data-top-icon\": e.icon || void 0,\n disabled: e.disabled || void 0,\n onClick: o\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.unref)(n).showMenuInPopup ? (0, vue_1.renderSlot)(t.$slots, \"default\", { key: 0 }) : t.$slots.default && !(0, vue_1.unref)(n).isShort ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", H, [(0, vue_1.renderSlot)(t.$slots, \"default\")])) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 3\n }, 8, [\n \"class\",\n \"href\",\n \"data-top-icon\",\n \"disabled\"\n ]));\n }\n }), W = (e) => e?.name === \"AsyncComponentWrapper\" && !e?.__asyncResolved, G = async (e, t) => {\n e?.name === \"AsyncComponentWrapper\" && (e?.__asyncResolved || (e.__asyncLoader(), await (0, system_js_1.sleepWhile)(() => t() && W(e), 200)));\n }, K = { class: \"top-tabsView_menuOpener\" }, q = [\"data-top-icon\"], J = { class: \"top-ellipsis\" }, Y = { class: \"top-tabsView_menuList\" }, X = {\n key: 0,\n class: \"top-tabsView_menuFooter\"\n }, Z = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menu\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n isShortable: { type: Boolean },\n isLoading: { type: Boolean }\n }, {\n isLoading: {},\n isLoadingModifiers: {}\n }),\n emits: [\"update:isLoading\"],\n setup(e) {\n let t = (0, vue_1.useModel)(e, \"isLoading\"), n = V(), r = (0, vue_1.useSlots)(), i = /* @__PURE__ */ new Map(), a = () => {\n if (!r.default)\n return;\n let e = r.default({}).find((e) => e.key === \"_menu\");\n e && c(e.children);\n }, c = (e) => {\n e.forEach((e) => {\n if (e.type.__name && e.type.__name !== U.__name)\n return;\n if (!e.type.__name && typeof e.children == \"object\") {\n c(e.children);\n return;\n }\n if (!e.props?.name || e.props?.disabled)\n return;\n let t = {\n title: (e.children.default?.()[0].children).trim(),\n icon: e.props.icon,\n component: e.props.component ? (0, vue_1.markRaw)(e.props.component) : U.props.component.default,\n scrollable: e.props.scrollable ?? U.props.scrollable.default\n };\n i.set(e.props.name, t);\n });\n }, l = (0, vue_1.ref)(null), u = 0;\n return (0, vue_1.watch)(() => n.activeItemName, async () => {\n let e = ++u;\n if (i.size === 0 && a(), i.size === 0) {\n n.activeItemName = \"\";\n return;\n }\n if (l.value = i.get(n.activeItemName) ?? null, !l.value && n.$id) {\n let e = (0, route_js_1.getHash)(n.$id);\n if (l.value = i.get(e) ?? null, l.value) {\n n.activeItemName = e;\n return;\n }\n }\n if (!l.value) {\n n.activeItemName = i.keys().next().value;\n return;\n }\n if (l.value.component === n.component) {\n t.value = !1;\n return;\n }\n n.$id && (0, route_js_1.setHash)(n.$id, n.activeItemName, !1), t.value = !0, await G(l.value.component, () => e === u), e === u && (n.scrollable = l.value.scrollable, n.component = l.value.component, l.value && !n.component && console.warn(`Компонент вкладки ${n.activeItemName} не найден. Добавьте props.component для пункта меню ${n.activeItemName}.`));\n }, { immediate: !0 }), (t, r) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menu\": !0,\n \"top-tabsView_menu-inPopup_0\": !(0, vue_1.unref)(n).showMenuInPopup,\n \"top-tabsView_menu-inPopup_1\": (0, vue_1.unref)(n).showMenuInPopup,\n \"top-tabsView_menu-short\": (0, vue_1.unref)(n).isShort && !(0, vue_1.unref)(n).showMenuInPopup\n }) }, [(0, vue_1.unref)(n).showMenuInPopup ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.s), { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"div\", K, [l.value ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n key: 0,\n class: \"top-tabsView_menuOpenerActiveItem\",\n \"data-top-icon\": l.value.icon\n }, [(0, vue_1.createElementVNode)(\"span\", J, (0, vue_1.toDisplayString)(l.value.title), 1)], 8, q)) : (0, vue_1.createCommentVNode)(\"\", !0), r[1] ||= (0, vue_1.createElementVNode)(\"div\", {\n class: \"top-tabsView_menuOpenerIcon\",\n \"data-top-icon\": \"\"\n }, null, -1)])]),\n contentList: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(t.$slots, \"default\")]),\n _: 3\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 1 }, [(0, vue_1.createElementVNode)(\"div\", Y, [(0, vue_1.renderSlot)(t.$slots, \"default\")]), e.isShortable ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", X, [e.isShortable ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(U, {\n key: 0,\n icon: (0, vue_1.unref)(n).isShort ? \"\" : \"\",\n onClick: r[0] ||= (e) => (0, vue_1.unref)(n).isShort = !(0, vue_1.unref)(n).isShort\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)((0, vue_1.unref)(n).isShort ? \"\" : \"Свернуть\"), 1)]),\n _: 1\n }, 8, [\"icon\"])) : (0, vue_1.createCommentVNode)(\"\", !0)])) : (0, vue_1.createCommentVNode)(\"\", !0)], 64))], 2));\n }\n }), Q = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tabsView\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n pageMod: { type: Boolean },\n showMenuInPopup: {\n type: Boolean,\n default: void 0\n },\n isShortable: {\n type: Boolean,\n default: !1\n },\n idState: {}\n }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let r = n, a = B(r, (0, vue_1.useModel)(n, \"modelValue\")), o = Math.random();\n r.pageMod && forms_CY5MOh7a_esm_js_1.O.state.documentClassModificators.set(o, \"top-hasTabsViewPageMod\"), (0, vue_1.onUnmounted)(() => {\n r.pageMod && forms_CY5MOh7a_esm_js_1.O.state.documentClassModificators.delete(o), a.$id && (0, route_js_1.delHash)(a.$id, a.activeItemName, !0);\n });\n let s = (0, vue_1.ref)(), c = (0, vue_1.ref)(!1);\n return (0, vue_1.watch)([s, () => a.component], () => {\n c.value = W(a.component);\n }, { immediate: !0 }), (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView\": !0,\n \"top-tabsView-pageMod\": r.pageMod,\n \"top-tabsView-inPopup\": (0, vue_1.unref)(a).showMenuInPopup\n }) }, [(0, vue_1.createVNode)(Z, {\n isShortable: n.isShortable,\n isLoading: c.value,\n \"onUpdate:isLoading\": i[0] ||= (e) => c.value = e\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(e.$slots, \"menu\")]),\n _: 3\n }, 8, [\"isShortable\", \"isLoading\"]), (0, vue_1.createElementVNode)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-tabsView_contents\": !0,\n \"top-tabsView_contents-isLoading\": c.value,\n \"top-tabsView_contents-noScrollable\": !(0, vue_1.unref)(a).scrollable\n }) }, [c.value ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CY5MOh7a_esm_js_1.l, { key: 0 })) : (0, vue_1.createCommentVNode)(\"\", !0), ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(vue_1.KeepAlive, null, [((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(a).component), {\n ref_key: \"componentRef\",\n ref: s\n }, null, 512))], 1024))], 2)], 2));\n }\n }), $ = {}, ee = { class: \"top-tabsView_menuDelimeter\" };\n exports.TopTabsViewMenuItem = U;\n exports.TopTabsView = Q;\n function te(e, t) {\n return (0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", ee);\n }\n var ne = /*#__PURE__*/ (0, forms_CY5MOh7a_esm_js_1.u)($, [[\"render\", te]]), re = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"menuTitle\",\n props: { isSubtitle: { type: Boolean } },\n setup(e) {\n let t = V();\n return (n, r) => (0, vue_1.unref)(t).showMenuInPopup ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.o), {\n key: 0,\n type: \"title\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.renderSlot)(n.$slots, \"default\")]),\n _: 3\n })) : (0, vue_1.unref)(t).isShort ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(ne, { key: 1 })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n key: 2,\n class: (0, vue_1.normalizeClass)({\n \"top-tabsView_menuTitle\": !0,\n \"top-tabsView_menuTitle-subtitle\": e.isSubtitle\n })\n }, [(0, vue_1.renderSlot)(n.$slots, \"default\")], 2));\n }\n });\n exports.TopTabsViewMenuTitle = re;\n});\n//# sourceMappingURL=tabsView.js.map\n","import { watch } from 'vue';\nimport type { Store } from './store';\n\n/**\n * Сгенерировать имя для сохранения данных в localStorage\n * @param stateName - имя свойства состояния\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\n */\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\n\tconst stateNameString = String(stateName);\n\n\treturn `top:${stateNameString}:${stateKey}`;\n};\n\n/**\n * Загрузить состояние\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\ttry {\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\n\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\n\t\t\tstore[stateName] = localStorageValue;\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\n\t}\n};\n\n/**\n * Добавить автосохранение состояние при его изменении\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\twatch(() => store[stateName], () => {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\n\t}, { immediate: true });\n};\n\nexport default {\n\tloadLocalStorge,\n\taddSaverLocalStorge,\n};","import type { InjectionKey, ModelRef, UnwrapNestedRefs } from 'vue';\nimport { computed, ref } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './types';\nimport { getHash } from '@/core/utils/route';\n\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\n\naddEventListener('popstate', (e) => {\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\n});\n\nexport const injectionKey = Symbol() as InjectionKey<Store>;\n\n/**\n * Инициировать Store компонента\n */\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>): UnwrapNestedRefs<Store> & DefineStore => {\n\tconst store = defineStore(injectionKey, () => {\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\n\t\tconst pageMod = computed(() => props.pageMod);\n\t\tconst isShort = ref(false);\n\n\t\tconst component = ref(undefined);\n\t\tconst scrollable = ref(true);\n\n\t\treturn {\n\t\t\tshowMenuInPopup,\n\t\t\tpageMod,\n\t\t\tisShort,\n\t\t\tactiveItemName: model,\n\t\t\tcomponent,\n\t\t\tscrollable,\n\t\t};\n\t}, props.idState);\n\n\tif (props.isShortable) {\n\t\tconst stateName = 'isShort';\n\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\n\t}\n\n\tif (store.$id) {\n\t\tconst popstateCallback = (_e: PopStateEvent) => {\n\t\t\tmodel.value = getHash(store.$id!);\n\t\t};\n\n\t\tpopstateCallbacks.add(popstateCallback);\n\t}\n\n\treturn store;\n};\n\n/**\n * Получить Store компонента\n */\nexport const useTabsStore = () => useStore(injectionKey);\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { TopPopupListItem } from '@/components/popup/popup';\nimport { useTabsStore } from './store';\nimport type { PropsMenuItem } from './types';\n\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\n\tscrollable: true,\n\tcomponent: undefined,\n});\n\nconst store = useTabsStore();\n\nconst href = computed(() => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (props.name && store.$id) {\n\t\treturn genHash(store.$id, props.name);\n\t}\n\n\treturn props.href;\n});\n\nconst tagName = computed(() => {\n\tif (store.showMenuInPopup) {\n\t\treturn TopPopupListItem;\n\t}\n\n\treturn href.value ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot name=\"default\" v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot name=\"default\"></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-2);\n\t--top-icon-width: calc(var(--top-icon-size));\n\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\n\tborder: none;\n\tborder-radius: var(--top-radius-2);\n\tpadding: var(--top-padding-2);\n\tbackground: transparent;\n\theight: 40px;\n\n\tcolor: var(--color-text-1);\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\n\tdisplay: flex;\n\tgap: var(--top-gap-2);\n\talign-items: center;\n\tjustify-content: flex-start;\n\ttransition: background var(--transition);\n}\n\n.top-tabsView_menuItem:hover {\n\t--top-icon-color: var(--color-text-1);\n\n\tbackground: var(--color-bg-shading-1);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\t--top-icon-color: inherit;\n\n\tbackground: var(--color-layout-front-1);\n\tcolor: inherit;\n}\n\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\n\topacity: unset;\n\tfilter: unset;\n}\n\n.top-tabsView_menuItem.top-disabled {\n\t--top-icon-color: var(--color-text-4);\n\n\tcolor: var(--color-text-4);\n}\n</style>\n","// TODO: Эту функцию можно вынести в глобальный utils\n\nimport { sleepWhile } from '@/core/utils/system';\n\n/**\n * Проверка нахождения компонента в состояние загрузки\n * @param component\n */\nexport const checkComponentIsLoading = (component: any) => {\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\n};\n\n/**\n * Презагрузить компонент\n *\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\n */\nexport const preResolveComponent = async (component: any, condition: Function) => {\n\tif (component?.name !== 'AsyncComponentWrapper') return;\n\tif (component?.__asyncResolved) return;\n\n\tcomponent.__asyncLoader();\n\n\tawait sleepWhile(() => {\n\t\treturn condition() && checkComponentIsLoading(component);\n\t}, 200);\n};\n","<script setup lang=\"ts\">\nimport type { Ref, VNode } from 'vue';\nimport { markRaw, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\nimport { useTabsStore } from './store';\nimport TabsViewMenuItem from './menuItem.vue';\nimport { preResolveComponent } from './utils';\n\ndefineProps<PropsMenu>();\n\nconst isLoading = defineModel('isLoading');\n\nconst store = useTabsStore();\n\nconst slots = useSlots();\n\n// словарь используется для оптимизации получения нужного menuItem\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\n\n// заполнить словарь с menuItem, по элементам в slot default\nconst setMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default({}).find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tsetMenuItemByNameFromItems(component.children);\n};\n\n// заполнить словарь с menuItem, по элементам\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\n\tmenuItems.forEach((subComponent: any) => {\n\t\t// это не компонент элемента меню\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\n\t\t// это не компонент, например template\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subComponent.props?.name || subComponent.props?.disabled) return;\n\n\t\tconst menuItem: MenuItem = {\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\n\t\t\ticon: subComponent.props.icon,\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\n\t\t};\n\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\n\t});\n};\n\n/**\n * activeMenuItem нужен:\n * - для вывода текста активной вкладки в меню с popup\n * - для вывода компонента активной вкладки (store.component)\n * - для установки store.scrollable\n */\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\n\n/**\n * Кол-во изменений активной вкладки\n */\nlet countChanged = 0;\n\n/**\n * Смена активной вкладки\n *\n * TODO: смена slot, например смена языка, требует повторного выполнения setMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tsetMenuItemByName();\n\t\t}\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tstore.activeItemName = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\n\n\t\t// элемент не найден, установить из хеша страницы\n\t\tif (!activeMenuItem.value && store.$id) {\n\t\t\tconst activeItemName = getHash(store.$id);\n\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\n\n\t\t\tif (activeMenuItem.value) {\n\t\t\t\tstore.activeItemName = activeItemName;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// элемент не найден, установить первый доступный\n\t\tif (!activeMenuItem.value) {\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value!;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// запрошена смена на уже активный элемент\n\t\tif (activeMenuItem.value.component === store.component) {\n\t\t\tisLoading.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, false);\n\n\t\t// флаг загрузки будет сброшен при инициализации компонента\n\t\tisLoading.value = true;\n\n\t\t/**\n\t\t * Презагрузить компонент\n\t\t *\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\n\t\t */\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\n\n\t\t// влкадка была сменена еще раз во время sleepWhile\n\t\tif (numberChanged !== countChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\n\t\tstore.component = activeMenuItem.value.component;\n\n\t\tif (activeMenuItem.value && !store.component) {\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\n\t\t}\n\t},\n\t{ immediate: true },\n);\n\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView_menu': true,\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<!-- Спрятать меню под кнопку в popup -->\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\n\t\t\t<template #opener>\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<slot></slot>\n\t\t\t</template>\n\t\t</TopPopup>\n\n\t\t<!-- Отобразить меню на странице -->\n\t\t<template v-else>\n\t\t\t<div class=\"top-tabsView_menuList\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"isShortable\"\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\n\t\t\t>\n\t\t\t\t<TabsViewMenuItem\n\t\t\t\t\tv-if=\"isShortable\"\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\n\t\t\t\t>\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\n\t\t\t\t</TabsViewMenuItem>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style>\n/* режим отображение табов в основной области документа */\n.top-tabsView-pageMod .top-tabsView_menu {\n\tbox-sizing: border-box;\n\tposition: sticky;\n\ttop: var(--top-tabsView-top);\n\tz-index: 10;\n}\n\n/* режим отображение табов в основной области документа без popup */\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\n}\n\n/* стантартный режим */\n.top-tabsView_menu-inPopup_0 {\n\tbox-sizing: border-box;\n\twidth: var(--top-tabsView-menu-width);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tflex-shrink: 0;\n}\n\n/* режим вывода в popup */\n.top-tabsView_menu-inPopup_1 {\n\tborder-bottom: var(--top-tabsView-menu-border-bottom-width) solid var(--color-line-2-opacity);\n}\n\n.top-tabsView_menu-short {\n\twidth: auto;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\n\tbackground: var(--color-layer-1);\n}\n\n.top-tabsView_menuOpenerIcon { display: flex; }\n\n.top-tabsView_menuOpenerActiveItem {\n\t--top-forms-padding: 0px;\n\n\tbox-sizing: border-box;\n\tpadding: var(--top-tabsView-menu-opener-padding);\n\tmax-width: calc(100% - var(--top-forms-base-height));\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--top-padding-2);\n}\n\n.top-tabsView_menuList,\n.top-tabsView_menuFooter {\n\tpadding: var(--top-padding-2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-2);\n}\n\n.top-tabsView_menuList {\n\toverflow-y: auto;\n}\n\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\n\t--top-icon-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './types';\nimport { defineTabsStore } from './store';\nimport TabsViewMenu from './menu.vue';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\nimport { checkComponentIsLoading } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowMenuInPopup: undefined,\n\tisShortable: false,\n});\n\nconst model = defineModel<string>();\n\nconst store = defineTabsStore(props, model);\n\nconst uid = Math.random();\n\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\n\nonUnmounted(() => {\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\n\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\n});\n\nconst componentRef = ref();\nconst isLoading = ref(false);\n\nwatch([componentRef, () => store.component], () => {\n\tisLoading.value = checkComponentIsLoading(store.component);\n}, { immediate: true });\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView': true,\n\t\t\t'top-tabsView-pageMod': props.pageMod,\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<TabsViewMenu\n\t\t\t:isShortable=\"isShortable\"\n\t\t\tv-model:isLoading=\"isLoading\"\n\t\t>\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\n\t\t\t<slot name=\"menu\"></slot>\n\t\t</TabsViewMenu>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-tabsView_contents': true,\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\n\t\t\t}\"\n\t\t>\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t\t<keep-alive>\n\t\t\t\t<component\n\t\t\t\t\tref=\"componentRef\"\n\t\t\t\t\t:is=\"store.component\"\n\t\t\t\t/>\n\t\t\t</keep-alive>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n:root {\n\t--top-tabsView-top: 0px;\n\t--top-tabsView-menu-width: 220px;\n\t--top-tabsView-contents-offset-top: 0px;\n\t--top-tabsView-menu-border-bottom-width: 1px;\n\t--top-tabsView-menu-opener-padding: var(--top-padding-2);\n}\n\n.top-tabsView {\n\tbackground: var(--color-layout-middle);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n}\n\n.top-tabsView_contents {\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-layout-front-1);\n\tpadding: var(--top-padding-4);\n\tflex-grow: 1;\n\toverflow: auto;\n\tposition: relative;\n}\n\n.top-tabsView_contents-isLoading {\n\tpointer-events: none;\n}\n\n.top-tabsView_contents-noScrollable {\n\twidth: calc(100% - var(--top-tabsView-menu-width));\n\tpadding: 0;\n\toverflow: visible;\n}\n\n/* top-tabsView-inPopup */\n.top-tabsView-inPopup {\n\tbackground: var(--color-layout-front-1);\n\tflex-direction: column;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents {\n\tborder-radius: 0;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\n\twidth: auto;\n}\n\n@media only screen and (max-width: 900px) {\n\t:root {\n\t\t/* Суммарно должна быть высота элемента \".top-tabsView_menu\" */\n\t\t--top-tabsView-contents-offset-top: calc(var(--top-icon-size) + var(--top-tabsView-menu-opener-padding) * 2 + var(--top-tabsView-menu-border-bottom-width));\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\n</template>\n\n<style>\n.top-tabsView_menuDelimeter {\n\tpadding: var(--top-padding-1) 0;\n\tdisplay: flex;\n}\n\n.top-tabsView_menuDelimeter:before {\n\tcontent: \"\";\n\theight: 2px;\n\tbackground: var(--color-line-2);\n\tflex-grow: 1;\n}\n\n.top-tabsView_menuDelimeter:first-child,\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\n\tdisplay: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useTabsStore } from './store';\nimport type { PropsMenuTitle } from './types';\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\nimport { TopPopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</TopPopupListItem>\n\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\n\n\t<div\n\t\tv-else\n\t\t:class=\"{\n\t\t\t'top-tabsView_menuTitle': true,\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\n\t\t}\"\n\t>\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style>\n.top-tabsView_menuTitle {\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\n\tfont-weight: 600;\n\tcolor: var(--color-text-1);\n}\n\n.top-tabsView_menuTitle-subtitle {\n\tpadding-top: var(--top-padding-1);\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tcolor: var(--color-text-2);\n}\n</style>\n"]}
|
package/tabsView/tabsView.js
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
_autoloadCSSCore.insertCSSLinkToPage(fileNames, true);
|
|
6
6
|
/* end import css */
|
|
7
7
|
|
|
8
|
-
import { O as e, l as t, u as n } from "../.chunks/forms-
|
|
8
|
+
import { O as e, l as t, u as n } from "../.chunks/forms-CY5MOh7a.esm.js";
|
|
9
9
|
import { sleepWhile as r } from "../utils/system.js";
|
|
10
10
|
import { delHash as i, genHash as a, getHash as o, setHash as s } from "../utils/route.js";
|
|
11
11
|
import { r as c, t as l } from "../.chunks/store-DjQAOnrn.esm.js";
|
|
12
|
-
import { o as u, s as d } from "../.chunks/popup-
|
|
12
|
+
import { o as u, s as d } from "../.chunks/popup-3cwJ8Hev.esm.js";
|
|
13
13
|
import { Fragment as f, KeepAlive as p, computed as m, createBlock as h, createCommentVNode as g, createElementBlock as _, createElementVNode as v, createTextVNode as y, createVNode as b, defineComponent as x, markRaw as S, mergeModels as C, normalizeClass as w, onUnmounted as T, openBlock as E, ref as D, renderSlot as O, resolveDynamicComponent as k, toDisplayString as A, unref as j, useModel as M, useSlots as N, watch as P, withCtx as F } from "vue";
|
|
14
14
|
//#region src/core/utils/store/localStorage.ts
|
|
15
15
|
var I = (e, t) => `top:${String(e)}:${t}`, L = {
|