@topvisor/ui 1.0.26-2 → 1.0.26-20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.chunks/{core-B9imztzR.amd.js → core-CAMGByIQ.amd.js} +2 -2
  2. package/.chunks/{core-B9imztzR.amd.js.map → core-CAMGByIQ.amd.js.map} +1 -1
  3. package/.chunks/{core-Bcq6idRz.es.js → core-asoGK-7D.es.js} +4 -4
  4. package/.chunks/{core-Bcq6idRz.es.js.map → core-asoGK-7D.es.js.map} +1 -1
  5. package/.chunks/{datepicker-DPc8qQ_Y.es.js → datepicker-BYBYKhbw.es.js} +2 -2
  6. package/.chunks/{datepicker-DPc8qQ_Y.es.js.map → datepicker-BYBYKhbw.es.js.map} +1 -1
  7. package/.chunks/{datepicker-NsthdPQ1.amd.js → datepicker-BvawRSTl.amd.js} +2 -2
  8. package/.chunks/{datepicker-NsthdPQ1.amd.js.map → datepicker-BvawRSTl.amd.js.map} +1 -1
  9. package/.chunks/dialog_selectorRegions-CpBiVjgI.es.js +186 -0
  10. package/.chunks/dialog_selectorRegions-CpBiVjgI.es.js.map +1 -0
  11. package/.chunks/dialog_selectorRegions-DVz3N6Dj.amd.js +2 -0
  12. package/.chunks/dialog_selectorRegions-DVz3N6Dj.amd.js.map +1 -0
  13. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-BLGKFF8Y.es.js → dialogs.vue_vue_type_script_setup_true_lang--09NOqOd.es.js} +2 -2
  14. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-BLGKFF8Y.es.js.map → dialogs.vue_vue_type_script_setup_true_lang--09NOqOd.es.js.map} +1 -1
  15. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-vT5jI1Ll.amd.js → dialogs.vue_vue_type_script_setup_true_lang-BCvCrDYf.amd.js} +2 -2
  16. package/.chunks/{dialogs.vue_vue_type_script_setup_true_lang-vT5jI1Ll.amd.js.map → dialogs.vue_vue_type_script_setup_true_lang-BCvCrDYf.amd.js.map} +1 -1
  17. package/.chunks/{forms-B3bJpLOo.amd.js → forms-CD0nOB5f.amd.js} +3 -3
  18. package/.chunks/{forms-B3bJpLOo.amd.js.map → forms-CD0nOB5f.amd.js.map} +1 -1
  19. package/.chunks/{forms-BEMrEl5V.es.js → forms-qJ3k2PG6.es.js} +427 -421
  20. package/.chunks/{forms-BEMrEl5V.es.js.map → forms-qJ3k2PG6.es.js.map} +1 -1
  21. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DLF_Qnj6.amd.js → listItem.vue_vue_type_script_setup_true_lang-BAEJrRYd.amd.js} +2 -2
  22. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-BAEJrRYd.amd.js.map +1 -0
  23. package/.chunks/{listItem.vue_vue_type_script_setup_true_lang-DMQVN3dP.es.js → listItem.vue_vue_type_script_setup_true_lang-BlC9NJdi.es.js} +2 -2
  24. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-BlC9NJdi.es.js.map +1 -0
  25. package/.chunks/{menu.vue_vue_type_style_index_0_lang-DzNVeeZl.es.js → menu.vue_vue_type_style_index_0_lang-CDkyMyEi.es.js} +7 -7
  26. package/.chunks/menu.vue_vue_type_style_index_0_lang-CDkyMyEi.es.js.map +1 -0
  27. package/.chunks/{menu.vue_vue_type_style_index_0_lang-VpwRSIdl.amd.js → menu.vue_vue_type_style_index_0_lang-Oq5353Ax.amd.js} +2 -2
  28. package/.chunks/menu.vue_vue_type_style_index_0_lang-Oq5353Ax.amd.js.map +1 -0
  29. package/.chunks/{notice-DMnioYtH.amd.js → notice-rP8nJxrF.amd.js} +2 -2
  30. package/.chunks/{notice-DMnioYtH.amd.js.map → notice-rP8nJxrF.amd.js.map} +1 -1
  31. package/.chunks/{notice-CTntRScY.es.js → notice-somyoQTl.es.js} +2 -2
  32. package/.chunks/{notice-CTntRScY.es.js.map → notice-somyoQTl.es.js.map} +1 -1
  33. package/.chunks/{page.vue_vue_type_script_setup_true_lang-BI9HWAyQ.amd.js → page.vue_vue_type_script_setup_true_lang-D8EtPAsl.amd.js} +2 -2
  34. package/.chunks/{page.vue_vue_type_script_setup_true_lang-BI9HWAyQ.amd.js.map → page.vue_vue_type_script_setup_true_lang-D8EtPAsl.amd.js.map} +1 -1
  35. package/.chunks/{page.vue_vue_type_script_setup_true_lang-CCE8pKg7.es.js → page.vue_vue_type_script_setup_true_lang-SJpF_87B.es.js} +4 -4
  36. package/.chunks/{page.vue_vue_type_script_setup_true_lang-CCE8pKg7.es.js.map → page.vue_vue_type_script_setup_true_lang-SJpF_87B.es.js.map} +1 -1
  37. package/.chunks/{popup-BnyVyxQA.amd.js → popup-BpdlKk5T.amd.js} +2 -2
  38. package/.chunks/{popup-BnyVyxQA.amd.js.map → popup-BpdlKk5T.amd.js.map} +1 -1
  39. package/.chunks/{popup-INaxGjMc.es.js → popup-NHfxJUAB.es.js} +2 -2
  40. package/.chunks/{popup-INaxGjMc.es.js.map → popup-NHfxJUAB.es.js.map} +1 -1
  41. package/.chunks/{utils-DIly8mml.es.js → utils-B-1oTT6I.es.js} +2 -2
  42. package/.chunks/{utils-DIly8mml.es.js.map → utils-B-1oTT6I.es.js.map} +1 -1
  43. package/.chunks/{utils-CTjq0RlC.amd.js → utils-BPFSJAiy.amd.js} +2 -2
  44. package/.chunks/{utils-CTjq0RlC.amd.js.map → utils-BPFSJAiy.amd.js.map} +1 -1
  45. package/.chunks/{utils-Bi5onrSF.amd.js → utils-CZwaa5j-.amd.js} +2 -2
  46. package/.chunks/{utils-Bi5onrSF.amd.js.map → utils-CZwaa5j-.amd.js.map} +1 -1
  47. package/.chunks/{utils-D4KXBloN.es.js → utils-DI9i3mGB.es.js} +3 -3
  48. package/.chunks/{utils-D4KXBloN.es.js.map → utils-DI9i3mGB.es.js.map} +1 -1
  49. package/assets/forms.css +1 -1
  50. package/charts/charts.amd.js +1 -1
  51. package/charts/charts.js +1 -1
  52. package/components/dialog/dialog/page/types.d.ts +2 -2
  53. package/components/formsExt/info/types.d.ts +1 -1
  54. package/components/formsExt/selector2/selector2.d.ts +5 -1
  55. package/components/formsExt/selector2/selector2.vue.d.ts +6 -5
  56. package/components/layout/islandRows/types.d.ts +1 -1
  57. package/components/popup/popup/popup.vue.d.ts +2 -2
  58. package/components/project/selectorRegion/dialog_selectorRegions/dialog_selectorRegions.vue.d.ts +3 -1
  59. package/components/project/selectorRegion/utils/utils.d.ts +3 -1
  60. package/core/app.amd.js +1 -1
  61. package/core/app.amd.js.map +1 -1
  62. package/core/app.js +29 -29
  63. package/core/app.js.map +1 -1
  64. package/core/plugins/core.d.ts +1 -1
  65. package/core/plugins/i18n.d.ts +4 -4
  66. package/core/utils/searchers.d.ts +1 -1
  67. package/dialog/dialog.amd.js +1 -1
  68. package/dialog/dialog.amd.js.map +1 -1
  69. package/dialog/dialog.js +2 -2
  70. package/dialog/dialog.js.map +1 -1
  71. package/forms/forms.amd.js +1 -1
  72. package/forms/forms.js +1 -1
  73. package/formsExt/formsExt.amd.js +1 -1
  74. package/formsExt/formsExt.amd.js.map +1 -1
  75. package/formsExt/formsExt.js +130 -124
  76. package/formsExt/formsExt.js.map +1 -1
  77. package/icomoon/Topvisor icons.json +226 -41
  78. package/icomoon/demo.html +364 -252
  79. package/icomoon/fonts/Topvisor-2.eot +0 -0
  80. package/icomoon/fonts/Topvisor-2.svg +9 -1
  81. package/icomoon/fonts/Topvisor-2.ttf +0 -0
  82. package/icomoon/fonts/Topvisor-2.woff +0 -0
  83. package/icomoon/selection.json +1 -1
  84. package/icomoon/style.css +29 -5
  85. package/layout/layout.amd.js +1 -1
  86. package/layout/layout.js +1 -1
  87. package/package.json +7 -7
  88. package/popup/popup.amd.js +1 -1
  89. package/popup/popup.js +2 -2
  90. package/popup/worker.amd.js +1 -1
  91. package/popup/worker.js +2 -2
  92. package/project/project.amd.js +1 -1
  93. package/project/project.js +5 -5
  94. package/tabsView/tabsView.amd.js +1 -1
  95. package/tabsView/tabsView.amd.js.map +1 -1
  96. package/tabsView/tabsView.js +2 -2
  97. package/tabsView/tabsView.js.map +1 -1
  98. package/utils/clipboard.amd.js +1 -1
  99. package/utils/clipboard.js +1 -1
  100. package/utils/date.amd.js +1 -1
  101. package/utils/date.js +1 -1
  102. package/utils/device.amd.js +1 -1
  103. package/utils/device.js +1 -1
  104. package/utils/lodash.amd.js +1 -1
  105. package/utils/lodash.js +1 -1
  106. package/utils/price.amd.js +1 -1
  107. package/utils/price.js +1 -1
  108. package/utils/searchers.amd.js +1 -1
  109. package/utils/searchers.amd.js.map +1 -1
  110. package/utils/searchers.js +3 -3
  111. package/utils/searchers.js.map +1 -1
  112. package/utils/string.amd.js +1 -1
  113. package/utils/string.amd.js.map +1 -1
  114. package/utils/string.js +10 -10
  115. package/utils/string.js.map +1 -1
  116. package/.chunks/dialog_selectorRegions-BOPta9cH.amd.js +0 -2
  117. package/.chunks/dialog_selectorRegions-BOPta9cH.amd.js.map +0 -1
  118. package/.chunks/dialog_selectorRegions-Dy0AlECS.es.js +0 -140
  119. package/.chunks/dialog_selectorRegions-Dy0AlECS.es.js.map +0 -1
  120. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DLF_Qnj6.amd.js.map +0 -1
  121. package/.chunks/listItem.vue_vue_type_script_setup_true_lang-DMQVN3dP.es.js.map +0 -1
  122. package/.chunks/menu.vue_vue_type_style_index_0_lang-DzNVeeZl.es.js.map +0 -1
  123. package/.chunks/menu.vue_vue_type_style_index_0_lang-VpwRSIdl.amd.js.map +0 -1
  124. package/components/extra/rive/composables.d.ts +0 -4
  125. package/components/extra/rive/types/competitor.d.ts +0 -0
@@ -1,4 +1,4 @@
1
- import { default as PopupClass } from '../lib/popup';
1
+ import { TopLibPopup } from '../lib/popup';
2
2
  import { Props, PopupEvent } from './popup';
3
3
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
4
4
  declare function __VLS_template(): {
@@ -16,7 +16,7 @@ declare function __VLS_template(): {
16
16
  };
17
17
  type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
18
18
  declare const __VLS_component: DefineComponent<Props, {
19
- popup: PopupClass | undefined;
19
+ popup: TopLibPopup | undefined;
20
20
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
21
21
  close: (popupEvent: PopupEvent) => any;
22
22
  open: (popupEvent: PopupEvent) => any;
@@ -1,4 +1,6 @@
1
1
  import { Props } from './types';
2
2
  import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
- declare const _default: DefineComponent<Partial<Props>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Partial<Props>> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
3
+ declare const _default: DefineComponent<Partial<Props>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Partial<Props>> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
4
+ elRegions: HTMLDivElement;
5
+ }, HTMLDivElement>;
4
6
  export default _default;
@@ -29,4 +29,6 @@ export declare const findRegion: (forFrequency: boolean, searchRegion: Partial<R
29
29
  *
30
30
  * @see import('../dialog_selectorRegions/types').Props
31
31
  */
32
- export declare const dialogSelectorRegions: AsyncTopDialogHandle<DefineComponent<Partial< Props>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Partial< Props>> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>>;
32
+ export declare const dialogSelectorRegions: AsyncTopDialogHandle<DefineComponent<Partial< Props>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Partial< Props>> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
33
+ elRegions: HTMLDivElement;
34
+ }, HTMLDivElement>>;
package/core/app.amd.js CHANGED
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms-B3bJpLOo.amd","../.chunks/core-B9imztzR.amd","vue","../utils/clipboard.amd","../utils/string.amd","../utils/route.amd","../.chunks/utils-CTjq0RlC.amd","../.chunks/dialogs.vue_vue_type_script_setup_true_lang-vT5jI1Ll.amd"],function(y,o,c,l,d,m,S,p,g,k){"use strict";if(typeof d>"u")var d=window.Vue;class E{#s;#t;#e;#i;#h;#a=[];#o=[];#c=[];#n=[];constructor(s){var t;this.#t=s.store,this.#s=this.#t.$id,this.#e=s.options.Page,this.#i=s.options.user,this.#h=s.options.Api,this.#a=s.options.tpaNamesUrlHash||[],this.#o=s.options.tpaNamesStorage||[],this.#c=s.options.tpaNamesStorageLocal||[],this.#n=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.#f()),this.#S(),this.#k();const e=c.debounce(()=>{this.#l(),this.#m()});s.store.$subscribe(e)}async genGuestLink(s,e){const t=this.#p();e=Object.assign(e,Object.fromEntries(t));const i=await this.#h.gen(s,"fetchColumn").call({},e);i!=null&&i.errors||await m.guestLinkToClipboard(i.result)}#p(){const s=new Map;return this.#n.forEach(e=>{const t=S.camelToSnakeCase(e);s.set(t,this.#t[e])}),s}#r(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}})}#g(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}#f(){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.#r(e)}#l(){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="state:"+this.#s;s&&(t="state:"+this.#s+":"+location.pathname),this.#o.forEach(a=>{const n=localStorage.getItem(t+":"+a);e.set(a,n)});const i=this.#d(e);this.#r(i)}#m(s=!1){const e=new Map;let t=this.#o,i="state:"+this.#s;s&&(t=this.#c,i="state:"+this.#s+":"+location.pathname),t.forEach(n=>{const r=this.#t[n];e.set(n,r)});const a=this.#g(e);t.forEach(n=>{const r=a.get(n);localStorage.setItem(i+":"+n,r)})}#S(){var a,n,r;const s=(n=(a=this.#i)==null?void 0:a.guest_data)==null?void 0:n.data;if(!s)return;this.#i.id===-1&&(this.#i.positionsReverseDates=s.positionsReverseDates);const e=new Map;this.#n.forEach(h=>{const u=s[h];e.set(h,u)});const t=this.#d(e);this.#r(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)};o.Core=c.Core,o.i18nPlugin=c.i18n,o.useI18n=c.useI18n,o.useI18nLang=c.useI18nLang,o.corePlugin=l.core,o.useAsyncTopDialog=g.useAsyncTopDialog,o.useTopDialog=g.useTopDialog,o.TopDialogWorker=k.TopDialogWorker,o.piniaTPAPlugin=w,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/forms-CD0nOB5f.amd","../.chunks/core-CAMGByIQ.amd","vue","../utils/clipboard.amd","../utils/string.amd","../utils/route.amd","../.chunks/utils-BPFSJAiy.amd","../.chunks/dialogs.vue_vue_type_script_setup_true_lang-BCvCrDYf.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
@@ -1 +1 @@
1
- {"version":3,"file":"app.amd.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\nimport { watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { debounce } from '@/core/utils/lodash';\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\nimport { camelToSnakeCase } from '@/core/utils/string.js';\nimport type { paths as OpenAPIPaths } from 'topvisor-openapi/src/ts/Topvisor';\nimport { getHash, setHash } from '@/core/utils/route';\n\ntype OpenAPIPath = keyof OpenAPIPaths;\n\nclass PiniaTPA {\n\n\treadonly #storeId: string;\n\treadonly #store: Store<string, any>;\n\n\t/**\n\t * @deprecated\n\t */\n\treadonly #Page: any;\n\n\treadonly #user: any;\n\treadonly #Api: any;\n\n\treadonly #namesUrlHash: string[] = [];\n\treadonly #namesStorage: string[] = [];\n\treadonly #namesStorageLocal: string[] = [];\n\treadonly #namesGuestLink: string[] = [];\n\n\tconstructor(context: Context) {\n\t\tthis.#store = context.store;\n\t\tthis.#storeId = this.#store.$id;\n\n\t\tthis.#Page = context.options.Page;\n\n\t\tthis.#user = context.options.user;\n\t\tthis.#Api = context.options.Api;\n\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\n\n\t\tcontext.store.genGuestLink = <Path extends OpenAPIPath>(url: Path, data: any) => this.genGuestLink(url, data);\n\n\t\tif (!this.#user.guest_data?.data) {\n\t\t\tthis.#loadFromStorage();\n\t\t\tthis.#loadFromStorage(true);\n\n\t\t\t// настройки URL hash имеют приоритет\n\t\t\tthis.#loadFromHash();\n\t\t}\n\n\t\t// настройки гостевой ссылки имеют приоритет\n\t\tthis.#loadFromGuestLink();\n\n\t\tthis.#prepareParams();\n\n\t\tconst save = debounce(() => {\n\t\t\tthis.#saveInHash();\n\t\t\tthis.#saveInStorage();\n\t\t});\n\n\t\tcontext.store.$subscribe(save);\n\t}\n\n\t/**\n\t * Сгенерировать гостевую ссылку\n\t *\n\t * Метод, путь к которому указан в url, должен возвращать сгенерированную ссылку\n\t */\n\tasync genGuestLink<Path extends OpenAPIPath>(url: Path, data: any) {\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\n\t\tdata = Object.assign(data, Object.fromEntries(dataGuestLink));\n\n\t\tconst res = await this.#Api.gen(url, 'fetchColumn').call({} as any, data);\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tif (res?.errors) return;\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tawait guestLinkToClipboard(res.result);\n\t}\n\n\t/**\n\t * Сгенерировать опции для гостевой ссылки\n\t */\n\t#genOptionsForGuestLink() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesGuestLink.forEach(name => {\n\t\t\t// формат параметров API: snake_case\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из объекта без фиксации состояния\n\t */\n\t#setOptions(data: Map<string, any>) {\n\t\tdata.forEach((value, name) => {\n\t\t\tconst currentValue = this.#store[name];\n\n\t\t\tif (value === null || value === undefined) return;\n\t\t\tif (currentValue === undefined) return;\n\t\t\tif (!value?.constructor) return;\n\t\t\tif (value.constructor !== currentValue.constructor) return;\n\n\t\t\t// дополнительная проверка на формат даты\n\t\t\tif (name.indexOf('date') === 0) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// value.forEach((valueI) => {\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\n\t\t\t\t\t// });\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof (value) === 'string') {\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#store[name] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\n\t */\n\t#genDataFormat(data: Map<string, any>) {\n\t\tconst dataFormatted = new Map();\n\n\t\tdata.forEach((value, name) => {\n\t\t\tif (value === null) return;\n\n\t\t\tvalue = JSON.stringify(value);\n\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\treturn dataFormatted;\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\n\t */\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tdataFormatted.forEach((value, name) => {\n\t\t\tif (value === null || value === undefined || value === 'false') return;\n\n\t\t\ttry {\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\n\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\n\t\t\t} catch (e) {\n\t\t\t\t// не json строка\n\t\t\t}\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из хеша адреса страницы\n\t */\n\t#loadFromHash() {\n\t\tlet dataHash: any;\n\t\ttry {\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\n\t\t} catch (e) {\n\n\t\t}\n\t\tif (!dataHash) return;\n\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = dataHash[name];\n\t\t\tif (!value) return;\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в хеш адреса страницы\n\t */\n\t#saveInHash() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataObject = Object.fromEntries(data);\n\t\tconst dataJSON = JSON.stringify(dataObject);\n\n\t\tsetHash(this.#storeId, dataJSON);\n\t};\n\n\t/**\n\t * Установить опции из localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#loadFromStorage(isLocal = false) {\n\t\tconst dataFormatted = new Map();\n\n\t\t// let names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\t// names = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tthis.#namesStorage.forEach((name) => {\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#saveInStorage(isLocal = false) {\n\t\tconst data = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataFormatted = this.#genDataFormat(data);\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = dataFormatted.get(name);\n\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\n\t\t});\n\t}\n\n\t/**\n\t * Установить опции из гостевой ссылки\n\t */\n\t#loadFromGuestLink() {\n\t\tconst guestData = this.#user?.guest_data?.data;\n\t\tif (!guestData) return;\n\n\t\t// общие правила для гостевых сессий\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\n\n\t\tconst dataFormatted = new Map();\n\n\t\tthis.#namesGuestLink.forEach((name) => {\n\t\t\tconst value = guestData[name];\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\n\t\tconst $guestTitle = $('.mod_guest_title');\n\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\n\t\t\tif (competitors.length) {\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Подготовить входные параметры перед инициализацией основного функционала\n\t *\n\t * Входные параметры устанавливаются при открытии страницы\n\t *\n\t * Входные параметры могут меняться пользоваталем и устаревать\n\t */\n\t#prepareParams() {\n\t\t// контролль за вводом регионов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.regionsIndexes) {\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\n\t\t\t\tif (!regionsIndexes.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\n\n\t\t\t\t// оставить только включенные регионы\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\n\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\n\t\t\t\t\t\tif (region.index === -1) return;\n\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\n\t\t\t}, { immediate: true });\n\t\t}\n\n\t\t// контролль за вводом конкурентов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds) {\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\n\t\t\t\tif (!competitorsIds.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\n\n\t\t\t\t// оставить только включенных конкурентов\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\n\t\t\t\t});\n\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\n\t\t\t}, { immediate: true });\n\t\t}\n\t}\n\n}\n\ntype Options = {\n\t/**\n\t * TODO: Убрать из плагина\n\t */\n\tPage: any,\n\n\t/**\n\t * Объект с настройками пользователя\n\t */\n\tuser: any,\n\n\t/**\n\t * Объект для работы с API\n\t *\n\t * См. на сайте: @/component/api/core/api.ts\n\t */\n\tApi: any;\n\n\t/**\n\t * Имена свойств для сохранения в URL\n\t */\n\ttpaNamesUrlHash?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage\n\t */\n\ttpaNamesStorage?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\n\t *\n\t * Каждый URL будет работать со своим состоянием\n\t */\n\ttpaNamesStorageLocal?: string[],\n\n\t/**\n\t * Имена свойств для работы с гостевой ссылкой\n\t *\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\n\t */\n\ttpaNamesGuestLink?: string[],\n};\n\ntype Context = PiniaPluginContext & {\n\toptions: Options\n};\n\n/**\n * Плагин tpa (Third-party access) для pinia\n *\n * Добавляет возможность сохранять и загружать данные в/из:\n * \t- URL hash в адресе страницы\n * \t- localStorage\n * \t- гостевая ссылка\n *\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\n * - tpaNamesUrlHash\n * - tpaNamesStorage\n * - tpaNamesStorageLocal\n * - tpaNamesGuestLink\n */\nexport default (contextPinia: PiniaPluginContext) => {\n\tconst context = contextPinia as Context;\n\n\t// плагин подключать не нужно\n\tif (\n\t\t!context.options.tpaNamesUrlHash?.length &&\n\t\t!context.options.tpaNamesStorage?.length &&\n\t\t!context.options.tpaNamesStorageLocal?.length &&\n\t\t!context.options.tpaNamesGuestLink?.length\n\t) {\n\t\treturn;\n\t}\n\n\tnew PiniaTPA(context);\n}\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","context","url","data","#loadFromStorage","save","forms","dataGuestLink","#genOptionsForGuestLink","res","utils_clipboard","nameSnakeCase","utils_string","name","currentValue","value","dataFormatted","#loadFromHash","dataHash","utils_route","#setOptions","#saveInHash","dataJSON","isLocal","storageNamespace","#saveInStorage","names","#namesStorage","#namesStorageLocal","#loadFromGuestLink","guestData","$guestTitle","competitors","competitor","#prepareParams","regionsIndexes","regionIndex","index","mapSearchers","searcher","region","availableRegionsIndexes","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia","_a","_b","_c","_d"],"mappings":"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"}
1
+ {"version":3,"file":"app.amd.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\nimport { watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { debounce } from '@/core/utils/lodash';\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\nimport { camelToSnakeCase } from '@/core/utils/string.js';\nimport type { paths as OpenAPIPaths } from 'topvisor-openapi/src/ts/Topvisor';\nimport { getHash, setHash } from '@/core/utils/route';\n\ntype OpenAPIPath = keyof OpenAPIPaths;\n\nclass PiniaTPA {\n\n\treadonly #storeId: string;\n\treadonly #store: Store<string, any>;\n\n\t/**\n\t * @deprecated\n\t */\n\treadonly #Page: any;\n\n\treadonly #user: any;\n\treadonly #Api: any;\n\n\treadonly #namesUrlHash: string[] = [];\n\treadonly #namesStorage: string[] = [];\n\treadonly #namesStorageLocal: string[] = [];\n\treadonly #namesGuestLink: string[] = [];\n\n\tconstructor(context: Context) {\n\t\tthis.#store = context.store;\n\t\tthis.#storeId = this.#store.$id;\n\n\t\tthis.#Page = context.options.Page;\n\n\t\tthis.#user = context.options.user;\n\t\tthis.#Api = context.options.Api;\n\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\n\n\t\tcontext.store.genGuestLink = <Path extends OpenAPIPath>(url: Path, data: any) => this.genGuestLink(url, data);\n\n\t\tif (!this.#user.guest_data?.data) {\n\t\t\tthis.#loadFromStorage();\n\t\t\tthis.#loadFromStorage(true);\n\n\t\t\t// настройки URL hash имеют приоритет\n\t\t\tthis.#loadFromHash();\n\t\t}\n\n\t\t// настройки гостевой ссылки имеют приоритет\n\t\tthis.#loadFromGuestLink();\n\n\t\tthis.#prepareParams();\n\n\t\tconst save = debounce(() => {\n\t\t\tthis.#saveInHash();\n\t\t\tthis.#saveInStorage();\n\t\t\tthis.#saveInStorage(true);\n\t\t});\n\n\t\tcontext.store.$subscribe(save);\n\t}\n\n\t/**\n\t * Сгенерировать гостевую ссылку\n\t *\n\t * Метод, путь к которому указан в url, должен возвращать сгенерированную ссылку\n\t */\n\tasync genGuestLink<Path extends OpenAPIPath>(url: Path, data: any) {\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\n\t\tdata = Object.assign(data, Object.fromEntries(dataGuestLink));\n\n\t\tconst res = await this.#Api.gen(url, 'fetchColumn').call({} as any, data);\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tif (res?.errors) return;\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tawait guestLinkToClipboard(res.result);\n\t}\n\n\t/**\n\t * Сгенерировать опции для гостевой ссылки\n\t */\n\t#genOptionsForGuestLink() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesGuestLink.forEach(name => {\n\t\t\t// формат параметров API: snake_case\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из объекта без фиксации состояния\n\t */\n\t#setOptions(data: Map<string, any>) {\n\t\tdata.forEach((value, name) => {\n\t\t\tconst currentValue = this.#store[name];\n\n\t\t\tif (value === null || value === undefined) return;\n\t\t\tif (currentValue === undefined) return;\n\t\t\tif (!value?.constructor) return;\n\t\t\tif (value.constructor !== currentValue.constructor) return;\n\n\t\t\t// дополнительная проверка на формат даты\n\t\t\tif (name.indexOf('date') === 0) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// value.forEach((valueI) => {\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\n\t\t\t\t\t// });\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof (value) === 'string') {\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#store[name] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\n\t */\n\t#genDataFormat(data: Map<string, any>) {\n\t\tconst dataFormatted = new Map();\n\n\t\tdata.forEach((value, name) => {\n\t\t\tif (value === null) return;\n\n\t\t\tvalue = JSON.stringify(value);\n\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\treturn dataFormatted;\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\n\t */\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tdataFormatted.forEach((value, name) => {\n\t\t\tif (value === null || value === undefined || value === 'false') return;\n\n\t\t\ttry {\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\n\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\n\t\t\t} catch (e) {\n\t\t\t\t// не json строка\n\t\t\t}\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из хеша адреса страницы\n\t */\n\t#loadFromHash() {\n\t\tlet dataHash: any;\n\t\ttry {\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\n\t\t} catch (e) {\n\n\t\t}\n\t\tif (!dataHash) return;\n\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = dataHash[name];\n\t\t\tif (!value) return;\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в хеш адреса страницы\n\t */\n\t#saveInHash() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataObject = Object.fromEntries(data);\n\t\tconst dataJSON = JSON.stringify(dataObject);\n\n\t\tsetHash(this.#storeId, dataJSON);\n\t};\n\n\t/**\n\t * Установить опции из localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#loadFromStorage(isLocal = false) {\n\t\tconst dataFormatted = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#saveInStorage(isLocal = false) {\n\t\tconst data = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataFormatted = this.#genDataFormat(data);\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = dataFormatted.get(name);\n\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\n\t\t});\n\t}\n\n\t/**\n\t * Установить опции из гостевой ссылки\n\t */\n\t#loadFromGuestLink() {\n\t\tconst guestData = this.#user?.guest_data?.data;\n\t\tif (!guestData) return;\n\n\t\t// общие правила для гостевых сессий\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\n\n\t\tconst dataFormatted = new Map();\n\n\t\tthis.#namesGuestLink.forEach((name) => {\n\t\t\tconst value = guestData[name];\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\n\t\tconst $guestTitle = $('.mod_guest_title');\n\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\n\t\t\tif (competitors.length) {\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Подготовить входные параметры перед инициализацией основного функционала\n\t *\n\t * Входные параметры устанавливаются при открытии страницы\n\t *\n\t * Входные параметры могут меняться пользоваталем и устаревать\n\t */\n\t#prepareParams() {\n\t\t// контролль за вводом регионов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.regionsIndexes) {\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\n\t\t\t\tif (!regionsIndexes.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\n\n\t\t\t\t// оставить только включенные регионы\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\n\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\n\t\t\t\t\t\tif (region.index === -1) return;\n\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\n\t\t\t}, { immediate: true });\n\t\t}\n\n\t\t// контролль за вводом конкурентов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds) {\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\n\t\t\t\tif (!competitorsIds.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\n\n\t\t\t\t// оставить только включенных конкурентов\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\n\t\t\t\t});\n\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\n\t\t\t}, { immediate: true });\n\t\t}\n\t}\n\n}\n\ntype Options = {\n\t/**\n\t * TODO: Убрать из плагина\n\t */\n\tPage: any,\n\n\t/**\n\t * Объект с настройками пользователя\n\t */\n\tuser: any,\n\n\t/**\n\t * Объект для работы с API\n\t *\n\t * См. на сайте: @/component/api/core/api.ts\n\t */\n\tApi: any;\n\n\t/**\n\t * Имена свойств для сохранения в URL\n\t */\n\ttpaNamesUrlHash?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage\n\t */\n\ttpaNamesStorage?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\n\t *\n\t * Каждый URL будет работать со своим состоянием\n\t */\n\ttpaNamesStorageLocal?: string[],\n\n\t/**\n\t * Имена свойств для работы с гостевой ссылкой\n\t *\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\n\t */\n\ttpaNamesGuestLink?: string[],\n};\n\ntype Context = PiniaPluginContext & {\n\toptions: Options\n};\n\n/**\n * Плагин tpa (Third-party access) для pinia\n *\n * Добавляет возможность сохранять и загружать данные в/из:\n * \t- URL hash в адресе страницы\n * \t- localStorage\n * \t- гостевая ссылка\n *\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\n * - tpaNamesUrlHash\n * - tpaNamesStorage\n * - tpaNamesStorageLocal\n * - tpaNamesGuestLink\n */\nexport default (contextPinia: PiniaPluginContext) => {\n\tconst context = contextPinia as Context;\n\n\t// плагин подключать не нужно\n\tif (\n\t\t!context.options.tpaNamesUrlHash?.length &&\n\t\t!context.options.tpaNamesStorage?.length &&\n\t\t!context.options.tpaNamesStorageLocal?.length &&\n\t\t!context.options.tpaNamesGuestLink?.length\n\t) {\n\t\treturn;\n\t}\n\n\tnew PiniaTPA(context);\n}\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","context","url","data","#loadFromStorage","save","forms","#saveInStorage","dataGuestLink","#genOptionsForGuestLink","res","utils_clipboard","nameSnakeCase","utils_string","name","currentValue","value","dataFormatted","#loadFromHash","dataHash","utils_route","#setOptions","#saveInHash","dataJSON","isLocal","names","#namesStorage","storageNamespace","#namesStorageLocal","#loadFromGuestLink","guestData","$guestTitle","competitors","competitor","#prepareParams","regionsIndexes","regionIndex","index","mapSearchers","searcher","region","availableRegionsIndexes","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia","_a","_b","_c","_d"],"mappings":"wVAYA,MAAAA,CAAA,CAAeC,GAELC,GACAC,GAKAC,GAEAC,gDASR,KAAAH,GAAAI,EAAA,6PAaAA,EAAA,MAAA,aAAA,CAAAC,EAAAC,IAAA,KAAA,aAAAD,EAAAC,CAAA,mDAIC,KAAAC,GAAA,EAAA,iCAWD,MAAAC,EAAAC,EAAA,SAAA,IAAA,qBAGC,KAAAC,GAAA,EAAA,CAAwB,CAAA,EAGzBN,EAAA,MAAA,WAAAI,CAAA,CAA6B,CAC9B,MAAA,aAAAH,EAAAC,EAAA,CAQC,MAAAK,EAAA,KAAAC,GAAA,EACAN,EAAA,OAAA,OAAAA,EAAA,OAAA,YAAAK,CAAA,CAAA,wDAKAE,GAAA,MAAAA,EAAA,QAGA,MAAAC,EAAA,qBAAAD,EAAA,MAAA,CAAqC,CACtCD,IAAA,CAMC,MAAAN,EAAA,IAAA,+BAIC,MAAAS,EAAAC,EAAA,iBAAAC,CAAA,EACAX,EAAA,IAAAS,EAAA,KAAAf,GAAAiB,CAAA,CAAA,CAAyC,CAAA,EAG1CX,CAAO,wDAWNY,IAAA,QACAC,GAAA,MAAAA,EAAA,yFAUE,GAAA,OAAAA,GAAA,+CAMF,KAAAnB,GAAAiB,CAAA,EAAAE,EAAoB,CAAA,CACpB,OAOD,MAAAC,EAAA,IAAA,6BAGCD,IAAA,OAEAA,EAAA,KAAA,UAAAA,CAAA,EAEAC,EAAA,IAAAH,EAAAE,CAAA,EAA6B,CAAA,EAG9BC,CAAO,OAOP,MAAAd,EAAA,IAAA,6BAGC,GAAA,EAAAa,GAAA,MAAAA,IAAA,SAEA,IAAA,CAGC,0EAAAA,GAAA,MAAAA,IAAA,QAAA,aACW,CAIZb,EAAA,IAAAW,EAAAE,CAAA,EAAoB,CAAA,EAGrBb,CAAO,CACRe,IAAA,CAMC,IAAAC,EACA,GAAA,CACCA,EAAA,KAAA,MAAAC,EAAA,QAAA,KAAAxB,EAAA,CAAA,QACW,cAKZ,MAAAO,EAAA,IAAA,wBAGC,MAAAa,EAAAG,EAAAL,CAAA,KAGAX,EAAA,IAAAW,EAAAE,CAAA,CAAoB,CAAA,EAGrB,KAAAK,GAAAlB,CAAA,CAAqB,CACtBmB,IAAA,CAMC,MAAAnB,EAAA,IAAA,2CAKCA,EAAA,IAAAW,EAAAE,CAAA,CAAoB,CAAA,oDAMrBI,EAAA,QAAA,KAAAxB,GAAA2B,CAAA,CAA+B,CAChCnB,GAAAoB,EAAA,GAAA,CAOC,MAAAP,EAAA,IAAA,IAEA,IAAAQ,EAAA,KAAAC,GACAC,EAAA,SAAA,KAAA/B,OAGC6B,EAAA,KAAAG,GACAD,EAAA,SAAA,KAAA/B,GAAA,IAAA,SAAA,UAGD6B,EAAA,QAAAX,GAAA,CACC,MAAAE,EAAA,aAAA,QAAAW,EAAA,IAAAb,CAAA,EACAG,EAAA,IAAAH,EAAAE,CAAA,CAA6B,CAAA,qBAK9B,KAAAK,GAAAlB,CAAA,CAAqB,CACtBI,GAAAiB,EAAA,GAAA,CAOC,MAAArB,EAAA,IAAA,IAEA,IAAAsB,EAAA,KAAAC,GACAC,EAAA,SAAA,KAAA/B,OAGC6B,EAAA,KAAAG,GACAD,EAAA,SAAA,KAAA/B,GAAA,IAAA,SAAA,UAGD6B,EAAA,QAAAX,GAAA,oBAGCX,EAAA,IAAAW,EAAAE,CAAA,CAAoB,CAAA,qBAKrBS,EAAA,QAAAX,GAAA,iDAG0D,CAAA,CACzD,CACFe,IAAA,8FAUC,KAAA9B,GAAA,KAAA,KAAA,KAAAA,GAAA,sBAAA+B,EAAA,uBAEA,MAAAb,EAAA,IAAA,wBAGC,MAAAD,EAAAc,EAAAhB,CAAA,EACAG,EAAA,IAAAH,EAAAE,CAAA,CAA6B,CAAA,qBAK9B,KAAAK,GAAAlB,CAAA,EAEA,MAAA4B,EAAA,EAAA,kBAAA,4FAIC,IAAAC,EAAA,KAAAlC,GAAA,KAAA,KAAA,YAAA,OAAAmC,GAAAA,EAAA,KAAAH,EAAA,eAAA,CAAA,CAAA,EACAE,EAAA,SACC,EAAA,IAAAD,CAAA,EAAA,KAAA,OAAA,UAAAC,EAAA,CAAA,EAAA,GAAA,EACA,EAAA,IAAAD,CAAA,EAAA,KAAAC,EAAA,CAAA,EAAA,IAAA,EACD,CACD,CACDE,IAAA,CAYC,KAAArC,GAAA,mDAEE,GAAA,CAAAsC,EAAA,OAAA,OAGAA,EAAA,QAAA,CAAAC,EAAAC,IAAAF,EAAAE,CAAA,EAAAD,CAAA,EAIA,MAAAE,EAAA,yBAAA,gBAAA,OAGAA,EAAA,QAAAC,GAAA,uBAEEC,EAAA,QAAA,IAEAC,EAAA,KAAAD,EAAA,KAAA,CAAyC,CAAA,CACzC,CAAA,EAGF,KAAA3C,GAAA,eAAAsC,EAAA,OAAAC,GAAAK,EAAA,SAAAL,CAAA,CAAA,CAAyH,EAAA,CAAA,UAAA,EAAA,CAAA,EAM3H,KAAAvC,GAAA,mDAEE,GAAA,CAAA6C,EAAA,OAAA,OAGAA,EAAA,QAAA,CAAAC,EAAAN,IAAAK,EAAAL,CAAA,EAAAM,CAAA,EAGA,MAAAC,EAAA,CAAA,KAAA9C,GAAA,KAAA,KAAA,QAAA,EAAA,EACA,KAAAA,GAAA,KAAA,KAAA,QAAA,YAAA,QAAAmC,GAAA,CACCA,EAAA,IAAA,GAAAW,EAAA,KAAAX,EAAA,EAAA,CAAkE,CAAA,EAGnE,KAAApC,GAAA,eAAA6C,EAAA,OAAAC,GAAAC,EAAA,SAAAD,CAAA,CAAA,CAA2H,EAAA,CAAA,UAAA,EAAA,CAAA,CAE7H,CAGF,CA+DA,MAAAE,EAAAC,GAAA,uBAIC,GAAAC,EAAA9C,EAAA,QAAA,kBAAA,MAAA8C,EAAA,SAAA,GAAAC,EAAA/C,EAAA,QAAA,kBAAA,MAAA+C,EAAA,SAAA,GAAAC,EAAAhD,EAAA,QAAA,uBAAA,MAAAgD,EAAA,SAAA,GAAAC,EAAAjD,EAAA,QAAA,oBAAA,MAAAiD,EAAA,SASA,IAAAvD,EAAAM,CAAA"}
package/core/app.js CHANGED
@@ -1,12 +1,12 @@
1
- import { d } from "../.chunks/forms-BEMrEl5V.es.js";
2
- import { C as P, i as T, u as b, a as y } from "../.chunks/forms-BEMrEl5V.es.js";
3
- import { c as G } from "../.chunks/core-Bcq6idRz.es.js";
1
+ import { d } from "../.chunks/forms-qJ3k2PG6.es.js";
2
+ import { C as P, i as T, u as b, a as y } from "../.chunks/forms-qJ3k2PG6.es.js";
3
+ import { c as G } from "../.chunks/core-asoGK-7D.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-DIly8mml.es.js";
9
- import { T as j } from "../.chunks/dialogs.vue_vue_type_script_setup_true_lang-BLGKFF8Y.es.js";
8
+ import { u as A, a as D } from "../.chunks/utils-B-1oTT6I.es.js";
9
+ import { T as j } from "../.chunks/dialogs.vue_vue_type_script_setup_true_lang--09NOqOd.es.js";
10
10
  class u {
11
11
  #s;
12
12
  #t;
@@ -15,16 +15,16 @@ class u {
15
15
  */
16
16
  #e;
17
17
  #a;
18
- #h;
18
+ #c;
19
19
  #i = [];
20
20
  #o = [];
21
- #c = [];
22
21
  #r = [];
22
+ #n = [];
23
23
  constructor(s) {
24
24
  var t;
25
- this.#t = s.store, this.#s = this.#t.$id, this.#e = s.options.Page, this.#a = s.options.user, this.#h = s.options.Api, this.#i = s.options.tpaNamesUrlHash || [], this.#o = s.options.tpaNamesStorage || [], this.#c = s.options.tpaNamesStorageLocal || [], this.#r = s.options.tpaNamesGuestLink || [], s.store.genGuestLink = (a, i) => this.genGuestLink(a, i), (t = this.#a.guest_data) != null && t.data || (this.#d(), this.#d(!0), this.#m()), this.#S(), this.#E();
25
+ this.#t = s.store, this.#s = this.#t.$id, this.#e = s.options.Page, this.#a = s.options.user, this.#c = s.options.Api, this.#i = s.options.tpaNamesUrlHash || [], this.#o = s.options.tpaNamesStorage || [], this.#r = s.options.tpaNamesStorageLocal || [], this.#n = s.options.tpaNamesGuestLink || [], s.store.genGuestLink = (a, i) => this.genGuestLink(a, i), (t = this.#a.guest_data) != null && t.data || (this.#d(), this.#d(!0), this.#l()), this.#S(), this.#E();
26
26
  const e = d(() => {
27
- this.#l(), this.#u();
27
+ this.#u(), this.#f(), this.#f(!0);
28
28
  });
29
29
  s.store.$subscribe(e);
30
30
  }
@@ -34,17 +34,17 @@ class u {
34
34
  * Метод, путь к которому указан в url, должен возвращать сгенерированную ссылку
35
35
  */
36
36
  async genGuestLink(s, e) {
37
- const t = this.#f();
37
+ const t = this.#g();
38
38
  e = Object.assign(e, Object.fromEntries(t));
39
- const a = await this.#h.gen(s, "fetchColumn").call({}, e);
39
+ const a = await this.#c.gen(s, "fetchColumn").call({}, e);
40
40
  a != null && a.errors || await f(a.result);
41
41
  }
42
42
  /**
43
43
  * Сгенерировать опции для гостевой ссылки
44
44
  */
45
- #f() {
45
+ #g() {
46
46
  const s = /* @__PURE__ */ new Map();
47
- return this.#r.forEach((e) => {
47
+ return this.#n.forEach((e) => {
48
48
  const t = g(e);
49
49
  s.set(t, this.#t[e]);
50
50
  }), s;
@@ -52,7 +52,7 @@ class u {
52
52
  /**
53
53
  * Установить опции из объекта без фиксации состояния
54
54
  */
55
- #n(s) {
55
+ #h(s) {
56
56
  s.forEach((e, t) => {
57
57
  const a = this.#t[t];
58
58
  if (e != null && a !== void 0 && e != null && e.constructor && e.constructor === a.constructor) {
@@ -67,7 +67,7 @@ class u {
67
67
  /**
68
68
  * Сгенерировать Map объект с опциями со значениями в виде json строк
69
69
  */
70
- #g(s) {
70
+ #m(s) {
71
71
  const e = /* @__PURE__ */ new Map();
72
72
  return s.forEach((t, a) => {
73
73
  t !== null && (t = JSON.stringify(t), e.set(a, t));
@@ -91,7 +91,7 @@ class u {
91
91
  /**
92
92
  * Установить опции из хеша адреса страницы
93
93
  */
94
- #m() {
94
+ #l() {
95
95
  let s;
96
96
  try {
97
97
  s = JSON.parse(m(this.#s));
@@ -102,12 +102,12 @@ class u {
102
102
  this.#i.forEach((t) => {
103
103
  const a = s[t];
104
104
  a && e.set(t, a);
105
- }), this.#n(e);
105
+ }), this.#h(e);
106
106
  }
107
107
  /**
108
108
  * Сохранить опции в хеш адреса страницы
109
109
  */
110
- #l() {
110
+ #u() {
111
111
  const s = /* @__PURE__ */ new Map();
112
112
  this.#i.forEach((a) => {
113
113
  const i = this.#t[a];
@@ -122,26 +122,26 @@ class u {
122
122
  */
123
123
  #d(s = !1) {
124
124
  const e = /* @__PURE__ */ new Map();
125
- let t = "state:" + this.#s;
126
- s && (t = "state:" + this.#s + ":" + location.pathname), this.#o.forEach((i) => {
127
- const o = localStorage.getItem(t + ":" + i);
128
- e.set(i, o);
125
+ let t = this.#o, a = "state:" + this.#s;
126
+ s && (t = this.#r, a = "state:" + this.#s + ":" + location.pathname), t.forEach((o) => {
127
+ const r = localStorage.getItem(a + ":" + o);
128
+ e.set(o, r);
129
129
  });
130
- const a = this.#p(e);
131
- this.#n(a);
130
+ const i = this.#p(e);
131
+ this.#h(i);
132
132
  }
133
133
  /**
134
134
  * Сохранить опции в localStorage
135
135
  * @param isLocal - сохранить с учетом адреса страницы
136
136
  */
137
- #u(s = !1) {
137
+ #f(s = !1) {
138
138
  const e = /* @__PURE__ */ new Map();
139
139
  let t = this.#o, a = "state:" + this.#s;
140
- s && (t = this.#c, a = "state:" + this.#s + ":" + location.pathname), t.forEach((o) => {
140
+ s && (t = this.#r, a = "state:" + this.#s + ":" + location.pathname), t.forEach((o) => {
141
141
  const r = this.#t[o];
142
142
  e.set(o, r);
143
143
  });
144
- const i = this.#g(e);
144
+ const i = this.#m(e);
145
145
  t.forEach((o) => {
146
146
  const r = i.get(o);
147
147
  localStorage.setItem(a + ":" + o, r);
@@ -156,12 +156,12 @@ class u {
156
156
  if (!s) return;
157
157
  this.#a.id === -1 && (this.#a.positionsReverseDates = s.positionsReverseDates);
158
158
  const e = /* @__PURE__ */ new Map();
159
- this.#r.forEach((n) => {
159
+ this.#n.forEach((n) => {
160
160
  const h = s[n];
161
161
  e.set(n, h);
162
162
  });
163
163
  const t = this.#p(e);
164
- this.#n(t);
164
+ this.#h(t);
165
165
  const a = $(".mod_guest_title");
166
166
  if (((r = this.#t.competitorsIds) == null ? void 0 : r.length) === 1 && this.#e.page.data.competitors) {
167
167
  let n = this.#e.page.data.competitors.filter((h) => h.id === s.competitorsIds[0]);
package/core/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\nimport { watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { debounce } from '@/core/utils/lodash';\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\nimport { camelToSnakeCase } from '@/core/utils/string.js';\nimport type { paths as OpenAPIPaths } from 'topvisor-openapi/src/ts/Topvisor';\nimport { getHash, setHash } from '@/core/utils/route';\n\ntype OpenAPIPath = keyof OpenAPIPaths;\n\nclass PiniaTPA {\n\n\treadonly #storeId: string;\n\treadonly #store: Store<string, any>;\n\n\t/**\n\t * @deprecated\n\t */\n\treadonly #Page: any;\n\n\treadonly #user: any;\n\treadonly #Api: any;\n\n\treadonly #namesUrlHash: string[] = [];\n\treadonly #namesStorage: string[] = [];\n\treadonly #namesStorageLocal: string[] = [];\n\treadonly #namesGuestLink: string[] = [];\n\n\tconstructor(context: Context) {\n\t\tthis.#store = context.store;\n\t\tthis.#storeId = this.#store.$id;\n\n\t\tthis.#Page = context.options.Page;\n\n\t\tthis.#user = context.options.user;\n\t\tthis.#Api = context.options.Api;\n\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\n\n\t\tcontext.store.genGuestLink = <Path extends OpenAPIPath>(url: Path, data: any) => this.genGuestLink(url, data);\n\n\t\tif (!this.#user.guest_data?.data) {\n\t\t\tthis.#loadFromStorage();\n\t\t\tthis.#loadFromStorage(true);\n\n\t\t\t// настройки URL hash имеют приоритет\n\t\t\tthis.#loadFromHash();\n\t\t}\n\n\t\t// настройки гостевой ссылки имеют приоритет\n\t\tthis.#loadFromGuestLink();\n\n\t\tthis.#prepareParams();\n\n\t\tconst save = debounce(() => {\n\t\t\tthis.#saveInHash();\n\t\t\tthis.#saveInStorage();\n\t\t});\n\n\t\tcontext.store.$subscribe(save);\n\t}\n\n\t/**\n\t * Сгенерировать гостевую ссылку\n\t *\n\t * Метод, путь к которому указан в url, должен возвращать сгенерированную ссылку\n\t */\n\tasync genGuestLink<Path extends OpenAPIPath>(url: Path, data: any) {\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\n\t\tdata = Object.assign(data, Object.fromEntries(dataGuestLink));\n\n\t\tconst res = await this.#Api.gen(url, 'fetchColumn').call({} as any, data);\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tif (res?.errors) return;\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tawait guestLinkToClipboard(res.result);\n\t}\n\n\t/**\n\t * Сгенерировать опции для гостевой ссылки\n\t */\n\t#genOptionsForGuestLink() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesGuestLink.forEach(name => {\n\t\t\t// формат параметров API: snake_case\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из объекта без фиксации состояния\n\t */\n\t#setOptions(data: Map<string, any>) {\n\t\tdata.forEach((value, name) => {\n\t\t\tconst currentValue = this.#store[name];\n\n\t\t\tif (value === null || value === undefined) return;\n\t\t\tif (currentValue === undefined) return;\n\t\t\tif (!value?.constructor) return;\n\t\t\tif (value.constructor !== currentValue.constructor) return;\n\n\t\t\t// дополнительная проверка на формат даты\n\t\t\tif (name.indexOf('date') === 0) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// value.forEach((valueI) => {\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\n\t\t\t\t\t// });\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof (value) === 'string') {\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#store[name] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\n\t */\n\t#genDataFormat(data: Map<string, any>) {\n\t\tconst dataFormatted = new Map();\n\n\t\tdata.forEach((value, name) => {\n\t\t\tif (value === null) return;\n\n\t\t\tvalue = JSON.stringify(value);\n\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\treturn dataFormatted;\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\n\t */\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tdataFormatted.forEach((value, name) => {\n\t\t\tif (value === null || value === undefined || value === 'false') return;\n\n\t\t\ttry {\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\n\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\n\t\t\t} catch (e) {\n\t\t\t\t// не json строка\n\t\t\t}\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из хеша адреса страницы\n\t */\n\t#loadFromHash() {\n\t\tlet dataHash: any;\n\t\ttry {\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\n\t\t} catch (e) {\n\n\t\t}\n\t\tif (!dataHash) return;\n\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = dataHash[name];\n\t\t\tif (!value) return;\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в хеш адреса страницы\n\t */\n\t#saveInHash() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataObject = Object.fromEntries(data);\n\t\tconst dataJSON = JSON.stringify(dataObject);\n\n\t\tsetHash(this.#storeId, dataJSON);\n\t};\n\n\t/**\n\t * Установить опции из localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#loadFromStorage(isLocal = false) {\n\t\tconst dataFormatted = new Map();\n\n\t\t// let names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\t// names = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tthis.#namesStorage.forEach((name) => {\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#saveInStorage(isLocal = false) {\n\t\tconst data = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataFormatted = this.#genDataFormat(data);\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = dataFormatted.get(name);\n\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\n\t\t});\n\t}\n\n\t/**\n\t * Установить опции из гостевой ссылки\n\t */\n\t#loadFromGuestLink() {\n\t\tconst guestData = this.#user?.guest_data?.data;\n\t\tif (!guestData) return;\n\n\t\t// общие правила для гостевых сессий\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\n\n\t\tconst dataFormatted = new Map();\n\n\t\tthis.#namesGuestLink.forEach((name) => {\n\t\t\tconst value = guestData[name];\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\n\t\tconst $guestTitle = $('.mod_guest_title');\n\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\n\t\t\tif (competitors.length) {\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Подготовить входные параметры перед инициализацией основного функционала\n\t *\n\t * Входные параметры устанавливаются при открытии страницы\n\t *\n\t * Входные параметры могут меняться пользоваталем и устаревать\n\t */\n\t#prepareParams() {\n\t\t// контролль за вводом регионов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.regionsIndexes) {\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\n\t\t\t\tif (!regionsIndexes.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\n\n\t\t\t\t// оставить только включенные регионы\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\n\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\n\t\t\t\t\t\tif (region.index === -1) return;\n\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\n\t\t\t}, { immediate: true });\n\t\t}\n\n\t\t// контролль за вводом конкурентов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds) {\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\n\t\t\t\tif (!competitorsIds.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\n\n\t\t\t\t// оставить только включенных конкурентов\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\n\t\t\t\t});\n\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\n\t\t\t}, { immediate: true });\n\t\t}\n\t}\n\n}\n\ntype Options = {\n\t/**\n\t * TODO: Убрать из плагина\n\t */\n\tPage: any,\n\n\t/**\n\t * Объект с настройками пользователя\n\t */\n\tuser: any,\n\n\t/**\n\t * Объект для работы с API\n\t *\n\t * См. на сайте: @/component/api/core/api.ts\n\t */\n\tApi: any;\n\n\t/**\n\t * Имена свойств для сохранения в URL\n\t */\n\ttpaNamesUrlHash?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage\n\t */\n\ttpaNamesStorage?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\n\t *\n\t * Каждый URL будет работать со своим состоянием\n\t */\n\ttpaNamesStorageLocal?: string[],\n\n\t/**\n\t * Имена свойств для работы с гостевой ссылкой\n\t *\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\n\t */\n\ttpaNamesGuestLink?: string[],\n};\n\ntype Context = PiniaPluginContext & {\n\toptions: Options\n};\n\n/**\n * Плагин tpa (Third-party access) для pinia\n *\n * Добавляет возможность сохранять и загружать данные в/из:\n * \t- URL hash в адресе страницы\n * \t- localStorage\n * \t- гостевая ссылка\n *\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\n * - tpaNamesUrlHash\n * - tpaNamesStorage\n * - tpaNamesStorageLocal\n * - tpaNamesGuestLink\n */\nexport default (contextPinia: PiniaPluginContext) => {\n\tconst context = contextPinia as Context;\n\n\t// плагин подключать не нужно\n\tif (\n\t\t!context.options.tpaNamesUrlHash?.length &&\n\t\t!context.options.tpaNamesStorage?.length &&\n\t\t!context.options.tpaNamesStorageLocal?.length &&\n\t\t!context.options.tpaNamesGuestLink?.length\n\t) {\n\t\treturn;\n\t}\n\n\tnew PiniaTPA(context);\n}\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","#namesUrlHash","#namesStorage","#namesStorageLocal","#namesGuestLink","context","url","data","_a","#loadFromStorage","#loadFromHash","#loadFromGuestLink","#prepareParams","save","debounce","#saveInHash","#saveInStorage","dataGuestLink","#genOptionsForGuestLink","res","guestLinkToClipboard","name","nameSnakeCase","camelToSnakeCase","#setOptions","value","currentValue","#genDataFormat","dataFormatted","#genDataUnFormat","dataHash","getHash","dataObject","dataJSON","setHash","isLocal","storageNamespace","names","guestData","_b","$guestTitle","_c","competitors","competitor","watch","regionsIndexes","regionIndex","index","mapSearchers","availableRegionsIndexes","searcher","region","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia","_d"],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sources":["../../src/core/plugins/piniaTPA.ts"],"sourcesContent":["import type { PiniaPluginContext, Store } from 'pinia';\nimport { watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { debounce } from '@/core/utils/lodash';\nimport { guestLinkToClipboard } from '@/core/utils/clipboard';\nimport { camelToSnakeCase } from '@/core/utils/string.js';\nimport type { paths as OpenAPIPaths } from 'topvisor-openapi/src/ts/Topvisor';\nimport { getHash, setHash } from '@/core/utils/route';\n\ntype OpenAPIPath = keyof OpenAPIPaths;\n\nclass PiniaTPA {\n\n\treadonly #storeId: string;\n\treadonly #store: Store<string, any>;\n\n\t/**\n\t * @deprecated\n\t */\n\treadonly #Page: any;\n\n\treadonly #user: any;\n\treadonly #Api: any;\n\n\treadonly #namesUrlHash: string[] = [];\n\treadonly #namesStorage: string[] = [];\n\treadonly #namesStorageLocal: string[] = [];\n\treadonly #namesGuestLink: string[] = [];\n\n\tconstructor(context: Context) {\n\t\tthis.#store = context.store;\n\t\tthis.#storeId = this.#store.$id;\n\n\t\tthis.#Page = context.options.Page;\n\n\t\tthis.#user = context.options.user;\n\t\tthis.#Api = context.options.Api;\n\n\t\tthis.#namesUrlHash = context.options.tpaNamesUrlHash || [];\n\t\tthis.#namesStorage = context.options.tpaNamesStorage || [];\n\t\tthis.#namesStorageLocal = context.options.tpaNamesStorageLocal || [];\n\t\tthis.#namesGuestLink = context.options.tpaNamesGuestLink || [];\n\n\t\tcontext.store.genGuestLink = <Path extends OpenAPIPath>(url: Path, data: any) => this.genGuestLink(url, data);\n\n\t\tif (!this.#user.guest_data?.data) {\n\t\t\tthis.#loadFromStorage();\n\t\t\tthis.#loadFromStorage(true);\n\n\t\t\t// настройки URL hash имеют приоритет\n\t\t\tthis.#loadFromHash();\n\t\t}\n\n\t\t// настройки гостевой ссылки имеют приоритет\n\t\tthis.#loadFromGuestLink();\n\n\t\tthis.#prepareParams();\n\n\t\tconst save = debounce(() => {\n\t\t\tthis.#saveInHash();\n\t\t\tthis.#saveInStorage();\n\t\t\tthis.#saveInStorage(true);\n\t\t});\n\n\t\tcontext.store.$subscribe(save);\n\t}\n\n\t/**\n\t * Сгенерировать гостевую ссылку\n\t *\n\t * Метод, путь к которому указан в url, должен возвращать сгенерированную ссылку\n\t */\n\tasync genGuestLink<Path extends OpenAPIPath>(url: Path, data: any) {\n\t\tconst dataGuestLink = this.#genOptionsForGuestLink();\n\t\tdata = Object.assign(data, Object.fromEntries(dataGuestLink));\n\n\t\tconst res = await this.#Api.gen(url, 'fetchColumn').call({} as any, data);\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tif (res?.errors) return;\n\n\t\t// @ts-ignore - метод, который скачивает файл не возвращает json\n\t\tawait guestLinkToClipboard(res.result);\n\t}\n\n\t/**\n\t * Сгенерировать опции для гостевой ссылки\n\t */\n\t#genOptionsForGuestLink() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesGuestLink.forEach(name => {\n\t\t\t// формат параметров API: snake_case\n\t\t\tconst nameSnakeCase = camelToSnakeCase(name);\n\t\t\tdata.set(nameSnakeCase, this.#store[name]);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из объекта без фиксации состояния\n\t */\n\t#setOptions(data: Map<string, any>) {\n\t\tdata.forEach((value, name) => {\n\t\t\tconst currentValue = this.#store[name];\n\n\t\t\tif (value === null || value === undefined) return;\n\t\t\tif (currentValue === undefined) return;\n\t\t\tif (!value?.constructor) return;\n\t\t\tif (value.constructor !== currentValue.constructor) return;\n\n\t\t\t// дополнительная проверка на формат даты\n\t\t\tif (name.indexOf('date') === 0) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// value.forEach((valueI) => {\n\t\t\t\t\t// \tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(valueI)) return;\n\t\t\t\t\t// });\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof (value) === 'string') {\n\t\t\t\t\t\tif (!/\\d\\d\\d\\d-\\d\\d-\\d\\d/.test(value)) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#store[name] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в виде json строк\n\t */\n\t#genDataFormat(data: Map<string, any>) {\n\t\tconst dataFormatted = new Map();\n\n\t\tdata.forEach((value, name) => {\n\t\t\tif (value === null) return;\n\n\t\t\tvalue = JSON.stringify(value);\n\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\treturn dataFormatted;\n\t}\n\n\t/**\n\t * Сгенерировать Map объект с опциями со значениями в оригинальном виде\n\t */\n\t#genDataUnFormat(dataFormatted: Map<string, string>) {\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tdataFormatted.forEach((value, name) => {\n\t\t\tif (value === null || value === undefined || value === 'false') return;\n\n\t\t\ttry {\n\t\t\t\tif (typeof (value) === 'string' && !/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/.test(value)) value = JSON.parse(value);\n\n\t\t\t\tif (value === null || value === undefined || value === 'false') return;\n\t\t\t} catch (e) {\n\t\t\t\t// не json строка\n\t\t\t}\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Установить опции из хеша адреса страницы\n\t */\n\t#loadFromHash() {\n\t\tlet dataHash: any;\n\t\ttry {\n\t\t\tdataHash = JSON.parse(getHash(this.#storeId));\n\t\t} catch (e) {\n\n\t\t}\n\t\tif (!dataHash) return;\n\n\t\tconst data: Map<string, any> = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = dataHash[name];\n\t\t\tif (!value) return;\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в хеш адреса страницы\n\t */\n\t#saveInHash() {\n\t\tconst data = new Map();\n\n\t\tthis.#namesUrlHash.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataObject = Object.fromEntries(data);\n\t\tconst dataJSON = JSON.stringify(dataObject);\n\n\t\tsetHash(this.#storeId, dataJSON);\n\t};\n\n\t/**\n\t * Установить опции из localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#loadFromStorage(isLocal = false) {\n\t\tconst dataFormatted = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = localStorage.getItem(storageNamespace + ':' + name);\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\t}\n\n\t/**\n\t * Сохранить опции в localStorage\n\t * @param isLocal - сохранить с учетом адреса страницы\n\t */\n\t#saveInStorage(isLocal = false) {\n\t\tconst data = new Map();\n\n\t\tlet names = this.#namesStorage;\n\t\tlet storageNamespace = 'state:' + this.#storeId;\n\n\t\tif (isLocal) {\n\t\t\tnames = this.#namesStorageLocal;\n\t\t\tstorageNamespace = 'state:' + this.#storeId + ':' + location.pathname;\n\t\t}\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = this.#store[name];\n\n\t\t\tdata.set(name, value);\n\t\t});\n\n\t\tconst dataFormatted = this.#genDataFormat(data);\n\n\t\tnames.forEach((name) => {\n\t\t\tconst value = dataFormatted.get(name);\n\n\t\t\tlocalStorage.setItem(storageNamespace + ':' + name, value);\n\t\t});\n\t}\n\n\t/**\n\t * Установить опции из гостевой ссылки\n\t */\n\t#loadFromGuestLink() {\n\t\tconst guestData = this.#user?.guest_data?.data;\n\t\tif (!guestData) return;\n\n\t\t// общие правила для гостевых сессий\n\t\tif (this.#user.id === -1) this.#user.positionsReverseDates = guestData.positionsReverseDates;\n\n\t\tconst dataFormatted = new Map();\n\n\t\tthis.#namesGuestLink.forEach((name) => {\n\t\t\tconst value = guestData[name];\n\t\t\tdataFormatted.set(name, value);\n\t\t});\n\n\t\tconst data = this.#genDataUnFormat(dataFormatted);\n\n\t\tthis.#setOptions(data);\n\n\t\tconst $guestTitle = $('.mod_guest_title');\n\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds?.length === 1 && this.#Page.page.data.competitors) {\n\t\t\tlet competitors = this.#Page.page.data.competitors.filter((competitor: any) => competitor.id === guestData.competitorsIds[0]);\n\t\t\tif (competitors.length) {\n\t\t\t\t$('a', $guestTitle).attr('href', 'http://' + competitors[0].url);\n\t\t\t\t$('a', $guestTitle).text(competitors[0].name);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Подготовить входные параметры перед инициализацией основного функционала\n\t *\n\t * Входные параметры устанавливаются при открытии страницы\n\t *\n\t * Входные параметры могут меняться пользоваталем и устаревать\n\t */\n\t#prepareParams() {\n\t\t// контролль за вводом регионов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.regionsIndexes) {\n\t\t\twatch(this.#store.regionsIndexes, (regionsIndexes) => {\n\t\t\t\tif (!regionsIndexes.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tregionsIndexes.forEach((regionIndex: number, index: number) => regionsIndexes[index] = regionIndex);\n\n\t\t\t\t// оставить только включенные регионы\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst mapSearchers = TplProjectSelectorRegion.genSearchersMap();\n\n\t\t\t\tconst availableRegionsIndexes: number[] = [];\n\t\t\t\tmapSearchers.forEach((searcher: any) => {\n\t\t\t\t\tsearcher.regions.forEach((region: any) => {\n\t\t\t\t\t\tif (region.index === -1) return;\n\n\t\t\t\t\t\tavailableRegionsIndexes.push(region.index);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tthis.#store.regionsIndexes = regionsIndexes.filter((regionIndex: number) => availableRegionsIndexes.includes(regionIndex));\n\t\t\t}, { immediate: true });\n\t\t}\n\n\t\t// контролль за вводом конкурентов\n\t\t// TODO: вынести в опции плагина\n\t\tif (this.#store.competitorsIds) {\n\t\t\twatch(this.#store.competitorsIds, (competitorsIds) => {\n\t\t\t\tif (!competitorsIds.length) return;\n\n\t\t\t\t// приведение типа\n\t\t\t\tcompetitorsIds.forEach((competitorId: number, index: number) => competitorsIds[index] = competitorId);\n\n\t\t\t\t// оставить только включенных конкурентов\n\t\t\t\tconst availableCompetitorsIds = [this.#Page.page.data.project.id];\n\t\t\t\tthis.#Page.page.data.project.competitors.forEach((competitor: any) => {\n\t\t\t\t\tif (competitor.on >= 0) availableCompetitorsIds.push(competitor.id);\n\t\t\t\t});\n\n\t\t\t\tthis.#store.competitorsIds = competitorsIds.filter((competitorId: number) => availableCompetitorsIds.includes(competitorId));\n\t\t\t}, { immediate: true });\n\t\t}\n\t}\n\n}\n\ntype Options = {\n\t/**\n\t * TODO: Убрать из плагина\n\t */\n\tPage: any,\n\n\t/**\n\t * Объект с настройками пользователя\n\t */\n\tuser: any,\n\n\t/**\n\t * Объект для работы с API\n\t *\n\t * См. на сайте: @/component/api/core/api.ts\n\t */\n\tApi: any;\n\n\t/**\n\t * Имена свойств для сохранения в URL\n\t */\n\ttpaNamesUrlHash?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage\n\t */\n\ttpaNamesStorage?: string[],\n\n\t/**\n\t * Имена свойств для сохранения в localStorage с учетом пути URL\n\t *\n\t * Каждый URL будет работать со своим состоянием\n\t */\n\ttpaNamesStorageLocal?: string[],\n\n\t/**\n\t * Имена свойств для работы с гостевой ссылкой\n\t *\n\t * Для генерации гостевой ссылки используйте store.genGuestLink(data, url)\n\t */\n\ttpaNamesGuestLink?: string[],\n};\n\ntype Context = PiniaPluginContext & {\n\toptions: Options\n};\n\n/**\n * Плагин tpa (Third-party access) для pinia\n *\n * Добавляет возможность сохранять и загружать данные в/из:\n * \t- URL hash в адресе страницы\n * \t- localStorage\n * \t- гостевая ссылка\n *\n * Для подключения плагина нужно указань одну или несколько опций при определении defineStore():\n * - tpaNamesUrlHash\n * - tpaNamesStorage\n * - tpaNamesStorageLocal\n * - tpaNamesGuestLink\n */\nexport default (contextPinia: PiniaPluginContext) => {\n\tconst context = contextPinia as Context;\n\n\t// плагин подключать не нужно\n\tif (\n\t\t!context.options.tpaNamesUrlHash?.length &&\n\t\t!context.options.tpaNamesStorage?.length &&\n\t\t!context.options.tpaNamesStorageLocal?.length &&\n\t\t!context.options.tpaNamesGuestLink?.length\n\t) {\n\t\treturn;\n\t}\n\n\tnew PiniaTPA(context);\n}\n"],"names":["PiniaTPA","#storeId","#store","#Page","#user","#Api","#namesUrlHash","#namesStorage","#namesStorageLocal","#namesGuestLink","context","url","data","_a","#loadFromStorage","#loadFromHash","#loadFromGuestLink","#prepareParams","save","debounce","#saveInHash","#saveInStorage","dataGuestLink","#genOptionsForGuestLink","res","guestLinkToClipboard","name","nameSnakeCase","camelToSnakeCase","#setOptions","value","currentValue","#genDataFormat","dataFormatted","#genDataUnFormat","dataHash","getHash","dataObject","dataJSON","setHash","isLocal","names","storageNamespace","guestData","_b","$guestTitle","_c","competitors","competitor","watch","regionsIndexes","regionIndex","index","mapSearchers","availableRegionsIndexes","searcher","region","competitorsIds","competitorId","availableCompetitorsIds","piniaTPA","contextPinia","_d"],"mappings":"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"}
@@ -11,7 +11,7 @@ declare const TopNotice: DefineComponent<Props, {}, {}, {}, {}, ComponentOptions
11
11
  declare global {
12
12
  const vd: typeof console.log;
13
13
  }
14
- declare module 'vue' {
14
+ declare module '@vue/runtime-core' {
15
15
  interface ComponentCustomProperties {
16
16
  /**
17
17
  * Статический класс с текущим состоянимем UI
@@ -27,8 +27,8 @@ type Options = {
27
27
  * ```
28
28
  */
29
29
  type I18n = Reactive<Options['i18n']>;
30
- type i18nRender = <T extends keyof I18n>(categoryName: T, key: keyof I18n[T], props: Record<string, number | string>) => string;
31
- declare module 'vue' {
30
+ type I18nRender = <T extends keyof I18n>(categoryName: T, key: keyof I18n[T], props: Record<string, number | string>) => string;
31
+ declare module '@vue/runtime-core' {
32
32
  interface ComponentCustomProperties {
33
33
  /**
34
34
  * Загруженные словари
@@ -36,9 +36,9 @@ declare module 'vue' {
36
36
  * Можно использовать как функцию для подстановки значений в формате: `Текст {{ propName }}`
37
37
  *
38
38
  * @see I18n
39
- * @see i18nRender
39
+ * @see I18nRender
40
40
  */
41
- $i18n: I18n & i18nRender;
41
+ $i18n: I18n & I18nRender;
42
42
  /**
43
43
  * Текущий язык
44
44
  */
@@ -19,7 +19,7 @@ export declare const searchersNames: {
19
19
  * Получить иконку ПС
20
20
  * @param searcherKey - цифра или строка с цифрой обозначающая ПС. Если null вернется иконка с глобусом
21
21
  */
22
- export declare const getSearcherGIcon: (searcherKey: number | string | null) => string;
22
+ export declare const getSearcherGIcon: (searcherKey: number | string | undefined) => string;
23
23
  /**
24
24
  * Получить иконку устройства (ПК, планшет, смартфон)
25
25
  */
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/page.vue_vue_type_script_setup_true_lang-BI9HWAyQ.amd","vue","../.chunks/utils-CTjq0RlC.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-D8EtPAsl.amd","vue","../.chunks/utils-BPFSJAiy.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
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.amd.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\n\t/**\n\t * Статус загрузки страницы диалогового окна\n\t *\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\n\t */\n\tisLoading?: boolean;\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n */\nexport interface PropsCommon {\n\t/**\n\t * Имя страницы для диалогового окна\n\t *\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\n\t */\n\tname: string,\n\n\t/**\n\t * Порядкой номер страницы в диалоговом окне\n\t *\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\n\t */\n\torder: number,\n\n\t/**\n\t * Имя предыдущей страницы\n\t *\n\t * Для кнопки Назад / Закрыть в мобильной версии\n\t */\n\tprevName?: string,\n\n\t/**\n\t * Стиль отображения футера, при котороым элементы растягиваются на всю ширину\n\t *\n\t * Разрешены переносы\n\t */\n\tfooterFullWith?: boolean,\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n *\n * Для не SFC компонентов\n */\nexport const propsPageCommon = {\n\tname: {\n\t\ttype: String,\n\t\trequired: true,\n\t},\n\n\torder: {\n\t\ttype: Number,\n\t\trequired: true,\n\t},\n\n\tprevName: String,\n\n\tfooterFullWith: Boolean,\n};\n\nexport interface Slots {\n\t/**\n\t * Шапка страницы\n\t */\n\theader(props: {}): any;\n\n\t/**\n\t * Кнопки для шапки страницы\n\t */\n\theaderButtons(props: {}): any;\n\n\t/**\n\t * Контент страницы\n\t */\n\tbody(props: {}): any;\n\n\t/**\n\t * Футер страницы\n\t */\n\tfooter(props: {}): any;\n}\n","<script setup lang=\"ts\">\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tkeepAlive: true,\n});\n\nconst dialog = useTopDialogSelf();\n\n/**\n * Статус загрузи асинхронного компонента страницы диалогового окна\n */\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\n\tif (isLoaded.value) return;\n\n\tif (component.name !== 'AsyncComponentWrapper') {\n\t\tisLoaded.value = true;\n\n\t\treturn;\n\t}\n\n\tif (!dialog.needShowPage(props.name as string)) return;\n\n\tdialog.isLoadingPage.value = true;\n\n\t// @ts-ignore\n\tif (component.__asyncResolved) {\n\t\tisLoaded.value = true;\n\n\t\tdialog.isLoadingPage.value = false;\n\t}\n};\n\nif (props.component.name === 'AsyncComponentWrapper') {\n\tconst isLoaded = ref(false);\n\n\tonUpdated(() => {\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\n\t});\n}\n</script>\n\n<template>\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\n\t\t<Component\n\t\t\t:is=\"component\"\n\t\t\tv-if=\"dialog.needShowPage(name)\"\n\t\t\t:=\"props\"\n\t\t\t:name=\"name\"\n\t\t\t:order=\"order\"\n\t\t\t:prevName=\"prevName\"\n\t\t/>\n\t</KeepAlive>\n</template>\n"],"names":["propsPageCommon","dialog","utils","updateIsLoadingAsyncPage","component","isLoaded","vue","props"],"mappings":"wMA+CO,MAAAA,EAAA,CAAwB,KAAA,aAEvB,SAAA,IAEP,MAAA,aAGO,SAAA,oBAIG,eAAA,OAGX,8LCpDAC,EAAAC,EAAA,iBAAA,EAKAC,EAAA,CAAAC,EAAAC,IAAA,CACC,GAAA,CAAAA,EAAA,MAEA,IAAAD,EAAA,OAAA,wBAAA,CACCC,EAAA,MAAA,SAEA,0BAKDJ,EAAA,cAAA,MAAA,GAGAG,EAAA,kBACCC,EAAA,MAAA,GAEAJ,EAAA,cAAA,MAAA,sDAKD,MAAAI,EAAAC,EAAA,IAAA,EAAA,mBAGCH,EAAAI,EAAA,UAAAF,CAAA,CAAkD,CAAA,CAClD"}
1
+ {"version":3,"file":"dialog.amd.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\n\t/**\n\t * Статус загрузки страницы диалогового окна\n\t *\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\n\t */\n\tisLoading?: boolean;\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n */\nexport interface PropsCommon {\n\t/**\n\t * Имя страницы для диалогового окна\n\t *\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\n\t */\n\tname: string,\n\n\t/**\n\t * Порядкой номер страницы в диалоговом окне\n\t *\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\n\t */\n\torder: number,\n\n\t/**\n\t * Имя предыдущей страницы\n\t *\n\t * Для кнопки Назад / Закрыть в мобильной версии\n\t */\n\tprevName?: string,\n\n\t/**\n\t * Стиль отображения футера, при котороым элементы растягиваются на всю ширину\n\t *\n\t * Разрешены переносы\n\t */\n\tfooterFullWith?: boolean,\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n *\n * Для не SFC компонентов\n */\nexport const propsPageCommon = {\n\tname: {\n\t\ttype: String,\n\t\trequired: true,\n\t},\n\n\torder: {\n\t\ttype: Number,\n\t\trequired: true,\n\t},\n\n\tprevName: String,\n\n\tfooterFullWith: Boolean,\n};\n\nexport interface Slots {\n\t/**\n\t * Шапка страницы\n\t */\n\theader(props: {}): any;\n\n\t/**\n\t * Кнопки для шапки страницы\n\t */\n\theaderButtons?(props: {}): any;\n\n\t/**\n\t * Контент страницы\n\t */\n\tbody(props: {}): any;\n\n\t/**\n\t * Футер страницы\n\t */\n\tfooter?(props: {}): any;\n}\n","<script setup lang=\"ts\">\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tkeepAlive: true,\n});\n\nconst dialog = useTopDialogSelf();\n\n/**\n * Статус загрузи асинхронного компонента страницы диалогового окна\n */\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\n\tif (isLoaded.value) return;\n\n\tif (component.name !== 'AsyncComponentWrapper') {\n\t\tisLoaded.value = true;\n\n\t\treturn;\n\t}\n\n\tif (!dialog.needShowPage(props.name as string)) return;\n\n\tdialog.isLoadingPage.value = true;\n\n\t// @ts-ignore\n\tif (component.__asyncResolved) {\n\t\tisLoaded.value = true;\n\n\t\tdialog.isLoadingPage.value = false;\n\t}\n};\n\nif (props.component.name === 'AsyncComponentWrapper') {\n\tconst isLoaded = ref(false);\n\n\tonUpdated(() => {\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\n\t});\n}\n</script>\n\n<template>\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\n\t\t<Component\n\t\t\t:is=\"component\"\n\t\t\tv-if=\"dialog.needShowPage(name)\"\n\t\t\t:=\"props\"\n\t\t\t:name=\"name\"\n\t\t\t:order=\"order\"\n\t\t\t:prevName=\"prevName\"\n\t\t/>\n\t</KeepAlive>\n</template>\n"],"names":["propsPageCommon","dialog","utils","updateIsLoadingAsyncPage","component","isLoaded","vue","props"],"mappings":"wMA+CO,MAAAA,EAAA,CAAwB,KAAA,aAEvB,SAAA,IAEP,MAAA,aAGO,SAAA,oBAIG,eAAA,OAGX,8LCpDAC,EAAAC,EAAA,iBAAA,EAKAC,EAAA,CAAAC,EAAAC,IAAA,CACC,GAAA,CAAAA,EAAA,MAEA,IAAAD,EAAA,OAAA,wBAAA,CACCC,EAAA,MAAA,SAEA,0BAKDJ,EAAA,cAAA,MAAA,GAGAG,EAAA,kBACCC,EAAA,MAAA,GAEAJ,EAAA,cAAA,MAAA,sDAKD,MAAAI,EAAAC,EAAA,IAAA,EAAA,mBAGCH,EAAAI,EAAA,UAAAF,CAAA,CAAkD,CAAA,CAClD"}
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-CCE8pKg7.es.js";
1
+ import { _ as k, a as B } from "../.chunks/page.vue_vue_type_script_setup_true_lang-SJpF_87B.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-DIly8mml.es.js";
3
+ import { b as v } from "../.chunks/utils-B-1oTT6I.es.js";
4
4
  const C = {
5
5
  name: {
6
6
  type: String,
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\n\t/**\n\t * Статус загрузки страницы диалогового окна\n\t *\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\n\t */\n\tisLoading?: boolean;\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n */\nexport interface PropsCommon {\n\t/**\n\t * Имя страницы для диалогового окна\n\t *\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\n\t */\n\tname: string,\n\n\t/**\n\t * Порядкой номер страницы в диалоговом окне\n\t *\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\n\t */\n\torder: number,\n\n\t/**\n\t * Имя предыдущей страницы\n\t *\n\t * Для кнопки Назад / Закрыть в мобильной версии\n\t */\n\tprevName?: string,\n\n\t/**\n\t * Стиль отображения футера, при котороым элементы растягиваются на всю ширину\n\t *\n\t * Разрешены переносы\n\t */\n\tfooterFullWith?: boolean,\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n *\n * Для не SFC компонентов\n */\nexport const propsPageCommon = {\n\tname: {\n\t\ttype: String,\n\t\trequired: true,\n\t},\n\n\torder: {\n\t\ttype: Number,\n\t\trequired: true,\n\t},\n\n\tprevName: String,\n\n\tfooterFullWith: Boolean,\n};\n\nexport interface Slots {\n\t/**\n\t * Шапка страницы\n\t */\n\theader(props: {}): any;\n\n\t/**\n\t * Кнопки для шапки страницы\n\t */\n\theaderButtons(props: {}): any;\n\n\t/**\n\t * Контент страницы\n\t */\n\tbody(props: {}): any;\n\n\t/**\n\t * Футер страницы\n\t */\n\tfooter(props: {}): any;\n}\n","<script setup lang=\"ts\">\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tkeepAlive: true,\n});\n\nconst dialog = useTopDialogSelf();\n\n/**\n * Статус загрузи асинхронного компонента страницы диалогового окна\n */\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\n\tif (isLoaded.value) return;\n\n\tif (component.name !== 'AsyncComponentWrapper') {\n\t\tisLoaded.value = true;\n\n\t\treturn;\n\t}\n\n\tif (!dialog.needShowPage(props.name as string)) return;\n\n\tdialog.isLoadingPage.value = true;\n\n\t// @ts-ignore\n\tif (component.__asyncResolved) {\n\t\tisLoaded.value = true;\n\n\t\tdialog.isLoadingPage.value = false;\n\t}\n};\n\nif (props.component.name === 'AsyncComponentWrapper') {\n\tconst isLoaded = ref(false);\n\n\tonUpdated(() => {\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\n\t});\n}\n</script>\n\n<template>\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\n\t\t<Component\n\t\t\t:is=\"component\"\n\t\t\tv-if=\"dialog.needShowPage(name)\"\n\t\t\t:=\"props\"\n\t\t\t:name=\"name\"\n\t\t\t:order=\"order\"\n\t\t\t:prevName=\"prevName\"\n\t\t/>\n\t</KeepAlive>\n</template>\n"],"names":["propsPageCommon","props","__props","dialog","useTopDialogSelf","updateIsLoadingAsyncPage","component","isLoaded","ref","onUpdated"],"mappings":";;;AA+CO,MAAMA,IAAkB;AAAA,EAC9B,MAAM;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,OAAO;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,UAAU;AAAA,EAEV,gBAAgB;AACjB;;;;;;;;;;;;ACxDA,UAAMC,IAAQC,GAIRC,IAASC,EAAiB,GAK1BC,IAA2B,CAACC,GAAsBC,MAAkB;AACzE,UAAI,CAAAA,EAAS,OAET;AAAA,YAAAD,EAAU,SAAS,yBAAyB;AAC/C,UAAAC,EAAS,QAAQ;AAEjB;AAAA,QAAA;AAGD,QAAKJ,EAAO,aAAaF,EAAM,IAAc,MAE7CE,EAAO,cAAc,QAAQ,IAGzBG,EAAU,oBACbC,EAAS,QAAQ,IAEjBJ,EAAO,cAAc,QAAQ;AAAA;AAAA,IAE/B;AAEI,QAAAF,EAAM,UAAU,SAAS,yBAAyB;AAC/C,YAAAM,IAAWC,EAAI,EAAK;AAE1B,MAAAC,EAAU,MAAM;AACU,QAAAJ,EAAAJ,EAAM,WAAWM,CAAQ;AAAA,MAAA,CAClD;AAAA,IAAA;;;;;;;;;;;;"}
1
+ {"version":3,"file":"dialog.js","sources":["../../src/components/dialog/dialog/page/types.ts","../../src/components/dialog/dialog/pageComponent/pageComponent.vue"],"sourcesContent":["export interface Props extends PropsCommon {\n\t/**\n\t * Статус загрузки страницы диалогового окна\n\t *\n\t * При включении взаимодействие со страницей блокируется, отображается анимация загрузки\n\t */\n\tisLoading?: boolean;\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n */\nexport interface PropsCommon {\n\t/**\n\t * Имя страницы для диалогового окна\n\t *\n\t * Имя страницы нужно для навигации между страницами в одном диалоговом окне\n\t */\n\tname: string,\n\n\t/**\n\t * Порядкой номер страницы в диалоговом окне\n\t *\n\t * Одна и та же страница может быть подключена в разные диалоговые окна и иметь разный порядковый номер\n\t */\n\torder: number,\n\n\t/**\n\t * Имя предыдущей страницы\n\t *\n\t * Для кнопки Назад / Закрыть в мобильной версии\n\t */\n\tprevName?: string,\n\n\t/**\n\t * Стиль отображения футера, при котороым элементы растягиваются на всю ширину\n\t *\n\t * Разрешены переносы\n\t */\n\tfooterFullWith?: boolean,\n}\n\n/**\n * Общие props для компонентов реализуюущих TopDialogPage\n *\n * Для не SFC компонентов\n */\nexport const propsPageCommon = {\n\tname: {\n\t\ttype: String,\n\t\trequired: true,\n\t},\n\n\torder: {\n\t\ttype: Number,\n\t\trequired: true,\n\t},\n\n\tprevName: String,\n\n\tfooterFullWith: Boolean,\n};\n\nexport interface Slots {\n\t/**\n\t * Шапка страницы\n\t */\n\theader(props: {}): any;\n\n\t/**\n\t * Кнопки для шапки страницы\n\t */\n\theaderButtons?(props: {}): any;\n\n\t/**\n\t * Контент страницы\n\t */\n\tbody(props: {}): any;\n\n\t/**\n\t * Футер страницы\n\t */\n\tfooter?(props: {}): any;\n}\n","<script setup lang=\"ts\">\nimport { type Component, onUpdated, ref, type Ref } from 'vue';\nimport { useTopDialogSelf } from '@/components/dialog/dialog/composables/utils';\nimport type { Props } from './types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tkeepAlive: true,\n});\n\nconst dialog = useTopDialogSelf();\n\n/**\n * Статус загрузи асинхронного компонента страницы диалогового окна\n */\nconst updateIsLoadingAsyncPage = (component: Component, isLoaded: Ref) => {\n\tif (isLoaded.value) return;\n\n\tif (component.name !== 'AsyncComponentWrapper') {\n\t\tisLoaded.value = true;\n\n\t\treturn;\n\t}\n\n\tif (!dialog.needShowPage(props.name as string)) return;\n\n\tdialog.isLoadingPage.value = true;\n\n\t// @ts-ignore\n\tif (component.__asyncResolved) {\n\t\tisLoaded.value = true;\n\n\t\tdialog.isLoadingPage.value = false;\n\t}\n};\n\nif (props.component.name === 'AsyncComponentWrapper') {\n\tconst isLoaded = ref(false);\n\n\tonUpdated(() => {\n\t\tupdateIsLoadingAsyncPage(props.component, isLoaded);\n\t});\n}\n</script>\n\n<template>\n\t<!-- Teleport внутри при keepAlive размонитроваться не будет, см. TopDialogPage -->\n\t<KeepAlive :include=\"keepAlive ? '' : 'none'\">\n\t\t<Component\n\t\t\t:is=\"component\"\n\t\t\tv-if=\"dialog.needShowPage(name)\"\n\t\t\t:=\"props\"\n\t\t\t:name=\"name\"\n\t\t\t:order=\"order\"\n\t\t\t:prevName=\"prevName\"\n\t\t/>\n\t</KeepAlive>\n</template>\n"],"names":["propsPageCommon","props","__props","dialog","useTopDialogSelf","updateIsLoadingAsyncPage","component","isLoaded","ref","onUpdated"],"mappings":";;;AA+CO,MAAMA,IAAkB;AAAA,EAC9B,MAAM;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,OAAO;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EAEA,UAAU;AAAA,EAEV,gBAAgB;AACjB;;;;;;;;;;;;ACxDA,UAAMC,IAAQC,GAIRC,IAASC,EAAiB,GAK1BC,IAA2B,CAACC,GAAsBC,MAAkB;AACzE,UAAI,CAAAA,EAAS,OAET;AAAA,YAAAD,EAAU,SAAS,yBAAyB;AAC/C,UAAAC,EAAS,QAAQ;AAEjB;AAAA,QAAA;AAGD,QAAKJ,EAAO,aAAaF,EAAM,IAAc,MAE7CE,EAAO,cAAc,QAAQ,IAGzBG,EAAU,oBACbC,EAAS,QAAQ,IAEjBJ,EAAO,cAAc,QAAQ;AAAA;AAAA,IAE/B;AAEI,QAAAF,EAAM,UAAU,SAAS,yBAAyB;AAC/C,YAAAM,IAAWC,EAAI,EAAK;AAE1B,MAAAC,EAAU,MAAM;AACU,QAAAJ,EAAAJ,EAAM,WAAWM,CAAQ;AAAA,MAAA,CAClD;AAAA,IAAA;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms-B3bJpLOo.amd"],function(n,T,a){"use strict";if(typeof e>"u")var e=window.Vue;T.TopAvatar=a.TopAvatar,T.TopButton=a.TopButton,T.TopCheckbox=a.TopCheckbox,T.TopControlLabel=a.TopControlLabel,T.TopHint=a.TopHint,T.TopInput=a.TopInput,T.TopInputDate=a.TopInputDate,T.TopInputRange=a.TopInputRange,T.TopLoadbar=a.TopLoadbar,T.TopRadio=a.TopRadio,T.TopSelect=a.TopSelect,T.TopSwitcher=a.TopSwitcher,T.TopTextarea=a.TopTextarea,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})});
1
+ define(["require","exports","../.chunks/forms-CD0nOB5f.amd"],function(n,T,a){"use strict";if(typeof e>"u")var e=window.Vue;T.TopAvatar=a.TopAvatar,T.TopButton=a.TopButton,T.TopCheckbox=a.TopCheckbox,T.TopControlLabel=a.TopControlLabel,T.TopHint=a.TopHint,T.TopInput=a.TopInput,T.TopInputDate=a.TopInputDate,T.TopInputRange=a.TopInputRange,T.TopLoadbar=a.TopLoadbar,T.TopRadio=a.TopRadio,T.TopSelect=a.TopSelect,T.TopSwitcher=a.TopSwitcher,T.TopTextarea=a.TopTextarea,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=forms.amd.js.map
package/forms/forms.js CHANGED
@@ -1,4 +1,4 @@
1
- import { T as p, g as T, h as s, j as t, k as e, l as n, m as r, n as l, o as u, p as b, q as c, r as h, s as i } from "../.chunks/forms-BEMrEl5V.es.js";
1
+ import { T as p, g as T, h as s, j as t, k as e, l as n, m as r, n as l, o as u, p as b, q as c, r as h, s as i } from "../.chunks/forms-qJ3k2PG6.es.js";
2
2
  export {
3
3
  p as TopAvatar,
4
4
  T as TopButton,