@topvisor/ui 1.0.19 → 1.0.20
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/{datepicker-CFiizYlZ.amd.js → datepicker-BpcIQBQx.amd.js} +2 -2
- package/.chunks/{datepicker-CFiizYlZ.amd.js.map → datepicker-BpcIQBQx.amd.js.map} +1 -1
- package/.chunks/{datepicker-B8O5mg_G.es.js → datepicker-BwpUPRh5.es.js} +2 -2
- package/.chunks/{datepicker-B8O5mg_G.es.js.map → datepicker-BwpUPRh5.es.js.map} +1 -1
- package/.chunks/{forms-BWc2kMFD.amd.js → forms-CqYQQ4oo.amd.js} +3 -3
- package/.chunks/{forms-BWc2kMFD.amd.js.map → forms-CqYQQ4oo.amd.js.map} +1 -1
- package/.chunks/{forms-DW_XLzg8.es.js → forms-UBLh4e8-.es.js} +544 -552
- package/.chunks/{forms-DW_XLzg8.es.js.map → forms-UBLh4e8-.es.js.map} +1 -1
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-saYIC17M.es.js → listItem.vue_vue_type_script_setup_true_lang-B0jhkmeG.es.js} +2 -2
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-saYIC17M.es.js.map → listItem.vue_vue_type_script_setup_true_lang-B0jhkmeG.es.js.map} +1 -1
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-naMiJruI.amd.js → listItem.vue_vue_type_script_setup_true_lang-BbSoFbg2.amd.js} +2 -2
- package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-naMiJruI.amd.js.map → listItem.vue_vue_type_script_setup_true_lang-BbSoFbg2.amd.js.map} +1 -1
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-CcspstQc.es.js → menu.vue_vue_type_style_index_0_lang-CF3aS3nJ.es.js} +2 -2
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-CcspstQc.es.js.map → menu.vue_vue_type_style_index_0_lang-CF3aS3nJ.es.js.map} +1 -1
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-06YUloqb.amd.js → menu.vue_vue_type_style_index_0_lang-CPtzi4v1.amd.js} +2 -2
- package/.chunks/{menu.vue_vue_type_style_index_0_lang-06YUloqb.amd.js.map → menu.vue_vue_type_style_index_0_lang-CPtzi4v1.amd.js.map} +1 -1
- package/.chunks/{notice-zADfJ5TR.amd.js → notice-CiJb1Cdk.amd.js} +2 -2
- package/.chunks/{notice-zADfJ5TR.amd.js.map → notice-CiJb1Cdk.amd.js.map} +1 -1
- package/.chunks/{notice-BQyuy4nF.es.js → notice-Dj71_6Fi.es.js} +2 -2
- package/.chunks/{notice-BQyuy4nF.es.js.map → notice-Dj71_6Fi.es.js.map} +1 -1
- package/.chunks/{popup-CPS-7fSX.amd.js → popup-Cw2abdjh.amd.js} +2 -2
- package/.chunks/{popup-CPS-7fSX.amd.js.map → popup-Cw2abdjh.amd.js.map} +1 -1
- package/.chunks/{popup-DsVptZvL.es.js → popup-DbEAZSBK.es.js} +2 -2
- package/.chunks/{popup-DsVptZvL.es.js.map → popup-DbEAZSBK.es.js.map} +1 -1
- package/.chunks/{utils-DIP-BdDy.es.js → utils-3FaaPSyL.es.js} +3 -3
- package/.chunks/{utils-DIP-BdDy.es.js.map → utils-3FaaPSyL.es.js.map} +1 -1
- package/.chunks/utils-DF6k2YnU.amd.js +2 -0
- package/.chunks/{utils-B75aamxF.amd.js.map → utils-DF6k2YnU.amd.js.map} +1 -1
- package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-B55gllXV.amd.js → utils-DSzOIsFV.amd.js} +2 -2
- package/.chunks/utils-DSzOIsFV.amd.js.map +1 -0
- package/.chunks/utils-zcyFDsBL.es.js +338 -0
- package/.chunks/utils-zcyFDsBL.es.js.map +1 -0
- package/charts/charts.amd.js +1 -1
- package/charts/charts.js +1 -1
- package/components/dialog/dialog/dialog.vue.d.ts +1 -1
- package/core/app.amd.js +1 -1
- package/core/app.amd.js.map +1 -1
- package/core/app.d.ts +2 -2
- package/core/app.js +17 -18
- package/core/plugins/i18n.d.ts +0 -10
- package/dialog/dialog.amd.js +1 -1
- package/dialog/dialog.amd.js.map +1 -1
- package/dialog/dialog.js +39 -40
- package/dialog/dialog.js.map +1 -1
- package/forms/forms.amd.js +1 -1
- package/forms/forms.js +1 -1
- package/formsExt/formsExt.amd.js +1 -1
- package/formsExt/formsExt.amd.js.map +1 -1
- package/formsExt/formsExt.js +91 -91
- package/formsExt/formsExt.js.map +1 -1
- package/icomoon/Topvisor icons.json +233 -118
- package/icomoon/demo.html +71 -1
- package/icomoon/fonts/Topvisor-2.eot +0 -0
- package/icomoon/fonts/Topvisor-2.svg +5 -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 +20 -5
- package/layout/layout.amd.js +1 -1
- package/layout/layout.js +1 -1
- package/package.json +31 -32
- package/popup/popup.amd.js +1 -1
- package/popup/popup.js +2 -2
- package/popup/worker.amd.js +1 -1
- package/popup/worker.js +2 -2
- package/project/project.amd.js +1 -1
- package/project/project.js +3 -3
- package/tabsView/tabsView.amd.js +1 -1
- package/tabsView/tabsView.js +16 -16
- package/utils/clipboard.amd.js +1 -1
- package/utils/clipboard.js +1 -1
- package/utils/date.amd.js +1 -1
- package/utils/date.js +1 -1
- package/utils/device.amd.js +1 -1
- package/utils/device.js +1 -1
- package/utils/lodash.amd.js +1 -1
- package/utils/lodash.js +1 -1
- package/utils/price.amd.js +1 -1
- package/utils/price.js +1 -1
- package/utils/string.amd.js +1 -1
- package/utils/string.js +1 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-B55gllXV.amd.js.map +0 -1
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BkBYW0yR.es.js +0 -266
- package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BkBYW0yR.es.js.map +0 -1
- package/.chunks/utils-B75aamxF.amd.js +0 -2
- package/.chunks/utils-DfYj3r9i.amd.js +0 -2
- package/.chunks/utils-DfYj3r9i.amd.js.map +0 -1
- package/.chunks/utils-h5v4GPgp.es.js +0 -79
- package/.chunks/utils-h5v4GPgp.es.js.map +0 -1
package/formsExt/formsExt.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Core as
|
|
2
|
-
import { defineComponent as _, ref as
|
|
3
|
-
import {
|
|
4
|
-
import { invertKeyboardLayout as
|
|
5
|
-
import { TopPopup as
|
|
6
|
-
import { _ as
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
const
|
|
1
|
+
import { Core as x } from "../core/app.js";
|
|
2
|
+
import { defineComponent as _, ref as b, computed as z, openBlock as p, createElementBlock as v, normalizeClass as T, toDisplayString as w, createCommentVNode as V, createElementVNode as E, createVNode as R, withKeys as B, withModifiers as S, createBlock as k, withCtx as $, createTextVNode as L, watch as I, toRef as te, mergeProps as X, mergeModels as G, useModel as j, Fragment as N, renderList as D, withDirectives as Q, vModelRadio as oe, resolveDirective as le, unref as O, renderSlot as H } from "vue";
|
|
3
|
+
import { w as ae, _ as F, c as se, s as ne, a as re, C as ie } from "../.chunks/forms-UBLh4e8-.es.js";
|
|
4
|
+
import { invertKeyboardLayout as ue } from "../utils/keyboard.js";
|
|
5
|
+
import { TopPopup as de, TopPopupWidgetInput as pe, TopPopupListItem as Y } from "../popup/popup.js";
|
|
6
|
+
import { _ as ce } from "../.chunks/menu.vue_vue_type_style_index_0_lang-CF3aS3nJ.es.js";
|
|
7
|
+
const ee = ["../assets/formsExt.css"].map((n) => import.meta.resolve(n));
|
|
8
|
+
x.insertCSSLinkToPage(ee, !0);
|
|
9
|
+
const me = { class: "top-editArea_footer" }, fe = /* @__PURE__ */ _({
|
|
10
10
|
__name: "editArea",
|
|
11
11
|
props: {
|
|
12
12
|
defaultValue: { default: "" },
|
|
@@ -30,7 +30,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
30
30
|
},
|
|
31
31
|
emits: ["submit", "close", "clickOnTitle"],
|
|
32
32
|
setup(n, { emit: a }) {
|
|
33
|
-
const e = n, l = a, f =
|
|
33
|
+
const e = n, l = a, f = b(e.defaultValue), y = b(e.isFocused), d = z(() => f.value !== e.defaultValue), c = z(() => e.attachToKeyboard ? "" : e.forceShowCloseBtn && !d.value ? e.closeText : e.cancelText), r = (i) => {
|
|
34
34
|
l("submit", i), f.value = e.defaultValue;
|
|
35
35
|
}, h = () => {
|
|
36
36
|
if (e.forceShowCloseBtn && !d.value) {
|
|
@@ -38,11 +38,11 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
f.value = e.defaultValue;
|
|
41
|
-
},
|
|
41
|
+
}, A = () => {
|
|
42
42
|
e.attachToKeyboard && l("clickOnTitle");
|
|
43
43
|
};
|
|
44
44
|
return (i, o) => (p(), v("div", {
|
|
45
|
-
class:
|
|
45
|
+
class: T({
|
|
46
46
|
"top-editArea": !0,
|
|
47
47
|
"top-editArea-attachedToKeyboard": i.attachToKeyboard
|
|
48
48
|
})
|
|
@@ -50,16 +50,16 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
50
50
|
i.title ? (p(), v("div", {
|
|
51
51
|
key: 0,
|
|
52
52
|
class: "top-editArea_title",
|
|
53
|
-
onClick: o[0] || (o[0] = (g) =>
|
|
54
|
-
}, w(i.title), 1)) :
|
|
53
|
+
onClick: o[0] || (o[0] = (g) => A())
|
|
54
|
+
}, w(i.title), 1)) : V("", !0),
|
|
55
55
|
E("div", {
|
|
56
|
-
class:
|
|
56
|
+
class: T({
|
|
57
57
|
"top-editArea_form": !0,
|
|
58
58
|
"top-error": i.isError,
|
|
59
59
|
"top-focus": y.value
|
|
60
60
|
})
|
|
61
61
|
}, [
|
|
62
|
-
R(
|
|
62
|
+
R(ae, {
|
|
63
63
|
modelValue: f.value,
|
|
64
64
|
"onUpdate:modelValue": o[1] || (o[1] = (g) => f.value = g),
|
|
65
65
|
name: i.name,
|
|
@@ -79,7 +79,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
79
79
|
o[4] || (o[4] = B(S((g) => r(f.value), ["ctrl"]), ["enter"]))
|
|
80
80
|
]
|
|
81
81
|
}, null, 8, ["modelValue", "name", "placeholder", "rows", "minHeight", "expandable", "disabled", "readonly", "isError", "hint"]),
|
|
82
|
-
E("div",
|
|
82
|
+
E("div", me, [
|
|
83
83
|
!i.attachToKeyboard && (d.value || i.forceShowCloseBtn) ? (p(), k(F, {
|
|
84
84
|
key: 0,
|
|
85
85
|
class: "top-editArea_button",
|
|
@@ -91,7 +91,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
91
91
|
L(w(c.value), 1)
|
|
92
92
|
]),
|
|
93
93
|
_: 1
|
|
94
|
-
})) :
|
|
94
|
+
})) : V("", !0),
|
|
95
95
|
d.value ? (p(), k(F, {
|
|
96
96
|
key: 1,
|
|
97
97
|
class: "top-editArea_button",
|
|
@@ -102,12 +102,12 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
102
102
|
L(w(i.attachToKeyboard ? "" : i.submitText), 1)
|
|
103
103
|
]),
|
|
104
104
|
_: 1
|
|
105
|
-
}, 8, ["icon"])) :
|
|
105
|
+
}, 8, ["icon"])) : V("", !0)
|
|
106
106
|
])
|
|
107
107
|
], 2)
|
|
108
108
|
], 2));
|
|
109
109
|
}
|
|
110
|
-
}),
|
|
110
|
+
}), ve = { class: "top-editInput" }, ye = /* @__PURE__ */ _({
|
|
111
111
|
__name: "editInput",
|
|
112
112
|
props: {
|
|
113
113
|
modelValue: {},
|
|
@@ -116,15 +116,15 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
116
116
|
},
|
|
117
117
|
emits: ["update:modelValue"],
|
|
118
118
|
setup(n, { emit: a }) {
|
|
119
|
-
const e = n, l =
|
|
120
|
-
I(
|
|
119
|
+
const e = n, l = b(e.modelValue);
|
|
120
|
+
I(te(e.modelValue), () => {
|
|
121
121
|
l.value = e.modelValue;
|
|
122
122
|
});
|
|
123
123
|
const f = a, y = () => {
|
|
124
124
|
f("update:modelValue", l.value);
|
|
125
125
|
};
|
|
126
|
-
return (d, c) => (p(), v("div",
|
|
127
|
-
R(
|
|
126
|
+
return (d, c) => (p(), v("div", ve, [
|
|
127
|
+
R(se, X(d.input, {
|
|
128
128
|
onKeydownCapture: c[0] || (c[0] = B(S((r) => l.value = d.modelValue, ["stop"]), ["esc"])),
|
|
129
129
|
onKeydown: B(S(y, ["stop"]), ["enter"]),
|
|
130
130
|
modelValue: l.value,
|
|
@@ -134,13 +134,13 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
134
134
|
key: 0,
|
|
135
135
|
icon: "",
|
|
136
136
|
styling: "soft"
|
|
137
|
-
}, d.button, { onClick: y }), null, 16)) :
|
|
137
|
+
}, d.button, { onClick: y }), null, 16)) : V("", !0)
|
|
138
138
|
]));
|
|
139
139
|
}
|
|
140
|
-
}),
|
|
140
|
+
}), he = ["data-top-icon", "onClick"], ge = {
|
|
141
141
|
key: 0,
|
|
142
142
|
class: "top-radioGroup_circle"
|
|
143
|
-
},
|
|
143
|
+
}, be = ["value", "disabled"], Ve = /* @__PURE__ */ _({
|
|
144
144
|
__name: "radioGroup",
|
|
145
145
|
props: /* @__PURE__ */ G({
|
|
146
146
|
modelValue: {},
|
|
@@ -156,16 +156,16 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
156
156
|
}),
|
|
157
157
|
emits: /* @__PURE__ */ G(["update:modelValue"], ["update:modelValue"]),
|
|
158
158
|
setup(n, { emit: a }) {
|
|
159
|
-
const e = j(n, "modelValue"), l = n, f =
|
|
159
|
+
const e = j(n, "modelValue"), l = n, f = b(null);
|
|
160
160
|
I(e, () => {
|
|
161
|
-
var d, c, r, h,
|
|
162
|
-
(d = l.radiosProps) != null && d.some((i) => i.value === e.value) || (e.value = ((r = (c = l.radiosProps) == null ? void 0 : c[0]) == null ? void 0 : r.value) ?? ""), (
|
|
161
|
+
var d, c, r, h, A;
|
|
162
|
+
(d = l.radiosProps) != null && d.some((i) => i.value === e.value) || (e.value = ((r = (c = l.radiosProps) == null ? void 0 : c[0]) == null ? void 0 : r.value) ?? ""), (A = (h = f.value) == null ? void 0 : h.querySelector(".radioGroup_item-selected")) == null || A.scrollIntoView();
|
|
163
163
|
}, { immediate: !0 });
|
|
164
164
|
const y = "radioGroup-" + Math.random();
|
|
165
165
|
return (d, c) => (p(), v("div", {
|
|
166
166
|
ref_key: "elRef",
|
|
167
167
|
ref: f,
|
|
168
|
-
class:
|
|
168
|
+
class: T({
|
|
169
169
|
"top-radioGroup": !0,
|
|
170
170
|
"top-scrollBarXHidding": !0,
|
|
171
171
|
["top-size_" + d.size]: !!d.size,
|
|
@@ -173,7 +173,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
173
173
|
})
|
|
174
174
|
}, [
|
|
175
175
|
(p(!0), v(N, null, D(d.radiosProps, (r) => (p(), v("label", {
|
|
176
|
-
class:
|
|
176
|
+
class: T({
|
|
177
177
|
"top-radioGroup_item-selected": r.value === e.value,
|
|
178
178
|
"top-radioGroup_item": !0,
|
|
179
179
|
"top-forms-focusable": !0,
|
|
@@ -183,24 +183,24 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
183
183
|
onClick: (h) => e.value = r.value
|
|
184
184
|
}, [
|
|
185
185
|
L(w(r.title) + " ", 1),
|
|
186
|
-
d.showIndicator ? (p(), v("span",
|
|
186
|
+
d.showIndicator ? (p(), v("span", ge)) : V("", !0),
|
|
187
187
|
Q(E("input", {
|
|
188
188
|
"onUpdate:modelValue": c[0] || (c[0] = (h) => e.value = h),
|
|
189
189
|
name: y,
|
|
190
190
|
type: "radio",
|
|
191
|
-
class:
|
|
191
|
+
class: T({
|
|
192
192
|
"top-unvisible": !0
|
|
193
193
|
}),
|
|
194
194
|
value: r.value,
|
|
195
195
|
disabled: r.disabled
|
|
196
|
-
}, null, 8,
|
|
197
|
-
[
|
|
196
|
+
}, null, 8, be), [
|
|
197
|
+
[oe, e.value]
|
|
198
198
|
])
|
|
199
|
-
], 10,
|
|
199
|
+
], 10, he))), 256))
|
|
200
200
|
], 2));
|
|
201
201
|
}
|
|
202
|
-
}),
|
|
203
|
-
const l =
|
|
202
|
+
}), Ae = (n, a, e) => {
|
|
203
|
+
const l = b([]), f = b(!1);
|
|
204
204
|
let y = "", d;
|
|
205
205
|
n && !n.params.limit && (n.params.limit = 100);
|
|
206
206
|
const c = async () => {
|
|
@@ -229,16 +229,16 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
229
229
|
n.params.offset = d, n.params.search = y;
|
|
230
230
|
const o = await c();
|
|
231
231
|
o && (d = o.nextOffset, l.value = l.value.concat(o.result));
|
|
232
|
-
},
|
|
232
|
+
}, A = ne(() => r(), 200);
|
|
233
233
|
return {
|
|
234
234
|
items: l,
|
|
235
235
|
isLoading: f,
|
|
236
236
|
loadAppend: h,
|
|
237
237
|
setSearchTextAndLoad: (o, g = !0) => {
|
|
238
|
-
n && (o.length < a || o === y && l.value.length || (y = o, g ?
|
|
238
|
+
n && (o.length < a || o === y && l.value.length || (y = o, g ? A() : r()));
|
|
239
239
|
}
|
|
240
240
|
};
|
|
241
|
-
},
|
|
241
|
+
}, Ce = { class: "top-selector2_itemMulti top-ellipsis" }, Te = /* @__PURE__ */ _({
|
|
242
242
|
__name: "itemMulti",
|
|
243
243
|
props: {
|
|
244
244
|
id: {},
|
|
@@ -246,7 +246,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
246
246
|
},
|
|
247
247
|
emits: ["delete"],
|
|
248
248
|
setup(n) {
|
|
249
|
-
return (a, e) => (p(), v("div",
|
|
249
|
+
return (a, e) => (p(), v("div", Ce, [
|
|
250
250
|
L(w(a.name) + " ", 1),
|
|
251
251
|
E("span", {
|
|
252
252
|
class: "top-selector2_itemMultiDelete",
|
|
@@ -257,13 +257,13 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
257
257
|
}, null, 32)
|
|
258
258
|
]));
|
|
259
259
|
}
|
|
260
|
-
}),
|
|
260
|
+
}), we = {
|
|
261
261
|
key: 0,
|
|
262
262
|
class: "top-selector2_activeItems"
|
|
263
|
-
},
|
|
263
|
+
}, $e = {
|
|
264
264
|
key: 1,
|
|
265
265
|
class: "top-selector2_activeName top-ellipsis"
|
|
266
|
-
},
|
|
266
|
+
}, ke = /* @__PURE__ */ _({
|
|
267
267
|
__name: "selector2",
|
|
268
268
|
props: /* @__PURE__ */ G({
|
|
269
269
|
modelValue: {},
|
|
@@ -286,10 +286,10 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
286
286
|
}),
|
|
287
287
|
emits: ["update:modelValue"],
|
|
288
288
|
setup(n) {
|
|
289
|
-
const a = n, e = j(n, "modelValue"), l =
|
|
289
|
+
const a = n, e = j(n, "modelValue"), l = b(""), f = {
|
|
290
290
|
id: 0,
|
|
291
|
-
name:
|
|
292
|
-
}, y =
|
|
291
|
+
name: re().Common.All
|
|
292
|
+
}, y = b(null), d = b(null), c = () => {
|
|
293
293
|
var t;
|
|
294
294
|
return (t = y.value) == null ? void 0 : t.popup;
|
|
295
295
|
};
|
|
@@ -300,36 +300,36 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
300
300
|
},
|
|
301
301
|
{ immediate: !0 }
|
|
302
302
|
);
|
|
303
|
-
const r =
|
|
303
|
+
const r = Ae(a.apiRequest, a.minLength, a.useCache), h = z(() => {
|
|
304
304
|
const t = [];
|
|
305
305
|
return !a.multiselect && a.appendAllValue && t.push(f), a.items.forEach((s) => t.push({ ...s })), t;
|
|
306
|
-
}),
|
|
307
|
-
const t = l.value.toLowerCase(), s =
|
|
306
|
+
}), A = (t, s = !0) => s && t.id === null ? Array.isArray(e.value) ? e.value.some((m) => m.id === t.id && m.name === t.name) : t.name === e.value.name : Array.isArray(e.value) ? e.value.some((m) => m.id === t.id) : t.id === e.value.id, i = z(() => {
|
|
307
|
+
const t = l.value.toLowerCase(), s = ue(t);
|
|
308
308
|
let m = [];
|
|
309
309
|
return h.value.forEach((u) => {
|
|
310
|
-
const
|
|
311
|
-
(u.id === Number(t) ||
|
|
310
|
+
const C = u.name.toLowerCase();
|
|
311
|
+
(u.id === Number(t) || C.includes(t) || C.includes(s)) && (C === t || C === s ? m.unshift(u) : m.push(u));
|
|
312
312
|
}), m.push(...r.items.value), a.appendSearchToResult && l.value && (!m.length || m[0].name.toLowerCase() !== t) && m.push({
|
|
313
313
|
id: null,
|
|
314
314
|
name: l.value
|
|
315
|
-
}), a.multiselect && (m = m.filter((u) => !
|
|
316
|
-
}), o =
|
|
315
|
+
}), a.multiselect && (m = m.filter((u) => !A(u))), m;
|
|
316
|
+
}), o = b(r.isLoading.value);
|
|
317
317
|
I(r.isLoading, () => {
|
|
318
318
|
o.value = r.isLoading.value;
|
|
319
319
|
});
|
|
320
320
|
const g = async (t) => {
|
|
321
321
|
var s, m;
|
|
322
322
|
if (a.multiselect) {
|
|
323
|
-
if (!Array.isArray(e.value) ||
|
|
323
|
+
if (!Array.isArray(e.value) || A(t))
|
|
324
324
|
return;
|
|
325
325
|
a.apiRequest && l.value && (o.value = !0);
|
|
326
326
|
const u = [...e.value];
|
|
327
|
-
u.push({ ...t }), e.value = u,
|
|
328
|
-
var
|
|
329
|
-
(
|
|
327
|
+
u.push({ ...t }), e.value = u, ie.state.isMobile ? (s = c()) == null || s.close() : setTimeout(() => {
|
|
328
|
+
var C, U, W, J;
|
|
329
|
+
(C = c()) == null || C.recalcPosition(), (J = (W = (U = c()) == null ? void 0 : U.elPopupWidget) == null ? void 0 : W.querySelector("input")) == null || J.focus(), l.value && (i.value.length ? a.apiRequest && (o.value = !1) : (l.value = "", r.items.value = []));
|
|
330
330
|
});
|
|
331
331
|
} else
|
|
332
|
-
|
|
332
|
+
JSON.stringify(t) !== JSON.stringify(e.value) && (e.value = { ...t }), (m = c()) == null || m.close();
|
|
333
333
|
}, K = () => {
|
|
334
334
|
if (!Array.isArray(e.value)) {
|
|
335
335
|
const s = (h.value.findIndex((m) => m.id === e.value.id) + 1) % h.value.length;
|
|
@@ -340,24 +340,24 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
340
340
|
var s;
|
|
341
341
|
(s = c()) == null || s.recalcPosition();
|
|
342
342
|
}));
|
|
343
|
-
}, M =
|
|
343
|
+
}, M = b(!1);
|
|
344
344
|
a.apiRequest && (I(M, () => {
|
|
345
345
|
M.value && r.setSearchTextAndLoad(l.value, !1);
|
|
346
346
|
}), I(l, () => r.setSearchTextAndLoad(l.value)));
|
|
347
347
|
const Z = (t) => {
|
|
348
348
|
const s = t.target;
|
|
349
349
|
s.scrollTop / (s.scrollHeight - s.offsetHeight) > 0.8 && r.loadAppend();
|
|
350
|
+
}, q = () => {
|
|
351
|
+
var t;
|
|
352
|
+
M.value = !1, (t = d.value) == null || t.focus(), l.value && (l.value = "", r.items.value = []);
|
|
350
353
|
};
|
|
351
354
|
return (t, s) => {
|
|
352
|
-
const m =
|
|
353
|
-
return p(), k(O(
|
|
355
|
+
const m = le("top-focus");
|
|
356
|
+
return p(), k(O(de), {
|
|
354
357
|
ref_key: "popupRef",
|
|
355
358
|
ref: y,
|
|
356
359
|
onOpen: s[3] || (s[3] = (u) => M.value = !0),
|
|
357
|
-
onClose: s[4] || (s[4] = (u) =>
|
|
358
|
-
var b;
|
|
359
|
-
return M.value = !1, (b = d.value) == null ? void 0 : b.focus();
|
|
360
|
-
}),
|
|
360
|
+
onClose: s[4] || (s[4] = (u) => q()),
|
|
361
361
|
onScrollContentList: s[5] || (s[5] = (u) => t.apiRequest ? Z(u) : void 0),
|
|
362
362
|
notch: !1,
|
|
363
363
|
transitionDuration: 0
|
|
@@ -366,7 +366,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
366
366
|
Q((p(), v("div", {
|
|
367
367
|
ref_key: "elRef",
|
|
368
368
|
ref: d,
|
|
369
|
-
class:
|
|
369
|
+
class: T({
|
|
370
370
|
"top-selector2": !0,
|
|
371
371
|
"top-selector2-multiselect": t.multiselect,
|
|
372
372
|
["top-size_" + t.size]: !0,
|
|
@@ -380,19 +380,19 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
380
380
|
],
|
|
381
381
|
tabindex: "0"
|
|
382
382
|
}, [
|
|
383
|
-
t.multiselect ? (p(), v("div",
|
|
383
|
+
t.multiselect ? (p(), v("div", we, [
|
|
384
384
|
(p(!0), v(N, null, D(e.value, (u) => (p(), k(Te, {
|
|
385
385
|
id: u.id,
|
|
386
386
|
name: u.name,
|
|
387
387
|
onDelete: P
|
|
388
388
|
}, null, 8, ["id", "name"]))), 256))
|
|
389
|
-
])) :
|
|
390
|
-
t.multiselect ?
|
|
389
|
+
])) : V("", !0),
|
|
390
|
+
t.multiselect ? V("", !0) : (p(), v("span", $e, w(Array.isArray(e.value) ? "" : e.value.name), 1)),
|
|
391
391
|
t.addChanger && !t.multiselect && h.value.length > 1 && !t.disabled ? (p(), v("span", {
|
|
392
392
|
key: 2,
|
|
393
393
|
class: "top-changer top-changer-selector",
|
|
394
394
|
onClick: S(K, ["stop"])
|
|
395
|
-
})) :
|
|
395
|
+
})) : V("", !0)
|
|
396
396
|
], 34)), [
|
|
397
397
|
[
|
|
398
398
|
m,
|
|
@@ -403,7 +403,7 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
403
403
|
])
|
|
404
404
|
]),
|
|
405
405
|
widget: $(() => [
|
|
406
|
-
R(O(
|
|
406
|
+
R(O(pe), {
|
|
407
407
|
title: "Поиск",
|
|
408
408
|
icon: "",
|
|
409
409
|
modelValue: l.value,
|
|
@@ -414,11 +414,11 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
414
414
|
]),
|
|
415
415
|
contentList: $(() => [
|
|
416
416
|
(p(!0), v(N, null, D(i.value, (u) => (p(), k(O(Y), {
|
|
417
|
-
class:
|
|
417
|
+
class: T({
|
|
418
418
|
"top-active": !Array.isArray(e.value) && !t.multiselect && e.value.name === u.name
|
|
419
419
|
}),
|
|
420
420
|
key: u.id ?? void 0,
|
|
421
|
-
onClick: S((
|
|
421
|
+
onClick: S((C) => g(u), ["stop"])
|
|
422
422
|
}, {
|
|
423
423
|
default: $(() => [
|
|
424
424
|
t.$slots.item ? H(t.$slots, "item", {
|
|
@@ -438,16 +438,16 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
438
438
|
L(w(t.$i18n.Common.No_results), 1)
|
|
439
439
|
]),
|
|
440
440
|
_: 1
|
|
441
|
-
})) :
|
|
441
|
+
})) : V("", !0)
|
|
442
442
|
]),
|
|
443
443
|
_: 3
|
|
444
444
|
}, 512);
|
|
445
445
|
};
|
|
446
446
|
}
|
|
447
|
-
}),
|
|
447
|
+
}), Se = ["data-top-icon"], Ie = { class: "top-info_text" }, Be = {
|
|
448
448
|
key: 0,
|
|
449
449
|
class: "top-info_value"
|
|
450
|
-
},
|
|
450
|
+
}, Le = /* @__PURE__ */ _({
|
|
451
451
|
__name: "info",
|
|
452
452
|
props: {
|
|
453
453
|
icon: {},
|
|
@@ -456,28 +456,28 @@ const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
|
|
|
456
456
|
},
|
|
457
457
|
setup(n) {
|
|
458
458
|
return (a, e) => (p(), v("div", {
|
|
459
|
-
class:
|
|
459
|
+
class: T({
|
|
460
460
|
"top-info": !0,
|
|
461
461
|
["top-size_" + a.size]: !0,
|
|
462
462
|
["top-info-styling_" + a.styling]: !0
|
|
463
463
|
}),
|
|
464
464
|
"data-top-icon": a.icon
|
|
465
465
|
}, [
|
|
466
|
-
E("div",
|
|
466
|
+
E("div", Ie, [
|
|
467
467
|
H(a.$slots, "default")
|
|
468
468
|
]),
|
|
469
|
-
a.$slots.additional ? (p(), v("span",
|
|
469
|
+
a.$slots.additional ? (p(), v("span", Be, [
|
|
470
470
|
H(a.$slots, "additional")
|
|
471
|
-
])) :
|
|
472
|
-
], 10,
|
|
471
|
+
])) : V("", !0)
|
|
472
|
+
], 10, Se));
|
|
473
473
|
}
|
|
474
|
-
}),
|
|
474
|
+
}), Ne = fe, ze = ye, Ge = Ve, De = ke, He = ce, Fe = Le;
|
|
475
475
|
export {
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
476
|
+
Ne as TopEditArea,
|
|
477
|
+
ze as TopEditInput,
|
|
478
|
+
Fe as TopInfo,
|
|
479
|
+
He as TopMenu,
|
|
480
|
+
Ge as TopRadioGroup,
|
|
481
|
+
De as TopSelector2
|
|
482
482
|
};
|
|
483
483
|
//# sourceMappingURL=formsExt.js.map
|
package/formsExt/formsExt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/selector2/api.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 './editArea';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\n// TODO: добавить переменную top-forms-fixed-height и использовать ее при добавлении отступов у страницы\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 cancelBtnText = computed(() => {\n\tif (props.attachToKeyboard) return '';\n\n\tif (props.forceShowCloseBtn && !isChanged.value) return props.closeText;\n\n\treturn props.cancelText;\n});\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=\"!attachToKeyboard && (isChanged || forceShowCloseBtn)\"\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{{ cancelBtnText }}\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=\"attachToKeyboard ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t{{ attachToKeyboard ? '' : submitText }}\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\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\tborder: none;\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\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\tmargin-bottom: env(keyboard-inset-height, 0);\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\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.top-editArea-attachedToKeyboard .top-button.top-editArea_button {\n\tmin-width: auto;\n\tpadding: 0;\n}\n\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button:before {\n\t--top-icon-size: 18px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './editInput';\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, Emits } from './radioGroup';\n\nconst model = defineModel<string>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst emit = defineEmits<Emits>();\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@import \"./styles/top-scrollBar.css\";\n\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","import type { Ref } from 'vue';\nimport { ref } from 'vue';\nimport { debounce } from '@/core/utils/lodash';\nimport type { Item, Props } from './selector2';\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items: Ref<Array<Item>> = ref([]);\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: Array<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\tloadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","<script setup lang=\"ts\">\nimport type { ComputedRef, ModelRef, ComponentInstance } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport type PopupClass from '@/components/popup/lib/popup';\nimport type { Item, Props, Slots } from './selector2';\nimport { useAPI } from './api';\nimport Selector2ItemMulti from './itemMulti.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Array<Item>,\n\tsize: 's',\n\tminLength: 0,\n\tshowSelectedInInput: true,\n});\n\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\n\ndefineSlots<Slots>();\n\n/**\n * Текст поиска по результатам\n */\nconst searchText = ref('');\n\nconst itemAll = {\n\tid: 0,\n\tname: useI18n().Common.All!,\n};\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<ComponentInstance<typeof TopPopup> | null>(null);\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): PopupClass | undefined => {\n\treturn popupRef.value?.popup;\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\nconst API = useAPI(props.apiRequest, props.minLength, props.useCache);\n\n/**\n * Варианты выбора: props.items + \"Выбрать все\"\n */\nconst localItems: ComputedRef<Array<Item>> = computed(() => {\n\tconst items: Array<Item> = [];\n\n\tif (!props.multiselect && props.appendAllValue) {\n\t\titems.push(itemAll);\n\t}\n\n\tprops.items.forEach(item => items.push({ ...item }));\n\n\treturn items;\n});\n\n/**\n * Проверить, что элемент выбран\n */\nconst isSelected = (item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(model.value)) {\n\t\t\treturn model.value.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === model.value.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(model.value)) {\n\t\treturn model.value.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === model.value.id;\n\t}\n};\n\n/**\n * Варианты выбора, которые выводятся\n */\nconst itemsForShow = computed(() => {\n\tconst searchString = searchText.value.toLowerCase();\n\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\tlet items: typeof localItems.value = [];\n\n\tlocalItems.value.forEach((item) => {\n\t\tconst itemName = item.name.toLowerCase();\n\n\t\tif (\n\t\t\titem.id === Number(searchString) ||\n\t\t\titemName.includes(searchString) ||\n\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t) {\n\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\titems.unshift(item);\n\t\t\t} else {\n\t\t\t\titems.push(item);\n\t\t\t}\n\t\t}\n\t});\n\n\titems.push(...API.items.value);\n\n\tif (\n\t\tprops.appendSearchToResult &&\n\t\t!!searchText.value &&\n\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t) {\n\t\titems.push({\n\t\t\tid: null,\n\t\t\tname: searchText.value,\n\t\t});\n\t}\n\n\tif (props.multiselect) {\n\t\titems = items.filter(item => !isSelected(item));\n\t}\n\n\treturn items;\n});\n\n/**\n * Флаг - идет загрузка\n *\n * Скрывает вывод заглушки \"Нет результатов\" - для загрузки данных через API (multiselect = true) - (см. selectItem)\n */\nconst isLoading = ref(API.isLoading.value);\n\nwatch(API.isLoading, () => {\n\tisLoading.value = API.isLoading.value;\n});\n\n/**\n * Выбрать значение\n *\n * Управляет закрытием окна\n */\nconst selectItem = async (item: Item) => {\n\tif (props.multiselect) {\n\t\tif (!Array.isArray(model.value)) return;\n\n\t\tif (isSelected(item)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (props.apiRequest && searchText.value) {\n\t\t\tisLoading.value = true;\n\t\t}\n\n\t\tconst newModel = [...model.value];\n\t\tnewModel.push({ ...item });\n\t\tmodel.value = newModel;\n\n\t\tif (Core.state.isMobile) {\n\t\t\tgetPopup()?.close();\n\n\t\t\t// сбросить введенный текст\n\t\t\tif (searchText.value) {\n\t\t\t\tsearchText.value = '';\n\t\t\t\tAPI.items.value = [];\n\t\t\t}\n\t\t} else {\n\t\t\tsetTimeout(() => {\n\t\t\t\tgetPopup()?.recalcPosition();\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\n\n\t\t\t\t// сбросить введенный текст, только если больше не найдено результатов\n\t\t\t\tif (searchText.value) {\n\t\t\t\t\tif (!itemsForShow.value.length) {\n\t\t\t\t\t\tsearchText.value = '';\n\t\t\t\t\t\tAPI.items.value = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (props.apiRequest) {\n\t\t\t\t\t\t\tisLoading.value = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\t// сбросить введенный текст\n\t\tif (searchText.value) {\n\t\t\tsearchText.value = '';\n\t\t\tAPI.items.value = [];\n\t\t}\n\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\n\t\t\tmodel.value = { ...item };\n\t\t}\n\n\t\tgetPopup()?.close();\n\t}\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\n\t\tmodel.value = { ...localItems.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\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\nconst isOpened = ref(false); // флаг попап открыт\n\nif (props.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\n}\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</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"isOpened = false, elRef?.focus()\"\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 Array<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 && localItems.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\t@click.stop=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget>\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"searchText\"\n\t\t\t\t:isLoading=\"isLoading\"\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 itemsForShow\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.name === item.name\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t@click.stop=\"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=\"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=\"!isLoading && !itemsForShow.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\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 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 TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","cancelBtnText","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","useAPI","apiRequest","minLength","useCache","items","isLoading","_searchText","_nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","searchText","useDebounce","itemAll","useI18n","popupRef","getPopup","API","localItems","isSelected","checkNameForNullId","itemSelected","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","itemName","selectItem","newModel","Core","selectNextItem","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","TopEditArea","_sfc_main$5","TopEditInput","_sfc_main$4","TopRadioGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","_sfc_main$9","TopInfo","_sfc_main"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/selector2/api.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 './editArea';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\n// TODO: добавить переменную top-forms-fixed-height и использовать ее при добавлении отступов у страницы\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 cancelBtnText = computed(() => {\n\tif (props.attachToKeyboard) return '';\n\n\tif (props.forceShowCloseBtn && !isChanged.value) return props.closeText;\n\n\treturn props.cancelText;\n});\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=\"!attachToKeyboard && (isChanged || forceShowCloseBtn)\"\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{{ cancelBtnText }}\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=\"attachToKeyboard ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t{{ attachToKeyboard ? '' : submitText }}\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\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\tborder: none;\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\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\tmargin-bottom: env(keyboard-inset-height, 0);\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\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.top-editArea-attachedToKeyboard .top-button.top-editArea_button {\n\tmin-width: auto;\n\tpadding: 0;\n}\n\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button:before {\n\t--top-icon-size: 18px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './editInput';\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, Emits } from './radioGroup';\n\nconst model = defineModel<string>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst emit = defineEmits<Emits>();\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@import \"./styles/top-scrollBar.css\";\n\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","import type { Ref } from 'vue';\nimport { ref } from 'vue';\nimport { debounce } from '@/core/utils/lodash';\nimport type { Item, Props } from './selector2';\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items: Ref<Array<Item>> = ref([]);\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: Array<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\tloadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","<script setup lang=\"ts\">\nimport type { ComputedRef, ModelRef, ComponentInstance } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport type PopupClass from '@/components/popup/lib/popup';\nimport type { Item, Props, Slots } from './selector2';\nimport { useAPI } from './api';\nimport Selector2ItemMulti from './itemMulti.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Array<Item>,\n\tsize: 's',\n\tminLength: 0,\n\tshowSelectedInInput: true,\n});\n\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\n\ndefineSlots<Slots>();\n\n/**\n * Текст поиска по результатам\n */\nconst searchText = ref('');\n\nconst itemAll = {\n\tid: 0,\n\tname: useI18n().Common.All!,\n};\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<ComponentInstance<typeof TopPopup> | null>(null);\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): PopupClass | undefined => {\n\treturn popupRef.value?.popup;\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\nconst API = useAPI(props.apiRequest, props.minLength, props.useCache);\n\n/**\n * Варианты выбора: props.items + \"Выбрать все\"\n */\nconst localItems: ComputedRef<Array<Item>> = computed(() => {\n\tconst items: Array<Item> = [];\n\n\tif (!props.multiselect && props.appendAllValue) {\n\t\titems.push(itemAll);\n\t}\n\n\tprops.items.forEach(item => items.push({ ...item }));\n\n\treturn items;\n});\n\n/**\n * Проверить, что элемент выбран\n */\nconst isSelected = (item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(model.value)) {\n\t\t\treturn model.value.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === model.value.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(model.value)) {\n\t\treturn model.value.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === model.value.id;\n\t}\n};\n\n/**\n * Варианты выбора, которые выводятся\n */\nconst itemsForShow = computed(() => {\n\tconst searchString = searchText.value.toLowerCase();\n\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\tlet items: typeof localItems.value = [];\n\n\tlocalItems.value.forEach((item) => {\n\t\tconst itemName = item.name.toLowerCase();\n\n\t\tif (\n\t\t\titem.id === Number(searchString) ||\n\t\t\titemName.includes(searchString) ||\n\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t) {\n\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\titems.unshift(item);\n\t\t\t} else {\n\t\t\t\titems.push(item);\n\t\t\t}\n\t\t}\n\t});\n\n\titems.push(...API.items.value);\n\n\tif (\n\t\tprops.appendSearchToResult &&\n\t\t!!searchText.value &&\n\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t) {\n\t\titems.push({\n\t\t\tid: null,\n\t\t\tname: searchText.value,\n\t\t});\n\t}\n\n\tif (props.multiselect) {\n\t\titems = items.filter(item => !isSelected(item));\n\t}\n\n\treturn items;\n});\n\n/**\n * Флаг - идет загрузка\n *\n * Скрывает вывод заглушки \"Нет результатов\" - для загрузки данных через API (multiselect = true) - (см. selectItem)\n */\nconst isLoading = ref(API.isLoading.value);\n\nwatch(API.isLoading, () => {\n\tisLoading.value = API.isLoading.value;\n});\n\n/**\n * Выбрать значение\n *\n * Управляет закрытием окна\n */\nconst selectItem = async (item: Item) => {\n\tif (props.multiselect) {\n\t\tif (!Array.isArray(model.value)) return;\n\n\t\tif (isSelected(item)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (props.apiRequest && searchText.value) {\n\t\t\tisLoading.value = true;\n\t\t}\n\n\t\tconst newModel = [...model.value];\n\t\tnewModel.push({ ...item });\n\t\tmodel.value = newModel;\n\n\t\tif (Core.state.isMobile) {\n\t\t\tgetPopup()?.close();\n\t\t} else {\n\t\t\tsetTimeout(() => {\n\t\t\t\tgetPopup()?.recalcPosition();\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\n\n\t\t\t\t// сбросить введенный текст, только если больше не найдено результатов\n\t\t\t\tif (searchText.value) {\n\t\t\t\t\tif (!itemsForShow.value.length) {\n\t\t\t\t\t\tsearchText.value = '';\n\t\t\t\t\t\tAPI.items.value = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (props.apiRequest) {\n\t\t\t\t\t\t\tisLoading.value = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\n\t\t\tmodel.value = { ...item };\n\t\t}\n\n\t\tgetPopup()?.close();\n\t}\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\n\t\tmodel.value = { ...localItems.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\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\nconst isOpened = ref(false); // флаг попап открыт\n\nif (props.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\n}\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\nconst onClose = () => {\n\tisOpened.value = false;\n\n\telRef.value?.focus();\n\n\t// сбросить введенный текст\n\tif (searchText.value) {\n\t\tsearchText.value = '';\n\t\tAPI.items.value = [];\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 Array<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 && localItems.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\t@click.stop=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget>\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"searchText\"\n\t\t\t\t:isLoading=\"isLoading\"\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 itemsForShow\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.name === item.name\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t@click.stop=\"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=\"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=\"!isLoading && !itemsForShow.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\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 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 TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","cancelBtnText","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","useAPI","apiRequest","minLength","useCache","items","isLoading","_searchText","_nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","searchText","useDebounce","itemAll","useI18n","popupRef","getPopup","API","localItems","isSelected","checkNameForNullId","itemSelected","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","itemName","selectItem","newModel","Core","selectNextItem","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","onClose","TopEditArea","_sfc_main$5","TopEditInput","_sfc_main$4","TopRadioGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","_sfc_main$9","TopInfo","_sfc_main"],"mappings":"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"}
|