PageSourceSearch

https://yadoma.pro/assets/page-DSmFveQ4.js

js yadoma.pro collected 2026-10-05 00:15:46 UTC 13,993 bytes, 1 lines download raw bytes

1import{$ as pe,u as me,d as f,r as p,w as ge,x as u,y as i,a5 as w,I,z as t,R as s,F as T,E as G,at as a,J as U,G as r,H as o,as as P}from"./vendor-core-BGHbtoTu.js";import{B as fe}from"./app-foundation-B-z2ytBD.js";import{ae as be,$ as ye,ao as J,M as W,Q as D,S as Q,V as ke,O as F}from"./main-C6nj-lFV.js";import{_ as _e}from"./vendor-media-Bt4sEGo_.js";import{_ as he}from"./empty-placeholder.vue_vue_type_script_setup_true_lang-C3OO2Wbn.js";import{_ as X}from"./index.vue_vue_type_script_setup_true_lang-BaHmbXSP.js";import{c as Y}from"./clipboard-DMblfw5J.js";import{u as we,a as Ie,b as Ce,c as xe,d as $e,e as Ve}from"./index-D5GpBpz_.js";import{u as Be}from"./index-DvmQ05is.js";import"./index-Cp2fT9hK.js";import"./vendor-ui-CFdeOrdc.js";import"./vendor-validation-Ccex1DH0.js";import"./web-access-pwa-CF464Anl.js";import"./trigger.vue_vue_type_script_setup_true_lang-DZNU0Bh3.js";import"./tappable-Bclnai5p.js";import"./no-translate.vue_vue_type_script_setup_true_lang-BF-YgGNd.js";import"./dropdown.utils-BfjxPUyD.js";import"./dropdown.composables-LNa5rIRr.js";const Se={class:"bothelp-page"},Ue={key:0,class:"settings-stack"},Ae={key:1,class:"settings-list"},Ee=["onClick"],Le={class:"settings-row__content"},Me={class:"settings-row__after"},Ne={key:2,class:"list-empty"},Pe=["disabled"],Qe={class:"settings-row__content"},Re={class:"journal-summary"},Te={class:"summary-card"},We={class:"summary-card success"},De={class:"summary-card pending"},Fe={class:"section-heading journal-heading"},He={key:1,class:"event-list"},qe={class:"event-card__head"},Ke={class:"event-card__identity"},Oe={key:0},ze={key:1},je={class:"event-card__details"},Ze={key:0,class:"event-error"},Ge={class:"event-card__foot"},Je={class:"modal-fields"},Xe={key:0,class:"form-error"},Ye={class:"modal-fields"},et=["disabled"],tt={class:"integration-sheet"},lt={class:"integration-sheet__status"},nt={class:"webhook-field"},st={class:"webhook-field__value"},at=["disabled"],it=pe({__name:"page",setup(ot){const ee=me(),C=f(()=>{const n=Number(ee.query.entitlementId);return Number.isInteger(n)&&n>0?n:void 0}),H=we(),A=Ie(()=>C.value),x=Ce(()=>C.value),q=Be(),K=xe(),O=$e(),$=Ve(),{notify:m}=be(),E=p("integrations"),_=p(""),b=p(null),c=p(null),L=p(""),V=p(""),y=p(!1),k=p(!1),M=p(null);fe({activeTab:E,tabs:[{value:"integrations",label:"Интеграции"},{value:"events",label:"Журнал"}]});const g=f(()=>(H.data.value??[]).filter(n=>!C.value||n.entitlementId===C.value)),R=f(()=>A.data.value??[]),z=f(()=>_.value.trim().length>0&&b.value!=null),te=f(()=>(q.data.value??[]).map(n=>({value:n.id,label:n.label||n.key}))),le=f(()=>g.value.map(n=>({value:n.id,label:`${n.name}
1 · ${n.entitlementLabel||n.entitlementKey}`}))),d=f(()=>g.value.find(n=>n.id===M.value)??null),j=f({get:()=>d.value!==null,set:n=>{n||(M.value=null)}}),ne={granted:"Выдано",pending:"Ожидает входа",duplicate:"Повтор",error:"Ошибка"};function se(n){return{granted:"success",pending:"pending",duplicate:"neutral",error:"error"}[n]}function ae(){_.value="",b.value=C.value??null,V.value="",y.value=!0}function ie(){var n;c.value=g.value.length===1?((n=g.value[0])==null?void 0:n.id)??null:null,L.value="",k.value=!0}const Z=ye({text:"Добавить webhook",show:!1,handler:ae});ge(E,n=>{n==="integrations"?Z.show():Z.hide()},{immediate:!0});async function oe(){if(!(!z.value||b.value==null)){V.value="";try{const n=await K.mutateAsync({name:_.value.trim(),entitlementId:b.value});_.value="",b.value=null,c.value=n.id,y.value=!1;const e=await Y(n.webhookUrl);m({title:e?"Интеграция создана, URL скопирован":"Интеграция создана",badge:{text:"Готово",icon:"i-lucide-check"}})}catch(n){console.error("[bothelp-entitlements] integration creation failed",{cause:n}),V.value="Не удалось создать интеграцию. Проверьте поля и попробуйте ещё раз."}}}async function ue(n){const e=await Y(n.webhookUrl);m({title:e?"Webhook URL скопирован":"Не удалось скопировать URL",badge:e?{text:"Готово",icon:"i-lucide-check"}:{text:"Ошибка",icon:"i-lucide-x"}})}async function re(n){try{await O.mutateAsync({id:n.id,isActive:!n.isActive}),m({title:n.isActive?"Интеграция отключена":"Интеграция включена",badge:{text:"Готово",icon:"i-lucide-check"}})}catch(e){console.error("[bothelp-entitlements] integration status update failed",{cause:e,integrationId:n.id}),m({title:"Не удалось изменить статус",badge:{text:"Ошибка",icon:"i-lucide-x"}})}}function de(n){return new Intl.DateTimeFormat("ru-RU",{dateStyle:"short",timeStyle:"short"}).format(new Date(n))}async function ce(n){var B,S;const e=n.target,v=(B=e.files)==null?void 0:B[0];if(L.value=(v==null?void 0:v.name)??"",!(!v||c.value==null))try{const h=await v.text(),l=[...new Set(((S=h.match(/[\w.%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi))==null?void 0:S.map(ve=>ve.toLowerCase()))??[])];if(!l.length){m({title:"В файле не найдены email",badge:{text:"Ошибка",icon:"i-lucide-x"}});return}if(l.length>5e3){m({title:"В одном файле можно загрузить до 5000 email",badge:{text:"Ошибка",icon:"i-lucide-x"}});return}const N=await $.mutateAsync({id:c.value,emails:l,fileName:v.name});m({title:`Обработано ${N.total}: выдано ${N.granted??0}, ожидают ${N.pending??0}`,badge:{text:"Импорт завершён",icon:"i-lucide-check"}}),k.value=!1,E.value="events"}catch(h){console.error("[bothelp-entitlements] CSV backfill failed",{cause:h,integrationId:c.value}),m({title:"Не удалось импортировать файл",badge:{text:"Ошибка",icon:"i-lucide-x"}})}finally{e.value="",L.value=""}}return(n,e)=>{var v,B,S,h;return i(),u("div",Se,[E.value==="integrations"?(i(),u("div",Ue,[t("section",null,[e[17]||(e[17]=t("h2",{class:"settings-label"}," Webhook-интеграции ",-1)),s(H).isPending.value?(i(),w(s(J),{key:0,class:"mt-6"})):g.value.length?(i(),u("div",Ae,[(i(!0),u(T,null,G(g.value,l=>(i(),u("button",{key:l.id,type:"button",class:"settings-row",onClick:N=>M.value=l.id},[e[15]||(e[15]=t("span",{class:"settings-row__icon i-lucide-webhook"},null,-1)),t("span",Le,[t("strong",null,a(l.name),1),t("small",null,a(l.entitlementLabel||l.entitlementKe
1y),1)]),t("span",Me,[t("span",{class:U(["status-dot",l.isActive?"active":"inactive"])},null,2),e[14]||(e[14]=t("span",{class:"settings-row__chevron i-lucide-chevron-right"},null,-1))])],8,Ee))),128))])):(i(),u("div",Ne,e[16]||(e[16]=[t("span",{class:"settings-row__icon i-lucide-webhook"},null,-1),t("span",null,[t("strong",null,"Webhook пока нет"),t("small",null,"Добавьте первый кнопкой внизу экрана")],-1)])))]),t("section",null,[e[21]||(e[21]=t("h2",{class:"settings-label"}," Ранее загруженные участники ",-1)),t("button",{type:"button",class:"settings-row",disabled:!g.value.length,onClick:ie},[e[19]||(e[19]=t("span",{class:"settings-row__icon i-lucide-file-spreadsheet"},null,-1)),t("span",Qe,[e[18]||(e[18]=t("strong",null,"Импорт из CSV",-1)),t("small",null,a(g.value.length?"Загрузить уже записавшихся":"Сначала добавьте webhook"),1)]),e[20]||(e[20]=t("span",{class:"settings-row__chevron i-lucide-chevron-right"},null,-1))],8,Pe)]),e[22]||(e[22]=t("section",null,[t("h2",{class:"settings-label"}," Начисление доступа "),t("div",{class:"info-row"},[t("span",{class:"settings-row__icon i-lucide-at-sign"}),t("span",null,[t("strong",null,"По email пользователя"),t("small",null,"Опция выдаётся сразу или после идентификации в приложении.")])])],-1))])):(i(),u(T,{key:1},[t("div",Re,[t("div",Te,[e[23]||(e[23]=t("span",null,"Всего",-1)),t("strong",null,a(((v=s(x).data.value)==null?void 0:v.total)??0),1)]),t("div",We,[e[24]||(e[24]=t("span",null,"Выдано",-1)),t("strong",null,a(((B=s(x).data.value)==null?void 0:B.granted)??0),1)]),t("div",De,[e[25]||(e[25]=t("span",null,"Ожидают",-1)),t("strong",null,a(((S=s(x).data.value)==null?void 0:S.pending)??0),1)])]),t("div",Fe,[t("div",null,[e[26]||(e[26]=t("h2",null,"Начисления опций",-1)),t("p",null,"Последние "+a(R.value.length)+" событий из "+a(((h=s(x).data.value)==null?void 0:h.total)??0),1)]),r(s(W),{size:"sm",variant:"secondary","before-icon":"i-lucide-refresh-cw",loading:s(A).isFetching.value,onClick:e[0]||(e[0]=l=>{s(A).refetch(),s(x).refetch()})},{default:o(()=>e[27]||(e[27]=[P(" Обновить ")])),_:1},8,["loading"])]),s(A).isPending.value?(i(),w(s(J),{key:0,class:"mt-6"})):R.value.length?(i(),u("div",He,[(i(!0),u(T,null,G(R.value,l=>(i(),u("article",{key:l.id,class:"event-card"},[t("div",qe,[t("div",Ke,[e[28]||(e[28]=t("div",{class:"event-card__avatar i-lucide-user-round"},null,-1)),t("div",null,[t("h3",null,a(l.email||"Email не передан"),1),l.bothelpUserId?(i(),u("p",Oe," BotHelp ID: "+a(l.bothelpUserId),1)):l.userId?(i(),u("p",ze," Пользователь #"+a(l.userId),1)):I("",!0)])]),t("span",{class:U(["status-pill",se(l.status)])},a(ne[l.status]),3)]),t("div",je,[t("div",null,[e[29]||(e[29]=t("span",null,"Интеграция",-1)),t("strong",null,a(l.integrationName),1)]),t("div",null,[e[30]||(e[30]=t("span",null,"Опция",-1)),t("strong",null,a(l.entitlementLabel||l.entitlementKe
1y),1)])]),l.errorMessage?(i(),u("p",Ze,a(l.errorMessage),1)):I("",!0),t("div",Ge,a(de(l.createdAt)),1)]))),128))])):(i(),w(s(he),{key:2,icon:"i-lucide-list-checks",class:"empty-state"},{default:o(()=>e[31]||(e[31]=[P(" Событий пока нет ")])),_:1}))],64)),y.value?(i(),w(s(F),{key:2,open:y.value,"onUpdate:open":e[5]||(e[5]=l=>y.value=l)},{default:o(()=>[r(s(D),{title:"Новый webhook",description:"BotHelp будет выдавать выбранную опцию по email","navigation-icon":"back",onClose:e[4]||(e[4]=l=>y.value=!1)},{footer:o(()=>[r(s(W),{class:"sheet-primary","before-icon":"i-lucide-webhook",disabled:!z.value,loading:s(K).isPending.value,onClick:oe},{default:o(()=>e[32]||(e[32]=[P(" Создать webhook ")])),_:1},8,["disabled","loading"]),t("button",{type:"button",class:"sheet-secondary",onClick:e[3]||(e[3]=l=>y.value=!1)}," Отмена ")]),default:o(()=>[t("div",Je,[r(s(Q),{header:"Название",description:"Будет видно только администраторам",required:""},{default:o(()=>[r(s(ke),{modelValue:_.value,"onUpdate:modelValue":e[1]||(e[1]=l=>_.value=l),placeholder:"Например, Марафон август","before-icon":"i-lucide-tag"},null,8,["modelValue"])]),_:1}),r(s(Q),{header:"Опция доступа",description:"Откроет категории и материалы с этой опцией",required:""},{default:o(()=>[r(s(X),{modelValue:b.value,"onUpdate:modelValue":e[2]||(e[2]=l=>b.value=l),options:te.value,loading:s(q).isPending.value,placeholder:"Выберите опцию"},null,8,["modelValue","options","loading"])]),_:1}),V.value?(i(),u("p",Xe,a(V.value),1)):I("",!0)])]),_:1})]),_:1},8,["open"])):I("",!0),k.value?(i(),w(s(F),{key:3,open:k.value,"onUpdate:open":e[9]||(e[9]=l=>k.value=l)},{default:o(()=>[r(s(D),{title:"Импорт участников",description:"Загрузка email из CSV-файла BotHelp","navigation-icon":"back",onClose:e[8]||(e[8]=l=>k.value=!1)},{footer:o(()=>[t("button",{type:"button",class:"sheet-secondary neutral",onClick:e[7]||(e[7]=l=>k.value=!1)}," Закрыть ")]),default:o(()=>[t("div",Ye,[e[33]||(e[33]=t("div",{class:"import-hint"},[t("span",{class:"i-lucide-file-spreadsheet"}),t("p",null,"Email будут обработаны по тем же правилам, что и новые webhook.")],-1)),r(s(Q),{header:"Интеграция",required:""},{default:o(()=>[r(s(X),{modelValue:c.value,"onUpdate:modelValue":e[6]||(e[6]=l=>c.value=l),options:le.value,placeholder:"Выберите интеграцию"},null,8,["modelValue","options"])]),_:1}),t("label",{class:U(["file-picker",{disabled:c.value==null||s($).isPending.value}])},[t("span",{class:U(s($).isPending.value?"i-lucide-loader-2 animate-spin":"i-lucide-upload")},null,2),t("span",null,[t("strong",null,a(s($).isPending.value?"Обрабатываем файл…":"Выбрать CSV-файл"),1),t("small",null,a(L.value||"До 5000 email за одну загрузку"),1)]),t("input",{type:"file",accept:".csv,text/csv,text/plain",disabled:c.value==null||s($).isPending.value,onChange:ce},null,40,et)],2)])]),_:1})]),_:1},8,["open"])):I("",!0),d.value?(i(),w(s(F),{key:4,open:j.value,"onUpdate:open":e[13]||(e[13]=l=>j.value=l)},{default:o(()=>[r(s(D),{title:d.value.name,description:d.value.entitlementLabel||d.value.entitlementKe
1y,"navigation-icon":"back",onClose:e[12]||(e[12]=l=>M.value=null)},{footer:o(()=>[r(s(W),{class:"sheet-primary","before-icon":"i-lucide-copy",onClick:e[10]||(e[10]=l=>ue(d.value))},{default:o(()=>e[36]||(e[36]=[P(" Копировать URL ")])),_:1}),t("button",{type:"button",class:"sheet-secondary neutral",disabled:s(O).isPending.value,onClick:e[11]||(e[11]=l=>re(d.value))},a(d.value.isActive?"Отключить интеграцию":"Включить интеграцию"),9,at)]),default:o(()=>[t("div",tt,[t("div",lt,[e[34]||(e[34]=t("span",null,"Статус",-1)),t("span",{class:U(["status-pill",d.value.isActive?"success":"neutral"])},a(d.value.isActive?"Активна":"Отключена"),3)]),r(s(Q),{header:"Webhook URL",description:"Вставьте этот адрес в действие BotHelp"},{default:o(()=>[t("div",nt,[e[35]||(e[35]=t("span",{class:"i-lucide-link-2"},null,-1)),t("span",st,a(d.value.webhookUrl),1)])]),_:1})])]),_:1},8,["title","description"])]),_:1},8,["open"])):I("",!0)])}}}),$t=_e(it,[["__scopeId","data-v-53a60ad5"]]);export{$t as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.