@topvisor/ui 1.5.10-hotkeys.2 → 1.5.10-hotkeys.3

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.
@@ -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/navigation/navigateCache.ts","../../src/components/project/projectSelector/cache.ts","../../src/components/project/projectSelector/projectSelector.vue","../../src/components/project/navigation/navigation.ts","../../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","_e","ve","ye","vue_1","forms_CjJD60m3_es_js_1","popup_q1PRZblX_es_js_1","formsExt_B9hGGznb_es_js_1","be","xe","Se","Ce","U","we","Te","Ee","De","Oe","ke","Ae","Me","je","utils_CUvjkXu8_es_js_1","require","resolve_1","reject_1","Ne","Pe","Fe","Ie","r","n","searchers_js_1","Le","Re","ze","Be","s","c","l","u","d","f","p","W","Ve","He","Ue","We","Ge","Ke","G","K","q","qe","Je","Ye","Xe","Ze","Qe","$e","et","tt","nt","rt","it","api_nVBtzTDk_es_js_1","h","g","b","ee","at","ot","st","ct","lt","ut","gt","dt","ft","pt","mt","ht","_t","keyboard_js_1","vt","yt","bt","xt","a","St","Ct","wt","Tt","J","Et","Y","X","Dt","Ot","kt","At","jt","Mt","Nt","Pt","Ft","_","y","check_js_1","string_js_1","It","Lt","t","Rt","Z","Q","zt","worker_F_Y1IEi2_es_js_1","dom_js_1","Vt","Bt","Ht","Ut","Wt","Gt","Kt","qt","Jt","Yt","Xt","x","S","te","O","j"],"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/api-nVBtzTDk.es.js\", \"../.chunks/forms-CjJD60m3.es.js\", \"../utils/dom.js\", \"../.chunks/worker-F-Y1IEi2.es.js\", \"../.chunks/utils-CUvjkXu8.es.js\", \"../utils/check.js\", \"../utils/string.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-q1PRZblX.es.js\", \"../.chunks/formsExt-B9hGGznb.es.js\", \"vue\", \"../.chunks/app-BpyVfZtN.es.js\"], function (require, exports, api_nVBtzTDk_es_js_1, forms_CjJD60m3_es_js_1, dom_js_1, worker_F_Y1IEi2_es_js_1, utils_CUvjkXu8_es_js_1, check_js_1, string_js_1, searchers_js_1, keyboard_js_1, popup_q1PRZblX_es_js_1, formsExt_B9hGGznb_es_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.topProjectSelectorClearCache = exports.renderElTopTagSelectorPopupOpener = exports.navigateToAdjacentProject = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = 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 _e = { class: \"top-competitorSelector\" }, ve = { class: \"top-ellipsis1\" }, ye = /* @__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(e) {\n let t = e, i = (0, vue_1.useModel)(e, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (t.showSelectAllItem)\n return {\n icon: t.selectAllItemIcon,\n title: (0, forms_CjJD60m3_es_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", _e, [(0, vue_1.unref)(forms_CjJD60m3_es_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CjJD60m3_es_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)(e.items.find((e) => e.value === i.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)(e.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": i.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => i.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", ve, (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_B9hGGznb_es_js_1.p, {\n key: 1,\n modelValue: i.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => i.value = e,\n items: e.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 }), be = (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 }))), xe = {\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 22: \"YandexLive\"\n }, Se = {\n alt: \"\",\n key: -2,\n name: \"--\",\n index: -2\n }, Ce = {\n key: -2,\n name: \"--\",\n regions: [Se],\n regionByIndex: /* @__PURE__ */ new Map([[-2, Se]])\n }, U = {\n alt: \"\",\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, we = {\n key: -2,\n name: \"Autoselect\",\n regions: [U],\n regionByIndex: /* @__PURE__ */ new Map([[-2, U]])\n }, Te = {\n alt: \"\",\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, Ee = () => (U.name = (0, forms_CjJD60m3_es_js_1.E)().Common.Autoselect, U), De = () => (Ee(), we.name = (0, forms_CjJD60m3_es_js_1.E)().Common.Autoselect, console.log(we), we), Oe = () => (Te.name = (0, forms_CjJD60m3_es_js_1.E)().Keywords.Without_region, Te), ke = [\n 4,\n 8,\n 9\n ], Ae = (e, t, n = []) => {\n let r = Me(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 }, je = (0, utils_CUvjkXu8_es_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-Nob9K60s.es.js\"], resolve_1, reject_1); }).then(__importStar)), Me = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e === \"volume\" || e === \"cost_forecast\" ? Ne(n) : e === \"project_relevant_url\" ? Pe(n) : Fe(n, !0), t && r.set(-2, De()), r.size || r.set(-2, Ce), r;\n }, Ne = (e) => {\n e = e.filter((e) => forms_CjJD60m3_es_js_1.O.state.forceSearchersKeysForKeywordsStats.includes(e.key));\n let t = Fe(e, !1);\n return forms_CjJD60m3_es_js_1.O.state.forceSearchersKeysForKeywordsStats.forEach((e) => {\n if (t.has(e))\n return;\n let n = {\n key: e,\n name: xe[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n t.set(n.key, n);\n }), forms_CjJD60m3_es_js_1.O.state.showGlobalRegionForKeywordsStats && t.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...Oe() };\n e.regionByIndex.set(t.index, t);\n }), t;\n }, Pe = (e) => (e = e.filter((e) => !ke.includes(e.key)), Fe(e, !1)), Fe = (e, t) => {\n let n = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (t && !e.enabled)\n return;\n let r = { ...e };\n r.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n r.regionByIndex.set(n.index, n);\n }), r.regionByIndex.size, (!e.regions || r.regionByIndex.size) && n.set(r.key, r);\n }), n;\n }, Ie = (e, t) => {\n let r = (0, forms_CjJD60m3_es_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(t.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let n = /* @__PURE__ */ new Map();\n if (t.value.forEach((t) => {\n let r = {\n value: t.key,\n title: t.name\n };\n e.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(t.key)), n.set(t.key, r);\n }), e.addCompare && !n.has(-2)) {\n let e = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n n.set(e.value, e);\n let t = {\n value: -1,\n title: r.Common.Compare\n };\n n.set(t.value, t);\n }\n return n;\n })\n };\n }, Le = (e, t) => {\n let r = (0, forms_CjJD60m3_es_js_1.E)(), i = (0, vue_1.computed)(() => e.forMode === \"volume\" || e.forMode === \"cost_forecast\"), a = (0, vue_1.ref)(-2);\n e.modelValue.length === 1 && (a.value = e.modelValue[0]), a.value === -2 && (a.value = i.value ? t.value?.regionByIndex.values().next().value?.key ?? -2 : t.value?.regionByIndex.keys().next().value ?? -2);\n let o = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return t.value.regionByIndex?.forEach((n) => {\n let a = n.name;\n if (i.value) {\n let t = {\n value: n.key,\n title: a\n };\n e.has(n.key) || e.set(n.key, t);\n return;\n }\n let o = (0, searchers_js_1.getLangLabel)(t.value.key || 0, n.lang ?? \"\"), s = \"\";\n n.device !== void 0 && (s = r.Common[\"Device_\" + n.device]), o && (s += s ? `, ${o}` : o), n.alt && (s += s ? `, ${n.alt}` : n.alt), s &&= ` (${s})`;\n let c = {\n value: n.index,\n title: a + s,\n icon: n.device === void 0 ? void 0 : (0, searchers_js_1.getDeviceGIcon)(n.device)\n };\n e.set(n.index, c);\n }), e;\n });\n return (0, vue_1.watch)(o, (t, n) => {\n if (e.onlySearcher || a.value !== void 0 && t.get(a.value))\n return;\n let i = t.keys().next().value;\n if (a.value === -2 || i === -2) {\n a.value = i;\n return;\n }\n let o = n?.get(a.value)?.title || \"\", s = -1;\n for (let [e, n] of t.entries()) {\n let t = n.title;\n if (typeof t != \"string\" || typeof e == \"string\")\n break;\n if (t === o) {\n i = e;\n break;\n }\n let a = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n t.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(a, \"\"), l--), t.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), t.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(a, \"\"), l--), t.indexOf(c) !== -1 && (l <= s || (s = l, i = e));\n }\n a.value = i;\n }), {\n regionIndex: a,\n optionByRegionIndex: o\n };\n }, Re = (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 }, ze = (e) => {\n let t = (0, vue_1.computed)(() => e.forMode === \"volume\" || e.forMode === \"cost_forecast\"), n = (0, vue_1.computed)(() => Me(e.forMode, e.autoRegion, e.searchers)), r = (0, vue_1.computed)(() => n.value.get(a.searcherKey.value) || Ce), i = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return n.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), a = Ie(e, n), o = Le(e, r), s = Re(e, n, i);\n (0, vue_1.watch)(n, () => {\n if (e.onlySearcher ? s.regionsIndexes.value = Array.from(n.value.keys()) : s.regionsIndexes.value = s.regionsIndexes.value.filter((e) => i.value.has(e)), a.searcherKey.value === -1)\n return;\n let t = n.value.keys().next().value;\n n.value.forEach((r) => {\n if (e.onlySearcher && r.key === a.searcherKey.value) {\n t = a.searcherKey.value;\n return;\n }\n if (o.regionIndex.value && r.regionByIndex?.has(o.regionIndex.value) && (t = r.key), !e.onlySearcher) {\n let e;\n t !== void 0 && (e = n.value.get(t)?.regionByIndex);\n let i = n.value.get(r.key)?.regionByIndex;\n e?.has(-2) && !i?.has(-2) && (t = r.key);\n }\n }), t !== void 0 && (a.searcherKey.value = t), o.regionIndex.value !== void 0 && !(r.value?.regionByIndex)?.has(o.regionIndex.value) && (o.regionIndex.value = r.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let c = () => {\n if (a.searcherKey.value !== -1 && a.searcherKey.value !== -2)\n return a.searcherKey.value;\n }, l = () => {\n if (e.onlySearcher || o.regionIndex.value === -2)\n return;\n let n = o.regionIndex.value;\n if (t.value && e.forMode) {\n let t = o.regionIndex.value;\n n = Ae(e.forMode, {\n searcher_key: c(),\n key: t\n }, e.searchers)?.index;\n }\n return n;\n }, u = () => {\n let e = c();\n if (e !== void 0)\n return n.value.get(e);\n };\n return {\n selectSearcher: a,\n selectRegion: o,\n compare: s,\n searcherByKey: n,\n allRegionsIndexes: i,\n getSearcher: u,\n getRegion: () => {\n let e = l();\n if (e !== void 0)\n return u()?.regionByIndex?.get(e);\n }\n };\n }, Be = /* @__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, r = (0, vue_1.computed)(() => n.forMode === \"volume\" || n.forMode === \"cost_forecast\"), i = (0, vue_1.useModel)(e, \"modelValue\"), s = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: c, selectRegion: l, compare: u, searcherByKey: d, allRegionsIndexes: f, getSearcher: p, getRegion: m } = ze(n), h = () => {\n let e = [];\n d.value.forEach((t) => {\n (n.forMode === \"project_relevant_url\" || t.enabled) && t.regions.forEach((t) => {\n (n.forMode === \"project_relevant_url\" || t.enabled) && t.index !== -1 && e.push(t);\n });\n }), je.open(\"regions\", {\n regions: e,\n regionsIndexes: u.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => u.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n l.regionIndex,\n c.searcherKey,\n u.regionsIndexes\n ], () => {\n if (c.searcherKey.value === -1 && u.regionsIndexes.value.length) {\n if (JSON.stringify(i.value) === JSON.stringify(u.regionsIndexes.value))\n return;\n i.value = [...u.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (i.value = [c.searcherKey.value], c.searcherKey.value === -2 && !n.autoRegion && (i.value.length = 0)) : (i.value = [l.regionIndex.value], l.regionIndex.value === -2 && !n.autoRegion && (i.value.length = 0));\n !n.onlySearcher && !f.value.size && (c.searcherKey.value = -2);\n }), s.value && (0, vue_1.watch)(s, () => {\n s.value && (i.value = [s.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(i, () => {\n if (i.value[0] && (s.value = i.value[0]), n.onlySearcher) {\n if (!i.value.length || i.value.length === 1 && !d.value.has(i.value[0]) || i.value.length === 1 && i.value[0] === -2 && !n.autoRegion) {\n let e = d.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, s.value = -2), e === void 0 ? i.value.length = 0 : i.value = [e];\n return;\n }\n if (i.value.length > 1 && JSON.stringify(i.value) !== JSON.stringify(u.regionsIndexes.value)) {\n i.value = [...u.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(i.value)], t = d.value.values().next().value?.regionByIndex?.keys().next().value;\n if (r.value && (t = d.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, s.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let n = f.value;\n r.value && (n = /* @__PURE__ */ new Set(), d.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -2 && n.add(e.key);\n });\n })), n.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => f.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(i.value) !== JSON.stringify(e)) {\n i.value = e;\n return;\n }\n }\n if (i.value.length !== 1 || i.value[0] !== (n.onlySearcher ? c.searcherKey.value : l.regionIndex.value)) {\n if (n.onlySearcher) {\n if (i.value.length === 1) {\n c.searcherKey.value = i.value[0];\n return;\n }\n c.searcherKey.value = -1;\n return;\n }\n if (!i.value.length)\n return;\n if (i.value.length === 1 && c.searcherKey.value !== -1) {\n l.regionIndex.value = i.value[0];\n let e;\n for (let t of d.value.values()) {\n for (let n of t.regionByIndex.values())\n if ((r.value ? n.key : n.index) === l.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (c.searcherKey.value = e);\n }\n else\n c.searcherKey.value = -1, u.regionsIndexes.value = [...i.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: p,\n getRegion: m\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_CjJD60m3_es_js_1.n, {\n options: (0, vue_1.unref)(c).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(c).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(c).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)(c).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CjJD60m3_es_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(l).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(l).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(l).regionIndex.value = e,\n name: r.value ? \"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)(c).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CjJD60m3_es_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: h,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(u).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 }), W = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = ye;\n exports.useItemsFromCompetitors = be;\n exports.findRegion = Ae;\n exports.dialogRegionSelector = je;\n exports.genSearcherByKey = Me;\n exports.TopRegionSelector = Be;\n function Ve(e) {\n return e ? (0, forms_CjJD60m3_es_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_CjJD60m3_es_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var He = (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 = Ve(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), He(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), Ue = (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 We(e, t, n) {\n let r = Object.keys(e), i = r.map((t) => e[t]);\n return (0, vue_1.watch)(i, (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 Ge = [\"innerHTML\"], Ke = /* @__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: W },\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 ? Ue(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)(() => He(t.folders ?? { root: [W] }, t.canSelectAll)), s = (e) => (t.canSelectAll && e[0]?.id === 0 && (e[0] = {\n ...e[0],\n name: Ve(!0)\n }), e);\n return We({\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 ||= W, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_B9hGGznb_es_js_1.c, {\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_B9hGGznb_es_js_1.d)(...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, Ge)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), G = {\n id: -1,\n name: \"--\",\n folder_id: W.id,\n folder_path: W.path\n }, K = {\n id: 0,\n name: \"All groups\",\n folder_id: W.id,\n folder_path: W.path\n }, q = () => (K.name = (0, forms_CjJD60m3_es_js_1.E)()?.Common.All_groups, K), qe = () => (K.name = (0, forms_CjJD60m3_es_js_1.E)()?.Keywords.Choose_group, K), Je = (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), Ye = (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 }), Xe = (e, t) => e.gen(`/add/${t}/groups/`), Ze = (e, t) => e.gen(`/del/${t}/groups/`), Qe = (e, t) => e.gen(`/edit/${t}/groups/rename/`), $e = { class: \"top-groupSelector_groupItem top-ellipsis1\" }, et = {\n key: 0,\n class: \"top-comment\"\n }, tt = [\"innerHTML\"], nt = [\"innerHTML\"], rt = [\"innerHTML\"], it = /* @__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: n, emit: r }) {\n let i = e, a = r, o = (0, vue_1.useModel)(e, \"groupId\"), s = (0, vue_1.useModel)(e, \"group\"), c = i.client && !i.groups ? Ye(i.client, i.service) : void 0, l = i.client ? Xe(i.client, i.service) : void 0, u = i.client ? Ze(i.client, i.service) : void 0, d = i.client ? Qe(i.client, i.service) : void 0, f = (0, vue_1.ref)(null), p = (0, vue_1.computed)(() => {\n if (i.groups !== void 0)\n return Je(i.groups, i.on, i.folder);\n }), m = (0, api_nVBtzTDk_es_js_1.i)(\"folder_id\", \"EQUALS\", [i.folder?.id ?? 0]);\n c?.changeParams({\n project_id: i.projectId,\n folder_id_depth: !0,\n filters: [m]\n }), i.on !== void 0 && c?.params.filters?.push((0, api_nVBtzTDk_es_js_1.i)(\"on\", \"EQUALS\", [Number(i.on)]));\n let h = (e) => {\n s.value = e, o.value = e.id;\n }, g = (e = !1) => {\n f.value?.resetCache(e);\n };\n We({\n projectId: () => i.projectId,\n folderId: () => i.folder?.id,\n canSelectAll: () => i.canSelectAll\n }, (e) => {\n if (e.projectId && (c?.changeParams({ project_id: i.projectId }), c?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + i.projectId })), e.folderId && (m.values = [i.folder?.id ?? 0]), g(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && o.value !== null) {\n let e;\n i.autoselect === \"first\" && (e = p.value?.[0], i.canSelectAll && (e = (0, vue_1.reactive)(q()))), (i.autoselect === \"placeholder\" || !e) && (e = qe()), h(e);\n }\n }, { immediate: !0 }), We({\n modelGroup: s,\n modelGroupId: o\n }, async (e) => {\n if (o.value !== s.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n o.value = s.value.id;\n return;\n }\n if (!(i.canAdd && o.value === null)) {\n if (i.groups) {\n let e = p.value?.find((e) => e.id === o.value);\n if (!e && i.canSelectAll && (e = q()), e)\n h(e);\n else {\n let e = p.value?.[0];\n e && !o.value ? h(e) : h(G);\n }\n }\n if (i.client && !i.groups && (o.value || o.value === 0 && !i.canSelectAll)) {\n let e = Ye(i.client, i.service).changeParams({\n project_id: i.projectId,\n id: o.value,\n filters: [m]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + i.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(G);\n }\n }\n }\n }, { immediate: !0 });\n let v = async (e) => {\n if (i.canAdd !== \"api\" || !l)\n return;\n let t = s.value, n = await l.changeParams({\n project_id: i.projectId,\n names: [e.name],\n to_id: i.folder?.id ?? W.id,\n to_type: \"in_folder_last\"\n }).call();\n if (n.result) {\n let e = n.result[0];\n h(e), a(\"addGroup\", e);\n }\n else\n h(t);\n f.value?.resetCache(!0);\n }, b = async (e, t) => {\n d && ((await d.changeParams({\n project_id: i.projectId,\n id: e.id,\n name: t\n }).call()).errors || (s.value.id === e.id && (s.value.name = t), a(\"editGroup\", {\n id: e.id,\n name: t\n }), f.value?.updateCacheItemById(e.id, { name: t })));\n }, ee = async (e) => {\n u && ((await u.changeParams({\n project_id: i.projectId,\n id: e.id\n }).call()).errors || (s.value.id === e.id && h(i.canSelectAll ? q() : G), a(\"delGroup\", e.id), f.value?.deleteCacheItemById(e.id)));\n };\n return n({ resetCacheGroups: g }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_B9hGGznb_es_js_1.c, {\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_B9hGGznb_es_js_1.d)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(q)().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\", $e, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", et, (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, tt),\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, nt)) : (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_q1PRZblX_es_js_1.n, {\n submitText: t.$i18n.Common.Save,\n defaultValue: r.name,\n inputProps: { addCleaner: !1 },\n onSubmit: (e) => b(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_q1PRZblX_es_js_1.r, {\n isWarning: \"\",\n submitText: t.$i18n.Common.Delete,\n onSubmit: (e) => ee(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, rt)]),\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 }), at = { class: \"top-groupSelector\" }, ot = /* @__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: G },\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 = He(r.folders ?? { root: [W] }, 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 = q()), (r.autoselect === \"placeholder\" || !u) && (u = qe()), u ??= G, 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 let t = r.groups.find((t) => t.id === e.id);\n if (!t)\n return;\n let n = {\n ...t,\n ...e\n }, i = r.groups.map((e) => e.id === n.id ? n : e);\n l(\"update:groups\", i);\n }, p = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n let t = r.groups.filter((t) => t.id !== e);\n l(\"update:groups\", t);\n };\n return t({ resetCacheGroups: (e = !1) => {\n i.value?.resetCacheGroups(e);\n } }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", at, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Ke, {\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)(it, {\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 }), st = (e) => ({\n id: null,\n name: e,\n listItemProps: {\n type: \"title\",\n class: \"top-projectSelector_item\"\n }\n }), ct = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n }, lt = (e, t) => {\n let r = [], i = {\n scheduledUpdate: st((0, forms_CjJD60m3_es_js_1.E)().Projects.Scheduled_update),\n manualUpdate: st((0, forms_CjJD60m3_es_js_1.E)().Projects.Manual_update),\n guestProjects: st((0, forms_CjJD60m3_es_js_1.E)().Projects.Guest_projects)\n }, a = t ? {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n } : ct;\n for (let t of e)\n !a.scheduledUpdate && t.right?.startsWith(\"1\") && t.on > 0 && (r.push(i.scheduledUpdate), a.scheduledUpdate = !0), !a.manualUpdate && t.right?.startsWith(\"1\") && t.on === 0 && (r.push(i.manualUpdate), a.manualUpdate = !0), !a.guestProjects && t.right?.startsWith(\"0\") && t.on >= 0 && (r.push(i.guestProjects), a.guestProjects = !0), r.push(t);\n return r;\n }, ut = (e) => ({\n ...e,\n externalLink: gt(e.url ?? \"\"),\n listItemProps: {\n class: \"top-projectSelector_item\",\n attrs: { title: e.name }\n }\n }), dt = (e, t, n) => !e || e.length === 0 ? [] : (t && Object.keys(ct).forEach((e) => ct[e] = !1), lt(e.map(ut), n)), ft = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return 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 }, pt = (e) => {\n location.href = mt(e);\n }, mt = (e) => {\n let t = ht(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n 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] + \"/\");\n let a = \"https://\" + t + \"/\" + r + e + \"/\" + i;\n return a = ft(a), a;\n }, ht = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, gt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"https://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, _t = (e, n) => {\n let r = e.params.filters ?? [];\n r = r.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let i = (0, keyboard_js_1.invertKeyboardLayout)(n), a = n.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), o = i.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n n && r.push((0, api_nVBtzTDk_es_js_1.i)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${a}|${o})`])), e.changeParams({ filters: r });\n }, vt = (n) => {\n let i = n.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return i.changeParams({\n filters: [(0, api_nVBtzTDk_es_js_1.i)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, api_nVBtzTDk_es_js_1.a)(\"user_id\", \"DESC\", [forms_CjJD60m3_es_js_1.O.state.userId]),\n (0, api_nVBtzTDk_es_js_1.a)(\"on\", \"ASC\", [0]),\n (0, api_nVBtzTDk_es_js_1.a)(\"favorite\", \"DESC\"),\n (0, api_nVBtzTDk_es_js_1.a)(\"ord\", \"ASC\"),\n (0, api_nVBtzTDk_es_js_1.a)(\"id\", \"DESC\")\n ]\n }), i.options.loadingShowSpinner = !1, i.options.onApiLoaded = (e, t, n) => {\n let r = t.data.filters.length > 1, i = t.data.offset === 0, a = t.data.offset === void 0 || i && !r, o = r;\n e.result = dt(e.result, a, o), n?.(e, t);\n }, i;\n }, yt = (e) => e.gen(\"/add/projects_2/projects/\"), bt = { class: \"top-ellipsis1\" }, xt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: { id: {} },\n setup(e) {\n let t = e, i = (0, forms_CjJD60m3_es_js_1.E)(), a = ht(), o = (e) => {\n let t = [\n {\n href: `https://${a}/project/keywords/${e.id}/`,\n title: i.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${a}/project/dynamics/${e.id}/`,\n title: i.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/snapshots/${e.id}/`,\n title: i.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/competitors/${e.id}/`,\n title: i.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/ai-tracker/${e.id}/`,\n title: i.Common.Menu_aiTracker,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/analytics/${e.id}/`,\n title: i.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${a}/project/broker/${e.id}/`,\n title: i.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/sitemap/`,\n title: i.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/audit/`,\n title: i.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/indexing/`,\n title: i.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/watcher/`,\n title: i.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${a}/project/settings/${e.id}/`,\n title: i.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ].filter((e) => !Object.entries(forms_CjJD60m3_es_js_1.O.state.closedByMod).some(([t, n]) => n && e.href.includes(`/${t}/`)));\n return e.right.includes(\"0\") ? t.filter((t) => e.right[t.right] === \"1\") : t;\n };\n return (e, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_q1PRZblX_es_js_1.s), {\n id: t.id,\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n contentList: (0, vue_1.withCtx)(({ data: t }) => [t ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o(t.projectItem), (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_q1PRZblX_es_js_1.o), {\n href: t.href,\n title: t.title,\n \"data-top-icon\": t.icon,\n \"data-right\": t.right\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.title : \"\"), 1)]),\n _: 2\n }, 1032, [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ]))), 256)), (0, vue_1.createVNode)((0, vue_1.unref)(popup_q1PRZblX_es_js_1.o), {\n href: t.projectItem.externalLink,\n title: t.projectItem.externalLink,\n class: \"top-ellipsis\",\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", bt, (0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.projectItem.externalLink : \"\"), 1)]),\n _: 2\n }, 1032, [\"href\", \"title\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\"id\"]));\n }\n }), St = () => ({\n userId: forms_CjJD60m3_es_js_1.O.state.userId,\n projectsIds: [],\n nextOffset: 0,\n loading: !1\n }), Ct = St(), wt = () => {\n Ct = St();\n }, Tt = () => Ct, J = \"ui_project_selector_total\", Et = 864e5, Y = (0, vue_1.ref)(null), X = (0, vue_1.shallowRef)(), Dt = (e) => {\n localStorage.setItem(J + \":\" + forms_CjJD60m3_es_js_1.O.state.userId, JSON.stringify({\n projectsTotal: e,\n expiresAt: Date.now() + Et\n }));\n }, Ot = () => {\n let e = localStorage.getItem(J + \":\" + forms_CjJD60m3_es_js_1.O.state.userId);\n if (!e)\n return;\n let { projectsTotal: t, expiresAt: n } = JSON.parse(e);\n if (Date.now() > n) {\n localStorage.removeItem(J + \":\" + forms_CjJD60m3_es_js_1.O.state.userId);\n return;\n }\n return t;\n }, kt = () => {\n Y.value = null, X.value = void 0, wt(), localStorage.removeItem(J + \":\" + forms_CjJD60m3_es_js_1.O.state.userId), (0, formsExt_B9hGGznb_es_js_1.f)(\"/get/projects_2/projects/\");\n }, At = { class: \"top-projectSelector_itemText\" }, jt = { class: \"top-comment\" }, Mt = {\n key: 0,\n class: \"top-comment\"\n }, Nt = [\"href\"], Pt = 1e3, Ft = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n menuMode: { type: Boolean },\n excludeProjectId: {},\n openerShortcut: {},\n modificator: {},\n placeholder: {},\n buttonProps: { default: () => ({\n color: \"theme\",\n styling: \"outline\"\n }) }\n }, {\n modelValue: { default: () => ({\n id: null,\n name: \"\"\n }) },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e) {\n let t = (0, forms_CjJD60m3_es_js_1.E)(), i = e, a = (0, vue_1.useModel)(e, \"modelValue\"), o = vt(i.client), s = yt(i.client), c = (0, vue_1.ref)(Ot()), l = (0, vue_1.ref)(null), f = (0, vue_1.useId)(), p = (0, vue_1.computed)(() => i.placeholder ?? t.Projects.Select_project), m = (0, vue_1.computed)(() => !X.value || !i.excludeProjectId ? X.value : X.value.filter((e) => e.id !== i.excludeProjectId)), h = (0, vue_1.computed)(() => {\n if (c.value || c.value === 0)\n return c.value < Pt ? \"static\" : \"api\";\n }), _ = async () => {\n Y.value ||= o.call();\n let e = await Y.value;\n return Y.value = null, e;\n }, v = async (e) => {\n let t = await s.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!t.errors) {\n if (X.value && h.value === \"static\") {\n let n = ut({\n id: t.result,\n user_id: forms_CjJD60m3_es_js_1.O.state.userId,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\"\n }), i = X.value.findIndex((e) => e.on === 0);\n X.value = [\n ...X.value.slice(0, i),\n n,\n ...X.value.slice(i)\n ], c.value && (c.value += 1, Dt(c.value));\n }\n h.value === \"api\" && l.value?.resetCache(!0);\n }\n }, y = async () => {\n if (X.value || h.value === \"api\")\n return;\n let e = await _();\n e.errors || (X.value = e.result);\n }, b = async () => {\n if (c.value) {\n let e = l.value?.popupOpenerRef?.$el;\n e && e.addEventListener(\"pointerenter\", () => y(), { once: !0 });\n }\n else {\n o.changeParams({ limit: Pt });\n let e = await _();\n if (e.errors)\n return;\n delete o.params.limit, c.value = e.total ?? void 0, !X.value && h.value !== \"api\" && (X.value = e.result), c.value && Dt(c.value);\n }\n };\n return (0, vue_1.onMounted)(async () => {\n await b();\n }), (t, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_B9hGGznb_es_js_1.c, {\n key: h.value ?? \"dummy\",\n ref_key: \"refSelector\",\n ref: l,\n class: \"top-projectSelector\",\n modelValue: a.value,\n \"onUpdate:modelValue\": n[1] ||= (t) => e.menuMode ? (0, vue_1.unref)(pt)(t.id) : a.value = t,\n items: m.value,\n itemsChunkSize: 100,\n itemsIsLoading: h.value === \"static\" && (0, vue_1.unref)(X) === void 0,\n title: t.$i18n.Projects.Search_projects,\n modificator: e.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)(_t)(...e) : void 0,\n useCache: \"\",\n appendSearchToResult: \"\",\n appendSearchAllowDuplicate: \"\",\n appendSearchToResultCond: (0, vue_1.unref)(check_js_1.validUrl),\n appendWithoutSelect: \"\",\n buttonProps: {\n ...e.buttonProps,\n isProgress: !h.value,\n disabled: !h.value\n },\n openerShortcut: e.openerShortcut,\n onAppendItem: v,\n onOpen: y\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", At, [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\", jt, \" 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\", Mt, (0, vue_1.toDisplayString)(t.$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 e.menuMode ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"a\", {\n key: 0,\n class: \"top-projectSelector_itemLink\",\n href: (0, vue_1.unref)(mt)(i.id)\n }, null, 8, Nt)) : (0, vue_1.createCommentVNode)(\"\", !0),\n t.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n href: i.externalLink,\n \"data-top-icon\": \"\",\n color: \"theme\",\n target: \"_blank\",\n onClick: n[0] ||= (0, vue_1.withModifiers)(() => { }, [\"stop\"])\n }, null, 8, [\"href\"])),\n (0, vue_1.createVNode)(popup_q1PRZblX_es_js_1.c, {\n id: (0, vue_1.unref)(f),\n pos: \"2\",\n notch: !1,\n data: { projectItem: i }\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-popup_listMore\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n _: 1\n }, 8, [\"id\", \"data\"])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"itemsIsLoading\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\"\n ])), (0, vue_1.createVNode)(xt, { id: (0, vue_1.unref)(f) }, null, 8, [\"id\"])], 64);\n };\n }\n }), It = (e, t) => {\n let n = Tt(), r = n.projectsIds.indexOf(e);\n if (r === -1)\n return null;\n let i;\n return t === \"prev\" && (i = n.projectsIds[r - 1]), t === \"next\" && (i = n.projectsIds[r + 1]), i ?? null;\n }, Lt = async (n, i, a) => {\n if (!i)\n return;\n let o = Tt();\n if (o.userId !== forms_CjJD60m3_es_js_1.O.state.userId && (wt(), o = Tt()), o.loading)\n return;\n o.loading = !0;\n let s = n.gen(\"/get/projects_2/projects/\", [\"id\"]);\n s.changeParams({\n filters: [(0, api_nVBtzTDk_es_js_1.i)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, api_nVBtzTDk_es_js_1.a)(\"user_id\", \"DESC\", [forms_CjJD60m3_es_js_1.O.state.userId]),\n (0, api_nVBtzTDk_es_js_1.a)(\"on\", \"ASC\", [0]),\n (0, api_nVBtzTDk_es_js_1.a)(\"favorite\", \"DESC\"),\n (0, api_nVBtzTDk_es_js_1.a)(\"ord\", \"ASC\"),\n (0, api_nVBtzTDk_es_js_1.a)(\"id\", \"DESC\")\n ],\n limit: 1e3\n });\n let c = It(i, a);\n for (; o.nextOffset !== null && !c;) {\n s.changeParams({ offset: o.nextOffset });\n let e = await s.call();\n if (e.errors)\n break;\n o.nextOffset = e.nextOffset ?? null;\n let t = e.result.map((e) => e.id).filter(Boolean);\n o.projectsIds.push(...t), c = It(i, a);\n }\n o.loading = !1, c && pt(c);\n }, Rt = (e) => \"-\" + e, Z = (e) => e[0] === \"-\" ? e.substring(1) : e, Q = (e, t) => {\n e = Z(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, zt = (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_F_Y1IEi2_es_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), a = {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n };\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", a), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Vt(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Vt(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), Vt(r, e, n);\n }), Vt(r, e, n), r;\n }, Bt = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Vt = (e, t, r) => {\n let i = (0, vue_1.unref)(t.modelValue);\n if (e.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), e.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), t.mode === \"setter\" && t.filters) {\n e.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (e.innerHTML = \"\", !i.length && t.mode === \"filter\") {\n let t = Ht({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_CjJD60m3_es_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n e.append(t);\n }\n i.forEach((n) => {\n let r = Ht({\n id: Z(n),\n colorId: Q(n, t.tags)?.color_id ?? \"\",\n name: Q(n, t.tags)?.name ?? \"\",\n state: Z(n) === n ? \"selected\" : \"excluded\"\n });\n e.append(r);\n });\n }, Ht = (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 }, Ut = [\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 ], Wt = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], Gt = /* @__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, Wt));\n }\n }), Kt = [\"contenteditable\", \"onKeydown\"], qt = /* @__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_q1PRZblX_es_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)(Gt, {\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, Kt),\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 }), Jt = { key: 1 }, Yt = /* @__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, { attrs: t }) {\n let n = e, r = (0, vue_1.useModel)(e, \"modelValue\"), i = n.useTopButton ? forms_CjJD60m3_es_js_1.h : \"div\", o = n.useTopButton ? \"html\" : \"default\", s = {\n model: r,\n mode: n.mode,\n targetId: n.targetId,\n filters: n.filters,\n payload: n.payload\n };\n return (a, c) => {\n let l = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_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\": n.useTopButton,\n \"top-tagSelector-custom\": !n.useTopButton,\n \"top-as-selector\": n.useTopButton,\n \"top-tagSelector-filter\": n.mode === \"filter\",\n \"top-tagSelector-setter_single\": n.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": n.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !r.value.length || r.value.length === 1,\n \"top-tagSelector-toTwoLine\": r.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, t), {\n [(0, vue_1.unref)(o)]: (0, vue_1.withCtx)(() => [!r.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Gt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: a.$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\", Jt, [(0, vue_1.renderSlot)(a.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(r.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Gt, {\n id: (0, vue_1.unref)(Z)(t),\n colorId: (0, vue_1.unref)(Q)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(Q)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(Z)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n l,\n s,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Xt = /* @__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)(Ut) },\n tagsModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(e, { emit: t }) {\n let c = (0, forms_CjJD60m3_es_js_1.E)(), l = e, u = (0, vue_1.useModel)(e, \"modelValue\"), d = (0, vue_1.useModel)(e, \"tags\"), f = t, p = (0, forms_CjJD60m3_es_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 y = (0, vue_1.computed)(() => {\n if (_.value.mode === \"setter\" && l.maxTagsForSetter && !_.value.filters)\n return _.value.model.value.length >= l.maxTagsForSetter;\n }), x = (e) => {\n if (e !== \"all\") {\n if (_.value.model.value.includes(e))\n return \"selected\";\n if (_.value.model.value.includes(Rt(e)))\n return \"excluded\";\n }\n return e === \"all\" && !_.value.model.value.length ? \"selected\" : \"\";\n }, S = (e, t) => {\n let n = Rt(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 }, ee = (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 }), te = () => {\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 }, O = (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_CjJD60m3_es_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_CjJD60m3_es_js_1.O.state.isMobile && !forms_CjJD60m3_es_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 }, j = (e) => {\n forms_CjJD60m3_es_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(Yt, {\n modelValue: u.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: e.styling,\n mode: \"filter\",\n useTopButton: e.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_q1PRZblX_es_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(ee.value),\n onOpen: n[4] ||= (e) => O(e),\n onClose: n[5] ||= (e) => j(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n _.value.mode === \"filter\" && !e.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(qt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: t.$i18n.Common.All_tags ?? \"\",\n state: _.value.model.value.length ? \"\" : \"selected\",\n onSelect: n[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, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(qt, {\n key: t.id,\n id: t.id,\n colorId: t.color_id,\n name: t.name,\n state: x(t.id),\n canExclude: _.value.mode === \"filter\" && !e.singleMode,\n editable: e.tagsEditable,\n disabled: y.value && x(t.id) === \"\",\n onUnselect: (e) => S(t.id, \"unselect\"),\n onSelect: (e) => S(t.id, \"select\"),\n onExclude: (e) => S(t.id, \"exclude\"),\n \"onUpdate:name\": (e) => {\n t.name = e, (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 e.tagsEditable && d.value.length < e.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(te, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$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_CjJD60m3_es_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": n[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_CjJD60m3_es_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_CjJD60m3_es_js_1.h, { onClick: n[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\" ? t.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? t.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? t.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = ot;\n exports.topProjectSelectorClearCache = kt;\n exports.TopProjectSelector = Ft;\n exports.navigateToAdjacentProject = Lt;\n exports.genElTopTagSelectorPopupOpener = zt;\n exports.renderElTopTagSelectorPopupOpener = Bt;\n exports.TopTagSelectorTagIcon = Gt;\n exports.TopTagSelectorPopupOpener = Yt;\n exports.TopTagSelector = Xt;\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\t22: 'YandexLive',\n};\n\nexport const regionUndefined: Region = {\n\talt: '',\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\talt: '',\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\talt: '',\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 * Поисковики в которых поиск происходит всегда по `url`, а поиск по домену невозможен\n */\nconst SEARCHERS_KEYS_CHECKS_URLS = [\n\t// YouTube\n\t4,\n\t// AppStore\n\t8,\n\t// GooglePlay\n\t9,\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\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 === 'volume' || forMode === 'cost_forecast') {\n\t\tsearcherByKey = genSearchersMapForKeywordsStats(searchers);\n\t} else if (forMode === 'project_relevant_url') {\n\t\tsearcherByKey = genSearchersMapForRelevants(searchers);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers, true);\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 * Список ПС с регионами для проверки частоты (Яндекс, Google)\n */\nconst genSearchersMapForKeywordsStats = (searchers: Searcher[]) => {\n\tsearchers = searchers.filter(searcher => Core.state.forceSearchersKeysForKeywordsStats.includes(searcher.key));\n\n\tconst searcherByKey = genSearchersMapCommon(searchers, false);\n\n\t// Обязательные для вывода ПС\n\tCore.state.forceSearchersKeysForKeywordsStats.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\tif (Core.state.showGlobalRegionForKeywordsStats) {\n\t\t// добавление глобального региона\n\t\tsearcherByKey.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 searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки релевантных\n *\n * - Не выводит ПС, в которых нет понятия релевантной, например `YouTube`\n * - Выводит и включенные и выклчюенные регионы\n */\nconst genSearchersMapForRelevants = (searchers: Searcher[]) => {\n\tsearchers = searchers.filter(searcher => !SEARCHERS_KEYS_CHECKS_URLS.includes(searcher.key));\n\n\treturn genSearchersMapCommon(searchers, false);\n}\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @paramo onlyAndForceSearchersKeys Ключи ПС, которые нужно вывести в любом случае, другие ПС скрыть из вывода\n */\nconst genSearchersMapCommon = (searchers: Searcher[], onlyEnabledRegions: boolean) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (onlyEnabledRegions && !searcher.enabled) 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) {\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\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\treturn searcherByKey;\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\tconst useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\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 (useRegionKey.value) {\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\tconst regionLabel = region.name;\n\n\t\t\t/**\n\t\t\t * На частоту в текущей версии устройство и язык не влияют.\n\t\t\t * В качестве ключа используется `region.key`, а не `region.index`.\n\t\t\t */\n\t\t\tif (useRegionKey.value) {\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\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\n\t\t\tlet regionLabelSuffix = '';\n\t\t\tif (region.device !== undefined) regionLabelSuffix = i18n.Common['Device_' + region.device];\n\t\t\tif (langLabel) regionLabelSuffix += regionLabelSuffix ? `, ${langLabel}` : langLabel;\n\t\t\tif (region.alt) regionLabelSuffix += regionLabelSuffix ? `, ${region.alt}` : region.alt;\n\n\t\t\tif (regionLabelSuffix) regionLabelSuffix = ` (${regionLabelSuffix})`;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel + regionLabelSuffix,\n\t\t\t\ticon: region.device !== undefined ? 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\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\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, 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 useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\n\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\t// if (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 (useRegionKey.value && 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 { computed, 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});\nconst useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\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 (props.forMode !== 'project_relevant_url' && !searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (props.forMode !== 'project_relevant_url' && !region.enabled) return;\n\t\t\tif (region.index === globalRegionIndex) 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 (useRegionKey.value) {\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 (useRegionKey.value) {\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\t// if (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 = useRegionKey.value ? 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\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=\"useRegionKey ? 'region_key' : 'region_index'\"\n\t\t\t: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\n/* Firefox дублирует стрелку UI в псевдоэлементе `::picker-icon`. */\n@supports (-moz-appearance: none) {\n\t.top-regionSelector .top-select-region > select {\n\n\t\t/* Выносим `::picker-icon` вправо, сохраняя прежнюю ширину. */\n\t\twidth: calc(100% + 24px);\n\t\tmargin-right: -24px;\n\n\t\t/* Обрезаем системную стрелку со скруглением и возвращаем SVG-стрелку на прежнее место. */\n\t\tclip-path: inset(0 24px 0 0 round 0 var(--top-forms-radius) var(--top-forms-radius) 0);\n\t\tbackground-position-x: calc(100% - 32px);\n\t}\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\t// Модификация группы без переприсвоения, чтобы не вызывать лишних запросов\n\tif (modelGroup.value.id === group.id) modelGroup.value.name = newName;\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 = (groupEditedPatch: Partial<Group> & { id: Group['id'] }) => {\n\t// если загрузка групп производится по api, то обновлять группы в `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groupFinded = props.groups.find((group) => group.id === groupEditedPatch.id);\n\tif (!groupFinded) return;\n\n\tconst groupEdited = { ...groupFinded, ...groupEditedPatch };\n\n\tconst groups = props.groups.map((group) => group.id === groupEdited.id ? groupEdited : group);\n\n\temit('update:groups', groups);\n};\n\nconst onDelGroup = (groupDeletedId: Group['id']) => {\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 !== groupDeletedId);\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 { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\nimport Core from '@/core/core/core';\nimport type { Props } from '@/components/formsExt/selector2/types';\nimport type { Item, Project } from './types';\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\tclass: 'top-projectSelector_item',\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 genResultWithCategoryTitles = (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 * Сгенерировать элемент для TopSelector\n */\nexport const genProjectItem = (project: Project): Item => ({\n\t...project,\n\texternalLink: genProjectExternalLink(project.url ?? ''),\n\tlistItemProps: {\n\t\tclass: 'top-projectSelector_item',\n\t\tattrs: {\n\t\t\ttitle: project.name!,\n\t\t},\n\t},\n});\n\n/**\n * Подготовить данные проектов для отображения:\n * - сбросить состояние вставки заголовков категорий, если требуется\n * - добавить `listItemProps` для шаблона TopSelector\n * - добавить заголовки к категориям\n */\nconst prepareProjects = (\n\tprojects: Project[] | 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 = projects.map(genProjectItem);\n\n\treturn genResultWithCategoryTitles(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// Игнорируемые параметры при переходе между проектами (формат плагина piniaTPA)\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// Сохранить сортировку по дате последней проверки\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\nexport const navigateToProject = (projectId: number) => {\n\tlocation.href = genLinkToProjectMod(projectId);\n};\n\n/**\n * Сгенерировать ссылку на страницу проекта с инструментом\n *\n * @note Ссылка сейчас пересчитывается только в момент открытия меню\n */\nexport const genLinkToProjectMod = (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\tlet link = 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n\tlink = prepareProjectLink(link);\n\n\treturn link;\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 : 'https://' + 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: { name: string; }) => { return 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.userId]),\n\t\t\tgenFieldOrder('on', 'ASC', [0]),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('ord', 'ASC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t});\n\n\tapi.options.loadingShowSpinner = false;\n\n\tapi.options.onApiLoaded = (res, ctx, clientOnApiLoaded) => {\n\t\tconst isSearch = ctx.data.filters.length > 1;\n\t\tconst isFirstApiPage = ctx.data.offset === 0;\n\t\tconst isStaticRequest = ctx.data.offset === undefined;\n\n\t\t/**\n\t\t * Флаг для сброса глобального состояния заголовков\n\t\t *\n\t\t * Срабатывает при добавлении проекта или полной перезагрузке списка\n\t\t */\n\t\tconst needResetTitle = isStaticRequest || (isFirstApiPage && !isSearch);\n\n\t\t/**\n\t\t * Флаг для использования локального состояния заголовков\n\t\t *\n\t\t * Срабатывает при API-поиске проектов, чтобы не сбрасывать уже вставленные заголовки\n\t\t * В этом случае запрос содержит дополнительный search-фильтр\n\t\t */\n\t\tconst useLocalTitlesState = isSearch;\n\n\t\tres.result = prepareProjects(res.result as Project[], 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 { PopupData, Props } from './types';\nimport { TopPopup, TopPopupListItem } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\nimport { Core } from '@/core/app';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst genItems = (projectItem: PopupData['projectItem']) => {\n\tconst submenuItems = [\n\t\t{\n\t\t\thref: `https://${host}/project/keywords/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_phrases,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/dynamics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_dynamics,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/snapshots/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_snapshots,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/competitors/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_competitors,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/ai-tracker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_aiTracker,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/analytics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_analytics,\n\t\t\ticon: '',\n\t\t\tright: '5',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/broker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_broker,\n\t\t\ticon: '',\n\t\t\tright: '6',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/sitemap/`,\n\t\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/audit/`,\n\t\t\ttitle: i18n.Common.Menu_audit,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/indexing/`,\n\t\t\ttitle: i18n.Audit.Indexing,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/watcher/`,\n\t\t\ttitle: i18n.Audit.Watcher,\n\t\t\ticon: '',\n\t\t\tright: '9',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/settings/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_settings,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t].filter(item => {\n\t\treturn !Object.entries(Core.state.closedByMod).some(([mod, closed]) => {\n\t\t\treturn closed && item.href.includes(`/${mod}/`);\n\t\t});\n\t});\n\n\tif (!projectItem.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn projectItem.right[item.right] === '1';\n\t});\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\t:id=\"props.id\"\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #contentList=\"{ data }: { data: PopupData }\">\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\tv-for=\"item in genItems(data.projectItem)\"\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>\n\t\t\t\t\t{{ $core.state.isMobile ? item.title : '' }}\n\t\t\t\t</TopPopupListItem>\n\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\t:href=\"data.projectItem.externalLink\"\n\t\t\t\t\t:title=\"data.projectItem.externalLink\"\n\t\t\t\t\tclass=\"top-ellipsis\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ $core.state.isMobile ? data.projectItem.externalLink : '' }}\n\t\t\t\t\t</span>\n\t\t\t\t</TopPopupListItem>\n\t\t\t</template>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n@media (width >= 900px) {\n\t.top-projectSelectorSubmenu .top-popup {\n\t\tmin-width: unset;\n\t}\n\n\t.top-projectSelectorSubmenu ul {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(3, 1fr);\n\t}\n\n\t.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t\t--top-icon-size: 24px;\n\t\t--top-icon-width: 32px;\n\n\t\theight: var(--top-icon-width);\n\t\tmargin: 0;\n\t}\n}\n</style>\n","import Core from '@/core/core/core';\n\ntype NavigateCache = {\n\tuserId: number | null;\n\tprojectsIds: number[];\n\tnextOffset: number | null;\n\tloading: boolean,\n};\n\n/**\n * Сгенерировать дефолтное состояние навигции\n */\nconst genDefaultNavigateCache = () => {\n\treturn {\n\t\tuserId: Core.state.userId,\n\t\tprojectsIds: [],\n\t\tnextOffset: 0,\n\t\tloading: false,\n\t};\n};\n\n/**\n * Состояние навигции\n */\nlet navigateCache: NavigateCache = genDefaultNavigateCache();\n\n/**\n * Сбросить состояние навигации\n */\nexport const resetNavigateCache = () => {\n\tnavigateCache = genDefaultNavigateCache();\n};\n\n/**\n * Получить сосстояние навигации\n */\nexport const getNavigateCache = () => {\n\treturn navigateCache;\n};\n","import type { Item } from '@/components/formsExt/selector2/types';\nimport { clearCache as SelectorClearCache } from '@/components/formsExt/selector2/cache';\nimport { ref, shallowRef } from 'vue';\nimport Core from '@/core/core/core';\nimport { resetNavigateCache } from '@/components/project/navigation/navigateCache';\n\nconst CACHE_KEY = 'ui_project_selector_total';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов между экземплярами: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n *\n * @todo Добавить поддержку моков\n */\nexport const projectsCache = shallowRef<Item[]>();\n\nexport const setCacheTotal = (projectsTotal: number) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY + ':' + Core.state.userId,\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.userId);\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.userId);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\n/**\n * Сбросить локальный кеш и кеш API `/get/projects_2/projects/`\n */\nexport const clearCache = () => {\n\tprojectsRequest.value = null;\n\tprojectsCache.value = undefined;\n\n\tresetNavigateCache();\n\n\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.userId);\n\n\tSelectorClearCache('/get/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport type { ComponentExposed } from 'vue-component-type-helpers';\nimport type { Props, Item } from './types';\nimport type { PopupData } from './submenu/types';\nimport { computed, onMounted, ref, useId } 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 TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport Submenu from './submenu/submenu.vue';\nimport { apiSetSearchParamsFilter, genApiAddProject, genApiGetProjects, genProjectItem, genLinkToProjectMod, navigateToProject } from './utils';\nimport { getCacheTotal, projectsCache, projectsRequest, setCacheTotal } from './cache';\n\nconst i18n = useI18n();\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n *\n * Это же значение используется как лимит при загрузке списка проектов\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = withDefaults(defineProps<Props>(), {\n\tbuttonProps: () => {\n\t\treturn {\n\t\t\tcolor: 'theme',\n\t\t\tstyling: 'outline',\n\t\t};\n\t},\n});\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({\n\tdefault: () => {\n\t\treturn {\n\t\t\tid: null,\n\t\t\tname: '',\n\t\t};\n\t},\n});\n\nconst apiGet = genApiGetProjects(props.client);\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | undefined>(getCacheTotal());\nconst refSelector = ref<ComponentExposed<typeof Selector2<Item>> | null>(null);\nconst uid = useId();\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\nconst getProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tprojectsRequest.value = apiGet.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (item: SelectorItem) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: item.name,\n\t\tname: item.name,\n\t}).call();\n\tif (res.errors) return;\n\n\tif (projectsCache.value && dataSource.value === 'static') {\n\t\tconst newProject = genProjectItem({\n\t\t\tid: res.result,\n\t\t\tuser_id: Core.state.userId,\n\t\t\tname: item.name,\n\t\t\turl: item.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\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\t// Сбросить кеш popup и его API, `projectsCache` сбрасывать не нужно\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n *\n * Только при `dataSource` = `static`\n *\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (projectsCache.value || dataSource.value === 'api') return;\n\n\tconst res = await getProjects();\n\tif (res.errors) return;\n\n\tprojectsCache.value = res.result;\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (!projectsTotal.value) {\n\t\tapiGet.changeParams({ limit: PROJECTS_TOTAL_THRESHOLD });\n\n\t\tconst res = await getProjects();\n\t\tif (res.errors) return;\n\n\t\tdelete apiGet.params.limit;\n\n\t\tprojectsTotal.value = res.total ?? undefined;\n\t\tif (!projectsCache.value && dataSource.value !== 'api') projectsCache.value = res.result;\n\n\t\tif (projectsTotal.value) setCacheTotal(projectsTotal.value);\n\t} else {\n\t\t/**\n\t\t * Спекулятивное выполнение загрузки проектов\n\t\t *\n\t\t * UX: Отзывчивость\n\t\t */\n\t\tconst elPopupOpenel = refSelector.value?.popupOpenerRef?.$el;\n\t\tif (elPopupOpenel) {\n\t\t\telPopupOpenel.addEventListener('pointerenter', () => onOpen(), { once: true });\n\t\t}\n\t}\n};\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\t:key=\"dataSource ?? 'dummy'\"\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\t:modelValue=\"model\"\n\t\t@update:modelValue=\"!menuMode ? model = $event : navigateToProject($event.id)\"\n\t\t:items=\"itemsForSelector\"\n\t\t:itemsChunkSize=\"100\"\n\t\t:itemsIsLoading=\"dataSource === 'static' && projectsCache === undefined\"\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: any) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps=\"{...buttonProps, isProgress:!dataSource, disabled:!dataSource}\"\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_itemText\">\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\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</template>\n\n\t\t\t\t<template v-else>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"menuMode\"\n\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t:href=\"genLinkToProjectMod(item.id)\"\n\t\t\t\t></a>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t:href=\"item.externalLink\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t@click.stop\n\t\t\t\t></TopButton>\n\n\t\t\t\t<!-- @vue-generic {PopupData} -->\n\t\t\t\t<TopPopupOpener\n\t\t\t\t\t:id=\"uid\"\n\t\t\t\t\t:pos=\"'2'\"\n\t\t\t\t\t:notch=\"false\"\n\t\t\t\t\t:data=\"{ projectItem: item } satisfies PopupData\"\n\t\t\t\t>\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tclass=\"top-popup_listMore\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t></TopButton>\n\t\t\t\t</TopPopupOpener>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n\n\t<Submenu :id=\"uid\"/>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\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_item > .top-button {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-projectSelector_item:hover > .top-button,\n.top-projectSelector_item.top-active > .top-button {\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 > .top-button {\n\t\topacity: 1;\n\t}\n}\n</style>\n","import Core from '@/core/core/core';\nimport { getNavigateCache, resetNavigateCache } from '@/components/project/navigation/navigateCache';\nimport { navigateToProject } from '@/components/project/projectSelector/utils';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\n\n/**\n * Получить id соседнего проекта\n */\nconst getAdjacentProjectId = (currentProjectId: number, direct: 'prev' | 'next') => {\n\tconst navigateCache = getNavigateCache();\n\tconst projectIndex = navigateCache.projectsIds.indexOf(currentProjectId);\n\tif (projectIndex === -1) return null;\n\n\tlet projectId: number | undefined;\n\n\tif (direct === 'prev') projectId = navigateCache.projectsIds[projectIndex - 1];\n\tif (direct === 'next') projectId = navigateCache.projectsIds[projectIndex + 1];\n\n\treturn projectId ?? null;\n};\n\n/**\n * Перейти на страницу с инструментом в соседнем проекте\n */\nexport const navigateToAdjacentProject = async (client: Api.Client<Api.TV.Paths, true>, currentProjectId: number, direct: 'prev' | 'next') => {\n\tif (!currentProjectId) return;\n\n\tlet navigateCache = getNavigateCache();\n\tif (navigateCache.userId !== Core.state.userId) {\n\t\tresetNavigateCache();\n\t\tnavigateCache = getNavigateCache();\n\t}\n\n\tif (navigateCache.loading) return;\n\tnavigateCache.loading = true;\n\n\tconst api = client.gen('/get/projects_2/projects/', ['id']);\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.userId]),\n\t\t\tgenFieldOrder('on', 'ASC', [0]),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('ord', 'ASC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t\tlimit: 1000,\n\t});\n\n\tlet adjacentProjectId = getAdjacentProjectId(currentProjectId, direct);\n\n\twhile (navigateCache.nextOffset !== null && !adjacentProjectId) {\n\t\tapi.changeParams({\n\t\t\toffset: navigateCache.nextOffset,\n\t\t});\n\n\t\tconst res = await api.call();\n\t\tif (res.errors) break;\n\n\t\tnavigateCache.nextOffset = res.nextOffset ?? null;\n\n\t\tconst projectsIds = res.result.map((project) => project.id).filter(Boolean);\n\n\t\tnavigateCache.projectsIds.push(...projectsIds);\n\n\t\tadjacentProjectId = getAdjacentProjectId(currentProjectId, direct);\n\t}\n\n\tnavigateCache.loading = false;\n\tif (!adjacentProjectId) return;\n\n\tnavigateToProject(adjacentProjectId);\n};\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 */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\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","he","ge","_e","vue_1","forms_CjJD60m3_es_js_1","popup_q1PRZblX_es_js_1","formsExt_CT5_dKnt_es_js_1","ve","ye","be","xe","G","Se","Ce","we","Te","Ee","De","Oe","Ae","ke","utils_CUvjkXu8_es_js_1","require","resolve_1","reject_1","je","Me","Ne","Pe","r","n","searchers_js_1","Fe","Ie","Le","Re","s","c","l","u","d","f","p","K","ze","Be","Ve","He","Ue","We","q","J","Y","Ge","Ke","qe","Je","Ye","Xe","Ze","Qe","$e","et","tt","nt","api_nVBtzTDk_es_js_1","h","g","y","rt","it","at","ot","st","pt","ct","lt","ut","dt","ft","mt","keyboard_js_1","ht","gt","_t","vt","a","X","yt","bt","Z","xt","St","Ct","wt","Tt","Et","Dt","Ot","kt","_","ee","S","x","P","A","C","N","te","check_js_1","string_js_1","At","Q","jt","Mt","worker_F_Y1IEi2_es_js_1","dom_js_1","Pt","Nt","Ft","It","Lt","Rt","zt","Bt","Vt","Ht","Ut","b"],"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/api-nVBtzTDk.es.js\", \"../.chunks/forms-CjJD60m3.es.js\", \"../utils/dom.js\", \"../.chunks/worker-F-Y1IEi2.es.js\", \"../.chunks/utils-CUvjkXu8.es.js\", \"../utils/check.js\", \"../utils/string.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-q1PRZblX.es.js\", \"../.chunks/formsExt-CT5_dKnt.es.js\", \"vue\", \"../.chunks/app-BpyVfZtN.es.js\"], function (require, exports, api_nVBtzTDk_es_js_1, forms_CjJD60m3_es_js_1, dom_js_1, worker_F_Y1IEi2_es_js_1, utils_CUvjkXu8_es_js_1, check_js_1, string_js_1, searchers_js_1, keyboard_js_1, popup_q1PRZblX_es_js_1, formsExt_CT5_dKnt_es_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.topProjectSelectorClearCache = exports.renderElTopTagSelectorPopupOpener = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = 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 he = { class: \"top-competitorSelector\" }, ge = { class: \"top-ellipsis1\" }, _e = /* @__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(e) {\n let t = e, i = (0, vue_1.useModel)(e, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (t.showSelectAllItem)\n return {\n icon: t.selectAllItemIcon,\n title: (0, forms_CjJD60m3_es_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", he, [(0, vue_1.unref)(forms_CjJD60m3_es_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CjJD60m3_es_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)(e.items.find((e) => e.value === i.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)(e.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": i.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => i.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", ge, (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_CT5_dKnt_es_js_1.p, {\n key: 1,\n modelValue: i.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => i.value = e,\n items: e.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 }), ve = (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 }))), ye = {\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 22: \"YandexLive\"\n }, be = {\n alt: \"\",\n key: -2,\n name: \"--\",\n index: -2\n }, xe = {\n key: -2,\n name: \"--\",\n regions: [be],\n regionByIndex: /* @__PURE__ */ new Map([[-2, be]])\n }, G = {\n alt: \"\",\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, Se = {\n key: -2,\n name: \"Autoselect\",\n regions: [G],\n regionByIndex: /* @__PURE__ */ new Map([[-2, G]])\n }, Ce = {\n alt: \"\",\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, we = () => (G.name = (0, forms_CjJD60m3_es_js_1.E)().Common.Autoselect, G), Te = () => (we(), Se.name = (0, forms_CjJD60m3_es_js_1.E)().Common.Autoselect, console.log(Se), Se), Ee = () => (Ce.name = (0, forms_CjJD60m3_es_js_1.E)().Keywords.Without_region, Ce), De = [\n 4,\n 8,\n 9\n ], Oe = (e, t, n = []) => {\n let r = Ae(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 }, ke = (0, utils_CUvjkXu8_es_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-Nob9K60s.es.js\"], resolve_1, reject_1); }).then(__importStar)), Ae = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e === \"volume\" || e === \"cost_forecast\" ? je(n) : e === \"project_relevant_url\" ? Me(n) : Ne(n, !0), t && r.set(-2, Te()), r.size || r.set(-2, xe), r;\n }, je = (e) => {\n e = e.filter((e) => forms_CjJD60m3_es_js_1.O.state.forceSearchersKeysForKeywordsStats.includes(e.key));\n let t = Ne(e, !1);\n return forms_CjJD60m3_es_js_1.O.state.forceSearchersKeysForKeywordsStats.forEach((e) => {\n if (t.has(e))\n return;\n let n = {\n key: e,\n name: ye[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n t.set(n.key, n);\n }), forms_CjJD60m3_es_js_1.O.state.showGlobalRegionForKeywordsStats && t.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...Ee() };\n e.regionByIndex.set(t.index, t);\n }), t;\n }, Me = (e) => (e = e.filter((e) => !De.includes(e.key)), Ne(e, !1)), Ne = (e, t) => {\n let n = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (t && !e.enabled)\n return;\n let r = { ...e };\n r.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n r.regionByIndex.set(n.index, n);\n }), r.regionByIndex.size, (!e.regions || r.regionByIndex.size) && n.set(r.key, r);\n }), n;\n }, Pe = (e, t) => {\n let r = (0, forms_CjJD60m3_es_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(t.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let n = /* @__PURE__ */ new Map();\n if (t.value.forEach((t) => {\n let r = {\n value: t.key,\n title: t.name\n };\n e.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(t.key)), n.set(t.key, r);\n }), e.addCompare && !n.has(-2)) {\n let e = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n n.set(e.value, e);\n let t = {\n value: -1,\n title: r.Common.Compare\n };\n n.set(t.value, t);\n }\n return n;\n })\n };\n }, Fe = (e, t) => {\n let r = (0, forms_CjJD60m3_es_js_1.E)(), i = (0, vue_1.computed)(() => e.forMode === \"volume\" || e.forMode === \"cost_forecast\"), a = (0, vue_1.ref)(-2);\n e.modelValue.length === 1 && (a.value = e.modelValue[0]), a.value === -2 && (a.value = i.value ? t.value?.regionByIndex.values().next().value?.key ?? -2 : t.value?.regionByIndex.keys().next().value ?? -2);\n let o = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return t.value.regionByIndex?.forEach((n) => {\n let a = n.name;\n if (i.value) {\n let t = {\n value: n.key,\n title: a\n };\n e.has(n.key) || e.set(n.key, t);\n return;\n }\n let o = (0, searchers_js_1.getLangLabel)(t.value.key || 0, n.lang ?? \"\"), s = \"\";\n n.device !== void 0 && (s = r.Common[\"Device_\" + n.device]), o && (s += s ? `, ${o}` : o), n.alt && (s += s ? `, ${n.alt}` : n.alt), s &&= ` (${s})`;\n let c = {\n value: n.index,\n title: a + s,\n icon: n.device === void 0 ? void 0 : (0, searchers_js_1.getDeviceGIcon)(n.device)\n };\n e.set(n.index, c);\n }), e;\n });\n return (0, vue_1.watch)(o, (t, n) => {\n if (e.onlySearcher || a.value !== void 0 && t.get(a.value))\n return;\n let i = t.keys().next().value;\n if (a.value === -2 || i === -2) {\n a.value = i;\n return;\n }\n let o = n?.get(a.value)?.title || \"\", s = -1;\n for (let [e, n] of t.entries()) {\n let t = n.title;\n if (typeof t != \"string\" || typeof e == \"string\")\n break;\n if (t === o) {\n i = e;\n break;\n }\n let a = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n t.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(a, \"\"), l--), t.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), t.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(a, \"\"), l--), t.indexOf(c) !== -1 && (l <= s || (s = l, i = e));\n }\n a.value = i;\n }), {\n regionIndex: a,\n optionByRegionIndex: o\n };\n }, Ie = (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 }, Le = (e) => {\n let t = (0, vue_1.computed)(() => e.forMode === \"volume\" || e.forMode === \"cost_forecast\"), n = (0, vue_1.computed)(() => Ae(e.forMode, e.autoRegion, e.searchers)), r = (0, vue_1.computed)(() => n.value.get(a.searcherKey.value) || xe), i = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return n.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), a = Pe(e, n), o = Fe(e, r), s = Ie(e, n, i);\n (0, vue_1.watch)(n, () => {\n if (e.onlySearcher ? s.regionsIndexes.value = Array.from(n.value.keys()) : s.regionsIndexes.value = s.regionsIndexes.value.filter((e) => i.value.has(e)), a.searcherKey.value === -1)\n return;\n let t = n.value.keys().next().value;\n n.value.forEach((r) => {\n if (e.onlySearcher && r.key === a.searcherKey.value) {\n t = a.searcherKey.value;\n return;\n }\n if (o.regionIndex.value && r.regionByIndex?.has(o.regionIndex.value) && (t = r.key), !e.onlySearcher) {\n let e;\n t !== void 0 && (e = n.value.get(t)?.regionByIndex);\n let i = n.value.get(r.key)?.regionByIndex;\n e?.has(-2) && !i?.has(-2) && (t = r.key);\n }\n }), t !== void 0 && (a.searcherKey.value = t), o.regionIndex.value !== void 0 && !(r.value?.regionByIndex)?.has(o.regionIndex.value) && (o.regionIndex.value = r.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let c = () => {\n if (a.searcherKey.value !== -1 && a.searcherKey.value !== -2)\n return a.searcherKey.value;\n }, l = () => {\n if (e.onlySearcher || o.regionIndex.value === -2)\n return;\n let n = o.regionIndex.value;\n if (t.value && e.forMode) {\n let t = o.regionIndex.value;\n n = Oe(e.forMode, {\n searcher_key: c(),\n key: t\n }, e.searchers)?.index;\n }\n return n;\n }, u = () => {\n let e = c();\n if (e !== void 0)\n return n.value.get(e);\n };\n return {\n selectSearcher: a,\n selectRegion: o,\n compare: s,\n searcherByKey: n,\n allRegionsIndexes: i,\n getSearcher: u,\n getRegion: () => {\n let e = l();\n if (e !== void 0)\n return u()?.regionByIndex?.get(e);\n }\n };\n }, Re = /* @__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, r = (0, vue_1.computed)(() => n.forMode === \"volume\" || n.forMode === \"cost_forecast\"), i = (0, vue_1.useModel)(e, \"modelValue\"), s = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: c, selectRegion: l, compare: u, searcherByKey: d, allRegionsIndexes: f, getSearcher: p, getRegion: m } = Le(n), h = () => {\n let e = [];\n d.value.forEach((t) => {\n (n.forMode === \"project_relevant_url\" || t.enabled) && t.regions.forEach((t) => {\n (n.forMode === \"project_relevant_url\" || t.enabled) && t.index !== -1 && e.push(t);\n });\n }), ke.open(\"regions\", {\n regions: e,\n regionsIndexes: u.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => u.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n l.regionIndex,\n c.searcherKey,\n u.regionsIndexes\n ], () => {\n if (c.searcherKey.value === -1 && u.regionsIndexes.value.length) {\n if (JSON.stringify(i.value) === JSON.stringify(u.regionsIndexes.value))\n return;\n i.value = [...u.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (i.value = [c.searcherKey.value], c.searcherKey.value === -2 && !n.autoRegion && (i.value.length = 0)) : (i.value = [l.regionIndex.value], l.regionIndex.value === -2 && !n.autoRegion && (i.value.length = 0));\n !n.onlySearcher && !f.value.size && (c.searcherKey.value = -2);\n }), s.value && (0, vue_1.watch)(s, () => {\n s.value && (i.value = [s.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(i, () => {\n if (i.value[0] && (s.value = i.value[0]), n.onlySearcher) {\n if (!i.value.length || i.value.length === 1 && !d.value.has(i.value[0]) || i.value.length === 1 && i.value[0] === -2 && !n.autoRegion) {\n let e = d.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, s.value = -2), e === void 0 ? i.value.length = 0 : i.value = [e];\n return;\n }\n if (i.value.length > 1 && JSON.stringify(i.value) !== JSON.stringify(u.regionsIndexes.value)) {\n i.value = [...u.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(i.value)], t = d.value.values().next().value?.regionByIndex?.keys().next().value;\n if (r.value && (t = d.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, s.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let n = f.value;\n r.value && (n = /* @__PURE__ */ new Set(), d.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -2 && n.add(e.key);\n });\n })), n.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => f.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(i.value) !== JSON.stringify(e)) {\n i.value = e;\n return;\n }\n }\n if (i.value.length !== 1 || i.value[0] !== (n.onlySearcher ? c.searcherKey.value : l.regionIndex.value)) {\n if (n.onlySearcher) {\n if (i.value.length === 1) {\n c.searcherKey.value = i.value[0];\n return;\n }\n c.searcherKey.value = -1;\n return;\n }\n if (!i.value.length)\n return;\n if (i.value.length === 1 && c.searcherKey.value !== -1) {\n l.regionIndex.value = i.value[0];\n let e;\n for (let t of d.value.values()) {\n for (let n of t.regionByIndex.values())\n if ((r.value ? n.key : n.index) === l.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (c.searcherKey.value = e);\n }\n else\n c.searcherKey.value = -1, u.regionsIndexes.value = [...i.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: p,\n getRegion: m\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_CjJD60m3_es_js_1.n, {\n options: (0, vue_1.unref)(c).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(c).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(c).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)(c).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CjJD60m3_es_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(l).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(l).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(l).regionIndex.value = e,\n name: r.value ? \"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)(c).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CjJD60m3_es_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: h,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(u).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 }), K = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = _e;\n exports.useItemsFromCompetitors = ve;\n exports.findRegion = Oe;\n exports.dialogRegionSelector = ke;\n exports.genSearcherByKey = Ae;\n exports.TopRegionSelector = Re;\n function ze(e) {\n return e ? (0, forms_CjJD60m3_es_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_CjJD60m3_es_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var Be = (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 = ze(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), Be(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), Ve = (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 He(e, t, n) {\n let r = Object.keys(e), i = r.map((t) => e[t]);\n return (0, vue_1.watch)(i, (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 Ue = [\"innerHTML\"], We = /* @__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: K },\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 ? Ve(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)(() => Be(t.folders ?? { root: [K] }, t.canSelectAll)), s = (e) => (t.canSelectAll && e[0]?.id === 0 && (e[0] = {\n ...e[0],\n name: ze(!0)\n }), e);\n return He({\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 ||= K, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CT5_dKnt_es_js_1.c, {\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_CT5_dKnt_es_js_1.d)(...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, Ue)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), q = {\n id: -1,\n name: \"--\",\n folder_id: K.id,\n folder_path: K.path\n }, J = {\n id: 0,\n name: \"All groups\",\n folder_id: K.id,\n folder_path: K.path\n }, Y = () => (J.name = (0, forms_CjJD60m3_es_js_1.E)()?.Common.All_groups, J), Ge = () => (J.name = (0, forms_CjJD60m3_es_js_1.E)()?.Keywords.Choose_group, J), Ke = (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), qe = (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 }), Je = (e, t) => e.gen(`/add/${t}/groups/`), Ye = (e, t) => e.gen(`/del/${t}/groups/`), Xe = (e, t) => e.gen(`/edit/${t}/groups/rename/`), Ze = { class: \"top-groupSelector_groupItem top-ellipsis1\" }, Qe = {\n key: 0,\n class: \"top-comment\"\n }, $e = [\"innerHTML\"], et = [\"innerHTML\"], tt = [\"innerHTML\"], nt = /* @__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: n, emit: r }) {\n let i = e, a = r, o = (0, vue_1.useModel)(e, \"groupId\"), s = (0, vue_1.useModel)(e, \"group\"), c = i.client && !i.groups ? qe(i.client, i.service) : void 0, l = i.client ? Je(i.client, i.service) : void 0, u = i.client ? Ye(i.client, i.service) : void 0, d = i.client ? Xe(i.client, i.service) : void 0, f = (0, vue_1.ref)(null), p = (0, vue_1.computed)(() => {\n if (i.groups !== void 0)\n return Ke(i.groups, i.on, i.folder);\n }), m = (0, api_nVBtzTDk_es_js_1.i)(\"folder_id\", \"EQUALS\", [i.folder?.id ?? 0]);\n c?.changeParams({\n project_id: i.projectId,\n folder_id_depth: !0,\n filters: [m]\n }), i.on !== void 0 && c?.params.filters?.push((0, api_nVBtzTDk_es_js_1.i)(\"on\", \"EQUALS\", [Number(i.on)]));\n let h = (e) => {\n s.value = e, o.value = e.id;\n }, g = (e = !1) => {\n f.value?.resetCache(e);\n };\n He({\n projectId: () => i.projectId,\n folderId: () => i.folder?.id,\n canSelectAll: () => i.canSelectAll\n }, (e) => {\n if (e.projectId && (c?.changeParams({ project_id: i.projectId }), c?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + i.projectId })), e.folderId && (m.values = [i.folder?.id ?? 0]), g(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && o.value !== null) {\n let e;\n i.autoselect === \"first\" && (e = p.value?.[0], i.canSelectAll && (e = (0, vue_1.reactive)(Y()))), (i.autoselect === \"placeholder\" || !e) && (e = Ge()), h(e);\n }\n }, { immediate: !0 }), He({\n modelGroup: s,\n modelGroupId: o\n }, async (e) => {\n if (o.value !== s.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n o.value = s.value.id;\n return;\n }\n if (!(i.canAdd && o.value === null)) {\n if (i.groups) {\n let e = p.value?.find((e) => e.id === o.value);\n if (!e && i.canSelectAll && (e = Y()), e)\n h(e);\n else {\n let e = p.value?.[0];\n e && !o.value ? h(e) : h(q);\n }\n }\n if (i.client && !i.groups && (o.value || o.value === 0 && !i.canSelectAll)) {\n let e = qe(i.client, i.service).changeParams({\n project_id: i.projectId,\n id: o.value,\n filters: [m]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + i.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(q);\n }\n }\n }\n }, { immediate: !0 });\n let v = async (e) => {\n if (i.canAdd !== \"api\" || !l)\n return;\n let t = s.value, n = await l.changeParams({\n project_id: i.projectId,\n names: [e.name],\n to_id: i.folder?.id ?? K.id,\n to_type: \"in_folder_last\"\n }).call();\n if (n.result) {\n let e = n.result[0];\n h(e), a(\"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: i.projectId,\n id: e.id,\n name: t\n }).call()).errors || (s.value.id === e.id && (s.value.name = t), a(\"editGroup\", {\n id: e.id,\n name: t\n }), f.value?.updateCacheItemById(e.id, { name: t })));\n }, S = async (e) => {\n u && ((await u.changeParams({\n project_id: i.projectId,\n id: e.id\n }).call()).errors || (s.value.id === e.id && h(i.canSelectAll ? Y() : q), a(\"delGroup\", e.id), f.value?.deleteCacheItemById(e.id)));\n };\n return n({ resetCacheGroups: g }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CT5_dKnt_es_js_1.c, {\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_CT5_dKnt_es_js_1.d)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(Y)().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\", Ze, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Qe, (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, $e),\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, et)) : (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_q1PRZblX_es_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_q1PRZblX_es_js_1.r, {\n isWarning: \"\",\n submitText: t.$i18n.Common.Delete,\n onSubmit: (e) => S(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, tt)]),\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 }), rt = { class: \"top-groupSelector\" }, it = /* @__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: q },\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 = Be(r.folders ?? { root: [K] }, 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 = Y()), (r.autoselect === \"placeholder\" || !u) && (u = Ge()), u ??= q, 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 let t = r.groups.find((t) => t.id === e.id);\n if (!t)\n return;\n let n = {\n ...t,\n ...e\n }, i = r.groups.map((e) => e.id === n.id ? n : e);\n l(\"update:groups\", i);\n }, p = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n let t = r.groups.filter((t) => t.id !== e);\n l(\"update:groups\", t);\n };\n return t({ resetCacheGroups: (e = !1) => {\n i.value?.resetCacheGroups(e);\n } }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", rt, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(We, {\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)(nt, {\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 }), at = (e) => ({\n id: null,\n name: e,\n listItemProps: {\n type: \"title\",\n class: \"top-projectSelector_item\"\n }\n }), ot = (e) => {\n let t = [], r = {\n scheduledUpdate: at((0, forms_CjJD60m3_es_js_1.E)().Projects.Scheduled_update),\n manualUpdate: at((0, forms_CjJD60m3_es_js_1.E)().Projects.Manual_update),\n guestProjects: at((0, forms_CjJD60m3_es_js_1.E)().Projects.Guest_projects)\n }, i = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n };\n for (let n of e)\n !i.scheduledUpdate && n.right?.startsWith(\"1\") && n.on > 0 && (t.push(r.scheduledUpdate), i.scheduledUpdate = !0), !i.manualUpdate && n.right?.startsWith(\"1\") && n.on === 0 && (t.push(r.manualUpdate), i.manualUpdate = !0), !i.guestProjects && n.right?.startsWith(\"0\") && n.on >= 0 && (t.push(r.guestProjects), i.guestProjects = !0), t.push(n);\n return t;\n }, st = (e) => ({\n ...e,\n externalLink: pt(e.url ?? \"\"),\n listItemProps: {\n class: \"top-projectSelector_item\",\n attrs: { title: e.name }\n }\n }), ct = (e) => !e || e.length === 0 ? [] : ot(e.map(st)), lt = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return 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) => {\n location.href = dt(e);\n }, dt = (e) => {\n let t = ft(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n 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] + \"/\");\n let a = \"https://\" + t + \"/\" + r + e + \"/\" + i;\n return a = lt(a), a;\n }, ft = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, pt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"https://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, mt = (e, n) => {\n let r = e.params.filters ?? [];\n r = r.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let i = (0, keyboard_js_1.invertKeyboardLayout)(n), a = n.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), o = i.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n n && r.push((0, api_nVBtzTDk_es_js_1.i)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${a}|${o})`])), e.changeParams({ filters: r });\n }, ht = (n) => {\n let i = n.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return i.changeParams({\n filters: [(0, api_nVBtzTDk_es_js_1.i)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, api_nVBtzTDk_es_js_1.a)(\"user_id\", \"DESC\", [forms_CjJD60m3_es_js_1.O.state.userId]),\n (0, api_nVBtzTDk_es_js_1.a)(\"on\", \"ASC\", [0]),\n (0, api_nVBtzTDk_es_js_1.a)(\"favorite\", \"DESC\"),\n (0, api_nVBtzTDk_es_js_1.a)(\"ord\", \"ASC\"),\n (0, api_nVBtzTDk_es_js_1.a)(\"id\", \"DESC\")\n ]\n }), i.options.loadingShowSpinner = !1, i;\n }, gt = (e) => e.gen(\"/add/projects_2/projects/\"), _t = { class: \"top-ellipsis1\" }, vt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: { id: {} },\n setup(e) {\n let t = e, i = (0, forms_CjJD60m3_es_js_1.E)(), a = ft(), o = (e) => {\n let t = [\n {\n href: `https://${a}/project/keywords/${e.id}/`,\n title: i.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${a}/project/dynamics/${e.id}/`,\n title: i.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/snapshots/${e.id}/`,\n title: i.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/competitors/${e.id}/`,\n title: i.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/ai-tracker/${e.id}/`,\n title: i.Common.Menu_aiTracker,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/analytics/${e.id}/`,\n title: i.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${a}/project/broker/${e.id}/`,\n title: i.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/sitemap/`,\n title: i.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/audit/`,\n title: i.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/indexing/`,\n title: i.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/watcher/`,\n title: i.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${a}/project/settings/${e.id}/`,\n title: i.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ].filter((e) => !Object.entries(forms_CjJD60m3_es_js_1.O.state.closedByMod).some(([t, n]) => n && e.href.includes(`/${t}/`)));\n return e.right.includes(\"0\") ? t.filter((t) => e.right[t.right] === \"1\") : t;\n };\n return (e, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_q1PRZblX_es_js_1.s), {\n id: t.id,\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n contentList: (0, vue_1.withCtx)(({ data: t }) => [t ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o(t.projectItem), (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_q1PRZblX_es_js_1.o), {\n href: t.href,\n title: t.title,\n \"data-top-icon\": t.icon,\n \"data-right\": t.right\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.title : \"\"), 1)]),\n _: 2\n }, 1032, [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ]))), 256)), (0, vue_1.createVNode)((0, vue_1.unref)(popup_q1PRZblX_es_js_1.o), {\n href: t.projectItem.externalLink,\n title: t.projectItem.externalLink,\n class: \"top-ellipsis\",\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", _t, (0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.projectItem.externalLink : \"\"), 1)]),\n _: 2\n }, 1032, [\"href\", \"title\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\"id\"]));\n }\n }), X = \"ui_project_selector_total\", yt = 864e5, bt = (0, vue_1.ref)(null), Z = (0, vue_1.shallowRef)(), xt = (e) => {\n localStorage.setItem(X + \":\" + forms_CjJD60m3_es_js_1.O.state.userId, JSON.stringify({\n projectsTotal: e,\n expiresAt: Date.now() + yt\n }));\n }, St = () => {\n let e = localStorage.getItem(X + \":\" + forms_CjJD60m3_es_js_1.O.state.userId);\n if (!e)\n return;\n let { projectsTotal: t, expiresAt: n } = JSON.parse(e);\n if (Date.now() > n) {\n localStorage.removeItem(X + \":\" + forms_CjJD60m3_es_js_1.O.state.userId);\n return;\n }\n return t;\n }, Ct = () => {\n bt.value = null, Z.value = void 0, localStorage.removeItem(X + \":\" + forms_CjJD60m3_es_js_1.O.state.userId), (0, formsExt_CT5_dKnt_es_js_1.f)(\"/get/projects_2/projects/\");\n }, wt = { class: \"top-projectSelector_itemText\" }, Tt = { class: \"top-comment\" }, Et = {\n key: 0,\n class: \"top-comment\"\n }, Dt = [\"href\"], Ot = 1e3, kt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n menuMode: { type: Boolean },\n excludeProjectId: {},\n openerShortcut: {},\n modificator: {},\n placeholder: {},\n buttonProps: { default: () => ({\n color: \"theme\",\n styling: \"outline\"\n }) }\n }, {\n modelValue: { default: () => ({\n id: null,\n name: \"\"\n }) },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e, { expose: t }) {\n let i = (0, forms_CjJD60m3_es_js_1.E)(), a = e, o = (0, vue_1.useModel)(e, \"modelValue\"), s = ht(a.client), c = gt(a.client), l = (0, vue_1.ref)(St()), f = (0, vue_1.ref)(null), p = (0, vue_1.useId)(), m = !1, h = (0, vue_1.computed)(() => a.placeholder ?? i.Projects.Select_project), _ = (0, vue_1.computed)(() => Z.value ? ct(a.excludeProjectId ? Z.value.filter((e) => e.id !== a.excludeProjectId) : Z.value) : void 0), v = (e) => typeof e.id == \"number\" && \"on\" in e && \"right\" in e, ee = (e) => {\n let t = e.filter(v), n = e.filter((e) => !v(e));\n return [...ct(t), ...n];\n }, y = (e = !1) => {\n let t = Z.value && S.value === \"static\" ? Z.value : f.value?.getLoadedItems();\n if (!t)\n return null;\n let n = t.findIndex((e) => e.id === o.value.id);\n return n === -1 ? null : n === 0 && e ? !1 : t[n + (e ? -1 : 1)]?.id ?? null;\n }, x = async (e = !1) => {\n if (!f.value || m)\n return;\n if (S.value || await P(), S.value === \"static\" && !await A()) {\n m = !1;\n return;\n }\n m = !0;\n let t = y(e);\n if (S.value === \"api\")\n for (; f.value.getNextOffset() !== null && t === null && await f.value.loadItems(f.value.getNextOffset() !== void 0);)\n t = y(e);\n m = !1, t && ut(t);\n }, S = (0, vue_1.computed)(() => {\n if (l.value || l.value === 0)\n return l.value < Ot ? \"static\" : \"api\";\n }), C = async () => {\n bt.value ||= s.call();\n let e = await bt.value;\n return bt.value = null, e;\n }, A = async () => {\n if (Z.value)\n return !0;\n let e = await C();\n return !e.errors && (Z.value = e.result, !0);\n }, N = async (e) => {\n let t = await c.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!t.errors) {\n if (Z.value && S.value === \"static\") {\n let n = {\n id: t.result,\n user_id: forms_CjJD60m3_es_js_1.O.state.userId,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\"\n }, i = Z.value.findIndex((e) => e.on === 0);\n Z.value = [\n ...Z.value.slice(0, i),\n n,\n ...Z.value.slice(i)\n ], l.value && (l.value += 1, xt(l.value));\n }\n S.value === \"api\" && f.value?.resetCache(!0);\n }\n }, te = async () => {\n S.value === \"static\" && await A();\n }, P = async () => {\n if (l.value) {\n let e = f.value?.popupOpenerRef?.$el;\n e && e.addEventListener(\"pointerenter\", () => te(), { once: !0 });\n }\n else {\n s.changeParams({ limit: Ot });\n let e = await C();\n if (e.errors)\n return;\n delete s.params.limit, l.value = e.total ?? void 0, !Z.value && S.value !== \"api\" && (Z.value = e.result), l.value && xt(l.value);\n }\n };\n return t({ navigateToAdjacentProject: x }), (0, vue_1.onMounted)(async () => {\n await P();\n }), (t, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CT5_dKnt_es_js_1.c, {\n key: S.value ?? \"dummy\",\n ref_key: \"refSelector\",\n ref: f,\n class: \"top-projectSelector\",\n modelValue: o.value,\n \"onUpdate:modelValue\": n[1] ||= (t) => e.menuMode ? (0, vue_1.unref)(ut)(t.id) : o.value = t,\n items: _.value,\n itemsChunkSize: 100,\n itemsIsLoading: S.value === \"static\" && (0, vue_1.unref)(Z) === void 0,\n title: t.$i18n.Projects.Search_projects,\n modificator: e.modificator,\n searchFields: [\n \"id\",\n \"name\",\n \"url\"\n ],\n placeholder: h.value,\n hasCloserBtn: \"\",\n api: S.value === \"api\" ? (0, vue_1.unref)(s) : void 0,\n apiSetSearchParams: S.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 ...e.buttonProps,\n isProgress: !S.value,\n disabled: !S.value\n },\n openerShortcut: e.openerShortcut,\n prepareItemsBeforeRender: S.value === \"api\" ? ee : void 0,\n onAppendItem: N,\n onOpen: te\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", wt, [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\", Tt, \" 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\", Et, (0, vue_1.toDisplayString)(t.$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 e.menuMode ? ((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 }, null, 8, Dt)) : (0, vue_1.createCommentVNode)(\"\", !0),\n t.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n href: i.externalLink,\n \"data-top-icon\": \"\",\n color: \"theme\",\n target: \"_blank\",\n onClick: n[0] ||= (0, vue_1.withModifiers)(() => { }, [\"stop\"])\n }, null, 8, [\"href\"])),\n (0, vue_1.createVNode)(popup_q1PRZblX_es_js_1.c, {\n id: (0, vue_1.unref)(p),\n pos: \"2\",\n notch: !1,\n data: { projectItem: i }\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-popup_listMore\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n _: 1\n }, 8, [\"id\", \"data\"])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"itemsIsLoading\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\",\n \"prepareItemsBeforeRender\"\n ])), (0, vue_1.createVNode)(vt, { id: (0, vue_1.unref)(p) }, null, 8, [\"id\"])], 64);\n };\n }\n }), At = (e) => \"-\" + e, Q = (e) => e[0] === \"-\" ? e.substring(1) : e, jt = (e, t) => {\n e = Q(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, Mt = (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_F_Y1IEi2_es_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), a = {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n };\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", a), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Pt(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Pt(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), Pt(r, e, n);\n }), Pt(r, e, n), r;\n }, Nt = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Pt = (e, t, r) => {\n let i = (0, vue_1.unref)(t.modelValue);\n if (e.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), e.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), t.mode === \"setter\" && t.filters) {\n e.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (e.innerHTML = \"\", !i.length && t.mode === \"filter\") {\n let t = Ft({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_CjJD60m3_es_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n e.append(t);\n }\n i.forEach((n) => {\n let r = Ft({\n id: Q(n),\n colorId: jt(n, t.tags)?.color_id ?? \"\",\n name: jt(n, t.tags)?.name ?? \"\",\n state: Q(n) === n ? \"selected\" : \"excluded\"\n });\n e.append(r);\n });\n }, Ft = (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 }, It = [\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 ], Lt = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], Rt = /* @__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, Lt));\n }\n }), zt = [\"contenteditable\", \"onKeydown\"], Bt = /* @__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_q1PRZblX_es_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)(Rt, {\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, zt),\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 }), Vt = { key: 1 }, Ht = /* @__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, { attrs: t }) {\n let n = e, r = (0, vue_1.useModel)(e, \"modelValue\"), i = n.useTopButton ? forms_CjJD60m3_es_js_1.h : \"div\", o = n.useTopButton ? \"html\" : \"default\", s = {\n model: r,\n mode: n.mode,\n targetId: n.targetId,\n filters: n.filters,\n payload: n.payload\n };\n return (a, c) => {\n let l = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_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\": n.useTopButton,\n \"top-tagSelector-custom\": !n.useTopButton,\n \"top-as-selector\": n.useTopButton,\n \"top-tagSelector-filter\": n.mode === \"filter\",\n \"top-tagSelector-setter_single\": n.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": n.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !r.value.length || r.value.length === 1,\n \"top-tagSelector-toTwoLine\": r.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, t), {\n [(0, vue_1.unref)(o)]: (0, vue_1.withCtx)(() => [!r.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Rt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: a.$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\", Vt, [(0, vue_1.renderSlot)(a.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(r.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Rt, {\n id: (0, vue_1.unref)(Q)(t),\n colorId: (0, vue_1.unref)(jt)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(jt)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(Q)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n l,\n s,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Ut = /* @__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)(It) },\n tagsModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(e, { emit: t }) {\n let c = (0, forms_CjJD60m3_es_js_1.E)(), l = e, u = (0, vue_1.useModel)(e, \"modelValue\"), d = (0, vue_1.useModel)(e, \"tags\"), f = t, p = (0, forms_CjJD60m3_es_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(At(e)))\n return \"excluded\";\n }\n return e === \"all\" && !_.value.model.value.length ? \"selected\" : \"\";\n }, x = (e, t) => {\n let n = At(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 }, S = (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 }), C = () => {\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 }, k = (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_CjJD60m3_es_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_CjJD60m3_es_js_1.O.state.isMobile && !forms_CjJD60m3_es_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 }, N = (e) => {\n forms_CjJD60m3_es_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(Ht, {\n modelValue: u.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: e.styling,\n mode: \"filter\",\n useTopButton: e.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_q1PRZblX_es_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(S.value),\n onOpen: n[4] ||= (e) => k(e),\n onClose: n[5] ||= (e) => N(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n _.value.mode === \"filter\" && !e.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Bt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: t.$i18n.Common.All_tags ?? \"\",\n state: _.value.model.value.length ? \"\" : \"selected\",\n onSelect: n[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, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Bt, {\n key: t.id,\n id: t.id,\n colorId: t.color_id,\n name: t.name,\n state: b(t.id),\n canExclude: _.value.mode === \"filter\" && !e.singleMode,\n editable: e.tagsEditable,\n disabled: ee.value && b(t.id) === \"\",\n onUnselect: (e) => x(t.id, \"unselect\"),\n onSelect: (e) => x(t.id, \"select\"),\n onExclude: (e) => x(t.id, \"exclude\"),\n \"onUpdate:name\": (e) => {\n t.name = e, (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 e.tagsEditable && d.value.length < e.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_q1PRZblX_es_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(C, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$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_CjJD60m3_es_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": n[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_CjJD60m3_es_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_CjJD60m3_es_js_1.h, { onClick: n[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\" ? t.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? t.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? t.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = it;\n exports.topProjectSelectorClearCache = Ct;\n exports.TopProjectSelector = kt;\n exports.genElTopTagSelectorPopupOpener = Mt;\n exports.renderElTopTagSelectorPopupOpener = Nt;\n exports.TopTagSelectorTagIcon = Rt;\n exports.TopTagSelectorPopupOpener = Ht;\n exports.TopTagSelector = Ut;\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\t22: 'YandexLive',\n};\n\nexport const regionUndefined: Region = {\n\talt: '',\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\talt: '',\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\talt: '',\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 * Поисковики в которых поиск происходит всегда по `url`, а поиск по домену невозможен\n */\nconst SEARCHERS_KEYS_CHECKS_URLS = [\n\t// YouTube\n\t4,\n\t// AppStore\n\t8,\n\t// GooglePlay\n\t9,\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\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 === 'volume' || forMode === 'cost_forecast') {\n\t\tsearcherByKey = genSearchersMapForKeywordsStats(searchers);\n\t} else if (forMode === 'project_relevant_url') {\n\t\tsearcherByKey = genSearchersMapForRelevants(searchers);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers, true);\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 * Список ПС с регионами для проверки частоты (Яндекс, Google)\n */\nconst genSearchersMapForKeywordsStats = (searchers: Searcher[]) => {\n\tsearchers = searchers.filter(searcher => Core.state.forceSearchersKeysForKeywordsStats.includes(searcher.key));\n\n\tconst searcherByKey = genSearchersMapCommon(searchers, false);\n\n\t// Обязательные для вывода ПС\n\tCore.state.forceSearchersKeysForKeywordsStats.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\tif (Core.state.showGlobalRegionForKeywordsStats) {\n\t\t// добавление глобального региона\n\t\tsearcherByKey.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 searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки релевантных\n *\n * - Не выводит ПС, в которых нет понятия релевантной, например `YouTube`\n * - Выводит и включенные и выклчюенные регионы\n */\nconst genSearchersMapForRelevants = (searchers: Searcher[]) => {\n\tsearchers = searchers.filter(searcher => !SEARCHERS_KEYS_CHECKS_URLS.includes(searcher.key));\n\n\treturn genSearchersMapCommon(searchers, false);\n}\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @paramo onlyAndForceSearchersKeys Ключи ПС, которые нужно вывести в любом случае, другие ПС скрыть из вывода\n */\nconst genSearchersMapCommon = (searchers: Searcher[], onlyEnabledRegions: boolean) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (onlyEnabledRegions && !searcher.enabled) 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) {\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\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\treturn searcherByKey;\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\tconst useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\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 (useRegionKey.value) {\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\tconst regionLabel = region.name;\n\n\t\t\t/**\n\t\t\t * На частоту в текущей версии устройство и язык не влияют.\n\t\t\t * В качестве ключа используется `region.key`, а не `region.index`.\n\t\t\t */\n\t\t\tif (useRegionKey.value) {\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\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\n\t\t\tlet regionLabelSuffix = '';\n\t\t\tif (region.device !== undefined) regionLabelSuffix = i18n.Common['Device_' + region.device];\n\t\t\tif (langLabel) regionLabelSuffix += regionLabelSuffix ? `, ${langLabel}` : langLabel;\n\t\t\tif (region.alt) regionLabelSuffix += regionLabelSuffix ? `, ${region.alt}` : region.alt;\n\n\t\t\tif (regionLabelSuffix) regionLabelSuffix = ` (${regionLabelSuffix})`;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel + regionLabelSuffix,\n\t\t\t\ticon: region.device !== undefined ? 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\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\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, 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 useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\n\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\t// if (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 (useRegionKey.value && 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 { computed, 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});\nconst useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\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 (props.forMode !== 'project_relevant_url' && !searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (props.forMode !== 'project_relevant_url' && !region.enabled) return;\n\t\t\tif (region.index === globalRegionIndex) 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 (useRegionKey.value) {\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 (useRegionKey.value) {\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\t// if (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 = useRegionKey.value ? 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\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=\"useRegionKey ? 'region_key' : 'region_index'\"\n\t\t\t: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\t// Модификация группы без переприсвоения, чтобы не вызывать лишних запросов\n\tif (modelGroup.value.id === group.id) modelGroup.value.name = newName;\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 = (groupEditedPatch: Partial<Group> & { id: Group['id'] }) => {\n\t// если загрузка групп производится по api, то обновлять группы в `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groupFinded = props.groups.find((group) => group.id === groupEditedPatch.id);\n\tif (!groupFinded) return;\n\n\tconst groupEdited = { ...groupFinded, ...groupEditedPatch };\n\n\tconst groups = props.groups.map((group) => group.id === groupEdited.id ? groupEdited : group);\n\n\temit('update:groups', groups);\n};\n\nconst onDelGroup = (groupDeletedId: Group['id']) => {\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 !== groupDeletedId);\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 { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\nimport Core from '@/core/core/core';\nimport type { Props } from '@/components/formsExt/selector2/types';\nimport type { Item, Project } from './types';\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\tclass: 'top-projectSelector_item',\n\t\t},\n\t};\n};\n\n/**\n * Сгенерировать результат с заголовками категорий перед соответствующими группами проектов\n */\nconst genResultWithCategoryTitles = (projects: Item[]): 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 = {\n\t\tscheduledUpdate: false,\n\t\tmanualUpdate: false,\n\t\tguestProjects: false,\n\t};\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 * Сгенерировать элемент для TopSelector\n */\nexport const genProjectItem = (project: Project): Item => ({\n\t...project,\n\texternalLink: genProjectExternalLink(project.url ?? ''),\n\tlistItemProps: {\n\t\tclass: 'top-projectSelector_item',\n\t\tattrs: {\n\t\t\ttitle: project.name!,\n\t\t},\n\t},\n});\n\n/**\n * Подготовить данные проектов для отображения:\n * - добавить `listItemProps` для шаблона TopSelector\n * - добавить заголовки к категориям\n */\nexport const prepareProjects = (projects: Project[] | undefined): Item[] | undefined => {\n\tif (!projects || projects.length === 0) return [];\n\n\tconst projectsWithListItem = projects.map(genProjectItem);\n\n\treturn genResultWithCategoryTitles(projectsWithListItem);\n};\n\n/**\n * Добавить к ссылке релевантные hash-параметров текущего проекта\n */\nconst prepareProjectLink = (link: string) => {\n\tlink = link.replace(/#.*/, '');\n\n\tlet hash = location.hash;\n\n\t// Игнорируемые параметры при переходе между проектами (формат плагина piniaTPA)\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// Сохранить сортировку по дате последней проверки\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\nexport const navigateToProject = (projectId: number) => {\n\tlocation.href = genLinkToProjectMod(projectId);\n};\n\n/**\n * Сгенерировать ссылку на страницу проекта с инструментом\n *\n * @note Ссылка сейчас пересчитывается только в момент открытия меню\n */\nexport const genLinkToProjectMod = (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\tlet link = 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n\tlink = prepareProjectLink(link);\n\n\treturn link;\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 : 'https://' + 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: { name: string; }) => { return 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 */\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.userId]),\n\t\t\tgenFieldOrder('on', 'ASC', [0]),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('ord', 'ASC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t});\n\n\tapi.options.loadingShowSpinner = false;\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 { PopupData, Props } from './types';\nimport { TopPopup, TopPopupListItem } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\nimport { Core } from '@/core/app';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst genItems = (projectItem: PopupData['projectItem']) => {\n\tconst submenuItems = [\n\t\t{\n\t\t\thref: `https://${host}/project/keywords/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_phrases,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/dynamics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_dynamics,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/snapshots/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_snapshots,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/competitors/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_competitors,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/ai-tracker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_aiTracker,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/analytics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_analytics,\n\t\t\ticon: '',\n\t\t\tright: '5',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/broker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_broker,\n\t\t\ticon: '',\n\t\t\tright: '6',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/sitemap/`,\n\t\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/audit/`,\n\t\t\ttitle: i18n.Common.Menu_audit,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/indexing/`,\n\t\t\ttitle: i18n.Audit.Indexing,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/watcher/`,\n\t\t\ttitle: i18n.Audit.Watcher,\n\t\t\ticon: '',\n\t\t\tright: '9',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/settings/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_settings,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t].filter(item => {\n\t\treturn !Object.entries(Core.state.closedByMod).some(([mod, closed]) => {\n\t\t\treturn closed && item.href.includes(`/${mod}/`);\n\t\t});\n\t});\n\n\tif (!projectItem.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn projectItem.right[item.right] === '1';\n\t});\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\t:id=\"props.id\"\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #contentList=\"{ data }: { data: PopupData }\">\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\tv-for=\"item in genItems(data.projectItem)\"\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>\n\t\t\t\t\t{{ $core.state.isMobile ? item.title : '' }}\n\t\t\t\t</TopPopupListItem>\n\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\t:href=\"data.projectItem.externalLink\"\n\t\t\t\t\t:title=\"data.projectItem.externalLink\"\n\t\t\t\t\tclass=\"top-ellipsis\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ $core.state.isMobile ? data.projectItem.externalLink : '' }}\n\t\t\t\t\t</span>\n\t\t\t\t</TopPopupListItem>\n\t\t\t</template>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n@media (width >= 900px) {\n\t.top-projectSelectorSubmenu .top-popup {\n\t\tmin-width: unset;\n\t}\n\n\t.top-projectSelectorSubmenu ul {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(3, 1fr);\n\t}\n\n\t.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t\t--top-icon-size: 24px;\n\t\t--top-icon-width: 32px;\n\n\t\theight: var(--top-icon-width);\n\t\tmargin: 0;\n\t}\n}\n</style>\n","import { clearCache as SelectorClearCache } from '@/components/formsExt/selector2/cache';\nimport { ref, shallowRef } from 'vue';\nimport Core from '@/core/core/core';\nimport type { Project } from './types';\n\nconst CACHE_KEY = 'ui_project_selector_total';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов между экземплярами: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n *\n * @todo Добавить поддержку моков\n */\nexport const projectsCache = shallowRef<Project[]>();\n\nexport const setCacheTotal = (projectsTotal: number) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY + ':' + Core.state.userId,\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.userId);\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.userId);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\n/**\n * Сбросить локальный кеш и кеш API `/get/projects_2/projects/`\n */\nexport const clearCache = () => {\n\tprojectsRequest.value = null;\n\tprojectsCache.value = undefined;\n\n\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.userId);\n\n\tSelectorClearCache('/get/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport type { ComponentExposed } from 'vue-component-type-helpers';\nimport type { Props, Item, Project } from './types';\nimport type { PopupData } from './submenu/types';\nimport { computed, onMounted, ref, useId } 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 TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport Submenu from './submenu/submenu.vue';\nimport { apiSetSearchParamsFilter, genApiAddProject, genApiGetProjects, genLinkToProjectMod, prepareProjects, navigateToProject } from './utils';\nimport { getCacheTotal, projectsCache, projectsRequest, setCacheTotal } from './cache';\n\nconst i18n = useI18n();\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n *\n * Это же значение используется как лимит при загрузке списка проектов\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = withDefaults(defineProps<Props>(), {\n\tbuttonProps: () => {\n\t\treturn {\n\t\t\tcolor: 'theme',\n\t\t\tstyling: 'outline',\n\t\t};\n\t},\n});\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({\n\tdefault: () => {\n\t\treturn {\n\t\t\tid: null,\n\t\t\tname: '',\n\t\t};\n\t},\n});\n\nconst apiGet = genApiGetProjects(props.client);\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | undefined>(getCacheTotal());\nconst refSelector = ref<ComponentExposed<typeof Selector2<Item>> | null>(null);\nconst uid = useId();\n\nlet isLoadingNextProject = false;\n\nconst placeholder = computed(() => {\n\treturn props.placeholder ?? i18n.Projects.Select_project;\n});\n\nconst itemsForSelector = computed(() => {\n\tif (!projectsCache.value) return;\n\n\tconst projects = props.excludeProjectId ? projectsCache.value.filter((project) => project.id !== props.excludeProjectId) : projectsCache.value;\n\n\treturn prepareProjects(projects);\n});\n\n/**\n * Является ли элемент списка Selector2 проектом\n */\nconst isProject = (item: Item) => typeof item.id === 'number' && 'on' in item && 'right' in item;\n\n/**\n * Нормализовать элементы перед отображением\n */\nconst prepareApiItemsForRender = (items: Item[]) => {\n\tconst projects = items.filter(isProject) as Project[];\n\t// Элементы, добавленные в Selector2 после списка проектов\n\tconst appendedItems = items.filter((item) => !isProject(item));\n\n\treturn [\n\t\t...prepareProjects(projects),\n\t\t...appendedItems,\n\t];\n};\n\n/**\n * Получить id соседнего проекта\n */\nconst getAdjacentProjectId = (prev = false) => {\n\tconst projects = projectsCache.value && dataSource.value === 'static' ? projectsCache.value : refSelector.value?.getLoadedItems();\n\tif (!projects) return null;\n\n\tconst projectIndex = projects.findIndex((project) => project.id === model.value.id);\n\tif (projectIndex === -1) return null;\n\tif (projectIndex === 0 && prev) return false;\n\n\tconst indexShift = prev ? -1 : 1;\n\tconst adjacentProject = projects[projectIndex + indexShift];\n\n\treturn adjacentProject?.id ?? null;\n};\n\n/**\n * Перейти к соседнему проекту\n *\n * `prev` равна false - переход к следующему проекту; `prev` равна true - переход к предыдущему проекту\n */\nconst navigateToAdjacentProject = async (prev = false) => {\n\tif (!refSelector.value) return;\n\tif (isLoadingNextProject) return;\n\n\tif (!dataSource.value) await initProjects();\n\n\tif (dataSource.value === 'static') {\n\t\tconst isLoaded = await loadStaticProjects();\n\t\tif (!isLoaded) {\n\t\t\tisLoadingNextProject = false;\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\tisLoadingNextProject = true;\n\n\tlet adjacentProjectId = getAdjacentProjectId(prev);\n\n\tif (dataSource.value === 'api') {\n\t\twhile (refSelector.value.getNextOffset() !== null && adjacentProjectId === null) {\n\t\t\tconst projects = await refSelector.value.loadItems(refSelector.value.getNextOffset() !== undefined);\n\t\t\tif (!projects) break;\n\n\t\t\tadjacentProjectId = getAdjacentProjectId(prev);\n\t\t}\n\t}\n\n\tisLoadingNextProject = false;\n\tif (!adjacentProjectId) return;\n\n\tnavigateToProject(adjacentProjectId);\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\nconst getProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tprojectsRequest.value = apiGet.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\nconst loadStaticProjects = async () => {\n\tif (projectsCache.value) return true;\n\n\tconst res = await getProjects();\n\tif (res.errors) return false;\n\n\tprojectsCache.value = res.result;\n\n\treturn true;\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (item: SelectorItem) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: item.name,\n\t\tname: item.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: res.result,\n\t\t\tuser_id: Core.state.userId,\n\t\t\tname: item.name,\n\t\t\turl: item.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\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\t// Сбросить кеш popup и его API, `projectsCache` сбрасывать не нужно\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n *\n * Только при `dataSource` = `static`\n *\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (dataSource.value !== 'static') return;\n\n\tawait loadStaticProjects();\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (!projectsTotal.value) {\n\t\tapiGet.changeParams({ limit: PROJECTS_TOTAL_THRESHOLD });\n\n\t\tconst res = await getProjects();\n\t\tif (res.errors) return;\n\n\t\tdelete apiGet.params.limit;\n\n\t\tprojectsTotal.value = res.total ?? undefined;\n\t\tif (!projectsCache.value && dataSource.value !== 'api') projectsCache.value = res.result;\n\n\t\tif (projectsTotal.value) setCacheTotal(projectsTotal.value);\n\t} else {\n\t\t/**\n\t\t * Спекулятивное выполнение загрузки проектов\n\t\t *\n\t\t * UX: Отзывчивость\n\t\t */\n\t\tconst elPopupOpenel = refSelector.value?.popupOpenerRef?.$el;\n\t\tif (elPopupOpenel) {\n\t\t\telPopupOpenel.addEventListener('pointerenter', () => onOpen(), { once: true });\n\t\t}\n\t}\n};\n\ndefineExpose({\n\tnavigateToAdjacentProject,\n});\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\t:key=\"dataSource ?? 'dummy'\"\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\t:modelValue=\"model\"\n\t\t@update:modelValue=\"!menuMode ? model = $event : navigateToProject($event.id)\"\n\t\t:items=\"itemsForSelector\"\n\t\t:itemsChunkSize=\"100\"\n\t\t:itemsIsLoading=\"dataSource === 'static' && projectsCache === undefined\"\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: any) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps=\"{...buttonProps, isProgress:!dataSource, disabled:!dataSource}\"\n\t\t:openerShortcut\n\t\t:prepareItemsBeforeRender=\"dataSource === 'api' ? prepareApiItemsForRender : undefined\"\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_itemText\">\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\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</template>\n\n\t\t\t\t<template v-else>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"menuMode\"\n\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t:href=\"genLinkToProjectMod(item.id)\"\n\t\t\t\t></a>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t:href=\"item.externalLink\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t@click.stop\n\t\t\t\t></TopButton>\n\n\t\t\t\t<!-- @vue-generic {PopupData} -->\n\t\t\t\t<TopPopupOpener\n\t\t\t\t\t:id=\"uid\"\n\t\t\t\t\t:pos=\"'2'\"\n\t\t\t\t\t:notch=\"false\"\n\t\t\t\t\t:data=\"{ projectItem: item } satisfies PopupData\"\n\t\t\t\t>\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tclass=\"top-popup_listMore\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t></TopButton>\n\t\t\t\t</TopPopupOpener>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n\n\t<Submenu :id=\"uid\"/>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\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_item > .top-button {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-projectSelector_item:hover > .top-button,\n.top-projectSelector_item.top-active > .top-button {\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 > .top-button {\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 */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\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"]}