PageSourceSearch

https://demo.swop.su/assets/AdminSettings-CvRLb1OZ.js

js swop.su collected 2026-10-09 00:00:45 UTC 14,773 bytes, 1 lines download raw bytes

1import{a as S,j as e,R as X}from"./vendor-react-DM_sQ5hc.js";import{A as te,dE as ne,h as K,az as ae,dF as re,aU as le,S as ce,dG as de,dH as he}from"./index-CZztf0aN.js";import{m as ge}from"./vendor-framer-DC02EMZq.js";import{F as be}from"./FloatingSaveBar-CpjAuD4V.js";import{f as xe,u as t,B as y,H as pe,T as d,V as oe,D as M,F as A,i as ie,a as H,I as Y,U as me,W as ue,c as fe,l as Z,ar as je,as as we,G as L,a1 as $,w as ee}from"./vendor-chakra-DZDzh2OW.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";ge(y);const j=({label:u,description:f,value:o,min:c,max:h,onChange:l,isDisabled:r,suffix:i,step:g=1})=>{const[b,w]=S.useState(!1),[x,n]=S.useState(String(o)),a=X.useRef(null),N=t("white","rgba(255, 255, 255, 0.03)"),F=t("gray.100","whiteAlpha.100"),z=t("gray.800","white"),W=t("gray.500","whiteAlpha.600"),U=t("gray.50","rgba(255,255,255,0.05)"),B=t("gray.100","rgba(255,255,255,0.1)"),I=t("orange.50","rgba(221, 107, 32, 0.2)"),E=t("gray.600","whiteAlpha.800"),O=t("white","rgba(255,255,255,0.08)"),k=p=>{const R=parseInt(p,10);if(isNaN(R))n(String(o));else{const V=Math.max(c,Math.min(h,R));l(V),n(String(V))}w(!1)},P=()=>{r||(n(String(o)),w(!0),setTimeout(()=>{var p;return(p=a.current)==null?void 0:p.select()},0))};X.useEffect(()=>{b||n(String(o))},[o,b]);const _=t("gray.200","whiteAlpha.300");return e.jsxs(A,{align:"center",justify:"space-between",p:{base:3,md:5},bg:N,borderRadius:"xl",border:"1px solid",borderColor:F,transition:"all 0.2s",_hover:{borderColor:_},children:[e.jsxs(y,{flex:"1",mr:{base:2,md:4},children:[e.jsx(d,{fontSize:{base:"sm",md:"md"},fontWeight:"600",color:z,mb:.5,children:u}),f&&e.jsx(d,{fontSize:{base:"xs",md:"sm"},color:W,lineHeight:"short",children:f})]}),e.jsxs(H,{spacing:2,bg:U,p:1.5,borderRadius:"full",border:"1px solid",borderColor:F,flexShrink:0,children:[e.jsx(Z,{icon:e.jsx(je,{boxSize:3}),size:"sm",isRound:!0,variant:"ghost",onClick:()=>!r&&o>c&&l(o-g),isDisabled:r||o<=c,color:E,_hover:{bg:B},_active:{bg:I,color:"orange.500"}}),e.jsxs(H,{spacing:1,minW:"60px",justify:"center",cursor:r?"default":"pointer",children:[b?e.jsx(ie,{ref:a,value:x,onChange:p=>n(p.target.value.replace(/[^\d]/g,"")),onBlur:()=>k(x),onKeyDown:p=>{p.key==="Enter"&&k(x),p.key==="Escape"&&(n(String(o)),w(!1))},size:"xs",w:"50px",textAlign:"center",fontWeight:"700",fontSize:"lg",bg:O,border:"none",_focus:{boxShadow:"none",borderColor:"orange.300"},p:0,autoFocus:!0}):e.jsx(d,{fontSize:"lg",fontWeight:"700",color:z,onClick:P,userSelect:"none",_hover:r?{}:{color:"orange.500"},transition:"color 0.15s",children:o}),i&&e.jsx(d,{fontSize:"xs",fontWeight:"400",color:W,whiteSpace:"nowrap",children:i})]}),e.jsx(Z,{icon:e.jsx(we,{boxSize:3}),size:"sm",isRound:!0,variant:"ghost",onClick:()=>!r&&o<h&&l(o+g),isDisabled:r||o>=h,color:E,_hover:{bg:B},_active:{bg:I,color:"orange.500"}})]})]})},C=({label:u,description:f,isChecked:o,onChange:c,isDisabled:h})=>{const l=t("white","rgba(255, 255, 255, 0.03)"),r=t("gray.100","whiteAlpha.100"),i=t("gray.800","white"),g=t("gray.500","whiteAlpha.600"),b=t("gray.200","whiteAlpha.300");return e.jsxs(A,{align:"center",justify:"space-between",p:{base:3,md:5},bg:l,borderRadius:"xl",border:"1px solid",borderColor:r,transition:"all 0.2s",_hover:{borderColor:b},children:[e.jsxs(y,{flex:"1",mr:{base:2,md:4},children:[e.jsx(d,{fontSize:{base:"sm",md:"md"},fontWeight:"600",color:i,mb:.5,children:u}),f&&e.jsx(d,{fontSize:{base:"xs",md:"sm"},color:g,lineHeight:"short",children:f})]}),e.jsx(L,{size:"lg",colorScheme:"orange",isChecked:o,onChange:w=>c(w.target.checked),isDisabled:h})]})},v=({icon:u,title:f,description:o,children:c,defaultOpen:h=!0})=>{const[l,r]=S.useState(h),i=t("gray.800","white"),g=t("gray.500","gray.400"),b=t("orange.500","orange.300");return e.jsxs(y,{children:[e.jsxs(A,{align:"center",justify:"space-between",cursor:"pointer",onClick:()=>r(!l),py:3,userSelect:"none",_hover:{opacity:.8},transition:"opacity 0.15s",children:[e.jsxs(H,{spacing:3,children:[e.jsx(Y,{as:u,boxSize:{base:4,md:5},color:b}),e.jsxs(y,{children:[e.jsx(d,{fontSize:{base:"md",md:"lg"},fontWeight:"600",color:i,children:f}),e.jsx(d,{fontSize:{base:"xs",md:"sm"},color:g,children:o})]})]}),e.jsx(Y,{as:l?me:ue,boxSize:5,color:g})]}),e.jsx(fe,{in:l,animateOpacity:!0,children:e.jsx(oe,{spacing:3,align:"stretch",pl:{base:0,md:8},pb:4,children:c})})]})},se={dashboard:"Дашборд",inventory:"Инвентаризация",equipment:"Оборудование",reports:"Отчёты",maintenance:"Обслуживание",labels:"Этикетки",notifications:"Уведомления"},Ce=({managerAccess:u,workerAccess:f,onChange:o,isDisabled:c})=>{const h=t("white","rgba(255, 255, 255, 0.03)"),l=t("gray.100","whiteAlpha.100"),r=t("gray.800","white"),i=t("gray.50","rgba(255,255,255,0.04)"),g=t("gray.500","whiteAlpha.600"),b=t("gray.50","rgba(255,255,255,0.02)"),w=Object.keys(se);return e.jsxs(y,{bg:h,borderRadius:"xl",border:"1px solid",borderColor:l,overflow:"hidden",children:[e.jsxs($,{columns:3,bg:i,p:{base:2,md:4},borderBottom:"1px solid",borderColor:l,children:[e.jsx(d,{fontSize:{base:"xs",md:"sm"},fontWeight:"600",color:g,children:"Модуль"}),e.jsx(d,{fontSize:{base:"xs",md:"sm"},fontWeight:"600",color:g,textAlign:"center",children:e.jsx(ee,{colorScheme:"blue",variant:"subtle",px:2,py:.5,borderRadius:"md",fontSize:{base:"2xs",md:"xs"},children:"Менеджер"})}),e.jsx(d,{fontSize:{base:"xs",md:"sm"},fontWeight:"600",color:g,textAlign:"center",children:e.jsx(ee,{colorScheme:"purple",variant:"subtle",px:2,py:.5,borderRadius:"md",fontSize:{base:"2xs",md:"xs"},children:"Рабочий"})})]}),w.map((x,n)=>e.jsxs($,{columns:3,p:{base:2,md:4},alignItems:"center",borderBottom:n<w.length-1?"1px solid":"none",borderColor:l,_hover:{bg:b},transition:"background 0.15s",children:[e.jsx(d,{fontSize:{base:"sm",md:"md"},fontWeight:"500",color:r,children:se[x]}),e.jsx(A,{justify:"center",children:e.jsx(L,{size:"md",colorScheme:"blue",isChecked:u[x],onChange:a=>o("managerAccess",x,a.target.checked),isDisabled:c})}),e.jsx(A,{justify:"center",children:e.jsx(L,{size:"md",colorScheme:"purple",isChecked:f[x],onChange:a=>o("workerAccess",x,a.target.checked),isDisabled:c})})]},x))]})},We=()=>{var O,k,P,_,p,R,V,T,G,J,q;const{user:u}=S.useContext(te),{refresh:f}=ne(),[o,c]=S.useState(null),[h,l]=S.useState(null),r=xe(),i=(u==null?void 0:u.role)==="admin",[g,b]=S.useState(!1);S.useEffect(()=>{w()},[]);const w=async()=>{try{const s=await K.get("/api/v1/settings/global");s.data.success&&(c(s.data.settings),l(s.data.settings))}catch{r({title:"Ошибка",description:"Не удалось загрузить настройки",status:"error",duration:3e3,isClosable:!0})}},x=async()=>{var s,D;if(i){b(!0);try{const m=await K.post("/api/v1/settings/global",o);m.data.success&&(l(m.data.settings||o),f(),r({title:"Изменения сохранены",de
1scription:"Глобальные настройки обновлены.",status:"success",duration:3e3,isClosable:!0,position:"top"}))}catch(m){r({title:"Ошибка сохранения",description:((D=(s=m==null?void 0:m.response)==null?void 0:s.data)==null?void 0:D.message)||"Не удалось сохранить настройки.",status:"error",duration:3e3,isClosable:!0,position:"top"})}finally{b(!1)}}},n=(s,D)=>{c(m=>({...m,[s]:D}))},a=(s,D,m)=>{c(Q=>({...Q,[s]:{...Q[s],[D]:m}}))},N=t("gray.800","white"),F=t("gray.500","gray.400"),z=t("gray.100","whiteAlpha.100"),W=t("white","rgba(255,255,255,0.03)"),U=t("gray.100","whiteAlpha.100"),B=t("gray.800","white"),I=t("gray.500","whiteAlpha.600"),E=S.useMemo(()=>JSON.stringify(o)!==JSON.stringify(h),[o,h]);return o?e.jsxs(y,{w:"full",position:"relative",pb:24,children:[e.jsxs(y,{mb:10,children:[e.jsx(pe,{size:"xl",color:N,fontWeight:"600",mb:3,letterSpacing:"tight",children:"Глобальные настройки"}),e.jsx(d,{color:F,fontSize:"md",maxW:"2xl",children:"Системные параметры платформы. Изменения применяются мгновенно ко всем пользователям."})]}),e.jsxs(oe,{spacing:6,align:"stretch",maxW:"3xl",children:[e.jsxs(v,{icon:ae,title:"Фото и медиа",description:"Лимиты загрузки фотографий",children:[e.jsx(j,{label:"Лимит фото (Приёмка)",description:"Максимум фото при приёмке оборудования на точку.",value:o.maxPhotosReceipt,min:1,max:30,onChange:s=>n("maxPhotosReceipt",s),isDisabled:!i}),e.jsx(j,{label:"Лимит фото (Отправка)",description:"Максимум фото при отправке в сервисный центр.",value:o.maxPhotosSend,min:1,max:30,onChange:s=>n("maxPhotosSend",s),isDisabled:!i}),e.jsx(j,{label:"Лимит фото (Оборудование)",description:"Максимум фото в карточке оборудования.",value:o.maxPhotosEquipment,min:1,max:100,onChange:s=>n("maxPhotosEquipment",s),isDisabled:!i}),e.jsx(j,{label:"Макс. размер фото",description:"Предельный размер одного загружаемого изображения.",value:o.maxPhotoFileSizeMb,min:1,max:50,onChange:s=>n("maxPhotoFileSizeMb",s),isDisabled:!i,suffix:"МБ"}),e.jsx(j,{label:"Макс. размер видео",description:"Предельный размер одного загружаемого видеофайла.",value:o.maxVideoFileSizeMb,min:10,max:500,onChange:s=>n("maxVideoFileSizeMb",s),isDisabled:!i,suffix:"МБ"}),e.jsx(j,{label:"Макс. размер документа",description:"Предельный размер файла-документа (PDF, DOCX, XLSX и т.д.).",value:o.maxDocFileSizeMb,min:1,max:500,onChange:s=>n("maxDocFileSizeMb",s),isDisabled:!i,suffix:"МБ"})]}),e.jsx(M,{borderColor:z}),e.jsx(v,{icon:re,title:"Операции",description:"Параметры удаления и восстановления",children:e.jsx(j,{label:"Окно восстановления",description:"Время на восстановление после мягкого удаления перемещения.",value:o.softDeleteDelayMinutes,min:1,max:60,onChange:s=>n("softDeleteDelayMinutes",s),isDisabled:!i,suffix:"мин"})}),e.jsx(M,{borderColor:z}),e.jsx(v,{icon:le,title:"Карты и геолокация",description:"Город по умолчанию для поиска на картах",children:e.jsxs(A,{align:{base:"stretch",md:"center"},justify:"space-between",p:5,bg:W,borderRadius:"xl",border:"1px solid",borderColor:U,direction:{base:"column",md:"row"},gap:3,children:[e.jsxs(y,{flex:"1",children:[e.jsx(d,{fontSize:"sm",fontWeight:"600",color:B,children:"Город по умолчанию"}),e.jsx(d,{fontSize:"xs",color:I,children:"Используется в поиске магазинов, объектов, складов на карте"})]}),e.jsx(ie,{value:o.defaultCity||"",onChange:s=>n("defaultCity",s.target.value),isDisabled:!i,size:"sm",w:{base:"100%",md:"200px"},placeholder:"Красноярск"})]})}),e.jsx(M,{borderColor:z}),e.jsxs(v,{icon:ce,title:"Rate-limiting",description:"Защита от перегрузки и брутфорса",children:[e.jsx(j,{label:"Окно авторизации",description:"Период в секундах для подсчёта попыток входа.",value:o.loginRateLimitWindow,min:10,max:600,onChange:s=>n("loginRateLimitWindow",s),isDisabled:!i,suffix:"сек"}),e.jsx(j,{label:"Макс. попыток входа",description:"Количество попыток авторизации в одном окне.",value:o.loginRateLimitMax,min:1,max:100,onChange:s=>n("loginRateLimitMax",s),isDisabled:!i}),e.jsx(j,{label:"Окно загрузки фото",description:"Период в минутах для подсчёта загрузок фотографий.",value:o.photoUploadRateWindow,min:1,max:120,onChange:s=>n("photoUploadRateWindow",s),isDisabled:!i,suffix:"мин"}),e.jsx(j,{label:"Макс. загрузок фото",description:"Количество загрузок фотографий в одном окне.",value:o.photoUploadRateMax,min:5,max:500,onChange:s=>n("photoUploadRateMax",s),isDisabled:!i})]}),e.jsx(M,{borderColor:z}),e.jsxs(v,{icon:de,title:"Публичный просмотр (QR)",description:"Настройки отображения оборудования по QR-коду",defaultOpen:!1,children:[e.jsx(C,{label:"Публичный просмотр",description:"Разрешить просмотр оборудования без авторизации по QR-коду.",isChecked:(O=o.publicView)==null?void 0:O.enabled,onChange:s=>a("publicView","enabled",s),isDisabled:!i}),((k=o.publicView)==null?void 0:k.enabled)&&e.jsxs(e.Fragment,{children:[e.jsx(C,{label:"Фотографии",isChecked:(P=o.publicView)==null?void 0:P.showPhotos,onChange:s=>a("publicView","showPhotos",s),isDisabled:!i}),e.jsx(C,{label:"Номер оборудования",isChecked:(_=o.publicView)==null?void 0:_.showNumber,onChange:s=>a("publicView","showNumber",s),isDisabled:!i}),e.jsx(C,{label:"Категория",isChecked:(p=o.publicView)==null?void 0:p.showCategory,onChange:s=>a("publicView","showCategory",s),isDisabled:!i}),e.jsx(C,{label:"Модель",isChecked:(R=o.publicView)==null?void 0:R.showModel,onChange:s=>a("publicView","showModel",s),isDisabled:!i}),e.jsx(C,{label:"Бренд",isChecked:(V=o.publicView)==null?void 0:V.showBrand,onChange:s=>a("publicView","showBrand",s),isDisabled:!i}),e.jsx(C,{label:"Серийный номер",isChecked:(T=o.publicView)==null?void 0:T.showSerial,onChange:s=>a("publicView","showSerial",s),isDisabled:!i}),e.jsx(C,{label:"Описание",isChecked:(G=o.publicView)==null?void 0:G.showDescription,onChange:s=>a("publicView","showDescription",s),isDisabled:!i}),e.jsx(C,{label:"Состояние",isChecked:(J=o.publicView)==null?void 0:J.showCondition,onChange:s=>a("publicView","showCondition",s),isDisabled:!i}),e.jsx(C,{label:"Статус",isChecked:(q=o.publicView)==null?void 0:q.showStatus,onChange:s=>a("publicView","showStatus",s),isDisabled:!i})]})]}),e.jsx(M,{borderColor:z}),e.jsx(v,{icon:he,title:"Доступ ролей",description:"Какие модули доступны менеджерам и рабочим",defaultOpen:!1,children:e.jsx(Ce,{managerAccess:o.managerAccess||{},workerAccess:o.workerAccess||{},onChange:(s,D,m)=>a(s,D,m),isDisabled:!i})})]}),i&&e.jsx(be,{hasChanges:E,onSave:x,onReset:()=>c(JSON.parse(JSON.stringify(h))),isSaving:g})]}):null};export{We 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.