window.open() neposílá JWT header, přepsáno na apiFetch() + blob download. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 lines
14 KiB
JavaScript
2 lines
14 KiB
JavaScript
import{j as e,m as x,A as J}from"./vendor-animation-0s3FMHwK.js";import{r}from"./vendor-react-BVs3cwbi.js";import{a as q,u as G,c as j,b as Q,F,C as X}from"./index-Bay45BGf.js";import{F as K}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const v="/api/admin",ee=t=>t<=0?"text-danger":t<20?"text-warning":"",se=t=>t.overtime>0?e.jsxs("span",{className:"text-warning fw-600",children:["+",t.overtime,"h"]}):t.missing>0?e.jsxs("span",{className:"text-danger",children:["-",t.missing,"h"]}):e.jsx("span",{className:"text-success",children:"0h"}),ae=(t,p,m)=>t.overtime>0?e.jsxs("span",{className:"text-warning fw-600",style:{fontSize:"11px"},children:["+",t.overtime,"h"]}):t.missing>0?e.jsxs("span",{className:"text-danger fw-600",style:{fontSize:"11px"},children:["-",t.missing,"h"]}):p&&!m?e.jsx("span",{className:"text-success",style:{fontSize:"11px"},children:"OK"}):null,te=(t,p,m)=>t.overtime>0?"linear-gradient(135deg, var(--warning), #d97706)":p?"linear-gradient(135deg, var(--success), #059669)":m?"var(--gradient)":"var(--danger)";function le(){const t=q(),{hasPermission:p}=G(),[m,M]=r.useState(!0),[o,T]=r.useState(new Date().getFullYear()),[k,I]=r.useState({users:[],balances:{}}),[z,O]=r.useState(!0),[c,W]=r.useState({months:{},holidays:[],users:[],balances:{}}),[$,R]=r.useState(!0),[w,A]=r.useState({months:{}}),[L,y]=r.useState(!1),[S,U]=r.useState(null),[h,f]=r.useState({vacation_total:160,vacation_used:0,sick_used:0}),[g,_]=r.useState({show:!1,userId:null,userName:""}),N=r.useCallback(async(a=!0)=>{a&&M(!0);try{const i=await(await j(`${v}/attendance.php?action=balances&year=${o}`,{})).json();i.success&&I(i.data)}catch{t.error("Nepodařilo se načíst data")}finally{a&&M(!1)}},[o,t]),B=r.useCallback(async()=>{O(!0);try{const s=await(await j(`${v}/attendance.php?action=workfund&year=${o}`)).json();s.success&&W(s.data)}catch{}finally{O(!1)}},[o]),D=r.useCallback(async()=>{R(!0);try{const s=await(await j(`${v}/attendance.php?action=project_report&year=${o}`)).json();s.success&&A(s.data)}catch{}finally{R(!1)}},[o]);if(r.useEffect(()=>{N(),B(),D()},[N,B,D]),Q(L),!p("attendance.balances"))return e.jsx(K,{});const Y=(a,s)=>{U({id:a,name:s.name}),f({vacation_total:s.vacation_total,vacation_used:s.vacation_used,sick_used:s.sick_used}),y(!0)},V=async()=>{try{const s=await(await j(`${v}/attendance.php?action=balances`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:S.id,year:o,action_type:"edit",...h})})).json();s.success?(y(!1),await N(!1),await new Promise(i=>setTimeout(i,300)),t.success(s.message)):t.error(s.error)}catch{t.error("Chyba připojení")}},H=async()=>{if(g.userId)try{const s=await(await j(`${v}/attendance.php?action=balances`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:g.userId,year:o,action_type:"reset"})})).json();s.success?(_({show:!1,userId:null,userName:""}),await N(!1),t.success(s.message)):t.error(s.error)}catch{t.error("Chyba připojení")}},E=[],b=new Date().getFullYear(),P=new Date().getMonth()+1;for(let a=b-5;a<=b+5;a++)E.push(a);const Z=a=>{if(!c.months||Object.keys(c.months).length===0)return null;let s=0,i=0,l=0;for(const u of Object.values(c.months)){s+=u.fund;const C=u.users?.[a];C&&(i+=C.worked,l+=C.covered)}const n=Math.max(0,Math.round((s-l)*10)/10),d=Math.max(0,Math.round((l-s)*10)/10);return{fund:s,worked:Math.round(i*10)/10,covered:Math.round(l*10)/10,missing:n,overtime:d}};return e.jsxs("div",{children:[e.jsxs(x.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsx("div",{children:e.jsx("h1",{className:"admin-page-title",children:"Správa bilancí"})}),e.jsx("div",{className:"admin-page-actions",children:e.jsx("select",{value:o,onChange:a=>T(parseInt(a.target.value)),className:"admin-form-select",style:{minWidth:"100px"},children:E.map(a=>e.jsx("option",{value:a,children:a},a))})})]}),e.jsx(x.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsxs("div",{className:"admin-card-body",children:[m&&e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))}),!m&&Object.keys(k.balances).length===0&&e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Žádní uživatelé k zobrazení."})}),!m&&Object.keys(k.balances).length>0&&e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Zaměstnanec"}),e.jsx("th",{children:"Nárok (h)"}),e.jsx("th",{children:"Čerpáno (h)"}),e.jsx("th",{children:"Zbývá (h)"}),e.jsx("th",{children:"Nemoc (h)"}),e.jsx("th",{children:"Fond roku"}),e.jsx("th",{children:"Odpracováno"}),e.jsx("th",{children:"+/−"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:Object.entries(k.balances).map(([a,s])=>{const i=Z(a);return e.jsxs("tr",{children:[e.jsx("td",{className:"fw-500",children:s.name}),e.jsx("td",{className:"admin-mono",children:s.vacation_total}),e.jsx("td",{className:"admin-mono",children:s.vacation_used.toFixed(1)}),e.jsx("td",{className:"admin-mono",children:e.jsx("span",{className:ee(s.vacation_remaining),children:s.vacation_remaining.toFixed(1)})}),e.jsx("td",{className:"admin-mono",children:s.sick_used.toFixed(1)}),e.jsx("td",{className:"admin-mono",children:i?`${i.fund}h`:"—"}),e.jsx("td",{className:"admin-mono",children:i?`${i.worked}h`:"—"}),e.jsx("td",{className:"admin-mono",children:i?se(i):"—"}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>Y(a,s),className:"admin-btn-icon",title:"Upravit","aria-label":"Upravit",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),e.jsx("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})]})}),e.jsx("button",{onClick:()=>_({show:!0,userId:a,userName:s.name}),className:"admin-btn-icon danger",title:"Resetovat","aria-label":"Resetovat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})]})})]})})]},a)})})]})})]})}),!z&&c.months&&Object.keys(c.months).length>0&&e.jsxs(x.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},className:"mt-6",children:[e.jsxs("h2",{className:"admin-page-title mb-4",style:{fontSize:"1.25rem"},children:["Měsíční přehled fondu ",o]}),e.jsx("div",{className:"admin-grid admin-grid-3",children:Object.entries(c.months).map(([a,s])=>{const i=o===b&&parseInt(a)===P;return e.jsx("div",{className:"admin-card",style:i?{borderColor:"var(--accent-color)",boxShadow:"0 0 0 1px var(--accent-color)"}:{},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"0.75rem"},children:[e.jsxs("h3",{style:{fontWeight:600,fontSize:"1rem",margin:0},children:[s.month_name,i&&e.jsx("span",{style:{marginLeft:"0.5rem",fontSize:"0.7rem",padding:"0.125rem 0.375rem",background:"var(--accent-light)",color:"var(--accent-color)",borderRadius:"var(--border-radius-sm)",fontWeight:500},children:"aktuální"})]}),e.jsxs("span",{className:"text-secondary",style:{fontSize:"12px"},children:[s.fund,"h (",s.business_days," dnů)"]})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.375rem"},children:c.users&&c.users.map(l=>{const n=s.users?.[l.id];if(!n)return null;const d=s.fund>0?Math.min(100,n.covered/s.fund*100):0,u=n.covered>=s.fund;return e.jsxs("div",{children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",fontSize:"12px"},children:[e.jsx("span",{style:{color:"var(--text-primary)"},children:n.name}),e.jsxs("span",{style:{display:"flex",gap:"0.5rem",alignItems:"center"},children:[e.jsxs("span",{className:"text-secondary",children:[n.worked,"h"]}),ae(n,u,i)]})]}),e.jsx("div",{style:{marginTop:"0.125rem",height:"3px",background:"var(--bg-tertiary)",borderRadius:"2px",overflow:"hidden"},children:e.jsx("div",{style:{height:"100%",width:`${d}%`,background:te(n,u,i),borderRadius:"2px",transition:"width 0.3s ease"}})})]},l.id)})})]})},a)})})]}),z&&e.jsx("div",{className:"mt-6",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})}),!$&&w.months&&Object.keys(w.months).length>0&&e.jsxs(x.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},className:"mt-6",children:[e.jsxs("h2",{className:"admin-page-title mb-4",style:{fontSize:"1.25rem"},children:["Měsíční přehled projektů ",o]}),e.jsx("div",{className:"admin-grid admin-grid-3",children:Object.entries(w.months).map(([a,s])=>{const i=o===b&&parseInt(a)===P,l=s.projects.reduce((n,d)=>n+d.hours,0);return s.projects.length===0?null:e.jsx("div",{className:"admin-card",style:i?{borderColor:"var(--accent-color)",boxShadow:"0 0 0 1px var(--accent-color)"}:{},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"0.75rem"},children:[e.jsxs("h3",{style:{fontWeight:600,fontSize:"1rem",margin:0},children:[s.month_name,i&&e.jsx("span",{style:{marginLeft:"0.5rem",fontSize:"0.7rem",padding:"0.125rem 0.375rem",background:"var(--accent-light)",color:"var(--accent-color)",borderRadius:"var(--border-radius-sm)",fontWeight:500},children:"aktuální"})]}),e.jsxs("span",{className:"text-secondary fw-600",style:{fontSize:"12px"},children:[l.toFixed(1),"h"]})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:s.projects.map(n=>e.jsxs("div",{children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"0.25rem"},children:[e.jsx("span",{style:{fontSize:"12px",fontWeight:600,color:"var(--text-primary)"},children:n.project_id?n.project_number:"Bez projektu"}),e.jsxs("span",{className:"text-secondary fw-600",style:{fontSize:"12px"},children:[n.hours.toFixed(1),"h"]})]}),n.project_id&&n.project_name&&e.jsx("div",{className:"text-muted",style:{fontSize:"0.7rem",marginBottom:"0.25rem"},children:n.project_name}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.125rem"},children:n.users.map(d=>{const u=n.hours>0?Math.min(100,d.hours/n.hours*100):0;return e.jsxs("div",{children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",fontSize:"11px"},children:[e.jsx("span",{className:"text-secondary",children:d.user_name}),e.jsxs("span",{className:"text-secondary",children:[d.hours.toFixed(1),"h"]})]}),e.jsx("div",{style:{marginTop:"1px",height:"3px",background:"var(--bg-tertiary)",borderRadius:"2px",overflow:"hidden"},children:e.jsx("div",{style:{height:"100%",width:`${u}%`,background:n.project_id?"var(--gradient)":"#94a3b8",borderRadius:"2px",transition:"width 0.3s ease"}})})]},d.user_id)})})]},n.project_id||"no-project"))})]})},a)})})]}),$&&e.jsx("div",{className:"mt-6",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})}),e.jsx(J,{children:L&&S&&e.jsxs(x.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[e.jsx("div",{className:"admin-modal-backdrop",onClick:()=>y(!1)}),e.jsxs(x.div,{className:"admin-modal",initial:{opacity:0,scale:.95,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:20},transition:{duration:.2},children:[e.jsxs("div",{className:"admin-modal-header",children:[e.jsx("h2",{className:"admin-modal-title",children:"Upravit dovolenou"}),e.jsx("p",{className:"text-secondary",style:{marginTop:"0.25rem"},children:S.name})]}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(F,{label:"Nárok na dovolenou (hodiny)",children:e.jsx("input",{type:"number",value:h.vacation_total,onChange:a=>f({...h,vacation_total:parseFloat(a.target.value)}),min:"0",max:"500",step:"1",className:"admin-form-input"})}),e.jsx(F,{label:"Čerpáno dovolené (hodiny)",children:e.jsx("input",{type:"number",value:h.vacation_used,onChange:a=>f({...h,vacation_used:parseFloat(a.target.value)}),min:"0",max:"500",step:"0.5",className:"admin-form-input"})}),e.jsx(F,{label:"Čerpáno nemocenské (hodiny)",children:e.jsx("input",{type:"number",value:h.sick_used,onChange:a=>f({...h,sick_used:parseFloat(a.target.value)}),min:"0",max:"500",step:"0.5",className:"admin-form-input"})})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>y(!1),className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"button",onClick:V,className:"admin-btn admin-btn-primary",children:"Uložit"})]})]})]})}),e.jsx(X,{isOpen:g.show,onClose:()=>_({show:!1,userId:null,userName:""}),onConfirm:H,title:"Resetovat bilanci",message:`Opravdu chcete vynulovat čerpání dovolené a nemocenské pro ${g.userName} za rok ${o}?`,confirmText:"Resetovat",confirmVariant:"danger"})]})}export{le as default};
|