@topvisor/ui 1.5.0-updates.7 → 1.5.0-updates.8
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.
- package/package.json +1 -1
- package/project/project.amd.js +1 -1
- package/project/project.amd.js.map +1 -1
- package/project/project.js +13 -1
- package/project/project.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["project/project.js","../../src/components/project/competitorSelector/competitorSelector.vue","../../src/components/project/competitorSelector/composables.ts","../../src/components/project/regionSelector/utils/consts.ts","../../src/components/project/regionSelector/utils/utils.ts","../../src/components/project/regionSelector/composables/selectSearcher.ts","../../src/components/project/regionSelector/composables/selectRegion.ts","../../src/components/project/regionSelector/composables/compare.ts","../../src/components/project/regionSelector/composables/selectorRegion.ts","../../src/components/project/regionSelector/regionSelector.vue","../../src/components/project/groupSelector/folders/utils.ts","../../src/core/utils/composables/useWatch.ts","../../src/components/project/groupSelector/folders/folders.vue","../../src/components/project/groupSelector/groups/utils.ts","../../src/components/project/groupSelector/groups/groups.vue","../../src/components/project/groupSelector/groupSelector.vue","../../src/components/project/projectSelector/utils.ts","../../src/components/project/projectSelector/submenu/submenu.vue","../../src/components/project/projectSelector/cache.ts","../../src/components/project/projectSelector/projectSelector.vue","../../src/components/project/tagSelector/utils/utils.ts","../../src/components/project/tagSelector/utils/el.ts","../../src/components/project/tagSelector/tagsDefaults.ts","../../src/components/project/tagSelector/tagIcon/tagIcon.vue","../../src/components/project/tagSelector/popupListItem/tagPopupListItem.vue","../../src/components/project/tagSelector/popupOpener/popupOpener.vue","../../src/components/project/tagSelector/tagSelector.vue"],"names":["k2","k","desc","m","o","v","\"default\"","ownKeys","ar","mod","result","i","vue","exports","he","ge","_e","vue_1","n","a","forms_CbUt_6Ff_esm_js_1","popup_DrByVU_k_esm_js_1","formsExt_CrTmBhja_esm_js_1","ve","ye","be","xe","V","Se","Ce","we","Te","Ee","De","ke","Oe","Ae","je","utils_BwiXsV0S_esm_js_1","require","resolve_1","reject_1","Me","r","e","t","searchers_js_1","Ne","Pe","Fe","Ie","s","c","l","u","d","f","p","$i18n","H","Le","Re","ze","Be","Ve","He","U","W","G","Ue","We","Ge","Ke","qe","Je","Ye","Xe","Ze","field_CjkpGeA7_esm_js_1","Qe","$e","et","tt","nt","rt","it","at","ot","worker_Db8YrEHo_esm_js_1","st","ct","lt","ut","keyboard_js_1","dt","ft","pt","mt","ht","gt","_t","K","vt","q","yt","J","bt","xt","St","Ct","wt","Tt","Et","Dt","Ot","kt","_","h","ee","g","check_js_1","string_js_1","At","Y","X","jt","dom_js_1","Z","Mt","Nt","Pt","Ft","Q","It","Lt","Rt","zt","Bt","y","b","E","ne","A","re"],"mappings":"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","sourcesContent":["var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\ndefine([\"require\", \"exports\", \"../.chunks/forms-CbUt-6Ff.esm.js\", \"../.chunks/field-CjkpGeA7.esm.js\", \"../utils/dom.js\", \"../.chunks/worker-Db8YrEHo.esm.js\", \"../utils/check.js\", \"../utils/string.js\", \"../.chunks/utils-BwiXsV0S.esm.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-DrByVU-k.esm.js\", \"../.chunks/formsExt-CrTmBhja.esm.js\", \"vue\", \"../.chunks/api-CawzY1Cw.esm.js\", \"../.chunks/app-CCX-gNqz.esm.js\", \"../popup/worker.js\"], function (require, exports, forms_CbUt_6Ff_esm_js_1, field_CjkpGeA7_esm_js_1, dom_js_1, worker_Db8YrEHo_esm_js_1, check_js_1, string_js_1, utils_BwiXsV0S_esm_js_1, searchers_js_1, keyboard_js_1, popup_DrByVU_k_esm_js_1, formsExt_CrTmBhja_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.renderElTopTagSelectorPopupOpener = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = exports.clearCache = exports.TopTagSelectorTagIcon = exports.TopTagSelectorPopupOpener = exports.TopTagSelector = exports.TopRegionSelector = exports.TopProjectSelector = exports.TopGroupSelector = exports.TopCompetitorSelector = void 0;\n //#region src/components/project/competitorSelector/competitorSelector.vue?vue&type=script&setup=true&lang.ts\n var 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 }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (i.showSelectAllItem)\n return {\n icon: \"\",\n title: (0, forms_CbUt_6Ff_esm_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", he, [(0, vue_1.unref)(forms_CbUt_6Ff_esm_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.h, {\n class: \"top-competitorSelector_opener\",\n color: \"theme\",\n icon: \"\",\n icon2: \"\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(n.items.find((e) => e.value === a.value?.[0])?.content), 1)]),\n _: 1\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(n.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": a.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => a.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", 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_CrTmBhja_esm_js_1.d, {\n key: 1,\n modelValue: a.value,\n \"onUpdate:modelValue\": i[0] ||= (e) => a.value = e,\n items: n.items,\n isMultiple: !0,\n styling: \"bar\",\n canBeEmptyMultiple: !1,\n selectAllItem: o.value\n }, null, 8, [\n \"modelValue\",\n \"items\",\n \"selectAllItem\"\n ]))]));\n }\n }), 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 }, be = {\n key: -2,\n name: \"--\",\n index: -2\n }, xe = {\n key: -2,\n name: \"--\",\n regions: [be],\n regionByIndex: new Map([[-2, be]])\n }, V = {\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, Se = {\n key: -2,\n name: \"Autoselect\",\n regions: [V],\n regionByIndex: new Map([[-2, V]])\n }, Ce = {\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, we = () => (V.name = (0, forms_CbUt_6Ff_esm_js_1.E)().Common.Autoselect, V), Te = () => (we(), Se.name = (0, forms_CbUt_6Ff_esm_js_1.E)().Common.Autoselect, console.log(Se), Se), Ee = () => (Ce.name = (0, forms_CbUt_6Ff_esm_js_1.E)().Keywords.Without_region, Ce), De = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e ? ke(n, e) : Oe(n), t && r.set(-2, Te()), r.size || r.set(-2, xe), r;\n }, Oe = (e, t = !0, n = [], r = \"\") => {\n let i = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (!e.enabled || r && typeof e.key == \"number\" && e.key > 1)\n return;\n let a = { ...e };\n a.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n a.regionByIndex.set(n.index, n);\n }), !a.regionByIndex.size && n.length, (!e.regions || a.regionByIndex.size || n.length) && i.set(a.key, a);\n }), n.forEach((e) => {\n if (i.has(e))\n return;\n let t = {\n key: e,\n name: ye[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n i.set(t.key, t);\n }), i;\n }, ke = (e, t) => {\n let n = Oe(e, !1, [0, 1], t);\n if (n.has(2)) {\n let e = n.get(2);\n e && (e.regionByIndex = /* @__PURE__ */ new Map());\n }\n return (t === \"volume\" || t === \"cost_forecast\") && n.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...Ee() };\n e.regionByIndex.set(t.index, t);\n }), n;\n }, Ae = (e, t, n = []) => {\n let r = De(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_BwiXsV0S_esm_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-CYrmaDt3.esm.js\"], resolve_1, reject_1); }).then(__importStar)), Me = (t, n) => {\n let r = (0, forms_CbUt_6Ff_esm_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(n.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n if (n.value.forEach((n) => {\n let r = {\n value: n.key,\n title: n.name\n };\n t.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(n.key)), e.set(n.key, r);\n }), t.addCompare && !e.has(-2)) {\n let t = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n e.set(t.value, t);\n let n = {\n value: -1,\n title: r.Common.Compare\n };\n e.set(n.value, n);\n }\n return e;\n })\n };\n }, Ne = (t, n) => {\n let r = (0, forms_CbUt_6Ff_esm_js_1.E)(), i = (0, vue_1.ref)(-2);\n t.modelValue.length === 1 && (i.value = t.modelValue[0]), i.value === -2 && (t.forMode ? i.value = n.value?.regionByIndex.values().next().value?.key ?? -2 : i.value = n.value?.regionByIndex.keys().next().value ?? -2);\n let a = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return n.value.regionByIndex?.forEach((i) => {\n let a = i.name;\n if (t.forMode) {\n let t = {\n value: i.key,\n title: a\n };\n e.has(i.key) || e.set(i.key, t);\n return;\n }\n i.device && (a += \" (\" + r.Common[\"Device_\" + i.device] + \")\");\n let o = (0, searchers_js_1.getLangLabel)(n.value.key || 0, i.lang ?? \"\");\n o && (a += \" / \" + o);\n let s = {\n value: i.index,\n title: a,\n icon: i.device ? (0, searchers_js_1.getDeviceGIcon)(i.device) : void 0\n };\n e.set(i.index, s);\n }), e;\n });\n return (0, vue_1.watch)(a, (e, n) => {\n if (t.onlySearcher || i.value !== void 0 && e.get(i.value))\n return;\n let a = e.keys().next().value;\n if (i.value === -2 || a === -2) {\n i.value = a;\n return;\n }\n let o = n?.get(i.value)?.title || \"\", s = -1;\n for (let [t, n] of e.entries()) {\n let e = n.title;\n if (typeof e != \"string\" || typeof t == \"string\")\n break;\n if (e === o) {\n a = t;\n break;\n }\n let i = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n e.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) !== -1 && (l <= s || (s = l, a = t));\n }\n i.value = a;\n }), {\n regionIndex: i,\n optionByRegionIndex: a\n };\n }, Pe = (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 }, Fe = (e) => {\n let t = (0, vue_1.computed)(() => De(e.forMode, e.autoRegion, e.searchers)), n = (0, vue_1.computed)(() => t.value.get(i.searcherKey.value) || xe), r = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return t.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -1 && t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), i = Me(e, t), a = Ne(e, n), o = Pe(e, t, r);\n (0, vue_1.watch)(t, () => {\n if (e.onlySearcher ? o.regionsIndexes.value = Array.from(t.value.keys()) : o.regionsIndexes.value = o.regionsIndexes.value.filter((e) => r.value.has(e)), i.searcherKey.value === -1)\n return;\n let s = t.value.keys().next().value;\n t.value.forEach((n) => {\n if (e.onlySearcher && n.key === i.searcherKey.value) {\n s = i.searcherKey.value;\n return;\n }\n if (a.regionIndex.value && n.regionByIndex?.has(a.regionIndex.value) && (s = n.key), !e.onlySearcher) {\n let e;\n s !== void 0 && (e = t.value.get(s)?.regionByIndex);\n let r = t.value.get(n.key)?.regionByIndex;\n e?.has(-2) && !r?.has(-2) && (s = n.key);\n }\n }), s !== void 0 && (i.searcherKey.value = s), a.regionIndex.value !== void 0 && !(n.value?.regionByIndex)?.has(a.regionIndex.value) && (a.regionIndex.value = n.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let s = () => {\n if (!(i.searcherKey.value === -1 || i.searcherKey.value === -2))\n return i.searcherKey.value;\n }, c = () => {\n if (e.onlySearcher || a.regionIndex.value === -2)\n return;\n let t = a.regionIndex.value;\n if (e.forMode) {\n let n = a.regionIndex.value;\n t = Ae(e.forMode, {\n searcher_key: s(),\n key: n\n }, e.searchers)?.index;\n }\n return t;\n }, l = () => {\n let e = s();\n if (e !== void 0)\n return t.value.get(e);\n };\n return {\n selectSearcher: i,\n selectRegion: a,\n compare: o,\n searcherByKey: t,\n allRegionsIndexes: r,\n getSearcher: l,\n getRegion: () => {\n let e = c();\n if (e !== void 0)\n return l()?.regionByIndex?.get(e);\n }\n };\n }, Ie = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"regionSelector\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n projectId: {},\n searchers: { default: () => [] },\n modelValue: {},\n modelValueSingle: {},\n addCompare: { type: Boolean },\n forMode: {},\n autoRegion: { type: Boolean },\n onlySearcher: { type: Boolean },\n addChanger: {\n type: Boolean,\n default: !0\n },\n addSearcherIcon: {\n type: Boolean,\n default: !0\n },\n addRegionIcon: {\n type: Boolean,\n default: !0\n }\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n modelValueSingle: {},\n modelValueSingleModifiers: {}\n }),\n emits: [\"update:modelValue\", \"update:modelValueSingle\"],\n setup(e, { expose: t }) {\n let n = e, a = (0, vue_1.useModel)(e, \"modelValue\"), o = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: s, selectRegion: c, compare: l, searcherByKey: u, allRegionsIndexes: d, getSearcher: f, getRegion: p } = Fe(n), m = () => {\n let e = [];\n u.value.forEach((t) => {\n t.enabled && t.regions.forEach((t) => {\n t.enabled && e.push(t);\n });\n }), je.open(\"regions\", {\n regions: e,\n regionsIndexes: l.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => l.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n c.regionIndex,\n s.searcherKey,\n l.regionsIndexes\n ], () => {\n if (s.searcherKey.value === -1 && l.regionsIndexes.value.length) {\n if (JSON.stringify(a.value) === JSON.stringify(l.regionsIndexes.value))\n return;\n a.value = [...l.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (a.value = [s.searcherKey.value], s.searcherKey.value === -2 && !n.autoRegion && (a.value.length = 0)) : (a.value = [c.regionIndex.value], c.regionIndex.value === -2 && !n.autoRegion && (a.value.length = 0));\n !n.onlySearcher && !d.value.size && (s.searcherKey.value = -2);\n }), o.value && (0, vue_1.watch)(o, () => {\n o.value && (a.value = [o.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(a, () => {\n if (a.value[0] && (o.value = a.value[0]), n.onlySearcher) {\n if (!a.value.length || a.value.length === 1 && !u.value.has(a.value[0]) || a.value.length === 1 && a.value[0] === -2 && !n.autoRegion) {\n let e = u.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, o.value = -2), e === void 0 ? a.value.length = 0 : a.value = [e];\n return;\n }\n if (a.value.length > 1 && JSON.stringify(a.value) !== JSON.stringify(l.regionsIndexes.value)) {\n a.value = [...l.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(a.value)], t = u.value.values().next().value?.regionByIndex?.keys().next().value;\n if (n.forMode && (t = u.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, o.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let r = d.value;\n n.forMode && (r = /* @__PURE__ */ new Set(), u.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -1 && e.index !== -2 && r.add(e.key);\n });\n })), r.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => d.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(a.value) !== JSON.stringify(e)) {\n a.value = e;\n return;\n }\n }\n if (!(a.value.length === 1 && a.value[0] === (n.onlySearcher ? s.searcherKey.value : c.regionIndex.value)))\n if (n.onlySearcher) {\n if (a.value.length === 1) {\n s.searcherKey.value = a.value[0];\n return;\n }\n s.searcherKey.value = -1;\n return;\n }\n else {\n if (!a.value.length)\n return;\n if (a.value.length === 1 && s.searcherKey.value !== -1) {\n c.regionIndex.value = a.value[0];\n let e;\n for (let t of u.value.values()) {\n for (let r of t.regionByIndex.values())\n if ((n.forMode ? r.key : r.index) === c.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (s.searcherKey.value = e);\n }\n else\n s.searcherKey.value = -1, l.regionsIndexes.value = [...a.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: f,\n getRegion: p\n }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-selectorRegion\": !0,\n \"top-selectorRegion-onlySearcher\": e.onlySearcher\n }) }, [\n (0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.n, {\n options: (0, vue_1.unref)(s).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(s).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(s).searcherKey.value = e,\n name: \"searcher_key\",\n addChanger: e.addChanger\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"addChanger\"\n ]),\n !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CbUt_6Ff_esm_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(c).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(c).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(c).regionIndex.value = e,\n name: e.forMode ? \"region_key\" : \"region_index\",\n addChanger: e.addChanger,\n \"data-top-icon\": e.addRegionIcon ? \"\" : void 0\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"name\",\n \"addChanger\",\n \"data-top-icon\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.addCompare && !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CbUt_6Ff_esm_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: m,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(l).regionsIndexes.value.length\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Selected_regions), 1)]),\n _: 1\n }, 8, [\"data-count-compare-regions-indexes\"])) : (0, vue_1.createCommentVNode)(\"\", !0)\n ], 2));\n }\n }), H = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = _e;\n exports.useItemsFromCompetitors = ve;\n exports.genSearcherByKey = De;\n exports.findRegion = Ae;\n exports.dialogRegionSelector = je;\n exports.TopRegionSelector = Ie;\n function Le(t) {\n return t ? (0, forms_CbUt_6Ff_esm_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_CbUt_6Ff_esm_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var Re = (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 = Le(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), Re(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), ze = (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 Be(e, t, n) {\n let r = Object.keys(e);\n return (0, vue_1.watch)(r.map((t) => e[t]), (e, n, i) => {\n let a = {};\n e.forEach((e, t) => {\n if (!Object.is(e, n[t])) {\n let i = r[t];\n a[i] = {\n old: n[t],\n new: e\n };\n }\n }), Object.keys(a).length && t(a, i);\n }, n);\n }\n //#endregion\n //#region src/components/project/groupSelector/folders/folders.vue?vue&type=script&setup=true&lang.ts\n var Ve = [\"innerHTML\"], He = /* @__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: H },\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 ? ze(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)(() => Re(t.folders ?? { root: [H] }, t.canSelectAll));\n return Be({\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 ||= H, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CrTmBhja_esm_js_1.s, {\n class: \"top-groupSelector_folder\",\n modelValue: r.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => r.value = e,\n items: e.folders ? [...o.value.values()] : void 0,\n \"search-type\": \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.folders ? void 0 : (0, vue_1.unref)(i),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_CrTmBhja_esm_js_1.u)(...e, \"name\"),\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, Ve)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), U = {\n id: -1,\n name: \"--\",\n folder_id: H.id,\n folder_path: H.path\n }, W = {\n id: 0,\n name: \"All groups\",\n folder_id: H.id,\n folder_path: H.path\n }, G = () => (W.name = (0, forms_CbUt_6Ff_esm_js_1.E)()?.Common.All_groups, W), Ue = () => (W.name = (0, forms_CbUt_6Ff_esm_js_1.E)()?.Keywords.Choose_group, W), We = (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), Ge = (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 }), Ke = (e, t) => e.gen(`/add/${t}/groups/`), qe = { class: \"top-groupSelector_groupItem\" }, Je = {\n key: 0,\n class: \"top-comment\"\n }, Ye = [\"innerHTML\"], Xe = [\"innerHTML\"], Ze = /* @__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 canSelectAll: { type: [Boolean, String] },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showPath: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: {}\n }, {\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { required: !0 },\n groupModifiers: {}\n }),\n emits: /* @__PURE__ */ (0, vue_1.mergeModels)([\"addGroup\"], [\"update:groupId\", \"update:group\"]),\n setup(e, { emit: t }) {\n let n = e, r = t, i = (0, vue_1.useModel)(e, \"groupId\"), a = (0, vue_1.useModel)(e, \"group\"), s = n.client && !n.groups ? Ge(n.client, n.service) : void 0, c = n.client ? Ke(n.client, n.service) : void 0, l = (0, vue_1.ref)(null), u = (0, vue_1.ref)(void 0), d = (0, field_CjkpGeA7_esm_js_1.t)(\"folder_id\", \"EQUALS\", [n.folder?.id ?? 0]);\n s?.changeParams({\n project_id: n.projectId,\n folder_id_depth: !0,\n filters: [d]\n }), n.on !== void 0 && s?.params.filters?.push((0, field_CjkpGeA7_esm_js_1.t)(\"on\", \"EQUALS\", [Number(n.on)]));\n let f = (e) => {\n a.value = e, i.value = e.id;\n };\n Be({\n projectId: () => n.projectId,\n folderId: () => n.folder?.id,\n canSelectAll: () => n.canSelectAll\n }, (e) => {\n if (e.projectId && (s?.changeParams({ project_id: n.projectId }), s?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + n.projectId })), e.folderId && (d.values = [n.folder?.id ?? 0], n.groups && (u.value = We(n.groups, n.on, n.folder))), l.value?.resetCache(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && i.value !== null) {\n let e;\n n.autoselect === \"first\" && (e = u.value?.[0], n.canSelectAll && (e = (0, vue_1.reactive)(G()))), (n.autoselect === \"placeholder\" || !e) && (e = Ue()), f(e);\n }\n }, { immediate: !0 }), Be({\n modelGroup: a,\n modelGroupId: i\n }, async (e) => {\n if (i.value !== a.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n i.value = a.value.id;\n return;\n }\n if (!(n.canAdd && i.value === null)) {\n if (n.groups) {\n let e = u.value?.find((e) => e.id === i.value);\n if (!e && n.canSelectAll && (e = G()), e)\n f(e);\n else {\n let e = u.value?.[0];\n e && !i.value ? f(e) : f(U);\n }\n }\n if (n.client && !n.groups && (i.value || i.value === 0 && !n.canSelectAll)) {\n let e = Ge(n.client, n.service).changeParams({\n project_id: n.projectId,\n id: i.value,\n filters: [d]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + n.projectId });\n let t = await e.call();\n if (!t.errors?.length && !t.result)\n return;\n !t.errors && t.result[0] ? f(t.result[0]) : f(U);\n }\n }\n }\n }, { immediate: !0 });\n let p = async (e) => {\n if (n.canAdd !== \"api\" || !c)\n return;\n let t = a.value, i = await c.changeParams({\n project_id: n.projectId,\n names: [e.name],\n to_id: n.folder?.id ?? H.id,\n to_type: \"in_folder_last\"\n }).call();\n if (i.result) {\n let e = i.result[0];\n f(e), r(\"addGroup\", e);\n }\n else\n f(t);\n l.value?.resetCache(!0);\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CrTmBhja_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: l,\n class: \"top-groupSelector_group\",\n modelValue: a.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => a.value = e,\n items: u.value ?? e.groups,\n searchType: \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.groups ? void 0 : (0, vue_1.unref)(s),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_CrTmBhja_esm_js_1.u)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(G)().name : !1,\n addChanger: e.addChanger,\n useCache: \"\",\n onAppendItem: p\n }, {\n item: (0, vue_1.withCtx)(({ item: n }) => [(0, vue_1.createElementVNode)(\"div\", qe, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Je, (0, vue_1.toDisplayString)(t.$i18n.Common.Add) + \": \", 1)) : (0, vue_1.createCommentVNode)(\"\", !0),\n (0, vue_1.createElementVNode)(\"span\", { innerHTML: n.name }, null, 8, Ye),\n n.folder_path && e.showPath ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n class: \"top-groupSelector_groupItemFolderPath\",\n innerHTML: n.folder_path\n }, null, 8, Xe)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ])]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResult\",\n \"useAllItem\",\n \"addChanger\"\n ]));\n }\n }), Qe = { class: \"top-groupSelector\" }, $e = /* @__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: { type: Boolean },\n canAddGroup: { type: [String, 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 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: U },\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, { emit: t }) {\n let n = e, r = (0, vue_1.useModel)(e, \"folderId\"), i = (0, vue_1.useModel)(e, \"folder\"), a = (0, vue_1.useModel)(e, \"groupId\"), o = (0, vue_1.useModel)(e, \"group\"), s = t;\n i.value = Re(n.folders ?? { root: [H] }, n.canSelectAllGroups).get(r.value);\n let c = n.groups?.find((e) => e.id === a.value);\n a.value || (c = n.groups?.[0]), n.canSelectAllGroups && !c && (c = G()), n.canSelectAllGroups && !c && (c = G()), (n.autoselect === \"placeholder\" || !c) && (c = Ue()), c ??= U, o.value = c;\n let l = (e) => {\n let t;\n n.groups && e && (t = [...n.groups, e]), s(\"update:groups\", t);\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Qe, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(He, {\n key: 0,\n folderId: r.value,\n \"onUpdate:folderId\": n[0] ||= (e) => r.value = e,\n folder: i.value,\n \"onUpdate:folder\": n[1] ||= (e) => i.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: e.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)(Ze, {\n key: 1,\n groupId: a.value,\n \"onUpdate:groupId\": n[2] ||= (e) => a.value = e,\n group: o.value,\n \"onUpdate:group\": n[3] ||= (e) => o.value = e,\n projectId: e.projectId,\n folder: i.value,\n groups: e.groups,\n on: e.on,\n canAdd: e.canAddGroup,\n canSelectAll: e.canSelectAllGroups,\n autoselect: e.autoselect,\n addChanger: e.addChanger,\n showPath: e.showFolders && !!e.folders?.[0],\n addIcon: e.addIcon,\n client: e.client,\n service: e.service,\n onAddGroup: l\n }, null, 8, [\n \"groupId\",\n \"group\",\n \"projectId\",\n \"folder\",\n \"groups\",\n \"on\",\n \"canAdd\",\n \"canSelectAll\",\n \"autoselect\",\n \"addChanger\",\n \"showPath\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0)]));\n }\n }), et = (e) => ({\n id: null,\n name: e,\n listItemProps: { type: \"title\" }\n }), tt = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n }, nt = (t, n) => {\n let r = [], i = {\n scheduledUpdate: et((0, forms_CbUt_6Ff_esm_js_1.E)().Projects.Scheduled_update),\n manualUpdate: et((0, forms_CbUt_6Ff_esm_js_1.E)().Projects.Manual_update),\n guestProjects: et((0, forms_CbUt_6Ff_esm_js_1.E)().Projects.Guest_projects)\n }, a = n ? {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n } : tt;\n for (let e of t)\n !a.scheduledUpdate && e.right?.startsWith(\"1\") && e.on > 0 && (r.push(i.scheduledUpdate), a.scheduledUpdate = !0), !a.manualUpdate && e.right?.startsWith(\"1\") && e.on === 0 && (r.push(i.manualUpdate), a.manualUpdate = !0), !a.guestProjects && e.right?.startsWith(\"0\") && e.on >= 0 && (r.push(i.guestProjects), a.guestProjects = !0), r.push(e);\n return r;\n }, rt = (e) => e.map((e) => ({\n ...e,\n listItemProps: { attrs: { title: e.name } }\n })), it = (e, t, n) => !e || e.length === 0 ? [] : (t && Object.keys(tt).forEach((e) => tt[e] = !1), nt(rt(e), n)), at = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return t = t.replace(/historyView=[^&]*/, \"\"), t = t.replace(/competitorsIds=[^&]*/, \"\"), t = t.replace(/searchersKeys=[^&]*/, \"\"), t = t.replace(/regionIndex=[^&]*/, \"\"), t = t.replace(/regionsIndexes=[^&]*/, \"\"), t = t.replace(/folderId=[^&]*/, \"\"), t = t.replace(/groupId=[^&]*/, \"\"), t = t.replace(/tags=[^&]*/, \"\"), window.mo?.getHash && !window.mo.getHash(\"dataSort\").toString().includes(\"0000-00-00\") && (t = t.replace(/dataSort=[^&]*/, \"\")), t = t.replace(/%22historyView%22:[^,]*,/, \"\"), t = t.replace(/%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:\\{[^}]*},/, \"\")), e + t;\n }, ot = (e, t) => {\n t && t.target instanceof HTMLElement && worker_Db8YrEHo_esm_js_1.t.close(t.target.closest(\".top-popup-wrapper\"));\n let n = at(e);\n location.href = n;\n }, st = (e) => {\n let t = ct(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n return n[1] == \"project\" && (r = n[1] + \"/\" + n[2] + \"/\"), n[2] == \"settings\" && (i = location.hash), [\n \"watcher\",\n \"indexing\",\n \"sitemap\",\n \"audit\",\n \"direct\",\n \"adwords\"\n ].includes(n[4]) && (i = n[4] + \"/\"), \"https://\" + t + \"/\" + r + e + \"/\" + i;\n }, ct = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, lt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"http://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, ut = (e, t) => {\n let n = e.params.filters ?? [];\n n = n.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let r = (0, keyboard_js_1.invertKeyboardLayout)(t), i = t.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), a = r.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n t && n.push((0, field_CjkpGeA7_esm_js_1.t)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${i}|${a})`])), e.changeParams({ filters: n });\n }, dt = (e, t, n) => {\n let r = e.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return r.params = {\n ...n,\n filters: [(0, field_CjkpGeA7_esm_js_1.t)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, field_CjkpGeA7_esm_js_1.n)(\"user_id\", \"DESC\", [t]),\n (0, field_CjkpGeA7_esm_js_1.n)(\"on\", \"DESC\"),\n (0, field_CjkpGeA7_esm_js_1.n)(\"favorite\", \"DESC\"),\n (0, field_CjkpGeA7_esm_js_1.n)(\"id\", \"DESC\")\n ]\n }, r.options.onApiLoaded = (e, t, n) => {\n let r = t.data.filters.length === 1 && t.data.offset === 0 || t.data.limit === 1e3, i = t.data.limit === 100 && t.data.filters.length > 1 ? !0 : void 0;\n e.result = it(e.result, r, i), n?.(e, t);\n }, r;\n }, ft = (e) => e.gen(\"/add/projects_2/projects/\"), pt = { class: \"top-projectSelectorSubmenu_item\" }, mt = [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ], ht = { class: \"top-projectSelectorSubmenu_item\" }, gt = [\"href\"], _t = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: {\n id: {},\n right: {},\n url: {}\n },\n setup(t) {\n let n = t, r = (0, forms_CbUt_6Ff_esm_js_1.E)(), i = ct(), a = [\n {\n href: `https://${i}/project/keywords/${n.id}/`,\n title: r.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${i}/project/dynamics/${n.id}/`,\n title: r.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/snapshots/${n.id}/`,\n title: r.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/competitors/${n.id}/`,\n title: r.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/analytics/${n.id}/`,\n title: r.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${i}/project/broker/${n.id}/`,\n title: r.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/sitemap/`,\n title: r.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/audit/`,\n title: r.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/indexing/`,\n title: r.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/watcher/`,\n title: r.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${i}/project/settings/${n.id}/`,\n title: r.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ], o = (0, vue_1.computed)(() => n.right.includes(\"0\") ? a.filter((e) => n.right[e.right] === \"1\") : a);\n return (e, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_DrByVU_k_esm_js_1.s), {\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-projectSelectorSubmenu_opener\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"li\", pt, [(0, vue_1.createElementVNode)(\"a\", {\n href: e.href,\n title: e.title,\n \"data-top-icon\": e.icon,\n \"data-right\": e.right\n }, null, 8, mt)]))), 256)), (0, vue_1.createElementVNode)(\"li\", ht, [(0, vue_1.createElementVNode)(\"a\", {\n href: t.url,\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, null, 8, gt)])]),\n _: 1\n });\n };\n }\n }), K = \"ui_project_selector_total:\", vt = 1440 * 60 * 1e3, q = (0, vue_1.shallowRef)(), yt = (0, vue_1.ref)(0), J = (0, vue_1.ref)(null), bt = (e, t) => {\n localStorage.setItem(K + e, JSON.stringify({\n projectsTotal: t,\n expiresAt: Date.now() + vt\n }));\n }, xt = (e) => {\n let t = localStorage.getItem(K + e);\n if (!t)\n return;\n let { projectsTotal: n, expiresAt: r } = JSON.parse(t);\n if (Date.now() > r) {\n localStorage.removeItem(K + e);\n return;\n }\n return n;\n }, St = (e, t = !0) => {\n q.value = void 0, localStorage.removeItem(K + e), t && yt.value++;\n }, Ct = { class: \"top-projectSelector_item\" }, wt = { class: \"top-projectSelector_itemText\" }, Tt = { class: \"top-comment\" }, Et = {\n key: 0,\n class: \"top-comment\"\n }, Dt = [\"href\", \"onClick\"], Ot = 1e3, kt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n addLinksToProjects: {\n type: Boolean,\n default: !0\n },\n excludeProjectId: {},\n modificator: {},\n placeholder: {},\n buttonProps: {},\n openerShortcut: {}\n }, {\n modelValue: { default: {\n id: null,\n name: \"\"\n } },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(t) {\n let n = (0, forms_CbUt_6Ff_esm_js_1.E)();\n if (!window.mo?.user?.id)\n throw Error(\"TopProjectSelector: не удалось определить userId. Компонент требует авторизованного пользователя (см. window.mo.user.id)\");\n let r = window.mo.user.id, i = t, a = (0, vue_1.useModel)(t, \"modelValue\"), o = dt(i.client, r), s = ft(i.client), c = (0, vue_1.ref)(xt(r)), d = (0, vue_1.ref)(null), f = (0, vue_1.computed)(() => i.placeholder ?? n.Projects.Select_project), p = (0, vue_1.computed)(() => !q.value || !i.excludeProjectId ? q.value : q.value.filter((e) => e.id !== i.excludeProjectId)), m = (0, vue_1.computed)(() => {\n if (!(!c.value && c.value !== 0))\n return c.value < Ot ? \"static\" : \"api\";\n });\n (0, vue_1.watch)(yt, () => {\n _();\n }), (0, vue_1.watch)(a, () => {\n !a.value.id || !i.addLinksToProjects || ot(st(a.value.id));\n });\n let h = async () => {\n J.value ||= dt(i.client, r, { limit: Ot }).call();\n let e = await J.value;\n if (e.errors) {\n J.value = null;\n return;\n }\n return J.value = null, e;\n }, ee = async () => {\n if (c.value)\n return;\n let e = await h();\n e && (c.value = e.total, m.value === \"static\" && !q.value && (q.value = e.result), c.value && bt(r, c.value));\n }, g = async (e) => {\n let t = await s.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!t.errors) {\n if (q.value && m.value === \"static\") {\n let n = {\n id: Number(t.result),\n user_id: r,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\",\n listItemProps: { attrs: { title: e.name } }\n }, i = q.value.findIndex((e) => e.on === 0);\n q.value = [\n ...q.value.slice(0, i),\n n,\n ...q.value.slice(i)\n ], c.value && (c.value += 1, bt(r, c.value));\n }\n m.value === \"api\" && St(r);\n }\n }, _ = () => {\n m.value === \"api\" && d.value?.resetCache(!0);\n }, v = async () => {\n if (q.value || m.value !== \"static\")\n return;\n let e = await h();\n e && (q.value = e.result);\n };\n return (0, vue_1.onMounted)(async () => {\n await ee();\n }), (e, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CrTmBhja_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: d,\n class: \"top-projectSelector\",\n modelValue: a.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => a.value = e,\n items: p.value,\n title: e.$i18n.Projects.Search_projects,\n modificator: t.modificator,\n searchFields: [\n \"id\",\n \"name\",\n \"url\"\n ],\n placeholder: f.value,\n hasCloserBtn: \"\",\n api: m.value === \"api\" ? (0, vue_1.unref)(o) : void 0,\n apiSetSearchParams: m.value === \"api\" ? (...e) => (0, vue_1.unref)(ut)(...e) : void 0,\n useCache: \"\",\n appendSearchToResult: \"\",\n appendSearchAllowDuplicate: \"\",\n appendSearchToResultCond: (0, vue_1.unref)(check_js_1.validUrl),\n appendWithoutSelect: \"\",\n buttonProps: t.buttonProps,\n openerShortcut: t.openerShortcut,\n onAppendItem: g,\n onOpen: v\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", Ct, [(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)(e.$i18n.Projects.Add_project) + \": \", 1)), (0, vue_1.createTextVNode)(\" \" + (0, vue_1.toDisplayString)(i.name), 1)], 64))]), i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [\n t.addLinksToProjects ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"a\", {\n key: 0,\n class: \"top-projectSelector_itemLink\",\n href: (0, vue_1.unref)(st)(i.id),\n onClick: (0, vue_1.withModifiers)((e) => (0, vue_1.unref)(ot)((0, vue_1.unref)(st)(i.id), e), [\"prevent\", \"stop\"])\n }, null, 8, Dt)) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n class: \"top-projectSelector_itemExtLink\",\n href: (0, vue_1.unref)(lt)(i.url),\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)(_t, {\n id: i.id,\n right: i.right ?? void 0,\n url: (0, vue_1.unref)(lt)(i.url)\n }, null, 8, [\n \"id\",\n \"right\",\n \"url\"\n ])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)])]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\"\n ]);\n };\n }\n }), At = (e) => \"-\" + e, Y = (e) => e[0] === \"-\" ? e.substring(1) : e, X = (e, t) => {\n e = Y(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, jt = (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_Db8YrEHo_esm_js_1.t.genElPopupOpener(\"div\", t);\n return r.classList.add(\"top-tagSelector\"), e.useTopButton && r.classList.add(\"top-tagSelector-useTopButton\", \"top-button\", \"top-color_theme\", \"top-as-selector\"), e.useTopButton || r.classList.add(\"top-tagSelector-custom\"), e.mode === \"filter\" && r.classList.add(\"top-tagSelector-filter\"), e.mode === \"setter\" && !e.filters && r.classList.add(\"top-tagSelector-setter_single\"), e.mode === \"setter\" && e.filters && r.classList.add(\"top-tagSelector-setter_several\"), r.onclick = (t) => {\n t.preventDefault(), t.stopPropagation(), r.onclick = null;\n let i = (0, vue_1.ref)(e.modelValue);\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n }), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Z(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Z(r, e, n)) : (0, dom_js_1.storage)(r, \"topTagSelectorRender\", (t) => {\n e.modelValue = t;\n let i = (0, dom_js_1.storage)(r, \"topTagSelectorTarget\");\n i && (i.model.value = t), Z(r, e, n);\n }), Z(r, e, n), r;\n }, Mt = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Z = (t, n, r) => {\n let i = (0, vue_1.unref)(n.modelValue);\n if (t.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), t.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), n.mode === \"setter\" && n.filters) {\n t.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (t.innerHTML = \"\", !i.length && n.mode === \"filter\") {\n let n = Nt({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_CbUt_6Ff_esm_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n t.append(n);\n }\n i.forEach((e) => {\n let r = Nt({\n id: Y(e),\n colorId: X(e, n.tags)?.color_id ?? \"\",\n name: X(e, n.tags)?.name ?? \"\",\n state: Y(e) === e ? \"selected\" : \"excluded\"\n });\n t.append(r);\n });\n }, Nt = (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 }, Pt = [\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 ], Ft = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], Q = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagIcon\",\n props: {\n id: {},\n colorId: {},\n name: {},\n state: {}\n },\n setup(e) {\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagIcon\": !0,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n \"data-tag_id\": e.id,\n \"data-tag_color_id\": e.colorId,\n title: e.name\n }, null, 10, Ft));\n }\n }), It = [\"contenteditable\", \"onKeydown\"], Lt = /* @__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_DrByVU_k_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagListItem\": !0,\n \"top-tagSelector_tagListItem-inEdit\": s.value,\n \"top-tagSelector_tagListItem-disabled\": e.disabled,\n \"top-tagSelector_tagListItem-canExclude\": e.canExclude,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n onClick: (0, vue_1.withModifiers)(d, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [\n (0, vue_1.createVNode)(Q, {\n id: e.id,\n name: i.value,\n colorId: e.colorId,\n state: e.state\n }, null, 8, [\n \"id\",\n \"name\",\n \"colorId\",\n \"state\"\n ]),\n (0, vue_1.createElementVNode)(\"span\", (0, vue_1.mergeProps)({\n ref_key: \"elName\",\n ref: a,\n class: \"top-tagSelector_tagListItemName\",\n contenteditable: s.value ? \"plaintext-only\" : !1\n }, o.value, { onKeydown: [(0, vue_1.withKeys)((0, vue_1.withModifiers)(l, [\"stop\"]), [\"enter\"]), (0, vue_1.withKeys)((0, vue_1.withModifiers)(u, [\"stop\"]), [\"esc\"])] }), (0, vue_1.toDisplayString)(i.value), 17, It),\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 }), Rt = { key: 1 }, zt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n inheritAttrs: !1,\n __name: \"popupOpener\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n modelValue: {},\n id: {},\n tags: {},\n mode: {},\n targetId: {},\n filters: {},\n useTopButton: { type: Boolean },\n payload: {},\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"modelValue\"), i = t.useTopButton ? forms_CbUt_6Ff_esm_js_1.h : \"div\", a = t.useTopButton ? \"html\" : \"default\", o = {\n model: n,\n mode: t.mode,\n targetId: t.targetId,\n filters: t.filters,\n payload: t.payload\n };\n return (r, s) => {\n let c = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.c, { id: e.id }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.withDirectives)(((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(i)), (0, vue_1.mergeProps)({\n class: {\n \"top-tagSelector\": !0,\n \"top-tagSelector-useTopButton\": t.useTopButton,\n \"top-tagSelector-custom\": !t.useTopButton,\n \"top-as-selector\": t.useTopButton,\n \"top-tagSelector-filter\": t.mode === \"filter\",\n \"top-tagSelector-setter_single\": t.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": t.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !n.value.length || n.value.length === 1,\n \"top-tagSelector-toTwoLine\": n.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, r.$attrs), {\n [(0, vue_1.unref)(a)]: (0, vue_1.withCtx)(() => [!n.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: r.$i18n.Common.All_tags ?? \"\",\n state: \"\"\n }, null, 8, [\"name\"])) : (0, vue_1.createCommentVNode)(\"\", !0), e.mode === \"setter\" && e.filters ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Rt, [(0, vue_1.renderSlot)(r.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(n.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n id: (0, vue_1.unref)(Y)(t),\n colorId: (0, vue_1.unref)(X)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(X)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(Y)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n c,\n o,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Bt = /* @__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)(Pt) },\n tagsModifiers: {}\n }),\n emits: /* @__PURE__ */ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(a, { emit: o }) {\n let c = (0, forms_CbUt_6Ff_esm_js_1.E)(), l = a, u = (0, vue_1.useModel)(a, \"modelValue\"), d = (0, vue_1.useModel)(a, \"tags\"), f = o, p = (0, forms_CbUt_6Ff_esm_js_1.P)((e, t) => {\n f(e, t);\n }, l.emitDelay);\n l.singleMode && !u.value.length && (u.value = [d.value[0].id]);\n let m = l.id ?? \"top-popup-id-\" + Math.random(), h = (0, vue_1.ref)(\"add\"), ee = () => {\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 }, v = (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 (v.value.mode === \"setter\" && l.maxTagsForSetter && !v.value.filters)\n return v.value.model.value.length >= l.maxTagsForSetter;\n }), b = (e) => {\n if (e !== \"all\") {\n if (v.value.model.value.includes(e))\n return \"selected\";\n if (v.value.model.value.includes(At(e)))\n return \"excluded\";\n }\n return e === \"all\" && !v.value.model.value.length ? \"selected\" : \"\";\n }, E = (e, t) => {\n let n = At(e), r = v.value.model.value.filter((t) => t !== e && t !== n);\n t === \"select\" && r.push(e), t === \"exclude\" && r.push(n), v.value.mode === \"setter\" && v.value.targetId !== void 0 && l.requiredForSetter && (r.length || r.push(\"1\"), r.length === 2 && v.value.model.value.length === 1 && v.value.model.value[0] === \"1\" && (r = r.filter((e) => e !== \"1\"))), l.singleMode && !v.value.filters && (r.length || (r = v.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), v.value.model.value = r, v.value.mode === \"setter\" && v.value.targetId !== void 0 && p(\"setter\", {\n tagsIds: r,\n targetId: v.value.targetId,\n payload: v.value.payload\n });\n }, k = (0, vue_1.computed)(() => {\n let e = \"top-tagSelector_popup\";\n return v.value.mode === \"filter\" && (e += \" top-tagSelector_popup-filter\"), v.value.mode === \"setter\" && (e += \" top-tagSelector_popup-setter\"), e;\n }), ne = () => {\n let e = prompt(\"\", \"New tag\");\n if (!e || e === \"New tag\")\n return;\n let t = d.value.length + 1;\n d.value.push({\n id: String(t),\n name: e,\n color_id: String((t - 1) % 10 + 1)\n }), f(\"tagsChanged\", d.value);\n }, A = (e) => {\n if (v.value = (0, dom_js_1.storage)(e.elPopupOpener, \"topTagSelectorTarget\"), !v.value)\n throw Error(\"Open popup TopTagSelector required v-data:topTagSelectorTarget\");\n if (v.value.filters && (h.value = \"add\", v.value.model.value = []), !forms_CbUt_6Ff_esm_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_CbUt_6Ff_esm_js_1.O.state.isMobile && !forms_CbUt_6Ff_esm_js_1.O.state.isMobileUA && d.value && $(e.elPopup).sortable({\n items: \"li:has([data-tag_id]:not([data-tag_id=\\\"all\\\"]))\",\n cancel: \"[contenteditable=\\\"plaintext-only\\\"], [contenteditable=\\\"true\\\"]\",\n distance: 10,\n stop: function (e, t) {\n if (!d.value)\n return;\n let n = $(t.item).parent().find(\"[data-tag_id]\"), r = [];\n n.each((e, t) => {\n if (!d.value)\n return;\n let n = $(t).attr(\"data-tag_id\");\n r.push(n);\n }), d.value.sort((e, t) => r.findIndex((t) => t === e.id) - r.findIndex((e) => e === t.id)), p(\"tagsChanged\", d.value);\n }\n });\n }, re = (e) => {\n forms_CbUt_6Ff_esm_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(zt, {\n modelValue: u.value,\n \"onUpdate:modelValue\": t[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: a.styling,\n mode: \"filter\",\n useTopButton: a.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_DrByVU_k_esm_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(k.value),\n onOpen: t[4] ||= (e) => A(e),\n onClose: t[5] ||= (e) => re(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n (0, vue_1.unref)(v).mode === \"filter\" && !a.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Lt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: e.$i18n.Common.All_tags ?? \"\",\n state: (0, vue_1.unref)(v).model.value.length ? \"\" : \"selected\",\n onSelect: t[3] ||= (e) => (0, vue_1.unref)(v).model.value = []\n }, null, 8, [\"name\", \"state\"])) : (0, vue_1.createCommentVNode)(\"\", !0),\n ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(d.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Lt, {\n key: e.id,\n id: e.id,\n colorId: e.color_id,\n name: e.name,\n state: b(e.id),\n canExclude: (0, vue_1.unref)(v).mode === \"filter\" && !a.singleMode,\n editable: a.tagsEditable,\n disabled: y.value && b(e.id) === \"\",\n onUnselect: (t) => E(e.id, \"unselect\"),\n onSelect: (t) => E(e.id, \"select\"),\n onExclude: (t) => E(e.id, \"exclude\"),\n \"onUpdate:name\": (t) => {\n e.name = t, (0, vue_1.unref)(p)(\"tagsChanged\", d.value);\n }\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\",\n \"canExclude\",\n \"editable\",\n \"disabled\",\n \"onUnselect\",\n \"onSelect\",\n \"onExclude\",\n \"onUpdate:name\"\n ]))), 128)),\n a.tagsEditable && d.value.length < a.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(ne, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Add), 1)]),\n _: 1\n })) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 2\n }, [(0, vue_1.unref)(v).mode === \"setter\" && (0, vue_1.unref)(v).filters ? {\n name: \"header\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => h.value = e,\n options: ee()\n }, null, 8, [\"modelValue\", \"options\"])]),\n key: \"0\"\n } : void 0, (0, vue_1.unref)(v).mode === \"setter\" && (0, vue_1.unref)(v).filters ? {\n name: \"footer\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.h, { onClick: t[2] ||= (e) => (0, vue_1.unref)(p)(\"setter\", {\n tagsIds: (0, vue_1.unref)(v).model.value,\n filters: (0, vue_1.unref)(v).filters,\n filtersAction: h.value,\n payload: (0, vue_1.unref)(v).payload\n }) }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(h.value === \"add\" ? e.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? e.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? e.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = $e;\n exports.clearCache = St;\n exports.TopProjectSelector = kt;\n exports.genElTopTagSelectorPopupOpener = jt;\n exports.renderElTopTagSelectorPopupOpener = Mt;\n exports.TopTagSelectorTagIcon = Q;\n exports.TopTagSelectorPopupOpener = zt;\n exports.TopTagSelector = Bt;\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});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: '',\n\t\t\ttitle: useI18n().Common.Select_all,\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n});\n</script>\n\n<template>\n\t<div class=\"top-competitorSelector\">\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-competitorSelector_opener\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\ticon2=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-competitorSelector_opener.top-button {\n\twidth: 100%;\n}\n</style>\n","import type { MaybeRefOrGetter } from 'vue';\nimport { computed, toValue } from 'vue';\nimport type { Competitor, Item } from '@/components/project/competitorSelector/types';\n\nexport const useItemsFromCompetitors = (competitors: MaybeRefOrGetter<Competitor[]>, projectId: MaybeRefOrGetter<number>) => {\n\treturn computed(() => {\n\t\tconst activeCompetitors = toValue(competitors).filter(competitor => competitor.on >= 0 || competitor.id === projectId);\n\n\t\tconst items: Item[] = activeCompetitors.map(competitor => {\n\t\t\treturn {\n\t\t\t\tvalue: competitor.id,\n\t\t\t\ttitle: competitor.url + ` [${competitor.id}]`,\n\t\t\t\ticon: competitor.id === toValue(projectId) ? '' : '',\n\t\t\t\tcontent: competitor.name,\n\t\t\t};\n\t\t});\n\n\t\treturn items;\n\t});\n};\n","import type { Region, SearcherIndexed } from '../types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Ключ ПС - для выбора нескольких ПС или регионов\n */\nexport const searhcerCompareKey = -1;\n\n/**\n * Ключ ПС или индекса Региона, используется для ПС или Региона, не настроенных в проекте\n *\n * Также, используется для API с возможностью не указывать регион, см. `props.autoRegion`\n */\nexport const dummyIndex = -2;\n\n/**\n * Регион - без региона\n */\nexport const globalRegionIndex = -1;\n\nexport const searchersNames = {\n\t0: 'Yandex',\n\t1: 'Google',\n\t4: 'YouTube',\n\t5: 'Bing',\n\t7: 'Seznam',\n\t8: 'AppStore',\n\t9: 'GoogleStore',\n\t20: 'Yandex.com',\n\t21: 'Yandex.com.tr',\n};\n\nexport const regionUndefined: Region = {\n\tkey: dummyIndex,\n\tname: '--',\n\tindex: dummyIndex,\n};\n\nexport const searcherUndefined: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: '--',\n\tregions: [regionUndefined],\n\tregionByIndex: new Map([[dummyIndex, regionUndefined]]),\n};\n\nconst regionAuto: Region = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tindex: dummyIndex,\n};\n\nconst searcherAuto: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tregions: [regionAuto],\n\tregionByIndex: new Map([[dummyIndex, regionAuto]]),\n};\n\nconst regionGlobal: Region = {\n\tcountryCode: '00',\n\tdepth: 1,\n\tdevice: 0,\n\tkey: globalRegionIndex,\n\tindex: globalRegionIndex,\n\tlang: 'ru',\n\tname: 'Without region',\n};\n\nexport const getRegionAuto = () => {\n\tregionAuto.name = useI18n().Common.Autoselect!;\n\n\treturn regionAuto;\n};\n\nexport const getSearcherAuto = () => {\n\tgetRegionAuto();\n\n\tsearcherAuto.name = useI18n().Common.Autoselect!;\n\tconsole.log(searcherAuto);\n\n\treturn searcherAuto;\n};\n\nexport const getRegionGlobal = () => {\n\tregionGlobal.name = useI18n().Keywords.Without_region!;\n\n\treturn regionGlobal;\n};\n","import type { Region, ForMode, Searcher, SearcherByKey, SearcherIndexed } from '../types';\nimport { dummyIndex, getRegionGlobal, getSearcherAuto, searchersNames, searcherUndefined } from './consts';\nimport { useAsyncTopDialog } from '@/components/dialog/dialog/composables/utils';\n\n/**\n * Генерация Map ПС с Map регионов из массива searchers\n * - ключ для ПС - searcherKey\n * - ключ для региона - regionIndex\n *\n * Если поисковиков в списке нет, в список будет добавлен searcherUndefined\n *\n * Если регионов в списке нет, в список будет добавлен regionUndefined\n *\n * @param forMode - Режим выбора регионов\n * @param autoRegion - добавить элемент с ключем -2, который в API заменяется на нужный ключ в зависимости от контекста\n * @param searchers - поисковики с регионами проекта, см.: get/projects_2/projects, show_searchers_and_regions = 1\n */\nexport const genSearcherByKey = (\n\tforMode: ForMode = '',\n\tautoRegion: boolean = false,\n\tsearchers: Searcher[] = [],\n) => {\n\tlet searcherByKey: SearcherByKey;\n\n\tif (forMode) {\n\t\tsearcherByKey = genSearchersMapForMode(searchers, forMode);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers);\n\t}\n\n\tif (autoRegion) searcherByKey.set(dummyIndex, getSearcherAuto());\n\tif (!searcherByKey.size) searcherByKey.set(dummyIndex, searcherUndefined);\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @param forceSearchersKeys - ключи ПС, которые нееобходимо вывести в любом случае\n * @param forMode - Режим выбора регионов (при непустом значении остаются только Яндекс, Google и Mail)\n */\nconst genSearchersMapCommon = (\n\tsearchers: Searcher[],\n\tonlyEnabledRegions: boolean = true,\n\tforceSearchersKeys: Searcher['key'][] = [],\n\tforMode: ForMode = '',\n) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\t\tif (forMode && typeof searcher.key === 'number' && searcher.key > 1) return;\n\n\t\tconst searcherI = { ...searcher } as SearcherIndexed;\n\t\tsearcherI.regionByIndex = new Map();\n\n\t\tif (searcher.regions) {\n\t\t\tsearcher.regions.forEach((region: Region) => {\n\t\t\t\tif (onlyEnabledRegions && !region.enabled) return;\n\n\t\t\t\tconst regionI = { ...region };\n\t\t\t\tsearcherI.regionByIndex.set(regionI.index, regionI);\n\t\t\t});\n\t\t}\n\n\t\tif (!searcherI.regionByIndex.size && !forceSearchersKeys.length) {\n\t\t\t// searcherI.regionByIndex.set(regionUndefined.index, regionUndefined);\n\t\t}\n\n\t\tif (\n\t\t\t// режим вывода ПС без регионов\n\t\t\t!searcher.regions ||\n\n\t\t\t// есть включенные регионы\n\t\t\tsearcherI.regionByIndex.size ||\n\n\t\t\t// запрошен вывод конкретных ПС\n\t\t\tforceSearchersKeys.length\n\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\t// дополнительные ПС\n\tforceSearchersKeys.forEach((searcherKey) => {\n\t\tif (searcherByKey.has(searcherKey)) return;\n\n\t\tconst searcherI: SearcherIndexed = {\n\t\t\tkey: searcherKey,\n\t\t\tname: searchersNames[searcherKey],\n\t\t\tregions: [],\n\t\t\tregionByIndex: new Map(),\n\t\t};\n\n\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t});\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки частоты (Яндекс, Google, Mail если добавлен в проект)\n *\n * @param searchers\n * @param forMode - Режим выбора регионов\n */\nconst genSearchersMapForMode = (searchers: Searcher[], forMode: ForMode) => {\n\tconst serarcherByKey = genSearchersMapCommon(searchers, false, [0, 1], forMode);\n\n\t// в Mail нет регионов\n\tif (serarcherByKey.has(2)) {\n\t\tconst searcherMail = serarcherByKey.get(2);\n\t\tif (searcherMail) searcherMail.regionByIndex = new Map();\n\t}\n\n\tif (forMode === 'volume' || forMode === 'cost_forecast') {\n\t\t// добавление глобального региона\n\t\tserarcherByKey.forEach((searcher) => {\n\t\t\tif (!searcher.regionByIndex) return;\n\n\t\t\tconst region = { ...getRegionGlobal() };\n\t\t\tsearcher.regionByIndex.set(region.index, region);\n\t\t});\n\t}\n\n\treturn serarcherByKey;\n};\n\n/**\n * Поиск региона по заданному критерию из списка поисковиков проекта\n *\n * @param forMode - Режим выбора регионов\n * @param searchRegion - объект с параметрами региона, который следует найти\n * @param searchers\n */\nexport const findRegion = (forMode: ForMode, searchRegion: Partial<Region>, searchers: Searcher[] = []) => {\n\tconst searcherByKey = genSearcherByKey(forMode, false, searchers);\n\n\tlet findedRegion: Region | undefined;\n\n\t// поиск ПС\n\tsearcherByKey.forEach((searcher) => {\n\t\tif (searchRegion.searcher_key !== undefined && searchRegion.searcher_key != searcher.key) return;\n\t\tif (!searcher.regions) return;\n\n\t\t// поиск региона\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (findedRegion) return;\n\n\t\t\tif (searchRegion.key !== undefined && searchRegion.key != region.key) return;\n\t\t\tif (searchRegion.index !== undefined && searchRegion.index != region.index) return;\n\n\t\t\tif (!forMode) {\n\t\t\t\tif (searchRegion.lang !== undefined && searchRegion.lang != region.lang) return;\n\t\t\t\tif (searchRegion.device !== undefined && searchRegion.device != region.device) return;\n\t\t\t}\n\n\t\t\tregion.searcher_key = searcher.key;\n\t\t\tfindedRegion = region;\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (findedRegion) return false;\n\t});\n\n\treturn findedRegion;\n};\n\n/**\n * Открыть диалоговое окно с выбором нескольких регионов\n *\n * @see import('../dialog_regionSelectorRegions/types').Props\n */\nexport const dialogRegionSelector = useAsyncTopDialog(() => {\n\treturn import('@/components/project/regionSelector/dialog_regionSelectorRegions/dialog_regionSelectorRegions.vue');\n});\n","import { computed, type ComputedRef, ref } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, SearcherByKey } from '../types';\nimport type { Option, Options } from '@/components/forms/select/types';\nimport { dummyIndex, searhcerCompareKey } from '../utils/consts';\nimport { getSearcherGIcon } from '@/core/utils/searchers';\n\n/**\n * Создание и управление реактивными переменными для выбора ПС\n *\n * @param props - входные props компонента\n * @param mapSearchers - Map ПС (реактивная)\n */\nexport const useSelectSearcher = (\n\tprops: Props,\n\tmapSearchers: ComputedRef<SearcherByKey>,\n) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Ключ выбранной поисковой системы\n\t */\n\tconst searcherKey = ref(mapSearchers.value.keys().next().value ?? dummyIndex);\n\n\t/**\n\t * Коллекция опций для выбора ПС\n\t */\n\tconst optionBySearcherKey = computed(() => {\n\t\tconst res: Options = new Map();\n\t\tmapSearchers.value.forEach((searcher) => {\n\t\t\tlet option: Option = {\n\t\t\t\tvalue: searcher.key,\n\t\t\t\ttitle: searcher.name,\n\t\t\t};\n\n\t\t\tif (props.addSearcherIcon) option.icon = getSearcherGIcon(searcher.key);\n\n\t\t\tres.set(searcher.key, option);\n\t\t});\n\n\t\t// добавить режим сравнения, если есть хотя бы одна ПС с одним регионом\n\t\tif (props.addCompare && !res.has(dummyIndex)) {\n\t\t\tconst dummyOption: Option = {\n\t\t\t\tvalue: '',\n\t\t\t\ttitle: '--------------------',\n\t\t\t\tdisabled: true,\n\t\t\t};\n\t\t\tres.set(dummyOption.value, dummyOption);\n\n\t\t\tconst compareOption: Option = {\n\t\t\t\tvalue: searhcerCompareKey,\n\t\t\t\ttitle: i18n.Common.Compare!,\n\t\t\t};\n\t\t\tres.set(compareOption.value, compareOption);\n\t\t}\n\n\t\treturn res;\n\t});\n\n\treturn {\n\t\tsearcherKey,\n\t\toptionBySearcherKey,\n\t};\n};\n","import { computed, type ComputedRef, ref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getDeviceGIcon, getLangLabel } from '@/core/utils/searchers';\nimport type { Option } from '@/components/forms/select/types';\nimport { dummyIndex } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\n\n/**\n * Создание и управление реактивными переменными для выбора региона\n *\n * @param props - входные props компонента\n * @param activeSearcherIndexed - объект активной поисковой системы (реактивная)\n */\nexport const useSelectRegion = (props: Props, activeSearcherIndexed: ComputedRef<SearcherIndexed>) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Индекс выбранного региона\n\t */\n\tconst regionIndex = ref(dummyIndex);\n\n\tif (props.modelValue.length === 1) {\n\t\tregionIndex.value = props.modelValue[0];\n\t}\n\n\tif (regionIndex.value === dummyIndex) {\n\t\tif (props.forMode) {\n\t\t\t// в качестве ключа используется region.key, а не region.index\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.values().next().value?.key ?? dummyIndex;\n\t\t} else {\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.keys().next().value ?? dummyIndex;\n\t\t}\n\t}\n\n\t/**\n\t * Коллекция опций для выбора региона\n\t */\n\tconst optionByRegionIndex = computed(() => {\n\t\tconst options = new Map<number, Option>();\n\n\t\tactiveSearcherIndexed.value.regionByIndex?.forEach((region) => {\n\t\t\tlet regionLabel = region.name;\n\n\t\t\t// на частоту в текущей версии устройство и язык не влияют\n\t\t\t// обратите внимание, в качестве ключа используется region.key, а не region.index\n\t\t\tif (props.forMode) {\n\t\t\t\tconst option: Option = {\n\t\t\t\t\tvalue: region.key,\n\t\t\t\t\ttitle: regionLabel,\n\t\t\t\t};\n\t\t\t\tif (!options.has(region.key)) options.set(region.key, option);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (region.device) {\n\t\t\t\tregionLabel += ' (' + i18n.Common['Device_' + region.device] + ')';\n\t\t\t}\n\n\t\t\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\t\t\tif (langLabel) regionLabel += ' / ' + langLabel;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel,\n\t\t\t\ticon: region.device ? getDeviceGIcon(region.device) : undefined,\n\t\t\t};\n\n\t\t\toptions.set(region.index, option);\n\t\t});\n\n\t\treturn options;\n\t});\n\n\t/**\n\t * Выбор максимально похожего региона в новой коллекции регионов\n\t */\n\twatch(optionByRegionIndex, (optionByRegionIndex, oldOptionByRegionIndex) => {\n\t\tif (props.onlySearcher || regionIndex.value !== undefined && optionByRegionIndex.get(regionIndex.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newRegionIndex = optionByRegionIndex.keys().next().value as Region['index'];\n\t\tif (regionIndex.value === dummyIndex || newRegionIndex === dummyIndex) {\n\t\t\tregionIndex.value = newRegionIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionName = (oldOptionByRegionIndex?.get(regionIndex.value) as Option)?.title || '';\n\t\tlet regionMatchLevel = -1;\n\t\tfor (const [index, option] of optionByRegionIndex.entries()) {\n\t\t\tconst title = (option as Option).title;\n\n\t\t\tif (typeof title !== 'string' || typeof index === 'string') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// полное совпадение\n\t\t\tif (title === regionName) {\n\t\t\t\tnewRegionIndex = index;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst regexpDevice = new RegExp(` \\\\((${i18n.Common['Device_1']}|${i18n.Common['Device_2']})\\\\)`);\n\t\t\tlet regionNameCompare = regionName;\n\t\t\tlet regionMatchLevelI = 3;\n\n\t\t\t// без устройства\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без устройства и без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\t\t\t\tregionNameCompare = regionNameCompare.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\tif (title.indexOf(regionNameCompare) === -1) continue;\n\t\t\tif (regionMatchLevelI <= regionMatchLevel) continue;\n\n\t\t\tregionMatchLevel = regionMatchLevelI;\n\t\t\tnewRegionIndex = index;\n\t\t}\n\n\t\tregionIndex.value = newRegionIndex;\n\t});\n\n\treturn {\n\t\tregionIndex,\n\t\toptionByRegionIndex,\n\t};\n};\n","import { type ComputedRef, ref, watch } from 'vue';\nimport type { Props, SearcherByKey } from '../types';\n\n/**\n * Создание и управление реактивными переменными для сравнения\n *\n * @param props - входные props компонента\n * @param searcherByKey - Map ПС (реактивная)\n * @param allRegionsIndexes - Все доступные индексы регионов (реактивная)\n */\nexport const useCompare = (props: Props, searcherByKey: ComputedRef<SearcherByKey>, allRegionsIndexes: ComputedRef<Set<number>>) => {\n\t/**\n\t * Индексы регионов/ПС в сравнение\n\t */\n\tconst regionsIndexes = ref<number[]>([]);\n\n\t/**\n\t * Загрузка индексов регионов для сравнения\n\t *\n\t * Если в modelValue передано несколько регионов, они будут установлены как выбранные для сравнения\n\t */\n\tconst compareLoad = () => {\n\t\tif (props.onlySearcher && searcherByKey.value) {\n\t\t\tregionsIndexes.value = Array.from(searcherByKey.value.keys());\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionsIndexesSaved: Props['modelValue'] = [];\n\n\t\tif (props.modelValue.length > 1) {\n\t\t\tregionsIndexesSaved = [...props.modelValue];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\t// загрузить индексы регионов, если они были сохранены\n\t\t\t\tregionsIndexesSaved = JSON.parse(\n\t\t\t\t\tlocalStorage.getItem('ui:project:regionSelector' + props.projectId + ':regionsIndexes') as string,\n\t\t\t\t) ?? [];\n\t\t\t} catch (e) {\n\n\t\t\t}\n\t\t}\n\n\t\t// убрать из сравнения регионы, которых нет в props.searchers\n\t\tif (regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = regionsIndexesSaved.filter((regionIndex) => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\t// если не сохранено ни одного региона, выбрать все регионы проекта\n\t\tif (!regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = Array.from(allRegionsIndexes.value);\n\t\t}\n\n\t\tregionsIndexes.value = [...regionsIndexesSaved];\n\t};\n\n\t/**\n\t * Сохранение выбранных регионов\n\t */\n\tconst compareSave = () => {\n\t\tif (regionsIndexes.value.length) {\n\t\t\tlocalStorage.setItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes', JSON.stringify(regionsIndexes.value));\n\t\t} else {\n\t\t\tlocalStorage.removeItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes');\n\t\t}\n\t};\n\n\twatch(regionsIndexes, () => {\n\t\tcompareSave();\n\t});\n\n\tif (props.addCompare) {\n\t\t// if (props.compareRegionsIndexes?.length) {\n\t\t// \tcompareRegionsIndexes.value = [...props.compareRegionsIndexes];\n\t\t// } else {\n\t\t// \tcompareLoad();\n\t\t// }\n\n\t\tcompareLoad();\n\t}\n\n\treturn {\n\t\tregionsIndexes,\n\t};\n};\n","import { computed, watch } from 'vue';\nimport { findRegion, genSearcherByKey } from '../utils/utils';\nimport { dummyIndex, globalRegionIndex, searcherUndefined, searhcerCompareKey } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\nimport { useSelectSearcher } from './selectSearcher';\nimport { useSelectRegion } from './selectRegion';\nimport { useCompare } from './compare';\n\n/**\n * Создание и управления рективными переменными компонента\n *\n * @param props - входные props компонента\n */\nexport const useSelectorRegion = (props: Props) => {\n\tconst searcherByKey = computed(() => {\n\t\treturn genSearcherByKey(props.forMode, props.autoRegion, props.searchers);\n\t});\n\n\tconst activeSearcherIndexed = computed(() => {\n\t\treturn searcherByKey.value.get(selectSearcher.searcherKey.value) || searcherUndefined;\n\t});\n\n\t/**\n\t * Все индексы регионов из searcherByKey\n\t *\n\t * Активность регионов определяется в searcherByKey\n\t */\n\tconst allRegionsIndexes = computed(() => {\n\t\tconst regionsIndexes = new Set<number>();\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\tregionsIndexes.add(region.index);\n\t\t\t});\n\t\t});\n\n\t\treturn regionsIndexes;\n\t});\n\n\tconst selectSearcher = useSelectSearcher(props, searcherByKey);\n\tconst selectRegion = useSelectRegion(props, activeSearcherIndexed);\n\tconst compare = useCompare(props, searcherByKey, allRegionsIndexes);\n\n\t// контроль за внешним изменением списка ПС\n\twatch(searcherByKey, () => {\n\t\t// возможные значения для сравнения регионов/пс\n\t\tif (props.onlySearcher) {\n\t\t\tcompare.regionsIndexes.value = Array.from(searcherByKey.value.keys());\n\t\t} else {\n\t\t\tcompare.regionsIndexes.value = compare.regionsIndexes.value.filter(regionIndex => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey) return;\n\n\t\tlet newSearcherKey = searcherByKey.value.keys().next().value;\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t// определить выбранную ПС\n\t\t\tif (props.onlySearcher && searcher.key === selectSearcher.searcherKey.value) {\n\t\t\t\tnewSearcherKey = selectSearcher.searcherKey.value;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tselectRegion.regionIndex.value &&\n\t\t\t\tsearcher.regionByIndex?.has(selectRegion.regionIndex.value)\n\t\t\t) {\n\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t}\n\n\t\t\t// выбрать первую ПС с выбранным регионом\n\t\t\tif (!props.onlySearcher) {\n\t\t\t\tlet regionsNewSearcher: SearcherIndexed['regionByIndex'] | undefined;\n\n\t\t\t\tif (newSearcherKey !== undefined) {\n\t\t\t\t\tregionsNewSearcher = searcherByKey.value.get(newSearcherKey)?.regionByIndex;\n\t\t\t\t}\n\n\t\t\t\tconst regionsCurrentSearcher = searcherByKey.value.get(searcher.key)?.regionByIndex;\n\t\t\t\tif (\n\t\t\t\t\tregionsNewSearcher?.has(dummyIndex) &&\n\t\t\t\t\t!regionsCurrentSearcher?.has(dummyIndex)\n\t\t\t\t) {\n\t\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// if (props.addCompare && !selectSearcher.optionBySearcherKey.value.has(dummyIndex)) {\n\t\t// \tif (!selectRegion.regionIndex.value && compare.regionsIndexes.value?.length) newSearcherKey = searhcerCompareKey;\n\t\t// }\n\n\t\t// if (props.onlySearcher && selectRegion.regionIndex.value !== dummyIndex) newSearcherKey = selectRegion.regionIndex.value;\n\n\t\tif (newSearcherKey !== undefined) {\n\t\t\tselectSearcher.searcherKey.value = newSearcherKey;\n\t\t}\n\n\t\tif (\n\t\t\tselectRegion.regionIndex.value !== undefined &&\n\t\t\t!(activeSearcherIndexed.value?.regionByIndex)?.has(selectRegion.regionIndex.value)\n\t\t) {\n\t\t\tselectRegion.regionIndex.value = activeSearcherIndexed.value?.regions?.keys().next().value as number;\n\t\t}\n\t}, { immediate: true });\n\n\tconst getSearcherKey = () => {\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey || selectSearcher.searcherKey.value === dummyIndex) return;\n\n\t\treturn selectSearcher.searcherKey.value;\n\t};\n\n\tconst getRegionIndex = () => {\n\t\tif (props.onlySearcher) return;\n\n\t\tif (selectRegion.regionIndex.value === dummyIndex) return;\n\n\t\tlet res: Region['index'] | undefined = selectRegion.regionIndex.value;\n\n\t\t// в качестве ключа используется region.key\n\t\tif (props.forMode) {\n\t\t\tconst regionKey = selectRegion.regionIndex.value;\n\t\t\tconst region = findRegion(props.forMode, { searcher_key: getSearcherKey(), key: regionKey } as Region, props.searchers);\n\n\t\t\tres = region?.index;\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Получить выбранную ПС\n\t */\n\tconst getSearcher = () => {\n\t\tconst searcherKey = getSearcherKey();\n\t\tif (searcherKey === undefined) return;\n\n\t\treturn searcherByKey.value.get(searcherKey);\n\t};\n\n\t/**\n\t * Получить выбранный регион\n\t */\n\tconst getRegion = () => {\n\t\tconst regionIndex = getRegionIndex();\n\t\tif (regionIndex === undefined) return;\n\n\t\treturn getSearcher()?.regionByIndex?.get(regionIndex);\n\t};\n\n\treturn {\n\t\tselectSearcher,\n\t\tselectRegion,\n\t\tcompare,\n\n\t\tsearcherByKey,\n\t\tallRegionsIndexes,\n\n\t\tgetSearcher,\n\t\tgetRegion,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { watch } from 'vue';\nimport type { Props, Region } from './types';\nimport Select from '@/components/forms/select/select.vue';\nimport Button from '@/components/forms/button/button.vue';\nimport { useSelectorRegion } from './composables/selectorRegion';\nimport { dummyIndex, globalRegionIndex, searhcerCompareKey } from './utils/consts';\nimport { dialogRegionSelector } from '@/components/project/regionSelector/utils/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsearchers: () => [],\n\t// compareRegionsIndexes: () => [],\n\taddSearcherIcon: true,\n\taddRegionIcon: true,\n\taddChanger: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\nconst modelSingle = defineModel<Props['modelValueSingle']>('modelValueSingle');\n\nconst {\n\tselectSearcher,\n\tselectRegion,\n\tcompare,\n\n\tsearcherByKey,\n\tallRegionsIndexes,\n\n\tgetSearcher,\n\tgetRegion,\n} = useSelectorRegion(props);\n\nconst onClickCompare = () => {\n\tconst regions: Region[] = [];\n\n\tsearcherByKey.value.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (!region.enabled) return;\n\n\t\t\tregions.push(region);\n\t\t});\n\t});\n\n\tdialogRegionSelector.open('regions', {\n\t\tregions,\n\t\tregionsIndexes: compare.regionsIndexes.value,\n\t\t'@update:regionsIndexes': (regionsIndexes: number[]) => compare.regionsIndexes.value = regionsIndexes,\n\t});\n};\n\nwatch([selectRegion.regionIndex, selectSearcher.searcherKey, compare.regionsIndexes], () => {\n\tif (selectSearcher.searcherKey.value === searhcerCompareKey && compare.regionsIndexes.value.length) {\n\t\tif (JSON.stringify(model.value) === JSON.stringify(compare.regionsIndexes.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tmodel.value = [...compare.regionsIndexes.value];\n\t} else {\n\t\tif (props.onlySearcher) {\n\t\t\tmodel.value = [selectSearcher.searcherKey.value];\n\n\t\t\tif (selectSearcher.searcherKey.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t} else {\n\t\t\tmodel.value = [selectRegion.regionIndex.value];\n\n\t\t\t// не добавлять несуществующий регион в результаты\n\t\t\tif (selectRegion.regionIndex.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t}\n\t}\n\n\t// регионов нет\n\tif (!props.onlySearcher && !allRegionsIndexes.value.size) {\n\t\tselectSearcher.searcherKey.value = dummyIndex;\n\t}\n});\n\nif (modelSingle.value) {\n\twatch(modelSingle, () => {\n\t\tif (modelSingle.value) {\n\t\t\tmodel.value = [modelSingle.value];\n\t\t}\n\t}, { immediate: true });\n}\n\nwatch(model, () => {\n\tif (model.value[0]) {\n\t\tmodelSingle.value = model.value[0];\n\t}\n\n\t// проверка входных данных v-model на корректность\n\tif (props.onlySearcher) {\n\t\tif (\n\t\t\t!model.value.length ||\n\t\t\tmodel.value.length === 1 && !searcherByKey.value.has(model.value[0]) ||\n\t\t\tmodel.value.length === 1 && model.value[0] === dummyIndex && !props.autoRegion\n\t\t) {\n\t\t\tlet defaultKey: number | undefined = searcherByKey.value.keys().next().value;\n\n\t\t\t// запретить устанавливать несуществующий регион\n\t\t\tif (defaultKey === dummyIndex && !props.autoRegion) {\n\t\t\t\tdefaultKey = undefined;\n\n\t\t\t\tmodelSingle.value = dummyIndex;\n\t\t\t}\n\n\t\t\tif (defaultKey !== undefined) {\n\t\t\t\tmodel.value = [defaultKey];\n\t\t\t}else{\n\t\t\t\tmodel.value.length = 0;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmodel.value.length > 1 &&\n\t\t\tJSON.stringify(model.value) !== JSON.stringify(compare.regionsIndexes.value)\n\t\t) {\n\t\t\tmodel.value = [...compare.regionsIndexes.value];\n\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlet newModel = [...new Set(model.value)];\n\n\t\tlet defaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.keys().next().value;\n\t\tif (props.forMode) {\n\t\t\tdefaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.values().next().value?.key;\n\t\t}\n\n\t\t// запретить устанавливать несуществующий регион\n\t\tif (defaultIndex === dummyIndex && !props.autoRegion) {\n\t\t\tdefaultIndex = undefined;\n\n\t\t\tmodelSingle.value = dummyIndex;\n\t\t}\n\n\t\tif (!newModel.length) {\n\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t} else if (newModel.length === 1) {\n\t\t\tlet all = allRegionsIndexes.value;\n\n\t\t\tif (props.forMode) {\n\t\t\t\tall = new Set();\n\t\t\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\t\t\tall.add(region.key);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// убрано, так как dummyIndex запрещено выбирать в model\n\t\t\t// if (!all.has(newModel[0]) && newModel[0] !== dummyIndex) {\n\t\t\tif (!all.has(newModel[0])) {\n\t\t\t\tnewModel = [];\n\t\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewModel = newModel.filter(index => allRegionsIndexes.value.has(index));\n\t\t\tif (!newModel.length && defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (JSON.stringify(model.value) !== JSON.stringify(newModel)) {\n\t\t\tmodel.value = newModel;\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// входные данные v-model совпадают с внутренними значениями\n\tif (\n\t\tmodel.value.length === 1 &&\n\t\tmodel.value[0] === (props.onlySearcher ? selectSearcher.searcherKey.value : selectRegion.regionIndex.value)\n\t) {\n\t\treturn;\n\t}\n\n\t// if (\n\t// \tmodel.value.length > 1 &&\n\t// \tselectorSearcher.searcherKey.value === searhcerCompareKey &&\n\t// \tJSON.stringify(model.value) === JSON.stringify(selectorCompare.regionsIndexes.value)\n\t// ) {\n\t// \treturn;\n\t// }\n\n\t// обновление regionIndex, searcherKey, selectorCompare.regionsIndexes\n\tif (props.onlySearcher) {\n\t\t// if (!model.value.length) {\n\t\t// \tselectorSearcher.searcherKey.value = dummyIndex;\n\t\t//\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (model.value.length === 1) {\n\t\t\tselectSearcher.searcherKey.value = model.value[0];\n\n\t\t\treturn;\n\t\t}\n\n\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\n\t\treturn;\n\t} else {\n\t\tif (!model.value.length) {\n\t\t\t// selectSearcher.searcherKey.value = dummyIndex;\n\t\t\t// selectRegion.regionIndex.value = dummyIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (model.value.length === 1 && selectSearcher.searcherKey.value !== searhcerCompareKey) {\n\t\t\tselectRegion.regionIndex.value = model.value[0];\n\n\t\t\tlet newSearherKey: number | undefined;\n\t\t\tfor (const searcher of searcherByKey.value.values()) {\n\t\t\t\tfor (const region of searcher.regionByIndex.values()) {\n\t\t\t\t\tconst currentRegionIndex = props.forMode ? region.key : region.index;\n\t\t\t\t\tif (currentRegionIndex === selectRegion.regionIndex.value) {\n\t\t\t\t\t\tnewSearherKey = searcher.key;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\tselectSearcher.searcherKey.value = newSearherKey;\n\t\t\t}\n\t\t} else {\n\t\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\t\t\tcompare.regionsIndexes.value = [...model.value];\n\t\t}\n\t}\n}, { immediate: true });\n\ndefineExpose({\n\tgetSearcher,\n\tgetRegion,\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-selectorRegion': true,\n\t\t\t'top-selectorRegion-onlySearcher': onlySearcher,\n\t\t}\"\n\t>\n\t\t<Select\n\t\t\t:options=\"selectSearcher.optionBySearcherKey.value\"\n\t\t\tv-model=\"selectSearcher.searcherKey.value\"\n\t\t\tname=\"searcher_key\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t/>\n\n\t\t<Select\n\t\t\tv-if=\"!onlySearcher && selectSearcher.searcherKey.value !== searhcerCompareKey\"\n\t\t\tclass=\"top-select-region\"\n\t\t\t:options=\"selectRegion.optionByRegionIndex.value\"\n\t\t\tv-model=\"selectRegion.regionIndex.value\"\n\t\t\t:name=\"forMode ? 'region_key' : 'region_index'\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t\t:data-top-icon=\"addRegionIcon ? '' : undefined\"\n\t\t/>\n\n\t\t<Button\n\t\t\tv-if=\"addCompare && !onlySearcher && selectSearcher.searcherKey.value === searhcerCompareKey\"\n\t\t\tname=\"compare\"\n\t\t\t@click=\"onClickCompare\"\n\t\t\t:data-count-compare-regions-indexes=\"compare.regionsIndexes.value.length\"\n\t\t>\n\t\t\t{{ $i18n.Common.Selected_regions }}\n\t\t</Button>\n\t</div>\n</template>\n\n<style>\n@import \"./styles/searcherColors.css\";\n\n.top-selectorRegion {\n\twidth: 340px;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n\n.top-selectorRegion > .top-select {\n\tflex-grow: 1;\n}\n\n.top-selectorRegion > .top-select:focus-within {\n\tz-index: 4;\n}\n\n.top-selectorRegion > .top-select > .top-select_select:hover,\n.top-selectorRegion > .top-select > .top-select_select.top-error {\n\tz-index: 1;\n}\n\n.top-selectorRegion > .top-select-searcher_key {\n\twidth: 140px;\n\tmax-width: 160px;\n\tmargin-right: -1px;\n}\n\n.top-selectorRegion > .top-select-region > select {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.top-selectorRegion > .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-selectorRegion > .top-select-region[data-top-icon][data-top-icon2] {\n\t--top-icon2-size: 16px;\n}\n\n.top-selectorRegion > .top-select-region[data-top-icon][data-top-icon2]:after {\n\ttext-indent: -4px;\n}\n\n.top-selectorRegion > [name=\"compare\"] {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\tflex-grow: 1;\n}\n\n.top-selectorRegion > [name=\"compare\"]:after {\n\tcontent: \"(\" attr(data-count-compare-regions-indexes) \")\";\n\tmargin: 0 0 0 6px;\n}\n\n.top-selectorRegion:not(.top-selectorRegion-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-selectorRegion:not(.top-selectorRegion-onlySearcher) > .top-select-searcher_key[data-value=\"-1\"] > select {\n\tborder-right: none;\n}\n\n.top-selectorRegion-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\nfunction 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 { Props } from './types';\nimport { folderDefault, genApiGetFolders, genFlat } 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 * Проверка входного значения `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: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 genApiAddGroup = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/add/${service}/groups/`);\n};\n","<script setup lang=\"ts\">\nimport { reactive, ref, watch } from 'vue';\nimport { useWatch } from '@/core/utils/composables/useWatch';\nimport Selector2 from '@/components/formsExt/selector2/selector2.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 { genApiAddGroup, genApiGetGroups, genGroupAll, genGroupPlaceholder, genItems, groupNone } from './utils';\nimport { genFieldFilter } from '@/api/api/index';\nimport { folderDefault } from '../folders/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tautoselect: 'first',\n\taddChanger: true,\n\taddIcon: true,\n});\n\nconst emits = defineEmits<Emits>();\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { required: true });\n\nconst apiGet = props.client && !props.groups ? genApiGetGroups(props.client, props.service) : undefined;\nconst apiAdd = props.client ? genApiAddGroup(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n/**\n * Группы выбранной папки\n */\nconst groupsBySelectedFolder = ref<Group[] | undefined>(undefined);\n\nconst filterByFolder = genFieldFilter('folder_id', 'EQUALS', [props.folder?.id ?? 0]);\n\napiGet?.changeParams({\n\tproject_id: props.projectId,\n\tfolder_id_depth: true,\n\tfilters: [\n\t\tfilterByFolder,\n\t],\n});\n\nif (props.on !== undefined) {\n\tapiGet?.params.filters?.push(genFieldFilter('on', 'EQUALS', [Number(props.on)]));\n}\n\n/**\n * Синхронная установка группы и id группы\n *\n * Id рекомендуется вместе с группой\n * - для согласованной смены состояния\n * - для уменьшения цепочки `watch` синхронизации состояний `modelGroupId` и `modelGroup`\n *\n * Пример несогласованности: если передать `modelGroup` и значение `modelGroupId`, которое ему не соответсвует, то попытка установить ту же самоую группу в `modelGroup` не приведет к смене `modelGroupId`\n */\nconst setGroup = (group: Props['group']) => {\n\tmodelGroup.value = group;\n\tmodelGroupId.value = group.id;\n};\n\n// Настройка API, обработка смены папки и выбор всех групп\nuseWatch({\n\tprojectId: () => props.projectId,\n\tfolderId: () => props.folder?.id,\n\tcanSelectAll: () => props.canSelectAll,\n}, (changes) => {\n\t// Настройка API\n\tif (changes.projectId) {\n\t\tapiGet?.changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t});\n\n\t\tapiGet?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorGroups:' + props.projectId,\n\t\t});\n\t}\n\n\t// Обработка смены папки\n\tif (changes.folderId) {\n\t\tfilterByFolder.values = [\n\t\t\tprops.folder?.id ?? 0,\n\t\t];\n\n\t\t// необходимо установить группы выбранной папки\n\t\tif (props.groups) {\n\t\t\tgroupsBySelectedFolder.value = genItems(props.groups, props.on, props.folder);\n\t\t}\n\t}\n\n\trefSelector.value?.resetCache();\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</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\">\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 v-html=\"item.name\"></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 v-if=\"item.folder_path && showPath\" class=\"top-groupSelector_groupItemFolderPath\" v-html=\"item.folder_path\"></span>\n\t\t\t</div>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-groupSelector_groupItem {\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 } from 'vue';\nimport type { Emits, Props } from './types';\nimport type { Folder } from './folders/types';\nimport type { Group } from './groups/types';\nimport Folders from './folders/folders.vue';\nimport Groups from './groups/groups.vue';\nimport { folderDefault, genFlat, genRootFolder } from './folders/utils';\nimport { genGroupAll, genGroupPlaceholder, groupNone } from './groups/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tcanSelectAll: false,\n\tautoselect: 'first',\n\taddChanger: true,\n\tshowFolders: true,\n\tshowGroups: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\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.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</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\n\t\t/>\n\n\t\t<Groups\n\t\t\tv-if=\"showGroups\"\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:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:autoselect\n\t\t\t:addChanger\n\t\t\t:showPath=\"showFolders && !!folders?.[0]\"\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service\n\t\t\t@addGroup=\"onAddGroup\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-groupSelector {\n\tdisplay: inline-flex;\n\tgap: var(--top-padding-1);\n}\n</style>\n","import type { Item, Props } from '@/components/formsExt/selector2/types';\nimport { TopPopupWorker } from '@/components/popup/worker';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\n\n/**\n * Создать объект заголовка для категории проектов\n */\nconst createProjectCategoryTitles = (name: string): Item => {\n\treturn {\n\t\tid: null,\n\t\tname,\n\t\tlistItemProps: {\n\t\t\ttype: 'title',\n\t\t},\n\t};\n};\n\n/**\n * Состояние вставки заголовков категорий\n *\n * Используется для отслеживания, какие заголовки уже были добавлены в список,\n * чтобы не дублировать их при постраничной загрузке данных\n */\nconst globalTitlesState = {\n\tscheduledUpdate: false,\n\tmanualUpdate: false,\n\tguestProjects: false,\n};\n\n/**\n * Вставить заголовки категорий перед соответствующими группами проектов\n *\n * Использует `globalTitlesState`, оно сохраняется между вызовами, так как проекты подгружаются частями\n *\n * При `useLocalTitlesState` = `true` создаётся временное состояние заголовков для этого вызова функции, не влияющее на глобальное состояние.\n * Используется при поиске проектов, чтобы сохранить исходное состояние заголовков\n */\nconst insertCategoryTitles = (projects: Item[], useLocalTitlesState?: boolean): Item[] => {\n\tconst result: Item[] = [];\n\n\tconst categoriesTitle = {\n\t\tscheduledUpdate: createProjectCategoryTitles(useI18n().Projects.Scheduled_update),\n\t\tmanualUpdate: createProjectCategoryTitles(useI18n().Projects.Manual_update),\n\t\tguestProjects: createProjectCategoryTitles(useI18n().Projects.Guest_projects),\n\t};\n\n\tconst titlesState = useLocalTitlesState ? {\n\t\tscheduledUpdate: false,\n\t\tmanualUpdate: false,\n\t\tguestProjects: false,\n\t} : globalTitlesState;\n\n\tfor (const project of projects) {\n\t\tif (!titlesState.scheduledUpdate && project.right?.startsWith('1') && project.on > 0) {\n\t\t\tresult.push(categoriesTitle.scheduledUpdate);\n\t\t\ttitlesState.scheduledUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.manualUpdate && project.right?.startsWith('1') && project.on === 0) {\n\t\t\tresult.push(categoriesTitle.manualUpdate);\n\t\t\ttitlesState.manualUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.guestProjects && project.right?.startsWith('0') && project.on >= 0) {\n\t\t\tresult.push(categoriesTitle.guestProjects);\n\t\t\ttitlesState.guestProjects = true;\n\t\t}\n\n\t\tresult.push(project);\n\t}\n\n\treturn result;\n};\n\n/**\n * Добавить к данным проектов `listItemProps`\n *\n * @see Item\n */\nconst addListItemProps = (\n\tprojects: Item[],\n) => {\n\treturn projects.map((project) => ({\n\t\t...project,\n\t\tlistItemProps: {\n\t\t\tattrs: { title: project.name },\n\t\t},\n\t}));\n};\n\n/**\n * Подготавить данные проектов для отображения:\n * - сбросить состояние вставки заголовков категорий, если требуется\n * - добавить `listItemProps`\n * - добавить заголовки к категориям\n */\nconst prepareProjects = (\n\tprojects: Item[] | undefined,\n\tresetTitlesState?: boolean,\n\tuseLocalTitlesState?: boolean,\n): Item[] | undefined => {\n\tif (!projects || projects.length === 0) return [];\n\n\tif (resetTitlesState) Object.keys(globalTitlesState).forEach((key) => globalTitlesState[key] = false);\n\n\tconst projectsWithListItem = addListItemProps(projects);\n\treturn insertCategoryTitles(projectsWithListItem, useLocalTitlesState);\n};\n\n/**\n * Добавить к ссылке релевантные hash-параметров текущего проекта\n */\nconst prepareProjectLink = (link: string) => {\n\tlink = link.replace(/#.*/, '');\n\n\tlet hash = location.hash;\n\n\t// Игнорируемые параметры при переходе между проектами\n\thash = hash.replace(/historyView=[^&]*/, '');\n\thash = hash.replace(/competitorsIds=[^&]*/, '');\n\thash = hash.replace(/searchersKeys=[^&]*/, '');\n\thash = hash.replace(/regionIndex=[^&]*/, '');\n\thash = hash.replace(/regionsIndexes=[^&]*/, '');\n\thash = hash.replace(/folderId=[^&]*/, '');\n\thash = hash.replace(/groupId=[^&]*/, '');\n\thash = hash.replace(/tags=[^&]*/, '');\n\n\t// Сохранить сортировку по дате последней проверки\n\tif (window['mo']?.getHash && !window['mo'].getHash('dataSort').toString().includes('0000-00-00')) {\n\t\thash = hash.replace(/dataSort=[^&]*/, '');\n\t}\n\n\t// Игнорируемые параметры при переходе между проектами (для pinia)\n\thash = hash.replace(/%22historyView%22:[^,]*,/, '');\n\thash = hash.replace(/%22competitorsIds%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22searchersKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22regionIndex%22:[^,]*,/, '');\n\thash = hash.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22folderId%22:[^,]*,/, '');\n\thash = hash.replace(/%22groupId%22:[^,]*,/, '');\n\thash = hash.replace(/%22tagsIds%22:\\[[^\\]]*],/, '');\n\n\t// Сохранить сортировку по дате последней проверки (для pinia)\n\tif (!/%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(hash)) {\n\t\thash = hash.replace(/%22dataSort%22:\\{[^}]*},/, '');\n\t}\n\n\treturn link + hash;\n};\n\n/**\n * Закрыть попап и выполнить переход на страницу проекта\n */\nexport const navigateToProject = (link: string, event?: PointerEvent) => {\n\tif (event && event.target instanceof HTMLElement) {\n\t\tTopPopupWorker.close(event.target.closest('.top-popup-wrapper')!);\n\t}\n\n\tconst linkWithHash = prepareProjectLink(link);\n\tlocation.href = linkWithHash;\n};\n\n/**\n * Сгенерировать ссылку на проект\n */\nexport const genProjectLink = (projectId: number) => {\n\tconst host = getBaseHost();\n\tconst pathname = location.pathname.split('/');\n\n\tlet prefix = 'project/dynamics/';\n\tlet suffix = '';\n\tif (pathname[1] == 'project') prefix = pathname[1] + '/' + pathname[2] + '/';\n\tif (pathname[2] == 'settings') suffix = location.hash;\n\tif (['watcher', 'indexing', 'sitemap', 'audit', 'direct', 'adwords'].includes(pathname[4])) suffix = pathname[4] + '/';\n\n\treturn 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n};\n\n/**\n * Вернуть базовый хост без поддомена\n */\nexport const getBaseHost = () => {\n\tif (window['page']?.subdomain) {\n\t\treturn window.location.host.replace(window['page']?.subdomain + '.', '');\n\t}\n\n\treturn window.location.host;\n};\n\n/**\n * Сгенерировать ссылку на сайт проекта\n */\nexport const genProjectExternalLink = (url: string) => {\n\tlet link = url.startsWith('http') ? url : 'http://' + url;\n\n\tlink = link.replace(/\"/g, '%22');\n\n\treturn link;\n};\n\n/**\n * Расширяет функционал аналогичной функции в Selector2\n *\n * Добавить фильтр поиска по полям `id`, `name`, `url` в параметры API.\n * Поиск выполняется по строке `search` и по строке с инвертированной раскладкой клавиатуры.\n *\n * @param api - api, которое используется в `TopProjectSelector`\n * @param search - введенная строка поиска\n *\n * @todo Объединить с apiSetSearchParamsFilter() из @/components/formsExt/selector2/utils.ts\n */\nexport const apiSetSearchParamsFilter = (api: NonNullable<Props['api']>, search: string) => {\n\tlet filters = api.params.filters ?? [];\n\n\t// удаление других фильтров по этому полю\n\tfilters = filters.filter((filter) => filter.name !== 'GEN_SEARCH_STRING()');\n\n\tconst searchInvert = invertKeyboardLayout(search);\n\tconst searchPrepared = search.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\tconst searchInvertPrepared = searchInvert.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\n\tif (search) {\n\t\tfilters.push(genFieldFilter('GEN_SEARCH_STRING()', 'REGEXP', [`(${searchPrepared}|${searchInvertPrepared})`]));\n\t}\n\n\tapi.changeParams({ filters });\n};\n\n/**\n * Создать API запрос на получение списка проектов\n *\n * Данные после загрузки преобразуются с помощью `prepareProjects()`\n *\n * @see prepareProjects\n */\nexport const genApiGetProjects = (\n\tclient: Api.Client<Api.TV.Paths, true>,\n\tuserId: number,\n\tparams?: Record<string, number>,\n) => {\n\tconst api = client.gen('/get/projects_2/projects/', ['id', 'user_id', 'name', 'url', 'on', 'right']);\n\n\tapi.params = {\n\t\t...params,\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', [userId]),\n\t\t\tgenFieldOrder('on', 'DESC'),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t};\n\n\tapi.options.onApiLoaded = (res, ctx, clientOnApiLoaded) => {\n\t\t// Флаг для сброса глобального состояния заголовков.\n\t\t// Срабатывает при добавлении проекта или полной перезагрузке списка\n\t\tconst needResetTitle = ctx.data.filters.length === 1 && ctx.data.offset === 0 || ctx.data.limit === 1000;\n\n\t\t// Флаг для использования локального состояния заголовков.\n\t\t// Срабатывает при поиске проектов (когда фильтров больше одного),\n\t\t// чтобы не сбрасывать уже вставленные заголовки.\n\t\tconst useLocalTitlesState = ctx.data.limit === 100 && ctx.data.filters.length > 1 ? true : undefined;\n\n\t\tres.result = prepareProjects(res.result as Item[], needResetTitle, useLocalTitlesState);\n\n\t\tclientOnApiLoaded?.(res, ctx);\n\t};\n\n\treturn api;\n};\n\n/**\n * Создать API запрос для добавления проекта\n */\nexport const genApiAddProject = (client: Api.Client<Api.TV.Paths, true>) => {\n\treturn client.gen('/add/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\nimport { computed } from 'vue';\nimport { TopPopup } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst submenuItems = [\n\t{\n\t\thref: `https://${host}/project/keywords/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_phrases,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n\t{\n\t\thref: `https://${host}/project/dynamics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_dynamics,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/snapshots/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_snapshots,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/competitors/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_competitors,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/analytics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_analytics,\n\t\ticon: '',\n\t\tright: '5',\n\t},\n\t{\n\t\thref: `https://${host}/project/broker/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_broker,\n\t\ticon: '',\n\t\tright: '6',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/sitemap/`,\n\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/audit/`,\n\t\ttitle: i18n.Common.Menu_audit,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/indexing/`,\n\t\ttitle: i18n.Audit.Indexing,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/watcher/`,\n\t\ttitle: i18n.Audit.Watcher,\n\t\ticon: '',\n\t\tright: '9',\n\t},\n\t{\n\t\thref: `https://${host}/project/settings/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_settings,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n];\n\nconst filteredSubmenuItems = computed(() => {\n\tif (!props.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn props.right[item.right] === '1';\n\t});\n});\n</script>\n\n<template>\n\t<TopPopup\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #opener>\n\t\t\t<TopButton\n\t\t\t\tclass=\"top-projectSelectorSubmenu_opener\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t></TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<li\n\t\t\t\tv-for=\"item in filteredSubmenuItems\"\n\t\t\t\tclass=\"top-projectSelectorSubmenu_item\"\n\t\t\t>\n\t\t\t\t<a\n\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:data-right=\"item.right\"\n\t\t\t\t></a>\n\t\t\t</li>\n\n\t\t\t<li class=\"top-projectSelectorSubmenu_item\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"url\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t></a>\n\t\t\t</li>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-projectSelectorSubmenu .top-popup {\n\tmin-width: 170px;\n}\n\n.top-projectSelectorSubmenu ul {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n.top-projectSelectorSubmenu_item {\n\twidth: 32%;\n}\n\n.top-projectSelectorSubmenu_item a {\n\tjustify-content: center;\n}\n\n.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t--top-icon-size: 24px;\n\t--top-icon-width: 32px;\n\n\theight: var(--top-icon-width);\n\tmargin: 0;\n}\n\n.top-projectSelectorSubmenu_item {\n\tflex-grow: 1;\n}\n</style>\n","import type { Item } from '@/components/formsExt/selector2/types';\nimport { ref, shallowRef } from 'vue';\n\nconst CACHE_KEY_PREFIX = 'ui_project_selector_total:';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n */\nexport const projectsCache = shallowRef<Item[]>();\nexport const resetStateSignal = ref(0);\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\nexport const setCache = (\n\tuserId: number,\n\tprojectsTotal: number,\n) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY_PREFIX + userId,\n\t\tJSON.stringify({ projectsTotal, expiresAt: Date.now() + CACHE_TTL }),\n\t);\n};\n\nexport const getCache = (userId: number) => {\n\tconst raw = localStorage.getItem(CACHE_KEY_PREFIX + 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_PREFIX + userId);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\nexport const clearCache = (userId: number, resetState: boolean = true) => {\n\tprojectsCache.value = undefined;\n\tlocalStorage.removeItem(CACHE_KEY_PREFIX + userId);\n\n\tif (resetState) resetStateSignal.value++;\n};\n","<script setup lang=\"ts\">\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { ref, computed, watch, onMounted } 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 Submenu from './submenu/submenu.vue';\nimport { navigateToProject, genProjectLink, genProjectExternalLink, apiSetSearchParamsFilter, genApiGetProjects, genApiAddProject } from './utils';\nimport { setCache, getCache, clearCache, resetStateSignal, projectsRequest, projectsCache } from './cache';\n\nconst i18n = useI18n();\n\nif (!window['mo']?.user?.id) {\n\tthrow new Error('TopProjectSelector: не удалось определить userId. Компонент требует авторизованного пользователя (см. window.mo.user.id)');\n}\n\n/**\n * Идентификатор пользователя\n */\nconst userId: number = window['mo'].user.id;\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddLinksToProjects: true,\n});\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({ default: { id: null, name: '' } });\n\nconst apiGet = genApiGetProjects(\n\tprops.client,\n\tuserId,\n);\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | null | undefined>(getCache(userId));\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\nconst placeholder = computed(() => {\n\treturn props.placeholder ?? i18n.Projects.Select_project;\n});\n\nconst itemsForSelector = computed(() => {\n\tif (!projectsCache.value || !props.excludeProjectId) return projectsCache.value;\n\n\treturn projectsCache.value.filter((project) => project.id !== props.excludeProjectId);\n});\n\n/**\n * Источник данных для списка проектов:\n * - `static` — список проектов передан через props\n * - `api` — список загружается через HTTP (API)\n *\n * Выбор режима: `static`, если projectsTotal < PROJECTS_TOTAL_THRESHOLD, иначе `api`\n */\nconst dataSource = computed(() => {\n\tif (!projectsTotal.value && projectsTotal.value !== 0) return;\n\n\treturn projectsTotal.value < PROJECTS_TOTAL_THRESHOLD ? 'static' : 'api';\n});\n\nwatch(resetStateSignal, () => {\n\tresetState();\n});\n\nwatch(model, () => {\n\tif (!model.value.id || !props.addLinksToProjects) return;\n\n\tnavigateToProject(genProjectLink(model.value.id));\n});\n\nconst loadProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tconst api = genApiGetProjects(\n\t\t\tprops.client,\n\t\t\tuserId,\n\t\t\t{ limit: PROJECTS_TOTAL_THRESHOLD },\n\t\t);\n\n\t\tprojectsRequest.value = api.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tif (res.errors) {\n\t\tprojectsRequest.value = null;\n\n\t\treturn;\n\t}\n\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (projectsTotal.value) return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsTotal.value = res.total;\n\tif (dataSource.value === 'static' && !projectsCache.value) projectsCache.value = res.result as Item[];\n\n\tif (projectsTotal.value) setCache(userId, projectsTotal.value);\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (project: Item) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: project.name,\n\t\tname: project.name,\n\t}).call();\n\tif (res.errors) return;\n\n\tif (projectsCache.value && dataSource.value === 'static') {\n\t\tconst newProject = {\n\t\t\tid: Number(res.result),\n\t\t\tuser_id: userId,\n\t\t\tname: project.name,\n\t\t\turl: project.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\n\t\t\tlistItemProps: {\n\t\t\t\tattrs: { title: project.name },\n\t\t\t},\n\t\t};\n\n\t\tconst firstManualUpdateProjectIndex = projectsCache.value.findIndex((project) => project.on === 0);\n\t\tprojectsCache.value = [\n\t\t\t...projectsCache.value.slice(0, firstManualUpdateProjectIndex),\n\t\t\tnewProject,\n\t\t\t...projectsCache.value.slice(firstManualUpdateProjectIndex),\n\t\t];\n\n\t\tif (projectsTotal.value) {\n\t\t\tprojectsTotal.value += 1;\n\t\t\tsetCache(userId, projectsTotal.value);\n\t\t}\n\t}\n\n\tif (dataSource.value === 'api') clearCache(userId);\n};\n\n/**\n * Сброс локального состояния и кеша api\n */\nconst resetState = () => {\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n * Только при `dataSource` = `static`\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (projectsCache.value || dataSource.value !== 'static') return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsCache.value = res.result as Item[];\n};\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\tv-model=\"model\"\n\t\t:items=\"itemsForSelector\"\n\t\t:title=\"$i18n.Projects.Search_projects\"\n\t\t:modificator\n\t\t:searchFields=\"['id', 'name', 'url']\"\n\t\t:placeholder\n\t\thasCloserBtn\n\t\t:api=\"dataSource === 'api' ? apiGet : undefined\"\n\t\t:apiSetSearchParams=\"dataSource === 'api' ? (...args) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps\n\t\t:openerShortcut\n\t\t@appendItem=\"addProject\"\n\t\t@open=\"onOpen\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-projectSelector_item\">\n\t\t\t\t<div class=\"top-projectSelector_itemText\">\n\t\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\t\t\t\t\t\t<span class=\"top-comment\">\n\t\t\t\t\t\t\tid {{ item.id }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{{ item.name }}\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"addLinksToProjects\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t\t:href=\"genProjectLink(item.id)\"\n\t\t\t\t\t\t@click.prevent.stop=\"navigateToProject(genProjectLink(item.id!), $event)\"\n\t\t\t\t\t></a>\n\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemExtLink\"\n\t\t\t\t\t\t:href=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click.stop\n\t\t\t\t\t></TopButton>\n\n\t\t\t\t\t<Submenu\n\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t:right=\"item.right ?? undefined\"\n\t\t\t\t\t\t:url=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\n}\n\n.top-projectSelector_item {\n\t--top-icon-size: 14px;\n\n\tdisplay: flex;\n\tflex-grow: 1;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemLink {\n\tposition: absolute;\n\tinset: 0;\n}\n\n.top-projectSelector_itemText {\n\tflex-grow: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemExtLink,\n.top-projectSelector_item [class*=\"opener\"] {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-popup_listItem:hover .top-projectSelector_item > *,\n.top-popup_listItem.top-active .top-projectSelector_item > * {\n\topacity: 1;\n}\n\n@media screen and (min-width: 900px) {\n\t/* Ограничиваем стандартную высоту popup */\n\t.top-projectSelector.p3 div.top-popup {\n\t\tmax-height: min(calc(var(--top-popup-bottom) - 16px), 800px);\n\t}\n}\n\n@media screen and (max-width: 900px) {\n\t.top-projectSelector_item [class*=\"opener\"] {\n\t\topacity: 1;\n\t}\n}\n</style>\n","import type { Props as TagSelectorOpenerProps } from '../popupOpener/types';\nimport type { Tag, TagIdExclude } from '../types';\n\n/**\n * Полуичить значение исключения тега tagId\n */\nexport const genTagIdExcluded = (tagId: Tag['id']): TagIdExclude => {\n\treturn '-' + tagId as TagIdExclude;\n};\n\n/**\n * Вернуть чистый tagId без exclude флага\n */\nexport const genTagIdClear = (tagId: Tag['id'] | TagIdExclude) => {\n\tif (tagId[0] === '-') return tagId.substring(1) as Tag['id'];\n\n\treturn tagId as Tag['id'];\n};\n\n/**\n * Получить инфомрацию о теге по его id\n */\nexport const getTagById = (tagId: Tag['id'] | TagIdExclude, tags: TagSelectorOpenerProps['tags']) => {\n\ttagId = genTagIdClear(tagId);\n\n\tconst tag = tags.find(tag => tag.id === tagId);\n\tif (!tag) return;\n\n\treturn tag;\n};\n","import { isRef, type Ref, ref, unref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport TopPopupWorker from '@/components/popup/lib/worker';\nimport type { OpenerProps as PopupOpenerProps } from '@/components/popup/popup/opener/types';\nimport type { Props as TagSelectorOpenerProps, TagSelectorTarget } from '../popupOpener/types';\nimport type { Props as TagIconProps } from '../tagIcon/types';\nimport { genTagIdClear, getTagById } from './utils';\n\n/**\n * Сгенерировать элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelectorPopupOpener для работы вне vue\n *\n * Требует монтирования компонента TopTagSelector\n */\nexport const genElPopupOpener = (\n\tprops: TagSelectorOpenerProps & { modelValue: TagSelectorOpenerProps['modelValue'] | Ref<TagSelectorOpenerProps['modelValue']> },\n\tpropsPopup?: Partial<PopupOpenerProps>,\n\thtmlSetterSeveral?: string,\n): HTMLElement => {\n\tif (!propsPopup) propsPopup = { id: props.id };\n\n\t// Значения по умолчанию см. в: `@/components/popup/popup/opener/opener.vue`\n\tpropsPopup.id = props.id;\n\tpropsPopup.pos ??= '3';\n\tpropsPopup.notch ??= true;\n\tpropsPopup.posBy ??= 'fixed';\n\n\tconst el = TopPopupWorker.genElPopupOpener('div', propsPopup as PopupOpenerProps);\n\n\tel.classList.add('top-tagSelector');\n\tif (props.useTopButton) el.classList.add('top-tagSelector-useTopButton', 'top-button', 'top-color_theme', 'top-as-selector');\n\tif (!props.useTopButton) el.classList.add('top-tagSelector-custom');\n\tif (props.mode === 'filter') el.classList.add('top-tagSelector-filter');\n\tif (props.mode === 'setter' && !props.filters) el.classList.add('top-tagSelector-setter_single');\n\tif (props.mode === 'setter' && props.filters) el.classList.add('top-tagSelector-setter_several');\n\n\t// прокcи клик: lazy connect\n\tel.onclick = (e) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tel.onclick = null;\n\n\t\tconst model = ref(props.modelValue);\n\n\t\tconst target: TagSelectorTarget = {\n\t\t\tmodel,\n\t\t\tmode: props.mode,\n\t\t\ttargetId: props.targetId,\n\t\t\tfilters: props.filters,\n\t\t\tpayload: props.payload,\n\t\t};\n\n\t\tstorage(el, 'topTagSelectorTarget', target);\n\n\t\tdelete el.dataset.topPopupDisabled;\n\n\t\tif (!isRef(props.modelValue)) {\n\t\t\twatch(model, () => {\n\t\t\t\tprops.modelValue = model.value;\n\n\t\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t\t});\n\t\t}\n\n\t\t// выполнение клика\n\t\tel.click();\n\t};\n\n\tif (isRef(props.modelValue)) {\n\t\twatch(props.modelValue, () => elPopupOpenerRender(el, props, htmlSetterSeveral));\n\t} else {\n\t\tstorage(el, 'topTagSelectorRender', (modelValue: TagSelectorOpenerProps['modelValue']) => {\n\t\t\tprops.modelValue = modelValue;\n\n\t\t\tconst target = storage(el, 'topTagSelectorTarget');\n\t\t\tif (target) target.model.value = modelValue;\n\n\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t});\n\t}\n\n\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\n\treturn el;\n};\n\n/**\n * Вызвать перерисовку элемента, который был создан через genElPopupOpener()\n *\n * Работет только для элементов не с реактивным modelValue\n */\nexport const renderElPopupOpener = (el: HTMLElement, modelValue: TagSelectorOpenerProps['modelValue']) => {\n\tstorage(el, 'topTagSelectorRender')?.(modelValue);\n};\n\n/**\n * Отрисовать TopTagSelecorPopupOpener\n */\nconst elPopupOpenerRender = (el, props: TagSelectorOpenerProps, htmlSetterSeveral?: string) => {\n\tconst tagsIds = unref(props.modelValue);\n\n\tel.classList.toggle('top-tagSelector-selectedOne', !tagsIds.length || tagsIds.length === 1);\n\tel.classList.toggle('top-tagSelector-toTwoLine', tagsIds.length > 5);\n\n\tif (props.mode === 'setter' && props.filters) {\n\t\tel.innerHTML = `<div>${htmlSetterSeveral}</div>`;\n\n\t\treturn;\n\t}\n\n\tel.innerHTML = '';\n\n\tif (!tagsIds.length && props.mode === 'filter') {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: 'all',\n\t\t\tcolorId: '',\n\t\t\tname: useI18n().Common?.All_tags ?? '',\n\t\t\tstate: '',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t}\n\n\ttagsIds.forEach(tagId => {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: genTagIdClear(tagId),\n\t\t\tcolorId: getTagById(tagId, props.tags)?.color_id ?? '',\n\t\t\tname: getTagById(tagId, props.tags)?.name ?? '',\n\t\t\tstate: genTagIdClear(tagId) === tagId ? 'selected' : 'excluded',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t});\n};\n\n/**\n * Сгенерировтаь элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelecorTagIcon для работы вне vue\n */\nconst genElTagIcon = (props: TagIconProps) => {\n\tconst el = document.createElement('div');\n\n\tel.classList.add('top-tagSelector_tagIcon');\n\tel.classList.toggle('top-tagSelector-active', !!props.state);\n\tel.classList.toggle('top-tagSelector-excluded', props.state === 'excluded');\n\n\tel.dataset.tag_id = props.id;\n\tel.dataset.tag_color_id = props.colorId;\n\tel.title = props.name;\n\n\treturn el;\n};\n","import type { Tag } from './types';\n\nexport default [\n\t{\n\t\tid: '1',\n\t\tname: 'Without Tag',\n\t\tcolor_id: '1',\n\t},\n\t{\n\t\tid: '2',\n\t\tname: 'Red',\n\t\tcolor_id: '2',\n\t},\n\t{\n\t\tid: '3',\n\t\tname: 'Orange',\n\t\tcolor_id: '3',\n\t},\n\t{\n\t\tid: '4',\n\t\tname: 'Yellow',\n\t\tcolor_id: '4',\n\t},\n\t{\n\t\tid: '5',\n\t\tname: 'Blue',\n\t\tcolor_id: '5',\n\t},\n\t{\n\t\tid: '6',\n\t\tname: 'Purple',\n\t\tcolor_id: '6',\n\t},\n\t{\n\t\tid: '7',\n\t\tname: 'Green',\n\t\tcolor_id: '7',\n\t},\n\t{\n\t\tid: '8',\n\t\tname: 'Magenta',\n\t\tcolor_id: '8',\n\t},\n\t{\n\t\tid: '9',\n\t\tname: 'Dark blue',\n\t\tcolor_id: '9',\n\t},\n\t{\n\t\tid: '10',\n\t\tname: 'Turquoise',\n\t\tcolor_id: '10',\n\t},\n] as Tag[];\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\ndefineProps<Props>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagIcon': true,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded',\n\t\t}\"\n\t\t:data-tag_id=\"id\"\n\t\t:data-tag_color_id=\"colorId\"\n\t\t:title=\"name\"\n\t></div>\n</template>\n\n<style>\n[data-tag_id] { display: inline-flex; gap: var(--top-gap-2); align-items: center; }\n\n[data-tag_id=\"\"] { border-color: #bdc3c7 !important; color: #55555F !important; }\n[data-tag_color_id=\"1\"] { border-color: var(--color-tag-1) !important; color: #55555F !important; }\n[data-tag_color_id=\"2\"] { border-color: var(--color-tag-2) !important; color: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"] { border-color: var(--color-tag-3) !important; color: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"] { border-color: var(--color-tag-4) !important; color: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"] { border-color: var(--color-tag-5) !important; color: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"] { border-color: var(--color-tag-6) !important; color: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"] { border-color: var(--color-tag-7) !important; color: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"] { border-color: var(--color-tag-8) !important; color: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"] { border-color: var(--color-tag-9) !important; color: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"] { border-color: var(--color-tag-10) !important; color: var(--color-tag-10) !important; }\n\n[data-tag_id=\"\"].top-tagSelector-active { background: #bdc3c7 !important; }\n[data-tag_color_id=\"1\"].top-tagSelector-active { background: var(--color-tag-1) !important; }\n[data-tag_color_id=\"2\"].top-tagSelector-active { background: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"].top-tagSelector-active { background: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"].top-tagSelector-active { background: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"].top-tagSelector-active { background: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"].top-tagSelector-active { background: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"].top-tagSelector-active { background: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"].top-tagSelector-active { background: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"].top-tagSelector-active { background: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"].top-tagSelector-active { background: var(--color-tag-10) !important; }\n\n[data-tag_id=\"all\"] {\n\tborder-color: transparent !important; background: none !important;\n}\n\n[data-tag_id=\"all\"]:before {\n\tcontent: \"\";\n\tcolor: var(--color-tag-all) !important;\n\tfont-size: 26px;\n\tmin-width: calc(100% + 4px);\n\theight: calc(100% + 4px);\n\tmargin-top: -18px;\n\tmargin-left: -8px;\n}\n\n/* в кнопке выбора тэгов и в popup */\n.top-tagSelector-useTopButton [data-tag_id],\n.top-tagSelector_popup [data-tag_id] {\n\t--top-tag-selector-size: 10px;\n\n\tbox-sizing: content-box;\n\tborder-radius: 100%; border: 2px solid var(--color-layout-front-1); background: var(--color-layout-front-1);\n\twidth: var(--top-tag-selector-size);\n\theight: var(--top-tag-selector-size);\n\tfont-size: calc(var(--top-tag-selector-size) + 4px);\n\t/*font-family: inherit !important;*/\n}\n\n/* исключение тегов */\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],\n[data-tag_id].top-tagSelector-excluded { position: relative; }\n\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,\n[data-tag_id].top-tagSelector-excluded:before {\n\tcontent: \"\";\n\twidth: calc(var(--top-tag-selector-size) * 2); height: 1px; background: inherit;\n\ttransform: rotate(-45deg); filter: brightness(80%);\n\tdisplay: block;\n\tposition: absolute; top: calc(var(--top-tag-selector-size) / 2); left: calc(0px - var(--top-tag-selector-size) / 2);\n}\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=\"all\"]):not(.top-tagSelector-active):before { background: #AAA; }\n[data-tag_id].top-tagSelector-excluded:after,\n[data-tag_id].top-tagSelector-excluded ~ .top-tagSelector_tagListItemName { text-decoration: line-through; }\n\n/* popup */\n.top-popup_listItem.top-tagSelector-active { background: var(--top-popup-background-color-active) !important; }\n\n.top-popup_listItem:hover [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-hover); }\n.top-popup_listItem.top-tagSelector-active [data-tag_id=\"all\"]:before,\n.top-popup_listItem.top-active [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-active); }\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\nimport TopPopupListItem from '@/components/popup/popup/listItem.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst name = defineModel<Props['name']>('name', {\n\trequired: true,\n});\n\nconst elName = ref<HTMLElement | null>(null);\n\n/**\n * @todo Удалить через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n */\nconst firefoxProps = computed(() => {\n\tif (navigator.userAgent.indexOf('Firefox') != -1) {\n\n\t\treturn {\n\t\t\tcontenteditable: inEdit.value,\n\t\t\tonpaste: (event: Event) => event.preventDefault(),\n\t\t};\n\t}\n\n\treturn {};\n});\n\n/**\n * Включен режим редактирвоания\n */\nconst inEdit = ref(false);\n\n/**\n * Включить режим редактирование\n */\nconst turnToEdit = async () => {\n\tinEdit.value = true;\n\n\tawait nextTick();\n\n\telName.value?.focus();\n};\n\n/**\n * Применить редактирование\n */\nconst editCommit = () => {\n\tconst name = elName.value?.innerText;\n\tif (!name) return editCancel();\n\n\tif (elName.value) elName.value.innerText = name;\n\n\tinEdit.value = false;\n\n\temit('update:name', name);\n};\n\n/**\n * Отменить редактирование\n */\nconst editCancel = async () => {\n\tif (elName.value) elName.value.innerText = props.name;\n\n\tinEdit.value = false;\n};\n\n/**\n * Применить выбор\n */\nconst changeSelect = (e: MouseEvent) => {\n\t// в режиме редактирования выбор не применяется\n\tif (inEdit.value) return;\n\n\t// тег запрещено выбирать\n\tif (props.disabled) return;\n\n\tlet toState: Props['state'] = 'selected';\n\n\tif (props.canExclude) {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\ttoState = 'excluded';\n\t\t}\n\t}\n\n\tif (props.state == toState) {\n\t\ttoState = '';\n\t}\n\n\tif (toState === '') emit('unselect');\n\tif (toState === 'selected') emit('select');\n\tif (toState === 'excluded') emit('exclude');\n};\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagListItem': true,\n\t\t\t'top-tagSelector_tagListItem-inEdit': inEdit,\n\t\t\t'top-tagSelector_tagListItem-disabled': disabled,\n\t\t\t'top-tagSelector_tagListItem-canExclude': canExclude,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded'\n\t\t}\"\n\t\t@click.stop=\"changeSelect\"\n\t>\n\t\t<TopTagIcon\n\t\t\t:id\n\t\t\t:name\n\t\t\t:colorId\n\t\t\t:state\n\t\t/>\n\n\t\t<span\n\t\t\tref=\"elName\"\n\t\t\tclass=\"top-tagSelector_tagListItemName\"\n\t\t\t:contenteditable=\"inEdit ? 'plaintext-only' : false\"\n\t\t\t:=\"firefoxProps\"\n\t\t\t@keydown.enter.stop=\"editCommit\"\n\t\t\t@keydown.esc.stop=\"editCancel\"\n\t\t>\n\t\t\t{{ name }}\n\t\t</span>\n\n\t\t<template v-if=\"editable\">\n\t\t\t<span\n\t\t\t\tv-if=\"!inEdit\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click=\"turnToEdit\"\n\t\t\t></span>\n\n\t\t\t<span\n\t\t\t\tv-else\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click.stop=\"editCommit\"\n\t\t\t></span>\n\t\t</template>\n\t</TopPopupListItem>\n</template>\n\n<style>\n.top-tagSelector_tagListItem.top-popup_listItem {\n\tpadding-top: var(--top-padding-2) !important;\n\tpadding-bottom: var(--top-padding-2) !important;\n\tgap: 10px;\n}\n\n.top-tagSelector_tagListItemName {\n\tborder-radius: var(--top-radius-1);\n\twidth: 120px;\n\tpadding: 4px 2px;\n\tmargin: -4px -2px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tflex-grow: 1;\n}\n\n/* редактирование */\n.top-tagSelector_edit {\n\t--top-icon-size: 18px;\n\t--top-icon-color: var(--color-text-3);\n\n\twidth: 20px;\n\tflex-grow: 0;\n}\n\n.top-tagSelector_edit:before {\n\tline-height: 0;\n}\n\n.top-tagSelector_edit { opacity: 0; }\n.top-tagSelector_edit:hover {\n\t--top-icon-color: var(--color-text-primary);\n}\n\n.top-tagSelector_tagListItem:hover .top-tagSelector_edit,\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit {\n\tcursor: pointer;\n\topacity: 1;\n}\n\n.top-tagSelector_tagListItem-inEdit {\n\tbackground: var(--color-layout-front-3) !important;\n\toutline: 1px dashed var(--color-line-2);\n\toutline-offset: -1px;\n}\n\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName {\n\tcursor: text;\n\tbackground: var(--color-layout-front-1);\n}\n\n/* disabled */\n.top-tagSelector_tagListItem-disabled {\n\tcursor: not-allowed !important;\n\topacity: 0.85;\n}\n.top-tagSelector_tagListItem-disabled:hover {\n\tbackground: inherit;\n}\n.top-tagSelector_tagListItem-disabled [data-tag_id] {\n\topacity: 0.6;\n}\n</style>\n","top-forms-focusable top-size_s top-button-withoutText top-tagSelector-useTopButton\n\n<script setup lang=\"ts\">\nimport type { Props, TagSelectorTarget } from './types';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport { genTagIdClear, getTagById } from '../utils/utils';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<Props>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst component = props.useTopButton ? TopButton : 'div';\nconst componentSlotName = props.useTopButton ? 'html' : 'default';\n\nconst topTagSelectorTarget: TagSelectorTarget = {\n\tmodel,\n\tmode: props.mode,\n\ttargetId: props.targetId,\n\tfilters: props.filters,\n\tpayload: props.payload,\n};\n</script>\n\n<template>\n\t<TopPopupOpener :id>\n\t\t<component\n\t\t\t:is=\"component\"\n\t\t\t:class=\"{\n\t\t\t\t'top-tagSelector': true,\n\t\t\t\t'top-tagSelector-useTopButton': props.useTopButton,\n\t\t\t\t'top-tagSelector-custom': !props.useTopButton,\n\t\t\t\t'top-as-selector': props.useTopButton,\n\t\t\t\t'top-tagSelector-filter': props.mode === 'filter',\n\t\t\t\t'top-tagSelector-setter_single': props.mode === 'setter' && !filters,\n\t\t\t\t'top-tagSelector-setter_several': props.mode === 'setter' && filters,\n\t\t\t\t'top-tagSelector-selectedOne': !model.length || model.length === 1,\n\t\t\t\t'top-tagSelector-toTwoLine': model.length > 5,\n\t\t\t}\"\n\t\t\tcolor=\"theme\"\n\t\t\t:styling\n\t\t\tv-top-data:topTagSelectorTarget=\"topTagSelectorTarget\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<template #[componentSlotName]>\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-if=\"!model.length && mode === 'filter'\"\n\t\t\t\t\tid=\"all\"\n\t\t\t\t\tcolorId=\"\"\n\t\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t\tstate=\"\"\n\t\t\t\t/>\n\n\t\t\t\t<!-- Массовое редактирование -->\n\t\t\t\t<div v-if=\"mode === 'setter' && filters\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Список тегов -->\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-else\n\t\t\t\t\tv-for=\"tagId in model\"\n\t\t\t\t\t:id=\"genTagIdClear(tagId)\"\n\t\t\t\t\t:colorId=\"getTagById(tagId, tags)?.color_id ?? ''\"\n\t\t\t\t\t:name=\"getTagById(tagId, tags)?.name ?? ''\"\n\t\t\t\t\t:state=\"genTagIdClear(tagId) === tagId ? 'selected' : 'excluded'\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</component>\n\t</TopPopupOpener>\n</template>\n\n<style>\n.top-tagSelector {\n\tcursor: pointer;\n\tmin-width: 0;\n\twhite-space: nowrap;\n\tjustify-content: left;\n}\n\n.top-tagSelector-useTopButton {\n\twidth: 112px;\n\tgap: var(--top-gap-1);\n\tvertical-align: middle;\n}\n\n.top-tagSelector.top-button.top-as-selector {\n\twidth: calc(112px + 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\">\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 */\nlet 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","n","a","forms_CbUt_6Ff_esm_js_1","popup_DrByVU_k_esm_js_1","formsExt_CrTmBhja_esm_js_1","ve","ye","be","xe","V","Se","Ce","we","Te","Ee","De","ke","Oe","Ae","je","utils_BwiXsV0S_esm_js_1","require","resolve_1","reject_1","Me","r","e","t","searchers_js_1","Ne","Pe","Fe","Ie","s","c","l","u","d","f","p","$i18n","H","Le","Re","ze","Be","Ve","He","U","W","G","Ue","We","Ge","Ke","qe","Je","Ye","Xe","Ze","field_CjkpGeA7_esm_js_1","Qe","$e","et","tt","nt","rt","it","at","ot","worker_Db8YrEHo_esm_js_1","st","ct","lt","ut","keyboard_js_1","dt","ft","pt","mt","ht","gt","_t","K","vt","q","yt","J","bt","xt","St","Ct","wt","Tt","Et","Dt","Ot","kt","_","h","ee","g","check_js_1","string_js_1","At","Y","X","jt","dom_js_1","Z","Mt","Nt","Pt","Ft","Q","It","Lt","Rt","zt","Bt","y","b","E","ne","A","re"],"mappings":"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","sourcesContent":["var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\ndefine([\"require\", \"exports\", \"../.chunks/forms-CbUt-6Ff.esm.js\", \"../.chunks/field-CjkpGeA7.esm.js\", \"../utils/dom.js\", \"../.chunks/worker-Db8YrEHo.esm.js\", \"../utils/check.js\", \"../utils/string.js\", \"../.chunks/utils-BwiXsV0S.esm.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-DrByVU-k.esm.js\", \"../.chunks/formsExt-CrTmBhja.esm.js\", \"vue\", \"../.chunks/api-CawzY1Cw.esm.js\", \"../.chunks/app-CCX-gNqz.esm.js\", \"../popup/worker.js\"], function (require, exports, forms_CbUt_6Ff_esm_js_1, field_CjkpGeA7_esm_js_1, dom_js_1, worker_Db8YrEHo_esm_js_1, check_js_1, string_js_1, utils_BwiXsV0S_esm_js_1, searchers_js_1, keyboard_js_1, popup_DrByVU_k_esm_js_1, formsExt_CrTmBhja_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.renderElTopTagSelectorPopupOpener = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = exports.clearCache = exports.TopTagSelectorTagIcon = exports.TopTagSelectorPopupOpener = exports.TopTagSelector = exports.TopRegionSelector = exports.TopProjectSelector = exports.TopGroupSelector = exports.TopCompetitorSelector = void 0;\n //#region src/components/project/competitorSelector/competitorSelector.vue?vue&type=script&setup=true&lang.ts\n var 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 }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (i.showSelectAllItem)\n return {\n icon: \"\",\n title: (0, forms_CbUt_6Ff_esm_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", he, [(0, vue_1.unref)(forms_CbUt_6Ff_esm_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.h, {\n class: \"top-competitorSelector_opener\",\n color: \"theme\",\n icon: \"\",\n icon2: \"\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(n.items.find((e) => e.value === a.value?.[0])?.content), 1)]),\n _: 1\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(n.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": a.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => a.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", 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_CrTmBhja_esm_js_1.d, {\n key: 1,\n modelValue: a.value,\n \"onUpdate:modelValue\": i[0] ||= (e) => a.value = e,\n items: n.items,\n isMultiple: !0,\n styling: \"bar\",\n canBeEmptyMultiple: !1,\n selectAllItem: o.value\n }, null, 8, [\n \"modelValue\",\n \"items\",\n \"selectAllItem\"\n ]))]));\n }\n }), 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 }, be = {\n key: -2,\n name: \"--\",\n index: -2\n }, xe = {\n key: -2,\n name: \"--\",\n regions: [be],\n regionByIndex: new Map([[-2, be]])\n }, V = {\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, Se = {\n key: -2,\n name: \"Autoselect\",\n regions: [V],\n regionByIndex: new Map([[-2, V]])\n }, Ce = {\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, we = () => (V.name = (0, forms_CbUt_6Ff_esm_js_1.E)().Common.Autoselect, V), Te = () => (we(), Se.name = (0, forms_CbUt_6Ff_esm_js_1.E)().Common.Autoselect, console.log(Se), Se), Ee = () => (Ce.name = (0, forms_CbUt_6Ff_esm_js_1.E)().Keywords.Without_region, Ce), De = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e ? ke(n, e) : Oe(n), t && r.set(-2, Te()), r.size || r.set(-2, xe), r;\n }, Oe = (e, t = !0, n = [], r = \"\") => {\n let i = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (!e.enabled || r && typeof e.key == \"number\" && e.key > 1)\n return;\n let a = { ...e };\n a.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n a.regionByIndex.set(n.index, n);\n }), !a.regionByIndex.size && n.length, (!e.regions || a.regionByIndex.size || n.length) && i.set(a.key, a);\n }), n.forEach((e) => {\n if (i.has(e))\n return;\n let t = {\n key: e,\n name: ye[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n i.set(t.key, t);\n }), i;\n }, ke = (e, t) => {\n let n = Oe(e, !1, [0, 1], t);\n if (n.has(2)) {\n let e = n.get(2);\n e && (e.regionByIndex = /* @__PURE__ */ new Map());\n }\n return (t === \"volume\" || t === \"cost_forecast\") && n.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...Ee() };\n e.regionByIndex.set(t.index, t);\n }), n;\n }, Ae = (e, t, n = []) => {\n let r = De(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_BwiXsV0S_esm_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-CYrmaDt3.esm.js\"], resolve_1, reject_1); }).then(__importStar)), Me = (t, n) => {\n let r = (0, forms_CbUt_6Ff_esm_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(n.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n if (n.value.forEach((n) => {\n let r = {\n value: n.key,\n title: n.name\n };\n t.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(n.key)), e.set(n.key, r);\n }), t.addCompare && !e.has(-2)) {\n let t = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n e.set(t.value, t);\n let n = {\n value: -1,\n title: r.Common.Compare\n };\n e.set(n.value, n);\n }\n return e;\n })\n };\n }, Ne = (t, n) => {\n let r = (0, forms_CbUt_6Ff_esm_js_1.E)(), i = (0, vue_1.ref)(-2);\n t.modelValue.length === 1 && (i.value = t.modelValue[0]), i.value === -2 && (t.forMode ? i.value = n.value?.regionByIndex.values().next().value?.key ?? -2 : i.value = n.value?.regionByIndex.keys().next().value ?? -2);\n let a = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return n.value.regionByIndex?.forEach((i) => {\n let a = i.name;\n if (t.forMode) {\n let t = {\n value: i.key,\n title: a\n };\n e.has(i.key) || e.set(i.key, t);\n return;\n }\n i.device && (a += \" (\" + r.Common[\"Device_\" + i.device] + \")\");\n let o = (0, searchers_js_1.getLangLabel)(n.value.key || 0, i.lang ?? \"\");\n o && (a += \" / \" + o);\n let s = {\n value: i.index,\n title: a,\n icon: i.device ? (0, searchers_js_1.getDeviceGIcon)(i.device) : void 0\n };\n e.set(i.index, s);\n }), e;\n });\n return (0, vue_1.watch)(a, (e, n) => {\n if (t.onlySearcher || i.value !== void 0 && e.get(i.value))\n return;\n let a = e.keys().next().value;\n if (i.value === -2 || a === -2) {\n i.value = a;\n return;\n }\n let o = n?.get(i.value)?.title || \"\", s = -1;\n for (let [t, n] of e.entries()) {\n let e = n.title;\n if (typeof e != \"string\" || typeof t == \"string\")\n break;\n if (e === o) {\n a = t;\n break;\n }\n let i = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n e.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) !== -1 && (l <= s || (s = l, a = t));\n }\n i.value = a;\n }), {\n regionIndex: i,\n optionByRegionIndex: a\n };\n }, Pe = (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 }, Fe = (e) => {\n let t = (0, vue_1.computed)(() => De(e.forMode, e.autoRegion, e.searchers)), n = (0, vue_1.computed)(() => t.value.get(i.searcherKey.value) || xe), r = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return t.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -1 && t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), i = Me(e, t), a = Ne(e, n), o = Pe(e, t, r);\n (0, vue_1.watch)(t, () => {\n if (e.onlySearcher ? o.regionsIndexes.value = Array.from(t.value.keys()) : o.regionsIndexes.value = o.regionsIndexes.value.filter((e) => r.value.has(e)), i.searcherKey.value === -1)\n return;\n let s = t.value.keys().next().value;\n t.value.forEach((n) => {\n if (e.onlySearcher && n.key === i.searcherKey.value) {\n s = i.searcherKey.value;\n return;\n }\n if (a.regionIndex.value && n.regionByIndex?.has(a.regionIndex.value) && (s = n.key), !e.onlySearcher) {\n let e;\n s !== void 0 && (e = t.value.get(s)?.regionByIndex);\n let r = t.value.get(n.key)?.regionByIndex;\n e?.has(-2) && !r?.has(-2) && (s = n.key);\n }\n }), s !== void 0 && (i.searcherKey.value = s), a.regionIndex.value !== void 0 && !(n.value?.regionByIndex)?.has(a.regionIndex.value) && (a.regionIndex.value = n.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let s = () => {\n if (!(i.searcherKey.value === -1 || i.searcherKey.value === -2))\n return i.searcherKey.value;\n }, c = () => {\n if (e.onlySearcher || a.regionIndex.value === -2)\n return;\n let t = a.regionIndex.value;\n if (e.forMode) {\n let n = a.regionIndex.value;\n t = Ae(e.forMode, {\n searcher_key: s(),\n key: n\n }, e.searchers)?.index;\n }\n return t;\n }, l = () => {\n let e = s();\n if (e !== void 0)\n return t.value.get(e);\n };\n return {\n selectSearcher: i,\n selectRegion: a,\n compare: o,\n searcherByKey: t,\n allRegionsIndexes: r,\n getSearcher: l,\n getRegion: () => {\n let e = c();\n if (e !== void 0)\n return l()?.regionByIndex?.get(e);\n }\n };\n }, Ie = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"regionSelector\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n projectId: {},\n searchers: { default: () => [] },\n modelValue: {},\n modelValueSingle: {},\n addCompare: { type: Boolean },\n forMode: {},\n autoRegion: { type: Boolean },\n onlySearcher: { type: Boolean },\n addChanger: {\n type: Boolean,\n default: !0\n },\n addSearcherIcon: {\n type: Boolean,\n default: !0\n },\n addRegionIcon: {\n type: Boolean,\n default: !0\n }\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n modelValueSingle: {},\n modelValueSingleModifiers: {}\n }),\n emits: [\"update:modelValue\", \"update:modelValueSingle\"],\n setup(e, { expose: t }) {\n let n = e, a = (0, vue_1.useModel)(e, \"modelValue\"), o = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: s, selectRegion: c, compare: l, searcherByKey: u, allRegionsIndexes: d, getSearcher: f, getRegion: p } = Fe(n), m = () => {\n let e = [];\n u.value.forEach((t) => {\n t.enabled && t.regions.forEach((t) => {\n t.enabled && e.push(t);\n });\n }), je.open(\"regions\", {\n regions: e,\n regionsIndexes: l.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => l.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n c.regionIndex,\n s.searcherKey,\n l.regionsIndexes\n ], () => {\n if (s.searcherKey.value === -1 && l.regionsIndexes.value.length) {\n if (JSON.stringify(a.value) === JSON.stringify(l.regionsIndexes.value))\n return;\n a.value = [...l.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (a.value = [s.searcherKey.value], s.searcherKey.value === -2 && !n.autoRegion && (a.value.length = 0)) : (a.value = [c.regionIndex.value], c.regionIndex.value === -2 && !n.autoRegion && (a.value.length = 0));\n !n.onlySearcher && !d.value.size && (s.searcherKey.value = -2);\n }), o.value && (0, vue_1.watch)(o, () => {\n o.value && (a.value = [o.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(a, () => {\n if (a.value[0] && (o.value = a.value[0]), n.onlySearcher) {\n if (!a.value.length || a.value.length === 1 && !u.value.has(a.value[0]) || a.value.length === 1 && a.value[0] === -2 && !n.autoRegion) {\n let e = u.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, o.value = -2), e === void 0 ? a.value.length = 0 : a.value = [e];\n return;\n }\n if (a.value.length > 1 && JSON.stringify(a.value) !== JSON.stringify(l.regionsIndexes.value)) {\n a.value = [...l.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(a.value)], t = u.value.values().next().value?.regionByIndex?.keys().next().value;\n if (n.forMode && (t = u.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, o.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let r = d.value;\n n.forMode && (r = /* @__PURE__ */ new Set(), u.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -1 && e.index !== -2 && r.add(e.key);\n });\n })), r.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => d.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(a.value) !== JSON.stringify(e)) {\n a.value = e;\n return;\n }\n }\n if (!(a.value.length === 1 && a.value[0] === (n.onlySearcher ? s.searcherKey.value : c.regionIndex.value)))\n if (n.onlySearcher) {\n if (a.value.length === 1) {\n s.searcherKey.value = a.value[0];\n return;\n }\n s.searcherKey.value = -1;\n return;\n }\n else {\n if (!a.value.length)\n return;\n if (a.value.length === 1 && s.searcherKey.value !== -1) {\n c.regionIndex.value = a.value[0];\n let e;\n for (let t of u.value.values()) {\n for (let r of t.regionByIndex.values())\n if ((n.forMode ? r.key : r.index) === c.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (s.searcherKey.value = e);\n }\n else\n s.searcherKey.value = -1, l.regionsIndexes.value = [...a.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: f,\n getRegion: p\n }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-selectorRegion\": !0,\n \"top-selectorRegion-onlySearcher\": e.onlySearcher\n }) }, [\n (0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.n, {\n options: (0, vue_1.unref)(s).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(s).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(s).searcherKey.value = e,\n name: \"searcher_key\",\n addChanger: e.addChanger\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"addChanger\"\n ]),\n !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CbUt_6Ff_esm_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(c).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(c).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(c).regionIndex.value = e,\n name: e.forMode ? \"region_key\" : \"region_index\",\n addChanger: e.addChanger,\n \"data-top-icon\": e.addRegionIcon ? \"\" : void 0\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"name\",\n \"addChanger\",\n \"data-top-icon\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.addCompare && !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CbUt_6Ff_esm_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: m,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(l).regionsIndexes.value.length\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Selected_regions), 1)]),\n _: 1\n }, 8, [\"data-count-compare-regions-indexes\"])) : (0, vue_1.createCommentVNode)(\"\", !0)\n ], 2));\n }\n }), H = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = _e;\n exports.useItemsFromCompetitors = ve;\n exports.genSearcherByKey = De;\n exports.findRegion = Ae;\n exports.dialogRegionSelector = je;\n exports.TopRegionSelector = Ie;\n function Le(t) {\n return t ? (0, forms_CbUt_6Ff_esm_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_CbUt_6Ff_esm_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var Re = (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 = Le(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), Re(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), ze = (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 Be(e, t, n) {\n let r = Object.keys(e);\n return (0, vue_1.watch)(r.map((t) => e[t]), (e, n, i) => {\n let a = {};\n e.forEach((e, t) => {\n if (!Object.is(e, n[t])) {\n let i = r[t];\n a[i] = {\n old: n[t],\n new: e\n };\n }\n }), Object.keys(a).length && t(a, i);\n }, n);\n }\n //#endregion\n //#region src/components/project/groupSelector/folders/folders.vue?vue&type=script&setup=true&lang.ts\n var Ve = [\"innerHTML\"], He = /* @__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: H },\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 ? ze(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)(() => Re(t.folders ?? { root: [H] }, t.canSelectAll));\n return Be({\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 ||= H, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CrTmBhja_esm_js_1.s, {\n class: \"top-groupSelector_folder\",\n modelValue: r.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => r.value = e,\n items: e.folders ? [...o.value.values()] : void 0,\n \"search-type\": \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.folders ? void 0 : (0, vue_1.unref)(i),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_CrTmBhja_esm_js_1.u)(...e, \"name\"),\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, Ve)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), U = {\n id: -1,\n name: \"--\",\n folder_id: H.id,\n folder_path: H.path\n }, W = {\n id: 0,\n name: \"All groups\",\n folder_id: H.id,\n folder_path: H.path\n }, G = () => (W.name = (0, forms_CbUt_6Ff_esm_js_1.E)()?.Common.All_groups, W), Ue = () => (W.name = (0, forms_CbUt_6Ff_esm_js_1.E)()?.Keywords.Choose_group, W), We = (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), Ge = (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 }), Ke = (e, t) => e.gen(`/add/${t}/groups/`), qe = { class: \"top-groupSelector_groupItem\" }, Je = {\n key: 0,\n class: \"top-comment\"\n }, Ye = [\"innerHTML\"], Xe = [\"innerHTML\"], Ze = /* @__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 canSelectAll: { type: [Boolean, String] },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showPath: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: {}\n }, {\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { required: !0 },\n groupModifiers: {}\n }),\n emits: /* @__PURE__ */ (0, vue_1.mergeModels)([\"addGroup\"], [\"update:groupId\", \"update:group\"]),\n setup(e, { emit: t }) {\n let n = e, r = t, i = (0, vue_1.useModel)(e, \"groupId\"), a = (0, vue_1.useModel)(e, \"group\"), s = n.client && !n.groups ? Ge(n.client, n.service) : void 0, c = n.client ? Ke(n.client, n.service) : void 0, l = (0, vue_1.ref)(null), u = (0, vue_1.ref)(void 0), d = (0, field_CjkpGeA7_esm_js_1.t)(\"folder_id\", \"EQUALS\", [n.folder?.id ?? 0]);\n s?.changeParams({\n project_id: n.projectId,\n folder_id_depth: !0,\n filters: [d]\n }), n.on !== void 0 && s?.params.filters?.push((0, field_CjkpGeA7_esm_js_1.t)(\"on\", \"EQUALS\", [Number(n.on)]));\n let f = (e) => {\n a.value = e, i.value = e.id;\n };\n Be({\n projectId: () => n.projectId,\n folderId: () => n.folder?.id,\n canSelectAll: () => n.canSelectAll\n }, (e) => {\n if (e.projectId && (s?.changeParams({ project_id: n.projectId }), s?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + n.projectId })), e.folderId && (d.values = [n.folder?.id ?? 0], n.groups && (u.value = We(n.groups, n.on, n.folder))), l.value?.resetCache(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && i.value !== null) {\n let e;\n n.autoselect === \"first\" && (e = u.value?.[0], n.canSelectAll && (e = (0, vue_1.reactive)(G()))), (n.autoselect === \"placeholder\" || !e) && (e = Ue()), f(e);\n }\n }, { immediate: !0 }), Be({\n modelGroup: a,\n modelGroupId: i\n }, async (e) => {\n if (i.value !== a.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n i.value = a.value.id;\n return;\n }\n if (!(n.canAdd && i.value === null)) {\n if (n.groups) {\n let e = u.value?.find((e) => e.id === i.value);\n if (!e && n.canSelectAll && (e = G()), e)\n f(e);\n else {\n let e = u.value?.[0];\n e && !i.value ? f(e) : f(U);\n }\n }\n if (n.client && !n.groups && (i.value || i.value === 0 && !n.canSelectAll)) {\n let e = Ge(n.client, n.service).changeParams({\n project_id: n.projectId,\n id: i.value,\n filters: [d]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + n.projectId });\n let t = await e.call();\n if (!t.errors?.length && !t.result)\n return;\n !t.errors && t.result[0] ? f(t.result[0]) : f(U);\n }\n }\n }\n }, { immediate: !0 });\n let p = async (e) => {\n if (n.canAdd !== \"api\" || !c)\n return;\n let t = a.value, i = await c.changeParams({\n project_id: n.projectId,\n names: [e.name],\n to_id: n.folder?.id ?? H.id,\n to_type: \"in_folder_last\"\n }).call();\n if (i.result) {\n let e = i.result[0];\n f(e), r(\"addGroup\", e);\n }\n else\n f(t);\n l.value?.resetCache(!0);\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CrTmBhja_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: l,\n class: \"top-groupSelector_group\",\n modelValue: a.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => a.value = e,\n items: u.value ?? e.groups,\n searchType: \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.groups ? void 0 : (0, vue_1.unref)(s),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_CrTmBhja_esm_js_1.u)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(G)().name : !1,\n addChanger: e.addChanger,\n useCache: \"\",\n onAppendItem: p\n }, {\n item: (0, vue_1.withCtx)(({ item: n }) => [(0, vue_1.createElementVNode)(\"div\", qe, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Je, (0, vue_1.toDisplayString)(t.$i18n.Common.Add) + \": \", 1)) : (0, vue_1.createCommentVNode)(\"\", !0),\n (0, vue_1.createElementVNode)(\"span\", { innerHTML: n.name }, null, 8, Ye),\n n.folder_path && e.showPath ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n class: \"top-groupSelector_groupItemFolderPath\",\n innerHTML: n.folder_path\n }, null, 8, Xe)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ])]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResult\",\n \"useAllItem\",\n \"addChanger\"\n ]));\n }\n }), Qe = { class: \"top-groupSelector\" }, $e = /* @__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: { type: Boolean },\n canAddGroup: { type: [String, 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 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: U },\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, { emit: t }) {\n let n = e, r = (0, vue_1.useModel)(e, \"folderId\"), i = (0, vue_1.useModel)(e, \"folder\"), a = (0, vue_1.useModel)(e, \"groupId\"), o = (0, vue_1.useModel)(e, \"group\"), s = t;\n i.value = Re(n.folders ?? { root: [H] }, n.canSelectAllGroups).get(r.value);\n let c = n.groups?.find((e) => e.id === a.value);\n a.value || (c = n.groups?.[0]), n.canSelectAllGroups && !c && (c = G()), n.canSelectAllGroups && !c && (c = G()), (n.autoselect === \"placeholder\" || !c) && (c = Ue()), c ??= U, o.value = c;\n let l = (e) => {\n let t;\n n.groups && e && (t = [...n.groups, e]), s(\"update:groups\", t);\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Qe, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(He, {\n key: 0,\n folderId: r.value,\n \"onUpdate:folderId\": n[0] ||= (e) => r.value = e,\n folder: i.value,\n \"onUpdate:folder\": n[1] ||= (e) => i.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: e.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)(Ze, {\n key: 1,\n groupId: a.value,\n \"onUpdate:groupId\": n[2] ||= (e) => a.value = e,\n group: o.value,\n \"onUpdate:group\": n[3] ||= (e) => o.value = e,\n projectId: e.projectId,\n folder: i.value,\n groups: e.groups,\n on: e.on,\n canAdd: e.canAddGroup,\n canSelectAll: e.canSelectAllGroups,\n autoselect: e.autoselect,\n addChanger: e.addChanger,\n showPath: e.showFolders && !!e.folders?.[0],\n addIcon: e.addIcon,\n client: e.client,\n service: e.service,\n onAddGroup: l\n }, null, 8, [\n \"groupId\",\n \"group\",\n \"projectId\",\n \"folder\",\n \"groups\",\n \"on\",\n \"canAdd\",\n \"canSelectAll\",\n \"autoselect\",\n \"addChanger\",\n \"showPath\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0)]));\n }\n }), et = (e) => ({\n id: null,\n name: e,\n listItemProps: { type: \"title\" }\n }), tt = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n }, nt = (t, n) => {\n let r = [], i = {\n scheduledUpdate: et((0, forms_CbUt_6Ff_esm_js_1.E)().Projects.Scheduled_update),\n manualUpdate: et((0, forms_CbUt_6Ff_esm_js_1.E)().Projects.Manual_update),\n guestProjects: et((0, forms_CbUt_6Ff_esm_js_1.E)().Projects.Guest_projects)\n }, a = n ? {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n } : tt;\n for (let e of t)\n !a.scheduledUpdate && e.right?.startsWith(\"1\") && e.on > 0 && (r.push(i.scheduledUpdate), a.scheduledUpdate = !0), !a.manualUpdate && e.right?.startsWith(\"1\") && e.on === 0 && (r.push(i.manualUpdate), a.manualUpdate = !0), !a.guestProjects && e.right?.startsWith(\"0\") && e.on >= 0 && (r.push(i.guestProjects), a.guestProjects = !0), r.push(e);\n return r;\n }, rt = (e) => e.map((e) => ({\n ...e,\n listItemProps: { attrs: { title: e.name } }\n })), it = (e, t, n) => !e || e.length === 0 ? [] : (t && Object.keys(tt).forEach((e) => tt[e] = !1), nt(rt(e), n)), at = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return t = t.replace(/historyView=[^&]*/, \"\"), t = t.replace(/competitorsIds=[^&]*/, \"\"), t = t.replace(/searchersKeys=[^&]*/, \"\"), t = t.replace(/regionIndex=[^&]*/, \"\"), t = t.replace(/regionsIndexes=[^&]*/, \"\"), t = t.replace(/folderId=[^&]*/, \"\"), t = t.replace(/groupId=[^&]*/, \"\"), t = t.replace(/tags=[^&]*/, \"\"), window.mo?.getHash && !window.mo.getHash(\"dataSort\").toString().includes(\"0000-00-00\") && (t = t.replace(/dataSort=[^&]*/, \"\")), t = t.replace(/%22historyView%22:[^,]*,/, \"\"), t = t.replace(/%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:\\{[^}]*},/, \"\")), e + t;\n }, ot = (e, t) => {\n t && t.target instanceof HTMLElement && worker_Db8YrEHo_esm_js_1.t.close(t.target.closest(\".top-popup-wrapper\"));\n let n = at(e);\n location.href = n;\n }, st = (e) => {\n let t = ct(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n return n[1] == \"project\" && (r = n[1] + \"/\" + n[2] + \"/\"), n[2] == \"settings\" && (i = location.hash), [\n \"watcher\",\n \"indexing\",\n \"sitemap\",\n \"audit\",\n \"direct\",\n \"adwords\"\n ].includes(n[4]) && (i = n[4] + \"/\"), \"https://\" + t + \"/\" + r + e + \"/\" + i;\n }, ct = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, lt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"http://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, ut = (e, t) => {\n let n = e.params.filters ?? [];\n n = n.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let r = (0, keyboard_js_1.invertKeyboardLayout)(t), i = t.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), a = r.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n t && n.push((0, field_CjkpGeA7_esm_js_1.t)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${i}|${a})`])), e.changeParams({ filters: n });\n }, dt = (e, t, n) => {\n let r = e.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return r.params = {\n ...n,\n filters: [(0, field_CjkpGeA7_esm_js_1.t)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, field_CjkpGeA7_esm_js_1.n)(\"user_id\", \"DESC\", [t]),\n (0, field_CjkpGeA7_esm_js_1.n)(\"on\", \"DESC\"),\n (0, field_CjkpGeA7_esm_js_1.n)(\"favorite\", \"DESC\"),\n (0, field_CjkpGeA7_esm_js_1.n)(\"id\", \"DESC\")\n ]\n }, r.options.onApiLoaded = (e, t, n) => {\n let r = t.data.filters.length === 1 && t.data.offset === 0 || t.data.limit === 1e3, i = t.data.limit === 100 && t.data.filters.length > 1 ? !0 : void 0;\n e.result = it(e.result, r, i), n?.(e, t);\n }, r;\n }, ft = (e) => e.gen(\"/add/projects_2/projects/\"), pt = { class: \"top-projectSelectorSubmenu_item\" }, mt = [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ], ht = { class: \"top-projectSelectorSubmenu_item\" }, gt = [\"href\"], _t = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: {\n id: {},\n right: {},\n url: {}\n },\n setup(t) {\n let n = t, r = (0, forms_CbUt_6Ff_esm_js_1.E)(), i = ct(), a = [\n {\n href: `https://${i}/project/keywords/${n.id}/`,\n title: r.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${i}/project/dynamics/${n.id}/`,\n title: r.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/snapshots/${n.id}/`,\n title: r.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/competitors/${n.id}/`,\n title: r.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/ai-tracker/${n.id}/`,\n title: r.Common.Menu_aiTracker,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${i}/project/analytics/${n.id}/`,\n title: r.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${i}/project/broker/${n.id}/`,\n title: r.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/sitemap/`,\n title: r.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/audit/`,\n title: r.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/indexing/`,\n title: r.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${i}/project/audit/${n.id}/watcher/`,\n title: r.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${i}/project/settings/${n.id}/`,\n title: r.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ], o = (0, vue_1.computed)(() => {\n if (!window.page?.data?.aiTracker) {\n let e = a.findIndex((e) => e.href.includes(\"ai-tracker\"));\n e !== -1 && a.splice(e, 1);\n }\n return n.right.includes(\"0\") ? a.filter((e) => n.right[e.right] === \"1\") : a;\n });\n return (e, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_DrByVU_k_esm_js_1.s), {\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-projectSelectorSubmenu_opener\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"li\", pt, [(0, vue_1.createElementVNode)(\"a\", {\n href: e.href,\n title: e.title,\n \"data-top-icon\": e.icon,\n \"data-right\": e.right\n }, null, 8, mt)]))), 256)), (0, vue_1.createElementVNode)(\"li\", ht, [(0, vue_1.createElementVNode)(\"a\", {\n href: t.url,\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, null, 8, gt)])]),\n _: 1\n });\n };\n }\n }), K = \"ui_project_selector_total:\", vt = 1440 * 60 * 1e3, q = (0, vue_1.shallowRef)(), yt = (0, vue_1.ref)(0), J = (0, vue_1.ref)(null), bt = (e, t) => {\n localStorage.setItem(K + e, JSON.stringify({\n projectsTotal: t,\n expiresAt: Date.now() + vt\n }));\n }, xt = (e) => {\n let t = localStorage.getItem(K + e);\n if (!t)\n return;\n let { projectsTotal: n, expiresAt: r } = JSON.parse(t);\n if (Date.now() > r) {\n localStorage.removeItem(K + e);\n return;\n }\n return n;\n }, St = (e, t = !0) => {\n q.value = void 0, localStorage.removeItem(K + e), t && yt.value++;\n }, Ct = { class: \"top-projectSelector_item\" }, wt = { class: \"top-projectSelector_itemText\" }, Tt = { class: \"top-comment\" }, Et = {\n key: 0,\n class: \"top-comment\"\n }, Dt = [\"href\", \"onClick\"], Ot = 1e3, kt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n addLinksToProjects: {\n type: Boolean,\n default: !0\n },\n excludeProjectId: {},\n modificator: {},\n placeholder: {},\n buttonProps: {},\n openerShortcut: {}\n }, {\n modelValue: { default: {\n id: null,\n name: \"\"\n } },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(t) {\n let n = (0, forms_CbUt_6Ff_esm_js_1.E)();\n if (!window.mo?.user?.id)\n throw Error(\"TopProjectSelector: не удалось определить userId. Компонент требует авторизованного пользователя (см. window.mo.user.id)\");\n let r = window.mo.user.id, i = t, a = (0, vue_1.useModel)(t, \"modelValue\"), o = dt(i.client, r), s = ft(i.client), c = (0, vue_1.ref)(xt(r)), d = (0, vue_1.ref)(null), f = (0, vue_1.computed)(() => i.placeholder ?? n.Projects.Select_project), p = (0, vue_1.computed)(() => !q.value || !i.excludeProjectId ? q.value : q.value.filter((e) => e.id !== i.excludeProjectId)), m = (0, vue_1.computed)(() => {\n if (!(!c.value && c.value !== 0))\n return c.value < Ot ? \"static\" : \"api\";\n });\n (0, vue_1.watch)(yt, () => {\n _();\n }), (0, vue_1.watch)(a, () => {\n !a.value.id || !i.addLinksToProjects || ot(st(a.value.id));\n });\n let h = async () => {\n J.value ||= dt(i.client, r, { limit: Ot }).call();\n let e = await J.value;\n if (e.errors) {\n J.value = null;\n return;\n }\n return J.value = null, e;\n }, ee = async () => {\n if (c.value)\n return;\n let e = await h();\n e && (c.value = e.total, m.value === \"static\" && !q.value && (q.value = e.result), c.value && bt(r, c.value));\n }, g = async (e) => {\n let t = await s.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!t.errors) {\n if (q.value && m.value === \"static\") {\n let n = {\n id: Number(t.result),\n user_id: r,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\",\n listItemProps: { attrs: { title: e.name } }\n }, i = q.value.findIndex((e) => e.on === 0);\n q.value = [\n ...q.value.slice(0, i),\n n,\n ...q.value.slice(i)\n ], c.value && (c.value += 1, bt(r, c.value));\n }\n m.value === \"api\" && St(r);\n }\n }, _ = () => {\n m.value === \"api\" && d.value?.resetCache(!0);\n }, v = async () => {\n if (q.value || m.value !== \"static\")\n return;\n let e = await h();\n e && (q.value = e.result);\n };\n return (0, vue_1.onMounted)(async () => {\n await ee();\n }), (e, n) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_CrTmBhja_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: d,\n class: \"top-projectSelector\",\n modelValue: a.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => a.value = e,\n items: p.value,\n title: e.$i18n.Projects.Search_projects,\n modificator: t.modificator,\n searchFields: [\n \"id\",\n \"name\",\n \"url\"\n ],\n placeholder: f.value,\n hasCloserBtn: \"\",\n api: m.value === \"api\" ? (0, vue_1.unref)(o) : void 0,\n apiSetSearchParams: m.value === \"api\" ? (...e) => (0, vue_1.unref)(ut)(...e) : void 0,\n useCache: \"\",\n appendSearchToResult: \"\",\n appendSearchAllowDuplicate: \"\",\n appendSearchToResultCond: (0, vue_1.unref)(check_js_1.validUrl),\n appendWithoutSelect: \"\",\n buttonProps: t.buttonProps,\n openerShortcut: t.openerShortcut,\n onAppendItem: g,\n onOpen: v\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", Ct, [(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)(e.$i18n.Projects.Add_project) + \": \", 1)), (0, vue_1.createTextVNode)(\" \" + (0, vue_1.toDisplayString)(i.name), 1)], 64))]), i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [\n t.addLinksToProjects ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"a\", {\n key: 0,\n class: \"top-projectSelector_itemLink\",\n href: (0, vue_1.unref)(st)(i.id),\n onClick: (0, vue_1.withModifiers)((e) => (0, vue_1.unref)(ot)((0, vue_1.unref)(st)(i.id), e), [\"prevent\", \"stop\"])\n }, null, 8, Dt)) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n class: \"top-projectSelector_itemExtLink\",\n href: (0, vue_1.unref)(lt)(i.url),\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)(_t, {\n id: i.id,\n right: i.right ?? void 0,\n url: (0, vue_1.unref)(lt)(i.url)\n }, null, 8, [\n \"id\",\n \"right\",\n \"url\"\n ])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)])]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\"\n ]);\n };\n }\n }), At = (e) => \"-\" + e, Y = (e) => e[0] === \"-\" ? e.substring(1) : e, X = (e, t) => {\n e = Y(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, jt = (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_Db8YrEHo_esm_js_1.t.genElPopupOpener(\"div\", t);\n return r.classList.add(\"top-tagSelector\"), e.useTopButton && r.classList.add(\"top-tagSelector-useTopButton\", \"top-button\", \"top-color_theme\", \"top-as-selector\"), e.useTopButton || r.classList.add(\"top-tagSelector-custom\"), e.mode === \"filter\" && r.classList.add(\"top-tagSelector-filter\"), e.mode === \"setter\" && !e.filters && r.classList.add(\"top-tagSelector-setter_single\"), e.mode === \"setter\" && e.filters && r.classList.add(\"top-tagSelector-setter_several\"), r.onclick = (t) => {\n t.preventDefault(), t.stopPropagation(), r.onclick = null;\n let i = (0, vue_1.ref)(e.modelValue);\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n }), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Z(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Z(r, e, n)) : (0, dom_js_1.storage)(r, \"topTagSelectorRender\", (t) => {\n e.modelValue = t;\n let i = (0, dom_js_1.storage)(r, \"topTagSelectorTarget\");\n i && (i.model.value = t), Z(r, e, n);\n }), Z(r, e, n), r;\n }, Mt = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Z = (t, n, r) => {\n let i = (0, vue_1.unref)(n.modelValue);\n if (t.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), t.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), n.mode === \"setter\" && n.filters) {\n t.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (t.innerHTML = \"\", !i.length && n.mode === \"filter\") {\n let n = Nt({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_CbUt_6Ff_esm_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n t.append(n);\n }\n i.forEach((e) => {\n let r = Nt({\n id: Y(e),\n colorId: X(e, n.tags)?.color_id ?? \"\",\n name: X(e, n.tags)?.name ?? \"\",\n state: Y(e) === e ? \"selected\" : \"excluded\"\n });\n t.append(r);\n });\n }, Nt = (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 }, Pt = [\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 ], Ft = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], Q = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagIcon\",\n props: {\n id: {},\n colorId: {},\n name: {},\n state: {}\n },\n setup(e) {\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagIcon\": !0,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n \"data-tag_id\": e.id,\n \"data-tag_color_id\": e.colorId,\n title: e.name\n }, null, 10, Ft));\n }\n }), It = [\"contenteditable\", \"onKeydown\"], Lt = /* @__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_DrByVU_k_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagListItem\": !0,\n \"top-tagSelector_tagListItem-inEdit\": s.value,\n \"top-tagSelector_tagListItem-disabled\": e.disabled,\n \"top-tagSelector_tagListItem-canExclude\": e.canExclude,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n onClick: (0, vue_1.withModifiers)(d, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [\n (0, vue_1.createVNode)(Q, {\n id: e.id,\n name: i.value,\n colorId: e.colorId,\n state: e.state\n }, null, 8, [\n \"id\",\n \"name\",\n \"colorId\",\n \"state\"\n ]),\n (0, vue_1.createElementVNode)(\"span\", (0, vue_1.mergeProps)({\n ref_key: \"elName\",\n ref: a,\n class: \"top-tagSelector_tagListItemName\",\n contenteditable: s.value ? \"plaintext-only\" : !1\n }, o.value, { onKeydown: [(0, vue_1.withKeys)((0, vue_1.withModifiers)(l, [\"stop\"]), [\"enter\"]), (0, vue_1.withKeys)((0, vue_1.withModifiers)(u, [\"stop\"]), [\"esc\"])] }), (0, vue_1.toDisplayString)(i.value), 17, It),\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 }), Rt = { key: 1 }, zt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n inheritAttrs: !1,\n __name: \"popupOpener\",\n props: /* @__PURE__ */ (0, vue_1.mergeModels)({\n modelValue: {},\n id: {},\n tags: {},\n mode: {},\n targetId: {},\n filters: {},\n useTopButton: { type: Boolean },\n payload: {},\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"modelValue\"), i = t.useTopButton ? forms_CbUt_6Ff_esm_js_1.h : \"div\", a = t.useTopButton ? \"html\" : \"default\", o = {\n model: n,\n mode: t.mode,\n targetId: t.targetId,\n filters: t.filters,\n payload: t.payload\n };\n return (r, s) => {\n let c = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.c, { id: e.id }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.withDirectives)(((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(i)), (0, vue_1.mergeProps)({\n class: {\n \"top-tagSelector\": !0,\n \"top-tagSelector-useTopButton\": t.useTopButton,\n \"top-tagSelector-custom\": !t.useTopButton,\n \"top-as-selector\": t.useTopButton,\n \"top-tagSelector-filter\": t.mode === \"filter\",\n \"top-tagSelector-setter_single\": t.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": t.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !n.value.length || n.value.length === 1,\n \"top-tagSelector-toTwoLine\": n.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, r.$attrs), {\n [(0, vue_1.unref)(a)]: (0, vue_1.withCtx)(() => [!n.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: r.$i18n.Common.All_tags ?? \"\",\n state: \"\"\n }, null, 8, [\"name\"])) : (0, vue_1.createCommentVNode)(\"\", !0), e.mode === \"setter\" && e.filters ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Rt, [(0, vue_1.renderSlot)(r.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(n.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Q, {\n id: (0, vue_1.unref)(Y)(t),\n colorId: (0, vue_1.unref)(X)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(X)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(Y)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n c,\n o,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Bt = /* @__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)(Pt) },\n tagsModifiers: {}\n }),\n emits: /* @__PURE__ */ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(a, { emit: o }) {\n let c = (0, forms_CbUt_6Ff_esm_js_1.E)(), l = a, u = (0, vue_1.useModel)(a, \"modelValue\"), d = (0, vue_1.useModel)(a, \"tags\"), f = o, p = (0, forms_CbUt_6Ff_esm_js_1.P)((e, t) => {\n f(e, t);\n }, l.emitDelay);\n l.singleMode && !u.value.length && (u.value = [d.value[0].id]);\n let m = l.id ?? \"top-popup-id-\" + Math.random(), h = (0, vue_1.ref)(\"add\"), ee = () => {\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 }, v = (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 (v.value.mode === \"setter\" && l.maxTagsForSetter && !v.value.filters)\n return v.value.model.value.length >= l.maxTagsForSetter;\n }), b = (e) => {\n if (e !== \"all\") {\n if (v.value.model.value.includes(e))\n return \"selected\";\n if (v.value.model.value.includes(At(e)))\n return \"excluded\";\n }\n return e === \"all\" && !v.value.model.value.length ? \"selected\" : \"\";\n }, E = (e, t) => {\n let n = At(e), r = v.value.model.value.filter((t) => t !== e && t !== n);\n t === \"select\" && r.push(e), t === \"exclude\" && r.push(n), v.value.mode === \"setter\" && v.value.targetId !== void 0 && l.requiredForSetter && (r.length || r.push(\"1\"), r.length === 2 && v.value.model.value.length === 1 && v.value.model.value[0] === \"1\" && (r = r.filter((e) => e !== \"1\"))), l.singleMode && !v.value.filters && (r.length || (r = v.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), v.value.model.value = r, v.value.mode === \"setter\" && v.value.targetId !== void 0 && p(\"setter\", {\n tagsIds: r,\n targetId: v.value.targetId,\n payload: v.value.payload\n });\n }, k = (0, vue_1.computed)(() => {\n let e = \"top-tagSelector_popup\";\n return v.value.mode === \"filter\" && (e += \" top-tagSelector_popup-filter\"), v.value.mode === \"setter\" && (e += \" top-tagSelector_popup-setter\"), e;\n }), ne = () => {\n let e = prompt(\"\", \"New tag\");\n if (!e || e === \"New tag\")\n return;\n let t = d.value.length + 1;\n d.value.push({\n id: String(t),\n name: e,\n color_id: String((t - 1) % 10 + 1)\n }), f(\"tagsChanged\", d.value);\n }, A = (e) => {\n if (v.value = (0, dom_js_1.storage)(e.elPopupOpener, \"topTagSelectorTarget\"), !v.value)\n throw Error(\"Open popup TopTagSelector required v-data:topTagSelectorTarget\");\n if (v.value.filters && (h.value = \"add\", v.value.model.value = []), !forms_CbUt_6Ff_esm_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_CbUt_6Ff_esm_js_1.O.state.isMobile && !forms_CbUt_6Ff_esm_js_1.O.state.isMobileUA && d.value && $(e.elPopup).sortable({\n items: \"li:has([data-tag_id]:not([data-tag_id=\\\"all\\\"]))\",\n cancel: \"[contenteditable=\\\"plaintext-only\\\"], [contenteditable=\\\"true\\\"]\",\n distance: 10,\n stop: function (e, t) {\n if (!d.value)\n return;\n let n = $(t.item).parent().find(\"[data-tag_id]\"), r = [];\n n.each((e, t) => {\n if (!d.value)\n return;\n let n = $(t).attr(\"data-tag_id\");\n r.push(n);\n }), d.value.sort((e, t) => r.findIndex((t) => t === e.id) - r.findIndex((e) => e === t.id)), p(\"tagsChanged\", d.value);\n }\n });\n }, re = (e) => {\n forms_CbUt_6Ff_esm_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(zt, {\n modelValue: u.value,\n \"onUpdate:modelValue\": t[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: a.styling,\n mode: \"filter\",\n useTopButton: a.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_DrByVU_k_esm_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(k.value),\n onOpen: t[4] ||= (e) => A(e),\n onClose: t[5] ||= (e) => re(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n (0, vue_1.unref)(v).mode === \"filter\" && !a.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Lt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: e.$i18n.Common.All_tags ?? \"\",\n state: (0, vue_1.unref)(v).model.value.length ? \"\" : \"selected\",\n onSelect: t[3] ||= (e) => (0, vue_1.unref)(v).model.value = []\n }, null, 8, [\"name\", \"state\"])) : (0, vue_1.createCommentVNode)(\"\", !0),\n ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(d.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Lt, {\n key: e.id,\n id: e.id,\n colorId: e.color_id,\n name: e.name,\n state: b(e.id),\n canExclude: (0, vue_1.unref)(v).mode === \"filter\" && !a.singleMode,\n editable: a.tagsEditable,\n disabled: y.value && b(e.id) === \"\",\n onUnselect: (t) => E(e.id, \"unselect\"),\n onSelect: (t) => E(e.id, \"select\"),\n onExclude: (t) => E(e.id, \"exclude\"),\n \"onUpdate:name\": (t) => {\n e.name = t, (0, vue_1.unref)(p)(\"tagsChanged\", d.value);\n }\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\",\n \"canExclude\",\n \"editable\",\n \"disabled\",\n \"onUnselect\",\n \"onSelect\",\n \"onExclude\",\n \"onUpdate:name\"\n ]))), 128)),\n a.tagsEditable && d.value.length < a.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_DrByVU_k_esm_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(ne, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Add), 1)]),\n _: 1\n })) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 2\n }, [(0, vue_1.unref)(v).mode === \"setter\" && (0, vue_1.unref)(v).filters ? {\n name: \"header\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => h.value = e,\n options: ee()\n }, null, 8, [\"modelValue\", \"options\"])]),\n key: \"0\"\n } : void 0, (0, vue_1.unref)(v).mode === \"setter\" && (0, vue_1.unref)(v).filters ? {\n name: \"footer\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_CbUt_6Ff_esm_js_1.h, { onClick: t[2] ||= (e) => (0, vue_1.unref)(p)(\"setter\", {\n tagsIds: (0, vue_1.unref)(v).model.value,\n filters: (0, vue_1.unref)(v).filters,\n filtersAction: h.value,\n payload: (0, vue_1.unref)(v).payload\n }) }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(h.value === \"add\" ? e.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? e.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? e.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = $e;\n exports.clearCache = St;\n exports.TopProjectSelector = kt;\n exports.genElTopTagSelectorPopupOpener = jt;\n exports.renderElTopTagSelectorPopupOpener = Mt;\n exports.TopTagSelectorTagIcon = Q;\n exports.TopTagSelectorPopupOpener = zt;\n exports.TopTagSelector = Bt;\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});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: '',\n\t\t\ttitle: useI18n().Common.Select_all,\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n});\n</script>\n\n<template>\n\t<div class=\"top-competitorSelector\">\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-competitorSelector_opener\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\ticon2=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-competitorSelector_opener.top-button {\n\twidth: 100%;\n}\n</style>\n","import type { MaybeRefOrGetter } from 'vue';\nimport { computed, toValue } from 'vue';\nimport type { Competitor, Item } from '@/components/project/competitorSelector/types';\n\nexport const useItemsFromCompetitors = (competitors: MaybeRefOrGetter<Competitor[]>, projectId: MaybeRefOrGetter<number>) => {\n\treturn computed(() => {\n\t\tconst activeCompetitors = toValue(competitors).filter(competitor => competitor.on >= 0 || competitor.id === projectId);\n\n\t\tconst items: Item[] = activeCompetitors.map(competitor => {\n\t\t\treturn {\n\t\t\t\tvalue: competitor.id,\n\t\t\t\ttitle: competitor.url + ` [${competitor.id}]`,\n\t\t\t\ticon: competitor.id === toValue(projectId) ? '' : '',\n\t\t\t\tcontent: competitor.name,\n\t\t\t};\n\t\t});\n\n\t\treturn items;\n\t});\n};\n","import type { Region, SearcherIndexed } from '../types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Ключ ПС - для выбора нескольких ПС или регионов\n */\nexport const searhcerCompareKey = -1;\n\n/**\n * Ключ ПС или индекса Региона, используется для ПС или Региона, не настроенных в проекте\n *\n * Также, используется для API с возможностью не указывать регион, см. `props.autoRegion`\n */\nexport const dummyIndex = -2;\n\n/**\n * Регион - без региона\n */\nexport const globalRegionIndex = -1;\n\nexport const searchersNames = {\n\t0: 'Yandex',\n\t1: 'Google',\n\t4: 'YouTube',\n\t5: 'Bing',\n\t7: 'Seznam',\n\t8: 'AppStore',\n\t9: 'GoogleStore',\n\t20: 'Yandex.com',\n\t21: 'Yandex.com.tr',\n};\n\nexport const regionUndefined: Region = {\n\tkey: dummyIndex,\n\tname: '--',\n\tindex: dummyIndex,\n};\n\nexport const searcherUndefined: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: '--',\n\tregions: [regionUndefined],\n\tregionByIndex: new Map([[dummyIndex, regionUndefined]]),\n};\n\nconst regionAuto: Region = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tindex: dummyIndex,\n};\n\nconst searcherAuto: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tregions: [regionAuto],\n\tregionByIndex: new Map([[dummyIndex, regionAuto]]),\n};\n\nconst regionGlobal: Region = {\n\tcountryCode: '00',\n\tdepth: 1,\n\tdevice: 0,\n\tkey: globalRegionIndex,\n\tindex: globalRegionIndex,\n\tlang: 'ru',\n\tname: 'Without region',\n};\n\nexport const getRegionAuto = () => {\n\tregionAuto.name = useI18n().Common.Autoselect!;\n\n\treturn regionAuto;\n};\n\nexport const getSearcherAuto = () => {\n\tgetRegionAuto();\n\n\tsearcherAuto.name = useI18n().Common.Autoselect!;\n\tconsole.log(searcherAuto);\n\n\treturn searcherAuto;\n};\n\nexport const getRegionGlobal = () => {\n\tregionGlobal.name = useI18n().Keywords.Without_region!;\n\n\treturn regionGlobal;\n};\n","import type { Region, ForMode, Searcher, SearcherByKey, SearcherIndexed } from '../types';\nimport { dummyIndex, getRegionGlobal, getSearcherAuto, searchersNames, searcherUndefined } from './consts';\nimport { useAsyncTopDialog } from '@/components/dialog/dialog/composables/utils';\n\n/**\n * Генерация Map ПС с Map регионов из массива searchers\n * - ключ для ПС - searcherKey\n * - ключ для региона - regionIndex\n *\n * Если поисковиков в списке нет, в список будет добавлен searcherUndefined\n *\n * Если регионов в списке нет, в список будет добавлен regionUndefined\n *\n * @param forMode - Режим выбора регионов\n * @param autoRegion - добавить элемент с ключем -2, который в API заменяется на нужный ключ в зависимости от контекста\n * @param searchers - поисковики с регионами проекта, см.: get/projects_2/projects, show_searchers_and_regions = 1\n */\nexport const genSearcherByKey = (\n\tforMode: ForMode = '',\n\tautoRegion: boolean = false,\n\tsearchers: Searcher[] = [],\n) => {\n\tlet searcherByKey: SearcherByKey;\n\n\tif (forMode) {\n\t\tsearcherByKey = genSearchersMapForMode(searchers, forMode);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers);\n\t}\n\n\tif (autoRegion) searcherByKey.set(dummyIndex, getSearcherAuto());\n\tif (!searcherByKey.size) searcherByKey.set(dummyIndex, searcherUndefined);\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @param forceSearchersKeys - ключи ПС, которые нееобходимо вывести в любом случае\n * @param forMode - Режим выбора регионов (при непустом значении остаются только Яндекс, Google и Mail)\n */\nconst genSearchersMapCommon = (\n\tsearchers: Searcher[],\n\tonlyEnabledRegions: boolean = true,\n\tforceSearchersKeys: Searcher['key'][] = [],\n\tforMode: ForMode = '',\n) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\t\tif (forMode && typeof searcher.key === 'number' && searcher.key > 1) return;\n\n\t\tconst searcherI = { ...searcher } as SearcherIndexed;\n\t\tsearcherI.regionByIndex = new Map();\n\n\t\tif (searcher.regions) {\n\t\t\tsearcher.regions.forEach((region: Region) => {\n\t\t\t\tif (onlyEnabledRegions && !region.enabled) return;\n\n\t\t\t\tconst regionI = { ...region };\n\t\t\t\tsearcherI.regionByIndex.set(regionI.index, regionI);\n\t\t\t});\n\t\t}\n\n\t\tif (!searcherI.regionByIndex.size && !forceSearchersKeys.length) {\n\t\t\t// searcherI.regionByIndex.set(regionUndefined.index, regionUndefined);\n\t\t}\n\n\t\tif (\n\t\t\t// режим вывода ПС без регионов\n\t\t\t!searcher.regions ||\n\n\t\t\t// есть включенные регионы\n\t\t\tsearcherI.regionByIndex.size ||\n\n\t\t\t// запрошен вывод конкретных ПС\n\t\t\tforceSearchersKeys.length\n\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\t// дополнительные ПС\n\tforceSearchersKeys.forEach((searcherKey) => {\n\t\tif (searcherByKey.has(searcherKey)) return;\n\n\t\tconst searcherI: SearcherIndexed = {\n\t\t\tkey: searcherKey,\n\t\t\tname: searchersNames[searcherKey],\n\t\t\tregions: [],\n\t\t\tregionByIndex: new Map(),\n\t\t};\n\n\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t});\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки частоты (Яндекс, Google, Mail если добавлен в проект)\n *\n * @param searchers\n * @param forMode - Режим выбора регионов\n */\nconst genSearchersMapForMode = (searchers: Searcher[], forMode: ForMode) => {\n\tconst serarcherByKey = genSearchersMapCommon(searchers, false, [0, 1], forMode);\n\n\t// в Mail нет регионов\n\tif (serarcherByKey.has(2)) {\n\t\tconst searcherMail = serarcherByKey.get(2);\n\t\tif (searcherMail) searcherMail.regionByIndex = new Map();\n\t}\n\n\tif (forMode === 'volume' || forMode === 'cost_forecast') {\n\t\t// добавление глобального региона\n\t\tserarcherByKey.forEach((searcher) => {\n\t\t\tif (!searcher.regionByIndex) return;\n\n\t\t\tconst region = { ...getRegionGlobal() };\n\t\t\tsearcher.regionByIndex.set(region.index, region);\n\t\t});\n\t}\n\n\treturn serarcherByKey;\n};\n\n/**\n * Поиск региона по заданному критерию из списка поисковиков проекта\n *\n * @param forMode - Режим выбора регионов\n * @param searchRegion - объект с параметрами региона, который следует найти\n * @param searchers\n */\nexport const findRegion = (forMode: ForMode, searchRegion: Partial<Region>, searchers: Searcher[] = []) => {\n\tconst searcherByKey = genSearcherByKey(forMode, false, searchers);\n\n\tlet findedRegion: Region | undefined;\n\n\t// поиск ПС\n\tsearcherByKey.forEach((searcher) => {\n\t\tif (searchRegion.searcher_key !== undefined && searchRegion.searcher_key != searcher.key) return;\n\t\tif (!searcher.regions) return;\n\n\t\t// поиск региона\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (findedRegion) return;\n\n\t\t\tif (searchRegion.key !== undefined && searchRegion.key != region.key) return;\n\t\t\tif (searchRegion.index !== undefined && searchRegion.index != region.index) return;\n\n\t\t\tif (!forMode) {\n\t\t\t\tif (searchRegion.lang !== undefined && searchRegion.lang != region.lang) return;\n\t\t\t\tif (searchRegion.device !== undefined && searchRegion.device != region.device) return;\n\t\t\t}\n\n\t\t\tregion.searcher_key = searcher.key;\n\t\t\tfindedRegion = region;\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (findedRegion) return false;\n\t});\n\n\treturn findedRegion;\n};\n\n/**\n * Открыть диалоговое окно с выбором нескольких регионов\n *\n * @see import('../dialog_regionSelectorRegions/types').Props\n */\nexport const dialogRegionSelector = useAsyncTopDialog(() => {\n\treturn import('@/components/project/regionSelector/dialog_regionSelectorRegions/dialog_regionSelectorRegions.vue');\n});\n","import { computed, type ComputedRef, ref } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, SearcherByKey } from '../types';\nimport type { Option, Options } from '@/components/forms/select/types';\nimport { dummyIndex, searhcerCompareKey } from '../utils/consts';\nimport { getSearcherGIcon } from '@/core/utils/searchers';\n\n/**\n * Создание и управление реактивными переменными для выбора ПС\n *\n * @param props - входные props компонента\n * @param mapSearchers - Map ПС (реактивная)\n */\nexport const useSelectSearcher = (\n\tprops: Props,\n\tmapSearchers: ComputedRef<SearcherByKey>,\n) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Ключ выбранной поисковой системы\n\t */\n\tconst searcherKey = ref(mapSearchers.value.keys().next().value ?? dummyIndex);\n\n\t/**\n\t * Коллекция опций для выбора ПС\n\t */\n\tconst optionBySearcherKey = computed(() => {\n\t\tconst res: Options = new Map();\n\t\tmapSearchers.value.forEach((searcher) => {\n\t\t\tlet option: Option = {\n\t\t\t\tvalue: searcher.key,\n\t\t\t\ttitle: searcher.name,\n\t\t\t};\n\n\t\t\tif (props.addSearcherIcon) option.icon = getSearcherGIcon(searcher.key);\n\n\t\t\tres.set(searcher.key, option);\n\t\t});\n\n\t\t// добавить режим сравнения, если есть хотя бы одна ПС с одним регионом\n\t\tif (props.addCompare && !res.has(dummyIndex)) {\n\t\t\tconst dummyOption: Option = {\n\t\t\t\tvalue: '',\n\t\t\t\ttitle: '--------------------',\n\t\t\t\tdisabled: true,\n\t\t\t};\n\t\t\tres.set(dummyOption.value, dummyOption);\n\n\t\t\tconst compareOption: Option = {\n\t\t\t\tvalue: searhcerCompareKey,\n\t\t\t\ttitle: i18n.Common.Compare!,\n\t\t\t};\n\t\t\tres.set(compareOption.value, compareOption);\n\t\t}\n\n\t\treturn res;\n\t});\n\n\treturn {\n\t\tsearcherKey,\n\t\toptionBySearcherKey,\n\t};\n};\n","import { computed, type ComputedRef, ref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getDeviceGIcon, getLangLabel } from '@/core/utils/searchers';\nimport type { Option } from '@/components/forms/select/types';\nimport { dummyIndex } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\n\n/**\n * Создание и управление реактивными переменными для выбора региона\n *\n * @param props - входные props компонента\n * @param activeSearcherIndexed - объект активной поисковой системы (реактивная)\n */\nexport const useSelectRegion = (props: Props, activeSearcherIndexed: ComputedRef<SearcherIndexed>) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Индекс выбранного региона\n\t */\n\tconst regionIndex = ref(dummyIndex);\n\n\tif (props.modelValue.length === 1) {\n\t\tregionIndex.value = props.modelValue[0];\n\t}\n\n\tif (regionIndex.value === dummyIndex) {\n\t\tif (props.forMode) {\n\t\t\t// в качестве ключа используется region.key, а не region.index\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.values().next().value?.key ?? dummyIndex;\n\t\t} else {\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.keys().next().value ?? dummyIndex;\n\t\t}\n\t}\n\n\t/**\n\t * Коллекция опций для выбора региона\n\t */\n\tconst optionByRegionIndex = computed(() => {\n\t\tconst options = new Map<number, Option>();\n\n\t\tactiveSearcherIndexed.value.regionByIndex?.forEach((region) => {\n\t\t\tlet regionLabel = region.name;\n\n\t\t\t// на частоту в текущей версии устройство и язык не влияют\n\t\t\t// обратите внимание, в качестве ключа используется region.key, а не region.index\n\t\t\tif (props.forMode) {\n\t\t\t\tconst option: Option = {\n\t\t\t\t\tvalue: region.key,\n\t\t\t\t\ttitle: regionLabel,\n\t\t\t\t};\n\t\t\t\tif (!options.has(region.key)) options.set(region.key, option);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (region.device) {\n\t\t\t\tregionLabel += ' (' + i18n.Common['Device_' + region.device] + ')';\n\t\t\t}\n\n\t\t\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\t\t\tif (langLabel) regionLabel += ' / ' + langLabel;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel,\n\t\t\t\ticon: region.device ? getDeviceGIcon(region.device) : undefined,\n\t\t\t};\n\n\t\t\toptions.set(region.index, option);\n\t\t});\n\n\t\treturn options;\n\t});\n\n\t/**\n\t * Выбор максимально похожего региона в новой коллекции регионов\n\t */\n\twatch(optionByRegionIndex, (optionByRegionIndex, oldOptionByRegionIndex) => {\n\t\tif (props.onlySearcher || regionIndex.value !== undefined && optionByRegionIndex.get(regionIndex.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newRegionIndex = optionByRegionIndex.keys().next().value as Region['index'];\n\t\tif (regionIndex.value === dummyIndex || newRegionIndex === dummyIndex) {\n\t\t\tregionIndex.value = newRegionIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionName = (oldOptionByRegionIndex?.get(regionIndex.value) as Option)?.title || '';\n\t\tlet regionMatchLevel = -1;\n\t\tfor (const [index, option] of optionByRegionIndex.entries()) {\n\t\t\tconst title = (option as Option).title;\n\n\t\t\tif (typeof title !== 'string' || typeof index === 'string') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// полное совпадение\n\t\t\tif (title === regionName) {\n\t\t\t\tnewRegionIndex = index;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst regexpDevice = new RegExp(` \\\\((${i18n.Common['Device_1']}|${i18n.Common['Device_2']})\\\\)`);\n\t\t\tlet regionNameCompare = regionName;\n\t\t\tlet regionMatchLevelI = 3;\n\n\t\t\t// без устройства\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без устройства и без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\t\t\t\tregionNameCompare = regionNameCompare.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\tif (title.indexOf(regionNameCompare) === -1) continue;\n\t\t\tif (regionMatchLevelI <= regionMatchLevel) continue;\n\n\t\t\tregionMatchLevel = regionMatchLevelI;\n\t\t\tnewRegionIndex = index;\n\t\t}\n\n\t\tregionIndex.value = newRegionIndex;\n\t});\n\n\treturn {\n\t\tregionIndex,\n\t\toptionByRegionIndex,\n\t};\n};\n","import { type ComputedRef, ref, watch } from 'vue';\nimport type { Props, SearcherByKey } from '../types';\n\n/**\n * Создание и управление реактивными переменными для сравнения\n *\n * @param props - входные props компонента\n * @param searcherByKey - Map ПС (реактивная)\n * @param allRegionsIndexes - Все доступные индексы регионов (реактивная)\n */\nexport const useCompare = (props: Props, searcherByKey: ComputedRef<SearcherByKey>, allRegionsIndexes: ComputedRef<Set<number>>) => {\n\t/**\n\t * Индексы регионов/ПС в сравнение\n\t */\n\tconst regionsIndexes = ref<number[]>([]);\n\n\t/**\n\t * Загрузка индексов регионов для сравнения\n\t *\n\t * Если в modelValue передано несколько регионов, они будут установлены как выбранные для сравнения\n\t */\n\tconst compareLoad = () => {\n\t\tif (props.onlySearcher && searcherByKey.value) {\n\t\t\tregionsIndexes.value = Array.from(searcherByKey.value.keys());\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionsIndexesSaved: Props['modelValue'] = [];\n\n\t\tif (props.modelValue.length > 1) {\n\t\t\tregionsIndexesSaved = [...props.modelValue];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\t// загрузить индексы регионов, если они были сохранены\n\t\t\t\tregionsIndexesSaved = JSON.parse(\n\t\t\t\t\tlocalStorage.getItem('ui:project:regionSelector' + props.projectId + ':regionsIndexes') as string,\n\t\t\t\t) ?? [];\n\t\t\t} catch (e) {\n\n\t\t\t}\n\t\t}\n\n\t\t// убрать из сравнения регионы, которых нет в props.searchers\n\t\tif (regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = regionsIndexesSaved.filter((regionIndex) => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\t// если не сохранено ни одного региона, выбрать все регионы проекта\n\t\tif (!regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = Array.from(allRegionsIndexes.value);\n\t\t}\n\n\t\tregionsIndexes.value = [...regionsIndexesSaved];\n\t};\n\n\t/**\n\t * Сохранение выбранных регионов\n\t */\n\tconst compareSave = () => {\n\t\tif (regionsIndexes.value.length) {\n\t\t\tlocalStorage.setItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes', JSON.stringify(regionsIndexes.value));\n\t\t} else {\n\t\t\tlocalStorage.removeItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes');\n\t\t}\n\t};\n\n\twatch(regionsIndexes, () => {\n\t\tcompareSave();\n\t});\n\n\tif (props.addCompare) {\n\t\t// if (props.compareRegionsIndexes?.length) {\n\t\t// \tcompareRegionsIndexes.value = [...props.compareRegionsIndexes];\n\t\t// } else {\n\t\t// \tcompareLoad();\n\t\t// }\n\n\t\tcompareLoad();\n\t}\n\n\treturn {\n\t\tregionsIndexes,\n\t};\n};\n","import { computed, watch } from 'vue';\nimport { findRegion, genSearcherByKey } from '../utils/utils';\nimport { dummyIndex, globalRegionIndex, searcherUndefined, searhcerCompareKey } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\nimport { useSelectSearcher } from './selectSearcher';\nimport { useSelectRegion } from './selectRegion';\nimport { useCompare } from './compare';\n\n/**\n * Создание и управления рективными переменными компонента\n *\n * @param props - входные props компонента\n */\nexport const useSelectorRegion = (props: Props) => {\n\tconst searcherByKey = computed(() => {\n\t\treturn genSearcherByKey(props.forMode, props.autoRegion, props.searchers);\n\t});\n\n\tconst activeSearcherIndexed = computed(() => {\n\t\treturn searcherByKey.value.get(selectSearcher.searcherKey.value) || searcherUndefined;\n\t});\n\n\t/**\n\t * Все индексы регионов из searcherByKey\n\t *\n\t * Активность регионов определяется в searcherByKey\n\t */\n\tconst allRegionsIndexes = computed(() => {\n\t\tconst regionsIndexes = new Set<number>();\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\tregionsIndexes.add(region.index);\n\t\t\t});\n\t\t});\n\n\t\treturn regionsIndexes;\n\t});\n\n\tconst selectSearcher = useSelectSearcher(props, searcherByKey);\n\tconst selectRegion = useSelectRegion(props, activeSearcherIndexed);\n\tconst compare = useCompare(props, searcherByKey, allRegionsIndexes);\n\n\t// контроль за внешним изменением списка ПС\n\twatch(searcherByKey, () => {\n\t\t// возможные значения для сравнения регионов/пс\n\t\tif (props.onlySearcher) {\n\t\t\tcompare.regionsIndexes.value = Array.from(searcherByKey.value.keys());\n\t\t} else {\n\t\t\tcompare.regionsIndexes.value = compare.regionsIndexes.value.filter(regionIndex => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey) return;\n\n\t\tlet newSearcherKey = searcherByKey.value.keys().next().value;\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t// определить выбранную ПС\n\t\t\tif (props.onlySearcher && searcher.key === selectSearcher.searcherKey.value) {\n\t\t\t\tnewSearcherKey = selectSearcher.searcherKey.value;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tselectRegion.regionIndex.value &&\n\t\t\t\tsearcher.regionByIndex?.has(selectRegion.regionIndex.value)\n\t\t\t) {\n\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t}\n\n\t\t\t// выбрать первую ПС с выбранным регионом\n\t\t\tif (!props.onlySearcher) {\n\t\t\t\tlet regionsNewSearcher: SearcherIndexed['regionByIndex'] | undefined;\n\n\t\t\t\tif (newSearcherKey !== undefined) {\n\t\t\t\t\tregionsNewSearcher = searcherByKey.value.get(newSearcherKey)?.regionByIndex;\n\t\t\t\t}\n\n\t\t\t\tconst regionsCurrentSearcher = searcherByKey.value.get(searcher.key)?.regionByIndex;\n\t\t\t\tif (\n\t\t\t\t\tregionsNewSearcher?.has(dummyIndex) &&\n\t\t\t\t\t!regionsCurrentSearcher?.has(dummyIndex)\n\t\t\t\t) {\n\t\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// if (props.addCompare && !selectSearcher.optionBySearcherKey.value.has(dummyIndex)) {\n\t\t// \tif (!selectRegion.regionIndex.value && compare.regionsIndexes.value?.length) newSearcherKey = searhcerCompareKey;\n\t\t// }\n\n\t\t// if (props.onlySearcher && selectRegion.regionIndex.value !== dummyIndex) newSearcherKey = selectRegion.regionIndex.value;\n\n\t\tif (newSearcherKey !== undefined) {\n\t\t\tselectSearcher.searcherKey.value = newSearcherKey;\n\t\t}\n\n\t\tif (\n\t\t\tselectRegion.regionIndex.value !== undefined &&\n\t\t\t!(activeSearcherIndexed.value?.regionByIndex)?.has(selectRegion.regionIndex.value)\n\t\t) {\n\t\t\tselectRegion.regionIndex.value = activeSearcherIndexed.value?.regions?.keys().next().value as number;\n\t\t}\n\t}, { immediate: true });\n\n\tconst getSearcherKey = () => {\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey || selectSearcher.searcherKey.value === dummyIndex) return;\n\n\t\treturn selectSearcher.searcherKey.value;\n\t};\n\n\tconst getRegionIndex = () => {\n\t\tif (props.onlySearcher) return;\n\n\t\tif (selectRegion.regionIndex.value === dummyIndex) return;\n\n\t\tlet res: Region['index'] | undefined = selectRegion.regionIndex.value;\n\n\t\t// в качестве ключа используется region.key\n\t\tif (props.forMode) {\n\t\t\tconst regionKey = selectRegion.regionIndex.value;\n\t\t\tconst region = findRegion(props.forMode, { searcher_key: getSearcherKey(), key: regionKey } as Region, props.searchers);\n\n\t\t\tres = region?.index;\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Получить выбранную ПС\n\t */\n\tconst getSearcher = () => {\n\t\tconst searcherKey = getSearcherKey();\n\t\tif (searcherKey === undefined) return;\n\n\t\treturn searcherByKey.value.get(searcherKey);\n\t};\n\n\t/**\n\t * Получить выбранный регион\n\t */\n\tconst getRegion = () => {\n\t\tconst regionIndex = getRegionIndex();\n\t\tif (regionIndex === undefined) return;\n\n\t\treturn getSearcher()?.regionByIndex?.get(regionIndex);\n\t};\n\n\treturn {\n\t\tselectSearcher,\n\t\tselectRegion,\n\t\tcompare,\n\n\t\tsearcherByKey,\n\t\tallRegionsIndexes,\n\n\t\tgetSearcher,\n\t\tgetRegion,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { watch } from 'vue';\nimport type { Props, Region } from './types';\nimport Select from '@/components/forms/select/select.vue';\nimport Button from '@/components/forms/button/button.vue';\nimport { useSelectorRegion } from './composables/selectorRegion';\nimport { dummyIndex, globalRegionIndex, searhcerCompareKey } from './utils/consts';\nimport { dialogRegionSelector } from '@/components/project/regionSelector/utils/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsearchers: () => [],\n\t// compareRegionsIndexes: () => [],\n\taddSearcherIcon: true,\n\taddRegionIcon: true,\n\taddChanger: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\nconst modelSingle = defineModel<Props['modelValueSingle']>('modelValueSingle');\n\nconst {\n\tselectSearcher,\n\tselectRegion,\n\tcompare,\n\n\tsearcherByKey,\n\tallRegionsIndexes,\n\n\tgetSearcher,\n\tgetRegion,\n} = useSelectorRegion(props);\n\nconst onClickCompare = () => {\n\tconst regions: Region[] = [];\n\n\tsearcherByKey.value.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (!region.enabled) return;\n\n\t\t\tregions.push(region);\n\t\t});\n\t});\n\n\tdialogRegionSelector.open('regions', {\n\t\tregions,\n\t\tregionsIndexes: compare.regionsIndexes.value,\n\t\t'@update:regionsIndexes': (regionsIndexes: number[]) => compare.regionsIndexes.value = regionsIndexes,\n\t});\n};\n\nwatch([selectRegion.regionIndex, selectSearcher.searcherKey, compare.regionsIndexes], () => {\n\tif (selectSearcher.searcherKey.value === searhcerCompareKey && compare.regionsIndexes.value.length) {\n\t\tif (JSON.stringify(model.value) === JSON.stringify(compare.regionsIndexes.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tmodel.value = [...compare.regionsIndexes.value];\n\t} else {\n\t\tif (props.onlySearcher) {\n\t\t\tmodel.value = [selectSearcher.searcherKey.value];\n\n\t\t\tif (selectSearcher.searcherKey.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t} else {\n\t\t\tmodel.value = [selectRegion.regionIndex.value];\n\n\t\t\t// не добавлять несуществующий регион в результаты\n\t\t\tif (selectRegion.regionIndex.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t}\n\t}\n\n\t// регионов нет\n\tif (!props.onlySearcher && !allRegionsIndexes.value.size) {\n\t\tselectSearcher.searcherKey.value = dummyIndex;\n\t}\n});\n\nif (modelSingle.value) {\n\twatch(modelSingle, () => {\n\t\tif (modelSingle.value) {\n\t\t\tmodel.value = [modelSingle.value];\n\t\t}\n\t}, { immediate: true });\n}\n\nwatch(model, () => {\n\tif (model.value[0]) {\n\t\tmodelSingle.value = model.value[0];\n\t}\n\n\t// проверка входных данных v-model на корректность\n\tif (props.onlySearcher) {\n\t\tif (\n\t\t\t!model.value.length ||\n\t\t\tmodel.value.length === 1 && !searcherByKey.value.has(model.value[0]) ||\n\t\t\tmodel.value.length === 1 && model.value[0] === dummyIndex && !props.autoRegion\n\t\t) {\n\t\t\tlet defaultKey: number | undefined = searcherByKey.value.keys().next().value;\n\n\t\t\t// запретить устанавливать несуществующий регион\n\t\t\tif (defaultKey === dummyIndex && !props.autoRegion) {\n\t\t\t\tdefaultKey = undefined;\n\n\t\t\t\tmodelSingle.value = dummyIndex;\n\t\t\t}\n\n\t\t\tif (defaultKey !== undefined) {\n\t\t\t\tmodel.value = [defaultKey];\n\t\t\t}else{\n\t\t\t\tmodel.value.length = 0;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmodel.value.length > 1 &&\n\t\t\tJSON.stringify(model.value) !== JSON.stringify(compare.regionsIndexes.value)\n\t\t) {\n\t\t\tmodel.value = [...compare.regionsIndexes.value];\n\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlet newModel = [...new Set(model.value)];\n\n\t\tlet defaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.keys().next().value;\n\t\tif (props.forMode) {\n\t\t\tdefaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.values().next().value?.key;\n\t\t}\n\n\t\t// запретить устанавливать несуществующий регион\n\t\tif (defaultIndex === dummyIndex && !props.autoRegion) {\n\t\t\tdefaultIndex = undefined;\n\n\t\t\tmodelSingle.value = dummyIndex;\n\t\t}\n\n\t\tif (!newModel.length) {\n\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t} else if (newModel.length === 1) {\n\t\t\tlet all = allRegionsIndexes.value;\n\n\t\t\tif (props.forMode) {\n\t\t\t\tall = new Set();\n\t\t\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\t\t\tall.add(region.key);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// убрано, так как dummyIndex запрещено выбирать в model\n\t\t\t// if (!all.has(newModel[0]) && newModel[0] !== dummyIndex) {\n\t\t\tif (!all.has(newModel[0])) {\n\t\t\t\tnewModel = [];\n\t\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewModel = newModel.filter(index => allRegionsIndexes.value.has(index));\n\t\t\tif (!newModel.length && defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (JSON.stringify(model.value) !== JSON.stringify(newModel)) {\n\t\t\tmodel.value = newModel;\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// входные данные v-model совпадают с внутренними значениями\n\tif (\n\t\tmodel.value.length === 1 &&\n\t\tmodel.value[0] === (props.onlySearcher ? selectSearcher.searcherKey.value : selectRegion.regionIndex.value)\n\t) {\n\t\treturn;\n\t}\n\n\t// if (\n\t// \tmodel.value.length > 1 &&\n\t// \tselectorSearcher.searcherKey.value === searhcerCompareKey &&\n\t// \tJSON.stringify(model.value) === JSON.stringify(selectorCompare.regionsIndexes.value)\n\t// ) {\n\t// \treturn;\n\t// }\n\n\t// обновление regionIndex, searcherKey, selectorCompare.regionsIndexes\n\tif (props.onlySearcher) {\n\t\t// if (!model.value.length) {\n\t\t// \tselectorSearcher.searcherKey.value = dummyIndex;\n\t\t//\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (model.value.length === 1) {\n\t\t\tselectSearcher.searcherKey.value = model.value[0];\n\n\t\t\treturn;\n\t\t}\n\n\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\n\t\treturn;\n\t} else {\n\t\tif (!model.value.length) {\n\t\t\t// selectSearcher.searcherKey.value = dummyIndex;\n\t\t\t// selectRegion.regionIndex.value = dummyIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (model.value.length === 1 && selectSearcher.searcherKey.value !== searhcerCompareKey) {\n\t\t\tselectRegion.regionIndex.value = model.value[0];\n\n\t\t\tlet newSearherKey: number | undefined;\n\t\t\tfor (const searcher of searcherByKey.value.values()) {\n\t\t\t\tfor (const region of searcher.regionByIndex.values()) {\n\t\t\t\t\tconst currentRegionIndex = props.forMode ? region.key : region.index;\n\t\t\t\t\tif (currentRegionIndex === selectRegion.regionIndex.value) {\n\t\t\t\t\t\tnewSearherKey = searcher.key;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\tselectSearcher.searcherKey.value = newSearherKey;\n\t\t\t}\n\t\t} else {\n\t\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\t\t\tcompare.regionsIndexes.value = [...model.value];\n\t\t}\n\t}\n}, { immediate: true });\n\ndefineExpose({\n\tgetSearcher,\n\tgetRegion,\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-selectorRegion': true,\n\t\t\t'top-selectorRegion-onlySearcher': onlySearcher,\n\t\t}\"\n\t>\n\t\t<Select\n\t\t\t:options=\"selectSearcher.optionBySearcherKey.value\"\n\t\t\tv-model=\"selectSearcher.searcherKey.value\"\n\t\t\tname=\"searcher_key\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t/>\n\n\t\t<Select\n\t\t\tv-if=\"!onlySearcher && selectSearcher.searcherKey.value !== searhcerCompareKey\"\n\t\t\tclass=\"top-select-region\"\n\t\t\t:options=\"selectRegion.optionByRegionIndex.value\"\n\t\t\tv-model=\"selectRegion.regionIndex.value\"\n\t\t\t:name=\"forMode ? 'region_key' : 'region_index'\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t\t:data-top-icon=\"addRegionIcon ? '' : undefined\"\n\t\t/>\n\n\t\t<Button\n\t\t\tv-if=\"addCompare && !onlySearcher && selectSearcher.searcherKey.value === searhcerCompareKey\"\n\t\t\tname=\"compare\"\n\t\t\t@click=\"onClickCompare\"\n\t\t\t:data-count-compare-regions-indexes=\"compare.regionsIndexes.value.length\"\n\t\t>\n\t\t\t{{ $i18n.Common.Selected_regions }}\n\t\t</Button>\n\t</div>\n</template>\n\n<style>\n@import \"./styles/searcherColors.css\";\n\n.top-selectorRegion {\n\twidth: 340px;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n\n.top-selectorRegion > .top-select {\n\tflex-grow: 1;\n}\n\n.top-selectorRegion > .top-select:focus-within {\n\tz-index: 4;\n}\n\n.top-selectorRegion > .top-select > .top-select_select:hover,\n.top-selectorRegion > .top-select > .top-select_select.top-error {\n\tz-index: 1;\n}\n\n.top-selectorRegion > .top-select-searcher_key {\n\twidth: 140px;\n\tmax-width: 160px;\n\tmargin-right: -1px;\n}\n\n.top-selectorRegion > .top-select-region > select {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.top-selectorRegion > .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-selectorRegion > .top-select-region[data-top-icon][data-top-icon2] {\n\t--top-icon2-size: 16px;\n}\n\n.top-selectorRegion > .top-select-region[data-top-icon][data-top-icon2]:after {\n\ttext-indent: -4px;\n}\n\n.top-selectorRegion > [name=\"compare\"] {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\tflex-grow: 1;\n}\n\n.top-selectorRegion > [name=\"compare\"]:after {\n\tcontent: \"(\" attr(data-count-compare-regions-indexes) \")\";\n\tmargin: 0 0 0 6px;\n}\n\n.top-selectorRegion:not(.top-selectorRegion-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-selectorRegion:not(.top-selectorRegion-onlySearcher) > .top-select-searcher_key[data-value=\"-1\"] > select {\n\tborder-right: none;\n}\n\n.top-selectorRegion-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\nfunction 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 { Props } from './types';\nimport { folderDefault, genApiGetFolders, genFlat } 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 * Проверка входного значения `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: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 genApiAddGroup = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/add/${service}/groups/`);\n};\n","<script setup lang=\"ts\">\nimport { reactive, ref, watch } from 'vue';\nimport { useWatch } from '@/core/utils/composables/useWatch';\nimport Selector2 from '@/components/formsExt/selector2/selector2.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 { genApiAddGroup, genApiGetGroups, genGroupAll, genGroupPlaceholder, genItems, groupNone } from './utils';\nimport { genFieldFilter } from '@/api/api/index';\nimport { folderDefault } from '../folders/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tautoselect: 'first',\n\taddChanger: true,\n\taddIcon: true,\n});\n\nconst emits = defineEmits<Emits>();\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { required: true });\n\nconst apiGet = props.client && !props.groups ? genApiGetGroups(props.client, props.service) : undefined;\nconst apiAdd = props.client ? genApiAddGroup(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n/**\n * Группы выбранной папки\n */\nconst groupsBySelectedFolder = ref<Group[] | undefined>(undefined);\n\nconst filterByFolder = genFieldFilter('folder_id', 'EQUALS', [props.folder?.id ?? 0]);\n\napiGet?.changeParams({\n\tproject_id: props.projectId,\n\tfolder_id_depth: true,\n\tfilters: [\n\t\tfilterByFolder,\n\t],\n});\n\nif (props.on !== undefined) {\n\tapiGet?.params.filters?.push(genFieldFilter('on', 'EQUALS', [Number(props.on)]));\n}\n\n/**\n * Синхронная установка группы и id группы\n *\n * Id рекомендуется вместе с группой\n * - для согласованной смены состояния\n * - для уменьшения цепочки `watch` синхронизации состояний `modelGroupId` и `modelGroup`\n *\n * Пример несогласованности: если передать `modelGroup` и значение `modelGroupId`, которое ему не соответсвует, то попытка установить ту же самоую группу в `modelGroup` не приведет к смене `modelGroupId`\n */\nconst setGroup = (group: Props['group']) => {\n\tmodelGroup.value = group;\n\tmodelGroupId.value = group.id;\n};\n\n// Настройка API, обработка смены папки и выбор всех групп\nuseWatch({\n\tprojectId: () => props.projectId,\n\tfolderId: () => props.folder?.id,\n\tcanSelectAll: () => props.canSelectAll,\n}, (changes) => {\n\t// Настройка API\n\tif (changes.projectId) {\n\t\tapiGet?.changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t});\n\n\t\tapiGet?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorGroups:' + props.projectId,\n\t\t});\n\t}\n\n\t// Обработка смены папки\n\tif (changes.folderId) {\n\t\tfilterByFolder.values = [\n\t\t\tprops.folder?.id ?? 0,\n\t\t];\n\n\t\t// необходимо установить группы выбранной папки\n\t\tif (props.groups) {\n\t\t\tgroupsBySelectedFolder.value = genItems(props.groups, props.on, props.folder);\n\t\t}\n\t}\n\n\trefSelector.value?.resetCache();\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</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\">\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 v-html=\"item.name\"></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 v-if=\"item.folder_path && showPath\" class=\"top-groupSelector_groupItemFolderPath\" v-html=\"item.folder_path\"></span>\n\t\t\t</div>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-groupSelector_groupItem {\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 } from 'vue';\nimport type { Emits, Props } from './types';\nimport type { Folder } from './folders/types';\nimport type { Group } from './groups/types';\nimport Folders from './folders/folders.vue';\nimport Groups from './groups/groups.vue';\nimport { folderDefault, genFlat, genRootFolder } from './folders/utils';\nimport { genGroupAll, genGroupPlaceholder, groupNone } from './groups/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tcanSelectAll: false,\n\tautoselect: 'first',\n\taddChanger: true,\n\tshowFolders: true,\n\tshowGroups: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\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.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</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\n\t\t/>\n\n\t\t<Groups\n\t\t\tv-if=\"showGroups\"\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:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:autoselect\n\t\t\t:addChanger\n\t\t\t:showPath=\"showFolders && !!folders?.[0]\"\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service\n\t\t\t@addGroup=\"onAddGroup\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-groupSelector {\n\tdisplay: inline-flex;\n\tgap: var(--top-padding-1);\n}\n</style>\n","import type { Item, Props } from '@/components/formsExt/selector2/types';\nimport { TopPopupWorker } from '@/components/popup/worker';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\n\n/**\n * Создать объект заголовка для категории проектов\n */\nconst createProjectCategoryTitles = (name: string): Item => {\n\treturn {\n\t\tid: null,\n\t\tname,\n\t\tlistItemProps: {\n\t\t\ttype: 'title',\n\t\t},\n\t};\n};\n\n/**\n * Состояние вставки заголовков категорий\n *\n * Используется для отслеживания, какие заголовки уже были добавлены в список,\n * чтобы не дублировать их при постраничной загрузке данных\n */\nconst globalTitlesState = {\n\tscheduledUpdate: false,\n\tmanualUpdate: false,\n\tguestProjects: false,\n};\n\n/**\n * Вставить заголовки категорий перед соответствующими группами проектов\n *\n * Использует `globalTitlesState`, оно сохраняется между вызовами, так как проекты подгружаются частями\n *\n * При `useLocalTitlesState` = `true` создаётся временное состояние заголовков для этого вызова функции, не влияющее на глобальное состояние.\n * Используется при поиске проектов, чтобы сохранить исходное состояние заголовков\n */\nconst insertCategoryTitles = (projects: Item[], useLocalTitlesState?: boolean): Item[] => {\n\tconst result: Item[] = [];\n\n\tconst categoriesTitle = {\n\t\tscheduledUpdate: createProjectCategoryTitles(useI18n().Projects.Scheduled_update),\n\t\tmanualUpdate: createProjectCategoryTitles(useI18n().Projects.Manual_update),\n\t\tguestProjects: createProjectCategoryTitles(useI18n().Projects.Guest_projects),\n\t};\n\n\tconst titlesState = useLocalTitlesState ? {\n\t\tscheduledUpdate: false,\n\t\tmanualUpdate: false,\n\t\tguestProjects: false,\n\t} : globalTitlesState;\n\n\tfor (const project of projects) {\n\t\tif (!titlesState.scheduledUpdate && project.right?.startsWith('1') && project.on > 0) {\n\t\t\tresult.push(categoriesTitle.scheduledUpdate);\n\t\t\ttitlesState.scheduledUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.manualUpdate && project.right?.startsWith('1') && project.on === 0) {\n\t\t\tresult.push(categoriesTitle.manualUpdate);\n\t\t\ttitlesState.manualUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.guestProjects && project.right?.startsWith('0') && project.on >= 0) {\n\t\t\tresult.push(categoriesTitle.guestProjects);\n\t\t\ttitlesState.guestProjects = true;\n\t\t}\n\n\t\tresult.push(project);\n\t}\n\n\treturn result;\n};\n\n/**\n * Добавить к данным проектов `listItemProps`\n *\n * @see Item\n */\nconst addListItemProps = (\n\tprojects: Item[],\n) => {\n\treturn projects.map((project) => ({\n\t\t...project,\n\t\tlistItemProps: {\n\t\t\tattrs: { title: project.name },\n\t\t},\n\t}));\n};\n\n/**\n * Подготавить данные проектов для отображения:\n * - сбросить состояние вставки заголовков категорий, если требуется\n * - добавить `listItemProps`\n * - добавить заголовки к категориям\n */\nconst prepareProjects = (\n\tprojects: Item[] | undefined,\n\tresetTitlesState?: boolean,\n\tuseLocalTitlesState?: boolean,\n): Item[] | undefined => {\n\tif (!projects || projects.length === 0) return [];\n\n\tif (resetTitlesState) Object.keys(globalTitlesState).forEach((key) => globalTitlesState[key] = false);\n\n\tconst projectsWithListItem = addListItemProps(projects);\n\treturn insertCategoryTitles(projectsWithListItem, useLocalTitlesState);\n};\n\n/**\n * Добавить к ссылке релевантные hash-параметров текущего проекта\n */\nconst prepareProjectLink = (link: string) => {\n\tlink = link.replace(/#.*/, '');\n\n\tlet hash = location.hash;\n\n\t// Игнорируемые параметры при переходе между проектами\n\thash = hash.replace(/historyView=[^&]*/, '');\n\thash = hash.replace(/competitorsIds=[^&]*/, '');\n\thash = hash.replace(/searchersKeys=[^&]*/, '');\n\thash = hash.replace(/regionIndex=[^&]*/, '');\n\thash = hash.replace(/regionsIndexes=[^&]*/, '');\n\thash = hash.replace(/folderId=[^&]*/, '');\n\thash = hash.replace(/groupId=[^&]*/, '');\n\thash = hash.replace(/tags=[^&]*/, '');\n\n\t// Сохранить сортировку по дате последней проверки\n\tif (window['mo']?.getHash && !window['mo'].getHash('dataSort').toString().includes('0000-00-00')) {\n\t\thash = hash.replace(/dataSort=[^&]*/, '');\n\t}\n\n\t// Игнорируемые параметры при переходе между проектами (для pinia)\n\thash = hash.replace(/%22historyView%22:[^,]*,/, '');\n\thash = hash.replace(/%22competitorsIds%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22searchersKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22regionIndex%22:[^,]*,/, '');\n\thash = hash.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22folderId%22:[^,]*,/, '');\n\thash = hash.replace(/%22groupId%22:[^,]*,/, '');\n\thash = hash.replace(/%22tagsIds%22:\\[[^\\]]*],/, '');\n\n\t// Сохранить сортировку по дате последней проверки (для pinia)\n\tif (!/%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(hash)) {\n\t\thash = hash.replace(/%22dataSort%22:\\{[^}]*},/, '');\n\t}\n\n\treturn link + hash;\n};\n\n/**\n * Закрыть попап и выполнить переход на страницу проекта\n */\nexport const navigateToProject = (link: string, event?: PointerEvent) => {\n\tif (event && event.target instanceof HTMLElement) {\n\t\tTopPopupWorker.close(event.target.closest('.top-popup-wrapper')!);\n\t}\n\n\tconst linkWithHash = prepareProjectLink(link);\n\tlocation.href = linkWithHash;\n};\n\n/**\n * Сгенерировать ссылку на проект\n */\nexport const genProjectLink = (projectId: number) => {\n\tconst host = getBaseHost();\n\tconst pathname = location.pathname.split('/');\n\n\tlet prefix = 'project/dynamics/';\n\tlet suffix = '';\n\tif (pathname[1] == 'project') prefix = pathname[1] + '/' + pathname[2] + '/';\n\tif (pathname[2] == 'settings') suffix = location.hash;\n\tif (['watcher', 'indexing', 'sitemap', 'audit', 'direct', 'adwords'].includes(pathname[4])) suffix = pathname[4] + '/';\n\n\treturn 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n};\n\n/**\n * Вернуть базовый хост без поддомена\n */\nexport const getBaseHost = () => {\n\tif (window['page']?.subdomain) {\n\t\treturn window.location.host.replace(window['page']?.subdomain + '.', '');\n\t}\n\n\treturn window.location.host;\n};\n\n/**\n * Сгенерировать ссылку на сайт проекта\n */\nexport const genProjectExternalLink = (url: string) => {\n\tlet link = url.startsWith('http') ? url : 'http://' + url;\n\n\tlink = link.replace(/\"/g, '%22');\n\n\treturn link;\n};\n\n/**\n * Расширяет функционал аналогичной функции в Selector2\n *\n * Добавить фильтр поиска по полям `id`, `name`, `url` в параметры API.\n * Поиск выполняется по строке `search` и по строке с инвертированной раскладкой клавиатуры.\n *\n * @param api - api, которое используется в `TopProjectSelector`\n * @param search - введенная строка поиска\n *\n * @todo Объединить с apiSetSearchParamsFilter() из @/components/formsExt/selector2/utils.ts\n */\nexport const apiSetSearchParamsFilter = (api: NonNullable<Props['api']>, search: string) => {\n\tlet filters = api.params.filters ?? [];\n\n\t// удаление других фильтров по этому полю\n\tfilters = filters.filter((filter) => filter.name !== 'GEN_SEARCH_STRING()');\n\n\tconst searchInvert = invertKeyboardLayout(search);\n\tconst searchPrepared = search.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\tconst searchInvertPrepared = searchInvert.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\n\tif (search) {\n\t\tfilters.push(genFieldFilter('GEN_SEARCH_STRING()', 'REGEXP', [`(${searchPrepared}|${searchInvertPrepared})`]));\n\t}\n\n\tapi.changeParams({ filters });\n};\n\n/**\n * Создать API запрос на получение списка проектов\n *\n * Данные после загрузки преобразуются с помощью `prepareProjects()`\n *\n * @see prepareProjects\n */\nexport const genApiGetProjects = (\n\tclient: Api.Client<Api.TV.Paths, true>,\n\tuserId: number,\n\tparams?: Record<string, number>,\n) => {\n\tconst api = client.gen('/get/projects_2/projects/', ['id', 'user_id', 'name', 'url', 'on', 'right']);\n\n\tapi.params = {\n\t\t...params,\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', [userId]),\n\t\t\tgenFieldOrder('on', 'DESC'),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t};\n\n\tapi.options.onApiLoaded = (res, ctx, clientOnApiLoaded) => {\n\t\t// Флаг для сброса глобального состояния заголовков.\n\t\t// Срабатывает при добавлении проекта или полной перезагрузке списка\n\t\tconst needResetTitle = ctx.data.filters.length === 1 && ctx.data.offset === 0 || ctx.data.limit === 1000;\n\n\t\t// Флаг для использования локального состояния заголовков.\n\t\t// Срабатывает при поиске проектов (когда фильтров больше одного),\n\t\t// чтобы не сбрасывать уже вставленные заголовки.\n\t\tconst useLocalTitlesState = ctx.data.limit === 100 && ctx.data.filters.length > 1 ? true : undefined;\n\n\t\tres.result = prepareProjects(res.result as Item[], needResetTitle, useLocalTitlesState);\n\n\t\tclientOnApiLoaded?.(res, ctx);\n\t};\n\n\treturn api;\n};\n\n/**\n * Создать API запрос для добавления проекта\n */\nexport const genApiAddProject = (client: Api.Client<Api.TV.Paths, true>) => {\n\treturn client.gen('/add/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\nimport { computed } from 'vue';\nimport { TopPopup } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst submenuItems = [\n\t{\n\t\thref: `https://${host}/project/keywords/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_phrases,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n\t{\n\t\thref: `https://${host}/project/dynamics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_dynamics,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/snapshots/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_snapshots,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/competitors/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_competitors,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/ai-tracker/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_aiTracker,\n\t\ticon: '',\n\t\tright: '1',\n\t},\n\t{\n\t\thref: `https://${host}/project/analytics/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_analytics,\n\t\ticon: '',\n\t\tright: '5',\n\t},\n\t{\n\t\thref: `https://${host}/project/broker/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_broker,\n\t\ticon: '',\n\t\tright: '6',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/sitemap/`,\n\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/audit/`,\n\t\ttitle: i18n.Common.Menu_audit,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/indexing/`,\n\t\ttitle: i18n.Audit.Indexing,\n\t\ticon: '',\n\t\tright: '8',\n\t},\n\t{\n\t\thref: `https://${host}/project/audit/${props.id}/watcher/`,\n\t\ttitle: i18n.Audit.Watcher,\n\t\ticon: '',\n\t\tright: '9',\n\t},\n\t{\n\t\thref: `https://${host}/project/settings/${props.id}/`,\n\t\ttitle: i18n.Common.Menu_settings,\n\t\ticon: '',\n\t\tright: '2',\n\t},\n];\n\nconst filteredSubmenuItems = computed(() => {\n\t// Убрать иконку ai-трекера, если он выключен в настройках аккаунта\n\tif (!window['page']?.data?.aiTracker) {\n\t\tconst index = submenuItems.findIndex((item) => item.href.includes('ai-tracker'));\n\n\t\tif (index !== -1) {\n\t\t\tsubmenuItems.splice(index, 1);\n\t\t}\n\t}\n\n\tif (!props.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn props.right[item.right] === '1';\n\t});\n});\n</script>\n\n<template>\n\t<TopPopup\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #opener>\n\t\t\t<TopButton\n\t\t\t\tclass=\"top-projectSelectorSubmenu_opener\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t></TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<li\n\t\t\t\tv-for=\"item in filteredSubmenuItems\"\n\t\t\t\tclass=\"top-projectSelectorSubmenu_item\"\n\t\t\t>\n\t\t\t\t<a\n\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:data-right=\"item.right\"\n\t\t\t\t></a>\n\t\t\t</li>\n\n\t\t\t<li class=\"top-projectSelectorSubmenu_item\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"url\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t></a>\n\t\t\t</li>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-projectSelectorSubmenu .top-popup {\n\tmin-width: 170px;\n}\n\n.top-projectSelectorSubmenu ul {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n.top-projectSelectorSubmenu_item {\n\twidth: 32%;\n}\n\n.top-projectSelectorSubmenu_item a {\n\tjustify-content: center;\n}\n\n.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t--top-icon-size: 24px;\n\t--top-icon-width: 32px;\n\n\theight: var(--top-icon-width);\n\tmargin: 0;\n}\n\n.top-projectSelectorSubmenu_item {\n\tflex-grow: 1;\n}\n</style>\n","import type { Item } from '@/components/formsExt/selector2/types';\nimport { ref, shallowRef } from 'vue';\n\nconst CACHE_KEY_PREFIX = 'ui_project_selector_total:';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n */\nexport const projectsCache = shallowRef<Item[]>();\nexport const resetStateSignal = ref(0);\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\nexport const setCache = (\n\tuserId: number,\n\tprojectsTotal: number,\n) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY_PREFIX + userId,\n\t\tJSON.stringify({ projectsTotal, expiresAt: Date.now() + CACHE_TTL }),\n\t);\n};\n\nexport const getCache = (userId: number) => {\n\tconst raw = localStorage.getItem(CACHE_KEY_PREFIX + 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_PREFIX + userId);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\nexport const clearCache = (userId: number, resetState: boolean = true) => {\n\tprojectsCache.value = undefined;\n\tlocalStorage.removeItem(CACHE_KEY_PREFIX + userId);\n\n\tif (resetState) resetStateSignal.value++;\n};\n","<script setup lang=\"ts\">\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { ref, computed, watch, onMounted } 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 Submenu from './submenu/submenu.vue';\nimport { navigateToProject, genProjectLink, genProjectExternalLink, apiSetSearchParamsFilter, genApiGetProjects, genApiAddProject } from './utils';\nimport { setCache, getCache, clearCache, resetStateSignal, projectsRequest, projectsCache } from './cache';\n\nconst i18n = useI18n();\n\nif (!window['mo']?.user?.id) {\n\tthrow new Error('TopProjectSelector: не удалось определить userId. Компонент требует авторизованного пользователя (см. window.mo.user.id)');\n}\n\n/**\n * Идентификатор пользователя\n */\nconst userId: number = window['mo'].user.id;\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddLinksToProjects: true,\n});\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({ default: { id: null, name: '' } });\n\nconst apiGet = genApiGetProjects(\n\tprops.client,\n\tuserId,\n);\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | null | undefined>(getCache(userId));\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\nconst placeholder = computed(() => {\n\treturn props.placeholder ?? i18n.Projects.Select_project;\n});\n\nconst itemsForSelector = computed(() => {\n\tif (!projectsCache.value || !props.excludeProjectId) return projectsCache.value;\n\n\treturn projectsCache.value.filter((project) => project.id !== props.excludeProjectId);\n});\n\n/**\n * Источник данных для списка проектов:\n * - `static` — список проектов передан через props\n * - `api` — список загружается через HTTP (API)\n *\n * Выбор режима: `static`, если projectsTotal < PROJECTS_TOTAL_THRESHOLD, иначе `api`\n */\nconst dataSource = computed(() => {\n\tif (!projectsTotal.value && projectsTotal.value !== 0) return;\n\n\treturn projectsTotal.value < PROJECTS_TOTAL_THRESHOLD ? 'static' : 'api';\n});\n\nwatch(resetStateSignal, () => {\n\tresetState();\n});\n\nwatch(model, () => {\n\tif (!model.value.id || !props.addLinksToProjects) return;\n\n\tnavigateToProject(genProjectLink(model.value.id));\n});\n\nconst loadProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tconst api = genApiGetProjects(\n\t\t\tprops.client,\n\t\t\tuserId,\n\t\t\t{ limit: PROJECTS_TOTAL_THRESHOLD },\n\t\t);\n\n\t\tprojectsRequest.value = api.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tif (res.errors) {\n\t\tprojectsRequest.value = null;\n\n\t\treturn;\n\t}\n\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (projectsTotal.value) return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsTotal.value = res.total;\n\tif (dataSource.value === 'static' && !projectsCache.value) projectsCache.value = res.result as Item[];\n\n\tif (projectsTotal.value) setCache(userId, projectsTotal.value);\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (project: Item) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: project.name,\n\t\tname: project.name,\n\t}).call();\n\tif (res.errors) return;\n\n\tif (projectsCache.value && dataSource.value === 'static') {\n\t\tconst newProject = {\n\t\t\tid: Number(res.result),\n\t\t\tuser_id: userId,\n\t\t\tname: project.name,\n\t\t\turl: project.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\n\t\t\tlistItemProps: {\n\t\t\t\tattrs: { title: project.name },\n\t\t\t},\n\t\t};\n\n\t\tconst firstManualUpdateProjectIndex = projectsCache.value.findIndex((project) => project.on === 0);\n\t\tprojectsCache.value = [\n\t\t\t...projectsCache.value.slice(0, firstManualUpdateProjectIndex),\n\t\t\tnewProject,\n\t\t\t...projectsCache.value.slice(firstManualUpdateProjectIndex),\n\t\t];\n\n\t\tif (projectsTotal.value) {\n\t\t\tprojectsTotal.value += 1;\n\t\t\tsetCache(userId, projectsTotal.value);\n\t\t}\n\t}\n\n\tif (dataSource.value === 'api') clearCache(userId);\n};\n\n/**\n * Сброс локального состояния и кеша api\n */\nconst resetState = () => {\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n * Только при `dataSource` = `static`\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (projectsCache.value || dataSource.value !== 'static') return;\n\n\tconst res = await loadProjects();\n\tif (!res) return;\n\n\tprojectsCache.value = res.result as Item[];\n};\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\tv-model=\"model\"\n\t\t:items=\"itemsForSelector\"\n\t\t:title=\"$i18n.Projects.Search_projects\"\n\t\t:modificator\n\t\t:searchFields=\"['id', 'name', 'url']\"\n\t\t:placeholder\n\t\thasCloserBtn\n\t\t:api=\"dataSource === 'api' ? apiGet : undefined\"\n\t\t:apiSetSearchParams=\"dataSource === 'api' ? (...args) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps\n\t\t:openerShortcut\n\t\t@appendItem=\"addProject\"\n\t\t@open=\"onOpen\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-projectSelector_item\">\n\t\t\t\t<div class=\"top-projectSelector_itemText\">\n\t\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\t\t\t\t\t\t<span class=\"top-comment\">\n\t\t\t\t\t\t\tid {{ item.id }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{{ item.name }}\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"addLinksToProjects\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t\t:href=\"genProjectLink(item.id)\"\n\t\t\t\t\t\t@click.prevent.stop=\"navigateToProject(genProjectLink(item.id!), $event)\"\n\t\t\t\t\t></a>\n\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t\tclass=\"top-projectSelector_itemExtLink\"\n\t\t\t\t\t\t:href=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click.stop\n\t\t\t\t\t></TopButton>\n\n\t\t\t\t\t<Submenu\n\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t:right=\"item.right ?? undefined\"\n\t\t\t\t\t\t:url=\"genProjectExternalLink(item.url)\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\n}\n\n.top-projectSelector_item {\n\t--top-icon-size: 14px;\n\n\tdisplay: flex;\n\tflex-grow: 1;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemLink {\n\tposition: absolute;\n\tinset: 0;\n}\n\n.top-projectSelector_itemText {\n\tflex-grow: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_itemExtLink,\n.top-projectSelector_item [class*=\"opener\"] {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-popup_listItem:hover .top-projectSelector_item > *,\n.top-popup_listItem.top-active .top-projectSelector_item > * {\n\topacity: 1;\n}\n\n@media screen and (min-width: 900px) {\n\t/* Ограничиваем стандартную высоту popup */\n\t.top-projectSelector.p3 div.top-popup {\n\t\tmax-height: min(calc(var(--top-popup-bottom) - 16px), 800px);\n\t}\n}\n\n@media screen and (max-width: 900px) {\n\t.top-projectSelector_item [class*=\"opener\"] {\n\t\topacity: 1;\n\t}\n}\n</style>\n","import type { Props as TagSelectorOpenerProps } from '../popupOpener/types';\nimport type { Tag, TagIdExclude } from '../types';\n\n/**\n * Полуичить значение исключения тега tagId\n */\nexport const genTagIdExcluded = (tagId: Tag['id']): TagIdExclude => {\n\treturn '-' + tagId as TagIdExclude;\n};\n\n/**\n * Вернуть чистый tagId без exclude флага\n */\nexport const genTagIdClear = (tagId: Tag['id'] | TagIdExclude) => {\n\tif (tagId[0] === '-') return tagId.substring(1) as Tag['id'];\n\n\treturn tagId as Tag['id'];\n};\n\n/**\n * Получить инфомрацию о теге по его id\n */\nexport const getTagById = (tagId: Tag['id'] | TagIdExclude, tags: TagSelectorOpenerProps['tags']) => {\n\ttagId = genTagIdClear(tagId);\n\n\tconst tag = tags.find(tag => tag.id === tagId);\n\tif (!tag) return;\n\n\treturn tag;\n};\n","import { isRef, type Ref, ref, unref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport TopPopupWorker from '@/components/popup/lib/worker';\nimport type { OpenerProps as PopupOpenerProps } from '@/components/popup/popup/opener/types';\nimport type { Props as TagSelectorOpenerProps, TagSelectorTarget } from '../popupOpener/types';\nimport type { Props as TagIconProps } from '../tagIcon/types';\nimport { genTagIdClear, getTagById } from './utils';\n\n/**\n * Сгенерировать элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelectorPopupOpener для работы вне vue\n *\n * Требует монтирования компонента TopTagSelector\n */\nexport const genElPopupOpener = (\n\tprops: TagSelectorOpenerProps & { modelValue: TagSelectorOpenerProps['modelValue'] | Ref<TagSelectorOpenerProps['modelValue']> },\n\tpropsPopup?: Partial<PopupOpenerProps>,\n\thtmlSetterSeveral?: string,\n): HTMLElement => {\n\tif (!propsPopup) propsPopup = { id: props.id };\n\n\t// Значения по умолчанию см. в: `@/components/popup/popup/opener/opener.vue`\n\tpropsPopup.id = props.id;\n\tpropsPopup.pos ??= '3';\n\tpropsPopup.notch ??= true;\n\tpropsPopup.posBy ??= 'fixed';\n\n\tconst el = TopPopupWorker.genElPopupOpener('div', propsPopup as PopupOpenerProps);\n\n\tel.classList.add('top-tagSelector');\n\tif (props.useTopButton) el.classList.add('top-tagSelector-useTopButton', 'top-button', 'top-color_theme', 'top-as-selector');\n\tif (!props.useTopButton) el.classList.add('top-tagSelector-custom');\n\tif (props.mode === 'filter') el.classList.add('top-tagSelector-filter');\n\tif (props.mode === 'setter' && !props.filters) el.classList.add('top-tagSelector-setter_single');\n\tif (props.mode === 'setter' && props.filters) el.classList.add('top-tagSelector-setter_several');\n\n\t// прокcи клик: lazy connect\n\tel.onclick = (e) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tel.onclick = null;\n\n\t\tconst model = ref(props.modelValue);\n\n\t\tconst target: TagSelectorTarget = {\n\t\t\tmodel,\n\t\t\tmode: props.mode,\n\t\t\ttargetId: props.targetId,\n\t\t\tfilters: props.filters,\n\t\t\tpayload: props.payload,\n\t\t};\n\n\t\tstorage(el, 'topTagSelectorTarget', target);\n\n\t\tdelete el.dataset.topPopupDisabled;\n\n\t\tif (!isRef(props.modelValue)) {\n\t\t\twatch(model, () => {\n\t\t\t\tprops.modelValue = model.value;\n\n\t\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t\t});\n\t\t}\n\n\t\t// выполнение клика\n\t\tel.click();\n\t};\n\n\tif (isRef(props.modelValue)) {\n\t\twatch(props.modelValue, () => elPopupOpenerRender(el, props, htmlSetterSeveral));\n\t} else {\n\t\tstorage(el, 'topTagSelectorRender', (modelValue: TagSelectorOpenerProps['modelValue']) => {\n\t\t\tprops.modelValue = modelValue;\n\n\t\t\tconst target = storage(el, 'topTagSelectorTarget');\n\t\t\tif (target) target.model.value = modelValue;\n\n\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t});\n\t}\n\n\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\n\treturn el;\n};\n\n/**\n * Вызвать перерисовку элемента, который был создан через genElPopupOpener()\n *\n * Работет только для элементов не с реактивным modelValue\n */\nexport const renderElPopupOpener = (el: HTMLElement, modelValue: TagSelectorOpenerProps['modelValue']) => {\n\tstorage(el, 'topTagSelectorRender')?.(modelValue);\n};\n\n/**\n * Отрисовать TopTagSelecorPopupOpener\n */\nconst elPopupOpenerRender = (el, props: TagSelectorOpenerProps, htmlSetterSeveral?: string) => {\n\tconst tagsIds = unref(props.modelValue);\n\n\tel.classList.toggle('top-tagSelector-selectedOne', !tagsIds.length || tagsIds.length === 1);\n\tel.classList.toggle('top-tagSelector-toTwoLine', tagsIds.length > 5);\n\n\tif (props.mode === 'setter' && props.filters) {\n\t\tel.innerHTML = `<div>${htmlSetterSeveral}</div>`;\n\n\t\treturn;\n\t}\n\n\tel.innerHTML = '';\n\n\tif (!tagsIds.length && props.mode === 'filter') {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: 'all',\n\t\t\tcolorId: '',\n\t\t\tname: useI18n().Common?.All_tags ?? '',\n\t\t\tstate: '',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t}\n\n\ttagsIds.forEach(tagId => {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: genTagIdClear(tagId),\n\t\t\tcolorId: getTagById(tagId, props.tags)?.color_id ?? '',\n\t\t\tname: getTagById(tagId, props.tags)?.name ?? '',\n\t\t\tstate: genTagIdClear(tagId) === tagId ? 'selected' : 'excluded',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t});\n};\n\n/**\n * Сгенерировтаь элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelecorTagIcon для работы вне vue\n */\nconst genElTagIcon = (props: TagIconProps) => {\n\tconst el = document.createElement('div');\n\n\tel.classList.add('top-tagSelector_tagIcon');\n\tel.classList.toggle('top-tagSelector-active', !!props.state);\n\tel.classList.toggle('top-tagSelector-excluded', props.state === 'excluded');\n\n\tel.dataset.tag_id = props.id;\n\tel.dataset.tag_color_id = props.colorId;\n\tel.title = props.name;\n\n\treturn el;\n};\n","import type { Tag } from './types';\n\nexport default [\n\t{\n\t\tid: '1',\n\t\tname: 'Without Tag',\n\t\tcolor_id: '1',\n\t},\n\t{\n\t\tid: '2',\n\t\tname: 'Red',\n\t\tcolor_id: '2',\n\t},\n\t{\n\t\tid: '3',\n\t\tname: 'Orange',\n\t\tcolor_id: '3',\n\t},\n\t{\n\t\tid: '4',\n\t\tname: 'Yellow',\n\t\tcolor_id: '4',\n\t},\n\t{\n\t\tid: '5',\n\t\tname: 'Blue',\n\t\tcolor_id: '5',\n\t},\n\t{\n\t\tid: '6',\n\t\tname: 'Purple',\n\t\tcolor_id: '6',\n\t},\n\t{\n\t\tid: '7',\n\t\tname: 'Green',\n\t\tcolor_id: '7',\n\t},\n\t{\n\t\tid: '8',\n\t\tname: 'Magenta',\n\t\tcolor_id: '8',\n\t},\n\t{\n\t\tid: '9',\n\t\tname: 'Dark blue',\n\t\tcolor_id: '9',\n\t},\n\t{\n\t\tid: '10',\n\t\tname: 'Turquoise',\n\t\tcolor_id: '10',\n\t},\n] as Tag[];\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\ndefineProps<Props>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagIcon': true,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded',\n\t\t}\"\n\t\t:data-tag_id=\"id\"\n\t\t:data-tag_color_id=\"colorId\"\n\t\t:title=\"name\"\n\t></div>\n</template>\n\n<style>\n[data-tag_id] { display: inline-flex; gap: var(--top-gap-2); align-items: center; }\n\n[data-tag_id=\"\"] { border-color: #bdc3c7 !important; color: #55555F !important; }\n[data-tag_color_id=\"1\"] { border-color: var(--color-tag-1) !important; color: #55555F !important; }\n[data-tag_color_id=\"2\"] { border-color: var(--color-tag-2) !important; color: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"] { border-color: var(--color-tag-3) !important; color: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"] { border-color: var(--color-tag-4) !important; color: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"] { border-color: var(--color-tag-5) !important; color: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"] { border-color: var(--color-tag-6) !important; color: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"] { border-color: var(--color-tag-7) !important; color: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"] { border-color: var(--color-tag-8) !important; color: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"] { border-color: var(--color-tag-9) !important; color: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"] { border-color: var(--color-tag-10) !important; color: var(--color-tag-10) !important; }\n\n[data-tag_id=\"\"].top-tagSelector-active { background: #bdc3c7 !important; }\n[data-tag_color_id=\"1\"].top-tagSelector-active { background: var(--color-tag-1) !important; }\n[data-tag_color_id=\"2\"].top-tagSelector-active { background: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"].top-tagSelector-active { background: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"].top-tagSelector-active { background: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"].top-tagSelector-active { background: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"].top-tagSelector-active { background: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"].top-tagSelector-active { background: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"].top-tagSelector-active { background: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"].top-tagSelector-active { background: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"].top-tagSelector-active { background: var(--color-tag-10) !important; }\n\n[data-tag_id=\"all\"] {\n\tborder-color: transparent !important; background: none !important;\n}\n\n[data-tag_id=\"all\"]:before {\n\tcontent: \"\";\n\tcolor: var(--color-tag-all) !important;\n\tfont-size: 26px;\n\tmin-width: calc(100% + 4px);\n\theight: calc(100% + 4px);\n\tmargin-top: -18px;\n\tmargin-left: -8px;\n}\n\n/* в кнопке выбора тэгов и в popup */\n.top-tagSelector-useTopButton [data-tag_id],\n.top-tagSelector_popup [data-tag_id] {\n\t--top-tag-selector-size: 10px;\n\n\tbox-sizing: content-box;\n\tborder-radius: 100%; border: 2px solid var(--color-layout-front-1); background: var(--color-layout-front-1);\n\twidth: var(--top-tag-selector-size);\n\theight: var(--top-tag-selector-size);\n\tfont-size: calc(var(--top-tag-selector-size) + 4px);\n\t/*font-family: inherit !important;*/\n}\n\n/* исключение тегов */\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],\n[data-tag_id].top-tagSelector-excluded { position: relative; }\n\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,\n[data-tag_id].top-tagSelector-excluded:before {\n\tcontent: \"\";\n\twidth: calc(var(--top-tag-selector-size) * 2); height: 1px; background: inherit;\n\ttransform: rotate(-45deg); filter: brightness(80%);\n\tdisplay: block;\n\tposition: absolute; top: calc(var(--top-tag-selector-size) / 2); left: calc(0px - var(--top-tag-selector-size) / 2);\n}\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=\"all\"]):not(.top-tagSelector-active):before { background: #AAA; }\n[data-tag_id].top-tagSelector-excluded:after,\n[data-tag_id].top-tagSelector-excluded ~ .top-tagSelector_tagListItemName { text-decoration: line-through; }\n\n/* popup */\n.top-popup_listItem.top-tagSelector-active { background: var(--top-popup-background-color-active) !important; }\n\n.top-popup_listItem:hover [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-hover); }\n.top-popup_listItem.top-tagSelector-active [data-tag_id=\"all\"]:before,\n.top-popup_listItem.top-active [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-active); }\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\nimport TopPopupListItem from '@/components/popup/popup/listItem.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst name = defineModel<Props['name']>('name', {\n\trequired: true,\n});\n\nconst elName = ref<HTMLElement | null>(null);\n\n/**\n * @todo Удалить через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n */\nconst firefoxProps = computed(() => {\n\tif (navigator.userAgent.indexOf('Firefox') != -1) {\n\n\t\treturn {\n\t\t\tcontenteditable: inEdit.value,\n\t\t\tonpaste: (event: Event) => event.preventDefault(),\n\t\t};\n\t}\n\n\treturn {};\n});\n\n/**\n * Включен режим редактирвоания\n */\nconst inEdit = ref(false);\n\n/**\n * Включить режим редактирование\n */\nconst turnToEdit = async () => {\n\tinEdit.value = true;\n\n\tawait nextTick();\n\n\telName.value?.focus();\n};\n\n/**\n * Применить редактирование\n */\nconst editCommit = () => {\n\tconst name = elName.value?.innerText;\n\tif (!name) return editCancel();\n\n\tif (elName.value) elName.value.innerText = name;\n\n\tinEdit.value = false;\n\n\temit('update:name', name);\n};\n\n/**\n * Отменить редактирование\n */\nconst editCancel = async () => {\n\tif (elName.value) elName.value.innerText = props.name;\n\n\tinEdit.value = false;\n};\n\n/**\n * Применить выбор\n */\nconst changeSelect = (e: MouseEvent) => {\n\t// в режиме редактирования выбор не применяется\n\tif (inEdit.value) return;\n\n\t// тег запрещено выбирать\n\tif (props.disabled) return;\n\n\tlet toState: Props['state'] = 'selected';\n\n\tif (props.canExclude) {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\ttoState = 'excluded';\n\t\t}\n\t}\n\n\tif (props.state == toState) {\n\t\ttoState = '';\n\t}\n\n\tif (toState === '') emit('unselect');\n\tif (toState === 'selected') emit('select');\n\tif (toState === 'excluded') emit('exclude');\n};\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagListItem': true,\n\t\t\t'top-tagSelector_tagListItem-inEdit': inEdit,\n\t\t\t'top-tagSelector_tagListItem-disabled': disabled,\n\t\t\t'top-tagSelector_tagListItem-canExclude': canExclude,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded'\n\t\t}\"\n\t\t@click.stop=\"changeSelect\"\n\t>\n\t\t<TopTagIcon\n\t\t\t:id\n\t\t\t:name\n\t\t\t:colorId\n\t\t\t:state\n\t\t/>\n\n\t\t<span\n\t\t\tref=\"elName\"\n\t\t\tclass=\"top-tagSelector_tagListItemName\"\n\t\t\t:contenteditable=\"inEdit ? 'plaintext-only' : false\"\n\t\t\t:=\"firefoxProps\"\n\t\t\t@keydown.enter.stop=\"editCommit\"\n\t\t\t@keydown.esc.stop=\"editCancel\"\n\t\t>\n\t\t\t{{ name }}\n\t\t</span>\n\n\t\t<template v-if=\"editable\">\n\t\t\t<span\n\t\t\t\tv-if=\"!inEdit\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click=\"turnToEdit\"\n\t\t\t></span>\n\n\t\t\t<span\n\t\t\t\tv-else\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click.stop=\"editCommit\"\n\t\t\t></span>\n\t\t</template>\n\t</TopPopupListItem>\n</template>\n\n<style>\n.top-tagSelector_tagListItem.top-popup_listItem {\n\tpadding-top: var(--top-padding-2) !important;\n\tpadding-bottom: var(--top-padding-2) !important;\n\tgap: 10px;\n}\n\n.top-tagSelector_tagListItemName {\n\tborder-radius: var(--top-radius-1);\n\twidth: 120px;\n\tpadding: 4px 2px;\n\tmargin: -4px -2px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tflex-grow: 1;\n}\n\n/* редактирование */\n.top-tagSelector_edit {\n\t--top-icon-size: 18px;\n\t--top-icon-color: var(--color-text-3);\n\n\twidth: 20px;\n\tflex-grow: 0;\n}\n\n.top-tagSelector_edit:before {\n\tline-height: 0;\n}\n\n.top-tagSelector_edit { opacity: 0; }\n.top-tagSelector_edit:hover {\n\t--top-icon-color: var(--color-text-primary);\n}\n\n.top-tagSelector_tagListItem:hover .top-tagSelector_edit,\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit {\n\tcursor: pointer;\n\topacity: 1;\n}\n\n.top-tagSelector_tagListItem-inEdit {\n\tbackground: var(--color-layout-front-3) !important;\n\toutline: 1px dashed var(--color-line-2);\n\toutline-offset: -1px;\n}\n\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName {\n\tcursor: text;\n\tbackground: var(--color-layout-front-1);\n}\n\n/* disabled */\n.top-tagSelector_tagListItem-disabled {\n\tcursor: not-allowed !important;\n\topacity: 0.85;\n}\n.top-tagSelector_tagListItem-disabled:hover {\n\tbackground: inherit;\n}\n.top-tagSelector_tagListItem-disabled [data-tag_id] {\n\topacity: 0.6;\n}\n</style>\n","top-forms-focusable top-size_s top-button-withoutText top-tagSelector-useTopButton\n\n<script setup lang=\"ts\">\nimport type { Props, TagSelectorTarget } from './types';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport { genTagIdClear, getTagById } from '../utils/utils';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<Props>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst component = props.useTopButton ? TopButton : 'div';\nconst componentSlotName = props.useTopButton ? 'html' : 'default';\n\nconst topTagSelectorTarget: TagSelectorTarget = {\n\tmodel,\n\tmode: props.mode,\n\ttargetId: props.targetId,\n\tfilters: props.filters,\n\tpayload: props.payload,\n};\n</script>\n\n<template>\n\t<TopPopupOpener :id>\n\t\t<component\n\t\t\t:is=\"component\"\n\t\t\t:class=\"{\n\t\t\t\t'top-tagSelector': true,\n\t\t\t\t'top-tagSelector-useTopButton': props.useTopButton,\n\t\t\t\t'top-tagSelector-custom': !props.useTopButton,\n\t\t\t\t'top-as-selector': props.useTopButton,\n\t\t\t\t'top-tagSelector-filter': props.mode === 'filter',\n\t\t\t\t'top-tagSelector-setter_single': props.mode === 'setter' && !filters,\n\t\t\t\t'top-tagSelector-setter_several': props.mode === 'setter' && filters,\n\t\t\t\t'top-tagSelector-selectedOne': !model.length || model.length === 1,\n\t\t\t\t'top-tagSelector-toTwoLine': model.length > 5,\n\t\t\t}\"\n\t\t\tcolor=\"theme\"\n\t\t\t:styling\n\t\t\tv-top-data:topTagSelectorTarget=\"topTagSelectorTarget\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<template #[componentSlotName]>\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-if=\"!model.length && mode === 'filter'\"\n\t\t\t\t\tid=\"all\"\n\t\t\t\t\tcolorId=\"\"\n\t\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t\tstate=\"\"\n\t\t\t\t/>\n\n\t\t\t\t<!-- Массовое редактирование -->\n\t\t\t\t<div v-if=\"mode === 'setter' && filters\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Список тегов -->\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-else\n\t\t\t\t\tv-for=\"tagId in model\"\n\t\t\t\t\t:id=\"genTagIdClear(tagId)\"\n\t\t\t\t\t:colorId=\"getTagById(tagId, tags)?.color_id ?? ''\"\n\t\t\t\t\t:name=\"getTagById(tagId, tags)?.name ?? ''\"\n\t\t\t\t\t:state=\"genTagIdClear(tagId) === tagId ? 'selected' : 'excluded'\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</component>\n\t</TopPopupOpener>\n</template>\n\n<style>\n.top-tagSelector {\n\tcursor: pointer;\n\tmin-width: 0;\n\twhite-space: nowrap;\n\tjustify-content: left;\n}\n\n.top-tagSelector-useTopButton {\n\twidth: 112px;\n\tgap: var(--top-gap-1);\n\tvertical-align: middle;\n}\n\n.top-tagSelector.top-button.top-as-selector {\n\twidth: calc(112px + 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\">\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 */\nlet 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"]}
|