@topvisor/ui 1.4.3-1 → 1.4.3-projectSelector.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.chunks/{core-CkdcFIiA.amd.js → core-BEpKBNHt.amd.js} +2 -2
- package/.chunks/{core-CkdcFIiA.amd.js.map → core-BEpKBNHt.amd.js.map} +1 -1
- package/.chunks/{core-D8Ou2oPH.es.js → core-DBWAn2Eg.es.js} +4 -4
- package/.chunks/{core-D8Ou2oPH.es.js.map → core-DBWAn2Eg.es.js.map} +1 -1
- package/.chunks/{datepicker-Dhlk31EZ.amd.js → datepicker-C5ErMHwe.amd.js} +2 -2
- package/.chunks/{datepicker-Dhlk31EZ.amd.js.map → datepicker-C5ErMHwe.amd.js.map} +1 -1
- package/.chunks/{datepicker-3ihHfSr7.es.js → datepicker-DMYB1RFK.es.js} +2 -2
- package/.chunks/{datepicker-3ihHfSr7.es.js.map → datepicker-DMYB1RFK.es.js.map} +1 -1
- package/.chunks/{dialog_regionSelectorRegions-D9ZHTNkd.es.js → dialog_regionSelectorRegions-BMWyYCfD.es.js} +4 -4
- package/.chunks/{dialog_regionSelectorRegions-D9ZHTNkd.es.js.map → dialog_regionSelectorRegions-BMWyYCfD.es.js.map} +1 -1
- package/.chunks/{dialog_regionSelectorRegions-nk70o5Ht.amd.js → dialog_regionSelectorRegions-CHC-Blbu.amd.js} +2 -2
- package/.chunks/{dialog_regionSelectorRegions-nk70o5Ht.amd.js.map → dialog_regionSelectorRegions-CHC-Blbu.amd.js.map} +1 -1
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-BI9rU5DL.es.js → dialogs.vue_vue_type_script_setup_true_lang-BZM_iKPW.es.js} +2 -2
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-BI9rU5DL.es.js.map → dialogs.vue_vue_type_script_setup_true_lang-BZM_iKPW.es.js.map} +1 -1
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-B8xv-moy.amd.js → dialogs.vue_vue_type_script_setup_true_lang-C3qaTBlO.amd.js} +2 -2
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-B8xv-moy.amd.js.map → dialogs.vue_vue_type_script_setup_true_lang-C3qaTBlO.amd.js.map} +1 -1
- package/.chunks/{forms-CsPxqywz.es.js → forms-CUaoBGD5.es.js} +199 -195
- package/.chunks/{forms-CsPxqywz.es.js.map → forms-CUaoBGD5.es.js.map} +1 -1
- package/.chunks/{forms-D6S85mMQ.amd.js → forms-EhKRBbpk.amd.js} +3 -3
- package/.chunks/{forms-D6S85mMQ.amd.js.map → forms-EhKRBbpk.amd.js.map} +1 -1
- package/.chunks/{notice-IPOLYVCW.es.js → notice-Chj1PUTD.es.js} +2 -2
- package/.chunks/{notice-IPOLYVCW.es.js.map → notice-Chj1PUTD.es.js.map} +1 -1
- package/.chunks/{notice-CNyRUCZZ.amd.js → notice-DQb_Za5_.amd.js} +2 -2
- package/.chunks/{notice-CNyRUCZZ.amd.js.map → notice-DQb_Za5_.amd.js.map} +1 -1
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-CRea7lRi.es.js → page.vue_vue_type_script_setup_true_lang-C-xQ-eC7.es.js} +4 -4
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-CRea7lRi.es.js.map → page.vue_vue_type_script_setup_true_lang-C-xQ-eC7.es.js.map} +1 -1
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-BEpRLx2z.amd.js → page.vue_vue_type_script_setup_true_lang-bUK5c5qn.amd.js} +2 -2
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-BEpRLx2z.amd.js.map → page.vue_vue_type_script_setup_true_lang-bUK5c5qn.amd.js.map} +1 -1
- package/.chunks/policy.vue_vue_type_style_index_0_lang-AfwHvWs8.amd.js +2 -0
- package/.chunks/policy.vue_vue_type_style_index_0_lang-AfwHvWs8.amd.js.map +1 -0
- package/.chunks/policy.vue_vue_type_style_index_0_lang-BiCaYVJ6.es.js +515 -0
- package/.chunks/policy.vue_vue_type_style_index_0_lang-BiCaYVJ6.es.js.map +1 -0
- package/.chunks/{popup-BrEWCQkR.amd.js → popup-CDaQNt-3.amd.js} +2 -2
- package/.chunks/{popup-BrEWCQkR.amd.js.map → popup-CDaQNt-3.amd.js.map} +1 -1
- package/.chunks/{popup-DvXkX-lu.es.js → popup-COONSpqs.es.js} +2 -2
- package/.chunks/{popup-DvXkX-lu.es.js.map → popup-COONSpqs.es.js.map} +1 -1
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-KuWtifP4.amd.js → popupHint.vue_vue_type_style_index_0_lang-24i49Ad3.amd.js} +2 -2
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-KuWtifP4.amd.js.map → popupHint.vue_vue_type_style_index_0_lang-24i49Ad3.amd.js.map} +1 -1
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-TWsWJQFN.es.js → popupHint.vue_vue_type_style_index_0_lang-DzT1BFMx.es.js} +2 -2
- package/.chunks/{popupHint.vue_vue_type_style_index_0_lang-TWsWJQFN.es.js.map → popupHint.vue_vue_type_style_index_0_lang-DzT1BFMx.es.js.map} +1 -1
- package/.chunks/utils-C2_4b48S.amd.js +2 -0
- package/.chunks/{utils-Daq8EBlT.amd.js.map → utils-C2_4b48S.amd.js.map} +1 -1
- package/.chunks/{utils-BlXb8CrZ.es.js → utils-DQ-xahGh.es.js} +4 -4
- package/.chunks/{utils-BlXb8CrZ.es.js.map → utils-DQ-xahGh.es.js.map} +1 -1
- package/.chunks/{utils-B0_n8dlR.amd.js → utils-DsGgpnXD.amd.js} +2 -2
- package/.chunks/{utils-B0_n8dlR.amd.js.map → utils-DsGgpnXD.amd.js.map} +1 -1
- package/.chunks/{utils-BywGu5Tr.es.js → utils-Kzz2mc2t.es.js} +2 -2
- package/.chunks/{utils-BywGu5Tr.es.js.map → utils-Kzz2mc2t.es.js.map} +1 -1
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-Pp4anQxP.es.js → widgetInput.vue_vue_type_script_setup_true_lang-BuoAaghB.es.js} +2 -2
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-Pp4anQxP.es.js.map → widgetInput.vue_vue_type_script_setup_true_lang-BuoAaghB.es.js.map} +1 -1
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-BUY8yqxb.amd.js → widgetInput.vue_vue_type_script_setup_true_lang-Dgjj70vU.amd.js} +2 -2
- package/.chunks/{widgetInput.vue_vue_type_script_setup_true_lang-BUY8yqxb.amd.js.map → widgetInput.vue_vue_type_script_setup_true_lang-Dgjj70vU.amd.js.map} +1 -1
- package/assets/charts.css +1 -1
- package/assets/core.css +1 -1
- package/assets/forms.css +1 -1
- package/assets/notice.css +1 -1
- package/assets/policy.css +1 -1
- package/assets/project.css +1 -1
- package/charts/charts.amd.js +1 -1
- package/charts/charts.js +1 -1
- package/core/app.amd.js +1 -1
- package/core/app.js +5 -5
- package/dialog/dialog.amd.js +1 -1
- package/dialog/dialog.js +2 -2
- package/extra/extra.amd.js +1 -1
- package/extra/extra.amd.js.map +1 -1
- package/extra/extra.js +9 -6
- package/extra/extra.js.map +1 -1
- package/forms/forms.amd.js +1 -1
- package/forms/forms.js +1 -1
- package/forms/helpers.amd.js +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.js +2 -2
- package/layout/layout.amd.js +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 +6 -6
- package/popup/popup.js.map +1 -1
- package/popup/worker.amd.js +1 -1
- package/popup/worker.js +2 -2
- package/project/project.amd.js +1 -1
- package/project/project.amd.js.map +1 -1
- package/project/project.js +857 -524
- package/project/project.js.map +1 -1
- package/src/components/formsExt/selector2/composables/useAPI.d.ts +2 -0
- package/src/components/formsExt/selector2/composables/useMenu.d.ts +3 -1
- package/src/components/formsExt/selector2/selector2.vue.d.ts +2 -0
- package/src/components/formsExt/selector2/types.d.ts +26 -0
- package/src/components/popup/popup/listItem.vue.d.ts +24 -4
- package/src/components/popup/popup/types.d.ts +1 -0
- package/src/components/project/groupSelector/groups/groups.vue.d.ts +9 -1
- package/src/components/project/groupSelector/groups/utils.d.ts +1 -1
- package/src/components/project/project.d.ts +1 -0
- package/src/components/project/projectSelector/cache.d.ts +30 -0
- package/src/components/project/projectSelector/projectSelector.vue.d.ts +128 -0
- package/src/components/project/projectSelector/submenu/submenu.vue.d.ts +4 -0
- package/src/components/project/projectSelector/submenu/types.d.ts +17 -0
- package/src/components/project/projectSelector/types.d.ts +52 -0
- package/src/components/project/projectSelector/utils.d.ts +230 -0
- package/src/core/utils/tests/date/dateFormat.test.d.ts +1 -0
- package/tabsView/tabsView.amd.js +1 -1
- package/tabsView/tabsView.js +3 -3
- package/tabsView/tabsView.js.map +1 -1
- package/utils/clipboard.amd.js +1 -1
- package/utils/clipboard.js +1 -1
- package/utils/date.amd.js +1 -1
- package/utils/date.js +1 -1
- package/utils/device.amd.js +1 -1
- package/utils/device.js +1 -1
- package/utils/lodash.amd.js +1 -1
- package/utils/lodash.js +1 -1
- package/utils/price.amd.js +1 -1
- package/utils/price.js +1 -1
- package/utils/searchers.amd.js +1 -1
- package/utils/searchers.js +3 -3
- package/utils/string.amd.js +1 -1
- package/utils/string.js +1 -1
- package/.chunks/policy.vue_vue_type_style_index_0_lang-CtJ7J9YB.amd.js +0 -2
- package/.chunks/policy.vue_vue_type_style_index_0_lang-CtJ7J9YB.amd.js.map +0 -1
- package/.chunks/policy.vue_vue_type_style_index_0_lang-D-FVZi-G.es.js +0 -496
- package/.chunks/policy.vue_vue_type_style_index_0_lang-D-FVZi-G.es.js.map +0 -1
- package/.chunks/utils-Daq8EBlT.amd.js +0 -2
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { Item } from '../../formsExt/selector2/types';
|
|
2
|
+
import { paths } from 'topvisor-openapi/src/ts/Topvisor';
|
|
3
|
+
import { components } from 'topvisor-openapi/src/ts/TV/API/Params/FieldsTrait';
|
|
4
|
+
import { components } from 'topvisor-openapi/src/ts/TV/API/Params/OrdersTrait';
|
|
5
|
+
import { components } from 'topvisor-openapi/src/ts/TV/API/Params/FiltersTrait';
|
|
6
|
+
import { components } from 'topvisor-openapi/src/ts/TV/API/Params/LimitTrait';
|
|
7
|
+
import { components } from 'topvisor-openapi/src/ts/TV/API/Params/OffsetTrait';
|
|
8
|
+
import { components } from 'topvisor-openapi/src/ts/TV/API/Types/UrlShort';
|
|
9
|
+
/**
|
|
10
|
+
* Сгенерировать ссылку на проект
|
|
11
|
+
*/
|
|
12
|
+
export declare const genProjectLink: (projectId: number) => string;
|
|
13
|
+
/**
|
|
14
|
+
* Добавить к данным проектов `listItemProps`
|
|
15
|
+
*
|
|
16
|
+
* @see Item
|
|
17
|
+
*/
|
|
18
|
+
export declare const addListItemProps: (projects?: Item[], addLinksToProjects?: boolean) => Item[] | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Сгенерировать ссылку на сайт проекта
|
|
21
|
+
*/
|
|
22
|
+
export declare const genProjectExternalLink: (url: string) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Создать API запрос на получение списка проектов
|
|
25
|
+
*
|
|
26
|
+
* Данные после загрузки преобразуются с помощью `prepareProjects()`
|
|
27
|
+
*
|
|
28
|
+
* @see prepareProjects
|
|
29
|
+
*/
|
|
30
|
+
export declare const genApiGetProjects: (client: Api.Client<Api.TV.Paths, true>, userId: number, excludeProjectId?: number, params?: Record<string, number>) => Api.ClientRequest<Api.ClientRequestContext< paths, "/get/projects_2/projects/", true>, ("name" | "id" | "on" | "right" | "url" | "user_id")[], Api.Params<Api.ClientRequestContext< paths, "/get/projects_2/projects/", true>, undefined, {
|
|
31
|
+
"COUNT(*)"?: any;
|
|
32
|
+
"IS_YOUTUBE()"?: any;
|
|
33
|
+
"IS_APP_STORE()"?: any;
|
|
34
|
+
"IS_GOOGLE_PLAY()"?: any;
|
|
35
|
+
"GEN_SEARCH_STRING()"?: any;
|
|
36
|
+
id?: any;
|
|
37
|
+
user_id?: any;
|
|
38
|
+
name?: string | null;
|
|
39
|
+
url?: any;
|
|
40
|
+
date?: any;
|
|
41
|
+
last_view?: any;
|
|
42
|
+
folder_id?: number | null;
|
|
43
|
+
folder_name?: any;
|
|
44
|
+
task_time_delete?: any;
|
|
45
|
+
task_method_name?: any;
|
|
46
|
+
task_method_params_json?: any;
|
|
47
|
+
task_status?: any;
|
|
48
|
+
task_progress?: any;
|
|
49
|
+
site?: any;
|
|
50
|
+
update?: any;
|
|
51
|
+
status_positions?: string | null;
|
|
52
|
+
positions_time?: any;
|
|
53
|
+
positions_date?: any;
|
|
54
|
+
positions_percent?: any;
|
|
55
|
+
status_positions_time?: any;
|
|
56
|
+
status_positions_date?: any;
|
|
57
|
+
status_positions_percent?: any;
|
|
58
|
+
status_positions_by_keywords?: any;
|
|
59
|
+
status_volumes?: any;
|
|
60
|
+
status_claster?: any;
|
|
61
|
+
status_audit?: any;
|
|
62
|
+
status_audit_time?: any;
|
|
63
|
+
status_audit_percent?: any;
|
|
64
|
+
status_watcher?: any;
|
|
65
|
+
status_watcher_percent?: any;
|
|
66
|
+
status_indexing?: any;
|
|
67
|
+
status_indexing_percent?: any;
|
|
68
|
+
status_sitemap?: any;
|
|
69
|
+
status_sitemap_percent?: any;
|
|
70
|
+
status_urlsUpdater?: any;
|
|
71
|
+
status_ai_tracker?: any;
|
|
72
|
+
status_ai_tracker_time?: any;
|
|
73
|
+
status_ai_tracker_date?: any;
|
|
74
|
+
status_ai_tracker_percent?: any;
|
|
75
|
+
on?: any;
|
|
76
|
+
subdomains?: any;
|
|
77
|
+
filter?: any;
|
|
78
|
+
auto_correct?: any;
|
|
79
|
+
with_snippets?: any;
|
|
80
|
+
do_snapshots?: any;
|
|
81
|
+
do_snapshots_with_snippets?: any;
|
|
82
|
+
report_last_time?: any;
|
|
83
|
+
common_traffic?: any;
|
|
84
|
+
guest_link_right?: any;
|
|
85
|
+
is_task?: any;
|
|
86
|
+
count_keywords?: any;
|
|
87
|
+
right?: any;
|
|
88
|
+
ord?: any;
|
|
89
|
+
favorite?: any;
|
|
90
|
+
tags?: any;
|
|
91
|
+
user_email?: any;
|
|
92
|
+
user_currency?: any;
|
|
93
|
+
broker_count_campaigns?: any;
|
|
94
|
+
broker_count_banners?: any;
|
|
95
|
+
broker_count_banners_off?: any;
|
|
96
|
+
domain_expire?: any;
|
|
97
|
+
ssl_expire?: any;
|
|
98
|
+
competitor?: any;
|
|
99
|
+
competitor_ord?: any;
|
|
100
|
+
pos_summary_up?: any;
|
|
101
|
+
pos_summary_stay?: any;
|
|
102
|
+
pos_summary_down?: any;
|
|
103
|
+
pos_summary_avg?: any;
|
|
104
|
+
pos_summary_visibility?: any;
|
|
105
|
+
audit_server_location?: any;
|
|
106
|
+
audit_auto_collect_pages?: number | null;
|
|
107
|
+
audit_auto_collect_pages_limit?: number | null;
|
|
108
|
+
indexing_searchers_keys?: unknown[] | null;
|
|
109
|
+
watcher_types?: unknown[] | null;
|
|
110
|
+
ai_tracker_brand_name?: any;
|
|
111
|
+
ai_tracker_aliases?: unknown[] | null;
|
|
112
|
+
ai_tracker_models?: unknown[] | null;
|
|
113
|
+
ai_tracker_context_lang?: any;
|
|
114
|
+
ai_tracker_context_location?: any;
|
|
115
|
+
}, {
|
|
116
|
+
show_owner_balance?: boolean | null;
|
|
117
|
+
show_site_stat?: boolean | null;
|
|
118
|
+
show_searchers_and_regions?: number;
|
|
119
|
+
include_positions_summary?: boolean | null;
|
|
120
|
+
include_positions_summary_params?: unknown[] | null;
|
|
121
|
+
is_task?: boolean | null;
|
|
122
|
+
fields?: components["schemas"]["TV.API.Params.FieldsTrait"]["fields"];
|
|
123
|
+
orders?: components["schemas"]["TV.API.Params.OrdersTrait"]["orders"];
|
|
124
|
+
filters?: components["schemas"]["TV.API.Params.FiltersTrait"]["filters"];
|
|
125
|
+
id?: components["schemas"]["TV.API.Params.FiltersTrait"]["id"];
|
|
126
|
+
limit?: components["schemas"]["TV.API.Params.LimitTrait"]["limit"];
|
|
127
|
+
offset?: components["schemas"]["TV.API.Params.OffsetTrait"] /**
|
|
128
|
+
* Подготавить данные проектов для отображения:
|
|
129
|
+
* - убрать из результата проект с указанным `excludeProjectId`
|
|
130
|
+
* - сбросить состояние вставки заголовков категорий, если требуется
|
|
131
|
+
* - добавить `listItemProps`
|
|
132
|
+
* - добавить заголовки к категориям
|
|
133
|
+
*/["offset"];
|
|
134
|
+
}>, Api.ModelFields<{
|
|
135
|
+
"COUNT(*)"?: any;
|
|
136
|
+
"IS_YOUTUBE()"?: any;
|
|
137
|
+
"IS_APP_STORE()"?: any;
|
|
138
|
+
"IS_GOOGLE_PLAY()"?: any;
|
|
139
|
+
"GEN_SEARCH_STRING()"?: any;
|
|
140
|
+
id?: any;
|
|
141
|
+
user_id?: any;
|
|
142
|
+
name?: string | null;
|
|
143
|
+
url?: any;
|
|
144
|
+
date?: any;
|
|
145
|
+
last_view?: any;
|
|
146
|
+
folder_id?: number | null;
|
|
147
|
+
folder_name?: any;
|
|
148
|
+
task_time_delete?: any;
|
|
149
|
+
task_method_name?: any;
|
|
150
|
+
task_method_params_json?: any;
|
|
151
|
+
task_status?: any;
|
|
152
|
+
task_progress?: any;
|
|
153
|
+
site?: any;
|
|
154
|
+
update?: any;
|
|
155
|
+
status_positions?: string | null;
|
|
156
|
+
positions_time?: any;
|
|
157
|
+
positions_date?: any;
|
|
158
|
+
positions_percent?: any;
|
|
159
|
+
status_positions_time?: any;
|
|
160
|
+
status_positions_date?: any;
|
|
161
|
+
status_positions_percent?: any;
|
|
162
|
+
status_positions_by_keywords?: any;
|
|
163
|
+
status_volumes?: any;
|
|
164
|
+
status_claster?: any;
|
|
165
|
+
status_audit?: any;
|
|
166
|
+
status_audit_time?: any;
|
|
167
|
+
status_audit_percent?: any;
|
|
168
|
+
status_watcher?: any;
|
|
169
|
+
status_watcher_percent?: any;
|
|
170
|
+
status_indexing?: any;
|
|
171
|
+
status_indexing_percent?: any;
|
|
172
|
+
status_sitemap?: any;
|
|
173
|
+
status_sitemap_percent?: any;
|
|
174
|
+
status_urlsUpdater?: any;
|
|
175
|
+
status_ai_tracker?: any;
|
|
176
|
+
status_ai_tracker_time?: any;
|
|
177
|
+
status_ai_tracker_date?: any;
|
|
178
|
+
status_ai_tracker_percent?: any;
|
|
179
|
+
on?: any;
|
|
180
|
+
subdomains?: any;
|
|
181
|
+
filter?: any;
|
|
182
|
+
auto_correct?: any;
|
|
183
|
+
with_snippets?: any;
|
|
184
|
+
do_snapshots?: any;
|
|
185
|
+
do_snapshots_with_snippets?: any;
|
|
186
|
+
report_last_time?: any;
|
|
187
|
+
common_traffic?: any;
|
|
188
|
+
guest_link_right?: any;
|
|
189
|
+
is_task?: any;
|
|
190
|
+
count_keywords?: any;
|
|
191
|
+
right?: any;
|
|
192
|
+
ord?: any;
|
|
193
|
+
favorite?: any;
|
|
194
|
+
tags?: any;
|
|
195
|
+
user_email?: any;
|
|
196
|
+
user_currency?: any;
|
|
197
|
+
broker_count_campaigns?: any;
|
|
198
|
+
broker_count_banners?: any;
|
|
199
|
+
broker_count_banners_off?: any;
|
|
200
|
+
domain_expire?: any;
|
|
201
|
+
ssl_expire?: any;
|
|
202
|
+
competitor?: any;
|
|
203
|
+
competitor_ord?: any;
|
|
204
|
+
pos_summary_up?: any;
|
|
205
|
+
pos_summary_stay?: any;
|
|
206
|
+
pos_summary_down?: any;
|
|
207
|
+
pos_summary_avg?: any;
|
|
208
|
+
pos_summary_visibility?: any;
|
|
209
|
+
audit_server_location?: any;
|
|
210
|
+
audit_auto_collect_pages?: number | null;
|
|
211
|
+
audit_auto_collect_pages_limit?: number | null;
|
|
212
|
+
indexing_searchers_keys?: unknown[] | null;
|
|
213
|
+
watcher_types?: unknown[] | null;
|
|
214
|
+
ai_tracker_brand_name?: any;
|
|
215
|
+
ai_tracker_aliases?: unknown[] | null;
|
|
216
|
+
ai_tracker_models?: unknown[] | null;
|
|
217
|
+
ai_tracker_context_lang?: any;
|
|
218
|
+
ai_tracker_context_location?: any;
|
|
219
|
+
}> | undefined>;
|
|
220
|
+
/**
|
|
221
|
+
* Создать API запрос для добавления проекта
|
|
222
|
+
*/
|
|
223
|
+
export declare const genApiAddProject: (client: Api.Client<Api.TV.Paths, true>) => Api.ClientRequest<Api.ClientRequestContext< paths, "/add/projects_2/projects/", true>, never, Omit<{
|
|
224
|
+
url: components["schemas"]["TV.API.Types.UrlShort"];
|
|
225
|
+
name?: string | null;
|
|
226
|
+
tags?: unknown[] | null;
|
|
227
|
+
folder_id?: number | null;
|
|
228
|
+
on?: number | null;
|
|
229
|
+
is_task?: boolean | null;
|
|
230
|
+
}, "fields" | "filters" | "orders" | "fetch_style">, never>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/tabsView/tabsView.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","vue","../.chunks/forms-
|
|
1
|
+
define(["require","exports","vue","../.chunks/forms-EhKRBbpk.amd","../utils/route.amd","../.chunks/store-YRW59xEF.amd","../.chunks/popupHint.vue_vue_type_style_index_0_lang-24i49Ad3.amd","../utils/system.amd","../require/css.amd!../assets/tabsView.css"],(function(A,h,e,p,f,g,S,M){"use strict";if(typeof e>"u")var e=window.Vue;const k=(o,n)=>`top:${String(o)}:${n}`,y={loadLocalStorge:(o,n)=>{if(!n.$id)return;const t=k(o,n.$id);try{const a=JSON.parse(localStorage.getItem(t));typeof a==typeof n[o]&&(n[o]=a)}catch{console.warn(new Error(`В localStorage[${t}] не корректный json`))}},addSaverLocalStorge:(o,n)=>{if(!n.$id)return;const t=k(o,n.$id);e.watch(()=>n[o],()=>{localStorage.setItem(t,JSON.stringify(n[o]))},{immediate:!0})}},_=new Set;addEventListener("popstate",o=>{_.forEach(n=>n(o))});const V=Symbol(),$=(o,n)=>{const t=g.defineStore(V,()=>{const a=e.computed(()=>o.showMenuInPopup??p.Core.state.isMobile),i=e.computed(()=>o.pageMod),u=e.ref(!1),r=e.ref(void 0),l=e.ref(!0);return{showMenuInPopup:a,pageMod:i,isShort:u,activeItemName:n,component:r,scrollable:l}},o.idState);if(o.isShortable){const a="isShort";y.loadLocalStorge(a,t),y.addSaverLocalStorge(a,t)}if(t.$id){const a=i=>{n.value=f.getHash(t.$id)};_.add(a)}return t},w=()=>g.useStore(V),N={key:1,class:"top-ellipsis"},v=e.defineComponent({__name:"menuItem",props:{name:{},href:{},icon:{},disabled:{type:Boolean},component:{default:void 0},scrollable:{type:Boolean,default:!0}},setup(o){const n=o,t=w(),a=e.computed(()=>n.name&&t.$id?f.genHash(t.$id,n.name):n.href),i=e.computed(()=>t.showMenuInPopup?S._sfc_main$2:a?"a":"button"),u=r=>{!n.href&&a.value&&r.preventDefault(),n.name&&(t.activeItemName=n.name)};return(r,l)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(i.value),{target:"_self",class:e.normalizeClass({"top-tabsView_menuItem":!e.unref(t).showMenuInPopup,"top-active":o.name&&e.unref(t).activeItemName===o.name,"top-disabled":o.disabled,"top-spa-disabled":!0}),href:a.value,"data-top-icon":o.icon||void 0,disabled:o.disabled||void 0,onClick:u},{default:e.withCtx(()=>[e.unref(t).showMenuInPopup?e.renderSlot(r.$slots,"default",{key:0}):r.$slots.default&&!e.unref(t).isShort?(e.openBlock(),e.createElementBlock("span",N,[e.renderSlot(r.$slots,"default")])):e.createCommentVNode("",!0)]),_:3},8,["class","href","data-top-icon","disabled"]))}}),B=o=>o?.name==="AsyncComponentWrapper"&&!o?.__asyncResolved,C=async(o,n)=>{o?.name==="AsyncComponentWrapper"&&(o?.__asyncResolved||(o.__asyncLoader(),await M.sleepWhile(()=>n()&&B(o),200)))},L={class:"top-tabsView_menuOpener"},E=["data-top-icon"],P={class:"top-ellipsis"},T={class:"top-tabsView_menuList"},z={key:0,class:"top-tabsView_menuFooter"},R=e.defineComponent({__name:"menu",props:e.mergeModels({isShortable:{type:Boolean},isLoading:{type:Boolean}},{isLoading:{},isLoadingModifiers:{}}),emits:["update:isLoading"],setup(o){const n=e.useModel(o,"isLoading"),t=w(),a=e.useSlots(),i=new Map,u=()=>{if(!a.default)return;const c=a.default({}).find(s=>s.key==="_menu");c&&r(c.children)},r=c=>{c.forEach(s=>{if(s.type.__name&&s.type.__name!==v.__name)return;if(!s.type.__name&&typeof s.children=="object"){r(s.children);return}if(!s.props?.name||s.props?.disabled)return;const I={title:(s.children.default?.()[0].children).trim(),icon:s.props.icon,component:s.props.component?e.markRaw(s.props.component):v.props.component.default,scrollable:s.props.scrollable??v.props.scrollable.default};i.set(s.props.name,I)})},l=e.ref(null);let d=0;e.watch(()=>t.activeItemName,async()=>{const c=++d;if(i.size===0&&u(),i.size===0){t.activeItemName="";return}if(l.value=i.get(t.activeItemName)??null,!l.value&&t.$id){const s=f.getHash(t.$id);if(l.value=i.get(s)??null,l.value){t.activeItemName=s;return}}if(!l.value){t.activeItemName=i.keys().next().value;return}if(l.value.component===t.component){n.value=!1;return}t.$id&&f.setHash(t.$id,t.activeItemName,!1),n.value=!0,await C(l.value.component,()=>c===d),c===d&&(t.scrollable=l.value.scrollable,t.component=l.value.component,l.value&&!t.component&&console.warn(`Компонент вкладки ${t.activeItemName} не найден. Добавьте props.component для пункта меню ${t.activeItemName}.`))},{immediate:!0});const m=e.ref();let b;return e.onMounted(()=>{b=new ResizeObserver(()=>{m.value.parentElement.style.setProperty("--top-tabsView-contents-offset-top",m.value.offsetHeight+"px")}),b.observe(m.value)}),e.onUnmounted(()=>{b.disconnect()}),(c,s)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:m,class:e.normalizeClass({"top-tabsView_menu":!0,"top-tabsView_menu-inPopup_0":!e.unref(t).showMenuInPopup,"top-tabsView_menu-inPopup_1":e.unref(t).showMenuInPopup,"top-tabsView_menu-short":e.unref(t).isShort&&!e.unref(t).showMenuInPopup})},[e.unref(t).showMenuInPopup?(e.openBlock(),e.createBlock(e.unref(S._sfc_main),{key:0},{opener:e.withCtx(()=>[e.createElementVNode("div",L,[l.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-tabsView_menuOpenerActiveItem","data-top-icon":l.value.icon},[e.createElementVNode("span",P,e.toDisplayString(l.value.title),1)],8,E)):e.createCommentVNode("",!0),s[1]||(s[1]=e.createElementVNode("div",{class:"top-tabsView_menuOpenerIcon","data-top-icon":""},null,-1))])]),contentList:e.withCtx(()=>[e.renderSlot(c.$slots,"default")]),_:3})):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",T,[e.renderSlot(c.$slots,"default")]),o.isShortable?(e.openBlock(),e.createElementBlock("div",z,[o.isShortable?(e.openBlock(),e.createBlock(v,{key:0,icon:e.unref(t).isShort?"":"",onClick:s[0]||(s[0]=I=>e.unref(t).isShort=!e.unref(t).isShort)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(t).isShort?"":"Свернуть"),1)]),_:1},8,["icon"])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],64))],2))}}),O=e.defineComponent({__name:"tabsView",props:e.mergeModels({modelValue:{},pageMod:{type:Boolean},showMenuInPopup:{type:Boolean,default:void 0},isShortable:{type:Boolean,default:!1},idState:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(o){const n=o,t=e.useModel(o,"modelValue"),a=$(n,t),i=Math.random();n.pageMod&&p.Core.state.documentClassModificators.set(i,"top-hasTabsViewPageMod"),e.onUnmounted(()=>{n.pageMod&&p.Core.state.documentClassModificators.delete(i),a.$id&&f.delHash(a.$id,a.activeItemName,!0)});const u=e.ref(),r=e.ref(!1);return e.watch([u,()=>a.component],()=>{r.value=B(a.component)},{immediate:!0}),(l,d)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-tabsView":!0,"top-tabsView-pageMod":n.pageMod,"top-tabsView-inPopup":e.unref(a).showMenuInPopup})},[e.createVNode(R,{isShortable:o.isShortable,isLoading:r.value,"onUpdate:isLoading":d[0]||(d[0]=m=>r.value=m)},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"menu")]),_:3},8,["isShortable","isLoading"]),e.createElementVNode("div",{class:e.normalizeClass({"top-tabsView_contents":!0,"top-tabsView_contents-isLoading":r.value,"top-tabsView_contents-noScrollable":!e.unref(a).scrollable})},[r.value?(e.openBlock(),e.createBlock(p.TopLoadbar,{key:0})):e.createCommentVNode("",!0),(e.openBlock(),e.createBlock(e.KeepAlive,null,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(e.unref(a).component),{ref_key:"componentRef",ref:u},null,512))],1024))],2)],2))}}),D={},H={class:"top-tabsView_menuDelimeter"};function K(o,n){return e.openBlock(),e.createElementBlock("div",H)}const j=p._export_sfc(D,[["render",K]]),x=e.defineComponent({__name:"menuTitle",props:{isSubtitle:{type:Boolean}},setup(o){const n=w();return(t,a)=>e.unref(n).showMenuInPopup?(e.openBlock(),e.createBlock(e.unref(S._sfc_main$2),{key:0,type:"title"},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"default")]),_:3})):e.unref(n).isShort?(e.openBlock(),e.createBlock(j,{key:1})):(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass({"top-tabsView_menuTitle":!0,"top-tabsView_menuTitle-subtitle":o.isSubtitle})},[e.renderSlot(t.$slots,"default")],2))}});h.TopTabsView=O,h.TopTabsViewMenuItem=v,h.TopTabsViewMenuTitle=x,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=tabsView.amd.js.map
|
package/tabsView/tabsView.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
_autoloadCSSCore.insertCSSLinkToPage(fileNames, true);
|
|
5
5
|
|
|
6
6
|
import { watch as k, computed as I, ref as f, defineComponent as M, createBlock as m, openBlock as r, resolveDynamicComponent as B, normalizeClass as g, unref as s, withCtx as b, renderSlot as v, createElementBlock as p, createCommentVNode as S, mergeModels as R, useModel as C, useSlots as j, onMounted as x, onUnmounted as E, createElementVNode as y, toDisplayString as P, Fragment as F, createTextVNode as W, markRaw as J, createVNode as U, KeepAlive as q } from "vue";
|
|
7
|
-
import { C as V, T as G, k as Q } from "../.chunks/forms-
|
|
7
|
+
import { C as V, T as G, k as Q } from "../.chunks/forms-CUaoBGD5.es.js";
|
|
8
8
|
import { getHash as O, genHash as X, setHash as Y, delHash as Z } from "../utils/route.js";
|
|
9
9
|
import { u as ee, d as te } from "../.chunks/store-CX_6ZXhO.es.js";
|
|
10
|
-
import { b as z, _ as oe } from "../.chunks/popupHint.vue_vue_type_style_index_0_lang-
|
|
10
|
+
import { b as z, _ as oe } from "../.chunks/popupHint.vue_vue_type_style_index_0_lang-DzT1BFMx.es.js";
|
|
11
11
|
import { sleepWhile as ae } from "../utils/system.js";
|
|
12
12
|
const D = (t, o) => `top:${String(t)}:${o}`, ne = (t, o) => {
|
|
13
13
|
if (!o.$id) return;
|
|
@@ -31,7 +31,7 @@ const D = (t, o) => `top:${String(t)}:${o}`, ne = (t, o) => {
|
|
|
31
31
|
addEventListener("popstate", (t) => {
|
|
32
32
|
H.forEach((o) => o(t));
|
|
33
33
|
});
|
|
34
|
-
const K = Symbol(), ie = (t, o) => {
|
|
34
|
+
const K = /* @__PURE__ */ Symbol(), ie = (t, o) => {
|
|
35
35
|
const e = te(K, () => {
|
|
36
36
|
const a = I(() => t.showMenuInPopup ?? V.state.isMobile), c = I(() => t.pageMod), d = f(!1), l = f(void 0), i = f(!0);
|
|
37
37
|
return {
|
package/tabsView/tabsView.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabsView.js","sources":["../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue"],"sourcesContent":["import { watch } from 'vue';\nimport type { Store } from './store';\n\n/**\n * Сгенерировать имя для сохранения данных в localStorage\n * @param stateName - имя свойства состояния\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\n */\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\n\tconst stateNameString = String(stateName);\n\n\treturn `top:${stateNameString}:${stateKey}`;\n};\n\n/**\n * Загрузить состояние\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\ttry {\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\n\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\n\t\t\tstore[stateName] = localStorageValue;\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\n\t}\n};\n\n/**\n * Добавить автосохранение состояние при его изменении\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\twatch(() => store[stateName], () => {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\n\t}, { immediate: true });\n};\n\nexport default {\n\tloadLocalStorge,\n\taddSaverLocalStorge,\n};","import type { InjectionKey, ModelRef, UnwrapNestedRefs } from 'vue';\nimport { computed, ref } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './types';\nimport { getHash } from '@/core/utils/route';\n\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\n\naddEventListener('popstate', (e) => {\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\n});\n\nexport const injectionKey = Symbol() as InjectionKey<Store>;\n\n/**\n * Инициировать Store компонента\n */\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>): UnwrapNestedRefs<Store> & DefineStore => {\n\tconst store = defineStore(injectionKey, () => {\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\n\t\tconst pageMod = computed(() => props.pageMod);\n\t\tconst isShort = ref(false);\n\n\t\tconst component = ref(undefined);\n\t\tconst scrollable = ref(true);\n\n\t\treturn {\n\t\t\tshowMenuInPopup,\n\t\t\tpageMod,\n\t\t\tisShort,\n\t\t\tactiveItemName: model,\n\t\t\tcomponent,\n\t\t\tscrollable,\n\t\t};\n\t}, props.idState);\n\n\tif (props.isShortable) {\n\t\tconst stateName = 'isShort';\n\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\n\t}\n\n\tif (store.$id) {\n\t\tconst popstateCallback = (_e: PopStateEvent) => {\n\t\t\tmodel.value = getHash(store.$id!);\n\t\t};\n\n\t\tpopstateCallbacks.add(popstateCallback);\n\t}\n\n\treturn store;\n};\n\n/**\n * Получить Store компонента\n */\nexport const useTabsStore = () => useStore(injectionKey);\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { TopPopupListItem } from '@/components/popup/popup';\nimport { useTabsStore } from './store';\nimport type { PropsMenuItem } from './types';\n\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\n\tscrollable: true,\n\tcomponent: undefined,\n});\n\nconst store = useTabsStore();\n\nconst href = computed(() => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (props.name && store.$id) {\n\t\treturn genHash(store.$id, props.name);\n\t}\n\n\treturn props.href;\n});\n\nconst tagName = computed(() => {\n\tif (store.showMenuInPopup) {\n\t\treturn TopPopupListItem;\n\t}\n\n\treturn href ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot name=\"default\" v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot name=\"default\"></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-2);\n\t--top-icon-width: calc(var(--top-icon-size));\n\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\n\tborder: none;\n\tborder-radius: var(--top-radius-2);\n\tpadding: var(--top-padding-2);\n\tbackground: transparent;\n\theight: 40px;\n\n\tcolor: var(--color-text-1);\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\n\tdisplay: flex;\n\tgap: var(--top-gap-2);\n\talign-items: center;\n\tjustify-content: flex-start;\n\ttransition: background var(--transition);\n}\n\n.top-tabsView_menuItem:hover {\n\t--top-icon-color: var(--color-text-1);\n\n\tbackground: var(--color-bg-shading-1);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\t--top-icon-color: inherit;\n\n\tbackground: var(--color-layout-front-1);\n\tcolor: inherit;\n}\n\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\n\topacity: unset;\n\tfilter: unset;\n}\n\n.top-tabsView_menuItem.top-disabled {\n\t--top-icon-color: var(--color-text-4);\n\n\tcolor: var(--color-text-4);\n}\n</style>\n","// TODO: Эту функцию можно вынести в глобальный utils\n\nimport { sleepWhile } from '@/core/utils/system';\n\n/**\n * Проверка нахождения компонента в состояние загрузки\n * @param component\n */\nexport const checkComponentIsLoading = (component: any) => {\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\n};\n\n/**\n * Презагрузить компонент\n *\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\n */\nexport const preResolveComponent = async (component: any, condition: Function) => {\n\tif (component?.name !== 'AsyncComponentWrapper') return;\n\tif (component?.__asyncResolved) return;\n\n\tcomponent.__asyncLoader();\n\n\tawait sleepWhile(() => {\n\t\treturn condition() && checkComponentIsLoading(component);\n\t}, 200);\n};\n","<script setup lang=\"ts\">\nimport type { Ref, VNode } from 'vue';\nimport { markRaw, onMounted, onUnmounted, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\nimport { useTabsStore } from './store';\nimport TabsViewMenuItem from './menuItem.vue';\nimport { preResolveComponent } from './utils';\n\ndefineProps<PropsMenu>();\n\nconst isLoading = defineModel('isLoading');\n\nconst store = useTabsStore();\n\nconst slots = useSlots();\n\n// словарь используется для оптимизации получения нужного menuItem\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\n\n// заполнить словарь с menuItem, по элементам в slot default\nconst setMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default({}).find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tsetMenuItemByNameFromItems(component.children);\n};\n\n// заполнить словарь с menuItem, по элементам\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\n\tmenuItems.forEach((subComponent: any) => {\n\t\t// это не компонент элемента меню\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\n\t\t// это не компонент, например template\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subComponent.props?.name || subComponent.props?.disabled) return;\n\n\t\tconst menuItem: MenuItem = {\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\n\t\t\ticon: subComponent.props.icon,\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\n\t\t};\n\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\n\t});\n};\n\n/**\n * activeMenuItem нужен:\n * - для вывода текста активной вкладки в меню с popup\n * - для вывода компонента активной вкладки (store.component)\n * - для установки store.scrollable\n */\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\n\n/**\n * Кол-во изменений активной вкладки\n */\nlet countChanged = 0;\n\n/**\n * Смена активной вкладки\n *\n * TODO: смена slot, например смена языка, требует повторного выполнения setMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tsetMenuItemByName();\n\t\t}\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tstore.activeItemName = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\n\n\t\t// элемент не найден, установить из хеша страницы\n\t\tif (!activeMenuItem.value && store.$id) {\n\t\t\tconst activeItemName = getHash(store.$id);\n\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\n\n\t\t\tif (activeMenuItem.value) {\n\t\t\t\tstore.activeItemName = activeItemName;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// элемент не найден, установить первый доступный\n\t\tif (!activeMenuItem.value) {\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value!;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// запрошена смена на уже активный элемент\n\t\tif (activeMenuItem.value.component === store.component) {\n\t\t\tisLoading.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, false);\n\n\t\t// флаг загрузки будет сброшен при инициализации компонента\n\t\tisLoading.value = true;\n\n\t\t/**\n\t\t * Презагрузить компонент\n\t\t *\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\n\t\t */\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\n\n\t\t// влкадка была сменена еще раз во время sleepWhile\n\t\tif (numberChanged !== countChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\n\t\tstore.component = activeMenuItem.value.component;\n\n\t\tif (activeMenuItem.value && !store.component) {\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\n\t\t}\n\t},\n\t{ immediate: true },\n);\n\nconst elRef = ref();\nlet resizeObserver: ResizeObserver;\n\nonMounted(() => {\n\tresizeObserver = new ResizeObserver(() => {\n\t\telRef.value.parentElement.style.setProperty('--top-tabsView-contents-offset-top', elRef.value.offsetHeight + 'px');\n\t});\n\n\tresizeObserver.observe(elRef.value);\n});\n\nonUnmounted(() => {\n\tresizeObserver.disconnect();\n});\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t'top-tabsView_menu': true,\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<!-- Спрятать меню под кнопку в popup -->\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\n\t\t\t<template #opener>\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<slot></slot>\n\t\t\t</template>\n\t\t</TopPopup>\n\n\t\t<!-- Отобразить меню на странице -->\n\t\t<template v-else>\n\t\t\t<div class=\"top-tabsView_menuList\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"isShortable\"\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\n\t\t\t>\n\t\t\t\t<TabsViewMenuItem\n\t\t\t\t\tv-if=\"isShortable\"\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\n\t\t\t\t>\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\n\t\t\t\t</TabsViewMenuItem>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style>\n/* режим отображение табов в основной области документа */\n.top-tabsView-pageMod .top-tabsView_menu {\n\tbox-sizing: border-box;\n\tposition: sticky;\n\ttop: var(--top-tabsView-top);\n\tz-index: 10;\n}\n\n/* режим отображение табов в основной области документа без popup */\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\n}\n\n/* стантартный режим */\n.top-tabsView_menu-inPopup_0 {\n\tbox-sizing: border-box;\n\twidth: var(--top-tabsView-menu-width);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tflex-shrink: 0;\n}\n\n/* режим вывода в popup */\n.top-tabsView_menu-inPopup_1 {\n\tborder-bottom: 1px solid var(--color-line-2-opacity);\n}\n\n.top-tabsView_menu-short {\n\twidth: auto;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\n\tbackground: var(--color-layer-1);\n}\n\n.top-tabsView_menuOpenerIcon { display: flex; }\n\n.top-tabsView_menuOpenerActiveItem {\n\t--top-forms-padding: 0px;\n\n\tbox-sizing: border-box;\n\tpadding: var(--top-padding-2);\n\tmax-width: calc(100% - var(--top-forms-base-height));\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--top-padding-2);\n}\n\n.top-tabsView_menuList,\n.top-tabsView_menuFooter {\n\tpadding: var(--top-padding-2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-2);\n}\n\n.top-tabsView_menuList {\n\toverflow-y: auto;\n}\n\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\n\t--top-icon-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './types';\nimport { defineTabsStore } from './store';\nimport TabsViewMenu from './menu.vue';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\nimport { checkComponentIsLoading } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowMenuInPopup: undefined,\n\tisShortable: false,\n});\n\nconst model = defineModel<string>();\n\nconst store = defineTabsStore(props, model);\n\nconst uid = Math.random();\n\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\n\nonUnmounted(() => {\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\n\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\n});\n\nconst componentRef = ref();\nconst isLoading = ref(false);\n\nwatch([componentRef, () => store.component], () => {\n\tisLoading.value = checkComponentIsLoading(store.component);\n}, { immediate: true });\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView': true,\n\t\t\t'top-tabsView-pageMod': props.pageMod,\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<TabsViewMenu\n\t\t\t:isShortable=\"isShortable\"\n\t\t\tv-model:isLoading=\"isLoading\"\n\t\t>\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\n\t\t\t<slot name=\"menu\"></slot>\n\t\t</TabsViewMenu>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-tabsView_contents': true,\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\n\t\t\t}\"\n\t\t>\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t\t<keep-alive>\n\t\t\t\t<component\n\t\t\t\t\tref=\"componentRef\"\n\t\t\t\t\t:is=\"store.component\"\n\t\t\t\t/>\n\t\t\t</keep-alive>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n:root {\n\t--top-tabsView-top: 0px;\n\t--top-tabsView-menu-width: 220px;\n\t--top-tabsView-contents-offset-top: 0px;\n}\n\n.top-tabsView {\n\tbackground: var(--color-layout-middle);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n}\n\n.top-tabsView_contents {\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-layout-front-1);\n\tpadding: var(--top-padding-4);\n\tflex-grow: 1;\n\toverflow: auto;\n\tposition: relative;\n}\n\n.top-tabsView_contents-isLoading {\n\tpointer-events: none;\n}\n\n.top-tabsView_contents-noScrollable {\n\twidth: calc(100% - var(--top-tabsView-menu-width));\n\tpadding: 0;\n\toverflow: visible;\n}\n\n/* top-tabsView-inPopup */\n.top-tabsView-inPopup {\n\tbackground: var(--color-layout-front-1);\n\tflex-direction: column;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents {\n\tborder-radius: 0;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\n\twidth: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\n</template>\n\n<style>\n.top-tabsView_menuDelimeter {\n\tpadding: var(--top-padding-1) 0;\n\tdisplay: flex;\n}\n\n.top-tabsView_menuDelimeter:before {\n\tcontent: \"\";\n\theight: 2px;\n\tbackground: var(--color-line-2);\n\tflex-grow: 1;\n}\n\n.top-tabsView_menuDelimeter:first-child,\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\n\tdisplay: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useTabsStore } from './store';\nimport type { PropsMenuTitle } from './types';\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\nimport { TopPopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</TopPopupListItem>\n\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\n\n\t<div\n\t\tv-else\n\t\t:class=\"{\n\t\t\t'top-tabsView_menuTitle': true,\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\n\t\t}\"\n\t>\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style>\n.top-tabsView_menuTitle {\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\n\tfont-weight: 600;\n\tcolor: var(--color-text-1);\n}\n\n.top-tabsView_menuTitle-subtitle {\n\tpadding-top: var(--top-padding-1);\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tcolor: var(--color-text-2);\n}\n</style>\n"],"names":["genStorageKey","stateName","stateKey","loadLocalStorge","store","localStorageKey","localStorageValue","addSaverLocalStorge","watch","StoreLocalStorage","popstateCallbacks","e","popstateCallback","injectionKey","defineTabsStore","props","model","defineStore","showMenuInPopup","computed","Core","pageMod","isShort","ref","component","scrollable","_e","getHash","useTabsStore","useStore","__props","href","genHash","tagName","TopPopupListItem","onClick","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_unref","_renderSlot","_ctx","$slots","_createElementBlock","_hoisted_1","checkComponentIsLoading","preResolveComponent","condition","sleepWhile","isLoading","_useModel","slots","useSlots","menuItemByName","setMenuItemByName","item","setMenuItemByNameFromItems","menuItems","subComponent","TabsViewMenuItem","menuItem","markRaw","activeMenuItem","countChanged","numberChanged","activeItemName","setHash","elRef","resizeObserver","onMounted","onUnmounted","TopPopup","_createElementVNode","_hoisted_3","_toDisplayString","_Fragment","_hoisted_4","_hoisted_5","_createTextVNode","uid","delHash","componentRef","_createVNode","TabsViewMenu","$event","TopLoadbar","_KeepAlive","TabsViewMenuDelimeter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tabsView.js","sources":["../../src/core/utils/store/localStorage.ts","../../src/components/tabsView/tabsView/store.ts","../../src/components/tabsView/tabsView/menuItem.vue","../../src/components/tabsView/tabsView/utils.ts","../../src/components/tabsView/tabsView/menu.vue","../../src/components/tabsView/tabsView/tabsView.vue","../../src/components/tabsView/tabsView/menuDelimeter.vue","../../src/components/tabsView/tabsView/menuTitle.vue"],"sourcesContent":["import { watch } from 'vue';\nimport type { Store } from './store';\n\n/**\n * Сгенерировать имя для сохранения данных в localStorage\n * @param stateName - имя свойства состояния\n * @param stateKey - ключ состояния, разные компоненты могут использовать одинаковый ключ\n */\nconst genStorageKey = <T extends Store>(stateName: keyof T, stateKey: string): string => {\n\tconst stateNameString = String(stateName);\n\n\treturn `top:${stateNameString}:${stateKey}`;\n};\n\n/**\n * Загрузить состояние\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst loadLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если Store.key не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\ttry {\n\t\tconst localStorageValue: typeof store[keyof typeof store] = JSON.parse(localStorage.getItem(localStorageKey) as string);\n\n\t\tif (typeof localStorageValue === typeof store[stateName]) {\n\t\t\tstore[stateName] = localStorageValue;\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(new Error(`В localStorage[${localStorageKey}] не корректный json`));\n\t}\n};\n\n/**\n * Добавить автосохранение состояние при его изменении\n * @param stateName - имя свойства состояния\n * @param store\n */\nconst addSaverLocalStorge = <T extends Store>(stateName: keyof T, store: T) => {\n\t// если store.$id не знадан, значит сохранение состояния в компоненте отключено\n\tif (!store.$id) return;\n\n\tconst localStorageKey = genStorageKey(stateName, store.$id);\n\n\twatch(() => store[stateName], () => {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(store[stateName]));\n\t}, { immediate: true });\n};\n\nexport default {\n\tloadLocalStorge,\n\taddSaverLocalStorge,\n};","import type { InjectionKey, ModelRef, UnwrapNestedRefs } from 'vue';\nimport { computed, ref } from 'vue';\nimport Core from '@/core/core/core';\nimport { defineStore, useStore, type Store as DefineStore } from '@/core/utils/store';\nimport StoreLocalStorage from '@/core/utils/store/localStorage';\nimport type { Props, Store } from './types';\nimport { getHash } from '@/core/utils/route';\n\nconst popstateCallbacks = new Set<(e: PopStateEvent) => void>();\n\naddEventListener('popstate', (e) => {\n\tpopstateCallbacks.forEach(popstateCallback => popstateCallback(e));\n});\n\nexport const injectionKey = Symbol() as InjectionKey<Store>;\n\n/**\n * Инициировать Store компонента\n */\nexport const defineTabsStore = (props: Props, model: ModelRef<string | undefined>): UnwrapNestedRefs<Store> & DefineStore => {\n\tconst store = defineStore(injectionKey, () => {\n\t\tconst showMenuInPopup = computed(() => props.showMenuInPopup ?? Core.state.isMobile);\n\t\tconst pageMod = computed(() => props.pageMod);\n\t\tconst isShort = ref(false);\n\n\t\tconst component = ref(undefined);\n\t\tconst scrollable = ref(true);\n\n\t\treturn {\n\t\t\tshowMenuInPopup,\n\t\t\tpageMod,\n\t\t\tisShort,\n\t\t\tactiveItemName: model,\n\t\t\tcomponent,\n\t\t\tscrollable,\n\t\t};\n\t}, props.idState);\n\n\tif (props.isShortable) {\n\t\tconst stateName = 'isShort';\n\n\t\tStoreLocalStorage.loadLocalStorge(stateName, store);\n\t\tStoreLocalStorage.addSaverLocalStorge(stateName, store);\n\t}\n\n\tif (store.$id) {\n\t\tconst popstateCallback = (_e: PopStateEvent) => {\n\t\t\tmodel.value = getHash(store.$id!);\n\t\t};\n\n\t\tpopstateCallbacks.add(popstateCallback);\n\t}\n\n\treturn store;\n};\n\n/**\n * Получить Store компонента\n */\nexport const useTabsStore = () => useStore(injectionKey);\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { genHash } from '@/core/utils/route';\nimport { TopPopupListItem } from '@/components/popup/popup';\nimport { useTabsStore } from './store';\nimport type { PropsMenuItem } from './types';\n\nconst props = withDefaults(defineProps<PropsMenuItem>(), {\n\tscrollable: true,\n\tcomponent: undefined,\n});\n\nconst store = useTabsStore();\n\nconst href = computed(() => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (props.name && store.$id) {\n\t\treturn genHash(store.$id, props.name);\n\t}\n\n\treturn props.href;\n});\n\nconst tagName = computed(() => {\n\tif (store.showMenuInPopup) {\n\t\treturn TopPopupListItem;\n\t}\n\n\treturn href ? 'a' : 'button';\n});\n\n/**\n * Клик по элементу меню\n */\nconst onClick = (e: MouseEvent) => {\n\t// это внутренняя хеш навигация, ссылка на вкладку\n\tif (!props.href && href.value) {\n\t\te.preventDefault();\n\t}\n\n\tif (props.name) {\n\t\tstore.activeItemName = props.name;\n\t}\n};\n</script>\n\n<template>\n\t<component\n\t\t:is=\"tagName\"\n\t\ttarget=\"_self\"\n\t\t:class=\"{\n\t\t\t['top-tabsView_menuItem']: !store.showMenuInPopup,\n\t\t\t['top-active']: name && store.activeItemName === name,\n\t\t\t['top-disabled']: disabled,\n\t\t\t['top-spa-disabled']: true,\n\t\t}\"\n\t\t:href=\"href\"\n\t\t:data-top-icon=\"icon || undefined\"\n\t\t:disabled=\"disabled || undefined\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<slot name=\"default\" v-if=\"store.showMenuInPopup\"></slot>\n\n\t\t<span\n\t\t\tv-else-if=\"$slots.default && !store.isShort\"\n\t\t\tclass=\"top-ellipsis\"\n\t\t>\n\t\t\t<slot name=\"default\"></slot>\n\t\t</span>\n\t</component>\n</template>\n\n<style>\n.top-tabsView_menuItem {\n\t--top-icon-color: var(--color-text-2);\n\t--top-icon-width: calc(var(--top-icon-size));\n\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\n\tborder: none;\n\tborder-radius: var(--top-radius-2);\n\tpadding: var(--top-padding-2);\n\tbackground: transparent;\n\theight: 40px;\n\n\tcolor: var(--color-text-1);\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\n\tdisplay: flex;\n\tgap: var(--top-gap-2);\n\talign-items: center;\n\tjustify-content: flex-start;\n\ttransition: background var(--transition);\n}\n\n.top-tabsView_menuItem:hover {\n\t--top-icon-color: var(--color-text-1);\n\n\tbackground: var(--color-bg-shading-1);\n\ttext-decoration: none;\n}\n\n.top-tabsView_menuItem.top-active {\n\t--top-icon-color: inherit;\n\n\tbackground: var(--color-layout-front-1);\n\tcolor: inherit;\n}\n\n.top-tabsView_menuItem:disabled:not(option):not(optgroup):not(.top-forms-option),\n.top-tabsView_menuItem:disabled ~ .top-formsCaption,\n.top-tabsView_menuItem.top-disabled[data-top-icon]:before,\n.top-tabsView_menuItem.top-disabled[data-top-icon2]:after {\n\topacity: unset;\n\tfilter: unset;\n}\n\n.top-tabsView_menuItem.top-disabled {\n\t--top-icon-color: var(--color-text-4);\n\n\tcolor: var(--color-text-4);\n}\n</style>\n","// TODO: Эту функцию можно вынести в глобальный utils\n\nimport { sleepWhile } from '@/core/utils/system';\n\n/**\n * Проверка нахождения компонента в состояние загрузки\n * @param component\n */\nexport const checkComponentIsLoading = (component: any) => {\n\treturn component?.name === 'AsyncComponentWrapper' && !component?.__asyncResolved;\n};\n\n/**\n * Презагрузить компонент\n *\n * Некоторое время ожидает загрузку компонента, прежде чем завершит работу\n */\nexport const preResolveComponent = async (component: any, condition: Function) => {\n\tif (component?.name !== 'AsyncComponentWrapper') return;\n\tif (component?.__asyncResolved) return;\n\n\tcomponent.__asyncLoader();\n\n\tawait sleepWhile(() => {\n\t\treturn condition() && checkComponentIsLoading(component);\n\t}, 200);\n};\n","<script setup lang=\"ts\">\nimport type { Ref, VNode } from 'vue';\nimport { markRaw, onMounted, onUnmounted, ref, useSlots, watch } from 'vue';\nimport { TopPopup } from '../../popup/popup';\nimport { getHash, setHash } from '@/core/utils/route';\n\nimport type { MenuItem, PropsMenu, PropsMenuItem } from './types';\nimport { useTabsStore } from './store';\nimport TabsViewMenuItem from './menuItem.vue';\nimport { preResolveComponent } from './utils';\n\ndefineProps<PropsMenu>();\n\nconst isLoading = defineModel('isLoading');\n\nconst store = useTabsStore();\n\nconst slots = useSlots();\n\n// словарь используется для оптимизации получения нужного menuItem\nconst menuItemByName: Map<PropsMenuItem['name'], MenuItem> = new Map();\n\n// заполнить словарь с menuItem, по элементам в slot default\nconst setMenuItemByName = () => {\n\tif (!slots.default) return;\n\n\tconst component: any = slots.default({}).find(item => item.key === '_menu');\n\tif (!component) return;\n\n\tsetMenuItemByNameFromItems(component.children);\n};\n\n// заполнить словарь с menuItem, по элементам\nconst setMenuItemByNameFromItems = (menuItems: VNode[]) => {\n\tmenuItems.forEach((subComponent: any) => {\n\t\t// это не компонент элемента меню\n\t\tif (subComponent.type.__name && subComponent.type.__name !== TabsViewMenuItem.__name) return;\n\n\t\t// это не компонент, например template\n\t\tif (!subComponent.type.__name && typeof subComponent.children === 'object') {\n\t\t\tsetMenuItemByNameFromItems(subComponent.children);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subComponent.props?.name || subComponent.props?.disabled) return;\n\n\t\tconst menuItem: MenuItem = {\n\t\t\ttitle: (subComponent.children.default?.()[0].children as string).trim(),\n\t\t\ticon: subComponent.props.icon,\n\t\t\tcomponent: subComponent.props.component ? markRaw(subComponent.props.component) : TabsViewMenuItem.props.component.default,\n\t\t\tscrollable: subComponent.props.scrollable ?? TabsViewMenuItem.props.scrollable.default,\n\t\t};\n\n\t\tmenuItemByName.set(subComponent.props.name, menuItem);\n\t});\n};\n\n/**\n * activeMenuItem нужен:\n * - для вывода текста активной вкладки в меню с popup\n * - для вывода компонента активной вкладки (store.component)\n * - для установки store.scrollable\n */\nconst activeMenuItem: Ref<MenuItem | null> = ref(null);\n\n/**\n * Кол-во изменений активной вкладки\n */\nlet countChanged = 0;\n\n/**\n * Смена активной вкладки\n *\n * TODO: смена slot, например смена языка, требует повторного выполнения setMenuItemByName()\n */\nwatch(\n\t() => store.activeItemName,\n\tasync () => {\n\t\tconst numberChanged = ++countChanged; // порядковый номер текущего изменения\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tsetMenuItemByName();\n\t\t}\n\n\t\tif (menuItemByName.size === 0) {\n\t\t\tstore.activeItemName = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tactiveMenuItem.value = menuItemByName.get(store.activeItemName) ?? null;\n\n\t\t// элемент не найден, установить из хеша страницы\n\t\tif (!activeMenuItem.value && store.$id) {\n\t\t\tconst activeItemName = getHash(store.$id);\n\n\t\t\tactiveMenuItem.value = menuItemByName.get(activeItemName) ?? null;\n\n\t\t\tif (activeMenuItem.value) {\n\t\t\t\tstore.activeItemName = activeItemName;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// элемент не найден, установить первый доступный\n\t\tif (!activeMenuItem.value) {\n\t\t\tstore.activeItemName = menuItemByName.keys().next().value!;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// запрошена смена на уже активный элемент\n\t\tif (activeMenuItem.value.component === store.component) {\n\t\t\tisLoading.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (store.$id) setHash(store.$id, store.activeItemName, false);\n\n\t\t// флаг загрузки будет сброшен при инициализации компонента\n\t\tisLoading.value = true;\n\n\t\t/**\n\t\t * Презагрузить компонент\n\t\t *\n\t\t * Нужно для того, чтобы минимизировать скачки интерфейса при ожидании загрузки асинхронного компонента\n\t\t */\n\t\tawait preResolveComponent(activeMenuItem.value.component, () => numberChanged === countChanged);\n\n\t\t// влкадка была сменена еще раз во время sleepWhile\n\t\tif (numberChanged !== countChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tstore.scrollable = activeMenuItem.value.scrollable;\n\t\tstore.component = activeMenuItem.value.component;\n\n\t\tif (activeMenuItem.value && !store.component) {\n\t\t\tconsole.warn(`Компонент вкладки ${store.activeItemName} не найден. Добавьте props.component для пункта меню ${store.activeItemName}.`);\n\t\t}\n\t},\n\t{ immediate: true },\n);\n\nconst elRef = ref();\nlet resizeObserver: ResizeObserver;\n\nonMounted(() => {\n\tresizeObserver = new ResizeObserver(() => {\n\t\telRef.value.parentElement.style.setProperty('--top-tabsView-contents-offset-top', elRef.value.offsetHeight + 'px');\n\t});\n\n\tresizeObserver.observe(elRef.value);\n});\n\nonUnmounted(() => {\n\tresizeObserver.disconnect();\n});\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t'top-tabsView_menu': true,\n\t\t\t'top-tabsView_menu-inPopup_0': !store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-inPopup_1': store.showMenuInPopup,\n\t\t\t'top-tabsView_menu-short': store.isShort && !store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<!-- Спрятать меню под кнопку в popup -->\n\t\t<TopPopup v-if=\"store.showMenuInPopup\">\n\t\t\t<template #opener>\n\t\t\t\t<div class=\"top-tabsView_menuOpener\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"activeMenuItem\"\n\t\t\t\t\t\tclass=\"top-tabsView_menuOpenerActiveItem\"\n\t\t\t\t\t\t:data-top-icon=\"activeMenuItem.icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"top-ellipsis\">\n\t\t\t\t\t\t\t{{ activeMenuItem.title }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"top-tabsView_menuOpenerIcon\" data-top-icon=\"\"></div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<slot></slot>\n\t\t\t</template>\n\t\t</TopPopup>\n\n\t\t<!-- Отобразить меню на странице -->\n\t\t<template v-else>\n\t\t\t<div class=\"top-tabsView_menuList\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"isShortable\"\n\t\t\t\tclass=\"top-tabsView_menuFooter\"\n\t\t\t>\n\t\t\t\t<TabsViewMenuItem\n\t\t\t\t\tv-if=\"isShortable\"\n\t\t\t\t\t:icon=\"store.isShort ? '' : ''\"\n\t\t\t\t\t@click=\"store.isShort = !store.isShort\"\n\t\t\t\t>\n\t\t\t\t\t{{ store.isShort ? '' : 'Свернуть' }} <!--TODO: translate-->\n\t\t\t\t</TabsViewMenuItem>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style>\n/* режим отображение табов в основной области документа */\n.top-tabsView-pageMod .top-tabsView_menu {\n\tbox-sizing: border-box;\n\tposition: sticky;\n\ttop: var(--top-tabsView-top);\n\tz-index: 10;\n}\n\n/* режим отображение табов в основной области документа без popup */\n.top-tabsView-pageMod .top-tabsView_menu-inPopup_0 {\n\theight: calc(var(--100vh) - var(--top-tabsView-top));\n}\n\n/* стантартный режим */\n.top-tabsView_menu-inPopup_0 {\n\tbox-sizing: border-box;\n\twidth: var(--top-tabsView-menu-width);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tflex-shrink: 0;\n}\n\n/* режим вывода в popup */\n.top-tabsView_menu-inPopup_1 {\n\tborder-bottom: 1px solid var(--color-line-2-opacity);\n}\n\n.top-tabsView_menu-short {\n\twidth: auto;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.top-tabsView_menu > .top-tabsView_menuOpener:hover {\n\tbackground: var(--color-layer-1);\n}\n\n.top-tabsView_menuOpenerIcon { display: flex; }\n\n.top-tabsView_menuOpenerActiveItem {\n\t--top-forms-padding: 0px;\n\n\tbox-sizing: border-box;\n\tpadding: var(--top-padding-2);\n\tmax-width: calc(100% - var(--top-forms-base-height));\n\twhite-space: nowrap;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--top-padding-2);\n}\n\n.top-tabsView_menuList,\n.top-tabsView_menuFooter {\n\tpadding: var(--top-padding-2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-2);\n}\n\n.top-tabsView_menuList {\n\toverflow-y: auto;\n}\n\n.top-tabsView_menu-short .top-tabsView_menuFooter > .top-tabsView_menuItem {\n\t--top-icon-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { defineModel, onUnmounted, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { delHash } from '@/core/utils/route';\nimport type { Props } from './types';\nimport { defineTabsStore } from './store';\nimport TabsViewMenu from './menu.vue';\nimport TopLoadbar from '@/components/forms/loadbar/loadbar.vue';\nimport { checkComponentIsLoading } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowMenuInPopup: undefined,\n\tisShortable: false,\n});\n\nconst model = defineModel<string>();\n\nconst store = defineTabsStore(props, model);\n\nconst uid = Math.random();\n\nif (props.pageMod) Core.state.documentClassModificators.set(uid, 'top-hasTabsViewPageMod');\n\nonUnmounted(() => {\n\tif (props.pageMod) Core.state.documentClassModificators.delete(uid);\n\n\tif (store.$id) delHash(store.$id, store.activeItemName, true);\n});\n\nconst componentRef = ref();\nconst isLoading = ref(false);\n\nwatch([componentRef, () => store.component], () => {\n\tisLoading.value = checkComponentIsLoading(store.component);\n}, { immediate: true });\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tabsView': true,\n\t\t\t'top-tabsView-pageMod': props.pageMod,\n\t\t\t'top-tabsView-inPopup': store.showMenuInPopup,\n\t\t}\"\n\t>\n\t\t<TabsViewMenu\n\t\t\t:isShortable=\"isShortable\"\n\t\t\tv-model:isLoading=\"isLoading\"\n\t\t>\n\t\t\t<!-- @slot Меню, ожидает передачу компонентов TabsViewMenuItem и TabsViewMenuTitle -->\n\t\t\t<slot name=\"menu\"></slot>\n\t\t</TabsViewMenu>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-tabsView_contents': true,\n\t\t\t\t'top-tabsView_contents-isLoading': isLoading,\n\t\t\t\t'top-tabsView_contents-noScrollable': !store.scrollable,\n\t\t\t}\"\n\t\t>\n\t\t\t<TopLoadbar v-if=\"isLoading\"/>\n\n\t\t\t<keep-alive>\n\t\t\t\t<component\n\t\t\t\t\tref=\"componentRef\"\n\t\t\t\t\t:is=\"store.component\"\n\t\t\t\t/>\n\t\t\t</keep-alive>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n:root {\n\t--top-tabsView-top: 0px;\n\t--top-tabsView-menu-width: 220px;\n\t--top-tabsView-contents-offset-top: 0px;\n}\n\n.top-tabsView {\n\tbackground: var(--color-layout-middle);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n}\n\n.top-tabsView_contents {\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-layout-front-1);\n\tpadding: var(--top-padding-4);\n\tflex-grow: 1;\n\toverflow: auto;\n\tposition: relative;\n}\n\n.top-tabsView_contents-isLoading {\n\tpointer-events: none;\n}\n\n.top-tabsView_contents-noScrollable {\n\twidth: calc(100% - var(--top-tabsView-menu-width));\n\tpadding: 0;\n\toverflow: visible;\n}\n\n/* top-tabsView-inPopup */\n.top-tabsView-inPopup {\n\tbackground: var(--color-layout-front-1);\n\tflex-direction: column;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents {\n\tborder-radius: 0;\n}\n\n.top-tabsView-inPopup > .top-tabsView_contents-noScrollable {\n\twidth: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\t<div class=\"top-tabsView_menuDelimeter\"></div>\n</template>\n\n<style>\n.top-tabsView_menuDelimeter {\n\tpadding: var(--top-padding-1) 0;\n\tdisplay: flex;\n}\n\n.top-tabsView_menuDelimeter:before {\n\tcontent: \"\";\n\theight: 2px;\n\tbackground: var(--color-line-2);\n\tflex-grow: 1;\n}\n\n.top-tabsView_menuDelimeter:first-child,\n.top-tabsView_menuDelimeter + .top-tabsView_menuDelimeter {\n\tdisplay: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useTabsStore } from './store';\nimport type { PropsMenuTitle } from './types';\nimport TabsViewMenuDelimeter from './menuDelimeter.vue';\nimport { TopPopupListItem } from '../../popup/popup';\n\ndefineProps<PropsMenuTitle>();\n\nconst store = useTabsStore();\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\tv-if=\"store.showMenuInPopup\"\n\t\ttype=\"title\"\n\t>\n\t\t<slot></slot>\n\t</TopPopupListItem>\n\n\t<TabsViewMenuDelimeter v-else-if=\"store.isShort\"/>\n\n\t<div\n\t\tv-else\n\t\t:class=\"{\n\t\t\t'top-tabsView_menuTitle': true,\n\t\t\t'top-tabsView_menuTitle-subtitle': isSubtitle,\n\t\t}\"\n\t>\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style>\n.top-tabsView_menuTitle {\n\tpadding: var(--top-padding-4) var(--top-padding-2) var(--top-padding-1);\n\tfont-weight: 600;\n\tcolor: var(--color-text-1);\n}\n\n.top-tabsView_menuTitle-subtitle {\n\tpadding-top: var(--top-padding-1);\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tcolor: var(--color-text-2);\n}\n</style>\n"],"names":["genStorageKey","stateName","stateKey","loadLocalStorge","store","localStorageKey","localStorageValue","addSaverLocalStorge","watch","StoreLocalStorage","popstateCallbacks","e","popstateCallback","injectionKey","defineTabsStore","props","model","defineStore","showMenuInPopup","computed","Core","pageMod","isShort","ref","component","scrollable","_e","getHash","useTabsStore","useStore","__props","href","genHash","tagName","TopPopupListItem","onClick","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_unref","_renderSlot","_ctx","$slots","_createElementBlock","_hoisted_1","checkComponentIsLoading","preResolveComponent","condition","sleepWhile","isLoading","_useModel","slots","useSlots","menuItemByName","setMenuItemByName","item","setMenuItemByNameFromItems","menuItems","subComponent","TabsViewMenuItem","menuItem","markRaw","activeMenuItem","countChanged","numberChanged","activeItemName","setHash","elRef","resizeObserver","onMounted","onUnmounted","TopPopup","_createElementVNode","_hoisted_3","_toDisplayString","_Fragment","_hoisted_4","_hoisted_5","_createTextVNode","uid","delHash","componentRef","_createVNode","TabsViewMenu","$event","TopLoadbar","_KeepAlive","TabsViewMenuDelimeter"],"mappings":"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"}
|
package/utils/clipboard.amd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-EhKRBbpk.amd"],(function(l,t,e){"use strict";if(typeof r>"u")var r=window.Vue;async function a(o,n=!1){let i=!1;return navigator.clipboard&&(await navigator.clipboard.writeText(o),i=!0,n&&e.Core.notice(e.useI18n().Common.Copied_to_clipboard+"","info")),i}async function u(o){let n=!1;e.isSafari()||(n=await a(o));const i='<a href="'+o+'" target="_blank">'+o+"</a>",c=e.useI18n().Common.Copied_to_clipboard+`:
|
|
2
2
|
`+i;if(n)e.Core.notice(c,"info");else{if(!navigator.clipboard){e.Core.notice(e.useI18n().Common.Cannot_copied_to_clipboard+`:
|
|
3
3
|
`+e.useI18n().Common.Copy_guest_link_manually+`
|
|
4
4
|
`+i,"error");return}const d={onclick:()=>a(o).then(()=>e.Core.notice(c,"info")),default:e.useI18n().Common.Copy+"",class:"copy"};await e.Core.notice(e.useI18n().Common.Guest_link_created+`
|
package/utils/clipboard.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as t, u as a, b as s } from "../.chunks/forms-
|
|
1
|
+
import { C as t, u as a, b as s } from "../.chunks/forms-CUaoBGD5.es.js";
|
|
2
2
|
async function r(o, e = !1) {
|
|
3
3
|
let i = !1;
|
|
4
4
|
return navigator.clipboard && (await navigator.clipboard.writeText(o), i = !0, e && t.notice(a().Common.Copied_to_clipboard + "", "info")), i;
|
package/utils/date.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-EhKRBbpk.amd"],(function(n,e,t){"use strict";if(typeof a>"u")var a=window.Vue;e.dateFormat=t.dateFormat,e.dateToString=t.dateToString,e.dateUnformat=t.dateUnformat,e.genDate=t.genDate,e.genDateMoscow=t.genDateMoscow,e.genUserDate=t.genUserDate,e.getDayOfWeek=t.getDayOfWeek,e.stringToDate=t.stringToDate,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=date.amd.js.map
|
package/utils/date.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as t, K as s, P as o, N as r, O as g, M as n, J as D, L as d } from "../.chunks/forms-
|
|
1
|
+
import { c as t, K as s, P as o, N as r, O as g, M as n, J as D, L as d } from "../.chunks/forms-CUaoBGD5.es.js";
|
|
2
2
|
export {
|
|
3
3
|
t as dateFormat,
|
|
4
4
|
s as dateToString,
|
package/utils/device.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-EhKRBbpk.amd"],(function(a,e,i){"use strict";if(typeof l>"u")var l=window.Vue;e.get$scroll=i.get$scroll,e.getCommandKeyLabel=i.getCommandKeyLabel,e.getElsScroll=i.getElsScroll,e.getOS=i.getOS,e.getOSAsync=i.getOSAsync,e.getScrollTop=i.getScrollTop,e.isApp=i.isApp,e.isMacOS=i.isMacOS,e.isMobile=i.isMobile,e.isRetina=i.isRetina,e.isSafari=i.isSafari,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=device.amd.js.map
|
package/utils/device.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { z as e, x as l, A as t, B as i, D as o, y as g, w as r, l as S, v as c, t as p, b } from "../.chunks/forms-
|
|
1
|
+
import { z as e, x as l, A as t, B as i, D as o, y as g, w as r, l as S, v as c, t as p, b } from "../.chunks/forms-CUaoBGD5.es.js";
|
|
2
2
|
export {
|
|
3
3
|
e as get$scroll,
|
|
4
4
|
l as getCommandKeyLabel,
|
package/utils/lodash.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-EhKRBbpk.amd"],(function(u,e,n){"use strict";if(typeof i>"u")var i=window.Vue;e.cloneDeep=n.cloneDeep,e.debounce=n.debounce,e.memoize=n.memoize,e.merge=n.merge,e.throttle=n.throttle,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=lodash.amd.js.map
|
package/utils/lodash.js
CHANGED
package/utils/price.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-EhKRBbpk.amd"],(function(a,t,i){"use strict";if(typeof n>"u")var n=window.Vue;const u=(c,e,o=i.Core.state.currency)=>{e=e??i.useI18nLang().value;let r=c.toLocaleString(e,{style:"currency",currency:o,maximumFractionDigits:2});return r=r.replace(",","."),r};t.genPrice=u,Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=price.amd.js.map
|
package/utils/price.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as a, a as o } from "../.chunks/forms-
|
|
1
|
+
import { C as a, a as o } from "../.chunks/forms-CUaoBGD5.es.js";
|
|
2
2
|
const i = (t, e, c = a.state.currency) => {
|
|
3
3
|
e = e ?? o().value;
|
|
4
4
|
let r = t.toLocaleString(e, { style: "currency", currency: c, maximumFractionDigits: 2 });
|
package/utils/searchers.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-EhKRBbpk.amd","../.chunks/core-BEpKBNHt.amd","vue","../.chunks/dialogs.vue_vue_type_script_setup_true_lang-C3qaTBlO.amd"],(function(b,c,g,f,r,d){"use strict";if(typeof r>"u")var r=window.Vue;const s={0:"Yandex",20:"Yandex.com",21:"Yandex.com.tr",1:"Google",4:"YouTube",5:"Bing",7:"Seznam",8:"AppStore",9:"GooglePlay",101:"VK",102:"Facebook",103:"Twitter"},t=a=>{let e="";switch(typeof a=="string"&&(a=Number(a)),a){case 0:e="";break;case 20:case 21:e="";break;case 1:e="";break;case 2:e="";break;case 3:e="";break;case 4:e="";break;case 5:e="";break;case 6:e="";break;case 7:e="";break;case 8:e="";break;case 9:e="";break;case null:e="";break}return e},n=a=>{let e="";switch(typeof a=="string"&&(a=Number(a)),a%10){case 0:e="";break;case 1:e="";break;case 2:e="";break}return e},i=(a,e)=>{switch(typeof a=="string"&&(a=Number(a)),a*1){case 1:case 4:case 5:case 6:case 8:case 9:return e}return""},u=(a,e,k)=>{switch(e*1){case 0:switch(k*1){case 2:a=`"${a}"`;break;case 3:a=`"!${a}"`;break;case 5:a=`"[${a}]"`;break;case 6:a=`"[!${a}]"`;break}break;case 1:a=`[${a}]`;break}return a},o=(a,e)=>{switch(e===null&&(e=6),a){case 1:e=3;break;case 2:e=2;break;case 5:e>1&&(e=1);break;default:[1,2,3,5,6].includes(e)||(e=3)}return e};c.genVolumeLabel=u,c.getDeviceGIcon=n,c.getLangLabel=i,c.getSearcherGIcon=t,c.prepareVolumeType=o,c.searchersNames=s,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=searchers.amd.js.map
|
package/utils/searchers.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../.chunks/forms-
|
|
2
|
-
import "../.chunks/core-
|
|
1
|
+
import "../.chunks/forms-CUaoBGD5.es.js";
|
|
2
|
+
import "../.chunks/core-DBWAn2Eg.es.js";
|
|
3
3
|
import "vue";
|
|
4
|
-
import "../.chunks/dialogs.vue_vue_type_script_setup_true_lang-
|
|
4
|
+
import "../.chunks/dialogs.vue_vue_type_script_setup_true_lang-BZM_iKPW.es.js";
|
|
5
5
|
const k = {
|
|
6
6
|
0: "Yandex",
|
|
7
7
|
20: "Yandex.com",
|
package/utils/string.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","./check.amd","../.chunks/forms-
|
|
1
|
+
define(["require","exports","./check.amd","../.chunks/forms-EhKRBbpk.amd"],(function(N,c,h,u){"use strict";if(typeof p>"u")var p=window.Vue;const i=new RegExp(`^[^a-zа-я0-9_%#!?.:'"«»[\\](){} \\r\\n\\t<>&/+-]`,"i"),s=e=>{const l=e?.[0]?.match(i);return{icon:l?e[0]:null,content:l?e.substring(1):e}},f=e=>{e+="";let l=0;if(!e.length)return l;for(let a=0;a<e.length;a++){const n=e.charCodeAt(a);l=(l<<5)-l+n,l=l&l}return l<0&&(l*=-1),l},d=e=>/^\w+:\/\/([\w-]+\.)+[\w-]+(:\d+)?(\/|$)/.test(e),g=e=>{let l=e+"";l=l.replace("-","–");let a=l.split("."),n=a[0],o=a.length>1?"."+a[1]:"";if(n.replace(/[+–]/,"").length<=4)return l;const r=/(\d+)(\d{3})/;for(;r.test(n);)n=n.replace(r,"$1 $2");return n+o},m=e=>e===void 0?"":e.replace(/\r\n|\r|\n/g,"<br>"),w=e=>typeof e=="string"?e.trim()!==""&&!isNaN(Number(e)):!0,C=(e,l=2,a=1e3,n="")=>{if(w(e))e=Number(e);else return String(e);const o=Math.pow(10,l);let r;return Math.abs(e)>Math.pow(a,3)?r=Math.round(e/Math.pow(a,3)*o)/o+" <small>G"+n+"</small>":Math.abs(e)>Math.pow(a,2)?r=Math.round(e/Math.pow(a,2)*o)/o+" <small>M"+n+"</small>":Math.abs(e)>a?r=Math.round(e/a*o)/o+" <small>K"+n+"</small>":r=Math.round(e*o)/o+"",r=r.replace(/^(-?\d+)(\d{3})/,"$1 $2"),r},M=(e,l,a=1)=>{if(e==null)return"";if(e+="",l==null||e.length<=l)return e;if(a===0)e=e.substr(e.length-l,l),e="..."+e;else if(a===1){const n=e.substr(0,l/2),o=e.substr(e.length-l/2,Math.ceil(l/2));e=n+"..."+o}else a===2&&(e=e.substr(0,l),e=e+"...");return e},b=(e,l,a,n)=>{if(u.useI18nLang().value==="en")return e===1?a:l;const o=e%100,r=e%10;return o>=5&&o<=20||r===0?l:r===1?a:r>=2&&r<=4?n:r>=5&&r<=9?l:n},E=e=>{if(u.useI18nLang().value!="ru"||e=="")return e;const l=e.split(" ");return $.map(l,function(a,n){a=a+"а",a=a.replace("оа","о"),a=a.replace("аяа","ой"),a=a.replace("шийа","шого"),a=a.replace("ыйа","ого"),a=a.replace("йа","я"),a=a.replace("ьа","я"),a=a.replace("яа","и"),a=a.replace("оваа","овой"),a=a.replace("аа","ы"),a=a.replace("кия","кого"),a=a.replace("каи","кой"),l[n]=a}),e=l.join(" "),e},R=e=>{const l={а:"a",б:"b",в:"v",г:"g",д:"d",е:"e",ё:"e",ж:"j",з:"z",и:"i",й:"i",к:"k",л:"l",м:"m",н:"n",о:"o",п:"p",р:"r",с:"s",т:"t",у:"u",ф:"f",х:"h",ц:"c",ч:"ch",ш:"sh",щ:"shch",ъ:"",ы:"y",ь:"",э:"e",ю:"u",я:"ya"},a=e.split(" ");return $.map(a,function(n,o){const r=[];for(let t=0;t<n.length;++t)r.push(l[n[t]]||l[n[t].toLowerCase()]==null&&n[t]||l[n[t].toLowerCase()].replace(/^(.)/,function(I){return I.toUpperCase()}));a[o]=r.join("")}),e=a.join(" "),e},k=e=>(e=e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),e),A=(e,l)=>{let a=null;switch(l.operator){case"CONTAINS":case"REGEXP":try{let n=l.values[0];l.operator!="REGEXP"&&(n=n.replace(/([()\[\]])/g,"\\$1")),a=new RegExp("("+n+")","gi")}catch{return e}break}return e=e.replace(a,'<b class="found">$1</b>'),e},L=e=>e.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)?.map(l=>l.toLowerCase()).join("_"),S=e=>`/controller/file/?src=${"/cloud/common/flags/"+e.toUpperCase()+".svg"}`,y=e=>{const l=h.getDomainRegexp(),a="(([\\/?\\w&=%+#;:-]*(\\.\\w+)?))*",n=new RegExp(`(^|[\\s>(),])([a-z0-9а-яё_.]+@${l}${a})`,"gui");e=e.replace(n,'$1<a href="mailto:$2" target="_blank" rel="noopener">↑[$2]↓</a>');const o=new RegExp(`(^|[\\s>(),])(https?://)?(${l}${a})`,"gui");return e=e.replace(o,'$1<a href="√$2$3" target="_blank" rel="nofollow noopener">$2$3</a>'),e=e.replaceAll("√http","http"),e=e.replaceAll("√","http://"),e=e.replaceAll(/(↑\[|]↓)/g,""),e},v=e=>e.charAt(0).toUpperCase()+e.slice(1),T=(e=20)=>{const l="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890";let a="";for(let n=0;n<e;n++)a+=l[Math.floor(Math.random()*l.length)];return a};c.REGEXP_START_SYMBOL_ICON=i,c.addCommasWhite=g,c.addLinkTags=y,c.camelToSnakeCase=L,c.ellipsis=M,c.extractIconAndContent=s,c.genFlagLinkByCountryCode=S,c.genIntHash=f,c.getRandomHash=T,c.highlightHtml=A,c.htmlspecialchars=k,c.isUrl=d,c.nl2br=m,c.numberEnding=b,c.numberWithWord=C,c.rusToLatin=R,c.toCapitalize=v,c.toRoditPadej=E,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=string.amd.js.map
|
package/utils/string.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getDomainRegexp as u } from "./check.js";
|
|
2
|
-
import { a as n } from "../.chunks/forms-
|
|
2
|
+
import { a as n } from "../.chunks/forms-CUaoBGD5.es.js";
|
|
3
3
|
const s = new RegExp(`^[^a-zа-я0-9_%#!?.:'"«»[\\](){} \\r\\n\\t<>&/+-]`, "i"), g = (e) => {
|
|
4
4
|
const r = e?.[0]?.match(s);
|
|
5
5
|
return {
|