@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.
Files changed (89) hide show
  1. package/.chunks/{datepicker-CFiizYlZ.amd.js → datepicker-BpcIQBQx.amd.js} +2 -2
  2. package/.chunks/{datepicker-CFiizYlZ.amd.js.map → datepicker-BpcIQBQx.amd.js.map} +1 -1
  3. package/.chunks/{datepicker-B8O5mg_G.es.js → datepicker-BwpUPRh5.es.js} +2 -2
  4. package/.chunks/{datepicker-B8O5mg_G.es.js.map → datepicker-BwpUPRh5.es.js.map} +1 -1
  5. package/.chunks/{forms-BWc2kMFD.amd.js → forms-CqYQQ4oo.amd.js} +3 -3
  6. package/.chunks/{forms-BWc2kMFD.amd.js.map → forms-CqYQQ4oo.amd.js.map} +1 -1
  7. package/.chunks/{forms-DW_XLzg8.es.js → forms-UBLh4e8-.es.js} +544 -552
  8. package/.chunks/{forms-DW_XLzg8.es.js.map → forms-UBLh4e8-.es.js.map} +1 -1
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. package/.chunks/{notice-zADfJ5TR.amd.js → notice-CiJb1Cdk.amd.js} +2 -2
  18. package/.chunks/{notice-zADfJ5TR.amd.js.map → notice-CiJb1Cdk.amd.js.map} +1 -1
  19. package/.chunks/{notice-BQyuy4nF.es.js → notice-Dj71_6Fi.es.js} +2 -2
  20. package/.chunks/{notice-BQyuy4nF.es.js.map → notice-Dj71_6Fi.es.js.map} +1 -1
  21. package/.chunks/{popup-CPS-7fSX.amd.js → popup-Cw2abdjh.amd.js} +2 -2
  22. package/.chunks/{popup-CPS-7fSX.amd.js.map → popup-Cw2abdjh.amd.js.map} +1 -1
  23. package/.chunks/{popup-DsVptZvL.es.js → popup-DbEAZSBK.es.js} +2 -2
  24. package/.chunks/{popup-DsVptZvL.es.js.map → popup-DbEAZSBK.es.js.map} +1 -1
  25. package/.chunks/{utils-DIP-BdDy.es.js → utils-3FaaPSyL.es.js} +3 -3
  26. package/.chunks/{utils-DIP-BdDy.es.js.map → utils-3FaaPSyL.es.js.map} +1 -1
  27. package/.chunks/utils-DF6k2YnU.amd.js +2 -0
  28. package/.chunks/{utils-B75aamxF.amd.js.map → utils-DF6k2YnU.amd.js.map} +1 -1
  29. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-B55gllXV.amd.js → utils-DSzOIsFV.amd.js} +2 -2
  30. package/.chunks/utils-DSzOIsFV.amd.js.map +1 -0
  31. package/.chunks/utils-zcyFDsBL.es.js +338 -0
  32. package/.chunks/utils-zcyFDsBL.es.js.map +1 -0
  33. package/charts/charts.amd.js +1 -1
  34. package/charts/charts.js +1 -1
  35. package/components/dialog/dialog/dialog.vue.d.ts +1 -1
  36. package/core/app.amd.js +1 -1
  37. package/core/app.amd.js.map +1 -1
  38. package/core/app.d.ts +2 -2
  39. package/core/app.js +17 -18
  40. package/core/plugins/i18n.d.ts +0 -10
  41. package/dialog/dialog.amd.js +1 -1
  42. package/dialog/dialog.amd.js.map +1 -1
  43. package/dialog/dialog.js +39 -40
  44. package/dialog/dialog.js.map +1 -1
  45. package/forms/forms.amd.js +1 -1
  46. package/forms/forms.js +1 -1
  47. package/formsExt/formsExt.amd.js +1 -1
  48. package/formsExt/formsExt.amd.js.map +1 -1
  49. package/formsExt/formsExt.js +91 -91
  50. package/formsExt/formsExt.js.map +1 -1
  51. package/icomoon/Topvisor icons.json +233 -118
  52. package/icomoon/demo.html +71 -1
  53. package/icomoon/fonts/Topvisor-2.eot +0 -0
  54. package/icomoon/fonts/Topvisor-2.svg +5 -0
  55. package/icomoon/fonts/Topvisor-2.ttf +0 -0
  56. package/icomoon/fonts/Topvisor-2.woff +0 -0
  57. package/icomoon/selection.json +1 -1
  58. package/icomoon/style.css +20 -5
  59. package/layout/layout.amd.js +1 -1
  60. package/layout/layout.js +1 -1
  61. package/package.json +31 -32
  62. package/popup/popup.amd.js +1 -1
  63. package/popup/popup.js +2 -2
  64. package/popup/worker.amd.js +1 -1
  65. package/popup/worker.js +2 -2
  66. package/project/project.amd.js +1 -1
  67. package/project/project.js +3 -3
  68. package/tabsView/tabsView.amd.js +1 -1
  69. package/tabsView/tabsView.js +16 -16
  70. package/utils/clipboard.amd.js +1 -1
  71. package/utils/clipboard.js +1 -1
  72. package/utils/date.amd.js +1 -1
  73. package/utils/date.js +1 -1
  74. package/utils/device.amd.js +1 -1
  75. package/utils/device.js +1 -1
  76. package/utils/lodash.amd.js +1 -1
  77. package/utils/lodash.js +1 -1
  78. package/utils/price.amd.js +1 -1
  79. package/utils/price.js +1 -1
  80. package/utils/string.amd.js +1 -1
  81. package/utils/string.js +1 -1
  82. package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-B55gllXV.amd.js.map +0 -1
  83. package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BkBYW0yR.es.js +0 -266
  84. package/.chunks/dialogs.vue_vue_type_script_setup_true_lang-BkBYW0yR.es.js.map +0 -1
  85. package/.chunks/utils-B75aamxF.amd.js +0 -2
  86. package/.chunks/utils-DfYj3r9i.amd.js +0 -2
  87. package/.chunks/utils-DfYj3r9i.amd.js.map +0 -1
  88. package/.chunks/utils-h5v4GPgp.es.js +0 -79
  89. package/.chunks/utils-h5v4GPgp.es.js.map +0 -1
@@ -1,12 +1,12 @@
1
- import { Core as q } from "../core/app.js";
2
- import { defineComponent as _, ref as V, computed as z, openBlock as p, createElementBlock as v, normalizeClass as C, toDisplayString as w, createCommentVNode as A, 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 ee, mergeProps as X, mergeModels as G, useModel as j, Fragment as N, renderList as D, withDirectives as Q, vModelRadio as te, resolveDirective as oe, unref as O, renderSlot as H } from "vue";
3
- import { x as le, _ as F, c as ae, s as se, a as ne, C as re } from "../.chunks/forms-DW_XLzg8.es.js";
4
- import { invertKeyboardLayout as ie } from "../utils/keyboard.js";
5
- import { TopPopup as ue, TopPopupWidgetInput as de, TopPopupListItem as Y } from "../popup/popup.js";
6
- import { _ as pe } from "../.chunks/menu.vue_vue_type_style_index_0_lang-CcspstQc.es.js";
7
- const x = ["../assets/formsExt.css"].map((n) => import.meta.resolve(n));
8
- q.insertCSSLinkToPage(x, !0);
9
- const ce = { class: "top-editArea_footer" }, me = /* @__PURE__ */ _({
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 = V(e.defaultValue), y = V(e.isFocused), d = z(() => f.value !== e.defaultValue), c = z(() => e.attachToKeyboard ? "" : e.forceShowCloseBtn && !d.value ? e.closeText : e.cancelText), r = (i) => {
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
- }, T = () => {
41
+ }, A = () => {
42
42
  e.attachToKeyboard && l("clickOnTitle");
43
43
  };
44
44
  return (i, o) => (p(), v("div", {
45
- class: C({
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) => T())
54
- }, w(i.title), 1)) : A("", !0),
53
+ onClick: o[0] || (o[0] = (g) => A())
54
+ }, w(i.title), 1)) : V("", !0),
55
55
  E("div", {
56
- class: C({
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(le, {
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", ce, [
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
- })) : A("", !0),
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"])) : A("", !0)
105
+ }, 8, ["icon"])) : V("", !0)
106
106
  ])
107
107
  ], 2)
108
108
  ], 2));
109
109
  }
110
- }), fe = { class: "top-editInput" }, ve = /* @__PURE__ */ _({
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 = V(e.modelValue);
120
- I(ee(e.modelValue), () => {
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", fe, [
127
- R(ae, X(d.input, {
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)) : A("", !0)
137
+ }, d.button, { onClick: y }), null, 16)) : V("", !0)
138
138
  ]));
139
139
  }
140
- }), ye = ["data-top-icon", "onClick"], he = {
140
+ }), he = ["data-top-icon", "onClick"], ge = {
141
141
  key: 0,
142
142
  class: "top-radioGroup_circle"
143
- }, ge = ["value", "disabled"], be = /* @__PURE__ */ _({
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 = V(null);
159
+ const e = j(n, "modelValue"), l = n, f = b(null);
160
160
  I(e, () => {
161
- var d, c, r, h, T;
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) ?? ""), (T = (h = f.value) == null ? void 0 : h.querySelector(".radioGroup_item-selected")) == null || T.scrollIntoView();
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: C({
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: C({
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", he)) : A("", !0),
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: C({
191
+ class: T({
192
192
  "top-unvisible": !0
193
193
  }),
194
194
  value: r.value,
195
195
  disabled: r.disabled
196
- }, null, 8, ge), [
197
- [te, e.value]
196
+ }, null, 8, be), [
197
+ [oe, e.value]
198
198
  ])
199
- ], 10, ye))), 256))
199
+ ], 10, he))), 256))
200
200
  ], 2));
201
201
  }
202
- }), Ve = (n, a, e) => {
203
- const l = V([]), f = V(!1);
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
- }, T = se(() => r(), 200);
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 ? T() : r()));
238
+ n && (o.length < a || o === y && l.value.length || (y = o, g ? A() : r()));
239
239
  }
240
240
  };
241
- }, Ae = { class: "top-selector2_itemMulti top-ellipsis" }, Te = /* @__PURE__ */ _({
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", Ae, [
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
- }), Ce = {
260
+ }), we = {
261
261
  key: 0,
262
262
  class: "top-selector2_activeItems"
263
- }, we = {
263
+ }, $e = {
264
264
  key: 1,
265
265
  class: "top-selector2_activeName top-ellipsis"
266
- }, $e = /* @__PURE__ */ _({
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 = V(""), f = {
289
+ const a = n, e = j(n, "modelValue"), l = b(""), f = {
290
290
  id: 0,
291
- name: ne().Common.All
292
- }, y = V(null), d = V(null), c = () => {
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 = Ve(a.apiRequest, a.minLength, a.useCache), h = z(() => {
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
- }), T = (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 = ie(t);
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 b = u.name.toLowerCase();
311
- (u.id === Number(t) || b.includes(t) || b.includes(s)) && (b === t || b === s ? m.unshift(u) : m.push(u));
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) => !T(u))), m;
316
- }), o = V(r.isLoading.value);
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) || T(t))
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, re.state.isMobile ? ((s = c()) == null || s.close(), l.value && (l.value = "", r.items.value = [])) : setTimeout(() => {
328
- var b, U, W, J;
329
- (b = c()) == null || b.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 = []));
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
- l.value && (l.value = "", r.items.value = []), JSON.stringify(t) !== JSON.stringify(e.value) && (e.value = { ...t }), (m = c()) == null || m.close();
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 = V(!1);
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 = oe("top-focus");
353
- return p(), k(O(ue), {
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: C({
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", Ce, [
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
- ])) : A("", !0),
390
- t.multiselect ? A("", !0) : (p(), v("span", we, w(Array.isArray(e.value) ? "" : e.value.name), 1)),
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
- })) : A("", !0)
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(de), {
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: C({
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((b) => g(u), ["stop"])
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
- })) : A("", !0)
441
+ })) : V("", !0)
442
442
  ]),
443
443
  _: 3
444
444
  }, 512);
445
445
  };
446
446
  }
447
- }), ke = ["data-top-icon"], Se = { class: "top-info_text" }, Ie = {
447
+ }), Se = ["data-top-icon"], Ie = { class: "top-info_text" }, Be = {
448
448
  key: 0,
449
449
  class: "top-info_value"
450
- }, Be = /* @__PURE__ */ _({
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: C({
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", Se, [
466
+ E("div", Ie, [
467
467
  H(a.$slots, "default")
468
468
  ]),
469
- a.$slots.additional ? (p(), v("span", Ie, [
469
+ a.$slots.additional ? (p(), v("span", Be, [
470
470
  H(a.$slots, "additional")
471
- ])) : A("", !0)
472
- ], 10, ke));
471
+ ])) : V("", !0)
472
+ ], 10, Se));
473
473
  }
474
- }), Oe = me, Ne = ve, ze = be, Ge = $e, De = pe, He = Be;
474
+ }), Ne = fe, ze = ye, Ge = Ve, De = ke, He = ce, Fe = Le;
475
475
  export {
476
- Oe as TopEditArea,
477
- Ne as TopEditInput,
478
- He as TopInfo,
479
- De as TopMenu,
480
- ze as TopRadioGroup,
481
- Ge as TopSelector2
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
@@ -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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"}