@topvisor/ui 1.0.41 → 1.0.42-TopSelector.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.chunks/{core-D2o3elGA.amd.js → core-CNHOrWnw.amd.js} +2 -2
- package/.chunks/{core-D2o3elGA.amd.js.map → core-CNHOrWnw.amd.js.map} +1 -1
- package/.chunks/{core-CwjGTMhd.es.js → core-CZLRhkk2.es.js} +4 -4
- package/.chunks/{core-CwjGTMhd.es.js.map → core-CZLRhkk2.es.js.map} +1 -1
- package/.chunks/{datepicker-N83oX3hx.es.js → datepicker-BZ-GKoJc.es.js} +2 -2
- package/.chunks/{datepicker-N83oX3hx.es.js.map → datepicker-BZ-GKoJc.es.js.map} +1 -1
- package/.chunks/{datepicker-Byyye2pn.amd.js → datepicker-DnMEQ2c7.amd.js} +2 -2
- package/.chunks/{datepicker-Byyye2pn.amd.js.map → datepicker-DnMEQ2c7.amd.js.map} +1 -1
- package/.chunks/{dialog_selectorRegions-pDIYvl7b.amd.js → dialog_selectorRegions-B7ylHRje.amd.js} +2 -2
- package/.chunks/{dialog_selectorRegions-pDIYvl7b.amd.js.map → dialog_selectorRegions-B7ylHRje.amd.js.map} +1 -1
- package/.chunks/{dialog_selectorRegions-lYV2SJBx.es.js → dialog_selectorRegions-CR77RefG.es.js} +4 -4
- package/.chunks/{dialog_selectorRegions-lYV2SJBx.es.js.map → dialog_selectorRegions-CR77RefG.es.js.map} +1 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-C0n3o7PD.amd.js +2 -0
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-C0n3o7PD.amd.js.map +1 -0
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-X3S_WcSV.es.js → dialogs.vue_vue_type_script_setup_true_lang-sExyADFk.es.js} +113 -97
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-sExyADFk.es.js.map +1 -0
- package/.chunks/{forms-C-fyoosd.es.js → forms-1PEYT7sp.es.js} +482 -470
- package/.chunks/{forms-C-fyoosd.es.js.map → forms-1PEYT7sp.es.js.map} +1 -1
- package/.chunks/forms-BduN5hFf.amd.js +3 -0
- package/.chunks/{forms-DO87ZZk9.amd.js.map → forms-BduN5hFf.amd.js.map} +1 -1
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DDQSxC8E.amd.js → listItem.vue_vue_type_script_setup_true_lang-C660hIcG.amd.js} +2 -2
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DDQSxC8E.amd.js.map → listItem.vue_vue_type_script_setup_true_lang-C660hIcG.amd.js.map} +1 -1
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-BJTTvdc7.es.js → listItem.vue_vue_type_script_setup_true_lang-DPwnYUm-.es.js} +2 -2
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-BJTTvdc7.es.js.map → listItem.vue_vue_type_script_setup_true_lang-DPwnYUm-.es.js.map} +1 -1
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-Bi9Z81pC.es.js → menu.vue_vue_type_style_index_0_lang-BYP0xpzD.es.js} +2 -2
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-Bi9Z81pC.es.js.map → menu.vue_vue_type_style_index_0_lang-BYP0xpzD.es.js.map} +1 -1
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-7eYwnVLw.amd.js → menu.vue_vue_type_style_index_0_lang-C9cIXmj2.amd.js} +2 -2
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-7eYwnVLw.amd.js.map → menu.vue_vue_type_style_index_0_lang-C9cIXmj2.amd.js.map} +1 -1
- package/.chunks/{notice-DCONQ8rR.es.js → notice-C505E22P.es.js} +2 -2
- package/.chunks/{notice-DCONQ8rR.es.js.map → notice-C505E22P.es.js.map} +1 -1
- package/.chunks/{notice-B8nfJMJN.amd.js → notice-CEYLelBs.amd.js} +2 -2
- package/.chunks/{notice-B8nfJMJN.amd.js.map → notice-CEYLelBs.amd.js.map} +1 -1
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-Cg3dLy7K.amd.js → page.vue_vue_type_script_setup_true_lang-DpmKeCWn.amd.js} +2 -2
- package/.chunks/page.vue_vue_type_script_setup_true_lang-DpmKeCWn.amd.js.map +1 -0
- package/.chunks/{page.vue_vue_type_script_setup_true_lang-Dze2ZUr3.es.js → page.vue_vue_type_script_setup_true_lang-_-EoskSt.es.js} +4 -4
- package/.chunks/page.vue_vue_type_script_setup_true_lang-_-EoskSt.es.js.map +1 -0
- package/.chunks/{popup-PpCQY5Zi.es.js → popup-Bh3WbTKH.es.js} +106 -73
- package/.chunks/popup-Bh3WbTKH.es.js.map +1 -0
- package/.chunks/popup-C5-ffkMJ.amd.js +2 -0
- package/.chunks/popup-C5-ffkMJ.amd.js.map +1 -0
- package/.chunks/{utils-DAIrXU57.amd.js → utils-BgjhCn4H.amd.js} +2 -2
- package/.chunks/{utils-DAIrXU57.amd.js.map → utils-BgjhCn4H.amd.js.map} +1 -1
- package/.chunks/{utils-BcKnFj1j.es.js → utils-CMJHpNDX.es.js} +246 -169
- package/.chunks/utils-CMJHpNDX.es.js.map +1 -0
- package/.chunks/{utils-DsICGMuv.es.js → utils-DEyMm4Iq.es.js} +2 -2
- package/.chunks/{utils-DsICGMuv.es.js.map → utils-DEyMm4Iq.es.js.map} +1 -1
- package/.chunks/utils-DWmOkm95.amd.js +2 -0
- package/.chunks/utils-DWmOkm95.amd.js.map +1 -0
- package/assets/core.css +1 -1
- package/assets/forms.css +1 -1
- package/assets/formsExt.css +1 -1
- package/assets/notice.css +1 -1
- package/assets/project.css +1 -1
- package/charts/charts.amd.js +1 -1
- package/charts/charts.js +1 -1
- package/components/dialog/dialog/dialogs/dialogs.vue.d.ts +3 -0
- package/components/dialog/lib/types.d.ts +23 -0
- package/components/dialog/lib/utils.d.ts +8 -8
- package/components/dialog/lib/utils.globalEvents.d.ts +2 -2
- package/components/dialog/lib/worker.d.ts +12 -11
- package/components/forms/button/button.vue.d.ts +2 -5
- package/components/forms/button/types.d.ts +10 -0
- package/components/formsExt/formsExt.d.ts +2 -0
- package/components/formsExt/policy/policy.vue.d.ts +4 -0
- package/components/formsExt/policy/types.d.ts +10 -0
- package/components/formsExt/selector2/composables/useAPI.d.ts +1 -1
- package/components/formsExt/selector2/composables/useMenu.d.ts +5 -1
- package/components/formsExt/selector2/selector2.vue.d.ts +3 -4
- package/components/formsExt/selector2/stories/dummyAPIRequest.d.ts +1 -2
- package/components/formsExt/selector2/types.d.ts +48 -22
- package/components/popup/lib/popup.d.ts +1 -0
- package/components/popup/lib/worker.d.ts +4 -2
- package/core/app.amd.js +1 -1
- package/core/app.js +5 -5
- package/core/core/core.d.ts +1 -1
- package/core/core/options.d.ts +7 -6
- package/core/core/state.d.ts +1 -1
- package/core/plugins/core.d.ts +1 -1
- package/core/utils/date.d.ts +30 -12
- package/core/utils/dom.d.ts +11 -1
- package/core/utils/string.d.ts +1 -1
- package/dialog/dialog.amd.js +1 -1
- package/dialog/dialog.js +2 -2
- package/forms/forms.amd.js +1 -1
- package/forms/forms.js +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +432 -309
- package/formsExt/formsExt.js.map +1 -1
- package/icomoon/demo.html +15 -1
- package/icomoon/fonts/Topvisor-2.eot +0 -0
- package/icomoon/fonts/Topvisor-2.svg +1 -0
- package/icomoon/fonts/Topvisor-2.ttf +0 -0
- package/icomoon/fonts/Topvisor-2.woff +0 -0
- package/icomoon/selection.json +1 -1
- package/icomoon/style.css +8 -5
- package/layout/layout.amd.js +1 -1
- package/layout/layout.js +1 -1
- package/package.json +1 -1
- package/popup/popup.amd.js +1 -1
- package/popup/popup.js +2 -2
- package/popup/worker.amd.js +1 -1
- package/popup/worker.amd.js.map +1 -1
- package/popup/worker.js +30 -21
- package/popup/worker.js.map +1 -1
- package/project/project.amd.js +1 -1
- package/project/project.amd.js.map +1 -1
- package/project/project.js +6 -6
- package/project/project.js.map +1 -1
- package/tabsView/tabsView.amd.js +1 -1
- package/tabsView/tabsView.js +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 +4 -3
- package/utils/device.amd.js +1 -1
- package/utils/device.js +1 -1
- package/utils/dom.amd.js +1 -1
- package/utils/dom.amd.js.map +1 -1
- package/utils/dom.js +27 -22
- package/utils/dom.js.map +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.amd.js.map +1 -1
- package/utils/string.js +34 -30
- package/utils/string.js.map +1 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-B14m3p7q.amd.js +0 -2
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-B14m3p7q.amd.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-X3S_WcSV.es.js.map +0 -1
- package/.chunks/forms-DO87ZZk9.amd.js +0 -3
- package/.chunks/page.vue_vue_type_script_setup_true_lang-Cg3dLy7K.amd.js.map +0 -1
- package/.chunks/page.vue_vue_type_script_setup_true_lang-Dze2ZUr3.es.js.map +0 -1
- package/.chunks/popup-PpCQY5Zi.es.js.map +0 -1
- package/.chunks/popup-XXfdNLmr.amd.js +0 -2
- package/.chunks/popup-XXfdNLmr.amd.js.map +0 -1
- package/.chunks/utils-BcKnFj1j.es.js.map +0 -1
- package/.chunks/utils-pvFg1FqE.amd.js +0 -2
- package/.chunks/utils-pvFg1FqE.amd.js.map +0 -1
- package/icomoon/Topvisor icons.json +0 -6612
package/core/utils/date.d.ts
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
* Работа с датами
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Уровень детализации времени
|
|
7
|
+
*
|
|
8
|
+
* - 0: только дата
|
|
9
|
+
* - 1: дата и часы
|
|
10
|
+
* - 2: дата и часы с минутами
|
|
11
|
+
* - 3: дата и часы с минутами и секундами
|
|
12
|
+
*/
|
|
13
|
+
type Time = 0 | 1 | 2 | 3;
|
|
5
14
|
/**
|
|
6
15
|
* Получить день недели
|
|
7
16
|
*/
|
|
@@ -10,26 +19,32 @@ export declare const getDayOfWeek: (y: number, m: number, d: number) => string;
|
|
|
10
19
|
* Преобразовать дату в строку формата Y-m-d H:i:s
|
|
11
20
|
* @param dateObject - объект Date
|
|
12
21
|
* @param langFormat - если true, формат даты будет взят из Core.state.dateFormat
|
|
13
|
-
* @param timeFormat -
|
|
22
|
+
* @param timeFormat - уровень детализации времени
|
|
14
23
|
*/
|
|
15
|
-
export declare const dateToString: (dateObject: Date, langFormat?: boolean, timeFormat?:
|
|
24
|
+
export declare const dateToString: (dateObject: Date, langFormat?: boolean, timeFormat?: Time) => string;
|
|
16
25
|
/**
|
|
17
26
|
* Получить объект Date из строки
|
|
18
27
|
* @param date - строка с датой
|
|
19
28
|
*/
|
|
20
29
|
export declare function stringToDate(date: string): Date;
|
|
30
|
+
/**
|
|
31
|
+
* Генерация даты-строки из миллисекунд (UTC), в формате Y-m-d H:i:s с учётом часового пояса пользователя
|
|
32
|
+
*
|
|
33
|
+
* Для настройки часового пояса пользователя используется `Core.state.timezoneOffset`
|
|
34
|
+
*
|
|
35
|
+
* @see genDate()
|
|
36
|
+
*/
|
|
37
|
+
export declare const genUserDate: (timestamp?: number, useFormat?: boolean, time?: Time | "auto") => string;
|
|
21
38
|
/**
|
|
22
39
|
* Генерация даты-строки из миллисекунд (UTC), в формате Y-m-d H:i:s
|
|
23
40
|
* @param timestamp - дата в мс, если не передана, берется дата на момент вызова функции
|
|
24
41
|
* @param useFormat - если true, формат даты будет взят из Core.state.dateFormat
|
|
25
|
-
* @param time
|
|
26
|
-
* -
|
|
27
|
-
* -
|
|
28
|
-
*
|
|
29
|
-
* - 3: дата и часы с минутами и секундами
|
|
30
|
-
* - auto: часы и минуты будут выводиться только, если они не равны нулю
|
|
42
|
+
* @param time - уровень детализации времени
|
|
43
|
+
* - auto: часы и минуты будут выводиться, только если они не равны нулю
|
|
44
|
+
* @param timezoneOffset - смещение часового пояса от UTC в минутах.
|
|
45
|
+
* Если не указано используется локальный часовой пояс пользователя
|
|
31
46
|
*/
|
|
32
|
-
export declare function genDate(timestamp
|
|
47
|
+
export declare function genDate(timestamp?: number, useFormat?: boolean, time?: Time | 'auto', timezoneOffset?: number): string;
|
|
33
48
|
/**
|
|
34
49
|
* Генерация даты-строки (время московское) из миллисекунд (UTC), в формате Y-m-d H:i:s
|
|
35
50
|
* @param ms - дата в мс, если не передана, берется дата на момент вызова функции
|
|
@@ -39,14 +54,17 @@ export declare function genDateMoscow(ms: number | undefined, useFormat?: boolea
|
|
|
39
54
|
/**
|
|
40
55
|
* Перевод даты в формат пользователя
|
|
41
56
|
* @param dateMixed - объект даты или строка в формате Y-m-d H:i:s
|
|
42
|
-
* @param time -
|
|
43
|
-
* @param dateFormat -
|
|
57
|
+
* @param time - уровень детализации времени
|
|
58
|
+
* @param dateFormat - формат даты, если не указан, будет взят из Core.state.dateFormat
|
|
44
59
|
* @param emptyValue - значение, которое надо вернуть, если дата не указана
|
|
60
|
+
*
|
|
61
|
+
* @todo Привести к единой логике обработку строк и дат
|
|
45
62
|
*/
|
|
46
|
-
export declare function dateFormat(dateMixed: string | Date, time?:
|
|
63
|
+
export declare function dateFormat(dateMixed: string | Date, time?: Time, dateFormat?: string, emptyValue?: string): string;
|
|
47
64
|
/**
|
|
48
65
|
* Перевод даты из формата пользователя в системный формат Y-m-d H:i:s
|
|
49
66
|
* @param date - строка с датой
|
|
50
67
|
* @param emptyValue - значение, которое надо вернуть, если дата не указана
|
|
51
68
|
*/
|
|
52
69
|
export declare function dateUnformat(date: string, emptyValue?: string): string;
|
|
70
|
+
export {};
|
package/core/utils/dom.d.ts
CHANGED
|
@@ -27,11 +27,20 @@ export declare function offset(el: HTMLElement): {
|
|
|
27
27
|
};
|
|
28
28
|
/**
|
|
29
29
|
* Получить значение css свойства элемента
|
|
30
|
+
*
|
|
30
31
|
* @param el
|
|
31
32
|
* @param property - имя свойства
|
|
32
33
|
* @return - значение css стиля
|
|
33
34
|
*/
|
|
34
35
|
export declare function css(el: HTMLElement, property: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Получить значение css свойства целочисленного типа
|
|
38
|
+
*
|
|
39
|
+
* @param el
|
|
40
|
+
* @param property - имя свойства
|
|
41
|
+
* @return - значение css стиля
|
|
42
|
+
*/
|
|
43
|
+
export declare function cssNumber(el: HTMLElement, property: string): number;
|
|
35
44
|
/**
|
|
36
45
|
* Обернуть элемент и вернуть только что созданный элемент
|
|
37
46
|
* @param el - элемент, который требуется обернуть
|
|
@@ -61,7 +70,7 @@ export declare function querySelectorAllVisible(el: HTMLElement | Document, sele
|
|
|
61
70
|
* @param el - корневой элемент поиска
|
|
62
71
|
* @param selectors - см. параметр selectors в Document.querySelectorAll()
|
|
63
72
|
*/
|
|
64
|
-
export declare function querySelectorAllArray(el: HTMLElement | Document, selectors: string):
|
|
73
|
+
export declare function querySelectorAllArray<El extends HTMLElement = HTMLElement>(el: HTMLElement | Document, selectors: string): El[];
|
|
65
74
|
/**
|
|
66
75
|
* Хранилище данных элемента
|
|
67
76
|
* @param el
|
|
@@ -83,6 +92,7 @@ declare const _default: {
|
|
|
83
92
|
isVisible: typeof isVisible;
|
|
84
93
|
offset: typeof offset;
|
|
85
94
|
css: typeof css;
|
|
95
|
+
cssNumber: typeof cssNumber;
|
|
86
96
|
wrap: typeof wrap;
|
|
87
97
|
querySelectorVisible: typeof querySelectorVisible;
|
|
88
98
|
querySelectorVisibleLast: typeof querySelectorVisibleLast;
|
package/core/utils/string.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ export declare const nl2br: (str: string) => string;
|
|
|
38
38
|
* @param dimension - размерность, по умолчанию 1000
|
|
39
39
|
* @param suffix - суффикс к десятичной приставке (по умолчанию выводится латинская заглавная буква)
|
|
40
40
|
*/
|
|
41
|
-
export declare const numberWithWord: (number: number, precision?: number, dimension?: number, suffix?: string) => string;
|
|
41
|
+
export declare const numberWithWord: (number: number | string, precision?: number, dimension?: number, suffix?: string) => string;
|
|
42
42
|
/**
|
|
43
43
|
* Обрезать текст под три точки
|
|
44
44
|
* @param string
|
package/dialog/dialog.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/page.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
define(["require","exports","../.chunks/page.vue_vue_type_script_setup_true_lang-DpmKeCWn.amd","vue","../.chunks/utils-BgjhCn4H.amd"],function(c,n,u,e,t){"use strict";if(typeof e>"u")var e=window.Vue;const i={name:{type:String,required:!0},order:{type:Number,required:!0},prevName:String,footerFullWith:Boolean},l=e.defineComponent({__name:"pageComponent",props:{component:{},keepAlive:{type:Boolean,default:!0},props:{},name:{},order:{},prevName:{},footerFullWith:{type:Boolean}},setup(m){const a=m,r=t.useTopDialogSelf(),s=(o,p)=>{if(!p.value){if(o.name!=="AsyncComponentWrapper"){p.value=!0;return}r.needShowPage(a.name)&&(r.isLoadingPage.value=!0,o.__asyncResolved&&(p.value=!0,r.isLoadingPage.value=!1))}};if(a.component.name==="AsyncComponentWrapper"){const o=e.ref(!1);e.onUpdated(()=>{s(a.component,o)})}return(o,p)=>(e.openBlock(),e.createBlock(e.KeepAlive,{include:o.keepAlive?"":"none"},[e.unref(r).needShowPage(o.name)?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.component),e.mergeProps({key:0},a,{name:o.name,order:o.order,prevName:o.prevName}),null,16,["name","order","prevName"])):e.createCommentVNode("",!0)],1032,["include"]))}});n.TopDialog=u._sfc_main,n.TopDialogPage=u._sfc_main$1,n.useTopDialogSelf=t.useTopDialogSelf,n.TopDialogPageComponent=l,n.propsPageCommon=i,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=dialog.amd.js.map
|
package/dialog/dialog.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ as k, a as B } from "../.chunks/page.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import { _ as k, a as B } from "../.chunks/page.vue_vue_type_script_setup_true_lang-_-EoskSt.es.js";
|
|
2
2
|
import { defineComponent as l, ref as i, onUpdated as u, createBlock as a, openBlock as p, KeepAlive as s, createCommentVNode as d, unref as g, resolveDynamicComponent as c, mergeProps as f } from "vue";
|
|
3
|
-
import { b as v } from "../.chunks/utils-
|
|
3
|
+
import { b as v } from "../.chunks/utils-DEyMm4Iq.es.js";
|
|
4
4
|
const C = {
|
|
5
5
|
name: {
|
|
6
6
|
type: String,
|
package/forms/forms.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","../.chunks/forms-
|
|
1
|
+
define(["require","exports","../.chunks/forms-BduN5hFf.amd"],function(o,T,a){"use strict";if(typeof e>"u")var e=window.Vue;T.TopAvatar=a.TopAvatar,T.TopButton=a.TopButton,T.TopCaption=a.TopCaption,T.TopCheckbox=a.TopCheckbox,T.TopControlLabel=a.TopControlLabel,T.TopHint=a.TopHint,T.TopInput=a.TopInput,T.TopInputDate=a.TopInputDate,T.TopInputRange=a.TopInputRange,T.TopLoadbar=a.TopLoadbar,T.TopPreloader=a.TopPreloader,T.TopRadio=a.TopRadio,T.TopSelect=a.TopSelect,T.TopSwitcher=a.TopSwitcher,T.TopTextarea=a.TopTextarea,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=forms.amd.js.map
|
package/forms/forms.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as p, g as T,
|
|
1
|
+
import { T as p, g as T, X as s, h as t, j as e, k as r, l as n, m as l, n as i, o as u, x, p as b, q as c, r as d, s as h } from "../.chunks/forms-1PEYT7sp.es.js";
|
|
2
2
|
export {
|
|
3
3
|
p as TopAvatar,
|
|
4
4
|
T as TopButton,
|
package/formsExt/formsExt.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","vue","../.chunks/forms-DO87ZZk9.amd","../popup/popup.amd","../utils/keyboard.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-7eYwnVLw.amd","../require/css.amd!../assets/formsExt.css"],function(te,B,e,k,g,V,T){"use strict";if(typeof e>"u")var e=window.Vue;const E={class:"top-editArea_footer"},S=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(a,{emit:t}){const o=a,r=t,i=e.ref(o.defaultValue),l=e.ref(o.isFocused),c=e.computed(()=>i.value!==o.defaultValue),p=u=>{r("submit",u),i.value=o.defaultValue},v=()=>{if(o.forceShowCloseBtn&&!c.value){r("close");return}i.value=o.defaultValue},y=()=>{o.attachToKeyboard&&r("clickOnTitle")};return(u,m)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":u.attachToKeyboard})},[u.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:m[0]||(m[0]=s=>y())},e.toDisplayString(u.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-error":u.isError,"top-focus":l.value})},[e.createVNode(k._sfc_main$3,{modelValue:i.value,"onUpdate:modelValue":m[1]||(m[1]=s=>i.value=s),name:u.name,placeholder:u.placeholder,rows:u.rows,minHeight:u.minHeight,expandable:u.expandable,disabled:u.disabled,readonly:u.readonly,isError:u.isError,hint:u.hint,class:"top-editArea_element",onFocus:m[2]||(m[2]=()=>l.value=!0),onBlur:m[3]||(m[3]=()=>l.value=!1),onKeyup:[e.withKeys(v,["esc"]),m[4]||(m[4]=e.withKeys(e.withModifiers(s=>p(i.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",E,[c.value||u.forceShowCloseBtn?(e.openBlock(),e.createBlock(k._sfc_main,{key:0,icon:u.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:v},e.createSlots({_:2},[u.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),c.value?(e.openBlock(),e.createBlock(k._sfc_main,{key:1,class:"top-editArea_button",icon:u.$core.state.isMobile?"":"",onClick:m[5]||(m[5]=s=>p(i.value))},e.createSlots({_:2},[u.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),A={class:"top-editInput"},$=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(a,{emit:t}){const o=a,r=e.ref(o.modelValue);e.watch(e.toRef(o.modelValue),()=>{r.value=o.modelValue});const i=t,l=()=>{i("update:modelValue",r.value)};return(c,p)=>(e.openBlock(),e.createElementBlock("div",A,[e.createVNode(k._sfc_main$2,e.mergeProps(c.input,{onKeydownCapture:p[0]||(p[0]=e.withKeys(e.withModifiers(v=>r.value=c.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(l,["stop"]),["enter"]),modelValue:r.value,"onUpdate:modelValue":p[1]||(p[1]=v=>r.value=v)}),null,16,["onKeydown","modelValue"]),r.value!==c.modelValue?(e.openBlock(),e.createBlock(k._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},c.button,{onClick:l}),null,16)):e.createCommentVNode("",!0)]))}}),I=["data-top-icon","onClick"],N={key:0,class:"top-radioGroup_circle"},M=["value","disabled"],L=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(a){const t=e.useModel(a,"modelValue"),o=a,r=e.ref(null);e.watch(t,()=>{var l,c,p,v,y;(l=o.radiosProps)!=null&&l.some(u=>u.value===t.value)||(t.value=((p=(c=o.radiosProps)==null?void 0:c[0])==null?void 0:p.value)??""),(y=(v=r.value)==null?void 0:v.querySelector(".radioGroup_item-selected"))==null||y.scrollIntoView()},{immediate:!0});const i="radioGroup-"+Math.random();return(l,c)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:r,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+l.size]:!!l.size,"top-error":l.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.radiosProps,p=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":p.value===t.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":p.disabled}),"data-top-icon":p.icon,onClick:v=>t.value=p.value},[e.createTextVNode(e.toDisplayString(p.title)+" ",1),l.showIndicator?(e.openBlock(),e.createElementBlock("span",N)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":c[0]||(c[0]=v=>t.value=v),name:i,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:p.value,disabled:p.disabled},null,8,M),[[e.vModelRadio,t.value]])],10,I))),256))],2))}}),_=["data-top-icon"],z=["value","checked","disabled","onChange"],K=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},styling:{default:"outline"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(a){const t=e.useModel(a,"modelValue"),o=r=>{const i=[...t.value],l=i.indexOf(r);l===-1?i.push(r):i.splice(l,1),t.value=i};return(r,i)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-checkboxGroup":!0,["top-checkboxGroup-"+r.styling]:!0,"top-scrollBarXHidding":!0,["top-size_"+r.size]:!!r.size,"top-error":r.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.items,l=>(e.openBlock(),e.createElementBlock("label",{key:l.id,class:e.normalizeClass({"top-checkboxGroup_item":!0,"top-checkboxGroup_item-selected":t.value.includes(l.id),"top-forms-focusable":!0,"top-disabled":l.disabled}),"data-top-icon":l.icon},[e.createElementVNode("input",{type:"checkbox",class:"top-unvisible",value:l.id,checked:t.value.includes(l.id),disabled:l.disabled,onChange:c=>o(l.id)},null,40,z),e.createTextVNode(" "+e.toDisplayString(l.title),1)],10,_))),128))],2))}}),P={class:"top-selector2_itemMulti top-ellipsis"},D=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(a){return(t,o)=>(e.openBlock(),e.createElementBlock("div",P,[e.createTextVNode(e.toDisplayString(t.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:o[0]||(o[0]=r=>t.$emit("delete",t.id)),onMousedown:o[1]||(o[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),G=(a,t,o)=>{const r=e.ref([]),i=e.ref(!1);let l="",c;a&&!a.params.limit&&(a.params.limit=100);const p=async()=>{if(!a)return;let s,f;if(o&&(a.cache??=new Map,f=JSON.stringify(a.params),s=a.cache.get(f),s))return s;if(i.value=!0,s=await a.call(),i.value=!1,s.errors)return;if(!Array.isArray(s.result)){console.warn("В result ожидался массив");return}const n=s.result.findIndex(d=>d.id===void 0||d.name===void 0);if(n!==-1){console.warn(`В result[${n}] нет id или name`);return}return o&&a.cache.set(f,s),s},v=async()=>{if(!a)return;a.params.offset=0,a.params.search=l;const s=await p();s&&(c=s.nextOffset,r.value=s.result)},y=async()=>{if(!a||!c||i.value)return;a.params.offset=c,a.params.search=l;const s=await p();s&&(c=s.nextOffset,r.value=r.value.concat(s.result))},u=k.debounce(()=>v(),200);return{apiRequest:a,items:r,isLoading:i,loadAppend:y,setSearchTextAndLoad:(s,f=!0)=>{a&&(s.length<t||s===l&&r.value.length||(l=s,f?u():v()))}}},F=0,b=(a,t,o=!0)=>o&&t.id===null?Array.isArray(a)?a.some(r=>r.id===t.id&&r.name===t.name):t.name===a.name:Array.isArray(a)?a.some(r=>r.id===t.id):t.id===a.id,O=(a,t,o,r,i,l)=>{const c=e.ref(""),p={id:F,name:k.useI18n().Common.All},v=()=>{c.value="",l.items.value=[]},y=e.computed(()=>{var s;const m=[];return!o&&r.value&&m.push(p),(s=t.value)==null||s.forEach(f=>m.push({...f})),m}),u=e.computed(()=>{const m=c.value.toLowerCase(),s=V.invertKeyboardLayout(m);let f=[];return y.value.forEach(n=>{const d=n.name.toLowerCase();(n.id===Number(m)||d.includes(m)||d.includes(s))&&(d===m||d===s?f.unshift(n):f.push(n))}),f.push(...l.items.value),i.value&&c.value&&(!f.length||f[0].name.toLowerCase()!==m)&&f.push({id:null,name:c.value}),o&&(f=f.filter(n=>!b(a.value,n))),f});return{searchText:c,resetSearch:v,items:y,itemsForShow:u}},H={key:0,class:"top-selector2_activeItems"},R={key:1,class:"top-selector2_activeName top-ellipsis"},U=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},multiselect:{type:Boolean},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},placeholder:{},showSelectedInInput:{type:Boolean,default:!0},showSearch:{type:Boolean,default:!0}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(a){const t=a,o=e.useModel(a,"modelValue"),r=e.ref(null),i=G(t.apiRequest,t.minLength||0,t.useCache),l=O(o,e.toRef(t,"items"),t.multiselect,e.toRef(t,"appendAllValue"),e.toRef(t,"appendSearchToResult"),i),c=e.ref(null),p=()=>{var n;return(n=c.value)==null?void 0:n.popup},v=()=>{if(!Array.isArray(o.value)){const d=(l.itemsForShow.value.findIndex(w=>w.id===o.value.id)+1)%l.itemsForShow.value.length;o.value={...l.itemsForShow.value[d]}}},y=async n=>{Array.isArray(o.value)&&(o.value=o.value.filter(d=>d.id!==n),setTimeout(()=>{var d;(d=p())==null||d.recalcPosition()}))},u=e.ref(!1);i.apiRequest&&(e.watch(u,()=>{u.value&&i.setSearchTextAndLoad(l.searchText.value,!1)}),e.watch(l.searchText,()=>i.setSearchTextAndLoad(l.searchText.value)));const m=n=>{t.multiselect&&Array.isArray(o.value)?b(o.value,n)||(o.value=[...o.value,n]):o.value=n},s=()=>{var n;u.value=!1,(n=r.value)==null||n.focus(),l.searchText.value&&l.resetSearch()},f=n=>{const d=n.target;d.scrollTop/(d.scrollHeight-d.offsetHeight)>.8&&i.loadAppend()};return window.__STORYBOOK_PREVIEW__&&!t.modelValue&&e.watch(()=>t.multiselect,()=>{o.value=t.multiselect?[]:{id:null,name:""}},{immediate:!0}),(n,d)=>{const w=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(g.TopPopup),{ref_key:"popupRef",ref:c,onOpen:d[3]||(d[3]=h=>u.value=!0),onClose:d[4]||(d[4]=h=>s()),onScrollContentList:d[5]||(d[5]=h=>n.apiRequest?f(h):void 0),notch:!1,transitionDuration:0},e.createSlots({opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:r,class:e.normalizeClass({"top-selector2":!0,"top-selector2-multiselect":n.multiselect,["top-size_"+n.size]:!0,"top-disabled":n.disabled,"top-forms-focusable":!n.disabled,"top-error":n.isError}),onKeydown:[d[0]||(d[0]=e.withKeys(e.withModifiers(h=>h.currentTarget.click(),["stop","prevent"]),["up","down","enter","space"])),d[1]||(d[1]=e.withKeys(h=>o.value=[],["delete"]))],tabindex:"0"},[n.multiselect?(e.openBlock(),e.createElementBlock("div",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,h=>(e.openBlock(),e.createBlock(D,{id:h.id,name:h.name,onDelete:y},null,8,["id","name"]))),256))])):e.createCommentVNode("",!0),n.multiselect?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",R,e.toDisplayString(Array.isArray(o.value)?"":o.value.name),1)),n.addChanger&&!n.multiselect&&e.unref(l).items.value.length>1&&!n.disabled?(e.openBlock(),e.createElementBlock("span",{key:2,class:"top-changer top-changer-selector","data-top-popup-disabled":"true",onClick:v})):e.createCommentVNode("",!0)],34)),[[w,n.isError,void 0,{onupdate:!0}]])]),contentList:e.withCtx(()=>{var h;return[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(l).itemsForShow.value,C=>(e.openBlock(),e.createBlock(e.unref(g.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(o.value)&&!n.multiselect&&o.value.id===C.id&&o.value.name===C.name}),key:C.id??void 0,closeByClick:!n.multiselect||e.unref(k.Core).state.isMobile,onClick:le=>m(C)},{default:e.withCtx(()=>[n.$slots.item?e.renderSlot(n.$slots,"item",{key:0,item:C}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(C.name),1)],64))]),_:2},1032,["class","closeByClick","onClick"]))),128)),!e.unref(i).isLoading.value&&!e.unref(l).itemsForShow.value.length?(e.openBlock(),e.createBlock(e.unref(g.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0),e.unref(i).isLoading.value&&(!n.showSearch||(h=n.apiRequest)!=null&&h.params.offset)?(e.openBlock(),e.createBlock(e.unref(g.TopPopupListItem),{key:1,type:"regular"},{default:e.withCtx(()=>[e.createVNode(e.unref(k.TopPreloader),{type:"circles"})]),_:1})):e.createCommentVNode("",!0)]}),_:2},[n.showSearch?{name:"widget",fn:e.withCtx(()=>{var h;return[e.createVNode(e.unref(g.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:e.unref(l).searchText.value,"onUpdate:modelValue":d[2]||(d[2]=C=>e.unref(l).searchText.value=C),isLoading:e.unref(i).isLoading.value&&!((h=n.apiRequest)!=null&&h.params.offset),placeholder:!Array.isArray(o.value)&&!n.multiselect&&n.showSelectedInInput?o.value.name:n.placeholder},null,8,["modelValue","isLoading","placeholder"])]}),key:"0"}:void 0]),1536)}}}),W=["data-top-icon"],X={class:"top-info_text"},j={key:0,class:"top-info_value"},J=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(a){return(t,o)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+t.size]:!0,["top-info-styling_"+t.styling]:!0}),"data-top-icon":t.icon},[e.createElementVNode("div",X,[e.renderSlot(t.$slots,"default")]),t.$slots.additional?(e.openBlock(),e.createElementBlock("span",j,[e.renderSlot(t.$slots,"additional")])):e.createCommentVNode("",!0)],10,W))}}),Y=S,Q=$,Z=L,q=K,x=U,ee=T._sfc_main,oe=J;B.TopCheckboxGroup=q,B.TopEditArea=Y,B.TopEditInput=Q,B.TopInfo=oe,B.TopMenu=ee,B.TopRadioGroup=Z,B.TopSelector2=x,Object.defineProperty(B,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
define(["require","exports","vue","../.chunks/forms-BduN5hFf.amd","../popup/popup.amd","../utils/keyboard.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-C9cIXmj2.amd","../require/css.amd!../assets/formsExt.css"],function(pe,b,e,C,T,S,$){"use strict";if(typeof e>"u")var e=window.Vue;const I={class:"top-editArea_footer"},_=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(n,{emit:o}){const a=n,l=o,d=e.ref(a.defaultValue),r=e.ref(a.isFocused),s=e.computed(()=>d.value!==a.defaultValue),p=c=>{l("submit",c),d.value=a.defaultValue},m=()=>{if(a.forceShowCloseBtn&&!s.value){l("close");return}d.value=a.defaultValue},B=()=>{a.attachToKeyboard&&l("clickOnTitle")};return(c,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":c.attachToKeyboard})},[c.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:y[0]||(y[0]=u=>B())},e.toDisplayString(c.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-forms-focusable":!0,"top-as-input":!0,"top-error":c.isError,"top-focus":r.value})},[e.createVNode(C._sfc_main$3,{modelValue:d.value,"onUpdate:modelValue":y[1]||(y[1]=u=>d.value=u),name:c.name,placeholder:c.placeholder,rows:c.rows,minHeight:c.minHeight,expandable:c.expandable,disabled:c.disabled,readonly:c.readonly,isError:c.isError,hint:c.hint,class:"top-editArea_element",onFocus:y[2]||(y[2]=()=>r.value=!0),onBlur:y[3]||(y[3]=()=>r.value=!1),onKeyup:[e.withKeys(m,["esc"]),y[4]||(y[4]=e.withKeys(e.withModifiers(u=>p(d.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",I,[s.value||c.forceShowCloseBtn?(e.openBlock(),e.createBlock(C._sfc_main,{key:0,icon:c.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:m},e.createSlots({_:2},[c.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),s.value?(e.openBlock(),e.createBlock(C._sfc_main,{key:1,class:"top-editArea_button",icon:c.$core.state.isMobile?"":"",onClick:y[5]||(y[5]=u=>p(d.value))},e.createSlots({_:2},[c.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),N={class:"top-editInput"},L=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(n,{emit:o}){const a=n,l=e.ref(a.modelValue);e.watch(e.toRef(a.modelValue),()=>{l.value=a.modelValue});const d=o,r=()=>{d("update:modelValue",l.value)};return(s,p)=>(e.openBlock(),e.createElementBlock("div",N,[e.createVNode(C._sfc_main$2,e.mergeProps(s.input,{onKeydownCapture:p[0]||(p[0]=e.withKeys(e.withModifiers(m=>l.value=s.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(r,["stop"]),["enter"]),modelValue:l.value,"onUpdate:modelValue":p[1]||(p[1]=m=>l.value=m)}),null,16,["onKeydown","modelValue"]),l.value!==s.modelValue?(e.openBlock(),e.createBlock(C._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},s.button,{onClick:r}),null,16)):e.createCommentVNode("",!0)]))}}),M=["data-top-icon","onClick"],P={key:0,class:"top-radioGroup_circle"},D=["value","disabled"],z=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=e.useModel(n,"modelValue"),a=n,l=e.ref(null);e.watch(o,()=>{var r,s,p,m,B;(r=a.radiosProps)!=null&&r.some(c=>c.value===o.value)||(o.value=((p=(s=a.radiosProps)==null?void 0:s[0])==null?void 0:p.value)??""),(B=(m=l.value)==null?void 0:m.querySelector(".radioGroup_item-selected"))==null||B.scrollIntoView()},{immediate:!0});const d="radioGroup-"+Math.random();return(r,s)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:l,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+r.size]:!!r.size,"top-error":r.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.radiosProps,p=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":p.value===o.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":p.disabled}),"data-top-icon":p.icon,onClick:m=>o.value=p.value},[e.createTextVNode(e.toDisplayString(p.title)+" ",1),r.showIndicator?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":s[0]||(s[0]=m=>o.value=m),name:d,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:p.value,disabled:p.disabled},null,8,D),[[e.vModelRadio,o.value]])],10,M))),256))],2))}}),K=["data-top-icon"],O=["value","checked","disabled","onChange"],G=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},styling:{default:"outline"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=e.useModel(n,"modelValue"),a=l=>{const d=[...o.value],r=d.indexOf(l);r===-1?d.push(l):d.splice(r,1),o.value=d};return(l,d)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-checkboxGroup":!0,["top-checkboxGroup-"+l.styling]:!0,"top-scrollBarXHidding":!0,["top-size_"+l.size]:!!l.size,"top-error":l.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.items,r=>(e.openBlock(),e.createElementBlock("label",{key:r.id,class:e.normalizeClass({"top-checkboxGroup_item":!0,"top-checkboxGroup_item-selected":o.value.includes(r.id),"top-forms-focusable":!0,"top-disabled":r.disabled}),"data-top-icon":r.icon},[e.createElementVNode("input",{type:"checkbox",class:"top-unvisible",value:r.id,checked:o.value.includes(r.id),disabled:r.disabled,onChange:s=>a(r.id)},null,40,O),e.createTextVNode(" "+e.toDisplayString(r.title),1)],10,K))),128))],2))}}),F={class:"top-selector2_itemMulti top-ellipsis"},H=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(n){return(o,a)=>(e.openBlock(),e.createElementBlock("div",F,[e.createTextVNode(e.toDisplayString(o.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:a[0]||(a[0]=l=>o.$emit("delete",o.id)),onMousedown:a[1]||(a[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),R=(n,o,a)=>{const l=e.ref([]),d=e.ref(!1);let r="",s;n&&!n.params.limit&&(n.params.limit=100);const p=async()=>{if(!n)return;let u,g;if(a&&(n.cache??=new Map,g=JSON.stringify(n.params),u=n.cache.get(g),u))return u;if(d.value=!0,u=await n.call(),d.value=!1,u.errors)return;if(!Array.isArray(u.result)){console.warn("В result ожидался массив");return}const V=u.result.findIndex(w=>w.id===void 0||w.name===void 0);if(V!==-1){console.warn(`В result[${V}] нет id или name`);return}return a&&n.cache.set(g,u),u},m=async()=>{if(!n)return;n.params.offset=0,n.params.search=r;const u=await p();u&&(s=u.nextOffset,l.value=u.result)},B=async()=>{if(!n||!s||d.value)return;n.params.offset=s,n.params.search=r;const u=await p();u&&(s=u.nextOffset,l.value=l.value.concat(u.result))},c=C.debounce(()=>m(),200);return{apiRequest:n,items:l,isLoading:d,loadAppend:B,setSearchTextAndLoad:(u,g=!0)=>{n&&(u.length<o||u===r&&l.value.length||(r=u,g?c():m()))}}},U=0,A=(n,o,a=!0)=>a&&o.id===null?Array.isArray(n)?n.some(l=>l.id===o.id&&l.name===o.name):o.name===n.name:Array.isArray(n)?n.some(l=>l.id===o.id):o.id===n.id,x=(n,o,a,l,d,r,s,p)=>{const m=e.ref(""),B={id:U,name:C.useI18n().Common.All},c=()=>{m.value="",p.items.value=[]},y=()=>!(!p.apiRequest||r.value!=="inline"||m.value.length>=s),u=e.computed(()=>{var t;const v=[];return!a&&l.value&&v.push(B),(t=o.value)==null||t.forEach(i=>v.push({...i})),v}),g=e.computed(()=>{const v=m.value.toLowerCase(),t=S.invertKeyboardLayout(v);let i=[];return u.value.forEach(h=>{const f=h.name.toLowerCase();(h.id===Number(v)||f.includes(v)||f.includes(t))&&(f===v||f===t?i.unshift(h):i.push(h))}),i.push(...p.items.value),d.value&&m.value&&(!i.length||i[0].name.toLowerCase()!==v)&&i.push({id:null,name:m.value}),a&&(i=i.filter(h=>!A(n.value,h))),i});return{searchText:m,resetSearch:c,genIsShort:y,items:u,itemsForShow:g,selectItem:v=>{a&&Array.isArray(n.value)?A(n.value,v)||(n.value=[...n.value,v]):n.value=v},selectNextItem:()=>{if(!Array.isArray(n.value)){const t=(g.value.findIndex(i=>i.id===n.value.id)+1)%g.value.length;n.value={...g.value[t]}}},deleteItemById:async v=>{Array.isArray(n.value)&&(n.value=n.value.filter(t=>t.id!==v))}}},W={key:0,class:"top-selector2_activeItems"},j={key:1,class:"top-selector2_activeName top-ellipsis"},X={key:2,class:"top-selector2_placeholder top-ellipsis"},J=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},title:{},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},searchType:{default:"popup"},placeholder:{},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},multiselect:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},buttonProps:{},selectedAsPlaceholder:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=n,a=e.useModel(n,"modelValue"),l=e.computed(()=>o.searchType==="inline"&&o.multiselect||o.searchType==="inline"&&C.Core.state.isMobile?"popup":o.searchType);let d=0;l.value==="inline"&&o.minLength&&(d=o.minLength);const r=R(o.apiRequest,d,o.useCache),s=x(a,e.toRef(o,"items"),o.multiselect,e.toRef(o,"appendAllValue"),e.toRef(o,"appendSearchToResult"),l,d,r),p=e.computed(()=>o.buttonProps?"TopButton":l.value==="inline"?"TopInput":"div"),m=e.ref(null),B=()=>{var t;return(t=m.value)==null?void 0:t.popup};r.apiRequest&&e.watch(s.searchText,()=>{var t;r.setSearchTextAndLoad(s.searchText.value),l.value==="inline"&&s.genIsShort()&&((t=B())==null||t.close())}),e.watch(a,()=>{l.value==="inline"&&s.resetSearch()});const c=e.computed(()=>{var t;return Array.isArray(a.value)||o.multiselect||!o.selectedAsPlaceholder&&l.value!=="inline"?o.placeholder:((t=a.value)==null?void 0:t.name)||o.placeholder}),y=t=>{var f,k;let i=!1;switch(t.key){case"Delete":case"Backspace":Array.isArray(a.value)&&(t.preventDefault(),t.stopPropagation(),a.value.pop());break;case"ArrowUp":case"ArrowRight":case"ArrowDown":case"ArrowLeft":case"Enter":case" ":i=!0;break;case"Escape":l.value==="inline"&&s.resetSearch();break}const h=t.key.length===1&&!t.ctrlKey&&!t.metaKey;(l.value==="popup"||l.value==="inline")&&h&&(i=!0),(f=B())!=null&&f.elPopup&&(i=!1),i&&(l.value==="popup"&&(t.preventDefault(),t.stopPropagation(),h&&(s.searchText.value||(s.searchText.value=t.key))),(k=t.currentTarget)==null||k.click())};let u=!1;const g=t=>{var i;u||l.value==="inline"&&((i=t.currentTarget)==null||i.click())},V=t=>{var i,h;t.preventDefault(),u=!0,(h=(i=t.currentTarget)==null?void 0:i.parentElement)==null||h.focus(),u=!1,s.selectNextItem()},w=()=>{var t;if(u=!0,r.apiRequest){if(s.genIsShort()){(t=B())==null||t.close();return}r.setSearchTextAndLoad(s.searchText.value,!1)}},E=()=>{setTimeout(()=>{u=!1},100),l.value==="popup"&&s.searchText.value&&s.resetSearch()},v=t=>{const i=t.target;i.scrollTop/(i.scrollHeight-i.offsetHeight)>.8&&r.loadAppend()};return window.__STORYBOOK_PREVIEW__&&(e.watch(()=>o.multiselect,()=>{o.multiselect?Array.isArray(a.value)||(a.value=[{id:1,name:"Выбери меня"}]):Array.isArray(a.value)&&(a.value={id:null,name:""})},{immediate:!0}),e.watch(()=>o.searchType,()=>{setTimeout(()=>{location.reload()},500)})),(t,i)=>{const h=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(T.TopPopup),{ref_key:"popupRef",ref:m,onOpen:i[3]||(i[3]=f=>w()),onClose:i[4]||(i[4]=f=>E()),onScrollContentList:i[5]||(i[5]=f=>t.apiRequest?v(f):void 0),notch:!1,transitionDuration:0},e.createSlots({opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createBlock(e.resolveDynamicComponent(p.value),e.mergeProps(t.buttonProps,{ref:"subcomponentSelector",class:{"top-selector2":!0,"top-selector2-multiselect":t.multiselect,"top-as-input":!t.buttonProps,"top-as-selector":!0,["top-size_"+t.size]:!0,"top-disabled":t.disabled,"top-forms-focusable":!t.disabled,"top-error":t.isError},tabindex:"0",onKeydown:y,placeholder:c.value,modelValue:e.unref(s).searchText.value,"onUpdate:modelValue":i[0]||(i[0]=f=>e.unref(s).searchText.value=f),onFocus:g,onBlur:i[1]||(i[1]=f=>{var k;return(k=B())!=null&&k.isClosed?e.unref(s).resetSearch():""})}),{default:e.withCtx(()=>[t.multiselect?(e.openBlock(),e.createElementBlock("div",W,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,f=>(e.openBlock(),e.createBlock(H,{id:f.id,name:f.name,onDelete:e.unref(s).deleteItemById},null,8,["id","name","onDelete"]))),256))])):e.createCommentVNode("",!0),l.value!=="inline"&&!t.multiselect?(e.openBlock(),e.createElementBlock("span",j,e.toDisplayString(Array.isArray(a.value)?"":a.value.name),1)):e.createCommentVNode("",!0),t.multiselect&&!a.value.length?(e.openBlock(),e.createElementBlock("span",X,e.toDisplayString(c.value),1)):e.createCommentVNode("",!0),t.addChanger&&!t.buttonProps&&!t.multiselect&&e.unref(s).items.value.length>1&&!t.disabled?(e.openBlock(),e.createElementBlock("span",{key:3,class:"top-changer top-changer-selector top-popup_widget","data-top-popup-disabled":"true",onClick:V})):e.createCommentVNode("",!0)]),_:1},16,["class","placeholder","modelValue"])),[[h,t.isError,void 0,{onupdate:!0}]])]),contentList:e.withCtx(()=>{var f;return[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(s).itemsForShow.value,k=>(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(a.value)&&!t.multiselect&&a.value.id===k.id&&a.value.name===k.name}),key:k.id??void 0,closeByClick:!t.multiselect||e.unref(C.Core).state.isMobile,onClick:me=>e.unref(s).selectItem(k)},{default:e.withCtx(()=>[t.$slots.item?e.renderSlot(t.$slots,"item",{key:0,item:k}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(k.name),1)],64))]),_:2},1032,["class","closeByClick","onClick"]))),128)),!e.unref(r).isLoading.value&&!e.unref(s).itemsForShow.value.length?(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0),e.unref(r).isLoading.value&&(t.searchType!=="popup"||(f=t.apiRequest)!=null&&f.params.offset)?(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{key:1,type:"regular"},{default:e.withCtx(()=>[e.createVNode(e.unref(C.TopPreloader),{type:"circles"})]),_:1})):e.createCommentVNode("",!0)]}),_:2},[l.value==="popup"?{name:"widget",fn:e.withCtx(()=>{var f;return[e.createVNode(e.unref(T.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:e.unref(s).searchText.value,"onUpdate:modelValue":i[2]||(i[2]=k=>e.unref(s).searchText.value=k),isLoading:e.unref(r).isLoading.value&&!((f=t.apiRequest)!=null&&f.params.offset),placeholder:c.value},null,8,["modelValue","isLoading","placeholder"])]}),key:"0"}:void 0]),1536)}}}),Y=["data-top-icon"],q={class:"top-info_text"},Q={key:0,class:"top-info_value"},Z=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(n){return(o,a)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+o.size]:!0,["top-info-styling_"+o.styling]:!0}),"data-top-icon":o.icon},[e.createElementVNode("div",q,[e.renderSlot(o.$slots,"default")]),o.$slots.additional?(e.openBlock(),e.createElementBlock("span",Q,[e.renderSlot(o.$slots,"additional")])):e.createCommentVNode("",!0)],10,Y))}}),ee={key:0,class:"top-policy"},te={class:"top-policy_title"},oe=["innerHTML"],le=e.defineComponent({__name:"policy",props:{title:{},text:{}},setup(n){const o=e.ref(!0),a=()=>{const l=location.hostname.split(".").slice(-2).join(".");document.cookie=`cookie_consent=accepted; path=/; domain=.${l}; max-age=31536000`,o.value=!1};return(l,d)=>o.value?(e.openBlock(),e.createElementBlock("div",ee,[e.createElementVNode("div",te,e.toDisplayString(l.title),1),e.createElementVNode("div",{class:"top-policy_description",innerHTML:l.text},null,8,oe),e.createVNode(e.unref(C.TopButton),{size:"m",onClick:a},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.$i18n.Common.Allow),1)]),_:1})])):e.createCommentVNode("",!0)}}),ne=_,ae=L,re=z,se=G,ie=J,ue=$._sfc_main,ce=Z,de=le;b.TopCheckboxGroup=se,b.TopEditArea=ne,b.TopEditInput=ae,b.TopInfo=ce,b.TopMenu=ue,b.TopPolicy=de,b.TopRadioGroup=re,b.TopSelector2=ie,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=formsExt.amd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n\toutline: none;\n}\n\n.top-editArea_form:not(.top-error):hover,\n.top-editArea_form:not(.top-error).top-focus {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet _searchText = '';\n\tlet _nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!_nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = _nextOffset;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\n\t *\n\t * Если текст не изменился, поиск не будет проивзеден\n\t * @param searchText - текст поиска\n\t * @param useDebounce - отложенное выполнение поиска\n\t */\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (searchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (searchText === _searchText && items.value.length) return;\n\n\t\t_searchText = searchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\titems: localItems,\n\t\titemsForShow,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\nimport { isSelected } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Array<Item>,\n\tsize: 's',\n\tminLength: 0,\n\tshowSelectedInInput: true,\n\tshowSearch: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, props.minLength || 0, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(model, toRef(props, 'items'), props.multiselect, toRef(props, 'appendAllValue'), toRef(props, 'appendSearchToResult'), api);\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n *\n * @returns Объект popup или undefined, если popup не инициализирован\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = menu.itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % menu.itemsForShow.value.length;\n\t\tmodel.value = { ...menu.itemsForShow.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\n *\n * @param id Идентификатор элемента для удаления\n */\nconst deleteItemById = async (id: Item['id']) => {\n\tif (Array.isArray(model.value)) {\n\t\tmodel.value = model.value.filter(item => item.id !== id);\n\n\t\tsetTimeout(() => {\n\t\t\tgetPopup()?.recalcPosition();\n\t\t});\n\t}\n};\n\n/**\n * Флаг, указывающий, открыт ли попап\n */\nconst isOpened = ref(false);\n\nif (api.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => api.setSearchTextAndLoad(menu.searchText.value));\n}\n\n/**\n * Выбрать элемент\n *\n * @param item Элемент для выбора\n */\nconst selectItem = (item: Item) => {\n\tif (props.multiselect && Array.isArray(model.value)) {\n\t\tif (!isSelected(model.value, item)) {\n\t\t\tmodel.value = [...model.value, item];\n\t\t}\n\t} else {\n\t\tmodel.value = item;\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tisOpened.value = false;\n\n\telRef.value?.focus();\n\n\tif (menu.searchText.value) menu.resetSearch();\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\n */\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tapi.loadAppend();\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__ && !props.modelValue) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tmodel.value = props.multiselect ? [] : { id: null, name: '' };\n\t\t},\n\t\t{ immediate: true },\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"false\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<div\n\t\t\t\tref=\"elRef\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\n\t\t\t\t@keydown.delete=\"model = []\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Item[]\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget v-if=\"showSearch\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (!showSearch || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tmin-height: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: hidden;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n\tcolor: var(--top-forms-placeholder-color);\n\n\tborder-radius: var(--top-radius-2);\n\tborder: 1px solid var(--top-forms-border-color);\n\tbackground: var(--top-forms-background-color);\n}\n\n.top-selector2-multiselect {\n\twidth: unset;\n\tmin-width: 180px;\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\ttransform: translateX(-16px);\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["isChanged","vue","localValue","props","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","onChange","id","index","newModel","items","isLoading","_nextOffset","apiRequest","res","cacheKey","indexWithError","_searchText","callAPIRequest","loadAppend","searchText","minLength","modelValue","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","api","forms","localItems","localItems2","itemAll","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","items2","isSelected","resetSearch","useAPI","menu","popupRef","nextIndex","deleteItemById","getPopup","isOpened","selectItem","onScrollContentList","e","el","TopEditArea","_sfc_main$6","TopEditInput","_sfc_main$5","TopRadioGroup","_sfc_main$4","TopCheckboxGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/policy/policy.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-forms-focusable': true,\n\t\t\t\t'top-as-input': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet searchText = '';\n\tlet nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = nextOffset;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет произведен\n\t *\n\t * Если текст не изменился, поиск не будет произведен\n\t *\n\t * @param newSearchText - текст поиска\n\t * @param useDebounce - дедупликация загрузки списка\n\t */\n\tconst setSearchTextAndLoad = (newSearchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (newSearchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (newSearchText === searchText && items.value.length) return;\n\n\t\tsearchText = newSearchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tsearchType: Ref<Props['searchType']>,\n\tminLength: number,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Является ли строка поиска достаточной длины для отображения меню\n\t */\n\tconst genIsShort = () => {\n\t\tif (!api.apiRequest) return false;\n\t\tif (searchType.value !== 'inline') return false;\n\t\tif (searchText.value.length >= minLength) return false;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\t/**\n\t * Выбрать элемент\n\t *\n\t * @param item Элемент для выбора\n\t */\n\tconst selectItem = (item: Item) => {\n\t\tif (multiselect && Array.isArray(model.value)) {\n\t\t\tif (!isSelected(model.value, item)) {\n\t\t\t\tmodel.value = [...model.value, item];\n\t\t\t}\n\t\t} else {\n\t\t\tmodel.value = item;\n\t\t}\n\t};\n\n\t/**\n\t * Выбрать следующее значение\n\t */\n\tconst selectNextItem = () => {\n\t\tif (!Array.isArray(model.value)) {\n\t\t\tconst currentIndex = itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\t\tconst nextIndex = (currentIndex + 1) % itemsForShow.value.length;\n\t\t\tmodel.value = { ...itemsForShow.value[nextIndex] };\n\t\t}\n\t};\n\n\t/**\n\t * Удалить выбранное значение по id\n\t *\n\t * @param id Идентификатор элемента для удаления\n\t */\n\tconst deleteItemById = async (id: Item['id']) => {\n\t\tif (Array.isArray(model.value)) {\n\t\t\tmodel.value = model.value.filter(item => item.id !== id);\n\t\t}\n\t};\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\tgenIsShort,\n\t\titems: localItems,\n\t\titemsForShow,\n\t\tselectItem,\n\t\tselectNextItem,\n\t\tdeleteItemById,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Item[],\n\tsize: 's',\n\tminLength: 0,\n\tsearchType: 'popup',\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\nconst searchTypeLocal = computed(() => {\n\t// multiselect не поддерживает inline ввода\n\tif (props.searchType === 'inline' && props.multiselect) return 'popup';\n\n\t// В мобильной версии popup работает в полноэкранном режиме\n\tif (props.searchType === 'inline' && Core.state.isMobile) return 'popup';\n\n\treturn props.searchType;\n});\n\nlet minLength = 0;\nif (searchTypeLocal.value === 'inline' && props.minLength) {\n\tminLength = props.minLength;\n}\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, minLength, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(\n\tmodel,\n\ttoRef(props, 'items'),\n\tprops.multiselect,\n\ttoRef(props, 'appendAllValue'),\n\ttoRef(props, 'appendSearchToResult'),\n\tsearchTypeLocal,\n\tminLength,\n\tapi,\n);\n\nconst component = computed(() => {\n\tif (props.buttonProps) return 'TopButton';\n\tif (searchTypeLocal.value === 'inline') return 'TopInput';\n\n\treturn 'div';\n});\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\nif (api.apiRequest) {\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => {\n\t\tapi.setSearchTextAndLoad(menu.searchText.value);\n\n\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\tif (menu.genIsShort()) {\n\t\t\t\tgetPopup()?.close();\n\t\t\t}\n\t\t}\n\t});\n}\n\nwatch(model, () => {\n\t/**\n\t * При изменении значения модели в режиме inline необходимо очистить поле поиска,\n\t * так как поиск больше не актуален после выбора значения\n\t */\n\tif (searchTypeLocal.value === 'inline') {\n\t\tmenu.resetSearch();\n\t}\n});\n\nconst placeholder = computed(() => {\n\tif (Array.isArray(model.value) || props.multiselect || !props.selectedAsPlaceholder && searchTypeLocal.value !== 'inline') {\n\t\treturn props.placeholder;\n\t}\n\n\treturn model.value?.name || props.placeholder;\n});\n\n/**\n * Обработчик ввода клавиш на кнопке или поле ввода\n */\nconst onOpenerKeydown = (e: KeyboardEvent) => {\n\tlet needOpen = false;\n\n\tswitch (e.key) {\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tmodel.value.pop();\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowRight':\n\t\tcase 'ArrowDown':\n\t\tcase 'ArrowLeft':\n\t\tcase 'Enter':\n\t\tcase ' ':\n\t\t\tneedOpen = true;\n\n\t\t\tbreak;\n\t\tcase 'Escape':\n\t\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\t\t// очистка введенного текста\n\t\t\t\tmenu.resetSearch();\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\t// введен символ\n\tconst symbolPressed = e.key.length === 1 && !e.ctrlKey && !e.metaKey;\n\n\t// введен символ\n\tif (searchTypeLocal.value === 'popup' || searchTypeLocal.value === 'inline') {\n\t\tif (symbolPressed) {\n\t\t\tneedOpen = true;\n\t\t}\n\t}\n\n\t// popup уже открыт\n\tif (getPopup()?.elPopup) {\n\t\tneedOpen = false;\n\t}\n\n\tif (needOpen) {\n\t\tif (searchTypeLocal.value === 'popup') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// введен символ\n\t\t\tif (symbolPressed) {\n\t\t\t\t// начало ввода, сразу ввести первый символ вместе с открытием popup\n\t\t\t\tif (!menu.searchText.value) {\n\t\t\t\t\tmenu.searchText.value = e.key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nlet disabledFocusToOpen = false;\n\nconst onFocus = (e: FocusEvent) => {\n\tif (disabledFocusToOpen) return;\n\n\tif (searchTypeLocal.value === 'inline') {\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nconst onClickChanger = (e: MouseEvent) => {\n\te.preventDefault();\n\n\tdisabledFocusToOpen = true;\n\t(e.currentTarget as HTMLElement)?.parentElement?.focus();\n\tdisabledFocusToOpen = false;\n\n\tmenu.selectNextItem();\n};\n\n/**\n * Обработчик открытия попапа\n */\nconst onOpen = () => {\n\tdisabledFocusToOpen = true;\n\n\tif (api.apiRequest) {\n\t\tif (menu.genIsShort()) {\n\t\t\tgetPopup()?.close();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// при открытии сразу выполнить поиск\n\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tsetTimeout(() => {\n\t\tdisabledFocusToOpen = false;\n\t}, 100);\n\n\t// очистка введенного текста\n\tif (searchTypeLocal.value === 'popup') {\n\t\tif (menu.searchText.value) menu.resetSearch();\n\t}\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\n */\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tapi.loadAppend();\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tif (props.multiselect) {\n\t\t\t\tif (!Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\t\tname: 'Выбери меня',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = {\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ immediate: true },\n\t);\n\n\twatch(\n\t\t() => props.searchType,\n\t\t() => {\n\t\t\t// пауза для установки props в адресной строке\n\t\t\tsetTimeout(() => {\n\t\t\t\tlocation.reload();\n\t\t\t}, 500);\n\t\t},\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"onOpen()\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"false\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<component\n\t\t\t\t:is=\"component\"\n\n\t\t\t\t:=\"buttonProps\"\n\n\t\t\t\tref=\"subcomponentSelector\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t'top-as-input': !buttonProps,\n\t\t\t\t\t'top-as-selector': true,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@keydown=\"onOpenerKeydown\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\n\t\t\t\t:placeholder\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t@focus=\"onFocus\"\n\t\t\t\t@blur=\"getPopup()?.isClosed ? menu.resetSearch() : ''\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Item[]\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"menu.deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"searchTypeLocal !== 'inline' && !multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span v-if=\"multiselect && !model.length\" class=\"top-selector2_placeholder top-ellipsis\">\n\t\t\t\t\t{{ placeholder }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !buttonProps && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector top-popup_widget\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"onClickChanger\"\n\t\t\t\t></span>\n\t\t\t</component>\n\t\t</template>\n\n\t\t<template #widget v-if=\"searchTypeLocal === 'popup'\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"menu.selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (searchType !== 'popup' || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\tmin-width: 180px;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n}\n\n.top-selector2::placeholder,\n.top-selector2_placeholder {\n\tcolor: var(--color-text-2);\n}\n\n.top-selector2_placeholder {\n\tpadding-left: var(--top-padding-1);\n}\n\n.top-selector2-multiselect {\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\twidth: auto;\n\tpadding: var(--top-padding-1);\n\tmargin: calc(0px - var(--top-padding-1));\n\ttransform: translateX(0);\n}\n\n.top-selector2.top-button {\n\tjustify-content: start;\n}\n\n.top-selector2.top-input_input ~ .top-changer-selector {\n\ttransform: translateX(-52px);\n}\n\n.top-selector2.top-as-selector {\n\tpadding-right: calc(var(--top-selector-arrow-width) + var(--top-padding-2));\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { TopButton } from '@/components/forms/forms';\nimport type { Props } from '@/components/formsExt/policy/types';\n\ndefineProps<Props>();\n\nconst isVisible = ref(true);\n\nconst acceptCookie = () => {\n\tconst baseDomain = location.hostname.split('.').slice(-2).join('.');\n\n\tdocument.cookie = `cookie_consent=accepted; path=/; domain=.${baseDomain}; max-age=31536000`;\n\n\tisVisible.value = false;\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"isVisible\"\n\t\tclass=\"top-policy\"\n\t>\n\t\t<div class=\"top-policy_title\">\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"top-policy_description\"\n\t\t\tv-html=\"text\"\n\t\t></div>\n\n\t\t<TopButton\n\t\t\tsize=\"m\"\n\t\t\t@click=\"acceptCookie\"\n\t\t>\n\t\t\t{{ $i18n.Common.Allow }}\n\t\t</TopButton>\n\t</div>\n</template>\n\n<style>\n.top-policy {\n\tbox-sizing: border-box;\n\tbox-shadow: var(--top-shadow-b);\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-lightning-1);\n\twidth: 600px;\n\tpadding: var(--top-padding-4);\n\tposition: fixed;\n\tright: var(--top-gap-10);\n\tbottom: var(--top-gap-10);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-4);\n\tz-index: 10000;\n}\n\n.top-policy_title {\n\tfont-size: 24px;\n\tfont-weight: 700;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-policy {\n\t\twidth: 100%;\n\t\tright: 0;\n\t\tbottom: calc(var(--top-gap-5) + var(--toolbar-height, 0px));\n\t}\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\nimport Policy from './policy/policy.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\nexport const TopPolicy = Policy as typeof Policy & ComponentCustomProps;"],"names":["isChanged","vue","localValue","props","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","onChange","id","index","newModel","items","isLoading","nextOffset","apiRequest","res","cacheKey","indexWithError","searchText","callAPIRequest","loadAppend","newSearchText","minLength","modelValue","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","searchType","api","forms","localItems","localItems2","itemAll","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","items2","isSelected","resetSearch","genIsShort","nextIndex","searchTypeLocal","useAPI","component","popupRef","menu","getPopup","placeholder","onOpenerKeydown","e","symbolPressed","onFocus","onClickChanger","onScrollContentList","el","isVisible","TopEditArea","_sfc_main$7","TopEditInput","_sfc_main$6","TopRadioGroup","_sfc_main$5","TopCheckboxGroup","_sfc_main$4","TopSelector2","_sfc_main$2","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main$1","TopPolicy","_sfc_main"],"mappings":"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"}
|