@topvisor/ui 1.0.35 → 1.0.36

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 (197) hide show
  1. package/.chunks/{core-DipMf5fL.es.js → core-CO5q-OhH.es.js} +13 -12
  2. package/.chunks/core-CO5q-OhH.es.js.map +1 -0
  3. package/.chunks/core-D-ONEIDC.amd.js +2 -0
  4. package/.chunks/{core-DipMf5fL.es.js.map → core-D-ONEIDC.amd.js.map} +1 -1
  5. package/.chunks/{datepicker-CkmL14DR.amd.js → datepicker-BKWD8N4r.amd.js} +2 -2
  6. package/.chunks/{datepicker-CkmL14DR.amd.js.map → datepicker-BKWD8N4r.amd.js.map} +1 -1
  7. package/.chunks/{datepicker-CSXTkKbz.es.js → datepicker-BfPUBUE1.es.js} +2 -2
  8. package/.chunks/{datepicker-CSXTkKbz.es.js.map → datepicker-BfPUBUE1.es.js.map} +1 -1
  9. package/.chunks/{dialog_selectorRegions-DrwLBBcE.es.js → dialog_selectorRegions-D3CnPt4V.es.js} +4 -4
  10. package/.chunks/{dialog_selectorRegions-DrwLBBcE.es.js.map → dialog_selectorRegions-D3CnPt4V.es.js.map} +1 -1
  11. package/.chunks/{dialog_selectorRegions-UF09pD6-.amd.js → dialog_selectorRegions-DYPTw--e.amd.js} +2 -2
  12. package/.chunks/{dialog_selectorRegions-UF09pD6-.amd.js.map → dialog_selectorRegions-DYPTw--e.amd.js.map} +1 -1
  13. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-Dvauzr0y.amd.js → dialogs.vue_vue_type_script_setup_true_lang-C5vfO9ia.amd.js} +2 -2
  14. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-Dvauzr0y.amd.js.map → dialogs.vue_vue_type_script_setup_true_lang-C5vfO9ia.amd.js.map} +1 -1
  15. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-jCRcr8b0.es.js → dialogs.vue_vue_type_script_setup_true_lang-CEkc3TYu.es.js} +2 -2
  16. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-jCRcr8b0.es.js.map → dialogs.vue_vue_type_script_setup_true_lang-CEkc3TYu.es.js.map} +1 -1
  17. package/.chunks/{forms-DvEX_A0C.amd.js → forms-DPIu5wcK.amd.js} +3 -3
  18. package/.chunks/{forms-DvEX_A0C.amd.js.map → forms-DPIu5wcK.amd.js.map} +1 -1
  19. package/.chunks/{forms-gknXHfMr.es.js → forms-YZl4XC4S.es.js} +300 -280
  20. package/.chunks/{forms-gknXHfMr.es.js.map → forms-YZl4XC4S.es.js.map} +1 -1
  21. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-CFOaqhEN.es.js → listItem.vue_vue_type_script_setup_true_lang-CDrG3onO.es.js} +2 -2
  22. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-CFOaqhEN.es.js.map → listItem.vue_vue_type_script_setup_true_lang-CDrG3onO.es.js.map} +1 -1
  23. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DzidIHjH.amd.js → listItem.vue_vue_type_script_setup_true_lang-CTbTjIda.amd.js} +2 -2
  24. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DzidIHjH.amd.js.map → listItem.vue_vue_type_script_setup_true_lang-CTbTjIda.amd.js.map} +1 -1
  25. package/.chunks/{menu.vue_vue_type_style_index_0_lang-Di2dBh6s.es.js → menu.vue_vue_type_style_index_0_lang-2vtQvU8o.es.js} +2 -2
  26. package/.chunks/{menu.vue_vue_type_style_index_0_lang-BTEBvb7v.amd.js.map → menu.vue_vue_type_style_index_0_lang-2vtQvU8o.es.js.map} +1 -1
  27. package/.chunks/{menu.vue_vue_type_style_index_0_lang-BTEBvb7v.amd.js → menu.vue_vue_type_style_index_0_lang-QsJS5sEm.amd.js} +2 -2
  28. package/.chunks/menu.vue_vue_type_style_index_0_lang-QsJS5sEm.amd.js.map +1 -0
  29. package/.chunks/{notice-CNEYYEEf.amd.js → notice-CwPCnQ9k.amd.js} +2 -2
  30. package/.chunks/{notice-CNEYYEEf.amd.js.map → notice-CwPCnQ9k.amd.js.map} +1 -1
  31. package/.chunks/{notice-B1bqWjOr.es.js → notice-CysocnDZ.es.js} +2 -2
  32. package/.chunks/{notice-B1bqWjOr.es.js.map → notice-CysocnDZ.es.js.map} +1 -1
  33. package/.chunks/{page.vue_vue_type_script_setup_true_lang-rQWGIFXD.es.js → page.vue_vue_type_script_setup_true_lang-DOTfcVUC.es.js} +4 -4
  34. package/.chunks/{page.vue_vue_type_script_setup_true_lang-rQWGIFXD.es.js.map → page.vue_vue_type_script_setup_true_lang-DOTfcVUC.es.js.map} +1 -1
  35. package/.chunks/{page.vue_vue_type_script_setup_true_lang-Z_tJYuPX.amd.js → page.vue_vue_type_script_setup_true_lang-vzWb9Ehr.amd.js} +2 -2
  36. package/.chunks/{page.vue_vue_type_script_setup_true_lang-Z_tJYuPX.amd.js.map → page.vue_vue_type_script_setup_true_lang-vzWb9Ehr.amd.js.map} +1 -1
  37. package/.chunks/{popup-B62kTGwH.es.js → popup-Cbr1ckCd.es.js} +2 -2
  38. package/.chunks/{popup-B62kTGwH.es.js.map → popup-Cbr1ckCd.es.js.map} +1 -1
  39. package/.chunks/{popup-sy_pGJeq.amd.js → popup-DdvupIju.amd.js} +2 -2
  40. package/.chunks/{popup-sy_pGJeq.amd.js.map → popup-DdvupIju.amd.js.map} +1 -1
  41. package/.chunks/{utils-CIbDLh5d.es.js → utils-ASIXzycS.es.js} +3 -3
  42. package/.chunks/{utils-CIbDLh5d.es.js.map → utils-ASIXzycS.es.js.map} +1 -1
  43. package/.chunks/{utils-DnAJ2MaK.es.js → utils-Bjl0RkKM.es.js} +2 -2
  44. package/.chunks/{utils-DnAJ2MaK.es.js.map → utils-Bjl0RkKM.es.js.map} +1 -1
  45. package/.chunks/{utils-abiX7BcR.amd.js → utils-CkpzFGzD.amd.js} +2 -2
  46. package/.chunks/{utils-abiX7BcR.amd.js.map → utils-CkpzFGzD.amd.js.map} +1 -1
  47. package/.chunks/{utils-CtUqTcmN.amd.js → utils-D_OVY7zV.amd.js} +2 -2
  48. package/.chunks/{utils-CtUqTcmN.amd.js.map → utils-D_OVY7zV.amd.js.map} +1 -1
  49. package/assets/forms.css +1 -1
  50. package/charts/charts.amd.js +1 -1
  51. package/charts/charts.amd.js.map +1 -1
  52. package/charts/charts.js +1 -1
  53. package/charts/charts.js.map +1 -1
  54. package/components/charts/miniChart/miniChart.vue.d.ts +1 -1
  55. package/components/charts/miniCharts/miniCharts.d.ts +1 -1
  56. package/components/charts/miniCharts/miniCharts.vue.d.ts +1 -1
  57. package/components/charts/miniCharts/stories/dummy.d.ts +1 -1
  58. package/components/forms/avatar/avatar.vue.d.ts +1 -1
  59. package/components/forms/caption/caption.vue.d.ts +17 -0
  60. package/components/forms/caption/types.d.ts +9 -0
  61. package/components/forms/checkbox/checkbox.vue.d.ts +1 -1
  62. package/components/forms/controlLabel/controlLabel.vue.d.ts +1 -1
  63. package/components/forms/forms.d.ts +2 -0
  64. package/components/forms/hint/hint.vue.d.ts +1 -1
  65. package/components/forms/input/input.vue.d.ts +1 -1
  66. package/components/forms/inputDate/inputDate.vue.d.ts +1 -1
  67. package/components/forms/inputDate/types.d.ts +1 -0
  68. package/components/forms/radio/radio.vue.d.ts +1 -1
  69. package/components/forms/select/select.vue.d.ts +1 -1
  70. package/components/forms/select/stories/exampleOptions.d.ts +1 -1
  71. package/components/forms/switcher/switcher.vue.d.ts +1 -1
  72. package/components/forms/textarea/textarea.vue.d.ts +1 -1
  73. package/components/forms/textarea/{textarea.d.ts → types.d.ts} +4 -0
  74. package/components/formsExt/checkboxGroup/checkboxGroup.vue.d.ts +1 -1
  75. package/components/formsExt/editArea/editArea.vue.d.ts +1 -1
  76. package/components/formsExt/editArea/{editArea.d.ts → types.d.ts} +1 -1
  77. package/components/formsExt/editInput/editInput.vue.d.ts +1 -1
  78. package/components/formsExt/editInput/{editInput.d.ts → types.d.ts} +1 -1
  79. package/components/formsExt/menu/menu.vue.d.ts +1 -1
  80. package/components/formsExt/menu/stories/items.d.ts +1 -1
  81. package/components/formsExt/radioGroup/radioGroup.vue.d.ts +1 -1
  82. package/components/formsExt/selector2/{api.d.ts → composables/useAPI.d.ts} +15 -1
  83. package/components/formsExt/selector2/composables/useMenu.d.ts +12 -0
  84. package/components/formsExt/selector2/itemMulti.vue.d.ts +1 -1
  85. package/components/formsExt/selector2/selector2.vue.d.ts +3 -3
  86. package/components/formsExt/selector2/utils.d.ts +6 -0
  87. package/components/popup/alert/alert.vue.d.ts +2 -2
  88. package/components/popup/alert/{alert.d.ts → types.d.ts} +1 -1
  89. package/components/popup/confirm/confirm.vue.d.ts +2 -2
  90. package/components/popup/confirm/{confirm.d.ts → types.d.ts} +1 -1
  91. package/components/popup/lib/worker.d.ts +2 -2
  92. package/components/popup/popup/listItem.vue.d.ts +1 -1
  93. package/components/popup/popup/opener.vue.d.ts +1 -1
  94. package/components/popup/popup/popup.vue.d.ts +1 -1
  95. package/components/popup/popup/widgetInput.vue.d.ts +1 -1
  96. package/components/popup/prompt/prompt.vue.d.ts +2 -2
  97. package/components/popup/prompt/{prompt.d.ts → types.d.ts} +1 -1
  98. package/components/project/selectorCompetitors/composables.d.ts +1 -2
  99. package/components/project/selectorCompetitors/selectorCompetitors.vue.d.ts +1 -1
  100. package/components/project/selectorCompetitors/stories/items.d.ts +1 -1
  101. package/components/project/selectorCompetitors/{selectorCompetitors.d.ts → types.d.ts} +7 -0
  102. package/components/project/selectorRegion/composables/compare.d.ts +1 -1
  103. package/components/project/selectorRegion/composables/selectRegion.d.ts +2 -2
  104. package/components/project/selectorRegion/composables/selectSearcher.d.ts +2 -2
  105. package/components/project/selectorRegion/composables/selectorRegion.d.ts +2 -2
  106. package/components/project/selectorRegion/dialog_selectorRegions/types.d.ts +1 -1
  107. package/components/project/selectorRegion/selectorRegion.vue.d.ts +1 -1
  108. package/components/project/selectorRegion/stories/searchers.d.ts +1 -1
  109. package/components/project/selectorRegion/utils/consts.d.ts +1 -1
  110. package/components/project/selectorRegion/utils/utils.d.ts +1 -1
  111. package/components/project/tagSelector/popupOpener/types.d.ts +2 -0
  112. package/components/project/tagSelector/types.d.ts +2 -0
  113. package/components/project/tagSelector/utils/el.d.ts +1 -1
  114. package/components/tabs/tabs/content.vue.d.ts +1 -1
  115. package/components/tabs/tabs/tab.vue.d.ts +1 -1
  116. package/components/tabs/tabs/tabs.vue.d.ts +1 -1
  117. package/components/tabsView/tabsView/menu.vue.d.ts +1 -1
  118. package/components/tabsView/tabsView/menuItem.vue.d.ts +1 -1
  119. package/components/tabsView/tabsView/menuTitle.vue.d.ts +1 -1
  120. package/components/tabsView/tabsView/store.d.ts +12 -0
  121. package/components/tabsView/tabsView/tabsView.vue.d.ts +1 -1
  122. package/core/app.amd.js +1 -1
  123. package/core/app.js +5 -5
  124. package/core/utils/store.d.ts +1 -1
  125. package/dialog/dialog.amd.js +1 -1
  126. package/dialog/dialog.js +2 -2
  127. package/forms/forms.amd.js +1 -1
  128. package/forms/forms.js +8 -7
  129. package/formsExt/formsExt.amd.js +1 -1
  130. package/formsExt/formsExt.amd.js.map +1 -1
  131. package/formsExt/formsExt.js +310 -309
  132. package/formsExt/formsExt.js.map +1 -1
  133. package/icomoon/Topvisor icons.json +82 -36
  134. package/icomoon/demo.html +29 -1
  135. package/icomoon/fonts/Topvisor-2.eot +0 -0
  136. package/icomoon/fonts/Topvisor-2.svg +2 -0
  137. package/icomoon/fonts/Topvisor-2.ttf +0 -0
  138. package/icomoon/fonts/Topvisor-2.woff +0 -0
  139. package/icomoon/selection.json +1 -1
  140. package/icomoon/style.css +11 -5
  141. package/layout/layout.amd.js +1 -1
  142. package/layout/layout.js +1 -1
  143. package/package.json +1 -1
  144. package/popup/popup.amd.js +1 -1
  145. package/popup/popup.amd.js.map +1 -1
  146. package/popup/popup.js +2 -2
  147. package/popup/popup.js.map +1 -1
  148. package/popup/worker.amd.js +1 -1
  149. package/popup/worker.amd.js.map +1 -1
  150. package/popup/worker.js +3 -3
  151. package/popup/worker.js.map +1 -1
  152. package/project/project.amd.js +1 -1
  153. package/project/project.amd.js.map +1 -1
  154. package/project/project.js +244 -241
  155. package/project/project.js.map +1 -1
  156. package/tabsView/tabsView.amd.js +1 -1
  157. package/tabsView/tabsView.amd.js.map +1 -1
  158. package/tabsView/tabsView.js +1 -1
  159. package/tabsView/tabsView.js.map +1 -1
  160. package/utils/clipboard.amd.js +1 -1
  161. package/utils/clipboard.js +1 -1
  162. package/utils/date.amd.js +1 -1
  163. package/utils/date.js +1 -1
  164. package/utils/device.amd.js +1 -1
  165. package/utils/device.js +1 -1
  166. package/utils/lodash.amd.js +1 -1
  167. package/utils/lodash.js +1 -1
  168. package/utils/price.amd.js +1 -1
  169. package/utils/price.js +1 -1
  170. package/utils/searchers.amd.js +1 -1
  171. package/utils/searchers.js +3 -3
  172. package/utils/string.amd.js +1 -1
  173. package/utils/string.amd.js.map +1 -1
  174. package/utils/string.js +1 -1
  175. package/utils/string.js.map +1 -1
  176. package/.chunks/core-MEpuX1uJ.amd.js +0 -2
  177. package/.chunks/core-MEpuX1uJ.amd.js.map +0 -1
  178. package/.chunks/menu.vue_vue_type_style_index_0_lang-Di2dBh6s.es.js.map +0 -1
  179. package/components/forms/inputDate/inputDate.d.ts +0 -3
  180. package/components/project/selectorCompetitors/types/competitor.d.ts +0 -7
  181. /package/components/charts/miniChart/{miniChart.d.ts → types.d.ts} +0 -0
  182. /package/components/forms/avatar/{avatar.d.ts → types.d.ts} +0 -0
  183. /package/components/forms/checkbox/{checkbox.d.ts → types.d.ts} +0 -0
  184. /package/components/forms/controlLabel/{controlLabel.d.ts → types.d.ts} +0 -0
  185. /package/components/forms/hint/{hint.d.ts → types.d.ts} +0 -0
  186. /package/components/forms/input/{input.d.ts → types.d.ts} +0 -0
  187. /package/components/forms/inputRange/{inputRange.d.ts → types.d.ts} +0 -0
  188. /package/components/forms/radio/{radio.d.ts → types.d.ts} +0 -0
  189. /package/components/forms/select/{select.d.ts → types.d.ts} +0 -0
  190. /package/components/forms/switcher/{switcher.d.ts → types.d.ts} +0 -0
  191. /package/components/formsExt/menu/{menu.d.ts → types.d.ts} +0 -0
  192. /package/components/formsExt/radioGroup/{radioGroup.d.ts → types.d.ts} +0 -0
  193. /package/components/formsExt/selector2/{selector2.d.ts → types.d.ts} +0 -0
  194. /package/components/popup/popup/{popup.d.ts → types.d.ts} +0 -0
  195. /package/components/project/selectorRegion/{selectorRegion.d.ts → types.d.ts} +0 -0
  196. /package/components/tabs/tabs/{tabs.d.ts → types.d.ts} +0 -0
  197. /package/components/tabsView/tabsView/{tabsView.d.ts → types.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { PropsContent } from './tabs';
1
+ import { PropsContent } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
3
  declare function __VLS_template(): {
4
4
  attrs: Partial<{}>;
@@ -1,4 +1,4 @@
1
- import { PropsTab } from './tabs';
1
+ import { PropsTab } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
3
  declare function __VLS_template(): {
4
4
  attrs: Partial<{}>;
@@ -1,4 +1,4 @@
1
- import { Props } from './tabs';
1
+ import { Props } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
3
  declare function __VLS_template(): {
4
4
  attrs: Partial<{}>;
@@ -1,4 +1,4 @@
1
- import { PropsMenu } from './tabsView';
1
+ import { PropsMenu } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
3
  type __VLS_Props = PropsMenu;
4
4
  type __VLS_PublicProps = {
@@ -1,4 +1,4 @@
1
- import { PropsMenuItem } from './tabsView';
1
+ import { PropsMenuItem } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, Component, ComponentProvideOptions } from 'vue';
3
3
  declare function __VLS_template(): {
4
4
  attrs: Partial<{}>;
@@ -1,4 +1,4 @@
1
- import { PropsMenuTitle } from './tabsView';
1
+ import { PropsMenuTitle } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
3
  declare function __VLS_template(): {
4
4
  attrs: Partial<{}>;
@@ -0,0 +1,12 @@
1
+ import { InjectionKey, ModelRef, UnwrapNestedRefs } from 'vue';
2
+ import { Store as DefineStore } from '../../../core/utils/store';
3
+ import { Props, Store } from './types';
4
+ export declare const injectionKey: InjectionKey<Store>;
5
+ /**
6
+ * Инициировать Store компонента
7
+ */
8
+ export declare const defineTabsStore: (props: Props, model: ModelRef<string | undefined>) => UnwrapNestedRefs<Store> & DefineStore;
9
+ /**
10
+ * Получить Store компонента
11
+ */
12
+ export declare const useTabsStore: () => Store & DefineStore;
@@ -1,4 +1,4 @@
1
- import { Props } from './tabsView';
1
+ import { Props } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
3
  type __VLS_Props = Props;
4
4
  type __VLS_PublicProps = {
package/core/app.amd.js CHANGED
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms-DvEX_A0C.amd","../.chunks/core-MEpuX1uJ.amd","vue","../utils/clipboard.amd","../utils/string.amd","../utils/route.amd","../.chunks/utils-CtUqTcmN.amd","../.chunks/dialogs.vue_vue_type_script_setup_true_lang-Dvauzr0y.amd"],function(y,n,c,l,d,m,S,p,g,k){"use strict";if(typeof d>"u")var d=window.Vue;class E{#s;#t;#e;#i;#c;#a=[];#o=[];#n=[];#r=[];constructor(s){var t;this.#t=s.store,this.#s=this.#t.$id,this.#e=s.options.Page,this.#i=s.options.user,this.#c=s.options.Api,this.#a=s.options.tpaNamesUrlHash||[],this.#o=s.options.tpaNamesStorage||[],this.#n=s.options.tpaNamesStorageLocal||[],this.#r=s.options.tpaNamesGuestLink||[],s.store.genGuestLink=(i,a)=>this.genGuestLink(i,a),(t=this.#i.guest_data)!=null&&t.data||(this.#u(),this.#u(!0),this.#l()),this.#S(),this.#k();const e=c.debounce(()=>{this.#m(),this.#p(),this.#p(!0)});s.store.$subscribe(e)}async genGuestLink(s,e){const t=this.#g();e=Object.assign(e,Object.fromEntries(t));const i=await this.#c.gen(s,"fetchColumn").call({},e);i!=null&&i.errors||await m.guestLinkToClipboard(i.result)}#g(){const s=new Map;return this.#r.forEach(e=>{const t=S.camelToSnakeCase(e);s.set(t,this.#t[e])}),s}#h(s){s.forEach((e,t)=>{const i=this.#t[t];if(e!=null&&i!==void 0&&e!=null&&e.constructor&&e.constructor===i.constructor){if(t.indexOf("date")===0&&!Array.isArray(e)){if(typeof e=="string"&&!/\d\d\d\d-\d\d-\d\d/.test(e))return}this.#t[t]=e}})}#f(s){const e=new Map;return s.forEach((t,i)=>{t!==null&&(t=JSON.stringify(t),e.set(i,t))}),e}#d(s){const e=new Map;return s.forEach((t,i)=>{if(!(t==null||t==="false")){try{if(typeof t=="string"&&!/^\d\d\d\d-\d\d-\d\d$/.test(t)&&(t=JSON.parse(t)),t==null||t==="false")return}catch{}e.set(i,t)}}),e}#l(){let s;try{s=JSON.parse(p.getHash(this.#s))}catch{}if(!s)return;const e=new Map;this.#a.forEach(t=>{const i=s[t];i&&e.set(t,i)}),this.#h(e)}#m(){const s=new Map;this.#a.forEach(i=>{const a=this.#t[i];s.set(i,a)});const e=Object.fromEntries(s),t=JSON.stringify(e);p.setHash(this.#s,t)}#u(s=!1){const e=new Map;let t=this.#o,i="state:"+this.#s;s&&(t=this.#n,i="state:"+this.#s+":"+location.pathname),t.forEach(o=>{const r=localStorage.getItem(i+":"+o);e.set(o,r)});const a=this.#d(e);this.#h(a)}#p(s=!1){const e=new Map;let t=this.#o,i="state:"+this.#s;s&&(t=this.#n,i="state:"+this.#s+":"+location.pathname),t.forEach(o=>{const r=this.#t[o];e.set(o,r)});const a=this.#f(e);t.forEach(o=>{const r=a.get(o);localStorage.setItem(i+":"+o,r)})}#S(){var a,o,r;const s=(o=(a=this.#i)==null?void 0:a.guest_data)==null?void 0:o.data;if(!s)return;this.#i.id===-1&&(this.#i.positionsReverseDates=s.positionsReverseDates);const e=new Map;this.#r.forEach(h=>{const u=s[h];e.set(h,u)});const t=this.#d(e);this.#h(t);const i=$(".mod_guest_title");if(((r=this.#t.competitorsIds)==null?void 0:r.length)===1&&this.#e.page.data.competitors){let h=this.#e.page.data.competitors.filter(u=>u.id===s.competitorsIds[0]);h.length&&($("a",i).attr("href","http://"+h[0].url),$("a",i).text(h[0].name))}}#k(){this.#t.regionsIndexes&&d.watch(this.#t.regionsIndexes,s=>{if(!s.length)return;s.forEach((i,a)=>s[a]=i);const e=TplProjectSelectorRegion.genSearchersMap(),t=[];e.forEach(i=>{i.regions.forEach(a=>{a.index!==-1&&t.push(a.index)})}),this.#t.regionsIndexes=s.filter(i=>t.includes(i))},{immediate:!0}),this.#t.competitorsIds&&d.watch(this.#t.competitorsIds,s=>{if(!s.length)return;s.forEach((t,i)=>s[i]=t);const e=[this.#e.page.data.project.id];this.#e.page.data.project.competitors.forEach(t=>{t.on>=0&&e.push(t.id)}),this.#t.competitorsIds=s.filter(t=>e.includes(t))},{immediate:!0})}}const w=f=>{var e,t,i,a;const s=f;!((e=s.options.tpaNamesUrlHash)!=null&&e.length)&&!((t=s.options.tpaNamesStorage)!=null&&t.length)&&!((i=s.options.tpaNamesStorageLocal)!=null&&i.length)&&!((a=s.options.tpaNamesGuestLink)!=null&&a.length)||new E(s)};n.Core=c.Core,n.i18nPlugin=c.i18n,n.useI18n=c.useI18n,n.useI18nLang=c.useI18nLang,n.corePlugin=l.core,n.useAsyncTopDialog=g.useAsyncTopDialog,n.useTopDialog=g.useTopDialog,n.TopDialogWorker=k.TopDialogWorker,n.piniaTPAPlugin=w,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/forms-DPIu5wcK.amd","../.chunks/core-D-ONEIDC.amd","vue","../utils/clipboard.amd","../utils/string.amd","../utils/route.amd","../.chunks/utils-D_OVY7zV.amd","../.chunks/dialogs.vue_vue_type_script_setup_true_lang-C5vfO9ia.amd"],function(y,n,c,l,d,m,S,p,g,k){"use strict";if(typeof d>"u")var d=window.Vue;class E{#s;#t;#e;#i;#c;#a=[];#o=[];#n=[];#r=[];constructor(s){var t;this.#t=s.store,this.#s=this.#t.$id,this.#e=s.options.Page,this.#i=s.options.user,this.#c=s.options.Api,this.#a=s.options.tpaNamesUrlHash||[],this.#o=s.options.tpaNamesStorage||[],this.#n=s.options.tpaNamesStorageLocal||[],this.#r=s.options.tpaNamesGuestLink||[],s.store.genGuestLink=(i,a)=>this.genGuestLink(i,a),(t=this.#i.guest_data)!=null&&t.data||(this.#u(),this.#u(!0),this.#l()),this.#S(),this.#k();const e=c.debounce(()=>{this.#m(),this.#p(),this.#p(!0)});s.store.$subscribe(e)}async genGuestLink(s,e){const t=this.#g();e=Object.assign(e,Object.fromEntries(t));const i=await this.#c.gen(s,"fetchColumn").call({},e);i!=null&&i.errors||await m.guestLinkToClipboard(i.result)}#g(){const s=new Map;return this.#r.forEach(e=>{const t=S.camelToSnakeCase(e);s.set(t,this.#t[e])}),s}#h(s){s.forEach((e,t)=>{const i=this.#t[t];if(e!=null&&i!==void 0&&e!=null&&e.constructor&&e.constructor===i.constructor){if(t.indexOf("date")===0&&!Array.isArray(e)){if(typeof e=="string"&&!/\d\d\d\d-\d\d-\d\d/.test(e))return}this.#t[t]=e}})}#f(s){const e=new Map;return s.forEach((t,i)=>{t!==null&&(t=JSON.stringify(t),e.set(i,t))}),e}#d(s){const e=new Map;return s.forEach((t,i)=>{if(!(t==null||t==="false")){try{if(typeof t=="string"&&!/^\d\d\d\d-\d\d-\d\d$/.test(t)&&(t=JSON.parse(t)),t==null||t==="false")return}catch{}e.set(i,t)}}),e}#l(){let s;try{s=JSON.parse(p.getHash(this.#s))}catch{}if(!s)return;const e=new Map;this.#a.forEach(t=>{const i=s[t];i&&e.set(t,i)}),this.#h(e)}#m(){const s=new Map;this.#a.forEach(i=>{const a=this.#t[i];s.set(i,a)});const e=Object.fromEntries(s),t=JSON.stringify(e);p.setHash(this.#s,t)}#u(s=!1){const e=new Map;let t=this.#o,i="state:"+this.#s;s&&(t=this.#n,i="state:"+this.#s+":"+location.pathname),t.forEach(o=>{const r=localStorage.getItem(i+":"+o);e.set(o,r)});const a=this.#d(e);this.#h(a)}#p(s=!1){const e=new Map;let t=this.#o,i="state:"+this.#s;s&&(t=this.#n,i="state:"+this.#s+":"+location.pathname),t.forEach(o=>{const r=this.#t[o];e.set(o,r)});const a=this.#f(e);t.forEach(o=>{const r=a.get(o);localStorage.setItem(i+":"+o,r)})}#S(){var a,o,r;const s=(o=(a=this.#i)==null?void 0:a.guest_data)==null?void 0:o.data;if(!s)return;this.#i.id===-1&&(this.#i.positionsReverseDates=s.positionsReverseDates);const e=new Map;this.#r.forEach(h=>{const u=s[h];e.set(h,u)});const t=this.#d(e);this.#h(t);const i=$(".mod_guest_title");if(((r=this.#t.competitorsIds)==null?void 0:r.length)===1&&this.#e.page.data.competitors){let h=this.#e.page.data.competitors.filter(u=>u.id===s.competitorsIds[0]);h.length&&($("a",i).attr("href","http://"+h[0].url),$("a",i).text(h[0].name))}}#k(){this.#t.regionsIndexes&&d.watch(this.#t.regionsIndexes,s=>{if(!s.length)return;s.forEach((i,a)=>s[a]=i);const e=TplProjectSelectorRegion.genSearchersMap(),t=[];e.forEach(i=>{i.regions.forEach(a=>{a.index!==-1&&t.push(a.index)})}),this.#t.regionsIndexes=s.filter(i=>t.includes(i))},{immediate:!0}),this.#t.competitorsIds&&d.watch(this.#t.competitorsIds,s=>{if(!s.length)return;s.forEach((t,i)=>s[i]=t);const e=[this.#e.page.data.project.id];this.#e.page.data.project.competitors.forEach(t=>{t.on>=0&&e.push(t.id)}),this.#t.competitorsIds=s.filter(t=>e.includes(t))},{immediate:!0})}}const w=f=>{var e,t,i,a;const s=f;!((e=s.options.tpaNamesUrlHash)!=null&&e.length)&&!((t=s.options.tpaNamesStorage)!=null&&t.length)&&!((i=s.options.tpaNamesStorageLocal)!=null&&i.length)&&!((a=s.options.tpaNamesGuestLink)!=null&&a.length)||new E(s)};n.Core=c.Core,n.i18nPlugin=c.i18n,n.useI18n=c.useI18n,n.useI18nLang=c.useI18nLang,n.corePlugin=l.core,n.useAsyncTopDialog=g.useAsyncTopDialog,n.useTopDialog=g.useTopDialog,n.TopDialogWorker=k.TopDialogWorker,n.piniaTPAPlugin=w,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=app.amd.js.map
package/core/app.js CHANGED
@@ -1,12 +1,12 @@
1
- import { d } from "../.chunks/forms-gknXHfMr.es.js";
2
- import { C as P, i as T, u as b, a as y } from "../.chunks/forms-gknXHfMr.es.js";
3
- import { c as G } from "../.chunks/core-DipMf5fL.es.js";
1
+ import { d } from "../.chunks/forms-YZl4XC4S.es.js";
2
+ import { C as P, i as T, u as b, a as y } from "../.chunks/forms-YZl4XC4S.es.js";
3
+ import { c as G } from "../.chunks/core-CO5q-OhH.es.js";
4
4
  import { watch as p } from "vue";
5
5
  import { guestLinkToClipboard as f } from "../utils/clipboard.js";
6
6
  import { camelToSnakeCase as g } from "../utils/string.js";
7
7
  import { getHash as m, setHash as l } from "../utils/route.js";
8
- import { u as A, a as D } from "../.chunks/utils-DnAJ2MaK.es.js";
9
- import { T as j } from "../.chunks/dialogs.vue_vue_type_script_setup_true_lang-jCRcr8b0.es.js";
8
+ import { u as A, a as D } from "../.chunks/utils-Bjl0RkKM.es.js";
9
+ import { T as j } from "../.chunks/dialogs.vue_vue_type_script_setup_true_lang-CEkc3TYu.es.js";
10
10
  class u {
11
11
  #s;
12
12
  #t;
@@ -3,4 +3,4 @@
3
3
  * @packageDocumentation
4
4
  */
5
5
  export { defineStore, useStore } from './store/store';
6
- export { default as plugin } from './store/store';
6
+ export { default as plugin, type Store } from './store/store';
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/page.vue_vue_type_script_setup_true_lang-Z_tJYuPX.amd","vue","../.chunks/utils-CtUqTcmN.amd"],function(c,n,u,e,t){"use strict";if(typeof e>"u")var e=window.Vue;const i={name:{type:String,required:!0},order:{type:Number,required:!0},prevName:String,footerFullWith:Boolean},l=e.defineComponent({__name:"pageComponent",props:{component:{},keepAlive:{type:Boolean,default:!0},props:{},name:{},order:{},prevName:{},footerFullWith:{type:Boolean}},setup(m){const a=m,r=t.useTopDialogSelf(),s=(o,p)=>{if(!p.value){if(o.name!=="AsyncComponentWrapper"){p.value=!0;return}r.needShowPage(a.name)&&(r.isLoadingPage.value=!0,o.__asyncResolved&&(p.value=!0,r.isLoadingPage.value=!1))}};if(a.component.name==="AsyncComponentWrapper"){const o=e.ref(!1);e.onUpdated(()=>{s(a.component,o)})}return(o,p)=>(e.openBlock(),e.createBlock(e.KeepAlive,{include:o.keepAlive?"":"none"},[e.unref(r).needShowPage(o.name)?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.component),e.mergeProps({key:0},a,{name:o.name,order:o.order,prevName:o.prevName}),null,16,["name","order","prevName"])):e.createCommentVNode("",!0)],1032,["include"]))}});n.TopDialog=u._sfc_main,n.TopDialogPage=u._sfc_main$1,n.useTopDialogSelf=t.useTopDialogSelf,n.TopDialogPageComponent=l,n.propsPageCommon=i,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/page.vue_vue_type_script_setup_true_lang-vzWb9Ehr.amd","vue","../.chunks/utils-D_OVY7zV.amd"],function(c,n,u,e,t){"use strict";if(typeof e>"u")var e=window.Vue;const i={name:{type:String,required:!0},order:{type:Number,required:!0},prevName:String,footerFullWith:Boolean},l=e.defineComponent({__name:"pageComponent",props:{component:{},keepAlive:{type:Boolean,default:!0},props:{},name:{},order:{},prevName:{},footerFullWith:{type:Boolean}},setup(m){const a=m,r=t.useTopDialogSelf(),s=(o,p)=>{if(!p.value){if(o.name!=="AsyncComponentWrapper"){p.value=!0;return}r.needShowPage(a.name)&&(r.isLoadingPage.value=!0,o.__asyncResolved&&(p.value=!0,r.isLoadingPage.value=!1))}};if(a.component.name==="AsyncComponentWrapper"){const o=e.ref(!1);e.onUpdated(()=>{s(a.component,o)})}return(o,p)=>(e.openBlock(),e.createBlock(e.KeepAlive,{include:o.keepAlive?"":"none"},[e.unref(r).needShowPage(o.name)?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.component),e.mergeProps({key:0},a,{name:o.name,order:o.order,prevName:o.prevName}),null,16,["name","order","prevName"])):e.createCommentVNode("",!0)],1032,["include"]))}});n.TopDialog=u._sfc_main,n.TopDialogPage=u._sfc_main$1,n.useTopDialogSelf=t.useTopDialogSelf,n.TopDialogPageComponent=l,n.propsPageCommon=i,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=dialog.amd.js.map
package/dialog/dialog.js CHANGED
@@ -1,6 +1,6 @@
1
- import { _ as k, a as B } from "../.chunks/page.vue_vue_type_script_setup_true_lang-rQWGIFXD.es.js";
1
+ import { _ as k, a as B } from "../.chunks/page.vue_vue_type_script_setup_true_lang-DOTfcVUC.es.js";
2
2
  import { defineComponent as l, ref as i, onUpdated as u, createBlock as a, openBlock as p, KeepAlive as s, createCommentVNode as d, unref as g, resolveDynamicComponent as c, mergeProps as f } from "vue";
3
- import { b as v } from "../.chunks/utils-DnAJ2MaK.es.js";
3
+ import { b as v } from "../.chunks/utils-Bjl0RkKM.es.js";
4
4
  const C = {
5
5
  name: {
6
6
  type: String,
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms-DvEX_A0C.amd"],function(o,T,e){"use strict";if(typeof a>"u")var a=window.Vue;T.TopAvatar=e.TopAvatar,T.TopButton=e.TopButton,T.TopCheckbox=e.TopCheckbox,T.TopControlLabel=e.TopControlLabel,T.TopHint=e.TopHint,T.TopInput=e.TopInput,T.TopInputDate=e.TopInputDate,T.TopInputRange=e.TopInputRange,T.TopLoadbar=e.TopLoadbar,T.TopPreloader=e.TopPreloader,T.TopRadio=e.TopRadio,T.TopSelect=e.TopSelect,T.TopSwitcher=e.TopSwitcher,T.TopTextarea=e.TopTextarea,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/forms-DPIu5wcK.amd"],function(o,T,a){"use strict";if(typeof e>"u")var e=window.Vue;T.TopAvatar=a.TopAvatar,T.TopButton=a.TopButton,T.TopCaption=a.TopCaption,T.TopCheckbox=a.TopCheckbox,T.TopControlLabel=a.TopControlLabel,T.TopHint=a.TopHint,T.TopInput=a.TopInput,T.TopInputDate=a.TopInputDate,T.TopInputRange=a.TopInputRange,T.TopLoadbar=a.TopLoadbar,T.TopPreloader=a.TopPreloader,T.TopRadio=a.TopRadio,T.TopSelect=a.TopSelect,T.TopSwitcher=a.TopSwitcher,T.TopTextarea=a.TopTextarea,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=forms.amd.js.map
package/forms/forms.js CHANGED
@@ -1,13 +1,14 @@
1
- import { T as p, g as T, h as s, j as t, k as e, l as r, m as n, n as l, o as u, x, p as b, q as c, r as d, s as h } from "../.chunks/forms-gknXHfMr.es.js";
1
+ import { T as p, g as T, W as s, h as t, j as e, k as r, l as n, m as l, n as i, o as u, x, p as b, q as c, r as d, s as h } from "../.chunks/forms-YZl4XC4S.es.js";
2
2
  export {
3
3
  p as TopAvatar,
4
4
  T as TopButton,
5
- s as TopCheckbox,
6
- t as TopControlLabel,
7
- e as TopHint,
8
- r as TopInput,
9
- n as TopInputDate,
10
- l as TopInputRange,
5
+ s as TopCaption,
6
+ t as TopCheckbox,
7
+ e as TopControlLabel,
8
+ r as TopHint,
9
+ n as TopInput,
10
+ l as TopInputDate,
11
+ i as TopInputRange,
11
12
  u as TopLoadbar,
12
13
  x as TopPreloader,
13
14
  b as TopRadio,
@@ -1,2 +1,2 @@
1
- define(["require","exports","vue","../.chunks/forms-DvEX_A0C.amd","../utils/keyboard.amd","../popup/popup.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-BTEBvb7v.amd","../require/css.amd!../assets/formsExt.css"],function(ae,g,e,B,S,V,A){"use strict";if(typeof e>"u")var e=window.Vue;const $={class:"top-editArea_footer"},N=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{}},emits:["submit","close","clickOnTitle"],setup(i,{emit:l}){const t=i,n=l,d=e.ref(t.defaultValue),a=e.ref(t.isFocused),m=e.computed(()=>d.value!==t.defaultValue),p=s=>{n("submit",s),d.value=t.defaultValue},v=()=>{if(t.forceShowCloseBtn&&!m.value){n("close");return}d.value=t.defaultValue},k=()=>{t.attachToKeyboard&&n("clickOnTitle")};return(s,y)=>(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:y[0]||(y[0]=u=>k())},e.toDisplayString(s.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-error":s.isError,"top-focus":a.value})},[e.createVNode(B._sfc_main$3,{modelValue:d.value,"onUpdate:modelValue":y[1]||(y[1]=u=>d.value=u),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:y[2]||(y[2]=()=>a.value=!0),onBlur:y[3]||(y[3]=()=>a.value=!1),onKeyup:[e.withKeys(v,["esc"]),y[4]||(y[4]=e.withKeys(e.withModifiers(u=>p(d.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",$,[m.value||s.forceShowCloseBtn?(e.openBlock(),e.createBlock(B._sfc_main,{key:0,icon:s.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:v},e.createSlots({_:2},[s.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),m.value?(e.openBlock(),e.createBlock(B._sfc_main,{key:1,class:"top-editArea_button",icon:s.$core.state.isMobile?"":"",onClick:y[5]||(y[5]=u=>p(d.value))},e.createSlots({_:2},[s.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),I={class:"top-editInput"},M=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(i,{emit:l}){const t=i,n=e.ref(t.modelValue);e.watch(e.toRef(t.modelValue),()=>{n.value=t.modelValue});const d=l,a=()=>{d("update:modelValue",n.value)};return(m,p)=>(e.openBlock(),e.createElementBlock("div",I,[e.createVNode(B._sfc_main$2,e.mergeProps(m.input,{onKeydownCapture:p[0]||(p[0]=e.withKeys(e.withModifiers(v=>n.value=m.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(a,["stop"]),["enter"]),modelValue:n.value,"onUpdate:modelValue":p[1]||(p[1]=v=>n.value=v)}),null,16,["onKeydown","modelValue"]),n.value!==m.modelValue?(e.openBlock(),e.createBlock(B._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},m.button,{onClick:a}),null,16)):e.createCommentVNode("",!0)]))}}),L=["data-top-icon","onClick"],z={key:0,class:"top-radioGroup_circle"},_=["value","disabled"],P=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const l=e.useModel(i,"modelValue"),t=i,n=e.ref(null);e.watch(l,()=>{var a,m,p,v,k;(a=t.radiosProps)!=null&&a.some(s=>s.value===l.value)||(l.value=((p=(m=t.radiosProps)==null?void 0:m[0])==null?void 0:p.value)??""),(k=(v=n.value)==null?void 0:v.querySelector(".radioGroup_item-selected"))==null||k.scrollIntoView()},{immediate:!0});const d="radioGroup-"+Math.random();return(a,m)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:n,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+a.size]:!!a.size,"top-error":a.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.radiosProps,p=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":p.value===l.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":p.disabled}),"data-top-icon":p.icon,onClick:v=>l.value=p.value},[e.createTextVNode(e.toDisplayString(p.title)+" ",1),a.showIndicator?(e.openBlock(),e.createElementBlock("span",z)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":m[0]||(m[0]=v=>l.value=v),name:d,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:p.value,disabled:p.disabled},null,8,_),[[e.vModelRadio,l.value]])],10,L))),256))],2))}}),K=["data-top-icon"],D=["value","checked","disabled","onChange"],G=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},styling:{default:"outline"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const l=e.useModel(i,"modelValue"),t=n=>{const d=[...l.value],a=d.indexOf(n);a===-1?d.push(n):d.splice(a,1),l.value=d};return(n,d)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-checkboxGroup":!0,["top-checkboxGroup-"+n.styling]:!0,"top-scrollBarXHidding":!0,["top-size_"+n.size]:!!n.size,"top-error":n.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.items,a=>(e.openBlock(),e.createElementBlock("label",{key:a.id,class:e.normalizeClass({"top-checkboxGroup_item":!0,"top-checkboxGroup_item-selected":l.value.includes(a.id),"top-forms-focusable":!0,"top-disabled":a.disabled}),"data-top-icon":a.icon},[e.createElementVNode("input",{type:"checkbox",class:"top-unvisible",value:a.id,checked:l.value.includes(a.id),disabled:a.disabled,onChange:m=>t(a.id)},null,40,D),e.createTextVNode(" "+e.toDisplayString(a.title),1)],10,K))),128))],2))}}),O=(i,l,t)=>{const n=e.ref([]),d=e.ref(!1);let a="",m;i&&!i.params.limit&&(i.params.limit=100);const p=async()=>{if(!i)return;let u,C;if(t&&(i.cache??=new Map,C=JSON.stringify(i.params),u=i.cache.get(C),u))return u;if(d.value=!0,u=await i.call(),d.value=!1,u.errors)return;if(!Array.isArray(u.result)){console.warn("В result ожидался массив");return}const b=u.result.findIndex(w=>w.id===void 0||w.name===void 0);if(b!==-1){console.warn(`В result[${b}] нет id или name`);return}return t&&i.cache.set(C,u),u},v=async()=>{if(!i)return;i.params.offset=0,i.params.search=a;const u=await p();u&&(m=u.nextOffset,n.value=u.result)},k=async()=>{if(!i||!m||d.value)return;i.params.offset=m,i.params.search=a;const u=await p();u&&(m=u.nextOffset,n.value=n.value.concat(u.result))},s=B.debounce(()=>v(),200);return{items:n,isLoading:d,loadAppend:k,setSearchTextAndLoad:(u,C=!0)=>{i&&(u.length<l||u===a&&n.value.length||(a=u,C?s():v()))}}},F={class:"top-selector2_itemMulti top-ellipsis"},H=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(i){return(l,t)=>(e.openBlock(),e.createElementBlock("div",F,[e.createTextVNode(e.toDisplayString(l.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:t[0]||(t[0]=n=>l.$emit("delete",l.id)),onMousedown:t[1]||(t[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),R={key:0,class:"top-selector2_activeItems"},U={key:1,class:"top-selector2_activeName top-ellipsis"},W=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},multiselect:{type:Boolean},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},placeholder:{},showSelectedInInput:{type:Boolean,default:!0},showSearch:{type:Boolean,default:!0}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const l=i,t=e.useModel(i,"modelValue"),n=e.ref(""),d=()=>{n.value="",k.items.value=[]},a={id:0,name:B.useI18n().Common.All},m=e.ref(null),p=e.ref(null),v=()=>{var o;return(o=m.value)==null?void 0:o.popup};window.__STORYBOOK_PREVIEW__&&!l.modelValue&&e.watch(()=>l.multiselect,()=>{t.value=l.multiselect?[]:{id:null,name:""}},{immediate:!0});const k=O(l.apiRequest,l.minLength,l.useCache),s=e.computed(()=>{const o=[];return!l.multiselect&&l.appendAllValue&&o.push(a),l.items.forEach(r=>o.push({...r})),o}),y=(o,r=!0)=>r&&o.id===null?Array.isArray(t.value)?t.value.some(f=>f.id===o.id&&f.name===o.name):o.name===t.value.name:Array.isArray(t.value)?t.value.some(f=>f.id===o.id):o.id===t.value.id,u=e.computed(()=>{const o=n.value.toLowerCase(),r=S.invertKeyboardLayout(o);let f=[];return s.value.forEach(c=>{const h=c.name.toLowerCase();(c.id===Number(o)||h.includes(o)||h.includes(r))&&(h===o||h===r?f.unshift(c):f.push(c))}),f.push(...k.items.value),l.appendSearchToResult&&n.value&&(!f.length||f[0].name.toLowerCase()!==o)&&f.push({id:null,name:n.value}),l.multiselect&&(f=f.filter(c=>!y(c))),f}),C=async o=>{if(l.multiselect){if(!Array.isArray(t.value)||y(o))return;const r=[...t.value];r.push({...o}),t.value=r,B.Core.state.isMobile||setTimeout(()=>{var f,c,h,E;(f=v())==null||f.recalcPosition(),(E=(h=(c=v())==null?void 0:c.elPopupWidget)==null?void 0:h.querySelector("input"))==null||E.focus(),n.value&&d()})}else JSON.stringify(o)!==JSON.stringify(t.value)&&(t.value={...o})},b=()=>{if(!Array.isArray(t.value)){const r=(s.value.findIndex(f=>f.id===t.value.id)+1)%s.value.length;t.value={...s.value[r]}}},w=async o=>{Array.isArray(t.value)&&(t.value=t.value.filter(r=>r.id!==o),setTimeout(()=>{var r;(r=v())==null||r.recalcPosition()}))},T=e.ref(!1);l.apiRequest&&(e.watch(T,()=>{T.value&&k.setSearchTextAndLoad(n.value,!1)}),e.watch(n,()=>k.setSearchTextAndLoad(n.value)));const le=o=>{const r=o.target;r.scrollTop/(r.scrollHeight-r.offsetHeight)>.8&&k.loadAppend()},ne=()=>{var o;T.value=!1,(o=p.value)==null||o.focus(),n.value&&d()};return(o,r)=>{const f=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(V.TopPopup),{ref_key:"popupRef",ref:m,onOpen:r[3]||(r[3]=c=>T.value=!0),onClose:r[4]||(r[4]=c=>ne()),onScrollContentList:r[5]||(r[5]=c=>o.apiRequest?le(c):void 0),notch:!1,transitionDuration:0},e.createSlots({opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:p,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(c=>c.currentTarget.click(),["stop","prevent"]),["up","down","enter","space"])),r[1]||(r[1]=e.withKeys(c=>t.value=[],["delete"]))],tabindex:"0"},[o.multiselect?(e.openBlock(),e.createElementBlock("div",R,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value,c=>(e.openBlock(),e.createBlock(H,{id:c.id,name:c.name,onDelete:w},null,8,["id","name"]))),256))])):e.createCommentVNode("",!0),o.multiselect?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",U,e.toDisplayString(Array.isArray(t.value)?"":t.value.name),1)),o.addChanger&&!o.multiselect&&s.value.length>1&&!o.disabled?(e.openBlock(),e.createElementBlock("span",{key:2,class:"top-changer top-changer-selector",onClick:e.withModifiers(b,["stop"])})):e.createCommentVNode("",!0)],34)),[[f,o.isError,void 0,{onupdate:!0}]])]),contentList:e.withCtx(()=>{var c;return[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,h=>(e.openBlock(),e.createBlock(e.unref(V.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(t.value)&&!o.multiselect&&t.value.id===h.id&&t.value.name===h.name}),key:h.id??void 0,closeByClick:!o.multiselect||e.unref(B.Core).state.isMobile,onClick:E=>C(h)},{default:e.withCtx(()=>[o.$slots.item?e.renderSlot(o.$slots,"item",{key:0,item:h}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(h.name),1)],64))]),_:2},1032,["class","closeByClick","onClick"]))),128)),!e.unref(k).isLoading.value&&!u.value.length?(e.openBlock(),e.createBlock(e.unref(V.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0),e.unref(k).isLoading.value&&(!o.showSearch||(c=o.apiRequest)!=null&&c.params.offset)?(e.openBlock(),e.createBlock(e.unref(V.TopPopupListItem),{key:1,type:"regular"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.TopPreloader),{type:"circles"})]),_:1})):e.createCommentVNode("",!0)]}),_:2},[o.showSearch?{name:"widget",fn:e.withCtx(()=>{var c;return[e.createVNode(e.unref(V.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:n.value,"onUpdate:modelValue":r[2]||(r[2]=h=>n.value=h),isLoading:e.unref(k).isLoading.value&&!((c=o.apiRequest)!=null&&c.params.offset),placeholder:!Array.isArray(t.value)&&!o.multiselect&&o.showSelectedInInput?t.value.name:o.placeholder},null,8,["modelValue","isLoading","placeholder"])]}),key:"0"}:void 0]),1536)}}}),J=["data-top-icon"],X={class:"top-info_text"},j={key:0,class:"top-info_value"},Y=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(i){return(l,t)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+l.size]:!0,["top-info-styling_"+l.styling]:!0}),"data-top-icon":l.icon},[e.createElementVNode("div",X,[e.renderSlot(l.$slots,"default")]),l.$slots.additional?(e.openBlock(),e.createElementBlock("span",j,[e.renderSlot(l.$slots,"additional")])):e.createCommentVNode("",!0)],10,J))}}),Q=N,Z=M,q=P,x=G,ee=W,oe=A._sfc_main,te=Y;g.TopCheckboxGroup=x,g.TopEditArea=Q,g.TopEditInput=Z,g.TopInfo=te,g.TopMenu=oe,g.TopRadioGroup=q,g.TopSelector2=ee,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","vue","../.chunks/forms-DPIu5wcK.amd","../popup/popup.amd","../utils/keyboard.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-QsJS5sEm.amd","../require/css.amd!../assets/formsExt.css"],function(te,B,e,k,g,V,T){"use strict";if(typeof e>"u")var e=window.Vue;const E={class:"top-editArea_footer"},S=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(a,{emit:t}){const o=a,r=t,i=e.ref(o.defaultValue),l=e.ref(o.isFocused),c=e.computed(()=>i.value!==o.defaultValue),p=u=>{r("submit",u),i.value=o.defaultValue},v=()=>{if(o.forceShowCloseBtn&&!c.value){r("close");return}i.value=o.defaultValue},y=()=>{o.attachToKeyboard&&r("clickOnTitle")};return(u,m)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":u.attachToKeyboard})},[u.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:m[0]||(m[0]=s=>y())},e.toDisplayString(u.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-error":u.isError,"top-focus":l.value})},[e.createVNode(k._sfc_main$3,{modelValue:i.value,"onUpdate:modelValue":m[1]||(m[1]=s=>i.value=s),name:u.name,placeholder:u.placeholder,rows:u.rows,minHeight:u.minHeight,expandable:u.expandable,disabled:u.disabled,readonly:u.readonly,isError:u.isError,hint:u.hint,class:"top-editArea_element",onFocus:m[2]||(m[2]=()=>l.value=!0),onBlur:m[3]||(m[3]=()=>l.value=!1),onKeyup:[e.withKeys(v,["esc"]),m[4]||(m[4]=e.withKeys(e.withModifiers(s=>p(i.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",E,[c.value||u.forceShowCloseBtn?(e.openBlock(),e.createBlock(k._sfc_main,{key:0,icon:u.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:v},e.createSlots({_:2},[u.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),c.value?(e.openBlock(),e.createBlock(k._sfc_main,{key:1,class:"top-editArea_button",icon:u.$core.state.isMobile?"":"",onClick:m[5]||(m[5]=s=>p(i.value))},e.createSlots({_:2},[u.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),A={class:"top-editInput"},$=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(a,{emit:t}){const o=a,r=e.ref(o.modelValue);e.watch(e.toRef(o.modelValue),()=>{r.value=o.modelValue});const i=t,l=()=>{i("update:modelValue",r.value)};return(c,p)=>(e.openBlock(),e.createElementBlock("div",A,[e.createVNode(k._sfc_main$2,e.mergeProps(c.input,{onKeydownCapture:p[0]||(p[0]=e.withKeys(e.withModifiers(v=>r.value=c.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(l,["stop"]),["enter"]),modelValue:r.value,"onUpdate:modelValue":p[1]||(p[1]=v=>r.value=v)}),null,16,["onKeydown","modelValue"]),r.value!==c.modelValue?(e.openBlock(),e.createBlock(k._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},c.button,{onClick:l}),null,16)):e.createCommentVNode("",!0)]))}}),I=["data-top-icon","onClick"],N={key:0,class:"top-radioGroup_circle"},M=["value","disabled"],L=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(a){const t=e.useModel(a,"modelValue"),o=a,r=e.ref(null);e.watch(t,()=>{var l,c,p,v,y;(l=o.radiosProps)!=null&&l.some(u=>u.value===t.value)||(t.value=((p=(c=o.radiosProps)==null?void 0:c[0])==null?void 0:p.value)??""),(y=(v=r.value)==null?void 0:v.querySelector(".radioGroup_item-selected"))==null||y.scrollIntoView()},{immediate:!0});const i="radioGroup-"+Math.random();return(l,c)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:r,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+l.size]:!!l.size,"top-error":l.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.radiosProps,p=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":p.value===t.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":p.disabled}),"data-top-icon":p.icon,onClick:v=>t.value=p.value},[e.createTextVNode(e.toDisplayString(p.title)+" ",1),l.showIndicator?(e.openBlock(),e.createElementBlock("span",N)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":c[0]||(c[0]=v=>t.value=v),name:i,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:p.value,disabled:p.disabled},null,8,M),[[e.vModelRadio,t.value]])],10,I))),256))],2))}}),_=["data-top-icon"],z=["value","checked","disabled","onChange"],K=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},styling:{default:"outline"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(a){const t=e.useModel(a,"modelValue"),o=r=>{const i=[...t.value],l=i.indexOf(r);l===-1?i.push(r):i.splice(l,1),t.value=i};return(r,i)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-checkboxGroup":!0,["top-checkboxGroup-"+r.styling]:!0,"top-scrollBarXHidding":!0,["top-size_"+r.size]:!!r.size,"top-error":r.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.items,l=>(e.openBlock(),e.createElementBlock("label",{key:l.id,class:e.normalizeClass({"top-checkboxGroup_item":!0,"top-checkboxGroup_item-selected":t.value.includes(l.id),"top-forms-focusable":!0,"top-disabled":l.disabled}),"data-top-icon":l.icon},[e.createElementVNode("input",{type:"checkbox",class:"top-unvisible",value:l.id,checked:t.value.includes(l.id),disabled:l.disabled,onChange:c=>o(l.id)},null,40,z),e.createTextVNode(" "+e.toDisplayString(l.title),1)],10,_))),128))],2))}}),P={class:"top-selector2_itemMulti top-ellipsis"},D=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(a){return(t,o)=>(e.openBlock(),e.createElementBlock("div",P,[e.createTextVNode(e.toDisplayString(t.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:o[0]||(o[0]=r=>t.$emit("delete",t.id)),onMousedown:o[1]||(o[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),G=(a,t,o)=>{const r=e.ref([]),i=e.ref(!1);let l="",c;a&&!a.params.limit&&(a.params.limit=100);const p=async()=>{if(!a)return;let s,f;if(o&&(a.cache??=new Map,f=JSON.stringify(a.params),s=a.cache.get(f),s))return s;if(i.value=!0,s=await a.call(),i.value=!1,s.errors)return;if(!Array.isArray(s.result)){console.warn("В result ожидался массив");return}const n=s.result.findIndex(d=>d.id===void 0||d.name===void 0);if(n!==-1){console.warn(`В result[${n}] нет id или name`);return}return o&&a.cache.set(f,s),s},v=async()=>{if(!a)return;a.params.offset=0,a.params.search=l;const s=await p();s&&(c=s.nextOffset,r.value=s.result)},y=async()=>{if(!a||!c||i.value)return;a.params.offset=c,a.params.search=l;const s=await p();s&&(c=s.nextOffset,r.value=r.value.concat(s.result))},u=k.debounce(()=>v(),200);return{apiRequest:a,items:r,isLoading:i,loadAppend:y,setSearchTextAndLoad:(s,f=!0)=>{a&&(s.length<t||s===l&&r.value.length||(l=s,f?u():v()))}}},F=0,b=(a,t,o=!0)=>o&&t.id===null?Array.isArray(a)?a.some(r=>r.id===t.id&&r.name===t.name):t.name===a.name:Array.isArray(a)?a.some(r=>r.id===t.id):t.id===a.id,O=(a,t,o,r,i,l)=>{const c=e.ref(""),p={id:F,name:k.useI18n().Common.All},v=()=>{c.value="",l.items.value=[]},y=e.computed(()=>{var s;const m=[];return!o&&r.value&&m.push(p),(s=t.value)==null||s.forEach(f=>m.push({...f})),m}),u=e.computed(()=>{const m=c.value.toLowerCase(),s=V.invertKeyboardLayout(m);let f=[];return y.value.forEach(n=>{const d=n.name.toLowerCase();(n.id===Number(m)||d.includes(m)||d.includes(s))&&(d===m||d===s?f.unshift(n):f.push(n))}),f.push(...l.items.value),i.value&&c.value&&(!f.length||f[0].name.toLowerCase()!==m)&&f.push({id:null,name:c.value}),o&&(f=f.filter(n=>!b(a.value,n))),f});return{searchText:c,resetSearch:v,items:y,itemsForShow:u}},H={key:0,class:"top-selector2_activeItems"},R={key:1,class:"top-selector2_activeName top-ellipsis"},U=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},multiselect:{type:Boolean},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},placeholder:{},showSelectedInInput:{type:Boolean,default:!0},showSearch:{type:Boolean,default:!0}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(a){const t=a,o=e.useModel(a,"modelValue"),r=e.ref(null),i=G(t.apiRequest,t.minLength||0,t.useCache),l=O(o,e.toRef(t,"items"),t.multiselect,e.toRef(t,"appendAllValue"),e.toRef(t,"appendSearchToResult"),i),c=e.ref(null),p=()=>{var n;return(n=c.value)==null?void 0:n.popup},v=()=>{if(!Array.isArray(o.value)){const d=(l.itemsForShow.value.findIndex(w=>w.id===o.value.id)+1)%l.itemsForShow.value.length;o.value={...l.itemsForShow.value[d]}}},y=async n=>{Array.isArray(o.value)&&(o.value=o.value.filter(d=>d.id!==n),setTimeout(()=>{var d;(d=p())==null||d.recalcPosition()}))},u=e.ref(!1);i.apiRequest&&(e.watch(u,()=>{u.value&&i.setSearchTextAndLoad(l.searchText.value,!1)}),e.watch(l.searchText,()=>i.setSearchTextAndLoad(l.searchText.value)));const m=n=>{t.multiselect&&Array.isArray(o.value)?b(o.value,n)||(o.value=[...o.value,n]):o.value=n},s=()=>{var n;u.value=!1,(n=r.value)==null||n.focus(),l.searchText.value&&l.resetSearch()},f=n=>{const d=n.target;d.scrollTop/(d.scrollHeight-d.offsetHeight)>.8&&i.loadAppend()};return window.__STORYBOOK_PREVIEW__&&!t.modelValue&&e.watch(()=>t.multiselect,()=>{o.value=t.multiselect?[]:{id:null,name:""}},{immediate:!0}),(n,d)=>{const w=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(g.TopPopup),{ref_key:"popupRef",ref:c,onOpen:d[3]||(d[3]=h=>u.value=!0),onClose:d[4]||(d[4]=h=>s()),onScrollContentList:d[5]||(d[5]=h=>n.apiRequest?f(h):void 0),notch:!1,transitionDuration:0},e.createSlots({opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:r,class:e.normalizeClass({"top-selector2":!0,"top-selector2-multiselect":n.multiselect,["top-size_"+n.size]:!0,"top-disabled":n.disabled,"top-forms-focusable":!n.disabled,"top-error":n.isError}),onKeydown:[d[0]||(d[0]=e.withKeys(e.withModifiers(h=>h.currentTarget.click(),["stop","prevent"]),["up","down","enter","space"])),d[1]||(d[1]=e.withKeys(h=>o.value=[],["delete"]))],tabindex:"0"},[n.multiselect?(e.openBlock(),e.createElementBlock("div",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,h=>(e.openBlock(),e.createBlock(D,{id:h.id,name:h.name,onDelete:y},null,8,["id","name"]))),256))])):e.createCommentVNode("",!0),n.multiselect?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",R,e.toDisplayString(Array.isArray(o.value)?"":o.value.name),1)),n.addChanger&&!n.multiselect&&e.unref(l).items.value.length>1&&!n.disabled?(e.openBlock(),e.createElementBlock("span",{key:2,class:"top-changer top-changer-selector","data-top-popup-disabled":"true",onClick:v})):e.createCommentVNode("",!0)],34)),[[w,n.isError,void 0,{onupdate:!0}]])]),contentList:e.withCtx(()=>{var h;return[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(l).itemsForShow.value,C=>(e.openBlock(),e.createBlock(e.unref(g.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(o.value)&&!n.multiselect&&o.value.id===C.id&&o.value.name===C.name}),key:C.id??void 0,closeByClick:!n.multiselect||e.unref(k.Core).state.isMobile,onClick:le=>m(C)},{default:e.withCtx(()=>[n.$slots.item?e.renderSlot(n.$slots,"item",{key:0,item:C}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(C.name),1)],64))]),_:2},1032,["class","closeByClick","onClick"]))),128)),!e.unref(i).isLoading.value&&!e.unref(l).itemsForShow.value.length?(e.openBlock(),e.createBlock(e.unref(g.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0),e.unref(i).isLoading.value&&(!n.showSearch||(h=n.apiRequest)!=null&&h.params.offset)?(e.openBlock(),e.createBlock(e.unref(g.TopPopupListItem),{key:1,type:"regular"},{default:e.withCtx(()=>[e.createVNode(e.unref(k.TopPreloader),{type:"circles"})]),_:1})):e.createCommentVNode("",!0)]}),_:2},[n.showSearch?{name:"widget",fn:e.withCtx(()=>{var h;return[e.createVNode(e.unref(g.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:e.unref(l).searchText.value,"onUpdate:modelValue":d[2]||(d[2]=C=>e.unref(l).searchText.value=C),isLoading:e.unref(i).isLoading.value&&!((h=n.apiRequest)!=null&&h.params.offset),placeholder:!Array.isArray(o.value)&&!n.multiselect&&n.showSelectedInInput?o.value.name:n.placeholder},null,8,["modelValue","isLoading","placeholder"])]}),key:"0"}:void 0]),1536)}}}),W=["data-top-icon"],X={class:"top-info_text"},j={key:0,class:"top-info_value"},J=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(a){return(t,o)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+t.size]:!0,["top-info-styling_"+t.styling]:!0}),"data-top-icon":t.icon},[e.createElementVNode("div",X,[e.renderSlot(t.$slots,"default")]),t.$slots.additional?(e.openBlock(),e.createElementBlock("span",j,[e.renderSlot(t.$slots,"additional")])):e.createCommentVNode("",!0)],10,W))}}),Y=S,Q=$,Z=L,q=K,x=U,ee=T._sfc_main,oe=J;B.TopCheckboxGroup=q,B.TopEditArea=Y,B.TopEditInput=Q,B.TopInfo=oe,B.TopMenu=ee,B.TopRadioGroup=Z,B.TopSelector2=x,Object.defineProperty(B,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=formsExt.amd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/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\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n\toutline: none;\n}\n\n.top-editArea_form:not(.top-error):hover,\n.top-editArea_form:not(.top-error).top-focus {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './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 } from './radioGroup';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '@/core/utils/lodash';\nimport type { Item, Props } from './selector2';\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet _searchText = '';\n\tlet _nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!_nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = _nextOffset;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\n\t *\n\t * Если текст не изменился, поиск не будет проивзеден\n\t * @param searchText - текст поиска\n\t * @param useDebounce - отложенное выполнение поиска\n\t */\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (searchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (searchText === _searchText && items.value.length) return;\n\n\t\t_searchText = searchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","<script setup lang=\"ts\">\nimport type { ComputedRef, ModelRef, ComponentInstance } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { TopLibPopup } 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\tshowSearch: true,\n});\n\nconst model = defineModel<Props['modelValue']>() as ModelRef<Props['modelValue']>;\n\ndefineSlots<Slots>();\n\n/**\n * Текст поиска по результатам\n */\nconst searchText = ref('');\n\n/**\n * Сброс поиска\n */\nconst resetSearch = () => {\n\tsearchText.value = '';\n\tAPI.items.value = [];\n};\n\nconst itemAll = {\n\tid: 0,\n\tname: useI18n().Common.All!,\n};\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<ComponentInstance<typeof TopPopup> | null>(null);\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | 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 * Управляет закрытием окна\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\tconst newModel = [...model.value];\n\t\tnewModel.push({ ...item });\n\t\tmodel.value = newModel;\n\n\t\tif (!Core.state.isMobile) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tgetPopup()?.recalcPosition();\n\t\t\t\tgetPopup()?.elPopupWidget?.querySelector('input')?.focus();\n\n\t\t\t\tif (searchText.value) resetSearch();\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif (JSON.stringify(item) !== JSON.stringify(model.value)) {\n\t\t\tmodel.value = { ...item };\n\t\t}\n\t}\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = localItems.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % localItems.value.length;\n\t\tmodel.value = { ...localItems.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\n * @param id\n */\nconst deleteItemById = async (id: Item['id']) => {\n\tif (Array.isArray(model.value)) {\n\t\tmodel.value = model.value.filter(item => item.id !== id);\n\n\t\tsetTimeout(() => {\n\t\t\tgetPopup()?.recalcPosition();\n\t\t});\n\t}\n};\n\nconst isOpened = ref(false); // флаг попап открыт\n\nif (props.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tAPI.setSearchTextAndLoad(searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(searchText, () => API.setSearchTextAndLoad(searchText.value));\n}\n\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tAPI.loadAppend();\n\t}\n};\n\nconst onClose = () => {\n\tisOpened.value = false;\n\n\telRef.value?.focus();\n\n\tif (searchText.value) resetSearch();\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"false\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<div\n\t\t\t\tref=\"elRef\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\n\t\t\t\t@keydown.delete=\"model = []\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Array<Item>\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !multiselect && localItems.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\t@click.stop=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget v-if=\"showSearch\">\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=\"API.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of itemsForShow\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item=\"item\"\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!API.isLoading.value && !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\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"API.isLoading.value && (!showSearch || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tmin-height: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: hidden;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n\tcolor: var(--top-forms-placeholder-color);\n\n\tborder-radius: var(--top-radius-2);\n\tborder: 1px solid var(--top-forms-border-color);\n\tbackground: var(--top-forms-background-color);\n}\n\n.top-selector2-multiselect {\n\twidth: unset;\n\tmin-width: 180px;\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\ttransform: translateX(-16px);\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["isChanged","vue","localValue","props","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","onChange","id","index","newModel","items","isLoading","_nextOffset","apiRequest","res","cacheKey","indexWithError","_searchText","callAPIRequest","loadAppend","searchText","minLength","API","forms","popupRef","useAPI","localItems","itemAll","itemSelected","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","isSelected","selectItem","getPopup","resetSearch","nextIndex","deleteItemById","isOpened","onScrollContentList","e","el","TopEditArea","_sfc_main$6","TopEditInput","_sfc_main$5","TopRadioGroup","_sfc_main$4","TopCheckboxGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main"],"mappings":"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"}
1
+ {"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n\toutline: none;\n}\n\n.top-editArea_form:not(.top-error):hover,\n.top-editArea_form:not(.top-error).top-focus {\n\tborder-color: var(--top-forms-border-color-hover);\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet _searchText = '';\n\tlet _nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!_nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = _nextOffset;\n\t\tapiRequest.params.search = _searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\t_nextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет проивзеден\n\t *\n\t * Если текст не изменился, поиск не будет проивзеден\n\t * @param searchText - текст поиска\n\t * @param useDebounce - отложенное выполнение поиска\n\t */\n\tconst setSearchTextAndLoad = (searchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (searchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (searchText === _searchText && items.value.length) return;\n\n\t\t_searchText = searchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\titems: localItems,\n\t\titemsForShow,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\nimport { isSelected } from './utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Array<Item>,\n\tsize: 's',\n\tminLength: 0,\n\tshowSelectedInInput: true,\n\tshowSearch: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\n/**\n * Основной элемент селектора\n */\nconst elRef = ref<HTMLElement | null>(null);\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, props.minLength || 0, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(model, toRef(props, 'items'), props.multiselect, toRef(props, 'appendAllValue'), toRef(props, 'appendSearchToResult'), api);\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n *\n * @returns Объект popup или undefined, если popup не инициализирован\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\n/**\n * Выбрать следующее значение\n */\nconst selectNextItem = () => {\n\tif (!Array.isArray(model.value)) {\n\t\tconst currentIndex = menu.itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\tconst nextIndex = (currentIndex + 1) % menu.itemsForShow.value.length;\n\t\tmodel.value = { ...menu.itemsForShow.value[nextIndex] };\n\t}\n};\n\n/**\n * Удалить выбранное значение по id\n *\n * @param id Идентификатор элемента для удаления\n */\nconst deleteItemById = async (id: Item['id']) => {\n\tif (Array.isArray(model.value)) {\n\t\tmodel.value = model.value.filter(item => item.id !== id);\n\n\t\tsetTimeout(() => {\n\t\t\tgetPopup()?.recalcPosition();\n\t\t});\n\t}\n};\n\n/**\n * Флаг, указывающий, открыт ли попап\n */\nconst isOpened = ref(false);\n\nif (api.apiRequest) {\n\twatch(isOpened, () => {\n\t\tif (isOpened.value) {\n\t\t\t// при открытии сразу выполнить поиск\n\t\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t\t}\n\t});\n\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => api.setSearchTextAndLoad(menu.searchText.value));\n}\n\n/**\n * Выбрать элемент\n *\n * @param item Элемент для выбора\n */\nconst selectItem = (item: Item) => {\n\tif (props.multiselect && Array.isArray(model.value)) {\n\t\tif (!isSelected(model.value, item)) {\n\t\t\tmodel.value = [...model.value, item];\n\t\t}\n\t} else {\n\t\tmodel.value = item;\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tisOpened.value = false;\n\n\telRef.value?.focus();\n\n\tif (menu.searchText.value) menu.resetSearch();\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\n */\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tapi.loadAppend();\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__ && !props.modelValue) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tmodel.value = props.multiselect ? [] : { id: null, name: '' };\n\t\t},\n\t\t{ immediate: true },\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"isOpened = true\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"false\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<div\n\t\t\t\tref=\"elRef\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\t@keydown.up.down.enter.space.stop.prevent=\"($event.currentTarget as HTMLElement).click()\"\n\t\t\t\t@keydown.delete=\"model = []\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Item[]\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"!multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"selectNextItem\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #widget v-if=\"showSearch\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder=\"!Array.isArray(model) && !multiselect && showSelectedInInput ? model.name : placeholder\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (!showSearch || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tmin-height: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: hidden;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n\tcolor: var(--top-forms-placeholder-color);\n\n\tborder-radius: var(--top-radius-2);\n\tborder: 1px solid var(--top-forms-border-color);\n\tbackground: var(--top-forms-background-color);\n}\n\n.top-selector2-multiselect {\n\twidth: unset;\n\tmin-width: 180px;\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\ttransform: translateX(-16px);\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\n"],"names":["isChanged","vue","localValue","props","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","onChange","id","index","newModel","items","isLoading","_nextOffset","apiRequest","res","cacheKey","indexWithError","_searchText","callAPIRequest","loadAppend","searchText","minLength","modelValue","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","api","forms","localItems","localItems2","itemAll","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","items2","isSelected","resetSearch","useAPI","menu","popupRef","nextIndex","deleteItemById","getPopup","isOpened","selectItem","onScrollContentList","e","el","TopEditArea","_sfc_main$6","TopEditInput","_sfc_main$5","TopRadioGroup","_sfc_main$4","TopCheckboxGroup","_sfc_main$3","TopSelector2","_sfc_main$1","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main"],"mappings":"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"}