PageSourceSearch

https://proobruch.ru/assets/AdminStatsPage-C6U1S20i.js

js proobruch.ru collected 2026-10-09 22:39:24 UTC 9,424 bytes, 1 lines download raw bytes

1import{n as f,u as G,m as H,bP as W,A as Z,r as h,an as J,j as e,b5 as X,q as ee,B as q,$ as i,aL as O,bQ as c,bx as te,T as _,bR as ae,as as se,a_ as ne,W as ie,aJ as D,aQ as re,L as M}from"./vendor-0v--kTIY.js";import{m as U,f as oe}from"./dateTime-BzdwezlB.js";import{p as m,g as le,P as de,a as ce}from"./index-D44GA20K.js";import{E as Y}from"./EmptyState-IisV-vpT.js";const me=a=>["admin","analytics","summary",a],ue=a=>["admin","analytics","olympiads",a],ye=a=>["admin","analytics","events",a],pe=a=>f({queryKey:me(a),queryFn:async()=>(await m.summary(a)).data??null}),xe=a=>f({queryKey:ue(a),queryFn:async()=>(await m.olympiads(a)).data??[]}),ge=a=>f({queryKey:ye(a),queryFn:async()=>(await m.events(a)).data??null,placeholderData:W}),he=()=>{const a=G();return H({mutationFn:async()=>(await m.resetTraffic()).data??0,onSuccess:()=>a.invalidateQueries({queryKey:["admin","analytics"]})})},{Text:o}=_,fe=[{value:"week",label:"За неделю"},{value:"month",label:"За месяц"},{value:"quarter",label:"За 3 месяца"},{value:"all",label:"За всё время"}],je={week:7,month:30,quarter:90,all:null},Ie={PLATFORM_VISIT:"Заход на платформу",OLYMPIAD_VIEW:"Открыта страница олимпиады",ORGANIZER_REGISTERED:"Новая регистрация",OLYMPIAD_PARTICIPATION:"Заявка на участие",PAYMENT_CONFIRMED:"Оплата подтверждена"},$=10,Ae=()=>{var T,R,A,P,L,E,N,C,b;const{modal:a,message:j}=Z.useApp(),{organizer:u}=le(),y=(u==null?void 0:u.role)==="SUPER_ADMIN",[p,k]=h.useState("month"),[I,w]=h.useState(0),x=h.useMemo(()=>{const t=je[p],s=U().format("YYYY-MM-DD");return{from:t===null?"2014-01-01":U().subtract(t,"day").format("YYYY-MM-DD"),to:s}},[p]),n=pe(x),l=xe(x),r=ge({...x,page:I,size:$}),S=he(),K=()=>{a.confirm({title:"Сбросить статистику посещений за всё время?",content:"Будут безвозвратно удалены только отметки заходов на платформу и открытий страниц всех олимпиад. Регистрации, заявки и подтверждённые оплаты останутся без изменений. Действие нельзя отменить.",okText:"Да, сбросить посещения",okButtonProps:{danger:!0},cancelText:"Отмена",width:560,onOk:async()=>{try{const t=await S.mutateAsync();j.success(`Статистика посещений сброшена. Удалено событий: ${t}.`)}catch{j.error("Не удалось сбросить статистику посещений. Попробуйте ещё раз.")}}})},g=n.error??l.error??r.error??null,F=J(g)&&!g.response,B=()=>{n.refetch(),l.refetch(),r.refetch()},z=t=>{k(t),w(0)},d=((T=n.data)==null?void 0:T.platform)??null,v=y?"По всем олимпиадам платформы за выбранный период":"По вашим олимпиадам за выбранный период",Q=[{title:"Олимпиада",dataIndex:"title",render:(t,s)=>e.jsx(M,{to:`/olympiads/${s.olympiadId}`,children:t})},{title:"Открытий страницы",dataIndex:"viewsTotal",width:180,align:"right",defaultSortOrder:"descend",sorter:(t,s)=>t.viewsTotal-s.viewsTotal,render:t=>t.toLocaleString("ru-RU")},{title:"Уникальных посетителей",dataIndex:"viewsUnique",width:180,align:"right",sorter:(t,s)=>t.viewsUnique-s.viewsUnique,render:t=>t.toLocaleString("ru-RU")},{title:"Заявок на участие",dataIndex:"participations",width:170,align:"right",sorter:(t,s)=>t.participations-s.participations,render:t=>t.toLocaleString("ru-RU")},{title:"Оплат подтверждено",dataIndex:"paymentsConfirmed",width:185,align:"right",sorter:(t,s)=>t.paymentsConfirmed-s.paymentsConfirmed,render:t=>t.toLocaleString("ru-RU")}],V=[{title:"Когда",dataIndex:"occurredAt",width:160,render:t=>e.jsx("span",{style:{whiteSpace:"nowrap"},children:oe(t)})},{title:"Что произошло",dataIndex:"type",width:230,render:t=>Ie[t]??t},{title:"Олимпиада",dataIndex:"olympiadTitle",render:(t,s)=>s.olympiadId&&t?e.jsx(M,{to:`/olympiads/${s.olympiadId}`,children:t}):e.jsx(o,{type:"secondary",children:"—"})},{title:"Кто",dataIndex:"actorName",width:240,render:t=>t||e.jsx(o,{type:"secondary",children:"Гость"})}];return e.jsxs(de,{width:"full",children:[e.jsx(ce,{title:"Статистика",subtitle:"Сколько людей заходит на платформу и насколько интересны олимпиады.",extra:e.jsx(X,{size:"large",value:p,onChange:z,options:fe})}),g&&e.jsx(ee,{type:"error",style:{marginBottom:24},message:"Не удалось загрузить статистику",description:F?"Похоже, пропало соединение с интернетом. Проверьте подключение и нажмите «Попробовать снова».":"Сервер не смог ответить на запрос. Подождите минуту и нажмите «Попробовать снова» — если не поможет, сообщите об ошибке через кнопку внизу экрана.",showIcon:!0,action:e.jsx(q,{onClick:B,children:"Попробовать снова"})}),e.jsxs("div",{className:`stats-summary-grid stats-summary-grid--${d?"five":"three"}`,children:[d&&e.jsxs(e.Fragment,{children:[e.jsxs(i,{className:"stats-summary-card",children:[e.jsx(O,{title:"Сколько раз открывали платформу и сколько уникальных посетителей это сделали.",children:e.jsx(c,{title:"Заходов на платформу",value:d.visitsTotal,loading:n.isLoading,prefix:e.jsx(te,{})})}),e.jsxs(o,{type:"secondary",className:"stats-summary-note",children:["Уникальных посетителей: ",d.visitsUnique.toLocaleStr
1ing("ru-RU")]})]}),e.jsxs(i,{className:"stats-summary-card",children:[e.jsx(c,{title:"Новых регистраций",value:d.registrations,loading:n.isLoading,prefix:e.jsx(ae,{})}),e.jsx(o,{type:"secondary",className:"stats-summary-note",children:"Педагогов завели личный кабинет"})]})]}),e.jsxs(i,{className:"stats-summary-card",children:[e.jsx(c,{title:"Заявок на участие",value:((R=n.data)==null?void 0:R.participations)??0,loading:n.isLoading,prefix:e.jsx(se,{})}),e.jsx(o,{type:"secondary",className:"stats-summary-note",children:v})]}),e.jsxs(i,{className:"stats-summary-card",children:[e.jsx(c,{title:"Подтверждённых оплат",value:((A=n.data)==null?void 0:A.paymentsConfirmed)??0,loading:n.isLoading,prefix:e.jsx(ne,{})}),e.jsxs(o,{type:"secondary",className:"stats-summary-note",children:[v,". Оплата принята полностью"]})]}),e.jsxs(i,{className:"stats-summary-card",children:[e.jsx(O,{title:`Сколько раз открывали страницы ${y?"олимпиад платформы":"ваших олимпиад"} и сколько среди них уникальных посетителей.`,children:e.jsx(c,{title:"Открытий страниц олимпиад",value:((P=n.data)==null?void 0:P.olympiadViewsTotal)??0,loading:n.isLoading,prefix:e.jsx(ie,{})})}),e.jsxs(o,{type:"secondary",className:"stats-summary-note",children:["Уникальных посетителей: ",(((L=n.data)==null?void 0:L.olympiadViewsUnique)??0).toLocaleString("ru-RU")]})]})]}),e.jsx(i,{title:"Интерес к олимпиадам",style:{marginBottom:24},children:!l.isLoading&&(((E=l.data)==null?void 0:E.length)??0)===0?e.jsx(Y,{title:"Пока нечего показать",description:"Здесь появятся цифры, как только у вас будет хотя бы одна олимпиада и первые посетители."}):e.jsx(D,{className:"compact-admin-table",rowKey:"olympiadId",loading:l.isLoading,dataSource:l.data??[],columns:Q,tableLayout:"fixed",pagination:{pageSize:10,hideOnSinglePage:!0,showSizeChanger:!1}})}),e.jsx(i,{title:"Последние действия",children:!r.isLoading&&(((N=r.data)==null?void 0:N.content.length)??0)===0?e.jsx(Y,{title:"За этот период действий не было",description:"Выберите период подлиннее — например, «За 3 месяца» или «За всё время»."}):e.jsx(D,{className:"compact-admin-table",rowKey:"id",loading:r.isLoading,dataSource:((C=r.data)==null?void 0:C.content)??[],columns:V,tableLayout:"fixed",pagination:{current:I+1,pageSize:$,total:((b=r.data)==null?void 0:b.totalElements)??0,position:["topRight","bottomRight"],hideOnSinglePage:!0,showSizeChanger:!1,showTotal:t=>`Всего действий: ${t}`,onChange:t=>w(t-1)}})}),y&&e.jsxs(i,{title:"Обслуживание статистики",style:{marginTop:24},children:[e.jsx(_.Paragraph,{type:"secondary",children:"Если прежние заходы администраторов попали в счётчики, можно сбросить только посещения и просмотры за всё время. Регистрации, заявки и оплаты сохранятся."}),e.jsx(q,{danger:!0,icon:e.jsx(re,{}),loading:S.isPending,onClick:K,children:"Сбросить статистику посещений"})]})]})};export{Ae 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.