@topvisor/ui 1.0.18 → 1.0.20-focus-1

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 (232) hide show
  1. package/.chunks/{datepicker-EJRX31J1.es.js → datepicker-BbASdlXo.es.js} +2 -2
  2. package/.chunks/datepicker-BbASdlXo.es.js.map +1 -0
  3. package/.chunks/{datepicker-DKvr3NYw.amd.js → datepicker-CSpzAz1a.amd.js} +2 -2
  4. package/.chunks/datepicker-CSpzAz1a.amd.js.map +1 -0
  5. package/.chunks/forms-BciWy0wX.es.js +1992 -0
  6. package/.chunks/forms-BciWy0wX.es.js.map +1 -0
  7. package/.chunks/forms-Dh0QU6P9.amd.js +3 -0
  8. package/.chunks/forms-Dh0QU6P9.amd.js.map +1 -0
  9. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-3UaZvDrd.es.js → listItem.vue_vue_type_script_setup_true_lang-CZqS-tRD.es.js} +5 -5
  10. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CZqS-tRD.es.js.map +1 -0
  11. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-CnEbgJbu.amd.js → listItem.vue_vue_type_script_setup_true_lang-Del8bjSk.amd.js} +2 -2
  12. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-Del8bjSk.amd.js.map +1 -0
  13. package/.chunks/{menu.vue_vue_type_style_index_0_lang-DcFQyQgs.amd.js → menu.vue_vue_type_style_index_0_lang-B8-UPDGJ.amd.js} +2 -2
  14. package/.chunks/menu.vue_vue_type_style_index_0_lang-B8-UPDGJ.amd.js.map +1 -0
  15. package/.chunks/{menu.vue_vue_type_style_index_0_lang-C4q81rOQ.es.js → menu.vue_vue_type_style_index_0_lang-yNOWbXpd.es.js} +6 -6
  16. package/.chunks/menu.vue_vue_type_style_index_0_lang-yNOWbXpd.es.js.map +1 -0
  17. package/.chunks/{notice-CYeec0mu.amd.js → notice-DEcP2RCJ.amd.js} +2 -2
  18. package/.chunks/notice-DEcP2RCJ.amd.js.map +1 -0
  19. package/.chunks/{notice-CtXmQ8xM.es.js → notice-DQSQs6yC.es.js} +3 -3
  20. package/.chunks/notice-DQSQs6yC.es.js.map +1 -0
  21. package/.chunks/{popup-38TbXxcV.amd.js → popup-BdJJx21M.amd.js} +2 -2
  22. package/.chunks/popup-BdJJx21M.amd.js.map +1 -0
  23. package/.chunks/{popup-BzCXSDdA.es.js → popup-D-6PIelY.es.js} +7 -7
  24. package/.chunks/popup-D-6PIelY.es.js.map +1 -0
  25. package/.chunks/punycode.es6-C2yitnNb.amd.js.map +1 -1
  26. package/.chunks/punycode.es6-CNI-zL6U.es.js.map +1 -1
  27. package/.chunks/store-CX_6ZXhO.es.js.map +1 -1
  28. package/.chunks/store-esTid5oI.amd.js.map +1 -1
  29. package/.chunks/{utils-DXI6F7F9.es.js → utils-9b7woobj.es.js} +3 -3
  30. package/.chunks/utils-9b7woobj.es.js.map +1 -0
  31. package/.chunks/utils-BvHwHAyQ.es.js +225 -0
  32. package/.chunks/utils-BvHwHAyQ.es.js.map +1 -0
  33. package/.chunks/{utils-CI9JyH64.amd.js → utils-CPty_L5T.amd.js} +2 -2
  34. package/.chunks/utils-CPty_L5T.amd.js.map +1 -0
  35. package/.chunks/utils-DAfofcEq.amd.js +2 -0
  36. package/.chunks/utils-DAfofcEq.amd.js.map +1 -0
  37. package/README.md +82 -82
  38. package/assets/charts.css +1 -1
  39. package/assets/core.css +1 -1
  40. package/assets/forms.css +1 -1
  41. package/assets/formsExt.css +1 -1
  42. package/assets/layout.css +1 -1
  43. package/assets/notice.css +1 -1
  44. package/charts/charts.amd.js +1 -1
  45. package/charts/charts.amd.js.map +1 -1
  46. package/charts/charts.js +8 -8
  47. package/charts/charts.js.map +1 -1
  48. package/components/charts/miniChart/miniChart.vue.d.ts +5 -5
  49. package/components/charts/miniCharts/miniCharts.vue.d.ts +9 -6
  50. package/components/core/notice/item/item.vue.d.ts +1 -1
  51. package/components/dialog/dialog/dialog.vue.d.ts +3 -2
  52. package/components/dialog/dialog/dialogs/dialogs.vue.d.ts +1 -1
  53. package/components/dialog/dialog/page/page.vue.d.ts +2 -1
  54. package/components/dialog/dialog/page/types.d.ts +7 -0
  55. package/components/forms/avatar/avatar.vue.d.ts +1 -1
  56. package/components/forms/button/button.vue.d.ts +2 -1
  57. package/components/forms/checkbox/checkbox.d.ts +5 -3
  58. package/components/forms/checkbox/checkbox.vue.d.ts +7 -6
  59. package/components/forms/controlLabel/controlLabel.vue.d.ts +3 -2
  60. package/components/forms/hint/hint.vue.d.ts +1 -1
  61. package/components/forms/input/input.vue.d.ts +2 -1
  62. package/components/forms/inputDate/inputDate.vue.d.ts +3 -1
  63. package/components/forms/inputRange/inputRange.vue.d.ts +3 -2
  64. package/components/forms/loadbar/loadbar.vue.d.ts +1 -1
  65. package/components/forms/radio/radio.d.ts +1 -1
  66. package/components/forms/radio/radio.vue.d.ts +5 -4
  67. package/components/forms/select/select.vue.d.ts +5 -5
  68. package/components/forms/switcher/switcher.vue.d.ts +3 -2
  69. package/components/formsExt/editArea/editArea.vue.d.ts +1 -1
  70. package/components/formsExt/editInput/editInput.vue.d.ts +1 -1
  71. package/components/formsExt/formsExt.d.ts +2 -0
  72. package/components/formsExt/info/info.vue.d.ts +20 -0
  73. package/components/formsExt/info/types.d.ts +21 -0
  74. package/components/formsExt/menu/menu.vue.d.ts +7 -5
  75. package/components/formsExt/radioGroup/radioGroup.vue.d.ts +7 -5
  76. package/components/formsExt/selector2/itemMulti.vue.d.ts +1 -1
  77. package/components/formsExt/selector2/selector2.vue.d.ts +98 -8
  78. package/components/layout/islandRows/islandRows.vue.d.ts +3 -2
  79. package/components/layout/islandRows/islandRowsRow/islandRowsRow.vue.d.ts +3 -2
  80. package/components/layout/islandRows/islandRowsSubTitle/islandRowsSubTitle.vue.d.ts +3 -2
  81. package/components/layout/rows/rows.vue.d.ts +3 -2
  82. package/components/popup/alert/alert.vue.d.ts +2 -1
  83. package/components/popup/confirm/confirm.vue.d.ts +2 -1
  84. package/components/popup/lib/popup.d.ts +2 -3
  85. package/components/popup/lib/worker.d.ts +7 -7
  86. package/components/popup/popup/listItem.vue.d.ts +2 -1
  87. package/components/popup/popup/opener.vue.d.ts +2 -1
  88. package/components/popup/popup/popup.vue.d.ts +2 -1
  89. package/components/popup/popup/widgetInput.vue.d.ts +4 -4
  90. package/components/popup/prompt/prompt.vue.d.ts +2 -1
  91. package/components/project/selectorCompetitors/selectorCompetitors.vue.d.ts +5 -5
  92. package/components/project/selectorRegion/selectorRegion.vue.d.ts +7 -7
  93. package/components/project/selectorRegion/utils/consts.d.ts +0 -2
  94. package/components/project/tagSelector/popupListItem/tagPopupListItem.vue.d.ts +5 -3
  95. package/components/project/tagSelector/popupOpener/popupOpener.vue.d.ts +6 -5
  96. package/components/project/tagSelector/tagIcon/tagIcon.vue.d.ts +1 -1
  97. package/components/project/tagSelector/tagSelector.vue.d.ts +6 -6
  98. package/components/tabs/tabs/content.vue.d.ts +3 -2
  99. package/components/tabs/tabs/tab.vue.d.ts +2 -1
  100. package/components/tabs/tabs/tabs.vue.d.ts +3 -2
  101. package/components/tabsView/tabsView/menu.vue.d.ts +9 -6
  102. package/components/tabsView/tabsView/menuDelimeter.vue.d.ts +1 -1
  103. package/components/tabsView/tabsView/menuItem.vue.d.ts +2 -1
  104. package/components/tabsView/tabsView/menuTitle.vue.d.ts +2 -1
  105. package/components/tabsView/tabsView/store.d.ts +5 -5
  106. package/components/tabsView/tabsView/tabsView.vue.d.ts +9 -6
  107. package/core/app.amd.js +1 -1
  108. package/core/app.amd.js.map +1 -1
  109. package/core/app.d.ts +2 -2
  110. package/core/app.js +149 -128
  111. package/core/app.js.map +1 -1
  112. package/core/core/core.d.ts +2 -0
  113. package/core/core/preloaders.d.ts +19 -0
  114. package/core/directives/focus.d.ts +3 -1
  115. package/core/directives/scrollIntoView.d.ts +3 -0
  116. package/core/directives/scrollShadow.d.ts +2 -2
  117. package/core/plugins/i18n.d.ts +13 -13
  118. package/core/utils/scroll.d.ts +18 -0
  119. package/core/utils/searchers.d.ts +0 -2
  120. package/dialog/dialog.amd.js +1 -1
  121. package/dialog/dialog.amd.js.map +1 -1
  122. package/dialog/dialog.js +60 -55
  123. package/dialog/dialog.js.map +1 -1
  124. package/forms/forms.amd.js +1 -1
  125. package/forms/forms.js +1 -1
  126. package/forms/helpers.amd.js.map +1 -1
  127. package/forms/helpers.js.map +1 -1
  128. package/formsExt/formsExt.amd.js +1 -1
  129. package/formsExt/formsExt.amd.js.map +1 -1
  130. package/formsExt/formsExt.js +344 -301
  131. package/formsExt/formsExt.js.map +1 -1
  132. package/icomoon/Read Me.txt +7 -7
  133. package/icomoon/Topvisor icons.json +6259 -6144
  134. package/icomoon/demo-files/demo.css +158 -158
  135. package/icomoon/demo-files/demo.js +30 -30
  136. package/icomoon/demo.html +3558 -3488
  137. package/icomoon/fonts/Topvisor-2.eot +0 -0
  138. package/icomoon/fonts/Topvisor-2.svg +276 -271
  139. package/icomoon/fonts/Topvisor-2.ttf +0 -0
  140. package/icomoon/fonts/Topvisor-2.woff +0 -0
  141. package/icomoon/selection.json +1 -1
  142. package/icomoon/style.css +780 -765
  143. package/jquery-ui.min.css +5 -5
  144. package/layout/layout.amd.js +1 -1
  145. package/layout/layout.amd.js.map +1 -1
  146. package/layout/layout.js +27 -26
  147. package/layout/layout.js.map +1 -1
  148. package/package.json +33 -33
  149. package/popup/popup.amd.js +1 -1
  150. package/popup/popup.amd.js.map +1 -1
  151. package/popup/popup.js +8 -8
  152. package/popup/popup.js.map +1 -1
  153. package/popup/worker.amd.js +1 -1
  154. package/popup/worker.amd.js.map +1 -1
  155. package/popup/worker.js +3 -3
  156. package/popup/worker.js.map +1 -1
  157. package/project/project.amd.js +1 -1
  158. package/project/project.amd.js.map +1 -1
  159. package/project/project.js +22 -24
  160. package/project/project.js.map +1 -1
  161. package/require/css.amd.js +12 -12
  162. package/tabs/tabs.amd.js.map +1 -1
  163. package/tabs/tabs.js +5 -5
  164. package/tabs/tabs.js.map +1 -1
  165. package/tabsView/tabsView.amd.js +1 -1
  166. package/tabsView/tabsView.amd.js.map +1 -1
  167. package/tabsView/tabsView.js +5 -5
  168. package/tabsView/tabsView.js.map +1 -1
  169. package/utils/check.amd.js.map +1 -1
  170. package/utils/check.js.map +1 -1
  171. package/utils/clipboard.amd.js +1 -1
  172. package/utils/clipboard.amd.js.map +1 -1
  173. package/utils/clipboard.js +1 -1
  174. package/utils/clipboard.js.map +1 -1
  175. package/utils/date.amd.js +1 -1
  176. package/utils/date.js +1 -1
  177. package/utils/device.amd.js +1 -1
  178. package/utils/device.js +1 -1
  179. package/utils/dom.amd.js.map +1 -1
  180. package/utils/dom.js.map +1 -1
  181. package/utils/image.amd.js.map +1 -1
  182. package/utils/image.js.map +1 -1
  183. package/utils/keyboard.amd.js.map +1 -1
  184. package/utils/keyboard.js.map +1 -1
  185. package/utils/lodash.amd.js +1 -1
  186. package/utils/lodash.js +5 -5
  187. package/utils/number.amd.js.map +1 -1
  188. package/utils/number.js.map +1 -1
  189. package/utils/price.amd.js +1 -1
  190. package/utils/price.amd.js.map +1 -1
  191. package/utils/price.js +3 -3
  192. package/utils/price.js.map +1 -1
  193. package/utils/route.amd.js.map +1 -1
  194. package/utils/route.js.map +1 -1
  195. package/utils/scroll.amd.js +1 -1
  196. package/utils/scroll.amd.js.map +1 -1
  197. package/utils/scroll.js +39 -7
  198. package/utils/scroll.js.map +1 -1
  199. package/utils/searchers.amd.js +1 -1
  200. package/utils/searchers.amd.js.map +1 -1
  201. package/utils/searchers.js +2 -2
  202. package/utils/searchers.js.map +1 -1
  203. package/utils/string.amd.js +1 -1
  204. package/utils/string.amd.js.map +1 -1
  205. package/utils/string.js +1 -1
  206. package/utils/string.js.map +1 -1
  207. package/utils/system.amd.js.map +1 -1
  208. package/utils/system.js.map +1 -1
  209. package/utils/url.amd.js.map +1 -1
  210. package/utils/url.js.map +1 -1
  211. package/web-types.json +130 -102
  212. package/.chunks/datepicker-DKvr3NYw.amd.js.map +0 -1
  213. package/.chunks/datepicker-EJRX31J1.es.js.map +0 -1
  214. package/.chunks/forms-CmlWMEyk.amd.js +0 -3
  215. package/.chunks/forms-CmlWMEyk.amd.js.map +0 -1
  216. package/.chunks/forms-DDIlFXbF.es.js +0 -1944
  217. package/.chunks/forms-DDIlFXbF.es.js.map +0 -1
  218. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-3UaZvDrd.es.js.map +0 -1
  219. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-CnEbgJbu.amd.js.map +0 -1
  220. package/.chunks/menu.vue_vue_type_style_index_0_lang-C4q81rOQ.es.js.map +0 -1
  221. package/.chunks/menu.vue_vue_type_style_index_0_lang-DcFQyQgs.amd.js.map +0 -1
  222. package/.chunks/notice-CYeec0mu.amd.js.map +0 -1
  223. package/.chunks/notice-CtXmQ8xM.es.js.map +0 -1
  224. package/.chunks/popup-38TbXxcV.amd.js.map +0 -1
  225. package/.chunks/popup-BzCXSDdA.es.js.map +0 -1
  226. package/.chunks/utils-CFCfvsI8.es.js +0 -223
  227. package/.chunks/utils-CFCfvsI8.es.js.map +0 -1
  228. package/.chunks/utils-CI9JyH64.amd.js.map +0 -1
  229. package/.chunks/utils-DXI6F7F9.es.js.map +0 -1
  230. package/.chunks/utils-lvXB5hbW.amd.js +0 -2
  231. package/.chunks/utils-lvXB5hbW.amd.js.map +0 -1
  232. package/components/formsExt/info/info.d.ts +0 -20
package/dialog/dialog.js CHANGED
@@ -1,7 +1,7 @@
1
- import { defineComponent as v, provide as w, onMounted as b, getCurrentInstance as C, watch as A, openBlock as s, createElementBlock as l, unref as n, normalizeClass as u, normalizeStyle as c, createElementVNode as i, renderSlot as p, computed as D, resolveDirective as _, createBlock as m, Teleport as h, withDirectives as k, createCommentVNode as g, ref as T, onUpdated as $, KeepAlive as P, resolveDynamicComponent as N, mergeProps as B } from "vue";
2
- import { g as S, u as y } from "../.chunks/utils-DXI6F7F9.es.js";
3
- import { C as E } from "../.chunks/forms-DDIlFXbF.es.js";
4
- const L = ["id", "data-view-page-active", "data-modal", "data-position"], J = /* @__PURE__ */ v({
1
+ import { defineComponent as v, provide as w, onMounted as b, getCurrentInstance as C, watch as A, createElementBlock as i, openBlock as s, unref as r, normalizeStyle as c, normalizeClass as u, createElementVNode as l, renderSlot as p, computed as D, resolveDirective as k, createCommentVNode as g, createBlock as m, Teleport as h, withDirectives as T, ref as $, onUpdated as B, KeepAlive as P, resolveDynamicComponent as _, mergeProps as N } from "vue";
2
+ import { g as W, u as y } from "../.chunks/utils-9b7woobj.es.js";
3
+ import { C as S } from "../.chunks/forms-BciWy0wX.es.js";
4
+ const E = ["id", "data-view-page-active", "data-modal", "data-position"], H = /* @__PURE__ */ v({
5
5
  __name: "dialog",
6
6
  props: {
7
7
  id: {},
@@ -15,7 +15,7 @@ const L = ["id", "data-view-page-active", "data-modal", "data-position"], J = /*
15
15
  },
16
16
  emits: ["open", "close"],
17
17
  setup(d) {
18
- const o = S(d.id);
18
+ const o = W(d.id);
19
19
  if (!o)
20
20
  throw new Error("TopDialog cannot be used in a template, use useTopDialog() / useAsyncTopDialog()");
21
21
  return w("dialogWorker", o), b(() => {
@@ -31,107 +31,110 @@ const L = ["id", "data-view-page-active", "data-modal", "data-position"], J = /*
31
31
  }, {
32
32
  flush: "post",
33
33
  once: !0
34
- }), (a, e) => (s(), l("div", {
35
- id: n(o).idAttr,
34
+ }), (a, e) => (s(), i("div", {
35
+ id: r(o).idAttr,
36
36
  class: u(["top-dialog", a.classes]),
37
37
  style: c({
38
38
  "--top-dialog-width": a.width,
39
39
  "--top-dialog-height": a.height
40
40
  }),
41
41
  tabindex: "-1",
42
- "data-view-page-active": n(o).pageActive.value,
42
+ "data-view-page-active": r(o).pageActive.value,
43
43
  "data-modal": a.modal,
44
44
  "data-position": a.position
45
45
  }, [
46
- e[0] || (e[0] = i("div", { class: "modal-layer modal-layer-header" }, null, -1)),
47
- i("div", {
46
+ e[0] || (e[0] = l("div", { class: "modal-layer modal-layer-header" }, null, -1)),
47
+ l("div", {
48
48
  class: "modal-layer modal-layer-body",
49
49
  style: c({ "min-height": a.height + "px" })
50
50
  }, null, 4),
51
51
  p(a.$slots, "default")
52
- ], 14, L));
52
+ ], 14, E));
53
53
  }
54
- }), W = {
54
+ }), L = {
55
55
  key: 0,
56
56
  style: { display: "none" }
57
- }, M = ["data-order", "data-view-page"], R = { class: "modal-header" }, q = { class: "top-title" }, z = { class: "buttons" }, I = ["title"], V = ["title"], K = ["data-order", "data-view-page"], O = { class: "modal-body" }, U = {
58
- key: 0,
59
- class: "modal-footer"
60
- }, Q = /* @__PURE__ */ v({
57
+ }, F = ["data-order", "data-view-page"], M = { class: "modal-header" }, R = { class: "top-title" }, q = { class: "buttons" }, z = ["title"], I = ["title"], V = ["data-order", "data-view-page"], K = { class: "modal-body" }, J = /* @__PURE__ */ v({
61
58
  __name: "page",
62
59
  props: {
63
60
  isLoading: { type: Boolean },
64
61
  name: {},
65
62
  order: { default: 0 },
66
- prevName: {}
63
+ prevName: {},
64
+ footerFullWith: { type: Boolean }
67
65
  },
68
66
  setup(d) {
69
- const r = d, o = y(), a = D(() => {
67
+ const n = d, o = y(), a = D(() => {
70
68
  var e;
71
69
  return {
72
- active: ((e = o.pageActive) == null ? void 0 : e.value) === r.name,
73
- "i-load-data": r.isLoading || o.isLoadingPage.value
70
+ active: ((e = o.pageActive) == null ? void 0 : e.value) === n.name,
71
+ "i-load-data": n.isLoading || o.isLoadingPage.value
74
72
  };
75
73
  });
76
74
  return (e, t) => {
77
- const f = _("top-scroll-shadow");
78
- return n(o).isReady.value ? (s(), l("div", W, [
75
+ const f = k("top-scroll-shadow");
76
+ return r(o).isReady.value ? (s(), i("div", L, [
79
77
  (s(), m(h, {
80
- to: "#" + n(o).idAttr + " .modal-layer-header",
81
- disabled: !n(o).needShowPage(e.name)
78
+ to: "#" + r(o).idAttr + " .modal-layer-header",
79
+ disabled: !r(o).needShowPage(e.name)
82
80
  }, [
83
- i("div", {
81
+ l("div", {
84
82
  "data-order": e.order,
85
83
  "data-view-page": e.name,
86
84
  class: u(a.value)
87
85
  }, [
88
- i("div", R, [
89
- i("div", q, [
86
+ l("div", M, [
87
+ l("div", R, [
90
88
  p(e.$slots, "header")
91
89
  ]),
92
- i("div", z, [
90
+ l("div", q, [
93
91
  p(e.$slots, "headerButtons")
94
92
  ]),
95
- n(E).state.isMobile && e.prevName ? (s(), l("div", {
93
+ r(S).state.isMobile && e.prevName ? (s(), i("div", {
96
94
  key: 0,
97
95
  class: "close",
98
96
  title: e.$i18n.Common.Back,
99
97
  "data-top-icon": "",
100
- onClick: t[0] || (t[0] = (j) => n(o).open(e.prevName))
101
- }, null, 8, I)) : (s(), l("div", {
98
+ onClick: t[0] || (t[0] = (O) => r(o).open(e.prevName))
99
+ }, null, 8, z)) : (s(), i("div", {
102
100
  key: 1,
103
101
  class: "close",
104
102
  title: e.$i18n.Common.Close,
105
103
  "data-top-icon": "",
106
104
  "data-action": "top-dialog-close"
107
- }, null, 8, V))
105
+ }, null, 8, I))
108
106
  ])
109
- ], 10, M)
107
+ ], 10, F)
110
108
  ], 8, ["to", "disabled"])),
111
109
  (s(), m(h, {
112
- to: "#" + n(o).idAttr + " .modal-layer-body",
113
- disabled: !n(o).needShowPage(e.name)
110
+ to: "#" + r(o).idAttr + " .modal-layer-body",
111
+ disabled: !r(o).needShowPage(e.name)
114
112
  }, [
115
- i("div", {
113
+ l("div", {
116
114
  "data-order": e.order,
117
115
  "data-view-page": e.name,
118
116
  class: u(["has_scroll_container", a.value]),
119
117
  style: c({ "--top-dialog-footer-height": e.$slots.footer ? void 0 : "0px" })
120
118
  }, [
121
- k((s(), l("div", O, [
119
+ T((s(), i("div", K, [
122
120
  p(e.$slots, "body")
123
121
  ])), [
124
122
  [f]
125
123
  ]),
126
- e.$slots.footer ? (s(), l("div", U, [
124
+ e.$slots.footer ? (s(), i("div", {
125
+ key: 0,
126
+ class: u(["modal-footer", {
127
+ "modal-footer-fullWith": e.footerFullWith
128
+ }])
129
+ }, [
127
130
  p(e.$slots, "footer")
128
- ])) : g("", !0)
129
- ], 14, K)
131
+ ], 2)) : g("", !0)
132
+ ], 14, V)
130
133
  ], 8, ["to", "disabled"]))
131
134
  ])) : g("", !0);
132
135
  };
133
136
  }
134
- }), X = {
137
+ }), Q = {
135
138
  name: {
136
139
  type: String,
137
140
  required: !0
@@ -140,8 +143,9 @@ const L = ["id", "data-view-page-active", "data-modal", "data-position"], J = /*
140
143
  type: Number,
141
144
  required: !0
142
145
  },
143
- prevName: String
144
- }, Y = /* @__PURE__ */ v({
146
+ prevName: String,
147
+ footerFullWith: Boolean
148
+ }, X = /* @__PURE__ */ v({
145
149
  __name: "pageComponent",
146
150
  props: {
147
151
  component: {},
@@ -149,28 +153,29 @@ const L = ["id", "data-view-page-active", "data-modal", "data-position"], J = /*
149
153
  props: {},
150
154
  name: {},
151
155
  order: {},
152
- prevName: {}
156
+ prevName: {},
157
+ footerFullWith: { type: Boolean }
153
158
  },
154
159
  setup(d) {
155
- const r = d, o = y(), a = (e, t) => {
160
+ const n = d, o = y(), a = (e, t) => {
156
161
  if (!t.value) {
157
162
  if (e.name !== "AsyncComponentWrapper") {
158
163
  t.value = !0;
159
164
  return;
160
165
  }
161
- o.needShowPage(r.name) && (o.isLoadingPage.value = !0, e.__asyncResolved && (t.value = !0, o.isLoadingPage.value = !1));
166
+ o.needShowPage(n.name) && (o.isLoadingPage.value = !0, e.__asyncResolved && (t.value = !0, o.isLoadingPage.value = !1));
162
167
  }
163
168
  };
164
- if (r.component.name === "AsyncComponentWrapper") {
165
- const e = T(!1);
166
- $(() => {
167
- a(r.component, e);
169
+ if (n.component.name === "AsyncComponentWrapper") {
170
+ const e = $(!1);
171
+ B(() => {
172
+ a(n.component, e);
168
173
  });
169
174
  }
170
175
  return (e, t) => (s(), m(P, {
171
176
  include: e.keepAlive ? "" : "none"
172
177
  }, [
173
- n(o).needShowPage(e.name) ? (s(), m(N(e.component), B({ key: 0 }, r, {
178
+ r(o).needShowPage(e.name) ? (s(), m(_(e.component), N({ key: 0 }, n, {
174
179
  name: e.name,
175
180
  order: e.order,
176
181
  prevName: e.prevName
@@ -179,10 +184,10 @@ const L = ["id", "data-view-page-active", "data-modal", "data-position"], J = /*
179
184
  }
180
185
  });
181
186
  export {
182
- J as TopDialog,
183
- Q as TopDialogPage,
184
- Y as TopDialogPageComponent,
185
- X as propsPageCommon,
187
+ H as TopDialog,
188
+ J as TopDialogPage,
189
+ X as TopDialogPageComponent,
190
+ Q as propsPageCommon,
186
191
  y as useTopDialogSelf
187
192
  };
188
193
  //# sourceMappingURL=dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sources":["../../src/components/dialog/dialog/dialog.vue","../../src/components/dialog/dialog/page/page.vue","../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ComponentInternalInstance } from 'vue';\nimport { getCurrentInstance, onMounted, provide, watch } from 'vue';\nimport { getDialogWorker } from './dialogs/dialogs.vue';\nimport type { Emits, Props, Slots } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\twidth: '600px',\n\theight: 'auto',\n\tmodal: true,\n\thistoryType: 'push',\n});\n\ndefineEmits<Emits>();\n\ndefineSlots<Slots>();\n\nconst dialog = getDialogWorker(props.id);\nif (!dialog) {\n\tthrow new Error('TopDialog cannot be used in a template, use useTopDialog() / useAsyncTopDialog()');\n}\n\n/**\n * Для useTopDialogSelf()\n */\nprovide('dialogWorker', dialog);\n\n/**\n * Инициализация начального состояния TopDialogHandle\n */\nonMounted(() => {\n\tconst topDialogBaseComponent = getCurrentInstance() as ComponentInternalInstance;\n\tconst topDialogComponent = topDialogBaseComponent.parent;\n\n\tif (topDialogComponent?.parent?.type.name !== 'DialogWrapper') {\n\t\tthrow new Error('TopDialog cannot be used in a template, use useTopDialog()');\n\t}\n\n\tif (Array.isArray(topDialogComponent.subTree.children) && topDialogComponent.subTree.children.length !== 1) {\n\t\tthrow new Error('TopDialog can has only one root element');\n\t}\n\n\tdialog.onMounted(topDialogComponent, topDialogBaseComponent);\n});\n\nwatch(dialog.isOpened, () => {\n\tdialog.isReady.value = true;\n}, {\n\tflush: 'post',\n\tonce: true,\n});\n</script>\n\n<template>\n\t<div\n\t\t:id=\"dialog.idAttr\"\n\t\tclass=\"top-dialog\"\n\t\t:class=\"classes\"\n\t\t:style=\"{\n\t\t\t\t'--top-dialog-width': width,\n\t\t\t\t'--top-dialog-height': height,\n\t\t\t}\"\n\t\ttabindex=\"-1\"\n\t\t:data-view-page-active=\"dialog.pageActive.value\"\n\t\t:data-modal=\"modal\"\n\t\t:data-position=\"position\"\n\t>\n\t\t<div class=\"modal-layer modal-layer-header\"></div>\n\n\t\t<div class=\"modal-layer modal-layer-body\" :style=\"{'min-height': height + 'px'}\"></div>\n\n\t\t<slot name=\"default\"></slot>\n\t</div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport Core from '@/core/core/core';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props, Slots } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\torder: 0,\n});\n\ndefineSlots<Slots>();\n\nconst dialog = useTopDialogSelf();\n\nconst classes = computed(() => {\n\treturn {\n\t\tactive: dialog.pageActive?.value === props.name,\n\t\t'i-load-data': props.isLoading || dialog.isLoadingPage.value,\n\t};\n});\n</script>\n\n<template>\n\t<div\n\t\tstyle=\"display: none\"\n\t\tv-if=\"dialog.isReady.value\"\n\t>\n\t\t<Teleport :to=\"'#' + dialog.idAttr + ' .modal-layer-header'\" :disabled=\"!dialog.needShowPage(name)\">\n\t\t\t<div\n\t\t\t\t:data-order=\"order\"\n\t\t\t\t:data-view-page=\"name\"\n\t\t\t\t:class=\"classes\"\n\t\t\t>\n\t\t\t\t<div class=\"modal-header\">\n\t\t\t\t\t<div class=\"top-title\">\n\t\t\t\t\t\t<slot name=\"header\"></slot>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<slot name=\"headerButtons\"></slot>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"Core.state.isMobile && prevName\"\n\t\t\t\t\t\tclass=\"close\"\n\t\t\t\t\t\t:title=\"$i18n.Common.Back\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\t@click=\"dialog.open(prevName)\"\n\t\t\t\t\t></div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tclass=\"close\"\n\t\t\t\t\t\t:title=\"$i18n.Common.Close\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tdata-action=\"top-dialog-close\"\n\t\t\t\t\t></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Teleport>\n\n\t\t<Teleport :to=\"'#' + dialog.idAttr + ' .modal-layer-body'\" :disabled=\"!dialog.needShowPage(name)\">\n\t\t\t<div\n\t\t\t\t:data-order=\"order\"\n\t\t\t\t:data-view-page=\"name\"\n\t\t\t\tclass=\"has_scroll_container\"\n\t\t\t\t:class=\"classes\"\n\t\t\t\t:style=\"{'--top-dialog-footer-height': $slots.footer ? undefined : '0px'}\"\n\t\t\t>\n\t\t\t\t<div class=\"modal-body\" v-top-scroll-shadow>\n\t\t\t\t\t<slot name=\"body\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"modal-footer\" v-if=\"$slots.footer\">\n\t\t\t\t\t<slot name=\"footer\"></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Teleport>\n\t</div>\n</template>\n","export interface Props extends PropsCommon {\n\t/**\n\t * Статус загрузки страницы диалогового окна\n\t *\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\n\t */\n\tisLoading?: boolean;\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n */\nexport interface PropsCommon {\n\t/**\n\t * Имя страницы для диалогового окна\n\t *\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\n\t */\n\tname: string,\n\n\t/**\n\t * Порядкой номер страницы в диалоговом окне\n\t *\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\n\t */\n\torder: number,\n\n\t/**\n\t * Имя предыдущей страницы\n\t *\n\t * Для кнопки Назад / Закрыть в мобильной версии\n\t */\n\tprevName?: string,\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n *\n * Для не SFC компонентов\n */\nexport const propsPageCommon = {\n\tname: {\n\t\ttype: String,\n\t\trequired: true,\n\t},\n\n\torder: {\n\t\ttype: Number,\n\t\trequired: true,\n\t},\n\n\tprevName: String,\n};\n\nexport interface Slots {\n\t/**\n\t * Шапка страницы\n\t */\n\theader(props: {}): any;\n\n\t/**\n\t * Кнопки для шапки страницы\n\t */\n\theaderButtons(props: {}): any;\n\n\t/**\n\t * Контент страницы\n\t */\n\tbody(props: {}): any;\n\n\t/**\n\t * Футер страницы\n\t */\n\tfooter(props: {}): any;\n}\n","<script setup lang=\"ts\">\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tkeepAlive: true,\n});\n\nconst dialog = useTopDialogSelf();\n\n/**\n * Статус загрузи асинхронного компонента страницы диалогового окна\n */\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\n\tif (isLoaded.value) return;\n\n\tif (component.name !== 'AsyncComponentWrapper') {\n\t\tisLoaded.value = true;\n\n\t\treturn;\n\t}\n\n\tif (!dialog.needShowPage(props.name as string)) return;\n\n\tdialog.isLoadingPage.value = true;\n\n\t// @ts-ignore\n\tif (component.__asyncResolved) {\n\t\tisLoaded.value = true;\n\n\t\tdialog.isLoadingPage.value = false;\n\t}\n};\n\nif (props.component.name === 'AsyncComponentWrapper') {\n\tconst isLoaded = ref(false);\n\n\tonUpdated(() => {\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\n\t});\n}\n</script>\n\n<template>\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\n\t\t<Component\n\t\t\t:is=\"component\"\n\t\t\tv-if=\"dialog.needShowPage(name)\"\n\t\t\t:=\"props\"\n\t\t\t:name=\"name\"\n\t\t\t:order=\"order\"\n\t\t\t:prevName=\"prevName\"\n\t\t/>\n\t</KeepAlive>\n</template>\n"],"names":["dialog","getDialogWorker","__props","provide","onMounted","topDialogBaseComponent","getCurrentInstance","topDialogComponent","_a","watch","props","useTopDialogSelf","classes","computed","propsPageCommon","updateIsLoadingAsyncPage","component","isLoaded","ref","onUpdated"],"mappings":";;;;;;;;;;;;;;;;;AAiBM,UAAAA,IAASC,EAXDC,EAWuB,EAAE;AACvC,QAAI,CAACF;AACE,YAAA,IAAI,MAAM,kFAAkF;AAMnG,WAAAG,EAAQ,gBAAgBH,CAAM,GAK9BI,EAAU,MAAM;;AACf,YAAMC,IAAyBC,KACzBC,IAAqBF,EAAuB;AAElD,YAAIG,IAAAD,KAAA,gBAAAA,EAAoB,WAApB,gBAAAC,EAA4B,KAAK,UAAS;AACvC,cAAA,IAAI,MAAM,4DAA4D;AAGzE,UAAA,MAAM,QAAQD,EAAmB,QAAQ,QAAQ,KAAKA,EAAmB,QAAQ,SAAS,WAAW;AAClG,cAAA,IAAI,MAAM,yCAAyC;AAGnD,MAAAP,EAAA,UAAUO,GAAoBF,CAAsB;AAAA,IAAA,CAC3D,GAEKI,EAAAT,EAAO,UAAU,MAAM;AAC5B,MAAAA,EAAO,QAAQ,QAAQ;AAAA,IAAA,GACrB;AAAA,MACF,OAAO;AAAA,MACP,MAAM;AAAA,IAAA,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5CD,UAAMU,IAAQR,GAMRF,IAASW,KAETC,IAAUC,EAAS,MAAM;;AACvB,aAAA;AAAA,QACN,UAAQL,IAAAR,EAAO,eAAP,gBAAAQ,EAAmB,WAAUE,EAAM;AAAA,QAC3C,eAAeA,EAAM,aAAaV,EAAO,cAAc;AAAA,MAAA;AAAA,IACxD,CACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ICqBYc,IAAkB;AAAA,EAC9B,MAAM;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,OAAO;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,UAAU;AACX;;;;;;;;;;;AC/CA,UAAMJ,IAAQR,GAIRF,IAASW,KAKTI,IAA2B,CAACC,GAAsBC,MAAkB;AACzE,UAAI,CAAAA,EAAS,OAET;AAAA,YAAAD,EAAU,SAAS,yBAAyB;AAC/C,UAAAC,EAAS,QAAQ;AAEjB;AAAA,QACD;AAEA,QAAKjB,EAAO,aAAaU,EAAM,IAAc,MAE7CV,EAAO,cAAc,QAAQ,IAGzBgB,EAAU,oBACbC,EAAS,QAAQ,IAEjBjB,EAAO,cAAc,QAAQ;AAAA;AAAA,IAC9B;AAGG,QAAAU,EAAM,UAAU,SAAS,yBAAyB;AAC/C,YAAAO,IAAWC,EAAI,EAAK;AAE1B,MAAAC,EAAU,MAAM;AACU,QAAAJ,EAAAL,EAAM,WAAWO,CAAQ;AAAA,MAAA,CAClD;AAAA,IACF;;;;;;;;;;;;"}
1
+ {"version":3,"file":"dialog.js","sources":["../../src/components/dialog/dialog/dialog.vue","../../src/components/dialog/dialog/page/page.vue","../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { ComponentInternalInstance } from 'vue';\r\nimport { getCurrentInstance, onMounted, provide, watch } from 'vue';\r\nimport { getDialogWorker } from './dialogs/dialogs.vue';\r\nimport type { Emits, Props, Slots } from './types';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\twidth: '600px',\r\n\theight: 'auto',\r\n\tmodal: true,\r\n\thistoryType: 'push',\r\n});\r\n\r\ndefineEmits<Emits>();\r\n\r\ndefineSlots<Slots>();\r\n\r\nconst dialog = getDialogWorker(props.id);\r\nif (!dialog) {\r\n\tthrow new Error('TopDialog cannot be used in a template, use useTopDialog() / useAsyncTopDialog()');\r\n}\r\n\r\n/**\r\n * Для useTopDialogSelf()\r\n */\r\nprovide('dialogWorker', dialog);\r\n\r\n/**\r\n * Инициализация начального состояния TopDialogHandle\r\n */\r\nonMounted(() => {\r\n\tconst topDialogBaseComponent = getCurrentInstance() as ComponentInternalInstance;\r\n\tconst topDialogComponent = topDialogBaseComponent.parent;\r\n\r\n\tif (topDialogComponent?.parent?.type.name !== 'DialogWrapper') {\r\n\t\tthrow new Error('TopDialog cannot be used in a template, use useTopDialog()');\r\n\t}\r\n\r\n\tif (Array.isArray(topDialogComponent.subTree.children) && topDialogComponent.subTree.children.length !== 1) {\r\n\t\tthrow new Error('TopDialog can has only one root element');\r\n\t}\r\n\r\n\tdialog.onMounted(topDialogComponent, topDialogBaseComponent);\r\n});\r\n\r\nwatch(dialog.isOpened, () => {\r\n\tdialog.isReady.value = true;\r\n}, {\r\n\tflush: 'post',\r\n\tonce: true,\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\t:id=\"dialog.idAttr\"\r\n\t\tclass=\"top-dialog\"\r\n\t\t:class=\"classes\"\r\n\t\t:style=\"{\r\n\t\t\t\t'--top-dialog-width': width,\r\n\t\t\t\t'--top-dialog-height': height,\r\n\t\t\t}\"\r\n\t\ttabindex=\"-1\"\r\n\t\t:data-view-page-active=\"dialog.pageActive.value\"\r\n\t\t:data-modal=\"modal\"\r\n\t\t:data-position=\"position\"\r\n\t>\r\n\t\t<div class=\"modal-layer modal-layer-header\"></div>\r\n\r\n\t\t<div class=\"modal-layer modal-layer-body\" :style=\"{'min-height': height + 'px'}\"></div>\r\n\r\n\t\t<slot name=\"default\"></slot>\r\n\t</div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\r\nimport type { Props, Slots } from './types';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\torder: 0,\r\n});\r\n\r\ndefineSlots<Slots>();\r\n\r\nconst dialog = useTopDialogSelf();\r\n\r\nconst classes = computed(() => {\r\n\treturn {\r\n\t\tactive: dialog.pageActive?.value === props.name,\r\n\t\t'i-load-data': props.isLoading || dialog.isLoadingPage.value,\r\n\t};\r\n});\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tstyle=\"display: none\"\r\n\t\tv-if=\"dialog.isReady.value\"\r\n\t>\r\n\t\t<Teleport :to=\"'#' + dialog.idAttr + ' .modal-layer-header'\" :disabled=\"!dialog.needShowPage(name)\">\r\n\t\t\t<div\r\n\t\t\t\t:data-order=\"order\"\r\n\t\t\t\t:data-view-page=\"name\"\r\n\t\t\t\t:class=\"classes\"\r\n\t\t\t>\r\n\t\t\t\t<div class=\"modal-header\">\r\n\t\t\t\t\t<div class=\"top-title\">\r\n\t\t\t\t\t\t<slot name=\"header\"></slot>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class=\"buttons\">\r\n\t\t\t\t\t\t<slot name=\"headerButtons\"></slot>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tv-if=\"Core.state.isMobile && prevName\"\r\n\t\t\t\t\t\tclass=\"close\"\r\n\t\t\t\t\t\t:title=\"$i18n.Common.Back\"\r\n\t\t\t\t\t\tdata-top-icon=\"\"\r\n\t\t\t\t\t\t@click=\"dialog.open(prevName)\"\r\n\t\t\t\t\t></div>\r\n\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tv-else\r\n\t\t\t\t\t\tclass=\"close\"\r\n\t\t\t\t\t\t:title=\"$i18n.Common.Close\"\r\n\t\t\t\t\t\tdata-top-icon=\"\"\r\n\t\t\t\t\t\tdata-action=\"top-dialog-close\"\r\n\t\t\t\t\t></div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</Teleport>\r\n\r\n\t\t<Teleport :to=\"'#' + dialog.idAttr + ' .modal-layer-body'\" :disabled=\"!dialog.needShowPage(name)\">\r\n\t\t\t<div\r\n\t\t\t\t:data-order=\"order\"\r\n\t\t\t\t:data-view-page=\"name\"\r\n\t\t\t\tclass=\"has_scroll_container\"\r\n\t\t\t\t:class=\"classes\"\r\n\t\t\t\t:style=\"{'--top-dialog-footer-height': $slots.footer ? undefined : '0px'}\"\r\n\t\t\t>\r\n\t\t\t\t<div class=\"modal-body\" v-top-scroll-shadow>\r\n\t\t\t\t\t<slot name=\"body\"></slot>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass=\"modal-footer\"\r\n\t\t\t\t\t:class=\"{\r\n\t\t\t\t\t\t'modal-footer-fullWith': footerFullWith\r\n\t\t\t\t\t}\"\r\n\t\t\t\t\tv-if=\"$slots.footer\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<slot name=\"footer\"></slot>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</Teleport>\r\n\t</div>\r\n</template>\r\n","export interface Props extends PropsCommon {\r\n\t/**\r\n\t * Статус загрузки страницы диалогового окна\r\n\t *\r\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\r\n\t */\r\n\tisLoading?: boolean;\r\n}\r\n\r\n/**\r\n * Общие props для компонентов реализуюущих TopDialogPage\r\n */\r\nexport interface PropsCommon {\r\n\t/**\r\n\t * Имя страницы для диалогового окна\r\n\t *\r\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\r\n\t */\r\n\tname: string,\r\n\r\n\t/**\r\n\t * Порядкой номер страницы в диалоговом окне\r\n\t *\r\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\r\n\t */\r\n\torder: number,\r\n\r\n\t/**\r\n\t * Имя предыдущей страницы\r\n\t *\r\n\t * Для кнопки Назад / Закрыть в мобильной версии\r\n\t */\r\n\tprevName?: string,\r\n\r\n\t/**\r\n\t * Стиль отображения футера, при котороым элементы растягиваются на всю ширину\r\n\t *\r\n\t * Разрешены переносы\r\n\t */\r\n\tfooterFullWith?: boolean,\r\n}\r\n\r\n/**\r\n * Общие props для компонентов реализуюущих TopDialogPage\r\n *\r\n * Для не SFC компонентов\r\n */\r\nexport const propsPageCommon = {\r\n\tname: {\r\n\t\ttype: String,\r\n\t\trequired: true,\r\n\t},\r\n\r\n\torder: {\r\n\t\ttype: Number,\r\n\t\trequired: true,\r\n\t},\r\n\r\n\tprevName: String,\r\n\r\n\tfooterFullWith: Boolean,\r\n};\r\n\r\nexport interface Slots {\r\n\t/**\r\n\t * Шапка страницы\r\n\t */\r\n\theader(props: {}): any;\r\n\r\n\t/**\r\n\t * Кнопки для шапки страницы\r\n\t */\r\n\theaderButtons(props: {}): any;\r\n\r\n\t/**\r\n\t * Контент страницы\r\n\t */\r\n\tbody(props: {}): any;\r\n\r\n\t/**\r\n\t * Футер страницы\r\n\t */\r\n\tfooter(props: {}): any;\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\r\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\r\nimport type { Props } from './types';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tkeepAlive: true,\r\n});\r\n\r\nconst dialog = useTopDialogSelf();\r\n\r\n/**\r\n * Статус загрузи асинхронного компонента страницы диалогового окна\r\n */\r\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\r\n\tif (isLoaded.value) return;\r\n\r\n\tif (component.name !== 'AsyncComponentWrapper') {\r\n\t\tisLoaded.value = true;\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!dialog.needShowPage(props.name as string)) return;\r\n\r\n\tdialog.isLoadingPage.value = true;\r\n\r\n\t// @ts-ignore\r\n\tif (component.__asyncResolved) {\r\n\t\tisLoaded.value = true;\r\n\r\n\t\tdialog.isLoadingPage.value = false;\r\n\t}\r\n};\r\n\r\nif (props.component.name === 'AsyncComponentWrapper') {\r\n\tconst isLoaded = ref(false);\r\n\r\n\tonUpdated(() => {\r\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\r\n\t});\r\n}\r\n</script>\r\n\r\n<template>\r\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\r\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\r\n\t\t<Component\r\n\t\t\t:is=\"component\"\r\n\t\t\tv-if=\"dialog.needShowPage(name)\"\r\n\t\t\t:=\"props\"\r\n\t\t\t:name=\"name\"\r\n\t\t\t:order=\"order\"\r\n\t\t\t:prevName=\"prevName\"\r\n\t\t/>\r\n\t</KeepAlive>\r\n</template>\r\n"],"names":["dialog","getDialogWorker","__props","provide","onMounted","topDialogBaseComponent","getCurrentInstance","topDialogComponent","_a","watch","props","useTopDialogSelf","classes","computed","propsPageCommon","updateIsLoadingAsyncPage","component","isLoaded","ref","onUpdated"],"mappings":";;;;;;;;;;;;;;;;;AAiBM,UAAAA,IAASC,EAXDC,EAWuB,EAAE;AACvC,QAAI,CAACF;AACE,YAAA,IAAI,MAAM,kFAAkF;AAMnG,WAAAG,EAAQ,gBAAgBH,CAAM,GAK9BI,EAAU,MAAM;;AACf,YAAMC,IAAyBC,EAAmB,GAC5CC,IAAqBF,EAAuB;AAElD,YAAIG,IAAAD,KAAA,gBAAAA,EAAoB,WAApB,gBAAAC,EAA4B,KAAK,UAAS;AACvC,cAAA,IAAI,MAAM,4DAA4D;AAGzE,UAAA,MAAM,QAAQD,EAAmB,QAAQ,QAAQ,KAAKA,EAAmB,QAAQ,SAAS,WAAW;AAClG,cAAA,IAAI,MAAM,yCAAyC;AAGnD,MAAAP,EAAA,UAAUO,GAAoBF,CAAsB;AAAA,IAAA,CAC3D,GAEKI,EAAAT,EAAO,UAAU,MAAM;AAC5B,MAAAA,EAAO,QAAQ,QAAQ;AAAA,IAAA,GACrB;AAAA,MACF,OAAO;AAAA,MACP,MAAM;AAAA,IAAA,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5CD,UAAMU,IAAQR,GAMRF,IAASW,EAAiB,GAE1BC,IAAUC,EAAS,MAAM;;AACvB,aAAA;AAAA,QACN,UAAQL,IAAAR,EAAO,eAAP,gBAAAQ,EAAmB,WAAUE,EAAM;AAAA,QAC3C,eAAeA,EAAM,aAAaV,EAAO,cAAc;AAAA,MACxD;AAAA,IAAA,CACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IC4BYc,IAAkB;AAAA,EAC9B,MAAM;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,OAAO;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,UAAU;AAAA,EAEV,gBAAgB;AACjB;;;;;;;;;;;;ACxDA,UAAMJ,IAAQR,GAIRF,IAASW,EAAiB,GAK1BI,IAA2B,CAACC,GAAsBC,MAAkB;AACzE,UAAI,CAAAA,EAAS,OAET;AAAA,YAAAD,EAAU,SAAS,yBAAyB;AAC/C,UAAAC,EAAS,QAAQ;AAEjB;AAAA,QAAA;AAGD,QAAKjB,EAAO,aAAaU,EAAM,IAAc,MAE7CV,EAAO,cAAc,QAAQ,IAGzBgB,EAAU,oBACbC,EAAS,QAAQ,IAEjBjB,EAAO,cAAc,QAAQ;AAAA;AAAA,IAE/B;AAEI,QAAAU,EAAM,UAAU,SAAS,yBAAyB;AAC/C,YAAAO,IAAWC,EAAI,EAAK;AAE1B,MAAAC,EAAU,MAAM;AACU,QAAAJ,EAAAL,EAAM,WAAWO,CAAQ;AAAA,MAAA,CAClD;AAAA,IAAA;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms-CmlWMEyk.amd"],function(n,T,a){"use strict";if(typeof e>"u")var e=window.Vue;T.TopAvatar=a.TopAvatar,T.TopButton=a.TopButton,T.TopCheckbox=a.TopCheckbox,T.TopControlLabel=a.TopControlLabel,T.TopHint=a.TopHint,T.TopInput=a.TopInput,T.TopInputDate=a.TopInputDate,T.TopInputRange=a.TopInputRange,T.TopLoadbar=a.TopLoadbar,T.TopRadio=a.TopRadio,T.TopSelect=a.TopSelect,T.TopSwitcher=a.TopSwitcher,T.TopTextarea=a.TopTextarea,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/forms-Dh0QU6P9.amd"],function(n,T,a){"use strict";if(typeof e>"u")var e=window.Vue;T.TopAvatar=a.TopAvatar,T.TopButton=a.TopButton,T.TopCheckbox=a.TopCheckbox,T.TopControlLabel=a.TopControlLabel,T.TopHint=a.TopHint,T.TopInput=a.TopInput,T.TopInputDate=a.TopInputDate,T.TopInputRange=a.TopInputRange,T.TopLoadbar=a.TopLoadbar,T.TopRadio=a.TopRadio,T.TopSelect=a.TopSelect,T.TopSwitcher=a.TopSwitcher,T.TopTextarea=a.TopTextarea,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=forms.amd.js.map
package/forms/forms.js CHANGED
@@ -1,4 +1,4 @@
1
- import { T as p, e as T, f as s, g as t, h as e, j as n, k as r, l, m as u, n as b, o as c, p as h, q as i } from "../.chunks/forms-DDIlFXbF.es.js";
1
+ import { T as p, f as T, g as s, h as t, j as e, k as n, l as r, m as l, n as u, o as b, p as c, q as h, r as i } from "../.chunks/forms-BciWy0wX.es.js";
2
2
  export {
3
3
  p as TopAvatar,
4
4
  T as TopButton,
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.amd.js","sources":["../../src/components/forms/helpers.ts"],"sourcesContent":["/**\n * Размеры\n */\nexport const sizes = {\n\txs: 'xs',\n\ts: 's',\n\tm: 'm',\n\tl: 'l',\n} as const;\n\nexport type Size = typeof sizes[keyof typeof sizes];"],"names":["sizes"],"mappings":"yFAGO,MAAAA,EAAA,0BAKP"}
1
+ {"version":3,"file":"helpers.amd.js","sources":["../../src/components/forms/helpers.ts"],"sourcesContent":["/**\r\n * Размеры\r\n */\r\nexport const sizes = {\r\n\txs: 'xs',\r\n\ts: 's',\r\n\tm: 'm',\r\n\tl: 'l',\r\n} as const;\r\n\r\nexport type Size = typeof sizes[keyof typeof sizes];"],"names":["sizes"],"mappings":"yFAGO,MAAAA,EAAA,qBAGH,EAAA,GAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../src/components/forms/helpers.ts"],"sourcesContent":["/**\n * Размеры\n */\nexport const sizes = {\n\txs: 'xs',\n\ts: 's',\n\tm: 'm',\n\tl: 'l',\n} as const;\n\nexport type Size = typeof sizes[keyof typeof sizes];"],"names":["sizes"],"mappings":"AAGO,MAAMA,IAAQ;AAAA,EACpB,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;"}
1
+ {"version":3,"file":"helpers.js","sources":["../../src/components/forms/helpers.ts"],"sourcesContent":["/**\r\n * Размеры\r\n */\r\nexport const sizes = {\r\n\txs: 'xs',\r\n\ts: 's',\r\n\tm: 'm',\r\n\tl: 'l',\r\n} as const;\r\n\r\nexport type Size = typeof sizes[keyof typeof sizes];"],"names":["sizes"],"mappings":"AAGO,MAAMA,IAAQ;AAAA,EACpB,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;"}
@@ -1,2 +1,2 @@
1
- define(["require","exports","vue","../.chunks/forms-CmlWMEyk.amd","../utils/keyboard.amd","../popup/popup.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-DcFQyQgs.amd","../require/css.amd!../assets/formsExt.css"],function(Q,C,e,V,S,b,I){"use strict";if(typeof e>"u")var e=window.Vue;const N={class:"top-editArea_footer"},L=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{}},emits:["submit","close","clickOnTitle"],setup(u,{emit:d}){const t=u,l=d,m=e.ref(t.defaultValue),f=e.ref(t.isFocused),r=e.computed(()=>m.value!==t.defaultValue),c=e.computed(()=>t.attachToKeyboard?"":t.forceShowCloseBtn&&!r.value?t.closeText:t.cancelText),p=s=>{l("submit",s),m.value=t.defaultValue},v=()=>{if(t.forceShowCloseBtn&&!r.value){l("close");return}m.value=t.defaultValue},y=()=>{t.attachToKeyboard&&l("clickOnTitle")};return(s,a)=>{const k=e.resolveDirective("top-focus");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":s.attachToKeyboard})},[s.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:a[0]||(a[0]=B=>y())},e.toDisplayString(s.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-error":s.isError,"top-focus":f.value})},[e.withDirectives(e.createVNode(V._sfc_main$3,{modelValue:m.value,"onUpdate:modelValue":a[1]||(a[1]=B=>m.value=B),name:s.name,placeholder:s.placeholder,rows:s.rows,minHeight:s.minHeight,expandable:s.expandable,disabled:s.disabled,readonly:s.readonly,isError:s.isError,hint:s.hint,class:"top-editArea_element",onFocus:a[2]||(a[2]=()=>f.value=!0),onBlur:a[3]||(a[3]=()=>f.value=!1),onKeyup:[e.withKeys(v,["esc"]),a[4]||(a[4]=e.withKeys(e.withModifiers(B=>p(m.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),[[k,{disabled:!f.value}]]),e.createElementVNode("div",N,[!s.attachToKeyboard&&(r.value||s.forceShowCloseBtn)?(e.openBlock(),e.createBlock(V._sfc_main,{key:0,class:"top-editArea_button",color:"theme",styling:"soft",onClick:v},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1})):e.createCommentVNode("",!0),r.value?(e.openBlock(),e.createBlock(V._sfc_main,{key:1,class:"top-editArea_button",icon:s.attachToKeyboard?"":"",onClick:a[5]||(a[5]=B=>p(m.value))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.attachToKeyboard?"":s.submitText),1)]),_:1},8,["icon"])):e.createCommentVNode("",!0)])],2)],2)}}}),M={class:"top-editInput"},$=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(u,{emit:d}){const t=u,l=e.ref(t.modelValue);e.watch(e.toRef(t.modelValue),()=>{l.value=t.modelValue});const m=d,f=()=>{m("update:modelValue",l.value)};return(r,c)=>(e.openBlock(),e.createElementBlock("div",M,[e.createVNode(V._sfc_main$2,e.mergeProps(r.input,{onKeydownCapture:c[0]||(c[0]=e.withKeys(e.withModifiers(p=>l.value=r.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(f,["stop"]),["enter"]),modelValue:l.value,"onUpdate:modelValue":c[1]||(c[1]=p=>l.value=p)}),null,16,["onKeydown","modelValue"]),l.value!==r.modelValue?(e.openBlock(),e.createBlock(V._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},r.button,{onClick:f}),null,16)):e.createCommentVNode("",!0)]))}}),K=["data-top-icon","onClick"],P={key:0,class:"top-radioGroup_circle"},_=["value","disabled"],D=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:e.mergeModels(["update:modelValue"],["update:modelValue"]),setup(u,{emit:d}){const t=e.useModel(u,"modelValue"),l=u,m=e.ref(null);e.watch(t,()=>{var r,c,p,v,y;(r=l.radiosProps)!=null&&r.some(s=>s.value===t.value)||(t.value=((p=(c=l.radiosProps)==null?void 0:c[0])==null?void 0:p.value)??""),(y=(v=m.value)==null?void 0:v.querySelector(".radioGroup_item-selected"))==null||y.scrollIntoView()},{immediate:!0});const f="radioGroup-"+Math.random();return(r,c)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:m,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+r.size]:!!r.size,"top-error":r.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.radiosProps,p=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":p.value===t.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":p.disabled}),"data-top-icon":p.icon,onClick:v=>t.value=p.value},[e.createTextVNode(e.toDisplayString(p.title)+" ",1),r.showIndicator?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":c[0]||(c[0]=v=>t.value=v),name:f,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:p.value,disabled:p.disabled},null,8,_),[[e.vModelRadio,t.value]])],10,K))),256))],2))}}),O=(u,d,t)=>{const l=e.ref([]),m=e.ref(!1);let f="",r;u&&!u.params.limit&&(u.params.limit=100);const c=async()=>{if(!u)return;let a,k;if(t&&(u.cache??=new Map,k=JSON.stringify(u.params),a=u.cache.get(k),a))return a;if(m.value=!0,a=await u.call(),m.value=!1,a.errors)return;if(!Array.isArray(a.result)){console.warn("В result ожидался массив");return}const B=a.result.findIndex(g=>g.id===void 0||g.name===void 0);if(B!==-1){console.warn(`В result[${B}] нет id или name`);return}return t&&u.cache.set(k,a),a},p=async()=>{if(!u)return;u.params.offset=0,u.params.search=f;const a=await c();a&&(r=a.nextOffset,l.value=a.result)},v=async()=>{if(!u||!r||m.value)return;u.params.offset=r,u.params.search=f;const a=await c();a&&(r=a.nextOffset,l.value=l.value.concat(a.result))},y=V.debounce(()=>p(),200);return{items:l,isLoading:m,loadAppend:v,setSearchTextAndLoad:(a,k=!0)=>{u&&(a.length<d||a===f&&l.value.length||(f=a,k?y():p()))}}},z={class:"top-selector2_itemMulti top-ellipsis"},F=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(u){return(d,t)=>(e.openBlock(),e.createElementBlock("div",z,[e.createTextVNode(e.toDisplayString(d.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:t[0]||(t[0]=l=>d.$emit("delete",d.id)),onMousedown:t[1]||(t[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),G={key:0,class:"top-selector2_activeItems"},H={key:1,class:"top-selector2_activeName top-ellipsis"},R=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},multiselect:{type:Boolean},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},placeholder:{},showSelectedInInput:{type:Boolean,default:!0}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(u){const d=u,t=e.useModel(u,"modelValue"),l=e.ref(""),m={id:0,name:V.useI18n().Common.All},f=e.ref(null),r=()=>{var o;return(o=f.value)==null?void 0:o.popup};window.__STORYBOOK_PREVIEW__&&!d.modelValue&&e.watch(()=>d.multiselect,()=>{t.value=d.multiselect?[]:{id:null,name:""}},{immediate:!0});const c=O(d.apiRequest,d.minLength,d.useCache),p=e.computed(()=>{const o=[];return!d.multiselect&&d.appendAllValue&&o.push(m),d.items.forEach(i=>o.push({...i})),o}),v=(o,i=!0)=>i&&o.id===null?Array.isArray(t.value)?t.value.some(n=>n.id===o.id&&n.name===o.name):o.name===t.value.name:Array.isArray(t.value)?t.value.some(n=>n.id===o.id):o.id===t.value.id,y=e.computed(()=>{const o=l.value.toLowerCase(),i=S.invertKeyboardLayout(o);let n=[];return p.value.forEach(h=>{const w=h.name.toLowerCase();(h.id===Number(o)||w.includes(o)||w.includes(i))&&(w===o||w===i?n.unshift(h):n.push(h))}),n.push(...c.items.value),d.appendSearchToResult&&l.value&&(!n.length||n[0].name.toLowerCase()!==o)&&n.push({id:null,name:l.value}),d.multiselect&&(n=n.filter(h=>!v(h))),n}),s=e.ref(c.isLoading.value);e.watch(c.isLoading,()=>{s.value=c.isLoading.value});const a=async o=>{var i,n;if(d.multiselect){if(!Array.isArray(t.value)||v(o))return;d.apiRequest&&l.value&&(s.value=!0);const h=[...t.value];h.push({...o}),t.value=h,V.Core.state.isMobile?((i=r())==null||i.close(),l.value&&(l.value="",c.items.value=[])):setTimeout(()=>{var w,T,A,E;(w=r())==null||w.recalcPosition(),(E=(A=(T=r())==null?void 0:T.elPopupWidget)==null?void 0:A.querySelector("input"))==null||E.focus(),l.value&&(y.value.length?d.apiRequest&&(s.value=!1):(l.value="",c.items.value=[]))})}else l.value&&(l.value="",c.items.value=[]),JSON.stringify(o)!==JSON.stringify(t.value)&&(t.value={...o}),(n=r())==null||n.close()},k=()=>{if(!Array.isArray(t.value)){const i=(p.value.findIndex(n=>n.id===t.value.id)+1)%p.value.length;t.value={...p.value[i]}}},B=async o=>{Array.isArray(t.value)&&(t.value=t.value.filter(i=>i.id!==o),setTimeout(()=>{var i;(i=r())==null||i.recalcPosition()}))},g=e.ref(!1);d.apiRequest&&(e.watch(g,()=>{g.value&&c.setSearchTextAndLoad(l.value,!1)}),e.watch(l,()=>c.setSearchTextAndLoad(l.value)));const Y=o=>{const i=o.target;i.scrollTop/(i.scrollHeight-i.offsetHeight)>.8&&c.loadAppend()};return(o,i)=>(e.openBlock(),e.createBlock(e.unref(b.TopPopup),{ref_key:"popupRef",ref:f,onOpen:i[1]||(i[1]=n=>g.value=!0),onClose:i[2]||(i[2]=n=>g.value=!1),onScrollContentList:i[3]||(i[3]=n=>o.apiRequest?Y(n):void 0),notch:!1,transitionDuration:0},{opener:e.withCtx(()=>[e.createElementVNode("div",{class:e.normalizeClass({"top-selector2":!0,"top-selector2-multiselect":o.multiselect,["top-size_"+o.size]:!0,"top-disabled":o.disabled,"top-forms-focusable":!o.disabled,"top-error":o.isError})},[o.multiselect?(e.openBlock(),e.createElementBlock("div",G,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value,n=>(e.openBlock(),e.createBlock(F,{id:n.id,name:n.name,onDelete:B},null,8,["id","name"]))),256))])):e.createCommentVNode("",!0),o.multiselect?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",H,e.toDisplayString(Array.isArray(t.value)?"":t.value.name),1)),o.addChanger&&!o.multiselect&&p.value.length>1&&!o.disabled?(e.openBlock(),e.createElementBlock("span",{key:2,class:"top-changer top-changer-selector",onClick:e.withModifiers(k,["stop"])})):e.createCommentVNode("",!0)],2)]),widget:e.withCtx(()=>[e.createVNode(e.unref(b.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:l.value,"onUpdate:modelValue":i[0]||(i[0]=n=>l.value=n),isLoading:s.value,placeholder:!Array.isArray(t.value)&&!o.multiselect&&o.showSelectedInInput?t.value.name:o.placeholder},null,8,["modelValue","isLoading","placeholder"])]),contentList:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value,n=>(e.openBlock(),e.createBlock(e.unref(b.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(t.value)&&!o.multiselect&&t.value.name===n.name}),key:n.id??void 0,onClick:e.withModifiers(h=>a(n),["stop"])},{default:e.withCtx(()=>[o.$slots.item?e.renderSlot(o.$slots,"item",{key:0,item:n}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(n.name),1)],64))]),_:2},1032,["class","onClick"]))),128)),!s.value&&!y.value.length?(e.openBlock(),e.createBlock(e.unref(b.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0)]),_:3},512))}}),U=L,W=$,J=D,j=R,X=I._sfc_main;C.TopEditArea=U,C.TopEditInput=W,C.TopMenu=X,C.TopRadioGroup=J,C.TopSelector2=j,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","vue","../.chunks/forms-Dh0QU6P9.amd","../utils/keyboard.amd","../popup/popup.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-B8-UPDGJ.amd","../require/css.amd!../assets/formsExt.css"],function(le,V,e,B,I,w,$){"use strict";if(typeof e>"u")var e=window.Vue;const N={class:"top-editArea_footer"},M=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{}},emits:["submit","close","clickOnTitle"],setup(i,{emit:n}){const t=i,a=n,f=e.ref(t.defaultValue),v=e.ref(t.isFocused),c=e.computed(()=>f.value!==t.defaultValue),p=e.computed(()=>t.attachToKeyboard?"":t.forceShowCloseBtn&&!c.value?t.closeText:t.cancelText),s=u=>{a("submit",u),f.value=t.defaultValue},y=()=>{if(t.forceShowCloseBtn&&!c.value){a("close");return}f.value=t.defaultValue},k=()=>{t.attachToKeyboard&&a("clickOnTitle")};return(u,l)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":u.attachToKeyboard})},[u.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:l[0]||(l[0]=h=>k())},e.toDisplayString(u.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-error":u.isError,"top-focus":v.value})},[e.createVNode(B._sfc_main$3,{modelValue:f.value,"onUpdate:modelValue":l[1]||(l[1]=h=>f.value=h),name:u.name,placeholder:u.placeholder,rows:u.rows,minHeight:u.minHeight,expandable:u.expandable,disabled:u.disabled,readonly:u.readonly,isError:u.isError,hint:u.hint,class:"top-editArea_element",onFocus:l[2]||(l[2]=()=>v.value=!0),onBlur:l[3]||(l[3]=()=>v.value=!1),onKeyup:[e.withKeys(y,["esc"]),l[4]||(l[4]=e.withKeys(e.withModifiers(h=>s(f.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",N,[!u.attachToKeyboard&&(c.value||u.forceShowCloseBtn)?(e.openBlock(),e.createBlock(B._sfc_main,{key:0,class:"top-editArea_button",color:"theme",styling:"soft",onClick:y},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.value),1)]),_:1})):e.createCommentVNode("",!0),c.value?(e.openBlock(),e.createBlock(B._sfc_main,{key:1,class:"top-editArea_button",icon:u.attachToKeyboard?"":"",onClick:l[5]||(l[5]=h=>s(f.value))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.attachToKeyboard?"":u.submitText),1)]),_:1},8,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),L={class:"top-editInput"},_=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(i,{emit:n}){const t=i,a=e.ref(t.modelValue);e.watch(e.toRef(t.modelValue),()=>{a.value=t.modelValue});const f=n,v=()=>{f("update:modelValue",a.value)};return(c,p)=>(e.openBlock(),e.createElementBlock("div",L,[e.createVNode(B._sfc_main$2,e.mergeProps(c.input,{onKeydownCapture:p[0]||(p[0]=e.withKeys(e.withModifiers(s=>a.value=c.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(v,["stop"]),["enter"]),modelValue:a.value,"onUpdate:modelValue":p[1]||(p[1]=s=>a.value=s)}),null,16,["onKeydown","modelValue"]),a.value!==c.modelValue?(e.openBlock(),e.createBlock(B._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},c.button,{onClick:v}),null,16)):e.createCommentVNode("",!0)]))}}),K=["data-top-icon","onClick"],P={key:0,class:"top-radioGroup_circle"},z=["value","disabled"],D=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:e.mergeModels(["update:modelValue"],["update:modelValue"]),setup(i,{emit:n}){const t=e.useModel(i,"modelValue"),a=i,f=e.ref(null);e.watch(t,()=>{var c,p,s,y,k;(c=a.radiosProps)!=null&&c.some(u=>u.value===t.value)||(t.value=((s=(p=a.radiosProps)==null?void 0:p[0])==null?void 0:s.value)??""),(k=(y=f.value)==null?void 0:y.querySelector(".radioGroup_item-selected"))==null||k.scrollIntoView()},{immediate:!0});const v="radioGroup-"+Math.random();return(c,p)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:f,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+c.size]:!!c.size,"top-error":c.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.radiosProps,s=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":s.value===t.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":s.disabled}),"data-top-icon":s.icon,onClick:y=>t.value=s.value},[e.createTextVNode(e.toDisplayString(s.title)+" ",1),c.showIndicator?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[0]||(p[0]=y=>t.value=y),name:v,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:s.value,disabled:s.disabled},null,8,z),[[e.vModelRadio,t.value]])],10,K))),256))],2))}}),O=(i,n,t)=>{const a=e.ref([]),f=e.ref(!1);let v="",c;i&&!i.params.limit&&(i.params.limit=100);const p=async()=>{if(!i)return;let l,h;if(t&&(i.cache??=new Map,h=JSON.stringify(i.params),l=i.cache.get(h),l))return l;if(f.value=!0,l=await i.call(),f.value=!1,l.errors)return;if(!Array.isArray(l.result)){console.warn("В result ожидался массив");return}const C=l.result.findIndex(T=>T.id===void 0||T.name===void 0);if(C!==-1){console.warn(`В result[${C}] нет id или name`);return}return t&&i.cache.set(h,l),l},s=async()=>{if(!i)return;i.params.offset=0,i.params.search=v;const l=await p();l&&(c=l.nextOffset,a.value=l.result)},y=async()=>{if(!i||!c||f.value)return;i.params.offset=c,i.params.search=v;const l=await p();l&&(c=l.nextOffset,a.value=a.value.concat(l.result))},k=B.debounce(()=>s(),200);return{items:a,isLoading:f,loadAppend:y,setSearchTextAndLoad:(l,h=!0)=>{i&&(l.length<n||l===v&&a.value.length||(v=l,h?k():s()))}}},F={class:"top-selector2_itemMulti top-ellipsis"},G=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(i){return(n,t)=>(e.openBlock(),e.createElementBlock("div",F,[e.createTextVNode(e.toDisplayString(n.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:t[0]||(t[0]=a=>n.$emit("delete",n.id)),onMousedown:t[1]||(t[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),H={key:0,class:"top-selector2_activeItems"},R={key:1,class:"top-selector2_activeName top-ellipsis"},U=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},multiselect:{type:Boolean},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},placeholder:{},showSelectedInInput:{type:Boolean,default:!0}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const n=i,t=e.useModel(i,"modelValue"),a=e.ref(""),f={id:0,name:B.useI18n().Common.All},v=e.ref(null),c=e.ref(null),p=()=>{var o;return(o=v.value)==null?void 0:o.popup};window.__STORYBOOK_PREVIEW__&&!n.modelValue&&e.watch(()=>n.multiselect,()=>{t.value=n.multiselect?[]:{id:null,name:""}},{immediate:!0});const s=O(n.apiRequest,n.minLength,n.useCache),y=e.computed(()=>{const o=[];return!n.multiselect&&n.appendAllValue&&o.push(f),n.items.forEach(r=>o.push({...r})),o}),k=(o,r=!0)=>r&&o.id===null?Array.isArray(t.value)?t.value.some(m=>m.id===o.id&&m.name===o.name):o.name===t.value.name:Array.isArray(t.value)?t.value.some(m=>m.id===o.id):o.id===t.value.id,u=e.computed(()=>{const o=a.value.toLowerCase(),r=I.invertKeyboardLayout(o);let m=[];return y.value.forEach(d=>{const g=d.name.toLowerCase();(d.id===Number(o)||g.includes(o)||g.includes(r))&&(g===o||g===r?m.unshift(d):m.push(d))}),m.push(...s.items.value),n.appendSearchToResult&&a.value&&(!m.length||m[0].name.toLowerCase()!==o)&&m.push({id:null,name:a.value}),n.multiselect&&(m=m.filter(d=>!k(d))),m}),l=e.ref(s.isLoading.value);e.watch(s.isLoading,()=>{l.value=s.isLoading.value});const h=async o=>{var r,m;if(n.multiselect){if(!Array.isArray(t.value)||k(o))return;n.apiRequest&&a.value&&(l.value=!0);const d=[...t.value];d.push({...o}),t.value=d,B.Core.state.isMobile?(r=p())==null||r.close():setTimeout(()=>{var g,A,E,S;(g=p())==null||g.recalcPosition(),(S=(E=(A=p())==null?void 0:A.elPopupWidget)==null?void 0:E.querySelector("input"))==null||S.focus(),a.value&&(u.value.length?n.apiRequest&&(l.value=!1):(a.value="",s.items.value=[]))})}else JSON.stringify(o)!==JSON.stringify(t.value)&&(t.value={...o}),(m=p())==null||m.close()},C=()=>{if(!Array.isArray(t.value)){const r=(y.value.findIndex(m=>m.id===t.value.id)+1)%y.value.length;t.value={...y.value[r]}}},T=async o=>{Array.isArray(t.value)&&(t.value=t.value.filter(r=>r.id!==o),setTimeout(()=>{var r;(r=p())==null||r.recalcPosition()}))},b=e.ref(!1);n.apiRequest&&(e.watch(b,()=>{b.value&&s.setSearchTextAndLoad(a.value,!1)}),e.watch(a,()=>s.setSearchTextAndLoad(a.value)));const te=o=>{const r=o.target;r.scrollTop/(r.scrollHeight-r.offsetHeight)>.8&&s.loadAppend()},oe=()=>{var o;b.value=!1,(o=c.value)==null||o.focus(),a.value&&(a.value="",s.items.value=[])};return(o,r)=>{const m=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(w.TopPopup),{ref_key:"popupRef",ref:v,onOpen:r[3]||(r[3]=d=>b.value=!0),onClose:r[4]||(r[4]=d=>oe()),onScrollContentList:r[5]||(r[5]=d=>o.apiRequest?te(d):void 0),notch:!1,transitionDuration:0},{opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:c,class:e.normalizeClass({"top-selector2":!0,"top-selector2-multiselect":o.multiselect,["top-size_"+o.size]:!0,"top-disabled":o.disabled,"top-forms-focusable":!o.disabled,"top-error":o.isError}),onKeydown:[r[0]||(r[0]=e.withKeys(e.withModifiers(d=>d.currentTarget.click(),["stop","prevent"]),["up","down","enter","space"])),r[1]||(r[1]=e.withKeys(d=>t.value=[],["delete"]))],tabindex:"0"},[o.multiselect?(e.openBlock(),e.createElementBlock("div",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value,d=>(e.openBlock(),e.createBlock(G,{id:d.id,name:d.name,onDelete:T},null,8,["id","name"]))),256))])):e.createCommentVNode("",!0),o.multiselect?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",R,e.toDisplayString(Array.isArray(t.value)?"":t.value.name),1)),o.addChanger&&!o.multiselect&&y.value.length>1&&!o.disabled?(e.openBlock(),e.createElementBlock("span",{key:2,class:"top-changer top-changer-selector",onClick:e.withModifiers(C,["stop"])})):e.createCommentVNode("",!0)],34)),[[m,o.isError,void 0,{onupdate:!0}]])]),widget:e.withCtx(()=>[e.createVNode(e.unref(w.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:a.value,"onUpdate:modelValue":r[2]||(r[2]=d=>a.value=d),isLoading:l.value,placeholder:!Array.isArray(t.value)&&!o.multiselect&&o.showSelectedInInput?t.value.name:o.placeholder},null,8,["modelValue","isLoading","placeholder"])]),contentList:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,d=>(e.openBlock(),e.createBlock(e.unref(w.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(t.value)&&!o.multiselect&&t.value.name===d.name}),key:d.id??void 0,onClick:e.withModifiers(g=>h(d),["stop"])},{default:e.withCtx(()=>[o.$slots.item?e.renderSlot(o.$slots,"item",{key:0,item:d}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(d.name),1)],64))]),_:2},1032,["class","onClick"]))),128)),!l.value&&!u.value.length?(e.openBlock(),e.createBlock(e.unref(w.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0)]),_:3},512)}}}),W=["data-top-icon"],J={class:"top-info_text"},j={key:0,class:"top-info_value"},X=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(i){return(n,t)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+n.size]:!0,["top-info-styling_"+n.styling]:!0}),"data-top-icon":n.icon},[e.createElementVNode("div",J,[e.renderSlot(n.$slots,"default")]),n.$slots.additional?(e.openBlock(),e.createElementBlock("span",j,[e.renderSlot(n.$slots,"additional")])):e.createCommentVNode("",!0)],10,W))}}),Y=M,Q=_,Z=D,q=U,x=$._sfc_main,ee=X;V.TopEditArea=Y,V.TopEditInput=Q,V.TopInfo=ee,V.TopMenu=x,V.TopRadioGroup=Z,V.TopSelector2=q,Object.defineProperty(V,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=formsExt.amd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/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-top-focus=\"{ disabled: !isFocused }\"\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}\n\n.top-editArea_form:hover {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n.top-editArea_form.top-focus {\n\tborder-color: var(--color-line-primary-1);\n\toutline: none;\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 { Ref, 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> = ref(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\"\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\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>\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\t--top-forms-background-color: var(--top-forms-background-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';\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;\n"],"names":["props","__props","emit","__emit","isChanged","vue","localValue","cancelBtnText","submit","value","intermediateValue","elRef","model","_a","item","_c","_b","items","isLoading","_searchText","apiRequest","res","indexWithError","callAPIRequest","_nextOffset","loadAppend","searchText","minLength","forms","popupRef","API","useAPI","localItems","itemAll","itemSelected","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","isSelected","selectItem","newModel","getPopup","_d","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","TopEditArea","_sfc_main$4","TopEditInput","_sfc_main$3","TopRadioGroup","_sfc_main$2","TopSelector2","_sfc_main","TopMenu","menu_vue_vue_type_style_index_0_lang"],"mappings":"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"}
1
+ {"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/selector2/api.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue';\r\nimport Button from '@/components/forms/button/button.vue';\r\nimport type { Emits, Props } from './editArea';\r\nimport Textarea from '@/components/forms/textarea/textarea.vue';\r\n\r\n// TODO: добавить переменную top-forms-fixed-height и использовать ее при добавлении отступов у страницы\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tdefaultValue: '',\r\n\tcancelText: 'Cancel',\r\n\tsubmitText: 'Send',\r\n\tcloseText: 'Close',\r\n\texpandable: true,\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst localValue = ref(props.defaultValue);\r\n\r\nconst isFocused = ref(props.isFocused);\r\n\r\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\r\n\r\nconst cancelBtnText = computed(() => {\r\n\tif (props.attachToKeyboard) return '';\r\n\r\n\tif (props.forceShowCloseBtn && !isChanged.value) return props.closeText;\r\n\r\n\treturn props.cancelText;\r\n});\r\n\r\nconst submit = (value: string) => {\r\n\temit('submit', value);\r\n\r\n\tlocalValue.value = props.defaultValue;\r\n};\r\n\r\nconst cancel = () => {\r\n\tif (props.forceShowCloseBtn && !isChanged.value) {\r\n\t\temit('close');\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tlocalValue.value = props.defaultValue;\r\n};\r\n\r\nconst clickOnTitle = () => {\r\n\tif (props.attachToKeyboard) emit('clickOnTitle');\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\t:class=\"{\r\n\t\t\t'top-editArea': true,\r\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\r\n\t\t}\"\r\n\t>\r\n\t\t<div\r\n\t\t\tv-if=\"title\"\r\n\t\t\tclass=\"top-editArea_title\"\r\n\t\t\t@click=\"clickOnTitle()\"\r\n\t\t>\r\n\t\t\t{{ title }}\r\n\t\t</div>\r\n\r\n\t\t<div\r\n\t\t\t:class=\"{\r\n\t\t\t\t'top-editArea_form': true,\r\n\t\t\t\t'top-error': isError,\r\n\t\t\t\t'top-focus': isFocused,\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<Textarea\r\n\t\t\t\tv-model=\"localValue\"\r\n\t\t\t\t:name=\"name\"\r\n\t\t\t\t:placeholder=\"placeholder\"\r\n\t\t\t\t:rows=\"rows\"\r\n\t\t\t\t:minHeight=\"minHeight\"\r\n\t\t\t\t:expandable=\"expandable\"\r\n\t\t\t\t:disabled=\"disabled\"\r\n\t\t\t\t:readonly=\"readonly\"\r\n\t\t\t\t:isError=\"isError\"\r\n\t\t\t\t:hint=\"hint\"\r\n\t\t\t\tclass=\"top-editArea_element\"\r\n\t\t\t\t@focus=\"() => isFocused = true\"\r\n\t\t\t\t@blur=\"() => isFocused = false\"\r\n\t\t\t\t@keyup.esc=\"cancel\"\r\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\r\n\t\t\t/>\r\n\r\n\t\t\t<div class=\"top-editArea_footer\">\r\n\t\t\t\t<Button\r\n\t\t\t\t\tv-if=\"!attachToKeyboard && (isChanged || forceShowCloseBtn)\"\r\n\t\t\t\t\tclass=\"top-editArea_button\"\r\n\t\t\t\t\tcolor=\"theme\"\r\n\t\t\t\t\tstyling=\"soft\"\r\n\t\t\t\t\t@click=\"cancel\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ cancelBtnText }}\r\n\t\t\t\t</Button>\r\n\r\n\t\t\t\t<Button\r\n\t\t\t\t\tclass=\"top-editArea_button\"\r\n\t\t\t\t\tv-if=\"isChanged\"\r\n\t\t\t\t\t:icon=\"attachToKeyboard ? '': ''\"\r\n\t\t\t\t\t@click=\"submit(localValue)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ attachToKeyboard ? '' : submitText }}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n.top-editArea {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 6px;\r\n}\r\n\r\n.top-editArea_title {\r\n\tfont-size: 12px;\r\n}\r\n\r\n.top-editArea_form {\r\n\tflex-direction: column;\r\n\toutline: none;\r\n}\r\n\r\n.top-editArea_form:not(.top-error):hover,\r\n.top-editArea_form:not(.top-error).top-focus {\r\n\tborder-color: var(--top-forms-border-color-hover);\r\n}\r\n\r\n/* textarea в EditArea */\r\n.top-textarea {\r\n\twidth: 100%;\r\n}\r\n\r\n.top-editArea_element.top-textarea_textarea {\r\n\tborder: none;\r\n\toutline: none;\r\n\tanimation: none;\r\n}\r\n\r\n/* footer */\r\n.top-editArea_footer {\r\n\tpadding: var(--top-forms-padding);\r\n\tdisplay: flex;\r\n\tmin-height: 32px;\r\n\tjustify-content: flex-end;\r\n\tgap: var(--top-forms-padding);\r\n}\r\n\r\n/* attachedToKeyboard */\r\n.top-editArea-attachedToKeyboard {\r\n\tbackground: var(--top-forms-background-color);\r\n\tmargin-bottom: env(keyboard-inset-height, 0);\r\n\tposition: fixed;\r\n\tbottom: 0;\r\n\tright: 0;\r\n\tleft: 0;\r\n\tz-index: 2;\r\n\tgap: 0;\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_form {\r\n\tborder-radius: 0;\r\n\tborder: none;\r\n\tborder-top: 1px solid var(--top-forms-border-color);\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_title {\r\n\tcursor: pointer;\r\n\tborder-top: 1px solid var(--color-line-2-opacity);\r\n\tpadding: var(--top-forms-padding);\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\r\n\tborder-radius: 100%;\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button {\r\n\tmin-width: auto;\r\n\tpadding: 0;\r\n}\r\n\r\n.top-editArea-attachedToKeyboard .top-button.top-editArea_button:before {\r\n\t--top-icon-size: 18px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { ref, toRef, watch } from 'vue';\r\nimport type { Emits, Props } from './editInput';\r\nimport TopInput from '@/components/forms/input/input.vue';\r\nimport TopButton from '@/components/forms/button/button.vue';\r\n\r\nconst props = defineProps<Props>();\r\n\r\nconst intermediateValue = ref(props.modelValue);\r\n\r\nwatch(toRef(props.modelValue), () => {\r\n\tintermediateValue.value = props.modelValue;\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst submit = () => {\r\n\temit('update:modelValue', intermediateValue.value);\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<div class=\"top-editInput\">\r\n\t\t<TopInput\r\n\t\t\t:=\"input\"\r\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\r\n\t\t\t@keydown.enter.stop=\"submit\"\r\n\t\t\tv-model=\"intermediateValue\"\r\n\t\t/>\r\n\r\n\t\t<TopButton\r\n\t\t\tv-if=\"intermediateValue !== modelValue\"\r\n\t\t\ticon=\"\"\r\n\t\t\tstyling=\"soft\"\r\n\t\t\t:=\"button\"\r\n\t\t\t@click=\"submit\"\r\n\t\t/>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n.top-editInput {\r\n\twidth: 220px;\r\n\tflex-grow: 1;\r\n\tdisplay: flex;\r\n\talign-items: flex-end;\r\n\tgap: var(--top-gap-1);\r\n}\r\n\r\n.top-editInput .top-input {\r\n\twidth: unset;\r\n\tflex-grow: 1;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport type { Ref } from '@vue/reactivity';\r\nimport { ref, watch } from 'vue';\r\nimport type { Props, Emits } from './radioGroup';\r\n\r\nconst model = defineModel<string>({\r\n\trequired: true,\r\n});\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\tsize: 's',\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst elRef: Ref<HTMLElement | null> = ref(null);\r\n\r\nwatch(model, () => {\r\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\r\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\r\n\t}\r\n\r\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\r\n}, { immediate: true });\r\n\r\nconst uid = 'radioGroup-' + Math.random();\r\n</script>\r\n\r\n<template>\r\n\t<div\r\n\t\tref=\"elRef\"\r\n\t\t:class=\"{\r\n\t\t\t['top-radioGroup']: true,\r\n\t\t\t['top-scrollBarXHidding']: true,\r\n\t\t\t['top-size_' + size]: !!size,\r\n\t\t\t['top-error']: isError,\r\n\t\t}\"\r\n\t>\r\n\t\t<label\r\n\t\t\tv-for=\"item of radiosProps\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\r\n\t\t\t\t['top-radioGroup_item']: true,\r\n\t\t\t\t['top-forms-focusable']: true,\r\n\t\t\t\t['top-disabled']: item.disabled,\r\n\t\t\t}\"\r\n\t\t\t:data-top-icon=\"item.icon\"\r\n\t\t\t@click=\"model = item.value\"\r\n\t\t>\r\n\t\t\t{{ item.title }}\r\n\r\n\t\t\t<span\r\n\t\t\t\tv-if=\"showIndicator\"\r\n\t\t\t\tclass=\"top-radioGroup_circle\"\r\n\t\t\t></span>\r\n\r\n\t\t\t<!-- Для нативной навигации -->\r\n\t\t\t<input\r\n\t\t\t\tv-model=\"model\"\r\n\t\t\t\t:name=\"uid\"\r\n\t\t\t\ttype=\"radio\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t['top-unvisible']: true,\r\n\t\t\t\t}\"\r\n\t\t\t\t:value=\"item.value\"\r\n\t\t\t\t:disabled=\"item.disabled\"\r\n\t\t\t/>\r\n\t\t</label>\r\n\t</div>\r\n</template>\r\n\r\n<style>\r\n@import \"./styles/top-scrollBar.css\";\r\n\r\n.top-radioGroup {\r\n\tuser-select: none;\r\n\tbox-sizing: border-box;\r\n\tborder-radius: 8px;\r\n\tbackground-color: var(--color-layout-middle);\r\n\theight: var(--top-forms-base-height);\r\n\tpadding: 2px;\r\n\tgap: 2px;\r\n\tdisplay: flex;\r\n\talign-items: flex-start;\r\n}\r\n\r\n.top-radioGroup_item {\r\n\tcolor: var(--color-text-2);\r\n\tcursor: pointer;\r\n\tbox-sizing: border-box;\r\n\tborder-radius: 6px;\r\n\theight: calc(var(--top-forms-base-height) - 4px);\r\n\tpadding: 0 16px;\r\n\tfont-weight: 400;\r\n\twhite-space: nowrap;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tflex-grow: 1;\r\n\tgap: 4px;\r\n}\r\n\r\n.top-radioGroup_item:hover {\r\n\tbackground-color: var(--color-layout-front-1);\r\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\r\n}\r\n\r\n/* selected */\r\n.top-radioGroup_item-selected {\r\n\tcolor: var(--color-text-1);\r\n\tpointer-events: none;\r\n\tbackground-color: var(--color-bg-lightning-1);\r\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\r\n}\r\n\r\n/* circle */\r\n.top-radioGroup_circle {\r\n\tcontent: \"\";\r\n\tbox-sizing: border-box;\r\n\tborder: 1px solid var(--color-line-3-opacity);\r\n\tborder-radius: 50%;\r\n\tpadding: 3px;\r\n\tmargin-left: auto;\r\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\r\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\r\n}\r\n\r\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\r\n\tborder-color: var(--color-line-primary-1);\r\n}\r\n\r\n/* circle selected */\r\n.top-radioGroup_item-selected .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-primary-1);\r\n\tborder-width: 5px;\r\n}\r\n\r\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-primary-1);\r\n}\r\n\r\n/* top-error */\r\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\r\n\tborder-color: var(--color-line-negative-1);\r\n}\r\n</style>\r\n","import type { Ref } from 'vue';\r\nimport { ref } from 'vue';\r\nimport { debounce } from '@/core/utils/lodash';\r\nimport type { Item, Props } from './selector2';\r\n\r\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\r\n\t/**\r\n\t * Список, полученный через API\r\n\t */\r\n\tconst items: Ref<Array<Item>> = ref([]);\r\n\r\n\t/**\r\n\t * Флаг - идет загрузка\r\n\t */\r\n\tconst isLoading = ref(false);\r\n\r\n\tlet _searchText = '';\r\n\tlet _nextOffset: number | undefined;\r\n\r\n\tif (apiRequest && !apiRequest.params.limit) {\r\n\t\tapiRequest.params.limit = 100;\r\n\t}\r\n\r\n\t/**\r\n\t * Выполнить обращение к API\r\n\t *\r\n\t * При ошибке вернет undefined\r\n\t */\r\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Array<Item> } | undefined> => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tlet res;\r\n\t\tlet cacheKey;\r\n\r\n\t\tif (useCache) {\r\n\t\t\t// кэш для полученных ответов через apiRequest\r\n\t\t\t// общий для всех компонентов, использующих apiRequest\r\n\t\t\tapiRequest.cache ??= new Map();\r\n\r\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\r\n\t\t\tres = apiRequest.cache.get(cacheKey);\r\n\r\n\t\t\tif (res) {\r\n\t\t\t\treturn res;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tisLoading.value = true;\r\n\t\tres = await apiRequest.call();\r\n\t\tisLoading.value = false;\r\n\r\n\t\tif (res.errors) return;\r\n\r\n\t\tif (!Array.isArray(res.result)) {\r\n\t\t\tconsole.warn(`В result ожидался массив`);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\r\n\t\tif (indexWithError !== -1) {\r\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (useCache) {\r\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\r\n\t\t}\r\n\r\n\t\treturn res;\r\n\t};\r\n\r\n\t/**\r\n\t * Загрузить items\r\n\t */\r\n\tconst load = async () => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tapiRequest.params.offset = 0;\r\n\t\tapiRequest.params.search = _searchText;\r\n\r\n\t\tconst res = await callAPIRequest();\r\n\t\tif (!res) return;\r\n\r\n\t\t_nextOffset = res.nextOffset;\r\n\r\n\t\titems.value = res.result;\r\n\t};\r\n\r\n\t/**\r\n\t * Загрузить следующую страницу items\r\n\t */\r\n\tconst loadAppend = async () => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\t// данных о следующих страницах не обнаружено\r\n\t\tif (!_nextOffset) return;\r\n\r\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\r\n\t\tif (isLoading.value) return;\r\n\r\n\t\tapiRequest.params.offset = _nextOffset;\r\n\t\tapiRequest.params.search = _searchText;\r\n\r\n\t\tconst res = await callAPIRequest();\r\n\t\tif (!res) return;\r\n\r\n\t\t_nextOffset = res.nextOffset;\r\n\r\n\t\titems.value = items.value.concat(res.result);\r\n\t};\r\n\r\n\tconst loadDebounce = debounce(() => load(), 200);\r\n\r\n\t/**\r\n\t * Выполнить поиск по указанному тексту\r\n\t *\r\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\r\n\t *\r\n\t * Если текст не изменился, поиск не будет проивзеден\r\n\t * @param searchText - текст поиска\r\n\t * @param useDebounce - отложенное выполнение поиска\r\n\t */\r\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\r\n\t\tif (!apiRequest) return;\r\n\r\n\t\tif (searchText.length < minLength) return;\r\n\r\n\t\t// условия поиска не поменялись, данные загружены\r\n\t\tif (searchText === _searchText && items.value.length) return;\r\n\r\n\t\t_searchText = searchText;\r\n\r\n\t\tif (useDebounce) {\r\n\t\t\tloadDebounce();\r\n\t\t} else {\r\n\t\t\tvoid load();\r\n\t\t}\r\n\t};\r\n\r\n\treturn {\r\n\t\titems,\r\n\t\tisLoading,\r\n\t\tloadAppend,\r\n\t\tsetSearchTextAndLoad,\r\n\t};\r\n};\r\n","<script setup lang=\"ts\">\r\nimport type { ComputedRef, ModelRef, ComponentInstance } from 'vue';\r\nimport { computed, ref, watch } from 'vue';\r\nimport Core from '@/core/core/core';\r\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\r\nimport { useI18n } from '@/core/plugins/i18n';\r\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\r\nimport type PopupClass from '@/components/popup/lib/popup';\r\nimport type { Item, Props, Slots } from './selector2';\r\nimport { useAPI } from './api';\r\nimport Selector2ItemMulti from './itemMulti.vue';\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n\titems: () => [] as Array<Item>,\r\n\tsize: 's',\r\n\tminLength: 0,\r\n\tshowSelectedInInput: true,\r\n});\r\n\r\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\r\n\r\ndefineSlots<Slots>();\r\n\r\n/**\r\n * Текст поиска по результатам\r\n */\r\nconst searchText = ref('');\r\n\r\nconst itemAll = {\r\n\tid: 0,\r\n\tname: useI18n().Common.All!,\r\n};\r\n\r\n/**\r\n * Экземпляр компонента Popup\r\n */\r\nconst popupRef = ref<ComponentInstance<typeof TopPopup> | null>(null);\r\n\r\n/**\r\n * Основной элемент селектора\r\n */\r\nconst elRef = ref<HTMLElement | null>(null);\r\n\r\n/**\r\n * Получить доступ к объекту popup\r\n */\r\nconst getPopup = (): PopupClass | undefined => {\r\n\treturn popupRef.value?.popup;\r\n};\r\n\r\n// для storybook\r\nif ((window as any).__STORYBOOK_PREVIEW__ && !props.modelValue) {\r\n\twatch(\r\n\t\t() => props.multiselect,\r\n\t\t() => {\r\n\t\t\tmodel.value = props.multiselect ? [] : { id: null, name: '' };\r\n\t\t},\r\n\t\t{ immediate: true },\r\n\t);\r\n}\r\n\r\nconst API = useAPI(props.apiRequest, props.minLength, props.useCache);\r\n\r\n/**\r\n * Варианты выбора: props.items + \"Выбрать все\"\r\n */\r\nconst localItems: ComputedRef<Array<Item>> = computed(() => {\r\n\tconst items: Array<Item> = [];\r\n\r\n\tif (!props.multiselect && props.appendAllValue) {\r\n\t\titems.push(itemAll);\r\n\t}\r\n\r\n\tprops.items.forEach(item => items.push({ ...item }));\r\n\r\n\treturn items;\r\n});\r\n\r\n/**\r\n * Проверить, что элемент выбран\r\n */\r\nconst isSelected = (item: Item, checkNameForNullId = true) => {\r\n\tif (checkNameForNullId && item.id === null) {\r\n\t\tif (Array.isArray(model.value)) {\r\n\t\t\treturn model.value.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\r\n\t\t} else {\r\n\t\t\treturn item.name === model.value.name;\r\n\t\t}\r\n\t}\r\n\r\n\tif (Array.isArray(model.value)) {\r\n\t\treturn model.value.some(itemSelected => itemSelected.id === item.id);\r\n\t} else {\r\n\t\treturn item.id === model.value.id;\r\n\t}\r\n};\r\n\r\n/**\r\n * Варианты выбора, которые выводятся\r\n */\r\nconst itemsForShow = computed(() => {\r\n\tconst searchString = searchText.value.toLowerCase();\r\n\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\r\n\r\n\tlet items: typeof localItems.value = [];\r\n\r\n\tlocalItems.value.forEach((item) => {\r\n\t\tconst itemName = item.name.toLowerCase();\r\n\r\n\t\tif (\r\n\t\t\titem.id === Number(searchString) ||\r\n\t\t\titemName.includes(searchString) ||\r\n\t\t\titemName.includes(searchStringInvertKeyboard)\r\n\t\t) {\r\n\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\r\n\t\t\t\titems.unshift(item);\r\n\t\t\t} else {\r\n\t\t\t\titems.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\titems.push(...API.items.value);\r\n\r\n\tif (\r\n\t\tprops.appendSearchToResult &&\r\n\t\t!!searchText.value &&\r\n\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\r\n\t) {\r\n\t\titems.push({\r\n\t\t\tid: null,\r\n\t\t\tname: searchText.value,\r\n\t\t});\r\n\t}\r\n\r\n\tif (props.multiselect) {\r\n\t\titems = items.filter(item => !isSelected(item));\r\n\t}\r\n\r\n\treturn items;\r\n});\r\n\r\n/**\r\n * Флаг - идет загрузка\r\n *\r\n * Скрывает вывод заглушки \"Нет результатов\" - для загрузки данных через API (multiselect = true) - (см. selectItem)\r\n */\r\nconst isLoading = ref(API.isLoading.value);\r\n\r\nwatch(API.isLoading, () => {\r\n\tisLoading.value = API.isLoading.value;\r\n});\r\n\r\n/**\r\n * Выбрать значение\r\n *\r\n * Управляет закрытием окна\r\n */\r\nconst selectItem = async (item: Item) => {\r\n\tif (props.multiselect) {\r\n\t\tif (!Array.isArray(model.value)) return;\r\n\r\n\t\tif (isSelected(item)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (props.apiRequest && searchText.value) {\r\n\t\t\tisLoading.value = true;\r\n\t\t}\r\n\r\n\t\tconst newModel = [...model.value];\r\n\t\tnewModel.push({ ...item });\r\n\t\tmodel.value = newModel;\r\n\r\n\t\tif (Core.state.isMobile) {\r\n\t\t\tgetPopup()?.close();\r\n\t\t} else {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tgetPopup()?.recalcPosition();\r\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\r\n\r\n\t\t\t\t// сбросить введенный текст, только если больше не найдено результатов\r\n\t\t\t\tif (searchText.value) {\r\n\t\t\t\t\tif (!itemsForShow.value.length) {\r\n\t\t\t\t\t\tsearchText.value = '';\r\n\t\t\t\t\t\tAPI.items.value = [];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (props.apiRequest) {\r\n\t\t\t\t\t\t\tisLoading.value = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else {\r\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\r\n\t\t\tmodel.value = { ...item };\r\n\t\t}\r\n\r\n\t\tgetPopup()?.close();\r\n\t}\r\n};\r\n\r\n/**\r\n * Выбрать следующее значение\r\n */\r\nconst selectNextItem = () => {\r\n\tif (!Array.isArray(model.value)) {\r\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\r\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\r\n\t\tmodel.value = { ...localItems.value[nextIndex] };\r\n\t}\r\n};\r\n\r\n/**\r\n * Удалить выбранное значение по id\r\n * @param id\r\n */\r\nconst deleteItemById = async (id: Item['id']) => {\r\n\tif (Array.isArray(model.value)) {\r\n\t\tmodel.value = model.value.filter(item => item.id !== id);\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tgetPopup()?.recalcPosition();\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst isOpened = ref(false); // флаг попап открыт\r\n\r\nif (props.apiRequest) {\r\n\twatch(isOpened, () => {\r\n\t\tif (isOpened.value) {\r\n\t\t\t// при открытии сразу выполнить поиск\r\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\r\n\t\t}\r\n\t});\r\n\r\n\t// отложенный поиск при вводе текста\r\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\r\n}\r\n\r\nconst onScrollContentList = (e: Event) => {\r\n\tconst el = e.target as HTMLElement;\r\n\r\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\r\n\t\tAPI.loadAppend();\r\n\t}\r\n};\r\n\r\nconst onClose = () => {\r\n\tisOpened.value = false;\r\n\r\n\telRef.value?.focus();\r\n\r\n\t// сбросить введенный текст\r\n\tif (searchText.value) {\r\n\t\tsearchText.value = '';\r\n\t\tAPI.items.value = [];\r\n\t}\r\n};\r\n</script>\r\n\r\n<template>\r\n\t<TopPopup\r\n\t\tref=\"popupRef\"\r\n\t\t@open=\"isOpened = true\"\r\n\t\t@close=\"onClose()\"\r\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\r\n\t\t:notch=\"false\"\r\n\t\t:transitionDuration=\"0\"\r\n\t>\r\n\t\t<template #opener>\r\n\t\t\t<div\r\n\t\t\t\tref=\"elRef\"\r\n\t\t\t\tv-top-focus.onupdate=\"isError\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t'top-selector2' : true,\r\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\r\n\t\t\t\t\t['top-size_' + size]: true,\r\n\t\t\t\t\t['top-disabled']: disabled,\r\n\t\t\t\t\t['top-forms-focusable']: !disabled,\r\n\t\t\t\t\t['top-error']: isError,\r\n\t\t\t\t}\"\r\n\t\t\t\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\r\n\t\t\t\t@keydown.delete=\"model = []\"\r\n\t\t\t\ttabindex=\"0\"\r\n\t\t\t>\r\n\t\t\t\t<template v-if=\"multiselect\">\r\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\r\n\t\t\t\t\t\t<Selector2ItemMulti\r\n\t\t\t\t\t\t\tv-for=\"item of model as Array<Item>\"\r\n\t\t\t\t\t\t\t:id=\"item.id\"\r\n\t\t\t\t\t\t\t:name=\"item.name\"\r\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</template>\r\n\r\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\r\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\r\n\t\t\t\t</span>\r\n\r\n\t\t\t\t<span\r\n\t\t\t\t\tv-if=\"addChanger && !multiselect && localItems.length > 1 && !disabled\"\r\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\r\n\t\t\t\t\t@click.stop=\"selectNextItem\"\r\n\t\t\t\t></span>\r\n\t\t\t</div>\r\n\t\t</template>\r\n\r\n\t\t<template #widget>\r\n\t\t\t<TopPopupWidgetInput\r\n\t\t\t\ttitle=\"Поиск\"\r\n\t\t\t\ticon=\"\"\r\n\t\t\t\tv-model=\"searchText\"\r\n\t\t\t\t:isLoading=\"isLoading\"\r\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\r\n\t\t\t/>\r\n\t\t</template>\r\n\r\n\t\t<template #contentList>\r\n\t\t\t<TopPopupListItem\r\n\t\t\t\tv-for=\"item of itemsForShow\"\r\n\t\t\t\t:class=\"{\r\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.name === item.name\r\n\t\t\t\t}\"\r\n\t\t\t\t:key=\"item.id ?? undefined\"\r\n\t\t\t\t@click.stop=\"selectItem(item)\"\r\n\t\t\t>\r\n\t\t\t\t<slot\r\n\t\t\t\t\tv-if=\"$slots.item\"\r\n\t\t\t\t\tname=\"item\"\r\n\t\t\t\t\t:item=\"item\"\r\n\t\t\t\t></slot>\r\n\r\n\t\t\t\t<template\r\n\t\t\t\t\tv-else\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ item.name }}\r\n\t\t\t\t</template>\r\n\t\t\t</TopPopupListItem>\r\n\r\n\t\t\t<TopPopupListItem\r\n\t\t\t\tv-if=\"!isLoading && !itemsForShow.length\"\r\n\t\t\t\ttype=\"regular\"\r\n\t\t\t>\r\n\t\t\t\t{{ $i18n.Common.No_results }}\r\n\t\t\t</TopPopupListItem>\r\n\t\t</template>\r\n\t</TopPopup>\r\n</template>\r\n\r\n<style>\r\n.top-selector2 {\r\n\twidth: 180px;\r\n\tmin-height: var(--top-forms-base-height);\r\n\tbox-sizing: border-box;\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\toverflow: hidden;\r\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\r\n\tcolor: var(--top-forms-placeholder-color);\r\n\r\n\tborder-radius: var(--top-radius-2);\r\n\tborder: 1px solid var(--top-forms-border-color);\r\n\tbackground: var(--top-forms-background-color);\r\n}\r\n\r\n.top-selector2-multiselect {\r\n\twidth: unset;\r\n\tmin-width: 180px;\r\n\tpadding: var(--top-padding-1);\r\n}\r\n\r\n.top-selector2.top-active {\r\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\r\n}\r\n\r\n.top-selector2_activeItems {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\tgap: var(--top-padding-1);\r\n\tmax-width: 100%;\r\n}\r\n\r\n.top-selector2_activeName {\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.top-changer-selector {\r\n\ttransform: translateX(-16px);\r\n}\r\n</style>\r\n","import type { ComponentCustomProps } from 'vue';\r\n\r\nimport EditArea from './editArea/editArea.vue';\r\nimport EditInput from './editInput/editInput.vue';\r\nimport RadioGroup from './radioGroup/radioGroup.vue';\r\nimport Selector2 from './selector2/selector2.vue';\r\nimport Menu from './menu/menu.vue';\r\nimport Info from './info/info.vue';\r\n\r\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\r\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\r\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\r\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\r\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\r\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\r\n"],"names":["isChanged","vue","localValue","props","cancelBtnText","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","items","isLoading","_nextOffset","apiRequest","res","cacheKey","indexWithError","_searchText","callAPIRequest","loadAppend","searchText","minLength","loadDebounce","forms","popupRef","API","useAPI","localItems","itemAll","itemSelected","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","isSelected","selectItem","newModel","getPopup","nextIndex","deleteItemById","id","isOpened","onScrollContentList","e","el","TopEditArea","_sfc_main$5","TopEditInput","_sfc_main$4","TopRadioGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main"],"mappings":"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"}