@topvisor/ui 1.5.6-competitorSelector.1 → 1.5.6-topSelectorReactive.0

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 (51) hide show
  1. package/.chunks/{app-0qVCkgOO.amd.js → app-CQnQGya1.amd.js} +2 -2
  2. package/.chunks/{app-0qVCkgOO.amd.js.map → app-CQnQGya1.amd.js.map} +1 -1
  3. package/.chunks/{app-0qVCkgOO.esm.js → app-CQnQGya1.esm.js} +2 -2
  4. package/.chunks/{app-0qVCkgOO.esm.js.map → app-CQnQGya1.esm.js.map} +1 -1
  5. package/.chunks/{dialog-CdgC31H2.amd.js → dialog-B7DkbSQZ.amd.js} +2 -2
  6. package/.chunks/{dialog-CdgC31H2.amd.js.map → dialog-B7DkbSQZ.amd.js.map} +1 -1
  7. package/.chunks/{dialog-CdgC31H2.esm.js → dialog-B7DkbSQZ.esm.js} +2 -2
  8. package/.chunks/{dialog-CdgC31H2.esm.js.map → dialog-B7DkbSQZ.esm.js.map} +1 -1
  9. package/.chunks/{dialog_regionSelectorRegions-BFpuUEJM.amd.js → dialog_regionSelectorRegions-DnDFRV42.amd.js} +2 -2
  10. package/.chunks/{dialog_regionSelectorRegions-BFpuUEJM.amd.js.map → dialog_regionSelectorRegions-DnDFRV42.amd.js.map} +1 -1
  11. package/.chunks/{dialog_regionSelectorRegions-BFpuUEJM.esm.js → dialog_regionSelectorRegions-DnDFRV42.esm.js} +3 -3
  12. package/.chunks/{dialog_regionSelectorRegions-BFpuUEJM.esm.js.map → dialog_regionSelectorRegions-DnDFRV42.esm.js.map} +1 -1
  13. package/.chunks/formsExt-kZL0--bf.amd.js +2 -0
  14. package/.chunks/formsExt-kZL0--bf.amd.js.map +1 -0
  15. package/.chunks/{formsExt-Bk_fn1Pg.esm.js → formsExt-kZL0--bf.esm.js} +6 -2
  16. package/.chunks/formsExt-kZL0--bf.esm.js.map +1 -0
  17. package/.chunks/{utils-3uWRvFcX.amd.js → utils-D4nhUVHm.amd.js} +2 -2
  18. package/.chunks/{utils-3uWRvFcX.amd.js.map → utils-D4nhUVHm.amd.js.map} +1 -1
  19. package/.chunks/{utils-3uWRvFcX.esm.js → utils-D4nhUVHm.esm.js} +2 -2
  20. package/.chunks/{utils-3uWRvFcX.esm.js.map → utils-D4nhUVHm.esm.js.map} +1 -1
  21. package/.chunks/{utils-BiOp5DHs.amd.js → utils-DKbnf1Th.amd.js} +2 -2
  22. package/.chunks/utils-DKbnf1Th.amd.js.map +1 -0
  23. package/.chunks/{utils-BiOp5DHs.esm.js → utils-DKbnf1Th.esm.js} +3 -3
  24. package/.chunks/{utils-BiOp5DHs.esm.js.map → utils-DKbnf1Th.esm.js.map} +1 -1
  25. package/autoload-css-manifest.amd.json +2 -2
  26. package/autoload-css-manifest.json +2 -2
  27. package/core/app.amd.js +1 -1
  28. package/core/app.amd.js.map +1 -1
  29. package/core/app.js +2 -2
  30. package/dialog/dialog.amd.js +1 -1
  31. package/dialog/dialog.amd.js.map +1 -1
  32. package/dialog/dialog.js +2 -2
  33. package/formsExt/formsExt.amd.js +1 -1
  34. package/formsExt/formsExt.amd.js.map +1 -1
  35. package/formsExt/formsExt.js +1 -1
  36. package/package.json +1 -1
  37. package/project/project.amd.js +1 -1
  38. package/project/project.amd.js.map +1 -1
  39. package/project/project.js +9 -7
  40. package/project/project.js.map +1 -1
  41. package/schedule/schedule.amd.js +1 -1
  42. package/schedule/schedule.amd.js.map +1 -1
  43. package/schedule/schedule.js +10 -11
  44. package/schedule/schedule.js.map +1 -1
  45. package/utils/searchers.amd.js +1 -1
  46. package/utils/searchers.amd.js.map +1 -1
  47. package/utils/searchers.js +1 -1
  48. package/.chunks/formsExt-Bk_fn1Pg.amd.js +0 -2
  49. package/.chunks/formsExt-Bk_fn1Pg.amd.js.map +0 -1
  50. package/.chunks/formsExt-Bk_fn1Pg.esm.js.map +0 -1
  51. package/.chunks/utils-BiOp5DHs.amd.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["project/project.js","../../src/components/project/competitorSelector/competitorSelector.vue","../../src/components/project/competitorSelector/composables.ts","../../src/components/project/regionSelector/utils/consts.ts","../../src/components/project/regionSelector/utils/utils.ts","../../src/components/project/regionSelector/composables/selectSearcher.ts","../../src/components/project/regionSelector/composables/selectRegion.ts","../../src/components/project/regionSelector/composables/compare.ts","../../src/components/project/regionSelector/composables/selectorRegion.ts","../../src/components/project/regionSelector/regionSelector.vue","../../src/components/project/groupSelector/folders/utils.ts","../../src/core/utils/composables/useWatch.ts","../../src/components/project/groupSelector/folders/folders.vue","../../src/components/project/groupSelector/groups/utils.ts","../../src/components/project/groupSelector/groups/groups.vue","../../src/components/project/groupSelector/groupSelector.vue","../../src/components/project/projectSelector/utils.ts","../../src/components/project/projectSelector/submenu/submenu.vue","../../src/components/project/projectSelector/cache.ts","../../src/components/project/projectSelector/projectSelector.vue","../../src/components/project/tagSelector/utils/utils.ts","../../src/components/project/tagSelector/utils/el.ts","../../src/components/project/tagSelector/tagsDefaults.ts","../../src/components/project/tagSelector/tagIcon/tagIcon.vue","../../src/components/project/tagSelector/popupListItem/tagPopupListItem.vue","../../src/components/project/tagSelector/popupOpener/popupOpener.vue","../../src/components/project/tagSelector/tagSelector.vue"],"names":["k2","k","desc","m","o","v","\"default\"","ownKeys","ar","mod","result","i","vue","exports","ge","_e","ve","vue_1","n","a","forms_BiKUURH4_esm_js_1","popup_KKfSSrM6_esm_js_1","formsExt_Bk_fn1Pg_esm_js_1","ye","be","xe","Se","H","Ce","we","Te","Ee","De","Oe","Ae","ke","r","je","Me","utils_3uWRvFcX_esm_js_1","require","resolve_1","reject_1","Ne","e","t","searchers_js_1","Pe","Fe","Ie","Le","s","c","l","u","d","f","p","$i18n","U","Re","ze","Be","Ve","He","Ue","W","G","K","We","Ge","Ke","qe","Je","Ye","Xe","Ze","Qe","$e","et","tt","field_DEusYVqS_esm_js_1","h","g","y","b","nt","rt","it","at","ot","st","ct","lt","ut","worker_BufdAd_a_esm_js_1","dt","ft","pt","mt","keyboard_js_1","ht","gt","_t","vt","yt","bt","xt","St","q","Ct","J","wt","Tt","Et","Dt","Ot","kt","At","jt","Mt","Nt","ee","_","check_js_1","string_js_1","Pt","Ft","dom_js_1","It","Lt","Rt","zt","Bt","Vt","Ht","Ut","Wt","x","te","D","A","re"],"mappings":"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","sourcesContent":["var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\ndefine([\"require\", \"exports\", \"../.chunks/forms-BiKUURH4.esm.js\", \"../.chunks/field-DEusYVqS.esm.js\", \"../utils/dom.js\", \"../.chunks/worker-BufdAd-a.esm.js\", \"../.chunks/utils-3uWRvFcX.esm.js\", \"../utils/check.js\", \"../utils/string.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-KKfSSrM6.esm.js\", \"../.chunks/formsExt-Bk_fn1Pg.esm.js\", \"vue\", \"../.chunks/api-D5wIZnrK.esm.js\", \"../.chunks/app-0qVCkgOO.esm.js\", \"../popup/worker.js\"], function (require, exports, forms_BiKUURH4_esm_js_1, field_DEusYVqS_esm_js_1, dom_js_1, worker_BufdAd_a_esm_js_1, utils_3uWRvFcX_esm_js_1, check_js_1, string_js_1, searchers_js_1, keyboard_js_1, popup_KKfSSrM6_esm_js_1, formsExt_Bk_fn1Pg_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.renderElTopTagSelectorPopupOpener = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = exports.clearCache = exports.TopTagSelectorTagIcon = exports.TopTagSelectorPopupOpener = exports.TopTagSelector = exports.TopRegionSelector = exports.TopProjectSelector = exports.TopGroupSelector = exports.TopCompetitorSelector = void 0;\n //#region src/components/project/competitorSelector/competitorSelector.vue?vue&type=script&setup=true&lang.ts\n var ge = { class: \"top-competitorSelector\" }, _e = { class: \"top-ellipsis1\" }, ve = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"competitorSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n items: {},\n showSelectAllItem: {\n type: Boolean,\n default: !0\n },\n selectAllItemIcon: { default: \"\" }\n }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (i.showSelectAllItem)\n return {\n icon: i.selectAllItemIcon,\n title: (0, forms_BiKUURH4_esm_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", ge, [(0, vue_1.unref)(forms_BiKUURH4_esm_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.h, {\n class: \"top-competitorSelector_opener\",\n color: \"theme\",\n icon: \"\",\n icon2: \"\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(n.items.find((e) => e.value === a.value?.[0])?.content), 1)]),\n _: 1\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(n.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": a.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => a.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", _e, (0, vue_1.toDisplayString)(e.content), 1)]),\n _: 2\n }, 1032, [\n \"class\",\n \"data-top-icon\",\n \"title\",\n \"onClick\"\n ]))), 256))]),\n _: 1\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_Bk_fn1Pg_esm_js_1.d, {\n key: 1,\n modelValue: a.value,\n \"onUpdate:modelValue\": i[0] ||= (e) => a.value = e,\n items: n.items,\n isMultiple: !0,\n styling: \"bar\",\n canBeEmptyMultiple: !1,\n selectAllItem: o.value\n }, null, 8, [\n \"modelValue\",\n \"items\",\n \"selectAllItem\"\n ]))]));\n }\n }), ye = (e, t) => (0, vue_1.computed)(() => (0, vue_1.toValue)(e).filter((e) => e.on >= 0 || e.id === t).map((e) => ({\n value: e.id,\n title: e.url + ` [${e.id}]`,\n icon: e.id === (0, vue_1.toValue)(t) ? \"\" : \"\",\n content: e.name\n }))), be = {\n 0: \"Yandex\",\n 1: \"Google\",\n 4: \"YouTube\",\n 5: \"Bing\",\n 7: \"Seznam\",\n 8: \"AppStore\",\n 9: \"GoogleStore\",\n 20: \"Yandex.com\",\n 21: \"Yandex.com.tr\"\n }, xe = {\n key: -2,\n name: \"--\",\n index: -2\n }, Se = {\n key: -2,\n name: \"--\",\n regions: [xe],\n regionByIndex: new Map([[-2, xe]])\n }, H = {\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, Ce = {\n key: -2,\n name: \"Autoselect\",\n regions: [H],\n regionByIndex: new Map([[-2, H]])\n }, we = {\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, Te = () => (H.name = (0, forms_BiKUURH4_esm_js_1.E)().Common.Autoselect, H), Ee = () => (Te(), Ce.name = (0, forms_BiKUURH4_esm_js_1.E)().Common.Autoselect, console.log(Ce), Ce), De = () => (we.name = (0, forms_BiKUURH4_esm_js_1.E)().Keywords.Without_region, we), Oe = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e ? Ae(n, e) : ke(n), t && r.set(-2, Ee()), r.size || r.set(-2, Se), r;\n }, ke = (e, t = !0, n = [], r = \"\") => {\n let i = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (!e.enabled || r && typeof e.key == \"number\" && e.key > 1)\n return;\n let a = { ...e };\n a.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n a.regionByIndex.set(n.index, n);\n }), !a.regionByIndex.size && n.length, (!e.regions || a.regionByIndex.size || n.length) && i.set(a.key, a);\n }), n.forEach((e) => {\n if (i.has(e))\n return;\n let t = {\n key: e,\n name: be[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n i.set(t.key, t);\n }), i;\n }, Ae = (e, n) => {\n let r = ke(e, !1, forms_BiKUURH4_esm_js_1.O.state.forceSearchersKeysForKeywordsStats, n);\n if (r.has(2)) {\n let e = r.get(2);\n e && (e.regionByIndex = /* @__PURE__ */ new Map());\n }\n return (n === \"volume\" || n === \"cost_forecast\") && forms_BiKUURH4_esm_js_1.O.state.showGlobalRegionForKeywordsStats && r.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...De() };\n e.regionByIndex.set(t.index, t);\n }), r;\n }, je = (e, t, n = []) => {\n let r = Oe(e, !1, n), i;\n return r.forEach((n) => {\n if (!(t.searcher_key !== void 0 && t.searcher_key != n.key) && n.regions && (n.regions.forEach((r) => {\n if (!i && !(t.key !== void 0 && t.key != r.key) && !(t.index !== void 0 && t.index != r.index) && !(!e && (t.lang !== void 0 && t.lang != r.lang || t.device !== void 0 && t.device != r.device)))\n return r.searcher_key = n.key, i = r, !1;\n }), i))\n return !1;\n }), i;\n }, Me = (0, utils_3uWRvFcX_esm_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-BFpuUEJM.esm.js\"], resolve_1, reject_1); }).then(__importStar)), Ne = (t, n) => {\n let r = (0, forms_BiKUURH4_esm_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(n.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n if (n.value.forEach((n) => {\n let r = {\n value: n.key,\n title: n.name\n };\n t.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(n.key)), e.set(n.key, r);\n }), t.addCompare && !e.has(-2)) {\n let t = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n e.set(t.value, t);\n let n = {\n value: -1,\n title: r.Common.Compare\n };\n e.set(n.value, n);\n }\n return e;\n })\n };\n }, Pe = (t, n) => {\n let r = (0, forms_BiKUURH4_esm_js_1.E)(), i = (0, vue_1.ref)(-2);\n t.modelValue.length === 1 && (i.value = t.modelValue[0]), i.value === -2 && (t.forMode ? i.value = n.value?.regionByIndex.values().next().value?.key ?? -2 : i.value = n.value?.regionByIndex.keys().next().value ?? -2);\n let a = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return n.value.regionByIndex?.forEach((i) => {\n let a = i.name;\n if (t.forMode) {\n let t = {\n value: i.key,\n title: a\n };\n e.has(i.key) || e.set(i.key, t);\n return;\n }\n i.device && (a += \" (\" + r.Common[\"Device_\" + i.device] + \")\");\n let o = (0, searchers_js_1.getLangLabel)(n.value.key || 0, i.lang ?? \"\");\n o && (a += \" / \" + o);\n let s = {\n value: i.index,\n title: a,\n icon: i.device ? (0, searchers_js_1.getDeviceGIcon)(i.device) : void 0\n };\n e.set(i.index, s);\n }), e;\n });\n return (0, vue_1.watch)(a, (e, n) => {\n if (t.onlySearcher || i.value !== void 0 && e.get(i.value))\n return;\n let a = e.keys().next().value;\n if (i.value === -2 || a === -2) {\n i.value = a;\n return;\n }\n let o = n?.get(i.value)?.title || \"\", s = -1;\n for (let [t, n] of e.entries()) {\n let e = n.title;\n if (typeof e != \"string\" || typeof t == \"string\")\n break;\n if (e === o) {\n a = t;\n break;\n }\n let i = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n e.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) !== -1 && (l <= s || (s = l, a = t));\n }\n i.value = a;\n }), {\n regionIndex: i,\n optionByRegionIndex: a\n };\n }, Fe = (e, t, n) => {\n let r = (0, vue_1.ref)([]), i = () => {\n if (e.onlySearcher && t.value) {\n r.value = Array.from(t.value.keys());\n return;\n }\n let i = [];\n if (e.modelValue.length > 1)\n i = [...e.modelValue];\n else\n try {\n i = JSON.parse(localStorage.getItem(\"ui:project:regionSelector\" + e.projectId + \":regionsIndexes\")) ?? [];\n }\n catch { }\n i.length && (i = i.filter((e) => n.value.has(e))), i.length || (i = Array.from(n.value)), r.value = [...i];\n }, a = () => {\n r.value.length ? localStorage.setItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\", JSON.stringify(r.value)) : localStorage.removeItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\");\n };\n return (0, vue_1.watch)(r, () => {\n a();\n }), e.addCompare && i(), { regionsIndexes: r };\n }, Ie = (e) => {\n let t = (0, vue_1.computed)(() => Oe(e.forMode, e.autoRegion, e.searchers)), n = (0, vue_1.computed)(() => t.value.get(i.searcherKey.value) || Se), r = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return t.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -1 && t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), i = Ne(e, t), a = Pe(e, n), o = Fe(e, t, r);\n (0, vue_1.watch)(t, () => {\n if (e.onlySearcher ? o.regionsIndexes.value = Array.from(t.value.keys()) : o.regionsIndexes.value = o.regionsIndexes.value.filter((e) => r.value.has(e)), i.searcherKey.value === -1)\n return;\n let s = t.value.keys().next().value;\n t.value.forEach((n) => {\n if (e.onlySearcher && n.key === i.searcherKey.value) {\n s = i.searcherKey.value;\n return;\n }\n if (a.regionIndex.value && n.regionByIndex?.has(a.regionIndex.value) && (s = n.key), !e.onlySearcher) {\n let e;\n s !== void 0 && (e = t.value.get(s)?.regionByIndex);\n let r = t.value.get(n.key)?.regionByIndex;\n e?.has(-2) && !r?.has(-2) && (s = n.key);\n }\n }), s !== void 0 && (i.searcherKey.value = s), a.regionIndex.value !== void 0 && !(n.value?.regionByIndex)?.has(a.regionIndex.value) && (a.regionIndex.value = n.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let s = () => {\n if (!(i.searcherKey.value === -1 || i.searcherKey.value === -2))\n return i.searcherKey.value;\n }, c = () => {\n if (e.onlySearcher || a.regionIndex.value === -2)\n return;\n let t = a.regionIndex.value;\n if (e.forMode) {\n let n = a.regionIndex.value;\n t = je(e.forMode, {\n searcher_key: s(),\n key: n\n }, e.searchers)?.index;\n }\n return t;\n }, l = () => {\n let e = s();\n if (e !== void 0)\n return t.value.get(e);\n };\n return {\n selectSearcher: i,\n selectRegion: a,\n compare: o,\n searcherByKey: t,\n allRegionsIndexes: r,\n getSearcher: l,\n getRegion: () => {\n let e = c();\n if (e !== void 0)\n return l()?.regionByIndex?.get(e);\n }\n };\n }, Le = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"regionSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n projectId: {},\n searchers: { default: () => [] },\n modelValue: {},\n modelValueSingle: {},\n addCompare: { type: Boolean },\n forMode: {},\n autoRegion: { type: Boolean },\n onlySearcher: { type: Boolean },\n addChanger: {\n type: Boolean,\n default: !0\n },\n addSearcherIcon: {\n type: Boolean,\n default: !0\n },\n addRegionIcon: {\n type: Boolean,\n default: !0\n }\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n modelValueSingle: {},\n modelValueSingleModifiers: {}\n }),\n emits: [\"update:modelValue\", \"update:modelValueSingle\"],\n setup(e, { expose: t }) {\n let n = e, a = (0, vue_1.useModel)(e, \"modelValue\"), o = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: s, selectRegion: c, compare: l, searcherByKey: u, allRegionsIndexes: d, getSearcher: f, getRegion: p } = Ie(n), m = () => {\n let e = [];\n u.value.forEach((t) => {\n t.enabled && t.regions.forEach((t) => {\n t.enabled && e.push(t);\n });\n }), Me.open(\"regions\", {\n regions: e,\n regionsIndexes: l.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => l.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n c.regionIndex,\n s.searcherKey,\n l.regionsIndexes\n ], () => {\n if (s.searcherKey.value === -1 && l.regionsIndexes.value.length) {\n if (JSON.stringify(a.value) === JSON.stringify(l.regionsIndexes.value))\n return;\n a.value = [...l.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (a.value = [s.searcherKey.value], s.searcherKey.value === -2 && !n.autoRegion && (a.value.length = 0)) : (a.value = [c.regionIndex.value], c.regionIndex.value === -2 && !n.autoRegion && (a.value.length = 0));\n !n.onlySearcher && !d.value.size && (s.searcherKey.value = -2);\n }), o.value && (0, vue_1.watch)(o, () => {\n o.value && (a.value = [o.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(a, () => {\n if (a.value[0] && (o.value = a.value[0]), n.onlySearcher) {\n if (!a.value.length || a.value.length === 1 && !u.value.has(a.value[0]) || a.value.length === 1 && a.value[0] === -2 && !n.autoRegion) {\n let e = u.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, o.value = -2), e === void 0 ? a.value.length = 0 : a.value = [e];\n return;\n }\n if (a.value.length > 1 && JSON.stringify(a.value) !== JSON.stringify(l.regionsIndexes.value)) {\n a.value = [...l.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(a.value)], t = u.value.values().next().value?.regionByIndex?.keys().next().value;\n if (n.forMode && (t = u.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, o.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let r = d.value;\n n.forMode && (r = /* @__PURE__ */ new Set(), u.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -1 && e.index !== -2 && r.add(e.key);\n });\n })), r.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => d.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(a.value) !== JSON.stringify(e)) {\n a.value = e;\n return;\n }\n }\n if (!(a.value.length === 1 && a.value[0] === (n.onlySearcher ? s.searcherKey.value : c.regionIndex.value)))\n if (n.onlySearcher) {\n if (a.value.length === 1) {\n s.searcherKey.value = a.value[0];\n return;\n }\n s.searcherKey.value = -1;\n return;\n }\n else {\n if (!a.value.length)\n return;\n if (a.value.length === 1 && s.searcherKey.value !== -1) {\n c.regionIndex.value = a.value[0];\n let e;\n for (let t of u.value.values()) {\n for (let r of t.regionByIndex.values())\n if ((n.forMode ? r.key : r.index) === c.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (s.searcherKey.value = e);\n }\n else\n s.searcherKey.value = -1, l.regionsIndexes.value = [...a.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: f,\n getRegion: p\n }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-regionSelector\": !0,\n \"top-regionSelector-onlySearcher\": e.onlySearcher\n }) }, [\n (0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.n, {\n options: (0, vue_1.unref)(s).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(s).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(s).searcherKey.value = e,\n name: \"searcher_key\",\n addChanger: e.addChanger\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"addChanger\"\n ]),\n !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_BiKUURH4_esm_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(c).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(c).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(c).regionIndex.value = e,\n name: e.forMode ? \"region_key\" : \"region_index\",\n addChanger: e.addChanger,\n \"data-top-icon\": e.addRegionIcon ? \"\" : void 0\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"name\",\n \"addChanger\",\n \"data-top-icon\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.addCompare && !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_BiKUURH4_esm_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: m,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(l).regionsIndexes.value.length\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Selected_regions), 1)]),\n _: 1\n }, 8, [\"data-count-compare-regions-indexes\"])) : (0, vue_1.createCommentVNode)(\"\", !0)\n ], 2));\n }\n }), U = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = ve;\n exports.useItemsFromCompetitors = ye;\n exports.genSearcherByKey = Oe;\n exports.findRegion = je;\n exports.dialogRegionSelector = Me;\n exports.TopRegionSelector = Le;\n function Re(t) {\n return t ? (0, forms_BiKUURH4_esm_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_BiKUURH4_esm_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var ze = (e, t, n = /* @__PURE__ */ new Map(), r = { id: \"root\" }, i = 0) => (r.childsIds = [], r.id && (r.countAllGroupsActive = r.count_groups_active), e[r.id] && e[r.id].forEach((a) => {\n a = { ...a }, r.childsIds.push(a.id), a.id === 0 && (a.name = Re(t));\n let o = i > 1 ? \"-\".repeat(i - 1) + \" \" : \"\";\n o && !a.name.startsWith(o) && (a.name = o + a.name), n.set(a.id, a), ze(e, t, n, a, i + 1), r.childsIds = r.childsIds.concat(a.childsIds), r.id && a.count_groups_active && (r.countAllGroupsActive += a.count_groups_active);\n }), n), Be = (e, t) => e.gen(`/get/${t}/folders/`, [\n \"id\",\n \"parent_id\",\n \"name\",\n \"path\"\n ]).changeParams({\n orders: [\"ord_path\"],\n limit: 100\n });\n //#endregion\n //#region src/core/utils/composables/useWatch.ts\n function Ve(e, t, n) {\n let r = Object.keys(e);\n return (0, vue_1.watch)(r.map((t) => e[t]), (e, n, i) => {\n let a = {};\n e.forEach((e, t) => {\n if (!Object.is(e, n[t])) {\n let i = r[t];\n a[i] = {\n old: n[t],\n new: e\n };\n }\n }), Object.keys(a).length && t(a, i);\n }, n);\n }\n //#endregion\n //#region src/components/project/groupSelector/folders/folders.vue?vue&type=script&setup=true&lang.ts\n var He = [\"innerHTML\"], Ue = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"folders\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n folders: {},\n projectId: {},\n canSelectAll: { type: Boolean },\n addChanger: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: {}\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: { default: U },\n folderModifiers: {}\n }),\n emits: [\"update:folderId\", \"update:folder\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"folderId\"), r = (0, vue_1.useModel)(e, \"folder\"), i = t.client && !t.folders ? Be(t.client, t.service) : void 0, a = (0, vue_1.ref)(null);\n (0, vue_1.watch)(() => t.projectId, () => {\n i?.changeParams({ project_id: t.projectId }), i?.setOptions({ checkFingerprint: \"TopGroupSelectorFolders:\" + t.projectId }), a.value?.resetCache();\n }, { immediate: !0 });\n let o = (0, vue_1.computed)(() => ze(t.folders ?? { root: [U] }, t.canSelectAll)), s = (e) => (t.canSelectAll && e[0]?.id === 0 && (e[0] = {\n ...e[0],\n name: Re(!0)\n }), e);\n return Ve({\n modelFolder: r,\n modelFolderId: n\n }, async (e) => {\n if (n.value === r.value.id)\n return;\n if (e.modelFolder && !e.modelFolderId) {\n n.value = r.value.id;\n return;\n }\n let i = o.value.get(t.folderId);\n i ||= U, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_Bk_fn1Pg_esm_js_1.s, {\n class: \"top-groupSelector_folder\",\n modelValue: r.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => r.value = e,\n items: e.folders ? [...o.value.values()] : void 0,\n \"search-type\": \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.folders ? void 0 : (0, vue_1.unref)(i),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_Bk_fn1Pg_esm_js_1.u)(...e, \"name\"),\n prepareItemsBeforeRender: s,\n addChanger: e.addChanger,\n useCache: \"\"\n }, {\n item: (0, vue_1.withCtx)(({ item: e }) => [(0, vue_1.createElementVNode)(\"div\", { innerHTML: e.name.replaceAll(/</g, \"< \") }, null, 8, He)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), W = {\n id: -1,\n name: \"--\",\n folder_id: U.id,\n folder_path: U.path\n }, G = {\n id: 0,\n name: \"All groups\",\n folder_id: U.id,\n folder_path: U.path\n }, K = () => (G.name = (0, forms_BiKUURH4_esm_js_1.E)()?.Common.All_groups, G), We = () => (G.name = (0, forms_BiKUURH4_esm_js_1.E)()?.Keywords.Choose_group, G), Ge = (e, t, n) => (e = [...e], t !== void 0 && (e = e.filter((e) => e.on == Number(t))), n && n.id && n.childsIds && (e = e.filter((e) => e.folder_id === n.id || n.childsIds.includes(e.folder_id))), e), Ke = (e, t) => e.gen(`/get/${t}/groups/`, [\n \"id\",\n \"name\",\n \"folder_id\",\n \"folder_path\"\n ]).changeParams({\n folder_id_depth: !0,\n limit: 100\n }), qe = (e, t) => e.gen(`/add/${t}/groups/`), Je = (e, t) => e.gen(`/del/${t}/groups/`), Ye = (e, t) => e.gen(`/edit/${t}/groups/rename/`), Xe = { class: \"top-groupSelector_groupItem top-ellipsis1\" }, Ze = {\n key: 0,\n class: \"top-comment\"\n }, Qe = [\"innerHTML\"], $e = [\"innerHTML\"], et = [\"innerHTML\"], tt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groups\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n groupId: {},\n group: {},\n projectId: {},\n folder: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canAdd: { type: [String, Boolean] },\n canEditAndDel: { type: Boolean },\n canSelectAll: { type: [Boolean, String] },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showPath: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: {}\n }, {\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { required: !0 },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"addGroup\",\n \"editGroup\",\n \"delGroup\"\n ], [\"update:groupId\", \"update:group\"]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = n, a = (0, vue_1.useModel)(e, \"groupId\"), s = (0, vue_1.useModel)(e, \"group\"), c = r.client && !r.groups ? Ke(r.client, r.service) : void 0, l = r.client ? qe(r.client, r.service) : void 0, u = r.client ? Je(r.client, r.service) : void 0, d = r.client ? Ye(r.client, r.service) : void 0, f = (0, vue_1.ref)(null), p = (0, vue_1.ref)(void 0), m = (0, field_DEusYVqS_esm_js_1.t)(\"folder_id\", \"EQUALS\", [r.folder?.id ?? 0]);\n c?.changeParams({\n project_id: r.projectId,\n folder_id_depth: !0,\n filters: [m]\n }), r.on !== void 0 && c?.params.filters?.push((0, field_DEusYVqS_esm_js_1.t)(\"on\", \"EQUALS\", [Number(r.on)]));\n let h = (e) => {\n s.value = e, a.value = e.id;\n }, g = (e = !1) => {\n f.value?.resetCache(e);\n };\n Ve({\n projectId: () => r.projectId,\n folderId: () => r.folder?.id,\n canSelectAll: () => r.canSelectAll\n }, (e) => {\n if (e.projectId && (c?.changeParams({ project_id: r.projectId }), c?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + r.projectId })), e.folderId && (m.values = [r.folder?.id ?? 0], r.groups && (p.value = Ge(r.groups, r.on, r.folder))), g(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && a.value !== null) {\n let e;\n r.autoselect === \"first\" && (e = p.value?.[0], r.canSelectAll && (e = (0, vue_1.reactive)(K()))), (r.autoselect === \"placeholder\" || !e) && (e = We()), h(e);\n }\n }, { immediate: !0 }), Ve({\n modelGroup: s,\n modelGroupId: a\n }, async (e) => {\n if (a.value !== s.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n a.value = s.value.id;\n return;\n }\n if (!(r.canAdd && a.value === null)) {\n if (r.groups) {\n let e = p.value?.find((e) => e.id === a.value);\n if (!e && r.canSelectAll && (e = K()), e)\n h(e);\n else {\n let e = p.value?.[0];\n e && !a.value ? h(e) : h(W);\n }\n }\n if (r.client && !r.groups && (a.value || a.value === 0 && !r.canSelectAll)) {\n let e = Ke(r.client, r.service).changeParams({\n project_id: r.projectId,\n id: a.value,\n filters: [m]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + r.projectId });\n let t = await e.call();\n if (!t.errors?.length && !t.result)\n return;\n !t.errors && t.result[0] ? h(t.result[0]) : h(W);\n }\n }\n }\n }, { immediate: !0 });\n let v = async (e) => {\n if (r.canAdd !== \"api\" || !l)\n return;\n let t = s.value, n = await l.changeParams({\n project_id: r.projectId,\n names: [e.name],\n to_id: r.folder?.id ?? U.id,\n to_type: \"in_folder_last\"\n }).call();\n if (n.result) {\n let e = n.result[0];\n h(e), i(\"addGroup\", e);\n }\n else\n h(t);\n f.value?.resetCache(!0);\n }, y = async (e, t) => {\n d && ((await d.changeParams({\n project_id: r.projectId,\n id: e.id,\n name: t\n }).call()).errors || (i(\"editGroup\", {\n id: e.id,\n name: t\n }), f.value?.updateCacheItemById(e.id, { name: t })));\n }, b = async (e) => {\n u && ((await u.changeParams({\n project_id: r.projectId,\n id: e.id\n }).call()).errors || (s.value.id === e.id && h(r.canSelectAll ? K() : W), i(\"delGroup\", e.id), f.value?.deleteCacheItemById(e.id)));\n };\n return t({ resetCacheGroups: g }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_Bk_fn1Pg_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: f,\n class: \"top-groupSelector_group\",\n modelValue: s.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => s.value = e,\n items: p.value ?? e.groups,\n searchType: \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.groups ? void 0 : (0, vue_1.unref)(c),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_Bk_fn1Pg_esm_js_1.u)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(K)().name : !1,\n addChanger: e.addChanger,\n useCache: \"\",\n onAppendItem: v\n }, (0, vue_1.createSlots)({\n item: (0, vue_1.withCtx)(({ item: n }) => [(0, vue_1.createElementVNode)(\"div\", Xe, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Ze, (0, vue_1.toDisplayString)(t.$i18n.Common.Add) + \": \", 1)) : (0, vue_1.createCommentVNode)(\"\", !0),\n (0, vue_1.createElementVNode)(\"span\", {\n class: \"top-groupSelector_groupItemName top-ellipsis1\",\n innerHTML: n.name\n }, null, 8, Qe),\n n.folder_path && e.showPath ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n class: \"top-groupSelector_groupItemFolderPath top-ellipsis1\",\n innerHTML: n.folder_path\n }, null, 8, $e)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ])]),\n _: 2\n }, [e.canEditAndDel && e.client ? {\n name: \"actions\",\n fn: (0, vue_1.withCtx)(({ item: r }) => [r.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createVNode)(popup_KKfSSrM6_esm_js_1.n, {\n submitText: t.$i18n.Common.Save,\n defaultValue: r.name,\n inputProps: { addCleaner: !1 },\n onSubmit: (e) => y(r, e)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[1] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [...n[2] ||= []]),\n _: 1\n }, 8, [\n \"submitText\",\n \"defaultValue\",\n \"onSubmit\"\n ]), (0, vue_1.createVNode)(popup_KKfSSrM6_esm_js_1.r, {\n isWarning: \"\",\n submitText: t.$i18n.Common.Delete,\n onSubmit: (e) => b(r)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[3] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", { innerHTML: e.service === \"keywords_2\" ? t.$i18n.Keywords.Delete_group_warning : t.$i18n[\"Ai.Tracker\"].Delete_group_warning }, null, 8, et)]),\n _: 1\n }, 8, [\"submitText\", \"onSubmit\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n key: \"0\"\n } : void 0]), 1032, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResult\",\n \"useAllItem\",\n \"addChanger\"\n ]));\n }\n }), nt = { class: \"top-groupSelector\" }, rt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groupSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n groupId: {},\n group: {},\n projectId: {},\n folders: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canSelectAllGroups: {\n type: Boolean,\n default: !1\n },\n canAddGroup: { type: [String, Boolean] },\n canEditAndDelGroup: { type: Boolean },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showFolders: {\n type: Boolean,\n default: !0\n },\n showGroups: {\n type: Boolean,\n default: !0\n },\n showGroupsPaths: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: { default: \"keywords_2\" }\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: {},\n folderModifiers: {},\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { default: W },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\"update:groups\"], [\n \"update:folderId\",\n \"update:folder\",\n \"update:groupId\",\n \"update:group\"\n ]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = (0, vue_1.ref)(null), a = (0, vue_1.useModel)(e, \"folderId\"), o = (0, vue_1.useModel)(e, \"folder\"), s = (0, vue_1.useModel)(e, \"groupId\"), c = (0, vue_1.useModel)(e, \"group\"), l = n;\n o.value = ze(r.folders ?? { root: [U] }, r.canSelectAllGroups).get(a.value);\n let u = r.groups?.find((e) => e.id === s.value);\n s.value || (u = r.groups?.[0]), r.canSelectAllGroups && !u && (u = K()), (r.autoselect === \"placeholder\" || !u) && (u = We()), u ??= W, c.value = u;\n let d = (e) => {\n let t;\n r.groups && e && (t = [...r.groups, e]), l(\"update:groups\", t);\n }, f = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n l(\"update:groups\", r.groups.map((t) => t.id === e.id ? e : t));\n }, p = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n l(\"update:groups\", r.groups.filter((t) => t.id !== e.id));\n };\n return t({ resetCacheGroups: (e = !1) => {\n i.value?.resetCacheGroups(e);\n } }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", nt, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Ue, {\n key: 0,\n folderId: a.value,\n \"onUpdate:folderId\": n[0] ||= (e) => a.value = e,\n folder: o.value,\n \"onUpdate:folder\": n[1] ||= (e) => o.value = e,\n projectId: e.projectId,\n folders: e.folders,\n canSelectAll: e.canSelectAllGroups,\n addChanger: e.addChanger,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service\n }, null, 8, [\n \"folderId\",\n \"folder\",\n \"projectId\",\n \"folders\",\n \"canSelectAll\",\n \"addChanger\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0), e.showGroups ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(tt, {\n key: 1,\n ref_key: \"componentGroupsRef\",\n ref: i,\n groupId: s.value,\n \"onUpdate:groupId\": n[2] ||= (e) => s.value = e,\n group: c.value,\n \"onUpdate:group\": n[3] ||= (e) => c.value = e,\n projectId: e.projectId,\n folder: o.value,\n groups: e.groups,\n on: e.on,\n canAdd: e.canAddGroup,\n canEditAndDel: e.canEditAndDelGroup,\n canSelectAll: e.canSelectAllGroups,\n autoselect: e.autoselect,\n addChanger: e.addChanger,\n showPath: e.showGroupsPaths || e.showFolders,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service,\n onAddGroup: d,\n onEditGroup: f,\n onDelGroup: p\n }, null, 8, [\n \"groupId\",\n \"group\",\n \"projectId\",\n \"folder\",\n \"groups\",\n \"on\",\n \"canAdd\",\n \"canEditAndDel\",\n \"canSelectAll\",\n \"autoselect\",\n \"addChanger\",\n \"showPath\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0)]));\n }\n }), it = (e) => ({\n id: null,\n name: e,\n listItemProps: { type: \"title\" }\n }), at = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n }, ot = (t, n) => {\n let r = [], i = {\n scheduledUpdate: it((0, forms_BiKUURH4_esm_js_1.E)().Projects.Scheduled_update),\n manualUpdate: it((0, forms_BiKUURH4_esm_js_1.E)().Projects.Manual_update),\n guestProjects: it((0, forms_BiKUURH4_esm_js_1.E)().Projects.Guest_projects)\n }, a = n ? {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n } : at;\n for (let e of t)\n !a.scheduledUpdate && e.right?.startsWith(\"1\") && e.on > 0 && (r.push(i.scheduledUpdate), a.scheduledUpdate = !0), !a.manualUpdate && e.right?.startsWith(\"1\") && e.on === 0 && (r.push(i.manualUpdate), a.manualUpdate = !0), !a.guestProjects && e.right?.startsWith(\"0\") && e.on >= 0 && (r.push(i.guestProjects), a.guestProjects = !0), r.push(e);\n return r;\n }, st = (e) => e.map((e) => ({\n ...e,\n listItemProps: { attrs: { title: e.name } }\n })), ct = (e, t, n) => !e || e.length === 0 ? [] : (t && Object.keys(at).forEach((e) => at[e] = !1), ot(st(e), n)), lt = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return t = t.replace(/historyView=[^&]*/, \"\"), t = t.replace(/modelsKeys=[^&]*/, \"\"), t = t.replace(/competitorsIds=[^&]*/, \"\"), t = t.replace(/searchersKeys=[^&]*/, \"\"), t = t.replace(/regionIndex=[^&]*/, \"\"), t = t.replace(/regionsIndexes=[^&]*/, \"\"), t = t.replace(/folderId=[^&]*/, \"\"), t = t.replace(/groupId=[^&]*/, \"\"), t = t.replace(/tags=[^&]*/, \"\"), window.mo?.getHash && !window.mo.getHash(\"dataSort\").toString().includes(\"0000-00-00\") && (t = t.replace(/dataSort=[^&]*/, \"\")), t = t.replace(/%22historyView%22:[^,]*,/, \"\"), t = t.replace(/%22modelsKeys%22:\\[[^\\]]*\\],/, \"\"), t = t.replace(/%22competitorsIds%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22searchersKeys%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22regionIndex%22:[^,]*,/, \"\"), t = t.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22folderId%22:[^,]*,/, \"\"), t = t.replace(/%22groupId%22:[^,]*,/, \"\"), t = t.replace(/%22tagsIds%22:\\[[^\\]]*],/, \"\"), /%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(t) || (t = t.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, \"$1\")), e + t;\n }, ut = (e, t) => {\n t && t.target instanceof HTMLElement && worker_BufdAd_a_esm_js_1.t.close(t.target.closest(\".top-popup-wrapper\"));\n let n = lt(e);\n location.href = n;\n }, dt = (e) => {\n let t = ft(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n return n[1] == \"project\" && (r = n[1] + \"/\" + n[2] + \"/\"), n[2] == \"settings\" && (i = location.hash), [\n \"watcher\",\n \"indexing\",\n \"sitemap\",\n \"audit\",\n \"direct\",\n \"adwords\"\n ].includes(n[4]) && (i = n[4] + \"/\"), \"https://\" + t + \"/\" + r + e + \"/\" + i;\n }, ft = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, pt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"http://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, mt = (e, t) => {\n let n = e.params.filters ?? [];\n n = n.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let r = (0, keyboard_js_1.invertKeyboardLayout)(t), i = t.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), a = r.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n t && n.push((0, field_DEusYVqS_esm_js_1.t)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${i}|${a})`])), e.changeParams({ filters: n });\n }, ht = (e) => {\n let n = e.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return n.changeParams({\n filters: [(0, field_DEusYVqS_esm_js_1.t)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, field_DEusYVqS_esm_js_1.n)(\"user_id\", \"DESC\", [forms_BiKUURH4_esm_js_1.O.state.user.id]),\n (0, field_DEusYVqS_esm_js_1.n)(\"on\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"favorite\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"id\", \"DESC\")\n ]\n }), n.options.onApiLoaded = (e, t, n) => {\n let r = t.data.filters.length === 1 && t.data.offset === 0 || t.data.limit === 1e3, i = t.data.limit === 100 && t.data.filters.length > 1 ? !0 : void 0;\n e.result = ct(e.result, r, i), n?.(e, t);\n }, n;\n }, gt = (e) => e.gen(\"/add/projects_2/projects/\"), _t = { class: \"top-projectSelectorSubmenu_item\" }, vt = [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ], yt = { class: \"top-projectSelectorSubmenu_item\" }, bt = [\"href\"], xt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: {\n id: {},\n right: {},\n url: {}\n },\n setup(t) {\n let n = t, r = (0, forms_BiKUURH4_esm_js_1.E)(), i = ft(), a = [\n {\n href: `https://${i}/project/keywords/${n.id}/`,\n title: r.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${i}/project/dynamics/${n.id}/`,\n title: r.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/snapshots/${n.id}/`,\n title: r.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/competitors/${n.id}/`,\n title: r.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/ai-tracker/${n.id}/`,\n title: r.Common.Menu_aiTracker,\n icon: \"\",\n right: \"13\"\n },\n {\n href: `https://${i}/project/analytics/${n.id}/`,\n title: r.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${i}/project/broker/${n.id}/`,\n title: r.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/sitemap/`,\n title: r.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/audit/`,\n title: r.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/indexing/`,\n title: r.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/watcher/`,\n title: r.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${i}/project/settings/${n.id}/`,\n title: r.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ], o = (0, vue_1.computed)(() => n.right.includes(\"0\") ? a.filter((e) => n.right[e.right] === \"1\") : a);\n return (e, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_KKfSSrM6_esm_js_1.s), {\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-projectSelectorSubmenu_opener\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"li\", _t, [(0, vue_1.createElementVNode)(\"a\", {\n href: e.href,\n title: e.title,\n \"data-top-icon\": e.icon,\n \"data-right\": e.right\n }, null, 8, vt)]))), 256)), (0, vue_1.createElementVNode)(\"li\", yt, [(0, vue_1.createElementVNode)(\"a\", {\n href: t.url,\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, null, 8, bt)])]),\n _: 1\n });\n };\n }\n }), St = 1440 * 60 * 1e3, q = (0, vue_1.shallowRef)(), Ct = (0, vue_1.ref)(0), J = (0, vue_1.ref)(null), wt = (e) => {\n localStorage.setItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id, JSON.stringify({\n projectsTotal: e,\n expiresAt: Date.now() + St\n }));\n }, Tt = () => {\n let e = localStorage.getItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id);\n if (!e)\n return;\n let { projectsTotal: n, expiresAt: r } = JSON.parse(e);\n if (Date.now() > r) {\n localStorage.removeItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id);\n return;\n }\n return n;\n }, Et = (e = !0) => {\n q.value = void 0, J.value = null, localStorage.removeItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id), e && Ct.value++;\n }, Dt = { class: \"top-projectSelector_item\" }, Ot = { class: \"top-projectSelector_itemText\" }, kt = { class: \"top-comment\" }, At = {\n key: 0,\n class: \"top-comment\"\n }, jt = [\"href\", \"onClick\"], Mt = 1e3, Nt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n addLinksToProjects: {\n type: Boolean,\n default: !0\n },\n excludeProjectId: {},\n modificator: {},\n placeholder: {},\n buttonProps: {},\n openerShortcut: {}\n }, {\n modelValue: { default: {\n id: null,\n name: \"\"\n } },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let r = (0, forms_BiKUURH4_esm_js_1.E)(), i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = ht(i.client), s = ht(i.client);\n s.changeParams({ limit: Mt });\n let c = gt(i.client), l = (0, vue_1.ref)(Tt()), f = (0, vue_1.ref)(null), p = (0, vue_1.computed)(() => i.placeholder ?? r.Projects.Select_project), m = (0, vue_1.computed)(() => !q.value || !i.excludeProjectId ? q.value : q.value.filter((e) => e.id !== i.excludeProjectId)), h = (0, vue_1.computed)(() => {\n if (!(!l.value && l.value !== 0))\n return l.value < Mt ? \"static\" : \"api\";\n });\n (0, vue_1.watch)(Ct, () => {\n ee();\n }), (0, vue_1.watch)(a, () => {\n !a.value.id || !i.addLinksToProjects || ut(dt(a.value.id));\n });\n let g = async () => {\n J.value ||= s.call();\n let e = await J.value;\n if (e.errors) {\n J.value = null;\n return;\n }\n return J.value = null, e;\n }, _ = async () => {\n if (l.value)\n return;\n let e = await g();\n e && (l.value = e.total, h.value === \"static\" && !q.value && (q.value = e.result), l.value && wt(l.value));\n }, v = async (e) => {\n let n = await c.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!n.errors) {\n if (q.value && h.value === \"static\") {\n let r = {\n id: Number(n.result),\n user_id: forms_BiKUURH4_esm_js_1.O.state.user.id,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\",\n listItemProps: { attrs: { title: e.name } }\n }, i = q.value.findIndex((e) => e.on === 0);\n q.value = [\n ...q.value.slice(0, i),\n r,\n ...q.value.slice(i)\n ], l.value && (l.value += 1, wt(l.value));\n }\n h.value === \"api\" && Et();\n }\n }, ee = () => {\n h.value === \"api\" && f.value?.resetCache(!0);\n }, y = async () => {\n if (q.value || h.value === \"api\")\n return;\n let e = await g();\n e && (q.value = e.result);\n };\n return (0, vue_1.onMounted)(async () => {\n await _();\n }), (e, t) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_Bk_fn1Pg_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: f,\n class: \"top-projectSelector\",\n modelValue: a.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => a.value = e,\n items: m.value,\n title: e.$i18n.Projects.Search_projects,\n modificator: n.modificator,\n searchFields: [\n \"id\",\n \"name\",\n \"url\"\n ],\n placeholder: p.value,\n hasCloserBtn: \"\",\n api: h.value === \"api\" ? (0, vue_1.unref)(o) : void 0,\n apiSetSearchParams: h.value === \"api\" ? (...e) => (0, vue_1.unref)(mt)(...e) : void 0,\n useCache: \"\",\n appendSearchToResult: \"\",\n appendSearchAllowDuplicate: \"\",\n appendSearchToResultCond: (0, vue_1.unref)(check_js_1.validUrl),\n appendWithoutSelect: \"\",\n buttonProps: n.buttonProps,\n openerShortcut: n.openerShortcut,\n onAppendItem: v,\n onOpen: y\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", Dt, [(0, vue_1.createElementVNode)(\"div\", Ot, [i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)((0, vue_1.unref)(string_js_1.ellipsis)(i.name, 20)) + \" \", 1), (0, vue_1.createElementVNode)(\"span\", kt, \" id \" + (0, vue_1.toDisplayString)(i.id), 1)], 64)) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 1 }, [i.listItemProps?.type ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", At, (0, vue_1.toDisplayString)(e.$i18n.Projects.Add_project) + \": \", 1)), (0, vue_1.createTextVNode)(\" \" + (0, vue_1.toDisplayString)(i.name), 1)], 64))]), i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [\n n.addLinksToProjects ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"a\", {\n key: 0,\n class: \"top-projectSelector_itemLink\",\n href: (0, vue_1.unref)(dt)(i.id),\n onClick: (0, vue_1.withModifiers)((e) => (0, vue_1.unref)(ut)((0, vue_1.unref)(dt)(i.id), e), [\"prevent\", \"stop\"])\n }, null, 8, jt)) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n class: \"top-projectSelector_itemExtLink\",\n href: (0, vue_1.unref)(pt)(i.url),\n \"data-top-icon\": \"\",\n color: \"theme\",\n target: \"_blank\",\n onClick: t[0] ||= (0, vue_1.withModifiers)(() => { }, [\"stop\"])\n }, null, 8, [\"href\"])),\n (0, vue_1.createVNode)(xt, {\n id: i.id,\n right: i.right ?? void 0,\n url: (0, vue_1.unref)(pt)(i.url)\n }, null, 8, [\n \"id\",\n \"right\",\n \"url\"\n ])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)])]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\"\n ]);\n };\n }\n }), Pt = (e) => \"-\" + e, Y = (e) => e[0] === \"-\" ? e.substring(1) : e, X = (e, t) => {\n e = Y(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, Ft = (e, t, n) => {\n t ||= { id: e.id }, t.id = e.id, t.pos ??= \"3\", t.notch ??= !0, t.posBy ??= \"fixed\";\n let r = worker_BufdAd_a_esm_js_1.t.genElPopupOpener(\"div\", t);\n return r.classList.add(\"top-tagSelector\"), e.useTopButton && r.classList.add(\"top-tagSelector-useTopButton\", \"top-button\", \"top-color_theme\", \"top-as-selector\"), e.useTopButton || r.classList.add(\"top-tagSelector-custom\"), e.mode === \"filter\" && r.classList.add(\"top-tagSelector-filter\"), e.mode === \"setter\" && !e.filters && r.classList.add(\"top-tagSelector-setter_single\"), e.mode === \"setter\" && e.filters && r.classList.add(\"top-tagSelector-setter_several\"), r.onclick = (t) => {\n t.preventDefault(), t.stopPropagation(), r.onclick = null;\n let i = (0, vue_1.ref)(e.modelValue);\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n }), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Z(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Z(r, e, n)) : (0, dom_js_1.storage)(r, \"topTagSelectorRender\", (t) => {\n e.modelValue = t;\n let i = (0, dom_js_1.storage)(r, \"topTagSelectorTarget\");\n i && (i.model.value = t), Z(r, e, n);\n }), Z(r, e, n), r;\n }, It = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Z = (t, n, r) => {\n let i = (0, vue_1.unref)(n.modelValue);\n if (t.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), t.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), n.mode === \"setter\" && n.filters) {\n t.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (t.innerHTML = \"\", !i.length && n.mode === \"filter\") {\n let n = Lt({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_BiKUURH4_esm_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n t.append(n);\n }\n i.forEach((e) => {\n let r = Lt({\n id: Y(e),\n colorId: X(e, n.tags)?.color_id ?? \"\",\n name: X(e, n.tags)?.name ?? \"\",\n state: Y(e) === e ? \"selected\" : \"excluded\"\n });\n t.append(r);\n });\n }, Lt = (e) => {\n let t = document.createElement(\"div\");\n return t.classList.add(\"top-tagSelector_tagIcon\"), t.classList.toggle(\"top-tagSelector-active\", !!e.state), t.classList.toggle(\"top-tagSelector-excluded\", e.state === \"excluded\"), t.dataset.tag_id = e.id, t.dataset.tag_color_id = e.colorId, t.title = e.name, t;\n }, Rt = [\n {\n id: \"1\",\n name: \"Without Tag\",\n color_id: \"1\"\n },\n {\n id: \"2\",\n name: \"Red\",\n color_id: \"2\"\n },\n {\n id: \"3\",\n name: \"Orange\",\n color_id: \"3\"\n },\n {\n id: \"4\",\n name: \"Yellow\",\n color_id: \"4\"\n },\n {\n id: \"5\",\n name: \"Blue\",\n color_id: \"5\"\n },\n {\n id: \"6\",\n name: \"Purple\",\n color_id: \"6\"\n },\n {\n id: \"7\",\n name: \"Green\",\n color_id: \"7\"\n },\n {\n id: \"8\",\n name: \"Magenta\",\n color_id: \"8\"\n },\n {\n id: \"9\",\n name: \"Dark blue\",\n color_id: \"9\"\n },\n {\n id: \"10\",\n name: \"Turquoise\",\n color_id: \"10\"\n }\n ], zt = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], Q = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagIcon\",\n props: {\n id: {},\n colorId: {},\n name: {},\n state: {}\n },\n setup(e) {\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagIcon\": !0,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n \"data-tag_id\": e.id,\n \"data-tag_color_id\": e.colorId,\n title: e.name\n }, null, 10, zt));\n }\n }), Bt = [\"contenteditable\", \"onKeydown\"], Vt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagPopupListItem\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n editable: { type: Boolean },\n disabled: { type: Boolean },\n canExclude: { type: Boolean },\n id: {},\n colorId: {},\n name: {},\n state: {}\n }, {\n name: { required: !0 },\n nameModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"update:name\",\n \"unselect\",\n \"exclude\",\n \"select\"\n ], [\"update:name\"]),\n setup(e, { emit: t }) {\n let n = e, r = t, i = (0, vue_1.useModel)(e, \"name\"), a = (0, vue_1.ref)(null), o = (0, vue_1.computed)(() => navigator.userAgent.indexOf(\"Firefox\") == -1 ? {} : {\n contenteditable: s.value,\n onpaste: (e) => e.preventDefault()\n }), s = (0, vue_1.ref)(!1), c = async () => {\n s.value = !0, await (0, vue_1.nextTick)(), a.value?.focus();\n }, l = () => {\n let e = a.value?.innerText;\n if (!e)\n return u();\n a.value && (a.value.innerText = e), s.value = !1, r(\"update:name\", e);\n }, u = async () => {\n a.value && (a.value.innerText = n.name), s.value = !1;\n }, d = (e) => {\n if (s.value || n.disabled)\n return;\n let t = \"selected\";\n n.canExclude && (e.ctrlKey || e.metaKey) && (t = \"excluded\"), n.state == t && (t = \"\"), t === \"\" && r(\"unselect\"), t === \"selected\" && r(\"select\"), t === \"excluded\" && r(\"exclude\");\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagListItem\": !0,\n \"top-tagSelector_tagListItem-inEdit\": s.value,\n \"top-tagSelector_tagListItem-disabled\": e.disabled,\n \"top-tagSelector_tagListItem-canExclude\": e.canExclude,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n onClick: (0, vue_1.withModifiers)(d, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [\n (0, vue_1.createVNode)(Q, {\n id: e.id,\n name: i.value,\n colorId: e.colorId,\n state: e.state\n }, null, 8, [\n \"id\",\n \"name\",\n \"colorId\",\n \"state\"\n ]),\n (0, vue_1.createElementVNode)(\"span\", (0, vue_1.mergeProps)({\n ref_key: \"elName\",\n ref: a,\n class: \"top-tagSelector_tagListItemName\",\n contenteditable: s.value ? \"plaintext-only\" : !1\n }, o.value, { onKeydown: [(0, vue_1.withKeys)((0, vue_1.withModifiers)(l, [\"stop\"]), [\"enter\"]), (0, vue_1.withKeys)((0, vue_1.withModifiers)(u, [\"stop\"]), [\"esc\"])] }), (0, vue_1.toDisplayString)(i.value), 17, Bt),\n e.editable ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [s.value ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: (0, vue_1.withModifiers)(l, [\"stop\"])\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 0,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: c\n }))], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 1\n }, 8, [\"class\"]));\n }\n }), Ht = { key: 1 }, Ut = /* @__PURE__ */ (0, vue_1.defineComponent)({\n inheritAttrs: !1,\n __name: \"popupOpener\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n id: {},\n tags: {},\n mode: {},\n targetId: {},\n filters: {},\n useTopButton: { type: Boolean },\n payload: {},\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"modelValue\"), i = t.useTopButton ? forms_BiKUURH4_esm_js_1.h : \"div\", a = t.useTopButton ? \"html\" : \"default\", o = {\n model: n,\n mode: t.mode,\n targetId: t.targetId,\n filters: t.filters,\n payload: t.payload\n };\n return (r, s) => {\n let c = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.c, { id: e.id }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.withDirectives)(((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(i)), (0, vue_1.mergeProps)({\n class: {\n \"top-tagSelector\": !0,\n \"top-tagSelector-useTopButton\": t.useTopButton,\n \"top-tagSelector-custom\": !t.useTopButton,\n \"top-as-selector\": t.useTopButton,\n \"top-tagSelector-filter\": t.mode === \"filter\",\n \"top-tagSelector-setter_single\": t.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": t.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !n.value.length || n.value.length === 1,\n \"top-tagSelector-toTwoLine\": n.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, r.$attrs), {\n [(0, vue_1.unref)(a)]: (0, vue_1.withCtx)(() => [!n.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: r.$i18n.Common.All_tags ?? \"\",\n state: \"\"\n }, null, 8, [\"name\"])) : (0, vue_1.createCommentVNode)(\"\", !0), e.mode === \"setter\" && e.filters ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Ht, [(0, vue_1.renderSlot)(r.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(n.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n id: (0, vue_1.unref)(Y)(t),\n colorId: (0, vue_1.unref)(X)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(X)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(Y)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n c,\n o,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Wt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n tags: {},\n tagsEditable: { type: Boolean },\n tagsMax: { default: 10 },\n id: {},\n singleMode: { type: Boolean },\n requiredForSetter: {\n type: Boolean,\n default: !0\n },\n maxTagsForSetter: {},\n emitDelay: { default: 500 },\n useTopButton: {\n type: Boolean,\n default: !0\n },\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n tags: { default: (0, vue_1.reactive)(Rt) },\n tagsModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(a, { emit: o }) {\n let c = (0, forms_BiKUURH4_esm_js_1.E)(), l = a, u = (0, vue_1.useModel)(a, \"modelValue\"), d = (0, vue_1.useModel)(a, \"tags\"), f = o, p = (0, forms_BiKUURH4_esm_js_1.P)((e, t) => {\n f(e, t);\n }, l.emitDelay);\n l.singleMode && !u.value.length && (u.value = [d.value[0].id]);\n let m = l.id ?? \"top-popup-id-\" + Math.random(), h = (0, vue_1.ref)(\"add\"), g = () => {\n let e = \" \" + c.Common.Tags?.toLowerCase(), t = /* @__PURE__ */ new Map();\n return t.set(\"add\", {\n value: \"add\",\n title: c.Common.Add + e\n }), t.set(\"replace\", {\n value: \"replace\",\n title: c.Common.Replace + e\n }), t.set(\"delete\", {\n value: \"delete\",\n title: c.Common.Delete + e\n }), t;\n }, _ = (0, vue_1.shallowRef)({\n model: u,\n mode: \"filter\",\n targetId: void 0,\n filters: void 0,\n payload: void 0\n });\n (0, vue_1.watch)(u, () => {\n p(\"selector\", u.value);\n });\n let ee = (0, vue_1.computed)(() => {\n if (_.value.mode === \"setter\" && l.maxTagsForSetter && !_.value.filters)\n return _.value.model.value.length >= l.maxTagsForSetter;\n }), b = (e) => {\n if (e !== \"all\") {\n if (_.value.model.value.includes(e))\n return \"selected\";\n if (_.value.model.value.includes(Pt(e)))\n return \"excluded\";\n }\n return e === \"all\" && !_.value.model.value.length ? \"selected\" : \"\";\n }, x = (e, t) => {\n let n = Pt(e), r = _.value.model.value.filter((t) => t !== e && t !== n);\n t === \"select\" && r.push(e), t === \"exclude\" && r.push(n), _.value.mode === \"setter\" && _.value.targetId !== void 0 && l.requiredForSetter && (r.length || r.push(\"1\"), r.length === 2 && _.value.model.value.length === 1 && _.value.model.value[0] === \"1\" && (r = r.filter((e) => e !== \"1\"))), l.singleMode && !_.value.filters && (r.length || (r = _.value.model.value), r.length > 1 && (r = [r[r.length - 1]])), r.sort((e, t) => l.tags ? l.tags.findIndex((t) => t.id === e) - l.tags.findIndex((e) => e.id === t) : 0), _.value.model.value = r, _.value.mode === \"setter\" && _.value.targetId !== void 0 && p(\"setter\", {\n tagsIds: r,\n targetId: _.value.targetId,\n payload: _.value.payload\n });\n }, te = (0, vue_1.computed)(() => {\n let e = \"top-tagSelector_popup\";\n return _.value.mode === \"filter\" && (e += \" top-tagSelector_popup-filter\"), _.value.mode === \"setter\" && (e += \" top-tagSelector_popup-setter\"), e;\n }), D = () => {\n let e = prompt(\"\", \"New tag\");\n if (!e || e === \"New tag\")\n return;\n let t = d.value.length + 1;\n d.value.push({\n id: String(t),\n name: e,\n color_id: String((t - 1) % 10 + 1)\n }), f(\"tagsChanged\", d.value);\n }, A = (e) => {\n if (_.value = (0, dom_js_1.storage)(e.elPopupOpener, \"topTagSelectorTarget\"), !_.value)\n throw Error(\"Open popup TopTagSelector required v-data:topTagSelectorTarget\");\n if (_.value.filters && (h.value = \"add\", _.value.model.value = []), !forms_BiKUURH4_esm_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_BiKUURH4_esm_js_1.O.state.isMobile && !forms_BiKUURH4_esm_js_1.O.state.isMobileUA && d.value && $(e.elPopup).sortable({\n items: \"li:has([data-tag_id]:not([data-tag_id=\\\"all\\\"]))\",\n cancel: \"[contenteditable=\\\"plaintext-only\\\"], [contenteditable=\\\"true\\\"]\",\n distance: 10,\n stop: function (e, t) {\n if (!d.value)\n return;\n let n = $(t.item).parent().find(\"[data-tag_id]\"), r = [];\n n.each((e, t) => {\n if (!d.value)\n return;\n let n = $(t).attr(\"data-tag_id\");\n r.push(n);\n }), d.value.sort((e, t) => r.findIndex((t) => t === e.id) - r.findIndex((e) => e === t.id)), p(\"tagsChanged\", d.value);\n }\n });\n }, re = (e) => {\n forms_BiKUURH4_esm_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(Ut, {\n modelValue: u.value,\n \"onUpdate:modelValue\": t[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: a.styling,\n mode: \"filter\",\n useTopButton: a.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_KKfSSrM6_esm_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(te.value),\n onOpen: t[4] ||= (e) => A(e),\n onClose: t[5] ||= (e) => re(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n _.value.mode === \"filter\" && !a.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Vt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: e.$i18n.Common.All_tags ?? \"\",\n state: _.value.model.value.length ? \"\" : \"selected\",\n onSelect: t[3] ||= (e) => _.value.model.value = []\n }, null, 8, [\"name\", \"state\"])) : (0, vue_1.createCommentVNode)(\"\", !0),\n ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(d.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Vt, {\n key: e.id,\n id: e.id,\n colorId: e.color_id,\n name: e.name,\n state: b(e.id),\n canExclude: _.value.mode === \"filter\" && !a.singleMode,\n editable: a.tagsEditable,\n disabled: ee.value && b(e.id) === \"\",\n onUnselect: (t) => x(e.id, \"unselect\"),\n onSelect: (t) => x(e.id, \"select\"),\n onExclude: (t) => x(e.id, \"exclude\"),\n \"onUpdate:name\": (t) => {\n e.name = t, (0, vue_1.unref)(p)(\"tagsChanged\", d.value);\n }\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\",\n \"canExclude\",\n \"editable\",\n \"disabled\",\n \"onUnselect\",\n \"onSelect\",\n \"onExclude\",\n \"onUpdate:name\"\n ]))), 128)),\n a.tagsEditable && d.value.length < a.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(D, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Add), 1)]),\n _: 1\n })) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 2\n }, [_.value.mode === \"setter\" && _.value.filters ? {\n name: \"header\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => h.value = e,\n options: g()\n }, null, 8, [\"modelValue\", \"options\"])]),\n key: \"0\"\n } : void 0, _.value.mode === \"setter\" && _.value.filters ? {\n name: \"footer\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.h, { onClick: t[2] ||= (e) => (0, vue_1.unref)(p)(\"setter\", {\n tagsIds: _.value.model.value,\n filters: _.value.filters,\n filtersAction: h.value,\n payload: _.value.payload\n }) }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(h.value === \"add\" ? e.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? e.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? e.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = rt;\n exports.clearCache = Et;\n exports.TopProjectSelector = Nt;\n exports.genElTopTagSelectorPopupOpener = Ft;\n exports.renderElTopTagSelectorPopupOpener = It;\n exports.TopTagSelectorTagIcon = Q;\n exports.TopTagSelectorPopupOpener = Ut;\n exports.TopTagSelector = Wt;\n});\n//# sourceMappingURL=project.js.map\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './types';\nimport Core from '@/core/core/core';\nimport Button from '@/components/forms/button/button.vue';\nimport Popup from '@/components/popup/popup/popup.vue';\nimport ListItem from '@/components/popup/popup/listItem.vue';\nimport Menu from '@/components/formsExt/menu/menu.vue';\nimport { useI18n } from '@/core/plugins/i18n';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowSelectAllItem: true,\n\tselectAllItemIcon: '',\n});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: props.selectAllItemIcon,\n\t\t\ttitle: useI18n().Common.Select_all,\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n\t\n\treturn undefined;\n});\n</script>\n\n<template>\n\t<div class=\"top-competitorSelector\">\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-competitorSelector_opener\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\ticon2=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-competitorSelector_opener.top-button {\n\twidth: 100%;\n}\n</style>\n","import type { MaybeRefOrGetter } from 'vue';\nimport { computed, toValue } from 'vue';\nimport type { Competitor, Item } from '@/components/project/competitorSelector/types';\n\nexport const useItemsFromCompetitors = (competitors: MaybeRefOrGetter<Competitor[]>, projectId: MaybeRefOrGetter<number>) => {\n\treturn computed(() => {\n\t\tconst activeCompetitors = toValue(competitors).filter(competitor => competitor.on >= 0 || competitor.id === projectId);\n\n\t\tconst items: Item[] = activeCompetitors.map(competitor => {\n\t\t\treturn {\n\t\t\t\tvalue: competitor.id,\n\t\t\t\ttitle: competitor.url + ` [${competitor.id}]`,\n\t\t\t\ticon: competitor.id === toValue(projectId) ? '' : '',\n\t\t\t\tcontent: competitor.name,\n\t\t\t};\n\t\t});\n\n\t\treturn items;\n\t});\n};\n","import type { Region, SearcherIndexed } from '../types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Ключ ПС - для выбора нескольких ПС или регионов\n */\nexport const searhcerCompareKey = -1;\n\n/**\n * Ключ ПС или индекса Региона, используется для ПС или Региона, не настроенных в проекте\n *\n * Также, используется для API с возможностью не указывать регион, см. `props.autoRegion`\n */\nexport const dummyIndex = -2;\n\n/**\n * Регион - без региона\n */\nexport const globalRegionIndex = -1;\n\nexport const searchersNames = {\n\t0: 'Yandex',\n\t1: 'Google',\n\t4: 'YouTube',\n\t5: 'Bing',\n\t7: 'Seznam',\n\t8: 'AppStore',\n\t9: 'GoogleStore',\n\t20: 'Yandex.com',\n\t21: 'Yandex.com.tr',\n};\n\nexport const regionUndefined: Region = {\n\tkey: dummyIndex,\n\tname: '--',\n\tindex: dummyIndex,\n};\n\nexport const searcherUndefined: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: '--',\n\tregions: [regionUndefined],\n\tregionByIndex: new Map([[dummyIndex, regionUndefined]]),\n};\n\nconst regionAuto: Region = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tindex: dummyIndex,\n};\n\nconst searcherAuto: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tregions: [regionAuto],\n\tregionByIndex: new Map([[dummyIndex, regionAuto]]),\n};\n\nconst regionGlobal: Region = {\n\tcountryCode: '00',\n\tdepth: 1,\n\tdevice: 0,\n\tkey: globalRegionIndex,\n\tindex: globalRegionIndex,\n\tlang: 'ru',\n\tname: 'Without region',\n};\n\nexport const getRegionAuto = () => {\n\tregionAuto.name = useI18n().Common.Autoselect!;\n\n\treturn regionAuto;\n};\n\nexport const getSearcherAuto = () => {\n\tgetRegionAuto();\n\n\tsearcherAuto.name = useI18n().Common.Autoselect!;\n\tconsole.log(searcherAuto);\n\n\treturn searcherAuto;\n};\n\nexport const getRegionGlobal = () => {\n\tregionGlobal.name = useI18n().Keywords.Without_region!;\n\n\treturn regionGlobal;\n};\n","import Core from '@/core/core/core';\nimport type { ForMode, Region, Searcher, SearcherByKey, SearcherIndexed } from '../types';\nimport { dummyIndex, getRegionGlobal, getSearcherAuto, searchersNames, searcherUndefined } from './consts';\nimport { useAsyncTopDialog } from '@/components/dialog/dialog/composables/utils';\n\n/**\n * Генерация Map ПС с Map регионов из массива searchers\n * - ключ для ПС - searcherKey\n * - ключ для региона - regionIndex\n *\n * Если поисковиков в списке нет, в список будет добавлен searcherUndefined\n *\n * Если регионов в списке нет, в список будет добавлен regionUndefined\n *\n * @param forMode - Режим выбора регионов\n * @param autoRegion - добавить элемент с ключем -2, который в API заменяется на нужный ключ в зависимости от контекста\n * @param searchers - поисковики с регионами проекта, см.: get/projects_2/projects, show_searchers_and_regions = 1\n */\nexport const genSearcherByKey = (\n\tforMode: ForMode = '',\n\tautoRegion: boolean = false,\n\tsearchers: Searcher[] = [],\n) => {\n\tlet searcherByKey: SearcherByKey;\n\n\tif (forMode) {\n\t\tsearcherByKey = genSearchersMapForMode(searchers, forMode);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers);\n\t}\n\n\tif (autoRegion) searcherByKey.set(dummyIndex, getSearcherAuto());\n\tif (!searcherByKey.size) searcherByKey.set(dummyIndex, searcherUndefined);\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @param forceSearchersKeys - ключи ПС, которые нееобходимо вывести в любом случае\n * @param forMode - Режим выбора регионов (при непустом значении остаются только Яндекс, Google и Mail)\n */\nconst genSearchersMapCommon = (\n\tsearchers: Searcher[],\n\tonlyEnabledRegions: boolean = true,\n\tforceSearchersKeys: Searcher['key'][] = [],\n\tforMode: ForMode = '',\n) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\t\tif (forMode && typeof searcher.key === 'number' && searcher.key > 1) return;\n\n\t\tconst searcherI = { ...searcher } as SearcherIndexed;\n\t\tsearcherI.regionByIndex = new Map();\n\n\t\tif (searcher.regions) {\n\t\t\tsearcher.regions.forEach((region: Region) => {\n\t\t\t\tif (onlyEnabledRegions && !region.enabled) return;\n\n\t\t\t\tconst regionI = { ...region };\n\t\t\t\tsearcherI.regionByIndex.set(regionI.index, regionI);\n\t\t\t});\n\t\t}\n\n\t\tif (!searcherI.regionByIndex.size && !forceSearchersKeys.length) {\n\t\t\t// searcherI.regionByIndex.set(regionUndefined.index, regionUndefined);\n\t\t}\n\n\t\tif (\n\t\t\t// режим вывода ПС без регионов\n\t\t\t!searcher.regions ||\n\n\t\t\t// есть включенные регионы\n\t\t\tsearcherI.regionByIndex.size ||\n\n\t\t\t// запрошен вывод конкретных ПС\n\t\t\tforceSearchersKeys.length\n\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\t// дополнительные ПС\n\tforceSearchersKeys.forEach((searcherKey) => {\n\t\tif (searcherByKey.has(searcherKey)) return;\n\n\t\tconst searcherI: SearcherIndexed = {\n\t\t\tkey: searcherKey,\n\t\t\tname: searchersNames[searcherKey],\n\t\t\tregions: [],\n\t\t\tregionByIndex: new Map(),\n\t\t};\n\n\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t});\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки частоты (Яндекс, Google, Mail если добавлен в проект)\n *\n * @param searchers\n * @param forMode - Режим выбора регионов\n */\nconst genSearchersMapForMode = (searchers: Searcher[], forMode: ForMode) => {\n\tconst serarcherByKey = genSearchersMapCommon(searchers, false, Core.state.forceSearchersKeysForKeywordsStats, forMode);\n\n\t// в Mail нет регионов\n\tif (serarcherByKey.has(2)) {\n\t\tconst searcherMail = serarcherByKey.get(2);\n\t\tif (searcherMail) searcherMail.regionByIndex = new Map();\n\t}\n\n\tif ((forMode === 'volume' || forMode === 'cost_forecast') && Core.state.showGlobalRegionForKeywordsStats) {\n\t\t// добавление глобального региона\n\t\tserarcherByKey.forEach((searcher) => {\n\t\t\tif (!searcher.regionByIndex) return;\n\n\t\t\tconst region = { ...getRegionGlobal() };\n\t\t\tsearcher.regionByIndex.set(region.index, region);\n\t\t});\n\t}\n\n\treturn serarcherByKey;\n};\n\n/**\n * Поиск региона по заданному критерию из списка поисковиков проекта\n *\n * @param forMode - Режим выбора регионов\n * @param searchRegion - объект с параметрами региона, который следует найти\n * @param searchers\n */\nexport const findRegion = (forMode: ForMode, searchRegion: Partial<Region>, searchers: Searcher[] = []) => {\n\tconst searcherByKey = genSearcherByKey(forMode, false, searchers);\n\n\tlet findedRegion: Region | undefined;\n\n\t// поиск ПС\n\tsearcherByKey.forEach((searcher) => {\n\t\tif (searchRegion.searcher_key !== undefined && searchRegion.searcher_key != searcher.key) return;\n\t\tif (!searcher.regions) return;\n\n\t\t// поиск региона\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (findedRegion) return;\n\n\t\t\tif (searchRegion.key !== undefined && searchRegion.key != region.key) return;\n\t\t\tif (searchRegion.index !== undefined && searchRegion.index != region.index) return;\n\n\t\t\tif (!forMode) {\n\t\t\t\tif (searchRegion.lang !== undefined && searchRegion.lang != region.lang) return;\n\t\t\t\tif (searchRegion.device !== undefined && searchRegion.device != region.device) return;\n\t\t\t}\n\n\t\t\tregion.searcher_key = searcher.key;\n\t\t\tfindedRegion = region;\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (findedRegion) return false;\n\t});\n\n\treturn findedRegion;\n};\n\n/**\n * Открыть диалоговое окно с выбором нескольких регионов\n *\n * @see import('../dialog_regionSelectorRegions/types').Props\n */\nexport const dialogRegionSelector = useAsyncTopDialog(() => {\n\treturn import('@/components/project/regionSelector/dialog_regionSelectorRegions/dialog_regionSelectorRegions.vue');\n});\n","import { computed, type ComputedRef, ref } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, SearcherByKey } from '../types';\nimport type { Option, Options } from '@/components/forms/select/types';\nimport { dummyIndex, searhcerCompareKey } from '../utils/consts';\nimport { getSearcherGIcon } from '@/core/utils/searchers';\n\n/**\n * Создание и управление реактивными переменными для выбора ПС\n *\n * @param props - входные props компонента\n * @param mapSearchers - Map ПС (реактивная)\n */\nexport const useSelectSearcher = (\n\tprops: Props,\n\tmapSearchers: ComputedRef<SearcherByKey>,\n) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Ключ выбранной поисковой системы\n\t */\n\tconst searcherKey = ref(mapSearchers.value.keys().next().value ?? dummyIndex);\n\n\t/**\n\t * Коллекция опций для выбора ПС\n\t */\n\tconst optionBySearcherKey = computed(() => {\n\t\tconst res: Options = new Map();\n\t\tmapSearchers.value.forEach((searcher) => {\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: searcher.key,\n\t\t\t\ttitle: searcher.name,\n\t\t\t};\n\n\t\t\tif (props.addSearcherIcon) option.icon = getSearcherGIcon(searcher.key);\n\n\t\t\tres.set(searcher.key, option);\n\t\t});\n\n\t\t// добавить режим сравнения, если есть хотя бы одна ПС с одним регионом\n\t\tif (props.addCompare && !res.has(dummyIndex)) {\n\t\t\tconst dummyOption: Option = {\n\t\t\t\tvalue: '',\n\t\t\t\ttitle: '--------------------',\n\t\t\t\tdisabled: true,\n\t\t\t};\n\t\t\tres.set(dummyOption.value, dummyOption);\n\n\t\t\tconst compareOption: Option = {\n\t\t\t\tvalue: searhcerCompareKey,\n\t\t\t\ttitle: i18n.Common.Compare!,\n\t\t\t};\n\t\t\tres.set(compareOption.value, compareOption);\n\t\t}\n\n\t\treturn res;\n\t});\n\n\treturn {\n\t\tsearcherKey,\n\t\toptionBySearcherKey,\n\t};\n};\n","import { computed, type ComputedRef, ref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getDeviceGIcon, getLangLabel } from '@/core/utils/searchers';\nimport type { Option } from '@/components/forms/select/types';\nimport { dummyIndex } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\n\n/**\n * Создание и управление реактивными переменными для выбора региона\n *\n * @param props - входные props компонента\n * @param activeSearcherIndexed - объект активной поисковой системы (реактивная)\n */\nexport const useSelectRegion = (props: Props, activeSearcherIndexed: ComputedRef<SearcherIndexed>) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Индекс выбранного региона\n\t */\n\tconst regionIndex = ref(dummyIndex);\n\n\tif (props.modelValue.length === 1) {\n\t\tregionIndex.value = props.modelValue[0];\n\t}\n\n\tif (regionIndex.value === dummyIndex) {\n\t\tif (props.forMode) {\n\t\t\t// в качестве ключа используется region.key, а не region.index\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.values().next().value?.key ?? dummyIndex;\n\t\t} else {\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.keys().next().value ?? dummyIndex;\n\t\t}\n\t}\n\n\t/**\n\t * Коллекция опций для выбора региона\n\t */\n\tconst optionByRegionIndex = computed(() => {\n\t\tconst options = new Map<number, Option>();\n\n\t\tactiveSearcherIndexed.value.regionByIndex?.forEach((region) => {\n\t\t\tlet regionLabel = region.name;\n\n\t\t\t// на частоту в текущей версии устройство и язык не влияют\n\t\t\t// обратите внимание, в качестве ключа используется region.key, а не region.index\n\t\t\tif (props.forMode) {\n\t\t\t\tconst option: Option = {\n\t\t\t\t\tvalue: region.key,\n\t\t\t\t\ttitle: regionLabel,\n\t\t\t\t};\n\t\t\t\tif (!options.has(region.key)) options.set(region.key, option);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (region.device) {\n\t\t\t\tregionLabel += ' (' + i18n.Common['Device_' + region.device] + ')';\n\t\t\t}\n\n\t\t\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\t\t\tif (langLabel) regionLabel += ' / ' + langLabel;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel,\n\t\t\t\ticon: region.device ? getDeviceGIcon(region.device) : undefined,\n\t\t\t};\n\n\t\t\toptions.set(region.index, option);\n\t\t});\n\n\t\treturn options;\n\t});\n\n\t/**\n\t * Выбор максимально похожего региона в новой коллекции регионов\n\t */\n\twatch(optionByRegionIndex, (optionByRegionIndex, oldOptionByRegionIndex) => {\n\t\tif (props.onlySearcher || regionIndex.value !== undefined && optionByRegionIndex.get(regionIndex.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newRegionIndex = optionByRegionIndex.keys().next().value as Region['index'];\n\t\tif (regionIndex.value === dummyIndex || newRegionIndex === dummyIndex) {\n\t\t\tregionIndex.value = newRegionIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst regionName = (oldOptionByRegionIndex?.get(regionIndex.value) as Option)?.title || '';\n\t\tlet regionMatchLevel = -1;\n\t\tfor (const [index, option] of optionByRegionIndex.entries()) {\n\t\t\tconst title = (option as Option).title;\n\n\t\t\tif (typeof title !== 'string' || typeof index === 'string') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// полное совпадение\n\t\t\tif (title === regionName) {\n\t\t\t\tnewRegionIndex = index;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst regexpDevice = new RegExp(` \\\\((${i18n.Common['Device_1']}|${i18n.Common['Device_2']})\\\\)`);\n\t\t\tlet regionNameCompare = regionName;\n\t\t\tlet regionMatchLevelI = 3;\n\n\t\t\t// без устройства\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без устройства и без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\t\t\t\tregionNameCompare = regionNameCompare.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\tif (title.indexOf(regionNameCompare) === -1) continue;\n\t\t\tif (regionMatchLevelI <= regionMatchLevel) continue;\n\n\t\t\tregionMatchLevel = regionMatchLevelI;\n\t\t\tnewRegionIndex = index;\n\t\t}\n\n\t\tregionIndex.value = newRegionIndex;\n\t});\n\n\treturn {\n\t\tregionIndex,\n\t\toptionByRegionIndex,\n\t};\n};\n","import { type ComputedRef, ref, watch } from 'vue';\nimport type { Props, SearcherByKey } from '../types';\n\n/**\n * Создание и управление реактивными переменными для сравнения\n *\n * @param props - входные props компонента\n * @param searcherByKey - Map ПС (реактивная)\n * @param allRegionsIndexes - Все доступные индексы регионов (реактивная)\n */\nexport const useCompare = (props: Props, searcherByKey: ComputedRef<SearcherByKey>, allRegionsIndexes: ComputedRef<Set<number>>) => {\n\t/**\n\t * Индексы регионов/ПС в сравнение\n\t */\n\tconst regionsIndexes = ref<number[]>([]);\n\n\t/**\n\t * Загрузка индексов регионов для сравнения\n\t *\n\t * Если в modelValue передано несколько регионов, они будут установлены как выбранные для сравнения\n\t */\n\tconst compareLoad = () => {\n\t\tif (props.onlySearcher && searcherByKey.value) {\n\t\t\tregionsIndexes.value = Array.from(searcherByKey.value.keys());\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionsIndexesSaved: Props['modelValue'] = [];\n\n\t\tif (props.modelValue.length > 1) {\n\t\t\tregionsIndexesSaved = [...props.modelValue];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\t// загрузить индексы регионов, если они были сохранены\n\t\t\t\tregionsIndexesSaved = JSON.parse(\n\t\t\t\t\tlocalStorage.getItem('ui:project:regionSelector' + props.projectId + ':regionsIndexes') as string,\n\t\t\t\t) ?? [];\n\t\t\t} catch (e) {\n\n\t\t\t}\n\t\t}\n\n\t\t// убрать из сравнения регионы, которых нет в props.searchers\n\t\tif (regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = regionsIndexesSaved.filter((regionIndex) => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\t// если не сохранено ни одного региона, выбрать все регионы проекта\n\t\tif (!regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = Array.from(allRegionsIndexes.value);\n\t\t}\n\n\t\tregionsIndexes.value = [...regionsIndexesSaved];\n\t};\n\n\t/**\n\t * Сохранение выбранных регионов\n\t */\n\tconst compareSave = () => {\n\t\tif (regionsIndexes.value.length) {\n\t\t\tlocalStorage.setItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes', JSON.stringify(regionsIndexes.value));\n\t\t} else {\n\t\t\tlocalStorage.removeItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes');\n\t\t}\n\t};\n\n\twatch(regionsIndexes, () => {\n\t\tcompareSave();\n\t});\n\n\tif (props.addCompare) {\n\t\t// if (props.compareRegionsIndexes?.length) {\n\t\t// \tcompareRegionsIndexes.value = [...props.compareRegionsIndexes];\n\t\t// } else {\n\t\t// \tcompareLoad();\n\t\t// }\n\n\t\tcompareLoad();\n\t}\n\n\treturn {\n\t\tregionsIndexes,\n\t};\n};\n","import { computed, watch } from 'vue';\nimport { findRegion, genSearcherByKey } from '../utils/utils';\nimport { dummyIndex, globalRegionIndex, searcherUndefined, searhcerCompareKey } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\nimport { useSelectSearcher } from './selectSearcher';\nimport { useSelectRegion } from './selectRegion';\nimport { useCompare } from './compare';\n\n/**\n * Создание и управления рективными переменными компонента\n *\n * @param props - входные props компонента\n */\nexport const useSelectorRegion = (props: Props) => {\n\tconst searcherByKey = computed(() => {\n\t\treturn genSearcherByKey(props.forMode, props.autoRegion, props.searchers);\n\t});\n\n\tconst activeSearcherIndexed = computed(() => {\n\t\treturn searcherByKey.value.get(selectSearcher.searcherKey.value) || searcherUndefined;\n\t});\n\n\t/**\n\t * Все индексы регионов из searcherByKey\n\t *\n\t * Активность регионов определяется в searcherByKey\n\t */\n\tconst allRegionsIndexes = computed(() => {\n\t\tconst regionsIndexes = new Set<number>();\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\tregionsIndexes.add(region.index);\n\t\t\t});\n\t\t});\n\n\t\treturn regionsIndexes;\n\t});\n\n\tconst selectSearcher = useSelectSearcher(props, searcherByKey);\n\tconst selectRegion = useSelectRegion(props, activeSearcherIndexed);\n\tconst compare = useCompare(props, searcherByKey, allRegionsIndexes);\n\n\t// контроль за внешним изменением списка ПС\n\twatch(searcherByKey, () => {\n\t\t// возможные значения для сравнения регионов/пс\n\t\tif (props.onlySearcher) {\n\t\t\tcompare.regionsIndexes.value = Array.from(searcherByKey.value.keys());\n\t\t} else {\n\t\t\tcompare.regionsIndexes.value = compare.regionsIndexes.value.filter(regionIndex => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey) return;\n\n\t\tlet newSearcherKey = searcherByKey.value.keys().next().value;\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t// определить выбранную ПС\n\t\t\tif (props.onlySearcher && searcher.key === selectSearcher.searcherKey.value) {\n\t\t\t\tnewSearcherKey = selectSearcher.searcherKey.value;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tselectRegion.regionIndex.value &&\n\t\t\t\tsearcher.regionByIndex?.has(selectRegion.regionIndex.value)\n\t\t\t) {\n\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t}\n\n\t\t\t// выбрать первую ПС с выбранным регионом\n\t\t\tif (!props.onlySearcher) {\n\t\t\t\tlet regionsNewSearcher: SearcherIndexed['regionByIndex'] | undefined;\n\n\t\t\t\tif (newSearcherKey !== undefined) {\n\t\t\t\t\tregionsNewSearcher = searcherByKey.value.get(newSearcherKey)?.regionByIndex;\n\t\t\t\t}\n\n\t\t\t\tconst regionsCurrentSearcher = searcherByKey.value.get(searcher.key)?.regionByIndex;\n\t\t\t\tif (\n\t\t\t\t\tregionsNewSearcher?.has(dummyIndex) &&\n\t\t\t\t\t!regionsCurrentSearcher?.has(dummyIndex)\n\t\t\t\t) {\n\t\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// if (props.addCompare && !selectSearcher.optionBySearcherKey.value.has(dummyIndex)) {\n\t\t// \tif (!selectRegion.regionIndex.value && compare.regionsIndexes.value?.length) newSearcherKey = searhcerCompareKey;\n\t\t// }\n\n\t\t// if (props.onlySearcher && selectRegion.regionIndex.value !== dummyIndex) newSearcherKey = selectRegion.regionIndex.value;\n\n\t\tif (newSearcherKey !== undefined) {\n\t\t\tselectSearcher.searcherKey.value = newSearcherKey;\n\t\t}\n\n\t\tif (\n\t\t\tselectRegion.regionIndex.value !== undefined &&\n\t\t\t!(activeSearcherIndexed.value?.regionByIndex)?.has(selectRegion.regionIndex.value)\n\t\t) {\n\t\t\tselectRegion.regionIndex.value = activeSearcherIndexed.value?.regions?.keys().next().value as number;\n\t\t}\n\t}, { immediate: true });\n\n\tconst getSearcherKey = () => {\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey || selectSearcher.searcherKey.value === dummyIndex) return;\n\n\t\treturn selectSearcher.searcherKey.value;\n\t};\n\n\tconst getRegionIndex = () => {\n\t\tif (props.onlySearcher) return;\n\n\t\tif (selectRegion.regionIndex.value === dummyIndex) return;\n\n\t\tlet res: Region['index'] | undefined = selectRegion.regionIndex.value;\n\n\t\t// в качестве ключа используется region.key\n\t\tif (props.forMode) {\n\t\t\tconst regionKey = selectRegion.regionIndex.value;\n\t\t\tconst region = findRegion(props.forMode, { searcher_key: getSearcherKey(), key: regionKey } as Region, props.searchers);\n\n\t\t\tres = region?.index;\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Получить выбранную ПС\n\t */\n\tconst getSearcher = () => {\n\t\tconst searcherKey = getSearcherKey();\n\t\tif (searcherKey === undefined) return;\n\n\t\treturn searcherByKey.value.get(searcherKey);\n\t};\n\n\t/**\n\t * Получить выбранный регион\n\t */\n\tconst getRegion = () => {\n\t\tconst regionIndex = getRegionIndex();\n\t\tif (regionIndex === undefined) return;\n\n\t\treturn getSearcher()?.regionByIndex?.get(regionIndex);\n\t};\n\n\treturn {\n\t\tselectSearcher,\n\t\tselectRegion,\n\t\tcompare,\n\n\t\tsearcherByKey,\n\t\tallRegionsIndexes,\n\n\t\tgetSearcher,\n\t\tgetRegion,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { watch } from 'vue';\nimport type { Props, Region } from './types';\nimport Select from '@/components/forms/select/select.vue';\nimport Button from '@/components/forms/button/button.vue';\nimport { useSelectorRegion } from './composables/selectorRegion';\nimport { dummyIndex, globalRegionIndex, searhcerCompareKey } from './utils/consts';\nimport { dialogRegionSelector } from '@/components/project/regionSelector/utils/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsearchers: () => [],\n\t// compareRegionsIndexes: () => [],\n\taddSearcherIcon: true,\n\taddRegionIcon: true,\n\taddChanger: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\nconst modelSingle = defineModel<Props['modelValueSingle']>('modelValueSingle');\n\nconst {\n\tselectSearcher,\n\tselectRegion,\n\tcompare,\n\n\tsearcherByKey,\n\tallRegionsIndexes,\n\n\tgetSearcher,\n\tgetRegion,\n} = useSelectorRegion(props);\n\nconst onClickCompare = () => {\n\tconst regions: Region[] = [];\n\n\tsearcherByKey.value.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (!region.enabled) return;\n\n\t\t\tregions.push(region);\n\t\t});\n\t});\n\n\tdialogRegionSelector.open('regions', {\n\t\tregions,\n\t\tregionsIndexes: compare.regionsIndexes.value,\n\t\t'@update:regionsIndexes': (regionsIndexes: number[]) => compare.regionsIndexes.value = regionsIndexes,\n\t});\n};\n\nwatch([selectRegion.regionIndex, selectSearcher.searcherKey, compare.regionsIndexes], () => {\n\tif (selectSearcher.searcherKey.value === searhcerCompareKey && compare.regionsIndexes.value.length) {\n\t\tif (JSON.stringify(model.value) === JSON.stringify(compare.regionsIndexes.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tmodel.value = [...compare.regionsIndexes.value];\n\t} else {\n\t\tif (props.onlySearcher) {\n\t\t\tmodel.value = [selectSearcher.searcherKey.value];\n\n\t\t\tif (selectSearcher.searcherKey.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t} else {\n\t\t\tmodel.value = [selectRegion.regionIndex.value];\n\n\t\t\t// не добавлять несуществующий регион в результаты\n\t\t\tif (selectRegion.regionIndex.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t}\n\t}\n\n\t// регионов нет\n\tif (!props.onlySearcher && !allRegionsIndexes.value.size) {\n\t\tselectSearcher.searcherKey.value = dummyIndex;\n\t}\n});\n\nif (modelSingle.value) {\n\twatch(modelSingle, () => {\n\t\tif (modelSingle.value) {\n\t\t\tmodel.value = [modelSingle.value];\n\t\t}\n\t}, { immediate: true });\n}\n\nwatch(model, () => {\n\tif (model.value[0]) {\n\t\tmodelSingle.value = model.value[0];\n\t}\n\n\t// проверка входных данных v-model на корректность\n\tif (props.onlySearcher) {\n\t\tif (\n\t\t\t!model.value.length ||\n\t\t\tmodel.value.length === 1 && !searcherByKey.value.has(model.value[0]) ||\n\t\t\tmodel.value.length === 1 && model.value[0] === dummyIndex && !props.autoRegion\n\t\t) {\n\t\t\tlet defaultKey: number | undefined = searcherByKey.value.keys().next().value;\n\n\t\t\t// запретить устанавливать несуществующий регион\n\t\t\tif (defaultKey === dummyIndex && !props.autoRegion) {\n\t\t\t\tdefaultKey = undefined;\n\n\t\t\t\tmodelSingle.value = dummyIndex;\n\t\t\t}\n\n\t\t\tif (defaultKey !== undefined) {\n\t\t\t\tmodel.value = [defaultKey];\n\t\t\t}else{\n\t\t\t\tmodel.value.length = 0;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmodel.value.length > 1 &&\n\t\t\tJSON.stringify(model.value) !== JSON.stringify(compare.regionsIndexes.value)\n\t\t) {\n\t\t\tmodel.value = [...compare.regionsIndexes.value];\n\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlet newModel = [...new Set(model.value)];\n\n\t\tlet defaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.keys().next().value;\n\t\tif (props.forMode) {\n\t\t\tdefaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.values().next().value?.key;\n\t\t}\n\n\t\t// запретить устанавливать несуществующий регион\n\t\tif (defaultIndex === dummyIndex && !props.autoRegion) {\n\t\t\tdefaultIndex = undefined;\n\n\t\t\tmodelSingle.value = dummyIndex;\n\t\t}\n\n\t\tif (!newModel.length) {\n\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t} else if (newModel.length === 1) {\n\t\t\tlet all = allRegionsIndexes.value;\n\n\t\t\tif (props.forMode) {\n\t\t\t\tall = new Set();\n\t\t\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\t\t\tall.add(region.key);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// убрано, так как dummyIndex запрещено выбирать в model\n\t\t\t// if (!all.has(newModel[0]) && newModel[0] !== dummyIndex) {\n\t\t\tif (!all.has(newModel[0])) {\n\t\t\t\tnewModel = [];\n\t\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewModel = newModel.filter(index => allRegionsIndexes.value.has(index));\n\t\t\tif (!newModel.length && defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (JSON.stringify(model.value) !== JSON.stringify(newModel)) {\n\t\t\tmodel.value = newModel;\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// входные данные v-model совпадают с внутренними значениями\n\tif (\n\t\tmodel.value.length === 1 &&\n\t\tmodel.value[0] === (props.onlySearcher ? selectSearcher.searcherKey.value : selectRegion.regionIndex.value)\n\t) {\n\t\treturn;\n\t}\n\n\t// if (\n\t// \tmodel.value.length > 1 &&\n\t// \tselectorSearcher.searcherKey.value === searhcerCompareKey &&\n\t// \tJSON.stringify(model.value) === JSON.stringify(selectorCompare.regionsIndexes.value)\n\t// ) {\n\t// \treturn;\n\t// }\n\n\t// обновление regionIndex, searcherKey, selectorCompare.regionsIndexes\n\tif (props.onlySearcher) {\n\t\t// if (!model.value.length) {\n\t\t// \tselectorSearcher.searcherKey.value = dummyIndex;\n\t\t//\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (model.value.length === 1) {\n\t\t\tselectSearcher.searcherKey.value = model.value[0];\n\n\t\t\treturn;\n\t\t}\n\n\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\n\t\treturn;\n\t} else {\n\t\tif (!model.value.length) {\n\t\t\t// selectSearcher.searcherKey.value = dummyIndex;\n\t\t\t// selectRegion.regionIndex.value = dummyIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (model.value.length === 1 && selectSearcher.searcherKey.value !== searhcerCompareKey) {\n\t\t\tselectRegion.regionIndex.value = model.value[0];\n\n\t\t\tlet newSearherKey: number | undefined;\n\t\t\tfor (const searcher of searcherByKey.value.values()) {\n\t\t\t\tfor (const region of searcher.regionByIndex.values()) {\n\t\t\t\t\tconst currentRegionIndex = props.forMode ? region.key : region.index;\n\t\t\t\t\tif (currentRegionIndex === selectRegion.regionIndex.value) {\n\t\t\t\t\t\tnewSearherKey = searcher.key;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\tselectSearcher.searcherKey.value = newSearherKey;\n\t\t\t}\n\t\t} else {\n\t\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\t\t\tcompare.regionsIndexes.value = [...model.value];\n\t\t}\n\t}\n}, { immediate: true });\n\ndefineExpose({\n\tgetSearcher,\n\tgetRegion,\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-regionSelector': true,\n\t\t\t'top-regionSelector-onlySearcher': onlySearcher,\n\t\t}\"\n\t>\n\t\t<Select\n\t\t\t:options=\"selectSearcher.optionBySearcherKey.value\"\n\t\t\tv-model=\"selectSearcher.searcherKey.value\"\n\t\t\tname=\"searcher_key\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t/>\n\n\t\t<Select\n\t\t\tv-if=\"!onlySearcher && selectSearcher.searcherKey.value !== searhcerCompareKey\"\n\t\t\tclass=\"top-select-region\"\n\t\t\t:options=\"selectRegion.optionByRegionIndex.value\"\n\t\t\tv-model=\"selectRegion.regionIndex.value\"\n\t\t\t:name=\"forMode ? 'region_key' : 'region_index'\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t\t:data-top-icon=\"addRegionIcon ? '' : undefined\"\n\t\t/>\n\n\t\t<Button\n\t\t\tv-if=\"addCompare && !onlySearcher && selectSearcher.searcherKey.value === searhcerCompareKey\"\n\t\t\tname=\"compare\"\n\t\t\t@click=\"onClickCompare\"\n\t\t\t:data-count-compare-regions-indexes=\"compare.regionsIndexes.value.length\"\n\t\t>\n\t\t\t{{ $i18n.Common.Selected_regions }}\n\t\t</Button>\n\t</div>\n</template>\n\n<style>\n@import \"./styles/searcherColors.css\";\n\n.top-regionSelector {\n\twidth: 340px;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n\n.top-regionSelector > .top-select {\n\tflex-grow: 1;\n}\n\n.top-regionSelector > .top-select:focus-within {\n\tz-index: 4;\n}\n\n.top-regionSelector > .top-select > .top-select_select:hover,\n.top-regionSelector > .top-select > .top-select_select.top-error {\n\tz-index: 1;\n}\n\n.top-regionSelector > .top-select-searcher_key {\n\twidth: 140px;\n\tmax-width: 160px;\n\tmargin-right: -1px;\n}\n\n.top-regionSelector > .top-select-region > select {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.top-regionSelector > .top-select-region {\n\t--top-icon-size: 20px;\n\t--top-icon-color: var(--color-text-primary);\n\n\t--top-icon2-size: 20px;\n\t--top-icon2-color: var(--color-text-primary);\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2] {\n\t--top-icon2-size: 16px;\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2]:after {\n\ttext-indent: -4px;\n}\n\n.top-regionSelector > [name=\"compare\"] {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\tflex-grow: 1;\n}\n\n.top-regionSelector > [name=\"compare\"]:after {\n\tcontent: \"(\" attr(data-count-compare-regions-indexes) \")\";\n\tmargin: 0 0 0 6px;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key > select {\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\tmargin-right: 0;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key[data-value=\"-1\"] > select {\n\tborder-right: none;\n}\n\n.top-regionSelector-onlySearcher {\n\twidth: 140px;\n}\n</style>\n","// Генерация плоского массива объектов папок с заполнением childsIds и счетчиков\nimport type { Folder, FolderTree } from './types';\nimport type { Props } from '../types';\nimport { useI18n } from '@/core/app';\n\nexport const folderDefault: Folder = {\n\tid: 0,\n\tname: '/',\n\tpath: '/',\n};\n\n/**\n * Сгенерировать объект корневой папки для компонента\n *\n * Содержит измененное имя\n *\n * Необходимо предустанавливать для минимизации `rerender`\n */\nexport const genRootFolder = (folders: FolderTree | undefined, useSelectAll: boolean) => {\n\tlet rootFolder = folders?.['root'][0] ?? folderDefault;\n\trootFolder = { ...rootFolder };\n\n\trootFolder.name = genRootFolderName(useSelectAll);\n\n\treturn rootFolder;\n};\n\nexport function genRootFolderName(useSelectAll: boolean) {\n\tif (useSelectAll) {\n\t\treturn useI18n()?.Common.All_folders;\n\t} else {\n\t\treturn '/ (' + useI18n()?.Keywords.Root_folder + ')';\n\t}\n}\n\n/**\n * Сгенерировать плоский список папок\n *\n * В `folders` должен передаваться список всех папок, дозагрузка не предусмотрена\n */\nexport const genFlat = (\n\tfolderById: NonNullable<Props['folders']>,\n\tuseSelectAll: boolean,\n\tresultFolders = new Map<Folder['id'], Folder>(),\n\tparentFolder: Folder = { id: 'root' } as unknown as Folder,\n\tdepth = 0,\n) => {\n\tparentFolder.childsIds = [];\n\n\tif (parentFolder.id) {\n\t\tparentFolder.countAllGroupsActive = parentFolder.count_groups_active;\n\t}\n\n\tif (!folderById[parentFolder.id]) {\n\t\treturn resultFolders;\n\t}\n\n\tfolderById[parentFolder.id].forEach((folder) => {\n\t\tfolder = { ...folder };\n\n\t\tparentFolder.childsIds!.push(folder.id);\n\n\t\tif (folder.id === 0) folder.name = genRootFolderName(useSelectAll);\n\n\t\tconst prefix = depth > 1 ? '-'.repeat(depth - 1) + ' ' : '';\n\t\tif (prefix && !folder.name.startsWith(prefix)) folder.name = prefix + folder.name;\n\n\t\tresultFolders.set(folder.id, folder);\n\n\t\tgenFlat(folderById, useSelectAll, resultFolders, folder, depth + 1);\n\n\t\tparentFolder.childsIds = parentFolder.childsIds!.concat(folder.childsIds!);\n\n\t\tif (parentFolder.id && folder.count_groups_active) {\n\t\t\tparentFolder.countAllGroupsActive! += folder.count_groups_active;\n\t\t}\n\t});\n\n\treturn resultFolders;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetFolders = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/folders/`, ['id', 'parent_id', 'name', 'path']).changeParams({ orders: ['ord_path'] as any, limit: 100 });\n};\n","import { watch, type WatchOptions, type WatchSource, type WatchStopHandle } from 'vue';\n\ntype UnwrapSource<T> = T extends WatchSource<infer V>\n\t? V\n\t: T extends object ? T : never;\n\ntype Changes<T> = Partial<{\n\t[K in keyof T]: {\n\t\told: UnwrapSource<T[K]> | undefined;\n\t\tnew: UnwrapSource<T[K]>\n\t}\n}>;\n\n/**\n * useWatch — расширенный `watch` с измененным callback\n * - принимает объект с реактивными свойствами, точно такими же, как при указании в массиве в стандартном `watch`\n * - callback возвращает изменившиеся свойства в объекте `changes` с `{old, new}`\n *\n * Если у вас есть несколько `watch`, которые меняют одно состояние, то могут возникнуть проблемы:\n * - рост длины цепочек `watch`, когда один `watch` приводит к срабатыванию другого\n * - лишние вызовы при согласованных состояниях, когда разные `watch` устанавливают одно и то же значение\n * - гонка при несогласованных состояниях, когда разные `watch` в разные тики при этом одновременно могут устанавливать разные состояния\n *\n * Если у вас такой случай и его нельзя упростить, то используйте `useWatch`, в остальных случаях используйте только стандартный `watch`\n *\n * @example\n *\n * ```js\n *\n * useWatch({ a: ref(5), b: ref('word') }, (changes) => {\n * \tconsole.log(changes.a?.new, changes.a?.old);\n * \tconsole.log(changes.b?.new, changes.b?.old);\n * });\n * ```\n */\nexport function useWatch<T extends Record<string, WatchSource>>(\n\tsourcesObj: T,\n\tcb: (\n\t\tchanges: Changes<T>,\n\t\tonCleanup: (fn: () => void) => void,\n\t) => void | Promise<void>,\n\toptions?: WatchOptions,\n): WatchStopHandle {\n\tconst keys = Object.keys(sourcesObj) as (keyof T)[];\n\tconst sources = keys.map(k => sourcesObj[k]);\n\n\treturn watch(sources, (newValues, oldValues, onCleanup) => {\n\t\tconst changed = {} as Changes<T>;\n\n\t\tnewValues.forEach((val, i) => {\n\t\t\tif (!Object.is(val, oldValues[i])) {\n\t\t\t\tconst k = keys[i];\n\n\t\t\t\tchanged[k] = {\n\t\t\t\t\told: oldValues[i],\n\t\t\t\t\tnew: val,\n\t\t\t\t} as any;\n\t\t\t}\n\t\t});\n\n\t\tif (Object.keys(changed).length) cb(changed, onCleanup);\n\t}, options);\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { folderDefault, genApiGetFolders, genFlat, genRootFolderName } from './utils';\nimport { apiSetSearchParamsFilter } from '@/components/formsExt/formsExt';\nimport { useWatch } from '@/core/utils/composables/useWatch';\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddIcon: true,\n});\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<NonNullable<Props['folder']>>('folder', { default: folderDefault });\n\nconst apiGet = props.client && !props.folders ? genApiGetFolders(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n// Настройка API\nwatch(() => props.projectId, () => {\n\tapiGet?.changeParams({\n\t\tproject_id: props.projectId,\n\t});\n\n\tapiGet?.setOptions({\n\t\tcheckFingerprint: 'TopGroupSelectorFolders:' + props.projectId,\n\t});\n\n\trefSelector.value?.resetCache();\n}, { immediate: true });\n\n/**\n * Плоский список папок\n */\nconst foldersFlat = computed(() => {\n\treturn genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAll);\n});\n\n/**\n * Нормализовать корневую папку\n *\n * Нужно только для замены \"Корневая папка\" на \"Все папки\"\n *\n * @note Другие решения с подменой `name` не сработают, так как API сохраняет items в cache, который менять нельзя\n */\nconst prepareItemsBeforeRender = (items: Item[]) => {\n\tif (props.canSelectAll && items[0]?.id === 0) {\n\t\titems[0] = {\n\t\t\t...items[0],\n\t\t\tname: genRootFolderName(true),\n\t\t};\n\t}\n\n\treturn items;\n};\n\n/**\n * Проверка входного значения `modelFolderId` и изменение `modelFolder`\n *\n * Определяем существует ли папка:\n * - Если существует: меняем папку на указанную\n * - Если не существует: устанавливаем Корневую папку\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelFolder,\n\tmodelFolderId,\n}, async (changes) => {\n\tif (modelFolderId.value === modelFolder.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelFolder`\n\tif (changes.modelFolder && !changes.modelFolderId) {\n\t\tmodelFolderId.value = modelFolder.value.id;\n\n\t\treturn;\n\t}\n\n\tlet folderSelected = foldersFlat.value.get(props.folderId);\n\tif (!folderSelected) folderSelected = folderDefault;\n\n\tmodelFolder.value = folderSelected;\n\tmodelFolderId.value = folderSelected.id;\n\n\t// /**\n\t// * Для не api\n\t// */\n\t// if (props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n\t//\n\t// /**\n\t// * Для api проверка не делается\n\t// */\n\t// if (!props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n}, { immediate: true });\n</script>\n\n<template>\n\t<Selector2\n\t\tclass=\"top-groupSelector_folder\"\n\t\tv-model=\"modelFolder\"\n\t\t:items=\"folders ? [...foldersFlat.values()] : undefined\"\n\t\tsearch-type=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"folders ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:prepareItemsBeforeRender\n\t\t:addChanger\n\t\tuseCache\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div v-html=\"item.name.replaceAll(/</g, '< ')\"></div>\n\t\t</template>\n\t</Selector2>\n</template>\n","import type { Folder } from '../folders/types';\nimport type { Group, Props } from './types';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { folderDefault } from '../folders/utils';\nimport { ITEM_ID_ALL } from '@/components/formsExt/selector2/utils';\n\n/**\n * Элемент - группа ненайдена\n *\n * Указывается несуществующий id\n */\nexport const groupNone: Group = {\n\tid: -1,\n\tname: '--',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент для выбора всех групп\n */\nexport const groupAll: Group = {\n\tid: ITEM_ID_ALL,\n\tname: 'All groups',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент - `Все группы`\n */\nexport const genGroupAll = () => {\n\tgroupAll.name = useI18n()?.Common.All_groups;\n\n\treturn groupAll;\n};\n\n/**\n * Элемент - `Выберите группу`\n */\nexport const genGroupPlaceholder = () => {\n\tgroupAll.name = useI18n()?.Keywords.Choose_group;\n\n\treturn groupAll;\n};\n\n/**\n * Сгенерировать список групп для TopSelector\n */\nexport const genItems = (groups: Group[], on?: boolean, folderForFilter?: Folder) => {\n\tgroups = [...groups];\n\n\t// фильтр по активности\n\tif (on !== undefined) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn group.on == Number(on);\n\t\t});\n\t}\n\n\t// фильтр по папке\n\tif (folderForFilter && folderForFilter.id && folderForFilter.childsIds) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn (\n\t\t\t\tgroup.folder_id === folderForFilter.id ||\n\t\t\t\tfolderForFilter.childsIds!.includes(group.folder_id)\n\t\t\t);\n\t\t});\n\t}\n\n\treturn groups;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/groups/`, ['id', 'name', 'folder_id', 'folder_path']).changeParams({ folder_id_depth: true, limit: 100 });\n};\n\n/**\n * Создать API запрос на добавление групп\n */\nexport const genApiAddGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/add/${service}/groups/`);\n};\n\n/**\n * Создать API запрос на удаление группы\n */\nexport const genApiDelGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/del/${service}/groups/`);\n}\n\n/**\n * Создать API запрос на переименование группы\n */\nexport const genApiEditGroupsRename = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/edit/${service}/groups/rename/`);\n}\n","<script setup lang=\"ts\">\nimport { reactive, ref } from 'vue';\nimport { useWatch } from '@/core/utils/composables/useWatch';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport PopupConfirm from '@/components/popup/popupConfirm/popupConfirm.vue';\nimport PopupPrompt from '@/components/popup/popupPrompt/popupPrompt.vue';\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport { apiSetSearchParamsFilter, ITEM_ID_ALL, ITEM_ID_NEW } from '@/components/formsExt/formsExt';\nimport type { Emits, Group, Props } from './types';\nimport {\n\tgenApiAddGroups,\n\tgenApiDelGroups,\n\tgenApiEditGroupsRename,\n\tgenApiGetGroups,\n\tgenGroupAll,\n\tgenGroupPlaceholder,\n\tgenItems,\n\tgroupNone,\n} from './utils';\nimport { genFieldFilter } from '@/api/api/index';\nimport { folderDefault } from '../folders/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tautoselect: 'first',\n\taddChanger: true,\n\taddIcon: true,\n});\n\nconst emits = defineEmits<Emits>();\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { required: true });\n\nconst apiGet = props.client && !props.groups ? genApiGetGroups(props.client, props.service) : undefined;\nconst apiAdd = props.client ? genApiAddGroups(props.client, props.service) : undefined;\nconst apiDel = props.client ? genApiDelGroups(props.client, props.service) : undefined;\nconst apiEditRename = props.client ? genApiEditGroupsRename(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n/**\n * Группы выбранной папки\n */\nconst groupsBySelectedFolder = ref<Group[] | undefined>(undefined);\n\nconst filterByFolder = genFieldFilter('folder_id', 'EQUALS', [props.folder?.id ?? 0]);\n\napiGet?.changeParams({\n\tproject_id: props.projectId,\n\tfolder_id_depth: true,\n\tfilters: [\n\t\tfilterByFolder,\n\t],\n});\n\nif (props.on !== undefined) {\n\tapiGet?.params.filters?.push(genFieldFilter('on', 'EQUALS', [Number(props.on)]));\n}\n\n/**\n * Синхронная установка группы и id группы\n *\n * Id рекомендуется вместе с группой\n * - для согласованной смены состояния\n * - для уменьшения цепочки `watch` синхронизации состояний `modelGroupId` и `modelGroup`\n *\n * Пример несогласованности: если передать `modelGroup` и значение `modelGroupId`, которое ему не соответсвует, то попытка установить ту же самоую группу в `modelGroup` не приведет к смене `modelGroupId`\n */\nconst setGroup = (group: Props['group']) => {\n\tmodelGroup.value = group;\n\tmodelGroupId.value = group.id;\n};\n\n/**\n * Сбросить кэш\n *\n * @param resetAPICache - Сбросить API кэш\n */\nconst resetCacheSelector = (resetAPICache = false) => {\n\trefSelector.value?.resetCache(resetAPICache);\n};\n\n// Настройка API, обработка смены папки и выбор всех групп\nuseWatch({\n\tprojectId: () => props.projectId,\n\tfolderId: () => props.folder?.id,\n\tcanSelectAll: () => props.canSelectAll,\n}, (changes) => {\n\t// Настройка API\n\tif (changes.projectId) {\n\t\tapiGet?.changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t});\n\n\t\tapiGet?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorGroups:' + props.projectId,\n\t\t});\n\t}\n\n\t// Обработка смены папки\n\tif (changes.folderId) {\n\t\tfilterByFolder.values = [\n\t\t\tprops.folder?.id ?? 0,\n\t\t];\n\n\t\t// необходимо установить группы выбранной папки\n\t\tif (props.groups) {\n\t\t\tgroupsBySelectedFolder.value = genItems(props.groups, props.on, props.folder);\n\t\t}\n\t}\n\n\tresetCacheSelector();\n\n\t/**\n\t * При смене папки автоматически выбирать нужную группу с учетом `props.autoselect`\n\t *\n\t * Новая группа, при смене папки не меняется\n\t */\n\tif (\n\t\t(changes.folderId?.old !== undefined || changes.canSelectAll?.old !== undefined) &&\n\t\tmodelGroupId.value !== ITEM_ID_NEW\n\t) {\n\t\tlet group: Props['group'] | undefined;\n\n\t\tif (props.autoselect === 'first') {\n\t\t\tgroup = groupsBySelectedFolder.value?.[0];\n\n\t\t\tif (props.canSelectAll) {\n\t\t\t\tgroup = reactive(genGroupAll());\n\t\t\t}\n\t\t}\n\n\t\tif (props.autoselect === 'placeholder' || !group) {\n\t\t\tgroup = genGroupPlaceholder();\n\t\t}\n\n\t\tsetGroup(group);\n\t}\n}, { immediate: true });\n\n/**\n * Проверка входного значения `modelGroupId` и изменение `modelGroup`\n *\n * Определяем существует ли группа:\n * - Если существует: меняем группу на указанную\n * - Если не существует: устанавливаем \"Нет группы\"\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelGroup,\n\tmodelGroupId,\n}, async (changes) => {\n\tif (modelGroupId.value === modelGroup.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelGroup`\n\tif (changes.modelGroup && !changes.modelGroupId) {\n\t\tmodelGroupId.value = modelGroup.value.id;\n\n\t\treturn;\n\t}\n\n\tif (props.canAdd && modelGroupId.value === ITEM_ID_NEW) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Для не api\n\t */\n\tif (props.groups) {\n\t\tlet groupSelected = groupsBySelectedFolder.value?.find((group) => group.id === modelGroupId.value);\n\n\t\tif (!groupSelected && props.canSelectAll) groupSelected = genGroupAll();\n\n\t\tif (groupSelected) {\n\t\t\tsetGroup(groupSelected);\n\t\t} else {\n\t\t\tconst firstGroup = groupsBySelectedFolder.value?.[0];\n\t\t\tif (firstGroup && !modelGroupId.value) {\n\t\t\t\t// группа не была указана, инициализация компонента\n\t\t\t\tsetGroup(firstGroup);\n\t\t\t} else {\n\t\t\t\tsetGroup(groupNone);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Для api\n\t */\n\tif (props.client && !props.groups && (modelGroupId.value || modelGroupId.value === ITEM_ID_ALL && !props.canSelectAll)) {\n\t\tconst api = genApiGetGroups(props.client, props.service).changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t\tid: modelGroupId.value,\n\t\t\tfilters: [\n\t\t\t\tfilterByFolder,\n\t\t\t],\n\t\t});\n\n\t\t/**\n\t\t * @remarks При выборе группы \"Все группы\" или при добавлении группы отмена запроса не происходит\n\t\t */\n\t\tapi?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorFindGroup:' + props.projectId,\n\t\t});\n\n\t\tconst res = await api.call();\n\n\t\t// при отмене запроса, смену группы не выполняем\n\t\tif (!res.errors?.length && !res.result) return;\n\n\t\tif (!res.errors && res.result[0]) {\n\t\t\tsetGroup(res.result[0] as Group);\n\t\t} else {\n\t\t\tsetGroup(groupNone);\n\t\t}\n\t}\n}, { immediate: true });\n\nconst addGroups = async (group: SelectorItem) => {\n\t// просто выбор произвольной группы, без реального добавления\n\tif (props.canAdd !== 'api') return;\n\n\t// при добавлении группы `props.client` обязателен\n\tif (!apiAdd) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiAdd.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\tconst modelGroupOld = modelGroup.value;\n\n\t// Для api\n\tconst res = await apiAdd.changeParams({\n\t\tproject_id: props.projectId,\n\t\tnames: [group.name],\n\t\tto_id: props.folder?.id ?? folderDefault.id,\n\t\tto_type: 'in_folder_last',\n\t}).call();\n\n\tif (res.result) {\n\t\tconst group = res.result[0] as Group;\n\n\t\tsetGroup(group);\n\n\t\temits('addGroup', group);\n\t} else {\n\t\t// вернуть предыдущий выбор в случае ошибки добавления группы\n\t\tsetGroup(modelGroupOld);\n\t}\n\n\trefSelector.value?.resetCache(true);\n};\n\nconst renameGroup = async (group: SelectorItem, newName: string) => {\n\t// при переименовании группы `props.client` обязателен\n\tif (!apiEditRename) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiEditRename.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiEditRename.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t\tname: newName,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t/**\n\t * Свойства Model напрямую менять нельзя\n\t *\n\t * Данный код вообще не нужен, потому что:\n\t * - локальный список групп управляется состоянием компонента через `props.group` и `@update:group`\n\t * - список, обновляемый через API, обновляется через систему кеширования\n\t */\n\t// if (modelGroup.value.id === group.id) {\n\t// \tmodelGroup.value = {\n\t// \t\t...modelGroup.value,\n\t// \t\tname: newName,\n\t// \t};\n\t// }\n\n\temits('editGroup', {\n\t\tid: group.id!,\n\t\tname: newName,\n\t});\n\n\trefSelector.value?.updateCacheItemById(group.id, {\n\t\tname: newName,\n\t});\n};\n\nconst deleteGroups = async (group: SelectorItem) => {\n\t// при удалении группы `props.client` обязателен\n\tif (!apiDel) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiDel.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiDel.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t// при удалении выбранной группа убрать выбор группы\n\tif (modelGroup.value.id === group.id) setGroup(props.canSelectAll ? genGroupAll() : groupNone);\n\n\temits('delGroup', group.id!);\n\n\trefSelector.value?.deleteCacheItemById(group.id);\n};\n\ndefineExpose({\n\tresetCacheGroups: resetCacheSelector,\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-groupSelector_group\"\n\t\tv-model=\"modelGroup\"\n\t\t:items=\"groupsBySelectedFolder ?? groups\"\n\t\tsearchType=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"groups ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:appendSearchToResult=\"!!canAdd\"\n\t\t:useAllItem=\"canSelectAll ? genGroupAll().name : false\"\n\t\t:addChanger\n\t\tuseCache\n\t\t@appendItem=\"addGroups\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-groupSelector_groupItem top-ellipsis1\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\tv-if=\"item.id === ITEM_ID_NEW\"\n\t\t\t\t>\n\t\t\t\t\t{{ $i18n.Common.Add }}:\n\t\t\t\t</div>\n\n\t\t\t\t<!--<span>{{ item.name }}</span>-->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-groupSelector_groupItemName top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.name\"\n\t\t\t\t></span>\n\n\t\t\t\t<!--<span v-if=\"item.folder_path && showPath\" class=\"top-groupSelector_groupItemFolderPath\">-->\n\t\t\t\t<!--\t{{ item.folder_path }}-->\n\t\t\t\t<!--</span>-->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"item.folder_path && showPath\"\n\t\t\t\t\tclass=\"top-groupSelector_groupItemFolderPath top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.folder_path\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template\n\t\t\t#actions=\"{ item }\"\n\t\t\tv-if=\"canEditAndDel && client\"\n\t\t>\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<!-- переименование группы -->\n\t\t\t\t<PopupPrompt\n\t\t\t\t\t:submitText=\"$i18n.Common.Save\"\n\t\t\t\t\t:defaultValue=\"item.name\"\n\t\t\t\t\t:inputProps=\"{ addCleaner: false }\"\n\t\t\t\t\t@submit=\"(value) => renameGroup(item, value)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template #default></template>\n\t\t\t\t</PopupPrompt>\n\n\t\t\t\t<!-- удаление группы -->\n\t\t\t\t<PopupConfirm\n\t\t\t\t\tisWarning\n\t\t\t\t\t:submitText=\"$i18n.Common.Delete\"\n\t\t\t\t\t@submit=\"deleteGroups(item)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<span v-html=\"service === 'keywords_2' ? $i18n.Keywords.Delete_group_warning : $i18n['Ai.Tracker'].Delete_group_warning\"></span>\n\t\t\t\t</PopupConfirm>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-groupSelector_groupItem {\n\tmin-height: 20px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-padding-1);\n}\n\n.top-groupSelector_groupItemFolderPath {\n\twidth: 100%;\n\tcolor: var(--color-text-4);\n\tfont-size: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type ModelRef, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport type { Group } from './groups/types';\nimport Folders from './folders/folders.vue';\nimport Groups from './groups/groups.vue';\nimport { folderDefault, genFlat } from './folders/utils';\nimport { genGroupAll, genGroupPlaceholder, groupNone } from './groups/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tcanSelectAllGroups: false,\n\tautoselect: 'first',\n\taddChanger: true,\n\tshowFolders: true,\n\tshowGroups: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\n\nconst componentGroupsRef = ref<InstanceType<typeof Groups> | null>(null);\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<Props['folder']>('folder');\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { default: groupNone }) as ModelRef<NonNullable<Props['group']>>;\n\nconst emit = defineEmits<Emits>();\n\n/**\n * Выбранная папка\n *\n * Спекулятивное предсказание выбранной папки\n *\n * Если папка не определена, она ставится в `undefined`, чтобы при последующем определении не фиксировались события смены папки, см. `groups.vue`\n */\nconst foldersFlat = genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAllGroups);\nmodelFolder.value = foldersFlat.get(modelFolderId.value);\n\n/**\n * Спекулятивное предсказание выбранной группы, чтобы не было лишней перерисовки\n *\n * Точная проверка происходит в `groups.vue`\n */\nlet groupInitial = props.groups?.find((group) => group.id === modelGroupId.value);\nif (!modelGroupId.value) groupInitial = props.groups?.[0];\nif (props.canSelectAllGroups && !groupInitial) {\n\tgroupInitial = genGroupAll();\n}\nif (props.autoselect === 'placeholder' || !groupInitial) {\n\tgroupInitial = genGroupPlaceholder();\n}\ngroupInitial ??= groupNone;\n\nmodelGroup.value = groupInitial;\n\nconst onAddGroup = (group: Group) => {\n\t// если загрузка групп производится по api, то добавлять новые группы в `props.groups` не нужно\n\tlet groups: Group[] | undefined;\n\n\tif (props.groups && group) {\n\t\tgroups = [...props.groups, group];\n\t}\n\n\temit('update:groups', groups);\n};\n\nconst onEditGroup = (groupEdited: Group) => {\n\t// если загрузка групп производится по api, то обновлять группы в `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groups = props.groups.map((group) => group.id === groupEdited.id ? groupEdited : group);\n\n\temit('update:groups', groups);\n};\n\nconst onDelGroup = (groupDeleted: Group) => {\n\t// если загрузка групп производится по api, то удалять группы из `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groups = props.groups.filter((group) => group.id !== groupDeleted.id);\n\n\temit('update:groups', groups);\n};\n\ndefineExpose({\n\t/**\n\t * Сбросить кэш\n\t *\n\t * @param resetAPICache - Сбросить API кэш\n\t */\n\tresetCacheGroups: (resetAPICache = false) => {\n\t\tcomponentGroupsRef.value?.resetCacheGroups(resetAPICache);\n\t},\n});\n</script>\n\n<template>\n\t<div class=\"top-groupSelector\">\n\t\t<Folders\n\t\t\tv-if=\"showFolders\"\n\t\t\tv-model:folderId=\"modelFolderId\"\n\t\t\tv-model:folder=\"modelFolder\"\n\t\t\t:projectId\n\t\t\t:folders\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:addChanger\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t/>\n\n\t\t<Groups\n\t\t\tv-if=\"showGroups\"\n\t\t\tref=\"componentGroupsRef\"\n\t\t\tv-model:groupId=\"modelGroupId\"\n\t\t\tv-model:group=\"modelGroup\"\n\t\t\t:projectId\n\t\t\t:folder=\"modelFolder\"\n\t\t\t:groups\n\t\t\t:on\n\t\t\t:canAdd=\"canAddGroup\"\n\t\t\t:canEditAndDel=\"canEditAndDelGroup\"\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:autoselect\n\t\t\t:addChanger\n\t\t\t:showPath=\"showGroupsPaths || showFolders\"\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t\t@addGroup=\"onAddGroup\"\n\t\t\t@editGroup=\"onEditGroup\"\n\t\t\t@delGroup=\"onDelGroup\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-groupSelector {\n\tdisplay: inline-flex;\n\tgap: var(--top-padding-1);\n}\n</style>\n","import type { Item, Props } from '@/components/formsExt/selector2/types';\nimport { TopPopupWorker } from '@/components/popup/worker';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\nimport Core from '@/core/core/core';\n\n/**\n * Создать объект заголовка для категории проектов\n */\nconst createProjectCategoryTitles = (name: string): Item => {\n\treturn {\n\t\tid: null,\n\t\tname,\n\t\tlistItemProps: {\n\t\t\ttype: 'title',\n\t\t},\n\t};\n};\n\n/**\n * Состояние вставки заголовков категорий\n *\n * Используется для отслеживания, какие заголовки уже были добавлены в список,\n * чтобы не дублировать их при постраничной загрузке данных\n */\nconst globalTitlesState = {\n\tscheduledUpdate: false,\n\tmanualUpdate: false,\n\tguestProjects: false,\n};\n\n/**\n * Вставить заголовки категорий перед соответствующими группами проектов\n *\n * Использует `globalTitlesState`, оно сохраняется между вызовами, так как проекты подгружаются частями\n *\n * При `useLocalTitlesState` = `true` создаётся временное состояние заголовков для этого вызова функции, не влияющее на глобальное состояние.\n * Используется при поиске проектов, чтобы сохранить исходное состояние заголовков\n */\nconst insertCategoryTitles = (projects: Item[], useLocalTitlesState?: boolean): Item[] => {\n\tconst result: Item[] = [];\n\n\tconst categoriesTitle = {\n\t\tscheduledUpdate: createProjectCategoryTitles(useI18n().Projects.Scheduled_update),\n\t\tmanualUpdate: createProjectCategoryTitles(useI18n().Projects.Manual_update),\n\t\tguestProjects: createProjectCategoryTitles(useI18n().Projects.Guest_projects),\n\t};\n\n\tconst titlesState = useLocalTitlesState ? {\n\t\tscheduledUpdate: false,\n\t\tmanualUpdate: false,\n\t\tguestProjects: false,\n\t} : globalTitlesState;\n\n\tfor (const project of projects) {\n\t\tif (!titlesState.scheduledUpdate && project.right?.startsWith('1') && project.on > 0) {\n\t\t\tresult.push(categoriesTitle.scheduledUpdate);\n\t\t\ttitlesState.scheduledUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.manualUpdate && project.right?.startsWith('1') && project.on === 0) {\n\t\t\tresult.push(categoriesTitle.manualUpdate);\n\t\t\ttitlesState.manualUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.guestProjects && project.right?.startsWith('0') && project.on >= 0) {\n\t\t\tresult.push(categoriesTitle.guestProjects);\n\t\t\ttitlesState.guestProjects = true;\n\t\t}\n\n\t\tresult.push(project);\n\t}\n\n\treturn result;\n};\n\n/**\n * Добавить к данным проектов `listItemProps`\n *\n * @see Item\n */\nconst addListItemProps = (\n\tprojects: Item[],\n) => {\n\treturn projects.map((project) => ({\n\t\t...project,\n\t\tlistItemProps: {\n\t\t\tattrs: { title: project.name },\n\t\t},\n\t}));\n};\n\n/**\n * Подготавить данные проектов для отображения:\n * - сбросить состояние вставки заголовков категорий, если требуется\n * - добавить `listItemProps`\n * - добавить заголовки к категориям\n */\nconst prepareProjects = (\n\tprojects: Item[] | undefined,\n\tresetTitlesState?: boolean,\n\tuseLocalTitlesState?: boolean,\n): Item[] | undefined => {\n\tif (!projects || projects.length === 0) return [];\n\n\tif (resetTitlesState) Object.keys(globalTitlesState).forEach((key) => globalTitlesState[key] = false);\n\n\tconst projectsWithListItem = addListItemProps(projects);\n\treturn insertCategoryTitles(projectsWithListItem, useLocalTitlesState);\n};\n\n/**\n * Добавить к ссылке релевантные hash-параметров текущего проекта\n */\nconst prepareProjectLink = (link: string) => {\n\tlink = link.replace(/#.*/, '');\n\n\tlet hash = location.hash;\n\n\t// Игнорируемые параметры при переходе между проектами\n\thash = hash.replace(/historyView=[^&]*/, '');\n\thash = hash.replace(/modelsKeys=[^&]*/, '');\n\thash = hash.replace(/competitorsIds=[^&]*/, '');\n\thash = hash.replace(/searchersKeys=[^&]*/, '');\n\thash = hash.replace(/regionIndex=[^&]*/, '');\n\thash = hash.replace(/regionsIndexes=[^&]*/, '');\n\thash = hash.replace(/folderId=[^&]*/, '');\n\thash = hash.replace(/groupId=[^&]*/, '');\n\thash = hash.replace(/tags=[^&]*/, '');\n\n\t// Сохранить сортировку по дате последней проверки\n\tif (window['mo']?.getHash && !window['mo'].getHash('dataSort').toString().includes('0000-00-00')) {\n\t\thash = hash.replace(/dataSort=[^&]*/, '');\n\t}\n\n\t// Игнорируемые параметры при переходе между проектами (для pinia)\n\thash = hash.replace(/%22historyView%22:[^,]*,/, '');\n\thash = hash.replace(/%22modelsKeys%22:\\[[^\\]]*\\],/, '');\n\thash = hash.replace(/%22competitorsIds%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22searchersKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22regionIndex%22:[^,]*,/, '');\n\thash = hash.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22folderId%22:[^,]*,/, '');\n\thash = hash.replace(/%22groupId%22:[^,]*,/, '');\n\thash = hash.replace(/%22tagsIds%22:\\[[^\\]]*],/, '');\n\n\t// Сохранить сортировку по дате последней проверки (для pinia)\n\tif (!/%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(hash)) {\n\t\thash = hash.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, '$1');\n\t}\n\n\treturn link + hash;\n};\n\n/**\n * Закрыть попап и выполнить переход на страницу проекта\n */\nexport const navigateToProject = (link: string, event?: PointerEvent) => {\n\tif (event && event.target instanceof HTMLElement) {\n\t\tTopPopupWorker.close(event.target.closest('.top-popup-wrapper')!);\n\t}\n\n\tconst linkWithHash = prepareProjectLink(link);\n\tlocation.href = linkWithHash;\n};\n\n/**\n * Сгенерировать ссылку на проект\n */\nexport const genProjectLink = (projectId: number) => {\n\tconst host = getBaseHost();\n\tconst pathname = location.pathname.split('/');\n\n\tlet prefix = 'project/dynamics/';\n\tlet suffix = '';\n\tif (pathname[1] == 'project') prefix = pathname[1] + '/' + pathname[2] + '/';\n\tif (pathname[2] == 'settings') suffix = location.hash;\n\tif (['watcher', 'indexing', 'sitemap', 'audit', 'direct', 'adwords'].includes(pathname[4])) suffix = pathname[4] + '/';\n\n\treturn 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n};\n\n/**\n * Вернуть базовый хост без поддомена\n */\nexport const getBaseHost = () => {\n\tif (window['page']?.subdomain) {\n\t\treturn window.location.host.replace(window['page']?.subdomain + '.', '');\n\t}\n\n\treturn window.location.host;\n};\n\n/**\n * Сгенерировать ссылку на сайт проекта\n */\nexport const genProjectExternalLink = (url: string) => {\n\tlet link = url.startsWith('http') ? url : 'http://' + url;\n\n\tlink = link.replace(/\"/g, '%22');\n\n\treturn link;\n};\n\n/**\n * Расширяет функционал аналогичной функции в Selector2\n *\n * Добавить фильтр поиска по полям `id`, `name`, `url` в параметры API.\n * Поиск выполняется по строке `search` и по строке с инвертированной раскладкой клавиатуры.\n *\n * @param api - api, которое используется в `TopProjectSelector`\n * @param search - введенная строка поиска\n *\n * @todo Объединить с apiSetSearchParamsFilter() из @/components/formsExt/selector2/utils.ts\n */\nexport const apiSetSearchParamsFilter = (api: NonNullable<Props['api']>, search: string) => {\n\tlet filters = api.params.filters ?? [];\n\n\t// удаление других фильтров по этому полю\n\tfilters = filters.filter((filter) => filter.name !== 'GEN_SEARCH_STRING()');\n\n\tconst searchInvert = invertKeyboardLayout(search);\n\tconst searchPrepared = search.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\tconst searchInvertPrepared = searchInvert.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\n\tif (search) {\n\t\tfilters.push(genFieldFilter('GEN_SEARCH_STRING()', 'REGEXP', [`(${searchPrepared}|${searchInvertPrepared})`]));\n\t}\n\n\tapi.changeParams({ filters });\n};\n\n/**\n * Создать API запрос на получение списка проектов\n *\n * Данные после загрузки преобразуются с помощью `prepareProjects()`\n *\n * @see prepareProjects\n */\nexport const genApiGetProjects = (client: Api.Client<Api.TV.Paths, true>) => {\n\tconst api = client.gen('/get/projects_2/projects/', ['id', 'user_id', 'name', 'url', 'on', 'right']);\n\n\tapi.changeParams({\n\t\tfilters: [\n\t\t\tgenFieldFilter('on', 'GREATER_THAN_EQUALS', [0]),\n\t\t],\n\t\torders: [\n\t\t\tgenFieldOrder('user_id', 'DESC', [Core.state.user.id]),\n\t\t\tgenFieldOrder('on', 'DESC'),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t});\n\n\tapi.options.onApiLoaded = (res, ctx, clientOnApiLoaded) => {\n\t\t// Флаг для сброса глобального состояния заголовков.\n\t\t// Срабатывает при добавлении проекта или полной перезагрузке списка\n\t\tconst needResetTitle = ctx.data.filters.length === 1 && ctx.data.offset === 0 || ctx.data.limit === 1000;\n\n\t\t// Флаг для использования локального состояния заголовков.\n\t\t// Срабатывает при поиске проектов (когда фильтров больше одного),\n\t\t// чтобы не сбрасывать уже вставленные заголовки.\n\t\tconst useLocalTitlesState = ctx.data.limit === 100 && ctx.data.filters.length > 1 ? true : undefined;\n\n\t\tres.result = prepareProjects(res.result as Item[], needResetTitle, useLocalTitlesState);\n\n\t\tclientOnApiLoaded?.(res, ctx);\n\t};\n\n\treturn api;\n};\n\n/**\n * Создать API запрос для добавления проекта\n */\nexport const genApiAddProject = (client: Api.Client<Api.TV.Paths, true>) => {\n\treturn client.gen('/add/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\nimport { computed } from 'vue';\nimport { TopPopup } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst submenuItems = [\n\t{\n\t\thref: `https://${host}/project/keywords/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_phrases,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n\t{\n\t\thref: `https://${host}/project/dynamics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_dynamics,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/snapshots/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_snapshots,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/competitors/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_competitors,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/ai-tracker/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_aiTracker,\n\t\ticon: '',\n\t\tright: '13',\n\t},\n\t{\n\t\thref: `https://${host}/project/analytics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_analytics,\n\t\ticon: '',\n\t\tright: '5',\n\t},\n\t{\n\t\thref: `https://${host}/project/broker/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_broker,\n\t\ticon: '',\n\t\tright: '6',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/sitemap/`,\n\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/audit/`,\n\t\ttitle: i18n.Common.Menu_audit,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/indexing/`,\n\t\ttitle: i18n.Audit.Indexing,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/watcher/`,\n\t\ttitle: i18n.Audit.Watcher,\n\t\ticon: '',\n\t\tright: '9',\n\t},\n\t{\n\t\thref: `https://${host}/project/settings/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_settings,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n];\n\nconst filteredSubmenuItems = computed(() => {\n\tif (!props.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn props.right[item.right] === '1';\n\t});\n});\n</script>\n\n<template>\n\t<TopPopup\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #opener>\n\t\t\t<TopButton\n\t\t\t\tclass=\"top-projectSelectorSubmenu_opener\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t></TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<li\n\t\t\t\tv-for=\"item in filteredSubmenuItems\"\n\t\t\t\tclass=\"top-projectSelectorSubmenu_item\"\n\t\t\t>\n\t\t\t\t<a\n\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:data-right=\"item.right\"\n\t\t\t\t></a>\n\t\t\t</li>\n\n\t\t\t<li class=\"top-projectSelectorSubmenu_item\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"url\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t></a>\n\t\t\t</li>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-projectSelectorSubmenu .top-popup {\n\tmin-width: 170px;\n}\n\n.top-projectSelectorSubmenu ul {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n.top-projectSelectorSubmenu_item {\n\twidth: 32%;\n}\n\n.top-projectSelectorSubmenu_item a {\n\tjustify-content: center;\n}\n\n.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t--top-icon-size: 24px;\n\t--top-icon-width: 32px;\n\n\theight: var(--top-icon-width);\n\tmargin: 0;\n}\n\n.top-projectSelectorSubmenu_item {\n\tflex-grow: 1;\n}\n</style>\n","import type { Item } from '@/components/formsExt/selector2/types';\nimport { ref, shallowRef } from 'vue';\nimport Core from '@/core/core/core';\n\nconst CACHE_KEY = 'ui_project_selector_total';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n *\n * @todo Добавить поддержку моков\n */\nexport const projectsCache = shallowRef<Item[]>();\nexport const resetStateSignal = ref(0);\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\nexport const setCacheTotal = (projectsTotal: number) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY + ':' + Core.state.user.id,\n\t\tJSON.stringify({ projectsTotal, expiresAt: Date.now() + CACHE_TTL }),\n\t);\n};\n\nexport const getCacheTotal = () => {\n\tconst raw = localStorage.getItem(CACHE_KEY + ':' + Core.state.user.id);\n\tif (!raw) return;\n\n\tconst { projectsTotal, expiresAt } = JSON.parse(raw) as Record<string, number>;\n\tif (Date.now() > expiresAt) {\n\t\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.user.id);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\nexport const clearCache = (resetState: boolean = true) => {\n\tprojectsCache.value = undefined;\n\tprojectsRequest.value = null;\n\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.user.id);\n\n\tif (resetState) resetStateSignal.value++;\n};\n","<script setup lang=\"ts\">\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport { validUrl } from '@/core/utils/check';\nimport { ellipsis } from '@/core/utils/string';\nimport { useI18n } from '@/core/plugins/i18n';\nimport Core from '@/core/core/core';\nimport Submenu from './submenu/submenu.vue';\nimport { apiSetSearchParamsFilter, genApiAddProject, genApiGetProjects, genProjectExternalLink, genProjectLink, navigateToProject } from './utils';\nimport { clearCache, getCacheTotal, projectsCache, projectsRequest, resetStateSignal, setCacheTotal } from './cache';\n\nconst i18n = useI18n();\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddLinksToProjects: true,\n});\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({ default: { id: null, name: '' } });\n\nconst apiGet = genApiGetProjects(props.client);\n\nconst apiGetWithLimit = genApiGetProjects(props.client);\napiGetWithLimit.changeParams({\n\tlimit: PROJECTS_TOTAL_THRESHOLD,\n});\n\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | null | undefined>(getCacheTotal());\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\nconst placeholder = computed(() => {\n\treturn props.placeholder ?? i18n.Projects.Select_project;\n});\n\nconst itemsForSelector = computed(() => {\n\tif (!projectsCache.value || !props.excludeProjectId) return projectsCache.value;\n\n\treturn projectsCache.value.filter((project) => project.id !== props.excludeProjectId);\n});\n\n/**\n * Источник данных для списка проектов:\n * - `static` — список проектов передан через props\n * - `api` — список загружается через HTTP (API)\n *\n * Выбор режима: `static`, если `projectsTotal` < `PROJECTS_TOTAL_THRESHOLD`, иначе `api`\n */\nconst dataSource = computed(() => {\n\tif (!projectsTotal.value && projectsTotal.value !== 0) return;\n\n\treturn projectsTotal.value < PROJECTS_TOTAL_THRESHOLD ? 'static' : 'api';\n});\n\nwatch(resetStateSignal, () => {\n\tresetState();\n});\n\nwatch(model, () => {\n\tif (!model.value.id || !props.addLinksToProjects) return;\n\n\tnavigateToProject(genProjectLink(model.value.id));\n});\n\nconst loadProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tprojectsRequest.value = apiGetWithLimit.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tif (res.errors) {\n\t\tprojectsRequest.value = null;\n\n\t\treturn;\n\t}\n\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (projectsTotal.value) return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsTotal.value = res.total;\n\tif (dataSource.value === 'static' && !projectsCache.value) projectsCache.value = res.result as Item[];\n\n\tif (projectsTotal.value) setCacheTotal(projectsTotal.value);\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (project: Item) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: project.name,\n\t\tname: project.name,\n\t}).call();\n\tif (res.errors) return;\n\n\tif (projectsCache.value && dataSource.value === 'static') {\n\t\tconst newProject = {\n\t\t\tid: Number(res.result),\n\t\t\tuser_id: Core.state.user.id,\n\t\t\tname: project.name,\n\t\t\turl: project.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\n\t\t\tlistItemProps: {\n\t\t\t\tattrs: { title: project.name },\n\t\t\t},\n\t\t};\n\n\t\tconst firstManualUpdateProjectIndex = projectsCache.value.findIndex((project) => project.on === 0);\n\t\tprojectsCache.value = [\n\t\t\t...projectsCache.value.slice(0, firstManualUpdateProjectIndex),\n\t\t\tnewProject,\n\t\t\t...projectsCache.value.slice(firstManualUpdateProjectIndex),\n\t\t];\n\n\t\tif (projectsTotal.value) {\n\t\t\tprojectsTotal.value += 1;\n\t\t\tsetCacheTotal(projectsTotal.value);\n\t\t}\n\t}\n\n\tif (dataSource.value === 'api') clearCache();\n};\n\n/**\n * Сброс локального состояния и кеша api\n */\nconst resetState = () => {\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n * Только при `dataSource` = `static`\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (projectsCache.value || dataSource.value === 'api') return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsCache.value = res.result as Item[];\n};\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\tv-model=\"model\"\n\t\t:items=\"itemsForSelector\"\n\t\t:title=\"$i18n.Projects.Search_projects\"\n\t\t:modificator\n\t\t:searchFields=\"['id', 'name', 'url']\"\n\t\t:placeholder\n\t\thasCloserBtn\n\t\t:api=\"dataSource === 'api' ? apiGet : undefined\"\n\t\t:apiSetSearchParams=\"dataSource === 'api' ? (...args) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps\n\t\t:openerShortcut\n\t\t@appendItem=\"addProject\"\n\t\t@open=\"onOpen\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-projectSelector_item\">\n\t\t\t\t<div class=\"top-projectSelector_itemText\">\n\t\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\t\t\t\t\t\t<span class=\"top-comment\">\n\t\t\t\t\t\t\tid {{ item.id }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{{ item.name }}\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"addLinksToProjects\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t\t:href=\"genProjectLink(item.id)\"\n\t\t\t\t\t\t@click.prevent.stop=\"navigateToProject(genProjectLink(item.id!), $event)\"\n\t\t\t\t\t></a>\n\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemExtLink\"\n\t\t\t\t\t\t:href=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click.stop\n\t\t\t\t\t></TopButton>\n\n\t\t\t\t\t<Submenu\n\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t:right=\"item.right ?? undefined\"\n\t\t\t\t\t\t:url=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\n}\n\n.top-projectSelector_item {\n\t--top-icon-size: 14px;\n\n\tdisplay: flex;\n\tflex-grow: 1;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemLink {\n\tposition: absolute;\n\tinset: 0;\n}\n\n.top-projectSelector_itemText {\n\tflex-grow: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemExtLink,\n.top-projectSelector_item [class*=\"opener\"] {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-popup_listItem:hover .top-projectSelector_item > *,\n.top-popup_listItem.top-active .top-projectSelector_item > * {\n\topacity: 1;\n}\n\n@media screen and (min-width: 900px) {\n\t/* Ограничиваем стандартную высоту popup */\n\t.top-projectSelector.p3 div.top-popup {\n\t\tmax-height: min(calc(var(--top-popup-bottom) - 16px), 800px);\n\t}\n}\n\n@media screen and (max-width: 900px) {\n\t.top-projectSelector_item [class*=\"opener\"] {\n\t\topacity: 1;\n\t}\n}\n</style>\n","import type { Props as TagSelectorOpenerProps } from '../popupOpener/types';\nimport type { Tag, TagIdExclude } from '../types';\n\n/**\n * Полуичить значение исключения тега tagId\n */\nexport const genTagIdExcluded = (tagId: Tag['id']): TagIdExclude => {\n\treturn '-' + tagId as TagIdExclude;\n};\n\n/**\n * Вернуть чистый tagId без exclude флага\n */\nexport const genTagIdClear = (tagId: Tag['id'] | TagIdExclude) => {\n\tif (tagId[0] === '-') return tagId.substring(1) as Tag['id'];\n\n\treturn tagId as Tag['id'];\n};\n\n/**\n * Получить инфомрацию о теге по его id\n */\nexport const getTagById = (tagId: Tag['id'] | TagIdExclude, tags: TagSelectorOpenerProps['tags']) => {\n\ttagId = genTagIdClear(tagId);\n\n\tconst tag = tags.find(tag => tag.id === tagId);\n\tif (!tag) return;\n\n\treturn tag;\n};\n","import { isRef, type Ref, ref, unref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport TopPopupWorker from '@/components/popup/lib/worker';\nimport type { OpenerProps as PopupOpenerProps } from '@/components/popup/popup/opener/types';\nimport type { Props as TagSelectorOpenerProps, TagSelectorTarget } from '../popupOpener/types';\nimport type { Props as TagIconProps } from '../tagIcon/types';\nimport { genTagIdClear, getTagById } from './utils';\n\n/**\n * Сгенерировать элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelectorPopupOpener для работы вне vue\n *\n * Требует монтирования компонента TopTagSelector\n */\nexport const genElPopupOpener = (\n\tprops: TagSelectorOpenerProps & { modelValue: TagSelectorOpenerProps['modelValue'] | Ref<TagSelectorOpenerProps['modelValue']> },\n\tpropsPopup?: Partial<PopupOpenerProps>,\n\thtmlSetterSeveral?: string,\n): HTMLElement => {\n\tif (!propsPopup) propsPopup = { id: props.id };\n\n\t// Значения по умолчанию см. в: `@/components/popup/popup/opener/opener.vue`\n\tpropsPopup.id = props.id;\n\tpropsPopup.pos ??= '3';\n\tpropsPopup.notch ??= true;\n\tpropsPopup.posBy ??= 'fixed';\n\n\tconst el = TopPopupWorker.genElPopupOpener('div', propsPopup as PopupOpenerProps);\n\n\tel.classList.add('top-tagSelector');\n\tif (props.useTopButton) el.classList.add('top-tagSelector-useTopButton', 'top-button', 'top-color_theme', 'top-as-selector');\n\tif (!props.useTopButton) el.classList.add('top-tagSelector-custom');\n\tif (props.mode === 'filter') el.classList.add('top-tagSelector-filter');\n\tif (props.mode === 'setter' && !props.filters) el.classList.add('top-tagSelector-setter_single');\n\tif (props.mode === 'setter' && props.filters) el.classList.add('top-tagSelector-setter_several');\n\n\t// прокcи клик: lazy connect\n\tel.onclick = (e) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tel.onclick = null;\n\n\t\tconst model = ref(props.modelValue);\n\n\t\tconst target: TagSelectorTarget = {\n\t\t\tmodel,\n\t\t\tmode: props.mode,\n\t\t\ttargetId: props.targetId,\n\t\t\tfilters: props.filters,\n\t\t\tpayload: props.payload,\n\t\t};\n\n\t\tstorage(el, 'topTagSelectorTarget', target);\n\n\t\tdelete el.dataset.topPopupDisabled;\n\n\t\tif (!isRef(props.modelValue)) {\n\t\t\twatch(model, () => {\n\t\t\t\tprops.modelValue = model.value;\n\n\t\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t\t});\n\t\t}\n\n\t\t// выполнение клика\n\t\tel.click();\n\t};\n\n\tif (isRef(props.modelValue)) {\n\t\twatch(props.modelValue, () => elPopupOpenerRender(el, props, htmlSetterSeveral));\n\t} else {\n\t\tstorage(el, 'topTagSelectorRender', (modelValue: TagSelectorOpenerProps['modelValue']) => {\n\t\t\tprops.modelValue = modelValue;\n\n\t\t\tconst target = storage(el, 'topTagSelectorTarget');\n\t\t\tif (target) target.model.value = modelValue;\n\n\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t});\n\t}\n\n\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\n\treturn el;\n};\n\n/**\n * Вызвать перерисовку элемента, который был создан через genElPopupOpener()\n *\n * Работет только для элементов не с реактивным modelValue\n */\nexport const renderElPopupOpener = (el: HTMLElement, modelValue: TagSelectorOpenerProps['modelValue']) => {\n\tstorage(el, 'topTagSelectorRender')?.(modelValue);\n};\n\n/**\n * Отрисовать TopTagSelecorPopupOpener\n */\nconst elPopupOpenerRender = (el, props: TagSelectorOpenerProps, htmlSetterSeveral?: string) => {\n\tconst tagsIds = unref(props.modelValue);\n\n\tel.classList.toggle('top-tagSelector-selectedOne', !tagsIds.length || tagsIds.length === 1);\n\tel.classList.toggle('top-tagSelector-toTwoLine', tagsIds.length > 5);\n\n\tif (props.mode === 'setter' && props.filters) {\n\t\tel.innerHTML = `<div>${htmlSetterSeveral}</div>`;\n\n\t\treturn;\n\t}\n\n\tel.innerHTML = '';\n\n\tif (!tagsIds.length && props.mode === 'filter') {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: 'all',\n\t\t\tcolorId: '',\n\t\t\tname: useI18n().Common?.All_tags ?? '',\n\t\t\tstate: '',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t}\n\n\ttagsIds.forEach(tagId => {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: genTagIdClear(tagId),\n\t\t\tcolorId: getTagById(tagId, props.tags)?.color_id ?? '',\n\t\t\tname: getTagById(tagId, props.tags)?.name ?? '',\n\t\t\tstate: genTagIdClear(tagId) === tagId ? 'selected' : 'excluded',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t});\n};\n\n/**\n * Сгенерировтаь элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelecorTagIcon для работы вне vue\n */\nconst genElTagIcon = (props: TagIconProps) => {\n\tconst el = document.createElement('div');\n\n\tel.classList.add('top-tagSelector_tagIcon');\n\tel.classList.toggle('top-tagSelector-active', !!props.state);\n\tel.classList.toggle('top-tagSelector-excluded', props.state === 'excluded');\n\n\tel.dataset.tag_id = props.id;\n\tel.dataset.tag_color_id = props.colorId;\n\tel.title = props.name;\n\n\treturn el;\n};\n","import type { Tag } from './types';\n\nexport default [\n\t{\n\t\tid: '1',\n\t\tname: 'Without Tag',\n\t\tcolor_id: '1',\n\t},\n\t{\n\t\tid: '2',\n\t\tname: 'Red',\n\t\tcolor_id: '2',\n\t},\n\t{\n\t\tid: '3',\n\t\tname: 'Orange',\n\t\tcolor_id: '3',\n\t},\n\t{\n\t\tid: '4',\n\t\tname: 'Yellow',\n\t\tcolor_id: '4',\n\t},\n\t{\n\t\tid: '5',\n\t\tname: 'Blue',\n\t\tcolor_id: '5',\n\t},\n\t{\n\t\tid: '6',\n\t\tname: 'Purple',\n\t\tcolor_id: '6',\n\t},\n\t{\n\t\tid: '7',\n\t\tname: 'Green',\n\t\tcolor_id: '7',\n\t},\n\t{\n\t\tid: '8',\n\t\tname: 'Magenta',\n\t\tcolor_id: '8',\n\t},\n\t{\n\t\tid: '9',\n\t\tname: 'Dark blue',\n\t\tcolor_id: '9',\n\t},\n\t{\n\t\tid: '10',\n\t\tname: 'Turquoise',\n\t\tcolor_id: '10',\n\t},\n] as Tag[];\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\ndefineProps<Props>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagIcon': true,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded',\n\t\t}\"\n\t\t:data-tag_id=\"id\"\n\t\t:data-tag_color_id=\"colorId\"\n\t\t:title=\"name\"\n\t></div>\n</template>\n\n<style>\n[data-tag_id] { display: inline-flex; gap: var(--top-gap-2); align-items: center; }\n\n[data-tag_id=\"\"] { border-color: #bdc3c7 !important; color: #55555F !important; }\n[data-tag_color_id=\"1\"] { border-color: var(--color-tag-1) !important; color: #55555F !important; }\n[data-tag_color_id=\"2\"] { border-color: var(--color-tag-2) !important; color: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"] { border-color: var(--color-tag-3) !important; color: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"] { border-color: var(--color-tag-4) !important; color: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"] { border-color: var(--color-tag-5) !important; color: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"] { border-color: var(--color-tag-6) !important; color: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"] { border-color: var(--color-tag-7) !important; color: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"] { border-color: var(--color-tag-8) !important; color: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"] { border-color: var(--color-tag-9) !important; color: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"] { border-color: var(--color-tag-10) !important; color: var(--color-tag-10) !important; }\n\n[data-tag_id=\"\"].top-tagSelector-active { background: #bdc3c7 !important; }\n[data-tag_color_id=\"1\"].top-tagSelector-active { background: var(--color-tag-1) !important; }\n[data-tag_color_id=\"2\"].top-tagSelector-active { background: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"].top-tagSelector-active { background: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"].top-tagSelector-active { background: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"].top-tagSelector-active { background: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"].top-tagSelector-active { background: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"].top-tagSelector-active { background: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"].top-tagSelector-active { background: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"].top-tagSelector-active { background: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"].top-tagSelector-active { background: var(--color-tag-10) !important; }\n\n[data-tag_id=\"all\"] {\n\tborder-color: transparent !important; background: none !important;\n}\n\n[data-tag_id=\"all\"]:before {\n\tcontent: \"\";\n\tcolor: var(--color-tag-all) !important;\n\tfont-size: 26px;\n\tmin-width: calc(100% + 4px);\n\theight: calc(100% + 4px);\n\tmargin-top: -18px;\n\tmargin-left: -8px;\n}\n\n/* в кнопке выбора тэгов и в popup */\n.top-tagSelector-useTopButton [data-tag_id],\n.top-tagSelector_popup [data-tag_id] {\n\t--top-tag-selector-size: 10px;\n\n\tbox-sizing: content-box;\n\tborder-radius: 100%; border: 2px solid var(--color-layout-front-1); background: var(--color-layout-front-1);\n\twidth: var(--top-tag-selector-size);\n\theight: var(--top-tag-selector-size);\n\tfont-size: calc(var(--top-tag-selector-size) + 4px);\n\t/*font-family: inherit !important;*/\n}\n\n/* исключение тегов */\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],\n[data-tag_id].top-tagSelector-excluded { position: relative; }\n\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,\n[data-tag_id].top-tagSelector-excluded:before {\n\tcontent: \"\";\n\twidth: calc(var(--top-tag-selector-size) * 2); height: 1px; background: inherit;\n\ttransform: rotate(-45deg); filter: brightness(80%);\n\tdisplay: block;\n\tposition: absolute; top: calc(var(--top-tag-selector-size) / 2); left: calc(0px - var(--top-tag-selector-size) / 2);\n}\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=\"all\"]):not(.top-tagSelector-active):before { background: #AAA; }\n[data-tag_id].top-tagSelector-excluded:after,\n[data-tag_id].top-tagSelector-excluded ~ .top-tagSelector_tagListItemName { text-decoration: line-through; }\n\n/* popup */\n.top-popup_listItem.top-tagSelector-active { background: var(--top-popup-background-color-active) !important; }\n\n.top-popup_listItem:hover [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-hover); }\n.top-popup_listItem.top-tagSelector-active [data-tag_id=\"all\"]:before,\n.top-popup_listItem.top-active [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-active); }\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\nimport TopPopupListItem from '@/components/popup/popup/listItem.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst name = defineModel<Props['name']>('name', {\n\trequired: true,\n});\n\nconst elName = ref<HTMLElement | null>(null);\n\n/**\n * @todo Удалить через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n */\nconst firefoxProps = computed(() => {\n\tif (navigator.userAgent.indexOf('Firefox') != -1) {\n\n\t\treturn {\n\t\t\tcontenteditable: inEdit.value,\n\t\t\tonpaste: (event: Event) => event.preventDefault(),\n\t\t};\n\t}\n\n\treturn {};\n});\n\n/**\n * Включен режим редактирвоания\n */\nconst inEdit = ref(false);\n\n/**\n * Включить режим редактирование\n */\nconst turnToEdit = async () => {\n\tinEdit.value = true;\n\n\tawait nextTick();\n\n\telName.value?.focus();\n};\n\n/**\n * Применить редактирование\n */\nconst editCommit = () => {\n\tconst name = elName.value?.innerText;\n\tif (!name) return editCancel();\n\n\tif (elName.value) elName.value.innerText = name;\n\n\tinEdit.value = false;\n\n\temit('update:name', name);\n};\n\n/**\n * Отменить редактирование\n */\nconst editCancel = async () => {\n\tif (elName.value) elName.value.innerText = props.name;\n\n\tinEdit.value = false;\n};\n\n/**\n * Применить выбор\n */\nconst changeSelect = (e: MouseEvent) => {\n\t// в режиме редактирования выбор не применяется\n\tif (inEdit.value) return;\n\n\t// тег запрещено выбирать\n\tif (props.disabled) return;\n\n\tlet toState: Props['state'] = 'selected';\n\n\tif (props.canExclude) {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\ttoState = 'excluded';\n\t\t}\n\t}\n\n\tif (props.state == toState) {\n\t\ttoState = '';\n\t}\n\n\tif (toState === '') emit('unselect');\n\tif (toState === 'selected') emit('select');\n\tif (toState === 'excluded') emit('exclude');\n};\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagListItem': true,\n\t\t\t'top-tagSelector_tagListItem-inEdit': inEdit,\n\t\t\t'top-tagSelector_tagListItem-disabled': disabled,\n\t\t\t'top-tagSelector_tagListItem-canExclude': canExclude,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded'\n\t\t}\"\n\t\t@click.stop=\"changeSelect\"\n\t>\n\t\t<TopTagIcon\n\t\t\t:id\n\t\t\t:name\n\t\t\t:colorId\n\t\t\t:state\n\t\t/>\n\n\t\t<span\n\t\t\tref=\"elName\"\n\t\t\tclass=\"top-tagSelector_tagListItemName\"\n\t\t\t:contenteditable=\"inEdit ? 'plaintext-only' : false\"\n\t\t\t:=\"firefoxProps\"\n\t\t\t@keydown.enter.stop=\"editCommit\"\n\t\t\t@keydown.esc.stop=\"editCancel\"\n\t\t>\n\t\t\t{{ name }}\n\t\t</span>\n\n\t\t<template v-if=\"editable\">\n\t\t\t<span\n\t\t\t\tv-if=\"!inEdit\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click=\"turnToEdit\"\n\t\t\t></span>\n\n\t\t\t<span\n\t\t\t\tv-else\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click.stop=\"editCommit\"\n\t\t\t></span>\n\t\t</template>\n\t</TopPopupListItem>\n</template>\n\n<style>\n.top-tagSelector_tagListItem.top-popup_listItem {\n\tpadding-top: var(--top-padding-2) !important;\n\tpadding-bottom: var(--top-padding-2) !important;\n\tgap: 10px;\n}\n\n.top-tagSelector_tagListItemName {\n\tborder-radius: var(--top-radius-1);\n\twidth: 120px;\n\tpadding: 4px 2px;\n\tmargin: -4px -2px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tflex-grow: 1;\n}\n\n/* редактирование */\n.top-tagSelector_edit {\n\t--top-icon-size: 18px;\n\t--top-icon-color: var(--color-text-3);\n\n\twidth: 20px;\n\tflex-grow: 0;\n}\n\n.top-tagSelector_edit:before {\n\tline-height: 0;\n}\n\n.top-tagSelector_edit { opacity: 0; }\n.top-tagSelector_edit:hover {\n\t--top-icon-color: var(--color-text-primary);\n}\n\n.top-tagSelector_tagListItem:hover .top-tagSelector_edit,\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit {\n\tcursor: pointer;\n\topacity: 1;\n}\n\n.top-tagSelector_tagListItem-inEdit {\n\tbackground: var(--color-layout-front-3) !important;\n\toutline: 1px dashed var(--color-line-2);\n\toutline-offset: -1px;\n}\n\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName {\n\tcursor: text;\n\tbackground: var(--color-layout-front-1);\n}\n\n/* disabled */\n.top-tagSelector_tagListItem-disabled {\n\tcursor: not-allowed !important;\n\topacity: 0.85;\n}\n.top-tagSelector_tagListItem-disabled:hover {\n\tbackground: inherit;\n}\n.top-tagSelector_tagListItem-disabled [data-tag_id] {\n\topacity: 0.6;\n}\n</style>\n","top-forms-focusable top-size_s top-button-withoutText top-tagSelector-useTopButton\n\n<script setup lang=\"ts\">\nimport type { Props, TagSelectorTarget } from './types';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport { genTagIdClear, getTagById } from '../utils/utils';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<Props>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst component = props.useTopButton ? TopButton : 'div';\nconst componentSlotName = props.useTopButton ? 'html' : 'default';\n\nconst topTagSelectorTarget: TagSelectorTarget = {\n\tmodel,\n\tmode: props.mode,\n\ttargetId: props.targetId,\n\tfilters: props.filters,\n\tpayload: props.payload,\n};\n</script>\n\n<template>\n\t<TopPopupOpener :id>\n\t\t<component\n\t\t\t:is=\"component\"\n\t\t\t:class=\"{\n\t\t\t\t'top-tagSelector': true,\n\t\t\t\t'top-tagSelector-useTopButton': props.useTopButton,\n\t\t\t\t'top-tagSelector-custom': !props.useTopButton,\n\t\t\t\t'top-as-selector': props.useTopButton,\n\t\t\t\t'top-tagSelector-filter': props.mode === 'filter',\n\t\t\t\t'top-tagSelector-setter_single': props.mode === 'setter' && !filters,\n\t\t\t\t'top-tagSelector-setter_several': props.mode === 'setter' && filters,\n\t\t\t\t'top-tagSelector-selectedOne': !model.length || model.length === 1,\n\t\t\t\t'top-tagSelector-toTwoLine': model.length > 5,\n\t\t\t}\"\n\t\t\tcolor=\"theme\"\n\t\t\t:styling\n\t\t\tv-top-data:topTagSelectorTarget=\"topTagSelectorTarget\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<template #[componentSlotName]>\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-if=\"!model.length && mode === 'filter'\"\n\t\t\t\t\tid=\"all\"\n\t\t\t\t\tcolorId=\"\"\n\t\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t\tstate=\"\"\n\t\t\t\t/>\n\n\t\t\t\t<!-- Массовое редактирование -->\n\t\t\t\t<div v-if=\"mode === 'setter' && filters\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Список тегов -->\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-else\n\t\t\t\t\tv-for=\"tagId in model\"\n\t\t\t\t\t:id=\"genTagIdClear(tagId)\"\n\t\t\t\t\t:colorId=\"getTagById(tagId, tags)?.color_id ?? ''\"\n\t\t\t\t\t:name=\"getTagById(tagId, tags)?.name ?? ''\"\n\t\t\t\t\t:state=\"genTagIdClear(tagId) === tagId ? 'selected' : 'excluded'\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</component>\n\t</TopPopupOpener>\n</template>\n\n<style>\n.top-tagSelector {\n\tcursor: pointer;\n\tmin-width: 0;\n\twhite-space: nowrap;\n\tjustify-content: left;\n}\n\n.top-tagSelector-useTopButton {\n\twidth: 118px;\n\tgap: var(--top-gap-1);\n\tvertical-align: middle;\n}\n\n.top-tagSelector.top-button.top-as-selector {\n\twidth: calc(118px + 8px);\n}\n\n/* все теги в фильтре */\n.top-tagSelector-useTopButton [data-tag_id=\"all\"]:before {\n\tmargin-right: 6px;\n}\n\n/* фильтр по одному тегу */\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id]:after {\n\tcontent: attr(title);\n\tmargin-left: 20px;\n\tmin-width: 74px;\n\ttext-align: left;\n\tline-height: 1.2;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id=\"all\"]:after {\n\tmargin-left: 0;\n}\n\n/* фильтр по многим тегам */\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine {\n\tflex-wrap: wrap;\n\talign-content: center;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id] {\n\t--top-tag-selector-size: 8px;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]:nth-child(5) {\n\tmargin-right: 4px;\n}\n\n/* установка тегов */\n.top-tagSelector-useTopButton.top-tagSelector-setter_several,\n.top-tagSelector-useTopButton.top-tagSelector-setter_several.top-as-selector{\n\twidth: auto;\n}\n\n.top-tagSelector-custom {\n\tposition: relative;\n\tdisplay: flex !important; flex-direction: column; flex-wrap: wrap; align-items: stretch !important;\n}\n\n.top-tagSelector-custom [data-tag_id] {\n\twidth: auto; min-height: 20%; min-width: 50%;\n\tflex: 1 1 auto;\n}\n</style>\n","<script setup lang=\"ts\">\n/* global $ */\n\nimport { computed, reactive, ref, shallowRef, watch } from 'vue';\n\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport { debounce } from '@/core/utils/lodash';\n\nimport type { Option } from '@/components/forms/select/types';\nimport TopSelect from '@/components/forms/select/select.vue';\n\nimport TopButton from '@/components/forms/button/button.vue';\n\nimport type { PopupEvent } from '@/components/popup/popup/types';\nimport TopPopup from '../../popup/popup/popup.vue';\nimport TopPopupListItem from '../../popup/popup/listItem.vue';\n\nimport type { Emits, FiltersAction, Props, Tag } from './types';\nimport tagsDefaults from './tagsDefaults';\nimport { genTagIdExcluded } from './utils/utils';\n\nimport type { Props as TagListItemProps } from './popupListItem/types';\nimport TopTagListItem from './popupListItem/tagPopupListItem.vue';\n\nimport type { TagSelectorTarget } from './popupOpener/types';\nimport TopTagSelectorPopupOpener from './popupOpener/popupOpener.vue';\n\nconst i18n = useI18n();\n\nconst props = withDefaults(defineProps<Props>(), {\n\ttagsMax: 10,\n\trequiredForSetter: true,\n\temitDelay: 500,\n\tuseTopButton: true,\n});\n\n/**\n * Выбранные теги кнопки в этом компоненте\n *\n * Редактирвоание ведется только через `editTarget.model`\n */\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Список тегов\n */\nconst tags = defineModel<Tag[]>('tags', {\n\tdefault: reactive(tagsDefaults),\n});\n\nconst emit = defineEmits<Emits>();\n\nconst emitDebounce: typeof emit = debounce((name, e) => {\n\temit(name, e);\n}, props.emitDelay);\n\n// требуется сразу указать один тег\nif (props.singleMode && !model.value.length) {\n\tmodel.value = [tags.value[0].id];\n}\n\nconst id = props.id ?? 'top-popup-id-' + Math.random() + '';\n\nconst filtersAction = ref<FiltersAction>('add');\n\n/**\n * Сгенерировать опции для выбора дейсвтия массого редактирования\n */\nconst genFiltersActionOptions = () => {\n\tconst tagsText = ' ' + i18n.Common.Tags?.toLowerCase();\n\n\tconst res = new Map<FiltersAction, Option>();\n\tres.set('add', { value: 'add', title: i18n.Common.Add + tagsText });\n\tres.set('replace', { value: 'replace', title: i18n.Common.Replace + tagsText });\n\tres.set('delete', { value: 'delete', title: i18n.Common.Delete + tagsText });\n\n\treturn res;\n};\n\n/**\n * Целевой объект редактирования тегов\n *\n * Определяется кнопкой, которая открыла popup выбора тегов\n */\nconst target = shallowRef<TagSelectorTarget>({\n\tmodel,\n\tmode: 'filter',\n\ttargetId: undefined,\n\tfilters: undefined,\n\tpayload: undefined,\n});\n\nwatch(model, () => {\n\temitDebounce('selector', model.value);\n});\n\n/**\n * Можно ли выбрать еще теги\n */\nconst disabled = computed(() => {\n\tif (target.value.mode !== 'setter') return;\n\n\tif (!props.maxTagsForSetter) return;\n\n\t// массовая смена тегов, количество тегов в результате узнать невозможно\n\tif (target.value.filters) return;\n\n\treturn target.value.model.value.length >= props.maxTagsForSetter;\n});\n\nconst genTargetTagState = (tagId: Tag['id'] | 'all'): TagListItemProps['state'] => {\n\tif (tagId !== 'all') {\n\t\tif (target.value.model.value.includes(tagId)) return 'selected';\n\n\t\tif (target.value.model.value.includes(genTagIdExcluded(tagId))) return 'excluded';\n\t}\n\n\t// Все теги, ни один из тегов не выбран\n\tif (tagId === 'all' && !target.value.model.value.length) return 'selected';\n\n\treturn '';\n};\n\nconst updateTargetModel = (tagId: Tag['id'], action: 'unselect' | 'select' | 'exclude') => {\n\tconst tagIdExcluded = genTagIdExcluded(tagId);\n\n\tlet tagsIds = target.value.model.value.filter(modelTagId => modelTagId !== tagId && modelTagId !== tagIdExcluded);\n\n\tif (action === 'select') tagsIds.push(tagId);\n\tif (action === 'exclude') tagsIds.push(tagIdExcluded);\n\n\t// режим редактирвоания тегов одного объекта с требованием указать хотя бы один тег\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined && props.requiredForSetter) {\n\t\t// нельзя снимать выделение со всех тегов\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds.push('1');\n\t\t}\n\n\t\t// при первом выборе сразу снять тег \"Без тега\"\n\t\tif (tagsIds.length === 2 && target.value.model.value.length === 1 && target.value.model.value[0] === '1') {\n\t\t\ttagsIds = tagsIds.filter((tagId) => tagId !== '1');\n\t\t}\n\t}\n\n\t// режим выбора одного тега\n\tif (props.singleMode && !target.value.filters) {\n\t\t// нужно указать хотя бы один тег\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds = target.value.model.value;\n\t\t}\n\n\t\tif (tagsIds.length > 1) {\n\t\t\ttagsIds = [tagsIds[tagsIds.length - 1]];\n\t\t}\n\t}\n\n\t// всегда выводить теги в порядке, указанном в настройках tags\n\ttagsIds.sort((a, b) => {\n\t\tif (!props.tags) return 0;\n\n\t\tconst aIndex = props.tags.findIndex((tag) => tag.id === a);\n\t\tconst bIndex = props.tags.findIndex((tag) => tag.id === b);\n\n\t\treturn aIndex - bIndex;\n\t});\n\n\ttarget.value.model.value = tagsIds;\n\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined) {\n\t\temitDebounce('setter', {\n\t\t\ttagsIds: tagsIds as Tag['id'][],\n\t\t\ttargetId: target.value.targetId,\n\t\t\tpayload: target.value.payload,\n\t\t});\n\t}\n};\n\nconst classString = computed(() => {\n\tlet res = 'top-tagSelector_popup';\n\n\tif (target.value.mode === 'filter') res += ' top-tagSelector_popup-filter';\n\tif (target.value.mode === 'setter') res += ' top-tagSelector_popup-setter';\n\n\treturn res;\n});\n\n/**\n * Добавить тег\n */\nconst addTag = () => {\n\tconst tagName = prompt('', 'New tag');\n\tif (!tagName || tagName === 'New tag') return;\n\n\tconst tagId = tags.value.length + 1;\n\n\ttags.value.push({\n\t\tid: String(tagId) as Tag['id'],\n\t\tname: tagName,\n\t\tcolor_id: String((tagId - 1) % 10 + 1) as Tag['color_id'],\n\t});\n\n\temit('tagsChanged', tags.value);\n};\n\nconst onOpen = (popupEvent: PopupEvent) => {\n\t// popup открыт другой кнопкой c другим modelValue, для редактирвоания объектов\n\ttarget.value = storage(popupEvent.elPopupOpener, 'topTagSelectorTarget');\n\tif (!target.value) throw new Error('Open popup TopTagSelector required v-data:topTagSelectorTarget');\n\n\t// при начале массовой установки тегов сбросить состояние формы\n\tif (target.value.filters) {\n\t\tfiltersAction.value = 'add';\n\t\ttarget.value.model.value = [];\n\t}\n\n\tif (!Core.$?.ui['sortable']) {\n\t\tconsole.info('Для работы сортировки требуется глобальная загрузка jQuery UI Sortable');\n\n\t\treturn;\n\t}\n\n\tif (!Core.state.isMobile && !Core.state.isMobileUA && tags.value) {\n\t\t$(popupEvent.elPopup).sortable({\n\t\t\titems: 'li:has([data-tag_id]:not([data-tag_id=\"all\"]))',\n\n\t\t\t/**\n\t\t\t * @todo Удалить `[contenteditable=\"true\"]` через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n\t\t\t */\n\t\t\tcancel: '[contenteditable=\"plaintext-only\"], [contenteditable=\"true\"]',\n\n\t\t\tdistance: 10,\n\t\t\tstop: function (_e, ui) {\n\t\t\t\tif (!tags.value) return;\n\n\t\t\t\tconst $tags = $(ui.item).parent().find('[data-tag_id]');\n\n\t\t\t\tconst tagsSorted: Tag['id'][] = [];\n\t\t\t\t$tags.each((_index, elTag) => {\n\t\t\t\t\tif (!tags.value) return;\n\n\t\t\t\t\tconst tagId = $(elTag).attr('data-tag_id') as Tag['id'];\n\t\t\t\t\ttagsSorted.push(tagId);\n\t\t\t\t});\n\n\t\t\t\ttags.value.sort((tagIdA, tagIdB) => {\n\t\t\t\t\tconst a = tagsSorted.findIndex(tagSorted => tagSorted === tagIdA.id);\n\t\t\t\t\tconst b = tagsSorted.findIndex(tagSorted => tagSorted === tagIdB.id);\n\n\t\t\t\t\treturn a - b;\n\t\t\t\t});\n\n\t\t\t\temitDebounce('tagsChanged', tags.value);\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onClose = (popupEvent: PopupEvent) => {\n\tif (!Core.$?.ui['sortable']) return;\n\n\tif ($(popupEvent.elPopup).data('ui-sortable')) {\n\t\t$(popupEvent.elPopup).sortable('destroy');\n\t}\n};\n</script>\n\n<template>\n\t<TopTagSelectorPopupOpener\n\t\tv-model=\"model\"\n\t\t:id\n\t\t:tags\n\t\t:styling\n\t\tmode=\"filter\"\n\t\t:useTopButton\n\t/>\n\n\t<TopPopup\n\t\t:id\n\t\t:class=\"classString\"\n\t\t@open=\"onOpen($event)\"\n\t\t@close=\"onClose($event)\"\n\t\t:transition-duration=\"50\"\n\t>\n\t\t<!-- Массовое редактирование-->\n\t\t<template #header v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopSelect\n\t\t\t\tv-model=\"filtersAction\"\n\t\t\t\t:options=\"genFiltersActionOptions()\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #footer v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopButton color=\"theme\">\n\t\t\t\t{{ $i18n.Common.Cancel }}\n\t\t\t</TopButton>\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"emitDebounce('setter', {\n\t\t\t\t\ttagsIds: target.model.value as Tag['id'][],\n\t\t\t\t\tfilters: target.filters,\n\t\t\t\t\tfiltersAction,\n\t\t\t\t\tpayload: target.payload,\n\t\t\t\t})\"\n\t\t\t>\n\t\t\t\t{{ filtersAction === 'add' ? $i18n.Common['Add'] : '' }}\n\t\t\t\t{{ filtersAction === 'replace' ? $i18n.Common['Replace'] : '' }}\n\t\t\t\t{{ filtersAction === 'delete' ? $i18n.Common['Delete'] : '' }}\n\t\t\t</TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopTagListItem\n\t\t\t\tv-if=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\tid=\"all\"\n\t\t\t\tcolorId=\"\"\n\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t:state=\"target.model.value.length ? '' : 'selected'\"\n\t\t\t\t@select=\"target.model.value = []\"\n\t\t\t/>\n\n\t\t\t<TopTagListItem\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:id=\"tag.id\"\n\t\t\t\t:colorId=\"tag.color_id\"\n\t\t\t\t:name=\"tag.name\"\n\t\t\t\t:state=\"genTargetTagState(tag.id)\"\n\t\t\t\t:canExclude=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\t:editable=\"tagsEditable\"\n\t\t\t\t:disabled=\"disabled && genTargetTagState(tag.id) === ''\"\n\t\t\t\t@unselect=\"updateTargetModel(tag.id, 'unselect')\"\n\t\t\t\t@select=\"updateTargetModel(tag.id, 'select')\"\n\t\t\t\t@exclude=\"updateTargetModel(tag.id, 'exclude')\"\n\t\t\t\t@update:name=\"tag.name = $event as string, emitDebounce('tagsChanged', tags);\"\n\t\t\t/>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"tagsEditable && tags.length < tagsMax && tags.length < 20\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t@click.stop=\"addTag\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.Add }}\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-tagSelector_popup .top-popup {\n\tuser-select: none;\n\tmin-width: 220px !important;\n\ttext-align: left;\n}\n\n.top-tagSelector_popup .top-popup_header .top-select{\n\tflex-grow: 1;\n}\n</style>\n"]}
1
+ {"version":3,"sources":["project/project.js","../../src/components/project/competitorSelector/competitorSelector.vue","../../src/components/project/competitorSelector/composables.ts","../../src/components/project/regionSelector/utils/consts.ts","../../src/components/project/regionSelector/utils/utils.ts","../../src/components/project/regionSelector/composables/selectSearcher.ts","../../src/components/project/regionSelector/composables/selectRegion.ts","../../src/components/project/regionSelector/composables/compare.ts","../../src/components/project/regionSelector/composables/selectorRegion.ts","../../src/components/project/regionSelector/regionSelector.vue","../../src/components/project/groupSelector/folders/utils.ts","../../src/core/utils/composables/useWatch.ts","../../src/components/project/groupSelector/folders/folders.vue","../../src/components/project/groupSelector/groups/utils.ts","../../src/components/project/groupSelector/groups/groups.vue","../../src/components/project/groupSelector/groupSelector.vue","../../src/components/project/projectSelector/utils.ts","../../src/components/project/projectSelector/submenu/submenu.vue","../../src/components/project/projectSelector/cache.ts","../../src/components/project/projectSelector/projectSelector.vue","../../src/components/project/tagSelector/utils/utils.ts","../../src/components/project/tagSelector/utils/el.ts","../../src/components/project/tagSelector/tagsDefaults.ts","../../src/components/project/tagSelector/tagIcon/tagIcon.vue","../../src/components/project/tagSelector/popupListItem/tagPopupListItem.vue","../../src/components/project/tagSelector/popupOpener/popupOpener.vue","../../src/components/project/tagSelector/tagSelector.vue"],"names":["k2","k","desc","m","o","v","\"default\"","ownKeys","ar","mod","result","i","vue","exports","ge","_e","ve","vue_1","n","a","forms_BiKUURH4_esm_js_1","popup_KKfSSrM6_esm_js_1","formsExt_kZL0__bf_esm_js_1","ye","be","xe","Se","H","Ce","we","Te","Ee","De","Oe","Ae","ke","r","je","Me","utils_D4nhUVHm_esm_js_1","require","resolve_1","reject_1","Ne","e","t","searchers_js_1","Pe","Fe","Ie","Le","s","c","l","u","d","f","p","$i18n","U","Re","ze","Be","Ve","He","Ue","W","G","K","We","Ge","Ke","qe","Je","Ye","Xe","Ze","Qe","$e","et","tt","field_DEusYVqS_esm_js_1","h","g","y","b","nt","rt","it","at","ot","st","ct","lt","ut","worker_BufdAd_a_esm_js_1","dt","ft","pt","mt","keyboard_js_1","ht","gt","_t","vt","yt","bt","xt","St","q","Ct","J","wt","Tt","Et","Dt","Ot","kt","At","jt","Mt","Nt","ee","_","$core","check_js_1","string_js_1","Pt","Ft","dom_js_1","It","Lt","Rt","zt","Bt","Vt","Ht","Ut","Wt","x","te","D","A","re"],"mappings":"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","sourcesContent":["var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\ndefine([\"require\", \"exports\", \"../.chunks/forms-BiKUURH4.esm.js\", \"../.chunks/field-DEusYVqS.esm.js\", \"../utils/dom.js\", \"../.chunks/worker-BufdAd-a.esm.js\", \"../.chunks/utils-D4nhUVHm.esm.js\", \"../utils/check.js\", \"../utils/string.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-KKfSSrM6.esm.js\", \"../.chunks/formsExt-kZL0--bf.esm.js\", \"vue\", \"../.chunks/api-D5wIZnrK.esm.js\", \"../.chunks/app-CQnQGya1.esm.js\", \"../popup/worker.js\"], function (require, exports, forms_BiKUURH4_esm_js_1, field_DEusYVqS_esm_js_1, dom_js_1, worker_BufdAd_a_esm_js_1, utils_D4nhUVHm_esm_js_1, check_js_1, string_js_1, searchers_js_1, keyboard_js_1, popup_KKfSSrM6_esm_js_1, formsExt_kZL0__bf_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.renderElTopTagSelectorPopupOpener = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = exports.clearCache = exports.TopTagSelectorTagIcon = exports.TopTagSelectorPopupOpener = exports.TopTagSelector = exports.TopRegionSelector = exports.TopProjectSelector = exports.TopGroupSelector = exports.TopCompetitorSelector = void 0;\n //#region src/components/project/competitorSelector/competitorSelector.vue?vue&type=script&setup=true&lang.ts\n var ge = { class: \"top-competitorSelector\" }, _e = { class: \"top-ellipsis1\" }, ve = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"competitorSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n items: {},\n showSelectAllItem: {\n type: Boolean,\n default: !0\n },\n selectAllItemIcon: { default: \"\" }\n }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (i.showSelectAllItem)\n return {\n icon: i.selectAllItemIcon,\n title: (0, forms_BiKUURH4_esm_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", ge, [(0, vue_1.unref)(forms_BiKUURH4_esm_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.h, {\n class: \"top-competitorSelector_opener\",\n color: \"theme\",\n icon: \"\",\n icon2: \"\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(n.items.find((e) => e.value === a.value?.[0])?.content), 1)]),\n _: 1\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(n.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": a.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => a.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", _e, (0, vue_1.toDisplayString)(e.content), 1)]),\n _: 2\n }, 1032, [\n \"class\",\n \"data-top-icon\",\n \"title\",\n \"onClick\"\n ]))), 256))]),\n _: 1\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_kZL0__bf_esm_js_1.d, {\n key: 1,\n modelValue: a.value,\n \"onUpdate:modelValue\": i[0] ||= (e) => a.value = e,\n items: n.items,\n isMultiple: !0,\n styling: \"bar\",\n canBeEmptyMultiple: !1,\n selectAllItem: o.value\n }, null, 8, [\n \"modelValue\",\n \"items\",\n \"selectAllItem\"\n ]))]));\n }\n }), ye = (e, t) => (0, vue_1.computed)(() => (0, vue_1.toValue)(e).filter((e) => e.on >= 0 || e.id === t).map((e) => ({\n value: e.id,\n title: e.url + ` [${e.id}]`,\n icon: e.id === (0, vue_1.toValue)(t) ? \"\" : \"\",\n content: e.name\n }))), be = {\n 0: \"Yandex\",\n 1: \"Google\",\n 4: \"YouTube\",\n 5: \"Bing\",\n 7: \"Seznam\",\n 8: \"AppStore\",\n 9: \"GoogleStore\",\n 20: \"Yandex.com\",\n 21: \"Yandex.com.tr\"\n }, xe = {\n key: -2,\n name: \"--\",\n index: -2\n }, Se = {\n key: -2,\n name: \"--\",\n regions: [xe],\n regionByIndex: new Map([[-2, xe]])\n }, H = {\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, Ce = {\n key: -2,\n name: \"Autoselect\",\n regions: [H],\n regionByIndex: new Map([[-2, H]])\n }, we = {\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, Te = () => (H.name = (0, forms_BiKUURH4_esm_js_1.E)().Common.Autoselect, H), Ee = () => (Te(), Ce.name = (0, forms_BiKUURH4_esm_js_1.E)().Common.Autoselect, console.log(Ce), Ce), De = () => (we.name = (0, forms_BiKUURH4_esm_js_1.E)().Keywords.Without_region, we), Oe = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e ? Ae(n, e) : ke(n), t && r.set(-2, Ee()), r.size || r.set(-2, Se), r;\n }, ke = (e, t = !0, n = [], r = \"\") => {\n let i = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (!e.enabled || r && typeof e.key == \"number\" && e.key > 1)\n return;\n let a = { ...e };\n a.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n a.regionByIndex.set(n.index, n);\n }), !a.regionByIndex.size && n.length, (!e.regions || a.regionByIndex.size || n.length) && i.set(a.key, a);\n }), n.forEach((e) => {\n if (i.has(e))\n return;\n let t = {\n key: e,\n name: be[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n i.set(t.key, t);\n }), i;\n }, Ae = (e, n) => {\n let r = ke(e, !1, forms_BiKUURH4_esm_js_1.O.state.forceSearchersKeysForKeywordsStats, n);\n if (r.has(2)) {\n let e = r.get(2);\n e && (e.regionByIndex = /* @__PURE__ */ new Map());\n }\n return (n === \"volume\" || n === \"cost_forecast\") && forms_BiKUURH4_esm_js_1.O.state.showGlobalRegionForKeywordsStats && r.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...De() };\n e.regionByIndex.set(t.index, t);\n }), r;\n }, je = (e, t, n = []) => {\n let r = Oe(e, !1, n), i;\n return r.forEach((n) => {\n if (!(t.searcher_key !== void 0 && t.searcher_key != n.key) && n.regions && (n.regions.forEach((r) => {\n if (!i && !(t.key !== void 0 && t.key != r.key) && !(t.index !== void 0 && t.index != r.index) && !(!e && (t.lang !== void 0 && t.lang != r.lang || t.device !== void 0 && t.device != r.device)))\n return r.searcher_key = n.key, i = r, !1;\n }), i))\n return !1;\n }), i;\n }, Me = (0, utils_D4nhUVHm_esm_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-DnDFRV42.esm.js\"], resolve_1, reject_1); }).then(__importStar)), Ne = (t, n) => {\n let r = (0, forms_BiKUURH4_esm_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(n.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n if (n.value.forEach((n) => {\n let r = {\n value: n.key,\n title: n.name\n };\n t.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(n.key)), e.set(n.key, r);\n }), t.addCompare && !e.has(-2)) {\n let t = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n e.set(t.value, t);\n let n = {\n value: -1,\n title: r.Common.Compare\n };\n e.set(n.value, n);\n }\n return e;\n })\n };\n }, Pe = (t, n) => {\n let r = (0, forms_BiKUURH4_esm_js_1.E)(), i = (0, vue_1.ref)(-2);\n t.modelValue.length === 1 && (i.value = t.modelValue[0]), i.value === -2 && (t.forMode ? i.value = n.value?.regionByIndex.values().next().value?.key ?? -2 : i.value = n.value?.regionByIndex.keys().next().value ?? -2);\n let a = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return n.value.regionByIndex?.forEach((i) => {\n let a = i.name;\n if (t.forMode) {\n let t = {\n value: i.key,\n title: a\n };\n e.has(i.key) || e.set(i.key, t);\n return;\n }\n i.device && (a += \" (\" + r.Common[\"Device_\" + i.device] + \")\");\n let o = (0, searchers_js_1.getLangLabel)(n.value.key || 0, i.lang ?? \"\");\n o && (a += \" / \" + o);\n let s = {\n value: i.index,\n title: a,\n icon: i.device ? (0, searchers_js_1.getDeviceGIcon)(i.device) : void 0\n };\n e.set(i.index, s);\n }), e;\n });\n return (0, vue_1.watch)(a, (e, n) => {\n if (t.onlySearcher || i.value !== void 0 && e.get(i.value))\n return;\n let a = e.keys().next().value;\n if (i.value === -2 || a === -2) {\n i.value = a;\n return;\n }\n let o = n?.get(i.value)?.title || \"\", s = -1;\n for (let [t, n] of e.entries()) {\n let e = n.title;\n if (typeof e != \"string\" || typeof t == \"string\")\n break;\n if (e === o) {\n a = t;\n break;\n }\n let i = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n e.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) !== -1 && (l <= s || (s = l, a = t));\n }\n i.value = a;\n }), {\n regionIndex: i,\n optionByRegionIndex: a\n };\n }, Fe = (e, t, n) => {\n let r = (0, vue_1.ref)([]), i = () => {\n if (e.onlySearcher && t.value) {\n r.value = Array.from(t.value.keys());\n return;\n }\n let i = [];\n if (e.modelValue.length > 1)\n i = [...e.modelValue];\n else\n try {\n i = JSON.parse(localStorage.getItem(\"ui:project:regionSelector\" + e.projectId + \":regionsIndexes\")) ?? [];\n }\n catch { }\n i.length && (i = i.filter((e) => n.value.has(e))), i.length || (i = Array.from(n.value)), r.value = [...i];\n }, a = () => {\n r.value.length ? localStorage.setItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\", JSON.stringify(r.value)) : localStorage.removeItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\");\n };\n return (0, vue_1.watch)(r, () => {\n a();\n }), e.addCompare && i(), { regionsIndexes: r };\n }, Ie = (e) => {\n let t = (0, vue_1.computed)(() => Oe(e.forMode, e.autoRegion, e.searchers)), n = (0, vue_1.computed)(() => t.value.get(i.searcherKey.value) || Se), r = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return t.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -1 && t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), i = Ne(e, t), a = Pe(e, n), o = Fe(e, t, r);\n (0, vue_1.watch)(t, () => {\n if (e.onlySearcher ? o.regionsIndexes.value = Array.from(t.value.keys()) : o.regionsIndexes.value = o.regionsIndexes.value.filter((e) => r.value.has(e)), i.searcherKey.value === -1)\n return;\n let s = t.value.keys().next().value;\n t.value.forEach((n) => {\n if (e.onlySearcher && n.key === i.searcherKey.value) {\n s = i.searcherKey.value;\n return;\n }\n if (a.regionIndex.value && n.regionByIndex?.has(a.regionIndex.value) && (s = n.key), !e.onlySearcher) {\n let e;\n s !== void 0 && (e = t.value.get(s)?.regionByIndex);\n let r = t.value.get(n.key)?.regionByIndex;\n e?.has(-2) && !r?.has(-2) && (s = n.key);\n }\n }), s !== void 0 && (i.searcherKey.value = s), a.regionIndex.value !== void 0 && !(n.value?.regionByIndex)?.has(a.regionIndex.value) && (a.regionIndex.value = n.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let s = () => {\n if (!(i.searcherKey.value === -1 || i.searcherKey.value === -2))\n return i.searcherKey.value;\n }, c = () => {\n if (e.onlySearcher || a.regionIndex.value === -2)\n return;\n let t = a.regionIndex.value;\n if (e.forMode) {\n let n = a.regionIndex.value;\n t = je(e.forMode, {\n searcher_key: s(),\n key: n\n }, e.searchers)?.index;\n }\n return t;\n }, l = () => {\n let e = s();\n if (e !== void 0)\n return t.value.get(e);\n };\n return {\n selectSearcher: i,\n selectRegion: a,\n compare: o,\n searcherByKey: t,\n allRegionsIndexes: r,\n getSearcher: l,\n getRegion: () => {\n let e = c();\n if (e !== void 0)\n return l()?.regionByIndex?.get(e);\n }\n };\n }, Le = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"regionSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n projectId: {},\n searchers: { default: () => [] },\n modelValue: {},\n modelValueSingle: {},\n addCompare: { type: Boolean },\n forMode: {},\n autoRegion: { type: Boolean },\n onlySearcher: { type: Boolean },\n addChanger: {\n type: Boolean,\n default: !0\n },\n addSearcherIcon: {\n type: Boolean,\n default: !0\n },\n addRegionIcon: {\n type: Boolean,\n default: !0\n }\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n modelValueSingle: {},\n modelValueSingleModifiers: {}\n }),\n emits: [\"update:modelValue\", \"update:modelValueSingle\"],\n setup(e, { expose: t }) {\n let n = e, a = (0, vue_1.useModel)(e, \"modelValue\"), o = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: s, selectRegion: c, compare: l, searcherByKey: u, allRegionsIndexes: d, getSearcher: f, getRegion: p } = Ie(n), m = () => {\n let e = [];\n u.value.forEach((t) => {\n t.enabled && t.regions.forEach((t) => {\n t.enabled && e.push(t);\n });\n }), Me.open(\"regions\", {\n regions: e,\n regionsIndexes: l.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => l.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n c.regionIndex,\n s.searcherKey,\n l.regionsIndexes\n ], () => {\n if (s.searcherKey.value === -1 && l.regionsIndexes.value.length) {\n if (JSON.stringify(a.value) === JSON.stringify(l.regionsIndexes.value))\n return;\n a.value = [...l.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (a.value = [s.searcherKey.value], s.searcherKey.value === -2 && !n.autoRegion && (a.value.length = 0)) : (a.value = [c.regionIndex.value], c.regionIndex.value === -2 && !n.autoRegion && (a.value.length = 0));\n !n.onlySearcher && !d.value.size && (s.searcherKey.value = -2);\n }), o.value && (0, vue_1.watch)(o, () => {\n o.value && (a.value = [o.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(a, () => {\n if (a.value[0] && (o.value = a.value[0]), n.onlySearcher) {\n if (!a.value.length || a.value.length === 1 && !u.value.has(a.value[0]) || a.value.length === 1 && a.value[0] === -2 && !n.autoRegion) {\n let e = u.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, o.value = -2), e === void 0 ? a.value.length = 0 : a.value = [e];\n return;\n }\n if (a.value.length > 1 && JSON.stringify(a.value) !== JSON.stringify(l.regionsIndexes.value)) {\n a.value = [...l.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(a.value)], t = u.value.values().next().value?.regionByIndex?.keys().next().value;\n if (n.forMode && (t = u.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, o.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let r = d.value;\n n.forMode && (r = /* @__PURE__ */ new Set(), u.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -1 && e.index !== -2 && r.add(e.key);\n });\n })), r.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => d.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(a.value) !== JSON.stringify(e)) {\n a.value = e;\n return;\n }\n }\n if (!(a.value.length === 1 && a.value[0] === (n.onlySearcher ? s.searcherKey.value : c.regionIndex.value)))\n if (n.onlySearcher) {\n if (a.value.length === 1) {\n s.searcherKey.value = a.value[0];\n return;\n }\n s.searcherKey.value = -1;\n return;\n }\n else {\n if (!a.value.length)\n return;\n if (a.value.length === 1 && s.searcherKey.value !== -1) {\n c.regionIndex.value = a.value[0];\n let e;\n for (let t of u.value.values()) {\n for (let r of t.regionByIndex.values())\n if ((n.forMode ? r.key : r.index) === c.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (s.searcherKey.value = e);\n }\n else\n s.searcherKey.value = -1, l.regionsIndexes.value = [...a.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: f,\n getRegion: p\n }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-regionSelector\": !0,\n \"top-regionSelector-onlySearcher\": e.onlySearcher\n }) }, [\n (0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.n, {\n options: (0, vue_1.unref)(s).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(s).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(s).searcherKey.value = e,\n name: \"searcher_key\",\n addChanger: e.addChanger\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"addChanger\"\n ]),\n !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_BiKUURH4_esm_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(c).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(c).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(c).regionIndex.value = e,\n name: e.forMode ? \"region_key\" : \"region_index\",\n addChanger: e.addChanger,\n \"data-top-icon\": e.addRegionIcon ? \"\" : void 0\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"name\",\n \"addChanger\",\n \"data-top-icon\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.addCompare && !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_BiKUURH4_esm_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: m,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(l).regionsIndexes.value.length\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Selected_regions), 1)]),\n _: 1\n }, 8, [\"data-count-compare-regions-indexes\"])) : (0, vue_1.createCommentVNode)(\"\", !0)\n ], 2));\n }\n }), U = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = ve;\n exports.useItemsFromCompetitors = ye;\n exports.genSearcherByKey = Oe;\n exports.findRegion = je;\n exports.dialogRegionSelector = Me;\n exports.TopRegionSelector = Le;\n function Re(t) {\n return t ? (0, forms_BiKUURH4_esm_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_BiKUURH4_esm_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var ze = (e, t, n = /* @__PURE__ */ new Map(), r = { id: \"root\" }, i = 0) => (r.childsIds = [], r.id && (r.countAllGroupsActive = r.count_groups_active), e[r.id] && e[r.id].forEach((a) => {\n a = { ...a }, r.childsIds.push(a.id), a.id === 0 && (a.name = Re(t));\n let o = i > 1 ? \"-\".repeat(i - 1) + \" \" : \"\";\n o && !a.name.startsWith(o) && (a.name = o + a.name), n.set(a.id, a), ze(e, t, n, a, i + 1), r.childsIds = r.childsIds.concat(a.childsIds), r.id && a.count_groups_active && (r.countAllGroupsActive += a.count_groups_active);\n }), n), Be = (e, t) => e.gen(`/get/${t}/folders/`, [\n \"id\",\n \"parent_id\",\n \"name\",\n \"path\"\n ]).changeParams({\n orders: [\"ord_path\"],\n limit: 100\n });\n //#endregion\n //#region src/core/utils/composables/useWatch.ts\n function Ve(e, t, n) {\n let r = Object.keys(e);\n return (0, vue_1.watch)(r.map((t) => e[t]), (e, n, i) => {\n let a = {};\n e.forEach((e, t) => {\n if (!Object.is(e, n[t])) {\n let i = r[t];\n a[i] = {\n old: n[t],\n new: e\n };\n }\n }), Object.keys(a).length && t(a, i);\n }, n);\n }\n //#endregion\n //#region src/components/project/groupSelector/folders/folders.vue?vue&type=script&setup=true&lang.ts\n var He = [\"innerHTML\"], Ue = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"folders\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n folders: {},\n projectId: {},\n canSelectAll: { type: Boolean },\n addChanger: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: {}\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: { default: U },\n folderModifiers: {}\n }),\n emits: [\"update:folderId\", \"update:folder\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"folderId\"), r = (0, vue_1.useModel)(e, \"folder\"), i = t.client && !t.folders ? Be(t.client, t.service) : void 0, a = (0, vue_1.ref)(null);\n (0, vue_1.watch)(() => t.projectId, () => {\n i?.changeParams({ project_id: t.projectId }), i?.setOptions({ checkFingerprint: \"TopGroupSelectorFolders:\" + t.projectId }), a.value?.resetCache();\n }, { immediate: !0 });\n let o = (0, vue_1.computed)(() => ze(t.folders ?? { root: [U] }, t.canSelectAll)), s = (e) => (t.canSelectAll && e[0]?.id === 0 && (e[0] = {\n ...e[0],\n name: Re(!0)\n }), e);\n return Ve({\n modelFolder: r,\n modelFolderId: n\n }, async (e) => {\n if (n.value === r.value.id)\n return;\n if (e.modelFolder && !e.modelFolderId) {\n n.value = r.value.id;\n return;\n }\n let i = o.value.get(t.folderId);\n i ||= U, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_kZL0__bf_esm_js_1.s, {\n class: \"top-groupSelector_folder\",\n modelValue: r.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => r.value = e,\n items: e.folders ? [...o.value.values()] : void 0,\n \"search-type\": \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.folders ? void 0 : (0, vue_1.unref)(i),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_kZL0__bf_esm_js_1.u)(...e, \"name\"),\n prepareItemsBeforeRender: s,\n addChanger: e.addChanger,\n useCache: \"\"\n }, {\n item: (0, vue_1.withCtx)(({ item: e }) => [(0, vue_1.createElementVNode)(\"div\", { innerHTML: e.name.replaceAll(/</g, \"< \") }, null, 8, He)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), W = {\n id: -1,\n name: \"--\",\n folder_id: U.id,\n folder_path: U.path\n }, G = {\n id: 0,\n name: \"All groups\",\n folder_id: U.id,\n folder_path: U.path\n }, K = () => (G.name = (0, forms_BiKUURH4_esm_js_1.E)()?.Common.All_groups, G), We = () => (G.name = (0, forms_BiKUURH4_esm_js_1.E)()?.Keywords.Choose_group, G), Ge = (e, t, n) => (e = [...e], t !== void 0 && (e = e.filter((e) => e.on == Number(t))), n && n.id && n.childsIds && (e = e.filter((e) => e.folder_id === n.id || n.childsIds.includes(e.folder_id))), e), Ke = (e, t) => e.gen(`/get/${t}/groups/`, [\n \"id\",\n \"name\",\n \"folder_id\",\n \"folder_path\"\n ]).changeParams({\n folder_id_depth: !0,\n limit: 100\n }), qe = (e, t) => e.gen(`/add/${t}/groups/`), Je = (e, t) => e.gen(`/del/${t}/groups/`), Ye = (e, t) => e.gen(`/edit/${t}/groups/rename/`), Xe = { class: \"top-groupSelector_groupItem top-ellipsis1\" }, Ze = {\n key: 0,\n class: \"top-comment\"\n }, Qe = [\"innerHTML\"], $e = [\"innerHTML\"], et = [\"innerHTML\"], tt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groups\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n groupId: {},\n group: {},\n projectId: {},\n folder: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canAdd: { type: [String, Boolean] },\n canEditAndDel: { type: Boolean },\n canSelectAll: { type: [Boolean, String] },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showPath: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: { default: \"keywords_2\" }\n }, {\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { required: !0 },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"addGroup\",\n \"editGroup\",\n \"delGroup\"\n ], [\"update:groupId\", \"update:group\"]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = n, a = (0, vue_1.useModel)(e, \"groupId\"), s = (0, vue_1.useModel)(e, \"group\"), c = r.client && !r.groups ? Ke(r.client, r.service) : void 0, l = r.client ? qe(r.client, r.service) : void 0, u = r.client ? Je(r.client, r.service) : void 0, d = r.client ? Ye(r.client, r.service) : void 0, f = (0, vue_1.ref)(null), p = (0, vue_1.computed)(() => {\n if (r.groups !== void 0)\n return Ge(r.groups, r.on, r.folder);\n }), m = (0, field_DEusYVqS_esm_js_1.t)(\"folder_id\", \"EQUALS\", [r.folder?.id ?? 0]);\n c?.changeParams({\n project_id: r.projectId,\n folder_id_depth: !0,\n filters: [m]\n }), r.on !== void 0 && c?.params.filters?.push((0, field_DEusYVqS_esm_js_1.t)(\"on\", \"EQUALS\", [Number(r.on)]));\n let h = (e) => {\n s.value = e, a.value = e.id;\n }, g = (e = !1) => {\n f.value?.resetCache(e);\n };\n Ve({\n projectId: () => r.projectId,\n folderId: () => r.folder?.id,\n canSelectAll: () => r.canSelectAll\n }, (e) => {\n if (e.projectId && (c?.changeParams({ project_id: r.projectId }), c?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + r.projectId })), e.folderId && (m.values = [r.folder?.id ?? 0]), g(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && a.value !== null) {\n let e;\n r.autoselect === \"first\" && (e = p.value?.[0], r.canSelectAll && (e = (0, vue_1.reactive)(K()))), (r.autoselect === \"placeholder\" || !e) && (e = We()), h(e);\n }\n }, { immediate: !0 }), Ve({\n modelGroup: s,\n modelGroupId: a\n }, async (e) => {\n if (a.value !== s.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n a.value = s.value.id;\n return;\n }\n if (!(r.canAdd && a.value === null)) {\n if (r.groups) {\n let e = p.value?.find((e) => e.id === a.value);\n if (!e && r.canSelectAll && (e = K()), e)\n h(e);\n else {\n let e = p.value?.[0];\n e && !a.value ? h(e) : h(W);\n }\n }\n if (r.client && !r.groups && (a.value || a.value === 0 && !r.canSelectAll)) {\n let e = Ke(r.client, r.service).changeParams({\n project_id: r.projectId,\n id: a.value,\n filters: [m]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + r.projectId });\n let t = await e.call();\n if (!t.errors?.length && !t.result)\n return;\n !t.errors && t.result[0] ? h(t.result[0]) : h(W);\n }\n }\n }\n }, { immediate: !0 });\n let v = async (e) => {\n if (r.canAdd !== \"api\" || !l)\n return;\n let t = s.value, n = await l.changeParams({\n project_id: r.projectId,\n names: [e.name],\n to_id: r.folder?.id ?? U.id,\n to_type: \"in_folder_last\"\n }).call();\n if (n.result) {\n let e = n.result[0];\n h(e), i(\"addGroup\", e);\n }\n else\n h(t);\n f.value?.resetCache(!0);\n }, y = async (e, t) => {\n d && ((await d.changeParams({\n project_id: r.projectId,\n id: e.id,\n name: t\n }).call()).errors || (i(\"editGroup\", {\n id: e.id,\n name: t\n }), f.value?.updateCacheItemById(e.id, { name: t })));\n }, b = async (e) => {\n u && ((await u.changeParams({\n project_id: r.projectId,\n id: e.id\n }).call()).errors || (s.value.id === e.id && h(r.canSelectAll ? K() : W), i(\"delGroup\", e.id), f.value?.deleteCacheItemById(e.id)));\n };\n return t({ resetCacheGroups: g }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_kZL0__bf_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: f,\n class: \"top-groupSelector_group\",\n modelValue: s.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => s.value = e,\n items: p.value ?? e.groups,\n searchType: \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.groups ? void 0 : (0, vue_1.unref)(c),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_kZL0__bf_esm_js_1.u)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(K)().name : !1,\n addChanger: e.addChanger,\n useCache: \"\",\n onAppendItem: v\n }, (0, vue_1.createSlots)({\n item: (0, vue_1.withCtx)(({ item: n }) => [(0, vue_1.createElementVNode)(\"div\", Xe, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Ze, (0, vue_1.toDisplayString)(t.$i18n.Common.Add) + \": \", 1)) : (0, vue_1.createCommentVNode)(\"\", !0),\n (0, vue_1.createElementVNode)(\"span\", {\n class: \"top-groupSelector_groupItemName top-ellipsis1\",\n innerHTML: n.name\n }, null, 8, Qe),\n n.folder_path && e.showPath ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n class: \"top-groupSelector_groupItemFolderPath top-ellipsis1\",\n innerHTML: n.folder_path\n }, null, 8, $e)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ])]),\n _: 2\n }, [e.canEditAndDel && e.client ? {\n name: \"actions\",\n fn: (0, vue_1.withCtx)(({ item: r }) => [r.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createVNode)(popup_KKfSSrM6_esm_js_1.n, {\n submitText: t.$i18n.Common.Save,\n defaultValue: r.name,\n inputProps: { addCleaner: !1 },\n onSubmit: (e) => y(r, e)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[1] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [...n[2] ||= []]),\n _: 1\n }, 8, [\n \"submitText\",\n \"defaultValue\",\n \"onSubmit\"\n ]), (0, vue_1.createVNode)(popup_KKfSSrM6_esm_js_1.r, {\n isWarning: \"\",\n submitText: t.$i18n.Common.Delete,\n onSubmit: (e) => b(r)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[3] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", { innerHTML: e.service === \"keywords_2\" ? t.$i18n.Keywords.Delete_group_warning : t.$i18n[\"Ai.Tracker\"].Delete_group_warning }, null, 8, et)]),\n _: 1\n }, 8, [\"submitText\", \"onSubmit\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n key: \"0\"\n } : void 0]), 1032, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResult\",\n \"useAllItem\",\n \"addChanger\"\n ]));\n }\n }), nt = { class: \"top-groupSelector\" }, rt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groupSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n groupId: {},\n group: {},\n projectId: {},\n folders: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canSelectAllGroups: {\n type: Boolean,\n default: !1\n },\n canAddGroup: { type: [String, Boolean] },\n canEditAndDelGroup: { type: Boolean },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showFolders: {\n type: Boolean,\n default: !0\n },\n showGroups: {\n type: Boolean,\n default: !0\n },\n showGroupsPaths: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: { default: \"keywords_2\" }\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: {},\n folderModifiers: {},\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { default: W },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\"update:groups\"], [\n \"update:folderId\",\n \"update:folder\",\n \"update:groupId\",\n \"update:group\"\n ]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = (0, vue_1.ref)(null), a = (0, vue_1.useModel)(e, \"folderId\"), o = (0, vue_1.useModel)(e, \"folder\"), s = (0, vue_1.useModel)(e, \"groupId\"), c = (0, vue_1.useModel)(e, \"group\"), l = n;\n o.value = ze(r.folders ?? { root: [U] }, r.canSelectAllGroups).get(a.value);\n let u = r.groups?.find((e) => e.id === s.value);\n s.value || (u = r.groups?.[0]), r.canSelectAllGroups && !u && (u = K()), (r.autoselect === \"placeholder\" || !u) && (u = We()), u ??= W, c.value = u;\n let d = (e) => {\n let t;\n r.groups && e && (t = [...r.groups, e]), l(\"update:groups\", t);\n }, f = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n l(\"update:groups\", r.groups.map((t) => t.id === e.id ? e : t));\n }, p = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n l(\"update:groups\", r.groups.filter((t) => t.id !== e.id));\n };\n return t({ resetCacheGroups: (e = !1) => {\n i.value?.resetCacheGroups(e);\n } }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", nt, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Ue, {\n key: 0,\n folderId: a.value,\n \"onUpdate:folderId\": n[0] ||= (e) => a.value = e,\n folder: o.value,\n \"onUpdate:folder\": n[1] ||= (e) => o.value = e,\n projectId: e.projectId,\n folders: e.folders,\n canSelectAll: e.canSelectAllGroups,\n addChanger: e.addChanger,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service\n }, null, 8, [\n \"folderId\",\n \"folder\",\n \"projectId\",\n \"folders\",\n \"canSelectAll\",\n \"addChanger\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0), e.showGroups ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(tt, {\n key: 1,\n ref_key: \"componentGroupsRef\",\n ref: i,\n groupId: s.value,\n \"onUpdate:groupId\": n[2] ||= (e) => s.value = e,\n group: c.value,\n \"onUpdate:group\": n[3] ||= (e) => c.value = e,\n projectId: e.projectId,\n folder: o.value,\n groups: e.groups,\n on: e.on,\n canAdd: e.canAddGroup,\n canEditAndDel: e.canEditAndDelGroup,\n canSelectAll: e.canSelectAllGroups,\n autoselect: e.autoselect,\n addChanger: e.addChanger,\n showPath: e.showGroupsPaths || e.showFolders,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service,\n onAddGroup: d,\n onEditGroup: f,\n onDelGroup: p\n }, null, 8, [\n \"groupId\",\n \"group\",\n \"projectId\",\n \"folder\",\n \"groups\",\n \"on\",\n \"canAdd\",\n \"canEditAndDel\",\n \"canSelectAll\",\n \"autoselect\",\n \"addChanger\",\n \"showPath\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0)]));\n }\n }), it = (e) => ({\n id: null,\n name: e,\n listItemProps: { type: \"title\" }\n }), at = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n }, ot = (t, n) => {\n let r = [], i = {\n scheduledUpdate: it((0, forms_BiKUURH4_esm_js_1.E)().Projects.Scheduled_update),\n manualUpdate: it((0, forms_BiKUURH4_esm_js_1.E)().Projects.Manual_update),\n guestProjects: it((0, forms_BiKUURH4_esm_js_1.E)().Projects.Guest_projects)\n }, a = n ? {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n } : at;\n for (let e of t)\n !a.scheduledUpdate && e.right?.startsWith(\"1\") && e.on > 0 && (r.push(i.scheduledUpdate), a.scheduledUpdate = !0), !a.manualUpdate && e.right?.startsWith(\"1\") && e.on === 0 && (r.push(i.manualUpdate), a.manualUpdate = !0), !a.guestProjects && e.right?.startsWith(\"0\") && e.on >= 0 && (r.push(i.guestProjects), a.guestProjects = !0), r.push(e);\n return r;\n }, st = (e) => e.map((e) => ({\n ...e,\n listItemProps: { attrs: { title: e.name } }\n })), ct = (e, t, n) => !e || e.length === 0 ? [] : (t && Object.keys(at).forEach((e) => at[e] = !1), ot(st(e), n)), lt = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return t = t.replace(/historyView=[^&]*/, \"\"), t = t.replace(/modelsKeys=[^&]*/, \"\"), t = t.replace(/competitorsIds=[^&]*/, \"\"), t = t.replace(/searchersKeys=[^&]*/, \"\"), t = t.replace(/regionIndex=[^&]*/, \"\"), t = t.replace(/regionsIndexes=[^&]*/, \"\"), t = t.replace(/folderId=[^&]*/, \"\"), t = t.replace(/groupId=[^&]*/, \"\"), t = t.replace(/tags=[^&]*/, \"\"), window.mo?.getHash && !window.mo.getHash(\"dataSort\").toString().includes(\"0000-00-00\") && (t = t.replace(/dataSort=[^&]*/, \"\")), t = t.replace(/%22historyView%22:[^,]*,/, \"\"), t = t.replace(/%22modelsKeys%22:\\[[^\\]]*\\],/, \"\"), t = t.replace(/%22competitorsIds%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22searchersKeys%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22regionIndex%22:[^,]*,/, \"\"), t = t.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22folderId%22:[^,]*,/, \"\"), t = t.replace(/%22groupId%22:[^,]*,/, \"\"), t = t.replace(/%22tagsIds%22:\\[[^\\]]*],/, \"\"), /%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(t) || (t = t.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, \"$1\")), e + t;\n }, ut = (e, t) => {\n t && t.target instanceof HTMLElement && worker_BufdAd_a_esm_js_1.t.close(t.target.closest(\".top-popup-wrapper\"));\n let n = lt(e);\n location.href = n;\n }, dt = (e) => {\n let t = ft(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n return n[1] == \"project\" && (r = n[1] + \"/\" + n[2] + \"/\"), n[2] == \"settings\" && (i = location.hash), [\n \"watcher\",\n \"indexing\",\n \"sitemap\",\n \"audit\",\n \"direct\",\n \"adwords\"\n ].includes(n[4]) && (i = n[4] + \"/\"), \"https://\" + t + \"/\" + r + e + \"/\" + i;\n }, ft = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, pt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"http://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, mt = (e, t) => {\n let n = e.params.filters ?? [];\n n = n.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let r = (0, keyboard_js_1.invertKeyboardLayout)(t), i = t.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), a = r.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n t && n.push((0, field_DEusYVqS_esm_js_1.t)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${i}|${a})`])), e.changeParams({ filters: n });\n }, ht = (e) => {\n let n = e.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return n.changeParams({\n filters: [(0, field_DEusYVqS_esm_js_1.t)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, field_DEusYVqS_esm_js_1.n)(\"user_id\", \"DESC\", [forms_BiKUURH4_esm_js_1.O.state.user.id]),\n (0, field_DEusYVqS_esm_js_1.n)(\"on\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"favorite\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"id\", \"DESC\")\n ]\n }), n.options.onApiLoaded = (e, t, n) => {\n let r = t.data.filters.length === 1 && t.data.offset === 0 || t.data.limit === 1e3, i = t.data.limit === 100 && t.data.filters.length > 1 ? !0 : void 0;\n e.result = ct(e.result, r, i), n?.(e, t);\n }, n;\n }, gt = (e) => e.gen(\"/add/projects_2/projects/\"), _t = { class: \"top-projectSelectorSubmenu_item\" }, vt = [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ], yt = { class: \"top-projectSelectorSubmenu_item\" }, bt = [\"href\"], xt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: {\n id: {},\n right: {},\n url: {}\n },\n setup(t) {\n let n = t, r = (0, forms_BiKUURH4_esm_js_1.E)(), i = ft(), a = [\n {\n href: `https://${i}/project/keywords/${n.id}/`,\n title: r.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${i}/project/dynamics/${n.id}/`,\n title: r.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/snapshots/${n.id}/`,\n title: r.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/competitors/${n.id}/`,\n title: r.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/ai-tracker/${n.id}/`,\n title: r.Common.Menu_aiTracker,\n icon: \"\",\n right: \"13\"\n },\n {\n href: `https://${i}/project/analytics/${n.id}/`,\n title: r.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${i}/project/broker/${n.id}/`,\n title: r.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/sitemap/`,\n title: r.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/audit/`,\n title: r.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/indexing/`,\n title: r.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/watcher/`,\n title: r.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${i}/project/settings/${n.id}/`,\n title: r.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ], o = (0, vue_1.computed)(() => n.right.includes(\"0\") ? a.filter((e) => n.right[e.right] === \"1\") : a);\n return (e, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_KKfSSrM6_esm_js_1.s), {\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-projectSelectorSubmenu_opener\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"li\", _t, [(0, vue_1.createElementVNode)(\"a\", {\n href: e.href,\n title: e.title,\n \"data-top-icon\": e.icon,\n \"data-right\": e.right\n }, null, 8, vt)]))), 256)), (0, vue_1.createElementVNode)(\"li\", yt, [(0, vue_1.createElementVNode)(\"a\", {\n href: t.url,\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, null, 8, bt)])]),\n _: 1\n });\n };\n }\n }), St = 1440 * 60 * 1e3, q = (0, vue_1.shallowRef)(), Ct = (0, vue_1.ref)(0), J = (0, vue_1.ref)(null), wt = (e) => {\n localStorage.setItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id, JSON.stringify({\n projectsTotal: e,\n expiresAt: Date.now() + St\n }));\n }, Tt = () => {\n let e = localStorage.getItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id);\n if (!e)\n return;\n let { projectsTotal: n, expiresAt: r } = JSON.parse(e);\n if (Date.now() > r) {\n localStorage.removeItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id);\n return;\n }\n return n;\n }, Et = (e = !0) => {\n q.value = void 0, J.value = null, localStorage.removeItem(\"ui_project_selector_total:\" + forms_BiKUURH4_esm_js_1.O.state.user.id), e && Ct.value++;\n }, Dt = { class: \"top-projectSelector_item\" }, Ot = { class: \"top-projectSelector_itemText\" }, kt = { class: \"top-comment\" }, At = {\n key: 0,\n class: \"top-comment\"\n }, jt = [\"href\", \"onClick\"], Mt = 1e3, Nt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n addLinksToProjects: {\n type: Boolean,\n default: !0\n },\n excludeProjectId: {},\n modificator: {},\n placeholder: {},\n buttonProps: {},\n openerShortcut: {}\n }, {\n modelValue: { default: {\n id: null,\n name: \"\"\n } },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let r = (0, forms_BiKUURH4_esm_js_1.E)(), i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = ht(i.client), s = ht(i.client);\n s.changeParams({ limit: Mt });\n let c = gt(i.client), l = (0, vue_1.ref)(Tt()), f = (0, vue_1.ref)(null), p = (0, vue_1.computed)(() => i.placeholder ?? r.Projects.Select_project), m = (0, vue_1.computed)(() => !q.value || !i.excludeProjectId ? q.value : q.value.filter((e) => e.id !== i.excludeProjectId)), h = (0, vue_1.computed)(() => {\n if (!(!l.value && l.value !== 0))\n return l.value < Mt ? \"static\" : \"api\";\n });\n (0, vue_1.watch)(Ct, () => {\n ee();\n }), (0, vue_1.watch)(a, () => {\n !a.value.id || !i.addLinksToProjects || ut(dt(a.value.id));\n });\n let g = async () => {\n J.value ||= s.call();\n let e = await J.value;\n if (e.errors) {\n J.value = null;\n return;\n }\n return J.value = null, e;\n }, _ = async () => {\n if (l.value)\n return;\n let e = await g();\n e && (l.value = e.total, h.value === \"static\" && !q.value && (q.value = e.result), l.value && wt(l.value));\n }, v = async (e) => {\n let n = await c.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!n.errors) {\n if (q.value && h.value === \"static\") {\n let r = {\n id: Number(n.result),\n user_id: forms_BiKUURH4_esm_js_1.O.state.user.id,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\",\n listItemProps: { attrs: { title: e.name } }\n }, i = q.value.findIndex((e) => e.on === 0);\n q.value = [\n ...q.value.slice(0, i),\n r,\n ...q.value.slice(i)\n ], l.value && (l.value += 1, wt(l.value));\n }\n h.value === \"api\" && Et();\n }\n }, ee = () => {\n h.value === \"api\" && f.value?.resetCache(!0);\n }, y = async () => {\n if (q.value || h.value === \"api\")\n return;\n let e = await g();\n e && (q.value = e.result);\n };\n return (0, vue_1.onMounted)(async () => {\n await _();\n }), (e, t) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_kZL0__bf_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: f,\n class: \"top-projectSelector\",\n modelValue: a.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => a.value = e,\n items: m.value,\n title: e.$i18n.Projects.Search_projects,\n modificator: n.modificator,\n searchFields: [\n \"id\",\n \"name\",\n \"url\"\n ],\n placeholder: p.value,\n hasCloserBtn: \"\",\n api: h.value === \"api\" ? (0, vue_1.unref)(o) : void 0,\n apiSetSearchParams: h.value === \"api\" ? (...e) => (0, vue_1.unref)(mt)(...e) : void 0,\n useCache: \"\",\n appendSearchToResult: \"\",\n appendSearchAllowDuplicate: \"\",\n appendSearchToResultCond: (0, vue_1.unref)(check_js_1.validUrl),\n appendWithoutSelect: \"\",\n buttonProps: n.buttonProps,\n openerShortcut: n.openerShortcut,\n onAppendItem: v,\n onOpen: y\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", Dt, [(0, vue_1.createElementVNode)(\"div\", Ot, [i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)((0, vue_1.unref)(string_js_1.ellipsis)(i.name, 20)) + \" \", 1), (0, vue_1.createElementVNode)(\"span\", kt, \" id \" + (0, vue_1.toDisplayString)(i.id), 1)], 64)) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 1 }, [i.listItemProps?.type ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", At, (0, vue_1.toDisplayString)(e.$i18n.Projects.Add_project) + \": \", 1)), (0, vue_1.createTextVNode)(\" \" + (0, vue_1.toDisplayString)(i.name), 1)], 64))]), i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [\n n.addLinksToProjects ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"a\", {\n key: 0,\n class: \"top-projectSelector_itemLink\",\n href: (0, vue_1.unref)(dt)(i.id),\n onClick: (0, vue_1.withModifiers)((e) => (0, vue_1.unref)(ut)((0, vue_1.unref)(dt)(i.id), e), [\"prevent\", \"stop\"])\n }, null, 8, jt)) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n class: \"top-projectSelector_itemExtLink\",\n href: (0, vue_1.unref)(pt)(i.url),\n \"data-top-icon\": \"\",\n color: \"theme\",\n target: \"_blank\",\n onClick: t[0] ||= (0, vue_1.withModifiers)(() => { }, [\"stop\"])\n }, null, 8, [\"href\"])),\n (0, vue_1.createVNode)(xt, {\n id: i.id,\n right: i.right ?? void 0,\n url: (0, vue_1.unref)(pt)(i.url)\n }, null, 8, [\n \"id\",\n \"right\",\n \"url\"\n ])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)])]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\"\n ]);\n };\n }\n }), Pt = (e) => \"-\" + e, Y = (e) => e[0] === \"-\" ? e.substring(1) : e, X = (e, t) => {\n e = Y(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, Ft = (e, t, n) => {\n t ||= { id: e.id }, t.id = e.id, t.pos ??= \"3\", t.notch ??= !0, t.posBy ??= \"fixed\";\n let r = worker_BufdAd_a_esm_js_1.t.genElPopupOpener(\"div\", t);\n return r.classList.add(\"top-tagSelector\"), e.useTopButton && r.classList.add(\"top-tagSelector-useTopButton\", \"top-button\", \"top-color_theme\", \"top-as-selector\"), e.useTopButton || r.classList.add(\"top-tagSelector-custom\"), e.mode === \"filter\" && r.classList.add(\"top-tagSelector-filter\"), e.mode === \"setter\" && !e.filters && r.classList.add(\"top-tagSelector-setter_single\"), e.mode === \"setter\" && e.filters && r.classList.add(\"top-tagSelector-setter_several\"), r.onclick = (t) => {\n t.preventDefault(), t.stopPropagation(), r.onclick = null;\n let i = (0, vue_1.ref)(e.modelValue);\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n }), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Z(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Z(r, e, n)) : (0, dom_js_1.storage)(r, \"topTagSelectorRender\", (t) => {\n e.modelValue = t;\n let i = (0, dom_js_1.storage)(r, \"topTagSelectorTarget\");\n i && (i.model.value = t), Z(r, e, n);\n }), Z(r, e, n), r;\n }, It = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Z = (t, n, r) => {\n let i = (0, vue_1.unref)(n.modelValue);\n if (t.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), t.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), n.mode === \"setter\" && n.filters) {\n t.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (t.innerHTML = \"\", !i.length && n.mode === \"filter\") {\n let n = Lt({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_BiKUURH4_esm_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n t.append(n);\n }\n i.forEach((e) => {\n let r = Lt({\n id: Y(e),\n colorId: X(e, n.tags)?.color_id ?? \"\",\n name: X(e, n.tags)?.name ?? \"\",\n state: Y(e) === e ? \"selected\" : \"excluded\"\n });\n t.append(r);\n });\n }, Lt = (e) => {\n let t = document.createElement(\"div\");\n return t.classList.add(\"top-tagSelector_tagIcon\"), t.classList.toggle(\"top-tagSelector-active\", !!e.state), t.classList.toggle(\"top-tagSelector-excluded\", e.state === \"excluded\"), t.dataset.tag_id = e.id, t.dataset.tag_color_id = e.colorId, t.title = e.name, t;\n }, Rt = [\n {\n id: \"1\",\n name: \"Without Tag\",\n color_id: \"1\"\n },\n {\n id: \"2\",\n name: \"Red\",\n color_id: \"2\"\n },\n {\n id: \"3\",\n name: \"Orange\",\n color_id: \"3\"\n },\n {\n id: \"4\",\n name: \"Yellow\",\n color_id: \"4\"\n },\n {\n id: \"5\",\n name: \"Blue\",\n color_id: \"5\"\n },\n {\n id: \"6\",\n name: \"Purple\",\n color_id: \"6\"\n },\n {\n id: \"7\",\n name: \"Green\",\n color_id: \"7\"\n },\n {\n id: \"8\",\n name: \"Magenta\",\n color_id: \"8\"\n },\n {\n id: \"9\",\n name: \"Dark blue\",\n color_id: \"9\"\n },\n {\n id: \"10\",\n name: \"Turquoise\",\n color_id: \"10\"\n }\n ], zt = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], Q = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagIcon\",\n props: {\n id: {},\n colorId: {},\n name: {},\n state: {}\n },\n setup(e) {\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagIcon\": !0,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n \"data-tag_id\": e.id,\n \"data-tag_color_id\": e.colorId,\n title: e.name\n }, null, 10, zt));\n }\n }), Bt = [\"contenteditable\", \"onKeydown\"], Vt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagPopupListItem\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n editable: { type: Boolean },\n disabled: { type: Boolean },\n canExclude: { type: Boolean },\n id: {},\n colorId: {},\n name: {},\n state: {}\n }, {\n name: { required: !0 },\n nameModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"update:name\",\n \"unselect\",\n \"exclude\",\n \"select\"\n ], [\"update:name\"]),\n setup(e, { emit: t }) {\n let n = e, r = t, i = (0, vue_1.useModel)(e, \"name\"), a = (0, vue_1.ref)(null), o = (0, vue_1.computed)(() => navigator.userAgent.indexOf(\"Firefox\") == -1 ? {} : {\n contenteditable: s.value,\n onpaste: (e) => e.preventDefault()\n }), s = (0, vue_1.ref)(!1), c = async () => {\n s.value = !0, await (0, vue_1.nextTick)(), a.value?.focus();\n }, l = () => {\n let e = a.value?.innerText;\n if (!e)\n return u();\n a.value && (a.value.innerText = e), s.value = !1, r(\"update:name\", e);\n }, u = async () => {\n a.value && (a.value.innerText = n.name), s.value = !1;\n }, d = (e) => {\n if (s.value || n.disabled)\n return;\n let t = \"selected\";\n n.canExclude && (e.ctrlKey || e.metaKey) && (t = \"excluded\"), n.state == t && (t = \"\"), t === \"\" && r(\"unselect\"), t === \"selected\" && r(\"select\"), t === \"excluded\" && r(\"exclude\");\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagListItem\": !0,\n \"top-tagSelector_tagListItem-inEdit\": s.value,\n \"top-tagSelector_tagListItem-disabled\": e.disabled,\n \"top-tagSelector_tagListItem-canExclude\": e.canExclude,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n onClick: (0, vue_1.withModifiers)(d, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [\n (0, vue_1.createVNode)(Q, {\n id: e.id,\n name: i.value,\n colorId: e.colorId,\n state: e.state\n }, null, 8, [\n \"id\",\n \"name\",\n \"colorId\",\n \"state\"\n ]),\n (0, vue_1.createElementVNode)(\"span\", (0, vue_1.mergeProps)({\n ref_key: \"elName\",\n ref: a,\n class: \"top-tagSelector_tagListItemName\",\n contenteditable: s.value ? \"plaintext-only\" : !1\n }, o.value, { onKeydown: [(0, vue_1.withKeys)((0, vue_1.withModifiers)(l, [\"stop\"]), [\"enter\"]), (0, vue_1.withKeys)((0, vue_1.withModifiers)(u, [\"stop\"]), [\"esc\"])] }), (0, vue_1.toDisplayString)(i.value), 17, Bt),\n e.editable ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [s.value ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: (0, vue_1.withModifiers)(l, [\"stop\"])\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 0,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: c\n }))], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 1\n }, 8, [\"class\"]));\n }\n }), Ht = { key: 1 }, Ut = /* @__PURE__ */ (0, vue_1.defineComponent)({\n inheritAttrs: !1,\n __name: \"popupOpener\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n id: {},\n tags: {},\n mode: {},\n targetId: {},\n filters: {},\n useTopButton: { type: Boolean },\n payload: {},\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"modelValue\"), i = t.useTopButton ? forms_BiKUURH4_esm_js_1.h : \"div\", a = t.useTopButton ? \"html\" : \"default\", o = {\n model: n,\n mode: t.mode,\n targetId: t.targetId,\n filters: t.filters,\n payload: t.payload\n };\n return (r, s) => {\n let c = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.c, { id: e.id }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.withDirectives)(((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(i)), (0, vue_1.mergeProps)({\n class: {\n \"top-tagSelector\": !0,\n \"top-tagSelector-useTopButton\": t.useTopButton,\n \"top-tagSelector-custom\": !t.useTopButton,\n \"top-as-selector\": t.useTopButton,\n \"top-tagSelector-filter\": t.mode === \"filter\",\n \"top-tagSelector-setter_single\": t.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": t.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !n.value.length || n.value.length === 1,\n \"top-tagSelector-toTwoLine\": n.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, r.$attrs), {\n [(0, vue_1.unref)(a)]: (0, vue_1.withCtx)(() => [!n.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: r.$i18n.Common.All_tags ?? \"\",\n state: \"\"\n }, null, 8, [\"name\"])) : (0, vue_1.createCommentVNode)(\"\", !0), e.mode === \"setter\" && e.filters ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Ht, [(0, vue_1.renderSlot)(r.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(n.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n id: (0, vue_1.unref)(Y)(t),\n colorId: (0, vue_1.unref)(X)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(X)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(Y)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n c,\n o,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Wt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n tags: {},\n tagsEditable: { type: Boolean },\n tagsMax: { default: 10 },\n id: {},\n singleMode: { type: Boolean },\n requiredForSetter: {\n type: Boolean,\n default: !0\n },\n maxTagsForSetter: {},\n emitDelay: { default: 500 },\n useTopButton: {\n type: Boolean,\n default: !0\n },\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n tags: { default: (0, vue_1.reactive)(Rt) },\n tagsModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(a, { emit: o }) {\n let c = (0, forms_BiKUURH4_esm_js_1.E)(), l = a, u = (0, vue_1.useModel)(a, \"modelValue\"), d = (0, vue_1.useModel)(a, \"tags\"), f = o, p = (0, forms_BiKUURH4_esm_js_1.P)((e, t) => {\n f(e, t);\n }, l.emitDelay);\n l.singleMode && !u.value.length && (u.value = [d.value[0].id]);\n let m = l.id ?? \"top-popup-id-\" + Math.random(), h = (0, vue_1.ref)(\"add\"), g = () => {\n let e = \" \" + c.Common.Tags?.toLowerCase(), t = /* @__PURE__ */ new Map();\n return t.set(\"add\", {\n value: \"add\",\n title: c.Common.Add + e\n }), t.set(\"replace\", {\n value: \"replace\",\n title: c.Common.Replace + e\n }), t.set(\"delete\", {\n value: \"delete\",\n title: c.Common.Delete + e\n }), t;\n }, _ = (0, vue_1.shallowRef)({\n model: u,\n mode: \"filter\",\n targetId: void 0,\n filters: void 0,\n payload: void 0\n });\n (0, vue_1.watch)(u, () => {\n p(\"selector\", u.value);\n });\n let ee = (0, vue_1.computed)(() => {\n if (_.value.mode === \"setter\" && l.maxTagsForSetter && !_.value.filters)\n return _.value.model.value.length >= l.maxTagsForSetter;\n }), b = (e) => {\n if (e !== \"all\") {\n if (_.value.model.value.includes(e))\n return \"selected\";\n if (_.value.model.value.includes(Pt(e)))\n return \"excluded\";\n }\n return e === \"all\" && !_.value.model.value.length ? \"selected\" : \"\";\n }, x = (e, t) => {\n let n = Pt(e), r = _.value.model.value.filter((t) => t !== e && t !== n);\n t === \"select\" && r.push(e), t === \"exclude\" && r.push(n), _.value.mode === \"setter\" && _.value.targetId !== void 0 && l.requiredForSetter && (r.length || r.push(\"1\"), r.length === 2 && _.value.model.value.length === 1 && _.value.model.value[0] === \"1\" && (r = r.filter((e) => e !== \"1\"))), l.singleMode && !_.value.filters && (r.length || (r = _.value.model.value), r.length > 1 && (r = [r[r.length - 1]])), r.sort((e, t) => l.tags ? l.tags.findIndex((t) => t.id === e) - l.tags.findIndex((e) => e.id === t) : 0), _.value.model.value = r, _.value.mode === \"setter\" && _.value.targetId !== void 0 && p(\"setter\", {\n tagsIds: r,\n targetId: _.value.targetId,\n payload: _.value.payload\n });\n }, te = (0, vue_1.computed)(() => {\n let e = \"top-tagSelector_popup\";\n return _.value.mode === \"filter\" && (e += \" top-tagSelector_popup-filter\"), _.value.mode === \"setter\" && (e += \" top-tagSelector_popup-setter\"), e;\n }), D = () => {\n let e = prompt(\"\", \"New tag\");\n if (!e || e === \"New tag\")\n return;\n let t = d.value.length + 1;\n d.value.push({\n id: String(t),\n name: e,\n color_id: String((t - 1) % 10 + 1)\n }), f(\"tagsChanged\", d.value);\n }, A = (e) => {\n if (_.value = (0, dom_js_1.storage)(e.elPopupOpener, \"topTagSelectorTarget\"), !_.value)\n throw Error(\"Open popup TopTagSelector required v-data:topTagSelectorTarget\");\n if (_.value.filters && (h.value = \"add\", _.value.model.value = []), !forms_BiKUURH4_esm_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_BiKUURH4_esm_js_1.O.state.isMobile && !forms_BiKUURH4_esm_js_1.O.state.isMobileUA && d.value && $(e.elPopup).sortable({\n items: \"li:has([data-tag_id]:not([data-tag_id=\\\"all\\\"]))\",\n cancel: \"[contenteditable=\\\"plaintext-only\\\"], [contenteditable=\\\"true\\\"]\",\n distance: 10,\n stop: function (e, t) {\n if (!d.value)\n return;\n let n = $(t.item).parent().find(\"[data-tag_id]\"), r = [];\n n.each((e, t) => {\n if (!d.value)\n return;\n let n = $(t).attr(\"data-tag_id\");\n r.push(n);\n }), d.value.sort((e, t) => r.findIndex((t) => t === e.id) - r.findIndex((e) => e === t.id)), p(\"tagsChanged\", d.value);\n }\n });\n }, re = (e) => {\n forms_BiKUURH4_esm_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(Ut, {\n modelValue: u.value,\n \"onUpdate:modelValue\": t[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: a.styling,\n mode: \"filter\",\n useTopButton: a.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_KKfSSrM6_esm_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(te.value),\n onOpen: t[4] ||= (e) => A(e),\n onClose: t[5] ||= (e) => re(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n _.value.mode === \"filter\" && !a.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Vt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: e.$i18n.Common.All_tags ?? \"\",\n state: _.value.model.value.length ? \"\" : \"selected\",\n onSelect: t[3] ||= (e) => _.value.model.value = []\n }, null, 8, [\"name\", \"state\"])) : (0, vue_1.createCommentVNode)(\"\", !0),\n ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(d.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Vt, {\n key: e.id,\n id: e.id,\n colorId: e.color_id,\n name: e.name,\n state: b(e.id),\n canExclude: _.value.mode === \"filter\" && !a.singleMode,\n editable: a.tagsEditable,\n disabled: ee.value && b(e.id) === \"\",\n onUnselect: (t) => x(e.id, \"unselect\"),\n onSelect: (t) => x(e.id, \"select\"),\n onExclude: (t) => x(e.id, \"exclude\"),\n \"onUpdate:name\": (t) => {\n e.name = t, (0, vue_1.unref)(p)(\"tagsChanged\", d.value);\n }\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\",\n \"canExclude\",\n \"editable\",\n \"disabled\",\n \"onUnselect\",\n \"onSelect\",\n \"onExclude\",\n \"onUpdate:name\"\n ]))), 128)),\n a.tagsEditable && d.value.length < a.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_KKfSSrM6_esm_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(D, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Add), 1)]),\n _: 1\n })) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 2\n }, [_.value.mode === \"setter\" && _.value.filters ? {\n name: \"header\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => h.value = e,\n options: g()\n }, null, 8, [\"modelValue\", \"options\"])]),\n key: \"0\"\n } : void 0, _.value.mode === \"setter\" && _.value.filters ? {\n name: \"footer\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_BiKUURH4_esm_js_1.h, { onClick: t[2] ||= (e) => (0, vue_1.unref)(p)(\"setter\", {\n tagsIds: _.value.model.value,\n filters: _.value.filters,\n filtersAction: h.value,\n payload: _.value.payload\n }) }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(h.value === \"add\" ? e.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? e.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? e.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = rt;\n exports.clearCache = Et;\n exports.TopProjectSelector = Nt;\n exports.genElTopTagSelectorPopupOpener = Ft;\n exports.renderElTopTagSelectorPopupOpener = It;\n exports.TopTagSelectorTagIcon = Q;\n exports.TopTagSelectorPopupOpener = Ut;\n exports.TopTagSelector = Wt;\n});\n//# sourceMappingURL=project.js.map\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './types';\nimport Core from '@/core/core/core';\nimport Button from '@/components/forms/button/button.vue';\nimport Popup from '@/components/popup/popup/popup.vue';\nimport ListItem from '@/components/popup/popup/listItem.vue';\nimport Menu from '@/components/formsExt/menu/menu.vue';\nimport { useI18n } from '@/core/plugins/i18n';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowSelectAllItem: true,\n\tselectAllItemIcon: '',\n});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: props.selectAllItemIcon,\n\t\t\ttitle: useI18n().Common.Select_all,\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n\t\n\treturn undefined;\n});\n</script>\n\n<template>\n\t<div class=\"top-competitorSelector\">\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-competitorSelector_opener\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\ticon2=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-competitorSelector_opener.top-button {\n\twidth: 100%;\n}\n</style>\n","import type { MaybeRefOrGetter } from 'vue';\nimport { computed, toValue } from 'vue';\nimport type { Competitor, Item } from '@/components/project/competitorSelector/types';\n\nexport const useItemsFromCompetitors = (competitors: MaybeRefOrGetter<Competitor[]>, projectId: MaybeRefOrGetter<number>) => {\n\treturn computed(() => {\n\t\tconst activeCompetitors = toValue(competitors).filter(competitor => competitor.on >= 0 || competitor.id === projectId);\n\n\t\tconst items: Item[] = activeCompetitors.map(competitor => {\n\t\t\treturn {\n\t\t\t\tvalue: competitor.id,\n\t\t\t\ttitle: competitor.url + ` [${competitor.id}]`,\n\t\t\t\ticon: competitor.id === toValue(projectId) ? '' : '',\n\t\t\t\tcontent: competitor.name,\n\t\t\t};\n\t\t});\n\n\t\treturn items;\n\t});\n};\n","import type { Region, SearcherIndexed } from '../types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Ключ ПС - для выбора нескольких ПС или регионов\n */\nexport const searhcerCompareKey = -1;\n\n/**\n * Ключ ПС или индекса Региона, используется для ПС или Региона, не настроенных в проекте\n *\n * Также, используется для API с возможностью не указывать регион, см. `props.autoRegion`\n */\nexport const dummyIndex = -2;\n\n/**\n * Регион - без региона\n */\nexport const globalRegionIndex = -1;\n\nexport const searchersNames = {\n\t0: 'Yandex',\n\t1: 'Google',\n\t4: 'YouTube',\n\t5: 'Bing',\n\t7: 'Seznam',\n\t8: 'AppStore',\n\t9: 'GoogleStore',\n\t20: 'Yandex.com',\n\t21: 'Yandex.com.tr',\n};\n\nexport const regionUndefined: Region = {\n\tkey: dummyIndex,\n\tname: '--',\n\tindex: dummyIndex,\n};\n\nexport const searcherUndefined: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: '--',\n\tregions: [regionUndefined],\n\tregionByIndex: new Map([[dummyIndex, regionUndefined]]),\n};\n\nconst regionAuto: Region = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tindex: dummyIndex,\n};\n\nconst searcherAuto: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tregions: [regionAuto],\n\tregionByIndex: new Map([[dummyIndex, regionAuto]]),\n};\n\nconst regionGlobal: Region = {\n\tcountryCode: '00',\n\tdepth: 1,\n\tdevice: 0,\n\tkey: globalRegionIndex,\n\tindex: globalRegionIndex,\n\tlang: 'ru',\n\tname: 'Without region',\n};\n\nexport const getRegionAuto = () => {\n\tregionAuto.name = useI18n().Common.Autoselect!;\n\n\treturn regionAuto;\n};\n\nexport const getSearcherAuto = () => {\n\tgetRegionAuto();\n\n\tsearcherAuto.name = useI18n().Common.Autoselect!;\n\tconsole.log(searcherAuto);\n\n\treturn searcherAuto;\n};\n\nexport const getRegionGlobal = () => {\n\tregionGlobal.name = useI18n().Keywords.Without_region!;\n\n\treturn regionGlobal;\n};\n","import Core from '@/core/core/core';\nimport type { ForMode, Region, Searcher, SearcherByKey, SearcherIndexed } from '../types';\nimport { dummyIndex, getRegionGlobal, getSearcherAuto, searchersNames, searcherUndefined } from './consts';\nimport { useAsyncTopDialog } from '@/components/dialog/dialog/composables/utils';\n\n/**\n * Генерация Map ПС с Map регионов из массива searchers\n * - ключ для ПС - searcherKey\n * - ключ для региона - regionIndex\n *\n * Если поисковиков в списке нет, в список будет добавлен searcherUndefined\n *\n * Если регионов в списке нет, в список будет добавлен regionUndefined\n *\n * @param forMode - Режим выбора регионов\n * @param autoRegion - добавить элемент с ключем -2, который в API заменяется на нужный ключ в зависимости от контекста\n * @param searchers - поисковики с регионами проекта, см.: get/projects_2/projects, show_searchers_and_regions = 1\n */\nexport const genSearcherByKey = (\n\tforMode: ForMode = '',\n\tautoRegion: boolean = false,\n\tsearchers: Searcher[] = [],\n) => {\n\tlet searcherByKey: SearcherByKey;\n\n\tif (forMode) {\n\t\tsearcherByKey = genSearchersMapForMode(searchers, forMode);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers);\n\t}\n\n\tif (autoRegion) searcherByKey.set(dummyIndex, getSearcherAuto());\n\tif (!searcherByKey.size) searcherByKey.set(dummyIndex, searcherUndefined);\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @param forceSearchersKeys - ключи ПС, которые нееобходимо вывести в любом случае\n * @param forMode - Режим выбора регионов (при непустом значении остаются только Яндекс, Google и Mail)\n */\nconst genSearchersMapCommon = (\n\tsearchers: Searcher[],\n\tonlyEnabledRegions: boolean = true,\n\tforceSearchersKeys: Searcher['key'][] = [],\n\tforMode: ForMode = '',\n) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\t\tif (forMode && typeof searcher.key === 'number' && searcher.key > 1) return;\n\n\t\tconst searcherI = { ...searcher } as SearcherIndexed;\n\t\tsearcherI.regionByIndex = new Map();\n\n\t\tif (searcher.regions) {\n\t\t\tsearcher.regions.forEach((region: Region) => {\n\t\t\t\tif (onlyEnabledRegions && !region.enabled) return;\n\n\t\t\t\tconst regionI = { ...region };\n\t\t\t\tsearcherI.regionByIndex.set(regionI.index, regionI);\n\t\t\t});\n\t\t}\n\n\t\tif (!searcherI.regionByIndex.size && !forceSearchersKeys.length) {\n\t\t\t// searcherI.regionByIndex.set(regionUndefined.index, regionUndefined);\n\t\t}\n\n\t\tif (\n\t\t\t// режим вывода ПС без регионов\n\t\t\t!searcher.regions ||\n\n\t\t\t// есть включенные регионы\n\t\t\tsearcherI.regionByIndex.size ||\n\n\t\t\t// запрошен вывод конкретных ПС\n\t\t\tforceSearchersKeys.length\n\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\t// дополнительные ПС\n\tforceSearchersKeys.forEach((searcherKey) => {\n\t\tif (searcherByKey.has(searcherKey)) return;\n\n\t\tconst searcherI: SearcherIndexed = {\n\t\t\tkey: searcherKey,\n\t\t\tname: searchersNames[searcherKey],\n\t\t\tregions: [],\n\t\t\tregionByIndex: new Map(),\n\t\t};\n\n\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t});\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки частоты (Яндекс, Google, Mail если добавлен в проект)\n *\n * @param searchers\n * @param forMode - Режим выбора регионов\n */\nconst genSearchersMapForMode = (searchers: Searcher[], forMode: ForMode) => {\n\tconst serarcherByKey = genSearchersMapCommon(searchers, false, Core.state.forceSearchersKeysForKeywordsStats, forMode);\n\n\t// в Mail нет регионов\n\tif (serarcherByKey.has(2)) {\n\t\tconst searcherMail = serarcherByKey.get(2);\n\t\tif (searcherMail) searcherMail.regionByIndex = new Map();\n\t}\n\n\tif ((forMode === 'volume' || forMode === 'cost_forecast') && Core.state.showGlobalRegionForKeywordsStats) {\n\t\t// добавление глобального региона\n\t\tserarcherByKey.forEach((searcher) => {\n\t\t\tif (!searcher.regionByIndex) return;\n\n\t\t\tconst region = { ...getRegionGlobal() };\n\t\t\tsearcher.regionByIndex.set(region.index, region);\n\t\t});\n\t}\n\n\treturn serarcherByKey;\n};\n\n/**\n * Поиск региона по заданному критерию из списка поисковиков проекта\n *\n * @param forMode - Режим выбора регионов\n * @param searchRegion - объект с параметрами региона, который следует найти\n * @param searchers\n */\nexport const findRegion = (forMode: ForMode, searchRegion: Partial<Region>, searchers: Searcher[] = []) => {\n\tconst searcherByKey = genSearcherByKey(forMode, false, searchers);\n\n\tlet findedRegion: Region | undefined;\n\n\t// поиск ПС\n\tsearcherByKey.forEach((searcher) => {\n\t\tif (searchRegion.searcher_key !== undefined && searchRegion.searcher_key != searcher.key) return;\n\t\tif (!searcher.regions) return;\n\n\t\t// поиск региона\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (findedRegion) return;\n\n\t\t\tif (searchRegion.key !== undefined && searchRegion.key != region.key) return;\n\t\t\tif (searchRegion.index !== undefined && searchRegion.index != region.index) return;\n\n\t\t\tif (!forMode) {\n\t\t\t\tif (searchRegion.lang !== undefined && searchRegion.lang != region.lang) return;\n\t\t\t\tif (searchRegion.device !== undefined && searchRegion.device != region.device) return;\n\t\t\t}\n\n\t\t\tregion.searcher_key = searcher.key;\n\t\t\tfindedRegion = region;\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (findedRegion) return false;\n\t});\n\n\treturn findedRegion;\n};\n\n/**\n * Открыть диалоговое окно с выбором нескольких регионов\n *\n * @see import('../dialog_regionSelectorRegions/types').Props\n */\nexport const dialogRegionSelector = useAsyncTopDialog(() => {\n\treturn import('@/components/project/regionSelector/dialog_regionSelectorRegions/dialog_regionSelectorRegions.vue');\n});\n","import { computed, type ComputedRef, ref } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, SearcherByKey } from '../types';\nimport type { Option, Options } from '@/components/forms/select/types';\nimport { dummyIndex, searhcerCompareKey } from '../utils/consts';\nimport { getSearcherGIcon } from '@/core/utils/searchers';\n\n/**\n * Создание и управление реактивными переменными для выбора ПС\n *\n * @param props - входные props компонента\n * @param mapSearchers - Map ПС (реактивная)\n */\nexport const useSelectSearcher = (\n\tprops: Props,\n\tmapSearchers: ComputedRef<SearcherByKey>,\n) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Ключ выбранной поисковой системы\n\t */\n\tconst searcherKey = ref(mapSearchers.value.keys().next().value ?? dummyIndex);\n\n\t/**\n\t * Коллекция опций для выбора ПС\n\t */\n\tconst optionBySearcherKey = computed(() => {\n\t\tconst res: Options = new Map();\n\t\tmapSearchers.value.forEach((searcher) => {\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: searcher.key,\n\t\t\t\ttitle: searcher.name,\n\t\t\t};\n\n\t\t\tif (props.addSearcherIcon) option.icon = getSearcherGIcon(searcher.key);\n\n\t\t\tres.set(searcher.key, option);\n\t\t});\n\n\t\t// добавить режим сравнения, если есть хотя бы одна ПС с одним регионом\n\t\tif (props.addCompare && !res.has(dummyIndex)) {\n\t\t\tconst dummyOption: Option = {\n\t\t\t\tvalue: '',\n\t\t\t\ttitle: '--------------------',\n\t\t\t\tdisabled: true,\n\t\t\t};\n\t\t\tres.set(dummyOption.value, dummyOption);\n\n\t\t\tconst compareOption: Option = {\n\t\t\t\tvalue: searhcerCompareKey,\n\t\t\t\ttitle: i18n.Common.Compare!,\n\t\t\t};\n\t\t\tres.set(compareOption.value, compareOption);\n\t\t}\n\n\t\treturn res;\n\t});\n\n\treturn {\n\t\tsearcherKey,\n\t\toptionBySearcherKey,\n\t};\n};\n","import { computed, type ComputedRef, ref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getDeviceGIcon, getLangLabel } from '@/core/utils/searchers';\nimport type { Option } from '@/components/forms/select/types';\nimport { dummyIndex } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\n\n/**\n * Создание и управление реактивными переменными для выбора региона\n *\n * @param props - входные props компонента\n * @param activeSearcherIndexed - объект активной поисковой системы (реактивная)\n */\nexport const useSelectRegion = (props: Props, activeSearcherIndexed: ComputedRef<SearcherIndexed>) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Индекс выбранного региона\n\t */\n\tconst regionIndex = ref(dummyIndex);\n\n\tif (props.modelValue.length === 1) {\n\t\tregionIndex.value = props.modelValue[0];\n\t}\n\n\tif (regionIndex.value === dummyIndex) {\n\t\tif (props.forMode) {\n\t\t\t// в качестве ключа используется region.key, а не region.index\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.values().next().value?.key ?? dummyIndex;\n\t\t} else {\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.keys().next().value ?? dummyIndex;\n\t\t}\n\t}\n\n\t/**\n\t * Коллекция опций для выбора региона\n\t */\n\tconst optionByRegionIndex = computed(() => {\n\t\tconst options = new Map<number, Option>();\n\n\t\tactiveSearcherIndexed.value.regionByIndex?.forEach((region) => {\n\t\t\tlet regionLabel = region.name;\n\n\t\t\t// на частоту в текущей версии устройство и язык не влияют\n\t\t\t// обратите внимание, в качестве ключа используется region.key, а не region.index\n\t\t\tif (props.forMode) {\n\t\t\t\tconst option: Option = {\n\t\t\t\t\tvalue: region.key,\n\t\t\t\t\ttitle: regionLabel,\n\t\t\t\t};\n\t\t\t\tif (!options.has(region.key)) options.set(region.key, option);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (region.device) {\n\t\t\t\tregionLabel += ' (' + i18n.Common['Device_' + region.device] + ')';\n\t\t\t}\n\n\t\t\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\t\t\tif (langLabel) regionLabel += ' / ' + langLabel;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel,\n\t\t\t\ticon: region.device ? getDeviceGIcon(region.device) : undefined,\n\t\t\t};\n\n\t\t\toptions.set(region.index, option);\n\t\t});\n\n\t\treturn options;\n\t});\n\n\t/**\n\t * Выбор максимально похожего региона в новой коллекции регионов\n\t */\n\twatch(optionByRegionIndex, (optionByRegionIndex, oldOptionByRegionIndex) => {\n\t\tif (props.onlySearcher || regionIndex.value !== undefined && optionByRegionIndex.get(regionIndex.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newRegionIndex = optionByRegionIndex.keys().next().value as Region['index'];\n\t\tif (regionIndex.value === dummyIndex || newRegionIndex === dummyIndex) {\n\t\t\tregionIndex.value = newRegionIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst regionName = (oldOptionByRegionIndex?.get(regionIndex.value) as Option)?.title || '';\n\t\tlet regionMatchLevel = -1;\n\t\tfor (const [index, option] of optionByRegionIndex.entries()) {\n\t\t\tconst title = (option as Option).title;\n\n\t\t\tif (typeof title !== 'string' || typeof index === 'string') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// полное совпадение\n\t\t\tif (title === regionName) {\n\t\t\t\tnewRegionIndex = index;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst regexpDevice = new RegExp(` \\\\((${i18n.Common['Device_1']}|${i18n.Common['Device_2']})\\\\)`);\n\t\t\tlet regionNameCompare = regionName;\n\t\t\tlet regionMatchLevelI = 3;\n\n\t\t\t// без устройства\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без устройства и без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\t\t\t\tregionNameCompare = regionNameCompare.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\tif (title.indexOf(regionNameCompare) === -1) continue;\n\t\t\tif (regionMatchLevelI <= regionMatchLevel) continue;\n\n\t\t\tregionMatchLevel = regionMatchLevelI;\n\t\t\tnewRegionIndex = index;\n\t\t}\n\n\t\tregionIndex.value = newRegionIndex;\n\t});\n\n\treturn {\n\t\tregionIndex,\n\t\toptionByRegionIndex,\n\t};\n};\n","import { type ComputedRef, ref, watch } from 'vue';\nimport type { Props, SearcherByKey } from '../types';\n\n/**\n * Создание и управление реактивными переменными для сравнения\n *\n * @param props - входные props компонента\n * @param searcherByKey - Map ПС (реактивная)\n * @param allRegionsIndexes - Все доступные индексы регионов (реактивная)\n */\nexport const useCompare = (props: Props, searcherByKey: ComputedRef<SearcherByKey>, allRegionsIndexes: ComputedRef<Set<number>>) => {\n\t/**\n\t * Индексы регионов/ПС в сравнение\n\t */\n\tconst regionsIndexes = ref<number[]>([]);\n\n\t/**\n\t * Загрузка индексов регионов для сравнения\n\t *\n\t * Если в modelValue передано несколько регионов, они будут установлены как выбранные для сравнения\n\t */\n\tconst compareLoad = () => {\n\t\tif (props.onlySearcher && searcherByKey.value) {\n\t\t\tregionsIndexes.value = Array.from(searcherByKey.value.keys());\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionsIndexesSaved: Props['modelValue'] = [];\n\n\t\tif (props.modelValue.length > 1) {\n\t\t\tregionsIndexesSaved = [...props.modelValue];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\t// загрузить индексы регионов, если они были сохранены\n\t\t\t\tregionsIndexesSaved = JSON.parse(\n\t\t\t\t\tlocalStorage.getItem('ui:project:regionSelector' + props.projectId + ':regionsIndexes') as string,\n\t\t\t\t) ?? [];\n\t\t\t} catch (e) {\n\n\t\t\t}\n\t\t}\n\n\t\t// убрать из сравнения регионы, которых нет в props.searchers\n\t\tif (regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = regionsIndexesSaved.filter((regionIndex) => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\t// если не сохранено ни одного региона, выбрать все регионы проекта\n\t\tif (!regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = Array.from(allRegionsIndexes.value);\n\t\t}\n\n\t\tregionsIndexes.value = [...regionsIndexesSaved];\n\t};\n\n\t/**\n\t * Сохранение выбранных регионов\n\t */\n\tconst compareSave = () => {\n\t\tif (regionsIndexes.value.length) {\n\t\t\tlocalStorage.setItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes', JSON.stringify(regionsIndexes.value));\n\t\t} else {\n\t\t\tlocalStorage.removeItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes');\n\t\t}\n\t};\n\n\twatch(regionsIndexes, () => {\n\t\tcompareSave();\n\t});\n\n\tif (props.addCompare) {\n\t\t// if (props.compareRegionsIndexes?.length) {\n\t\t// \tcompareRegionsIndexes.value = [...props.compareRegionsIndexes];\n\t\t// } else {\n\t\t// \tcompareLoad();\n\t\t// }\n\n\t\tcompareLoad();\n\t}\n\n\treturn {\n\t\tregionsIndexes,\n\t};\n};\n","import { computed, watch } from 'vue';\nimport { findRegion, genSearcherByKey } from '../utils/utils';\nimport { dummyIndex, globalRegionIndex, searcherUndefined, searhcerCompareKey } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\nimport { useSelectSearcher } from './selectSearcher';\nimport { useSelectRegion } from './selectRegion';\nimport { useCompare } from './compare';\n\n/**\n * Создание и управления рективными переменными компонента\n *\n * @param props - входные props компонента\n */\nexport const useSelectorRegion = (props: Props) => {\n\tconst searcherByKey = computed(() => {\n\t\treturn genSearcherByKey(props.forMode, props.autoRegion, props.searchers);\n\t});\n\n\tconst activeSearcherIndexed = computed(() => {\n\t\treturn searcherByKey.value.get(selectSearcher.searcherKey.value) || searcherUndefined;\n\t});\n\n\t/**\n\t * Все индексы регионов из searcherByKey\n\t *\n\t * Активность регионов определяется в searcherByKey\n\t */\n\tconst allRegionsIndexes = computed(() => {\n\t\tconst regionsIndexes = new Set<number>();\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\tregionsIndexes.add(region.index);\n\t\t\t});\n\t\t});\n\n\t\treturn regionsIndexes;\n\t});\n\n\tconst selectSearcher = useSelectSearcher(props, searcherByKey);\n\tconst selectRegion = useSelectRegion(props, activeSearcherIndexed);\n\tconst compare = useCompare(props, searcherByKey, allRegionsIndexes);\n\n\t// контроль за внешним изменением списка ПС\n\twatch(searcherByKey, () => {\n\t\t// возможные значения для сравнения регионов/пс\n\t\tif (props.onlySearcher) {\n\t\t\tcompare.regionsIndexes.value = Array.from(searcherByKey.value.keys());\n\t\t} else {\n\t\t\tcompare.regionsIndexes.value = compare.regionsIndexes.value.filter(regionIndex => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey) return;\n\n\t\tlet newSearcherKey = searcherByKey.value.keys().next().value;\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t// определить выбранную ПС\n\t\t\tif (props.onlySearcher && searcher.key === selectSearcher.searcherKey.value) {\n\t\t\t\tnewSearcherKey = selectSearcher.searcherKey.value;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tselectRegion.regionIndex.value &&\n\t\t\t\tsearcher.regionByIndex?.has(selectRegion.regionIndex.value)\n\t\t\t) {\n\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t}\n\n\t\t\t// выбрать первую ПС с выбранным регионом\n\t\t\tif (!props.onlySearcher) {\n\t\t\t\tlet regionsNewSearcher: SearcherIndexed['regionByIndex'] | undefined;\n\n\t\t\t\tif (newSearcherKey !== undefined) {\n\t\t\t\t\tregionsNewSearcher = searcherByKey.value.get(newSearcherKey)?.regionByIndex;\n\t\t\t\t}\n\n\t\t\t\tconst regionsCurrentSearcher = searcherByKey.value.get(searcher.key)?.regionByIndex;\n\t\t\t\tif (\n\t\t\t\t\tregionsNewSearcher?.has(dummyIndex) &&\n\t\t\t\t\t!regionsCurrentSearcher?.has(dummyIndex)\n\t\t\t\t) {\n\t\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// if (props.addCompare && !selectSearcher.optionBySearcherKey.value.has(dummyIndex)) {\n\t\t// \tif (!selectRegion.regionIndex.value && compare.regionsIndexes.value?.length) newSearcherKey = searhcerCompareKey;\n\t\t// }\n\n\t\t// if (props.onlySearcher && selectRegion.regionIndex.value !== dummyIndex) newSearcherKey = selectRegion.regionIndex.value;\n\n\t\tif (newSearcherKey !== undefined) {\n\t\t\tselectSearcher.searcherKey.value = newSearcherKey;\n\t\t}\n\n\t\tif (\n\t\t\tselectRegion.regionIndex.value !== undefined &&\n\t\t\t!(activeSearcherIndexed.value?.regionByIndex)?.has(selectRegion.regionIndex.value)\n\t\t) {\n\t\t\tselectRegion.regionIndex.value = activeSearcherIndexed.value?.regions?.keys().next().value as number;\n\t\t}\n\t}, { immediate: true });\n\n\tconst getSearcherKey = () => {\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey || selectSearcher.searcherKey.value === dummyIndex) return;\n\n\t\treturn selectSearcher.searcherKey.value;\n\t};\n\n\tconst getRegionIndex = () => {\n\t\tif (props.onlySearcher) return;\n\n\t\tif (selectRegion.regionIndex.value === dummyIndex) return;\n\n\t\tlet res: Region['index'] | undefined = selectRegion.regionIndex.value;\n\n\t\t// в качестве ключа используется region.key\n\t\tif (props.forMode) {\n\t\t\tconst regionKey = selectRegion.regionIndex.value;\n\t\t\tconst region = findRegion(props.forMode, { searcher_key: getSearcherKey(), key: regionKey } as Region, props.searchers);\n\n\t\t\tres = region?.index;\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Получить выбранную ПС\n\t */\n\tconst getSearcher = () => {\n\t\tconst searcherKey = getSearcherKey();\n\t\tif (searcherKey === undefined) return;\n\n\t\treturn searcherByKey.value.get(searcherKey);\n\t};\n\n\t/**\n\t * Получить выбранный регион\n\t */\n\tconst getRegion = () => {\n\t\tconst regionIndex = getRegionIndex();\n\t\tif (regionIndex === undefined) return;\n\n\t\treturn getSearcher()?.regionByIndex?.get(regionIndex);\n\t};\n\n\treturn {\n\t\tselectSearcher,\n\t\tselectRegion,\n\t\tcompare,\n\n\t\tsearcherByKey,\n\t\tallRegionsIndexes,\n\n\t\tgetSearcher,\n\t\tgetRegion,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { watch } from 'vue';\nimport type { Props, Region } from './types';\nimport Select from '@/components/forms/select/select.vue';\nimport Button from '@/components/forms/button/button.vue';\nimport { useSelectorRegion } from './composables/selectorRegion';\nimport { dummyIndex, globalRegionIndex, searhcerCompareKey } from './utils/consts';\nimport { dialogRegionSelector } from '@/components/project/regionSelector/utils/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsearchers: () => [],\n\t// compareRegionsIndexes: () => [],\n\taddSearcherIcon: true,\n\taddRegionIcon: true,\n\taddChanger: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\nconst modelSingle = defineModel<Props['modelValueSingle']>('modelValueSingle');\n\nconst {\n\tselectSearcher,\n\tselectRegion,\n\tcompare,\n\n\tsearcherByKey,\n\tallRegionsIndexes,\n\n\tgetSearcher,\n\tgetRegion,\n} = useSelectorRegion(props);\n\nconst onClickCompare = () => {\n\tconst regions: Region[] = [];\n\n\tsearcherByKey.value.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (!region.enabled) return;\n\n\t\t\tregions.push(region);\n\t\t});\n\t});\n\n\tdialogRegionSelector.open('regions', {\n\t\tregions,\n\t\tregionsIndexes: compare.regionsIndexes.value,\n\t\t'@update:regionsIndexes': (regionsIndexes: number[]) => compare.regionsIndexes.value = regionsIndexes,\n\t});\n};\n\nwatch([selectRegion.regionIndex, selectSearcher.searcherKey, compare.regionsIndexes], () => {\n\tif (selectSearcher.searcherKey.value === searhcerCompareKey && compare.regionsIndexes.value.length) {\n\t\tif (JSON.stringify(model.value) === JSON.stringify(compare.regionsIndexes.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tmodel.value = [...compare.regionsIndexes.value];\n\t} else {\n\t\tif (props.onlySearcher) {\n\t\t\tmodel.value = [selectSearcher.searcherKey.value];\n\n\t\t\tif (selectSearcher.searcherKey.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t} else {\n\t\t\tmodel.value = [selectRegion.regionIndex.value];\n\n\t\t\t// не добавлять несуществующий регион в результаты\n\t\t\tif (selectRegion.regionIndex.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t}\n\t}\n\n\t// регионов нет\n\tif (!props.onlySearcher && !allRegionsIndexes.value.size) {\n\t\tselectSearcher.searcherKey.value = dummyIndex;\n\t}\n});\n\nif (modelSingle.value) {\n\twatch(modelSingle, () => {\n\t\tif (modelSingle.value) {\n\t\t\tmodel.value = [modelSingle.value];\n\t\t}\n\t}, { immediate: true });\n}\n\nwatch(model, () => {\n\tif (model.value[0]) {\n\t\tmodelSingle.value = model.value[0];\n\t}\n\n\t// проверка входных данных v-model на корректность\n\tif (props.onlySearcher) {\n\t\tif (\n\t\t\t!model.value.length ||\n\t\t\tmodel.value.length === 1 && !searcherByKey.value.has(model.value[0]) ||\n\t\t\tmodel.value.length === 1 && model.value[0] === dummyIndex && !props.autoRegion\n\t\t) {\n\t\t\tlet defaultKey: number | undefined = searcherByKey.value.keys().next().value;\n\n\t\t\t// запретить устанавливать несуществующий регион\n\t\t\tif (defaultKey === dummyIndex && !props.autoRegion) {\n\t\t\t\tdefaultKey = undefined;\n\n\t\t\t\tmodelSingle.value = dummyIndex;\n\t\t\t}\n\n\t\t\tif (defaultKey !== undefined) {\n\t\t\t\tmodel.value = [defaultKey];\n\t\t\t}else{\n\t\t\t\tmodel.value.length = 0;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmodel.value.length > 1 &&\n\t\t\tJSON.stringify(model.value) !== JSON.stringify(compare.regionsIndexes.value)\n\t\t) {\n\t\t\tmodel.value = [...compare.regionsIndexes.value];\n\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlet newModel = [...new Set(model.value)];\n\n\t\tlet defaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.keys().next().value;\n\t\tif (props.forMode) {\n\t\t\tdefaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.values().next().value?.key;\n\t\t}\n\n\t\t// запретить устанавливать несуществующий регион\n\t\tif (defaultIndex === dummyIndex && !props.autoRegion) {\n\t\t\tdefaultIndex = undefined;\n\n\t\t\tmodelSingle.value = dummyIndex;\n\t\t}\n\n\t\tif (!newModel.length) {\n\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t} else if (newModel.length === 1) {\n\t\t\tlet all = allRegionsIndexes.value;\n\n\t\t\tif (props.forMode) {\n\t\t\t\tall = new Set();\n\t\t\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\t\t\tall.add(region.key);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// убрано, так как dummyIndex запрещено выбирать в model\n\t\t\t// if (!all.has(newModel[0]) && newModel[0] !== dummyIndex) {\n\t\t\tif (!all.has(newModel[0])) {\n\t\t\t\tnewModel = [];\n\t\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewModel = newModel.filter(index => allRegionsIndexes.value.has(index));\n\t\t\tif (!newModel.length && defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (JSON.stringify(model.value) !== JSON.stringify(newModel)) {\n\t\t\tmodel.value = newModel;\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// входные данные v-model совпадают с внутренними значениями\n\tif (\n\t\tmodel.value.length === 1 &&\n\t\tmodel.value[0] === (props.onlySearcher ? selectSearcher.searcherKey.value : selectRegion.regionIndex.value)\n\t) {\n\t\treturn;\n\t}\n\n\t// if (\n\t// \tmodel.value.length > 1 &&\n\t// \tselectorSearcher.searcherKey.value === searhcerCompareKey &&\n\t// \tJSON.stringify(model.value) === JSON.stringify(selectorCompare.regionsIndexes.value)\n\t// ) {\n\t// \treturn;\n\t// }\n\n\t// обновление regionIndex, searcherKey, selectorCompare.regionsIndexes\n\tif (props.onlySearcher) {\n\t\t// if (!model.value.length) {\n\t\t// \tselectorSearcher.searcherKey.value = dummyIndex;\n\t\t//\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (model.value.length === 1) {\n\t\t\tselectSearcher.searcherKey.value = model.value[0];\n\n\t\t\treturn;\n\t\t}\n\n\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\n\t\treturn;\n\t} else {\n\t\tif (!model.value.length) {\n\t\t\t// selectSearcher.searcherKey.value = dummyIndex;\n\t\t\t// selectRegion.regionIndex.value = dummyIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (model.value.length === 1 && selectSearcher.searcherKey.value !== searhcerCompareKey) {\n\t\t\tselectRegion.regionIndex.value = model.value[0];\n\n\t\t\tlet newSearherKey: number | undefined;\n\t\t\tfor (const searcher of searcherByKey.value.values()) {\n\t\t\t\tfor (const region of searcher.regionByIndex.values()) {\n\t\t\t\t\tconst currentRegionIndex = props.forMode ? region.key : region.index;\n\t\t\t\t\tif (currentRegionIndex === selectRegion.regionIndex.value) {\n\t\t\t\t\t\tnewSearherKey = searcher.key;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\tselectSearcher.searcherKey.value = newSearherKey;\n\t\t\t}\n\t\t} else {\n\t\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\t\t\tcompare.regionsIndexes.value = [...model.value];\n\t\t}\n\t}\n}, { immediate: true });\n\ndefineExpose({\n\tgetSearcher,\n\tgetRegion,\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-regionSelector': true,\n\t\t\t'top-regionSelector-onlySearcher': onlySearcher,\n\t\t}\"\n\t>\n\t\t<Select\n\t\t\t:options=\"selectSearcher.optionBySearcherKey.value\"\n\t\t\tv-model=\"selectSearcher.searcherKey.value\"\n\t\t\tname=\"searcher_key\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t/>\n\n\t\t<Select\n\t\t\tv-if=\"!onlySearcher && selectSearcher.searcherKey.value !== searhcerCompareKey\"\n\t\t\tclass=\"top-select-region\"\n\t\t\t:options=\"selectRegion.optionByRegionIndex.value\"\n\t\t\tv-model=\"selectRegion.regionIndex.value\"\n\t\t\t:name=\"forMode ? 'region_key' : 'region_index'\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t\t:data-top-icon=\"addRegionIcon ? '' : undefined\"\n\t\t/>\n\n\t\t<Button\n\t\t\tv-if=\"addCompare && !onlySearcher && selectSearcher.searcherKey.value === searhcerCompareKey\"\n\t\t\tname=\"compare\"\n\t\t\t@click=\"onClickCompare\"\n\t\t\t:data-count-compare-regions-indexes=\"compare.regionsIndexes.value.length\"\n\t\t>\n\t\t\t{{ $i18n.Common.Selected_regions }}\n\t\t</Button>\n\t</div>\n</template>\n\n<style>\n@import \"./styles/searcherColors.css\";\n\n.top-regionSelector {\n\twidth: 340px;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n\n.top-regionSelector > .top-select {\n\tflex-grow: 1;\n}\n\n.top-regionSelector > .top-select:focus-within {\n\tz-index: 4;\n}\n\n.top-regionSelector > .top-select > .top-select_select:hover,\n.top-regionSelector > .top-select > .top-select_select.top-error {\n\tz-index: 1;\n}\n\n.top-regionSelector > .top-select-searcher_key {\n\twidth: 140px;\n\tmax-width: 160px;\n\tmargin-right: -1px;\n}\n\n.top-regionSelector > .top-select-region > select {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.top-regionSelector > .top-select-region {\n\t--top-icon-size: 20px;\n\t--top-icon-color: var(--color-text-primary);\n\n\t--top-icon2-size: 20px;\n\t--top-icon2-color: var(--color-text-primary);\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2] {\n\t--top-icon2-size: 16px;\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2]:after {\n\ttext-indent: -4px;\n}\n\n.top-regionSelector > [name=\"compare\"] {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\tflex-grow: 1;\n}\n\n.top-regionSelector > [name=\"compare\"]:after {\n\tcontent: \"(\" attr(data-count-compare-regions-indexes) \")\";\n\tmargin: 0 0 0 6px;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key > select {\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\tmargin-right: 0;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key[data-value=\"-1\"] > select {\n\tborder-right: none;\n}\n\n.top-regionSelector-onlySearcher {\n\twidth: 140px;\n}\n</style>\n","// Генерация плоского массива объектов папок с заполнением childsIds и счетчиков\nimport type { Folder, FolderTree } from './types';\nimport type { Props } from '../types';\nimport { useI18n } from '@/core/app';\n\nexport const folderDefault: Folder = {\n\tid: 0,\n\tname: '/',\n\tpath: '/',\n};\n\n/**\n * Сгенерировать объект корневой папки для компонента\n *\n * Содержит измененное имя\n *\n * Необходимо предустанавливать для минимизации `rerender`\n */\nexport const genRootFolder = (folders: FolderTree | undefined, useSelectAll: boolean) => {\n\tlet rootFolder = folders?.['root'][0] ?? folderDefault;\n\trootFolder = { ...rootFolder };\n\n\trootFolder.name = genRootFolderName(useSelectAll);\n\n\treturn rootFolder;\n};\n\nexport function genRootFolderName(useSelectAll: boolean) {\n\tif (useSelectAll) {\n\t\treturn useI18n()?.Common.All_folders;\n\t} else {\n\t\treturn '/ (' + useI18n()?.Keywords.Root_folder + ')';\n\t}\n}\n\n/**\n * Сгенерировать плоский список папок\n *\n * В `folders` должен передаваться список всех папок, дозагрузка не предусмотрена\n */\nexport const genFlat = (\n\tfolderById: NonNullable<Props['folders']>,\n\tuseSelectAll: boolean,\n\tresultFolders = new Map<Folder['id'], Folder>(),\n\tparentFolder: Folder = { id: 'root' } as unknown as Folder,\n\tdepth = 0,\n) => {\n\tparentFolder.childsIds = [];\n\n\tif (parentFolder.id) {\n\t\tparentFolder.countAllGroupsActive = parentFolder.count_groups_active;\n\t}\n\n\tif (!folderById[parentFolder.id]) {\n\t\treturn resultFolders;\n\t}\n\n\tfolderById[parentFolder.id].forEach((folder) => {\n\t\tfolder = { ...folder };\n\n\t\tparentFolder.childsIds!.push(folder.id);\n\n\t\tif (folder.id === 0) folder.name = genRootFolderName(useSelectAll);\n\n\t\tconst prefix = depth > 1 ? '-'.repeat(depth - 1) + ' ' : '';\n\t\tif (prefix && !folder.name.startsWith(prefix)) folder.name = prefix + folder.name;\n\n\t\tresultFolders.set(folder.id, folder);\n\n\t\tgenFlat(folderById, useSelectAll, resultFolders, folder, depth + 1);\n\n\t\tparentFolder.childsIds = parentFolder.childsIds!.concat(folder.childsIds!);\n\n\t\tif (parentFolder.id && folder.count_groups_active) {\n\t\t\tparentFolder.countAllGroupsActive! += folder.count_groups_active;\n\t\t}\n\t});\n\n\treturn resultFolders;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetFolders = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/folders/`, ['id', 'parent_id', 'name', 'path']).changeParams({ orders: ['ord_path'] as any, limit: 100 });\n};\n","import { watch, type WatchOptions, type WatchSource, type WatchStopHandle } from 'vue';\n\ntype UnwrapSource<T> = T extends WatchSource<infer V>\n\t? V\n\t: T extends object ? T : never;\n\ntype Changes<T> = Partial<{\n\t[K in keyof T]: {\n\t\told: UnwrapSource<T[K]> | undefined;\n\t\tnew: UnwrapSource<T[K]>\n\t}\n}>;\n\n/**\n * useWatch — расширенный `watch` с измененным callback\n * - принимает объект с реактивными свойствами, точно такими же, как при указании в массиве в стандартном `watch`\n * - callback возвращает изменившиеся свойства в объекте `changes` с `{old, new}`\n *\n * Если у вас есть несколько `watch`, которые меняют одно состояние, то могут возникнуть проблемы:\n * - рост длины цепочек `watch`, когда один `watch` приводит к срабатыванию другого\n * - лишние вызовы при согласованных состояниях, когда разные `watch` устанавливают одно и то же значение\n * - гонка при несогласованных состояниях, когда разные `watch` в разные тики при этом одновременно могут устанавливать разные состояния\n *\n * Если у вас такой случай и его нельзя упростить, то используйте `useWatch`, в остальных случаях используйте только стандартный `watch`\n *\n * @example\n *\n * ```js\n *\n * useWatch({ a: ref(5), b: ref('word') }, (changes) => {\n * \tconsole.log(changes.a?.new, changes.a?.old);\n * \tconsole.log(changes.b?.new, changes.b?.old);\n * });\n * ```\n */\nexport function useWatch<T extends Record<string, WatchSource>>(\n\tsourcesObj: T,\n\tcb: (\n\t\tchanges: Changes<T>,\n\t\tonCleanup: (fn: () => void) => void,\n\t) => void | Promise<void>,\n\toptions?: WatchOptions,\n): WatchStopHandle {\n\tconst keys = Object.keys(sourcesObj) as (keyof T)[];\n\tconst sources = keys.map(k => sourcesObj[k]);\n\n\treturn watch(sources, (newValues, oldValues, onCleanup) => {\n\t\tconst changed = {} as Changes<T>;\n\n\t\tnewValues.forEach((val, i) => {\n\t\t\tif (!Object.is(val, oldValues[i])) {\n\t\t\t\tconst k = keys[i];\n\n\t\t\t\tchanged[k] = {\n\t\t\t\t\told: oldValues[i],\n\t\t\t\t\tnew: val,\n\t\t\t\t} as any;\n\t\t\t}\n\t\t});\n\n\t\tif (Object.keys(changed).length) cb(changed, onCleanup);\n\t}, options);\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { folderDefault, genApiGetFolders, genFlat, genRootFolderName } from './utils';\nimport { apiSetSearchParamsFilter } from '@/components/formsExt/formsExt';\nimport { useWatch } from '@/core/utils/composables/useWatch';\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddIcon: true,\n});\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<NonNullable<Props['folder']>>('folder', { default: folderDefault });\n\nconst apiGet = props.client && !props.folders ? genApiGetFolders(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n// Настройка API\nwatch(() => props.projectId, () => {\n\tapiGet?.changeParams({\n\t\tproject_id: props.projectId,\n\t});\n\n\tapiGet?.setOptions({\n\t\tcheckFingerprint: 'TopGroupSelectorFolders:' + props.projectId,\n\t});\n\n\trefSelector.value?.resetCache();\n}, { immediate: true });\n\n/**\n * Плоский список папок\n */\nconst foldersFlat = computed(() => {\n\treturn genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAll);\n});\n\n/**\n * Нормализовать корневую папку\n *\n * Нужно только для замены \"Корневая папка\" на \"Все папки\"\n *\n * @note Другие решения с подменой `name` не сработают, так как API сохраняет items в cache, который менять нельзя\n */\nconst prepareItemsBeforeRender = (items: Item[]) => {\n\tif (props.canSelectAll && items[0]?.id === 0) {\n\t\titems[0] = {\n\t\t\t...items[0],\n\t\t\tname: genRootFolderName(true),\n\t\t};\n\t}\n\n\treturn items;\n};\n\n/**\n * Проверка входного значения `modelFolderId` и изменение `modelFolder`\n *\n * Определяем существует ли папка:\n * - Если существует: меняем папку на указанную\n * - Если не существует: устанавливаем Корневую папку\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelFolder,\n\tmodelFolderId,\n}, async (changes) => {\n\tif (modelFolderId.value === modelFolder.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelFolder`\n\tif (changes.modelFolder && !changes.modelFolderId) {\n\t\tmodelFolderId.value = modelFolder.value.id;\n\n\t\treturn;\n\t}\n\n\tlet folderSelected = foldersFlat.value.get(props.folderId);\n\tif (!folderSelected) folderSelected = folderDefault;\n\n\tmodelFolder.value = folderSelected;\n\tmodelFolderId.value = folderSelected.id;\n\n\t// /**\n\t// * Для не api\n\t// */\n\t// if (props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n\t//\n\t// /**\n\t// * Для api проверка не делается\n\t// */\n\t// if (!props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n}, { immediate: true });\n</script>\n\n<template>\n\t<Selector2\n\t\tclass=\"top-groupSelector_folder\"\n\t\tv-model=\"modelFolder\"\n\t\t:items=\"folders ? [...foldersFlat.values()] : undefined\"\n\t\tsearch-type=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"folders ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:prepareItemsBeforeRender\n\t\t:addChanger\n\t\tuseCache\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div v-html=\"item.name.replaceAll(/</g, '< ')\"></div>\n\t\t</template>\n\t</Selector2>\n</template>\n","import type { Folder } from '../folders/types';\nimport type { Group, Props } from './types';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { folderDefault } from '../folders/utils';\nimport { ITEM_ID_ALL } from '@/components/formsExt/selector2/utils';\n\n/**\n * Элемент - группа ненайдена\n *\n * Указывается несуществующий id\n */\nexport const groupNone: Group = {\n\tid: -1,\n\tname: '--',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент для выбора всех групп\n */\nexport const groupAll: Group = {\n\tid: ITEM_ID_ALL,\n\tname: 'All groups',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент - `Все группы`\n */\nexport const genGroupAll = () => {\n\tgroupAll.name = useI18n()?.Common.All_groups;\n\n\treturn groupAll;\n};\n\n/**\n * Элемент - `Выберите группу`\n */\nexport const genGroupPlaceholder = () => {\n\tgroupAll.name = useI18n()?.Keywords.Choose_group;\n\n\treturn groupAll;\n};\n\n/**\n * Сгенерировать список групп для TopSelector\n */\nexport const genItems = (groups: Group[], on?: boolean, folderForFilter?: Folder) => {\n\tgroups = [...groups];\n\n\t// фильтр по активности\n\tif (on !== undefined) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn group.on == Number(on);\n\t\t});\n\t}\n\n\t// фильтр по папке\n\tif (folderForFilter && folderForFilter.id && folderForFilter.childsIds) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn (\n\t\t\t\tgroup.folder_id === folderForFilter.id ||\n\t\t\t\tfolderForFilter.childsIds!.includes(group.folder_id)\n\t\t\t);\n\t\t});\n\t}\n\n\treturn groups;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/groups/`, ['id', 'name', 'folder_id', 'folder_path']).changeParams({ folder_id_depth: true, limit: 100 });\n};\n\n/**\n * Создать API запрос на добавление групп\n */\nexport const genApiAddGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/add/${service}/groups/`);\n};\n\n/**\n * Создать API запрос на удаление группы\n */\nexport const genApiDelGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/del/${service}/groups/`);\n}\n\n/**\n * Создать API запрос на переименование группы\n */\nexport const genApiEditGroupsRename = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/edit/${service}/groups/rename/`);\n}\n","<script setup lang=\"ts\">\nimport { computed, reactive, ref } from 'vue';\nimport { useWatch } from '@/core/utils/composables/useWatch';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport PopupConfirm from '@/components/popup/popupConfirm/popupConfirm.vue';\nimport PopupPrompt from '@/components/popup/popupPrompt/popupPrompt.vue';\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport { apiSetSearchParamsFilter, ITEM_ID_ALL, ITEM_ID_NEW } from '@/components/formsExt/formsExt';\nimport type { Emits, Group, Props } from './types';\nimport {\n\tgenApiAddGroups,\n\tgenApiDelGroups,\n\tgenApiEditGroupsRename,\n\tgenApiGetGroups,\n\tgenGroupAll,\n\tgenGroupPlaceholder,\n\tgenItems,\n\tgroupNone,\n} from './utils';\nimport { genFieldFilter } from '@/api/api/index';\nimport { folderDefault } from '../folders/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tautoselect: 'first',\n\taddChanger: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\n\nconst emits = defineEmits<Emits>();\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { required: true });\n\nconst apiGet = props.client && !props.groups ? genApiGetGroups(props.client, props.service) : undefined;\nconst apiAdd = props.client ? genApiAddGroups(props.client, props.service) : undefined;\nconst apiDel = props.client ? genApiDelGroups(props.client, props.service) : undefined;\nconst apiEditRename = props.client ? genApiEditGroupsRename(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n/**\n * Группы выбранной папки\n */\nconst groupsBySelectedFolder = computed(() => {\n\tif (props.groups === undefined) return undefined;\n\n\treturn genItems(props.groups, props.on, props.folder);\n});\n\nconst filterByFolder = genFieldFilter('folder_id', 'EQUALS', [props.folder?.id ?? 0]);\n\napiGet?.changeParams({\n\tproject_id: props.projectId,\n\tfolder_id_depth: true,\n\tfilters: [\n\t\tfilterByFolder,\n\t],\n});\n\nif (props.on !== undefined) {\n\tapiGet?.params.filters?.push(genFieldFilter('on', 'EQUALS', [Number(props.on)]));\n}\n\n/**\n * Синхронная установка группы и id группы\n *\n * Id рекомендуется вместе с группой\n * - для согласованной смены состояния\n * - для уменьшения цепочки `watch` синхронизации состояний `modelGroupId` и `modelGroup`\n *\n * Пример несогласованности: если передать `modelGroup` и значение `modelGroupId`, которое ему не соответствует, то попытка установить ту же самую группу в `modelGroup` не приведет к смене `modelGroupId`\n */\nconst setGroup = (group: Props['group']) => {\n\tmodelGroup.value = group;\n\tmodelGroupId.value = group.id;\n};\n\n/**\n * Сбросить кэш\n *\n * @param resetAPICache - Сбросить API кэш\n */\nconst resetCacheSelector = (resetAPICache = false) => {\n\trefSelector.value?.resetCache(resetAPICache);\n};\n\n// Настройка API, обработка смены папки и выбор всех групп\nuseWatch({\n\tprojectId: () => props.projectId,\n\tfolderId: () => props.folder?.id,\n\tcanSelectAll: () => props.canSelectAll,\n}, (changes) => {\n\t// Настройка API\n\tif (changes.projectId) {\n\t\tapiGet?.changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t});\n\n\t\tapiGet?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorGroups:' + props.projectId,\n\t\t});\n\t}\n\n\t// Обработка смены папки\n\tif (changes.folderId) {\n\t\tfilterByFolder.values = [\n\t\t\tprops.folder?.id ?? 0,\n\t\t];\n\t}\n\n\tresetCacheSelector();\n\n\t/**\n\t * При смене папки автоматически выбирать нужную группу с учетом `props.autoselect`\n\t *\n\t * Новая группа, при смене папки не меняется\n\t */\n\tif (\n\t\t(changes.folderId?.old !== undefined || changes.canSelectAll?.old !== undefined) &&\n\t\tmodelGroupId.value !== ITEM_ID_NEW\n\t) {\n\t\tlet group: Props['group'] | undefined;\n\n\t\tif (props.autoselect === 'first') {\n\t\t\tgroup = groupsBySelectedFolder.value?.[0];\n\n\t\t\tif (props.canSelectAll) {\n\t\t\t\tgroup = reactive(genGroupAll());\n\t\t\t}\n\t\t}\n\n\t\tif (props.autoselect === 'placeholder' || !group) {\n\t\t\tgroup = genGroupPlaceholder();\n\t\t}\n\n\t\tsetGroup(group);\n\t}\n}, { immediate: true });\n\n/**\n * Проверка входного значения `modelGroupId` и изменение `modelGroup`\n *\n * Определяем существует ли группа:\n * - Если существует: меняем группу на указанную\n * - Если не существует: устанавливаем \"Нет группы\"\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelGroup,\n\tmodelGroupId,\n}, async (changes) => {\n\tif (modelGroupId.value === modelGroup.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelGroup`\n\tif (changes.modelGroup && !changes.modelGroupId) {\n\t\tmodelGroupId.value = modelGroup.value.id;\n\n\t\treturn;\n\t}\n\n\tif (props.canAdd && modelGroupId.value === ITEM_ID_NEW) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Для не api\n\t */\n\tif (props.groups) {\n\t\tlet groupSelected = groupsBySelectedFolder.value?.find((group) => group.id === modelGroupId.value);\n\n\t\tif (!groupSelected && props.canSelectAll) groupSelected = genGroupAll();\n\n\t\tif (groupSelected) {\n\t\t\tsetGroup(groupSelected);\n\t\t} else {\n\t\t\tconst firstGroup = groupsBySelectedFolder.value?.[0];\n\t\t\tif (firstGroup && !modelGroupId.value) {\n\t\t\t\t// группа не была указана, инициализация компонента\n\t\t\t\tsetGroup(firstGroup);\n\t\t\t} else {\n\t\t\t\tsetGroup(groupNone);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Для api\n\t */\n\tif (props.client && !props.groups && (modelGroupId.value || modelGroupId.value === ITEM_ID_ALL && !props.canSelectAll)) {\n\t\tconst api = genApiGetGroups(props.client, props.service).changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t\tid: modelGroupId.value,\n\t\t\tfilters: [\n\t\t\t\tfilterByFolder,\n\t\t\t],\n\t\t});\n\n\t\t/**\n\t\t * @remarks При выборе группы \"Все группы\" или при добавлении группы отмена запроса не происходит\n\t\t */\n\t\tapi?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorFindGroup:' + props.projectId,\n\t\t});\n\n\t\tconst res = await api.call();\n\n\t\t// при отмене запроса, смену группы не выполняем\n\t\tif (!res.errors?.length && !res.result) return;\n\n\t\tif (!res.errors && res.result[0]) {\n\t\t\tsetGroup(res.result[0] as Group);\n\t\t} else {\n\t\t\tsetGroup(groupNone);\n\t\t}\n\t}\n}, { immediate: true });\n\nconst addGroups = async (group: SelectorItem) => {\n\t// просто выбор произвольной группы, без реального добавления\n\tif (props.canAdd !== 'api') return;\n\n\t// при добавлении группы `props.client` обязателен\n\tif (!apiAdd) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiAdd.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\tconst modelGroupOld = modelGroup.value;\n\n\t// Для api\n\tconst res = await apiAdd.changeParams({\n\t\tproject_id: props.projectId,\n\t\tnames: [group.name],\n\t\tto_id: props.folder?.id ?? folderDefault.id,\n\t\tto_type: 'in_folder_last',\n\t}).call();\n\n\tif (res.result) {\n\t\tconst group = res.result[0] as Group;\n\n\t\tsetGroup(group);\n\n\t\temits('addGroup', group);\n\t} else {\n\t\t// вернуть предыдущий выбор в случае ошибки добавления группы\n\t\tsetGroup(modelGroupOld);\n\t}\n\n\trefSelector.value?.resetCache(true);\n};\n\nconst renameGroup = async (group: SelectorItem, newName: string) => {\n\t// при переименовании группы `props.client` обязателен\n\tif (!apiEditRename) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiEditRename.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiEditRename.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t\tname: newName,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t/**\n\t * Свойства Model напрямую менять нельзя\n\t *\n\t * Данный код вообще не нужен, потому что:\n\t * - локальный список групп управляется состоянием компонента через `props.group` и `@update:group`\n\t * - список, обновляемый через API, обновляется через систему кеширования\n\t */\n\t// if (modelGroup.value.id === group.id) {\n\t// \tmodelGroup.value = {\n\t// \t\t...modelGroup.value,\n\t// \t\tname: newName,\n\t// \t};\n\t// }\n\n\temits('editGroup', {\n\t\tid: group.id!,\n\t\tname: newName,\n\t});\n\n\trefSelector.value?.updateCacheItemById(group.id, {\n\t\tname: newName,\n\t});\n};\n\nconst deleteGroups = async (group: SelectorItem) => {\n\t// при удалении группы `props.client` обязателен\n\tif (!apiDel) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiDel.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiDel.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t// при удалении выбранной группа убрать выбор группы\n\tif (modelGroup.value.id === group.id) setGroup(props.canSelectAll ? genGroupAll() : groupNone);\n\n\temits('delGroup', group.id!);\n\n\trefSelector.value?.deleteCacheItemById(group.id);\n};\n\ndefineExpose({\n\tresetCacheGroups: resetCacheSelector,\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-groupSelector_group\"\n\t\tv-model=\"modelGroup\"\n\t\t:items=\"groupsBySelectedFolder ?? groups\"\n\t\tsearchType=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"groups ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:appendSearchToResult=\"!!canAdd\"\n\t\t:useAllItem=\"canSelectAll ? genGroupAll().name : false\"\n\t\t:addChanger\n\t\tuseCache\n\t\t@appendItem=\"addGroups\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-groupSelector_groupItem top-ellipsis1\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\tv-if=\"item.id === ITEM_ID_NEW\"\n\t\t\t\t>\n\t\t\t\t\t{{ $i18n.Common.Add }}:\n\t\t\t\t</div>\n\n\t\t\t\t<!--<span>{{ item.name }}</span>-->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-groupSelector_groupItemName top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.name\"\n\t\t\t\t></span>\n\n\t\t\t\t<!--<span v-if=\"item.folder_path && showPath\" class=\"top-groupSelector_groupItemFolderPath\">-->\n\t\t\t\t<!--\t{{ item.folder_path }}-->\n\t\t\t\t<!--</span>-->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"item.folder_path && showPath\"\n\t\t\t\t\tclass=\"top-groupSelector_groupItemFolderPath top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.folder_path\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template\n\t\t\t#actions=\"{ item }\"\n\t\t\tv-if=\"canEditAndDel && client\"\n\t\t>\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<!-- переименование группы -->\n\t\t\t\t<PopupPrompt\n\t\t\t\t\t:submitText=\"$i18n.Common.Save\"\n\t\t\t\t\t:defaultValue=\"item.name\"\n\t\t\t\t\t:inputProps=\"{ addCleaner: false }\"\n\t\t\t\t\t@submit=\"(value) => renameGroup(item, value)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template #default></template>\n\t\t\t\t</PopupPrompt>\n\n\t\t\t\t<!-- удаление группы -->\n\t\t\t\t<PopupConfirm\n\t\t\t\t\tisWarning\n\t\t\t\t\t:submitText=\"$i18n.Common.Delete\"\n\t\t\t\t\t@submit=\"deleteGroups(item)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<span v-html=\"service === 'keywords_2' ? $i18n.Keywords.Delete_group_warning : $i18n['Ai.Tracker'].Delete_group_warning\"></span>\n\t\t\t\t</PopupConfirm>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-groupSelector_groupItem {\n\tmin-height: 20px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-padding-1);\n}\n\n.top-groupSelector_groupItemFolderPath {\n\twidth: 100%;\n\tcolor: var(--color-text-4);\n\tfont-size: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type ModelRef, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport type { Group } from './groups/types';\nimport Folders from './folders/folders.vue';\nimport Groups from './groups/groups.vue';\nimport { folderDefault, genFlat } from './folders/utils';\nimport { genGroupAll, genGroupPlaceholder, groupNone } from './groups/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tcanSelectAllGroups: false,\n\tautoselect: 'first',\n\taddChanger: true,\n\tshowFolders: true,\n\tshowGroups: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\n\nconst componentGroupsRef = ref<InstanceType<typeof Groups> | null>(null);\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<Props['folder']>('folder');\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { default: groupNone }) as ModelRef<NonNullable<Props['group']>>;\n\nconst emit = defineEmits<Emits>();\n\n/**\n * Выбранная папка\n *\n * Спекулятивное предсказание выбранной папки\n *\n * Если папка не определена, она ставится в `undefined`, чтобы при последующем определении не фиксировались события смены папки, см. `groups.vue`\n */\nconst foldersFlat = genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAllGroups);\nmodelFolder.value = foldersFlat.get(modelFolderId.value);\n\n/**\n * Спекулятивное предсказание выбранной группы, чтобы не было лишней перерисовки\n *\n * Точная проверка происходит в `groups.vue`\n */\nlet groupInitial = props.groups?.find((group) => group.id === modelGroupId.value);\nif (!modelGroupId.value) groupInitial = props.groups?.[0];\nif (props.canSelectAllGroups && !groupInitial) {\n\tgroupInitial = genGroupAll();\n}\nif (props.autoselect === 'placeholder' || !groupInitial) {\n\tgroupInitial = genGroupPlaceholder();\n}\ngroupInitial ??= groupNone;\n\nmodelGroup.value = groupInitial;\n\nconst onAddGroup = (group: Group) => {\n\t// если загрузка групп производится по api, то добавлять новые группы в `props.groups` не нужно\n\tlet groups: Group[] | undefined;\n\n\tif (props.groups && group) {\n\t\tgroups = [...props.groups, group];\n\t}\n\n\temit('update:groups', groups);\n};\n\nconst onEditGroup = (groupEdited: Group) => {\n\t// если загрузка групп производится по api, то обновлять группы в `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groups = props.groups.map((group) => group.id === groupEdited.id ? groupEdited : group);\n\n\temit('update:groups', groups);\n};\n\nconst onDelGroup = (groupDeleted: Group) => {\n\t// если загрузка групп производится по api, то удалять группы из `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groups = props.groups.filter((group) => group.id !== groupDeleted.id);\n\n\temit('update:groups', groups);\n};\n\ndefineExpose({\n\t/**\n\t * Сбросить кэш\n\t *\n\t * @param resetAPICache - Сбросить API кэш\n\t */\n\tresetCacheGroups: (resetAPICache = false) => {\n\t\tcomponentGroupsRef.value?.resetCacheGroups(resetAPICache);\n\t},\n});\n</script>\n\n<template>\n\t<div class=\"top-groupSelector\">\n\t\t<Folders\n\t\t\tv-if=\"showFolders\"\n\t\t\tv-model:folderId=\"modelFolderId\"\n\t\t\tv-model:folder=\"modelFolder\"\n\t\t\t:projectId\n\t\t\t:folders\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:addChanger\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t/>\n\n\t\t<Groups\n\t\t\tv-if=\"showGroups\"\n\t\t\tref=\"componentGroupsRef\"\n\t\t\tv-model:groupId=\"modelGroupId\"\n\t\t\tv-model:group=\"modelGroup\"\n\t\t\t:projectId\n\t\t\t:folder=\"modelFolder\"\n\t\t\t:groups\n\t\t\t:on\n\t\t\t:canAdd=\"canAddGroup\"\n\t\t\t:canEditAndDel=\"canEditAndDelGroup\"\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:autoselect\n\t\t\t:addChanger\n\t\t\t:showPath=\"showGroupsPaths || showFolders\"\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t\t@addGroup=\"onAddGroup\"\n\t\t\t@editGroup=\"onEditGroup\"\n\t\t\t@delGroup=\"onDelGroup\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-groupSelector {\n\tdisplay: inline-flex;\n\tgap: var(--top-padding-1);\n}\n</style>\n","import type { Item, Props } from '@/components/formsExt/selector2/types';\nimport { TopPopupWorker } from '@/components/popup/worker';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\nimport Core from '@/core/core/core';\n\n/**\n * Создать объект заголовка для категории проектов\n */\nconst createProjectCategoryTitles = (name: string): Item => {\n\treturn {\n\t\tid: null,\n\t\tname,\n\t\tlistItemProps: {\n\t\t\ttype: 'title',\n\t\t},\n\t};\n};\n\n/**\n * Состояние вставки заголовков категорий\n *\n * Используется для отслеживания, какие заголовки уже были добавлены в список,\n * чтобы не дублировать их при постраничной загрузке данных\n */\nconst globalTitlesState = {\n\tscheduledUpdate: false,\n\tmanualUpdate: false,\n\tguestProjects: false,\n};\n\n/**\n * Вставить заголовки категорий перед соответствующими группами проектов\n *\n * Использует `globalTitlesState`, оно сохраняется между вызовами, так как проекты подгружаются частями\n *\n * При `useLocalTitlesState` = `true` создаётся временное состояние заголовков для этого вызова функции, не влияющее на глобальное состояние.\n * Используется при поиске проектов, чтобы сохранить исходное состояние заголовков\n */\nconst insertCategoryTitles = (projects: Item[], useLocalTitlesState?: boolean): Item[] => {\n\tconst result: Item[] = [];\n\n\tconst categoriesTitle = {\n\t\tscheduledUpdate: createProjectCategoryTitles(useI18n().Projects.Scheduled_update),\n\t\tmanualUpdate: createProjectCategoryTitles(useI18n().Projects.Manual_update),\n\t\tguestProjects: createProjectCategoryTitles(useI18n().Projects.Guest_projects),\n\t};\n\n\tconst titlesState = useLocalTitlesState ? {\n\t\tscheduledUpdate: false,\n\t\tmanualUpdate: false,\n\t\tguestProjects: false,\n\t} : globalTitlesState;\n\n\tfor (const project of projects) {\n\t\tif (!titlesState.scheduledUpdate && project.right?.startsWith('1') && project.on > 0) {\n\t\t\tresult.push(categoriesTitle.scheduledUpdate);\n\t\t\ttitlesState.scheduledUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.manualUpdate && project.right?.startsWith('1') && project.on === 0) {\n\t\t\tresult.push(categoriesTitle.manualUpdate);\n\t\t\ttitlesState.manualUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.guestProjects && project.right?.startsWith('0') && project.on >= 0) {\n\t\t\tresult.push(categoriesTitle.guestProjects);\n\t\t\ttitlesState.guestProjects = true;\n\t\t}\n\n\t\tresult.push(project);\n\t}\n\n\treturn result;\n};\n\n/**\n * Добавить к данным проектов `listItemProps`\n *\n * @see Item\n */\nconst addListItemProps = (\n\tprojects: Item[],\n) => {\n\treturn projects.map((project) => ({\n\t\t...project,\n\t\tlistItemProps: {\n\t\t\tattrs: { title: project.name },\n\t\t},\n\t}));\n};\n\n/**\n * Подготавить данные проектов для отображения:\n * - сбросить состояние вставки заголовков категорий, если требуется\n * - добавить `listItemProps`\n * - добавить заголовки к категориям\n */\nconst prepareProjects = (\n\tprojects: Item[] | undefined,\n\tresetTitlesState?: boolean,\n\tuseLocalTitlesState?: boolean,\n): Item[] | undefined => {\n\tif (!projects || projects.length === 0) return [];\n\n\tif (resetTitlesState) Object.keys(globalTitlesState).forEach((key) => globalTitlesState[key] = false);\n\n\tconst projectsWithListItem = addListItemProps(projects);\n\treturn insertCategoryTitles(projectsWithListItem, useLocalTitlesState);\n};\n\n/**\n * Добавить к ссылке релевантные hash-параметров текущего проекта\n */\nconst prepareProjectLink = (link: string) => {\n\tlink = link.replace(/#.*/, '');\n\n\tlet hash = location.hash;\n\n\t// Игнорируемые параметры при переходе между проектами\n\thash = hash.replace(/historyView=[^&]*/, '');\n\thash = hash.replace(/modelsKeys=[^&]*/, '');\n\thash = hash.replace(/competitorsIds=[^&]*/, '');\n\thash = hash.replace(/searchersKeys=[^&]*/, '');\n\thash = hash.replace(/regionIndex=[^&]*/, '');\n\thash = hash.replace(/regionsIndexes=[^&]*/, '');\n\thash = hash.replace(/folderId=[^&]*/, '');\n\thash = hash.replace(/groupId=[^&]*/, '');\n\thash = hash.replace(/tags=[^&]*/, '');\n\n\t// Сохранить сортировку по дате последней проверки\n\tif (window['mo']?.getHash && !window['mo'].getHash('dataSort').toString().includes('0000-00-00')) {\n\t\thash = hash.replace(/dataSort=[^&]*/, '');\n\t}\n\n\t// Игнорируемые параметры при переходе между проектами (для pinia)\n\thash = hash.replace(/%22historyView%22:[^,]*,/, '');\n\thash = hash.replace(/%22modelsKeys%22:\\[[^\\]]*\\],/, '');\n\thash = hash.replace(/%22competitorsIds%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22searchersKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22regionIndex%22:[^,]*,/, '');\n\thash = hash.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22folderId%22:[^,]*,/, '');\n\thash = hash.replace(/%22groupId%22:[^,]*,/, '');\n\thash = hash.replace(/%22tagsIds%22:\\[[^\\]]*],/, '');\n\n\t// Сохранить сортировку по дате последней проверки (для pinia)\n\tif (!/%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(hash)) {\n\t\thash = hash.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, '$1');\n\t}\n\n\treturn link + hash;\n};\n\n/**\n * Закрыть попап и выполнить переход на страницу проекта\n */\nexport const navigateToProject = (link: string, event?: PointerEvent) => {\n\tif (event && event.target instanceof HTMLElement) {\n\t\tTopPopupWorker.close(event.target.closest('.top-popup-wrapper')!);\n\t}\n\n\tconst linkWithHash = prepareProjectLink(link);\n\tlocation.href = linkWithHash;\n};\n\n/**\n * Сгенерировать ссылку на проект\n */\nexport const genProjectLink = (projectId: number) => {\n\tconst host = getBaseHost();\n\tconst pathname = location.pathname.split('/');\n\n\tlet prefix = 'project/dynamics/';\n\tlet suffix = '';\n\tif (pathname[1] == 'project') prefix = pathname[1] + '/' + pathname[2] + '/';\n\tif (pathname[2] == 'settings') suffix = location.hash;\n\tif (['watcher', 'indexing', 'sitemap', 'audit', 'direct', 'adwords'].includes(pathname[4])) suffix = pathname[4] + '/';\n\n\treturn 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n};\n\n/**\n * Вернуть базовый хост без поддомена\n */\nexport const getBaseHost = () => {\n\tif (window['page']?.subdomain) {\n\t\treturn window.location.host.replace(window['page']?.subdomain + '.', '');\n\t}\n\n\treturn window.location.host;\n};\n\n/**\n * Сгенерировать ссылку на сайт проекта\n */\nexport const genProjectExternalLink = (url: string) => {\n\tlet link = url.startsWith('http') ? url : 'http://' + url;\n\n\tlink = link.replace(/\"/g, '%22');\n\n\treturn link;\n};\n\n/**\n * Расширяет функционал аналогичной функции в Selector2\n *\n * Добавить фильтр поиска по полям `id`, `name`, `url` в параметры API.\n * Поиск выполняется по строке `search` и по строке с инвертированной раскладкой клавиатуры.\n *\n * @param api - api, которое используется в `TopProjectSelector`\n * @param search - введенная строка поиска\n *\n * @todo Объединить с apiSetSearchParamsFilter() из @/components/formsExt/selector2/utils.ts\n */\nexport const apiSetSearchParamsFilter = (api: NonNullable<Props['api']>, search: string) => {\n\tlet filters = api.params.filters ?? [];\n\n\t// удаление других фильтров по этому полю\n\tfilters = filters.filter((filter) => filter.name !== 'GEN_SEARCH_STRING()');\n\n\tconst searchInvert = invertKeyboardLayout(search);\n\tconst searchPrepared = search.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\tconst searchInvertPrepared = searchInvert.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\n\tif (search) {\n\t\tfilters.push(genFieldFilter('GEN_SEARCH_STRING()', 'REGEXP', [`(${searchPrepared}|${searchInvertPrepared})`]));\n\t}\n\n\tapi.changeParams({ filters });\n};\n\n/**\n * Создать API запрос на получение списка проектов\n *\n * Данные после загрузки преобразуются с помощью `prepareProjects()`\n *\n * @see prepareProjects\n */\nexport const genApiGetProjects = (client: Api.Client<Api.TV.Paths, true>) => {\n\tconst api = client.gen('/get/projects_2/projects/', ['id', 'user_id', 'name', 'url', 'on', 'right']);\n\n\tapi.changeParams({\n\t\tfilters: [\n\t\t\tgenFieldFilter('on', 'GREATER_THAN_EQUALS', [0]),\n\t\t],\n\t\torders: [\n\t\t\tgenFieldOrder('user_id', 'DESC', [Core.state.user.id]),\n\t\t\tgenFieldOrder('on', 'DESC'),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t});\n\n\tapi.options.onApiLoaded = (res, ctx, clientOnApiLoaded) => {\n\t\t// Флаг для сброса глобального состояния заголовков.\n\t\t// Срабатывает при добавлении проекта или полной перезагрузке списка\n\t\tconst needResetTitle = ctx.data.filters.length === 1 && ctx.data.offset === 0 || ctx.data.limit === 1000;\n\n\t\t// Флаг для использования локального состояния заголовков.\n\t\t// Срабатывает при поиске проектов (когда фильтров больше одного),\n\t\t// чтобы не сбрасывать уже вставленные заголовки.\n\t\tconst useLocalTitlesState = ctx.data.limit === 100 && ctx.data.filters.length > 1 ? true : undefined;\n\n\t\tres.result = prepareProjects(res.result as Item[], needResetTitle, useLocalTitlesState);\n\n\t\tclientOnApiLoaded?.(res, ctx);\n\t};\n\n\treturn api;\n};\n\n/**\n * Создать API запрос для добавления проекта\n */\nexport const genApiAddProject = (client: Api.Client<Api.TV.Paths, true>) => {\n\treturn client.gen('/add/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\nimport { computed } from 'vue';\nimport { TopPopup } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst submenuItems = [\n\t{\n\t\thref: `https://${host}/project/keywords/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_phrases,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n\t{\n\t\thref: `https://${host}/project/dynamics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_dynamics,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/snapshots/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_snapshots,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/competitors/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_competitors,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/ai-tracker/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_aiTracker,\n\t\ticon: '',\n\t\tright: '13',\n\t},\n\t{\n\t\thref: `https://${host}/project/analytics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_analytics,\n\t\ticon: '',\n\t\tright: '5',\n\t},\n\t{\n\t\thref: `https://${host}/project/broker/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_broker,\n\t\ticon: '',\n\t\tright: '6',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/sitemap/`,\n\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/audit/`,\n\t\ttitle: i18n.Common.Menu_audit,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/indexing/`,\n\t\ttitle: i18n.Audit.Indexing,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/watcher/`,\n\t\ttitle: i18n.Audit.Watcher,\n\t\ticon: '',\n\t\tright: '9',\n\t},\n\t{\n\t\thref: `https://${host}/project/settings/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_settings,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n];\n\nconst filteredSubmenuItems = computed(() => {\n\tif (!props.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn props.right[item.right] === '1';\n\t});\n});\n</script>\n\n<template>\n\t<TopPopup\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #opener>\n\t\t\t<TopButton\n\t\t\t\tclass=\"top-projectSelectorSubmenu_opener\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t></TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<li\n\t\t\t\tv-for=\"item in filteredSubmenuItems\"\n\t\t\t\tclass=\"top-projectSelectorSubmenu_item\"\n\t\t\t>\n\t\t\t\t<a\n\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:data-right=\"item.right\"\n\t\t\t\t></a>\n\t\t\t</li>\n\n\t\t\t<li class=\"top-projectSelectorSubmenu_item\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"url\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t></a>\n\t\t\t</li>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-projectSelectorSubmenu .top-popup {\n\tmin-width: 170px;\n}\n\n.top-projectSelectorSubmenu ul {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n.top-projectSelectorSubmenu_item {\n\twidth: 32%;\n}\n\n.top-projectSelectorSubmenu_item a {\n\tjustify-content: center;\n}\n\n.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t--top-icon-size: 24px;\n\t--top-icon-width: 32px;\n\n\theight: var(--top-icon-width);\n\tmargin: 0;\n}\n\n.top-projectSelectorSubmenu_item {\n\tflex-grow: 1;\n}\n</style>\n","import type { Item } from '@/components/formsExt/selector2/types';\nimport { ref, shallowRef } from 'vue';\nimport Core from '@/core/core/core';\n\nconst CACHE_KEY = 'ui_project_selector_total';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n *\n * @todo Добавить поддержку моков\n */\nexport const projectsCache = shallowRef<Item[]>();\nexport const resetStateSignal = ref(0);\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\nexport const setCacheTotal = (projectsTotal: number) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY + ':' + Core.state.user.id,\n\t\tJSON.stringify({ projectsTotal, expiresAt: Date.now() + CACHE_TTL }),\n\t);\n};\n\nexport const getCacheTotal = () => {\n\tconst raw = localStorage.getItem(CACHE_KEY + ':' + Core.state.user.id);\n\tif (!raw) return;\n\n\tconst { projectsTotal, expiresAt } = JSON.parse(raw) as Record<string, number>;\n\tif (Date.now() > expiresAt) {\n\t\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.user.id);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\nexport const clearCache = (resetState: boolean = true) => {\n\tprojectsCache.value = undefined;\n\tprojectsRequest.value = null;\n\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.user.id);\n\n\tif (resetState) resetStateSignal.value++;\n};\n","<script setup lang=\"ts\">\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport { validUrl } from '@/core/utils/check';\nimport { ellipsis } from '@/core/utils/string';\nimport { useI18n } from '@/core/plugins/i18n';\nimport Core from '@/core/core/core';\nimport Submenu from './submenu/submenu.vue';\nimport { apiSetSearchParamsFilter, genApiAddProject, genApiGetProjects, genProjectExternalLink, genProjectLink, navigateToProject } from './utils';\nimport { clearCache, getCacheTotal, projectsCache, projectsRequest, resetStateSignal, setCacheTotal } from './cache';\n\nconst i18n = useI18n();\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddLinksToProjects: true,\n});\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({ default: { id: null, name: '' } });\n\nconst apiGet = genApiGetProjects(props.client);\n\nconst apiGetWithLimit = genApiGetProjects(props.client);\napiGetWithLimit.changeParams({\n\tlimit: PROJECTS_TOTAL_THRESHOLD,\n});\n\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | null | undefined>(getCacheTotal());\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\nconst placeholder = computed(() => {\n\treturn props.placeholder ?? i18n.Projects.Select_project;\n});\n\nconst itemsForSelector = computed(() => {\n\tif (!projectsCache.value || !props.excludeProjectId) return projectsCache.value;\n\n\treturn projectsCache.value.filter((project) => project.id !== props.excludeProjectId);\n});\n\n/**\n * Источник данных для списка проектов:\n * - `static` — список проектов передан через props\n * - `api` — список загружается через HTTP (API)\n *\n * Выбор режима: `static`, если `projectsTotal` < `PROJECTS_TOTAL_THRESHOLD`, иначе `api`\n */\nconst dataSource = computed(() => {\n\tif (!projectsTotal.value && projectsTotal.value !== 0) return;\n\n\treturn projectsTotal.value < PROJECTS_TOTAL_THRESHOLD ? 'static' : 'api';\n});\n\nwatch(resetStateSignal, () => {\n\tresetState();\n});\n\nwatch(model, () => {\n\tif (!model.value.id || !props.addLinksToProjects) return;\n\n\tnavigateToProject(genProjectLink(model.value.id));\n});\n\nconst loadProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tprojectsRequest.value = apiGetWithLimit.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tif (res.errors) {\n\t\tprojectsRequest.value = null;\n\n\t\treturn;\n\t}\n\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (projectsTotal.value) return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsTotal.value = res.total;\n\tif (dataSource.value === 'static' && !projectsCache.value) projectsCache.value = res.result as Item[];\n\n\tif (projectsTotal.value) setCacheTotal(projectsTotal.value);\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (project: Item) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: project.name,\n\t\tname: project.name,\n\t}).call();\n\tif (res.errors) return;\n\n\tif (projectsCache.value && dataSource.value === 'static') {\n\t\tconst newProject = {\n\t\t\tid: Number(res.result),\n\t\t\tuser_id: Core.state.user.id,\n\t\t\tname: project.name,\n\t\t\turl: project.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\n\t\t\tlistItemProps: {\n\t\t\t\tattrs: { title: project.name },\n\t\t\t},\n\t\t};\n\n\t\tconst firstManualUpdateProjectIndex = projectsCache.value.findIndex((project) => project.on === 0);\n\t\tprojectsCache.value = [\n\t\t\t...projectsCache.value.slice(0, firstManualUpdateProjectIndex),\n\t\t\tnewProject,\n\t\t\t...projectsCache.value.slice(firstManualUpdateProjectIndex),\n\t\t];\n\n\t\tif (projectsTotal.value) {\n\t\t\tprojectsTotal.value += 1;\n\t\t\tsetCacheTotal(projectsTotal.value);\n\t\t}\n\t}\n\n\tif (dataSource.value === 'api') clearCache();\n};\n\n/**\n * Сброс локального состояния и кеша api\n */\nconst resetState = () => {\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n * Только при `dataSource` = `static`\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (projectsCache.value || dataSource.value === 'api') return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsCache.value = res.result as Item[];\n};\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\tv-model=\"model\"\n\t\t:items=\"itemsForSelector\"\n\t\t:title=\"$i18n.Projects.Search_projects\"\n\t\t:modificator\n\t\t:searchFields=\"['id', 'name', 'url']\"\n\t\t:placeholder\n\t\thasCloserBtn\n\t\t:api=\"dataSource === 'api' ? apiGet : undefined\"\n\t\t:apiSetSearchParams=\"dataSource === 'api' ? (...args) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps\n\t\t:openerShortcut\n\t\t@appendItem=\"addProject\"\n\t\t@open=\"onOpen\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-projectSelector_item\">\n\t\t\t\t<div class=\"top-projectSelector_itemText\">\n\t\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\t\t\t\t\t\t<span class=\"top-comment\">\n\t\t\t\t\t\t\tid {{ item.id }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{{ item.name }}\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"addLinksToProjects\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t\t:href=\"genProjectLink(item.id)\"\n\t\t\t\t\t\t@click.prevent.stop=\"navigateToProject(genProjectLink(item.id!), $event)\"\n\t\t\t\t\t></a>\n\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemExtLink\"\n\t\t\t\t\t\t:href=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click.stop\n\t\t\t\t\t></TopButton>\n\n\t\t\t\t\t<Submenu\n\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t:right=\"item.right ?? undefined\"\n\t\t\t\t\t\t:url=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\n}\n\n.top-projectSelector_item {\n\t--top-icon-size: 14px;\n\n\tdisplay: flex;\n\tflex-grow: 1;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemLink {\n\tposition: absolute;\n\tinset: 0;\n}\n\n.top-projectSelector_itemText {\n\tflex-grow: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemExtLink,\n.top-projectSelector_item [class*=\"opener\"] {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-popup_listItem:hover .top-projectSelector_item > *,\n.top-popup_listItem.top-active .top-projectSelector_item > * {\n\topacity: 1;\n}\n\n@media screen and (min-width: 900px) {\n\t/* Ограничиваем стандартную высоту popup */\n\t.top-projectSelector.p3 div.top-popup {\n\t\tmax-height: min(calc(var(--top-popup-bottom) - 16px), 800px);\n\t}\n}\n\n@media screen and (max-width: 900px) {\n\t.top-projectSelector_item [class*=\"opener\"] {\n\t\topacity: 1;\n\t}\n}\n</style>\n","import type { Props as TagSelectorOpenerProps } from '../popupOpener/types';\nimport type { Tag, TagIdExclude } from '../types';\n\n/**\n * Полуичить значение исключения тега tagId\n */\nexport const genTagIdExcluded = (tagId: Tag['id']): TagIdExclude => {\n\treturn '-' + tagId as TagIdExclude;\n};\n\n/**\n * Вернуть чистый tagId без exclude флага\n */\nexport const genTagIdClear = (tagId: Tag['id'] | TagIdExclude) => {\n\tif (tagId[0] === '-') return tagId.substring(1) as Tag['id'];\n\n\treturn tagId as Tag['id'];\n};\n\n/**\n * Получить инфомрацию о теге по его id\n */\nexport const getTagById = (tagId: Tag['id'] | TagIdExclude, tags: TagSelectorOpenerProps['tags']) => {\n\ttagId = genTagIdClear(tagId);\n\n\tconst tag = tags.find(tag => tag.id === tagId);\n\tif (!tag) return;\n\n\treturn tag;\n};\n","import { isRef, type Ref, ref, unref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport TopPopupWorker from '@/components/popup/lib/worker';\nimport type { OpenerProps as PopupOpenerProps } from '@/components/popup/popup/opener/types';\nimport type { Props as TagSelectorOpenerProps, TagSelectorTarget } from '../popupOpener/types';\nimport type { Props as TagIconProps } from '../tagIcon/types';\nimport { genTagIdClear, getTagById } from './utils';\n\n/**\n * Сгенерировать элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelectorPopupOpener для работы вне vue\n *\n * Требует монтирования компонента TopTagSelector\n */\nexport const genElPopupOpener = (\n\tprops: TagSelectorOpenerProps & { modelValue: TagSelectorOpenerProps['modelValue'] | Ref<TagSelectorOpenerProps['modelValue']> },\n\tpropsPopup?: Partial<PopupOpenerProps>,\n\thtmlSetterSeveral?: string,\n): HTMLElement => {\n\tif (!propsPopup) propsPopup = { id: props.id };\n\n\t// Значения по умолчанию см. в: `@/components/popup/popup/opener/opener.vue`\n\tpropsPopup.id = props.id;\n\tpropsPopup.pos ??= '3';\n\tpropsPopup.notch ??= true;\n\tpropsPopup.posBy ??= 'fixed';\n\n\tconst el = TopPopupWorker.genElPopupOpener('div', propsPopup as PopupOpenerProps);\n\n\tel.classList.add('top-tagSelector');\n\tif (props.useTopButton) el.classList.add('top-tagSelector-useTopButton', 'top-button', 'top-color_theme', 'top-as-selector');\n\tif (!props.useTopButton) el.classList.add('top-tagSelector-custom');\n\tif (props.mode === 'filter') el.classList.add('top-tagSelector-filter');\n\tif (props.mode === 'setter' && !props.filters) el.classList.add('top-tagSelector-setter_single');\n\tif (props.mode === 'setter' && props.filters) el.classList.add('top-tagSelector-setter_several');\n\n\t// прокcи клик: lazy connect\n\tel.onclick = (e) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tel.onclick = null;\n\n\t\tconst model = ref(props.modelValue);\n\n\t\tconst target: TagSelectorTarget = {\n\t\t\tmodel,\n\t\t\tmode: props.mode,\n\t\t\ttargetId: props.targetId,\n\t\t\tfilters: props.filters,\n\t\t\tpayload: props.payload,\n\t\t};\n\n\t\tstorage(el, 'topTagSelectorTarget', target);\n\n\t\tdelete el.dataset.topPopupDisabled;\n\n\t\tif (!isRef(props.modelValue)) {\n\t\t\twatch(model, () => {\n\t\t\t\tprops.modelValue = model.value;\n\n\t\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t\t});\n\t\t}\n\n\t\t// выполнение клика\n\t\tel.click();\n\t};\n\n\tif (isRef(props.modelValue)) {\n\t\twatch(props.modelValue, () => elPopupOpenerRender(el, props, htmlSetterSeveral));\n\t} else {\n\t\tstorage(el, 'topTagSelectorRender', (modelValue: TagSelectorOpenerProps['modelValue']) => {\n\t\t\tprops.modelValue = modelValue;\n\n\t\t\tconst target = storage(el, 'topTagSelectorTarget');\n\t\t\tif (target) target.model.value = modelValue;\n\n\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t});\n\t}\n\n\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\n\treturn el;\n};\n\n/**\n * Вызвать перерисовку элемента, который был создан через genElPopupOpener()\n *\n * Работет только для элементов не с реактивным modelValue\n */\nexport const renderElPopupOpener = (el: HTMLElement, modelValue: TagSelectorOpenerProps['modelValue']) => {\n\tstorage(el, 'topTagSelectorRender')?.(modelValue);\n};\n\n/**\n * Отрисовать TopTagSelecorPopupOpener\n */\nconst elPopupOpenerRender = (el, props: TagSelectorOpenerProps, htmlSetterSeveral?: string) => {\n\tconst tagsIds = unref(props.modelValue);\n\n\tel.classList.toggle('top-tagSelector-selectedOne', !tagsIds.length || tagsIds.length === 1);\n\tel.classList.toggle('top-tagSelector-toTwoLine', tagsIds.length > 5);\n\n\tif (props.mode === 'setter' && props.filters) {\n\t\tel.innerHTML = `<div>${htmlSetterSeveral}</div>`;\n\n\t\treturn;\n\t}\n\n\tel.innerHTML = '';\n\n\tif (!tagsIds.length && props.mode === 'filter') {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: 'all',\n\t\t\tcolorId: '',\n\t\t\tname: useI18n().Common?.All_tags ?? '',\n\t\t\tstate: '',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t}\n\n\ttagsIds.forEach(tagId => {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: genTagIdClear(tagId),\n\t\t\tcolorId: getTagById(tagId, props.tags)?.color_id ?? '',\n\t\t\tname: getTagById(tagId, props.tags)?.name ?? '',\n\t\t\tstate: genTagIdClear(tagId) === tagId ? 'selected' : 'excluded',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t});\n};\n\n/**\n * Сгенерировтаь элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelecorTagIcon для работы вне vue\n */\nconst genElTagIcon = (props: TagIconProps) => {\n\tconst el = document.createElement('div');\n\n\tel.classList.add('top-tagSelector_tagIcon');\n\tel.classList.toggle('top-tagSelector-active', !!props.state);\n\tel.classList.toggle('top-tagSelector-excluded', props.state === 'excluded');\n\n\tel.dataset.tag_id = props.id;\n\tel.dataset.tag_color_id = props.colorId;\n\tel.title = props.name;\n\n\treturn el;\n};\n","import type { Tag } from './types';\n\nexport default [\n\t{\n\t\tid: '1',\n\t\tname: 'Without Tag',\n\t\tcolor_id: '1',\n\t},\n\t{\n\t\tid: '2',\n\t\tname: 'Red',\n\t\tcolor_id: '2',\n\t},\n\t{\n\t\tid: '3',\n\t\tname: 'Orange',\n\t\tcolor_id: '3',\n\t},\n\t{\n\t\tid: '4',\n\t\tname: 'Yellow',\n\t\tcolor_id: '4',\n\t},\n\t{\n\t\tid: '5',\n\t\tname: 'Blue',\n\t\tcolor_id: '5',\n\t},\n\t{\n\t\tid: '6',\n\t\tname: 'Purple',\n\t\tcolor_id: '6',\n\t},\n\t{\n\t\tid: '7',\n\t\tname: 'Green',\n\t\tcolor_id: '7',\n\t},\n\t{\n\t\tid: '8',\n\t\tname: 'Magenta',\n\t\tcolor_id: '8',\n\t},\n\t{\n\t\tid: '9',\n\t\tname: 'Dark blue',\n\t\tcolor_id: '9',\n\t},\n\t{\n\t\tid: '10',\n\t\tname: 'Turquoise',\n\t\tcolor_id: '10',\n\t},\n] as Tag[];\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\ndefineProps<Props>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagIcon': true,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded',\n\t\t}\"\n\t\t:data-tag_id=\"id\"\n\t\t:data-tag_color_id=\"colorId\"\n\t\t:title=\"name\"\n\t></div>\n</template>\n\n<style>\n[data-tag_id] { display: inline-flex; gap: var(--top-gap-2); align-items: center; }\n\n[data-tag_id=\"\"] { border-color: #bdc3c7 !important; color: #55555F !important; }\n[data-tag_color_id=\"1\"] { border-color: var(--color-tag-1) !important; color: #55555F !important; }\n[data-tag_color_id=\"2\"] { border-color: var(--color-tag-2) !important; color: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"] { border-color: var(--color-tag-3) !important; color: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"] { border-color: var(--color-tag-4) !important; color: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"] { border-color: var(--color-tag-5) !important; color: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"] { border-color: var(--color-tag-6) !important; color: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"] { border-color: var(--color-tag-7) !important; color: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"] { border-color: var(--color-tag-8) !important; color: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"] { border-color: var(--color-tag-9) !important; color: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"] { border-color: var(--color-tag-10) !important; color: var(--color-tag-10) !important; }\n\n[data-tag_id=\"\"].top-tagSelector-active { background: #bdc3c7 !important; }\n[data-tag_color_id=\"1\"].top-tagSelector-active { background: var(--color-tag-1) !important; }\n[data-tag_color_id=\"2\"].top-tagSelector-active { background: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"].top-tagSelector-active { background: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"].top-tagSelector-active { background: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"].top-tagSelector-active { background: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"].top-tagSelector-active { background: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"].top-tagSelector-active { background: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"].top-tagSelector-active { background: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"].top-tagSelector-active { background: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"].top-tagSelector-active { background: var(--color-tag-10) !important; }\n\n[data-tag_id=\"all\"] {\n\tborder-color: transparent !important; background: none !important;\n}\n\n[data-tag_id=\"all\"]:before {\n\tcontent: \"\";\n\tcolor: var(--color-tag-all) !important;\n\tfont-size: 26px;\n\tmin-width: calc(100% + 4px);\n\theight: calc(100% + 4px);\n\tmargin-top: -18px;\n\tmargin-left: -8px;\n}\n\n/* в кнопке выбора тэгов и в popup */\n.top-tagSelector-useTopButton [data-tag_id],\n.top-tagSelector_popup [data-tag_id] {\n\t--top-tag-selector-size: 10px;\n\n\tbox-sizing: content-box;\n\tborder-radius: 100%; border: 2px solid var(--color-layout-front-1); background: var(--color-layout-front-1);\n\twidth: var(--top-tag-selector-size);\n\theight: var(--top-tag-selector-size);\n\tfont-size: calc(var(--top-tag-selector-size) + 4px);\n\t/*font-family: inherit !important;*/\n}\n\n/* исключение тегов */\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],\n[data-tag_id].top-tagSelector-excluded { position: relative; }\n\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,\n[data-tag_id].top-tagSelector-excluded:before {\n\tcontent: \"\";\n\twidth: calc(var(--top-tag-selector-size) * 2); height: 1px; background: inherit;\n\ttransform: rotate(-45deg); filter: brightness(80%);\n\tdisplay: block;\n\tposition: absolute; top: calc(var(--top-tag-selector-size) / 2); left: calc(0px - var(--top-tag-selector-size) / 2);\n}\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=\"all\"]):not(.top-tagSelector-active):before { background: #AAA; }\n[data-tag_id].top-tagSelector-excluded:after,\n[data-tag_id].top-tagSelector-excluded ~ .top-tagSelector_tagListItemName { text-decoration: line-through; }\n\n/* popup */\n.top-popup_listItem.top-tagSelector-active { background: var(--top-popup-background-color-active) !important; }\n\n.top-popup_listItem:hover [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-hover); }\n.top-popup_listItem.top-tagSelector-active [data-tag_id=\"all\"]:before,\n.top-popup_listItem.top-active [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-active); }\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\nimport TopPopupListItem from '@/components/popup/popup/listItem.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst name = defineModel<Props['name']>('name', {\n\trequired: true,\n});\n\nconst elName = ref<HTMLElement | null>(null);\n\n/**\n * @todo Удалить через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n */\nconst firefoxProps = computed(() => {\n\tif (navigator.userAgent.indexOf('Firefox') != -1) {\n\n\t\treturn {\n\t\t\tcontenteditable: inEdit.value,\n\t\t\tonpaste: (event: Event) => event.preventDefault(),\n\t\t};\n\t}\n\n\treturn {};\n});\n\n/**\n * Включен режим редактирвоания\n */\nconst inEdit = ref(false);\n\n/**\n * Включить режим редактирование\n */\nconst turnToEdit = async () => {\n\tinEdit.value = true;\n\n\tawait nextTick();\n\n\telName.value?.focus();\n};\n\n/**\n * Применить редактирование\n */\nconst editCommit = () => {\n\tconst name = elName.value?.innerText;\n\tif (!name) return editCancel();\n\n\tif (elName.value) elName.value.innerText = name;\n\n\tinEdit.value = false;\n\n\temit('update:name', name);\n};\n\n/**\n * Отменить редактирование\n */\nconst editCancel = async () => {\n\tif (elName.value) elName.value.innerText = props.name;\n\n\tinEdit.value = false;\n};\n\n/**\n * Применить выбор\n */\nconst changeSelect = (e: MouseEvent) => {\n\t// в режиме редактирования выбор не применяется\n\tif (inEdit.value) return;\n\n\t// тег запрещено выбирать\n\tif (props.disabled) return;\n\n\tlet toState: Props['state'] = 'selected';\n\n\tif (props.canExclude) {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\ttoState = 'excluded';\n\t\t}\n\t}\n\n\tif (props.state == toState) {\n\t\ttoState = '';\n\t}\n\n\tif (toState === '') emit('unselect');\n\tif (toState === 'selected') emit('select');\n\tif (toState === 'excluded') emit('exclude');\n};\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagListItem': true,\n\t\t\t'top-tagSelector_tagListItem-inEdit': inEdit,\n\t\t\t'top-tagSelector_tagListItem-disabled': disabled,\n\t\t\t'top-tagSelector_tagListItem-canExclude': canExclude,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded'\n\t\t}\"\n\t\t@click.stop=\"changeSelect\"\n\t>\n\t\t<TopTagIcon\n\t\t\t:id\n\t\t\t:name\n\t\t\t:colorId\n\t\t\t:state\n\t\t/>\n\n\t\t<span\n\t\t\tref=\"elName\"\n\t\t\tclass=\"top-tagSelector_tagListItemName\"\n\t\t\t:contenteditable=\"inEdit ? 'plaintext-only' : false\"\n\t\t\t:=\"firefoxProps\"\n\t\t\t@keydown.enter.stop=\"editCommit\"\n\t\t\t@keydown.esc.stop=\"editCancel\"\n\t\t>\n\t\t\t{{ name }}\n\t\t</span>\n\n\t\t<template v-if=\"editable\">\n\t\t\t<span\n\t\t\t\tv-if=\"!inEdit\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click=\"turnToEdit\"\n\t\t\t></span>\n\n\t\t\t<span\n\t\t\t\tv-else\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click.stop=\"editCommit\"\n\t\t\t></span>\n\t\t</template>\n\t</TopPopupListItem>\n</template>\n\n<style>\n.top-tagSelector_tagListItem.top-popup_listItem {\n\tpadding-top: var(--top-padding-2) !important;\n\tpadding-bottom: var(--top-padding-2) !important;\n\tgap: 10px;\n}\n\n.top-tagSelector_tagListItemName {\n\tborder-radius: var(--top-radius-1);\n\twidth: 120px;\n\tpadding: 4px 2px;\n\tmargin: -4px -2px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tflex-grow: 1;\n}\n\n/* редактирование */\n.top-tagSelector_edit {\n\t--top-icon-size: 18px;\n\t--top-icon-color: var(--color-text-3);\n\n\twidth: 20px;\n\tflex-grow: 0;\n}\n\n.top-tagSelector_edit:before {\n\tline-height: 0;\n}\n\n.top-tagSelector_edit { opacity: 0; }\n.top-tagSelector_edit:hover {\n\t--top-icon-color: var(--color-text-primary);\n}\n\n.top-tagSelector_tagListItem:hover .top-tagSelector_edit,\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit {\n\tcursor: pointer;\n\topacity: 1;\n}\n\n.top-tagSelector_tagListItem-inEdit {\n\tbackground: var(--color-layout-front-3) !important;\n\toutline: 1px dashed var(--color-line-2);\n\toutline-offset: -1px;\n}\n\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName {\n\tcursor: text;\n\tbackground: var(--color-layout-front-1);\n}\n\n/* disabled */\n.top-tagSelector_tagListItem-disabled {\n\tcursor: not-allowed !important;\n\topacity: 0.85;\n}\n.top-tagSelector_tagListItem-disabled:hover {\n\tbackground: inherit;\n}\n.top-tagSelector_tagListItem-disabled [data-tag_id] {\n\topacity: 0.6;\n}\n</style>\n","top-forms-focusable top-size_s top-button-withoutText top-tagSelector-useTopButton\n\n<script setup lang=\"ts\">\nimport type { Props, TagSelectorTarget } from './types';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport { genTagIdClear, getTagById } from '../utils/utils';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<Props>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst component = props.useTopButton ? TopButton : 'div';\nconst componentSlotName = props.useTopButton ? 'html' : 'default';\n\nconst topTagSelectorTarget: TagSelectorTarget = {\n\tmodel,\n\tmode: props.mode,\n\ttargetId: props.targetId,\n\tfilters: props.filters,\n\tpayload: props.payload,\n};\n</script>\n\n<template>\n\t<TopPopupOpener :id>\n\t\t<component\n\t\t\t:is=\"component\"\n\t\t\t:class=\"{\n\t\t\t\t'top-tagSelector': true,\n\t\t\t\t'top-tagSelector-useTopButton': props.useTopButton,\n\t\t\t\t'top-tagSelector-custom': !props.useTopButton,\n\t\t\t\t'top-as-selector': props.useTopButton,\n\t\t\t\t'top-tagSelector-filter': props.mode === 'filter',\n\t\t\t\t'top-tagSelector-setter_single': props.mode === 'setter' && !filters,\n\t\t\t\t'top-tagSelector-setter_several': props.mode === 'setter' && filters,\n\t\t\t\t'top-tagSelector-selectedOne': !model.length || model.length === 1,\n\t\t\t\t'top-tagSelector-toTwoLine': model.length > 5,\n\t\t\t}\"\n\t\t\tcolor=\"theme\"\n\t\t\t:styling\n\t\t\tv-top-data:topTagSelectorTarget=\"topTagSelectorTarget\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<template #[componentSlotName]>\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-if=\"!model.length && mode === 'filter'\"\n\t\t\t\t\tid=\"all\"\n\t\t\t\t\tcolorId=\"\"\n\t\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t\tstate=\"\"\n\t\t\t\t/>\n\n\t\t\t\t<!-- Массовое редактирование -->\n\t\t\t\t<div v-if=\"mode === 'setter' && filters\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Список тегов -->\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-else\n\t\t\t\t\tv-for=\"tagId in model\"\n\t\t\t\t\t:id=\"genTagIdClear(tagId)\"\n\t\t\t\t\t:colorId=\"getTagById(tagId, tags)?.color_id ?? ''\"\n\t\t\t\t\t:name=\"getTagById(tagId, tags)?.name ?? ''\"\n\t\t\t\t\t:state=\"genTagIdClear(tagId) === tagId ? 'selected' : 'excluded'\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</component>\n\t</TopPopupOpener>\n</template>\n\n<style>\n.top-tagSelector {\n\tcursor: pointer;\n\tmin-width: 0;\n\twhite-space: nowrap;\n\tjustify-content: left;\n}\n\n.top-tagSelector-useTopButton {\n\twidth: 118px;\n\tgap: var(--top-gap-1);\n\tvertical-align: middle;\n}\n\n.top-tagSelector.top-button.top-as-selector {\n\twidth: calc(118px + 8px);\n}\n\n/* все теги в фильтре */\n.top-tagSelector-useTopButton [data-tag_id=\"all\"]:before {\n\tmargin-right: 6px;\n}\n\n/* фильтр по одному тегу */\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id]:after {\n\tcontent: attr(title);\n\tmargin-left: 20px;\n\tmin-width: 74px;\n\ttext-align: left;\n\tline-height: 1.2;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id=\"all\"]:after {\n\tmargin-left: 0;\n}\n\n/* фильтр по многим тегам */\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine {\n\tflex-wrap: wrap;\n\talign-content: center;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id] {\n\t--top-tag-selector-size: 8px;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]:nth-child(5) {\n\tmargin-right: 4px;\n}\n\n/* установка тегов */\n.top-tagSelector-useTopButton.top-tagSelector-setter_several,\n.top-tagSelector-useTopButton.top-tagSelector-setter_several.top-as-selector{\n\twidth: auto;\n}\n\n.top-tagSelector-custom {\n\tposition: relative;\n\tdisplay: flex !important; flex-direction: column; flex-wrap: wrap; align-items: stretch !important;\n}\n\n.top-tagSelector-custom [data-tag_id] {\n\twidth: auto; min-height: 20%; min-width: 50%;\n\tflex: 1 1 auto;\n}\n</style>\n","<script setup lang=\"ts\">\n/* global $ */\n\nimport { computed, reactive, ref, shallowRef, watch } from 'vue';\n\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport { debounce } from '@/core/utils/lodash';\n\nimport type { Option } from '@/components/forms/select/types';\nimport TopSelect from '@/components/forms/select/select.vue';\n\nimport TopButton from '@/components/forms/button/button.vue';\n\nimport type { PopupEvent } from '@/components/popup/popup/types';\nimport TopPopup from '../../popup/popup/popup.vue';\nimport TopPopupListItem from '../../popup/popup/listItem.vue';\n\nimport type { Emits, FiltersAction, Props, Tag } from './types';\nimport tagsDefaults from './tagsDefaults';\nimport { genTagIdExcluded } from './utils/utils';\n\nimport type { Props as TagListItemProps } from './popupListItem/types';\nimport TopTagListItem from './popupListItem/tagPopupListItem.vue';\n\nimport type { TagSelectorTarget } from './popupOpener/types';\nimport TopTagSelectorPopupOpener from './popupOpener/popupOpener.vue';\n\nconst i18n = useI18n();\n\nconst props = withDefaults(defineProps<Props>(), {\n\ttagsMax: 10,\n\trequiredForSetter: true,\n\temitDelay: 500,\n\tuseTopButton: true,\n});\n\n/**\n * Выбранные теги кнопки в этом компоненте\n *\n * Редактирвоание ведется только через `editTarget.model`\n */\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Список тегов\n */\nconst tags = defineModel<Tag[]>('tags', {\n\tdefault: reactive(tagsDefaults),\n});\n\nconst emit = defineEmits<Emits>();\n\nconst emitDebounce: typeof emit = debounce((name, e) => {\n\temit(name, e);\n}, props.emitDelay);\n\n// требуется сразу указать один тег\nif (props.singleMode && !model.value.length) {\n\tmodel.value = [tags.value[0].id];\n}\n\nconst id = props.id ?? 'top-popup-id-' + Math.random() + '';\n\nconst filtersAction = ref<FiltersAction>('add');\n\n/**\n * Сгенерировать опции для выбора дейсвтия массого редактирования\n */\nconst genFiltersActionOptions = () => {\n\tconst tagsText = ' ' + i18n.Common.Tags?.toLowerCase();\n\n\tconst res = new Map<FiltersAction, Option>();\n\tres.set('add', { value: 'add', title: i18n.Common.Add + tagsText });\n\tres.set('replace', { value: 'replace', title: i18n.Common.Replace + tagsText });\n\tres.set('delete', { value: 'delete', title: i18n.Common.Delete + tagsText });\n\n\treturn res;\n};\n\n/**\n * Целевой объект редактирования тегов\n *\n * Определяется кнопкой, которая открыла popup выбора тегов\n */\nconst target = shallowRef<TagSelectorTarget>({\n\tmodel,\n\tmode: 'filter',\n\ttargetId: undefined,\n\tfilters: undefined,\n\tpayload: undefined,\n});\n\nwatch(model, () => {\n\temitDebounce('selector', model.value);\n});\n\n/**\n * Можно ли выбрать еще теги\n */\nconst disabled = computed(() => {\n\tif (target.value.mode !== 'setter') return;\n\n\tif (!props.maxTagsForSetter) return;\n\n\t// массовая смена тегов, количество тегов в результате узнать невозможно\n\tif (target.value.filters) return;\n\n\treturn target.value.model.value.length >= props.maxTagsForSetter;\n});\n\nconst genTargetTagState = (tagId: Tag['id'] | 'all'): TagListItemProps['state'] => {\n\tif (tagId !== 'all') {\n\t\tif (target.value.model.value.includes(tagId)) return 'selected';\n\n\t\tif (target.value.model.value.includes(genTagIdExcluded(tagId))) return 'excluded';\n\t}\n\n\t// Все теги, ни один из тегов не выбран\n\tif (tagId === 'all' && !target.value.model.value.length) return 'selected';\n\n\treturn '';\n};\n\nconst updateTargetModel = (tagId: Tag['id'], action: 'unselect' | 'select' | 'exclude') => {\n\tconst tagIdExcluded = genTagIdExcluded(tagId);\n\n\tlet tagsIds = target.value.model.value.filter(modelTagId => modelTagId !== tagId && modelTagId !== tagIdExcluded);\n\n\tif (action === 'select') tagsIds.push(tagId);\n\tif (action === 'exclude') tagsIds.push(tagIdExcluded);\n\n\t// режим редактирвоания тегов одного объекта с требованием указать хотя бы один тег\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined && props.requiredForSetter) {\n\t\t// нельзя снимать выделение со всех тегов\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds.push('1');\n\t\t}\n\n\t\t// при первом выборе сразу снять тег \"Без тега\"\n\t\tif (tagsIds.length === 2 && target.value.model.value.length === 1 && target.value.model.value[0] === '1') {\n\t\t\ttagsIds = tagsIds.filter((tagId) => tagId !== '1');\n\t\t}\n\t}\n\n\t// режим выбора одного тега\n\tif (props.singleMode && !target.value.filters) {\n\t\t// нужно указать хотя бы один тег\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds = target.value.model.value;\n\t\t}\n\n\t\tif (tagsIds.length > 1) {\n\t\t\ttagsIds = [tagsIds[tagsIds.length - 1]];\n\t\t}\n\t}\n\n\t// всегда выводить теги в порядке, указанном в настройках tags\n\ttagsIds.sort((a, b) => {\n\t\tif (!props.tags) return 0;\n\n\t\tconst aIndex = props.tags.findIndex((tag) => tag.id === a);\n\t\tconst bIndex = props.tags.findIndex((tag) => tag.id === b);\n\n\t\treturn aIndex - bIndex;\n\t});\n\n\ttarget.value.model.value = tagsIds;\n\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined) {\n\t\temitDebounce('setter', {\n\t\t\ttagsIds: tagsIds as Tag['id'][],\n\t\t\ttargetId: target.value.targetId,\n\t\t\tpayload: target.value.payload,\n\t\t});\n\t}\n};\n\nconst classString = computed(() => {\n\tlet res = 'top-tagSelector_popup';\n\n\tif (target.value.mode === 'filter') res += ' top-tagSelector_popup-filter';\n\tif (target.value.mode === 'setter') res += ' top-tagSelector_popup-setter';\n\n\treturn res;\n});\n\n/**\n * Добавить тег\n */\nconst addTag = () => {\n\tconst tagName = prompt('', 'New tag');\n\tif (!tagName || tagName === 'New tag') return;\n\n\tconst tagId = tags.value.length + 1;\n\n\ttags.value.push({\n\t\tid: String(tagId) as Tag['id'],\n\t\tname: tagName,\n\t\tcolor_id: String((tagId - 1) % 10 + 1) as Tag['color_id'],\n\t});\n\n\temit('tagsChanged', tags.value);\n};\n\nconst onOpen = (popupEvent: PopupEvent) => {\n\t// popup открыт другой кнопкой c другим modelValue, для редактирвоания объектов\n\ttarget.value = storage(popupEvent.elPopupOpener, 'topTagSelectorTarget');\n\tif (!target.value) throw new Error('Open popup TopTagSelector required v-data:topTagSelectorTarget');\n\n\t// при начале массовой установки тегов сбросить состояние формы\n\tif (target.value.filters) {\n\t\tfiltersAction.value = 'add';\n\t\ttarget.value.model.value = [];\n\t}\n\n\tif (!Core.$?.ui['sortable']) {\n\t\tconsole.info('Для работы сортировки требуется глобальная загрузка jQuery UI Sortable');\n\n\t\treturn;\n\t}\n\n\tif (!Core.state.isMobile && !Core.state.isMobileUA && tags.value) {\n\t\t$(popupEvent.elPopup).sortable({\n\t\t\titems: 'li:has([data-tag_id]:not([data-tag_id=\"all\"]))',\n\n\t\t\t/**\n\t\t\t * @todo Удалить `[contenteditable=\"true\"]` через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n\t\t\t */\n\t\t\tcancel: '[contenteditable=\"plaintext-only\"], [contenteditable=\"true\"]',\n\n\t\t\tdistance: 10,\n\t\t\tstop: function (_e, ui) {\n\t\t\t\tif (!tags.value) return;\n\n\t\t\t\tconst $tags = $(ui.item).parent().find('[data-tag_id]');\n\n\t\t\t\tconst tagsSorted: Tag['id'][] = [];\n\t\t\t\t$tags.each((_index, elTag) => {\n\t\t\t\t\tif (!tags.value) return;\n\n\t\t\t\t\tconst tagId = $(elTag).attr('data-tag_id') as Tag['id'];\n\t\t\t\t\ttagsSorted.push(tagId);\n\t\t\t\t});\n\n\t\t\t\ttags.value.sort((tagIdA, tagIdB) => {\n\t\t\t\t\tconst a = tagsSorted.findIndex(tagSorted => tagSorted === tagIdA.id);\n\t\t\t\t\tconst b = tagsSorted.findIndex(tagSorted => tagSorted === tagIdB.id);\n\n\t\t\t\t\treturn a - b;\n\t\t\t\t});\n\n\t\t\t\temitDebounce('tagsChanged', tags.value);\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onClose = (popupEvent: PopupEvent) => {\n\tif (!Core.$?.ui['sortable']) return;\n\n\tif ($(popupEvent.elPopup).data('ui-sortable')) {\n\t\t$(popupEvent.elPopup).sortable('destroy');\n\t}\n};\n</script>\n\n<template>\n\t<TopTagSelectorPopupOpener\n\t\tv-model=\"model\"\n\t\t:id\n\t\t:tags\n\t\t:styling\n\t\tmode=\"filter\"\n\t\t:useTopButton\n\t/>\n\n\t<TopPopup\n\t\t:id\n\t\t:class=\"classString\"\n\t\t@open=\"onOpen($event)\"\n\t\t@close=\"onClose($event)\"\n\t\t:transition-duration=\"50\"\n\t>\n\t\t<!-- Массовое редактирование-->\n\t\t<template #header v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopSelect\n\t\t\t\tv-model=\"filtersAction\"\n\t\t\t\t:options=\"genFiltersActionOptions()\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #footer v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopButton color=\"theme\">\n\t\t\t\t{{ $i18n.Common.Cancel }}\n\t\t\t</TopButton>\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"emitDebounce('setter', {\n\t\t\t\t\ttagsIds: target.model.value as Tag['id'][],\n\t\t\t\t\tfilters: target.filters,\n\t\t\t\t\tfiltersAction,\n\t\t\t\t\tpayload: target.payload,\n\t\t\t\t})\"\n\t\t\t>\n\t\t\t\t{{ filtersAction === 'add' ? $i18n.Common['Add'] : '' }}\n\t\t\t\t{{ filtersAction === 'replace' ? $i18n.Common['Replace'] : '' }}\n\t\t\t\t{{ filtersAction === 'delete' ? $i18n.Common['Delete'] : '' }}\n\t\t\t</TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopTagListItem\n\t\t\t\tv-if=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\tid=\"all\"\n\t\t\t\tcolorId=\"\"\n\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t:state=\"target.model.value.length ? '' : 'selected'\"\n\t\t\t\t@select=\"target.model.value = []\"\n\t\t\t/>\n\n\t\t\t<TopTagListItem\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:id=\"tag.id\"\n\t\t\t\t:colorId=\"tag.color_id\"\n\t\t\t\t:name=\"tag.name\"\n\t\t\t\t:state=\"genTargetTagState(tag.id)\"\n\t\t\t\t:canExclude=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\t:editable=\"tagsEditable\"\n\t\t\t\t:disabled=\"disabled && genTargetTagState(tag.id) === ''\"\n\t\t\t\t@unselect=\"updateTargetModel(tag.id, 'unselect')\"\n\t\t\t\t@select=\"updateTargetModel(tag.id, 'select')\"\n\t\t\t\t@exclude=\"updateTargetModel(tag.id, 'exclude')\"\n\t\t\t\t@update:name=\"tag.name = $event as string, emitDebounce('tagsChanged', tags);\"\n\t\t\t/>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"tagsEditable && tags.length < tagsMax && tags.length < 20\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t@click.stop=\"addTag\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.Add }}\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-tagSelector_popup .top-popup {\n\tuser-select: none;\n\tmin-width: 220px !important;\n\ttext-align: left;\n}\n\n.top-tagSelector_popup .top-popup_header .top-select{\n\tflex-grow: 1;\n}\n</style>\n"]}