PageSourceSearch

https://demo.swop.su/assets/AdminLogsPage-B1kD8tTQ.js

js swop.su collected 2026-10-09 00:00:00 UTC 30,723 bytes, 1 lines download raw bytes

1import{a as r,j as e}from"./vendor-react-DM_sQ5hc.js";import{h as I,ak as Qe,D as ge,P as ae,al as Pe}from"./index-CZztf0aN.js";import{ae as Ge,f as ue,u as d,B as u,F as v,S as ze,i as xe,w as $,ao as Re,a5 as ke,a6 as De,a7 as W,a8 as j,a9 as Te,aa as p,C as le,l as Le,b as E,ap as Ee,T as o,aq as Ae,M as Je,p as Xe,q as Ke,r as Ze,s as es,t as ss,V as re,a as _,o as ts,D as rs,U as Se,W as ye,c as ve,a1 as Ie,ag as ce,ah as de,ai as he,O as as,ar as ns,as as os,G as Fe,H as is,at as ls,au as cs,av as se,aw as ds,ax as te,ay as hs,az as xs,g as gs,h as us,y as we,aA as ps,R as ms}from"./vendor-chakra-DZDzh2OW.js";import{R as Me,A as js,C as bs,X as fs,Y as Ss,T as We,f as ys,P as vs,c as ws,d as Cs}from"./vendor-recharts-DmSF2yjc.js";import{A as $e,m as Oe}from"./vendor-framer-DC02EMZq.js";import"./vendor-react-dom-DMm23ssT.js";import"./vendor-axios-BfzdOZtb.js";import"./vendor-router-CvjK0qh7.js";import"./vendor-socket-DlddAlD3.js";import"./vendor-forms-DB1PHeCe.js";import"./vendor-emotion-dEMDqnb3.js";const Be={low:"green",medium:"yellow",high:"orange",critical:"red"},Ce={low:"Низкий",medium:"Средний",high:"Высокий",critical:"Критический"},zs=()=>{var Z,je,be,V,ne;const[i,D]=r.useState([]),[b,C]=r.useState(!1),[w,g]=r.useState(1),[h,f]=r.useState(1),[S,A]=r.useState(0),[x,R]=r.useState({severity:"",search:"",startDate:"",endDate:""}),[n,P]=r.useState(null),[T,a]=r.useState(!1),[z,l]=r.useState(!1),[L,M]=r.useState(!1),{isOpen:Q,onOpen:pe,onClose:G}=Ge(),H=ue();d("white","whiteAlpha.50");const y=d("gray.100","whiteAlpha.100"),O=d("gray.50","whiteAlpha.50"),B=d("gray.50","whiteAlpha.50"),J=r.useCallback(async()=>{C(!0);try{const t=new URLSearchParams({page:w,limit:15,...x}),c=await I.get(`/api/v1/bug-reports?${t}`);c.data.success&&(D(c.data.reports||[]),f(c.data.totalPages||1),A(c.data.total||0))}catch{H({title:"Ошибка",description:"Не удалось загрузить отчёты",status:"error",duration:3e3,isClosable:!0})}C(!1)},[w,x,H]);r.useEffect(()=>{J()},[J]);const Y=async t=>{try{const c=await I.get(`/api/v1/bug-reports/${t}`);c.data.success&&(P(c.data.report),a(!1),l(!1),M(!1),pe())}catch{H({title:"Ошибка",status:"error",duration:2e3,isClosable:!0})}},{openModal:X}=Qe(),K=async t=>{await X({mode:"confirm",title:"Удалить отчёт?",message:"Это действие нельзя отменить.",confirmColor:"red",confirmText:"Удалить",onConfirm:async()=>{await I.delete(`/api/v1/bug-reports/${t}`)}})&&(H({title:"Удалено",status:"success",duration:2e3}),J(),(n==null?void 0:n.id)===t&&G())},me=t=>`${I.defaults.baseURL}/api/v1/bug-reports/${t}/screenshot`;return e.jsxs(u,{children:[e.jsxs(v,{mb:4,gap:3,wrap:"wrap",align:"center",direction:{base:"column",sm:"row"},children:[e.jsx(ze,{placeholder:"Серьёзность",name:"severity",value:x.severity,onChange:t=>{R(c=>({...c,severity:t.target.value})),g(1)},maxW:{base:"100%",sm:"160px"},size:"sm",borderRadius:"lg",children:Object.entries(Ce).map(([t,c])=>e.jsx("option",{value:t,children:c},t))}),e.jsx(xe,{placeholder:"Поиск...",value:x.search,onChange:t=>{R(c=>({...c,search:t.target.value})),g(1)},maxW:{base:"100%",sm:"200px"},size:"sm",borderRadius:"lg"}),e.jsxs(v,{gap:3,w:{base:"100%",sm:"auto"},children:[e.jsx(ge,{value:x.startDate,onChange:t=>{R(c=>({...c,startDate:t})),g(1)},size:"sm"}),e.jsx(ge,{value:x.endDate,onChange:t=>{R(c=>({...c,endDate:t})),g(1)},size:"sm"})]}),e.jsxs($,{colorScheme:"gray",fontSize:"sm",px:2,py:1,borderRadius:"full",children:["Всего: ",S]})]}),b?e.jsx(ae,{variant:"section"}):e.jsxs(e.Fragment,{children:[e.jsx(Re,{children:e.jsxs(ke,{size:"sm",variant:"simple",children:[e.jsx(De,{children:e.jsxs(W,{children:[e.jsx(j,{display:{base:"none",md:"table-cell"},children:"ID"}),e.jsx(j,{children:"Серьёзность"}),e.jsx(j,{display:{base:"none",md:"table-cell"},children:"Пользователь"}),e.jsx(j,{children:"Описание"}),e.jsx(j,{display:{base:"none",md:"table-cell"},children:"URL"}),e.jsx(j,{children:"Дата"}),e.jsx(j,{display:{base:"none",md:"table-cell"},children:"📸"}),e.jsx(j,{display:{base:"none",md:"table-cell"}})]})}),e.jsx(Te,{children:i.length===0?e.jsx(W,{children:e.jsx(p,{colSpan:8,textAlign:"center",py:6,children:"Нет отчётов"})}):i.map(t=>{var oe;const c=new Date(t.timestamp),N=window.innerWidth<768?`${c.getDate().toString().padStart(2,"0")}.${(c.getMonth()+1).toString().padStart(2,"0")}
1`:c.toLocaleString();return e.jsxs(W,{_hover:{bg:B},cursor:"pointer",onClick:()=>Y(t.id),children:[e.jsx(p,{display:{base:"none",md:"table-cell"},children:e.jsx(le,{fontSize:"xs",children:t.id})}),e.jsx(p,{children:e.jsx($,{colorScheme:Be[t.severity],borderRadius:"full",fontSize:"xs",children:Ce[t.severity]||t.severity})}),e.jsx(p,{display:{base:"none",md:"table-cell"},fontSize:"sm",children:((oe=t.reporter)==null?void 0:oe.username)||"-"}),e.jsx(p,{maxW:{base:"120px",md:"250px"},isTruncated:!0,fontSize:{base:"xs",md:"sm"},title:t.description,children:t.description}),e.jsx(p,{display:{base:"none",md:"table-cell"},maxW:"150px",isTruncated:!0,fontSize:"xs",fontFamily:"mono",children:t.url}),e.jsx(p,{fontSize:"xs",whiteSpace:"nowrap",children:N}),e.jsx(p,{display:{base:"none",md:"table-cell"},children:t.hasScreenshot?"✅":"—"}),e.jsx(p,{display:{base:"none",md:"table-cell"},children:e.jsx(Le,{icon:e.jsx(Pe,{}),size:"xs",variant:"ghost",colorScheme:"red",onClick:ee=>{ee.stopPropagation(),K(t.id)},"aria-label":"Удалить"})})]},t.id)})})]})}),e.jsxs(v,{justify:"space-between",align:"center",mt:4,children:[e.jsx(E,{size:"sm",leftIcon:e.jsx(Ee,{}),onClick:()=>g(t=>Math.max(1,t-1)),isDisabled:w<=1,children:"Назад"}),e.jsxs(o,{fontSize:"sm",children:[w," / ",h]}),e.jsx(E,{size:"sm",rightIcon:e.jsx(Ae,{}),onClick:()=>g(t=>Math.min(h,t+1)),isDisabled:w>=h,children:"Вперёд"})]})]}),e.jsxs(Je,{isOpen:Q,onClose:G,size:"2xl",scrollBehavior:"inside",children:[e.jsx(Xe,{backdropFilter:"blur(4px)"}),e.jsxs(Ke,{borderRadius:"2xl",children:[e.jsxs(Ze,{fontSize:"md",pb:2,children:["🐛 Отчёт ",n==null?void 0:n.id]}),e.jsx(es,{}),e.jsx(ss,{pb:6,children:n&&e.jsxs(re,{spacing:4,align:"stretch",children:[e.jsxs(_,{children:[e.jsx($,{colorScheme:Be[n.severity],borderRadius:"full",px:3,children:Ce[n.severity]}),e.jsx(o,{fontSize:"xs",color:"gray.500",children:new Date(n.timestamp).toLocaleString()})]}),e.jsx(o,{fontSize:"sm",fontWeight:"600",children:"Описание"}),e.jsx(u,{p:3,bg:O,borderRadius:"xl",fontSize:"sm",children:n.description}),e.jsxs(_,{fontSize:"xs",color:"gray.500",children:[e.jsxs(o,{children:["Пользователь: ",(Z=n.reporter)==null?void 0:Z.username]}),e.jsxs(o,{children:["Роль: ",(je=n.reporter)==null?void 0:je.role]})]}),n.screenshot&&e.jsxs(u,{children:[e.jsx(o,{fontSize:"sm",fontWeight:"600",mb:2,children:"Скриншот"}),e.jsx(ts,{src:me(n.id),alt:"Screenshot",borderRadius:"xl",border:"1px solid",borderColor:y,maxH:"300px",objectFit:"contain",w:"100%",fallback:e.jsx(o,{fontSize:"xs",color:"gray.400",children:"Не удалось загрузить"})})]}),e.jsx(rs,{}),e.jsxs(v,{cursor:"pointer",onClick:()=>a(!T),justify:"space-between",align:"center",children:[e.jsxs(_,{children:[e.jsx(o,{fontSize:"sm",fontWeight:"600",children:"Действия пользователя"}),e.jsx($,{borderRadius:"full",fontSize:"xs",children:((be=n.actionTrail)==null?void 0:be.length)||0})]}),T?e.jsx(Se,{}):e.jsx(ye,{})]}),e.jsx(ve,{in:T,children:e.jsx(u,{bg:O,borderRadius:"xl",p:3,maxH:"250px",overflowY:"auto",children:e.jsx(re,{spacing:1,align:"stretch",children:(n.actionTrail||[]).slice().reverse().map((t,c)=>e.jsxs(v,{gap:2,fontSize:"xs",children:[e.jsx(le,{fontSize:"xs",px:1,children:new Date(t.ts).toLocaleTimeString()}),e.jsx($,{colorScheme:t.action.includes("error")?"red":t.action.includes("api")?"blue":"gray",fontSize:"xs",borderRadius:"full",children:t.action}),e.jsx(o,{noOfLines:1,children:t.detail})]},c))})})}),e.jsxs(v,{cursor:"pointer",onClick:()=>l(!z),justify:"space-between",align:"center",children:[e.jsx(o,{fontSize:"sm",fontWeight:"600",children:"Окружение"}),z?e.jsx(Se,{}):e.jsx(ye,{})]}),e.jsx(ve,{in:z,children:e.jsx(u,{bg:O,borderRadius:"xl",p:3,fontSize:"xs",children:e.jsx(le,{display:"block",whiteSpace:"pre-wrap",p:2,borderRadius:"lg",children:JSON.stringify(n.client,null,2)})})}),((V=n.recentErrors)==null?void 0:V.length)>0&&e.jsxs(e.Fragment,{children:[e.jsxs(v,{cursor:"pointer",onClick:()=>M(!L),justify:"space-between",align:"center",children:[e.jsxs(_,{children:[e.jsx(o,{fontSize:"sm",fontWeight:"600",color:"red.400",children:"Ошибки"}),e.jsx($,{colorScheme:"red",borderRadius:"full",fontSize:"xs",children:n.recentErrors.length})]}),L?e.jsx(Se,{}):e.jsx(ye,{})]}),e.jsx(ve,{in:L,children:e.jsx(u,{bg:O,borderRadius:"xl",p:3,children:e.jsx(re,{spacing:2,align:"stretch",children:n.recentErrors.map((t,c)=>e.jsxs(u,{fontSize:"xs",children:[e.jsx(o,{fontWeight:"600",color:"red.400",children:t.message}),t.stack&&e.jsx(le,{display:"block",whiteSpace:"pre-wrap",mt:1,fontSize:"xs",children:t.stack})]},c))})})})]}),n.server&&e.jsx(u,{fontSize:"xs",color:"gray.500",children:e.jsxs(o,{children:["Server: Node ",n.server.nodeVersion," | Uptime: ",Math.floor(n.server.uptime/3600),"h | Heap: ",((((ne=n.server.memoryUsage)==null?void 0:ne.heapUsed)||0)/1024/1024).toFixed(0),"MB"]})}),e.jsx(E,{size:"sm",colorScheme:"red",variant:"ghost",leftIcon:e.jsx(Pe,{}),onClick:()=>K(n.id),children:"Удалить отчёт"})]})})]})]})]})},Rs={low:"#48BB78",medium:"#ECC94B",high:"#ED8936",critical:"#F56565"},ks=()=>{var n,P,T;const[i,D]=r.useState(null),[b,C]=r.useState(!0),w=ue(),g=d("white","rgba(255,255,255,0.03)"),h=d("gray.100","whiteAlpha.100"),f=d("gray.800","white"),S=d("gray.500","gray.400"),A=r.useCallback(async()=>{C(!0);try{const a=await I.get("/api/v1/bug-reports/stats");a.data.success&&D(a.data.stats)}catch{w({title:"Ошибка загрузки статистики",status:"error",duration:2e3,isClosable:!0})}C(!1)},[w]);if(r.useEffect(()=>{A()},[A]),b)return e.jsx(ae,{variant:"section"});if(!i)return e.jsx(o,{color:"gray.400",children:"Нет данных"});const x=Object.entries(i.bySeverity||{}).map(([a,z])=>({name:a,value:z})).filter(a=>a.value>0),R=(i.last7Days||[]).map(a=>({date:a.date.slice(5),count:a.count}));return e.jsxs(re,{spacing:6,align:"stretch",children:[e.jsxs(Ie,{columns:{base:2,md:4},spacing:4,children:[e.jsx(u,{bg:g,p:{base:3,md:5},borderRadius:"2xl",border:"1px solid",borderColor:h,children:e.jsxs(ce,{children:[e.jsx(de,{color:S,fontSize:"xs",children:"Всего отчётов"}),e.jsx(he,{color:f,fontSize:"2xl",children:i.total})]})}),e.jsx(u,{bg:g,p:{base:3,md:5},borderRadius:"2xl",border:"1px solid",borderColor:h,children:e.jsxs(ce,{children:[e.jsx(de,{color:S,fontSize:"xs",children:"Критических"}),e.jsx(he,{color:"red.400",fontSize:"2xl",children:((n=i.bySeverity)==null?void 0:n.critical)||0})]})}),e.jsx(u,{bg:g,p:{base:3,md:5},borderRadius:"2xl",border:"1px solid",borderColor:h,children:e.jsxs(ce,{children:[e.jsx(de,{color:S,fontSize:"xs",children:"Высокий приоритет"}),e.jsx(he,{color:"orange.400",fontSize:"2xl",children:((P=i.bySeverity)==null?void 0:P.high)||0})]})}),e.jsx(u,{bg:g,p:{base:3,md:5},borderRadius:"2xl",border:"1px solid",borderColor:h,children:e.jsxs(ce,{children:[e.jsx(de,{color:S,fontSize:"xs",children:"За 7 дней"}),e.jsx(he,{color:f,fontSize:"2xl",children:R.reduce((a,z)=>a+z.count,0)})]})})]}),e.jsxs(Ie,{columns:{base:1,lg:2},spacing:6,children:[e.jsxs(u,{bg:g,p:{base:3,md:5},borderRadius:"2xl",border:"1px solid",borderColor:h,children:[e.jsx(o,{fontSize:"sm",fontWeight:"600",mb:4,color:f,children:"Отчёты за 7 дней"}),e.jsx(Me,{width:"100%",height:220,children:e.jsxs(js,{data:R,children:[e.jsx(bs,{strokeDasharray:"3 3",stroke:"rgba(128,128,128,0.15)"}),e.jsx(fs,{dataKey:"date",fontSize:11}),e.jsx(Ss,{fontSize:11,allowDecimals:!1}),e.jsx(We,{}),e.jsx(ys,{type:"monotone",dataKey:"count",stroke:"#ED8936",fill:"rgba(237,137,54,0.2)",strokeWidth:2,name:"Отчёты"})]})})]}),e.jsxs(u,{bg:g,p:5,borderRadius:"2xl",border:"1px solid",borderColor:h,children:[e.jsx(o,{fontSize:"sm",fontWeight:"600",mb:4,color:f,children:"По серьёзности"}),x.length===0?e.jsx(o,{fontSize:"sm",color:"gray.400",py:10,textAlign:"center",children:"Нет данных"}):e.jsx(Me,{width:"100%",height:220,children:e.jsxs(vs,{children:[e.jsx(ws,{data:x,cx:"50%",cy:"50%",innerRadius:50,outerRadius:80,paddingAngle:3,dataKey:"value",nameKey:"name",label:({name:a,value:z})=>`${a}: ${z}`,children:x.map(a=>e.jsx(Cs,{fill:Rs[a.name]||"#999"},a.name))}),e.jsx(We,{})]})})]})]}),((T=i.recentReporters)==null?void 0:T.length)>0&&e.jsxs(u,{bg:g,p:5,borderRadius:"2xl",border:"1px solid",borderColor:h,children:[e.jsx(o,{fontSize:"sm",fontWeight:"600",mb:3,color:f,children:"Активные репортёры"}),e.jsx(v,{wrap:"wrap",gap:2,children:i.recentReporters.map(a=>e.jsx($,{borderRadius:"full",px:3,py:1,colorScheme:"gray",children:a},a))})]})]})},Ds=Oe(u),U=({label:i,description:D,value:b,min:C,max:w,onChange:g,isDisabled:h,unit:f})=>{const S=d("white","rgba(255, 255, 255, 0.03)"),A=d("gray.100","whiteAlpha.100"),x=d("gray.800","white"),R=d("gray.500","whiteAlpha.600"),n=d("gray.50","rgba(255,255,255,0.05)"),P=d("gray.100","rgba(255,255,255,0.1)"),T=d("orange.50","rgba(221, 107, 32, 0.2)"),a=d("gray.600","whiteAlpha.800"),z=d("gray.200","whiteAlpha.300");return e.jsxs(v,{align:"center",justify:"space-between",p:{base:3,md:5},bg:S,borderRadius:"2xl",border:"1px solid",borderColor:A,transition:"all 0.2s",_hover:{borderColor:z},children:[e.jsxs(u,{flex:1,mr:{base:2,md:4},children:[e.jsx(o,{fontSize:{base:"sm",md:"md"},fontWeight:"600",color:x,mb:.5,children:i}),e.jsx(o,{fontSize:"xs",color:R,children:D})]}),e.jsxs(_,{spacing:3,bg:n,p:1.5,borderRadius:"full",border:"1px solid",borderColor:A,flexShrink:0,children:[e.jsx(Le,{icon:e.jsx(ns,{}),size:"sm",isRound:!0,variant:"ghost",onClick:()=>!h&&b>C&&g(b-1),isDisabled:h||b<=C,color:a,_hover:{bg:P},_active:{bg:T,color:"orange.500"}}),e.jsx(u,{w:"50px",textAlign:"center",children:e.jsx($e,{mode:"popLayout",children:e.jsx(Oe.div,{initial:{y:8,opacity:0}
1,animate:{y:0,opacity:1},exit:{y:-8,opacity:0},transition:{type:"spring",stiffness:400,damping:25},children:e.jsxs(o,{fontSize:"xl",fontWeight:"700",color:x,children:[b,f&&e.jsx(o,{as:"span",fontSize:"xs",color:R,ml:.5,children:f})]})},b)})}),e.jsx(Le,{icon:e.jsx(os,{}),size:"sm",isRound:!0,variant:"ghost",onClick:()=>!h&&b<w&&g(b+1),isDisabled:h||b>=w,color:a,_hover:{bg:P},_active:{bg:T,color:"orange.500"}})]})]})},Ts=({label:i,description:D,value:b,onChange:C})=>{const w=d("white","rgba(255, 255, 255, 0.03)"),g=d("gray.100","whiteAlpha.100"),h=d("gray.800","white"),f=d("gray.500","whiteAlpha.600");return e.jsxs(v,{align:"center",justify:"space-between",p:{base:3,md:5},bg:w,borderRadius:"2xl",border:"1px solid",borderColor:g,children:[e.jsxs(u,{mr:{base:2,md:4},children:[e.jsx(o,{fontSize:{base:"sm",md:"md"},fontWeight:"600",color:h,mb:.5,children:i}),e.jsx(o,{fontSize:"xs",color:f,children:D})]}),e.jsx(Fe,{colorScheme:"orange",size:"lg",isChecked:b,onChange:S=>C(S.target.checked)})]})},Ls=()=>{const[i,D]=r.useState(null),[b,C]=r.useState(null),[w,g]=r.useState(!0),[h,f]=r.useState(!1),S=ue(),A=d("gray.800","white"),x=d("gray.500","gray.400"),R=d("white","gray.800"),n=d("gray.200","whiteAlpha.200"),P=r.useCallback(async()=>{g(!0);try{const l=await I.get("/api/v1/settings/logging");l.data.success&&(D(l.data.settings),C(l.data.settings))}catch{S({title:"Ошибка загрузки",status:"error",duration:2e3,isClosable:!0})}g(!1)},[S]);r.useEffect(()=>{P()},[P]);const T=async()=>{f(!0);try{const l=await I.patch("/api/v1/settings/logging",i);l.data.success&&(C(l.data.settings||i),S({title:"Настройки сохранены",status:"success",duration:2e3,isClosable:!0,position:"top"}))}catch{S({title:"Ошибка сохранения",status:"error",duration:2e3,isClosable:!0})}f(!1)},a=(l,L)=>D(M=>({...M,[l]:L})),z=JSON.stringify(i)!==JSON.stringify(b);return w?e.jsx(ae,{variant:"section"}):i?e.jsxs(u,{pb:24,children:[e.jsxs(u,{mb:{base:4,md:8},children:[e.jsx(o,{fontSize:{base:"md",md:"xl"},fontWeight:"600",color:A,mb:2,children:"Настройки логирования"}),e.jsx(o,{fontSize:{base:"xs",md:"sm"},color:x,children:"Управление периодами хранения и параметрами bug-reports."})]}),e.jsxs(re,{spacing:4,align:"stretch",maxW:"100%",children:[e.jsx(o,{fontSize:"xs",fontWeight:"700",color:x,textTransform:"uppercase",letterSpacing:"0.2em",mt:2,children:"Хранение логов"}),e.jsx(U,{label:"App логи",description:"Основные логи приложения",value:i.logRetentionAppDays,min:1,max:365,onChange:l=>a("logRetentionAppDays",l),unit:"д"}),e.jsx(U,{label:"Error логи",description:"Логи ошибок",value:i.logRetentionErrorDays,min:1,max:365,onChange:l=>a("logRetentionErrorDays",l),unit:"д"}),e.jsx(U,{label:"Access логи",description:"HTTP-запросы",value:i.logRetentionAccessDays,min:1,max:90,onChange:l=>a("logRetentionAccessDays",l),unit:"д"}),e.jsx(U,{label:"Query логи",description:"SQL-запросы (dev)",value:i.logRetentionQueryDays,min:1,max:30,onChange:l=>a("logRetentionQueryDays",l),unit:"д"}),e.jsx(o,{fontSize:"xs",fontWeight:"700",color:x,textTransform:"uppercase",letterSpacing:"0.2em",mt:6,children:"Bug Reports"}),e.jsx(U,{label:"Хранение отчётов",description:"Срок хранения bug-reports",value:i.bugReportRetentionDays,min:7,max:365,onChange:l=>a("bugReportRetentionDays",l),unit:"д"}),e.jsx(U,{label:"Action Trail",description:"Количество действий пользователя в отчёте",value:i.bugReportTrailSize,min:10,max:200,onChange:l=>a("bugReportTrailSize",l)}),e.jsx(Ts,{label:"Скриншоты",description:"Захват скриншота при создании отчёта",value:i.bugReportScreenshotEnabled,onChange:l=>a("bugReportScreenshotEnabled",l)}),e.jsx(U,{label:"Качество JPEG",description:"Качество сжатия скриншота",value:i.bugReportScreenshotQuality,min:20,max:100,onChange:l=>a("bugReportScreenshotQuality",l),unit:"%"})]}),e.jsx(as,{children:e.jsx($e,{children:z&&e.jsxs(Ds,{initial:{y:100,opacity:0,x:"-50%"},animate:{y:0,opacity:1,x:"-50%"},exit:{y:100,opacity:0,x:"-50%"},transition:{type:"spring",stiffness:400,damping:25},position:"fixed",bottom:10,left:"50%",zIndex:9999,bg:R,border:"1px solid",borderColor:n,boxShadow:"0 20px 40px rgba(0,0,0,0.15)",borderRadius:"2xl",p:4,display:"flex",alignItems:"center",gap:6,children:[e.jsx(o,{fontSize:"sm",fontWeight:"500",color:A,children:"Несохранённые изменения"}),e.jsxs(_,{spacing:3,children:[e.jsx(E,{variant:"ghost",size:"md",onClick:()=>D(b),isDisabled:h,children:"Сбросить"}),e.jsx(E,{colorScheme:"orange",size:"md",px:8,onClick:T,isLoading:h,loadingText:"Сохранение...",borderRadius:"lg",boxShadow:"0 4px 14px rgba(221, 107, 32, 0.4)",children:"Применить"})]})]})})})]}):null},Es=[{key:"app",label:"App",color:"blue"},{key:"error",label:"Errors",color:"red"},{key:"access",label:"Access",color:"cyan"},{key:"query",label:"Queries",color:"purple"},{key:"exception",label:"Exceptions",color:"orange"},{key:"rejection",label:"Rejections",color:"yellow"}],As={error:"red",warn:"yellow",info:"green",http:"cyan",debug:"purple",trace:"gray"},Hs=()=>{const[i,D]=r.useState([]),[b,C]=r.useState(!1),[w,g]=r.useState(null),[h,f]=r.useState(1),[S,A]=r.useState(1),[x,R]=r.useState({user:"",action:"",startDate:"",endDate:""}),[n,P]=r.useState([]),[T,a]=r.useState(!1),[z,l]=r.useState(null),[L,M]=r.useState(1),[Q,pe]=r.useState(1),[G,H]=r.useState(null),[y,O]=r.useState({category:"app",level:"",q:"",domain:"",date:""}),[B,J]=r.useState(!1),Y=r.useRef(null),[X,K]=r.useState("normal"),[me,Z]=r.useState(!1),[je,be]=r.useState(null),V=ue(),ne=10,t=50,c=d("gray.800","white"),N=d("gray.500","gray.400");d("white","gray.800"),r.useEffect(()=>{oe()},[h,x]);const oe=async()=>{C(!0),g(null);try{const s=new URLSearchParams({page:h,limit:ne,user:x.user,action:x.action,startDate:x.startDate,endD
1ate:x.endDate}),m=await I.get(`/api/v1/admin/logs?${s.toString()}`);D(m.data.logs),A(m.data.totalPages)}catch{g("Не удалось загрузить логи. Попробуйте позже.")}finally{C(!1)}};r.useEffect(()=>{ee()},[L,y]),r.useEffect(()=>(B&&(L!==1&&M(1),Y.current=setInterval(()=>{ee(!0)},2e3)),()=>{Y.current&&(clearInterval(Y.current),Y.current=null)}),[B,y]);const ee=r.useCallback(async(s=!1)=>{s||a(!0),l(null);try{const m=new URLSearchParams({page:L,limit:t,category:y.category,level:y.level,q:y.q,domain:y.domain,date:y.date}),k=await I.get(`/api/v1/admin/server-logs?${m.toString()}`);P(k.data.logs||[]),pe(k.data.totalPages||1),H(k.data.file||null)}catch{l("Не удалось загрузить серверные логи.")}finally{s||a(!1)}},[L,y]);r.useEffect(()=>{qe()},[]);const qe=async()=>{try{const{data:s}=await I.get("/api/v1/admin/server-logs/mode");K(s.mode)}catch{}},Ue=async()=>{Z(!0);try{const s=X==="normal"?"testing":"normal";await I.post("/api/v1/admin/server-logs/mode",{mode:s}),K(s),V({title:`Режим: ${s==="testing"?"Тестирование":"Обычный"}`,description:s==="testing"?"Максимальная детализация логов включена":"Стандартный уровень логирования",status:s==="testing"?"warning":"success",duration:3e3,isClosable:!0})}catch(s){V({title:"Ошибка",description:s.message,status:"error",duration:3e3,isClosable:!0})}finally{Z(!1)}},ie=s=>{const{name:m,value:k}=s.target;R(q=>({...q,[m]:k}))},_e=()=>{R({user:"",action:"",startDate:"",endDate:""}),f(1)},fe=s=>{const{name:m,value:k}=s.target;O(q=>({...q,[m]:k})),M(1)},He=s=>{O(m=>({...m,category:s})),M(1)},Ye=async()=>{try{const m=`/api/v1/admin/server-logs/download?${new URLSearchParams({category:y.category,date:y.date}).toString()}`,k=await I.get(m,{responseType:"blob"}),q=new Blob([k.data],{type:"text/plain;charset=utf-8"}),F=document.createElement("a");F.href=window.URL.createObjectURL(q),F.download=`${y.category}-${y.date||"latest"}.log`,document.body.appendChild(F),F.click(),document.body.removeChild(F)}catch{V({title:"Ошибка",description:"Не удалось скачать логи",status:"error",duration:3e3,isClosable:!0})}};return e.jsxs(u,{w:"full",children:[e.jsxs(u,{mb:{base:4,md:8},children:[e.jsx(is,{size:{base:"md",md:"xl"},color:c,fontWeight:"600",mb:2,letterSpacing:"tight",children:"Системные логи"}),e.jsx(o,{color:N,fontSize:{base:"xs",md:"sm"},children:"Аудит, серверные логи, отчёты о багах и аналитика."})]}),e.jsxs(ls,{colorScheme:"orange",variant:"soft-rounded",isLazy:!0,children:[e.jsx(u,{overflowX:"auto",css:{"&::-webkit-scrollbar":{display:"none"},scrollbarWidth:"none"},children:e.jsxs(cs,{mb:{base:3,md:6},gap:1,flexWrap:"nowrap",minW:"max-content",children:[e.jsx(se,{fontSize:{base:"xs",md:"sm"},borderRadius:"xl",px:{base:2,md:3},flexShrink:0,children:"Аудит"}),e.jsx(se,{fontSize:{base:"xs",md:"sm"},borderRadius:"xl",px:{base:2,md:3},flexShrink:0,children:"Серверные"}),e.jsx(se,{fontSize:{base:"xs",md:"sm"},borderRadius:"xl",px:{base:2,md:3},flexShrink:0,children:"Bug Reports"}),e.jsx(se,{fontSize:{base:"xs",md:"sm"},borderRadius:"xl",px:{base:2,md:3},flexShrink:0,children:"Аналитика"}),e.jsx(se,{fontSize:{base:"xs",md:"sm"},borderRadius:"xl",px:{base:2,md:3},flexShrink:0,children:"Настройки"})]})}),e.jsxs(ds,{children:[e.jsxs(te,{px:0,children:[e.jsxs(v,{mb:4,gap:3,wrap:"wrap",direction:{base:"column",md:"row"},children:[e.jsxs(v,{gap:3,flex:1,direction:{base:"column",sm:"row"},children:[e.jsx(xe,{placeholder:"Фильтр по пользователю",name:"user",value:x.user,onCh
1ange:ie,size:"sm",borderRadius:"lg"}),e.jsxs(ze,{placeholder:"Фильтр по действию",name:"action",value:x.action,onChange:ie,size:"sm",borderRadius:"lg",children:[e.jsx("option",{value:"create",children:"Создание"}),e.jsx("option",{value:"update",children:"Обновление"}),e.jsx("option",{value:"delete",children:"Удаление"}),e.jsx("option",{value:"login",children:"Вход"}),e.jsx("option",{value:"logout",children:"Выход"})]})]}),e.jsxs(v,{gap:3,direction:{base:"column",sm:"row"},children:[e.jsx(ge,{value:x.startDate,onChange:ie,size:"sm"}),e.jsx(ge,{value:x.endDate,onChange:ie,size:"sm"})]}),e.jsx(E,{size:"sm",colorScheme:"orange",variant:"ghost",onClick:_e,flexShrink:0,children:"Сбросить"})]}),b?e.jsx(ae,{variant:"section"}):w?e.jsx(o,{color:"red.500",children:w}):e.jsx(Re,{children:e.jsxs(ke,{size:"sm",variant:"simple",children:[e.jsx(De,{children:e.jsxs(W,{children:[e.jsx(j,{display:{base:"none",md:"table-cell"},children:"ID"}),e.jsx(j,{children:"Пользователь"}),e.jsx(j,{children:"Действие"}),e.jsx(j,{display:{base:"none",md:"table-cell"},children:"Описание"}),e.jsx(j,{children:"Время"})]})}),e.jsx(Te,{children:i.length>0?i.map(s=>{const m=new Date(s.timestamp),k=window.innerWidth<768?`${m.getDate().toString().padStart(2,"0")}.${(m.getMonth()+1).toString().padStart(2,"0")} ${m.getHours().toString().padStart(2,"0")}:${m.getMinutes().toString().padStart(2,"0")}`:m.toLocaleString();return e.jsxs(W,{children:[e.jsx(p,{display:{base:"none",md:"table-cell"},children:s.id}),e.jsx(p,{fontSize:"xs",maxW:{base:"80px",md:"none"},isTruncated:!0,children:s.user}),e.jsx(p,{fontSize:"xs",children:s.action}),e.jsx(p,{display:{base:"none",md:"table-cell"},children:s.description}),e.jsx(p,{fontSize:"xs",whiteSpace:"nowrap",children:k})]},s.id)}):e.jsx(W,{children:e.jsx(p,{colSpan:"5",textAlign:"center",children:"Нет логов"})})})]})}),e.jsxs(v,{justifyContent:"space-between",alignItems:"center",mt:4,children:[e.jsx(E,{size:"sm",leftIcon:e.jsx(Ee,{}),onClick:()=>f(s=>Math.max(s-1,1)),isDisabled:h===1,children:"Назад"}),e.jsxs(o,{fontSize:"sm",children:[h," / ",S]}),e.jsx(E,{size:"sm",rightIcon:e.jsx(Ae,{}),onClick:()=>f(s=>Math.min(s+1,S)),isDisabled:h===S,children:"Вперед"})]})]}),e.jsxs(te,{px:0,children:[e.jsxs(v,{mb:4,gap:3,wrap:"wrap",align:"center",justify:"space-between",children:[e.jsx(_,{spacing:1,overflowX:"auto",css:{"&::-webkit-scrollbar":{display:"none"}},children:Es.map(s=>e.jsx(hs,{size:"sm",borderRadius:"full",variant:y.category===s.key?"solid":"outline",colorScheme:s.color,cursor:"pointer",onClick:()=>He(s.key),_hover:{opacity:.8},children:e.jsx(xs,{children:s.label})},s.key))}),e.jsxs(gs,{display:"flex",alignItems:"center",w:"auto",flexShrink:0,children:[e.jsx(us,{htmlFor:"log-mode",mb:0,fontSize:"xs",mr:2,children:X==="testing"?"🔍 Testing":"📋 Normal"}),e.jsx(Fe,{id:"log-mode",size:"sm",colorScheme:"orange",isChecked:X==="testing",onChange:Ue,isDisabled:me})]})]}),e.jsxs(v,{mb:4,gap:3,wrap:"wrap",direction:{base:"column",md:"row"},children:[e.jsxs(v,{gap:3,flex:1,direction:{base:"column",sm:"row"},children:[e.jsxs(ze,{placeholder:"Уровень",name:"level",value:y.level,onChange:fe,size:"sm",borderRadius:"lg",children:[e.jsx("option",{value:"error",children:"error"}),e.jsx("option",{value:"warn",children:"warn"}),e.jsx("option",{value:"info",children:"info"}),e.jsx("option",{value:"http",children:"http"}),e.jsx("option",{value:"debug",children:"debug"}),e.jsx("option",{value:"trace",children:"trace"})]}),e.jsx(xe,{placeholder:"Поиск по тексту",name:"q",value:y.q,onChange:fe,size:"sm",borderRadius:"lg"}),e.jsx(xe,{placeholder:"Дата (YYYY-MM-DD)",name:"date",value:y.date,onChange:fe,size:"sm",borderRadius:"lg",type:"date"})]}),e.jsxs(v,{gap:2,children:[e.jsx(we,{label:"Скачать файл",children:e.jsx(E,{size:"sm",onClick:Ye,colorScheme:"orange",variant:"outline",leftIcon:e.jsx(ps,{}),children:"Скачать"})}),e.jsx(E,{size:"sm",onClick:()=>J(s=>!s),colorScheme:B?"red":"orange",variant:B?"solid":"outline",children:B?"⏹ Стоп":"▶ Live"}),e.jsx(we,{label:"Обновить",children:e.jsx(E,{size:"sm",onClick:()=>ee(),variant:"ghost",colorScheme:"orange",children:e.jsx(ms,{})})})]})]}),G&&e.jsxs(o,{fontSize:"xs",color:N,mb:2,children:["📄 ",G," · Категория: ",y.category]}),T?e.jsx(ae,{variant:"section"}):z?e.jsx(o,{color:"red.500",children:z}):e.jsx(Re,{children:e.jsxs(ke,{size:"sm",variant:"simple",children:[e.jsx(De,{children:e.jsxs(W,{children:[e.jsx(j,{children:"Время"}),e.jsx(j,{children:"Уровень"}),e.jsx(j,{display:{base:"none",md:"table-cell"},children:"Домен"}),e.jsx(j,{children:"Сообщение"}),e.jsx(j,{display:{base:"none",md:"table-cell"},children:"requestId"}),e.jsx(j,{display:{base:"none",lg:"table-cell"},children:"userId"}),e.jsx(j,{display:{base:"none",lg:"table-cell"},children:"Duration"})]})}),e.jsx(Te,{children:n.length>0?n.map(s=>
1{const m=s.timestamp?new Date(s.timestamp).toLocaleString():"-",k=(s.level||"").toLowerCase(),q=As[k]||"gray",F=typeof s.message=="string"?s.message:JSON.stringify(s.message),Ve=s.duration!=null?`${s.duration}ms`:"-",Ne=s.duration>200?"red.500":s.duration>100?"yellow.500":"green.500";return e.jsxs(W,{children:[e.jsx(p,{fontSize:"xs",whiteSpace:"nowrap",children:m}),e.jsx(p,{children:e.jsx($,{colorScheme:q,borderRadius:"full",fontSize:"2xs",children:k||"-"})}),e.jsx(p,{display:{base:"none",md:"table-cell"},fontSize:"xs",color:N,children:s.domain||"-"}),e.jsx(p,{fontSize:"xs",maxW:"420px",children:e.jsx(we,{label:F,hasArrow:!0,children:e.jsx(o,{isTruncated:!0,children:F})})}),e.jsx(p,{display:{base:"none",md:"table-cell"},fontFamily:"mono",fontSize:"2xs",maxW:"120px",isTruncated:!0,children:s.requestId||"-"}),e.jsx(p,{display:{base:"none",lg:"table-cell"},fontSize:"xs",children:s.userId||"-"}),e.jsx(p,{display:{base:"none",lg:"table-cell"},fontSize:"xs",color:s.duration!=null?Ne:N,children:Ve})]},s.id)}):e.jsx(W,{children:e.jsx(p,{colSpan:"7",textAlign:"center",children:"Нет логов"})})})]})}),!B&&e.jsxs(v,{justifyContent:"space-between",alignItems:"center",mt:4,children:[e.jsx(E,{size:"sm",leftIcon:e.jsx(Ee,{}),onClick:()=>M(s=>Math.max(s-1,1)),isDisabled:L===1,children:"Назад"}),e.jsxs(o,{fontSize:"sm",children:[L," / ",Q]}),e.jsx(E,{size:"sm",rightIcon:e.jsx(Ae,{}),onClick:()=>M(s=>Math.min(s+1,Q)),isDisabled:L===Q,children:"Вперед"})]})]}),e.jsx(te,{px:0,children:e.jsx(zs,{})}),e.jsx(te,{px:0,children:e.jsx(ks,{})}),e.jsx(te,{px:0,children:e.jsx(Ls,{})})]})]})]})};export{Hs 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.