PageSourceSearch

https://xn--90aihhxfgcgn.xn--p1ai/_nuxt/o8s15_KA.js

js xn--90aihhxfgcgn.xn--p1ai collected 2026-10-08 13:24:44 UTC 8,291 bytes, 1 lines download raw bytes

1import{d as it,x as lt,G as ut,i as ct,s as rt,c as l,a as s,t as c,u as a,g as y,n as F,A as L,H as dt,C as M,F as j,r as E,B as G,b as H,p as r,h as V,o as i,z as ft,f as vt,m as bt,_ as pt}from"./5dPafwDK.js";import{u as yt}from"./BhdTPa2K.js";const _t={class:"admin-page-head"},mt={class:"admin-page-head__row"},ht={class:"admin-page-head__lead"},gt={class:"admin-page-head__actions"},kt=["disabled"],Ct=["disabled"],St={class:"notif-filters card"},wt=["value"],xt={key:0,class:"admin-msg"},Dt={key:1,class:"notif-bulk card"},Ut={class:"notif-bulk__check"},$t=["checked"],Rt={key:2,class:"text-[var(--color-text-muted)]"},Ot={key:3,class:"notif-list"},qt={class:"notif-list__head"},Pt=["checked","onChange"],Tt={class:"notif-list__type"},Bt={class:"notif-list__time"},Ft={class:"notif-list__title"},Lt={key:0,class:"notif-list__body"},Mt={class:"notif-list__actions"},Vt=["onClick"],zt={key:4,class:"empty-state"},At={key:5,class:"admin-pager"},It=["disabled"],Nt=["disabled"],S=30,Ht=it({__name:"notifications",setup(jt){const h=lt(),Z=ut(),{staffFetch:R,token:z}=yt(),g=r([]),x=r(0),w=r(0),u=r(0),k=r(!1),f=r(""),_=r(""),m=r(""),D=r(""),v=r(new Set),O=r(!1),q=V(()=>v.value.size),P=V(()=>g.value.filter(t=>!t.read_at)),A=V(()=>{const t=P.value;return t.length?t.every(e=>v.value.has(e.id)):!1});function J(t){const e=new Set(v.value);e.has(t)?e.delete(t):e.add(t),v.value=e}function K(){const t=P.value;if(!t.length)return;const e=new Set(v.value);if(A.value)for(const o of t)e.delete(o.id);else for(const o of t)e.add(o.id);v.value=e}function C(){v.value=new Set}const U=r(!0),b=r(""),Q=[{value:"",label:"Все типы"},{value:"moderation",label:"moderation"},{value:"donation",label:"donation"},{value:"system",label:"system"}];function $(){const t={};k.value&&(t.unread="1"),f.value&&(t.type=f.value),_.value&&(t.from=_.value),m.value&&(t.to=m.value),D.value&&(t.id=D.value),Z.replace({query:t})}function T(t){const e=new Date,o=e.toISOString().slice(0,10);let n=o;if(t==="7d"){const p=new Date(e);p.setDate(p.getDate()-6),n=p.toISOString().slice(0,10)}else if(t==="30d"){const p=new Date(e);p.setDate(p.getDate()-29),n=p.toISOString().slice(0,10)}_.value=n,m.value=o,u.value=0,C(),d().then($)}function I(t,e=0){const o=new URLSearchParams({limit:String(t),offset:String(e)});return k.value&&o.set("unread","1"),f.value&&o.set("type",f.value),_.value&&o.set("from",_.value),m.value&&o.set("to",m.value),o}async function d(){U.value=!0,b.value="";try{const t=await R(`/api/v1/notifications?${I(S,u.value)}`);g.value=t.notifications??[],x.value=t.unread_count,w.value=t.total}catch{b.value="Ошибка загрузки",g.value=[]}finally{U.value=!1}}function W(t){f.value=t,u.value=0,C(),d().then($)}function N(t){k.value=t,u.value=0,C(),d().then($)}function X(){u.value=0,C(),d().then($)}function Y(){z.value&&fetch(`/api/v1/admin/notifications/export?${I(5e3)}`,{headers:{Authorization:`Bearer ${z.value}`}}).then(t=>t.blob()).then(t=>{const e=document.createElement("a"),o=URL.createObjectURL(t);e.href=o,e.setAttribute("download","notifications.csv"),e.click(),URL.revokeObjectURL(o)}).catch(()=>{b.value="Не удалось скачать CSV"})}function tt(){u.value=Math.max(0,u.value-S),d()}function et(){u.value+S<w.value&&(u.value+=S,d())}async function nt(t){D.value=t.id,$(),t.read_at||await B(t.id,!1)}async function B(t,e=!0){try{if(await R(`/api/v1/notifications/${t}/read`,{method:"POST"}),e)await d();else{const o=g.value.find(n=>n.id===t);o&&(o.read_at=new Date().toISOString()),x.value>0&&x.value--}}catch{b.value="Не удалось отметить прочитанным"}}async function at(){try{await R("/api/v1/notifications/read-all",{method:"POST"}),C(),await d()}catch{b.value="Не удалось отметить все"}}async function st(){if(v.value.size!==0){O.value=!0,b.value="";try{const t=await R("/api/v1/notifications/read-bulk",{method:"POST",body:{ids:[...v.value]}});b.value=`Прочитано: ${t.marked}`,C(),await d()}catch{b.value="Не удалось отметить выбранные"}finally{O.value=!1}}}
1function ot(t){try{return new Date(t).toLocaleString("ru-RU",{timeZone:"Europe/Moscow"})}catch{return t}}return ct(async()=>{h.query.unread==="1"&&(k.value=!0),typeof h.query.type=="string"&&(f.value=h.query.type),typeof h.query.from=="string"&&(_.value=h.query.from),typeof h.query.to=="string"&&(m.value=h.query.to);const t=h.query.id;if(typeof t=="string"&&t&&(D.value=t),await d(),typeof t=="string"&&t){const e=g.value.find(o=>o.id===t);e&&!e.read_at&&await B(t,!1)}}),rt({title:"Уведомления — Админка",robots:"noindex"}),(t,e)=>{const o=pt;return i(),l("div",null,[s("header",_t,[s("div",mt,[s("div",null,[e[10]||(e[10]=s("h1",{class:"admin-page-head__title"},"Уведомления",-1)),s("p",ht," Непрочитанных: "+c(a(x)),1)]),s("div",gt,[s("button",{type:"button",class:"btn btn--ghost btn--sm",onClick:Y},"CSV"),a(q)?(i(),l("button",{key:0,type:"button",class:"btn btn--ghost btn--sm",disabled:a(O),onClick:st}," Прочитать выбранные ("+c(a(q))+") ",9,kt)):y("",!0),a(x)?(i(),l("button",{key:1,type:"button",class:"btn btn--ghost btn--sm",onClick:at}," Прочитать все ")):y("",!0),s("button",{type:"button",class:"btn-primary btn--sm",disabled:a(U),onClick:d},c(a(U)?"…":"Обновить"),9,Ct)])])]),s("div",St,[s("button",{type:"button",class:F(["btn btn--sm",a(k)?"btn--ghost":"btn-primary"]),onClick:e[0]||(e[0]=n=>N(!1))}," Все ",2),s("button",{type:"button",class:F(["btn btn--sm",a(k)?"btn-primary":"btn--ghost"]),onClick:e[1]||(e[1]=n=>N(!0))}," Непрочитанные ",2),L(s("select",{"onUpdate:modelValue":e[2]||(e[2]=n=>M(f)?f.value=n:null),class:"notif-filters__type",onChange:e[3]||(e[3]=n=>W(a(f)))},[(i(),l(j,null,E(Q,n=>s("option",{key:n.value,value:n.value},c(n.label),9,wt)),64))],544),[[dt,a(f)]]),L(s("input",{"onUpdate:modelValue":e[4]||(e[4]=n=>M(_)?_.value=n:null),type:"date",class:"notif-filters__date",title:"С"},null,512),[[G,a(_)]]),L(s("input",{"onUpdate:modelValue":e[5]||(e[5]=n=>M(m)?m.value=n:null),type:"date",class:"notif-filters__date",title:"По"},null,512),[[G,a(m)]]),s("button",{type:"button",class:"btn btn--ghost btn--sm",onClick:e[6]||(e[6]=n=>T("today"))},"Сегодня"),s("button",{type:"button",class:"btn btn--ghost btn--sm",onClick:e[7]||(e[7]=n=>T("7d"))},"7д"),s("button",{type:"button",class:"btn btn--ghost btn--sm",onClick:e[8]||(e[8]=n=>T("30d"))},"30д"),s("button",{type:"button",class:"btn-primary btn--sm",onClick:X},"Найти")]),a(b)?(i(),l("p",xt,c(a(b)),1)):y("",!0),a(P).length?(i(),l("div",Dt,[s("label",Ut,[s("input",{type:"checkbox",checked:a(A),onChange:K},null,40,$t),e[11]||(e[11]=H(" Выбрать непрочитанные на странице ",-1))]),a(q)?(i(),l("button",{key:0,type:"button",class:"btn btn--ghost btn--sm",onClick:C},"Снять")):y("",!0)])):y("",!0),a(U)&&!a(g).length?(i(),l("div",Rt,"Загрузка…")):a(g).length?(i(),l("ul",Ot,[(i(!0),l(j,null,E(a(g),n=>(i(),l("li",{key:n.id,class:F(["notif-list__item card",{"notif-list__item--unread":!n.read_at,"notif-list__item--highlight":a(D)===n.id}])},[s("div",qt,[n.read_at?y("",!0):(i(),l("label",{key:0,class:"notif-list__check",onClick:e[9]||(e[9]=ft(()=>{},["stop"]))},[s("input",{type:"checkbox",checked:a(v).has(n.id),onChange:p=>J(n.id)},null,40,Pt)])),s("span",Tt,c(n.type),1),s("span",Bt,c(ot(n.created_at)),1)]),s("h3",Ft,c(n.title),1),n.body?(i(),l("p",Lt,c(n.body),1)):y("",!0),s("div",Mt,[n.link?(i(),vt(o,{key:0,to:n.link,class:"btn btn--ghost btn--sm",onClick:p=>nt(n)},{default:bt(()=>[...e[12]||(e[12]=[H(" Открыть ",-1)])]),_:1},8,["to","onClick"])):y("",!0),n.read_at?y("",!0):(i(),l("button",{key:1,type:"button",class:"btn btn--ghost btn--sm",onClick:p=>B(n.id)}," Прочитано ",8,Vt))])],2))),128))])):(i(),l("p",zt,c(a(k)?"Нет непрочитанных":"Нет уведомлений"),1)),a(w)>S?(i(),l("div",At,[s("button",{type:"button",class:"btn btn--ghost btn--sm",disabled:a(u)===0,onClick:tt},"←",8,It),s("span",null,c(a(u)+1)+"–"+c(Math.min(a(u)+S,a(w)))+" из "+c(a(w)),1),s("button",{type:"button",class:"btn btn--ghost btn--sm",disabled:a(u)+S>=a(w),onClick:et},"→",8,Nt)])):y("",!0)])}}});
1export{Ht 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.