diff --git a/dist/api/rate_limits/92f2e2a3520918dc3a4f54cfed15fbfe.json b/dist/api/rate_limits/92f2e2a3520918dc3a4f54cfed15fbfe.json index 157cc02..69c7f1a 100644 --- a/dist/api/rate_limits/92f2e2a3520918dc3a4f54cfed15fbfe.json +++ b/dist/api/rate_limits/92f2e2a3520918dc3a4f54cfed15fbfe.json @@ -1 +1 @@ -{"window_start":1773403455,"count":8} \ No newline at end of file +{"window_start":1773405014,"count":4} \ No newline at end of file diff --git a/dist/api/rate_limits/95bc5d544df53a813f55a3a2ae270497.json b/dist/api/rate_limits/95bc5d544df53a813f55a3a2ae270497.json new file mode 100644 index 0000000..594925d --- /dev/null +++ b/dist/api/rate_limits/95bc5d544df53a813f55a3a2ae270497.json @@ -0,0 +1 @@ +{"window_start":1773404939,"count":1} \ No newline at end of file diff --git a/dist/assets/Attendance-HkkqNom4.js b/dist/assets/Attendance-Cx77BQZA.js similarity index 99% rename from dist/assets/Attendance-HkkqNom4.js rename to dist/assets/Attendance-Cx77BQZA.js index 9d87ed9..c49544c 100644 --- a/dist/assets/Attendance-HkkqNom4.js +++ b/dist/assets/Attendance-Cx77BQZA.js @@ -1 +1 @@ -import{j as e,m as w,A as ne}from"./vendor-animation-0s3FMHwK.js";import{r as l,L as C}from"./vendor-react-BVs3cwbi.js";import{a as ie,u as de,c as p,b as le,F as P,A as Z,C as re}from"./index-BrM8fzBu.js";import{f as h,a as ce,c as oe}from"./attendanceHelpers-D6sLEw0q.js";import{F as me}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const x="/api/admin";function he(n){return n===1?"den":n>=2&&n<=4?"dny":"dnů"}function ue(n){return n.overtime>0?"linear-gradient(135deg, var(--warning), #d97706)":n.covered>=n.fund?"linear-gradient(135deg, var(--success), #059669)":"var(--gradient)"}function ge(){const n=ie(),{hasPermission:D}=de(),[J,G]=l.useState(!0),[N,v]=l.useState(!1),[i,V]=l.useState({ongoing_shift:null,today_shifts:[],date:"",leave_balance:{vacation_total:160,vacation_used:0,vacation_remaining:160,sick_used:0},monthly_fund:null}),[z,b]=l.useState(!1),[d,_]=l.useState({leave_type:"vacation",date_from:new Date().toISOString().split("T")[0],date_to:new Date().toISOString().split("T")[0],notes:""}),[M,$]=l.useState(!1),[B,L]=l.useState(""),[j,U]=l.useState([]),[Y,A]=l.useState(!1),[F,K]=l.useState([]),[f,Q]=l.useState(null),[I,O]=l.useState({show:!1,action:null}),k=l.useRef(null);l.useEffect(()=>()=>{k.current&&k.current.abort()},[]);const g=l.useCallback(async()=>{try{const a=await p(`${x}/attendance.php`);if(a.status===401)return;const t=await a.json();t.success&&(V(t.data),L(t.data.ongoing_shift?.notes||""),K(t.data.project_logs||[]),Q(t.data.active_project_id||null))}catch{n.error("Nepodařilo se načíst data")}finally{G(!1)}},[n]);if(l.useEffect(()=>{g()},[g]),l.useEffect(()=>{(async()=>{try{const s=await(await p(`${x}/attendance.php?action=projects`)).json();s.success&&U(s.data.projects||[])}catch{}})()},[]),le(z),!D("attendance.record"))return e.jsx(me,{});const R=a=>{if(v(!0),!navigator.geolocation){n.warning("GPS není dostupná"),T(a,{});return}navigator.geolocation.getCurrentPosition(t=>{const{latitude:s,longitude:r,accuracy:m}=t.coords;T(a,{latitude:s,longitude:r,accuracy:m,address:""}),k.current&&k.current.abort();const c=new AbortController;k.current=c,fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${s}&lon=${r}&zoom=18&addressdetails=1`,{headers:{"Accept-Language":"cs"},signal:c.signal}).then(o=>o.json()).then(o=>{o.display_name&&p(`${x}/attendance.php?action=update_address`,{method:"POST",body:JSON.stringify({latitude:s,longitude:r,address:o.display_name,punch_action:a})}).catch(()=>{})}).catch(()=>{})},t=>{let s="Nepodařilo se získat polohu";t.code===t.PERMISSION_DENIED?s="Přístup k poloze byl zamítnut":t.code===t.TIMEOUT&&(s="Vypršel časový limit"),n.error(s),O({show:!0,action:a})},{enableHighAccuracy:!0,timeout:1e4,maximumAge:6e4})},T=async(a,t={})=>{try{const s=await p(`${x}/attendance.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({punch_action:a,...t})});if(s.status===401)return;const r=await s.json();v(!1),r.success?(await g(),setTimeout(()=>{n.success(r.message)},300)):n.error(r.error)}catch{v(!1),n.error("Chyba připojení")}},X=async()=>{v(!0);try{const a=await p(`${x}/attendance.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({punch_action:"break_start"})});if(a.status===401)return;const t=await a.json();t.success?(await g(),n.success(t.message)):n.error(t.error)}catch{n.error("Chyba připojení")}finally{v(!1)}},ee=async()=>{try{const a=await p(`${x}/attendance.php?action=notes`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:B})});if(a.status===401)return;const t=await a.json();t.success?n.success("Poznámka byla uložena"):n.error(t.error)}catch{n.error("Chyba připojení")}},ae=async a=>{A(!0);try{const t=await p(`${x}/attendance.php?action=switch_project`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:a||null})});if(t.status===401)return;const s=await t.json();s.success?(await g(),n.success(s.message)):n.error(s.error)}catch{n.error("Chyba připojení")}finally{A(!1)}},S=(a,t)=>{if(!a||!t)return 0;const s=new Date(a),r=new Date(t);if(r{$(!0);try{const a=await p(`${x}/leave-requests.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)});if(a.status===401)return;const t=await a.json();t.success?(b(!1),await g(),await new Promise(s=>setTimeout(s,300)),n.success(t.message),_({leave_type:"vacation",date_from:new Date().toISOString().split("T")[0],date_to:new Date().toISOString().split("T")[0],notes:""})):n.error(t.error)}catch{n.error("Chyba připojení")}finally{$(!1)}};if(J)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]})}),e.jsxs("div",{style:{display:"flex",gap:"1.5rem"},children:[e.jsx("div",{className:"admin-card",style:{flex:2},children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"120px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"180px"}}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsxs("div",{style:{flex:1},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsxs("div",{style:{flex:1},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px"}})]})}),e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:"1rem"},children:[e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.25rem"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100%",height:"6px",borderRadius:"3px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.25rem"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100%",height:"6px",borderRadius:"3px"}})]})})]})]})]});const{ongoing_shift:u,today_shifts:se,leave_balance:y}=i,q=u&&!u.departure_time,W=se.filter(a=>a.departure_time),E=Math.floor(y.vacation_remaining/8),H=y.vacation_remaining%8;return e.jsxs("div",{children:[e.jsx(w.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Docházka"}),e.jsx("p",{className:"admin-page-subtitle",children:new Date().toLocaleDateString("cs-CZ",{weekday:"long",day:"numeric",month:"long",year:"numeric"})})]})}),e.jsxs("div",{className:"attendance-layout",children:[e.jsxs(w.div,{className:"attendance-main",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"attendance-clock-card",children:[e.jsxs("div",{className:"attendance-clock-header",children:[e.jsx("div",{className:"attendance-clock-status",children:q?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"attendance-status-dot active"}),e.jsx("span",{children:"Pracuji"})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"attendance-status-dot"}),e.jsx("span",{children:"Nepracuji"})]})}),e.jsx("div",{className:"attendance-clock-time",children:new Date().toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"})})]}),q?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"attendance-shift-info",children:e.jsxs("div",{className:"attendance-shift-row",children:[e.jsxs("div",{className:"attendance-shift-item",children:[e.jsx("span",{className:"attendance-shift-label",children:"Příchod"}),e.jsx("span",{className:"attendance-shift-value success",children:h(u.arrival_time)})]}),e.jsxs("div",{className:"attendance-shift-item",children:[e.jsx("span",{className:"attendance-shift-label",children:"Pauza"}),e.jsx("span",{className:`attendance-shift-value ${u.break_start?"success":""}`,children:u.break_start?`${h(u.break_start)} - ${h(u.break_end)}`:"—"})]}),e.jsxs("div",{className:"attendance-shift-item",children:[e.jsx("span",{className:"attendance-shift-label",children:"Odchod"}),e.jsx("span",{className:"attendance-shift-value",children:"—"})]})]})}),j.length>0&&e.jsxs("div",{className:"attendance-project-section",children:[e.jsxs("div",{className:"attendance-project-header",children:[e.jsx("span",{className:"attendance-shift-label",children:"Projekt"}),f?e.jsx("span",{className:"admin-badge admin-badge-wrap",style:{fontSize:"0.8125rem"},children:j.find(a=>String(a.id)===String(f))?`${j.find(a=>String(a.id)===String(f)).project_number} – ${j.find(a=>String(a.id)===String(f)).name}`:`Projekt #${f}`}):e.jsx("span",{className:"text-muted",style:{fontSize:"0.8125rem"},children:"Žádný"})]}),e.jsxs("select",{value:f||"",onChange:a=>ae(a.target.value||null),disabled:Y,className:"admin-form-select",style:{fontSize:"0.875rem"},children:[e.jsx("option",{value:"",children:"— Bez projektu —"}),j.map(a=>e.jsxs("option",{value:a.id,children:[a.project_number," – ",a.name]},a.id))]}),F.length>0&&e.jsx("div",{className:"attendance-project-logs",children:F.map((a,t)=>{const s=new Date(a.started_at),r=a.ended_at?new Date(a.ended_at):new Date,m=Math.floor((r-s)/6e4),c=Math.floor(m/60),o=m%60;return e.jsxs("div",{className:"attendance-project-log-item",children:[e.jsx("span",{className:"attendance-project-log-name",children:a.project_name||`Projekt #${a.project_id}`}),e.jsxs("span",{className:"attendance-project-log-time",children:[h(a.started_at)," – ",a.ended_at?h(a.ended_at):"nyní"]}),e.jsxs("span",{className:"attendance-project-log-duration",children:[c,":",String(o).padStart(2,"0")," h"]})]},a.id||t)})})]}),e.jsxs("div",{className:"attendance-clock-actions",children:[!u.break_start&&e.jsx("button",{onClick:X,disabled:N,className:"admin-btn admin-btn-secondary",style:{width:"100%"},children:"Pauza (30 min)"}),e.jsx("button",{onClick:()=>R("departure"),disabled:N,className:"admin-btn admin-btn-primary",style:{width:"100%"},children:N?"Zpracovávám...":"Odchod"}),e.jsx("button",{onClick:()=>b(!0),className:"admin-btn admin-btn-secondary",style:{width:"100%"},children:"Žádost o nepřítomnost"})]}),e.jsxs("div",{className:"attendance-notes",children:[e.jsx("label",{className:"attendance-notes-label",children:"Poznámka ke směně"}),e.jsx("textarea",{value:B,onChange:a=>L(a.target.value),placeholder:"Co jste dělali během směny...",className:"admin-form-textarea",rows:3}),e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Uložit poznámku"})})]})]}):e.jsxs("div",{className:"attendance-clock-actions",children:[e.jsx("button",{onClick:()=>R("arrival"),disabled:N,className:"admin-btn admin-btn-primary",style:{width:"100%"},children:N?"Zpracovávám...":"Příchod"}),e.jsx("button",{onClick:()=>b(!0),className:"admin-btn admin-btn-secondary",style:{width:"100%"},children:"Žádost o nepřítomnost"})]})]}),W.length>0&&e.jsxs("div",{className:"admin-card mt-6",children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h2",{className:"admin-card-title",children:"Dnešní dokončené směny"})}),e.jsx("div",{className:"admin-card-body",children: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:"Příchod"}),e.jsx("th",{children:"Pauza"}),e.jsx("th",{children:"Odchod"}),e.jsx("th",{children:"Odpracováno"}),j.length>0&&e.jsx("th",{children:"Projekty"})]})}),e.jsx("tbody",{children:W.map(a=>{const t=a.project_logs||[];return e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:h(a.arrival_time)}),e.jsx("td",{className:"admin-mono",children:a.break_start&&a.break_end?`${h(a.break_start)} - ${h(a.break_end)}`:"—"}),e.jsx("td",{className:"admin-mono",children:h(a.departure_time)}),e.jsx("td",{className:"admin-mono",children:ce(oe(a),!0)}),j.length>0&&e.jsx("td",{children:t.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.25rem"},children:t.map((s,r)=>{const m=s.ended_at?Math.floor((new Date(s.ended_at)-new Date(s.started_at))/6e4):0,c=Math.floor(m/60),o=m%60;return e.jsxs("span",{style:{fontSize:"12px"},children:[s.project_name||`#${s.project_id}`," (",c,":",String(o).padStart(2,"0"),"h)"]},s.id||r)})}):"—"})]},a.id)})})]})})})]})]}),e.jsxs(w.div,{className:"attendance-sidebar",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"attendance-balance-card",children:[e.jsxs("h3",{className:"attendance-balance-title",children:["Dovolená ",new Date().getFullYear()]}),e.jsxs("div",{className:"attendance-balance-value",children:[e.jsx("span",{className:"attendance-balance-number",children:E}),e.jsxs("span",{className:"attendance-balance-unit",children:[he(E),H>0&&` ${H}h`]})]}),e.jsxs("div",{className:"attendance-balance-detail",children:[e.jsxs("span",{children:["Celkem: ",y.vacation_total,"h"]}),e.jsxs("span",{children:["Čerpáno: ",y.vacation_used,"h"]})]}),e.jsx("div",{className:"attendance-balance-bar",children:e.jsx("div",{className:"attendance-balance-progress",style:{width:`${y.vacation_remaining/y.vacation_total*100}%`}})})]}),i.monthly_fund&&e.jsxs("div",{className:"admin-stat-card",style:{flexDirection:"column",alignItems:"stretch"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"1rem"},children:[e.jsx("div",{className:"admin-stat-icon info",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),e.jsx("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),e.jsx("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),e.jsx("line",{x1:"3",y1:"10",x2:"21",y2:"10"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsx("span",{className:"admin-stat-label",children:i.monthly_fund.month_name}),e.jsxs("span",{className:"admin-stat-value",children:[i.monthly_fund.worked,"h / ",i.monthly_fund.fund,"h"]})]})]}),e.jsxs("div",{style:{marginTop:"0.75rem"},children:[e.jsxs("div",{className:"text-secondary",style:{display:"flex",justifyContent:"space-between",fontSize:"0.8125rem",marginBottom:"0.5rem"},children:[e.jsxs("span",{children:["Odpracováno: ",i.monthly_fund.worked,"h"]}),i.monthly_fund.overtime>0?e.jsxs("span",{className:"text-warning fw-600",children:["Přesčas: +",i.monthly_fund.overtime,"h"]}):e.jsxs("span",{children:["Zbývá: ",i.monthly_fund.remaining,"h"]})]}),e.jsx("div",{className:"attendance-balance-bar",children:e.jsx("div",{className:"attendance-balance-progress",style:{width:`${Math.min(100,i.monthly_fund.covered/i.monthly_fund.fund*100)}%`,background:ue(i.monthly_fund)}})}),i.monthly_fund.leave_hours>0&&e.jsxs("div",{className:"text-muted",style:{fontSize:"0.75rem",marginTop:"0.375rem"},children:["Pokryto: ",i.monthly_fund.covered,"h (práce ",i.monthly_fund.worked,"h",i.monthly_fund.vacation_hours>0&&` + dovolená ${i.monthly_fund.vacation_hours}h`,i.monthly_fund.sick_hours>0&&` + nemoc ${i.monthly_fund.sick_hours}h`,i.monthly_fund.holiday_hours>0&&` + svátek ${i.monthly_fund.holiday_hours}h`,i.monthly_fund.unpaid_hours>0&&` + neplacené ${i.monthly_fund.unpaid_hours}h`,")"]})]})]}),e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-stat-icon danger",children:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M22 12h-4l-3 9L9 3l-3 9H2"})})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-label",children:["Nemoc ",new Date().getFullYear()]}),e.jsxs("span",{className:"admin-stat-value",children:[y.sick_used,"h čerpáno"]})]})]}),e.jsxs("div",{className:"attendance-quick-links",children:[e.jsx("h4",{className:"attendance-quick-title",children:"Rychlé odkazy"}),e.jsxs(C,{to:"/attendance/requests",className:"attendance-quick-link",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M9 11l3 3L22 4"}),e.jsx("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})]}),e.jsx("span",{children:"Moje žádosti"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]}),e.jsxs(C,{to:"/attendance/history",className:"attendance-quick-link",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M3 3v18h18"}),e.jsx("path",{d:"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3"})]}),e.jsx("span",{children:"Historie docházky"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]}),D("attendance.admin")&&e.jsxs(C,{to:"/attendance/admin",className:"attendance-quick-link",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),e.jsx("circle",{cx:"9",cy:"7",r:"4"}),e.jsx("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),e.jsx("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})]}),e.jsx("span",{children:"Správa docházky"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]}),D("attendance.balances")&&e.jsxs(C,{to:"/attendance/balances",className:"attendance-quick-link",children:[e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"})}),e.jsx("span",{children:"Správa bilancí"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]})]})]})]}),e.jsx(ne,{children:z&&e.jsxs(w.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:()=>b(!1)}),e.jsxs(w.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Žádost o nepřítomnost"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(P,{label:"Typ nepřítomnosti",children:e.jsxs("select",{value:d.leave_type,onChange:a=>_({...d,leave_type:a.target.value}),className:"admin-form-select",children:[e.jsx("option",{value:"vacation",children:"Dovolená"}),e.jsx("option",{value:"sick",children:"Nemoc"}),e.jsx("option",{value:"unpaid",children:"Neplacené volno"})]})}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1rem"},children:[e.jsx(P,{label:"Od",children:e.jsx(Z,{mode:"date",value:d.date_from,onChange:a=>{_(t=>({...t,date_from:a,date_to:t.date_to_({...d,date_to:a})})})]}),d.date_from&&d.date_to&&e.jsx("div",{className:"admin-form-group",children:e.jsxs("div",{style:{display:"flex",gap:"1.5rem",padding:"0.75rem 1rem",background:"var(--bg-tertiary)",borderRadius:"var(--border-radius)",fontSize:"0.875rem"},children:[e.jsxs("span",{children:[e.jsx("strong",{children:S(d.date_from,d.date_to)})," ",(()=>{const a=S(d.date_from,d.date_to);return a===1?"pracovní den":a>=2&&a<=4?"pracovní dny":"pracovních dnů"})()]}),e.jsxs("span",{className:"text-muted",children:[S(d.date_from,d.date_to)*8," hodin"]})]})}),e.jsx(P,{label:"Poznámka",children:e.jsx("textarea",{value:d.notes,onChange:a=>_({...d,notes:a.target.value}),placeholder:"Volitelná poznámka...",className:"admin-form-textarea",rows:2})})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>b(!1),className:"admin-btn admin-btn-secondary",disabled:M,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:te,disabled:M||S(d.date_from,d.date_to)===0,className:"admin-btn admin-btn-primary",children:M?"Odesílám...":"Odeslat žádost"})]})]})]})}),e.jsx(re,{isOpen:I.show,onClose:()=>{O({show:!1,action:null}),v(!1)},onConfirm:()=>{O({show:!1,action:null}),T(I.action,{})},title:"GPS nedostupná",message:"Nepodařilo se získat polohu. Chcete pokračovat bez GPS?",confirmText:"Pokračovat",cancelText:"Zrušit",type:"warning"})]})}export{ge as default}; +import{j as e,m as w,A as ne}from"./vendor-animation-0s3FMHwK.js";import{r as l,L as C}from"./vendor-react-BVs3cwbi.js";import{a as ie,u as de,c as p,b as le,F as P,A as Z,C as re}from"./index-Bay45BGf.js";import{f as h,a as ce,c as oe}from"./attendanceHelpers-D6sLEw0q.js";import{F as me}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const x="/api/admin";function he(n){return n===1?"den":n>=2&&n<=4?"dny":"dnů"}function ue(n){return n.overtime>0?"linear-gradient(135deg, var(--warning), #d97706)":n.covered>=n.fund?"linear-gradient(135deg, var(--success), #059669)":"var(--gradient)"}function ge(){const n=ie(),{hasPermission:D}=de(),[J,G]=l.useState(!0),[N,v]=l.useState(!1),[i,V]=l.useState({ongoing_shift:null,today_shifts:[],date:"",leave_balance:{vacation_total:160,vacation_used:0,vacation_remaining:160,sick_used:0},monthly_fund:null}),[z,b]=l.useState(!1),[d,_]=l.useState({leave_type:"vacation",date_from:new Date().toISOString().split("T")[0],date_to:new Date().toISOString().split("T")[0],notes:""}),[M,$]=l.useState(!1),[B,L]=l.useState(""),[j,U]=l.useState([]),[Y,A]=l.useState(!1),[F,K]=l.useState([]),[f,Q]=l.useState(null),[I,O]=l.useState({show:!1,action:null}),k=l.useRef(null);l.useEffect(()=>()=>{k.current&&k.current.abort()},[]);const g=l.useCallback(async()=>{try{const a=await p(`${x}/attendance.php`);if(a.status===401)return;const t=await a.json();t.success&&(V(t.data),L(t.data.ongoing_shift?.notes||""),K(t.data.project_logs||[]),Q(t.data.active_project_id||null))}catch{n.error("Nepodařilo se načíst data")}finally{G(!1)}},[n]);if(l.useEffect(()=>{g()},[g]),l.useEffect(()=>{(async()=>{try{const s=await(await p(`${x}/attendance.php?action=projects`)).json();s.success&&U(s.data.projects||[])}catch{}})()},[]),le(z),!D("attendance.record"))return e.jsx(me,{});const R=a=>{if(v(!0),!navigator.geolocation){n.warning("GPS není dostupná"),T(a,{});return}navigator.geolocation.getCurrentPosition(t=>{const{latitude:s,longitude:r,accuracy:m}=t.coords;T(a,{latitude:s,longitude:r,accuracy:m,address:""}),k.current&&k.current.abort();const c=new AbortController;k.current=c,fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${s}&lon=${r}&zoom=18&addressdetails=1`,{headers:{"Accept-Language":"cs"},signal:c.signal}).then(o=>o.json()).then(o=>{o.display_name&&p(`${x}/attendance.php?action=update_address`,{method:"POST",body:JSON.stringify({latitude:s,longitude:r,address:o.display_name,punch_action:a})}).catch(()=>{})}).catch(()=>{})},t=>{let s="Nepodařilo se získat polohu";t.code===t.PERMISSION_DENIED?s="Přístup k poloze byl zamítnut":t.code===t.TIMEOUT&&(s="Vypršel časový limit"),n.error(s),O({show:!0,action:a})},{enableHighAccuracy:!0,timeout:1e4,maximumAge:6e4})},T=async(a,t={})=>{try{const s=await p(`${x}/attendance.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({punch_action:a,...t})});if(s.status===401)return;const r=await s.json();v(!1),r.success?(await g(),setTimeout(()=>{n.success(r.message)},300)):n.error(r.error)}catch{v(!1),n.error("Chyba připojení")}},X=async()=>{v(!0);try{const a=await p(`${x}/attendance.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({punch_action:"break_start"})});if(a.status===401)return;const t=await a.json();t.success?(await g(),n.success(t.message)):n.error(t.error)}catch{n.error("Chyba připojení")}finally{v(!1)}},ee=async()=>{try{const a=await p(`${x}/attendance.php?action=notes`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:B})});if(a.status===401)return;const t=await a.json();t.success?n.success("Poznámka byla uložena"):n.error(t.error)}catch{n.error("Chyba připojení")}},ae=async a=>{A(!0);try{const t=await p(`${x}/attendance.php?action=switch_project`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:a||null})});if(t.status===401)return;const s=await t.json();s.success?(await g(),n.success(s.message)):n.error(s.error)}catch{n.error("Chyba připojení")}finally{A(!1)}},S=(a,t)=>{if(!a||!t)return 0;const s=new Date(a),r=new Date(t);if(r{$(!0);try{const a=await p(`${x}/leave-requests.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)});if(a.status===401)return;const t=await a.json();t.success?(b(!1),await g(),await new Promise(s=>setTimeout(s,300)),n.success(t.message),_({leave_type:"vacation",date_from:new Date().toISOString().split("T")[0],date_to:new Date().toISOString().split("T")[0],notes:""})):n.error(t.error)}catch{n.error("Chyba připojení")}finally{$(!1)}};if(J)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]})}),e.jsxs("div",{style:{display:"flex",gap:"1.5rem"},children:[e.jsx("div",{className:"admin-card",style:{flex:2},children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"120px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"180px"}}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsxs("div",{style:{flex:1},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsxs("div",{style:{flex:1},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px"}})]})}),e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:"1rem"},children:[e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.25rem"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100%",height:"6px",borderRadius:"3px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.25rem"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100%",height:"6px",borderRadius:"3px"}})]})})]})]})]});const{ongoing_shift:u,today_shifts:se,leave_balance:y}=i,q=u&&!u.departure_time,W=se.filter(a=>a.departure_time),E=Math.floor(y.vacation_remaining/8),H=y.vacation_remaining%8;return e.jsxs("div",{children:[e.jsx(w.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Docházka"}),e.jsx("p",{className:"admin-page-subtitle",children:new Date().toLocaleDateString("cs-CZ",{weekday:"long",day:"numeric",month:"long",year:"numeric"})})]})}),e.jsxs("div",{className:"attendance-layout",children:[e.jsxs(w.div,{className:"attendance-main",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"attendance-clock-card",children:[e.jsxs("div",{className:"attendance-clock-header",children:[e.jsx("div",{className:"attendance-clock-status",children:q?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"attendance-status-dot active"}),e.jsx("span",{children:"Pracuji"})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"attendance-status-dot"}),e.jsx("span",{children:"Nepracuji"})]})}),e.jsx("div",{className:"attendance-clock-time",children:new Date().toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"})})]}),q?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"attendance-shift-info",children:e.jsxs("div",{className:"attendance-shift-row",children:[e.jsxs("div",{className:"attendance-shift-item",children:[e.jsx("span",{className:"attendance-shift-label",children:"Příchod"}),e.jsx("span",{className:"attendance-shift-value success",children:h(u.arrival_time)})]}),e.jsxs("div",{className:"attendance-shift-item",children:[e.jsx("span",{className:"attendance-shift-label",children:"Pauza"}),e.jsx("span",{className:`attendance-shift-value ${u.break_start?"success":""}`,children:u.break_start?`${h(u.break_start)} - ${h(u.break_end)}`:"—"})]}),e.jsxs("div",{className:"attendance-shift-item",children:[e.jsx("span",{className:"attendance-shift-label",children:"Odchod"}),e.jsx("span",{className:"attendance-shift-value",children:"—"})]})]})}),j.length>0&&e.jsxs("div",{className:"attendance-project-section",children:[e.jsxs("div",{className:"attendance-project-header",children:[e.jsx("span",{className:"attendance-shift-label",children:"Projekt"}),f?e.jsx("span",{className:"admin-badge admin-badge-wrap",style:{fontSize:"0.8125rem"},children:j.find(a=>String(a.id)===String(f))?`${j.find(a=>String(a.id)===String(f)).project_number} – ${j.find(a=>String(a.id)===String(f)).name}`:`Projekt #${f}`}):e.jsx("span",{className:"text-muted",style:{fontSize:"0.8125rem"},children:"Žádný"})]}),e.jsxs("select",{value:f||"",onChange:a=>ae(a.target.value||null),disabled:Y,className:"admin-form-select",style:{fontSize:"0.875rem"},children:[e.jsx("option",{value:"",children:"— Bez projektu —"}),j.map(a=>e.jsxs("option",{value:a.id,children:[a.project_number," – ",a.name]},a.id))]}),F.length>0&&e.jsx("div",{className:"attendance-project-logs",children:F.map((a,t)=>{const s=new Date(a.started_at),r=a.ended_at?new Date(a.ended_at):new Date,m=Math.floor((r-s)/6e4),c=Math.floor(m/60),o=m%60;return e.jsxs("div",{className:"attendance-project-log-item",children:[e.jsx("span",{className:"attendance-project-log-name",children:a.project_name||`Projekt #${a.project_id}`}),e.jsxs("span",{className:"attendance-project-log-time",children:[h(a.started_at)," – ",a.ended_at?h(a.ended_at):"nyní"]}),e.jsxs("span",{className:"attendance-project-log-duration",children:[c,":",String(o).padStart(2,"0")," h"]})]},a.id||t)})})]}),e.jsxs("div",{className:"attendance-clock-actions",children:[!u.break_start&&e.jsx("button",{onClick:X,disabled:N,className:"admin-btn admin-btn-secondary",style:{width:"100%"},children:"Pauza (30 min)"}),e.jsx("button",{onClick:()=>R("departure"),disabled:N,className:"admin-btn admin-btn-primary",style:{width:"100%"},children:N?"Zpracovávám...":"Odchod"}),e.jsx("button",{onClick:()=>b(!0),className:"admin-btn admin-btn-secondary",style:{width:"100%"},children:"Žádost o nepřítomnost"})]}),e.jsxs("div",{className:"attendance-notes",children:[e.jsx("label",{className:"attendance-notes-label",children:"Poznámka ke směně"}),e.jsx("textarea",{value:B,onChange:a=>L(a.target.value),placeholder:"Co jste dělali během směny...",className:"admin-form-textarea",rows:3}),e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Uložit poznámku"})})]})]}):e.jsxs("div",{className:"attendance-clock-actions",children:[e.jsx("button",{onClick:()=>R("arrival"),disabled:N,className:"admin-btn admin-btn-primary",style:{width:"100%"},children:N?"Zpracovávám...":"Příchod"}),e.jsx("button",{onClick:()=>b(!0),className:"admin-btn admin-btn-secondary",style:{width:"100%"},children:"Žádost o nepřítomnost"})]})]}),W.length>0&&e.jsxs("div",{className:"admin-card mt-6",children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h2",{className:"admin-card-title",children:"Dnešní dokončené směny"})}),e.jsx("div",{className:"admin-card-body",children: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:"Příchod"}),e.jsx("th",{children:"Pauza"}),e.jsx("th",{children:"Odchod"}),e.jsx("th",{children:"Odpracováno"}),j.length>0&&e.jsx("th",{children:"Projekty"})]})}),e.jsx("tbody",{children:W.map(a=>{const t=a.project_logs||[];return e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:h(a.arrival_time)}),e.jsx("td",{className:"admin-mono",children:a.break_start&&a.break_end?`${h(a.break_start)} - ${h(a.break_end)}`:"—"}),e.jsx("td",{className:"admin-mono",children:h(a.departure_time)}),e.jsx("td",{className:"admin-mono",children:ce(oe(a),!0)}),j.length>0&&e.jsx("td",{children:t.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.25rem"},children:t.map((s,r)=>{const m=s.ended_at?Math.floor((new Date(s.ended_at)-new Date(s.started_at))/6e4):0,c=Math.floor(m/60),o=m%60;return e.jsxs("span",{style:{fontSize:"12px"},children:[s.project_name||`#${s.project_id}`," (",c,":",String(o).padStart(2,"0"),"h)"]},s.id||r)})}):"—"})]},a.id)})})]})})})]})]}),e.jsxs(w.div,{className:"attendance-sidebar",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"attendance-balance-card",children:[e.jsxs("h3",{className:"attendance-balance-title",children:["Dovolená ",new Date().getFullYear()]}),e.jsxs("div",{className:"attendance-balance-value",children:[e.jsx("span",{className:"attendance-balance-number",children:E}),e.jsxs("span",{className:"attendance-balance-unit",children:[he(E),H>0&&` ${H}h`]})]}),e.jsxs("div",{className:"attendance-balance-detail",children:[e.jsxs("span",{children:["Celkem: ",y.vacation_total,"h"]}),e.jsxs("span",{children:["Čerpáno: ",y.vacation_used,"h"]})]}),e.jsx("div",{className:"attendance-balance-bar",children:e.jsx("div",{className:"attendance-balance-progress",style:{width:`${y.vacation_remaining/y.vacation_total*100}%`}})})]}),i.monthly_fund&&e.jsxs("div",{className:"admin-stat-card",style:{flexDirection:"column",alignItems:"stretch"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"1rem"},children:[e.jsx("div",{className:"admin-stat-icon info",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),e.jsx("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),e.jsx("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),e.jsx("line",{x1:"3",y1:"10",x2:"21",y2:"10"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsx("span",{className:"admin-stat-label",children:i.monthly_fund.month_name}),e.jsxs("span",{className:"admin-stat-value",children:[i.monthly_fund.worked,"h / ",i.monthly_fund.fund,"h"]})]})]}),e.jsxs("div",{style:{marginTop:"0.75rem"},children:[e.jsxs("div",{className:"text-secondary",style:{display:"flex",justifyContent:"space-between",fontSize:"0.8125rem",marginBottom:"0.5rem"},children:[e.jsxs("span",{children:["Odpracováno: ",i.monthly_fund.worked,"h"]}),i.monthly_fund.overtime>0?e.jsxs("span",{className:"text-warning fw-600",children:["Přesčas: +",i.monthly_fund.overtime,"h"]}):e.jsxs("span",{children:["Zbývá: ",i.monthly_fund.remaining,"h"]})]}),e.jsx("div",{className:"attendance-balance-bar",children:e.jsx("div",{className:"attendance-balance-progress",style:{width:`${Math.min(100,i.monthly_fund.covered/i.monthly_fund.fund*100)}%`,background:ue(i.monthly_fund)}})}),i.monthly_fund.leave_hours>0&&e.jsxs("div",{className:"text-muted",style:{fontSize:"0.75rem",marginTop:"0.375rem"},children:["Pokryto: ",i.monthly_fund.covered,"h (práce ",i.monthly_fund.worked,"h",i.monthly_fund.vacation_hours>0&&` + dovolená ${i.monthly_fund.vacation_hours}h`,i.monthly_fund.sick_hours>0&&` + nemoc ${i.monthly_fund.sick_hours}h`,i.monthly_fund.holiday_hours>0&&` + svátek ${i.monthly_fund.holiday_hours}h`,i.monthly_fund.unpaid_hours>0&&` + neplacené ${i.monthly_fund.unpaid_hours}h`,")"]})]})]}),e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-stat-icon danger",children:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M22 12h-4l-3 9L9 3l-3 9H2"})})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-label",children:["Nemoc ",new Date().getFullYear()]}),e.jsxs("span",{className:"admin-stat-value",children:[y.sick_used,"h čerpáno"]})]})]}),e.jsxs("div",{className:"attendance-quick-links",children:[e.jsx("h4",{className:"attendance-quick-title",children:"Rychlé odkazy"}),e.jsxs(C,{to:"/attendance/requests",className:"attendance-quick-link",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M9 11l3 3L22 4"}),e.jsx("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})]}),e.jsx("span",{children:"Moje žádosti"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]}),e.jsxs(C,{to:"/attendance/history",className:"attendance-quick-link",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M3 3v18h18"}),e.jsx("path",{d:"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3"})]}),e.jsx("span",{children:"Historie docházky"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]}),D("attendance.admin")&&e.jsxs(C,{to:"/attendance/admin",className:"attendance-quick-link",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),e.jsx("circle",{cx:"9",cy:"7",r:"4"}),e.jsx("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),e.jsx("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})]}),e.jsx("span",{children:"Správa docházky"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]}),D("attendance.balances")&&e.jsxs(C,{to:"/attendance/balances",className:"attendance-quick-link",children:[e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"})}),e.jsx("span",{children:"Správa bilancí"}),e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M9 18l6-6-6-6"})})]})]})]})]}),e.jsx(ne,{children:z&&e.jsxs(w.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:()=>b(!1)}),e.jsxs(w.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Žádost o nepřítomnost"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(P,{label:"Typ nepřítomnosti",children:e.jsxs("select",{value:d.leave_type,onChange:a=>_({...d,leave_type:a.target.value}),className:"admin-form-select",children:[e.jsx("option",{value:"vacation",children:"Dovolená"}),e.jsx("option",{value:"sick",children:"Nemoc"}),e.jsx("option",{value:"unpaid",children:"Neplacené volno"})]})}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1rem"},children:[e.jsx(P,{label:"Od",children:e.jsx(Z,{mode:"date",value:d.date_from,onChange:a=>{_(t=>({...t,date_from:a,date_to:t.date_to_({...d,date_to:a})})})]}),d.date_from&&d.date_to&&e.jsx("div",{className:"admin-form-group",children:e.jsxs("div",{style:{display:"flex",gap:"1.5rem",padding:"0.75rem 1rem",background:"var(--bg-tertiary)",borderRadius:"var(--border-radius)",fontSize:"0.875rem"},children:[e.jsxs("span",{children:[e.jsx("strong",{children:S(d.date_from,d.date_to)})," ",(()=>{const a=S(d.date_from,d.date_to);return a===1?"pracovní den":a>=2&&a<=4?"pracovní dny":"pracovních dnů"})()]}),e.jsxs("span",{className:"text-muted",children:[S(d.date_from,d.date_to)*8," hodin"]})]})}),e.jsx(P,{label:"Poznámka",children:e.jsx("textarea",{value:d.notes,onChange:a=>_({...d,notes:a.target.value}),placeholder:"Volitelná poznámka...",className:"admin-form-textarea",rows:2})})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>b(!1),className:"admin-btn admin-btn-secondary",disabled:M,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:te,disabled:M||S(d.date_from,d.date_to)===0,className:"admin-btn admin-btn-primary",children:M?"Odesílám...":"Odeslat žádost"})]})]})]})}),e.jsx(re,{isOpen:I.show,onClose:()=>{O({show:!1,action:null}),v(!1)},onConfirm:()=>{O({show:!1,action:null}),T(I.action,{})},title:"GPS nedostupná",message:"Nepodařilo se získat polohu. Chcete pokračovat bez GPS?",confirmText:"Pokračovat",cancelText:"Zrušit",type:"warning"})]})}export{ge as default}; diff --git a/dist/assets/AttendanceAdmin-DcoOGyDw.js b/dist/assets/AttendanceAdmin-Cdnpy6ht.js similarity index 99% rename from dist/assets/AttendanceAdmin-DcoOGyDw.js rename to dist/assets/AttendanceAdmin-Cdnpy6ht.js index af0e08c..a3e62c3 100644 --- a/dist/assets/AttendanceAdmin-DcoOGyDw.js +++ b/dist/assets/AttendanceAdmin-Cdnpy6ht.js @@ -1,4 +1,4 @@ -import{j as e,A as pe,m as T}from"./vendor-animation-0s3FMHwK.js";import{b as Z,A as j,c as L,a as we,u as Se,F as ce,C as Ce}from"./index-BrM8fzBu.js";import{F as ze}from"./Forbidden-D25jV3Oq.js";import{b as le,j as ue,k as xe,c as $e,g as be,d as ve,e as me,a as Q,f as oe,l as J,m as q,h as Me,i as G}from"./attendanceHelpers-D6sLEw0q.js";import{L as Pe,r as v}from"./vendor-react-BVs3cwbi.js";import{a9 as Te}from"./vendor-utils-Dyr8OjFr.js";function Be({show:a,onClose:s,form:d,setForm:n,users:r,onSubmit:m,submitting:l,toggleUser:h,toggleAllUsers:_}){return Z(a),e.jsx(pe,{children:a&&e.jsxs(T.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:()=>!l&&s()}),e.jsxs(T.div,{className:"admin-modal admin-modal-lg",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:"Vyplnit docházku za měsíc"}),e.jsx("p",{style:{color:"var(--text-secondary)",marginTop:"0.25rem",fontSize:"0.875rem"},children:"Vytvoří záznamy pro všechny pracovní dny. Svátky se automaticky označí. Existující záznamy se přeskočí."})]}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Měsíc"}),e.jsx(j,{mode:"month",value:d.month,onChange:p=>n({...d,month:p})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsxs("label",{className:"admin-form-label",children:["Zaměstnanci",e.jsx("button",{type:"button",onClick:_,style:{marginLeft:"0.75rem",background:"none",border:"none",color:"var(--accent-color)",cursor:"pointer",fontSize:"0.8125rem",fontWeight:500,padding:0},children:d.user_ids.length===r.length?"Odznačit vše":"Vybrat vše"})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.375rem",maxHeight:"200px",overflowY:"auto",padding:"0.75rem",background:"var(--bg-tertiary)",borderRadius:"var(--border-radius-sm)",border:"1px solid var(--border-color)"},children:r.map(p=>e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:d.user_ids.includes(String(p.id)),onChange:()=>h(p.id)}),e.jsx("span",{children:p.name})]},p.id))}),e.jsxs("small",{className:"admin-form-hint",children:["Vybráno: ",d.user_ids.length," z ",r.length]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Příchod"}),e.jsx(j,{mode:"time",value:d.arrival_time,onChange:p=>n({...d,arrival_time:p})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Odchod"}),e.jsx(j,{mode:"time",value:d.departure_time,onChange:p=>n({...d,departure_time:p})})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Začátek pauzy"}),e.jsx(j,{mode:"time",value:d.break_start_time,onChange:p=>n({...d,break_start_time:p})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Konec pauzy"}),e.jsx(j,{mode:"time",value:d.break_end_time,onChange:p=>n({...d,break_end_time:p})})]})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:s,className:"admin-btn admin-btn-secondary",disabled:l,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:m,className:"admin-btn admin-btn-primary",disabled:l||d.user_ids.length===0,children:l?"Vytvářím záznamy...":"Vyplnit měsíc"})]})]})]})})}let Fe=0;function Le({form:a,projectLogs:s}){const d=ue(a),n=xe(s),r=d-n;if(!s.some(h=>h.project_id)||d<=0)return null;const l=r===0;return e.jsxs("div",{style:{padding:"0.5rem 0.75rem",marginBottom:"0.5rem",borderRadius:"6px",fontSize:"0.8rem",background:l?"var(--success-bg, rgba(34,197,94,0.1))":"var(--danger-bg, rgba(239,68,68,0.1))",color:l?"var(--success-color, #16a34a)":"var(--danger-color, #dc2626)",border:`1px solid ${l?"var(--success-border, rgba(34,197,94,0.3))":"var(--danger-border, rgba(239,68,68,0.3))"}`},children:["Odpracováno: ",Math.floor(d/60),"h ",d%60,"m | Přiřazeno: ",Math.floor(n/60),"h ",n%60,"m | Zbývá: ",Math.floor(Math.abs(r)/60),"h ",Math.abs(r)%60,"m ",r<0?"(překročeno)":""]})}function Oe({log:a,index:s,projectList:d,onUpdate:n,onRemove:r}){return e.jsxs("div",{className:"flex-row gap-2 mb-2",children:[e.jsxs("select",{value:a.project_id,onChange:m=>n(s,"project_id",m.target.value),className:"admin-form-select",style:{flex:3,marginBottom:0},children:[e.jsx("option",{value:"",children:"— Projekt —"}),d.map(m=>e.jsxs("option",{value:m.id,children:[m.project_number," – ",m.name]},m.id))]}),e.jsx("input",{type:"number",min:"0",max:"24",value:a.hours,onChange:m=>n(s,"hours",m.target.value),className:"admin-form-input",style:{width:"60px",marginBottom:0,textAlign:"center"},placeholder:"h"}),e.jsx("span",{style:{fontSize:"0.85rem",color:"var(--text-secondary)"},children:"h"}),e.jsx("input",{type:"number",min:"0",max:"59",value:a.minutes,onChange:m=>n(s,"minutes",m.target.value),className:"admin-form-input",style:{width:"60px",marginBottom:0,textAlign:"center"},placeholder:"m"}),e.jsx("span",{style:{fontSize:"0.85rem",color:"var(--text-secondary)"},children:"m"}),e.jsx("button",{type:"button",onClick:()=>r(s),className:"admin-btn admin-btn-secondary admin-btn-sm",style:{padding:"0.375rem",flexShrink:0},title:"Odebrat",children:e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]})}function he({mode:a,show:s,onClose:d,onSubmit:n,form:r,setForm:m,projectLogs:l,setProjectLogs:h,projectList:_,users:p,onShiftDateChange:w,editingRecord:S}){Z(s);const y=a==="create",k=r.leave_type==="work",x=(i,f)=>{m({...r,[i]:f})},E=(i,f,M)=>{const z=[...l];z[i]={...z[i],[f]:M},h(z)},B=i=>{h(l.filter((f,M)=>M!==i))},C=()=>{h([...l,{_key:`log-${++Fe}`,project_id:"",hours:"",minutes:""}])};return e.jsx(pe,{children:s&&e.jsxs(T.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:d}),e.jsxs(T.div,{className:"admin-modal admin-modal-lg",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:y?"Přidat záznam docházky":"Upravit docházku"}),!y&&S&&e.jsxs("p",{style:{color:"var(--text-secondary)",marginTop:"0.25rem"},children:[S.user_name," — ",le(S.shift_date)]})]}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[y?e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label required",children:"Zaměstnanec"}),e.jsxs("select",{value:r.user_id,onChange:i=>x("user_id",i.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"",children:"Vyberte zaměstnance"}),p.map(i=>e.jsx("option",{value:i.id,children:i.name},i.id))]})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label required",children:"Datum směny"}),e.jsx(j,{mode:"date",value:r.shift_date,onChange:i=>w(i)})]})]}):e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Datum směny"}),e.jsx(j,{mode:"date",value:r.shift_date,onChange:i=>x("shift_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Typ záznamu"}),e.jsxs("select",{value:r.leave_type,onChange:i=>x("leave_type",i.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"work",children:"Práce"}),e.jsx("option",{value:"vacation",children:"Dovolená"}),e.jsx("option",{value:"sick",children:"Nemoc"}),e.jsx("option",{value:"holiday",children:"Svátek"}),e.jsx("option",{value:"unpaid",children:"Neplacené volno"})]})]}),!k&&e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Počet hodin"}),e.jsx("input",{type:"number",inputMode:"decimal",value:r.leave_hours,onChange:i=>x("leave_hours",parseFloat(i.target.value)),min:"0.5",max:"24",step:"0.5",className:"admin-form-input"}),y&&e.jsx("small",{className:"admin-form-hint",children:"8 hodin = celý den"})]}),k&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Příchod - datum"}),e.jsx(j,{mode:"date",value:r.arrival_date,onChange:i=>x("arrival_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Příchod - čas"}),e.jsx(j,{mode:"time",value:r.arrival_time,onChange:i=>x("arrival_time",i)})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Začátek pauzy - datum"}),e.jsx(j,{mode:"date",value:r.break_start_date,onChange:i=>x("break_start_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Začátek pauzy - čas"}),e.jsx(j,{mode:"time",value:r.break_start_time,onChange:i=>x("break_start_time",i)})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Konec pauzy - datum"}),e.jsx(j,{mode:"date",value:r.break_end_date,onChange:i=>x("break_end_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Konec pauzy - čas"}),e.jsx(j,{mode:"time",value:r.break_end_time,onChange:i=>x("break_end_time",i)})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Odchod - datum"}),e.jsx(j,{mode:"date",value:r.departure_date,onChange:i=>x("departure_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Odchod - čas"}),e.jsx(j,{mode:"time",value:r.departure_time,onChange:i=>x("departure_time",i)})]})]})]}),k&&_.length>0&&e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Projekty"}),e.jsx(Le,{form:r,projectLogs:l}),l.map((i,f)=>e.jsx(Oe,{log:i,index:f,projectList:_,onUpdate:E,onRemove:B},i._key||f)),e.jsx("button",{type:"button",onClick:C,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"+ Přidat projekt"})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Poznámka"}),e.jsx("textarea",{value:r.notes,onChange:i=>x("notes",i.target.value),className:"admin-form-textarea",rows:3})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:d,className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"button",onClick:n,className:"admin-btn admin-btn-primary",children:"Uložit"})]})]})]})})}function Ee(a){return a.break_start&&a.break_end?`${oe(a.break_start)} - ${oe(a.break_end)}`:a.break_start?`${oe(a.break_start)} - ?`:"—"}function Ae(a){return a.project_logs&&a.project_logs.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.125rem"},children:a.project_logs.map((s,d)=>{let n,r,m=!1;if(s.hours!==null&&s.hours!==void 0)n=parseInt(s.hours)||0,r=parseInt(s.minutes)||0;else{m=!s.ended_at;const l=s.ended_at?new Date(s.ended_at):new Date,h=Math.floor((l-new Date(s.started_at))/6e4);n=Math.floor(h/60),r=h%60}return e.jsxs("span",{className:"admin-badge",style:{fontSize:"0.7rem",display:"inline-block",background:m?"var(--accent-light)":void 0},children:[s.project_name||`#${s.project_id}`," (",n,":",String(r).padStart(2,"0"),"h",m?" ▸":"",")"]},s.id||d)})}):a.project_name?e.jsx("span",{className:"admin-badge admin-badge-wrap",style:{fontSize:"0.75rem"},children:a.project_name}):"—"}function We({records:a,onEdit:s,onDelete:d}){return a.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Za tento měsíc nejsou žádné záznamy."})}):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:"Datum"}),e.jsx("th",{children:"Zaměstnanec"}),e.jsx("th",{children:"Typ"}),e.jsx("th",{children:"Příchod"}),e.jsx("th",{children:"Pauza"}),e.jsx("th",{children:"Odchod"}),e.jsx("th",{children:"Hodiny"}),e.jsx("th",{children:"Projekt"}),e.jsx("th",{children:"GPS"}),e.jsx("th",{children:"Poznámka"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:a.map(n=>{const r=n.leave_type||"work",m=r!=="work",l=m?(n.leave_hours||8)*60:$e(n),h=n.arrival_lat&&n.arrival_lng||n.departure_lat&&n.departure_lng;return e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:le(n.shift_date)}),e.jsx("td",{children:n.user_name}),e.jsx("td",{children:e.jsx("span",{className:`attendance-leave-badge ${ve(r)}`,children:be(r)})}),e.jsx("td",{className:"admin-mono",children:m?"—":me(n.arrival_time)}),e.jsx("td",{className:"admin-mono",children:m?"—":Ee(n)}),e.jsx("td",{className:"admin-mono",children:m?"—":me(n.departure_time)}),e.jsx("td",{className:"admin-mono",children:l>0?`${Q(l)} h`:"—"}),e.jsx("td",{children:Ae(n)}),e.jsx("td",{children:h?e.jsx(Pe,{to:`/attendance/location/${n.id}`,className:"attendance-gps-link",title:"Zobrazit polohu","aria-label":"Zobrazit polohu",children:"📍"}):"—"}),e.jsx("td",{style:{maxWidth:"100px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:n.notes||"",children:n.notes||""}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>s(n),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",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:()=>d(n),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},n.id)})})]})})}const O="/api/admin";function Ze(a){return a.overtime>0?`+${a.overtime}h přesčas`:a.missing>0?`−${a.missing}h`:'splněno'}function Re(a){return a.project_logs&&a.project_logs.length>0?a.project_logs.map(s=>{let d,n;if(s.hours!==null&&s.hours!==void 0)d=parseInt(s.hours)||0,n=parseInt(s.minutes)||0;else if(s.started_at&&s.ended_at){const r=Math.max(0,Math.floor((new Date(s.ended_at)-new Date(s.started_at))/6e4));d=Math.floor(r/60),n=r%60}else d=0,n=0;return`
${s.project_name||`#${s.project_id}`} (${d}:${String(n).padStart(2,"0")}h)
`}).join(""):a.project_name||"—"}function Ue(a,s,d){const n=d.leave_balances[a]?Ve(a,s,d):"",r=s.records.map(l=>{const h=l.leave_type||"work",_=h!=="work",p=Me(l),w=Math.floor(p/60),S=p%60,y=_||!l.break_start||!l.break_end?"—":`${G(l.break_start,l.shift_date)} - ${G(l.break_end,l.shift_date)}`;return` +import{j as e,A as pe,m as T}from"./vendor-animation-0s3FMHwK.js";import{b as Z,A as j,c as L,a as we,u as Se,F as ce,C as Ce}from"./index-Bay45BGf.js";import{F as ze}from"./Forbidden-D25jV3Oq.js";import{b as le,j as ue,k as xe,c as $e,g as be,d as ve,e as me,a as Q,f as oe,l as J,m as q,h as Me,i as G}from"./attendanceHelpers-D6sLEw0q.js";import{L as Pe,r as v}from"./vendor-react-BVs3cwbi.js";import{a9 as Te}from"./vendor-utils-Dyr8OjFr.js";function Be({show:a,onClose:s,form:d,setForm:n,users:r,onSubmit:m,submitting:l,toggleUser:h,toggleAllUsers:_}){return Z(a),e.jsx(pe,{children:a&&e.jsxs(T.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:()=>!l&&s()}),e.jsxs(T.div,{className:"admin-modal admin-modal-lg",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:"Vyplnit docházku za měsíc"}),e.jsx("p",{style:{color:"var(--text-secondary)",marginTop:"0.25rem",fontSize:"0.875rem"},children:"Vytvoří záznamy pro všechny pracovní dny. Svátky se automaticky označí. Existující záznamy se přeskočí."})]}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Měsíc"}),e.jsx(j,{mode:"month",value:d.month,onChange:p=>n({...d,month:p})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsxs("label",{className:"admin-form-label",children:["Zaměstnanci",e.jsx("button",{type:"button",onClick:_,style:{marginLeft:"0.75rem",background:"none",border:"none",color:"var(--accent-color)",cursor:"pointer",fontSize:"0.8125rem",fontWeight:500,padding:0},children:d.user_ids.length===r.length?"Odznačit vše":"Vybrat vše"})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.375rem",maxHeight:"200px",overflowY:"auto",padding:"0.75rem",background:"var(--bg-tertiary)",borderRadius:"var(--border-radius-sm)",border:"1px solid var(--border-color)"},children:r.map(p=>e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:d.user_ids.includes(String(p.id)),onChange:()=>h(p.id)}),e.jsx("span",{children:p.name})]},p.id))}),e.jsxs("small",{className:"admin-form-hint",children:["Vybráno: ",d.user_ids.length," z ",r.length]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Příchod"}),e.jsx(j,{mode:"time",value:d.arrival_time,onChange:p=>n({...d,arrival_time:p})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Odchod"}),e.jsx(j,{mode:"time",value:d.departure_time,onChange:p=>n({...d,departure_time:p})})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Začátek pauzy"}),e.jsx(j,{mode:"time",value:d.break_start_time,onChange:p=>n({...d,break_start_time:p})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Konec pauzy"}),e.jsx(j,{mode:"time",value:d.break_end_time,onChange:p=>n({...d,break_end_time:p})})]})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:s,className:"admin-btn admin-btn-secondary",disabled:l,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:m,className:"admin-btn admin-btn-primary",disabled:l||d.user_ids.length===0,children:l?"Vytvářím záznamy...":"Vyplnit měsíc"})]})]})]})})}let Fe=0;function Le({form:a,projectLogs:s}){const d=ue(a),n=xe(s),r=d-n;if(!s.some(h=>h.project_id)||d<=0)return null;const l=r===0;return e.jsxs("div",{style:{padding:"0.5rem 0.75rem",marginBottom:"0.5rem",borderRadius:"6px",fontSize:"0.8rem",background:l?"var(--success-bg, rgba(34,197,94,0.1))":"var(--danger-bg, rgba(239,68,68,0.1))",color:l?"var(--success-color, #16a34a)":"var(--danger-color, #dc2626)",border:`1px solid ${l?"var(--success-border, rgba(34,197,94,0.3))":"var(--danger-border, rgba(239,68,68,0.3))"}`},children:["Odpracováno: ",Math.floor(d/60),"h ",d%60,"m | Přiřazeno: ",Math.floor(n/60),"h ",n%60,"m | Zbývá: ",Math.floor(Math.abs(r)/60),"h ",Math.abs(r)%60,"m ",r<0?"(překročeno)":""]})}function Oe({log:a,index:s,projectList:d,onUpdate:n,onRemove:r}){return e.jsxs("div",{className:"flex-row gap-2 mb-2",children:[e.jsxs("select",{value:a.project_id,onChange:m=>n(s,"project_id",m.target.value),className:"admin-form-select",style:{flex:3,marginBottom:0},children:[e.jsx("option",{value:"",children:"— Projekt —"}),d.map(m=>e.jsxs("option",{value:m.id,children:[m.project_number," – ",m.name]},m.id))]}),e.jsx("input",{type:"number",min:"0",max:"24",value:a.hours,onChange:m=>n(s,"hours",m.target.value),className:"admin-form-input",style:{width:"60px",marginBottom:0,textAlign:"center"},placeholder:"h"}),e.jsx("span",{style:{fontSize:"0.85rem",color:"var(--text-secondary)"},children:"h"}),e.jsx("input",{type:"number",min:"0",max:"59",value:a.minutes,onChange:m=>n(s,"minutes",m.target.value),className:"admin-form-input",style:{width:"60px",marginBottom:0,textAlign:"center"},placeholder:"m"}),e.jsx("span",{style:{fontSize:"0.85rem",color:"var(--text-secondary)"},children:"m"}),e.jsx("button",{type:"button",onClick:()=>r(s),className:"admin-btn admin-btn-secondary admin-btn-sm",style:{padding:"0.375rem",flexShrink:0},title:"Odebrat",children:e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]})}function he({mode:a,show:s,onClose:d,onSubmit:n,form:r,setForm:m,projectLogs:l,setProjectLogs:h,projectList:_,users:p,onShiftDateChange:w,editingRecord:S}){Z(s);const y=a==="create",k=r.leave_type==="work",x=(i,f)=>{m({...r,[i]:f})},E=(i,f,M)=>{const z=[...l];z[i]={...z[i],[f]:M},h(z)},B=i=>{h(l.filter((f,M)=>M!==i))},C=()=>{h([...l,{_key:`log-${++Fe}`,project_id:"",hours:"",minutes:""}])};return e.jsx(pe,{children:s&&e.jsxs(T.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:d}),e.jsxs(T.div,{className:"admin-modal admin-modal-lg",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:y?"Přidat záznam docházky":"Upravit docházku"}),!y&&S&&e.jsxs("p",{style:{color:"var(--text-secondary)",marginTop:"0.25rem"},children:[S.user_name," — ",le(S.shift_date)]})]}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[y?e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label required",children:"Zaměstnanec"}),e.jsxs("select",{value:r.user_id,onChange:i=>x("user_id",i.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"",children:"Vyberte zaměstnance"}),p.map(i=>e.jsx("option",{value:i.id,children:i.name},i.id))]})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label required",children:"Datum směny"}),e.jsx(j,{mode:"date",value:r.shift_date,onChange:i=>w(i)})]})]}):e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Datum směny"}),e.jsx(j,{mode:"date",value:r.shift_date,onChange:i=>x("shift_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Typ záznamu"}),e.jsxs("select",{value:r.leave_type,onChange:i=>x("leave_type",i.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"work",children:"Práce"}),e.jsx("option",{value:"vacation",children:"Dovolená"}),e.jsx("option",{value:"sick",children:"Nemoc"}),e.jsx("option",{value:"holiday",children:"Svátek"}),e.jsx("option",{value:"unpaid",children:"Neplacené volno"})]})]}),!k&&e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Počet hodin"}),e.jsx("input",{type:"number",inputMode:"decimal",value:r.leave_hours,onChange:i=>x("leave_hours",parseFloat(i.target.value)),min:"0.5",max:"24",step:"0.5",className:"admin-form-input"}),y&&e.jsx("small",{className:"admin-form-hint",children:"8 hodin = celý den"})]}),k&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Příchod - datum"}),e.jsx(j,{mode:"date",value:r.arrival_date,onChange:i=>x("arrival_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Příchod - čas"}),e.jsx(j,{mode:"time",value:r.arrival_time,onChange:i=>x("arrival_time",i)})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Začátek pauzy - datum"}),e.jsx(j,{mode:"date",value:r.break_start_date,onChange:i=>x("break_start_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Začátek pauzy - čas"}),e.jsx(j,{mode:"time",value:r.break_start_time,onChange:i=>x("break_start_time",i)})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Konec pauzy - datum"}),e.jsx(j,{mode:"date",value:r.break_end_date,onChange:i=>x("break_end_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Konec pauzy - čas"}),e.jsx(j,{mode:"time",value:r.break_end_time,onChange:i=>x("break_end_time",i)})]})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Odchod - datum"}),e.jsx(j,{mode:"date",value:r.departure_date,onChange:i=>x("departure_date",i)})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Odchod - čas"}),e.jsx(j,{mode:"time",value:r.departure_time,onChange:i=>x("departure_time",i)})]})]})]}),k&&_.length>0&&e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Projekty"}),e.jsx(Le,{form:r,projectLogs:l}),l.map((i,f)=>e.jsx(Oe,{log:i,index:f,projectList:_,onUpdate:E,onRemove:B},i._key||f)),e.jsx("button",{type:"button",onClick:C,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"+ Přidat projekt"})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Poznámka"}),e.jsx("textarea",{value:r.notes,onChange:i=>x("notes",i.target.value),className:"admin-form-textarea",rows:3})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:d,className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"button",onClick:n,className:"admin-btn admin-btn-primary",children:"Uložit"})]})]})]})})}function Ee(a){return a.break_start&&a.break_end?`${oe(a.break_start)} - ${oe(a.break_end)}`:a.break_start?`${oe(a.break_start)} - ?`:"—"}function Ae(a){return a.project_logs&&a.project_logs.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.125rem"},children:a.project_logs.map((s,d)=>{let n,r,m=!1;if(s.hours!==null&&s.hours!==void 0)n=parseInt(s.hours)||0,r=parseInt(s.minutes)||0;else{m=!s.ended_at;const l=s.ended_at?new Date(s.ended_at):new Date,h=Math.floor((l-new Date(s.started_at))/6e4);n=Math.floor(h/60),r=h%60}return e.jsxs("span",{className:"admin-badge",style:{fontSize:"0.7rem",display:"inline-block",background:m?"var(--accent-light)":void 0},children:[s.project_name||`#${s.project_id}`," (",n,":",String(r).padStart(2,"0"),"h",m?" ▸":"",")"]},s.id||d)})}):a.project_name?e.jsx("span",{className:"admin-badge admin-badge-wrap",style:{fontSize:"0.75rem"},children:a.project_name}):"—"}function We({records:a,onEdit:s,onDelete:d}){return a.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Za tento měsíc nejsou žádné záznamy."})}):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:"Datum"}),e.jsx("th",{children:"Zaměstnanec"}),e.jsx("th",{children:"Typ"}),e.jsx("th",{children:"Příchod"}),e.jsx("th",{children:"Pauza"}),e.jsx("th",{children:"Odchod"}),e.jsx("th",{children:"Hodiny"}),e.jsx("th",{children:"Projekt"}),e.jsx("th",{children:"GPS"}),e.jsx("th",{children:"Poznámka"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:a.map(n=>{const r=n.leave_type||"work",m=r!=="work",l=m?(n.leave_hours||8)*60:$e(n),h=n.arrival_lat&&n.arrival_lng||n.departure_lat&&n.departure_lng;return e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:le(n.shift_date)}),e.jsx("td",{children:n.user_name}),e.jsx("td",{children:e.jsx("span",{className:`attendance-leave-badge ${ve(r)}`,children:be(r)})}),e.jsx("td",{className:"admin-mono",children:m?"—":me(n.arrival_time)}),e.jsx("td",{className:"admin-mono",children:m?"—":Ee(n)}),e.jsx("td",{className:"admin-mono",children:m?"—":me(n.departure_time)}),e.jsx("td",{className:"admin-mono",children:l>0?`${Q(l)} h`:"—"}),e.jsx("td",{children:Ae(n)}),e.jsx("td",{children:h?e.jsx(Pe,{to:`/attendance/location/${n.id}`,className:"attendance-gps-link",title:"Zobrazit polohu","aria-label":"Zobrazit polohu",children:"📍"}):"—"}),e.jsx("td",{style:{maxWidth:"100px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:n.notes||"",children:n.notes||""}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>s(n),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",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:()=>d(n),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},n.id)})})]})})}const O="/api/admin";function Ze(a){return a.overtime>0?`+${a.overtime}h přesčas`:a.missing>0?`−${a.missing}h`:'splněno'}function Re(a){return a.project_logs&&a.project_logs.length>0?a.project_logs.map(s=>{let d,n;if(s.hours!==null&&s.hours!==void 0)d=parseInt(s.hours)||0,n=parseInt(s.minutes)||0;else if(s.started_at&&s.ended_at){const r=Math.max(0,Math.floor((new Date(s.ended_at)-new Date(s.started_at))/6e4));d=Math.floor(r/60),n=r%60}else d=0,n=0;return`
${s.project_name||`#${s.project_id}`} (${d}:${String(n).padStart(2,"0")}h)
`}).join(""):a.project_name||"—"}function Ue(a,s,d){const n=d.leave_balances[a]?Ve(a,s,d):"",r=s.records.map(l=>{const h=l.leave_type||"work",_=h!=="work",p=Me(l),w=Math.floor(p/60),S=p%60,y=_||!l.break_start||!l.break_end?"—":`${G(l.break_start,l.shift_date)} - ${G(l.break_end,l.shift_date)}`;return` ${le(l.shift_date)} ${be(h)} ${_?"—":G(l.arrival_time,l.shift_date)} diff --git a/dist/assets/AttendanceBalances-BSQpPHY4.js b/dist/assets/AttendanceBalances-DMsizH4J.js similarity index 99% rename from dist/assets/AttendanceBalances-BSQpPHY4.js rename to dist/assets/AttendanceBalances-DMsizH4J.js index c5c1f33..3a86b72 100644 --- a/dist/assets/AttendanceBalances-BSQpPHY4.js +++ b/dist/assets/AttendanceBalances-DMsizH4J.js @@ -1 +1 @@ -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-BrM8fzBu.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}; +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}; diff --git a/dist/assets/AttendanceCreate-CzMSkeJg.js b/dist/assets/AttendanceCreate-BYIYsFoJ.js similarity index 98% rename from dist/assets/AttendanceCreate-CzMSkeJg.js rename to dist/assets/AttendanceCreate-BYIYsFoJ.js index 4d36871..897eca5 100644 --- a/dist/assets/AttendanceCreate-CzMSkeJg.js +++ b/dist/assets/AttendanceCreate-BYIYsFoJ.js @@ -1 +1 @@ -import{j as e,m as u}from"./vendor-animation-0s3FMHwK.js";import{g as w,r as o,L as p}from"./vendor-react-BVs3cwbi.js";import{a as S,u as z,F as n,A as i,c as x}from"./index-BrM8fzBu.js";import{F as P}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const j="/api/admin";function U(){const r=S(),{hasPermission:v}=z(),_=w(),[y,b]=o.useState(!0),[m,c]=o.useState(!1),[f,g]=o.useState([]),l=new Date().toISOString().split("T")[0],[s,t]=o.useState({user_id:"",shift_date:l,leave_type:"work",leave_hours:8,arrival_date:l,arrival_time:"",break_start_date:l,break_start_time:"",break_end_date:l,break_end_time:"",departure_date:l,departure_time:"",notes:""});o.useEffect(()=>{(async()=>{try{const d=await(await x(`${j}/attendance.php?action=users`,{})).json();d.success&&g(d.data.users)}catch{r.error("Nepodařilo se načíst uživatele")}finally{b(!1)}})()},[r]);const k=async a=>{if(a.preventDefault(),!s.user_id||!s.shift_date){r.error("Vyplňte zaměstnance a datum směny");return}c(!0);try{const d=await(await x(`${j}/attendance.php?action=create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json();d.success?(r.success(d.message),_(`/attendance/admin?month=${s.shift_date.substring(0,7)}`)):r.error(d.error)}catch{r.error("Chyba připojení")}finally{c(!1)}},N=a=>{t({...s,shift_date:a,arrival_date:a,break_start_date:a,break_end_date:a,departure_date:a})},h=s.leave_type==="work";return v("attendance.admin")?y?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-card",style:{maxWidth:"600px"},children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[[0,1,2,3,4].map(a=>e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{marginBottom:"0.5rem",height:"10px"}}),e.jsx("div",{className:"admin-skeleton-line w-full h-10"})]},a)),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"120px",borderRadius:"8px"}})]})})]}):e.jsxs("div",{children:[e.jsxs(u.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:"Přidat záznam docházky"})}),e.jsx("div",{className:"admin-page-actions",children:e.jsx(p,{to:"/attendance/admin",className:"admin-btn admin-btn-secondary",children:"← Zpět na správu"})})]}),e.jsx(u.div,{className:"admin-card",style:{maxWidth:"600px"},initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children:e.jsxs("form",{onSubmit:k,className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Zaměstnanec",required:!0,children:e.jsxs("select",{value:s.user_id,onChange:a=>t({...s,user_id:a.target.value}),className:"admin-form-select",required:!0,children:[e.jsx("option",{value:"",children:"Vyberte zaměstnance"}),f.map(a=>e.jsx("option",{value:a.id,children:a.name},a.id))]})}),e.jsx(n,{label:"Datum směny",required:!0,children:e.jsx(i,{mode:"date",value:s.shift_date,onChange:a=>N(a),required:!0})})]}),e.jsx(n,{label:"Typ záznamu",required:!0,children:e.jsxs("select",{value:s.leave_type,onChange:a=>t({...s,leave_type:a.target.value}),className:"admin-form-select",children:[e.jsx("option",{value:"work",children:"Práce"}),e.jsx("option",{value:"vacation",children:"Dovolená"}),e.jsx("option",{value:"sick",children:"Nemoc"}),e.jsx("option",{value:"holiday",children:"Svátek"}),e.jsx("option",{value:"unpaid",children:"Neplacené volno"})]})}),!h&&e.jsxs(n,{label:"Počet hodin",children:[e.jsx("input",{type:"number",value:s.leave_hours,onChange:a=>t({...s,leave_hours:parseFloat(a.target.value)}),min:"0.5",max:"24",step:"0.5",className:"admin-form-input"}),e.jsx("small",{className:"admin-form-hint",children:"Výchozí 8 hodin pro celý den"})]}),h&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Příchod - datum",children:e.jsx(i,{mode:"date",value:s.arrival_date,onChange:a=>t({...s,arrival_date:a})})}),e.jsx(n,{label:"Příchod - čas",children:e.jsx(i,{mode:"time",value:s.arrival_time,onChange:a=>t({...s,arrival_time:a})})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Začátek pauzy - datum",children:e.jsx(i,{mode:"date",value:s.break_start_date,onChange:a=>t({...s,break_start_date:a})})}),e.jsx(n,{label:"Začátek pauzy - čas",children:e.jsx(i,{mode:"time",value:s.break_start_time,onChange:a=>t({...s,break_start_time:a})})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Konec pauzy - datum",children:e.jsx(i,{mode:"date",value:s.break_end_date,onChange:a=>t({...s,break_end_date:a})})}),e.jsx(n,{label:"Konec pauzy - čas",children:e.jsx(i,{mode:"time",value:s.break_end_time,onChange:a=>t({...s,break_end_time:a})})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Odchod - datum",children:e.jsx(i,{mode:"date",value:s.departure_date,onChange:a=>t({...s,departure_date:a})})}),e.jsx(n,{label:"Odchod - čas",children:e.jsx(i,{mode:"time",value:s.departure_time,onChange:a=>t({...s,departure_time:a})})})]})]}),e.jsx(n,{label:"Poznámka",children:e.jsx("textarea",{value:s.notes,onChange:a=>t({...s,notes:a.target.value}),className:"admin-form-textarea",rows:3})}),e.jsxs("div",{className:"admin-form-actions",children:[e.jsx(p,{to:"/attendance/admin",className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"submit",disabled:m,className:"admin-btn admin-btn-primary",children:m?"Ukládám...":"Uložit"})]})]})})})]}):e.jsx(P,{})}export{U as default}; +import{j as e,m as u}from"./vendor-animation-0s3FMHwK.js";import{g as w,r as o,L as p}from"./vendor-react-BVs3cwbi.js";import{a as S,u as z,F as n,A as i,c as x}from"./index-Bay45BGf.js";import{F as P}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const j="/api/admin";function U(){const r=S(),{hasPermission:v}=z(),_=w(),[y,b]=o.useState(!0),[m,c]=o.useState(!1),[f,g]=o.useState([]),l=new Date().toISOString().split("T")[0],[s,t]=o.useState({user_id:"",shift_date:l,leave_type:"work",leave_hours:8,arrival_date:l,arrival_time:"",break_start_date:l,break_start_time:"",break_end_date:l,break_end_time:"",departure_date:l,departure_time:"",notes:""});o.useEffect(()=>{(async()=>{try{const d=await(await x(`${j}/attendance.php?action=users`,{})).json();d.success&&g(d.data.users)}catch{r.error("Nepodařilo se načíst uživatele")}finally{b(!1)}})()},[r]);const k=async a=>{if(a.preventDefault(),!s.user_id||!s.shift_date){r.error("Vyplňte zaměstnance a datum směny");return}c(!0);try{const d=await(await x(`${j}/attendance.php?action=create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json();d.success?(r.success(d.message),_(`/attendance/admin?month=${s.shift_date.substring(0,7)}`)):r.error(d.error)}catch{r.error("Chyba připojení")}finally{c(!1)}},N=a=>{t({...s,shift_date:a,arrival_date:a,break_start_date:a,break_end_date:a,departure_date:a})},h=s.leave_type==="work";return v("attendance.admin")?y?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-card",style:{maxWidth:"600px"},children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[[0,1,2,3,4].map(a=>e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{marginBottom:"0.5rem",height:"10px"}}),e.jsx("div",{className:"admin-skeleton-line w-full h-10"})]},a)),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"120px",borderRadius:"8px"}})]})})]}):e.jsxs("div",{children:[e.jsxs(u.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:"Přidat záznam docházky"})}),e.jsx("div",{className:"admin-page-actions",children:e.jsx(p,{to:"/attendance/admin",className:"admin-btn admin-btn-secondary",children:"← Zpět na správu"})})]}),e.jsx(u.div,{className:"admin-card",style:{maxWidth:"600px"},initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children:e.jsxs("form",{onSubmit:k,className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Zaměstnanec",required:!0,children:e.jsxs("select",{value:s.user_id,onChange:a=>t({...s,user_id:a.target.value}),className:"admin-form-select",required:!0,children:[e.jsx("option",{value:"",children:"Vyberte zaměstnance"}),f.map(a=>e.jsx("option",{value:a.id,children:a.name},a.id))]})}),e.jsx(n,{label:"Datum směny",required:!0,children:e.jsx(i,{mode:"date",value:s.shift_date,onChange:a=>N(a),required:!0})})]}),e.jsx(n,{label:"Typ záznamu",required:!0,children:e.jsxs("select",{value:s.leave_type,onChange:a=>t({...s,leave_type:a.target.value}),className:"admin-form-select",children:[e.jsx("option",{value:"work",children:"Práce"}),e.jsx("option",{value:"vacation",children:"Dovolená"}),e.jsx("option",{value:"sick",children:"Nemoc"}),e.jsx("option",{value:"holiday",children:"Svátek"}),e.jsx("option",{value:"unpaid",children:"Neplacené volno"})]})}),!h&&e.jsxs(n,{label:"Počet hodin",children:[e.jsx("input",{type:"number",value:s.leave_hours,onChange:a=>t({...s,leave_hours:parseFloat(a.target.value)}),min:"0.5",max:"24",step:"0.5",className:"admin-form-input"}),e.jsx("small",{className:"admin-form-hint",children:"Výchozí 8 hodin pro celý den"})]}),h&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Příchod - datum",children:e.jsx(i,{mode:"date",value:s.arrival_date,onChange:a=>t({...s,arrival_date:a})})}),e.jsx(n,{label:"Příchod - čas",children:e.jsx(i,{mode:"time",value:s.arrival_time,onChange:a=>t({...s,arrival_time:a})})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Začátek pauzy - datum",children:e.jsx(i,{mode:"date",value:s.break_start_date,onChange:a=>t({...s,break_start_date:a})})}),e.jsx(n,{label:"Začátek pauzy - čas",children:e.jsx(i,{mode:"time",value:s.break_start_time,onChange:a=>t({...s,break_start_time:a})})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Konec pauzy - datum",children:e.jsx(i,{mode:"date",value:s.break_end_date,onChange:a=>t({...s,break_end_date:a})})}),e.jsx(n,{label:"Konec pauzy - čas",children:e.jsx(i,{mode:"time",value:s.break_end_time,onChange:a=>t({...s,break_end_time:a})})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(n,{label:"Odchod - datum",children:e.jsx(i,{mode:"date",value:s.departure_date,onChange:a=>t({...s,departure_date:a})})}),e.jsx(n,{label:"Odchod - čas",children:e.jsx(i,{mode:"time",value:s.departure_time,onChange:a=>t({...s,departure_time:a})})})]})]}),e.jsx(n,{label:"Poznámka",children:e.jsx("textarea",{value:s.notes,onChange:a=>t({...s,notes:a.target.value}),className:"admin-form-textarea",rows:3})}),e.jsxs("div",{className:"admin-form-actions",children:[e.jsx(p,{to:"/attendance/admin",className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"submit",disabled:m,className:"admin-btn admin-btn-primary",children:m?"Ukládám...":"Uložit"})]})]})})})]}):e.jsx(P,{})}export{U as default}; diff --git a/dist/assets/AttendanceHistory-DTktjavL.js b/dist/assets/AttendanceHistory-CDqc-b-N.js similarity index 99% rename from dist/assets/AttendanceHistory-DTktjavL.js rename to dist/assets/AttendanceHistory-CDqc-b-N.js index b9051e9..823df97 100644 --- a/dist/assets/AttendanceHistory-DTktjavL.js +++ b/dist/assets/AttendanceHistory-CDqc-b-N.js @@ -1,4 +1,4 @@ -import{j as e,m as f}from"./vendor-animation-0s3FMHwK.js";import{r as m}from"./vendor-react-BVs3cwbi.js";import{a9 as T}from"./vendor-utils-Dyr8OjFr.js";import{a as C,u as A,c as O,F as B,A as H}from"./index-BrM8fzBu.js";import{F as I}from"./Forbidden-D25jV3Oq.js";import{c as W,b as k,g as w,d as z,e as S,a as v,h as E,i as y,f as b}from"./attendanceHelpers-D6sLEw0q.js";const L="/api/admin",R=s=>s.break_start&&s.break_end?`${b(s.break_start)} - ${b(s.break_end)}`:s.break_start?`${b(s.break_start)} - ?`:"—",Z=s=>s.project_logs&&s.project_logs.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.125rem"},children:s.project_logs.map((n,g)=>{let d,c,o=!1;if(n.hours!==null&&n.hours!==void 0)d=parseInt(n.hours)||0,c=parseInt(n.minutes)||0;else{o=!n.ended_at;const x=n.ended_at?new Date(n.ended_at):new Date,p=Math.floor((x-new Date(n.started_at))/6e4);d=Math.floor(p/60),c=p%60}return e.jsxs("span",{className:"admin-badge",style:{fontSize:"0.7rem",display:"inline-block",background:o?"var(--accent-light)":void 0},children:[n.project_name||`#${n.project_id}`," (",d,":",String(c).padStart(2,"0"),"h",o?" ▸":"",")"]},n.id||g)})}):s.project_name?e.jsx("span",{className:"admin-badge admin-badge-wrap",style:{fontSize:"0.75rem"},children:s.project_name}):"—",Y=s=>s.overtime>0?e.jsxs("span",{className:"leave-badge badge-overtime",children:["+",s.overtime,"h přesčas"]}):s.remaining>0?e.jsxs("span",{style:{color:"#dc2626"},children:["−",s.remaining,"h"]}):e.jsx("span",{style:{color:"#16a34a"},children:"splněno"});function Q(){const s=C(),{user:n,hasPermission:g}=A(),[d,c]=m.useState(!0),o=m.useRef(null),[x,p]=m.useState(()=>{const a=new Date;return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}`}),[t,D]=m.useState({records:[],month_name:"",year:new Date().getFullYear(),total_minutes:0,vacation_hours:0,sick_hours:0,holiday_hours:0,unpaid_hours:0,leave_balance:null,monthly_fund:null}),_=m.useCallback(async()=>{c(!0);try{const a=await O(`${L}/attendance.php?action=history&month=${x}`);if(a.status===401)return;const i=await a.json();i.success&&D(i.data)}catch{s.error("Nepodařilo se načíst data")}finally{c(!1)}},[x,s]);if(m.useEffect(()=>{_()},[_]),!g("attendance.history"))return e.jsx(I,{});const $=()=>{if(!o.current)return;const a=window.open("","_blank");a.document.write(` +import{j as e,m as f}from"./vendor-animation-0s3FMHwK.js";import{r as m}from"./vendor-react-BVs3cwbi.js";import{a9 as T}from"./vendor-utils-Dyr8OjFr.js";import{a as C,u as A,c as O,F as B,A as H}from"./index-Bay45BGf.js";import{F as I}from"./Forbidden-D25jV3Oq.js";import{c as W,b as k,g as w,d as z,e as S,a as v,h as E,i as y,f as b}from"./attendanceHelpers-D6sLEw0q.js";const L="/api/admin",R=s=>s.break_start&&s.break_end?`${b(s.break_start)} - ${b(s.break_end)}`:s.break_start?`${b(s.break_start)} - ?`:"—",Z=s=>s.project_logs&&s.project_logs.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.125rem"},children:s.project_logs.map((n,g)=>{let d,c,o=!1;if(n.hours!==null&&n.hours!==void 0)d=parseInt(n.hours)||0,c=parseInt(n.minutes)||0;else{o=!n.ended_at;const x=n.ended_at?new Date(n.ended_at):new Date,p=Math.floor((x-new Date(n.started_at))/6e4);d=Math.floor(p/60),c=p%60}return e.jsxs("span",{className:"admin-badge",style:{fontSize:"0.7rem",display:"inline-block",background:o?"var(--accent-light)":void 0},children:[n.project_name||`#${n.project_id}`," (",d,":",String(c).padStart(2,"0"),"h",o?" ▸":"",")"]},n.id||g)})}):s.project_name?e.jsx("span",{className:"admin-badge admin-badge-wrap",style:{fontSize:"0.75rem"},children:s.project_name}):"—",Y=s=>s.overtime>0?e.jsxs("span",{className:"leave-badge badge-overtime",children:["+",s.overtime,"h přesčas"]}):s.remaining>0?e.jsxs("span",{style:{color:"#dc2626"},children:["−",s.remaining,"h"]}):e.jsx("span",{style:{color:"#16a34a"},children:"splněno"});function Q(){const s=C(),{user:n,hasPermission:g}=A(),[d,c]=m.useState(!0),o=m.useRef(null),[x,p]=m.useState(()=>{const a=new Date;return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}`}),[t,D]=m.useState({records:[],month_name:"",year:new Date().getFullYear(),total_minutes:0,vacation_hours:0,sick_hours:0,holiday_hours:0,unpaid_hours:0,leave_balance:null,monthly_fund:null}),_=m.useCallback(async()=>{c(!0);try{const a=await O(`${L}/attendance.php?action=history&month=${x}`);if(a.status===401)return;const i=await a.json();i.success&&D(i.data)}catch{s.error("Nepodařilo se načíst data")}finally{c(!1)}},[x,s]);if(m.useEffect(()=>{_()},[_]),!g("attendance.history"))return e.jsx(I,{});const $=()=>{if(!o.current)return;const a=window.open("","_blank");a.document.write(` diff --git a/dist/assets/AttendanceLocation-5-mGEni2.js b/dist/assets/AttendanceLocation-DLvgzSPu.js similarity index 99% rename from dist/assets/AttendanceLocation-5-mGEni2.js rename to dist/assets/AttendanceLocation-DLvgzSPu.js index d86b2c3..a148935 100644 --- a/dist/assets/AttendanceLocation-5-mGEni2.js +++ b/dist/assets/AttendanceLocation-DLvgzSPu.js @@ -1 +1 @@ -import{j as a,m as b}from"./vendor-animation-0s3FMHwK.js";import{g as z,h as F,r as c,L as M}from"./vendor-react-BVs3cwbi.js";import{a as D,u as E,c as R}from"./index-BrM8fzBu.js";import{F as O}from"./Forbidden-D25jV3Oq.js";import{b as C,f as x}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const S="/api/admin";function Y(){const m=D(),{hasPermission:w}=E(),p=z(),{id:j}=F(),[h,k]=c.useState(!0),[e,$]=c.useState(null),u=c.useRef(null),l=c.useRef(null);c.useEffect(()=>{(async()=>{try{const v=await(await R(`${S}/attendance.php?action=location&id=${j}`,{})).json();v.success?$(v.data.record):(m.error("Záznam nebyl nalezen"),p("/attendance/admin"))}catch{m.error("Nepodařilo se načíst data"),p("/attendance/admin")}finally{k(!1)}})()},[j,m,p]),c.useEffect(()=>{if(!e||h)return;const s=e.arrival_lat&&e.arrival_lng,i=e.departure_lat&&e.departure_lng;if(!(s||i)||!u.current)return;const P=async()=>{if(window.L){N();return}const r=document.createElement("link");r.rel="stylesheet",r.href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css",document.head.appendChild(r);const n=document.createElement("script");n.src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js",n.onload=N,document.body.appendChild(n)},N=()=>{l.current&&l.current.remove();const r=window.L,n=r.map(u.current);l.current=n,r.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:"© OpenStreetMap contributors"}).addTo(n);const d=[],g=[];s&&g.push({lat:parseFloat(e.arrival_lat),lng:parseFloat(e.arrival_lng),type:"arrival",label:"Příchod",time:x(e.arrival_time),accuracy:e.arrival_accuracy||0}),i&&g.push({lat:parseFloat(e.departure_lat),lng:parseFloat(e.departure_lng),type:"departure",label:"Odchod",time:x(e.departure_time),accuracy:e.departure_accuracy||0}),g.forEach(t=>{const y=t.type==="arrival"?"#22c55e":"#ef4444";r.circleMarker([t.lat,t.lng],{radius:10,fillColor:y,color:"#fff",weight:2,opacity:1,fillOpacity:.8}).addTo(n).bindPopup(`${t.label}
${t.time}
Přesnost: ${Math.round(t.accuracy)}m`),t.accuracy>0&&r.circle([t.lat,t.lng],{radius:t.accuracy,fillColor:y,color:y,weight:1,opacity:.3,fillOpacity:.1}).addTo(n),d.push([t.lat,t.lng])}),d.length===1?n.setView(d[0],16):d.length>1&&n.fitBounds(d,{padding:[50,50]})};return P(),()=>{l.current&&(l.current.remove(),l.current=null)}},[e,h]);const _=s=>{if(!s)return"—";const i=new Date(s);return`${i.getDate()}.${i.getMonth()+1}.${i.getFullYear()} ${x(s)}`};if(!w("attendance.admin"))return a.jsx(O,{});if(h)return a.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[a.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem"},children:[a.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),a.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]})}),a.jsx("div",{className:"admin-card",children:a.jsx("div",{className:"admin-skeleton-line",style:{width:"100%",height:"300px",borderRadius:"8px"}})}),a.jsx("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1.25rem"},children:[0,1].map(s=>a.jsx("div",{className:"admin-card",children:a.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[a.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"50%"}}),a.jsx("div",{className:"admin-skeleton-line w-full"}),a.jsx("div",{className:"admin-skeleton-line w-3/4"})]})},s))})]});if(!e)return null;const f=e.arrival_lat&&e.arrival_lng,o=e.departure_lat&&e.departure_lng,L=f||o,A=e.shift_date.substring(0,7);return a.jsxs("div",{children:[a.jsxs(b.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[a.jsx("div",{children:a.jsx("h1",{className:"admin-page-title",children:"Poloha záznamu"})}),a.jsx("div",{className:"admin-page-actions",children:a.jsx(M,{to:`/attendance/admin?month=${A}`,className:"admin-btn admin-btn-secondary",children:"← Zpět na správu"})})]}),a.jsxs(b.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[a.jsx("div",{className:"admin-card-header",children:a.jsxs("h2",{className:"admin-card-title",children:[e.user_name," — ",C(e.shift_date)]})}),a.jsxs("div",{className:"admin-card-body",children:[L&&a.jsx("div",{ref:u,className:"attendance-location-map"}),a.jsxs("div",{className:"attendance-location-grid",children:[a.jsxs("div",{className:`attendance-location-card ${f?"":"empty"}`,children:[a.jsx("h3",{className:"attendance-location-title",children:"Příchod"}),a.jsx("div",{className:"attendance-location-time",children:e.arrival_time?_(e.arrival_time):"—"}),f?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"attendance-location-address",children:e.arrival_address||a.jsx("em",{children:"Adresa nezjištěna"})}),a.jsxs("div",{className:"attendance-location-coords",children:["GPS: ",e.arrival_lat,", ",e.arrival_lng,e.arrival_accuracy&&` (přesnost: ${Math.round(e.arrival_accuracy)}m)`]}),a.jsx("a",{href:`https://www.google.com/maps?q=${e.arrival_lat},${e.arrival_lng}`,target:"_blank",rel:"noopener noreferrer",className:"admin-btn admin-btn-secondary admin-btn-sm mt-2",children:"Otevřít v Google Maps"})]}):a.jsx("div",{className:"attendance-location-address",children:a.jsx("em",{children:"Poloha nebyla zaznamenána"})})]}),(o||e.departure_time)&&a.jsxs("div",{className:`attendance-location-card ${o?"":"empty"}`,children:[a.jsx("h3",{className:"attendance-location-title",children:"Odchod"}),a.jsx("div",{className:"attendance-location-time",children:e.departure_time?_(e.departure_time):"—"}),o?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"attendance-location-address",children:e.departure_address||a.jsx("em",{children:"Adresa nezjištěna"})}),a.jsxs("div",{className:"attendance-location-coords",children:["GPS: ",e.departure_lat,", ",e.departure_lng,e.departure_accuracy&&` (přesnost: ${Math.round(e.departure_accuracy)}m)`]}),a.jsx("a",{href:`https://www.google.com/maps?q=${e.departure_lat},${e.departure_lng}`,target:"_blank",rel:"noopener noreferrer",className:"admin-btn admin-btn-secondary admin-btn-sm mt-2",children:"Otevřít v Google Maps"})]}):a.jsx("div",{className:"attendance-location-address",children:a.jsx("em",{children:"Poloha nebyla zaznamenána"})})]})]})]})]})]})}export{Y as default}; +import{j as a,m as b}from"./vendor-animation-0s3FMHwK.js";import{g as z,h as F,r as c,L as M}from"./vendor-react-BVs3cwbi.js";import{a as D,u as E,c as R}from"./index-Bay45BGf.js";import{F as O}from"./Forbidden-D25jV3Oq.js";import{b as C,f as x}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const S="/api/admin";function Y(){const m=D(),{hasPermission:w}=E(),p=z(),{id:j}=F(),[h,k]=c.useState(!0),[e,$]=c.useState(null),u=c.useRef(null),l=c.useRef(null);c.useEffect(()=>{(async()=>{try{const v=await(await R(`${S}/attendance.php?action=location&id=${j}`,{})).json();v.success?$(v.data.record):(m.error("Záznam nebyl nalezen"),p("/attendance/admin"))}catch{m.error("Nepodařilo se načíst data"),p("/attendance/admin")}finally{k(!1)}})()},[j,m,p]),c.useEffect(()=>{if(!e||h)return;const s=e.arrival_lat&&e.arrival_lng,i=e.departure_lat&&e.departure_lng;if(!(s||i)||!u.current)return;const P=async()=>{if(window.L){N();return}const r=document.createElement("link");r.rel="stylesheet",r.href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css",document.head.appendChild(r);const n=document.createElement("script");n.src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js",n.onload=N,document.body.appendChild(n)},N=()=>{l.current&&l.current.remove();const r=window.L,n=r.map(u.current);l.current=n,r.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:"© OpenStreetMap contributors"}).addTo(n);const d=[],g=[];s&&g.push({lat:parseFloat(e.arrival_lat),lng:parseFloat(e.arrival_lng),type:"arrival",label:"Příchod",time:x(e.arrival_time),accuracy:e.arrival_accuracy||0}),i&&g.push({lat:parseFloat(e.departure_lat),lng:parseFloat(e.departure_lng),type:"departure",label:"Odchod",time:x(e.departure_time),accuracy:e.departure_accuracy||0}),g.forEach(t=>{const y=t.type==="arrival"?"#22c55e":"#ef4444";r.circleMarker([t.lat,t.lng],{radius:10,fillColor:y,color:"#fff",weight:2,opacity:1,fillOpacity:.8}).addTo(n).bindPopup(`${t.label}
${t.time}
Přesnost: ${Math.round(t.accuracy)}m`),t.accuracy>0&&r.circle([t.lat,t.lng],{radius:t.accuracy,fillColor:y,color:y,weight:1,opacity:.3,fillOpacity:.1}).addTo(n),d.push([t.lat,t.lng])}),d.length===1?n.setView(d[0],16):d.length>1&&n.fitBounds(d,{padding:[50,50]})};return P(),()=>{l.current&&(l.current.remove(),l.current=null)}},[e,h]);const _=s=>{if(!s)return"—";const i=new Date(s);return`${i.getDate()}.${i.getMonth()+1}.${i.getFullYear()} ${x(s)}`};if(!w("attendance.admin"))return a.jsx(O,{});if(h)return a.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[a.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem"},children:[a.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),a.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]})}),a.jsx("div",{className:"admin-card",children:a.jsx("div",{className:"admin-skeleton-line",style:{width:"100%",height:"300px",borderRadius:"8px"}})}),a.jsx("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1.25rem"},children:[0,1].map(s=>a.jsx("div",{className:"admin-card",children:a.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[a.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"50%"}}),a.jsx("div",{className:"admin-skeleton-line w-full"}),a.jsx("div",{className:"admin-skeleton-line w-3/4"})]})},s))})]});if(!e)return null;const f=e.arrival_lat&&e.arrival_lng,o=e.departure_lat&&e.departure_lng,L=f||o,A=e.shift_date.substring(0,7);return a.jsxs("div",{children:[a.jsxs(b.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[a.jsx("div",{children:a.jsx("h1",{className:"admin-page-title",children:"Poloha záznamu"})}),a.jsx("div",{className:"admin-page-actions",children:a.jsx(M,{to:`/attendance/admin?month=${A}`,className:"admin-btn admin-btn-secondary",children:"← Zpět na správu"})})]}),a.jsxs(b.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[a.jsx("div",{className:"admin-card-header",children:a.jsxs("h2",{className:"admin-card-title",children:[e.user_name," — ",C(e.shift_date)]})}),a.jsxs("div",{className:"admin-card-body",children:[L&&a.jsx("div",{ref:u,className:"attendance-location-map"}),a.jsxs("div",{className:"attendance-location-grid",children:[a.jsxs("div",{className:`attendance-location-card ${f?"":"empty"}`,children:[a.jsx("h3",{className:"attendance-location-title",children:"Příchod"}),a.jsx("div",{className:"attendance-location-time",children:e.arrival_time?_(e.arrival_time):"—"}),f?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"attendance-location-address",children:e.arrival_address||a.jsx("em",{children:"Adresa nezjištěna"})}),a.jsxs("div",{className:"attendance-location-coords",children:["GPS: ",e.arrival_lat,", ",e.arrival_lng,e.arrival_accuracy&&` (přesnost: ${Math.round(e.arrival_accuracy)}m)`]}),a.jsx("a",{href:`https://www.google.com/maps?q=${e.arrival_lat},${e.arrival_lng}`,target:"_blank",rel:"noopener noreferrer",className:"admin-btn admin-btn-secondary admin-btn-sm mt-2",children:"Otevřít v Google Maps"})]}):a.jsx("div",{className:"attendance-location-address",children:a.jsx("em",{children:"Poloha nebyla zaznamenána"})})]}),(o||e.departure_time)&&a.jsxs("div",{className:`attendance-location-card ${o?"":"empty"}`,children:[a.jsx("h3",{className:"attendance-location-title",children:"Odchod"}),a.jsx("div",{className:"attendance-location-time",children:e.departure_time?_(e.departure_time):"—"}),o?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"attendance-location-address",children:e.departure_address||a.jsx("em",{children:"Adresa nezjištěna"})}),a.jsxs("div",{className:"attendance-location-coords",children:["GPS: ",e.departure_lat,", ",e.departure_lng,e.departure_accuracy&&` (přesnost: ${Math.round(e.departure_accuracy)}m)`]}),a.jsx("a",{href:`https://www.google.com/maps?q=${e.departure_lat},${e.departure_lng}`,target:"_blank",rel:"noopener noreferrer",className:"admin-btn admin-btn-secondary admin-btn-sm mt-2",children:"Otevřít v Google Maps"})]}):a.jsx("div",{className:"attendance-location-address",children:a.jsx("em",{children:"Poloha nebyla zaznamenána"})})]})]})]})]})]})}export{Y as default}; diff --git a/dist/assets/AuditLog-D1e5uhdu.js b/dist/assets/AuditLog-CyUZGIls.js similarity index 99% rename from dist/assets/AuditLog-D1e5uhdu.js rename to dist/assets/AuditLog-CyUZGIls.js index 2c0a7d6..e782b2c 100644 --- a/dist/assets/AuditLog-D1e5uhdu.js +++ b/dist/assets/AuditLog-CyUZGIls.js @@ -1 +1 @@ -import{j as e,m as y}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{u as E,a as I,c as N,d as B,F as h,A as b}from"./index-BrM8fzBu.js";import{F as D}from"./Forbidden-D25jV3Oq.js";import{P as F}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const _="/api/admin",k={create:"Vytvoření",update:"Úprava",delete:"Smazání",login:"Přihlášení",login_failed:"Neúspěšné přihlášení",logout:"Odhlášení",view:"Zobrazení",activate:"Aktivace",deactivate:"Deaktivace",password_change:"Změna hesla",permission_change:"Změna oprávnění",access_denied:"Přístup odepřen"},R={create:"admin-badge-success",update:"admin-badge-info",delete:"admin-badge-danger",login:"admin-badge-secondary",login_failed:"admin-badge-danger",logout:"admin-badge-secondary",view:"admin-badge-info",activate:"admin-badge-success",deactivate:"admin-badge-warning",password_change:"admin-badge-info",permission_change:"admin-badge-warning",access_denied:"admin-badge-danger"},w={user:"Uživatel",attendance:"Docházka",leave_request:"Žádost o nepřítomnost",offers_quotation:"Nabídka",offers_customer:"Zákazník",offers_item_template:"Šablona položky",offers_scope_template:"Šablona rozsahu",offers_settings:"Nastavení nabídek",orders_order:"Objednávka",invoices_invoice:"Faktura",projects_project:"Projekt",role:"Role",trips:"Jízda",vehicles:"Vozidlo",bank_account:"Bankovní účet"},Z=Object.entries(k).map(([o,i])=>({value:o,label:i})),$=Object.entries(w).map(([o,i])=>({value:o,label:i}));function G(){const{hasPermission:o}=E(),i=I(),[u,C]=t.useState([]),[p,g]=t.useState(!0),[r,S]=t.useState(null),[s,z]=t.useState({search:"",action:"",entity_type:"",date_from:"",date_to:""}),[P,x]=t.useState(!1),[v,A]=t.useState(90),[j,f]=t.useState(!1),c=t.useCallback(async(a=1,n=50)=>{g(!0);try{const d=new URLSearchParams({page:String(a),per_page:String(n)});s.search&&d.set("search",s.search),s.action&&d.set("action",s.action),s.entity_type&&d.set("entity_type",s.entity_type),s.date_from&&d.set("date_from",s.date_from),s.date_to&&d.set("date_to",s.date_to);const l=await(await N(`${_}/audit-log.php?${d.toString()}`)).json();l.success?(C(l.data.logs||[]),S({total:l.data.total,page:l.data.page,per_page:l.data.per_page,total_pages:l.data.pages})):i.error(l.error||"Nepodařilo se načíst audit log")}catch{i.error("Chyba připojení")}finally{g(!1)}},[s]);if(t.useEffect(()=>{c()},[c]),!o("settings.audit"))return e.jsx(D,{});const m=(a,n)=>{z(d=>({...d,[a]:n}))},T=a=>{c(a,r?.per_page||50)},O=a=>{c(1,a)},V=async()=>{f(!0);try{const n=await(await N(`${_}/audit-log.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"cleanup",days:v})})).json();n.success?(i.success(n.message),x(!1),c()):i.error(n.error)}catch{i.error("Chyba připojení")}finally{f(!1)}},L=a=>a?new Date(a).toLocaleString("cs-CZ"):"-";return p&&u.length===0?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"160px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"0.75rem",padding:"1rem"},children:e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px"}})})}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"4px"}}),Array.from({length:8},(a,n)=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"120px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"70px",borderRadius:"10px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line flex-1"}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px"}})]},n))]})})]}):e.jsxs("div",{children:[e.jsxs(y.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Audit log"}),r&&e.jsxs("p",{className:"admin-page-subtitle",children:[r.total," ",B(r.total,"záznam","záznamy","záznamů")]})]}),e.jsxs("button",{className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>x(!0),children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]}),"Vyčistit"]})]}),P&&e.jsxs("div",{className:"admin-modal-overlay",style:{opacity:1},children:[e.jsx("div",{className:"admin-modal-backdrop",onClick:()=>!j&&x(!1)}),e.jsxs(y.div,{className:"admin-modal admin-confirm-modal",initial:{opacity:0,scale:.95,y:20},animate:{opacity:1,scale:1,y:0},transition:{duration:.2},children:[e.jsxs("div",{className:"admin-modal-body admin-confirm-content",children:[e.jsx("div",{className:"admin-confirm-icon admin-confirm-icon-danger",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})}),e.jsx("h2",{className:"admin-confirm-title",children:"Vyčistit audit log"}),e.jsx("p",{className:"admin-confirm-message",children:"Smazat záznamy starší než:"}),e.jsx("div",{style:{margin:"0.75rem auto",maxWidth:"200px"},children:e.jsxs("select",{className:"admin-form-select",value:v,onChange:a=>A(parseInt(a.target.value)),children:[e.jsx("option",{value:30,children:"30 dní"}),e.jsx("option",{value:60,children:"60 dní"}),e.jsx("option",{value:90,children:"90 dní"}),e.jsx("option",{value:180,children:"180 dní"}),e.jsx("option",{value:365,children:"1 rok"}),e.jsx("option",{value:0,children:"Vše"})]})}),e.jsx("p",{className:"admin-confirm-message",style:{fontSize:"12px",opacity:.6},children:"Tato akce je nevratná."})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>x(!1),className:"admin-btn admin-btn-secondary",disabled:j,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:V,className:"admin-btn admin-btn-primary",disabled:j,children:j?"Mažu...":"Smazat"})]})]})]}),e.jsx(y.div,{className:"admin-card mb-4",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-form-row admin-form-row-5",children:[e.jsx(h,{label:"Hledat",children:e.jsx("input",{type:"text",className:"admin-form-input",placeholder:"Popis, uživatel...",value:s.search,onChange:a=>m("search",a.target.value)})}),e.jsx(h,{label:"Akce",children:e.jsxs("select",{className:"admin-form-select",value:s.action,onChange:a=>m("action",a.target.value),children:[e.jsx("option",{value:"",children:"Všechny"}),Z.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))]})}),e.jsx(h,{label:"Typ entity",children:e.jsxs("select",{className:"admin-form-select",value:s.entity_type,onChange:a=>m("entity_type",a.target.value),children:[e.jsx("option",{value:"",children:"Všechny"}),$.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))]})}),e.jsx(h,{label:"Od",children:e.jsx(b,{mode:"date",value:s.date_from,onChange:a=>m("date_from",a)})}),e.jsx(h,{label:"Do",children:e.jsx(b,{mode:"date",value:s.date_to,onChange:a=>m("date_to",a)})})]})})}),e.jsx(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsxs("div",{className:"admin-card-body",children:[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:"Čas"}),e.jsx("th",{children:"Uživatel"}),e.jsx("th",{children:"Akce"}),e.jsx("th",{children:"Typ entity"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{children:"IP"})]})}),e.jsxs("tbody",{children:[p&&Array.from({length:10},(a,n)=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"110px",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"70px",height:"22px",borderRadius:"10px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px",height:"14px"}})})]},`skeleton-${n}`)),!p&&u.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:"6",children:e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),e.jsx("p",{children:"Žádné záznamy k zobrazení"})]})})}),!p&&u.map(a=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:L(a.created_at)}),e.jsx("td",{className:"fw-500",children:a.username||"-"}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${R[a.action]||"admin-badge-secondary"}`,children:k[a.action]||a.action})}),e.jsx("td",{children:w[a.entity_type]||a.entity_type||"-"}),e.jsx("td",{children:a.description||"-"}),e.jsx("td",{className:"admin-mono",children:a.user_ip||"-"})]},a.id))]})]})}),e.jsx(F,{pagination:r,onPageChange:T,onPerPageChange:O})]})})]})}export{G as default}; +import{j as e,m as y}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{u as E,a as I,c as N,d as B,F as h,A as b}from"./index-Bay45BGf.js";import{F as D}from"./Forbidden-D25jV3Oq.js";import{P as F}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const _="/api/admin",k={create:"Vytvoření",update:"Úprava",delete:"Smazání",login:"Přihlášení",login_failed:"Neúspěšné přihlášení",logout:"Odhlášení",view:"Zobrazení",activate:"Aktivace",deactivate:"Deaktivace",password_change:"Změna hesla",permission_change:"Změna oprávnění",access_denied:"Přístup odepřen"},R={create:"admin-badge-success",update:"admin-badge-info",delete:"admin-badge-danger",login:"admin-badge-secondary",login_failed:"admin-badge-danger",logout:"admin-badge-secondary",view:"admin-badge-info",activate:"admin-badge-success",deactivate:"admin-badge-warning",password_change:"admin-badge-info",permission_change:"admin-badge-warning",access_denied:"admin-badge-danger"},w={user:"Uživatel",attendance:"Docházka",leave_request:"Žádost o nepřítomnost",offers_quotation:"Nabídka",offers_customer:"Zákazník",offers_item_template:"Šablona položky",offers_scope_template:"Šablona rozsahu",offers_settings:"Nastavení nabídek",orders_order:"Objednávka",invoices_invoice:"Faktura",projects_project:"Projekt",role:"Role",trips:"Jízda",vehicles:"Vozidlo",bank_account:"Bankovní účet"},Z=Object.entries(k).map(([o,i])=>({value:o,label:i})),$=Object.entries(w).map(([o,i])=>({value:o,label:i}));function G(){const{hasPermission:o}=E(),i=I(),[u,C]=t.useState([]),[p,g]=t.useState(!0),[r,S]=t.useState(null),[s,z]=t.useState({search:"",action:"",entity_type:"",date_from:"",date_to:""}),[P,x]=t.useState(!1),[v,A]=t.useState(90),[j,f]=t.useState(!1),c=t.useCallback(async(a=1,n=50)=>{g(!0);try{const d=new URLSearchParams({page:String(a),per_page:String(n)});s.search&&d.set("search",s.search),s.action&&d.set("action",s.action),s.entity_type&&d.set("entity_type",s.entity_type),s.date_from&&d.set("date_from",s.date_from),s.date_to&&d.set("date_to",s.date_to);const l=await(await N(`${_}/audit-log.php?${d.toString()}`)).json();l.success?(C(l.data.logs||[]),S({total:l.data.total,page:l.data.page,per_page:l.data.per_page,total_pages:l.data.pages})):i.error(l.error||"Nepodařilo se načíst audit log")}catch{i.error("Chyba připojení")}finally{g(!1)}},[s]);if(t.useEffect(()=>{c()},[c]),!o("settings.audit"))return e.jsx(D,{});const m=(a,n)=>{z(d=>({...d,[a]:n}))},T=a=>{c(a,r?.per_page||50)},O=a=>{c(1,a)},V=async()=>{f(!0);try{const n=await(await N(`${_}/audit-log.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"cleanup",days:v})})).json();n.success?(i.success(n.message),x(!1),c()):i.error(n.error)}catch{i.error("Chyba připojení")}finally{f(!1)}},L=a=>a?new Date(a).toLocaleString("cs-CZ"):"-";return p&&u.length===0?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"160px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"0.75rem",padding:"1rem"},children:e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px"}})})}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"4px"}}),Array.from({length:8},(a,n)=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"120px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"70px",borderRadius:"10px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line flex-1"}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px"}})]},n))]})})]}):e.jsxs("div",{children:[e.jsxs(y.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Audit log"}),r&&e.jsxs("p",{className:"admin-page-subtitle",children:[r.total," ",B(r.total,"záznam","záznamy","záznamů")]})]}),e.jsxs("button",{className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>x(!0),children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]}),"Vyčistit"]})]}),P&&e.jsxs("div",{className:"admin-modal-overlay",style:{opacity:1},children:[e.jsx("div",{className:"admin-modal-backdrop",onClick:()=>!j&&x(!1)}),e.jsxs(y.div,{className:"admin-modal admin-confirm-modal",initial:{opacity:0,scale:.95,y:20},animate:{opacity:1,scale:1,y:0},transition:{duration:.2},children:[e.jsxs("div",{className:"admin-modal-body admin-confirm-content",children:[e.jsx("div",{className:"admin-confirm-icon admin-confirm-icon-danger",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})}),e.jsx("h2",{className:"admin-confirm-title",children:"Vyčistit audit log"}),e.jsx("p",{className:"admin-confirm-message",children:"Smazat záznamy starší než:"}),e.jsx("div",{style:{margin:"0.75rem auto",maxWidth:"200px"},children:e.jsxs("select",{className:"admin-form-select",value:v,onChange:a=>A(parseInt(a.target.value)),children:[e.jsx("option",{value:30,children:"30 dní"}),e.jsx("option",{value:60,children:"60 dní"}),e.jsx("option",{value:90,children:"90 dní"}),e.jsx("option",{value:180,children:"180 dní"}),e.jsx("option",{value:365,children:"1 rok"}),e.jsx("option",{value:0,children:"Vše"})]})}),e.jsx("p",{className:"admin-confirm-message",style:{fontSize:"12px",opacity:.6},children:"Tato akce je nevratná."})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>x(!1),className:"admin-btn admin-btn-secondary",disabled:j,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:V,className:"admin-btn admin-btn-primary",disabled:j,children:j?"Mažu...":"Smazat"})]})]})]}),e.jsx(y.div,{className:"admin-card mb-4",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-form-row admin-form-row-5",children:[e.jsx(h,{label:"Hledat",children:e.jsx("input",{type:"text",className:"admin-form-input",placeholder:"Popis, uživatel...",value:s.search,onChange:a=>m("search",a.target.value)})}),e.jsx(h,{label:"Akce",children:e.jsxs("select",{className:"admin-form-select",value:s.action,onChange:a=>m("action",a.target.value),children:[e.jsx("option",{value:"",children:"Všechny"}),Z.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))]})}),e.jsx(h,{label:"Typ entity",children:e.jsxs("select",{className:"admin-form-select",value:s.entity_type,onChange:a=>m("entity_type",a.target.value),children:[e.jsx("option",{value:"",children:"Všechny"}),$.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))]})}),e.jsx(h,{label:"Od",children:e.jsx(b,{mode:"date",value:s.date_from,onChange:a=>m("date_from",a)})}),e.jsx(h,{label:"Do",children:e.jsx(b,{mode:"date",value:s.date_to,onChange:a=>m("date_to",a)})})]})})}),e.jsx(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsxs("div",{className:"admin-card-body",children:[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:"Čas"}),e.jsx("th",{children:"Uživatel"}),e.jsx("th",{children:"Akce"}),e.jsx("th",{children:"Typ entity"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{children:"IP"})]})}),e.jsxs("tbody",{children:[p&&Array.from({length:10},(a,n)=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"110px",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"70px",height:"22px",borderRadius:"10px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"14px"}})}),e.jsx("td",{children:e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px",height:"14px"}})})]},`skeleton-${n}`)),!p&&u.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:"6",children:e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),e.jsx("p",{children:"Žádné záznamy k zobrazení"})]})})}),!p&&u.map(a=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:L(a.created_at)}),e.jsx("td",{className:"fw-500",children:a.username||"-"}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${R[a.action]||"admin-badge-secondary"}`,children:k[a.action]||a.action})}),e.jsx("td",{children:w[a.entity_type]||a.entity_type||"-"}),e.jsx("td",{children:a.description||"-"}),e.jsx("td",{className:"admin-mono",children:a.user_ip||"-"})]},a.id))]})]})}),e.jsx(F,{pagination:r,onPageChange:T,onPerPageChange:O})]})})]})}export{G as default}; diff --git a/dist/assets/CompanySettings-7Kh5OyP9.js b/dist/assets/CompanySettings-BLIuJNHl.js similarity index 99% rename from dist/assets/CompanySettings-7Kh5OyP9.js rename to dist/assets/CompanySettings-BLIuJNHl.js index d068464..e94d091 100644 --- a/dist/assets/CompanySettings-7Kh5OyP9.js +++ b/dist/assets/CompanySettings-BLIuJNHl.js @@ -1 +1 @@ -import{j as e,m as y}from"./vendor-animation-0s3FMHwK.js";import{r}from"./vendor-react-BVs3cwbi.js";import{a as ne,u as te,c as j,F as i}from"./index-BrM8fzBu.js";import{F as ie}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const p="/api/admin",k=["street","city_postal","country","company_id","vat_id"],W={street:"Ulice",city_postal:"Město + PSČ",country:"Země",company_id:"IČO",vat_id:"DIČ"},A=new Date().getFullYear().toString().slice(-2);function me(){const o=ne(),{hasPermission:Z}=te(),[K,M]=r.useState(!0),[C,w]=r.useState(!1),[F,B]=r.useState(!1),[S,G]=r.useState(null),[d,U]=r.useState({company_name:"",street:"",city:"",postal_code:"",country:"",company_id:"",vat_id:"",quotation_prefix:"N",default_currency:"EUR",default_vat_rate:21,order_type_code:"71",invoice_type_code:"81"}),[m,v]=r.useState([]),z=r.useRef(0),[D,f]=r.useState([...k]),[L,q]=r.useState([]),[V,H]=r.useState(!0),[P,E]=r.useState(!1),[x,I]=r.useState(null),[u,h]=r.useState({account_name:"",bank_name:"",account_number:"",iban:"",bic:"",currency:"CZK",is_default:!1}),g=r.useCallback(()=>{const a=[...k],n=[...D].filter(s=>s!=="company_name");for(const s of a)n.includes(s)||n.push(s);for(let s=0;ss.startsWith("custom_")?parseInt(s.split("_")[1]){const s=g(),t=a+n;if(t<0||t>=s.length)return;const l=[...s];[l[a],l[t]]=[l[t],l[a]],f(l)},J=a=>{if(W[a])return W[a];if(a.startsWith("custom_")){const n=parseInt(a.split("_")[1]),s=m[n];if(s)return s.name?`${s.name}: ${s.value||"..."}`:s.value||`Vlastní pole ${n+1}`}return a},N=r.useCallback(async()=>{try{const a=await j(`${p}/company-settings.php?action=logo`);if(a.ok){const n=await a.blob();G(s=>(s&&URL.revokeObjectURL(s),URL.createObjectURL(n)))}}catch{}},[]),O=r.useCallback(async()=>{try{const a=await j(`${p}/company-settings.php`);if(a.status===401)return;const n=await a.json();if(n.success){const s=n.data;U({company_name:s.company_name||"",street:s.street||"",city:s.city||"",postal_code:s.postal_code||"",country:s.country||"",company_id:s.company_id||"",vat_id:s.vat_id||"",quotation_prefix:s.quotation_prefix||"N",default_currency:s.default_currency||"EUR",default_vat_rate:s.default_vat_rate||21,order_type_code:s.order_type_code||"71",invoice_type_code:s.invoice_type_code||"81"});const t=Array.isArray(s.custom_fields)&&s.custom_fields.length>0?s.custom_fields.map(l=>({...l,_key:`cf-${++z.current}`})):[];v(t),Array.isArray(s.supplier_field_order)&&s.supplier_field_order.length>0?f(s.supplier_field_order):f([...k]),s.has_logo&&N()}else o.error(n.error||"Nepodařilo se načíst nastavení")}catch{o.error("Chyba připojení")}finally{M(!1)}},[o,N]),b=r.useCallback(async()=>{try{const a=await j(`${p}/bank-accounts.php`);if(a.status===401)return;const n=await a.json();n.success&&q(n.data)}catch{}finally{H(!1)}},[]),_=()=>{I(null),h({account_name:"",bank_name:"",account_number:"",iban:"",bic:"",currency:"CZK",is_default:!1})},Y=async()=>{if(!u.account_name.trim()){o.error("Název účtu je povinný");return}E(!0);try{const a=x!==null,n=a?`${p}/bank-accounts.php?id=${x}`:`${p}/bank-accounts.php`,t=await(await j(n,{method:a?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)})).json();t.success?(o.success(t.message),_(),b()):o.error(t.error||"Chyba při ukládání")}catch{o.error("Chyba připojení")}finally{E(!1)}},X=async a=>{if(confirm("Opravdu smazat tento bankovní účet?"))try{const s=await(await j(`${p}/bank-accounts.php?id=${a}`,{method:"DELETE"})).json();s.success?(o.success(s.message),x===a&&_(),b()):o.error(s.error||"Chyba při mazání")}catch{o.error("Chyba připojení")}},Q=a=>{I(a.id),h({account_name:a.account_name||"",bank_name:a.bank_name||"",account_number:a.account_number||"",iban:a.iban||"",bic:a.bic||"",currency:a.currency||"CZK",is_default:!!a.is_default})};r.useEffect(()=>{O(),b()},[O,b]);const ee=async()=>{w(!0);try{const a={...d,custom_fields:m.filter(t=>t.name.trim()||t.value.trim()),supplier_field_order:g()},s=await(await j(`${p}/company-settings.php`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();s.success?o.success(s.message||"Nastavení bylo uloženo"):o.error(s.error||"Nepodařilo se uložit nastavení")}catch{o.error("Chyba připojení")}finally{w(!1)}},ae=async a=>{const n=a.target.files[0];if(n){B(!0);try{const s=new FormData;s.append("logo",n);const l=await(await j(`${p}/company-settings.php?action=logo`,{method:"POST",body:s})).json();l.success?(o.success(l.message||"Logo bylo nahráno"),N()):o.error(l.error||"Nepodařilo se nahrát logo")}catch{o.error("Chyba připojení")}finally{B(!1),a.target.value=""}}},c=(a,n)=>{U(s=>({...s,[a]:n}))};if(!Z("offers.settings"))return e.jsx(ie,{});if(K)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"120px",borderRadius:"8px"}})]}),e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:"1.25rem"},children:[0,1,2,3,4,5].map(a=>e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"60%"}}),[0,1,2].map(n=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-1/2"})]},n))]})},a))})]});const $=g();function se(){return P?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):x!==null?"Uložit změny":e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat účet"]})}return e.jsxs("div",{children:[e.jsxs(y.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nastavení firmy"}),e.jsx("p",{className:"admin-page-subtitle",children:"Firemní údaje, číslování dokladů a výchozí hodnoty"})]}),e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-primary",disabled:C,children:C?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit nastavení"})]}),e.jsxs("div",{className:"offers-settings-grid",children:[e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Firemní údaje"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(i,{label:"Název firmy",children:e.jsx("input",{type:"text",value:d.company_name,onChange:a=>c("company_name",a.target.value),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Ulice",children:e.jsx("input",{type:"text",value:d.street,onChange:a=>c("street",a.target.value),className:"admin-form-input"})}),e.jsx(i,{label:"Město",children:e.jsx("input",{type:"text",value:d.city,onChange:a=>c("city",a.target.value),className:"admin-form-input"})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"PSČ",children:e.jsx("input",{type:"text",value:d.postal_code,onChange:a=>c("postal_code",a.target.value),className:"admin-form-input"})}),e.jsx(i,{label:"Země",children:e.jsx("input",{type:"text",value:d.country,onChange:a=>c("country",a.target.value),className:"admin-form-input"})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"IČO",children:e.jsx("input",{type:"text",value:d.company_id,onChange:a=>c("company_id",a.target.value),className:"admin-form-input"})}),e.jsx(i,{label:"DIČ",children:e.jsx("input",{type:"text",value:d.vat_id,onChange:a=>c("vat_id",a.target.value),className:"admin-form-input"})})]}),e.jsxs("div",{style:{marginTop:4},children:[e.jsx("label",{className:"admin-form-label",style:{display:"block",marginBottom:4},children:"Vlastní pole"}),m.map((a,n)=>e.jsxs("div",{style:{marginBottom:8},children:[e.jsxs("div",{className:"admin-form-row",style:{marginBottom:0,alignItems:"flex-end"},children:[e.jsx(i,{label:n===0?"Název":" ",style:{flex:1},children:e.jsx("input",{type:"text",value:a.name,onChange:s=>{const t=[...m];t[n]={...t[n],name:s.target.value},v(t)},className:"admin-form-input",placeholder:"Např. Tel."})}),e.jsx(i,{label:n===0?"Hodnota":" ",style:{flex:1},children:e.jsxs("div",{style:{display:"flex",gap:4,alignItems:"center"},children:[e.jsx("input",{type:"text",value:a.value,onChange:s=>{const t=[...m];t[n]={...t[n],value:s.target.value},v(t)},className:"admin-form-input",style:{flex:1}}),e.jsx("button",{type:"button",onClick:()=>{const s=`custom_${n}`;f(t=>t.filter(l=>l!==s).map(l=>{if(l.startsWith("custom_")){const T=parseInt(l.split("_")[1]);if(T>n)return`custom_${T-1}`}return l})),v(m.filter((t,l)=>l!==n))},className:"admin-btn-icon danger",title:"Odebrat pole","aria-label":"Odebrat pole",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})})]}),e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:4},children:[e.jsx("input",{type:"checkbox",checked:a.showLabel!==!1,onChange:s=>{const t=[...m];t[n]={...t[n],showLabel:s.target.checked},v(t)}}),e.jsx("span",{style:{fontSize:"0.8rem"},children:"Zobrazit název v PDF"})]})]},a._key)),e.jsxs("button",{type:"button",onClick:()=>v([...m,{name:"",value:"",showLabel:!0,_key:`cf-${++z.current}`}]),className:"admin-btn admin-btn-secondary",style:{marginTop:4,fontSize:"0.85rem"},children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat pole"]})]})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Bankovní účty"})}),e.jsx("div",{className:"admin-card-body",children:V?e.jsx("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[0,1,2].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))}):e.jsxs(e.Fragment,{children:[L.length>0&&e.jsx("div",{className:"admin-table-responsive mb-4",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Název"}),e.jsx("th",{children:"Banka"}),e.jsx("th",{children:"Číslo účtu"}),e.jsx("th",{children:"IBAN"}),e.jsx("th",{children:"BIC/SWIFT"}),e.jsx("th",{children:"Měna"}),e.jsx("th",{style:{width:70},children:"Výchozí"}),e.jsx("th",{style:{width:80}})]})}),e.jsx("tbody",{children:L.map(a=>e.jsxs("tr",{style:x===a.id?{background:"var(--bg-tertiary)"}:void 0,children:[e.jsx("td",{children:a.account_name}),e.jsx("td",{children:a.bank_name}),e.jsx("td",{className:"admin-mono",children:a.account_number}),e.jsx("td",{className:"admin-mono",children:a.iban}),e.jsx("td",{className:"admin-mono",children:a.bic}),e.jsx("td",{children:a.currency}),e.jsx("td",{className:"text-center",children:a.is_default?e.jsx("span",{className:"text-accent fw-600",children:"✓"}):"–"}),e.jsx("td",{children:e.jsxs("div",{style:{display:"flex",gap:4},children:[e.jsx("button",{type:"button",onClick:()=>Q(a),className:"admin-btn-icon",title:"Upravit","aria-label":"Upravit",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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",{type:"button",onClick:()=>X(a.id),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})})]},a.id))})]})}),e.jsxs("div",{style:{background:"var(--bg-tertiary)",borderRadius:"var(--border-radius)",padding:16},children:[e.jsx("h4",{className:"text-secondary",style:{margin:"0 0 12px",fontSize:"0.9rem"},children:x!==null?"Upravit účet":"Přidat nový účet"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Název účtu",required:!0,children:e.jsx("input",{type:"text",value:u.account_name,onChange:a=>h(n=>({...n,account_name:a.target.value})),className:"admin-form-input",placeholder:"Např. Hlavní CZK účet"})}),e.jsx(i,{label:"Název banky",children:e.jsx("input",{type:"text",value:u.bank_name,onChange:a=>h(n=>({...n,bank_name:a.target.value})),className:"admin-form-input",placeholder:"Např. MONETA Money Bank, a.s."})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Číslo účtu",children:e.jsx("input",{type:"text",value:u.account_number,onChange:a=>h(n=>({...n,account_number:a.target.value})),className:"admin-form-input",placeholder:"123456789/0600"})}),e.jsx(i,{label:"Měna",children:e.jsxs("select",{value:u.currency,onChange:a=>h(n=>({...n,currency:a.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"CZK",children:"CZK"}),e.jsx("option",{value:"EUR",children:"EUR"}),e.jsx("option",{value:"USD",children:"USD"}),e.jsx("option",{value:"GBP",children:"GBP"})]})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"IBAN",children:e.jsx("input",{type:"text",value:u.iban,onChange:a=>h(n=>({...n,iban:a.target.value})),className:"admin-form-input",placeholder:"CZ65 0800 0000 1920 0014 5399"})}),e.jsx(i,{label:"BIC / SWIFT",children:e.jsx("input",{type:"text",value:u.bic,onChange:a=>h(n=>({...n,bic:a.target.value})),className:"admin-form-input",placeholder:"GIBACZPX"})})]}),e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:u.is_default,onChange:a=>h(n=>({...n,is_default:a.target.checked}))}),e.jsx("span",{children:"Výchozí účet (použije se automaticky při vytváření faktury)"})]}),e.jsxs("div",{style:{display:"flex",gap:8,marginTop:8},children:[e.jsx("button",{type:"button",onClick:Y,className:"admin-btn admin-btn-primary",disabled:P,style:{fontSize:"0.85rem"},children:se()}),x!==null&&e.jsx("button",{type:"button",onClick:_,className:"admin-btn admin-btn-secondary",style:{fontSize:"0.85rem"},children:"Zrušit"})]})]})]})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Pořadí polí dodavatele v PDF"})}),e.jsxs("div",{className:"admin-card-body",children:[e.jsx("small",{className:"admin-form-hint",style:{display:"block",marginBottom:12},children:"Určuje pořadí řádků v adresním bloku dodavatele na PDF nabídce."}),e.jsx("div",{className:"admin-reorder-list",children:$.map((a,n)=>e.jsxs("div",{className:"admin-reorder-item",children:[e.jsxs("div",{className:"admin-reorder-arrows",children:[e.jsx("button",{type:"button",onClick:()=>R(n,-1),disabled:n===0,className:"admin-btn-icon",title:"Nahoru","aria-label":"Nahoru",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>R(n,1),disabled:n===$.length-1,className:"admin-btn-icon",title:"Dolů","aria-label":"Dolů",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})})]}),e.jsx("span",{className:`admin-reorder-label${a.startsWith("custom_")?" accent":""}`,children:J(a)})]},a))})]})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Logo"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"offers-logo-section",children:[S&&e.jsx("div",{className:"offers-logo-preview",children:e.jsx("img",{src:S,alt:"Logo"})}),e.jsxs("label",{className:"admin-btn admin-btn-secondary",style:{cursor:"pointer"},children:[F?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Nahrávání..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Nahrát logo"]}),e.jsx("input",{type:"file",accept:"image/*",onChange:ae,style:{display:"none"},disabled:F})]}),e.jsx("small",{className:"admin-form-hint",children:"PNG, JPEG, GIF nebo WebP, max 5 MB"})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Číslování dokladů"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs(i,{label:"Nabídky — prefix",children:[e.jsx("input",{type:"text",value:d.quotation_prefix,onChange:a=>c("quotation_prefix",a.target.value),className:"admin-form-input",placeholder:"N",style:{maxWidth:120}}),e.jsxs("small",{className:"admin-form-hint",children:["Formát: ROK/PREFIX/ČÍSLO — ukázka: ",new Date().getFullYear(),"/",d.quotation_prefix||"N","/001"]})]}),e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-color)",margin:"0.75rem 0"}}),e.jsxs(i,{label:"Objednávky a projekty — typový kód",children:[e.jsx("input",{type:"text",value:d.order_type_code,onChange:a=>c("order_type_code",a.target.value),className:"admin-form-input",placeholder:"71",style:{maxWidth:120}}),e.jsxs("small",{className:"admin-form-hint",children:["Formát: RRKÓD#### — ukázka: ",A,d.order_type_code||"71","0001"]})]}),e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-color)",margin:"0.75rem 0"}}),e.jsxs(i,{label:"Faktury — typový kód",children:[e.jsx("input",{type:"text",value:d.invoice_type_code,onChange:a=>c("invoice_type_code",a.target.value),className:"admin-form-input",placeholder:"81",style:{maxWidth:120}}),e.jsxs("small",{className:"admin-form-hint",children:["Formát: RRKÓD#### — ukázka: ",A,d.invoice_type_code||"81","0001"]})]})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Výchozí hodnoty"})}),e.jsx("div",{className:"admin-card-body",children:e.jsx("div",{className:"admin-form",children:e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Výchozí měna",children:e.jsxs("select",{value:d.default_currency,onChange:a=>c("default_currency",a.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"EUR",children:"EUR (€)"}),e.jsx("option",{value:"USD",children:"USD ($)"}),e.jsx("option",{value:"CZK",children:"CZK (Kč)"}),e.jsx("option",{value:"GBP",children:"GBP (£)"})]})}),e.jsx(i,{label:"Výchozí sazba DPH (%)",children:e.jsx("input",{type:"number",value:d.default_vat_rate,onChange:a=>c("default_vat_rate",parseFloat(a.target.value)||0),className:"admin-form-input",step:"0.1"})})]})})})]})]})]})}export{me as default}; +import{j as e,m as y}from"./vendor-animation-0s3FMHwK.js";import{r}from"./vendor-react-BVs3cwbi.js";import{a as ne,u as te,c as j,F as i}from"./index-Bay45BGf.js";import{F as ie}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const p="/api/admin",k=["street","city_postal","country","company_id","vat_id"],W={street:"Ulice",city_postal:"Město + PSČ",country:"Země",company_id:"IČO",vat_id:"DIČ"},A=new Date().getFullYear().toString().slice(-2);function me(){const o=ne(),{hasPermission:Z}=te(),[K,M]=r.useState(!0),[C,w]=r.useState(!1),[F,B]=r.useState(!1),[S,G]=r.useState(null),[d,U]=r.useState({company_name:"",street:"",city:"",postal_code:"",country:"",company_id:"",vat_id:"",quotation_prefix:"N",default_currency:"EUR",default_vat_rate:21,order_type_code:"71",invoice_type_code:"81"}),[m,v]=r.useState([]),z=r.useRef(0),[D,f]=r.useState([...k]),[L,q]=r.useState([]),[V,H]=r.useState(!0),[P,E]=r.useState(!1),[x,I]=r.useState(null),[u,h]=r.useState({account_name:"",bank_name:"",account_number:"",iban:"",bic:"",currency:"CZK",is_default:!1}),g=r.useCallback(()=>{const a=[...k],n=[...D].filter(s=>s!=="company_name");for(const s of a)n.includes(s)||n.push(s);for(let s=0;ss.startsWith("custom_")?parseInt(s.split("_")[1]){const s=g(),t=a+n;if(t<0||t>=s.length)return;const l=[...s];[l[a],l[t]]=[l[t],l[a]],f(l)},J=a=>{if(W[a])return W[a];if(a.startsWith("custom_")){const n=parseInt(a.split("_")[1]),s=m[n];if(s)return s.name?`${s.name}: ${s.value||"..."}`:s.value||`Vlastní pole ${n+1}`}return a},N=r.useCallback(async()=>{try{const a=await j(`${p}/company-settings.php?action=logo`);if(a.ok){const n=await a.blob();G(s=>(s&&URL.revokeObjectURL(s),URL.createObjectURL(n)))}}catch{}},[]),O=r.useCallback(async()=>{try{const a=await j(`${p}/company-settings.php`);if(a.status===401)return;const n=await a.json();if(n.success){const s=n.data;U({company_name:s.company_name||"",street:s.street||"",city:s.city||"",postal_code:s.postal_code||"",country:s.country||"",company_id:s.company_id||"",vat_id:s.vat_id||"",quotation_prefix:s.quotation_prefix||"N",default_currency:s.default_currency||"EUR",default_vat_rate:s.default_vat_rate||21,order_type_code:s.order_type_code||"71",invoice_type_code:s.invoice_type_code||"81"});const t=Array.isArray(s.custom_fields)&&s.custom_fields.length>0?s.custom_fields.map(l=>({...l,_key:`cf-${++z.current}`})):[];v(t),Array.isArray(s.supplier_field_order)&&s.supplier_field_order.length>0?f(s.supplier_field_order):f([...k]),s.has_logo&&N()}else o.error(n.error||"Nepodařilo se načíst nastavení")}catch{o.error("Chyba připojení")}finally{M(!1)}},[o,N]),b=r.useCallback(async()=>{try{const a=await j(`${p}/bank-accounts.php`);if(a.status===401)return;const n=await a.json();n.success&&q(n.data)}catch{}finally{H(!1)}},[]),_=()=>{I(null),h({account_name:"",bank_name:"",account_number:"",iban:"",bic:"",currency:"CZK",is_default:!1})},Y=async()=>{if(!u.account_name.trim()){o.error("Název účtu je povinný");return}E(!0);try{const a=x!==null,n=a?`${p}/bank-accounts.php?id=${x}`:`${p}/bank-accounts.php`,t=await(await j(n,{method:a?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)})).json();t.success?(o.success(t.message),_(),b()):o.error(t.error||"Chyba při ukládání")}catch{o.error("Chyba připojení")}finally{E(!1)}},X=async a=>{if(confirm("Opravdu smazat tento bankovní účet?"))try{const s=await(await j(`${p}/bank-accounts.php?id=${a}`,{method:"DELETE"})).json();s.success?(o.success(s.message),x===a&&_(),b()):o.error(s.error||"Chyba při mazání")}catch{o.error("Chyba připojení")}},Q=a=>{I(a.id),h({account_name:a.account_name||"",bank_name:a.bank_name||"",account_number:a.account_number||"",iban:a.iban||"",bic:a.bic||"",currency:a.currency||"CZK",is_default:!!a.is_default})};r.useEffect(()=>{O(),b()},[O,b]);const ee=async()=>{w(!0);try{const a={...d,custom_fields:m.filter(t=>t.name.trim()||t.value.trim()),supplier_field_order:g()},s=await(await j(`${p}/company-settings.php`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();s.success?o.success(s.message||"Nastavení bylo uloženo"):o.error(s.error||"Nepodařilo se uložit nastavení")}catch{o.error("Chyba připojení")}finally{w(!1)}},ae=async a=>{const n=a.target.files[0];if(n){B(!0);try{const s=new FormData;s.append("logo",n);const l=await(await j(`${p}/company-settings.php?action=logo`,{method:"POST",body:s})).json();l.success?(o.success(l.message||"Logo bylo nahráno"),N()):o.error(l.error||"Nepodařilo se nahrát logo")}catch{o.error("Chyba připojení")}finally{B(!1),a.target.value=""}}},c=(a,n)=>{U(s=>({...s,[a]:n}))};if(!Z("offers.settings"))return e.jsx(ie,{});if(K)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"120px",borderRadius:"8px"}})]}),e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:"1.25rem"},children:[0,1,2,3,4,5].map(a=>e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"60%"}}),[0,1,2].map(n=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-1/2"})]},n))]})},a))})]});const $=g();function se(){return P?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):x!==null?"Uložit změny":e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat účet"]})}return e.jsxs("div",{children:[e.jsxs(y.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nastavení firmy"}),e.jsx("p",{className:"admin-page-subtitle",children:"Firemní údaje, číslování dokladů a výchozí hodnoty"})]}),e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-primary",disabled:C,children:C?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit nastavení"})]}),e.jsxs("div",{className:"offers-settings-grid",children:[e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Firemní údaje"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(i,{label:"Název firmy",children:e.jsx("input",{type:"text",value:d.company_name,onChange:a=>c("company_name",a.target.value),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Ulice",children:e.jsx("input",{type:"text",value:d.street,onChange:a=>c("street",a.target.value),className:"admin-form-input"})}),e.jsx(i,{label:"Město",children:e.jsx("input",{type:"text",value:d.city,onChange:a=>c("city",a.target.value),className:"admin-form-input"})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"PSČ",children:e.jsx("input",{type:"text",value:d.postal_code,onChange:a=>c("postal_code",a.target.value),className:"admin-form-input"})}),e.jsx(i,{label:"Země",children:e.jsx("input",{type:"text",value:d.country,onChange:a=>c("country",a.target.value),className:"admin-form-input"})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"IČO",children:e.jsx("input",{type:"text",value:d.company_id,onChange:a=>c("company_id",a.target.value),className:"admin-form-input"})}),e.jsx(i,{label:"DIČ",children:e.jsx("input",{type:"text",value:d.vat_id,onChange:a=>c("vat_id",a.target.value),className:"admin-form-input"})})]}),e.jsxs("div",{style:{marginTop:4},children:[e.jsx("label",{className:"admin-form-label",style:{display:"block",marginBottom:4},children:"Vlastní pole"}),m.map((a,n)=>e.jsxs("div",{style:{marginBottom:8},children:[e.jsxs("div",{className:"admin-form-row",style:{marginBottom:0,alignItems:"flex-end"},children:[e.jsx(i,{label:n===0?"Název":" ",style:{flex:1},children:e.jsx("input",{type:"text",value:a.name,onChange:s=>{const t=[...m];t[n]={...t[n],name:s.target.value},v(t)},className:"admin-form-input",placeholder:"Např. Tel."})}),e.jsx(i,{label:n===0?"Hodnota":" ",style:{flex:1},children:e.jsxs("div",{style:{display:"flex",gap:4,alignItems:"center"},children:[e.jsx("input",{type:"text",value:a.value,onChange:s=>{const t=[...m];t[n]={...t[n],value:s.target.value},v(t)},className:"admin-form-input",style:{flex:1}}),e.jsx("button",{type:"button",onClick:()=>{const s=`custom_${n}`;f(t=>t.filter(l=>l!==s).map(l=>{if(l.startsWith("custom_")){const T=parseInt(l.split("_")[1]);if(T>n)return`custom_${T-1}`}return l})),v(m.filter((t,l)=>l!==n))},className:"admin-btn-icon danger",title:"Odebrat pole","aria-label":"Odebrat pole",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})})]}),e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:4},children:[e.jsx("input",{type:"checkbox",checked:a.showLabel!==!1,onChange:s=>{const t=[...m];t[n]={...t[n],showLabel:s.target.checked},v(t)}}),e.jsx("span",{style:{fontSize:"0.8rem"},children:"Zobrazit název v PDF"})]})]},a._key)),e.jsxs("button",{type:"button",onClick:()=>v([...m,{name:"",value:"",showLabel:!0,_key:`cf-${++z.current}`}]),className:"admin-btn admin-btn-secondary",style:{marginTop:4,fontSize:"0.85rem"},children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat pole"]})]})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Bankovní účty"})}),e.jsx("div",{className:"admin-card-body",children:V?e.jsx("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[0,1,2].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))}):e.jsxs(e.Fragment,{children:[L.length>0&&e.jsx("div",{className:"admin-table-responsive mb-4",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Název"}),e.jsx("th",{children:"Banka"}),e.jsx("th",{children:"Číslo účtu"}),e.jsx("th",{children:"IBAN"}),e.jsx("th",{children:"BIC/SWIFT"}),e.jsx("th",{children:"Měna"}),e.jsx("th",{style:{width:70},children:"Výchozí"}),e.jsx("th",{style:{width:80}})]})}),e.jsx("tbody",{children:L.map(a=>e.jsxs("tr",{style:x===a.id?{background:"var(--bg-tertiary)"}:void 0,children:[e.jsx("td",{children:a.account_name}),e.jsx("td",{children:a.bank_name}),e.jsx("td",{className:"admin-mono",children:a.account_number}),e.jsx("td",{className:"admin-mono",children:a.iban}),e.jsx("td",{className:"admin-mono",children:a.bic}),e.jsx("td",{children:a.currency}),e.jsx("td",{className:"text-center",children:a.is_default?e.jsx("span",{className:"text-accent fw-600",children:"✓"}):"–"}),e.jsx("td",{children:e.jsxs("div",{style:{display:"flex",gap:4},children:[e.jsx("button",{type:"button",onClick:()=>Q(a),className:"admin-btn-icon",title:"Upravit","aria-label":"Upravit",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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",{type:"button",onClick:()=>X(a.id),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})})]},a.id))})]})}),e.jsxs("div",{style:{background:"var(--bg-tertiary)",borderRadius:"var(--border-radius)",padding:16},children:[e.jsx("h4",{className:"text-secondary",style:{margin:"0 0 12px",fontSize:"0.9rem"},children:x!==null?"Upravit účet":"Přidat nový účet"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Název účtu",required:!0,children:e.jsx("input",{type:"text",value:u.account_name,onChange:a=>h(n=>({...n,account_name:a.target.value})),className:"admin-form-input",placeholder:"Např. Hlavní CZK účet"})}),e.jsx(i,{label:"Název banky",children:e.jsx("input",{type:"text",value:u.bank_name,onChange:a=>h(n=>({...n,bank_name:a.target.value})),className:"admin-form-input",placeholder:"Např. MONETA Money Bank, a.s."})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Číslo účtu",children:e.jsx("input",{type:"text",value:u.account_number,onChange:a=>h(n=>({...n,account_number:a.target.value})),className:"admin-form-input",placeholder:"123456789/0600"})}),e.jsx(i,{label:"Měna",children:e.jsxs("select",{value:u.currency,onChange:a=>h(n=>({...n,currency:a.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"CZK",children:"CZK"}),e.jsx("option",{value:"EUR",children:"EUR"}),e.jsx("option",{value:"USD",children:"USD"}),e.jsx("option",{value:"GBP",children:"GBP"})]})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"IBAN",children:e.jsx("input",{type:"text",value:u.iban,onChange:a=>h(n=>({...n,iban:a.target.value})),className:"admin-form-input",placeholder:"CZ65 0800 0000 1920 0014 5399"})}),e.jsx(i,{label:"BIC / SWIFT",children:e.jsx("input",{type:"text",value:u.bic,onChange:a=>h(n=>({...n,bic:a.target.value})),className:"admin-form-input",placeholder:"GIBACZPX"})})]}),e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:u.is_default,onChange:a=>h(n=>({...n,is_default:a.target.checked}))}),e.jsx("span",{children:"Výchozí účet (použije se automaticky při vytváření faktury)"})]}),e.jsxs("div",{style:{display:"flex",gap:8,marginTop:8},children:[e.jsx("button",{type:"button",onClick:Y,className:"admin-btn admin-btn-primary",disabled:P,style:{fontSize:"0.85rem"},children:se()}),x!==null&&e.jsx("button",{type:"button",onClick:_,className:"admin-btn admin-btn-secondary",style:{fontSize:"0.85rem"},children:"Zrušit"})]})]})]})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Pořadí polí dodavatele v PDF"})}),e.jsxs("div",{className:"admin-card-body",children:[e.jsx("small",{className:"admin-form-hint",style:{display:"block",marginBottom:12},children:"Určuje pořadí řádků v adresním bloku dodavatele na PDF nabídce."}),e.jsx("div",{className:"admin-reorder-list",children:$.map((a,n)=>e.jsxs("div",{className:"admin-reorder-item",children:[e.jsxs("div",{className:"admin-reorder-arrows",children:[e.jsx("button",{type:"button",onClick:()=>R(n,-1),disabled:n===0,className:"admin-btn-icon",title:"Nahoru","aria-label":"Nahoru",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>R(n,1),disabled:n===$.length-1,className:"admin-btn-icon",title:"Dolů","aria-label":"Dolů",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})})]}),e.jsx("span",{className:`admin-reorder-label${a.startsWith("custom_")?" accent":""}`,children:J(a)})]},a))})]})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Logo"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"offers-logo-section",children:[S&&e.jsx("div",{className:"offers-logo-preview",children:e.jsx("img",{src:S,alt:"Logo"})}),e.jsxs("label",{className:"admin-btn admin-btn-secondary",style:{cursor:"pointer"},children:[F?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Nahrávání..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Nahrát logo"]}),e.jsx("input",{type:"file",accept:"image/*",onChange:ae,style:{display:"none"},disabled:F})]}),e.jsx("small",{className:"admin-form-hint",children:"PNG, JPEG, GIF nebo WebP, max 5 MB"})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Číslování dokladů"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs(i,{label:"Nabídky — prefix",children:[e.jsx("input",{type:"text",value:d.quotation_prefix,onChange:a=>c("quotation_prefix",a.target.value),className:"admin-form-input",placeholder:"N",style:{maxWidth:120}}),e.jsxs("small",{className:"admin-form-hint",children:["Formát: ROK/PREFIX/ČÍSLO — ukázka: ",new Date().getFullYear(),"/",d.quotation_prefix||"N","/001"]})]}),e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-color)",margin:"0.75rem 0"}}),e.jsxs(i,{label:"Objednávky a projekty — typový kód",children:[e.jsx("input",{type:"text",value:d.order_type_code,onChange:a=>c("order_type_code",a.target.value),className:"admin-form-input",placeholder:"71",style:{maxWidth:120}}),e.jsxs("small",{className:"admin-form-hint",children:["Formát: RRKÓD#### — ukázka: ",A,d.order_type_code||"71","0001"]})]}),e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-color)",margin:"0.75rem 0"}}),e.jsxs(i,{label:"Faktury — typový kód",children:[e.jsx("input",{type:"text",value:d.invoice_type_code,onChange:a=>c("invoice_type_code",a.target.value),className:"admin-form-input",placeholder:"81",style:{maxWidth:120}}),e.jsxs("small",{className:"admin-form-hint",children:["Formát: RRKÓD#### — ukázka: ",A,d.invoice_type_code||"81","0001"]})]})]})})]}),e.jsxs(y.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h3",{className:"admin-card-title",children:"Výchozí hodnoty"})}),e.jsx("div",{className:"admin-card-body",children:e.jsx("div",{className:"admin-form",children:e.jsxs("div",{className:"admin-form-row",children:[e.jsx(i,{label:"Výchozí měna",children:e.jsxs("select",{value:d.default_currency,onChange:a=>c("default_currency",a.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"EUR",children:"EUR (€)"}),e.jsx("option",{value:"USD",children:"USD ($)"}),e.jsx("option",{value:"CZK",children:"CZK (Kč)"}),e.jsx("option",{value:"GBP",children:"GBP (£)"})]})}),e.jsx(i,{label:"Výchozí sazba DPH (%)",children:e.jsx("input",{type:"number",value:d.default_vat_rate,onChange:a=>c("default_vat_rate",parseFloat(a.target.value)||0),className:"admin-form-input",step:"0.1"})})]})})})]})]})]})}export{me as default}; diff --git a/dist/assets/InvoiceCreate-Bqil74eu.js b/dist/assets/InvoiceCreate-BkvZM33j.js similarity index 99% rename from dist/assets/InvoiceCreate-Bqil74eu.js rename to dist/assets/InvoiceCreate-BkvZM33j.js index df9cf39..65a7fda 100644 --- a/dist/assets/InvoiceCreate-Bqil74eu.js +++ b/dist/assets/InvoiceCreate-BkvZM33j.js @@ -1,2 +1,2 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RichEditor-Bfur5pi6.js","assets/vendor-animation-0s3FMHwK.js","assets/vendor-react-BVs3cwbi.js","assets/RichEditor-7oN3-GhD.css"])))=>i.map(i=>d[i]); -import{a as ye,u as fe,F as _,A as G,g as P,c as w,_ as xe}from"./index-BrM8fzBu.js";import{j as e,m as O}from"./vendor-animation-0s3FMHwK.js";import{g as be,i as je,r,L as ve}from"./vendor-react-BVs3cwbi.js";import{F as ke}from"./Forbidden-D25jV3Oq.js";import{u as ge,a as L,b as Ne,D as we,r as Se,c as Ce,S as De,v as Ae,d as Ie,e as Pe,K as Oe,T as Ee,P as ze}from"./useSortableList-CgbuKaxB.js";import"./vendor-utils-Dyr8OjFr.js";const Te=r.lazy(()=>xe(()=>import("./RichEditor-Bfur5pi6.js"),__vite__mapDeps([0,1,2,3]))),S="/api/admin",Re=[{value:21,label:"21%"},{value:12,label:"12%"},{value:0,label:"0%"}];let Z=0;const Q=()=>({_key:`inv-${++Z}`,description:"",quantity:1,unit:"ks",unit_price:0,vat_rate:21});function Me(){const X=be(),[ee]=je(),C=ye(),{hasPermission:te,user:ae}=fe(),E=ee.get("fromOrder"),y=E&&/^\d+$/.test(E)?E:null,[i,d]=r.useState({customer_id:null,customer_name:"",order_id:y?Number(y):null,issue_date:new Date().toISOString().split("T")[0],due_date:new Date(Date.now()+14*864e5).toISOString().split("T")[0],tax_date:new Date().toISOString().split("T")[0],currency:"CZK",apply_vat:1,vat_rate:21,payment_method:"Příkazem",constant_symbol:"0308",issued_by:ae?.fullName||"",notes:"",bank_account_id:"",bank_name:"",bank_swift:"",bank_iban:"",bank_account:""}),[q,se]=r.useState([]),[j,H]=r.useState(14),[u,f]=r.useState([Q()]),[x,v]=r.useState({}),[B,M]=r.useState(!1),[ne,ie]=r.useState(!0),[D,K]=r.useState(""),[z,re]=r.useState([]),[k,V]=r.useState(""),[T,A]=r.useState(!1),g="boha_invoice_draft",I=!y,[R,F]=r.useState(null),U=r.useRef({form:i,items:u,dueDays:14}),oe=r.useRef(!1);r.useEffect(()=>{if(I)try{const t=localStorage.getItem(g);if(!t)return;const a=JSON.parse(t);if(!a||typeof a!="object"||!a.form||!Array.isArray(a.items)){localStorage.removeItem(g);return}const{form:n,items:o,savedAt:c}=a;d(s=>({...s,customer_id:n.customer_id??s.customer_id,customer_name:n.customer_name??s.customer_name,currency:n.currency??s.currency,apply_vat:n.apply_vat??s.apply_vat,payment_method:n.payment_method??s.payment_method,constant_symbol:n.constant_symbol??s.constant_symbol,issued_by:s.issued_by,notes:n.notes??s.notes,issue_date:n.issue_date??s.issue_date,due_date:n.due_date??s.due_date,tax_date:n.tax_date??s.tax_date,bank_account_id:n.bank_account_id??s.bank_account_id,bank_name:n.bank_name??s.bank_name,bank_swift:n.bank_swift??s.bank_swift,bank_iban:n.bank_iban??s.bank_iban,bank_account:n.bank_account??s.bank_account})),o.length>0&&f(o.map(s=>({...s,_key:s._key||`inv-${++Z}`}))),a.due_days&&H(Number(a.due_days)),oe.current=!0,c&&F(new Date(c))}catch{try{localStorage.removeItem(g)}catch{}}},[I]),r.useEffect(()=>{U.current={form:i,items:u,dueDays:j}},[i,u,j]),r.useEffect(()=>{if(!I)return;const t=setTimeout(()=>{try{const{form:a,items:n,dueDays:o}=U.current,{bank_name:c,bank_swift:s,bank_iban:l,bank_account:h,...p}=a,m=new Date().toISOString();localStorage.setItem(g,JSON.stringify({form:p,items:n,due_days:o,savedAt:m})),F(new Date(m))}catch{}},500);return()=>clearTimeout(t)},[i,u,I]);const ce=r.useCallback(()=>{try{localStorage.removeItem(g)}catch{}F(null)},[]),J=r.useMemo(()=>R?R.toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"}):null,[R]);r.useEffect(()=>{(async()=>{try{const a=[w(`${S}/invoices.php?action=next_number`),w(`${S}/customers.php`),w(`${S}/bank-accounts.php`)];y&&a.push(w(`${S}/invoices.php?action=order_data&id=${y}`));const n=await Promise.all(a),o=n[0];if(o.ok){const l=await o.json();l.success&&K(l.data.number)}const c=n[1];if(c.ok){const l=await c.json();l.success&&re(l.data.customers)}const s=n[2];if(s.ok){const l=await s.json();if(l.success&&Array.isArray(l.data)){se(l.data);const h=l.data.find(p=>p.is_default);d(p=>{const m=p.bank_account_id,b=(m?l.data.find(_e=>String(_e.id)===String(m)):null)||h;return b?{...p,bank_account_id:b.id,bank_name:b.bank_name||"",bank_swift:b.bic||"",bank_iban:b.iban||"",bank_account:b.account_number||""}:p})}}if(y&&n[3]?.ok){const l=await n[3].json();if(l.success){const h=l.data,p=Number(h.vat_rate)||21;d(m=>({...m,customer_id:h.customer_id,customer_name:h.customer_name||"",order_id:h.id,currency:h.currency||"CZK",apply_vat:Number(h.apply_vat)||0,vat_rate:p})),h.items?.length>0&&f(h.items.map(m=>({_key:`inv-${++Z}`,description:m.description||"",quantity:Number(m.quantity)||1,unit:m.unit||"",unit_price:Number(m.unit_price)||0,vat_rate:p})))}}}catch{C.error("Chyba při načítání dat")}finally{ie(!1)}})()},[y]),r.useEffect(()=>{if(!i.issue_date)return;const t=new Date(i.issue_date);t.setDate(t.getDate()+j),d(a=>({...a,due_date:t.toISOString().split("T")[0]}))},[i.issue_date,j]);const W=r.useMemo(()=>{if(!k)return z;const t=k.toLowerCase();return z.filter(a=>(a.name||"").toLowerCase().includes(t)||(a.company_id||"").includes(k)||(a.city||"").toLowerCase().includes(t))},[z,k]);r.useEffect(()=>{const t=()=>A(!1);if(T)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[T]);const le=t=>{const a=q.find(n=>n.id===Number(t));d(a?n=>({...n,bank_account_id:a.id,bank_name:a.bank_name||"",bank_swift:a.bic||"",bank_iban:a.iban||"",bank_account:a.account_number||""}):n=>({...n,bank_account_id:"",bank_name:"",bank_swift:"",bank_iban:"",bank_account:""}))},de=t=>{d(a=>({...a,customer_id:t.id,customer_name:t.name})),v(a=>({...a,customer_id:void 0})),V(""),A(!1)},N=(t,a,n)=>{f(o=>o.map((c,s)=>s===t?{...c,[a]:n}:c))},ue=()=>f(t=>[...t,Q()]),me=t=>{u.length<=1||f(a=>a.filter((n,o)=>o!==t))},he=ge(L(ze,{activationConstraint:{distance:5}}),L(Ee,{activationConstraint:{delay:200,tolerance:5}}),L(Oe)),{handleDragEnd:pe}=Ne(f,"_key"),$=r.useMemo(()=>{let t=0;const a={};u.forEach(o=>{const c=(Number(o.quantity)||0)*(Number(o.unit_price)||0);if(t+=c,i.apply_vat){const s=Number(o.vat_rate)||0;a[s]||(a[s]=0),a[s]+=c*s/100}});const n=Object.values(a).reduce((o,c)=>o+c,0);return{subtotal:t,vatByRate:a,totalVat:n,total:t+n}},[u,i.apply_vat]),Y=async t=>{t.preventDefault();const a={};if(i.customer_id||(a.customer_id="Vyberte zákazníka"),i.issue_date||(a.issue_date="Zadejte datum"),i.tax_date||(a.tax_date="Zadejte datum"),i.bank_account_id||(a.bank_account_id="Vyberte bankovní účet"),(u.length===0||u.every(n=>!n.description.trim()))&&(a.items="Přidejte alespoň jednu položku"),v(a),!(Object.keys(a).length>0)){M(!0);try{const o=await(await w(`${S}/invoices.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...i,invoice_number:D,items:u.filter(c=>c.description.trim()).map((c,s)=>({...c,position:s}))})})).json();o.success?(ce(),C.success(o.message||"Faktura byla vytvořena"),X(`/invoices/${o.data.invoice_id}`)):C.error(o.error||"Nepodařilo se vytvořit fakturu")}catch{C.error("Chyba připojení")}finally{M(!1)}}};return te("invoices.create")?ne?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(t=>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/2"})]},t))})})]}):e.jsxs("div",{children:[e.jsxs(O.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(ve,{to:"/invoices",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsxs("div",{children:[e.jsxs("h1",{className:"admin-page-title",children:["Nová faktura ",D&&e.jsxs("span",{className:"text-tertiary",children:["(",D,")"]})]}),y?e.jsx("p",{className:"admin-page-subtitle",children:"Z objednávky"}):J&&e.jsxs("div",{className:"offers-draft-indicator",children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}),"Koncept uložen ",J]})]})]}),e.jsx("div",{className:"admin-page-actions",children:e.jsx("button",{onClick:Y,className:"admin-btn admin-btn-primary",disabled:B,children:B?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"})})]}),e.jsxs("form",{onSubmit:Y,children:[e.jsxs(O.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(_,{label:"Číslo faktury",children:e.jsx("input",{type:"text",value:D,onChange:t=>K(t.target.value),className:"admin-form-input"})}),e.jsx(_,{label:"Odběratel",error:x.customer_id,required:!0,children:i.customer_id?e.jsxs("div",{className:"offers-customer-selected",children:[e.jsx("span",{children:i.customer_name}),e.jsx("button",{type:"button",onClick:()=>d(t=>({...t,customer_id:null,customer_name:""})),className:"admin-btn-icon",title:"Odebrat zákazníka",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}):e.jsxs("div",{className:"offers-customer-select",onClick:t=>t.stopPropagation(),children:[e.jsx("input",{type:"text",value:k,onChange:t=>{V(t.target.value),A(!0)},onFocus:()=>A(!0),className:"admin-form-input",placeholder:"Hledat zákazníka (název, IČ, město)...",autoComplete:"off"}),T&&e.jsx("div",{className:"offers-customer-dropdown",children:W.length===0?e.jsx("div",{className:"offers-customer-dropdown-empty",children:"Žádní zákazníci"}):W.slice(0,10).map(t=>e.jsxs("div",{className:"offers-customer-dropdown-item",onMouseDown:()=>de(t),children:[e.jsx("div",{children:t.name}),(t.company_id||t.city)&&e.jsxs("div",{children:[t.company_id&&`IČ: ${t.company_id}`,t.city&&` · ${t.city}`]})]},t.id))})]})}),e.jsx(_,{label:"Vystavil",children:e.jsx("input",{type:"text",value:i.issued_by,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(_,{label:"Datum vystavení",error:x.issue_date,required:!0,children:e.jsx(G,{mode:"date",value:i.issue_date,onChange:t=>{d(a=>({...a,issue_date:t})),v(a=>({...a,issue_date:void 0}))}})}),e.jsxs(_,{label:"Splatnost (dny)",children:[e.jsx("select",{value:j,onChange:t=>H(Number(t.target.value)),className:"admin-form-select",children:Array.from({length:60},(t,a)=>a+1).map(t=>e.jsx("option",{value:t,children:t},t))}),i.due_date&&e.jsxs("span",{className:"text-tertiary",style:{fontSize:"0.75rem",marginTop:"0.25rem"},children:["Splatnost: ",new Date(i.due_date).toLocaleDateString("cs-CZ")]})]}),e.jsx(_,{label:"DÚZP",error:x.tax_date,required:!0,children:e.jsx(G,{mode:"date",value:i.tax_date,onChange:t=>{d(a=>({...a,tax_date:t})),v(a=>({...a,tax_date:void 0}))}})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(_,{label:"Forma úhrady",children:e.jsxs("select",{value:i.payment_method,onChange:t=>d(a=>({...a,payment_method:t.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"Příkazem",children:"Příkazem"}),e.jsx("option",{value:"Hotově",children:"Hotově"}),e.jsx("option",{value:"Dobírka",children:"Dobírka"})]})}),e.jsx(_,{label:"Měna",children:e.jsxs("select",{value:i.currency,onChange:t=>d(a=>({...a,currency:t.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"CZK",children:"CZK (Kč)"}),e.jsx("option",{value:"EUR",children:"EUR (€)"}),e.jsx("option",{value:"USD",children:"USD ($)"})]})}),e.jsx(_,{label:"DPH",children:e.jsx("div",{className:"flex-row-gap",children:e.jsxs("label",{className:"admin-form-checkbox",style:{whiteSpace:"nowrap"},children:[e.jsx("input",{type:"checkbox",checked:!!i.apply_vat,onChange:t=>d(a=>({...a,apply_vat:t.target.checked?1:0}))}),e.jsx("span",{children:"Uplatnit DPH"})]})})})]}),e.jsx(_,{label:"Bankovní účet",error:x.bank_account_id,required:!0,children:e.jsxs("select",{value:i.bank_account_id,onChange:t=>{le(t.target.value),v(a=>({...a,bank_account_id:void 0}))},className:"admin-form-select",children:[e.jsx("option",{value:"",children:"— Vyberte účet —"}),q.map(t=>e.jsxs("option",{value:t.id,children:[t.account_name,t.account_number?` (${t.account_number})`:"",t.is_default?" ★":""]},t.id))]})})]})]}),e.jsxs(O.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),x.items&&e.jsx("span",{className:"admin-form-error",children:x.items})]}),e.jsx("button",{type:"button",onClick:ue,className:"admin-btn admin-btn-primary admin-btn-sm",children:"+ Přidat položku"})]}),e.jsx("div",{className:"offers-items-table",children:e.jsx(we,{sensors:he,collisionDetection:Ce,modifiers:[Se],onDragEnd:pe,children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2rem"}}),e.jsx("th",{style:{width:"2rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jedn. cena"}),i.apply_vat?e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"DPH"}):null,e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Celkem"}),e.jsx("th",{style:{width:"2.5rem"}})]})}),e.jsx(De,{items:u.map(t=>String(t._key)),strategy:Ae,children:e.jsx("tbody",{children:u.map((t,a)=>{const n=(Number(t.quantity)||0)*(Number(t.unit_price)||0);return e.jsx(Ie,{id:String(t._key),children:({attributes:o,listeners:c})=>e.jsxs(e.Fragment,{children:[e.jsx("td",{style:{width:"2rem"},children:e.jsx(Pe,{listeners:c,attributes:o})}),e.jsx("td",{className:"text-tertiary text-center fw-500",children:a+1}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.description,onChange:s=>N(a,"description",s.target.value),className:"admin-form-input fw-500",placeholder:"Popis položky..."})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.quantity,onChange:s=>N(a,"quantity",s.target.value),className:"admin-form-input",min:"0",step:"any",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.unit,onChange:s=>N(a,"unit",s.target.value),className:"admin-form-input",placeholder:"ks",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.unit_price,onChange:s=>N(a,"unit_price",s.target.value),className:"admin-form-input",step:"any",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),i.apply_vat?e.jsx("td",{children:e.jsx("select",{value:t.vat_rate,onChange:s=>N(a,"vat_rate",Number(s.target.value)),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},children:Re.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))})}):null,e.jsx("td",{style:{textAlign:"right",fontWeight:600,whiteSpace:"nowrap"},children:P(n,i.currency)}),e.jsx("td",{children:u.length>1&&e.jsx("button",{type:"button",onClick:()=>me(a),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})]})},t._key)})})})]})})}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:P($.subtotal,i.currency)})]}),i.apply_vat&&Object.entries($.vatByRate).map(([t,a])=>e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH ",t,"%:"]}),e.jsx("span",{children:P(a,i.currency)})]},t)),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:P($.total,i.currency)})]})]})]}),e.jsxs(O.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:[e.jsx("h3",{className:"admin-card-title",children:"Veřejné poznámky na faktuře"}),e.jsx(r.Suspense,{fallback:e.jsx("div",{className:"admin-form-input",style:{minHeight:120}}),children:e.jsx(Te,{value:i.notes,onChange:t=>d(a=>({...a,notes:t})),placeholder:"Poznámky zobrazené na faktuře...",minHeight:"120px"})})]})]})]}):e.jsx(ke,{})}export{Me as default}; +import{a as ye,u as fe,F as _,A as G,g as P,c as w,_ as xe}from"./index-Bay45BGf.js";import{j as e,m as O}from"./vendor-animation-0s3FMHwK.js";import{g as be,i as je,r,L as ve}from"./vendor-react-BVs3cwbi.js";import{F as ke}from"./Forbidden-D25jV3Oq.js";import{u as ge,a as L,b as Ne,D as we,r as Se,c as Ce,S as De,v as Ae,d as Ie,e as Pe,K as Oe,T as Ee,P as ze}from"./useSortableList-CgbuKaxB.js";import"./vendor-utils-Dyr8OjFr.js";const Te=r.lazy(()=>xe(()=>import("./RichEditor-Bfur5pi6.js"),__vite__mapDeps([0,1,2,3]))),S="/api/admin",Re=[{value:21,label:"21%"},{value:12,label:"12%"},{value:0,label:"0%"}];let Z=0;const Q=()=>({_key:`inv-${++Z}`,description:"",quantity:1,unit:"ks",unit_price:0,vat_rate:21});function Me(){const X=be(),[ee]=je(),C=ye(),{hasPermission:te,user:ae}=fe(),E=ee.get("fromOrder"),y=E&&/^\d+$/.test(E)?E:null,[i,d]=r.useState({customer_id:null,customer_name:"",order_id:y?Number(y):null,issue_date:new Date().toISOString().split("T")[0],due_date:new Date(Date.now()+14*864e5).toISOString().split("T")[0],tax_date:new Date().toISOString().split("T")[0],currency:"CZK",apply_vat:1,vat_rate:21,payment_method:"Příkazem",constant_symbol:"0308",issued_by:ae?.fullName||"",notes:"",bank_account_id:"",bank_name:"",bank_swift:"",bank_iban:"",bank_account:""}),[q,se]=r.useState([]),[j,H]=r.useState(14),[u,f]=r.useState([Q()]),[x,v]=r.useState({}),[B,M]=r.useState(!1),[ne,ie]=r.useState(!0),[D,K]=r.useState(""),[z,re]=r.useState([]),[k,V]=r.useState(""),[T,A]=r.useState(!1),g="boha_invoice_draft",I=!y,[R,F]=r.useState(null),U=r.useRef({form:i,items:u,dueDays:14}),oe=r.useRef(!1);r.useEffect(()=>{if(I)try{const t=localStorage.getItem(g);if(!t)return;const a=JSON.parse(t);if(!a||typeof a!="object"||!a.form||!Array.isArray(a.items)){localStorage.removeItem(g);return}const{form:n,items:o,savedAt:c}=a;d(s=>({...s,customer_id:n.customer_id??s.customer_id,customer_name:n.customer_name??s.customer_name,currency:n.currency??s.currency,apply_vat:n.apply_vat??s.apply_vat,payment_method:n.payment_method??s.payment_method,constant_symbol:n.constant_symbol??s.constant_symbol,issued_by:s.issued_by,notes:n.notes??s.notes,issue_date:n.issue_date??s.issue_date,due_date:n.due_date??s.due_date,tax_date:n.tax_date??s.tax_date,bank_account_id:n.bank_account_id??s.bank_account_id,bank_name:n.bank_name??s.bank_name,bank_swift:n.bank_swift??s.bank_swift,bank_iban:n.bank_iban??s.bank_iban,bank_account:n.bank_account??s.bank_account})),o.length>0&&f(o.map(s=>({...s,_key:s._key||`inv-${++Z}`}))),a.due_days&&H(Number(a.due_days)),oe.current=!0,c&&F(new Date(c))}catch{try{localStorage.removeItem(g)}catch{}}},[I]),r.useEffect(()=>{U.current={form:i,items:u,dueDays:j}},[i,u,j]),r.useEffect(()=>{if(!I)return;const t=setTimeout(()=>{try{const{form:a,items:n,dueDays:o}=U.current,{bank_name:c,bank_swift:s,bank_iban:l,bank_account:h,...p}=a,m=new Date().toISOString();localStorage.setItem(g,JSON.stringify({form:p,items:n,due_days:o,savedAt:m})),F(new Date(m))}catch{}},500);return()=>clearTimeout(t)},[i,u,I]);const ce=r.useCallback(()=>{try{localStorage.removeItem(g)}catch{}F(null)},[]),J=r.useMemo(()=>R?R.toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"}):null,[R]);r.useEffect(()=>{(async()=>{try{const a=[w(`${S}/invoices.php?action=next_number`),w(`${S}/customers.php`),w(`${S}/bank-accounts.php`)];y&&a.push(w(`${S}/invoices.php?action=order_data&id=${y}`));const n=await Promise.all(a),o=n[0];if(o.ok){const l=await o.json();l.success&&K(l.data.number)}const c=n[1];if(c.ok){const l=await c.json();l.success&&re(l.data.customers)}const s=n[2];if(s.ok){const l=await s.json();if(l.success&&Array.isArray(l.data)){se(l.data);const h=l.data.find(p=>p.is_default);d(p=>{const m=p.bank_account_id,b=(m?l.data.find(_e=>String(_e.id)===String(m)):null)||h;return b?{...p,bank_account_id:b.id,bank_name:b.bank_name||"",bank_swift:b.bic||"",bank_iban:b.iban||"",bank_account:b.account_number||""}:p})}}if(y&&n[3]?.ok){const l=await n[3].json();if(l.success){const h=l.data,p=Number(h.vat_rate)||21;d(m=>({...m,customer_id:h.customer_id,customer_name:h.customer_name||"",order_id:h.id,currency:h.currency||"CZK",apply_vat:Number(h.apply_vat)||0,vat_rate:p})),h.items?.length>0&&f(h.items.map(m=>({_key:`inv-${++Z}`,description:m.description||"",quantity:Number(m.quantity)||1,unit:m.unit||"",unit_price:Number(m.unit_price)||0,vat_rate:p})))}}}catch{C.error("Chyba při načítání dat")}finally{ie(!1)}})()},[y]),r.useEffect(()=>{if(!i.issue_date)return;const t=new Date(i.issue_date);t.setDate(t.getDate()+j),d(a=>({...a,due_date:t.toISOString().split("T")[0]}))},[i.issue_date,j]);const W=r.useMemo(()=>{if(!k)return z;const t=k.toLowerCase();return z.filter(a=>(a.name||"").toLowerCase().includes(t)||(a.company_id||"").includes(k)||(a.city||"").toLowerCase().includes(t))},[z,k]);r.useEffect(()=>{const t=()=>A(!1);if(T)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[T]);const le=t=>{const a=q.find(n=>n.id===Number(t));d(a?n=>({...n,bank_account_id:a.id,bank_name:a.bank_name||"",bank_swift:a.bic||"",bank_iban:a.iban||"",bank_account:a.account_number||""}):n=>({...n,bank_account_id:"",bank_name:"",bank_swift:"",bank_iban:"",bank_account:""}))},de=t=>{d(a=>({...a,customer_id:t.id,customer_name:t.name})),v(a=>({...a,customer_id:void 0})),V(""),A(!1)},N=(t,a,n)=>{f(o=>o.map((c,s)=>s===t?{...c,[a]:n}:c))},ue=()=>f(t=>[...t,Q()]),me=t=>{u.length<=1||f(a=>a.filter((n,o)=>o!==t))},he=ge(L(ze,{activationConstraint:{distance:5}}),L(Ee,{activationConstraint:{delay:200,tolerance:5}}),L(Oe)),{handleDragEnd:pe}=Ne(f,"_key"),$=r.useMemo(()=>{let t=0;const a={};u.forEach(o=>{const c=(Number(o.quantity)||0)*(Number(o.unit_price)||0);if(t+=c,i.apply_vat){const s=Number(o.vat_rate)||0;a[s]||(a[s]=0),a[s]+=c*s/100}});const n=Object.values(a).reduce((o,c)=>o+c,0);return{subtotal:t,vatByRate:a,totalVat:n,total:t+n}},[u,i.apply_vat]),Y=async t=>{t.preventDefault();const a={};if(i.customer_id||(a.customer_id="Vyberte zákazníka"),i.issue_date||(a.issue_date="Zadejte datum"),i.tax_date||(a.tax_date="Zadejte datum"),i.bank_account_id||(a.bank_account_id="Vyberte bankovní účet"),(u.length===0||u.every(n=>!n.description.trim()))&&(a.items="Přidejte alespoň jednu položku"),v(a),!(Object.keys(a).length>0)){M(!0);try{const o=await(await w(`${S}/invoices.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...i,invoice_number:D,items:u.filter(c=>c.description.trim()).map((c,s)=>({...c,position:s}))})})).json();o.success?(ce(),C.success(o.message||"Faktura byla vytvořena"),X(`/invoices/${o.data.invoice_id}`)):C.error(o.error||"Nepodařilo se vytvořit fakturu")}catch{C.error("Chyba připojení")}finally{M(!1)}}};return te("invoices.create")?ne?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(t=>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/2"})]},t))})})]}):e.jsxs("div",{children:[e.jsxs(O.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(ve,{to:"/invoices",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsxs("div",{children:[e.jsxs("h1",{className:"admin-page-title",children:["Nová faktura ",D&&e.jsxs("span",{className:"text-tertiary",children:["(",D,")"]})]}),y?e.jsx("p",{className:"admin-page-subtitle",children:"Z objednávky"}):J&&e.jsxs("div",{className:"offers-draft-indicator",children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}),"Koncept uložen ",J]})]})]}),e.jsx("div",{className:"admin-page-actions",children:e.jsx("button",{onClick:Y,className:"admin-btn admin-btn-primary",disabled:B,children:B?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"})})]}),e.jsxs("form",{onSubmit:Y,children:[e.jsxs(O.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(_,{label:"Číslo faktury",children:e.jsx("input",{type:"text",value:D,onChange:t=>K(t.target.value),className:"admin-form-input"})}),e.jsx(_,{label:"Odběratel",error:x.customer_id,required:!0,children:i.customer_id?e.jsxs("div",{className:"offers-customer-selected",children:[e.jsx("span",{children:i.customer_name}),e.jsx("button",{type:"button",onClick:()=>d(t=>({...t,customer_id:null,customer_name:""})),className:"admin-btn-icon",title:"Odebrat zákazníka",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}):e.jsxs("div",{className:"offers-customer-select",onClick:t=>t.stopPropagation(),children:[e.jsx("input",{type:"text",value:k,onChange:t=>{V(t.target.value),A(!0)},onFocus:()=>A(!0),className:"admin-form-input",placeholder:"Hledat zákazníka (název, IČ, město)...",autoComplete:"off"}),T&&e.jsx("div",{className:"offers-customer-dropdown",children:W.length===0?e.jsx("div",{className:"offers-customer-dropdown-empty",children:"Žádní zákazníci"}):W.slice(0,10).map(t=>e.jsxs("div",{className:"offers-customer-dropdown-item",onMouseDown:()=>de(t),children:[e.jsx("div",{children:t.name}),(t.company_id||t.city)&&e.jsxs("div",{children:[t.company_id&&`IČ: ${t.company_id}`,t.city&&` · ${t.city}`]})]},t.id))})]})}),e.jsx(_,{label:"Vystavil",children:e.jsx("input",{type:"text",value:i.issued_by,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(_,{label:"Datum vystavení",error:x.issue_date,required:!0,children:e.jsx(G,{mode:"date",value:i.issue_date,onChange:t=>{d(a=>({...a,issue_date:t})),v(a=>({...a,issue_date:void 0}))}})}),e.jsxs(_,{label:"Splatnost (dny)",children:[e.jsx("select",{value:j,onChange:t=>H(Number(t.target.value)),className:"admin-form-select",children:Array.from({length:60},(t,a)=>a+1).map(t=>e.jsx("option",{value:t,children:t},t))}),i.due_date&&e.jsxs("span",{className:"text-tertiary",style:{fontSize:"0.75rem",marginTop:"0.25rem"},children:["Splatnost: ",new Date(i.due_date).toLocaleDateString("cs-CZ")]})]}),e.jsx(_,{label:"DÚZP",error:x.tax_date,required:!0,children:e.jsx(G,{mode:"date",value:i.tax_date,onChange:t=>{d(a=>({...a,tax_date:t})),v(a=>({...a,tax_date:void 0}))}})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(_,{label:"Forma úhrady",children:e.jsxs("select",{value:i.payment_method,onChange:t=>d(a=>({...a,payment_method:t.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"Příkazem",children:"Příkazem"}),e.jsx("option",{value:"Hotově",children:"Hotově"}),e.jsx("option",{value:"Dobírka",children:"Dobírka"})]})}),e.jsx(_,{label:"Měna",children:e.jsxs("select",{value:i.currency,onChange:t=>d(a=>({...a,currency:t.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"CZK",children:"CZK (Kč)"}),e.jsx("option",{value:"EUR",children:"EUR (€)"}),e.jsx("option",{value:"USD",children:"USD ($)"})]})}),e.jsx(_,{label:"DPH",children:e.jsx("div",{className:"flex-row-gap",children:e.jsxs("label",{className:"admin-form-checkbox",style:{whiteSpace:"nowrap"},children:[e.jsx("input",{type:"checkbox",checked:!!i.apply_vat,onChange:t=>d(a=>({...a,apply_vat:t.target.checked?1:0}))}),e.jsx("span",{children:"Uplatnit DPH"})]})})})]}),e.jsx(_,{label:"Bankovní účet",error:x.bank_account_id,required:!0,children:e.jsxs("select",{value:i.bank_account_id,onChange:t=>{le(t.target.value),v(a=>({...a,bank_account_id:void 0}))},className:"admin-form-select",children:[e.jsx("option",{value:"",children:"— Vyberte účet —"}),q.map(t=>e.jsxs("option",{value:t.id,children:[t.account_name,t.account_number?` (${t.account_number})`:"",t.is_default?" ★":""]},t.id))]})})]})]}),e.jsxs(O.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),x.items&&e.jsx("span",{className:"admin-form-error",children:x.items})]}),e.jsx("button",{type:"button",onClick:ue,className:"admin-btn admin-btn-primary admin-btn-sm",children:"+ Přidat položku"})]}),e.jsx("div",{className:"offers-items-table",children:e.jsx(we,{sensors:he,collisionDetection:Ce,modifiers:[Se],onDragEnd:pe,children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2rem"}}),e.jsx("th",{style:{width:"2rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jedn. cena"}),i.apply_vat?e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"DPH"}):null,e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Celkem"}),e.jsx("th",{style:{width:"2.5rem"}})]})}),e.jsx(De,{items:u.map(t=>String(t._key)),strategy:Ae,children:e.jsx("tbody",{children:u.map((t,a)=>{const n=(Number(t.quantity)||0)*(Number(t.unit_price)||0);return e.jsx(Ie,{id:String(t._key),children:({attributes:o,listeners:c})=>e.jsxs(e.Fragment,{children:[e.jsx("td",{style:{width:"2rem"},children:e.jsx(Pe,{listeners:c,attributes:o})}),e.jsx("td",{className:"text-tertiary text-center fw-500",children:a+1}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.description,onChange:s=>N(a,"description",s.target.value),className:"admin-form-input fw-500",placeholder:"Popis položky..."})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.quantity,onChange:s=>N(a,"quantity",s.target.value),className:"admin-form-input",min:"0",step:"any",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.unit,onChange:s=>N(a,"unit",s.target.value),className:"admin-form-input",placeholder:"ks",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.unit_price,onChange:s=>N(a,"unit_price",s.target.value),className:"admin-form-input",step:"any",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),i.apply_vat?e.jsx("td",{children:e.jsx("select",{value:t.vat_rate,onChange:s=>N(a,"vat_rate",Number(s.target.value)),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},children:Re.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))})}):null,e.jsx("td",{style:{textAlign:"right",fontWeight:600,whiteSpace:"nowrap"},children:P(n,i.currency)}),e.jsx("td",{children:u.length>1&&e.jsx("button",{type:"button",onClick:()=>me(a),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})]})},t._key)})})})]})})}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:P($.subtotal,i.currency)})]}),i.apply_vat&&Object.entries($.vatByRate).map(([t,a])=>e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH ",t,"%:"]}),e.jsx("span",{children:P(a,i.currency)})]},t)),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:P($.total,i.currency)})]})]})]}),e.jsxs(O.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:[e.jsx("h3",{className:"admin-card-title",children:"Veřejné poznámky na faktuře"}),e.jsx(r.Suspense,{fallback:e.jsx("div",{className:"admin-form-input",style:{minHeight:120}}),children:e.jsx(Te,{value:i.notes,onChange:t=>d(a=>({...a,notes:t})),placeholder:"Poznámky zobrazené na faktuře...",minHeight:"120px"})})]})]})]}):e.jsx(ke,{})}export{Me as default}; diff --git a/dist/assets/InvoiceDetail-DaTiJC_4.js b/dist/assets/InvoiceDetail-CeYg6TWO.js similarity index 99% rename from dist/assets/InvoiceDetail-DaTiJC_4.js rename to dist/assets/InvoiceDetail-CeYg6TWO.js index 47ed111..7003d0a 100644 --- a/dist/assets/InvoiceDetail-DaTiJC_4.js +++ b/dist/assets/InvoiceDetail-CeYg6TWO.js @@ -1,2 +1,2 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RichEditor-Bfur5pi6.js","assets/vendor-animation-0s3FMHwK.js","assets/vendor-react-BVs3cwbi.js","assets/RichEditor-7oN3-GhD.css"])))=>i.map(i=>d[i]); -import{a as re,u as le,F as d,e as w,g as f,C as U,c as x,_ as de}from"./index-BrM8fzBu.js";import{j as e,m as y,A as oe}from"./vendor-animation-0s3FMHwK.js";import{h as ce,g as me,r as i,L as B}from"./vendor-react-BVs3cwbi.js";import{F as he}from"./Forbidden-D25jV3Oq.js";import{a9 as ue}from"./vendor-utils-Dyr8OjFr.js";const pe=i.lazy(()=>de(()=>import("./RichEditor-Bfur5pi6.js"),__vite__mapDeps([0,1,2,3]))),j="/api/admin",W={issued:"Vystavena",paid:"Zaplacena",overdue:"Po splatnosti"},xe={issued:"admin-badge-invoice-issued",paid:"admin-badge-invoice-paid",overdue:"admin-badge-invoice-overdue"},Z={paid:"Zaplaceno"},ye={paid:"admin-btn admin-btn-primary"},je=[{value:21,label:"21%"},{value:12,label:"12%"},{value:0,label:"0%"}];function ke(){const{id:c}=ce(),r=re(),{hasPermission:h}=le(),_=me(),[q,H]=i.useState(!0),[a,J]=i.useState(null),[o,I]=i.useState(""),[b,g]=i.useState(!1),[$,D]=i.useState(null),[u,C]=i.useState({show:!1,status:null}),[F,O]=i.useState(!1),[K,S]=i.useState(!1),[G,A]=i.useState(!1),[Q,L]=i.useState(!1),[M,P]=i.useState(!1),[N,k]=i.useState([]),R=i.useRef(0),z=async()=>{try{const t=await x(`${j}/invoices.php?action=detail&id=${c}`);if(t.status===401)return;const s=await t.json();s.success?(J(s.data),I(s.data.notes||"")):(r.error(s.error||"Nepodařilo se načíst fakturu"),_("/invoices"))}catch{r.error("Chyba připojení"),_("/invoices")}finally{H(!1)}};i.useEffect(()=>{z()},[c]);const T=i.useMemo(()=>{if(!a?.items)return{subtotal:0,vatByRate:{},totalVat:0,total:0};let t=0;const s={};a.items.forEach(l=>{const m=(Number(l.quantity)||0)*(Number(l.unit_price)||0);if(t+=m,Number(a.apply_vat)){const p=Number(l.vat_rate)||0;s[p]||(s[p]=0),s[p]+=m*p/100}});const n=Object.values(s).reduce((l,m)=>l+m,0);return{subtotal:t,vatByRate:s,totalVat:n,total:t+n}},[a]);if(!h("invoices.view"))return e.jsx(he,{});const X=async()=>{if(u.status){D(u.status),C({show:!1,status:null});try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:u.status})})).json();s.success?(r.success(s.message||"Stav byl změněn"),z()):r.error(s.error||"Nepodařilo se změnit stav")}catch{r.error("Chyba připojení")}finally{D(null)}}},Y=async()=>{g(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:o})})).json();s.success?r.success("Poznámky byly uloženy"):r.error(s.error||"Nepodařilo se uložit poznámky")}catch{r.error("Chyba připojení")}finally{g(!1)}},V=async(t="cs")=>{S(!1);const s=window.open("","_blank");O(!0);try{const n=await x(`${j}/invoices-pdf.php?id=${c}&lang=${encodeURIComponent(t)}`);if(!n.ok){s.close(),r.error("Nepodařilo se vygenerovat PDF");return}const l=await n.text();s.document.open(),s.document.write(l),s.document.close(),s.onload=()=>s.print()}catch{s.close(),r.error("Chyba připojení")}finally{O(!1)}},ee=()=>{k(a.items.map(t=>({_key:`ei-${++R.current}`,description:t.description||"",quantity:Number(t.quantity)||1,unit:t.unit||"",unit_price:Number(t.unit_price)||0,vat_rate:Number(t.vat_rate)||21}))),P(!0)},v=(t,s,n)=>{k(l=>l.map((m,p)=>p===t?{...m,[s]:n}:m))},te=()=>{k(t=>[...t,{_key:`ei-${++R.current}`,description:"",quantity:1,unit:"ks",unit_price:0,vat_rate:21}])},se=t=>{N.length<=1||k(s=>s.filter((n,l)=>l!==t))},ae=async()=>{g(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:N.filter(n=>n.description.trim()).map((n,l)=>({...n,position:l}))})})).json();s.success?(r.success("Položky byly uloženy"),P(!1),z()):r.error(s.error||"Nepodařilo se uložit položky")}catch{r.error("Chyba připojení")}finally{g(!1)}},ne=async()=>{L(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"DELETE"})).json();s.success?(r.success(s.message||"Faktura byla smazána"),_("/invoices")):r.error(s.error||"Nepodařilo se smazat fakturu")}catch{r.error("Chyba připojení")}finally{L(!1),A(!1)}};if(q)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row gap-2",children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(t=>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/2"})]},t))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(t=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-full"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-3/4"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-1/2"})})]},t))})})]});if(!a)return null;const ie=a.status==="issued",E=a.status==="paid";return e.jsxs("div",{children:[e.jsxs(y.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(B,{to:"/invoices",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsx("div",{children:e.jsxs("h1",{className:"admin-page-title flex-row-gap",children:["Faktura ",a.invoice_number,e.jsx("span",{className:`admin-badge ${xe[a.status]||""}`,children:W[a.status]||a.status})]})})]}),e.jsxs("div",{className:"admin-page-actions",children:[h("invoices.export")&&e.jsx("button",{onClick:()=>S(!0),className:"admin-btn admin-btn-secondary",disabled:F,children:F?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"PDF..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"PDF"]})}),h("invoices.edit")&&a.valid_transitions?.length>0&&a.valid_transitions.map(t=>e.jsx("button",{onClick:()=>C({show:!0,status:t}),className:ye[t]||"admin-btn admin-btn-secondary",disabled:$===t,children:$===t?e.jsx("div",{className:"admin-spinner",style:{width:14,height:14,borderWidth:2}}):Z[t]||t},t)),h("invoices.delete")&&e.jsx("button",{onClick:()=>A(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("h3",{className:"admin-card-title",children:"Informace"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3 mb-2",children:[e.jsxs(d,{label:"Zákazník",children:[e.jsx("div",{className:"fw-500",children:a.customer_name||"—"}),a.customer&&e.jsxs("div",{className:"text-tertiary",style:{fontSize:"0.8rem",marginTop:"0.2rem"},children:[a.customer.company_id&&`IČ: ${a.customer.company_id}`,a.customer.vat_id&&` · DIČ: ${a.customer.vat_id}`]})]}),e.jsx(d,{label:"Objednávka",children:e.jsx("div",{children:a.order_id?e.jsx(B,{to:`/orders/${a.order_id}`,className:"link-accent",children:a.order_number}):"—"})}),e.jsx(d,{label:"Měna",children:e.jsx("div",{children:a.currency})})]}),e.jsxs("div",{className:"offers-form-row-3 mb-2",children:[e.jsx(d,{label:"Datum vystavení",children:e.jsx("div",{children:w(a.issue_date)})}),e.jsx(d,{label:"Datum splatnosti",children:e.jsx("div",{className:a.status==="overdue"?"text-danger fw-600":"",children:w(a.due_date)})}),e.jsx(d,{label:"DÚZP",children:e.jsx("div",{children:w(a.tax_date)})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(d,{label:"Forma úhrady",children:e.jsx("div",{children:a.payment_method})}),e.jsx(d,{label:"Variabilní symbol",children:e.jsx("div",{children:a.invoice_number})}),e.jsx(d,{label:"Vystavil",children:e.jsx("div",{children:a.issued_by||"—"})})]}),a.paid_date&&e.jsx("div",{className:"admin-form-row mt-2",children:e.jsx(d,{label:"Datum úhrady",children:e.jsx("div",{style:{color:"var(--success)",fontWeight:500},children:w(a.paid_date)})})})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),ie&&h("invoices.edit")&&(M?e.jsxs("div",{className:"flex-row gap-2",children:[e.jsx("button",{type:"button",onClick:te,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"+ Přidat položku"}),e.jsx("button",{onClick:ae,className:"admin-btn admin-btn-primary admin-btn-sm",disabled:b,children:b?"Ukládání...":"Uložit položky"}),e.jsx("button",{onClick:()=>P(!1),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Zrušit"})]}):e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Upravit položky"}))]}),M?e.jsx(e.Fragment,{children:e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"%DPH"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"}})]})}),e.jsx("tbody",{children:N.map((t,s)=>e.jsxs("tr",{children:[e.jsx("td",{className:"text-tertiary",style:{textAlign:"center",fontWeight:500},children:s+1}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.description,onChange:n=>v(s,"description",n.target.value),className:"admin-form-input fw-500",placeholder:"Popis položky..."})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.quantity,onChange:n=>v(s,"quantity",n.target.value),className:"admin-form-input",min:"0",step:"any",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.unit,onChange:n=>v(s,"unit",n.target.value),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.unit_price,onChange:n=>v(s,"unit_price",n.target.value),className:"admin-form-input",step:"any",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:Number(a.apply_vat)?e.jsx("select",{value:t.vat_rate,onChange:n=>v(s,"vat_rate",Number(n.target.value)),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},children:je.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))}):e.jsx("span",{className:"text-tertiary",style:{display:"block",textAlign:"center"},children:"0%"})}),e.jsx("td",{children:e.jsx("div",{style:{display:"flex",gap:"0.125rem",justifyContent:"center"},children:N.length>1&&e.jsx("button",{type:"button",onClick:()=>se(s),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})})]},t._key))})]})})}):e.jsx(e.Fragment,{children:a.items?.length>0?e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"4rem",textAlign:"center"},children:"%DPH"}),e.jsx("th",{style:{width:"9rem",textAlign:"right"},children:"Celkem"})]})}),e.jsx("tbody",{children:a.items.map((t,s)=>{const n=(Number(t.quantity)||0)*(Number(t.unit_price)||0),l=Number(a.apply_vat)?n*(Number(t.vat_rate)||0)/100:0;return e.jsxs("tr",{children:[e.jsx("td",{className:"text-tertiary",style:{textAlign:"center",fontWeight:500},children:s+1}),e.jsx("td",{className:"fw-500",children:t.description||"—"}),e.jsxs("td",{style:{textAlign:"center"},children:[t.quantity," ",t.unit&&e.jsx("span",{className:"text-tertiary",children:t.unit})]}),e.jsx("td",{style:{textAlign:"center"},children:t.unit||"—"}),e.jsx("td",{className:"admin-mono text-right",children:f(t.unit_price,a.currency)}),e.jsxs("td",{style:{textAlign:"center"},children:[Number(a.apply_vat)?Number(t.vat_rate):0,"%"]}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",fontWeight:600},children:f(n+l,a.currency)})]},t.id||s)})})]})}):e.jsx("p",{className:"text-tertiary",children:"Žádné položky."})}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:f(T.subtotal,a.currency)})]}),Number(a.apply_vat)>0&&Object.entries(T.vatByRate).map(([t,s])=>e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH ",t,"%:"]}),e.jsx("span",{children:f(s,a.currency)})]},t)),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:f(T.total,a.currency)})]})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[e.jsx("h3",{className:"admin-card-title",children:"Veřejné poznámky na faktuře"}),E&&o&&o.trim()&&o!=="


"&&e.jsx("div",{className:"ql-editor",style:{padding:0,minHeight:"auto"},dangerouslySetInnerHTML:{__html:ue.sanitize(o)}}),E&&(!o||!o.trim()||o==="


")&&e.jsx("p",{className:"text-tertiary",children:"Žádné poznámky."}),!E&&e.jsxs(e.Fragment,{children:[e.jsx(i.Suspense,{fallback:e.jsx("div",{className:"admin-form-input",style:{minHeight:120}}),children:e.jsx(pe,{value:o,onChange:t=>I(t),placeholder:"Poznámky zobrazené na faktuře...",minHeight:"120px"})}),h("invoices.edit")&&e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:Y,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:b,children:b?"Ukládání...":"Uložit poznámky"})})]})]}),e.jsx(U,{isOpen:u.show,onClose:()=>C({show:!1,status:null}),onConfirm:X,title:"Změnit stav faktury",message:`Opravdu chcete změnit stav faktury "${a.invoice_number}" na "${W[u.status]}"?`,confirmText:Z[u.status]||"Potvrdit",cancelText:"Zrušit",type:"default"}),e.jsx(U,{isOpen:G,onClose:()=>A(!1),onConfirm:ne,title:"Smazat fakturu",message:`Opravdu chcete smazat fakturu "${a.invoice_number}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:Q}),e.jsx(oe,{children:K&&e.jsxs(y.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:()=>S(!1)}),e.jsxs(y.div,{className:"admin-modal admin-confirm-modal",role:"dialog","aria-modal":"true",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-body admin-confirm-content",children:[e.jsx("div",{className:"admin-confirm-icon admin-confirm-icon-info",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"}),e.jsx("path",{d:"M2 12h20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}),e.jsx("h2",{className:"admin-confirm-title",children:"Jazyk faktury"}),e.jsx("p",{className:"admin-confirm-message",children:"V jakém jazyce chcete vygenerovat fakturu?"})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>V("cs"),className:"admin-btn admin-btn-primary",children:"Čeština"}),e.jsx("button",{type:"button",onClick:()=>V("en"),className:"admin-btn admin-btn-primary",children:"English"})]})]})]})})]})}export{ke as default}; +import{a as re,u as le,F as d,e as w,g as f,C as U,c as x,_ as de}from"./index-Bay45BGf.js";import{j as e,m as y,A as oe}from"./vendor-animation-0s3FMHwK.js";import{h as ce,g as me,r as i,L as B}from"./vendor-react-BVs3cwbi.js";import{F as he}from"./Forbidden-D25jV3Oq.js";import{a9 as ue}from"./vendor-utils-Dyr8OjFr.js";const pe=i.lazy(()=>de(()=>import("./RichEditor-Bfur5pi6.js"),__vite__mapDeps([0,1,2,3]))),j="/api/admin",W={issued:"Vystavena",paid:"Zaplacena",overdue:"Po splatnosti"},xe={issued:"admin-badge-invoice-issued",paid:"admin-badge-invoice-paid",overdue:"admin-badge-invoice-overdue"},Z={paid:"Zaplaceno"},ye={paid:"admin-btn admin-btn-primary"},je=[{value:21,label:"21%"},{value:12,label:"12%"},{value:0,label:"0%"}];function ke(){const{id:c}=ce(),r=re(),{hasPermission:h}=le(),_=me(),[q,H]=i.useState(!0),[a,J]=i.useState(null),[o,I]=i.useState(""),[b,g]=i.useState(!1),[$,D]=i.useState(null),[u,C]=i.useState({show:!1,status:null}),[F,O]=i.useState(!1),[K,S]=i.useState(!1),[G,A]=i.useState(!1),[Q,L]=i.useState(!1),[M,P]=i.useState(!1),[N,k]=i.useState([]),R=i.useRef(0),z=async()=>{try{const t=await x(`${j}/invoices.php?action=detail&id=${c}`);if(t.status===401)return;const s=await t.json();s.success?(J(s.data),I(s.data.notes||"")):(r.error(s.error||"Nepodařilo se načíst fakturu"),_("/invoices"))}catch{r.error("Chyba připojení"),_("/invoices")}finally{H(!1)}};i.useEffect(()=>{z()},[c]);const T=i.useMemo(()=>{if(!a?.items)return{subtotal:0,vatByRate:{},totalVat:0,total:0};let t=0;const s={};a.items.forEach(l=>{const m=(Number(l.quantity)||0)*(Number(l.unit_price)||0);if(t+=m,Number(a.apply_vat)){const p=Number(l.vat_rate)||0;s[p]||(s[p]=0),s[p]+=m*p/100}});const n=Object.values(s).reduce((l,m)=>l+m,0);return{subtotal:t,vatByRate:s,totalVat:n,total:t+n}},[a]);if(!h("invoices.view"))return e.jsx(he,{});const X=async()=>{if(u.status){D(u.status),C({show:!1,status:null});try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:u.status})})).json();s.success?(r.success(s.message||"Stav byl změněn"),z()):r.error(s.error||"Nepodařilo se změnit stav")}catch{r.error("Chyba připojení")}finally{D(null)}}},Y=async()=>{g(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:o})})).json();s.success?r.success("Poznámky byly uloženy"):r.error(s.error||"Nepodařilo se uložit poznámky")}catch{r.error("Chyba připojení")}finally{g(!1)}},V=async(t="cs")=>{S(!1);const s=window.open("","_blank");O(!0);try{const n=await x(`${j}/invoices-pdf.php?id=${c}&lang=${encodeURIComponent(t)}`);if(!n.ok){s.close(),r.error("Nepodařilo se vygenerovat PDF");return}const l=await n.text();s.document.open(),s.document.write(l),s.document.close(),s.onload=()=>s.print()}catch{s.close(),r.error("Chyba připojení")}finally{O(!1)}},ee=()=>{k(a.items.map(t=>({_key:`ei-${++R.current}`,description:t.description||"",quantity:Number(t.quantity)||1,unit:t.unit||"",unit_price:Number(t.unit_price)||0,vat_rate:Number(t.vat_rate)||21}))),P(!0)},v=(t,s,n)=>{k(l=>l.map((m,p)=>p===t?{...m,[s]:n}:m))},te=()=>{k(t=>[...t,{_key:`ei-${++R.current}`,description:"",quantity:1,unit:"ks",unit_price:0,vat_rate:21}])},se=t=>{N.length<=1||k(s=>s.filter((n,l)=>l!==t))},ae=async()=>{g(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:N.filter(n=>n.description.trim()).map((n,l)=>({...n,position:l}))})})).json();s.success?(r.success("Položky byly uloženy"),P(!1),z()):r.error(s.error||"Nepodařilo se uložit položky")}catch{r.error("Chyba připojení")}finally{g(!1)}},ne=async()=>{L(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"DELETE"})).json();s.success?(r.success(s.message||"Faktura byla smazána"),_("/invoices")):r.error(s.error||"Nepodařilo se smazat fakturu")}catch{r.error("Chyba připojení")}finally{L(!1),A(!1)}};if(q)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row gap-2",children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(t=>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/2"})]},t))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(t=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-full"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-3/4"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-1/2"})})]},t))})})]});if(!a)return null;const ie=a.status==="issued",E=a.status==="paid";return e.jsxs("div",{children:[e.jsxs(y.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(B,{to:"/invoices",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsx("div",{children:e.jsxs("h1",{className:"admin-page-title flex-row-gap",children:["Faktura ",a.invoice_number,e.jsx("span",{className:`admin-badge ${xe[a.status]||""}`,children:W[a.status]||a.status})]})})]}),e.jsxs("div",{className:"admin-page-actions",children:[h("invoices.export")&&e.jsx("button",{onClick:()=>S(!0),className:"admin-btn admin-btn-secondary",disabled:F,children:F?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"PDF..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"PDF"]})}),h("invoices.edit")&&a.valid_transitions?.length>0&&a.valid_transitions.map(t=>e.jsx("button",{onClick:()=>C({show:!0,status:t}),className:ye[t]||"admin-btn admin-btn-secondary",disabled:$===t,children:$===t?e.jsx("div",{className:"admin-spinner",style:{width:14,height:14,borderWidth:2}}):Z[t]||t},t)),h("invoices.delete")&&e.jsx("button",{onClick:()=>A(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("h3",{className:"admin-card-title",children:"Informace"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3 mb-2",children:[e.jsxs(d,{label:"Zákazník",children:[e.jsx("div",{className:"fw-500",children:a.customer_name||"—"}),a.customer&&e.jsxs("div",{className:"text-tertiary",style:{fontSize:"0.8rem",marginTop:"0.2rem"},children:[a.customer.company_id&&`IČ: ${a.customer.company_id}`,a.customer.vat_id&&` · DIČ: ${a.customer.vat_id}`]})]}),e.jsx(d,{label:"Objednávka",children:e.jsx("div",{children:a.order_id?e.jsx(B,{to:`/orders/${a.order_id}`,className:"link-accent",children:a.order_number}):"—"})}),e.jsx(d,{label:"Měna",children:e.jsx("div",{children:a.currency})})]}),e.jsxs("div",{className:"offers-form-row-3 mb-2",children:[e.jsx(d,{label:"Datum vystavení",children:e.jsx("div",{children:w(a.issue_date)})}),e.jsx(d,{label:"Datum splatnosti",children:e.jsx("div",{className:a.status==="overdue"?"text-danger fw-600":"",children:w(a.due_date)})}),e.jsx(d,{label:"DÚZP",children:e.jsx("div",{children:w(a.tax_date)})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(d,{label:"Forma úhrady",children:e.jsx("div",{children:a.payment_method})}),e.jsx(d,{label:"Variabilní symbol",children:e.jsx("div",{children:a.invoice_number})}),e.jsx(d,{label:"Vystavil",children:e.jsx("div",{children:a.issued_by||"—"})})]}),a.paid_date&&e.jsx("div",{className:"admin-form-row mt-2",children:e.jsx(d,{label:"Datum úhrady",children:e.jsx("div",{style:{color:"var(--success)",fontWeight:500},children:w(a.paid_date)})})})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),ie&&h("invoices.edit")&&(M?e.jsxs("div",{className:"flex-row gap-2",children:[e.jsx("button",{type:"button",onClick:te,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"+ Přidat položku"}),e.jsx("button",{onClick:ae,className:"admin-btn admin-btn-primary admin-btn-sm",disabled:b,children:b?"Ukládání...":"Uložit položky"}),e.jsx("button",{onClick:()=>P(!1),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Zrušit"})]}):e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Upravit položky"}))]}),M?e.jsx(e.Fragment,{children:e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"%DPH"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"}})]})}),e.jsx("tbody",{children:N.map((t,s)=>e.jsxs("tr",{children:[e.jsx("td",{className:"text-tertiary",style:{textAlign:"center",fontWeight:500},children:s+1}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.description,onChange:n=>v(s,"description",n.target.value),className:"admin-form-input fw-500",placeholder:"Popis položky..."})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.quantity,onChange:n=>v(s,"quantity",n.target.value),className:"admin-form-input",min:"0",step:"any",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.unit,onChange:n=>v(s,"unit",n.target.value),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.unit_price,onChange:n=>v(s,"unit_price",n.target.value),className:"admin-form-input",step:"any",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:Number(a.apply_vat)?e.jsx("select",{value:t.vat_rate,onChange:n=>v(s,"vat_rate",Number(n.target.value)),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},children:je.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))}):e.jsx("span",{className:"text-tertiary",style:{display:"block",textAlign:"center"},children:"0%"})}),e.jsx("td",{children:e.jsx("div",{style:{display:"flex",gap:"0.125rem",justifyContent:"center"},children:N.length>1&&e.jsx("button",{type:"button",onClick:()=>se(s),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})})]},t._key))})]})})}):e.jsx(e.Fragment,{children:a.items?.length>0?e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"4rem",textAlign:"center"},children:"%DPH"}),e.jsx("th",{style:{width:"9rem",textAlign:"right"},children:"Celkem"})]})}),e.jsx("tbody",{children:a.items.map((t,s)=>{const n=(Number(t.quantity)||0)*(Number(t.unit_price)||0),l=Number(a.apply_vat)?n*(Number(t.vat_rate)||0)/100:0;return e.jsxs("tr",{children:[e.jsx("td",{className:"text-tertiary",style:{textAlign:"center",fontWeight:500},children:s+1}),e.jsx("td",{className:"fw-500",children:t.description||"—"}),e.jsxs("td",{style:{textAlign:"center"},children:[t.quantity," ",t.unit&&e.jsx("span",{className:"text-tertiary",children:t.unit})]}),e.jsx("td",{style:{textAlign:"center"},children:t.unit||"—"}),e.jsx("td",{className:"admin-mono text-right",children:f(t.unit_price,a.currency)}),e.jsxs("td",{style:{textAlign:"center"},children:[Number(a.apply_vat)?Number(t.vat_rate):0,"%"]}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",fontWeight:600},children:f(n+l,a.currency)})]},t.id||s)})})]})}):e.jsx("p",{className:"text-tertiary",children:"Žádné položky."})}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:f(T.subtotal,a.currency)})]}),Number(a.apply_vat)>0&&Object.entries(T.vatByRate).map(([t,s])=>e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH ",t,"%:"]}),e.jsx("span",{children:f(s,a.currency)})]},t)),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:f(T.total,a.currency)})]})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[e.jsx("h3",{className:"admin-card-title",children:"Veřejné poznámky na faktuře"}),E&&o&&o.trim()&&o!=="


"&&e.jsx("div",{className:"ql-editor",style:{padding:0,minHeight:"auto"},dangerouslySetInnerHTML:{__html:ue.sanitize(o)}}),E&&(!o||!o.trim()||o==="


")&&e.jsx("p",{className:"text-tertiary",children:"Žádné poznámky."}),!E&&e.jsxs(e.Fragment,{children:[e.jsx(i.Suspense,{fallback:e.jsx("div",{className:"admin-form-input",style:{minHeight:120}}),children:e.jsx(pe,{value:o,onChange:t=>I(t),placeholder:"Poznámky zobrazené na faktuře...",minHeight:"120px"})}),h("invoices.edit")&&e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:Y,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:b,children:b?"Ukládání...":"Uložit poznámky"})})]})]}),e.jsx(U,{isOpen:u.show,onClose:()=>C({show:!1,status:null}),onConfirm:X,title:"Změnit stav faktury",message:`Opravdu chcete změnit stav faktury "${a.invoice_number}" na "${W[u.status]}"?`,confirmText:Z[u.status]||"Potvrdit",cancelText:"Zrušit",type:"default"}),e.jsx(U,{isOpen:G,onClose:()=>A(!1),onConfirm:ne,title:"Smazat fakturu",message:`Opravdu chcete smazat fakturu "${a.invoice_number}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:Q}),e.jsx(oe,{children:K&&e.jsxs(y.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:()=>S(!1)}),e.jsxs(y.div,{className:"admin-modal admin-confirm-modal",role:"dialog","aria-modal":"true",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-body admin-confirm-content",children:[e.jsx("div",{className:"admin-confirm-icon admin-confirm-icon-info",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"}),e.jsx("path",{d:"M2 12h20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}),e.jsx("h2",{className:"admin-confirm-title",children:"Jazyk faktury"}),e.jsx("p",{className:"admin-confirm-message",children:"V jakém jazyce chcete vygenerovat fakturu?"})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>V("cs"),className:"admin-btn admin-btn-primary",children:"Čeština"}),e.jsx("button",{type:"button",onClick:()=>V("en"),className:"admin-btn admin-btn-primary",children:"English"})]})]})]})})]})}export{ke as default}; diff --git a/dist/assets/Invoices-CbhjIEZE.js b/dist/assets/Invoices-BeRSP7xa.js similarity index 98% rename from dist/assets/Invoices-CbhjIEZE.js rename to dist/assets/Invoices-BeRSP7xa.js index 0eb394c..e2bd0be 100644 --- a/dist/assets/Invoices-CbhjIEZE.js +++ b/dist/assets/Invoices-BeRSP7xa.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ReceivedInvoices-CGzp45kv.js","assets/vendor-animation-0s3FMHwK.js","assets/vendor-react-BVs3cwbi.js","assets/index-BrM8fzBu.js","assets/vendor-utils-Dyr8OjFr.js","assets/index-S7b0Xjr1.css","assets/useListData-Bz9Xh_CU.js"])))=>i.map(i=>d[i]); -import{a as Ne,u as be,c as C,d as Q,e as _,g as O,C as we,_ as Se}from"./index-BrM8fzBu.js";import{j as e,m,A as X}from"./vendor-animation-0s3FMHwK.js";import{r as a,L as z}from"./vendor-react-BVs3cwbi.js";import{F as Ce}from"./Forbidden-D25jV3Oq.js";import{u as _e,a as ze,S as B}from"./useListData-Bz9Xh_CU.js";import{P as Be}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const Pe=a.lazy(()=>Se(()=>import("./ReceivedInvoices-CGzp45kv.js"),__vite__mapDeps([0,1,2,3,4,5,6]))),P="/api/admin",ee="boha_invoice_draft",V=["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"];function se(t){return!t||t.length===0?"0 Kč":t.map(o=>O(o.amount,o.currency)).join(" · ")}function D(t,o){return!t||t.length===0?{value:"0 Kč",detail:null}:t.some(v=>v.currency!=="CZK")&&o!==null&&o!==void 0?{value:O(o,"CZK"),detail:se(t)}:{value:se(t),detail:null}}const ae={issued:"Vystavena",paid:"Zaplacena",overdue:"Po splatnosti"},te={issued:"admin-badge-invoice-issued",paid:"admin-badge-invoice-paid",overdue:"admin-badge-invoice-overdue"},De=[{value:"",label:"Vše"},{value:"issued",label:"Vystavené"},{value:"paid",label:"Zaplacené"},{value:"overdue",label:"Po splatnosti"}];function Ee(){const t=Ne(),{hasPermission:o}=be(),[h,v]=a.useState("issued"),[ie,I]=a.useState(!1),{sort:ne,order:u,handleSort:j,activeSort:y}=_e("invoice_number"),[M,oe]=a.useState(""),[le,$]=a.useState(1),[x,re]=a.useState(""),f=new Date,[d,g]=a.useState(f.getMonth()+1),[p,R]=a.useState(f.getFullYear()),[n,de]=a.useState(null),[ce,H]=a.useState(!0),K=a.useRef(!1),k=a.useRef(0),[me,he]=a.useState(0),U=d===f.getMonth()+1&&p===f.getFullYear(),ue=`${V[d-1]} ${p}`,N=a.useCallback(async()=>{H(!0);try{const i=await(await C(`${P}/invoices.php?action=stats&month=${d}&year=${p}`)).json();i.success&&(de(i.data),K.current=!0,he(l=>l+1))}catch{}finally{H(!1)}},[d,p]);a.useEffect(()=>{N()},[N]);const xe=()=>{k.current=-1,d===1?(g(12),R(s=>s-1)):g(s=>s-1)},pe=()=>{U||(k.current=1,d===12?(g(1),R(s=>s+1)):g(s=>s+1))},[b,A]=a.useState({show:!1,invoice:null}),[ve,Z]=a.useState(!1),[L,Y]=a.useState(null),[F,T]=a.useState(null),[c,J]=a.useState(null);a.useEffect(()=>{try{const s=localStorage.getItem(ee);if(!s)return;const i=JSON.parse(s);i&&i.form&&Array.isArray(i.items)&&J(i)}catch{}},[]);const je=()=>{try{localStorage.removeItem(ee)}catch{}J(null)},{items:w,loading:ye,pagination:W,refetch:q}=ze("invoices.php",{dataKey:"invoices",search:M,sort:ne,order:u,page:le,extraParams:x?{status:x}:{},errorMsg:"Nepodařilo se načíst faktury"});if(!o("invoices.view"))return e.jsx(Ce,{});const fe=async()=>{if(b.invoice){Z(!0);try{const i=await(await C(`${P}/invoices.php?id=${b.invoice.id}`,{method:"DELETE"})).json();i.success?(A({show:!1,invoice:null}),t.success(i.message||"Faktura byla smazána"),q(),N()):t.error(i.error||"Nepodařilo se smazat fakturu")}catch{t.error("Chyba připojení")}finally{Z(!1)}}},ge=async s=>{if(s.status!=="paid")try{const l=await(await C(`${P}/invoices.php?id=${s.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:"paid"})})).json();l.success?(t.success("Faktura označena jako zaplacená"),q(),N()):t.error(l.error||"Nepodařilo se změnit stav")}catch{t.error("Chyba připojení")}},G=async(s,i="cs")=>{if(!L){T(null),Y(s.id);try{const l=await C(`${P}/invoices-pdf.php?id=${s.id}&lang=${encodeURIComponent(i)}`);if(l.status===401)return;if(!l.ok){t.error("Nepodařilo se vygenerovat PDF");return}const S=await l.text(),r=window.open("","_blank");r?(r.document.open(),r.document.write(S),r.document.close(),r.onload=()=>r.print()):t.error("Prohlížeč zablokoval vyskakovací okno")}catch{t.error("Chyba při generování PDF")}finally{Y(null)}}};return ye?e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"dash-kpi-grid dash-kpi-4",children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"70px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100px"}})]},s))})})]})}):e.jsxs("div",{children:[e.jsxs(m.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Faktury"}),e.jsxs("p",{className:"admin-page-subtitle",children:[W?.total??w.length," ",Q(W?.total??w.length,"faktura","faktury","faktur")]})]}),o("invoices.create")&&e.jsx("div",{className:"admin-page-actions",children:h==="received"?e.jsxs("button",{className:"admin-btn admin-btn-primary",onClick:()=>I(!0),children:[e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Nahrát faktury"]}):e.jsxs(z,{to:"/invoices/new",className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Nová faktura"]})})]}),e.jsxs(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"invoice-month-nav",children:[e.jsx("button",{className:"invoice-month-btn",onClick:xe,"aria-label":"Předchozí měsíc",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})})}),e.jsx("span",{children:ue}),e.jsx("button",{className:"invoice-month-btn",onClick:pe,disabled:U,"aria-label":"Následující měsíc",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"9 18 15 12 9 6"})})})]}),e.jsxs("div",{className:"offers-tabs mb-4",style:{justifyContent:"center"},children:[e.jsx("button",{className:`offers-tab ${h==="issued"?"active":""}`,onClick:()=>v("issued"),children:"Vydané"}),e.jsx("button",{className:`offers-tab ${h==="received"?"active":""}`,onClick:()=>v("received"),children:"Přijaté"})]})]}),h==="received"?e.jsx(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsx(a.Suspense,{fallback:e.jsx("div",{className:"dash-kpi-grid dash-kpi-4",style:{marginBottom:"1.5rem"},children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}),children:e.jsx(Pe,{statsMonth:d,statsYear:p,uploadOpen:ie,setUploadOpen:I})})}):e.jsxs(e.Fragment,{children:[e.jsx(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:!K.current&&ce?e.jsx("div",{className:"dash-kpi-grid dash-kpi-4",style:{marginBottom:"1.5rem"},children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}):n&&e.jsx("div",{style:{overflow:"hidden",marginBottom:"1.5rem"},children:e.jsx(X,{mode:"popLayout",initial:!1,custom:k.current,children:e.jsx(m.div,{className:"dash-kpi-grid dash-kpi-4",custom:k.current,variants:{enter:s=>({x:`${(s||0)*105}%`,opacity:0}),center:{x:"0%",opacity:1},exit:s=>({x:`${(s||0)*-105}%`,opacity:0})},initial:"enter",animate:"center",exit:"exit",transition:{type:"spring",stiffness:300,damping:30},children:(()=>{const s=D(n.paid_month,n.paid_month_czk),i=D(n.awaiting,n.awaiting_czk),l=D(n.overdue,n.overdue_czk),S=D(n.vat_month,n.vat_month_czk),r=(E,ke)=>E>0?`${E} ${Q(E,"faktura","faktury","faktur")}`:ke;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"admin-stat-card success",children:[e.jsxs("div",{className:"admin-stat-label",children:["Uhrazeno (",V[d-1],")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:s.value}),e.jsx("div",{className:"admin-stat-footer",children:[s.detail,r(n.paid_month_count,"žádné úhrady")].filter(Boolean).join(" · ")})]}),e.jsxs("div",{className:"admin-stat-card warning",children:[e.jsxs("div",{className:"admin-stat-label",children:["Čeká úhrada ",e.jsx("span",{style:{fontWeight:400,opacity:.7},children:"· celkově"})]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:i.value}),e.jsx("div",{className:"admin-stat-footer",children:[i.detail,r(n.awaiting_count,"vše uhrazeno")].filter(Boolean).join(" · ")})]}),e.jsxs("div",{className:"admin-stat-card danger",children:[e.jsxs("div",{className:"admin-stat-label",children:["Po splatnosti ",e.jsx("span",{style:{fontWeight:400,opacity:.7},children:"· celkově"})]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:l.value}),e.jsx("div",{className:"admin-stat-footer",children:[l.detail,n.overdue_count===0?"vše v pořádku":r(n.overdue_count,"")].filter(Boolean).join(" · ")})]}),e.jsxs("div",{className:"admin-stat-card info",children:[e.jsxs("div",{className:"admin-stat-label",children:["DPH (",V[d-1],")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:S.value}),e.jsx("div",{className:"admin-stat-footer",children:S.detail||"z vydaných faktur"})]})]})})()},me)})})}),e.jsx(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsx("div",{className:"offers-tabs mb-6",children:De.map(s=>e.jsx("button",{className:`offers-tab ${x===s.value?"active":""}`,onClick:()=>{re(s.value),$(1)},children:s.label},s.value))})}),e.jsx(m.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:M,onChange:s=>{oe(s.target.value),$(1)},className:"admin-form-input",placeholder:"Hledat podle čísla faktury, zákazníka nebo IČ..."})}),w.length===0&&!(c&&!x)?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),e.jsx("polyline",{points:"10 9 9 9 8 9"})]})}),e.jsx("p",{children:"Zatím nejsou žádné faktury."}),o("invoices.create")&&e.jsx("p",{className:"text-tertiary",style:{fontSize:"0.875rem"},children:"Vytvořte první fakturu tlačítkem výše."})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("invoice_number"),children:["Číslo ",e.jsx(B,{column:"invoice_number",sort:y,order:u})]}),e.jsx("th",{children:"Zákazník"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("status"),children:["Stav ",e.jsx(B,{column:"status",sort:y,order:u})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("issue_date"),children:["Vystaveno ",e.jsx(B,{column:"issue_date",sort:y,order:u})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("due_date"),children:["Splatnost ",e.jsx(B,{column:"due_date",sort:y,order:u})]}),e.jsx("th",{className:"text-right",children:"Celkem"}),e.jsx("th",{children:"Akce"})]})}),e.jsxs("tbody",{children:[c&&!M&&!x&&e.jsxs("tr",{className:"offers-draft-row",children:[e.jsx("td",{children:e.jsxs("span",{className:"offers-draft-row-label",children:["Koncept",c.savedAt&&e.jsxs("span",{style:{fontWeight:400,opacity:.8},children:[" · ",new Date(c.savedAt).toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"})]})]})}),e.jsx("td",{children:c.form.customer_name||"—"}),e.jsx("td",{children:"—"}),e.jsx("td",{className:"admin-mono",children:c.form.issue_date?_(c.form.issue_date):"—"}),e.jsx("td",{className:"admin-mono",children:c.form.due_date?_(c.form.due_date):"—"}),e.jsx("td",{}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(z,{to:"/invoices/new",className:"admin-btn-icon",title:"Pokračovat v konceptu","aria-label":"Pokračovat v konceptu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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:je,className:"admin-btn-icon danger",title:"Zahodit koncept",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]}),w.map(s=>{const i=s.status==="overdue"||s.status==="issued"&&s.due_date&&new Date(s.due_date)ge(s),className:`admin-badge ${te[s.status]||""}`,style:{cursor:"pointer"},children:ae[s.status]||s.status})}),e.jsx("td",{className:"admin-mono",children:_(s.issue_date)}),e.jsx("td",{className:"admin-mono",style:s.status==="overdue"?{color:"var(--danger)",fontWeight:600}:void 0,children:_(s.due_date)}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",fontWeight:500},children:O(s.total,s.currency)}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(z,{to:`/invoices/${s.id}`,className:"admin-btn-icon",title:"Detail","aria-label":"Detail",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}),o("invoices.export")&&e.jsx("button",{onClick:()=>T(s),className:"admin-btn-icon",title:"PDF",disabled:L===s.id,children:L===s.id?e.jsx("div",{className:"admin-spinner",style:{width:18,height:18,borderWidth:2}}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),o("invoices.delete")&&e.jsx("button",{onClick:()=>A({show:!0,invoice:s}),className:"admin-btn-icon danger",title:"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id)})]})]})}),e.jsx(Be,{pagination:W,onPageChange:$})]})}),e.jsx(we,{isOpen:b.show,onClose:()=>A({show:!1,invoice:null}),onConfirm:fe,title:"Smazat fakturu",message:`Opravdu chcete smazat fakturu "${b.invoice?.invoice_number}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:ve}),e.jsx(X,{children:F&&e.jsxs(m.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:()=>T(null)}),e.jsxs(m.div,{className:"admin-modal admin-confirm-modal",role:"dialog","aria-modal":"true",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-body admin-confirm-content",children:[e.jsx("div",{className:"admin-confirm-icon admin-confirm-icon-info",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"}),e.jsx("path",{d:"M2 12h20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}),e.jsx("h2",{className:"admin-confirm-title",children:"Jazyk faktury"}),e.jsx("p",{className:"admin-confirm-message",children:"V jakém jazyce chcete vygenerovat fakturu?"})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>G(F,"cs"),className:"admin-btn admin-btn-primary",children:"Čeština"}),e.jsx("button",{type:"button",onClick:()=>G(F,"en"),className:"admin-btn admin-btn-primary",children:"English"})]})]})]})})]})]})}export{Ee as default}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ReceivedInvoices-Lo0YqDmF.js","assets/vendor-animation-0s3FMHwK.js","assets/vendor-react-BVs3cwbi.js","assets/index-Bay45BGf.js","assets/vendor-utils-Dyr8OjFr.js","assets/index-S7b0Xjr1.css","assets/useListData-CvOpK9He.js"])))=>i.map(i=>d[i]); +import{a as Ne,u as be,c as C,d as Q,e as _,g as O,C as we,_ as Se}from"./index-Bay45BGf.js";import{j as e,m,A as X}from"./vendor-animation-0s3FMHwK.js";import{r as a,L as z}from"./vendor-react-BVs3cwbi.js";import{F as Ce}from"./Forbidden-D25jV3Oq.js";import{u as _e,a as ze,S as B}from"./useListData-CvOpK9He.js";import{P as Be}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const Pe=a.lazy(()=>Se(()=>import("./ReceivedInvoices-Lo0YqDmF.js"),__vite__mapDeps([0,1,2,3,4,5,6]))),P="/api/admin",ee="boha_invoice_draft",V=["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"];function se(t){return!t||t.length===0?"0 Kč":t.map(o=>O(o.amount,o.currency)).join(" · ")}function D(t,o){return!t||t.length===0?{value:"0 Kč",detail:null}:t.some(v=>v.currency!=="CZK")&&o!==null&&o!==void 0?{value:O(o,"CZK"),detail:se(t)}:{value:se(t),detail:null}}const ae={issued:"Vystavena",paid:"Zaplacena",overdue:"Po splatnosti"},te={issued:"admin-badge-invoice-issued",paid:"admin-badge-invoice-paid",overdue:"admin-badge-invoice-overdue"},De=[{value:"",label:"Vše"},{value:"issued",label:"Vystavené"},{value:"paid",label:"Zaplacené"},{value:"overdue",label:"Po splatnosti"}];function Ee(){const t=Ne(),{hasPermission:o}=be(),[h,v]=a.useState("issued"),[ie,I]=a.useState(!1),{sort:ne,order:u,handleSort:j,activeSort:y}=_e("invoice_number"),[M,oe]=a.useState(""),[le,$]=a.useState(1),[x,re]=a.useState(""),f=new Date,[d,g]=a.useState(f.getMonth()+1),[p,R]=a.useState(f.getFullYear()),[n,de]=a.useState(null),[ce,H]=a.useState(!0),K=a.useRef(!1),k=a.useRef(0),[me,he]=a.useState(0),U=d===f.getMonth()+1&&p===f.getFullYear(),ue=`${V[d-1]} ${p}`,N=a.useCallback(async()=>{H(!0);try{const i=await(await C(`${P}/invoices.php?action=stats&month=${d}&year=${p}`)).json();i.success&&(de(i.data),K.current=!0,he(l=>l+1))}catch{}finally{H(!1)}},[d,p]);a.useEffect(()=>{N()},[N]);const xe=()=>{k.current=-1,d===1?(g(12),R(s=>s-1)):g(s=>s-1)},pe=()=>{U||(k.current=1,d===12?(g(1),R(s=>s+1)):g(s=>s+1))},[b,A]=a.useState({show:!1,invoice:null}),[ve,Z]=a.useState(!1),[L,Y]=a.useState(null),[F,T]=a.useState(null),[c,J]=a.useState(null);a.useEffect(()=>{try{const s=localStorage.getItem(ee);if(!s)return;const i=JSON.parse(s);i&&i.form&&Array.isArray(i.items)&&J(i)}catch{}},[]);const je=()=>{try{localStorage.removeItem(ee)}catch{}J(null)},{items:w,loading:ye,pagination:W,refetch:q}=ze("invoices.php",{dataKey:"invoices",search:M,sort:ne,order:u,page:le,extraParams:x?{status:x}:{},errorMsg:"Nepodařilo se načíst faktury"});if(!o("invoices.view"))return e.jsx(Ce,{});const fe=async()=>{if(b.invoice){Z(!0);try{const i=await(await C(`${P}/invoices.php?id=${b.invoice.id}`,{method:"DELETE"})).json();i.success?(A({show:!1,invoice:null}),t.success(i.message||"Faktura byla smazána"),q(),N()):t.error(i.error||"Nepodařilo se smazat fakturu")}catch{t.error("Chyba připojení")}finally{Z(!1)}}},ge=async s=>{if(s.status!=="paid")try{const l=await(await C(`${P}/invoices.php?id=${s.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:"paid"})})).json();l.success?(t.success("Faktura označena jako zaplacená"),q(),N()):t.error(l.error||"Nepodařilo se změnit stav")}catch{t.error("Chyba připojení")}},G=async(s,i="cs")=>{if(!L){T(null),Y(s.id);try{const l=await C(`${P}/invoices-pdf.php?id=${s.id}&lang=${encodeURIComponent(i)}`);if(l.status===401)return;if(!l.ok){t.error("Nepodařilo se vygenerovat PDF");return}const S=await l.text(),r=window.open("","_blank");r?(r.document.open(),r.document.write(S),r.document.close(),r.onload=()=>r.print()):t.error("Prohlížeč zablokoval vyskakovací okno")}catch{t.error("Chyba při generování PDF")}finally{Y(null)}}};return ye?e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"dash-kpi-grid dash-kpi-4",children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"80px"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"70px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"90px"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"100px"}})]},s))})})]})}):e.jsxs("div",{children:[e.jsxs(m.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Faktury"}),e.jsxs("p",{className:"admin-page-subtitle",children:[W?.total??w.length," ",Q(W?.total??w.length,"faktura","faktury","faktur")]})]}),o("invoices.create")&&e.jsx("div",{className:"admin-page-actions",children:h==="received"?e.jsxs("button",{className:"admin-btn admin-btn-primary",onClick:()=>I(!0),children:[e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Nahrát faktury"]}):e.jsxs(z,{to:"/invoices/new",className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Nová faktura"]})})]}),e.jsxs(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"invoice-month-nav",children:[e.jsx("button",{className:"invoice-month-btn",onClick:xe,"aria-label":"Předchozí měsíc",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})})}),e.jsx("span",{children:ue}),e.jsx("button",{className:"invoice-month-btn",onClick:pe,disabled:U,"aria-label":"Následující měsíc",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"9 18 15 12 9 6"})})})]}),e.jsxs("div",{className:"offers-tabs mb-4",style:{justifyContent:"center"},children:[e.jsx("button",{className:`offers-tab ${h==="issued"?"active":""}`,onClick:()=>v("issued"),children:"Vydané"}),e.jsx("button",{className:`offers-tab ${h==="received"?"active":""}`,onClick:()=>v("received"),children:"Přijaté"})]})]}),h==="received"?e.jsx(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsx(a.Suspense,{fallback:e.jsx("div",{className:"dash-kpi-grid dash-kpi-4",style:{marginBottom:"1.5rem"},children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}),children:e.jsx(Pe,{statsMonth:d,statsYear:p,uploadOpen:ie,setUploadOpen:I})})}):e.jsxs(e.Fragment,{children:[e.jsx(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:!K.current&&ce?e.jsx("div",{className:"dash-kpi-grid dash-kpi-4",style:{marginBottom:"1.5rem"},children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}):n&&e.jsx("div",{style:{overflow:"hidden",marginBottom:"1.5rem"},children:e.jsx(X,{mode:"popLayout",initial:!1,custom:k.current,children:e.jsx(m.div,{className:"dash-kpi-grid dash-kpi-4",custom:k.current,variants:{enter:s=>({x:`${(s||0)*105}%`,opacity:0}),center:{x:"0%",opacity:1},exit:s=>({x:`${(s||0)*-105}%`,opacity:0})},initial:"enter",animate:"center",exit:"exit",transition:{type:"spring",stiffness:300,damping:30},children:(()=>{const s=D(n.paid_month,n.paid_month_czk),i=D(n.awaiting,n.awaiting_czk),l=D(n.overdue,n.overdue_czk),S=D(n.vat_month,n.vat_month_czk),r=(E,ke)=>E>0?`${E} ${Q(E,"faktura","faktury","faktur")}`:ke;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"admin-stat-card success",children:[e.jsxs("div",{className:"admin-stat-label",children:["Uhrazeno (",V[d-1],")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:s.value}),e.jsx("div",{className:"admin-stat-footer",children:[s.detail,r(n.paid_month_count,"žádné úhrady")].filter(Boolean).join(" · ")})]}),e.jsxs("div",{className:"admin-stat-card warning",children:[e.jsxs("div",{className:"admin-stat-label",children:["Čeká úhrada ",e.jsx("span",{style:{fontWeight:400,opacity:.7},children:"· celkově"})]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:i.value}),e.jsx("div",{className:"admin-stat-footer",children:[i.detail,r(n.awaiting_count,"vše uhrazeno")].filter(Boolean).join(" · ")})]}),e.jsxs("div",{className:"admin-stat-card danger",children:[e.jsxs("div",{className:"admin-stat-label",children:["Po splatnosti ",e.jsx("span",{style:{fontWeight:400,opacity:.7},children:"· celkově"})]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:l.value}),e.jsx("div",{className:"admin-stat-footer",children:[l.detail,n.overdue_count===0?"vše v pořádku":r(n.overdue_count,"")].filter(Boolean).join(" · ")})]}),e.jsxs("div",{className:"admin-stat-card info",children:[e.jsxs("div",{className:"admin-stat-label",children:["DPH (",V[d-1],")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:S.value}),e.jsx("div",{className:"admin-stat-footer",children:S.detail||"z vydaných faktur"})]})]})})()},me)})})}),e.jsx(m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsx("div",{className:"offers-tabs mb-6",children:De.map(s=>e.jsx("button",{className:`offers-tab ${x===s.value?"active":""}`,onClick:()=>{re(s.value),$(1)},children:s.label},s.value))})}),e.jsx(m.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:M,onChange:s=>{oe(s.target.value),$(1)},className:"admin-form-input",placeholder:"Hledat podle čísla faktury, zákazníka nebo IČ..."})}),w.length===0&&!(c&&!x)?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),e.jsx("polyline",{points:"10 9 9 9 8 9"})]})}),e.jsx("p",{children:"Zatím nejsou žádné faktury."}),o("invoices.create")&&e.jsx("p",{className:"text-tertiary",style:{fontSize:"0.875rem"},children:"Vytvořte první fakturu tlačítkem výše."})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("invoice_number"),children:["Číslo ",e.jsx(B,{column:"invoice_number",sort:y,order:u})]}),e.jsx("th",{children:"Zákazník"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("status"),children:["Stav ",e.jsx(B,{column:"status",sort:y,order:u})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("issue_date"),children:["Vystaveno ",e.jsx(B,{column:"issue_date",sort:y,order:u})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>j("due_date"),children:["Splatnost ",e.jsx(B,{column:"due_date",sort:y,order:u})]}),e.jsx("th",{className:"text-right",children:"Celkem"}),e.jsx("th",{children:"Akce"})]})}),e.jsxs("tbody",{children:[c&&!M&&!x&&e.jsxs("tr",{className:"offers-draft-row",children:[e.jsx("td",{children:e.jsxs("span",{className:"offers-draft-row-label",children:["Koncept",c.savedAt&&e.jsxs("span",{style:{fontWeight:400,opacity:.8},children:[" · ",new Date(c.savedAt).toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"})]})]})}),e.jsx("td",{children:c.form.customer_name||"—"}),e.jsx("td",{children:"—"}),e.jsx("td",{className:"admin-mono",children:c.form.issue_date?_(c.form.issue_date):"—"}),e.jsx("td",{className:"admin-mono",children:c.form.due_date?_(c.form.due_date):"—"}),e.jsx("td",{}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(z,{to:"/invoices/new",className:"admin-btn-icon",title:"Pokračovat v konceptu","aria-label":"Pokračovat v konceptu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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:je,className:"admin-btn-icon danger",title:"Zahodit koncept",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]}),w.map(s=>{const i=s.status==="overdue"||s.status==="issued"&&s.due_date&&new Date(s.due_date)ge(s),className:`admin-badge ${te[s.status]||""}`,style:{cursor:"pointer"},children:ae[s.status]||s.status})}),e.jsx("td",{className:"admin-mono",children:_(s.issue_date)}),e.jsx("td",{className:"admin-mono",style:s.status==="overdue"?{color:"var(--danger)",fontWeight:600}:void 0,children:_(s.due_date)}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",fontWeight:500},children:O(s.total,s.currency)}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(z,{to:`/invoices/${s.id}`,className:"admin-btn-icon",title:"Detail","aria-label":"Detail",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}),o("invoices.export")&&e.jsx("button",{onClick:()=>T(s),className:"admin-btn-icon",title:"PDF",disabled:L===s.id,children:L===s.id?e.jsx("div",{className:"admin-spinner",style:{width:18,height:18,borderWidth:2}}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),o("invoices.delete")&&e.jsx("button",{onClick:()=>A({show:!0,invoice:s}),className:"admin-btn-icon danger",title:"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id)})]})]})}),e.jsx(Be,{pagination:W,onPageChange:$})]})}),e.jsx(we,{isOpen:b.show,onClose:()=>A({show:!1,invoice:null}),onConfirm:fe,title:"Smazat fakturu",message:`Opravdu chcete smazat fakturu "${b.invoice?.invoice_number}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:ve}),e.jsx(X,{children:F&&e.jsxs(m.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:()=>T(null)}),e.jsxs(m.div,{className:"admin-modal admin-confirm-modal",role:"dialog","aria-modal":"true",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-body admin-confirm-content",children:[e.jsx("div",{className:"admin-confirm-icon admin-confirm-icon-info",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"}),e.jsx("path",{d:"M2 12h20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}),e.jsx("h2",{className:"admin-confirm-title",children:"Jazyk faktury"}),e.jsx("p",{className:"admin-confirm-message",children:"V jakém jazyce chcete vygenerovat fakturu?"})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>G(F,"cs"),className:"admin-btn admin-btn-primary",children:"Čeština"}),e.jsx("button",{type:"button",onClick:()=>G(F,"en"),className:"admin-btn admin-btn-primary",children:"English"})]})]})]})})]})]})}export{Ee as default}; diff --git a/dist/assets/LeaveApproval-NYDUrW_i.js b/dist/assets/LeaveApproval-CWyAOhiD.js similarity index 99% rename from dist/assets/LeaveApproval-NYDUrW_i.js rename to dist/assets/LeaveApproval-CWyAOhiD.js index 1b3af9e..d6a4f75 100644 --- a/dist/assets/LeaveApproval-NYDUrW_i.js +++ b/dist/assets/LeaveApproval-CWyAOhiD.js @@ -1 +1 @@ -import{j as e,m as o,A as q}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{u as W,a as B,b as V,c as m,d as w,C as I,F as J}from"./index-BrM8fzBu.js";import{b as r,e as z}from"./attendanceHelpers-D6sLEw0q.js";import{F as K}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const p="/api/admin",g={vacation:"Dovolená",sick:"Nemoc",unpaid:"Neplacené volno"},A={vacation:"badge-vacation",sick:"badge-sick",unpaid:"badge-unpaid"},U={pending:"Čeká na schválení",approved:"Schváleno",rejected:"Zamítnuto",cancelled:"Zrušeno"},G={pending:"badge-pending",approved:"badge-approved",rejected:"badge-rejected",cancelled:"badge-cancelled"};function ae(){const{hasPermission:T}=W(),n=B(),[D,_]=t.useState(!0),[l,k]=t.useState("pending"),[S,R]=t.useState([]),[c,Z]=t.useState(0),[h,b]=t.useState([]),[d,N]=t.useState({open:!1,request:null}),[i,u]=t.useState({open:!1,request:null}),[x,j]=t.useState(""),[v,y]=t.useState(!1);V(i.open);const f=t.useCallback(async()=>{try{const s=await m(`${p}/leave-requests.php?action=pending`);if(s.status===401)return;const a=await s.json();a.success&&(R(a.data.requests),Z(a.data.count))}catch{n.error("Nepodařilo se načíst žádosti")}},[n]),C=t.useCallback(async()=>{try{const s=await m(`${p}/leave-requests.php?action=all&status=approved`);if(s.status===401)return;const a=await s.json(),$=await m(`${p}/leave-requests.php?action=all&status=rejected`);if($.status===401)return;const P=await $.json(),M=[...a.success?a.data:[],...P.success?P.data:[]].sort((O,E)=>new Date(E.reviewed_at)-new Date(O.reviewed_at));b(M)}catch{n.error("Nepodařilo se načíst vyřízené žádosti")}},[n]);if(t.useEffect(()=>{(async()=>{_(!0),await f(),_(!1)})()},[f]),t.useEffect(()=>{l==="processed"&&h.length===0&&C()},[l,h.length,C]),!T("attendance.approve"))return e.jsx(K,{});const F=async()=>{y(!0);try{const s=await m(`${p}/leave-requests.php?action=approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({request_id:d.request.id})});if(s.status===401)return;const a=await s.json();a.success?(N({open:!1,request:null}),await f(),b([]),n.success(a.message)):n.error(a.error)}catch{n.error("Chyba připojení")}finally{y(!1)}},L=async()=>{if(!x.trim()){n.error("Důvod zamítnutí je povinný");return}y(!0);try{const s=await m(`${p}/leave-requests.php?action=reject`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({request_id:i.request.id,note:x})});if(s.status===401)return;const a=await s.json();a.success?(u({open:!1,request:null}),j(""),await f(),b([]),n.success(a.message)):n.error(a.error)}catch{n.error("Chyba připojení")}finally{y(!1)}};return D?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},s))})})]}):e.jsxs("div",{children:[e.jsx(o.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Schvalování nepřítomnosti"}),e.jsx("p",{className:"admin-page-subtitle",children:c>0?`${c} ${w(c,"žádost čeká","žádosti čekají","žádostí čeká")} na schválení`:"Žádné čekající žádosti"})]})}),e.jsx(o.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsxs("div",{className:"offers-tabs mb-6",children:[e.jsxs("button",{className:`offers-tab ${l==="pending"?"active":""}`,onClick:()=>k("pending"),children:["Ke schválení",c>0&&e.jsx("span",{className:"admin-badge badge-pending",style:{marginLeft:"0.5rem",fontSize:"0.7rem",padding:"0.15rem 0.5rem"},children:c})]}),e.jsx("button",{className:`offers-tab ${l==="processed"?"active":""}`,onClick:()=>k("processed"),children:"Vyřízené"})]})}),l==="pending"&&e.jsx(o.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:S.length===0?e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-empty-state",children:[e.jsxs("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",className:"text-muted mb-4",children:[e.jsx("path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"}),e.jsx("polyline",{points:"22 4 12 14.01 9 11.01"})]}),e.jsx("p",{children:"Žádné čekající žádosti"})]})})}):e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"1rem"},children:S.map(s=>e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-card-body",style:{padding:"1.25rem"},children:e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",flexWrap:"wrap",gap:"1rem"},children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex-row-gap mb-2",children:[e.jsx("strong",{style:{fontSize:"1rem"},children:s.employee_name}),e.jsx("span",{className:`attendance-leave-badge ${A[s.leave_type]||""}`,children:g[s.leave_type]||s.leave_type})]}),e.jsxs("div",{className:"text-secondary",style:{display:"flex",gap:"1.5rem",flexWrap:"wrap",fontSize:"0.875rem"},children:[e.jsxs("span",{children:[e.jsx("strong",{children:r(s.date_from)})," — ",e.jsx("strong",{children:r(s.date_to)})]}),e.jsxs("span",{children:[s.total_days," ",w(s.total_days,"den","dny","dnů")," (",s.total_hours,"h)"]}),e.jsxs("span",{className:"text-muted",children:["Podáno: ",z(s.created_at)]})]}),s.notes&&e.jsx("div",{className:"text-secondary",style:{marginTop:"0.5rem",fontSize:"0.875rem",fontStyle:"italic"},children:s.notes})]}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem",flexShrink:0},children:[e.jsx("button",{onClick:()=>N({open:!0,request:s}),className:"admin-btn admin-btn-sm",style:{background:"var(--success-light)",color:"var(--success)",border:"none"},children:"Schválit"}),e.jsx("button",{onClick:()=>u({open:!0,request:s}),className:"admin-btn admin-btn-sm",style:{background:"var(--danger-light)",color:"var(--danger)",border:"none"},children:"Zamítnout"})]})]})})},s.id))})}),l==="processed"&&e.jsx(o.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsx("div",{className:"admin-card-body",children:h.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Zatím žádné vyřízené žádosti"})}):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:"Typ"}),e.jsx("th",{children:"Od"}),e.jsx("th",{children:"Do"}),e.jsx("th",{children:"Dny"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Schválil"}),e.jsx("th",{children:"Poznámka"}),e.jsx("th",{children:"Vyřízeno"})]})}),e.jsx("tbody",{children:h.map(s=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("strong",{children:s.employee_name})}),e.jsx("td",{children:e.jsx("span",{className:`attendance-leave-badge ${A[s.leave_type]||""}`,children:g[s.leave_type]||s.leave_type})}),e.jsx("td",{className:"admin-mono",children:r(s.date_from)}),e.jsx("td",{className:"admin-mono",children:r(s.date_to)}),e.jsx("td",{className:"admin-mono",children:s.total_days}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${G[s.status]||""}`,children:U[s.status]||s.status})}),e.jsx("td",{children:s.reviewer_name||"—"}),e.jsx("td",{style:{maxWidth:"200px"},children:s.reviewer_note?e.jsx("span",{title:s.reviewer_note,children:s.reviewer_note.length>40?`${s.reviewer_note.substring(0,40)}...`:s.reviewer_note}):"—"}),e.jsx("td",{className:"admin-mono",style:{whiteSpace:"nowrap"},children:z(s.reviewed_at)})]},s.id))})]})})})}),e.jsx(I,{isOpen:d.open,onClose:()=>N({open:!1,request:null}),onConfirm:F,title:"Schválit žádost",message:d.request?`Schválit ${d.request.total_days} ${w(d.request.total_days,"den","dny","dnů")} ${g[d.request.leave_type]?.toLowerCase()||""} pro ${d.request.employee_name}?`:"",confirmText:"Schválit",type:"info",loading:v}),e.jsx(q,{children:i.open&&e.jsxs(o.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:()=>{u({open:!1,request:null}),j("")}}),e.jsxs(o.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Zamítnout žádost"})}),e.jsxs("div",{className:"admin-modal-body",children:[i.request&&e.jsxs("p",{className:"text-secondary mb-4",children:[i.request.employee_name," — ",g[i.request.leave_type],","," ",r(i.request.date_from)," — ",r(i.request.date_to)," (",i.request.total_days," dnů)"]}),e.jsx(J,{label:"Důvod zamítnutí",required:!0,children:e.jsx("textarea",{value:x,onChange:s=>j(s.target.value),placeholder:"Uveďte důvod zamítnutí...",className:"admin-form-textarea",rows:3,autoFocus:!0})})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>{u({open:!1,request:null}),j("")},className:"admin-btn admin-btn-secondary",disabled:v,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:L,disabled:v||!x.trim(),className:"admin-btn admin-btn-primary",children:v?"Zpracování...":"Zamítnout"})]})]})]})})]})}export{ae as default}; +import{j as e,m as o,A as q}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{u as W,a as B,b as V,c as m,d as w,C as I,F as J}from"./index-Bay45BGf.js";import{b as r,e as z}from"./attendanceHelpers-D6sLEw0q.js";import{F as K}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const p="/api/admin",g={vacation:"Dovolená",sick:"Nemoc",unpaid:"Neplacené volno"},A={vacation:"badge-vacation",sick:"badge-sick",unpaid:"badge-unpaid"},U={pending:"Čeká na schválení",approved:"Schváleno",rejected:"Zamítnuto",cancelled:"Zrušeno"},G={pending:"badge-pending",approved:"badge-approved",rejected:"badge-rejected",cancelled:"badge-cancelled"};function ae(){const{hasPermission:T}=W(),n=B(),[D,_]=t.useState(!0),[l,k]=t.useState("pending"),[S,R]=t.useState([]),[c,Z]=t.useState(0),[h,b]=t.useState([]),[d,N]=t.useState({open:!1,request:null}),[i,u]=t.useState({open:!1,request:null}),[x,j]=t.useState(""),[v,y]=t.useState(!1);V(i.open);const f=t.useCallback(async()=>{try{const s=await m(`${p}/leave-requests.php?action=pending`);if(s.status===401)return;const a=await s.json();a.success&&(R(a.data.requests),Z(a.data.count))}catch{n.error("Nepodařilo se načíst žádosti")}},[n]),C=t.useCallback(async()=>{try{const s=await m(`${p}/leave-requests.php?action=all&status=approved`);if(s.status===401)return;const a=await s.json(),$=await m(`${p}/leave-requests.php?action=all&status=rejected`);if($.status===401)return;const P=await $.json(),M=[...a.success?a.data:[],...P.success?P.data:[]].sort((O,E)=>new Date(E.reviewed_at)-new Date(O.reviewed_at));b(M)}catch{n.error("Nepodařilo se načíst vyřízené žádosti")}},[n]);if(t.useEffect(()=>{(async()=>{_(!0),await f(),_(!1)})()},[f]),t.useEffect(()=>{l==="processed"&&h.length===0&&C()},[l,h.length,C]),!T("attendance.approve"))return e.jsx(K,{});const F=async()=>{y(!0);try{const s=await m(`${p}/leave-requests.php?action=approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({request_id:d.request.id})});if(s.status===401)return;const a=await s.json();a.success?(N({open:!1,request:null}),await f(),b([]),n.success(a.message)):n.error(a.error)}catch{n.error("Chyba připojení")}finally{y(!1)}},L=async()=>{if(!x.trim()){n.error("Důvod zamítnutí je povinný");return}y(!0);try{const s=await m(`${p}/leave-requests.php?action=reject`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({request_id:i.request.id,note:x})});if(s.status===401)return;const a=await s.json();a.success?(u({open:!1,request:null}),j(""),await f(),b([]),n.success(a.message)):n.error(a.error)}catch{n.error("Chyba připojení")}finally{y(!1)}};return D?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},s))})})]}):e.jsxs("div",{children:[e.jsx(o.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Schvalování nepřítomnosti"}),e.jsx("p",{className:"admin-page-subtitle",children:c>0?`${c} ${w(c,"žádost čeká","žádosti čekají","žádostí čeká")} na schválení`:"Žádné čekající žádosti"})]})}),e.jsx(o.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsxs("div",{className:"offers-tabs mb-6",children:[e.jsxs("button",{className:`offers-tab ${l==="pending"?"active":""}`,onClick:()=>k("pending"),children:["Ke schválení",c>0&&e.jsx("span",{className:"admin-badge badge-pending",style:{marginLeft:"0.5rem",fontSize:"0.7rem",padding:"0.15rem 0.5rem"},children:c})]}),e.jsx("button",{className:`offers-tab ${l==="processed"?"active":""}`,onClick:()=>k("processed"),children:"Vyřízené"})]})}),l==="pending"&&e.jsx(o.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:S.length===0?e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{className:"admin-empty-state",children:[e.jsxs("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",className:"text-muted mb-4",children:[e.jsx("path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"}),e.jsx("polyline",{points:"22 4 12 14.01 9 11.01"})]}),e.jsx("p",{children:"Žádné čekající žádosti"})]})})}):e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"1rem"},children:S.map(s=>e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-card-body",style:{padding:"1.25rem"},children:e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",flexWrap:"wrap",gap:"1rem"},children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex-row-gap mb-2",children:[e.jsx("strong",{style:{fontSize:"1rem"},children:s.employee_name}),e.jsx("span",{className:`attendance-leave-badge ${A[s.leave_type]||""}`,children:g[s.leave_type]||s.leave_type})]}),e.jsxs("div",{className:"text-secondary",style:{display:"flex",gap:"1.5rem",flexWrap:"wrap",fontSize:"0.875rem"},children:[e.jsxs("span",{children:[e.jsx("strong",{children:r(s.date_from)})," — ",e.jsx("strong",{children:r(s.date_to)})]}),e.jsxs("span",{children:[s.total_days," ",w(s.total_days,"den","dny","dnů")," (",s.total_hours,"h)"]}),e.jsxs("span",{className:"text-muted",children:["Podáno: ",z(s.created_at)]})]}),s.notes&&e.jsx("div",{className:"text-secondary",style:{marginTop:"0.5rem",fontSize:"0.875rem",fontStyle:"italic"},children:s.notes})]}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem",flexShrink:0},children:[e.jsx("button",{onClick:()=>N({open:!0,request:s}),className:"admin-btn admin-btn-sm",style:{background:"var(--success-light)",color:"var(--success)",border:"none"},children:"Schválit"}),e.jsx("button",{onClick:()=>u({open:!0,request:s}),className:"admin-btn admin-btn-sm",style:{background:"var(--danger-light)",color:"var(--danger)",border:"none"},children:"Zamítnout"})]})]})})},s.id))})}),l==="processed"&&e.jsx(o.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsx("div",{className:"admin-card-body",children:h.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Zatím žádné vyřízené žádosti"})}):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:"Typ"}),e.jsx("th",{children:"Od"}),e.jsx("th",{children:"Do"}),e.jsx("th",{children:"Dny"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Schválil"}),e.jsx("th",{children:"Poznámka"}),e.jsx("th",{children:"Vyřízeno"})]})}),e.jsx("tbody",{children:h.map(s=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("strong",{children:s.employee_name})}),e.jsx("td",{children:e.jsx("span",{className:`attendance-leave-badge ${A[s.leave_type]||""}`,children:g[s.leave_type]||s.leave_type})}),e.jsx("td",{className:"admin-mono",children:r(s.date_from)}),e.jsx("td",{className:"admin-mono",children:r(s.date_to)}),e.jsx("td",{className:"admin-mono",children:s.total_days}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${G[s.status]||""}`,children:U[s.status]||s.status})}),e.jsx("td",{children:s.reviewer_name||"—"}),e.jsx("td",{style:{maxWidth:"200px"},children:s.reviewer_note?e.jsx("span",{title:s.reviewer_note,children:s.reviewer_note.length>40?`${s.reviewer_note.substring(0,40)}...`:s.reviewer_note}):"—"}),e.jsx("td",{className:"admin-mono",style:{whiteSpace:"nowrap"},children:z(s.reviewed_at)})]},s.id))})]})})})}),e.jsx(I,{isOpen:d.open,onClose:()=>N({open:!1,request:null}),onConfirm:F,title:"Schválit žádost",message:d.request?`Schválit ${d.request.total_days} ${w(d.request.total_days,"den","dny","dnů")} ${g[d.request.leave_type]?.toLowerCase()||""} pro ${d.request.employee_name}?`:"",confirmText:"Schválit",type:"info",loading:v}),e.jsx(q,{children:i.open&&e.jsxs(o.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:()=>{u({open:!1,request:null}),j("")}}),e.jsxs(o.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Zamítnout žádost"})}),e.jsxs("div",{className:"admin-modal-body",children:[i.request&&e.jsxs("p",{className:"text-secondary mb-4",children:[i.request.employee_name," — ",g[i.request.leave_type],","," ",r(i.request.date_from)," — ",r(i.request.date_to)," (",i.request.total_days," dnů)"]}),e.jsx(J,{label:"Důvod zamítnutí",required:!0,children:e.jsx("textarea",{value:x,onChange:s=>j(s.target.value),placeholder:"Uveďte důvod zamítnutí...",className:"admin-form-textarea",rows:3,autoFocus:!0})})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>{u({open:!1,request:null}),j("")},className:"admin-btn admin-btn-secondary",disabled:v,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:L,disabled:v||!x.trim(),className:"admin-btn admin-btn-primary",children:v?"Zpracování...":"Zamítnout"})]})]})]})})]})}export{ae as default}; diff --git a/dist/assets/LeaveRequests-BALGw7zC.js b/dist/assets/LeaveRequests-CDRutKVT.js similarity index 99% rename from dist/assets/LeaveRequests-BALGw7zC.js rename to dist/assets/LeaveRequests-CDRutKVT.js index 3d57e32..6966ef1 100644 --- a/dist/assets/LeaveRequests-BALGw7zC.js +++ b/dist/assets/LeaveRequests-CDRutKVT.js @@ -1 +1 @@ -import{j as e,m}from"./vendor-animation-0s3FMHwK.js";import{r as n}from"./vendor-react-BVs3cwbi.js";import{a as g,u as w,c as x,C as b}from"./index-BrM8fzBu.js";import{F as C}from"./Forbidden-D25jV3Oq.js";import{b as h,e as S}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const j="/api/admin",_={vacation:"Dovolená",sick:"Nemoc",unpaid:"Neplacené volno"},z={pending:"Čeká na schválení",approved:"Schváleno",rejected:"Zamítnuto",cancelled:"Zrušeno"},D={pending:"badge-pending",approved:"badge-approved",rejected:"badge-rejected",cancelled:"badge-cancelled"},L={vacation:"badge-vacation",sick:"badge-sick",unpaid:"badge-unpaid"};function A(){const i=g(),{hasPermission:p}=w(),[v,u]=n.useState(!0),[c,N]=n.useState([]),[o,t]=n.useState({open:!1,id:null}),[y,r]=n.useState(!1),l=n.useCallback(async()=>{try{const s=await x(`${j}/leave-requests.php`);if(s.status===401)return;const a=await s.json();a.success&&N(a.data)}catch{i.error("Nepodařilo se načíst žádosti")}finally{u(!1)}},[i]);if(n.useEffect(()=>{l()},[l]),!p("attendance.record"))return e.jsx(C,{});const f=async()=>{r(!0);try{const s=await x(`${j}/leave-requests.php?action=cancel`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({request_id:o.id})});if(s.status===401)return;const a=await s.json();a.success?(t({open:!1,id:null}),await l(),i.success(a.message)):i.error(a.error)}catch{i.error("Chyba připojení")}finally{r(!1)}};if(v)return e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-3/4 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]})]})})]})});function k(s){const a=d=>d.length>40?`${d.substring(0,40)}...`:d;return s.status==="rejected"&&s.reviewer_note?e.jsx("span",{style:{color:"var(--danger)",fontSize:"0.875rem"},title:s.reviewer_note,children:a(s.reviewer_note)}):s.notes?e.jsx("span",{className:"text-secondary",style:{fontSize:"0.875rem"},title:s.notes,children:a(s.notes)}):e.jsx("span",{className:"text-muted",children:"—"})}return e.jsxs("div",{children:[e.jsx(m.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Moje žádosti"}),e.jsx("p",{className:"admin-page-subtitle",children:"Přehled žádostí o nepřítomnost"})]})}),e.jsx(m.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children:c.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),e.jsx("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),e.jsx("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),e.jsx("line",{x1:"3",y1:"10",x2:"21",y2:"10"})]})}),e.jsx("p",{children:"Zatím nemáte žádné žádosti"}),e.jsx("p",{style:{fontSize:"0.875rem",color:"var(--text-muted)"},children:"Novou žádost můžete podat na stránce Docházka"})]}):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:"Typ"}),e.jsx("th",{children:"Od"}),e.jsx("th",{children:"Do"}),e.jsx("th",{children:"Dny"}),e.jsx("th",{children:"Hodiny"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Poznámka"}),e.jsx("th",{children:"Podáno"}),e.jsx("th",{})]})}),e.jsx("tbody",{children:c.map(s=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("span",{className:`attendance-leave-badge ${L[s.leave_type]||""}`,children:_[s.leave_type]||s.leave_type})}),e.jsx("td",{className:"admin-mono",children:h(s.date_from)}),e.jsx("td",{className:"admin-mono",children:h(s.date_to)}),e.jsx("td",{className:"admin-mono",children:s.total_days}),e.jsxs("td",{className:"admin-mono",children:[s.total_hours,"h"]}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${D[s.status]||""}`,children:z[s.status]||s.status})}),e.jsx("td",{style:{maxWidth:"200px"},children:k(s)}),e.jsx("td",{className:"admin-mono",style:{whiteSpace:"nowrap"},children:S(s.created_at)}),e.jsx("td",{children:s.status==="pending"&&e.jsx("button",{onClick:()=>t({open:!0,id:s.id}),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Zrušit"})})]},s.id))})]})})})}),e.jsx(b,{isOpen:o.open,onClose:()=>t({open:!1,id:null}),onConfirm:f,title:"Zrušit žádost",message:"Opravdu chcete zrušit tuto žádost o nepřítomnost?",confirmText:"Zrušit žádost",type:"warning",loading:y})]})}export{A as default}; +import{j as e,m}from"./vendor-animation-0s3FMHwK.js";import{r as n}from"./vendor-react-BVs3cwbi.js";import{a as g,u as w,c as x,C as b}from"./index-Bay45BGf.js";import{F as C}from"./Forbidden-D25jV3Oq.js";import{b as h,e as S}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const j="/api/admin",_={vacation:"Dovolená",sick:"Nemoc",unpaid:"Neplacené volno"},z={pending:"Čeká na schválení",approved:"Schváleno",rejected:"Zamítnuto",cancelled:"Zrušeno"},D={pending:"badge-pending",approved:"badge-approved",rejected:"badge-rejected",cancelled:"badge-cancelled"},L={vacation:"badge-vacation",sick:"badge-sick",unpaid:"badge-unpaid"};function A(){const i=g(),{hasPermission:p}=w(),[v,u]=n.useState(!0),[c,N]=n.useState([]),[o,t]=n.useState({open:!1,id:null}),[y,r]=n.useState(!1),l=n.useCallback(async()=>{try{const s=await x(`${j}/leave-requests.php`);if(s.status===401)return;const a=await s.json();a.success&&N(a.data)}catch{i.error("Nepodařilo se načíst žádosti")}finally{u(!1)}},[i]);if(n.useEffect(()=>{l()},[l]),!p("attendance.record"))return e.jsx(C,{});const f=async()=>{r(!0);try{const s=await x(`${j}/leave-requests.php?action=cancel`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({request_id:o.id})});if(s.status===401)return;const a=await s.json();a.success?(t({open:!1,id:null}),await l(),i.success(a.message)):i.error(a.error)}catch{i.error("Chyba připojení")}finally{r(!1)}};if(v)return e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-3/4 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]})]})})]})});function k(s){const a=d=>d.length>40?`${d.substring(0,40)}...`:d;return s.status==="rejected"&&s.reviewer_note?e.jsx("span",{style:{color:"var(--danger)",fontSize:"0.875rem"},title:s.reviewer_note,children:a(s.reviewer_note)}):s.notes?e.jsx("span",{className:"text-secondary",style:{fontSize:"0.875rem"},title:s.notes,children:a(s.notes)}):e.jsx("span",{className:"text-muted",children:"—"})}return e.jsxs("div",{children:[e.jsx(m.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Moje žádosti"}),e.jsx("p",{className:"admin-page-subtitle",children:"Přehled žádostí o nepřítomnost"})]})}),e.jsx(m.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children:c.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),e.jsx("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),e.jsx("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),e.jsx("line",{x1:"3",y1:"10",x2:"21",y2:"10"})]})}),e.jsx("p",{children:"Zatím nemáte žádné žádosti"}),e.jsx("p",{style:{fontSize:"0.875rem",color:"var(--text-muted)"},children:"Novou žádost můžete podat na stránce Docházka"})]}):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:"Typ"}),e.jsx("th",{children:"Od"}),e.jsx("th",{children:"Do"}),e.jsx("th",{children:"Dny"}),e.jsx("th",{children:"Hodiny"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Poznámka"}),e.jsx("th",{children:"Podáno"}),e.jsx("th",{})]})}),e.jsx("tbody",{children:c.map(s=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("span",{className:`attendance-leave-badge ${L[s.leave_type]||""}`,children:_[s.leave_type]||s.leave_type})}),e.jsx("td",{className:"admin-mono",children:h(s.date_from)}),e.jsx("td",{className:"admin-mono",children:h(s.date_to)}),e.jsx("td",{className:"admin-mono",children:s.total_days}),e.jsxs("td",{className:"admin-mono",children:[s.total_hours,"h"]}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${D[s.status]||""}`,children:z[s.status]||s.status})}),e.jsx("td",{style:{maxWidth:"200px"},children:k(s)}),e.jsx("td",{className:"admin-mono",style:{whiteSpace:"nowrap"},children:S(s.created_at)}),e.jsx("td",{children:s.status==="pending"&&e.jsx("button",{onClick:()=>t({open:!0,id:s.id}),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Zrušit"})})]},s.id))})]})})})}),e.jsx(b,{isOpen:o.open,onClose:()=>t({open:!1,id:null}),onConfirm:f,title:"Zrušit žádost",message:"Opravdu chcete zrušit tuto žádost o nepřítomnost?",confirmText:"Zrušit žádost",type:"warning",loading:y})]})}export{A as default}; diff --git a/dist/assets/OfferDetail-uZQN0hWh.js b/dist/assets/OfferDetail-CToaKJtE.js similarity index 99% rename from dist/assets/OfferDetail-uZQN0hWh.js rename to dist/assets/OfferDetail-CToaKJtE.js index cf45c84..c8f1b63 100644 --- a/dist/assets/OfferDetail-uZQN0hWh.js +++ b/dist/assets/OfferDetail-CToaKJtE.js @@ -1 +1 @@ -import{j as e,m as L,A as Ce}from"./vendor-animation-0s3FMHwK.js";import{r as o,h as ze,g as De,L as ye}from"./vendor-react-BVs3cwbi.js";import{g as te,c as A,a as Pe,u as Ae,b as Te,F,A as ve,C as ge}from"./index-BrM8fzBu.js";import{F as $e}from"./Forbidden-D25jV3Oq.js";import{u as Oe,a as fe,b as Ie,D as Fe,r as Me,c as Be,S as Ee,v as Re,d as Le,e as Ze,K as We,T as Ve,P as He}from"./useSortableList-CgbuKaxB.js";import{a9 as Ke}from"./vendor-utils-Dyr8OjFr.js";import qe from"./RichEditor-Bfur5pi6.js";function Ue({items:j,setItems:c,updateItem:u,addItem:b,removeItem:z,itemTemplates:C,showItemTemplateMenu:T,setShowItemTemplateMenu:_,addItemFromTemplate:$,totals:i,currency:v,applyVat:k,vatRate:x,itemsError:l,readOnly:y}){const Z=Oe(fe(He,{activationConstraint:{distance:5}}),fe(Ve,{activationConstraint:{delay:200,tolerance:5}}),fe(We)),{handleDragEnd:p}=Ie(c,"_key");return e.jsxs(L.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),l&&e.jsx("span",{className:"admin-form-error",children:l})]}),!y&&e.jsxs("div",{style:{display:"flex",gap:"0.5rem",position:"relative"},children:[C.length>0&&e.jsxs("div",{style:{position:"relative"},children:[e.jsx("button",{type:"button",onClick:()=>_(d=>!d),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Ze šablony"}),T&&e.jsx("div",{className:"offers-template-menu",children:C.map(d=>e.jsxs("div",{className:"offers-template-menu-item",onClick:()=>$(d),children:[e.jsx("div",{className:"fw-500",children:d.name}),d.default_price>0&&e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:Number(d.default_price).toFixed(2)})]},d.id))})]}),e.jsx("button",{type:"button",onClick:b,className:"admin-btn admin-btn-primary admin-btn-sm",children:"+ Přidat položku"})]})]}),e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[!y&&e.jsx("th",{style:{width:"2rem"}}),e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis položky"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"4.5rem",textAlign:"center"},children:"V ceně"}),e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Celkem"}),!y&&e.jsx("th",{style:{width:"2.5rem",textAlign:"center"}})]})}),e.jsx(Fe,{sensors:Z,collisionDetection:Be,onDragEnd:p,modifiers:[Me],children:e.jsx(Ee,{items:j.map(d=>String(d._key)),strategy:Re,children:e.jsx("tbody",{children:j.map((d,g)=>{const D=(Number(d.quantity)||0)*(Number(d.unit_price)||0);return e.jsx(Le,{id:String(d._key),disabled:y,children:({attributes:I,listeners:P})=>e.jsxs(e.Fragment,{children:[!y&&e.jsx("td",{style:{width:"2rem"},children:e.jsx(Ze,{listeners:P,attributes:I})}),e.jsx("td",{style:{color:"var(--text-tertiary)",textAlign:"center",fontWeight:500},children:g+1}),e.jsxs("td",{children:[e.jsx("input",{type:"text",value:d.description,onChange:w=>u(g,"description",w.target.value),className:"admin-form-input",placeholder:"Název položky",style:{marginBottom:"0.5rem",fontWeight:500},readOnly:y}),e.jsx("input",{type:"text",value:d.item_description,onChange:w=>u(g,"item_description",w.target.value),className:"admin-form-input",placeholder:"Podrobný popis (volitelný)",style:{fontSize:"0.8rem",opacity:.8},readOnly:y})]}),e.jsx("td",{children:e.jsx("input",{type:"number",value:d.quantity,onChange:w=>u(g,"quantity",parseFloat(w.target.value)||0),className:"admin-form-input",min:"0",step:"1",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},readOnly:y})}),e.jsx("td",{children:e.jsx("input",{type:"text",value:d.unit,onChange:w=>u(g,"unit",w.target.value),className:"admin-form-input",placeholder:"hod",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},readOnly:y})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:d.unit_price,onChange:w=>u(g,"unit_price",parseFloat(w.target.value)||0),className:"admin-form-input",min:"0",step:"0.01",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"},readOnly:y})}),e.jsx("td",{style:{textAlign:"center"},children:e.jsxs("label",{className:"admin-form-checkbox",style:{justifyContent:"center"},children:[e.jsx("input",{type:"checkbox",checked:d.is_included_in_total,onChange:w=>u(g,"is_included_in_total",w.target.checked),disabled:y}),e.jsx("span",{})]})}),e.jsx("td",{style:{textAlign:"right",fontWeight:600,whiteSpace:"nowrap",fontSize:"0.875rem"},children:te(D,v)}),!y&&e.jsx("td",{children:j.length>1&&e.jsx("button",{type:"button",onClick:()=>z(g),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})]})},d._key)})})})})]})}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:te(i.subtotal,v)})]}),k&&e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH (",x,"%):"]}),e.jsx("span",{children:te(i.vatAmount,v)})]}),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:te(i.total,v)})]})]})]})}function Je({sections:j,addSection:c,removeSection:u,updateSection:b,moveSection:z,scopeTemplates:C,showScopeTemplateMenu:T,setShowScopeTemplateMenu:_,loadScopeTemplate:$,form:i,updateForm:v,readOnly:k}){return e.jsxs(L.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Rozsah projektu"}),!k&&e.jsxs("div",{style:{display:"flex",gap:"0.5rem",position:"relative"},children:[C.length>0&&e.jsxs("div",{style:{position:"relative"},children:[e.jsx("button",{type:"button",onClick:()=>_(x=>!x),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Ze šablony"}),T&&e.jsx("div",{className:"offers-template-menu",children:C.map(x=>e.jsx("div",{className:"offers-template-menu-item",onClick:()=>$(x),children:x.name},x.id))})]}),e.jsx("button",{type:"button",onClick:c,className:"admin-btn admin-btn-primary admin-btn-sm",children:"+ Přidat sekci"})]})]}),e.jsx("div",{className:"admin-form",children:e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Název rozsahu"}),e.jsx("input",{type:"text",value:i.scope_title,onChange:x=>v("scope_title",x.target.value),className:"admin-form-input",placeholder:"Rozsah projektu",readOnly:k})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Popis rozsahu"}),e.jsx("input",{type:"text",value:i.scope_description,onChange:x=>v("scope_description",x.target.value),className:"admin-form-input",placeholder:"Volitelný popis",readOnly:k})]})]})}),j.length===0?e.jsx("div",{className:"admin-empty-state",style:{padding:"2rem"},children:e.jsx("p",{style:{color:"var(--text-tertiary)"},children:'Žádné sekce rozsahu. Klikněte na "Přidat sekci" pro přidání.'})}):e.jsx("div",{className:"offers-scope-list",children:j.map((x,l)=>e.jsxs("div",{className:"offers-scope-section",children:[e.jsxs("div",{className:"offers-scope-section-header",children:[e.jsxs("span",{className:"offers-scope-number",children:[l+1,"."]}),e.jsx("span",{className:"offers-scope-title",children:i.language==="CZ"&&x.title_cz||x.title||`Sekce ${l+1}`}),!k&&e.jsxs("div",{className:"offers-scope-actions",children:[e.jsx("button",{type:"button",onClick:()=>z(l,-1),disabled:l===0,className:"admin-btn-icon",title:"Nahoru","aria-label":"Nahoru",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>z(l,1),disabled:l===j.length-1,className:"admin-btn-icon",title:"Dolů","aria-label":"Dolů",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})}),e.jsx("button",{type:"button",onClick:()=>u(l),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsxs("label",{className:"admin-form-label",children:[e.jsx("span",{className:"offers-lang-badge",children:"EN"}),"Název sekce"]}),e.jsx("input",{type:"text",value:x.title,onChange:y=>b(l,"title",y.target.value),className:"admin-form-input",placeholder:"Název sekce (anglicky)",readOnly:k})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsxs("label",{className:"admin-form-label",children:[e.jsx("span",{className:"offers-lang-badge offers-lang-badge-cz",children:"CZ"}),"Název sekce"]}),e.jsx("input",{type:"text",value:x.title_cz,onChange:y=>b(l,"title_cz",y.target.value),className:"admin-form-input",placeholder:"Název sekce (česky)",readOnly:k})]})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Obsah"}),k?x.content&&e.jsx("div",{className:"offers-scope-content rich-text-view",style:{padding:"1rem"},dangerouslySetInnerHTML:{__html:Ke.sanitize(x.content)}}):e.jsx(qe,{value:x.content,onChange:y=>b(l,"content",y),placeholder:"Obsah sekce...",minHeight:"150px"})]})]})]},x._key||l))})]})}function Ge({customers:j,customerId:c,customerName:u,onSelect:b,onClear:z,error:C,readOnly:T}){const[_,$]=o.useState(""),[i,v]=o.useState(!1);o.useEffect(()=>{const l=()=>v(!1);if(i)return document.addEventListener("click",l),()=>document.removeEventListener("click",l)},[i]);const k=o.useMemo(()=>{if(!_)return j;const l=_.toLowerCase();return j.filter(y=>(y.name||"").toLowerCase().includes(l)||(y.company_id||"").includes(_)||(y.city||"").toLowerCase().includes(l))},[j,_]),x=l=>{b(l),$(""),v(!1)};return e.jsxs("div",{className:`admin-form-group${C?" has-error":""}`,children:[e.jsx("label",{className:"admin-form-label required",children:"Zákazník"}),c&&e.jsxs("div",{className:"offers-customer-selected",children:[e.jsx("span",{children:u}),!T&&e.jsx("button",{type:"button",onClick:z,className:"admin-btn-icon",title:"Odebrat zákazníka","aria-label":"Odebrat zákazníka",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),!c&&!T&&e.jsxs("div",{className:"offers-customer-select",onClick:l=>l.stopPropagation(),children:[e.jsx("input",{type:"text",value:_,onChange:l=>{$(l.target.value),v(!0)},onFocus:()=>v(!0),className:"admin-form-input",placeholder:"Hledat zákazníka..."}),i&&e.jsx("div",{className:"offers-customer-dropdown",children:k.length===0?e.jsx("div",{className:"offers-customer-dropdown-empty",children:"Žádní zákazníci"}):k.slice(0,10).map(l=>e.jsxs("div",{className:"offers-customer-dropdown-item",onMouseDown:()=>x(l),children:[e.jsx("div",{children:l.name}),l.city&&e.jsx("div",{children:l.city})]},l.id))})]}),C&&e.jsx("span",{className:"admin-form-error",children:C})]})}const M="/api/admin";let B=0;const be=()=>({_key:`item-${++B}`,description:"",item_description:"",quantity:1,unit:"",unit_price:0,is_included_in_total:!0}),Ye=()=>({_key:`sec-${++B}`,title:"",title_cz:"",content:""});function Qe(j){return j.map(c=>({...c,_key:c._key||`item-${++B}`}))}function Xe(j){return j.map(c=>({...c,_key:c._key||`sec-${++B}`}))}const q="boha_offer_draft",et={quotation_number:"",project_code:"",customer_id:null,customer_name:"",created_at:new Date().toISOString().split("T")[0],valid_until:new Date(Date.now()+30*24*60*60*1e3).toISOString().split("T")[0],currency:"EUR",language:"EN",vat_rate:21,apply_vat:!1,exchange_rate:"",exchange_rate_date:"",scope_title:"",scope_description:""};function tt({id:j,isEdit:c,alert:u,navigate:b}){const[z,C]=o.useState(c),[T,_]=o.useState(!1),[$,i]=o.useState({}),[v,k]=o.useState([]),[x,l]=o.useState([]),[y,Z]=o.useState([]),[p,d]=o.useState({...et}),[g,D]=o.useState([be()]),[I,P]=o.useState([]),[w,se]=o.useState(null),[ne,U]=o.useState("active"),[W,V]=o.useState(null),J=o.useRef({form:p,items:g,sections:I}),G=o.useRef(!1);o.useEffect(()=>{(async()=>{try{const[a,s,m]=await Promise.all([A(`${M}/customers.php`),A(`${M}/offers-templates.php?action=items`),A(`${M}/offers-templates.php?action=scopes`)]),n=await a.json(),h=await s.json(),f=await m.json();n.success&&k(n.data.customers),h.success&&l(h.data.templates),f.success&&Z(f.data.templates)}catch{}})()},[]),o.useEffect(()=>{if(!c)try{const t=localStorage.getItem(q);if(!t)return;const a=JSON.parse(t);if(!a||typeof a!="object"||!a.form||!Array.isArray(a.items)){localStorage.removeItem(q);return}const{form:s,items:m,sections:n,savedAt:h}=a;d(f=>({...f,project_code:s.project_code??f.project_code,customer_id:s.customer_id??f.customer_id,customer_name:s.customer_name??f.customer_name,created_at:s.created_at??f.created_at,valid_until:s.valid_until??f.valid_until,currency:s.currency??f.currency,language:s.language??f.language,vat_rate:s.vat_rate??f.vat_rate,apply_vat:s.apply_vat??f.apply_vat,exchange_rate:s.exchange_rate??f.exchange_rate,exchange_rate_date:s.exchange_rate_date??f.exchange_rate_date,scope_title:s.scope_title??f.scope_title,scope_description:s.scope_description??f.scope_description})),m.length&&D(Qe(m)),Array.isArray(n)&&n.length&&P(Xe(n)),G.current=!0,h&&V(new Date(h))}catch{try{localStorage.removeItem(q)}catch{}}},[c]),o.useEffect(()=>{J.current={form:p,items:g,sections:I}},[p,g,I]),o.useEffect(()=>{if(c)return;const t=setTimeout(()=>{try{const{form:a,items:s,sections:m}=J.current,{quotation_number:n,...h}=a,f=new Date().toISOString();localStorage.setItem(q,JSON.stringify({form:h,items:s,sections:m,savedAt:f})),V(new Date(f))}catch{}},500);return()=>clearTimeout(t)},[p,g,I,c]),o.useEffect(()=>{if(!c){const a=async()=>{try{const n=await(await A(`${M}/offers.php?action=next_number`)).json();n.success&&d(h=>({...h,quotation_number:n.data.number}))}catch{}},s=async()=>{try{const n=await(await A(`${M}/company-settings.php`)).json();if(n.success&&!G.current){const h=n.data;d(f=>({...f,currency:h.default_currency||f.currency,vat_rate:h.default_vat_rate||f.vat_rate}))}}catch{}};a(),s();return}(async()=>{try{const a=await A(`${M}/offers.php?action=detail&id=${j}`);if(a.status===401)return;const s=await a.json();s.success?ie(s.data):(u.error(s.error||"Nepodařilo se načíst nabídku"),b("/offers"))}catch{u.error("Chyba připojení"),b("/offers")}finally{C(!1)}})()},[c,j,u,b]);const ie=t=>{d({quotation_number:t.quotation_number||"",project_code:t.project_code||"",customer_id:t.customer_id||null,customer_name:t.customer_name||"",created_at:(t.created_at||"").substring(0,10),valid_until:(t.valid_until||"").substring(0,10),currency:t.currency||"EUR",language:t.language||"EN",vat_rate:t.vat_rate||21,apply_vat:!!t.apply_vat,exchange_rate:t.exchange_rate||"",exchange_rate_date:t.exchange_rate_date||"",scope_title:t.scope_title||"",scope_description:t.scope_description||""}),t.items?.length&&D(t.items.map(a=>({_key:`item-${++B}`,description:a.description||"",item_description:a.item_description||"",quantity:Number(a.quantity)||1,unit:a.unit||"",unit_price:Number(a.unit_price)||0,is_included_in_total:!!a.is_included_in_total}))),t.sections?.length&&(D(a=>a),P(t.sections.map(a=>({_key:`sec-${++B}`,title:a.title||"",title_cz:a.title_cz||"",content:a.content||""})))),se(t.order||null),U(t.status||"active")},re=o.useMemo(()=>{const t=g.reduce((s,m)=>m.is_included_in_total?s+(Number(m.quantity)||0)*(Number(m.unit_price)||0):s,0),a=p.apply_vat?t*((Number(p.vat_rate)||0)/100):0;return{subtotal:t,vatAmount:a,total:t+a}},[g,p.apply_vat,p.vat_rate]),Y=o.useCallback(()=>{try{localStorage.removeItem(q)}catch{}V(null)},[]),oe=o.useMemo(()=>W?W.toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"}):null,[W]),le=(t,a)=>d(s=>({...s,[t]:a})),ce=t=>{d(a=>({...a,customer_id:t.id,customer_name:t.name})),i(a=>({...a,customer_id:void 0}))},de=()=>{d(t=>({...t,customer_id:null,customer_name:""}))},me=(t,a,s)=>{D(m=>m.map((n,h)=>h===t?{...n,[a]:s}:n))},ue=()=>D(t=>[...t,be()]),H=t=>{D(a=>a.length>1?a.filter((s,m)=>m!==t):a)},pe=t=>{D(a=>[...a,{_key:`item-${++B}`,description:t.name||"",item_description:t.description||"",quantity:1,unit:"",unit_price:Number(t.default_price)||0,is_included_in_total:!0}])},Q=()=>P(t=>[...t,Ye()]),E=t=>{P(a=>a.filter((s,m)=>m!==t))},X=(t,a,s)=>{P(m=>m.map((n,h)=>h===t?{...n,[a]:s}:n))},ee=(t,a)=>{P(s=>{const m=[...s],n=t+a;return n<0||n>=m.length?s:([m[t],m[n]]=[m[n],m[t]],m)})},R=async t=>{try{const s=await(await A(`${M}/offers-templates.php?action=scope_detail&id=${t.id}`)).json();if(s.success){const m=s.data;if(d(n=>({...n,scope_description:m.description||n.scope_description})),m.sections){const n=m.sections.map(h=>({_key:`sec-${++B}`,title:h.title||"",title_cz:h.title_cz||"",content:h.content||""}));P(h=>[...h,...n])}u.success(`Načtena šablona "${t.name}"`)}}catch{u.error("Nepodařilo se načíst šablonu")}},he=async()=>{const t={};if(p.customer_id||(t.customer_id="Vyberte zákazníka"),p.created_at||(t.created_at="Zadejte datum"),p.valid_until||(t.valid_until="Zadejte datum"),(g.length===0||g.every(a=>!a.description.trim()))&&(t.items="Přidejte alespoň jednu položku"),i(t),!(Object.keys(t).length>0)){_(!0);try{const a=K(),s=c?`${M}/offers.php?id=${j}`:`${M}/offers.php`,n=await(await A(s,{method:c?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();if(n.success){if(u.success(n.message||(c?"Nabídka byla uložena":"Nabídka byla vytvořena")),!c&&n.data?.id){Y();const h=n.data.id;setTimeout(()=>b(`/offers/${h}`,{replace:!0}),300)}}else u.error(n.error||"Nepodařilo se uložit nabídku")}catch{u.error("Chyba připojení")}finally{_(!1)}}},K=()=>({quotation:{project_code:p.project_code,customer_id:p.customer_id,created_at:p.created_at,valid_until:p.valid_until,currency:p.currency,language:p.language,vat_rate:p.vat_rate,apply_vat:p.apply_vat,exchange_rate:p.exchange_rate||null,exchange_rate_date:p.exchange_rate_date||null,scope_title:p.scope_title,scope_description:p.scope_description},items:g.map((t,a)=>({...t,position:a+1})),sections:I.map((t,a)=>({...t,position:a+1}))});return{loading:z,saving:T,errors:$,setErrors:i,form:p,updateForm:le,items:g,setItems:D,sections:I,customers:v,itemTemplates:x,scopeTemplates:y,orderInfo:w,offerStatus:ne,setOfferStatus:U,totals:re,draftSavedAtLabel:oe,clearDraft:Y,selectCustomer:ce,clearCustomer:de,updateItem:me,addItem:ue,removeItem:H,addItemFromTemplate:pe,addSection:Q,removeSection:E,updateSection:X,moveSection:ee,loadScopeTemplate:R,handleSave:he}}const ae="/api/admin";function dt(){const{id:j}=ze(),c=!!j,u=Pe(),{hasPermission:b}=Ae(),z=De(),{loading:C,saving:T,errors:_,setErrors:$,form:i,updateForm:v,items:k,setItems:x,sections:l,customers:y,itemTemplates:Z,scopeTemplates:p,orderInfo:d,offerStatus:g,setOfferStatus:D,totals:I,draftSavedAtLabel:P,selectCustomer:w,clearCustomer:se,updateItem:ne,addItem:U,removeItem:W,addItemFromTemplate:V,addSection:J,removeSection:G,updateSection:ie,moveSection:re,loadScopeTemplate:Y,handleSave:oe}=tt({id:j,isEdit:c,alert:u,navigate:z}),[le,ce]=o.useState(!1),[de,me]=o.useState(!1),[ue,H]=o.useState(!1),[pe,Q]=o.useState(!1),[E,X]=o.useState(!1),[ee,R]=o.useState(!1),[he,K]=o.useState(!1),[t,a]=o.useState(!1),[s,m]=o.useState(""),[n,h]=o.useState(null),[f,xe]=o.useState(!1);Te(ee);const N=g==="invalidated",_e=c&&!N&&!d&&i.valid_until&&new Date(i.valid_until){if(!s.trim()){u.error("Číslo objednávky zákazníka je povinné");return}X(!0);try{const r=new FormData;r.append("quotationId",j),r.append("customerOrderNumber",s.trim()),n&&r.append("attachment",n);const O=await(await A(`${ae}/orders.php`,{method:"POST",body:r})).json();O.success?(R(!1),u.success(O.message||"Objednávka byla vytvořena"),z(`/orders/${O.data.order_id}`)):u.error(O.error||"Nepodařilo se vytvořit objednávku")}catch{u.error("Chyba připojení")}finally{X(!1)}},Ne=async()=>{a(!0);try{const S=await(await A(`${ae}/offers.php?action=invalidate&id=${j}`,{method:"POST"})).json();S.success?(K(!1),D("invalidated"),u.success(S.message||"Nabídka byla zneplatněna")):u.error(S.error||"Nepodařilo se zneplatnit nabídku")}catch{u.error("Chyba připojení")}finally{a(!1)}},ke=async()=>{Q(!0);try{const S=await(await A(`${ae}/offers.php?id=${j}`,{method:"DELETE"})).json();S.success?(u.success(S.message||"Nabídka byla smazána"),z("/offers")):u.error(S.error||"Nepodařilo se smazat nabídku")}catch{u.error("Chyba připojení")}finally{Q(!1),H(!1)}},we=async()=>{if(!(!c||f)){xe(!0);try{const r=await A(`${ae}/offers-pdf.php?id=${j}`);if(r.status===401)return;if(!r.ok){u.error("Nepodařilo se vygenerovat PDF");return}const S=await r.text(),O=window.open("","_blank");O?(O.document.open(),O.document.write(S),O.document.close(),O.onload=()=>O.print()):u.error("Prohlížeč zablokoval vyskakovací okno")}catch{u.error("Chyba při generování PDF")}finally{xe(!1)}}},Se=c?N?"offers.view":"offers.edit":"offers.create";return b(Se)?C?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row gap-2",children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(r=>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/2"})]},r))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(r=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-full"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-3/4"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-1/2"})})]},r))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(r=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-full"})]},r))})})]}):e.jsxs("div",{children:[e.jsxs(L.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(ye,{to:"/offers",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsxs("div",{children:[e.jsxs("h1",{className:"admin-page-title",children:[c?`Nabídka ${i.quotation_number}`:"Nová nabídka",N&&e.jsx("span",{className:"admin-badge admin-badge-danger",style:{marginLeft:"0.75rem",verticalAlign:"middle",fontSize:"0.75rem"},children:"Zneplatněna"})]}),!c&&P&&e.jsxs("div",{className:"offers-draft-indicator",children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}),"Koncept uložen ",P]})]})]}),e.jsxs("div",{className:"admin-page-actions",children:[c&&b("offers.export")&&e.jsx("button",{onClick:we,className:"admin-btn admin-btn-secondary",disabled:f,children:f?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"PDF..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"PDF"]})}),c&&!N&&b("orders.create")&&!d&&e.jsxs("button",{onClick:()=>{m(""),h(null),R(!0)},className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]}),"Vytvořit objednávku"]}),c&&d&&e.jsxs(ye,{to:`/orders/${d.id}`,className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"Objednávka ",d.order_number]}),_e&&b("offers.edit")&&e.jsxs("button",{onClick:()=>K(!0),className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"4.93",y1:"4.93",x2:"19.07",y2:"19.07"})]}),"Zneplatnit"]}),!N&&e.jsx("button",{onClick:oe,className:"admin-btn admin-btn-primary",disabled:T,children:T?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"}),c&&b("offers.delete")&&e.jsx("button",{onClick:()=>H(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsxs(L.div,{className:`offers-editor-section${N?" offers-readonly":""}`,initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(F,{label:"Číslo nabídky",children:e.jsx("input",{type:"text",value:i.quotation_number,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(F,{label:"Kód projektu",children:e.jsx("input",{type:"text",value:i.project_code,onChange:r=>v("project_code",r.target.value),className:"admin-form-input",placeholder:"Volitelný kód projektu",readOnly:N})}),e.jsx(Ge,{customers:y,customerId:i.customer_id,customerName:i.customer_name,onSelect:w,onClear:se,error:_.customer_id,readOnly:N})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(F,{label:"Datum vytvoření",error:_.created_at,required:!0,children:N?e.jsx("input",{type:"text",value:i.created_at,className:"admin-form-input",readOnly:!0}):e.jsx(ve,{mode:"date",value:i.created_at,onChange:r=>{v("created_at",r),$(S=>({...S,created_at:void 0}))}})}),e.jsx(F,{label:"Platnost do",error:_.valid_until,required:!0,children:N?e.jsx("input",{type:"text",value:i.valid_until,className:"admin-form-input",readOnly:!0}):e.jsx(ve,{mode:"date",value:i.valid_until,onChange:r=>{v("valid_until",r),$(S=>({...S,valid_until:void 0}))}})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(F,{label:"Měna",children:e.jsxs("select",{value:i.currency,onChange:r=>v("currency",r.target.value),className:"admin-form-select",disabled:N,children:[e.jsx("option",{value:"EUR",children:"EUR (€)"}),e.jsx("option",{value:"USD",children:"USD ($)"}),e.jsx("option",{value:"CZK",children:"CZK (Kč)"}),e.jsx("option",{value:"GBP",children:"GBP (£)"})]})}),e.jsx(F,{label:"Jazyk nabídky",children:e.jsxs("select",{value:i.language,onChange:r=>v("language",r.target.value),className:"admin-form-select",disabled:N,children:[e.jsx("option",{value:"EN",children:"English"}),e.jsx("option",{value:"CZ",children:"Čeština"})]})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(F,{label:"Sazba DPH (%)",children:e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("input",{type:"number",value:i.vat_rate,onChange:r=>v("vat_rate",parseFloat(r.target.value)||0),className:"admin-form-input flex-1",step:"0.1",readOnly:N}),e.jsxs("label",{className:"admin-form-checkbox",style:{whiteSpace:"nowrap"},children:[e.jsx("input",{type:"checkbox",checked:i.apply_vat,onChange:r=>v("apply_vat",r.target.checked),disabled:N}),e.jsx("span",{children:"Účtovat DPH"})]})]})}),e.jsx(F,{label:"Směnný kurz",children:e.jsx("input",{type:"number",value:i.exchange_rate,onChange:r=>v("exchange_rate",r.target.value),className:"admin-form-input",placeholder:"Volitelný",step:"0.0001",readOnly:N})})]})]})]}),e.jsx(Ue,{items:k,setItems:x,updateItem:ne,addItem:U,removeItem:W,itemTemplates:Z,showItemTemplateMenu:le,setShowItemTemplateMenu:ce,addItemFromTemplate:V,totals:I,currency:i.currency,applyVat:i.apply_vat,vatRate:i.vat_rate,itemsError:_.items,readOnly:N}),e.jsx(Je,{sections:l,addSection:J,removeSection:G,updateSection:ie,moveSection:re,scopeTemplates:p,showScopeTemplateMenu:de,setShowScopeTemplateMenu:me,loadScopeTemplate:Y,form:i,updateForm:v,readOnly:N}),e.jsx(Ce,{children:ee&&e.jsxs(L.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:()=>!E&&R(!1)}),e.jsxs(L.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Vytvořit objednávku"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(F,{label:"Číslo objednávky zákazníka",required:!0,children:e.jsx("input",{type:"text",value:s,onChange:r=>m(r.target.value),onKeyDown:r=>r.key==="Enter"&&!E&&je(),className:"admin-form-input",placeholder:"Např. PO-2026-001",autoFocus:!0})}),e.jsxs(F,{label:"Příloha (PDF)",children:[n?e.jsxs("div",{className:"flex-row gap-2",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent-color)",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),e.jsxs("span",{style:{fontSize:"0.875rem"},children:[n.name," ",e.jsxs("span",{className:"text-tertiary",children:["(",(n.size/1024).toFixed(0)," KB)"]})]}),e.jsx("button",{type:"button",onClick:()=>h(null),className:"admin-btn-icon",title:"Odebrat",style:{marginLeft:"auto"},children:e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}):e.jsxs("label",{className:"admin-btn admin-btn-secondary admin-btn-sm",style:{cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"0.4rem"},children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Vybrat soubor",e.jsx("input",{type:"file",accept:"application/pdf",onChange:r=>h(r.target.files[0]||null),style:{display:"none"}})]}),e.jsx("small",{className:"admin-form-hint",style:{marginTop:"0.25rem"},children:"Max 10 MB"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{onClick:()=>R(!1),className:"admin-btn admin-btn-secondary",disabled:E,children:"Zrušit"}),e.jsx("button",{onClick:je,className:"admin-btn admin-btn-primary",disabled:E||!s.trim(),children:E?"Vytváření...":"Vytvořit"})]})]})]})}),e.jsx(ge,{isOpen:he,onClose:()=>K(!1),onConfirm:Ne,title:"Zneplatnit nabídku",message:`Opravdu chcete zneplatnit nabídku "${i.quotation_number}"? Nabídka bude pouze pro čtení a nepůjde upravovat.`,confirmText:"Zneplatnit",cancelText:"Zrušit",type:"danger",loading:t}),e.jsx(ge,{isOpen:ue,onClose:()=>H(!1),onConfirm:ke,title:"Smazat nabídku",message:`Opravdu chcete smazat nabídku "${i.quotation_number}"? Budou smazány i všechny položky a sekce. Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:pe})]}):e.jsx($e,{})}export{dt as default}; +import{j as e,m as L,A as Ce}from"./vendor-animation-0s3FMHwK.js";import{r as o,h as ze,g as De,L as ye}from"./vendor-react-BVs3cwbi.js";import{g as te,c as A,a as Pe,u as Ae,b as Te,F,A as ve,C as ge}from"./index-Bay45BGf.js";import{F as $e}from"./Forbidden-D25jV3Oq.js";import{u as Oe,a as fe,b as Ie,D as Fe,r as Me,c as Be,S as Ee,v as Re,d as Le,e as Ze,K as We,T as Ve,P as He}from"./useSortableList-CgbuKaxB.js";import{a9 as Ke}from"./vendor-utils-Dyr8OjFr.js";import qe from"./RichEditor-Bfur5pi6.js";function Ue({items:j,setItems:c,updateItem:u,addItem:b,removeItem:z,itemTemplates:C,showItemTemplateMenu:T,setShowItemTemplateMenu:_,addItemFromTemplate:$,totals:i,currency:v,applyVat:k,vatRate:x,itemsError:l,readOnly:y}){const Z=Oe(fe(He,{activationConstraint:{distance:5}}),fe(Ve,{activationConstraint:{delay:200,tolerance:5}}),fe(We)),{handleDragEnd:p}=Ie(c,"_key");return e.jsxs(L.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),l&&e.jsx("span",{className:"admin-form-error",children:l})]}),!y&&e.jsxs("div",{style:{display:"flex",gap:"0.5rem",position:"relative"},children:[C.length>0&&e.jsxs("div",{style:{position:"relative"},children:[e.jsx("button",{type:"button",onClick:()=>_(d=>!d),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Ze šablony"}),T&&e.jsx("div",{className:"offers-template-menu",children:C.map(d=>e.jsxs("div",{className:"offers-template-menu-item",onClick:()=>$(d),children:[e.jsx("div",{className:"fw-500",children:d.name}),d.default_price>0&&e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:Number(d.default_price).toFixed(2)})]},d.id))})]}),e.jsx("button",{type:"button",onClick:b,className:"admin-btn admin-btn-primary admin-btn-sm",children:"+ Přidat položku"})]})]}),e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[!y&&e.jsx("th",{style:{width:"2rem"}}),e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis položky"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"4.5rem",textAlign:"center"},children:"V ceně"}),e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Celkem"}),!y&&e.jsx("th",{style:{width:"2.5rem",textAlign:"center"}})]})}),e.jsx(Fe,{sensors:Z,collisionDetection:Be,onDragEnd:p,modifiers:[Me],children:e.jsx(Ee,{items:j.map(d=>String(d._key)),strategy:Re,children:e.jsx("tbody",{children:j.map((d,g)=>{const D=(Number(d.quantity)||0)*(Number(d.unit_price)||0);return e.jsx(Le,{id:String(d._key),disabled:y,children:({attributes:I,listeners:P})=>e.jsxs(e.Fragment,{children:[!y&&e.jsx("td",{style:{width:"2rem"},children:e.jsx(Ze,{listeners:P,attributes:I})}),e.jsx("td",{style:{color:"var(--text-tertiary)",textAlign:"center",fontWeight:500},children:g+1}),e.jsxs("td",{children:[e.jsx("input",{type:"text",value:d.description,onChange:w=>u(g,"description",w.target.value),className:"admin-form-input",placeholder:"Název položky",style:{marginBottom:"0.5rem",fontWeight:500},readOnly:y}),e.jsx("input",{type:"text",value:d.item_description,onChange:w=>u(g,"item_description",w.target.value),className:"admin-form-input",placeholder:"Podrobný popis (volitelný)",style:{fontSize:"0.8rem",opacity:.8},readOnly:y})]}),e.jsx("td",{children:e.jsx("input",{type:"number",value:d.quantity,onChange:w=>u(g,"quantity",parseFloat(w.target.value)||0),className:"admin-form-input",min:"0",step:"1",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},readOnly:y})}),e.jsx("td",{children:e.jsx("input",{type:"text",value:d.unit,onChange:w=>u(g,"unit",w.target.value),className:"admin-form-input",placeholder:"hod",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},readOnly:y})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:d.unit_price,onChange:w=>u(g,"unit_price",parseFloat(w.target.value)||0),className:"admin-form-input",min:"0",step:"0.01",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"},readOnly:y})}),e.jsx("td",{style:{textAlign:"center"},children:e.jsxs("label",{className:"admin-form-checkbox",style:{justifyContent:"center"},children:[e.jsx("input",{type:"checkbox",checked:d.is_included_in_total,onChange:w=>u(g,"is_included_in_total",w.target.checked),disabled:y}),e.jsx("span",{})]})}),e.jsx("td",{style:{textAlign:"right",fontWeight:600,whiteSpace:"nowrap",fontSize:"0.875rem"},children:te(D,v)}),!y&&e.jsx("td",{children:j.length>1&&e.jsx("button",{type:"button",onClick:()=>z(g),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})]})},d._key)})})})})]})}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:te(i.subtotal,v)})]}),k&&e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH (",x,"%):"]}),e.jsx("span",{children:te(i.vatAmount,v)})]}),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:te(i.total,v)})]})]})]})}function Je({sections:j,addSection:c,removeSection:u,updateSection:b,moveSection:z,scopeTemplates:C,showScopeTemplateMenu:T,setShowScopeTemplateMenu:_,loadScopeTemplate:$,form:i,updateForm:v,readOnly:k}){return e.jsxs(L.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Rozsah projektu"}),!k&&e.jsxs("div",{style:{display:"flex",gap:"0.5rem",position:"relative"},children:[C.length>0&&e.jsxs("div",{style:{position:"relative"},children:[e.jsx("button",{type:"button",onClick:()=>_(x=>!x),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Ze šablony"}),T&&e.jsx("div",{className:"offers-template-menu",children:C.map(x=>e.jsx("div",{className:"offers-template-menu-item",onClick:()=>$(x),children:x.name},x.id))})]}),e.jsx("button",{type:"button",onClick:c,className:"admin-btn admin-btn-primary admin-btn-sm",children:"+ Přidat sekci"})]})]}),e.jsx("div",{className:"admin-form",children:e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Název rozsahu"}),e.jsx("input",{type:"text",value:i.scope_title,onChange:x=>v("scope_title",x.target.value),className:"admin-form-input",placeholder:"Rozsah projektu",readOnly:k})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Popis rozsahu"}),e.jsx("input",{type:"text",value:i.scope_description,onChange:x=>v("scope_description",x.target.value),className:"admin-form-input",placeholder:"Volitelný popis",readOnly:k})]})]})}),j.length===0?e.jsx("div",{className:"admin-empty-state",style:{padding:"2rem"},children:e.jsx("p",{style:{color:"var(--text-tertiary)"},children:'Žádné sekce rozsahu. Klikněte na "Přidat sekci" pro přidání.'})}):e.jsx("div",{className:"offers-scope-list",children:j.map((x,l)=>e.jsxs("div",{className:"offers-scope-section",children:[e.jsxs("div",{className:"offers-scope-section-header",children:[e.jsxs("span",{className:"offers-scope-number",children:[l+1,"."]}),e.jsx("span",{className:"offers-scope-title",children:i.language==="CZ"&&x.title_cz||x.title||`Sekce ${l+1}`}),!k&&e.jsxs("div",{className:"offers-scope-actions",children:[e.jsx("button",{type:"button",onClick:()=>z(l,-1),disabled:l===0,className:"admin-btn-icon",title:"Nahoru","aria-label":"Nahoru",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>z(l,1),disabled:l===j.length-1,className:"admin-btn-icon",title:"Dolů","aria-label":"Dolů",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})}),e.jsx("button",{type:"button",onClick:()=>u(l),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsxs("div",{className:"admin-form-group",children:[e.jsxs("label",{className:"admin-form-label",children:[e.jsx("span",{className:"offers-lang-badge",children:"EN"}),"Název sekce"]}),e.jsx("input",{type:"text",value:x.title,onChange:y=>b(l,"title",y.target.value),className:"admin-form-input",placeholder:"Název sekce (anglicky)",readOnly:k})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsxs("label",{className:"admin-form-label",children:[e.jsx("span",{className:"offers-lang-badge offers-lang-badge-cz",children:"CZ"}),"Název sekce"]}),e.jsx("input",{type:"text",value:x.title_cz,onChange:y=>b(l,"title_cz",y.target.value),className:"admin-form-input",placeholder:"Název sekce (česky)",readOnly:k})]})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Obsah"}),k?x.content&&e.jsx("div",{className:"offers-scope-content rich-text-view",style:{padding:"1rem"},dangerouslySetInnerHTML:{__html:Ke.sanitize(x.content)}}):e.jsx(qe,{value:x.content,onChange:y=>b(l,"content",y),placeholder:"Obsah sekce...",minHeight:"150px"})]})]})]},x._key||l))})]})}function Ge({customers:j,customerId:c,customerName:u,onSelect:b,onClear:z,error:C,readOnly:T}){const[_,$]=o.useState(""),[i,v]=o.useState(!1);o.useEffect(()=>{const l=()=>v(!1);if(i)return document.addEventListener("click",l),()=>document.removeEventListener("click",l)},[i]);const k=o.useMemo(()=>{if(!_)return j;const l=_.toLowerCase();return j.filter(y=>(y.name||"").toLowerCase().includes(l)||(y.company_id||"").includes(_)||(y.city||"").toLowerCase().includes(l))},[j,_]),x=l=>{b(l),$(""),v(!1)};return e.jsxs("div",{className:`admin-form-group${C?" has-error":""}`,children:[e.jsx("label",{className:"admin-form-label required",children:"Zákazník"}),c&&e.jsxs("div",{className:"offers-customer-selected",children:[e.jsx("span",{children:u}),!T&&e.jsx("button",{type:"button",onClick:z,className:"admin-btn-icon",title:"Odebrat zákazníka","aria-label":"Odebrat zákazníka",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),!c&&!T&&e.jsxs("div",{className:"offers-customer-select",onClick:l=>l.stopPropagation(),children:[e.jsx("input",{type:"text",value:_,onChange:l=>{$(l.target.value),v(!0)},onFocus:()=>v(!0),className:"admin-form-input",placeholder:"Hledat zákazníka..."}),i&&e.jsx("div",{className:"offers-customer-dropdown",children:k.length===0?e.jsx("div",{className:"offers-customer-dropdown-empty",children:"Žádní zákazníci"}):k.slice(0,10).map(l=>e.jsxs("div",{className:"offers-customer-dropdown-item",onMouseDown:()=>x(l),children:[e.jsx("div",{children:l.name}),l.city&&e.jsx("div",{children:l.city})]},l.id))})]}),C&&e.jsx("span",{className:"admin-form-error",children:C})]})}const M="/api/admin";let B=0;const be=()=>({_key:`item-${++B}`,description:"",item_description:"",quantity:1,unit:"",unit_price:0,is_included_in_total:!0}),Ye=()=>({_key:`sec-${++B}`,title:"",title_cz:"",content:""});function Qe(j){return j.map(c=>({...c,_key:c._key||`item-${++B}`}))}function Xe(j){return j.map(c=>({...c,_key:c._key||`sec-${++B}`}))}const q="boha_offer_draft",et={quotation_number:"",project_code:"",customer_id:null,customer_name:"",created_at:new Date().toISOString().split("T")[0],valid_until:new Date(Date.now()+30*24*60*60*1e3).toISOString().split("T")[0],currency:"EUR",language:"EN",vat_rate:21,apply_vat:!1,exchange_rate:"",exchange_rate_date:"",scope_title:"",scope_description:""};function tt({id:j,isEdit:c,alert:u,navigate:b}){const[z,C]=o.useState(c),[T,_]=o.useState(!1),[$,i]=o.useState({}),[v,k]=o.useState([]),[x,l]=o.useState([]),[y,Z]=o.useState([]),[p,d]=o.useState({...et}),[g,D]=o.useState([be()]),[I,P]=o.useState([]),[w,se]=o.useState(null),[ne,U]=o.useState("active"),[W,V]=o.useState(null),J=o.useRef({form:p,items:g,sections:I}),G=o.useRef(!1);o.useEffect(()=>{(async()=>{try{const[a,s,m]=await Promise.all([A(`${M}/customers.php`),A(`${M}/offers-templates.php?action=items`),A(`${M}/offers-templates.php?action=scopes`)]),n=await a.json(),h=await s.json(),f=await m.json();n.success&&k(n.data.customers),h.success&&l(h.data.templates),f.success&&Z(f.data.templates)}catch{}})()},[]),o.useEffect(()=>{if(!c)try{const t=localStorage.getItem(q);if(!t)return;const a=JSON.parse(t);if(!a||typeof a!="object"||!a.form||!Array.isArray(a.items)){localStorage.removeItem(q);return}const{form:s,items:m,sections:n,savedAt:h}=a;d(f=>({...f,project_code:s.project_code??f.project_code,customer_id:s.customer_id??f.customer_id,customer_name:s.customer_name??f.customer_name,created_at:s.created_at??f.created_at,valid_until:s.valid_until??f.valid_until,currency:s.currency??f.currency,language:s.language??f.language,vat_rate:s.vat_rate??f.vat_rate,apply_vat:s.apply_vat??f.apply_vat,exchange_rate:s.exchange_rate??f.exchange_rate,exchange_rate_date:s.exchange_rate_date??f.exchange_rate_date,scope_title:s.scope_title??f.scope_title,scope_description:s.scope_description??f.scope_description})),m.length&&D(Qe(m)),Array.isArray(n)&&n.length&&P(Xe(n)),G.current=!0,h&&V(new Date(h))}catch{try{localStorage.removeItem(q)}catch{}}},[c]),o.useEffect(()=>{J.current={form:p,items:g,sections:I}},[p,g,I]),o.useEffect(()=>{if(c)return;const t=setTimeout(()=>{try{const{form:a,items:s,sections:m}=J.current,{quotation_number:n,...h}=a,f=new Date().toISOString();localStorage.setItem(q,JSON.stringify({form:h,items:s,sections:m,savedAt:f})),V(new Date(f))}catch{}},500);return()=>clearTimeout(t)},[p,g,I,c]),o.useEffect(()=>{if(!c){const a=async()=>{try{const n=await(await A(`${M}/offers.php?action=next_number`)).json();n.success&&d(h=>({...h,quotation_number:n.data.number}))}catch{}},s=async()=>{try{const n=await(await A(`${M}/company-settings.php`)).json();if(n.success&&!G.current){const h=n.data;d(f=>({...f,currency:h.default_currency||f.currency,vat_rate:h.default_vat_rate||f.vat_rate}))}}catch{}};a(),s();return}(async()=>{try{const a=await A(`${M}/offers.php?action=detail&id=${j}`);if(a.status===401)return;const s=await a.json();s.success?ie(s.data):(u.error(s.error||"Nepodařilo se načíst nabídku"),b("/offers"))}catch{u.error("Chyba připojení"),b("/offers")}finally{C(!1)}})()},[c,j,u,b]);const ie=t=>{d({quotation_number:t.quotation_number||"",project_code:t.project_code||"",customer_id:t.customer_id||null,customer_name:t.customer_name||"",created_at:(t.created_at||"").substring(0,10),valid_until:(t.valid_until||"").substring(0,10),currency:t.currency||"EUR",language:t.language||"EN",vat_rate:t.vat_rate||21,apply_vat:!!t.apply_vat,exchange_rate:t.exchange_rate||"",exchange_rate_date:t.exchange_rate_date||"",scope_title:t.scope_title||"",scope_description:t.scope_description||""}),t.items?.length&&D(t.items.map(a=>({_key:`item-${++B}`,description:a.description||"",item_description:a.item_description||"",quantity:Number(a.quantity)||1,unit:a.unit||"",unit_price:Number(a.unit_price)||0,is_included_in_total:!!a.is_included_in_total}))),t.sections?.length&&(D(a=>a),P(t.sections.map(a=>({_key:`sec-${++B}`,title:a.title||"",title_cz:a.title_cz||"",content:a.content||""})))),se(t.order||null),U(t.status||"active")},re=o.useMemo(()=>{const t=g.reduce((s,m)=>m.is_included_in_total?s+(Number(m.quantity)||0)*(Number(m.unit_price)||0):s,0),a=p.apply_vat?t*((Number(p.vat_rate)||0)/100):0;return{subtotal:t,vatAmount:a,total:t+a}},[g,p.apply_vat,p.vat_rate]),Y=o.useCallback(()=>{try{localStorage.removeItem(q)}catch{}V(null)},[]),oe=o.useMemo(()=>W?W.toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"}):null,[W]),le=(t,a)=>d(s=>({...s,[t]:a})),ce=t=>{d(a=>({...a,customer_id:t.id,customer_name:t.name})),i(a=>({...a,customer_id:void 0}))},de=()=>{d(t=>({...t,customer_id:null,customer_name:""}))},me=(t,a,s)=>{D(m=>m.map((n,h)=>h===t?{...n,[a]:s}:n))},ue=()=>D(t=>[...t,be()]),H=t=>{D(a=>a.length>1?a.filter((s,m)=>m!==t):a)},pe=t=>{D(a=>[...a,{_key:`item-${++B}`,description:t.name||"",item_description:t.description||"",quantity:1,unit:"",unit_price:Number(t.default_price)||0,is_included_in_total:!0}])},Q=()=>P(t=>[...t,Ye()]),E=t=>{P(a=>a.filter((s,m)=>m!==t))},X=(t,a,s)=>{P(m=>m.map((n,h)=>h===t?{...n,[a]:s}:n))},ee=(t,a)=>{P(s=>{const m=[...s],n=t+a;return n<0||n>=m.length?s:([m[t],m[n]]=[m[n],m[t]],m)})},R=async t=>{try{const s=await(await A(`${M}/offers-templates.php?action=scope_detail&id=${t.id}`)).json();if(s.success){const m=s.data;if(d(n=>({...n,scope_description:m.description||n.scope_description})),m.sections){const n=m.sections.map(h=>({_key:`sec-${++B}`,title:h.title||"",title_cz:h.title_cz||"",content:h.content||""}));P(h=>[...h,...n])}u.success(`Načtena šablona "${t.name}"`)}}catch{u.error("Nepodařilo se načíst šablonu")}},he=async()=>{const t={};if(p.customer_id||(t.customer_id="Vyberte zákazníka"),p.created_at||(t.created_at="Zadejte datum"),p.valid_until||(t.valid_until="Zadejte datum"),(g.length===0||g.every(a=>!a.description.trim()))&&(t.items="Přidejte alespoň jednu položku"),i(t),!(Object.keys(t).length>0)){_(!0);try{const a=K(),s=c?`${M}/offers.php?id=${j}`:`${M}/offers.php`,n=await(await A(s,{method:c?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();if(n.success){if(u.success(n.message||(c?"Nabídka byla uložena":"Nabídka byla vytvořena")),!c&&n.data?.id){Y();const h=n.data.id;setTimeout(()=>b(`/offers/${h}`,{replace:!0}),300)}}else u.error(n.error||"Nepodařilo se uložit nabídku")}catch{u.error("Chyba připojení")}finally{_(!1)}}},K=()=>({quotation:{project_code:p.project_code,customer_id:p.customer_id,created_at:p.created_at,valid_until:p.valid_until,currency:p.currency,language:p.language,vat_rate:p.vat_rate,apply_vat:p.apply_vat,exchange_rate:p.exchange_rate||null,exchange_rate_date:p.exchange_rate_date||null,scope_title:p.scope_title,scope_description:p.scope_description},items:g.map((t,a)=>({...t,position:a+1})),sections:I.map((t,a)=>({...t,position:a+1}))});return{loading:z,saving:T,errors:$,setErrors:i,form:p,updateForm:le,items:g,setItems:D,sections:I,customers:v,itemTemplates:x,scopeTemplates:y,orderInfo:w,offerStatus:ne,setOfferStatus:U,totals:re,draftSavedAtLabel:oe,clearDraft:Y,selectCustomer:ce,clearCustomer:de,updateItem:me,addItem:ue,removeItem:H,addItemFromTemplate:pe,addSection:Q,removeSection:E,updateSection:X,moveSection:ee,loadScopeTemplate:R,handleSave:he}}const ae="/api/admin";function dt(){const{id:j}=ze(),c=!!j,u=Pe(),{hasPermission:b}=Ae(),z=De(),{loading:C,saving:T,errors:_,setErrors:$,form:i,updateForm:v,items:k,setItems:x,sections:l,customers:y,itemTemplates:Z,scopeTemplates:p,orderInfo:d,offerStatus:g,setOfferStatus:D,totals:I,draftSavedAtLabel:P,selectCustomer:w,clearCustomer:se,updateItem:ne,addItem:U,removeItem:W,addItemFromTemplate:V,addSection:J,removeSection:G,updateSection:ie,moveSection:re,loadScopeTemplate:Y,handleSave:oe}=tt({id:j,isEdit:c,alert:u,navigate:z}),[le,ce]=o.useState(!1),[de,me]=o.useState(!1),[ue,H]=o.useState(!1),[pe,Q]=o.useState(!1),[E,X]=o.useState(!1),[ee,R]=o.useState(!1),[he,K]=o.useState(!1),[t,a]=o.useState(!1),[s,m]=o.useState(""),[n,h]=o.useState(null),[f,xe]=o.useState(!1);Te(ee);const N=g==="invalidated",_e=c&&!N&&!d&&i.valid_until&&new Date(i.valid_until){if(!s.trim()){u.error("Číslo objednávky zákazníka je povinné");return}X(!0);try{const r=new FormData;r.append("quotationId",j),r.append("customerOrderNumber",s.trim()),n&&r.append("attachment",n);const O=await(await A(`${ae}/orders.php`,{method:"POST",body:r})).json();O.success?(R(!1),u.success(O.message||"Objednávka byla vytvořena"),z(`/orders/${O.data.order_id}`)):u.error(O.error||"Nepodařilo se vytvořit objednávku")}catch{u.error("Chyba připojení")}finally{X(!1)}},Ne=async()=>{a(!0);try{const S=await(await A(`${ae}/offers.php?action=invalidate&id=${j}`,{method:"POST"})).json();S.success?(K(!1),D("invalidated"),u.success(S.message||"Nabídka byla zneplatněna")):u.error(S.error||"Nepodařilo se zneplatnit nabídku")}catch{u.error("Chyba připojení")}finally{a(!1)}},ke=async()=>{Q(!0);try{const S=await(await A(`${ae}/offers.php?id=${j}`,{method:"DELETE"})).json();S.success?(u.success(S.message||"Nabídka byla smazána"),z("/offers")):u.error(S.error||"Nepodařilo se smazat nabídku")}catch{u.error("Chyba připojení")}finally{Q(!1),H(!1)}},we=async()=>{if(!(!c||f)){xe(!0);try{const r=await A(`${ae}/offers-pdf.php?id=${j}`);if(r.status===401)return;if(!r.ok){u.error("Nepodařilo se vygenerovat PDF");return}const S=await r.text(),O=window.open("","_blank");O?(O.document.open(),O.document.write(S),O.document.close(),O.onload=()=>O.print()):u.error("Prohlížeč zablokoval vyskakovací okno")}catch{u.error("Chyba při generování PDF")}finally{xe(!1)}}},Se=c?N?"offers.view":"offers.edit":"offers.create";return b(Se)?C?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row gap-2",children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(r=>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/2"})]},r))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(r=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-full"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-3/4"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-1/2"})})]},r))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(r=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3"}),e.jsx("div",{className:"admin-skeleton-line w-full"})]},r))})})]}):e.jsxs("div",{children:[e.jsxs(L.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(ye,{to:"/offers",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsxs("div",{children:[e.jsxs("h1",{className:"admin-page-title",children:[c?`Nabídka ${i.quotation_number}`:"Nová nabídka",N&&e.jsx("span",{className:"admin-badge admin-badge-danger",style:{marginLeft:"0.75rem",verticalAlign:"middle",fontSize:"0.75rem"},children:"Zneplatněna"})]}),!c&&P&&e.jsxs("div",{className:"offers-draft-indicator",children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}),"Koncept uložen ",P]})]})]}),e.jsxs("div",{className:"admin-page-actions",children:[c&&b("offers.export")&&e.jsx("button",{onClick:we,className:"admin-btn admin-btn-secondary",disabled:f,children:f?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"PDF..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"PDF"]})}),c&&!N&&b("orders.create")&&!d&&e.jsxs("button",{onClick:()=>{m(""),h(null),R(!0)},className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]}),"Vytvořit objednávku"]}),c&&d&&e.jsxs(ye,{to:`/orders/${d.id}`,className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"Objednávka ",d.order_number]}),_e&&b("offers.edit")&&e.jsxs("button",{onClick:()=>K(!0),className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"4.93",y1:"4.93",x2:"19.07",y2:"19.07"})]}),"Zneplatnit"]}),!N&&e.jsx("button",{onClick:oe,className:"admin-btn admin-btn-primary",disabled:T,children:T?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"}),c&&b("offers.delete")&&e.jsx("button",{onClick:()=>H(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsxs(L.div,{className:`offers-editor-section${N?" offers-readonly":""}`,initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(F,{label:"Číslo nabídky",children:e.jsx("input",{type:"text",value:i.quotation_number,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(F,{label:"Kód projektu",children:e.jsx("input",{type:"text",value:i.project_code,onChange:r=>v("project_code",r.target.value),className:"admin-form-input",placeholder:"Volitelný kód projektu",readOnly:N})}),e.jsx(Ge,{customers:y,customerId:i.customer_id,customerName:i.customer_name,onSelect:w,onClear:se,error:_.customer_id,readOnly:N})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(F,{label:"Datum vytvoření",error:_.created_at,required:!0,children:N?e.jsx("input",{type:"text",value:i.created_at,className:"admin-form-input",readOnly:!0}):e.jsx(ve,{mode:"date",value:i.created_at,onChange:r=>{v("created_at",r),$(S=>({...S,created_at:void 0}))}})}),e.jsx(F,{label:"Platnost do",error:_.valid_until,required:!0,children:N?e.jsx("input",{type:"text",value:i.valid_until,className:"admin-form-input",readOnly:!0}):e.jsx(ve,{mode:"date",value:i.valid_until,onChange:r=>{v("valid_until",r),$(S=>({...S,valid_until:void 0}))}})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(F,{label:"Měna",children:e.jsxs("select",{value:i.currency,onChange:r=>v("currency",r.target.value),className:"admin-form-select",disabled:N,children:[e.jsx("option",{value:"EUR",children:"EUR (€)"}),e.jsx("option",{value:"USD",children:"USD ($)"}),e.jsx("option",{value:"CZK",children:"CZK (Kč)"}),e.jsx("option",{value:"GBP",children:"GBP (£)"})]})}),e.jsx(F,{label:"Jazyk nabídky",children:e.jsxs("select",{value:i.language,onChange:r=>v("language",r.target.value),className:"admin-form-select",disabled:N,children:[e.jsx("option",{value:"EN",children:"English"}),e.jsx("option",{value:"CZ",children:"Čeština"})]})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(F,{label:"Sazba DPH (%)",children:e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("input",{type:"number",value:i.vat_rate,onChange:r=>v("vat_rate",parseFloat(r.target.value)||0),className:"admin-form-input flex-1",step:"0.1",readOnly:N}),e.jsxs("label",{className:"admin-form-checkbox",style:{whiteSpace:"nowrap"},children:[e.jsx("input",{type:"checkbox",checked:i.apply_vat,onChange:r=>v("apply_vat",r.target.checked),disabled:N}),e.jsx("span",{children:"Účtovat DPH"})]})]})}),e.jsx(F,{label:"Směnný kurz",children:e.jsx("input",{type:"number",value:i.exchange_rate,onChange:r=>v("exchange_rate",r.target.value),className:"admin-form-input",placeholder:"Volitelný",step:"0.0001",readOnly:N})})]})]})]}),e.jsx(Ue,{items:k,setItems:x,updateItem:ne,addItem:U,removeItem:W,itemTemplates:Z,showItemTemplateMenu:le,setShowItemTemplateMenu:ce,addItemFromTemplate:V,totals:I,currency:i.currency,applyVat:i.apply_vat,vatRate:i.vat_rate,itemsError:_.items,readOnly:N}),e.jsx(Je,{sections:l,addSection:J,removeSection:G,updateSection:ie,moveSection:re,scopeTemplates:p,showScopeTemplateMenu:de,setShowScopeTemplateMenu:me,loadScopeTemplate:Y,form:i,updateForm:v,readOnly:N}),e.jsx(Ce,{children:ee&&e.jsxs(L.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:()=>!E&&R(!1)}),e.jsxs(L.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Vytvořit objednávku"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(F,{label:"Číslo objednávky zákazníka",required:!0,children:e.jsx("input",{type:"text",value:s,onChange:r=>m(r.target.value),onKeyDown:r=>r.key==="Enter"&&!E&&je(),className:"admin-form-input",placeholder:"Např. PO-2026-001",autoFocus:!0})}),e.jsxs(F,{label:"Příloha (PDF)",children:[n?e.jsxs("div",{className:"flex-row gap-2",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent-color)",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),e.jsxs("span",{style:{fontSize:"0.875rem"},children:[n.name," ",e.jsxs("span",{className:"text-tertiary",children:["(",(n.size/1024).toFixed(0)," KB)"]})]}),e.jsx("button",{type:"button",onClick:()=>h(null),className:"admin-btn-icon",title:"Odebrat",style:{marginLeft:"auto"},children:e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}):e.jsxs("label",{className:"admin-btn admin-btn-secondary admin-btn-sm",style:{cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"0.4rem"},children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Vybrat soubor",e.jsx("input",{type:"file",accept:"application/pdf",onChange:r=>h(r.target.files[0]||null),style:{display:"none"}})]}),e.jsx("small",{className:"admin-form-hint",style:{marginTop:"0.25rem"},children:"Max 10 MB"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{onClick:()=>R(!1),className:"admin-btn admin-btn-secondary",disabled:E,children:"Zrušit"}),e.jsx("button",{onClick:je,className:"admin-btn admin-btn-primary",disabled:E||!s.trim(),children:E?"Vytváření...":"Vytvořit"})]})]})]})}),e.jsx(ge,{isOpen:he,onClose:()=>K(!1),onConfirm:Ne,title:"Zneplatnit nabídku",message:`Opravdu chcete zneplatnit nabídku "${i.quotation_number}"? Nabídka bude pouze pro čtení a nepůjde upravovat.`,confirmText:"Zneplatnit",cancelText:"Zrušit",type:"danger",loading:t}),e.jsx(ge,{isOpen:ue,onClose:()=>H(!1),onConfirm:ke,title:"Smazat nabídku",message:`Opravdu chcete smazat nabídku "${i.quotation_number}"? Budou smazány i všechny položky a sekce. Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:pe})]}):e.jsx($e,{})}export{dt as default}; diff --git a/dist/assets/Offers-B58QSeyz.js b/dist/assets/Offers-ZNWwIePg.js similarity index 99% rename from dist/assets/Offers-B58QSeyz.js rename to dist/assets/Offers-ZNWwIePg.js index 92cfb3c..b92157a 100644 --- a/dist/assets/Offers-B58QSeyz.js +++ b/dist/assets/Offers-ZNWwIePg.js @@ -1 +1 @@ -import{j as e,m as C,A as ie}from"./vendor-animation-0s3FMHwK.js";import{g as oe,r as n,L as d}from"./vendor-react-BVs3cwbi.js";import{a as re,u as le,b as de,d as ce,e as S,g as he,C as H,F as E,c as f}from"./index-BrM8fzBu.js";import{F as me}from"./Forbidden-D25jV3Oq.js";import{u as xe,a as ue,S as y}from"./useListData-Bz9Xh_CU.js";import{P as pe}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const v="/api/admin",I="boha_offer_draft";function we(){const a=re(),{hasPermission:r}=le(),q=oe(),{sort:R,order:c,handleSort:x,activeSort:u}=xe("quotation_number"),[b,K]=n.useState(""),[J,O]=n.useState(1),[k,z]=n.useState({show:!1,quotation:null}),[U,W]=n.useState(!1),[g,_]=n.useState({show:!1,quotation:null}),[Y,V]=n.useState(!1),[G,A]=n.useState(null),[D,T]=n.useState(null),[l,$]=n.useState(null),[h,w]=n.useState({show:!1,quotation:null});de(h.show);const[N,F]=n.useState(""),[p,M]=n.useState(null),[o,L]=n.useState(null),{items:j,loading:Q,pagination:P,refetch:B}=ue("offers.php",{dataKey:"quotations",search:b,sort:R,order:c,page:J,errorMsg:"Nepodařilo se načíst nabídky"});n.useEffect(()=>{try{const t=localStorage.getItem(I);if(!t)return;const s=JSON.parse(t);s&&s.form&&Array.isArray(s.items)&&L(s)}catch{}},[]);const X=()=>{try{localStorage.removeItem(I)}catch{}L(null)},ee=(t,s)=>t?"offers-invalidated-row":s?"offers-expired-row":"";if(!r("offers.view"))return e.jsx(me,{});const te=async t=>{A(t.id);try{const i=await(await f(`${v}/offers.php?action=duplicate&id=${t.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})).json();i.success?(a.success(i.message||"Nabídka byla duplikována"),B()):a.error(i.error||"Nepodařilo se duplikovat nabídku")}catch{a.error("Chyba připojení")}finally{A(null)}},Z=async()=>{if(!(!N.trim()||!h.quotation)){$(h.quotation.id);try{const t=new FormData;t.append("quotationId",h.quotation.id),t.append("customerOrderNumber",N.trim()),p&&t.append("attachment",p);const i=await(await f(`${v}/orders.php`,{method:"POST",body:t})).json();i.success?(w({show:!1,quotation:null}),a.success(i.message||"Objednávka byla vytvořena"),q(`/orders/${i.data.order_id}`)):a.error(i.error||"Nepodařilo se vytvořit objednávku")}catch{a.error("Chyba připojení")}finally{$(null)}}},se=async()=>{if(k.quotation){W(!0);try{const s=await(await f(`${v}/offers.php?id=${k.quotation.id}`,{method:"DELETE"})).json();s.success?(z({show:!1,quotation:null}),a.success(s.message||"Nabídka byla smazána"),B()):a.error(s.error||"Nepodařilo se smazat nabídku")}catch{a.error("Chyba připojení")}finally{W(!1)}}},ae=async()=>{if(g.quotation){V(!0);try{const s=await(await f(`${v}/offers.php?action=invalidate&id=${g.quotation.id}`,{method:"POST"})).json();s.success?(_({show:!1,quotation:null}),a.success(s.message||"Nabídka byla zneplatněna"),B()):a.error(s.error||"Nepodařilo se zneplatnit nabídku")}catch{a.error("Chyba připojení")}finally{V(!1)}}},ne=async t=>{if(!D){T(t.id);try{const s=await f(`${v}/offers-pdf.php?id=${t.id}`);if(s.status===401)return;if(!s.ok){a.error("Nepodařilo se vygenerovat PDF");return}const i=await s.text(),m=window.open("","_blank");m?(m.document.open(),m.document.write(i),m.document.close(),m.onload=()=>m.print()):a.error("Prohlížeč zablokoval vyskakovací okno")}catch{a.error("Chyba při generování PDF")}finally{T(null)}}};return Q?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"120px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px",marginBottom:"0.5rem"}}),[0,1,2,3,4].map(t=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},t))]})})]}):e.jsxs("div",{children:[e.jsxs(C.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nabídky"}),e.jsxs("p",{className:"admin-page-subtitle",children:[P?.total??j.length," ",ce(P?.total??j.length,"nabídka","nabídky","nabídek")]})]}),e.jsxs("div",{className:"admin-page-actions",children:[r("offers.settings")&&e.jsxs(d,{to:"/offers/templates",className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),e.jsx("path",{d:"M3 9h18M9 21V9"})]}),"Šablony"]}),r("offers.create")&&e.jsxs(d,{to:"/offers/new",className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Nová nabídka"]})]})]}),e.jsx(C.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:b,onChange:t=>{K(t.target.value),O(1)},className:"admin-form-input",placeholder:"Hledat podle čísla, projektu nebo zákazníka..."})}),j.length===0&&!o?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"18",x2:"12",y2:"12"}),e.jsx("line",{x1:"9",y1:"15",x2:"15",y2:"15"})]})}),e.jsx("p",{children:"Zatím nejsou žádné nabídky."}),r("offers.create")&&e.jsx(d,{to:"/offers/new",className:"admin-btn admin-btn-primary",children:"Vytvořit první nabídku"})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("quotation_number"),children:["Číslo ",e.jsx(y,{column:"quotation_number",sort:u,order:c})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("project_code"),children:["Projekt ",e.jsx(y,{column:"project_code",sort:u,order:c})]}),e.jsx("th",{children:"Zákazník"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("created_at"),children:["Datum ",e.jsx(y,{column:"created_at",sort:u,order:c})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("valid_until"),children:["Platnost ",e.jsx(y,{column:"valid_until",sort:u,order:c})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("currency"),children:["Měna ",e.jsx(y,{column:"currency",sort:u,order:c})]}),e.jsx("th",{className:"text-right",children:"Celkem"}),e.jsx("th",{children:"Akce"})]})}),e.jsxs("tbody",{children:[o&&!b&&e.jsxs("tr",{className:"offers-draft-row",children:[e.jsx("td",{children:e.jsxs("span",{className:"offers-draft-row-label",children:["Koncept",o.savedAt&&e.jsxs("span",{style:{fontWeight:400,opacity:.8},children:[" · ",new Date(o.savedAt).toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"})]})]})}),e.jsx("td",{children:o.form.project_code||"—"}),e.jsx("td",{children:o.form.customer_name||"—"}),e.jsx("td",{className:"admin-mono",children:o.form.created_at?S(o.form.created_at):"—"}),e.jsx("td",{className:"admin-mono",children:o.form.valid_until?S(o.form.valid_until):"—"}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-secondary",children:o.form.currency||"—"})}),e.jsx("td",{}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(d,{to:"/offers/new",className:"admin-btn-icon",title:"Pokračovat v konceptu","aria-label":"Pokračovat v konceptu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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:X,className:"admin-btn-icon danger",title:"Zahodit koncept",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]}),j.map(t=>{const s=t.status==="invalidated",i=!s&&!t.order_id&&t.valid_until&&new Date(t.valid_until)te(t),className:"admin-btn-icon",title:"Duplikovat",disabled:G===t.id,children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),e.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})}),!s&&t.order_id?e.jsx(d,{to:`/orders/${t.order_id}`,className:"admin-btn-icon accent",title:"Zobrazit objednávku","aria-label":"Zobrazit objednávku",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("text",{x:"12",y:"16.5",textAnchor:"middle",fill:"currentColor",stroke:"none",fontSize:"9",fontWeight:"700",children:"O"})]})}):!s&&r("orders.create")&&e.jsx("button",{onClick:()=>{F(""),M(null),w({show:!0,quotation:t})},className:"admin-btn-icon",title:"Vytvořit objednávku",disabled:l===t.id,children:l===t.id?e.jsx("div",{className:"admin-spinner",style:{width:18,height:18,borderWidth:2}}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]})}),i&&!s&&r("offers.edit")&&e.jsx("button",{onClick:()=>_({show:!0,quotation:t}),className:"admin-btn-icon",title:"Zneplatnit",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"4.93",y1:"4.93",x2:"19.07",y2:"19.07"})]})}),r("offers.export")&&e.jsx("button",{onClick:()=>ne(t),className:"admin-btn-icon",title:"PDF",disabled:D===t.id,children:D===t.id?e.jsx("div",{className:"admin-spinner",style:{width:18,height:18,borderWidth:2}}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),r("offers.delete")&&e.jsx("button",{onClick:()=>z({show:!0,quotation:t}),className:"admin-btn-icon danger",title:"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},t.id)}),j.length===0&&o&&b&&e.jsx("tr",{children:e.jsx("td",{colSpan:8,className:"text-muted",style:{textAlign:"center",padding:"1.5rem"},children:"Žádné nabídky odpovídající hledání."})})]})]})}),e.jsx(pe,{pagination:P,onPageChange:O})]})}),e.jsx(H,{isOpen:k.show,onClose:()=>z({show:!1,quotation:null}),onConfirm:se,title:"Smazat nabídku",message:`Opravdu chcete smazat nabídku "${k.quotation?.quotation_number}"? Budou smazány i všechny položky a sekce. Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:U}),e.jsx(H,{isOpen:g.show,onClose:()=>_({show:!1,quotation:null}),onConfirm:ae,title:"Zneplatnit nabídku",message:`Opravdu chcete zneplatnit nabídku "${g.quotation?.quotation_number}"? Nabídka bude pouze pro čtení a nepůjde upravovat.`,confirmText:"Zneplatnit",cancelText:"Zrušit",type:"danger",loading:Y}),e.jsx(ie,{children:h.show&&e.jsxs(C.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:()=>!l&&w({show:!1,quotation:null})}),e.jsxs(C.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:"Vytvořit objednávku"}),e.jsxs("p",{className:"text-secondary",style:{marginTop:"0.25rem",fontSize:"0.875rem"},children:["Nabídka: ",e.jsx("strong",{children:h.quotation?.quotation_number})]})]}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(E,{label:"Číslo objednávky zákazníka",required:!0,children:e.jsx("input",{type:"text",value:N,onChange:t=>F(t.target.value),onKeyDown:t=>t.key==="Enter"&&!l&&Z(),className:"admin-form-input",placeholder:"Např. PO-2026-001",autoFocus:!0})}),e.jsxs(E,{label:"Příloha (PDF)",children:[p?e.jsxs("div",{className:"flex-row gap-2",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent-color)",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),e.jsxs("span",{style:{fontSize:"0.875rem"},children:[p.name," ",e.jsxs("span",{className:"text-tertiary",children:["(",(p.size/1024).toFixed(0)," KB)"]})]}),e.jsx("button",{type:"button",onClick:()=>M(null),className:"admin-btn-icon",title:"Odebrat",style:{marginLeft:"auto"},children:e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}):e.jsxs("label",{className:"admin-btn admin-btn-secondary admin-btn-sm",style:{cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"0.4rem"},children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Vybrat soubor",e.jsx("input",{type:"file",accept:"application/pdf",onChange:t=>M(t.target.files[0]||null),style:{display:"none"}})]}),e.jsx("small",{className:"admin-form-hint",style:{marginTop:"0.25rem"},children:"Max 10 MB"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{onClick:()=>w({show:!1,quotation:null}),className:"admin-btn admin-btn-secondary",disabled:!!l,children:"Zrušit"}),e.jsx("button",{onClick:Z,className:"admin-btn admin-btn-primary",disabled:!!l||!N.trim(),children:l?"Vytváření...":"Vytvořit"})]})]})]})})]})}export{we as default}; +import{j as e,m as C,A as ie}from"./vendor-animation-0s3FMHwK.js";import{g as oe,r as n,L as d}from"./vendor-react-BVs3cwbi.js";import{a as re,u as le,b as de,d as ce,e as S,g as he,C as H,F as E,c as f}from"./index-Bay45BGf.js";import{F as me}from"./Forbidden-D25jV3Oq.js";import{u as xe,a as ue,S as y}from"./useListData-CvOpK9He.js";import{P as pe}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const v="/api/admin",I="boha_offer_draft";function we(){const a=re(),{hasPermission:r}=le(),q=oe(),{sort:R,order:c,handleSort:x,activeSort:u}=xe("quotation_number"),[b,K]=n.useState(""),[J,O]=n.useState(1),[k,z]=n.useState({show:!1,quotation:null}),[U,W]=n.useState(!1),[g,_]=n.useState({show:!1,quotation:null}),[Y,V]=n.useState(!1),[G,A]=n.useState(null),[D,T]=n.useState(null),[l,$]=n.useState(null),[h,w]=n.useState({show:!1,quotation:null});de(h.show);const[N,F]=n.useState(""),[p,M]=n.useState(null),[o,L]=n.useState(null),{items:j,loading:Q,pagination:P,refetch:B}=ue("offers.php",{dataKey:"quotations",search:b,sort:R,order:c,page:J,errorMsg:"Nepodařilo se načíst nabídky"});n.useEffect(()=>{try{const t=localStorage.getItem(I);if(!t)return;const s=JSON.parse(t);s&&s.form&&Array.isArray(s.items)&&L(s)}catch{}},[]);const X=()=>{try{localStorage.removeItem(I)}catch{}L(null)},ee=(t,s)=>t?"offers-invalidated-row":s?"offers-expired-row":"";if(!r("offers.view"))return e.jsx(me,{});const te=async t=>{A(t.id);try{const i=await(await f(`${v}/offers.php?action=duplicate&id=${t.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})).json();i.success?(a.success(i.message||"Nabídka byla duplikována"),B()):a.error(i.error||"Nepodařilo se duplikovat nabídku")}catch{a.error("Chyba připojení")}finally{A(null)}},Z=async()=>{if(!(!N.trim()||!h.quotation)){$(h.quotation.id);try{const t=new FormData;t.append("quotationId",h.quotation.id),t.append("customerOrderNumber",N.trim()),p&&t.append("attachment",p);const i=await(await f(`${v}/orders.php`,{method:"POST",body:t})).json();i.success?(w({show:!1,quotation:null}),a.success(i.message||"Objednávka byla vytvořena"),q(`/orders/${i.data.order_id}`)):a.error(i.error||"Nepodařilo se vytvořit objednávku")}catch{a.error("Chyba připojení")}finally{$(null)}}},se=async()=>{if(k.quotation){W(!0);try{const s=await(await f(`${v}/offers.php?id=${k.quotation.id}`,{method:"DELETE"})).json();s.success?(z({show:!1,quotation:null}),a.success(s.message||"Nabídka byla smazána"),B()):a.error(s.error||"Nepodařilo se smazat nabídku")}catch{a.error("Chyba připojení")}finally{W(!1)}}},ae=async()=>{if(g.quotation){V(!0);try{const s=await(await f(`${v}/offers.php?action=invalidate&id=${g.quotation.id}`,{method:"POST"})).json();s.success?(_({show:!1,quotation:null}),a.success(s.message||"Nabídka byla zneplatněna"),B()):a.error(s.error||"Nepodařilo se zneplatnit nabídku")}catch{a.error("Chyba připojení")}finally{V(!1)}}},ne=async t=>{if(!D){T(t.id);try{const s=await f(`${v}/offers-pdf.php?id=${t.id}`);if(s.status===401)return;if(!s.ok){a.error("Nepodařilo se vygenerovat PDF");return}const i=await s.text(),m=window.open("","_blank");m?(m.document.open(),m.document.write(i),m.document.close(),m.onload=()=>m.print()):a.error("Prohlížeč zablokoval vyskakovací okno")}catch{a.error("Chyba při generování PDF")}finally{T(null)}}};return Q?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"120px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px",marginBottom:"0.5rem"}}),[0,1,2,3,4].map(t=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},t))]})})]}):e.jsxs("div",{children:[e.jsxs(C.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nabídky"}),e.jsxs("p",{className:"admin-page-subtitle",children:[P?.total??j.length," ",ce(P?.total??j.length,"nabídka","nabídky","nabídek")]})]}),e.jsxs("div",{className:"admin-page-actions",children:[r("offers.settings")&&e.jsxs(d,{to:"/offers/templates",className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),e.jsx("path",{d:"M3 9h18M9 21V9"})]}),"Šablony"]}),r("offers.create")&&e.jsxs(d,{to:"/offers/new",className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Nová nabídka"]})]})]}),e.jsx(C.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:b,onChange:t=>{K(t.target.value),O(1)},className:"admin-form-input",placeholder:"Hledat podle čísla, projektu nebo zákazníka..."})}),j.length===0&&!o?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"18",x2:"12",y2:"12"}),e.jsx("line",{x1:"9",y1:"15",x2:"15",y2:"15"})]})}),e.jsx("p",{children:"Zatím nejsou žádné nabídky."}),r("offers.create")&&e.jsx(d,{to:"/offers/new",className:"admin-btn admin-btn-primary",children:"Vytvořit první nabídku"})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("quotation_number"),children:["Číslo ",e.jsx(y,{column:"quotation_number",sort:u,order:c})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("project_code"),children:["Projekt ",e.jsx(y,{column:"project_code",sort:u,order:c})]}),e.jsx("th",{children:"Zákazník"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("created_at"),children:["Datum ",e.jsx(y,{column:"created_at",sort:u,order:c})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("valid_until"),children:["Platnost ",e.jsx(y,{column:"valid_until",sort:u,order:c})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>x("currency"),children:["Měna ",e.jsx(y,{column:"currency",sort:u,order:c})]}),e.jsx("th",{className:"text-right",children:"Celkem"}),e.jsx("th",{children:"Akce"})]})}),e.jsxs("tbody",{children:[o&&!b&&e.jsxs("tr",{className:"offers-draft-row",children:[e.jsx("td",{children:e.jsxs("span",{className:"offers-draft-row-label",children:["Koncept",o.savedAt&&e.jsxs("span",{style:{fontWeight:400,opacity:.8},children:[" · ",new Date(o.savedAt).toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"})]})]})}),e.jsx("td",{children:o.form.project_code||"—"}),e.jsx("td",{children:o.form.customer_name||"—"}),e.jsx("td",{className:"admin-mono",children:o.form.created_at?S(o.form.created_at):"—"}),e.jsx("td",{className:"admin-mono",children:o.form.valid_until?S(o.form.valid_until):"—"}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-secondary",children:o.form.currency||"—"})}),e.jsx("td",{}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(d,{to:"/offers/new",className:"admin-btn-icon",title:"Pokračovat v konceptu","aria-label":"Pokračovat v konceptu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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:X,className:"admin-btn-icon danger",title:"Zahodit koncept",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]}),j.map(t=>{const s=t.status==="invalidated",i=!s&&!t.order_id&&t.valid_until&&new Date(t.valid_until)te(t),className:"admin-btn-icon",title:"Duplikovat",disabled:G===t.id,children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),e.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})}),!s&&t.order_id?e.jsx(d,{to:`/orders/${t.order_id}`,className:"admin-btn-icon accent",title:"Zobrazit objednávku","aria-label":"Zobrazit objednávku",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("text",{x:"12",y:"16.5",textAnchor:"middle",fill:"currentColor",stroke:"none",fontSize:"9",fontWeight:"700",children:"O"})]})}):!s&&r("orders.create")&&e.jsx("button",{onClick:()=>{F(""),M(null),w({show:!0,quotation:t})},className:"admin-btn-icon",title:"Vytvořit objednávku",disabled:l===t.id,children:l===t.id?e.jsx("div",{className:"admin-spinner",style:{width:18,height:18,borderWidth:2}}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]})}),i&&!s&&r("offers.edit")&&e.jsx("button",{onClick:()=>_({show:!0,quotation:t}),className:"admin-btn-icon",title:"Zneplatnit",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"4.93",y1:"4.93",x2:"19.07",y2:"19.07"})]})}),r("offers.export")&&e.jsx("button",{onClick:()=>ne(t),className:"admin-btn-icon",title:"PDF",disabled:D===t.id,children:D===t.id?e.jsx("div",{className:"admin-spinner",style:{width:18,height:18,borderWidth:2}}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),r("offers.delete")&&e.jsx("button",{onClick:()=>z({show:!0,quotation:t}),className:"admin-btn-icon danger",title:"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},t.id)}),j.length===0&&o&&b&&e.jsx("tr",{children:e.jsx("td",{colSpan:8,className:"text-muted",style:{textAlign:"center",padding:"1.5rem"},children:"Žádné nabídky odpovídající hledání."})})]})]})}),e.jsx(pe,{pagination:P,onPageChange:O})]})}),e.jsx(H,{isOpen:k.show,onClose:()=>z({show:!1,quotation:null}),onConfirm:se,title:"Smazat nabídku",message:`Opravdu chcete smazat nabídku "${k.quotation?.quotation_number}"? Budou smazány i všechny položky a sekce. Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:U}),e.jsx(H,{isOpen:g.show,onClose:()=>_({show:!1,quotation:null}),onConfirm:ae,title:"Zneplatnit nabídku",message:`Opravdu chcete zneplatnit nabídku "${g.quotation?.quotation_number}"? Nabídka bude pouze pro čtení a nepůjde upravovat.`,confirmText:"Zneplatnit",cancelText:"Zrušit",type:"danger",loading:Y}),e.jsx(ie,{children:h.show&&e.jsxs(C.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:()=>!l&&w({show:!1,quotation:null})}),e.jsxs(C.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:"Vytvořit objednávku"}),e.jsxs("p",{className:"text-secondary",style:{marginTop:"0.25rem",fontSize:"0.875rem"},children:["Nabídka: ",e.jsx("strong",{children:h.quotation?.quotation_number})]})]}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(E,{label:"Číslo objednávky zákazníka",required:!0,children:e.jsx("input",{type:"text",value:N,onChange:t=>F(t.target.value),onKeyDown:t=>t.key==="Enter"&&!l&&Z(),className:"admin-form-input",placeholder:"Např. PO-2026-001",autoFocus:!0})}),e.jsxs(E,{label:"Příloha (PDF)",children:[p?e.jsxs("div",{className:"flex-row gap-2",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent-color)",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),e.jsxs("span",{style:{fontSize:"0.875rem"},children:[p.name," ",e.jsxs("span",{className:"text-tertiary",children:["(",(p.size/1024).toFixed(0)," KB)"]})]}),e.jsx("button",{type:"button",onClick:()=>M(null),className:"admin-btn-icon",title:"Odebrat",style:{marginLeft:"auto"},children:e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}):e.jsxs("label",{className:"admin-btn admin-btn-secondary admin-btn-sm",style:{cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"0.4rem"},children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Vybrat soubor",e.jsx("input",{type:"file",accept:"application/pdf",onChange:t=>M(t.target.files[0]||null),style:{display:"none"}})]}),e.jsx("small",{className:"admin-form-hint",style:{marginTop:"0.25rem"},children:"Max 10 MB"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{onClick:()=>w({show:!1,quotation:null}),className:"admin-btn admin-btn-secondary",disabled:!!l,children:"Zrušit"}),e.jsx("button",{onClick:Z,className:"admin-btn admin-btn-primary",disabled:!!l||!N.trim(),children:l?"Vytváření...":"Vytvořit"})]})]})]})})]})}export{we as default}; diff --git a/dist/assets/OffersCustomers-DRNB48Z-.js b/dist/assets/OffersCustomers-55BUJuXS.js similarity index 99% rename from dist/assets/OffersCustomers-DRNB48Z-.js rename to dist/assets/OffersCustomers-55BUJuXS.js index a6c8c89..07aa69e 100644 --- a/dist/assets/OffersCustomers-DRNB48Z-.js +++ b/dist/assets/OffersCustomers-55BUJuXS.js @@ -1 +1 @@ -import{j as e,m as b,A as G}from"./vendor-animation-0s3FMHwK.js";import{r as l}from"./vendor-react-BVs3cwbi.js";import{a as Q,u as X,b as Y,c as S,F as m,C as ee}from"./index-BrM8fzBu.js";import{F as ae}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const k="/api/admin",g=["street","city_postal","country","company_id","vat_id"],A={street:"Ulice",city_postal:"Město + PSČ",country:"Země",company_id:"IČO",vat_id:"DIČ"};function re(){const o=Q(),{hasPermission:x}=X(),[W,U]=l.useState(!0),[F,Z]=l.useState([]),[h,R]=l.useState(""),[D,N]=l.useState(!1),[p,z]=l.useState(null),[j,B]=l.useState(!1),[d,c]=l.useState({name:"",street:"",city:"",postal_code:"",country:"",company_id:"",vat_id:""}),[r,u]=l.useState([]),M=l.useRef(0),[O,y]=l.useState([...g]),[v,_]=l.useState({show:!1,customer:null}),[q,E]=l.useState(!1);Y(D);const C=l.useCallback(()=>{const a=[...g],t=[...O].filter(s=>s!=="name");for(const s of a)t.includes(s)||t.push(s);for(let s=0;ss.startsWith("custom_")?parseInt(s.split("_")[1]){const s=C(),n=a+t;if(n<0||n>=s.length)return;const i=[...s];[i[a],i[n]]=[i[n],i[a]],y(i)},V=a=>{if(A[a])return A[a];if(a.startsWith("custom_")){const t=parseInt(a.split("_")[1]),s=r[t];if(s)return s.name?`${s.name}: ${s.value||"..."}`:s.value||`Vlastní pole ${t+1}`}return a},f=l.useCallback(async()=>{try{const a=await S(`${k}/customers.php`);if(a.status===401)return;const t=await a.json();t.success?Z(t.data.customers):o.error(t.error||"Nepodařilo se načíst zákazníky")}catch{o.error("Chyba připojení")}finally{U(!1)}},[o]);l.useEffect(()=>{f()},[f]);const L=()=>{z(null),c({name:"",street:"",city:"",postal_code:"",country:"",company_id:"",vat_id:""}),u([]),y([...g]),N(!0)},H=a=>{z(a),c({name:a.name||"",street:a.street||"",city:a.city||"",postal_code:a.postal_code||"",country:a.country||"",company_id:a.company_id||"",vat_id:a.vat_id||""});const t=Array.isArray(a.custom_fields)&&a.custom_fields.length>0?a.custom_fields.map(s=>({...s,_key:`cf-${++M.current}`})):[];u(t),Array.isArray(a.customer_field_order)&&a.customer_field_order.length>0?y(a.customer_field_order):y([...g]),N(!0)},w=()=>{N(!1),z(null)},K=async()=>{if(!d.name.trim()){o.error("Název zákazníka je povinný");return}B(!0);try{const a=p?`${k}/customers.php?id=${p.id}`:`${k}/customers.php`,t={...d,custom_fields:r.filter(i=>i.name.trim()||i.value.trim()),customer_field_order:C()},n=await(await S(a,{method:p?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json();n.success?(w(),await new Promise(i=>setTimeout(i,300)),o.success(n.message||(p?"Zákazník byl aktualizován":"Zákazník byl vytvořen")),f()):o.error(n.error||"Nepodařilo se uložit zákazníka")}catch{o.error("Chyba připojení")}finally{B(!1)}},J=async()=>{if(v.customer){E(!0);try{const t=await(await S(`${k}/customers.php?id=${v.customer.id}`,{method:"DELETE"})).json();t.success?(_({show:!1,customer:null}),o.success(t.message||"Zákazník byl smazán"),f()):o.error(t.error||"Nepodařilo se smazat zákazníka")}catch{o.error("Chyba připojení")}finally{E(!1)}}};if(!x("offers.view"))return e.jsx(ae,{});const $=h?F.filter(a=>(a.name||"").toLowerCase().includes(h.toLowerCase())||(a.company_id||"").includes(h)||(a.city||"").toLowerCase().includes(h.toLowerCase())):F;if(W)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"160px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px",marginBottom:"0.5rem"}}),[0,1,2,3,4].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))]})})]});const P=C();return e.jsxs("div",{children:[e.jsxs(b.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Zákazníci"}),e.jsx("p",{className:"admin-page-subtitle",children:"Správa zákazníků pro nabídky"})]}),x("offers.create")&&e.jsxs("button",{onClick:L,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat zákazníka"]})]}),e.jsx(b.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:h,onChange:a=>R(a.target.value),className:"admin-form-input",placeholder:"Hledat zákazníky..."})}),$.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("p",{children:h?"Žádní zákazníci odpovídající hledání.":"Zatím nejsou žádní zákazníci."}),!h&&x("offers.create")&&e.jsx("button",{onClick:L,className:"admin-btn admin-btn-primary",children:"Přidat prvního zákazníka"})]}):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:"Název"}),e.jsx("th",{children:"Město"}),e.jsx("th",{children:"IČO"}),e.jsx("th",{children:"DIČ"}),e.jsx("th",{children:"Nabídky"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:$.map(a=>e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("div",{style:{fontWeight:500,color:"var(--text-primary)"},children:a.name}),a.street&&e.jsx("div",{className:"text-tertiary",style:{fontSize:"11px"},children:a.street})]}),e.jsx("td",{children:a.city||"—"}),e.jsx("td",{children:a.company_id||"—"}),e.jsx("td",{children:a.vat_id||"—"}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-info",children:a.quotation_count||0})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[x("offers.edit")&&e.jsx("button",{onClick:()=>H(a),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",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"})]})}),x("offers.delete")&&e.jsx("button",{onClick:()=>_({show:!0,customer:a}),className:"admin-btn-icon danger",title:a.quotation_count>0?"Nelze smazat zákazníka s nabídkami":"Smazat","aria-label":a.quotation_count>0?"Nelze smazat zákazníka s nabídkami":"Smazat",disabled:a.quotation_count>0,children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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.id))})]})})]})}),e.jsx(G,{children:D&&e.jsxs(b.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:w}),e.jsxs(b.div,{className:"admin-modal",style:{maxWidth:720},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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:p?"Upravit zákazníka":"Nový zákazník"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(m,{label:"Název",required:!0,children:e.jsx("input",{type:"text",value:d.name,onChange:a=>c(t=>({...t,name:a.target.value})),className:"admin-form-input",placeholder:"Název firmy / jméno"})}),e.jsx(m,{label:"Ulice",children:e.jsx("input",{type:"text",value:d.street,onChange:a=>c(t=>({...t,street:a.target.value})),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(m,{label:"Město",children:e.jsx("input",{type:"text",value:d.city,onChange:a=>c(t=>({...t,city:a.target.value})),className:"admin-form-input"})}),e.jsx(m,{label:"PSČ",children:e.jsx("input",{type:"text",value:d.postal_code,onChange:a=>c(t=>({...t,postal_code:a.target.value})),className:"admin-form-input"})})]}),e.jsx(m,{label:"Země",children:e.jsx("input",{type:"text",value:d.country,onChange:a=>c(t=>({...t,country:a.target.value})),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(m,{label:"IČO",children:e.jsx("input",{type:"text",value:d.company_id,onChange:a=>c(t=>({...t,company_id:a.target.value})),className:"admin-form-input"})}),e.jsx(m,{label:"DIČ",children:e.jsx("input",{type:"text",value:d.vat_id,onChange:a=>c(t=>({...t,vat_id:a.target.value})),className:"admin-form-input"})})]}),e.jsxs("div",{style:{marginTop:4},children:[e.jsx("label",{className:"admin-form-label",style:{display:"block",marginBottom:4},children:"Vlastní pole"}),r.map((a,t)=>e.jsxs("div",{style:{marginBottom:8},children:[e.jsxs("div",{className:"admin-form-row",style:{marginBottom:0,alignItems:"flex-end"},children:[e.jsx(m,{label:t===0?"Název":" ",style:{flex:1},children:e.jsx("input",{type:"text",value:a.name,onChange:s=>{const n=[...r];n[t]={...n[t],name:s.target.value},u(n)},className:"admin-form-input",placeholder:"Např. Kontakt"})}),e.jsx(m,{label:t===0?"Hodnota":" ",style:{flex:1},children:e.jsxs("div",{style:{display:"flex",gap:4,alignItems:"center"},children:[e.jsx("input",{type:"text",value:a.value,onChange:s=>{const n=[...r];n[t]={...n[t],value:s.target.value},u(n)},className:"admin-form-input",style:{flex:1}}),e.jsx("button",{type:"button",onClick:()=>{const s=`custom_${t}`;y(n=>n.filter(i=>i!==s).map(i=>{if(i.startsWith("custom_")){const T=parseInt(i.split("_")[1]);if(T>t)return`custom_${T-1}`}return i})),u(r.filter((n,i)=>i!==t))},className:"admin-btn-icon danger",title:"Odebrat pole","aria-label":"Odebrat pole",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})})]}),e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:4},children:[e.jsx("input",{type:"checkbox",checked:a.showLabel!==!1,onChange:s=>{const n=[...r];n[t]={...n[t],showLabel:s.target.checked},u(n)}}),e.jsx("span",{style:{fontSize:"0.8rem"},children:"Zobrazit název v PDF"})]})]},a._key)),e.jsxs("button",{type:"button",onClick:()=>u([...r,{name:"",value:"",showLabel:!0,_key:`cf-${++M.current}`}]),className:"admin-btn admin-btn-secondary",style:{marginTop:4,fontSize:"0.85rem"},children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat pole"]})]}),e.jsxs("div",{style:{marginTop:16},children:[e.jsx("label",{className:"admin-form-label",children:"Pořadí polí v PDF"}),e.jsx("small",{className:"admin-form-hint",style:{display:"block",marginBottom:8},children:"Určuje pořadí řádků v adresním bloku zákazníka na PDF nabídce."}),e.jsx("div",{className:"admin-reorder-list",children:P.map((a,t)=>e.jsxs("div",{className:"admin-reorder-item",children:[e.jsxs("div",{className:"admin-reorder-arrows",children:[e.jsx("button",{type:"button",onClick:()=>I(t,-1),disabled:t===0,className:"admin-btn-icon",title:"Nahoru","aria-label":"Nahoru",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>I(t,1),disabled:t===P.length-1,className:"admin-btn-icon",title:"Dolů","aria-label":"Dolů",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})})]}),e.jsx("span",{className:`admin-reorder-label${a.startsWith("custom_")?" accent":""}`,children:V(a)})]},a))})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:w,className:"admin-btn admin-btn-secondary",disabled:j,children:"Zrušit"}),e.jsxs("button",{type:"button",onClick:K,className:"admin-btn admin-btn-primary",disabled:j,children:[j&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}),!j&&(p?"Uložit změny":"Vytvořit zákazníka")]})]})]})]})}),e.jsx(ee,{isOpen:v.show,onClose:()=>_({show:!1,customer:null}),onConfirm:J,title:"Smazat zákazníka",message:`Opravdu chcete smazat zákazníka "${v.customer?.name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:q})]})}export{re as default}; +import{j as e,m as b,A as G}from"./vendor-animation-0s3FMHwK.js";import{r as l}from"./vendor-react-BVs3cwbi.js";import{a as Q,u as X,b as Y,c as S,F as m,C as ee}from"./index-Bay45BGf.js";import{F as ae}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const k="/api/admin",g=["street","city_postal","country","company_id","vat_id"],A={street:"Ulice",city_postal:"Město + PSČ",country:"Země",company_id:"IČO",vat_id:"DIČ"};function re(){const o=Q(),{hasPermission:x}=X(),[W,U]=l.useState(!0),[F,Z]=l.useState([]),[h,R]=l.useState(""),[D,N]=l.useState(!1),[p,z]=l.useState(null),[j,B]=l.useState(!1),[d,c]=l.useState({name:"",street:"",city:"",postal_code:"",country:"",company_id:"",vat_id:""}),[r,u]=l.useState([]),M=l.useRef(0),[O,y]=l.useState([...g]),[v,_]=l.useState({show:!1,customer:null}),[q,E]=l.useState(!1);Y(D);const C=l.useCallback(()=>{const a=[...g],t=[...O].filter(s=>s!=="name");for(const s of a)t.includes(s)||t.push(s);for(let s=0;ss.startsWith("custom_")?parseInt(s.split("_")[1]){const s=C(),n=a+t;if(n<0||n>=s.length)return;const i=[...s];[i[a],i[n]]=[i[n],i[a]],y(i)},V=a=>{if(A[a])return A[a];if(a.startsWith("custom_")){const t=parseInt(a.split("_")[1]),s=r[t];if(s)return s.name?`${s.name}: ${s.value||"..."}`:s.value||`Vlastní pole ${t+1}`}return a},f=l.useCallback(async()=>{try{const a=await S(`${k}/customers.php`);if(a.status===401)return;const t=await a.json();t.success?Z(t.data.customers):o.error(t.error||"Nepodařilo se načíst zákazníky")}catch{o.error("Chyba připojení")}finally{U(!1)}},[o]);l.useEffect(()=>{f()},[f]);const L=()=>{z(null),c({name:"",street:"",city:"",postal_code:"",country:"",company_id:"",vat_id:""}),u([]),y([...g]),N(!0)},H=a=>{z(a),c({name:a.name||"",street:a.street||"",city:a.city||"",postal_code:a.postal_code||"",country:a.country||"",company_id:a.company_id||"",vat_id:a.vat_id||""});const t=Array.isArray(a.custom_fields)&&a.custom_fields.length>0?a.custom_fields.map(s=>({...s,_key:`cf-${++M.current}`})):[];u(t),Array.isArray(a.customer_field_order)&&a.customer_field_order.length>0?y(a.customer_field_order):y([...g]),N(!0)},w=()=>{N(!1),z(null)},K=async()=>{if(!d.name.trim()){o.error("Název zákazníka je povinný");return}B(!0);try{const a=p?`${k}/customers.php?id=${p.id}`:`${k}/customers.php`,t={...d,custom_fields:r.filter(i=>i.name.trim()||i.value.trim()),customer_field_order:C()},n=await(await S(a,{method:p?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json();n.success?(w(),await new Promise(i=>setTimeout(i,300)),o.success(n.message||(p?"Zákazník byl aktualizován":"Zákazník byl vytvořen")),f()):o.error(n.error||"Nepodařilo se uložit zákazníka")}catch{o.error("Chyba připojení")}finally{B(!1)}},J=async()=>{if(v.customer){E(!0);try{const t=await(await S(`${k}/customers.php?id=${v.customer.id}`,{method:"DELETE"})).json();t.success?(_({show:!1,customer:null}),o.success(t.message||"Zákazník byl smazán"),f()):o.error(t.error||"Nepodařilo se smazat zákazníka")}catch{o.error("Chyba připojení")}finally{E(!1)}}};if(!x("offers.view"))return e.jsx(ae,{});const $=h?F.filter(a=>(a.name||"").toLowerCase().includes(h.toLowerCase())||(a.company_id||"").includes(h)||(a.city||"").toLowerCase().includes(h.toLowerCase())):F;if(W)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"160px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100%",borderRadius:"8px",marginBottom:"0.5rem"}}),[0,1,2,3,4].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))]})})]});const P=C();return e.jsxs("div",{children:[e.jsxs(b.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Zákazníci"}),e.jsx("p",{className:"admin-page-subtitle",children:"Správa zákazníků pro nabídky"})]}),x("offers.create")&&e.jsxs("button",{onClick:L,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat zákazníka"]})]}),e.jsx(b.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:h,onChange:a=>R(a.target.value),className:"admin-form-input",placeholder:"Hledat zákazníky..."})}),$.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("p",{children:h?"Žádní zákazníci odpovídající hledání.":"Zatím nejsou žádní zákazníci."}),!h&&x("offers.create")&&e.jsx("button",{onClick:L,className:"admin-btn admin-btn-primary",children:"Přidat prvního zákazníka"})]}):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:"Název"}),e.jsx("th",{children:"Město"}),e.jsx("th",{children:"IČO"}),e.jsx("th",{children:"DIČ"}),e.jsx("th",{children:"Nabídky"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:$.map(a=>e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("div",{style:{fontWeight:500,color:"var(--text-primary)"},children:a.name}),a.street&&e.jsx("div",{className:"text-tertiary",style:{fontSize:"11px"},children:a.street})]}),e.jsx("td",{children:a.city||"—"}),e.jsx("td",{children:a.company_id||"—"}),e.jsx("td",{children:a.vat_id||"—"}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-info",children:a.quotation_count||0})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[x("offers.edit")&&e.jsx("button",{onClick:()=>H(a),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",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"})]})}),x("offers.delete")&&e.jsx("button",{onClick:()=>_({show:!0,customer:a}),className:"admin-btn-icon danger",title:a.quotation_count>0?"Nelze smazat zákazníka s nabídkami":"Smazat","aria-label":a.quotation_count>0?"Nelze smazat zákazníka s nabídkami":"Smazat",disabled:a.quotation_count>0,children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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.id))})]})})]})}),e.jsx(G,{children:D&&e.jsxs(b.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:w}),e.jsxs(b.div,{className:"admin-modal",style:{maxWidth:720},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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:p?"Upravit zákazníka":"Nový zákazník"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(m,{label:"Název",required:!0,children:e.jsx("input",{type:"text",value:d.name,onChange:a=>c(t=>({...t,name:a.target.value})),className:"admin-form-input",placeholder:"Název firmy / jméno"})}),e.jsx(m,{label:"Ulice",children:e.jsx("input",{type:"text",value:d.street,onChange:a=>c(t=>({...t,street:a.target.value})),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(m,{label:"Město",children:e.jsx("input",{type:"text",value:d.city,onChange:a=>c(t=>({...t,city:a.target.value})),className:"admin-form-input"})}),e.jsx(m,{label:"PSČ",children:e.jsx("input",{type:"text",value:d.postal_code,onChange:a=>c(t=>({...t,postal_code:a.target.value})),className:"admin-form-input"})})]}),e.jsx(m,{label:"Země",children:e.jsx("input",{type:"text",value:d.country,onChange:a=>c(t=>({...t,country:a.target.value})),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(m,{label:"IČO",children:e.jsx("input",{type:"text",value:d.company_id,onChange:a=>c(t=>({...t,company_id:a.target.value})),className:"admin-form-input"})}),e.jsx(m,{label:"DIČ",children:e.jsx("input",{type:"text",value:d.vat_id,onChange:a=>c(t=>({...t,vat_id:a.target.value})),className:"admin-form-input"})})]}),e.jsxs("div",{style:{marginTop:4},children:[e.jsx("label",{className:"admin-form-label",style:{display:"block",marginBottom:4},children:"Vlastní pole"}),r.map((a,t)=>e.jsxs("div",{style:{marginBottom:8},children:[e.jsxs("div",{className:"admin-form-row",style:{marginBottom:0,alignItems:"flex-end"},children:[e.jsx(m,{label:t===0?"Název":" ",style:{flex:1},children:e.jsx("input",{type:"text",value:a.name,onChange:s=>{const n=[...r];n[t]={...n[t],name:s.target.value},u(n)},className:"admin-form-input",placeholder:"Např. Kontakt"})}),e.jsx(m,{label:t===0?"Hodnota":" ",style:{flex:1},children:e.jsxs("div",{style:{display:"flex",gap:4,alignItems:"center"},children:[e.jsx("input",{type:"text",value:a.value,onChange:s=>{const n=[...r];n[t]={...n[t],value:s.target.value},u(n)},className:"admin-form-input",style:{flex:1}}),e.jsx("button",{type:"button",onClick:()=>{const s=`custom_${t}`;y(n=>n.filter(i=>i!==s).map(i=>{if(i.startsWith("custom_")){const T=parseInt(i.split("_")[1]);if(T>t)return`custom_${T-1}`}return i})),u(r.filter((n,i)=>i!==t))},className:"admin-btn-icon danger",title:"Odebrat pole","aria-label":"Odebrat pole",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})})]}),e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:4},children:[e.jsx("input",{type:"checkbox",checked:a.showLabel!==!1,onChange:s=>{const n=[...r];n[t]={...n[t],showLabel:s.target.checked},u(n)}}),e.jsx("span",{style:{fontSize:"0.8rem"},children:"Zobrazit název v PDF"})]})]},a._key)),e.jsxs("button",{type:"button",onClick:()=>u([...r,{name:"",value:"",showLabel:!0,_key:`cf-${++M.current}`}]),className:"admin-btn admin-btn-secondary",style:{marginTop:4,fontSize:"0.85rem"},children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat pole"]})]}),e.jsxs("div",{style:{marginTop:16},children:[e.jsx("label",{className:"admin-form-label",children:"Pořadí polí v PDF"}),e.jsx("small",{className:"admin-form-hint",style:{display:"block",marginBottom:8},children:"Určuje pořadí řádků v adresním bloku zákazníka na PDF nabídce."}),e.jsx("div",{className:"admin-reorder-list",children:P.map((a,t)=>e.jsxs("div",{className:"admin-reorder-item",children:[e.jsxs("div",{className:"admin-reorder-arrows",children:[e.jsx("button",{type:"button",onClick:()=>I(t,-1),disabled:t===0,className:"admin-btn-icon",title:"Nahoru","aria-label":"Nahoru",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>I(t,1),disabled:t===P.length-1,className:"admin-btn-icon",title:"Dolů","aria-label":"Dolů",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})})]}),e.jsx("span",{className:`admin-reorder-label${a.startsWith("custom_")?" accent":""}`,children:V(a)})]},a))})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:w,className:"admin-btn admin-btn-secondary",disabled:j,children:"Zrušit"}),e.jsxs("button",{type:"button",onClick:K,className:"admin-btn admin-btn-primary",disabled:j,children:[j&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}),!j&&(p?"Uložit změny":"Vytvořit zákazníka")]})]})]})]})}),e.jsx(ee,{isOpen:v.show,onClose:()=>_({show:!1,customer:null}),onConfirm:J,title:"Smazat zákazníka",message:`Opravdu chcete smazat zákazníka "${v.customer?.name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:q})]})}export{re as default}; diff --git a/dist/assets/OffersTemplates-CmYh_zlm.js b/dist/assets/OffersTemplates-B33mRH0a.js similarity index 99% rename from dist/assets/OffersTemplates-CmYh_zlm.js rename to dist/assets/OffersTemplates-B33mRH0a.js index 15c5137..f643df3 100644 --- a/dist/assets/OffersTemplates-CmYh_zlm.js +++ b/dist/assets/OffersTemplates-B33mRH0a.js @@ -1 +1 @@ -import{j as e,m as k,A as D}from"./vendor-animation-0s3FMHwK.js";import{r as l}from"./vendor-react-BVs3cwbi.js";import{u as Z,a as U,b as A,c as N,F as j,C as W}from"./index-BrM8fzBu.js";import{F as H}from"./Forbidden-D25jV3Oq.js";import I from"./RichEditor-Bfur5pi6.js";import"./vendor-utils-Dyr8OjFr.js";const g="/api/admin";function ee(){const{hasPermission:n}=Z(),[f,w]=l.useState("items");return n("offers.settings")?e.jsxs("div",{children:[e.jsx(k.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Šablony"}),e.jsx("p",{className:"admin-page-subtitle",children:"Šablony položek a rozsahu projektu"})]})}),e.jsxs("div",{className:"offers-tabs",children:[e.jsx("button",{className:`offers-tab ${f==="items"?"active":""}`,onClick:()=>w("items"),children:"Šablony položek"}),e.jsx("button",{className:`offers-tab ${f==="scopes"?"active":""}`,onClick:()=>w("scopes"),children:"Šablony rozsahu"})]}),f==="items"?e.jsx(K,{}):e.jsx(R,{})]}):e.jsx(H,{})}function K(){const n=U(),[f,w]=l.useState(!0),[y,F]=l.useState([]),[z,m]=l.useState(!1),[h,T]=l.useState(null),[p,_]=l.useState(!1),[c,d]=l.useState({name:"",description:"",default_price:0,category:""}),[u,x]=l.useState({show:!1,template:null}),[$,E]=l.useState(!1);A(z);const b=l.useCallback(async()=>{try{const a=await N(`${g}/offers-templates.php?action=items`);if(a.status===401)return;const o=await a.json();o.success&&F(o.data.templates)}catch{n.error("Nepodařilo se načíst šablony")}finally{w(!1)}},[n]);l.useEffect(()=>{b()},[b]);const C=()=>{T(null),d({name:"",description:"",default_price:0,category:""}),m(!0)},P=a=>{T(a),d({name:a.name||"",description:a.description||"",default_price:a.default_price||0,category:a.category||""}),m(!0)},M=async()=>{if(!c.name.trim()){n.error("Název šablony je povinný");return}_(!0);try{const a=h?{...c,id:h.id}:c,S=await(await N(`${g}/offers-templates.php?action=item`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();S.success?(m(!1),await new Promise(B=>setTimeout(B,300)),n.success(S.message),b()):n.error(S.error)}catch{n.error("Chyba připojení")}finally{_(!1)}},O=async()=>{if(u.template){E(!0);try{const o=await(await N(`${g}/offers-templates.php?action=item&id=${u.template.id}`,{method:"DELETE"})).json();o.success?(x({show:!1,template:null}),n.success(o.message),b()):n.error(o.error)}catch{n.error("Chyba připojení")}finally{E(!1)}}};return f?e.jsx("div",{className:"admin-card",children: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 circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})}):e.jsxs(e.Fragment,{children:[e.jsxs(k.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-header flex-between",children:[e.jsxs("h3",{className:"admin-card-title",children:["Šablony položek (",y.length,")"]}),e.jsxs("button",{onClick:C,className:"admin-btn admin-btn-primary admin-btn-sm",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat"]})]}),e.jsx("div",{className:"admin-card-body",children:y.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Zatím žádné šablony položek."})}):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:"Název"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{children:"Cena"}),e.jsx("th",{children:"Kategorie"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:y.map(a=>e.jsxs("tr",{children:[e.jsx("td",{className:"fw-500",children:a.name}),e.jsx("td",{style:{color:"var(--text-secondary)"},children:a.description||"—"}),e.jsx("td",{children:Number(a.default_price).toFixed(2)}),e.jsx("td",{style:{color:"var(--text-secondary)"},children:a.category||"—"}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>P(a),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",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:()=>x({show:!0,template:a}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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.id))})]})})})]}),e.jsx(D,{children:z&&e.jsxs(k.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:()=>m(!1)}),e.jsxs(k.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:h?"Upravit šablonu":"Nová šablona položky"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(j,{label:"Název",required:!0,children:e.jsx("input",{type:"text",value:c.name,onChange:a=>d(o=>({...o,name:a.target.value})),className:"admin-form-input"})}),e.jsx(j,{label:"Popis",children:e.jsx("textarea",{value:c.description,onChange:a=>d(o=>({...o,description:a.target.value})),className:"admin-form-input",rows:2})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:"Výchozí cena",children:e.jsx("input",{type:"number",value:c.default_price,onChange:a=>d(o=>({...o,default_price:parseFloat(a.target.value)||0})),className:"admin-form-input",step:"0.01"})}),e.jsx(j,{label:"Kategorie",children:e.jsx("input",{type:"text",value:c.category,onChange:a=>d(o=>({...o,category:a.target.value})),className:"admin-form-input"})})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"admin-btn admin-btn-secondary",disabled:p,children:"Zrušit"}),e.jsxs("button",{type:"button",onClick:M,className:"admin-btn admin-btn-primary",disabled:p,children:[p&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}),!p&&(h?"Uložit":"Vytvořit")]})]})]})]})}),e.jsx(W,{isOpen:u.show,onClose:()=>x({show:!1,template:null}),onConfirm:O,title:"Smazat šablonu",message:`Opravdu chcete smazat šablonu "${u.template?.name}"?`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:$})]})}function R(){const n=U(),[f,w]=l.useState(!0),[y,F]=l.useState([]),[z,m]=l.useState(!1),[h,T]=l.useState(null),[p,_]=l.useState(!1),[c,d]=l.useState({name:"",sections:[]}),u=l.useRef(0),[x,$]=l.useState({show:!1,template:null}),[E,b]=l.useState(!1);A(z);const C=l.useCallback(async()=>{try{const s=await N(`${g}/offers-templates.php?action=scopes`);if(s.status===401)return;const t=await s.json();t.success&&F(t.data.templates)}catch{n.error("Nepodařilo se načíst šablony")}finally{w(!1)}},[n]);l.useEffect(()=>{C()},[C]);const P=()=>{T(null),d({name:"",sections:[{_key:`sc-${++u.current}`,title:"",title_cz:"",content:""}]}),m(!0)},M=async s=>{try{const i=await(await N(`${g}/offers-templates.php?action=scope_detail&id=${s.id}`)).json();i.success&&(T(i.data),d({name:i.data.name||"",sections:i.data.sections?.length?i.data.sections.map(r=>({_key:`sc-${++u.current}`,title:r.title||"",title_cz:r.title_cz||"",content:r.content||""})):[{_key:`sc-${++u.current}`,title:"",title_cz:"",content:""}]}),m(!0))}catch{n.error("Nepodařilo se načíst detail šablony")}},O=()=>{d(s=>({...s,sections:[...s.sections,{_key:`sc-${++u.current}`,title:"",title_cz:"",content:""}]}))},a=s=>{d(t=>({...t,sections:t.sections.filter((i,r)=>r!==s)}))},o=(s,t,i)=>{d(r=>({...r,sections:r.sections.map((v,V)=>V===s?{...v,[t]:i}:v)}))},S=(s,t)=>{d(i=>{const r=[...i.sections],v=s+t;return v<0||v>=r.length?i:([r[s],r[v]]=[r[v],r[s]],{...i,sections:r})})},B=async()=>{if(!c.name.trim()){n.error("Název šablony je povinný");return}_(!0);try{const s=h?{...c,id:h.id}:c,i=await(await N(`${g}/offers-templates.php?action=scope`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json();i.success?(m(!1),await new Promise(r=>setTimeout(r,300)),n.success(i.message),C()):n.error(i.error)}catch{n.error("Chyba připojení")}finally{_(!1)}},L=async()=>{if(x.template){b(!0);try{const t=await(await N(`${g}/offers-templates.php?action=scope&id=${x.template.id}`,{method:"DELETE"})).json();t.success?($({show:!1,template:null}),n.success(t.message),C()):n.error(t.error)}catch{n.error("Chyba připojení")}finally{b(!1)}}};return f?e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},s))})}):e.jsxs(e.Fragment,{children:[e.jsxs(k.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-header flex-between",children:[e.jsxs("h3",{className:"admin-card-title",children:["Šablony rozsahu (",y.length,")"]}),e.jsxs("button",{onClick:P,className:"admin-btn admin-btn-primary admin-btn-sm",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat"]})]}),e.jsx("div",{className:"admin-card-body",children:y.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Zatím žádné šablony rozsahu."})}):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:"Název"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:y.map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"fw-500",children:s.name}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>M(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",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,template:s}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id))})]})})})]}),e.jsx(D,{children:z&&e.jsxs(k.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:()=>m(!1)}),e.jsxs(k.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:h?"Upravit šablonu rozsahu":"Nová šablona rozsahu"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(j,{label:"Název šablony",required:!0,children:e.jsx("input",{type:"text",value:c.name,onChange:s=>d(t=>({...t,name:s.target.value})),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label mb-2",children:"Sekce"}),e.jsx("div",{className:"offers-scope-list",children:c.sections.map((s,t)=>e.jsxs("div",{className:"offers-scope-section",children:[e.jsxs("div",{className:"offers-scope-section-header",children:[e.jsxs("span",{className:"offers-scope-number",children:[t+1,"."]}),e.jsx("span",{className:"offers-scope-title",children:s.title||s.title_cz||`Sekce ${t+1}`}),e.jsxs("div",{className:"offers-scope-actions",children:[e.jsx("button",{type:"button",onClick:()=>S(t,-1),disabled:t===0,className:"admin-btn-icon",title:"Posunout nahoru","aria-label":"Posunout nahoru",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>S(t,1),disabled:t===c.sections.length-1,className:"admin-btn-icon",title:"Posunout dolů","aria-label":"Posunout dolů",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})}),c.sections.length>1&&e.jsx("button",{type:"button",onClick:()=>a(t),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"offers-lang-badge",children:"EN"})," Název sekce"]}),children:e.jsx("input",{type:"text",value:s.title,onChange:i=>o(t,"title",i.target.value),className:"admin-form-input",placeholder:"Název sekce (anglicky)"})}),e.jsx(j,{label:e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"offers-lang-badge offers-lang-badge-cz",children:"CZ"})," Název sekce"]}),children:e.jsx("input",{type:"text",value:s.title_cz,onChange:i=>o(t,"title_cz",i.target.value),className:"admin-form-input",placeholder:"Název sekce (česky)"})})]}),e.jsx(j,{label:"Obsah",children:e.jsx(I,{value:s.content,onChange:i=>o(t,"content",i),placeholder:"Obsah sekce...",minHeight:"150px"})})]})]},s._key))}),e.jsx("div",{style:{marginTop:"0.75rem"},children:e.jsx("button",{type:"button",onClick:O,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"+ Přidat sekci"})})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"admin-btn admin-btn-secondary",disabled:p,children:"Zrušit"}),e.jsxs("button",{type:"button",onClick:B,className:"admin-btn admin-btn-primary",disabled:p,children:[p&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}),!p&&(h?"Uložit":"Vytvořit")]})]})]})]})}),e.jsx(W,{isOpen:x.show,onClose:()=>$({show:!1,template:null}),onConfirm:L,title:"Smazat šablonu",message:`Opravdu chcete smazat šablonu "${x.template?.name}"?`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:E})]})}export{ee as default}; +import{j as e,m as k,A as D}from"./vendor-animation-0s3FMHwK.js";import{r as l}from"./vendor-react-BVs3cwbi.js";import{u as Z,a as U,b as A,c as N,F as j,C as W}from"./index-Bay45BGf.js";import{F as H}from"./Forbidden-D25jV3Oq.js";import I from"./RichEditor-Bfur5pi6.js";import"./vendor-utils-Dyr8OjFr.js";const g="/api/admin";function ee(){const{hasPermission:n}=Z(),[f,w]=l.useState("items");return n("offers.settings")?e.jsxs("div",{children:[e.jsx(k.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Šablony"}),e.jsx("p",{className:"admin-page-subtitle",children:"Šablony položek a rozsahu projektu"})]})}),e.jsxs("div",{className:"offers-tabs",children:[e.jsx("button",{className:`offers-tab ${f==="items"?"active":""}`,onClick:()=>w("items"),children:"Šablony položek"}),e.jsx("button",{className:`offers-tab ${f==="scopes"?"active":""}`,onClick:()=>w("scopes"),children:"Šablony rozsahu"})]}),f==="items"?e.jsx(K,{}):e.jsx(R,{})]}):e.jsx(H,{})}function K(){const n=U(),[f,w]=l.useState(!0),[y,F]=l.useState([]),[z,m]=l.useState(!1),[h,T]=l.useState(null),[p,_]=l.useState(!1),[c,d]=l.useState({name:"",description:"",default_price:0,category:""}),[u,x]=l.useState({show:!1,template:null}),[$,E]=l.useState(!1);A(z);const b=l.useCallback(async()=>{try{const a=await N(`${g}/offers-templates.php?action=items`);if(a.status===401)return;const o=await a.json();o.success&&F(o.data.templates)}catch{n.error("Nepodařilo se načíst šablony")}finally{w(!1)}},[n]);l.useEffect(()=>{b()},[b]);const C=()=>{T(null),d({name:"",description:"",default_price:0,category:""}),m(!0)},P=a=>{T(a),d({name:a.name||"",description:a.description||"",default_price:a.default_price||0,category:a.category||""}),m(!0)},M=async()=>{if(!c.name.trim()){n.error("Název šablony je povinný");return}_(!0);try{const a=h?{...c,id:h.id}:c,S=await(await N(`${g}/offers-templates.php?action=item`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();S.success?(m(!1),await new Promise(B=>setTimeout(B,300)),n.success(S.message),b()):n.error(S.error)}catch{n.error("Chyba připojení")}finally{_(!1)}},O=async()=>{if(u.template){E(!0);try{const o=await(await N(`${g}/offers-templates.php?action=item&id=${u.template.id}`,{method:"DELETE"})).json();o.success?(x({show:!1,template:null}),n.success(o.message),b()):n.error(o.error)}catch{n.error("Chyba připojení")}finally{E(!1)}}};return f?e.jsx("div",{className:"admin-card",children: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 circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})}):e.jsxs(e.Fragment,{children:[e.jsxs(k.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-header flex-between",children:[e.jsxs("h3",{className:"admin-card-title",children:["Šablony položek (",y.length,")"]}),e.jsxs("button",{onClick:C,className:"admin-btn admin-btn-primary admin-btn-sm",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat"]})]}),e.jsx("div",{className:"admin-card-body",children:y.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Zatím žádné šablony položek."})}):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:"Název"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{children:"Cena"}),e.jsx("th",{children:"Kategorie"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:y.map(a=>e.jsxs("tr",{children:[e.jsx("td",{className:"fw-500",children:a.name}),e.jsx("td",{style:{color:"var(--text-secondary)"},children:a.description||"—"}),e.jsx("td",{children:Number(a.default_price).toFixed(2)}),e.jsx("td",{style:{color:"var(--text-secondary)"},children:a.category||"—"}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>P(a),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",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:()=>x({show:!0,template:a}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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.id))})]})})})]}),e.jsx(D,{children:z&&e.jsxs(k.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:()=>m(!1)}),e.jsxs(k.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:h?"Upravit šablonu":"Nová šablona položky"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(j,{label:"Název",required:!0,children:e.jsx("input",{type:"text",value:c.name,onChange:a=>d(o=>({...o,name:a.target.value})),className:"admin-form-input"})}),e.jsx(j,{label:"Popis",children:e.jsx("textarea",{value:c.description,onChange:a=>d(o=>({...o,description:a.target.value})),className:"admin-form-input",rows:2})}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:"Výchozí cena",children:e.jsx("input",{type:"number",value:c.default_price,onChange:a=>d(o=>({...o,default_price:parseFloat(a.target.value)||0})),className:"admin-form-input",step:"0.01"})}),e.jsx(j,{label:"Kategorie",children:e.jsx("input",{type:"text",value:c.category,onChange:a=>d(o=>({...o,category:a.target.value})),className:"admin-form-input"})})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"admin-btn admin-btn-secondary",disabled:p,children:"Zrušit"}),e.jsxs("button",{type:"button",onClick:M,className:"admin-btn admin-btn-primary",disabled:p,children:[p&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}),!p&&(h?"Uložit":"Vytvořit")]})]})]})]})}),e.jsx(W,{isOpen:u.show,onClose:()=>x({show:!1,template:null}),onConfirm:O,title:"Smazat šablonu",message:`Opravdu chcete smazat šablonu "${u.template?.name}"?`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:$})]})}function R(){const n=U(),[f,w]=l.useState(!0),[y,F]=l.useState([]),[z,m]=l.useState(!1),[h,T]=l.useState(null),[p,_]=l.useState(!1),[c,d]=l.useState({name:"",sections:[]}),u=l.useRef(0),[x,$]=l.useState({show:!1,template:null}),[E,b]=l.useState(!1);A(z);const C=l.useCallback(async()=>{try{const s=await N(`${g}/offers-templates.php?action=scopes`);if(s.status===401)return;const t=await s.json();t.success&&F(t.data.templates)}catch{n.error("Nepodařilo se načíst šablony")}finally{w(!1)}},[n]);l.useEffect(()=>{C()},[C]);const P=()=>{T(null),d({name:"",sections:[{_key:`sc-${++u.current}`,title:"",title_cz:"",content:""}]}),m(!0)},M=async s=>{try{const i=await(await N(`${g}/offers-templates.php?action=scope_detail&id=${s.id}`)).json();i.success&&(T(i.data),d({name:i.data.name||"",sections:i.data.sections?.length?i.data.sections.map(r=>({_key:`sc-${++u.current}`,title:r.title||"",title_cz:r.title_cz||"",content:r.content||""})):[{_key:`sc-${++u.current}`,title:"",title_cz:"",content:""}]}),m(!0))}catch{n.error("Nepodařilo se načíst detail šablony")}},O=()=>{d(s=>({...s,sections:[...s.sections,{_key:`sc-${++u.current}`,title:"",title_cz:"",content:""}]}))},a=s=>{d(t=>({...t,sections:t.sections.filter((i,r)=>r!==s)}))},o=(s,t,i)=>{d(r=>({...r,sections:r.sections.map((v,V)=>V===s?{...v,[t]:i}:v)}))},S=(s,t)=>{d(i=>{const r=[...i.sections],v=s+t;return v<0||v>=r.length?i:([r[s],r[v]]=[r[v],r[s]],{...i,sections:r})})},B=async()=>{if(!c.name.trim()){n.error("Název šablony je povinný");return}_(!0);try{const s=h?{...c,id:h.id}:c,i=await(await N(`${g}/offers-templates.php?action=scope`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json();i.success?(m(!1),await new Promise(r=>setTimeout(r,300)),n.success(i.message),C()):n.error(i.error)}catch{n.error("Chyba připojení")}finally{_(!1)}},L=async()=>{if(x.template){b(!0);try{const t=await(await N(`${g}/offers-templates.php?action=scope&id=${x.template.id}`,{method:"DELETE"})).json();t.success?($({show:!1,template:null}),n.success(t.message),C()):n.error(t.error)}catch{n.error("Chyba připojení")}finally{b(!1)}}};return f?e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},s))})}):e.jsxs(e.Fragment,{children:[e.jsxs(k.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-header flex-between",children:[e.jsxs("h3",{className:"admin-card-title",children:["Šablony rozsahu (",y.length,")"]}),e.jsxs("button",{onClick:P,className:"admin-btn admin-btn-primary admin-btn-sm",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat"]})]}),e.jsx("div",{className:"admin-card-body",children:y.length===0?e.jsx("div",{className:"admin-empty-state",children:e.jsx("p",{children:"Zatím žádné šablony rozsahu."})}):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:"Název"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:y.map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"fw-500",children:s.name}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>M(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",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,template:s}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id))})]})})})]}),e.jsx(D,{children:z&&e.jsxs(k.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:()=>m(!1)}),e.jsxs(k.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:h?"Upravit šablonu rozsahu":"Nová šablona rozsahu"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(j,{label:"Název šablony",required:!0,children:e.jsx("input",{type:"text",value:c.name,onChange:s=>d(t=>({...t,name:s.target.value})),className:"admin-form-input"})}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label mb-2",children:"Sekce"}),e.jsx("div",{className:"offers-scope-list",children:c.sections.map((s,t)=>e.jsxs("div",{className:"offers-scope-section",children:[e.jsxs("div",{className:"offers-scope-section-header",children:[e.jsxs("span",{className:"offers-scope-number",children:[t+1,"."]}),e.jsx("span",{className:"offers-scope-title",children:s.title||s.title_cz||`Sekce ${t+1}`}),e.jsxs("div",{className:"offers-scope-actions",children:[e.jsx("button",{type:"button",onClick:()=>S(t,-1),disabled:t===0,className:"admin-btn-icon",title:"Posunout nahoru","aria-label":"Posunout nahoru",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 15l-6-6-6 6"})})}),e.jsx("button",{type:"button",onClick:()=>S(t,1),disabled:t===c.sections.length-1,className:"admin-btn-icon",title:"Posunout dolů","aria-label":"Posunout dolů",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M6 9l6 6 6-6"})})}),c.sections.length>1&&e.jsx("button",{type:"button",onClick:()=>a(t),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"offers-lang-badge",children:"EN"})," Název sekce"]}),children:e.jsx("input",{type:"text",value:s.title,onChange:i=>o(t,"title",i.target.value),className:"admin-form-input",placeholder:"Název sekce (anglicky)"})}),e.jsx(j,{label:e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"offers-lang-badge offers-lang-badge-cz",children:"CZ"})," Název sekce"]}),children:e.jsx("input",{type:"text",value:s.title_cz,onChange:i=>o(t,"title_cz",i.target.value),className:"admin-form-input",placeholder:"Název sekce (česky)"})})]}),e.jsx(j,{label:"Obsah",children:e.jsx(I,{value:s.content,onChange:i=>o(t,"content",i),placeholder:"Obsah sekce...",minHeight:"150px"})})]})]},s._key))}),e.jsx("div",{style:{marginTop:"0.75rem"},children:e.jsx("button",{type:"button",onClick:O,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"+ Přidat sekci"})})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"admin-btn admin-btn-secondary",disabled:p,children:"Zrušit"}),e.jsxs("button",{type:"button",onClick:B,className:"admin-btn admin-btn-primary",disabled:p,children:[p&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}),!p&&(h?"Uložit":"Vytvořit")]})]})]})]})}),e.jsx(W,{isOpen:x.show,onClose:()=>$({show:!1,template:null}),onConfirm:L,title:"Smazat šablonu",message:`Opravdu chcete smazat šablonu "${x.template?.name}"?`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:E})]})}export{ee as default}; diff --git a/dist/assets/OrderDetail-CV53xEih.js b/dist/assets/OrderDetail-BuD42-wn.js similarity index 99% rename from dist/assets/OrderDetail-CV53xEih.js rename to dist/assets/OrderDetail-BuD42-wn.js index 12c57fb..390249d 100644 --- a/dist/assets/OrderDetail-CV53xEih.js +++ b/dist/assets/OrderDetail-BuD42-wn.js @@ -1 +1 @@ -import{j as e,m as j}from"./vendor-animation-0s3FMHwK.js";import{h as Y,g as ee,r as i,L as x}from"./vendor-react-BVs3cwbi.js";import{a9 as se}from"./vendor-utils-Dyr8OjFr.js";import{a as te,u as ae,F as l,e as ne,g as y,C as U,c as h}from"./index-BrM8fzBu.js";import{F as ie}from"./Forbidden-D25jV3Oq.js";const p="/api/admin",Z={prijata:"Přijatá",v_realizaci:"V realizaci",dokoncena:"Dokončená",stornovana:"Stornována"},re={prijata:"admin-badge-order-prijata",v_realizaci:"admin-badge-order-realizace",dokoncena:"admin-badge-order-dokoncena",stornovana:"admin-badge-order-stornovana"},F={v_realizaci:"Zahájit realizaci",dokoncena:"Dokončit"},le={v_realizaci:"admin-btn admin-btn-primary",dokoncena:"admin-btn admin-btn-primary"};function pe(){const{id:o}=Y(),n=te(),{hasPermission:d}=ae(),v=ee(),[I,R]=i.useState(!0),[t,W]=i.useState(null),[w,_]=i.useState(""),[S,C]=i.useState(!1),[z,A]=i.useState(null),[c,f]=i.useState({show:!1,status:null}),[H,u]=i.useState(!1),[T,$]=i.useState(""),[b,L]=i.useState(!1),[O,P]=i.useState(!1),[V,N]=i.useState(!1),[J,E]=i.useState(!1),[M,B]=i.useState(!1),g=async()=>{try{const s=await h(`${p}/orders.php?action=detail&id=${o}`);if(s.status===401)return;const a=await s.json();a.success?(W(a.data),_(a.data.notes||"")):(n.error(a.error||"Nepodařilo se načíst objednávku"),v("/orders"))}catch{n.error("Chyba připojení"),v("/orders")}finally{R(!1)}};i.useEffect(()=>{g()},[o]);const k=i.useMemo(()=>{if(!t?.items)return{subtotal:0,vatAmount:0,total:0};const s=t.items.reduce((r,m)=>Number(m.is_included_in_total)?r+(Number(m.quantity)||0)*(Number(m.unit_price)||0):r,0),a=Number(t.apply_vat)?s*((Number(t.vat_rate)||0)/100):0;return{subtotal:s,vatAmount:a,total:s+a}},[t]);if(!d("orders.view"))return e.jsx(ie,{});const q=async()=>{if(c.status){A(c.status),f({show:!1,status:null});try{const a=await(await h(`${p}/orders.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:c.status})})).json();a.success?(n.success(a.message||"Stav byl změněn"),g()):n.error(a.error||"Nepodařilo se změnit stav")}catch{n.error("Chyba připojení")}finally{A(null)}}},K=()=>{$(t.order_number),u(!0)},D=async()=>{const s=T.trim();if(s){if(s===t.order_number){u(!1);return}L(!0);try{const r=await(await h(`${p}/orders.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_number:s})})).json();r.success?(n.success("Číslo objednávky bylo změněno"),u(!1),g()):n.error(r.error||"Nepodařilo se změnit číslo")}catch{n.error("Chyba připojení")}finally{L(!1)}}},G=async()=>{C(!0);try{const a=await(await h(`${p}/orders.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:w})})).json();a.success?n.success("Poznámky byly uloženy"):n.error(a.error||"Nepodařilo se uložit poznámky")}catch{n.error("Chyba připojení")}finally{C(!1)}},Q=async()=>{const s=window.open("","_blank");P(!0);try{const a=await h(`${p}/orders.php?action=attachment&id=${o}`);if(!a.ok){s.close(),n.error("Nepodařilo se stáhnout přílohu");return}const r=await a.blob(),m=URL.createObjectURL(r);s.location.href=m,setTimeout(()=>URL.revokeObjectURL(m),6e4)}catch{s.close(),n.error("Chyba připojení")}finally{P(!1)}},X=async()=>{E(!0);try{const a=await(await h(`${p}/orders.php?id=${o}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:M})})).json();a.success?(n.success(a.message||"Objednávka byla smazána"),v("/orders")):n.error(a.error||"Nepodařilo se smazat objednávku")}catch{n.error("Chyba připojení")}finally{E(!1),N(!1)}};return I?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row gap-2",children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(s=>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/2"})]},s))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-full"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-3/4"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-1/2"})})]},s))})})]}):t?e.jsxs("div",{children:[e.jsxs(j.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(x,{to:"/orders",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsx("div",{children:e.jsxs("h1",{className:"admin-page-title flex-row-gap",children:[H?e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:"0.5rem"},children:["Objednávka",e.jsx("input",{type:"text",value:T,onChange:s=>$(s.target.value),onKeyDown:s=>{s.key==="Enter"&&D(),s.key==="Escape"&&u(!1)},className:"admin-form-input",style:{width:"10rem",fontSize:"1rem",padding:"0.25rem 0.5rem",height:"auto"},autoFocus:!0,disabled:b}),e.jsx("button",{onClick:D,className:"admin-btn-icon",title:"Uložit","aria-label":"Uložit",disabled:b,children:e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent-color)",strokeWidth:"2",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})}),e.jsx("button",{onClick:()=>u(!1),className:"admin-btn-icon",title:"Zrušit","aria-label":"Zrušit",disabled:b,children:e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}):e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:"0.5rem"},children:["Objednávka ",t.order_number,d("orders.edit")&&e.jsx("button",{onClick:K,className:"admin-btn-icon",title:"Změnit číslo","aria-label":"Změnit číslo",style:{opacity:.5},children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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("span",{className:`admin-badge ${re[t.status]||""}`,children:Z[t.status]||t.status})]})})]}),e.jsxs("div",{className:"admin-page-actions",children:[t.invoice?e.jsxs(x,{to:`/invoices/${t.invoice.id}`,className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"Faktura ",t.invoice.invoice_number]}):d("invoices.create")&&t.status==="dokoncena"&&e.jsxs(x,{to:`/invoices/new?fromOrder=${t.id}`,className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"Vytvořit fakturu"]}),d("orders.edit")&&t.valid_transitions?.filter(s=>s!=="stornovana").length>0&&t.valid_transitions.filter(s=>s!=="stornovana").map(s=>e.jsx("button",{onClick:()=>f({show:!0,status:s}),className:le[s]||"admin-btn admin-btn-secondary",disabled:z===s,children:z===s?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):F[s]||s},s)),d("orders.delete")&&e.jsx("button",{onClick:()=>N(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsx(j.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:[e.jsx("h3",{className:"admin-card-title",children:"Informace"}),e.jsxs("div",{className:"admin-form-row mb-2",children:[e.jsx(l,{label:"Nabídka",children:e.jsxs("div",{children:[e.jsx(x,{to:`/offers/${t.quotation_id}`,className:"link-accent",children:t.quotation_number}),t.project_code&&e.jsxs("span",{className:"text-tertiary",style:{marginLeft:"0.5rem"},children:["(",t.project_code,")"]})]})}),e.jsx(l,{label:"Projekt",children:e.jsx("div",{children:t.project?e.jsxs(x,{to:`/projects/${t.project.id}`,className:"link-accent",children:[t.project.project_number," — ",t.project.name]}):"—"})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3 mb-2",children:[e.jsx(l,{label:"Zákazník",children:e.jsx("div",{className:"fw-500",children:t.customer_name||"—"})}),e.jsx(l,{label:"Číslo obj. zákazníka",children:e.jsx("div",{children:t.customer_order_number||"—"})}),e.jsx(l,{label:"Měna",children:e.jsx("div",{children:t.currency})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3 mb-2",children:[e.jsx(l,{label:"Datum vytvoření",children:e.jsx("div",{children:ne(t.created_at)})}),e.jsx(l,{label:"Příloha",children:e.jsx("div",{children:t.attachment_name?e.jsxs("button",{onClick:Q,className:"admin-btn admin-btn-secondary admin-btn-sm",style:{display:"inline-flex",alignItems:"center",gap:"0.4rem"},disabled:O,children:[O?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),t.attachment_name]}):"—"})})]})]})}),e.jsx(j.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Položky"}),t.items?.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",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"8rem",textAlign:"right",whiteSpace:"nowrap"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"4rem",textAlign:"center"},children:"V ceně"}),e.jsx("th",{style:{width:"9rem",textAlign:"right",whiteSpace:"nowrap"},children:"Celkem"})]})}),e.jsx("tbody",{children:t.items.map((s,a)=>{const r=(Number(s.quantity)||0)*(Number(s.unit_price)||0);return e.jsxs("tr",{children:[e.jsx("td",{style:{color:"var(--text-tertiary)",textAlign:"center",fontWeight:500},children:a+1}),e.jsxs("td",{children:[e.jsx("div",{className:"fw-500",children:s.description||"—"}),s.item_description&&e.jsx("div",{style:{fontSize:"0.8rem",color:"var(--text-tertiary)",marginTop:"0.25rem"},children:s.item_description})]}),e.jsx("td",{style:{textAlign:"center"},children:s.quantity}),e.jsx("td",{style:{textAlign:"center"},children:s.unit||"—"}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",whiteSpace:"nowrap"},children:y(s.unit_price,t.currency)}),e.jsx("td",{style:{textAlign:"center"},children:Number(s.is_included_in_total)?"Ano":"Ne"}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",fontWeight:600,whiteSpace:"nowrap"},children:y(r,t.currency)})]},s.id||a)})})]})}):e.jsx("p",{style:{color:"var(--text-tertiary)"},children:"Žádné položky."}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:y(k.subtotal,t.currency)})]}),Number(t.apply_vat)>0&&e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH (",t.vat_rate,"%):"]}),e.jsx("span",{children:y(k.vatAmount,t.currency)})]}),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:y(k.total,t.currency)})]})]})]})}),t.sections?.length>0&&e.jsx(j.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Rozsah projektu"}),t.scope_title&&e.jsx("div",{style:{fontWeight:500,marginBottom:"0.5rem"},children:t.scope_title}),t.scope_description&&e.jsx("div",{style:{color:"var(--text-secondary)",marginBottom:"1rem"},children:t.scope_description}),e.jsx("div",{className:"offers-scope-list",children:t.sections.map((s,a)=>e.jsxs("div",{className:"offers-scope-section",style:{cursor:"default"},children:[e.jsxs("div",{className:"offers-scope-section-header",children:[e.jsxs("span",{className:"offers-scope-number",children:[a+1,"."]}),e.jsx("span",{className:"offers-scope-title",children:(t.language==="CZ"?s.title_cz||s.title:s.title||s.title_cz)||`Sekce ${a+1}`})]}),s.content&&e.jsx("div",{className:"offers-scope-content rich-text-view",style:{padding:"1rem"},dangerouslySetInnerHTML:{__html:se.sanitize(s.content)}})]},s.id||a))})]})}),e.jsx(j.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.4},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Poznámky"}),e.jsx(l,{label:"Poznámky",children:e.jsx("textarea",{value:w,onChange:s=>_(s.target.value),className:"admin-form-input",rows:4,placeholder:"Interní poznámky k objednávce...",disabled:!d("orders.edit")})}),d("orders.edit")&&e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:G,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:S,children:S?"Ukládání...":"Uložit poznámky"})})]})}),e.jsx(U,{isOpen:c.show,onClose:()=>f({show:!1,status:null}),onConfirm:q,title:"Změnit stav objednávky",message:`Opravdu chcete změnit stav objednávky "${t.order_number}" na "${Z[c.status]}"?${c.status==="dokoncena"?" Projekt bude automaticky dokončen.":""}`,confirmText:F[c.status]||"Potvrdit",cancelText:"Zrušit",type:"default"}),e.jsx(U,{isOpen:V,onClose:()=>{N(!1),B(!1)},onConfirm:X,title:"Smazat objednávku",message:e.jsxs(e.Fragment,{children:['Opravdu chcete smazat objednávku "',t.order_number,'"? Bude smazán i přidružený projekt. Tato akce je nevratná.',t.project?.has_nas_folder&&e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:M,onChange:s=>B(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory projektu na disku"})]})]}),confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:J})]}):null}export{pe as default}; +import{j as e,m as j}from"./vendor-animation-0s3FMHwK.js";import{h as Y,g as ee,r as i,L as x}from"./vendor-react-BVs3cwbi.js";import{a9 as se}from"./vendor-utils-Dyr8OjFr.js";import{a as te,u as ae,F as l,e as ne,g as y,C as U,c as h}from"./index-Bay45BGf.js";import{F as ie}from"./Forbidden-D25jV3Oq.js";const p="/api/admin",Z={prijata:"Přijatá",v_realizaci:"V realizaci",dokoncena:"Dokončená",stornovana:"Stornována"},re={prijata:"admin-badge-order-prijata",v_realizaci:"admin-badge-order-realizace",dokoncena:"admin-badge-order-dokoncena",stornovana:"admin-badge-order-stornovana"},F={v_realizaci:"Zahájit realizaci",dokoncena:"Dokončit"},le={v_realizaci:"admin-btn admin-btn-primary",dokoncena:"admin-btn admin-btn-primary"};function pe(){const{id:o}=Y(),n=te(),{hasPermission:d}=ae(),v=ee(),[I,R]=i.useState(!0),[t,W]=i.useState(null),[w,_]=i.useState(""),[S,C]=i.useState(!1),[z,A]=i.useState(null),[c,f]=i.useState({show:!1,status:null}),[H,u]=i.useState(!1),[T,$]=i.useState(""),[b,L]=i.useState(!1),[O,P]=i.useState(!1),[V,N]=i.useState(!1),[J,E]=i.useState(!1),[M,B]=i.useState(!1),g=async()=>{try{const s=await h(`${p}/orders.php?action=detail&id=${o}`);if(s.status===401)return;const a=await s.json();a.success?(W(a.data),_(a.data.notes||"")):(n.error(a.error||"Nepodařilo se načíst objednávku"),v("/orders"))}catch{n.error("Chyba připojení"),v("/orders")}finally{R(!1)}};i.useEffect(()=>{g()},[o]);const k=i.useMemo(()=>{if(!t?.items)return{subtotal:0,vatAmount:0,total:0};const s=t.items.reduce((r,m)=>Number(m.is_included_in_total)?r+(Number(m.quantity)||0)*(Number(m.unit_price)||0):r,0),a=Number(t.apply_vat)?s*((Number(t.vat_rate)||0)/100):0;return{subtotal:s,vatAmount:a,total:s+a}},[t]);if(!d("orders.view"))return e.jsx(ie,{});const q=async()=>{if(c.status){A(c.status),f({show:!1,status:null});try{const a=await(await h(`${p}/orders.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:c.status})})).json();a.success?(n.success(a.message||"Stav byl změněn"),g()):n.error(a.error||"Nepodařilo se změnit stav")}catch{n.error("Chyba připojení")}finally{A(null)}}},K=()=>{$(t.order_number),u(!0)},D=async()=>{const s=T.trim();if(s){if(s===t.order_number){u(!1);return}L(!0);try{const r=await(await h(`${p}/orders.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_number:s})})).json();r.success?(n.success("Číslo objednávky bylo změněno"),u(!1),g()):n.error(r.error||"Nepodařilo se změnit číslo")}catch{n.error("Chyba připojení")}finally{L(!1)}}},G=async()=>{C(!0);try{const a=await(await h(`${p}/orders.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:w})})).json();a.success?n.success("Poznámky byly uloženy"):n.error(a.error||"Nepodařilo se uložit poznámky")}catch{n.error("Chyba připojení")}finally{C(!1)}},Q=async()=>{const s=window.open("","_blank");P(!0);try{const a=await h(`${p}/orders.php?action=attachment&id=${o}`);if(!a.ok){s.close(),n.error("Nepodařilo se stáhnout přílohu");return}const r=await a.blob(),m=URL.createObjectURL(r);s.location.href=m,setTimeout(()=>URL.revokeObjectURL(m),6e4)}catch{s.close(),n.error("Chyba připojení")}finally{P(!1)}},X=async()=>{E(!0);try{const a=await(await h(`${p}/orders.php?id=${o}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:M})})).json();a.success?(n.success(a.message||"Objednávka byla smazána"),v("/orders")):n.error(a.error||"Nepodařilo se smazat objednávku")}catch{n.error("Chyba připojení")}finally{E(!1),N(!1)}};return I?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row gap-2",children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(s=>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/2"})]},s))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-full"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-3/4"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-1/2"})})]},s))})})]}):t?e.jsxs("div",{children:[e.jsxs(j.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(x,{to:"/orders",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsx("div",{children:e.jsxs("h1",{className:"admin-page-title flex-row-gap",children:[H?e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:"0.5rem"},children:["Objednávka",e.jsx("input",{type:"text",value:T,onChange:s=>$(s.target.value),onKeyDown:s=>{s.key==="Enter"&&D(),s.key==="Escape"&&u(!1)},className:"admin-form-input",style:{width:"10rem",fontSize:"1rem",padding:"0.25rem 0.5rem",height:"auto"},autoFocus:!0,disabled:b}),e.jsx("button",{onClick:D,className:"admin-btn-icon",title:"Uložit","aria-label":"Uložit",disabled:b,children:e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent-color)",strokeWidth:"2",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})}),e.jsx("button",{onClick:()=>u(!1),className:"admin-btn-icon",title:"Zrušit","aria-label":"Zrušit",disabled:b,children:e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}):e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:"0.5rem"},children:["Objednávka ",t.order_number,d("orders.edit")&&e.jsx("button",{onClick:K,className:"admin-btn-icon",title:"Změnit číslo","aria-label":"Změnit číslo",style:{opacity:.5},children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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("span",{className:`admin-badge ${re[t.status]||""}`,children:Z[t.status]||t.status})]})})]}),e.jsxs("div",{className:"admin-page-actions",children:[t.invoice?e.jsxs(x,{to:`/invoices/${t.invoice.id}`,className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"Faktura ",t.invoice.invoice_number]}):d("invoices.create")&&t.status==="dokoncena"&&e.jsxs(x,{to:`/invoices/new?fromOrder=${t.id}`,className:"admin-btn admin-btn-secondary",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"Vytvořit fakturu"]}),d("orders.edit")&&t.valid_transitions?.filter(s=>s!=="stornovana").length>0&&t.valid_transitions.filter(s=>s!=="stornovana").map(s=>e.jsx("button",{onClick:()=>f({show:!0,status:s}),className:le[s]||"admin-btn admin-btn-secondary",disabled:z===s,children:z===s?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):F[s]||s},s)),d("orders.delete")&&e.jsx("button",{onClick:()=>N(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsx(j.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:[e.jsx("h3",{className:"admin-card-title",children:"Informace"}),e.jsxs("div",{className:"admin-form-row mb-2",children:[e.jsx(l,{label:"Nabídka",children:e.jsxs("div",{children:[e.jsx(x,{to:`/offers/${t.quotation_id}`,className:"link-accent",children:t.quotation_number}),t.project_code&&e.jsxs("span",{className:"text-tertiary",style:{marginLeft:"0.5rem"},children:["(",t.project_code,")"]})]})}),e.jsx(l,{label:"Projekt",children:e.jsx("div",{children:t.project?e.jsxs(x,{to:`/projects/${t.project.id}`,className:"link-accent",children:[t.project.project_number," — ",t.project.name]}):"—"})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3 mb-2",children:[e.jsx(l,{label:"Zákazník",children:e.jsx("div",{className:"fw-500",children:t.customer_name||"—"})}),e.jsx(l,{label:"Číslo obj. zákazníka",children:e.jsx("div",{children:t.customer_order_number||"—"})}),e.jsx(l,{label:"Měna",children:e.jsx("div",{children:t.currency})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3 mb-2",children:[e.jsx(l,{label:"Datum vytvoření",children:e.jsx("div",{children:ne(t.created_at)})}),e.jsx(l,{label:"Příloha",children:e.jsx("div",{children:t.attachment_name?e.jsxs("button",{onClick:Q,className:"admin-btn admin-btn-secondary admin-btn-sm",style:{display:"inline-flex",alignItems:"center",gap:"0.4rem"},disabled:O,children:[O?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),t.attachment_name]}):"—"})})]})]})}),e.jsx(j.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Položky"}),t.items?.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",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"8rem",textAlign:"right",whiteSpace:"nowrap"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"4rem",textAlign:"center"},children:"V ceně"}),e.jsx("th",{style:{width:"9rem",textAlign:"right",whiteSpace:"nowrap"},children:"Celkem"})]})}),e.jsx("tbody",{children:t.items.map((s,a)=>{const r=(Number(s.quantity)||0)*(Number(s.unit_price)||0);return e.jsxs("tr",{children:[e.jsx("td",{style:{color:"var(--text-tertiary)",textAlign:"center",fontWeight:500},children:a+1}),e.jsxs("td",{children:[e.jsx("div",{className:"fw-500",children:s.description||"—"}),s.item_description&&e.jsx("div",{style:{fontSize:"0.8rem",color:"var(--text-tertiary)",marginTop:"0.25rem"},children:s.item_description})]}),e.jsx("td",{style:{textAlign:"center"},children:s.quantity}),e.jsx("td",{style:{textAlign:"center"},children:s.unit||"—"}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",whiteSpace:"nowrap"},children:y(s.unit_price,t.currency)}),e.jsx("td",{style:{textAlign:"center"},children:Number(s.is_included_in_total)?"Ano":"Ne"}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",fontWeight:600,whiteSpace:"nowrap"},children:y(r,t.currency)})]},s.id||a)})})]})}):e.jsx("p",{style:{color:"var(--text-tertiary)"},children:"Žádné položky."}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:y(k.subtotal,t.currency)})]}),Number(t.apply_vat)>0&&e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH (",t.vat_rate,"%):"]}),e.jsx("span",{children:y(k.vatAmount,t.currency)})]}),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:y(k.total,t.currency)})]})]})]})}),t.sections?.length>0&&e.jsx(j.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Rozsah projektu"}),t.scope_title&&e.jsx("div",{style:{fontWeight:500,marginBottom:"0.5rem"},children:t.scope_title}),t.scope_description&&e.jsx("div",{style:{color:"var(--text-secondary)",marginBottom:"1rem"},children:t.scope_description}),e.jsx("div",{className:"offers-scope-list",children:t.sections.map((s,a)=>e.jsxs("div",{className:"offers-scope-section",style:{cursor:"default"},children:[e.jsxs("div",{className:"offers-scope-section-header",children:[e.jsxs("span",{className:"offers-scope-number",children:[a+1,"."]}),e.jsx("span",{className:"offers-scope-title",children:(t.language==="CZ"?s.title_cz||s.title:s.title||s.title_cz)||`Sekce ${a+1}`})]}),s.content&&e.jsx("div",{className:"offers-scope-content rich-text-view",style:{padding:"1rem"},dangerouslySetInnerHTML:{__html:se.sanitize(s.content)}})]},s.id||a))})]})}),e.jsx(j.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.4},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Poznámky"}),e.jsx(l,{label:"Poznámky",children:e.jsx("textarea",{value:w,onChange:s=>_(s.target.value),className:"admin-form-input",rows:4,placeholder:"Interní poznámky k objednávce...",disabled:!d("orders.edit")})}),d("orders.edit")&&e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:G,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:S,children:S?"Ukládání...":"Uložit poznámky"})})]})}),e.jsx(U,{isOpen:c.show,onClose:()=>f({show:!1,status:null}),onConfirm:q,title:"Změnit stav objednávky",message:`Opravdu chcete změnit stav objednávky "${t.order_number}" na "${Z[c.status]}"?${c.status==="dokoncena"?" Projekt bude automaticky dokončen.":""}`,confirmText:F[c.status]||"Potvrdit",cancelText:"Zrušit",type:"default"}),e.jsx(U,{isOpen:V,onClose:()=>{N(!1),B(!1)},onConfirm:X,title:"Smazat objednávku",message:e.jsxs(e.Fragment,{children:['Opravdu chcete smazat objednávku "',t.order_number,'"? Bude smazán i přidružený projekt. Tato akce je nevratná.',t.project?.has_nas_folder&&e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:M,onChange:s=>B(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory projektu na disku"})]})]}),confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:J})]}):null}export{pe as default}; diff --git a/dist/assets/Orders-CtS3KkKW.js b/dist/assets/Orders-D38dm3L_.js similarity index 98% rename from dist/assets/Orders-CtS3KkKW.js rename to dist/assets/Orders-D38dm3L_.js index e599a87..29ec44a 100644 --- a/dist/assets/Orders-CtS3KkKW.js +++ b/dist/assets/Orders-D38dm3L_.js @@ -1 +1 @@ -import{j as e,m as N}from"./vendor-animation-0s3FMHwK.js";import{r as a,L as i}from"./vendor-react-BVs3cwbi.js";import{a as _,u as B,d as D,e as T,g as A,C as L,c as E}from"./index-BrM8fzBu.js";import{F as M}from"./Forbidden-D25jV3Oq.js";import{u as O,a as P,S as v}from"./useListData-Bz9Xh_CU.js";import{P as V}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const $="/api/admin",F={prijata:"Přijatá",v_realizaci:"V realizaci",dokoncena:"Dokončená",stornovana:"Stornována"},W={prijata:"admin-badge-order-prijata",v_realizaci:"admin-badge-order-realizace",dokoncena:"admin-badge-order-dokoncena",stornovana:"admin-badge-order-stornovana"};function K(){const r=_(),{hasPermission:d}=B(),{sort:g,order:n,handleSort:o,activeSort:c}=O("order_number"),[p,f]=a.useState(""),[b,u]=a.useState(1),[t,m]=a.useState({show:!1,order:null}),[w,k]=a.useState(!1),[y,h]=a.useState(!1),{items:l,loading:S,pagination:x,refetch:z}=P("orders.php",{dataKey:"orders",search:p,sort:g,order:n,page:b,errorMsg:"Nepodařilo se načíst objednávky"});if(!d("orders.view"))return e.jsx(M,{});const C=async()=>{if(t.order){k(!0);try{const j=await(await E(`${$}/orders.php?id=${t.order.id}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:y})})).json();j.success?(m({show:!1,order:null}),h(!1),r.success(j.message||"Objednávka byla smazána"),z()):r.error(j.error||"Nepodařilo se smazat objednávku")}catch{r.error("Chyba připojení")}finally{k(!1)}}};return S?e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-3/4",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]})]})})]})}):e.jsxs("div",{children:[e.jsx(N.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Objednávky"}),e.jsxs("p",{className:"admin-page-subtitle",children:[x?.total??l.length," ",D(x?.total??l.length,"objednávka","objednávky","objednávek")]})]})}),e.jsx(N.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:p,onChange:s=>{f(s.target.value),u(1)},className:"admin-form-input",placeholder:"Hledat podle čísla, nabídky, projektu nebo zákazníka..."})}),l.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"}),e.jsx("line",{x1:"3",y1:"6",x2:"21",y2:"6"}),e.jsx("path",{d:"M16 10a4 4 0 0 1-8 0"})]})}),e.jsx("p",{children:"Zatím nejsou žádné objednávky."}),e.jsx("p",{className:"text-tertiary",style:{fontSize:"0.875rem"},children:"Objednávky se vytvářejí z nabídek."})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>o("order_number"),children:["Číslo ",e.jsx(v,{column:"order_number",sort:c,order:n})]}),e.jsx("th",{children:"Nabídka"}),e.jsx("th",{children:"Zákazník"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>o("status"),children:["Stav ",e.jsx(v,{column:"status",sort:c,order:n})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>o("created_at"),children:["Datum ",e.jsx(v,{column:"created_at",sort:c,order:n})]}),e.jsx("th",{className:"text-right",children:"Celkem"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:l.map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:e.jsx(i,{to:`/orders/${s.id}`,className:"link-accent",children:s.order_number})}),e.jsx("td",{children:e.jsx(i,{to:`/offers/${s.quotation_id}`,className:"text-secondary",style:{textDecoration:"none"},children:s.quotation_number})}),e.jsx("td",{children:s.customer_name||"—"}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${W[s.status]||""}`,children:F[s.status]||s.status})}),e.jsx("td",{className:"admin-mono",children:T(s.created_at)}),e.jsx("td",{className:"admin-mono text-right fw-500",children:A(s.total,s.currency)}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(i,{to:`/orders/${s.id}`,className:"admin-btn-icon",title:"Detail","aria-label":"Detail",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}),s.invoice_id?e.jsx(i,{to:`/invoices/${s.invoice_id}`,className:"admin-btn-icon accent",title:"Zobrazit fakturu","aria-label":"Zobrazit fakturu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("text",{x:"12",y:"16.5",textAnchor:"middle",fill:"currentColor",stroke:"none",fontSize:"9",fontWeight:"700",children:"F"})]})}):d("invoices.create")&&e.jsx(i,{to:`/invoices/new?fromOrder=${s.id}`,className:"admin-btn-icon",title:"Vytvořit fakturu","aria-label":"Vytvořit fakturu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]})}),d("orders.delete")&&e.jsx("button",{onClick:()=>m({show:!0,order:s}),className:"admin-btn-icon danger",title:"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id))})]})}),e.jsx(V,{pagination:x,onPageChange:u})]})}),e.jsx(L,{isOpen:t.show,onClose:()=>{m({show:!1,order:null}),h(!1)},onConfirm:C,title:"Smazat objednávku",message:e.jsxs(e.Fragment,{children:['Opravdu chcete smazat objednávku "',t.order?.order_number,'"? Bude smazán i přidružený projekt. Tato akce je nevratná.',e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:y,onChange:s=>h(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory projektu na disku"})]})]}),confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:w})]})}export{K as default}; +import{j as e,m as N}from"./vendor-animation-0s3FMHwK.js";import{r as a,L as i}from"./vendor-react-BVs3cwbi.js";import{a as _,u as B,d as D,e as T,g as A,C as L,c as E}from"./index-Bay45BGf.js";import{F as M}from"./Forbidden-D25jV3Oq.js";import{u as O,a as P,S as v}from"./useListData-CvOpK9He.js";import{P as V}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const $="/api/admin",F={prijata:"Přijatá",v_realizaci:"V realizaci",dokoncena:"Dokončená",stornovana:"Stornována"},W={prijata:"admin-badge-order-prijata",v_realizaci:"admin-badge-order-realizace",dokoncena:"admin-badge-order-dokoncena",stornovana:"admin-badge-order-stornovana"};function K(){const r=_(),{hasPermission:d}=B(),{sort:g,order:n,handleSort:o,activeSort:c}=O("order_number"),[p,f]=a.useState(""),[b,u]=a.useState(1),[t,m]=a.useState({show:!1,order:null}),[w,k]=a.useState(!1),[y,h]=a.useState(!1),{items:l,loading:S,pagination:x,refetch:z}=P("orders.php",{dataKey:"orders",search:p,sort:g,order:n,page:b,errorMsg:"Nepodařilo se načíst objednávky"});if(!d("orders.view"))return e.jsx(M,{});const C=async()=>{if(t.order){k(!0);try{const j=await(await E(`${$}/orders.php?id=${t.order.id}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:y})})).json();j.success?(m({show:!1,order:null}),h(!1),r.success(j.message||"Objednávka byla smazána"),z()):r.error(j.error||"Nepodařilo se smazat objednávku")}catch{r.error("Chyba připojení")}finally{k(!1)}}};return S?e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-3/4",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]})]})})]})}):e.jsxs("div",{children:[e.jsx(N.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Objednávky"}),e.jsxs("p",{className:"admin-page-subtitle",children:[x?.total??l.length," ",D(x?.total??l.length,"objednávka","objednávky","objednávek")]})]})}),e.jsx(N.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:p,onChange:s=>{f(s.target.value),u(1)},className:"admin-form-input",placeholder:"Hledat podle čísla, nabídky, projektu nebo zákazníka..."})}),l.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"}),e.jsx("line",{x1:"3",y1:"6",x2:"21",y2:"6"}),e.jsx("path",{d:"M16 10a4 4 0 0 1-8 0"})]})}),e.jsx("p",{children:"Zatím nejsou žádné objednávky."}),e.jsx("p",{className:"text-tertiary",style:{fontSize:"0.875rem"},children:"Objednávky se vytvářejí z nabídek."})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>o("order_number"),children:["Číslo ",e.jsx(v,{column:"order_number",sort:c,order:n})]}),e.jsx("th",{children:"Nabídka"}),e.jsx("th",{children:"Zákazník"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>o("status"),children:["Stav ",e.jsx(v,{column:"status",sort:c,order:n})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>o("created_at"),children:["Datum ",e.jsx(v,{column:"created_at",sort:c,order:n})]}),e.jsx("th",{className:"text-right",children:"Celkem"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:l.map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:e.jsx(i,{to:`/orders/${s.id}`,className:"link-accent",children:s.order_number})}),e.jsx("td",{children:e.jsx(i,{to:`/offers/${s.quotation_id}`,className:"text-secondary",style:{textDecoration:"none"},children:s.quotation_number})}),e.jsx("td",{children:s.customer_name||"—"}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${W[s.status]||""}`,children:F[s.status]||s.status})}),e.jsx("td",{className:"admin-mono",children:T(s.created_at)}),e.jsx("td",{className:"admin-mono text-right fw-500",children:A(s.total,s.currency)}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(i,{to:`/orders/${s.id}`,className:"admin-btn-icon",title:"Detail","aria-label":"Detail",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}),s.invoice_id?e.jsx(i,{to:`/invoices/${s.invoice_id}`,className:"admin-btn-icon accent",title:"Zobrazit fakturu","aria-label":"Zobrazit fakturu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("text",{x:"12",y:"16.5",textAnchor:"middle",fill:"currentColor",stroke:"none",fontSize:"9",fontWeight:"700",children:"F"})]})}):d("invoices.create")&&e.jsx(i,{to:`/invoices/new?fromOrder=${s.id}`,className:"admin-btn-icon",title:"Vytvořit fakturu","aria-label":"Vytvořit fakturu",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]})}),d("orders.delete")&&e.jsx("button",{onClick:()=>m({show:!0,order:s}),className:"admin-btn-icon danger",title:"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id))})]})}),e.jsx(V,{pagination:x,onPageChange:u})]})}),e.jsx(L,{isOpen:t.show,onClose:()=>{m({show:!1,order:null}),h(!1)},onConfirm:C,title:"Smazat objednávku",message:e.jsxs(e.Fragment,{children:['Opravdu chcete smazat objednávku "',t.order?.order_number,'"? Bude smazán i přidružený projekt. Tato akce je nevratná.',e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:y,onChange:s=>h(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory projektu na disku"})]})]}),confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:w})]})}export{K as default}; diff --git a/dist/assets/ProjectCreate-CXtZIMX9.js b/dist/assets/ProjectCreate-DBbdjy48.js similarity index 98% rename from dist/assets/ProjectCreate-CXtZIMX9.js rename to dist/assets/ProjectCreate-DBbdjy48.js index c871dd1..01103b5 100644 --- a/dist/assets/ProjectCreate-CXtZIMX9.js +++ b/dist/assets/ProjectCreate-DBbdjy48.js @@ -1 +1 @@ -import{j as e,m as C}from"./vendor-animation-0s3FMHwK.js";import{g as $,r,L as M}from"./vendor-react-BVs3cwbi.js";import{a as q,u as B,F as c,A as T,c as p}from"./index-BrM8fzBu.js";import{F as U}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const h="/api/admin";function G(){const S=$(),d=q(),{hasPermission:z}=B(),[t,l]=r.useState({project_number:"",name:"",customer_id:null,customer_name:"",start_date:new Date().toISOString().split("T")[0],responsible_user_id:""}),[D,E]=r.useState([]),[f,y]=r.useState(!1),[b,j]=r.useState({}),[F,L]=r.useState(!0),[x,P]=r.useState([]),[i,N]=r.useState(""),[v,m]=r.useState(!1);r.useEffect(()=>{(async()=>{try{const[a,n,o]=await Promise.all([p(`${h}/projects.php?action=next_number`),p(`${h}/customers.php`),p(`${h}/projects.php?action=users`)]),_=await a.json();_.success&&l(Z=>({...Z,project_number:_.data.number}));const w=await n.json();w.success&&P(w.data.customers);const g=await o.json();g.success&&E(g.data.users)}catch{d.error("Chyba při načítání dat")}finally{L(!1)}})()},[d]);const k=r.useMemo(()=>{if(!i)return x;const s=i.toLowerCase();return x.filter(a=>(a.name||"").toLowerCase().includes(s)||(a.company_id||"").includes(i)||(a.city||"").toLowerCase().includes(s))},[x,i]);if(r.useEffect(()=>{const s=()=>m(!1);if(v)return document.addEventListener("click",s),()=>document.removeEventListener("click",s)},[v]),!z("projects.create"))return e.jsx(U,{});const O=s=>{l(a=>({...a,customer_id:s.id,customer_name:s.name})),j(a=>({...a,customer_id:void 0})),N(""),m(!1)},A=()=>{l(s=>({...s,customer_id:null,customer_name:""}))},u=(s,a)=>{l(n=>({...n,[s]:a})),j(n=>({...n,[s]:void 0}))},R=async()=>{const s={};if(t.name.trim()||(s.name="Název projektu je povinný"),t.customer_id||(s.customer_id="Vyberte zákazníka"),j(s),!(Object.keys(s).length>0)){y(!0);try{const a={name:t.name.trim(),customer_id:t.customer_id,start_date:t.start_date,project_number:t.project_number.trim(),responsible_user_id:t.responsible_user_id||null},o=await(await p(`${h}/projects.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();o.success?S(`/projects/${o.data.project_id}`,{state:{created:!0}}):d.error(o.error||"Nepodařilo se vytvořit projekt")}catch{d.error("Chyba připojení")}finally{y(!1)}}};return F?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(s=>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/2"})]},s))})})]}):e.jsxs("div",{children:[e.jsxs(C.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(M,{to:"/projects",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nový projekt"}),e.jsx("p",{className:"admin-page-subtitle",children:"Ruční vytvoření projektu"})]})]}),e.jsx("div",{className:"admin-page-actions",children:e.jsx("button",{onClick:R,disabled:f,className:"admin-btn admin-btn-primary",children:f?"Ukládám...":"Uložit"})})]}),e.jsx(C.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},style:{overflow:"visible"},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(c,{label:"Číslo projektu",children:e.jsx("input",{type:"text",value:t.project_number,onChange:s=>u("project_number",s.target.value),className:"admin-form-input",placeholder:"Ponechte prázdné pro automatické"})}),e.jsx(c,{label:"Název",error:b.name,required:!0,children:e.jsx("input",{type:"text",value:t.name,onChange:s=>u("name",s.target.value),className:"admin-form-input",placeholder:"Název projektu"})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(c,{label:"Zákazník",error:b.customer_id,required:!0,children:t.customer_id?e.jsxs("div",{className:"offers-customer-selected",children:[e.jsx("span",{children:t.customer_name}),e.jsx("button",{type:"button",onClick:A,className:"admin-btn-icon",title:"Odebrat zákazníka","aria-label":"Odebrat zákazníka",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}):e.jsxs("div",{className:"offers-customer-select",onClick:s=>s.stopPropagation(),children:[e.jsx("input",{type:"text",value:i,onChange:s=>{N(s.target.value),m(!0)},onFocus:()=>m(!0),className:"admin-form-input",placeholder:"Hledat zákazníka..."}),v&&e.jsx("div",{className:"offers-customer-dropdown",children:k.length===0?e.jsx("div",{className:"offers-customer-dropdown-empty",children:"Žádní zákazníci"}):k.slice(0,20).map(s=>e.jsxs("div",{className:"offers-customer-dropdown-item",onMouseDown:()=>O(s),children:[e.jsx("div",{children:s.name}),s.city&&e.jsx("div",{children:s.city})]},s.id))})]})}),e.jsx(c,{label:"Datum zahájení",children:e.jsx(T,{mode:"date",value:t.start_date,onChange:s=>u("start_date",s)})})]}),e.jsx("div",{className:"admin-form-row",children:e.jsx(c,{label:"Zodpovědná osoba",children:e.jsxs("select",{value:t.responsible_user_id,onChange:s=>u("responsible_user_id",s.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"",children:"— Nevybráno —"}),D.map(s=>e.jsx("option",{value:s.id,children:s.name},s.id))]})})})]})]})})]})}export{G as default}; +import{j as e,m as C}from"./vendor-animation-0s3FMHwK.js";import{g as $,r,L as M}from"./vendor-react-BVs3cwbi.js";import{a as q,u as B,F as c,A as T,c as p}from"./index-Bay45BGf.js";import{F as U}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const h="/api/admin";function G(){const S=$(),d=q(),{hasPermission:z}=B(),[t,l]=r.useState({project_number:"",name:"",customer_id:null,customer_name:"",start_date:new Date().toISOString().split("T")[0],responsible_user_id:""}),[D,E]=r.useState([]),[f,y]=r.useState(!1),[b,j]=r.useState({}),[F,L]=r.useState(!0),[x,P]=r.useState([]),[i,N]=r.useState(""),[v,m]=r.useState(!1);r.useEffect(()=>{(async()=>{try{const[a,n,o]=await Promise.all([p(`${h}/projects.php?action=next_number`),p(`${h}/customers.php`),p(`${h}/projects.php?action=users`)]),_=await a.json();_.success&&l(Z=>({...Z,project_number:_.data.number}));const w=await n.json();w.success&&P(w.data.customers);const g=await o.json();g.success&&E(g.data.users)}catch{d.error("Chyba při načítání dat")}finally{L(!1)}})()},[d]);const k=r.useMemo(()=>{if(!i)return x;const s=i.toLowerCase();return x.filter(a=>(a.name||"").toLowerCase().includes(s)||(a.company_id||"").includes(i)||(a.city||"").toLowerCase().includes(s))},[x,i]);if(r.useEffect(()=>{const s=()=>m(!1);if(v)return document.addEventListener("click",s),()=>document.removeEventListener("click",s)},[v]),!z("projects.create"))return e.jsx(U,{});const O=s=>{l(a=>({...a,customer_id:s.id,customer_name:s.name})),j(a=>({...a,customer_id:void 0})),N(""),m(!1)},A=()=>{l(s=>({...s,customer_id:null,customer_name:""}))},u=(s,a)=>{l(n=>({...n,[s]:a})),j(n=>({...n,[s]:void 0}))},R=async()=>{const s={};if(t.name.trim()||(s.name="Název projektu je povinný"),t.customer_id||(s.customer_id="Vyberte zákazníka"),j(s),!(Object.keys(s).length>0)){y(!0);try{const a={name:t.name.trim(),customer_id:t.customer_id,start_date:t.start_date,project_number:t.project_number.trim(),responsible_user_id:t.responsible_user_id||null},o=await(await p(`${h}/projects.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();o.success?S(`/projects/${o.data.project_id}`,{state:{created:!0}}):d.error(o.error||"Nepodařilo se vytvořit projekt")}catch{d.error("Chyba připojení")}finally{y(!1)}}};return F?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(s=>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/2"})]},s))})})]}):e.jsxs("div",{children:[e.jsxs(C.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(M,{to:"/projects",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nový projekt"}),e.jsx("p",{className:"admin-page-subtitle",children:"Ruční vytvoření projektu"})]})]}),e.jsx("div",{className:"admin-page-actions",children:e.jsx("button",{onClick:R,disabled:f,className:"admin-btn admin-btn-primary",children:f?"Ukládám...":"Uložit"})})]}),e.jsx(C.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},style:{overflow:"visible"},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(c,{label:"Číslo projektu",children:e.jsx("input",{type:"text",value:t.project_number,onChange:s=>u("project_number",s.target.value),className:"admin-form-input",placeholder:"Ponechte prázdné pro automatické"})}),e.jsx(c,{label:"Název",error:b.name,required:!0,children:e.jsx("input",{type:"text",value:t.name,onChange:s=>u("name",s.target.value),className:"admin-form-input",placeholder:"Název projektu"})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(c,{label:"Zákazník",error:b.customer_id,required:!0,children:t.customer_id?e.jsxs("div",{className:"offers-customer-selected",children:[e.jsx("span",{children:t.customer_name}),e.jsx("button",{type:"button",onClick:A,className:"admin-btn-icon",title:"Odebrat zákazníka","aria-label":"Odebrat zákazníka",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}):e.jsxs("div",{className:"offers-customer-select",onClick:s=>s.stopPropagation(),children:[e.jsx("input",{type:"text",value:i,onChange:s=>{N(s.target.value),m(!0)},onFocus:()=>m(!0),className:"admin-form-input",placeholder:"Hledat zákazníka..."}),v&&e.jsx("div",{className:"offers-customer-dropdown",children:k.length===0?e.jsx("div",{className:"offers-customer-dropdown-empty",children:"Žádní zákazníci"}):k.slice(0,20).map(s=>e.jsxs("div",{className:"offers-customer-dropdown-item",onMouseDown:()=>O(s),children:[e.jsx("div",{children:s.name}),s.city&&e.jsx("div",{children:s.city})]},s.id))})]})}),e.jsx(c,{label:"Datum zahájení",children:e.jsx(T,{mode:"date",value:t.start_date,onChange:s=>u("start_date",s)})})]}),e.jsx("div",{className:"admin-form-row",children:e.jsx(c,{label:"Zodpovědná osoba",children:e.jsxs("select",{value:t.responsible_user_id,onChange:s=>u("responsible_user_id",s.target.value),className:"admin-form-select",children:[e.jsx("option",{value:"",children:"— Nevybráno —"}),D.map(s=>e.jsx("option",{value:s.id,children:s.name},s.id))]})})})]})]})})]})}export{G as default}; diff --git a/dist/assets/ProjectDetail-B_QNS7Ph.js b/dist/assets/ProjectDetail-B_QNS7Ph.js new file mode 100644 index 0000000..0dcdc6e --- /dev/null +++ b/dist/assets/ProjectDetail-B_QNS7Ph.js @@ -0,0 +1 @@ +import{j as e,m as G}from"./vendor-animation-0s3FMHwK.js";import{r,h as ue,g as xe,u as je,L as ie}from"./vendor-react-BVs3cwbi.js";import{a as de,c as u,C as ce,u as ye,F as w,A as le}from"./index-Bay45BGf.js";import{F as fe}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const E="/api/admin";function ve(o,i){if(o==="folder")return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"#e6a817",strokeWidth:"1.5",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z",fill:"rgba(230, 168, 23, 0.15)"})});const b=(i||"").toLowerCase(),l={pdf:{color:"#e74c3c",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},doc:{color:"#3498db",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},docx:{color:"#3498db",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},xls:{color:"#27ae60",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},xlsx:{color:"#27ae60",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},ppt:{color:"#e67e22",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},pptx:{color:"#e67e22",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},jpg:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},jpeg:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},png:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},gif:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},zip:{color:"#e67e22",path:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},rar:{color:"#e67e22",path:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},"7z":{color:"#e67e22",path:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},dwg:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},dxf:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},step:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},stp:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}}[b]||{color:"var(--text-muted)",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"};return e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:l.color,strokeWidth:"1.5",children:[e.jsx("path",{d:l.path}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]})}function be({item:o,onFolderClick:i}){return o.type==="folder"?e.jsxs("button",{type:"button",className:"fm-folder-link",onClick:()=>i(o.name),children:[o.name,o.item_count!==void 0&&e.jsx("span",{className:"fm-item-count",children:o.item_count})]}):e.jsx("span",{className:"fm-file-name",children:o.name})}function ge({projectId:o,projectNumber:i,hasPermission:b,hasNasFolder:$}){const l=de(),S=r.useRef(null),[M,Q]=r.useState([]),[R,B]=r.useState(!0),[t,ne]=r.useState(""),[m,O]=r.useState([""]),[X,U]=r.useState(!1),[ee,W]=r.useState(!1),[ae,z]=r.useState(!1),[F,C]=r.useState(""),[L,H]=r.useState(!1),[Z,D]=r.useState(null),[_,I]=r.useState(""),[y,A]=r.useState(null),[J,K]=r.useState(!1),[T,q]=r.useState(null),x=b("projects.files"),g=r.useCallback(async(a="",n={})=>{B(!0),q(null);try{const p=new URLSearchParams({project_id:o});a&&p.set("path",a);const c=await u(`${E}/project-files.php?${p}`);if(n.ignore||c.status===401)return;const j=await c.json();j.success?(Q(j.data.items||[]),O(j.data.breadcrumb||[""]),ne(j.data.path||"")):c.status===404?(Q([]),O([""])):q(j.error||"Nepodařilo se načíst soubory")}catch{n.ignore||q("Chyba připojení")}finally{n.ignore||B(!1)}},[o]);r.useEffect(()=>{const a={ignore:!1};return g("",a),()=>{a.ignore=!0}},[g]);const Y=a=>{z(!1),D(null),g(a)},se=a=>{if(a===0){Y("");return}const n=m.slice(1,a+1).join("/");Y(n)},re=a=>{const n=t?`${t}/${a}`:a;Y(n)},N=async a=>{if(!a||a.length===0)return;W(!0);let n=0,p=null;for(const c of a){const j=new FormData;j.append("file",c);const V=new URLSearchParams({action:"upload",project_id:o});t&&V.set("path",t);try{const te=await(await u(`${E}/project-files.php?${V}`,{method:"POST",body:j})).json();te.success?n++:p=te.error||"Chyba při nahrávání"}catch{p="Chyba připojení"}}if(W(!1),n>0){const c=n===1?"Soubor byl nahrán":`Nahráno ${n} souborů`;l.success(c),g(t)}p&&l.error(p)},s=a=>{N(a.target.files),a.target.value=""},d=a=>{a.preventDefault(),U(!1),x&&N(a.dataTransfer.files)},h=a=>{a.preventDefault(),x&&U(!0)},v=a=>{a.preventDefault(),U(!1)},f=async()=>{const a=F.trim();if(a){H(!0);try{const n=new URLSearchParams({action:"create_folder",project_id:o}),c=await(await u(`${E}/project-files.php?${n}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t,folder_name:a})})).json();c.success?(l.success("Složka byla vytvořena"),z(!1),C(""),g(t)):l.error(c.error||"Nepodařilo se vytvořit složku")}catch{l.error("Chyba připojení")}finally{H(!1)}}},me=async a=>{const n=t?`${t}/${a.name}`:a.name,p=new URLSearchParams({action:"download",project_id:o,path:n});try{const c=await u(`${E}/project-files.php?${p}`);if(!c.ok){const te=await c.json().catch(()=>null);l.error(te?.error||"Chyba při stahování");return}const j=await c.blob(),V=URL.createObjectURL(j),k=document.createElement("a");k.href=V,k.download=a.name,document.body.appendChild(k),k.click(),k.remove(),URL.revokeObjectURL(V)}catch{l.error("Chyba připojení")}},he=async()=>{if(!y)return;K(!0);const a=t?`${t}/${y.name}`:y.name;try{const n=new URLSearchParams({project_id:o,path:a}),c=await(await u(`${E}/project-files.php?${n}`,{method:"DELETE"})).json();c.success?(l.success(y.type==="folder"?"Složka byla smazána":"Soubor byl smazán"),g(t)):l.error(c.error||"Nepodařilo se smazat")}catch{l.error("Chyba připojení")}finally{K(!1),A(null)}},oe=async a=>{const n=_.trim();if(!n||n===a.name){D(null);return}const p=t?`${t}/${a.name}`:a.name,c=t?`${t}/${n}`:n;try{const j=new URLSearchParams({action:"move",project_id:o}),k=await(await u(`${E}/project-files.php?${j}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({from_path:p,to_path:c})})).json();k.success?(l.success("Přejmenováno"),g(t)):l.error(k.error||"Nepodařilo se přejmenovat")}catch{l.error("Chyba připojení")}finally{D(null)}},pe=a=>{D(a.name),I(a.name)};return R&&M.length===0&&!T?e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Soubory"}),e.jsx("div",{className:"admin-skeleton",style:{padding:0,gap:"0.5rem"},children:[0,1,2,3].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"18px",height:"18px",borderRadius:"4px",flexShrink:0}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:`${60+a*10}%`}})]},a))})]})}):T?e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Soubory"}),e.jsxs("div",{className:"fm-empty",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"var(--text-tertiary)",strokeWidth:"1.5",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),e.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),e.jsx("span",{children:T})]})]})}):e.jsxs("div",{className:"admin-card",children:[e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Soubory"}),e.jsxs("div",{className:"fm-toolbar",children:[e.jsx("div",{className:"fm-breadcrumb",children:m.map((a,n)=>e.jsxs("span",{className:"fm-breadcrumb-segment",children:[n>0&&e.jsx("span",{className:"fm-breadcrumb-sep",children:"/"}),e.jsx("button",{type:"button",className:`fm-breadcrumb-btn ${n===m.length-1?"active":""}`,onClick:()=>se(n),children:n===0?i:a})]},n))}),x&&e.jsxs("div",{className:"fm-toolbar-actions",children:[e.jsxs("button",{type:"button",className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>{z(!ae),C("")},children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]}),"Složka"]}),e.jsx("button",{type:"button",className:"admin-btn admin-btn-primary admin-btn-sm",onClick:()=>S.current?.click(),disabled:ee,children:ee?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Nahrávání..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Nahrát"]})}),e.jsx("input",{ref:S,type:"file",multiple:!0,style:{display:"none"},onChange:s})]})]}),ae&&e.jsxs("div",{className:"fm-new-folder",children:[e.jsx("input",{type:"text",value:F,onChange:a=>C(a.target.value),className:"admin-form-input",placeholder:"Název složky...",autoFocus:!0,onKeyDown:a=>{a.key==="Enter"&&f(),a.key==="Escape"&&(z(!1),C(""))},style:{fontSize:"12px",padding:"6px 10px"}}),e.jsx("button",{type:"button",className:"admin-btn admin-btn-primary admin-btn-sm",onClick:f,disabled:L||!F.trim(),children:L?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):"Vytvořit"}),e.jsx("button",{type:"button",className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>{z(!1),C("")},children:"Zrušit"})]}),e.jsxs("div",{className:`fm-content ${X?"fm-drag-over":""}`,onDrop:d,onDragOver:h,onDragLeave:v,children:[X&&e.jsxs("div",{className:"fm-dropzone-overlay",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),e.jsx("span",{children:"Přetáhněte soubory sem"})]}),M.length===0&&!R?e.jsxs("div",{className:"fm-empty",children:[e.jsx("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"var(--text-tertiary)",strokeWidth:"1.5",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})}),e.jsx("span",{children:$?"Složka je prázdná":"Složka projektu zatím neexistuje"}),x&&!$&&e.jsx("span",{style:{fontSize:"11px"},children:"Nahrání souboru ji automaticky vytvoří"})]}):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",{style:{width:"30px"}}),e.jsx("th",{children:"Název"}),e.jsx("th",{style:{width:"90px"},children:"Velikost"}),e.jsx("th",{style:{width:"120px"},children:"Změněno"}),x&&e.jsx("th",{style:{width:"100px",textAlign:"right"},children:"Akce"})]})}),e.jsx("tbody",{children:M.map(a=>e.jsxs("tr",{children:[e.jsx("td",{style:{textAlign:"center"},children:ve(a.type,a.extension)}),e.jsx("td",{children:Z===a.name?e.jsx("input",{type:"text",value:_,onChange:n=>I(n.target.value),className:"admin-form-input",style:{fontSize:"11px",padding:"3px 8px",maxWidth:"300px"},autoFocus:!0,onKeyDown:n=>{n.key==="Enter"&&oe(a),n.key==="Escape"&&D(null)},onBlur:()=>oe(a)}):e.jsx(be,{item:a,onFolderClick:re})}),e.jsx("td",{className:"fm-meta",children:a.type==="file"?a.size_formatted:"—"}),e.jsx("td",{className:"fm-meta",children:a.modified||"—"}),x&&e.jsx("td",{style:{textAlign:"right"},children:e.jsxs("div",{className:"fm-actions",children:[a.type==="file"&&e.jsx("button",{type:"button",className:"admin-btn-icon",title:"Stáhnout",onClick:()=>me(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"7 10 12 15 17 10"}),e.jsx("line",{x1:"12",y1:"15",x2:"12",y2:"3"})]})}),e.jsx("button",{type:"button",className:"admin-btn-icon",title:"Přejmenovat",onClick:()=>pe(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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",{type:"button",className:"admin-btn-icon danger",title:"Smazat",onClick:()=>A(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"}),e.jsx("path",{d:"M10 11v6M14 11v6"})]})})]})})]},a.name))})]})})]})]}),e.jsx(ce,{isOpen:y!==null,onClose:()=>A(null),onConfirm:he,title:y?.type==="folder"?"Smazat složku":"Smazat soubor",message:`Opravdu chcete smazat "${y?.name}"?${y?.type==="folder"?" Složka bude smazána včetně veškerého obsahu.":""}`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:J})]})}const P="/api/admin",Ne={aktivni:"Aktivní",dokonceny:"Dokončený",zruseny:"Zrušený"};function ke(o){if(!o)return"";const i=new Date(o),b=i.getDate(),$=i.getMonth()+1,l=i.getFullYear(),S=String(i.getHours()).padStart(2,"0"),M=String(i.getMinutes()).padStart(2,"0");return`${b}. ${$}. ${l} ${S}:${M}`}function $e(){const{id:o}=ue(),i=de(),{hasPermission:b,isAdmin:$}=ye(),l=xe(),S=je(),[M,Q]=r.useState(!0),[R,B]=r.useState(!1),[t,ne]=r.useState(null),[m,O]=r.useState({name:"",status:"aktivni",start_date:"",end_date:"",responsible_user_id:""}),[X,U]=r.useState([]),[ee,W]=r.useState(!1),[ae,z]=r.useState(!1),[F,C]=r.useState(!1),[L,H]=r.useState([]),[Z,D]=r.useState(!0),[_,I]=r.useState(""),[y,A]=r.useState(!1),[J,K]=r.useState(null),T=r.useRef(!1);r.useEffect(()=>{S.state?.created&&!T.current&&(T.current=!0,i.success("Projekt byl vytvořen"),l(S.pathname,{replace:!0,state:{}}))},[S.state]);const q=async()=>{try{const s=await u(`${P}/projects.php?action=notes&id=${o}`);if(s.status===401)return;const d=await s.json();d.success&&H(d.data.notes||[])}catch{}finally{D(!1)}};if(r.useEffect(()=>{const s=async()=>{try{const h=await u(`${P}/projects.php?action=detail&id=${o}`);if(h.status===401)return;const v=await h.json();if(v.success){const f=v.data;ne(f),O({name:f.name||"",status:f.status||"aktivni",start_date:(f.start_date||"").substring(0,10),end_date:(f.end_date||"").substring(0,10),responsible_user_id:f.responsible_user_id||""})}else i.error(v.error||"Nepodařilo se načíst projekt"),l("/projects")}catch{i.error("Chyba připojení"),l("/projects")}finally{Q(!1)}},d=async()=>{try{const h=await u(`${P}/projects.php?action=users`);if(h.status===401)return;const v=await h.json();v.success&&U(v.data.users||[])}catch{}};s(),q(),d()},[o,i,l]),!b("projects.view"))return e.jsx(fe,{});const x=(s,d)=>O(h=>({...h,[s]:d})),g=async()=>{if(!m.name.trim()){i.error("Název projektu je povinný");return}B(!0);try{const d=await(await u(`${P}/projects.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:m.name,status:m.status,start_date:m.start_date||null,end_date:m.end_date||null,responsible_user_id:m.responsible_user_id||null})})).json();d.success?i.success(d.message||"Projekt byl aktualizován"):i.error(d.error||"Nepodařilo se uložit projekt")}catch{i.error("Chyba připojení")}finally{B(!1)}},Y=async()=>{z(!0);try{const d=await(await u(`${P}/projects.php?id=${o}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:F})})).json();d.success?(l("/projects"),setTimeout(()=>i.success("Projekt byl smazán"),300)):i.error(d.error||"Nepodařilo se smazat projekt")}catch{i.error("Chyba připojení")}finally{z(!1)}},se=async()=>{if(_.trim()){A(!0);try{const d=await(await u(`${P}/projects.php?action=add_note&id=${o}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:_.trim()})})).json();d.success?(H(h=>[d.data.note,...h]),I(""),i.success("Poznámka byla přidána")):i.error(d.error||"Nepodařilo se přidat poznámku")}catch{i.error("Chyba připojení")}finally{A(!1)}}},re=async s=>{K(s);try{const h=await(await u(`${P}/projects.php?action=delete_note¬eId=${s}`,{method:"DELETE"})).json();h.success?(H(v=>v.filter(f=>f.id!==s)),i.success("Poznámka byla smazána")):i.error(h.error||"Nepodařilo se smazat poznámku")}catch{i.error("Chyba připojení")}finally{K(null)}};if(M)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row",style:{gap:"0.5rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(s=>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/2"})]},s))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-full"})]},s))})})]});if(!t)return null;const N=b("projects.edit");return e.jsxs("div",{children:[e.jsxs(G.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"1rem"},children:[e.jsx(ie,{to:"/projects",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsx("div",{children:e.jsxs("h1",{className:"admin-page-title",children:["Projekt ",t.project_number]})})]}),N&&e.jsxs("div",{className:"admin-page-actions",children:[e.jsx("button",{onClick:g,className:"admin-btn admin-btn-primary",disabled:R,children:R?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"}),!t.order_id&&e.jsx("button",{onClick:()=>W(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsx(G.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:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(w,{label:"Číslo projektu",children:e.jsx("input",{type:"text",value:t.project_number,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(w,{label:"Název",children:e.jsx("input",{type:"text",value:m.name,onChange:s=>x("name",s.target.value),className:"admin-form-input",placeholder:"Název projektu",disabled:!N})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(w,{label:"Zákazník",children:e.jsx("input",{type:"text",value:t.customer_name||"—",className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(w,{label:"Zodpovědná osoba",children:e.jsxs("select",{value:m.responsible_user_id,onChange:s=>x("responsible_user_id",s.target.value),className:"admin-form-select",disabled:!N,children:[e.jsx("option",{value:"",children:"— Nevybráno —"}),X.map(s=>e.jsx("option",{value:s.id,children:s.name},s.id))]})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3",children:[e.jsx(w,{label:"Stav",children:e.jsxs("select",{value:m.status,onChange:s=>x("status",s.target.value),className:"admin-form-select",disabled:!N,children:[e.jsx("option",{value:"aktivni",children:"Aktivní"}),e.jsx("option",{value:"dokonceny",children:"Dokončený"}),e.jsx("option",{value:"zruseny",children:"Zrušený"})]})}),e.jsx(w,{label:"Datum zahájení",children:e.jsx(le,{mode:"date",value:m.start_date,onChange:s=>x("start_date",s),disabled:!N})}),e.jsx(w,{label:"Datum ukončení",children:e.jsx(le,{mode:"date",value:m.end_date,onChange:s=>x("end_date",s),disabled:!N})})]})]})]})}),e.jsx(G.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Poznámky"}),e.jsxs("div",{className:"mb-4",children:[e.jsx("textarea",{value:_,onChange:s=>I(s.target.value),className:"admin-form-input",rows:2,placeholder:"Napište poznámku...",style:{resize:"vertical",width:"100%"},onKeyDown:s=>{s.key==="Enter"&&s.ctrlKey&&_.trim()&&se()}}),e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:se,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:y||!_.trim(),children:y?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):"Přidat poznámku"})})]}),t.notes&&e.jsxs("div",{style:{padding:"0.75rem",background:"var(--bg-secondary)",borderRadius:"0.5rem",marginBottom:"0.5rem",fontSize:"0.85rem",color:"var(--text-secondary)"},children:[e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginBottom:"0.25rem"},children:"Starší poznámka (před zavedením systému)"}),e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.notes})]}),Z&&e.jsx("div",{className:"admin-skeleton",style:{gap:"0.75rem"},children:[0,1,2].map(s=>e.jsx("div",{className:"admin-skeleton-line",style:{height:"52px",borderRadius:"8px"}},s))}),!Z&&L.length===0&&!t.notes&&e.jsx("div",{style:{color:"var(--text-tertiary)",fontSize:"0.875rem",textAlign:"center",padding:"1rem 0"},children:"Zatím žádné poznámky"}),!Z&&(L.length>0||t.notes)&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:L.map(s=>e.jsx("div",{style:{padding:"0.75rem",background:"var(--bg-secondary)",borderRadius:"0.5rem",position:"relative"},children:e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:"0.5rem"},children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem",marginBottom:"0.25rem"},children:[e.jsx("span",{style:{fontWeight:600,fontSize:"0.85rem"},children:s.user_name}),e.jsx("span",{style:{color:"var(--text-tertiary)",fontSize:"0.75rem"},children:ke(s.created_at)})]}),e.jsx("div",{style:{whiteSpace:"pre-wrap",fontSize:"0.875rem",lineHeight:1.5},children:s.content})]}),$&&e.jsx("button",{onClick:()=>re(s.id),className:"admin-btn-icon",title:"Smazat poznámku",disabled:J===s.id,style:{flexShrink:0,opacity:J===s.id?.5:1},children:J===s.id?e.jsx("div",{className:"admin-spinner",style:{width:14,height:14,borderWidth:2}}):e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"}),e.jsx("path",{d:"M10 11v6M14 11v6"})]})})]})},s.id))})]})}),e.jsx(G.div,{style:{marginBottom:"1rem"},initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsx(ge,{projectId:o,projectNumber:t.project_number,hasPermission:b,hasNasFolder:t.has_nas_folder})}),e.jsx(G.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Propojení"}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(w,{label:"Objednávka",children:e.jsx("div",{children:t.order_id?e.jsxs(ie,{to:`/orders/${t.order_id}`,className:"link-accent",children:[t.order_number,t.order_status&&e.jsxs("span",{className:"text-tertiary",style:{fontWeight:400,marginLeft:"0.5rem"},children:["(",Ne[t.order_status]||t.order_status,")"]})]}):"—"})}),e.jsx(w,{label:"Nabídka",children:e.jsx("div",{children:t.quotation_id?e.jsx(ie,{to:`/offers/${t.quotation_id}`,className:"link-accent",children:t.quotation_number}):"—"})})]})]})}),e.jsx(ce,{isOpen:ee,onClose:()=>{W(!1),C(!1)},onConfirm:Y,title:"Smazat projekt",message:e.jsxs(e.Fragment,{children:['Opravdu chcete smazat projekt "',t.project_number," – ",t.name,'"? Tato akce je nevratná.',t.has_nas_folder&&e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:F,onChange:s=>C(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory na disku"})]})]}),confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:ae})]})}export{$e as default}; diff --git a/dist/assets/ProjectDetail-TbZLFSAA.js b/dist/assets/ProjectDetail-TbZLFSAA.js deleted file mode 100644 index f82caa0..0000000 --- a/dist/assets/ProjectDetail-TbZLFSAA.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e,m as q}from"./vendor-animation-0s3FMHwK.js";import{r,h as ue,g as xe,u as je,L as re}from"./vendor-react-BVs3cwbi.js";import{a as de,c as x,C as ce,u as ye,F as k,A as le}from"./index-BrM8fzBu.js";import{F as fe}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const V="/api/admin";function ve(o,i){if(o==="folder")return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"#e6a817",strokeWidth:"1.5",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z",fill:"rgba(230, 168, 23, 0.15)"})});const b=(i||"").toLowerCase(),l={pdf:{color:"#e74c3c",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},doc:{color:"#3498db",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},docx:{color:"#3498db",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},xls:{color:"#27ae60",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},xlsx:{color:"#27ae60",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},ppt:{color:"#e67e22",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},pptx:{color:"#e67e22",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},jpg:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},jpeg:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},png:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},gif:{color:"#3498db",path:"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z"},zip:{color:"#e67e22",path:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},rar:{color:"#e67e22",path:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},"7z":{color:"#e67e22",path:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},dwg:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},dxf:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},step:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},stp:{color:"#8e44ad",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}}[b]||{color:"var(--text-muted)",path:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"};return e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:l.color,strokeWidth:"1.5",children:[e.jsx("path",{d:l.path}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]})}function be({item:o,onFolderClick:i}){return o.type==="folder"?e.jsxs("button",{type:"button",className:"fm-folder-link",onClick:()=>i(o.name),children:[o.name,o.item_count!==void 0&&e.jsx("span",{className:"fm-item-count",children:o.item_count})]}):e.jsx("span",{className:"fm-file-name",children:o.name})}function ge({projectId:o,projectNumber:i,hasPermission:b,hasNasFolder:_}){const l=de(),w=r.useRef(null),[$,Y]=r.useState([]),[L,E]=r.useState(!0),[t,ae]=r.useState(""),[c,B]=r.useState([""]),[G,R]=r.useState(!1),[Q,O]=r.useState(!1),[X,S]=r.useState(!1),[P,z]=r.useState(""),[F,H]=r.useState(!1),[W,M]=r.useState(null),[C,U]=r.useState(""),[j,A]=r.useState(null),[Z,I]=r.useState(!1),[T,J]=r.useState(null),u=b("projects.files"),g=r.useCallback(async(a="",n={})=>{E(!0),J(null);try{const p=new URLSearchParams({project_id:o});a&&p.set("path",a);const m=await x(`${V}/project-files.php?${p}`);if(n.ignore||m.status===401)return;const v=await m.json();v.success?(Y(v.data.items||[]),B(v.data.breadcrumb||[""]),ae(v.data.path||"")):m.status===404?(Y([]),B([""])):J(v.error||"Nepodařilo se načíst soubory")}catch{n.ignore||J("Chyba připojení")}finally{n.ignore||E(!1)}},[o]);r.useEffect(()=>{const a={ignore:!1};return g("",a),()=>{a.ignore=!0}},[g]);const K=a=>{S(!1),M(null),g(a)},ee=a=>{if(a===0){K("");return}const n=c.slice(1,a+1).join("/");K(n)},se=a=>{const n=t?`${t}/${a}`:a;K(n)},N=async a=>{if(!a||a.length===0)return;O(!0);let n=0,p=null;for(const m of a){const v=new FormData;v.append("file",m);const te=new URLSearchParams({action:"upload",project_id:o});t&&te.set("path",t);try{const oe=await(await x(`${V}/project-files.php?${te}`,{method:"POST",body:v})).json();oe.success?n++:p=oe.error||"Chyba při nahrávání"}catch{p="Chyba připojení"}}if(O(!1),n>0){const m=n===1?"Soubor byl nahrán":`Nahráno ${n} souborů`;l.success(m),g(t)}p&&l.error(p)},s=a=>{N(a.target.files),a.target.value=""},d=a=>{a.preventDefault(),R(!1),u&&N(a.dataTransfer.files)},h=a=>{a.preventDefault(),u&&R(!0)},f=a=>{a.preventDefault(),R(!1)},y=async()=>{const a=P.trim();if(a){H(!0);try{const n=new URLSearchParams({action:"create_folder",project_id:o}),m=await(await x(`${V}/project-files.php?${n}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t,folder_name:a})})).json();m.success?(l.success("Složka byla vytvořena"),S(!1),z(""),g(t)):l.error(m.error||"Nepodařilo se vytvořit složku")}catch{l.error("Chyba připojení")}finally{H(!1)}}},me=a=>{const n=t?`${t}/${a.name}`:a.name,p=new URLSearchParams({action:"download",project_id:o,path:n});window.open(`${V}/project-files.php?${p}`,"_blank")},he=async()=>{if(!j)return;I(!0);const a=t?`${t}/${j.name}`:j.name;try{const n=new URLSearchParams({project_id:o,path:a}),m=await(await x(`${V}/project-files.php?${n}`,{method:"DELETE"})).json();m.success?(l.success(j.type==="folder"?"Složka byla smazána":"Soubor byl smazán"),g(t)):l.error(m.error||"Nepodařilo se smazat")}catch{l.error("Chyba připojení")}finally{I(!1),A(null)}},ie=async a=>{const n=C.trim();if(!n||n===a.name){M(null);return}const p=t?`${t}/${a.name}`:a.name,m=t?`${t}/${n}`:n;try{const v=new URLSearchParams({action:"move",project_id:o}),ne=await(await x(`${V}/project-files.php?${v}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({from_path:p,to_path:m})})).json();ne.success?(l.success("Přejmenováno"),g(t)):l.error(ne.error||"Nepodařilo se přejmenovat")}catch{l.error("Chyba připojení")}finally{M(null)}},pe=a=>{M(a.name),U(a.name)};return L&&$.length===0&&!T?e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Soubory"}),e.jsx("div",{className:"admin-skeleton",style:{padding:0,gap:"0.5rem"},children:[0,1,2,3].map(a=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"18px",height:"18px",borderRadius:"4px",flexShrink:0}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:`${60+a*10}%`}})]},a))})]})}):T?e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Soubory"}),e.jsxs("div",{className:"fm-empty",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"var(--text-tertiary)",strokeWidth:"1.5",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),e.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),e.jsx("span",{children:T})]})]})}):e.jsxs("div",{className:"admin-card",children:[e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Soubory"}),e.jsxs("div",{className:"fm-toolbar",children:[e.jsx("div",{className:"fm-breadcrumb",children:c.map((a,n)=>e.jsxs("span",{className:"fm-breadcrumb-segment",children:[n>0&&e.jsx("span",{className:"fm-breadcrumb-sep",children:"/"}),e.jsx("button",{type:"button",className:`fm-breadcrumb-btn ${n===c.length-1?"active":""}`,onClick:()=>ee(n),children:n===0?i:a})]},n))}),u&&e.jsxs("div",{className:"fm-toolbar-actions",children:[e.jsxs("button",{type:"button",className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>{S(!X),z("")},children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"}),e.jsx("line",{x1:"12",y1:"11",x2:"12",y2:"17"}),e.jsx("line",{x1:"9",y1:"14",x2:"15",y2:"14"})]}),"Složka"]}),e.jsx("button",{type:"button",className:"admin-btn admin-btn-primary admin-btn-sm",onClick:()=>w.current?.click(),disabled:Q,children:Q?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Nahrávání..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Nahrát"]})}),e.jsx("input",{ref:w,type:"file",multiple:!0,style:{display:"none"},onChange:s})]})]}),X&&e.jsxs("div",{className:"fm-new-folder",children:[e.jsx("input",{type:"text",value:P,onChange:a=>z(a.target.value),className:"admin-form-input",placeholder:"Název složky...",autoFocus:!0,onKeyDown:a=>{a.key==="Enter"&&y(),a.key==="Escape"&&(S(!1),z(""))},style:{fontSize:"12px",padding:"6px 10px"}}),e.jsx("button",{type:"button",className:"admin-btn admin-btn-primary admin-btn-sm",onClick:y,disabled:F||!P.trim(),children:F?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):"Vytvořit"}),e.jsx("button",{type:"button",className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>{S(!1),z("")},children:"Zrušit"})]}),e.jsxs("div",{className:`fm-content ${G?"fm-drag-over":""}`,onDrop:d,onDragOver:h,onDragLeave:f,children:[G&&e.jsxs("div",{className:"fm-dropzone-overlay",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),e.jsx("span",{children:"Přetáhněte soubory sem"})]}),$.length===0&&!L?e.jsxs("div",{className:"fm-empty",children:[e.jsx("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"var(--text-tertiary)",strokeWidth:"1.5",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})}),e.jsx("span",{children:_?"Složka je prázdná":"Složka projektu zatím neexistuje"}),u&&!_&&e.jsx("span",{style:{fontSize:"11px"},children:"Nahrání souboru ji automaticky vytvoří"})]}):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",{style:{width:"30px"}}),e.jsx("th",{children:"Název"}),e.jsx("th",{style:{width:"90px"},children:"Velikost"}),e.jsx("th",{style:{width:"120px"},children:"Změněno"}),u&&e.jsx("th",{style:{width:"100px",textAlign:"right"},children:"Akce"})]})}),e.jsx("tbody",{children:$.map(a=>e.jsxs("tr",{children:[e.jsx("td",{style:{textAlign:"center"},children:ve(a.type,a.extension)}),e.jsx("td",{children:W===a.name?e.jsx("input",{type:"text",value:C,onChange:n=>U(n.target.value),className:"admin-form-input",style:{fontSize:"11px",padding:"3px 8px",maxWidth:"300px"},autoFocus:!0,onKeyDown:n=>{n.key==="Enter"&&ie(a),n.key==="Escape"&&M(null)},onBlur:()=>ie(a)}):e.jsx(be,{item:a,onFolderClick:se})}),e.jsx("td",{className:"fm-meta",children:a.type==="file"?a.size_formatted:"—"}),e.jsx("td",{className:"fm-meta",children:a.modified||"—"}),u&&e.jsx("td",{style:{textAlign:"right"},children:e.jsxs("div",{className:"fm-actions",children:[a.type==="file"&&e.jsx("button",{type:"button",className:"admin-btn-icon",title:"Stáhnout",onClick:()=>me(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"7 10 12 15 17 10"}),e.jsx("line",{x1:"12",y1:"15",x2:"12",y2:"3"})]})}),e.jsx("button",{type:"button",className:"admin-btn-icon",title:"Přejmenovat",onClick:()=>pe(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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",{type:"button",className:"admin-btn-icon danger",title:"Smazat",onClick:()=>A(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"}),e.jsx("path",{d:"M10 11v6M14 11v6"})]})})]})})]},a.name))})]})})]})]}),e.jsx(ce,{isOpen:j!==null,onClose:()=>A(null),onConfirm:he,title:j?.type==="folder"?"Smazat složku":"Smazat soubor",message:`Opravdu chcete smazat "${j?.name}"?${j?.type==="folder"?" Složka bude smazána včetně veškerého obsahu.":""}`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:Z})]})}const D="/api/admin",Ne={aktivni:"Aktivní",dokonceny:"Dokončený",zruseny:"Zrušený"};function ke(o){if(!o)return"";const i=new Date(o),b=i.getDate(),_=i.getMonth()+1,l=i.getFullYear(),w=String(i.getHours()).padStart(2,"0"),$=String(i.getMinutes()).padStart(2,"0");return`${b}. ${_}. ${l} ${w}:${$}`}function $e(){const{id:o}=ue(),i=de(),{hasPermission:b,isAdmin:_}=ye(),l=xe(),w=je(),[$,Y]=r.useState(!0),[L,E]=r.useState(!1),[t,ae]=r.useState(null),[c,B]=r.useState({name:"",status:"aktivni",start_date:"",end_date:"",responsible_user_id:""}),[G,R]=r.useState([]),[Q,O]=r.useState(!1),[X,S]=r.useState(!1),[P,z]=r.useState(!1),[F,H]=r.useState([]),[W,M]=r.useState(!0),[C,U]=r.useState(""),[j,A]=r.useState(!1),[Z,I]=r.useState(null),T=r.useRef(!1);r.useEffect(()=>{w.state?.created&&!T.current&&(T.current=!0,i.success("Projekt byl vytvořen"),l(w.pathname,{replace:!0,state:{}}))},[w.state]);const J=async()=>{try{const s=await x(`${D}/projects.php?action=notes&id=${o}`);if(s.status===401)return;const d=await s.json();d.success&&H(d.data.notes||[])}catch{}finally{M(!1)}};if(r.useEffect(()=>{const s=async()=>{try{const h=await x(`${D}/projects.php?action=detail&id=${o}`);if(h.status===401)return;const f=await h.json();if(f.success){const y=f.data;ae(y),B({name:y.name||"",status:y.status||"aktivni",start_date:(y.start_date||"").substring(0,10),end_date:(y.end_date||"").substring(0,10),responsible_user_id:y.responsible_user_id||""})}else i.error(f.error||"Nepodařilo se načíst projekt"),l("/projects")}catch{i.error("Chyba připojení"),l("/projects")}finally{Y(!1)}},d=async()=>{try{const h=await x(`${D}/projects.php?action=users`);if(h.status===401)return;const f=await h.json();f.success&&R(f.data.users||[])}catch{}};s(),J(),d()},[o,i,l]),!b("projects.view"))return e.jsx(fe,{});const u=(s,d)=>B(h=>({...h,[s]:d})),g=async()=>{if(!c.name.trim()){i.error("Název projektu je povinný");return}E(!0);try{const d=await(await x(`${D}/projects.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:c.name,status:c.status,start_date:c.start_date||null,end_date:c.end_date||null,responsible_user_id:c.responsible_user_id||null})})).json();d.success?i.success(d.message||"Projekt byl aktualizován"):i.error(d.error||"Nepodařilo se uložit projekt")}catch{i.error("Chyba připojení")}finally{E(!1)}},K=async()=>{S(!0);try{const d=await(await x(`${D}/projects.php?id=${o}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:P})})).json();d.success?(l("/projects"),setTimeout(()=>i.success("Projekt byl smazán"),300)):i.error(d.error||"Nepodařilo se smazat projekt")}catch{i.error("Chyba připojení")}finally{S(!1)}},ee=async()=>{if(C.trim()){A(!0);try{const d=await(await x(`${D}/projects.php?action=add_note&id=${o}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:C.trim()})})).json();d.success?(H(h=>[d.data.note,...h]),U(""),i.success("Poznámka byla přidána")):i.error(d.error||"Nepodařilo se přidat poznámku")}catch{i.error("Chyba připojení")}finally{A(!1)}}},se=async s=>{I(s);try{const h=await(await x(`${D}/projects.php?action=delete_note¬eId=${s}`,{method:"DELETE"})).json();h.success?(H(f=>f.filter(y=>y.id!==s)),i.success("Poznámka byla smazána")):i.error(h.error||"Nepodařilo se smazat poznámku")}catch{i.error("Chyba připojení")}finally{I(null)}};if($)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row",style:{gap:"0.5rem"},children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(s=>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/2"})]},s))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-full"})]},s))})})]});if(!t)return null;const N=b("projects.edit");return e.jsxs("div",{children:[e.jsxs(q.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"1rem"},children:[e.jsx(re,{to:"/projects",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsx("div",{children:e.jsxs("h1",{className:"admin-page-title",children:["Projekt ",t.project_number]})})]}),N&&e.jsxs("div",{className:"admin-page-actions",children:[e.jsx("button",{onClick:g,className:"admin-btn admin-btn-primary",disabled:L,children:L?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"}),!t.order_id&&e.jsx("button",{onClick:()=>O(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsx(q.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:[e.jsx("h3",{className:"admin-card-title",children:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(k,{label:"Číslo projektu",children:e.jsx("input",{type:"text",value:t.project_number,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(k,{label:"Název",children:e.jsx("input",{type:"text",value:c.name,onChange:s=>u("name",s.target.value),className:"admin-form-input",placeholder:"Název projektu",disabled:!N})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(k,{label:"Zákazník",children:e.jsx("input",{type:"text",value:t.customer_name||"—",className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(k,{label:"Zodpovědná osoba",children:e.jsxs("select",{value:c.responsible_user_id,onChange:s=>u("responsible_user_id",s.target.value),className:"admin-form-select",disabled:!N,children:[e.jsx("option",{value:"",children:"— Nevybráno —"}),G.map(s=>e.jsx("option",{value:s.id,children:s.name},s.id))]})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3",children:[e.jsx(k,{label:"Stav",children:e.jsxs("select",{value:c.status,onChange:s=>u("status",s.target.value),className:"admin-form-select",disabled:!N,children:[e.jsx("option",{value:"aktivni",children:"Aktivní"}),e.jsx("option",{value:"dokonceny",children:"Dokončený"}),e.jsx("option",{value:"zruseny",children:"Zrušený"})]})}),e.jsx(k,{label:"Datum zahájení",children:e.jsx(le,{mode:"date",value:c.start_date,onChange:s=>u("start_date",s),disabled:!N})}),e.jsx(k,{label:"Datum ukončení",children:e.jsx(le,{mode:"date",value:c.end_date,onChange:s=>u("end_date",s),disabled:!N})})]})]})]})}),e.jsx(q.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Poznámky"}),e.jsxs("div",{className:"mb-4",children:[e.jsx("textarea",{value:C,onChange:s=>U(s.target.value),className:"admin-form-input",rows:2,placeholder:"Napište poznámku...",style:{resize:"vertical",width:"100%"},onKeyDown:s=>{s.key==="Enter"&&s.ctrlKey&&C.trim()&&ee()}}),e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:j||!C.trim(),children:j?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):"Přidat poznámku"})})]}),t.notes&&e.jsxs("div",{style:{padding:"0.75rem",background:"var(--bg-secondary)",borderRadius:"0.5rem",marginBottom:"0.5rem",fontSize:"0.85rem",color:"var(--text-secondary)"},children:[e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginBottom:"0.25rem"},children:"Starší poznámka (před zavedením systému)"}),e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.notes})]}),W&&e.jsx("div",{className:"admin-skeleton",style:{gap:"0.75rem"},children:[0,1,2].map(s=>e.jsx("div",{className:"admin-skeleton-line",style:{height:"52px",borderRadius:"8px"}},s))}),!W&&F.length===0&&!t.notes&&e.jsx("div",{style:{color:"var(--text-tertiary)",fontSize:"0.875rem",textAlign:"center",padding:"1rem 0"},children:"Zatím žádné poznámky"}),!W&&(F.length>0||t.notes)&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:F.map(s=>e.jsx("div",{style:{padding:"0.75rem",background:"var(--bg-secondary)",borderRadius:"0.5rem",position:"relative"},children:e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:"0.5rem"},children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem",marginBottom:"0.25rem"},children:[e.jsx("span",{style:{fontWeight:600,fontSize:"0.85rem"},children:s.user_name}),e.jsx("span",{style:{color:"var(--text-tertiary)",fontSize:"0.75rem"},children:ke(s.created_at)})]}),e.jsx("div",{style:{whiteSpace:"pre-wrap",fontSize:"0.875rem",lineHeight:1.5},children:s.content})]}),_&&e.jsx("button",{onClick:()=>se(s.id),className:"admin-btn-icon",title:"Smazat poznámku",disabled:Z===s.id,style:{flexShrink:0,opacity:Z===s.id?.5:1},children:Z===s.id?e.jsx("div",{className:"admin-spinner",style:{width:14,height:14,borderWidth:2}}):e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"}),e.jsx("path",{d:"M10 11v6M14 11v6"})]})})]})},s.id))})]})}),e.jsx(q.div,{style:{marginBottom:"1rem"},initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsx(ge,{projectId:o,projectNumber:t.project_number,hasPermission:b,hasNasFolder:t.has_nas_folder})}),e.jsx(q.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("h3",{className:"admin-card-title",children:"Propojení"}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(k,{label:"Objednávka",children:e.jsx("div",{children:t.order_id?e.jsxs(re,{to:`/orders/${t.order_id}`,className:"link-accent",children:[t.order_number,t.order_status&&e.jsxs("span",{className:"text-tertiary",style:{fontWeight:400,marginLeft:"0.5rem"},children:["(",Ne[t.order_status]||t.order_status,")"]})]}):"—"})}),e.jsx(k,{label:"Nabídka",children:e.jsx("div",{children:t.quotation_id?e.jsx(re,{to:`/offers/${t.quotation_id}`,className:"link-accent",children:t.quotation_number}):"—"})})]})]})}),e.jsx(ce,{isOpen:Q,onClose:()=>{O(!1),z(!1)},onConfirm:K,title:"Smazat projekt",message:e.jsxs(e.Fragment,{children:['Opravdu chcete smazat projekt "',t.project_number," – ",t.name,'"? Tato akce je nevratná.',t.has_nas_folder&&e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:P,onChange:s=>z(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory na disku"})]})]}),confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:X})]})}export{$e as default}; diff --git a/dist/assets/Projects-DvLHy4pA.js b/dist/assets/Projects-srNNxmx0.js similarity index 98% rename from dist/assets/Projects-DvLHy4pA.js rename to dist/assets/Projects-srNNxmx0.js index e27e4fc..30d7bdc 100644 --- a/dist/assets/Projects-DvLHy4pA.js +++ b/dist/assets/Projects-srNNxmx0.js @@ -1 +1 @@ -import{j as e,m as g}from"./vendor-animation-0s3FMHwK.js";import{r as l,L as o}from"./vendor-react-BVs3cwbi.js";import{a as P,u as T,d as A,e as b,C as D,c as E}from"./index-BrM8fzBu.js";import{F as M}from"./Forbidden-D25jV3Oq.js";import{u as F,a as $,S as r}from"./useListData-Bz9Xh_CU.js";import{P as I}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const Z="/api/admin",H={aktivni:"Aktivní",dokonceny:"Dokončený",zruseny:"Zrušený"},O={aktivni:"admin-badge-project-aktivni",dokonceny:"admin-badge-project-dokonceny",zruseny:"admin-badge-project-zruseny"};function G(){const c=P(),{hasPermission:m}=T(),{sort:f,order:a,handleSort:n,activeSort:i}=F("project_number"),[k,w]=l.useState(""),[S,u]=l.useState(1),[j,y]=l.useState(null),[t,h]=l.useState(null),[N,x]=l.useState(!1),{items:d,setItems:_,loading:C,pagination:p}=$("projects.php",{dataKey:"projects",search:k,sort:f,order:a,page:S,errorMsg:"Nepodařilo se načíst projekty"});if(!m("projects.view"))return e.jsx(M,{});const z=async()=>{if(t){y(t.id);try{const v=await(await E(`${Z}/projects.php?id=${t.id}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:N})})).json();v.success?(c.success(v.message||"Projekt byl smazán"),_(B=>B.filter(L=>L.id!==t.id))):c.error(v.error||"Nepodařilo se smazat projekt")}catch{c.error("Chyba připojení")}finally{y(null),h(null),x(!1)}}};return C?e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-3/4",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]})]})})]})}):e.jsxs("div",{children:[e.jsxs(g.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Projekty"}),e.jsxs("p",{className:"admin-page-subtitle",children:[p?.total??d.length," ",A(p?.total??d.length,"projekt","projekty","projektů")]})]}),m("projects.create")&&e.jsxs(o,{to:"/projects/new",className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Nový projekt"]})]}),e.jsx(g.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:k,onChange:s=>{w(s.target.value),u(1)},className:"admin-form-input",placeholder:"Hledat podle čísla, názvu nebo zákazníka..."})}),d.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsx("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})})}),e.jsx("p",{children:"Zatím nejsou žádné projekty."}),e.jsx("p",{style:{color:"var(--text-tertiary)",fontSize:"0.875rem"},children:"Vytvořte první projekt tlačítkem výše nebo automaticky při vytvoření objednávky."})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("project_number"),children:["Číslo ",e.jsx(r,{column:"project_number",sort:i,order:a})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("name"),children:["Název ",e.jsx(r,{column:"name",sort:i,order:a})]}),e.jsx("th",{children:"Zákazník"}),e.jsx("th",{children:"Zodpovědná osoba"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("status"),children:["Stav ",e.jsx(r,{column:"status",sort:i,order:a})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("start_date"),children:["Začátek ",e.jsx(r,{column:"start_date",sort:i,order:a})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("end_date"),children:["Konec ",e.jsx(r,{column:"end_date",sort:i,order:a})]}),e.jsx("th",{children:"Objednávka"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:d.map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:e.jsx(o,{to:`/projects/${s.id}`,className:"link-accent",children:s.project_number})}),e.jsx("td",{className:"fw-500",children:s.name||"—"}),e.jsx("td",{children:s.customer_name||"—"}),e.jsx("td",{children:s.responsible_user_name||"—"}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${O[s.status]||""}`,children:H[s.status]||s.status})}),e.jsx("td",{className:"admin-mono",children:b(s.start_date)}),e.jsx("td",{className:"admin-mono",children:b(s.end_date)}),e.jsx("td",{children:s.order_id?e.jsx(o,{to:`/orders/${s.order_id}`,className:"text-secondary",style:{textDecoration:"none"},children:s.order_number}):"—"}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(o,{to:`/projects/${s.id}`,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",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"})]})}),!s.order_id&&m("projects.create")&&e.jsx("button",{onClick:()=>h(s),className:"admin-btn-icon danger",title:"Smazat projekt",disabled:j===s.id,children:j===s.id?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"}),e.jsx("path",{d:"M10 11v6M14 11v6"})]})})]})})]},s.id))})]})}),e.jsx(I,{pagination:p,onPageChange:u})]})}),e.jsx(D,{isOpen:!!t,onClose:()=>{h(null),x(!1)},onConfirm:z,title:"Smazat projekt",message:e.jsxs(e.Fragment,{children:["Opravdu chcete smazat projekt ",t?.project_number,"?",e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:N,onChange:s=>x(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory na disku"})]})]}),confirmText:"Smazat",type:"danger",loading:!!j})]})}export{G as default}; +import{j as e,m as g}from"./vendor-animation-0s3FMHwK.js";import{r as l,L as o}from"./vendor-react-BVs3cwbi.js";import{a as P,u as T,d as A,e as b,C as D,c as E}from"./index-Bay45BGf.js";import{F as M}from"./Forbidden-D25jV3Oq.js";import{u as F,a as $,S as r}from"./useListData-CvOpK9He.js";import{P as I}from"./Pagination-B1sbY6V7.js";import"./vendor-utils-Dyr8OjFr.js";const Z="/api/admin",H={aktivni:"Aktivní",dokonceny:"Dokončený",zruseny:"Zrušený"},O={aktivni:"admin-badge-project-aktivni",dokonceny:"admin-badge-project-dokonceny",zruseny:"admin-badge-project-zruseny"};function G(){const c=P(),{hasPermission:m}=T(),{sort:f,order:a,handleSort:n,activeSort:i}=F("project_number"),[k,w]=l.useState(""),[S,u]=l.useState(1),[j,y]=l.useState(null),[t,h]=l.useState(null),[N,x]=l.useState(!1),{items:d,setItems:_,loading:C,pagination:p}=$("projects.php",{dataKey:"projects",search:k,sort:f,order:a,page:S,errorMsg:"Nepodařilo se načíst projekty"});if(!m("projects.view"))return e.jsx(M,{});const z=async()=>{if(t){y(t.id);try{const v=await(await E(`${Z}/projects.php?id=${t.id}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({delete_files:N})})).json();v.success?(c.success(v.message||"Projekt byl smazán"),_(B=>B.filter(L=>L.id!==t.id))):c.error(v.error||"Nepodařilo se smazat projekt")}catch{c.error("Chyba připojení")}finally{y(null),h(null),x(!1)}}};return C?e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children:e.jsxs("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-3/4",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]}),e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3",style:{marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]})]})})]})}):e.jsxs("div",{children:[e.jsxs(g.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Projekty"}),e.jsxs("p",{className:"admin-page-subtitle",children:[p?.total??d.length," ",A(p?.total??d.length,"projekt","projekty","projektů")]})]}),m("projects.create")&&e.jsxs(o,{to:"/projects/new",className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Nový projekt"]})]}),e.jsx(g.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:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:k,onChange:s=>{w(s.target.value),u(1)},className:"admin-form-input",placeholder:"Hledat podle čísla, názvu nebo zákazníka..."})}),d.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsx("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})})}),e.jsx("p",{children:"Zatím nejsou žádné projekty."}),e.jsx("p",{style:{color:"var(--text-tertiary)",fontSize:"0.875rem"},children:"Vytvořte první projekt tlačítkem výše nebo automaticky při vytvoření objednávky."})]}):e.jsx("div",{className:"admin-table-responsive",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("project_number"),children:["Číslo ",e.jsx(r,{column:"project_number",sort:i,order:a})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("name"),children:["Název ",e.jsx(r,{column:"name",sort:i,order:a})]}),e.jsx("th",{children:"Zákazník"}),e.jsx("th",{children:"Zodpovědná osoba"}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("status"),children:["Stav ",e.jsx(r,{column:"status",sort:i,order:a})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("start_date"),children:["Začátek ",e.jsx(r,{column:"start_date",sort:i,order:a})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>n("end_date"),children:["Konec ",e.jsx(r,{column:"end_date",sort:i,order:a})]}),e.jsx("th",{children:"Objednávka"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:d.map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:e.jsx(o,{to:`/projects/${s.id}`,className:"link-accent",children:s.project_number})}),e.jsx("td",{className:"fw-500",children:s.name||"—"}),e.jsx("td",{children:s.customer_name||"—"}),e.jsx("td",{children:s.responsible_user_name||"—"}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${O[s.status]||""}`,children:H[s.status]||s.status})}),e.jsx("td",{className:"admin-mono",children:b(s.start_date)}),e.jsx("td",{className:"admin-mono",children:b(s.end_date)}),e.jsx("td",{children:s.order_id?e.jsx(o,{to:`/orders/${s.order_id}`,className:"text-secondary",style:{textDecoration:"none"},children:s.order_number}):"—"}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx(o,{to:`/projects/${s.id}`,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",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"})]})}),!s.order_id&&m("projects.create")&&e.jsx("button",{onClick:()=>h(s),className:"admin-btn-icon danger",title:"Smazat projekt",disabled:j===s.id,children:j===s.id?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"}),e.jsx("path",{d:"M10 11v6M14 11v6"})]})})]})})]},s.id))})]})}),e.jsx(I,{pagination:p,onPageChange:u})]})}),e.jsx(D,{isOpen:!!t,onClose:()=>{h(null),x(!1)},onConfirm:z,title:"Smazat projekt",message:e.jsxs(e.Fragment,{children:["Opravdu chcete smazat projekt ",t?.project_number,"?",e.jsxs("label",{className:"admin-form-checkbox",style:{marginTop:"1rem",display:"flex"},children:[e.jsx("input",{type:"checkbox",checked:N,onChange:s=>x(s.target.checked)}),e.jsx("span",{children:"Smazat i soubory na disku"})]})]}),confirmText:"Smazat",type:"danger",loading:!!j})]})}export{G as default}; diff --git a/dist/assets/ReceivedInvoices-CGzp45kv.js b/dist/assets/ReceivedInvoices-Lo0YqDmF.js similarity index 99% rename from dist/assets/ReceivedInvoices-CGzp45kv.js rename to dist/assets/ReceivedInvoices-Lo0YqDmF.js index 0b04b75..54f65f0 100644 --- a/dist/assets/ReceivedInvoices-CGzp45kv.js +++ b/dist/assets/ReceivedInvoices-Lo0YqDmF.js @@ -1 +1 @@ -import{j as e,m as g,A as V}from"./vendor-animation-0s3FMHwK.js";import{r}from"./vendor-react-BVs3cwbi.js";import{a as we,u as ze,b as $e,c as y,e as ne,g as $,F as d,A as O,C as Fe,d as ie}from"./index-BrM8fzBu.js";import{u as De,S}from"./useListData-Bz9Xh_CU.js";import"./vendor-utils-Dyr8OjFr.js";const f="/api/admin",re={unpaid:"Neuhrazena",paid:"Uhrazena"},le={unpaid:"admin-badge-invoice-overdue",paid:"admin-badge-invoice-paid"},oe=["CZK","EUR","USD","GBP"],ce=[0,10,12,15,21],Ee=["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"];function de(l){return!l||l.length===0?"0 Kč":l.map(c=>$(c.amount,c.currency)).join(" · ")}function q(l,c){return!l||l.length===0?{value:"0 Kč",detail:null}:l.some(w=>w.currency!=="CZK")&&c!==null&&c!==void 0?{value:$(c,"CZK"),detail:de(l)}:{value:de(l),detail:null}}function Pe(){return{supplier_name:"",invoice_number:"",amount:"",currency:"CZK",vat_rate:"21",issue_date:"",due_date:"",notes:""}}Ue.displayName="ReceivedInvoices";function Ue({statsMonth:l,statsYear:c,uploadOpen:A,setUploadOpen:w}){const o=we(),{hasPermission:B}=ze(),{sort:R,order:j,handleSort:N,activeSort:k}=De("created_at"),[F,me]=r.useState(""),[K,ue]=r.useState([]),[M,J]=r.useState(!0),[m,G]=r.useState(null),[he,Q]=r.useState(!0),Z=r.useRef(!1),D=r.useRef(0),[pe,ve]=r.useState(0),X=r.useRef(l),Y=r.useRef(c),[ee,z]=r.useState(!1),[i,h]=r.useState(null),[E,H]=r.useState({show:!1,invoice:null}),[je,ae]=r.useState(!1),[p,P]=r.useState(!1),[_,I]=r.useState([]),[u,U]=r.useState([]),[b,L]=r.useState({}),te=r.useRef(null);$e(A||ee),r.useEffect(()=>{const t=Y.current*12+X.current,a=c*12+l;a>t&&(D.current=1),a{J(!0);try{const t=new URLSearchParams({month:String(l),year:String(c)});F&&t.set("search",F),R&&t.set("sort",R),j&&t.set("order",j);const s=await(await y(`${f}/received-invoices.php?${t}`)).json();s.success&&ue(s.data.invoices||[])}catch{}finally{J(!1)}},[l,c,F,R,j]);r.useEffect(()=>{C()},[C]);const T=r.useCallback(async()=>{try{const a=await(await y(`${f}/received-invoices.php?action=stats&month=${l}&year=${c}`)).json();a.success&&(G(a.data),Z.current=!0)}catch{}},[l,c]);r.useEffect(()=>{Q(!0),(async()=>{try{const s=await(await y(`${f}/received-invoices.php?action=stats&month=${l}&year=${c}`)).json();s.success&&(G(s.data),Z.current=!0,ve(n=>n+1))}catch{}finally{Q(!1)}})()},[l,c]);const xe=t=>{const a=Array.from(t.target.files||[]);if(a.length===0)return;if(_.length+a.length>20){o.error("Maximálně 20 souborů najednou");return}const s=a.filter(n=>n.size>10*1024*1024?(o.error(`Soubor "${n.name}" je větší než 10 MB`),!1):["application/pdf","image/jpeg","image/png"].includes(n.type)?!0:(o.error(`Soubor "${n.name}": nepodporovaný formát`),!1));I(n=>[...n,...s]),U(n=>[...n,...s.map(()=>Pe())]),t.target.value=""},ye=t=>{I(s=>s.filter((n,v)=>v!==t)),U(s=>s.filter((n,v)=>v!==t));const a={...b};delete a[t],L(a)},x=(t,a,s)=>{if(U(n=>n.map((v,Se)=>Se===t?{...v,[a]:s}:v)),b[t]){const n={...b};n[t]?.[a]&&(delete n[t][a],Object.keys(n[t]).length===0&&delete n[t]),L(n)}},fe=()=>{const t={};return u.forEach((a,s)=>{const n={};a.supplier_name.trim()||(n.supplier_name="Povinné pole"),(!a.amount||parseFloat(a.amount)<=0)&&(n.amount="Částka musí být větší než 0"),Object.keys(n).length>0&&(t[s]=n)}),L(t),Object.keys(t).length===0},be=async()=>{if(_.length===0){o.error("Vyberte alespoň jeden soubor");return}if(fe()){P(!0);try{const t=new FormData;_.forEach(n=>t.append("files[]",n)),t.append("invoices",JSON.stringify(u));const s=await(await y(`${f}/received-invoices.php`,{method:"POST",body:t})).json();s.success?(o.success(s.message||"Faktury byly nahrány"),w(!1),I([]),U([]),L({}),C(),T()):o.error(s.error||"Chyba při nahrávání")}catch{o.error("Chyba připojení")}finally{P(!1)}}},ge=t=>{h({...t,amount:String(t.amount),vat_rate:String(t.vat_rate),_originalStatus:t.status}),z(!0)},Ne=async()=>{if(i){if(!i.supplier_name?.trim()){o.error("Dodavatel je povinný");return}if(!i.amount||parseFloat(i.amount)<=0){o.error("Částka musí být větší než 0");return}P(!0);try{const t={supplier_name:i.supplier_name,invoice_number:i.invoice_number||"",amount:parseFloat(i.amount),currency:i.currency,vat_rate:parseFloat(i.vat_rate),issue_date:i.issue_date||"",due_date:i.due_date||"",notes:i.notes||"",status:i.status},s=await(await y(`${f}/received-invoices.php?id=${i.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json();s.success?(o.success(s.message||"Faktura byla aktualizována"),z(!1),h(null),C(),T()):o.error(s.error||"Chyba při ukládání")}catch{o.error("Chyba připojení")}finally{P(!1)}}},ke=async()=>{if(E.invoice){ae(!0);try{const a=await(await y(`${f}/received-invoices.php?id=${E.invoice.id}`,{method:"DELETE"})).json();a.success?(o.success(a.message||"Faktura byla smazána"),H({show:!1,invoice:null}),C(),T()):o.error(a.error||"Chyba při mazání")}catch{o.error("Chyba připojení")}finally{ae(!1)}}},se=async t=>{const a=window.open("","_blank");try{const s=await y(`${f}/received-invoices.php?action=file&id=${t.id}`);if(!s.ok){a.close(),o.error("Nepodařilo se načíst soubor");return}const n=await s.blob(),v=URL.createObjectURL(n);a.location.href=v,setTimeout(()=>URL.revokeObjectURL(v),6e4)}catch{a.close(),o.error("Chyba připojení")}},_e=async t=>{if(t.status!=="paid")try{const s=await(await y(`${f}/received-invoices.php?id=${t.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:"paid"})})).json();s.success?(o.success("Faktura označena jako uhrazená"),C(),T()):o.error(s.error||"Nepodařilo se změnit stav")}catch{o.error("Chyba připojení")}},W=`${Ee[l-1]}`,Ce=()=>{if(!Z.current&&he)return e.jsx("div",{className:"dash-kpi-grid dash-kpi-4 mb-6",children:[0,1,2,3].map(n=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},n))});if(!m)return null;const t=q(m.total_month,m.total_month_czk),a=q(m.vat_month,m.vat_month_czk),s=q(m.unpaid,m.unpaid_czk);return e.jsx("div",{style:{overflow:"hidden",marginBottom:"1.5rem"},children:e.jsx(V,{mode:"popLayout",initial:!1,custom:D.current,children:e.jsxs(g.div,{className:"dash-kpi-grid dash-kpi-4",custom:D.current,variants:{enter:n=>({x:`${(n||0)*105}%`,opacity:0}),center:{x:"0%",opacity:1},exit:n=>({x:`${(n||0)*-105}%`,opacity:0})},initial:"enter",animate:"center",exit:"exit",transition:{type:"spring",stiffness:300,damping:30},children:[e.jsxs("div",{className:"admin-stat-card success",children:[e.jsxs("div",{className:"admin-stat-label",children:["Celkem (",W,")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:t.value}),e.jsx("div",{className:"admin-stat-footer",children:t.detail||`${m.month_count} ${ie(m.month_count,"faktura","faktury","faktur")}`})]}),e.jsxs("div",{className:"admin-stat-card info",children:[e.jsxs("div",{className:"admin-stat-label",children:["DPH k odpočtu (",W,")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:a.value}),e.jsx("div",{className:"admin-stat-footer",children:a.detail||"z přijatých faktur"})]}),e.jsxs("div",{className:"admin-stat-card warning",children:[e.jsxs("div",{className:"admin-stat-label",children:["Neuhrazeno ",e.jsx("span",{style:{fontWeight:400,opacity:.7},children:"· celkově"})]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:s.value}),e.jsx("div",{className:"admin-stat-footer",children:s.detail||(m.unpaid_count===0?"vše uhrazeno":`${m.unpaid_count} ${ie(m.unpaid_count,"faktura","faktury","faktur")}`)})]}),e.jsxs("div",{className:"admin-stat-card",children:[e.jsxs("div",{className:"admin-stat-label",children:["Počet (",W,")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:m.month_count}),e.jsx("div",{className:"admin-stat-footer",children:m.month_count===0?"žádné faktury":"přijatých faktur"})]})]},pe)})})};return e.jsxs(e.Fragment,{children:[Ce(),e.jsx(g.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1}}),e.jsx(g.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:F,onChange:t=>me(t.target.value),className:"admin-form-input",placeholder:"Hledat podle dodavatele nebo čísla faktury..."})}),M&&e.jsx("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[0,1,2,3,4].map(t=>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/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},t))}),!M&&K.length===0&&e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),e.jsx("p",{children:"Žádné přijaté faktury v tomto měsíci."}),B("invoices.create")&&e.jsx("p",{style:{color:"var(--text-tertiary)",fontSize:"0.875rem"},children:"Nahrajte faktury tlačítkem výše."})]}),!M&&K.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.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("supplier_name"),children:["Dodavatel ",e.jsx(S,{column:"supplier_name",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("invoice_number"),children:["Č. faktury ",e.jsx(S,{column:"invoice_number",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("status"),children:["Stav ",e.jsx(S,{column:"status",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("issue_date"),children:["Vystaveno ",e.jsx(S,{column:"issue_date",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("due_date"),children:["Splatnost ",e.jsx(S,{column:"due_date",sort:k,order:j})]}),e.jsxs("th",{style:{textAlign:"right",cursor:"pointer"},onClick:()=>N("amount"),children:["Částka ",e.jsx(S,{column:"amount",sort:k,order:j})]}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:K.map(t=>e.jsxs("tr",{children:[e.jsx("td",{children:t.supplier_name}),e.jsx("td",{className:"admin-mono",children:t.invoice_number?e.jsx("span",{className:"link-accent",style:{cursor:"pointer"},onClick:()=>se(t),children:t.invoice_number}):"—"}),e.jsx("td",{children:t.status==="paid"?e.jsx("span",{className:`admin-badge ${le[t.status]}`,children:re[t.status]}):e.jsx("button",{onClick:()=>_e(t),className:`admin-badge ${le[t.status]||""}`,style:{cursor:"pointer"},children:re[t.status]||t.status})}),e.jsx("td",{className:"admin-mono",children:ne(t.issue_date)}),e.jsx("td",{className:"admin-mono",children:ne(t.due_date)}),e.jsx("td",{className:"admin-mono text-right fw-500",children:$(t.amount,t.currency)}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[t.file_name&&e.jsx("button",{className:"admin-btn-icon",title:"Zobrazit soubor",onClick:()=>se(t),children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}),B("invoices.edit")&&e.jsx("button",{className:"admin-btn-icon",title:"Upravit",onClick:()=>ge(t),children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})}),B("invoices.delete")&&e.jsx("button",{className:"admin-btn-icon danger",title:"Smazat",onClick:()=>H({show:!0,invoice:t}),children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},t.id))})]})})]})}),e.jsx(V,{children:A&&e.jsxs(g.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:()=>!p&&w(!1)}),e.jsxs(g.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Nahrát přijaté faktury"})}),e.jsxs("div",{className:"admin-modal-body",children:[e.jsxs("div",{className:"mb-4",children:[e.jsx("input",{ref:te,type:"file",multiple:!0,accept:"application/pdf,image/jpeg,image/png",style:{display:"none"},onChange:xe}),e.jsxs("button",{className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>te.current?.click(),children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Vybrat soubory"]}),e.jsx("span",{style:{marginLeft:"0.75rem",fontSize:"0.8125rem",color:"var(--text-tertiary)"},children:"PDF, JPEG, PNG · max 10 MB · max 20 souborů"})]}),_.length===0&&e.jsx("div",{className:"admin-empty-state",style:{padding:"2rem 0"},children:e.jsx("p",{style:{color:"var(--text-tertiary)"},children:"Zatím nebyly vybrány žádné soubory."})}),e.jsx("div",{className:"received-upload-list",children:_.map((t,a)=>e.jsxs("div",{className:"received-upload-card",children:[e.jsxs("div",{className:"received-upload-card-header",children:[e.jsxs("div",{className:"received-upload-file-info",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),e.jsx("span",{className:"received-upload-file-name",children:t.name}),e.jsxs("span",{className:"received-upload-file-size",children:[Math.round(t.size/1024)," KB"]})]}),e.jsx("button",{className:"admin-btn-icon danger",style:{width:"24px",height:"24px"},onClick:()=>ye(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsxs("div",{className:"received-upload-card-fields",children:[e.jsx(d,{label:"Dodavatel",error:b[a]?.supplier_name,required:!0,children:e.jsx("input",{type:"text",className:`admin-form-input${b[a]?.supplier_name?" has-error":""}`,value:u[a]?.supplier_name||"",onChange:s=>x(a,"supplier_name",s.target.value)})}),e.jsx(d,{label:"Č. faktury",children:e.jsx("input",{type:"text",className:"admin-form-input",value:u[a]?.invoice_number||"",onChange:s=>x(a,"invoice_number",s.target.value)})}),e.jsxs("div",{className:"received-upload-row",children:[e.jsx(d,{label:"Částka",error:b[a]?.amount,required:!0,style:{flex:1},children:e.jsx("input",{type:"number",step:"0.01",min:"0",className:`admin-form-input${b[a]?.amount?" has-error":""}`,value:u[a]?.amount||"",onChange:s=>x(a,"amount",s.target.value)})}),e.jsx(d,{label:"Měna",style:{width:"90px"},children:e.jsx("select",{className:"admin-form-select",value:u[a]?.currency||"CZK",onChange:s=>x(a,"currency",s.target.value),children:oe.map(s=>e.jsx("option",{value:s,children:s},s))})}),e.jsx(d,{label:"DPH %",style:{width:"90px"},children:e.jsx("select",{className:"admin-form-select",value:u[a]?.vat_rate||"21",onChange:s=>x(a,"vat_rate",s.target.value),children:ce.map(s=>e.jsxs("option",{value:String(s),children:[s,"%"]},s))})})]}),u[a]?.amount&&e.jsxs("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"-0.25rem",marginBottom:"0.5rem"},children:["DPH: ",$(parseFloat(u[a].amount||0)*parseFloat(u[a].vat_rate||21)/100,u[a].currency||"CZK")]}),e.jsxs("div",{className:"received-upload-row",children:[e.jsx(d,{label:"Datum vystavení",style:{flex:1},children:e.jsx(O,{mode:"date",value:u[a]?.issue_date||"",onChange:s=>x(a,"issue_date",s)})}),e.jsx(d,{label:"Datum splatnosti",style:{flex:1},children:e.jsx(O,{mode:"date",value:u[a]?.due_date||"",onChange:s=>x(a,"due_date",s)})})]}),e.jsx(d,{label:"Poznámka",children:e.jsx("input",{type:"text",className:"admin-form-input",value:u[a]?.notes||"",onChange:s=>x(a,"notes",s.target.value)})})]})]},`${t.name}-${a}`))})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{className:"admin-btn admin-btn-secondary",onClick:()=>!p&&w(!1),disabled:p,children:"Zrušit"}),e.jsx("button",{className:"admin-btn admin-btn-primary",onClick:be,disabled:p||_.length===0,children:p?"Nahrávání...":"Uložit vše"})]})]})]})}),e.jsx(V,{children:ee&&i&&e.jsxs(g.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:()=>!p&&z(!1)}),e.jsx(g.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:(()=>{const t=i._originalStatus==="paid";return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:t?"Detail přijaté faktury":"Upravit přijatou fakturu"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(d,{label:"Dodavatel",required:!0,children:e.jsx("input",{type:"text",className:"admin-form-input",value:i.supplier_name,onChange:a=>h(s=>({...s,supplier_name:a.target.value})),readOnly:t})}),e.jsx(d,{label:"Č. faktury",children:e.jsx("input",{type:"text",className:"admin-form-input",value:i.invoice_number||"",onChange:a=>h(s=>({...s,invoice_number:a.target.value})),readOnly:t})}),e.jsxs("div",{className:"admin-form-row admin-form-row-3",children:[e.jsx(d,{label:"Částka",required:!0,children:e.jsx("input",{type:"number",step:"0.01",min:"0",className:"admin-form-input",value:i.amount,onChange:a=>h(s=>({...s,amount:a.target.value})),readOnly:t})}),e.jsx(d,{label:"Měna",children:e.jsx("select",{className:"admin-form-select",value:i.currency,onChange:a=>h(s=>({...s,currency:a.target.value})),disabled:t,children:oe.map(a=>e.jsx("option",{value:a,children:a},a))})}),e.jsx(d,{label:"DPH %",children:e.jsx("select",{className:"admin-form-select",value:i.vat_rate,onChange:a=>h(s=>({...s,vat_rate:a.target.value})),disabled:t,children:ce.map(a=>e.jsxs("option",{value:String(a),children:[a,"%"]},a))})})]}),i.amount&&e.jsxs("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginBottom:"0.75rem"},children:["DPH: ",$(parseFloat(i.amount||0)*parseFloat(i.vat_rate||21)/100,i.currency||"CZK")]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(d,{label:"Datum vystavení",children:e.jsx(O,{mode:"date",value:i.issue_date||"",onChange:a=>h(s=>({...s,issue_date:a})),disabled:t})}),e.jsx(d,{label:"Datum splatnosti",children:e.jsx(O,{mode:"date",value:i.due_date||"",onChange:a=>h(s=>({...s,due_date:a})),disabled:t})})]}),e.jsx(d,{label:"Stav",children:e.jsxs("select",{className:"admin-form-select",value:i.status,onChange:a=>h(s=>({...s,status:a.target.value})),disabled:t,children:[e.jsx("option",{value:"unpaid",children:"Neuhrazena"}),e.jsx("option",{value:"paid",children:"Uhrazena"})]})}),e.jsx(d,{label:"Poznámka",children:e.jsx("textarea",{className:"admin-form-input",rows:3,value:i.notes||"",onChange:a=>h(s=>({...s,notes:a.target.value})),readOnly:t})})]})}),e.jsx("div",{className:"admin-modal-footer",children:t?e.jsx("button",{className:"admin-btn admin-btn-secondary",onClick:()=>z(!1),children:"Zavřít"}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"admin-btn admin-btn-secondary",onClick:()=>!p&&z(!1),disabled:p,children:"Zrušit"}),e.jsx("button",{className:"admin-btn admin-btn-primary",onClick:Ne,disabled:p,children:p?"Ukládání...":"Uložit"})]})})]})})()})]})}),e.jsx(Fe,{isOpen:E.show,onClose:()=>H({show:!1,invoice:null}),onConfirm:ke,title:"Smazat přijatou fakturu",message:`Opravdu chcete smazat fakturu "${E.invoice?.supplier_name||""}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:je})]})}export{Ue as default}; +import{j as e,m as g,A as V}from"./vendor-animation-0s3FMHwK.js";import{r}from"./vendor-react-BVs3cwbi.js";import{a as we,u as ze,b as $e,c as y,e as ne,g as $,F as d,A as O,C as Fe,d as ie}from"./index-Bay45BGf.js";import{u as De,S}from"./useListData-CvOpK9He.js";import"./vendor-utils-Dyr8OjFr.js";const f="/api/admin",re={unpaid:"Neuhrazena",paid:"Uhrazena"},le={unpaid:"admin-badge-invoice-overdue",paid:"admin-badge-invoice-paid"},oe=["CZK","EUR","USD","GBP"],ce=[0,10,12,15,21],Ee=["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"];function de(l){return!l||l.length===0?"0 Kč":l.map(c=>$(c.amount,c.currency)).join(" · ")}function q(l,c){return!l||l.length===0?{value:"0 Kč",detail:null}:l.some(w=>w.currency!=="CZK")&&c!==null&&c!==void 0?{value:$(c,"CZK"),detail:de(l)}:{value:de(l),detail:null}}function Pe(){return{supplier_name:"",invoice_number:"",amount:"",currency:"CZK",vat_rate:"21",issue_date:"",due_date:"",notes:""}}Ue.displayName="ReceivedInvoices";function Ue({statsMonth:l,statsYear:c,uploadOpen:A,setUploadOpen:w}){const o=we(),{hasPermission:B}=ze(),{sort:R,order:j,handleSort:N,activeSort:k}=De("created_at"),[F,me]=r.useState(""),[K,ue]=r.useState([]),[M,J]=r.useState(!0),[m,G]=r.useState(null),[he,Q]=r.useState(!0),Z=r.useRef(!1),D=r.useRef(0),[pe,ve]=r.useState(0),X=r.useRef(l),Y=r.useRef(c),[ee,z]=r.useState(!1),[i,h]=r.useState(null),[E,H]=r.useState({show:!1,invoice:null}),[je,ae]=r.useState(!1),[p,P]=r.useState(!1),[_,I]=r.useState([]),[u,U]=r.useState([]),[b,L]=r.useState({}),te=r.useRef(null);$e(A||ee),r.useEffect(()=>{const t=Y.current*12+X.current,a=c*12+l;a>t&&(D.current=1),a{J(!0);try{const t=new URLSearchParams({month:String(l),year:String(c)});F&&t.set("search",F),R&&t.set("sort",R),j&&t.set("order",j);const s=await(await y(`${f}/received-invoices.php?${t}`)).json();s.success&&ue(s.data.invoices||[])}catch{}finally{J(!1)}},[l,c,F,R,j]);r.useEffect(()=>{C()},[C]);const T=r.useCallback(async()=>{try{const a=await(await y(`${f}/received-invoices.php?action=stats&month=${l}&year=${c}`)).json();a.success&&(G(a.data),Z.current=!0)}catch{}},[l,c]);r.useEffect(()=>{Q(!0),(async()=>{try{const s=await(await y(`${f}/received-invoices.php?action=stats&month=${l}&year=${c}`)).json();s.success&&(G(s.data),Z.current=!0,ve(n=>n+1))}catch{}finally{Q(!1)}})()},[l,c]);const xe=t=>{const a=Array.from(t.target.files||[]);if(a.length===0)return;if(_.length+a.length>20){o.error("Maximálně 20 souborů najednou");return}const s=a.filter(n=>n.size>10*1024*1024?(o.error(`Soubor "${n.name}" je větší než 10 MB`),!1):["application/pdf","image/jpeg","image/png"].includes(n.type)?!0:(o.error(`Soubor "${n.name}": nepodporovaný formát`),!1));I(n=>[...n,...s]),U(n=>[...n,...s.map(()=>Pe())]),t.target.value=""},ye=t=>{I(s=>s.filter((n,v)=>v!==t)),U(s=>s.filter((n,v)=>v!==t));const a={...b};delete a[t],L(a)},x=(t,a,s)=>{if(U(n=>n.map((v,Se)=>Se===t?{...v,[a]:s}:v)),b[t]){const n={...b};n[t]?.[a]&&(delete n[t][a],Object.keys(n[t]).length===0&&delete n[t]),L(n)}},fe=()=>{const t={};return u.forEach((a,s)=>{const n={};a.supplier_name.trim()||(n.supplier_name="Povinné pole"),(!a.amount||parseFloat(a.amount)<=0)&&(n.amount="Částka musí být větší než 0"),Object.keys(n).length>0&&(t[s]=n)}),L(t),Object.keys(t).length===0},be=async()=>{if(_.length===0){o.error("Vyberte alespoň jeden soubor");return}if(fe()){P(!0);try{const t=new FormData;_.forEach(n=>t.append("files[]",n)),t.append("invoices",JSON.stringify(u));const s=await(await y(`${f}/received-invoices.php`,{method:"POST",body:t})).json();s.success?(o.success(s.message||"Faktury byly nahrány"),w(!1),I([]),U([]),L({}),C(),T()):o.error(s.error||"Chyba při nahrávání")}catch{o.error("Chyba připojení")}finally{P(!1)}}},ge=t=>{h({...t,amount:String(t.amount),vat_rate:String(t.vat_rate),_originalStatus:t.status}),z(!0)},Ne=async()=>{if(i){if(!i.supplier_name?.trim()){o.error("Dodavatel je povinný");return}if(!i.amount||parseFloat(i.amount)<=0){o.error("Částka musí být větší než 0");return}P(!0);try{const t={supplier_name:i.supplier_name,invoice_number:i.invoice_number||"",amount:parseFloat(i.amount),currency:i.currency,vat_rate:parseFloat(i.vat_rate),issue_date:i.issue_date||"",due_date:i.due_date||"",notes:i.notes||"",status:i.status},s=await(await y(`${f}/received-invoices.php?id=${i.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json();s.success?(o.success(s.message||"Faktura byla aktualizována"),z(!1),h(null),C(),T()):o.error(s.error||"Chyba při ukládání")}catch{o.error("Chyba připojení")}finally{P(!1)}}},ke=async()=>{if(E.invoice){ae(!0);try{const a=await(await y(`${f}/received-invoices.php?id=${E.invoice.id}`,{method:"DELETE"})).json();a.success?(o.success(a.message||"Faktura byla smazána"),H({show:!1,invoice:null}),C(),T()):o.error(a.error||"Chyba při mazání")}catch{o.error("Chyba připojení")}finally{ae(!1)}}},se=async t=>{const a=window.open("","_blank");try{const s=await y(`${f}/received-invoices.php?action=file&id=${t.id}`);if(!s.ok){a.close(),o.error("Nepodařilo se načíst soubor");return}const n=await s.blob(),v=URL.createObjectURL(n);a.location.href=v,setTimeout(()=>URL.revokeObjectURL(v),6e4)}catch{a.close(),o.error("Chyba připojení")}},_e=async t=>{if(t.status!=="paid")try{const s=await(await y(`${f}/received-invoices.php?id=${t.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:"paid"})})).json();s.success?(o.success("Faktura označena jako uhrazená"),C(),T()):o.error(s.error||"Nepodařilo se změnit stav")}catch{o.error("Chyba připojení")}},W=`${Ee[l-1]}`,Ce=()=>{if(!Z.current&&he)return e.jsx("div",{className:"dash-kpi-grid dash-kpi-4 mb-6",children:[0,1,2,3].map(n=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},n))});if(!m)return null;const t=q(m.total_month,m.total_month_czk),a=q(m.vat_month,m.vat_month_czk),s=q(m.unpaid,m.unpaid_czk);return e.jsx("div",{style:{overflow:"hidden",marginBottom:"1.5rem"},children:e.jsx(V,{mode:"popLayout",initial:!1,custom:D.current,children:e.jsxs(g.div,{className:"dash-kpi-grid dash-kpi-4",custom:D.current,variants:{enter:n=>({x:`${(n||0)*105}%`,opacity:0}),center:{x:"0%",opacity:1},exit:n=>({x:`${(n||0)*-105}%`,opacity:0})},initial:"enter",animate:"center",exit:"exit",transition:{type:"spring",stiffness:300,damping:30},children:[e.jsxs("div",{className:"admin-stat-card success",children:[e.jsxs("div",{className:"admin-stat-label",children:["Celkem (",W,")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:t.value}),e.jsx("div",{className:"admin-stat-footer",children:t.detail||`${m.month_count} ${ie(m.month_count,"faktura","faktury","faktur")}`})]}),e.jsxs("div",{className:"admin-stat-card info",children:[e.jsxs("div",{className:"admin-stat-label",children:["DPH k odpočtu (",W,")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:a.value}),e.jsx("div",{className:"admin-stat-footer",children:a.detail||"z přijatých faktur"})]}),e.jsxs("div",{className:"admin-stat-card warning",children:[e.jsxs("div",{className:"admin-stat-label",children:["Neuhrazeno ",e.jsx("span",{style:{fontWeight:400,opacity:.7},children:"· celkově"})]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:s.value}),e.jsx("div",{className:"admin-stat-footer",children:s.detail||(m.unpaid_count===0?"vše uhrazeno":`${m.unpaid_count} ${ie(m.unpaid_count,"faktura","faktury","faktur")}`)})]}),e.jsxs("div",{className:"admin-stat-card",children:[e.jsxs("div",{className:"admin-stat-label",children:["Počet (",W,")"]}),e.jsx("div",{className:"admin-stat-value admin-mono",children:m.month_count}),e.jsx("div",{className:"admin-stat-footer",children:m.month_count===0?"žádné faktury":"přijatých faktur"})]})]},pe)})})};return e.jsxs(e.Fragment,{children:[Ce(),e.jsx(g.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1}}),e.jsx(g.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:e.jsxs("div",{className:"admin-card-body",children:[e.jsx("div",{className:"admin-search-bar mb-4",children:e.jsx("input",{type:"text",value:F,onChange:t=>me(t.target.value),className:"admin-form-input",placeholder:"Hledat podle dodavatele nebo čísla faktury..."})}),M&&e.jsx("div",{className:"admin-skeleton",style:{gap:"1rem"},children:[0,1,2,3,4].map(t=>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/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},t))}),!M&&K.length===0&&e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),e.jsx("p",{children:"Žádné přijaté faktury v tomto měsíci."}),B("invoices.create")&&e.jsx("p",{style:{color:"var(--text-tertiary)",fontSize:"0.875rem"},children:"Nahrajte faktury tlačítkem výše."})]}),!M&&K.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.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("supplier_name"),children:["Dodavatel ",e.jsx(S,{column:"supplier_name",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("invoice_number"),children:["Č. faktury ",e.jsx(S,{column:"invoice_number",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("status"),children:["Stav ",e.jsx(S,{column:"status",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("issue_date"),children:["Vystaveno ",e.jsx(S,{column:"issue_date",sort:k,order:j})]}),e.jsxs("th",{style:{cursor:"pointer"},onClick:()=>N("due_date"),children:["Splatnost ",e.jsx(S,{column:"due_date",sort:k,order:j})]}),e.jsxs("th",{style:{textAlign:"right",cursor:"pointer"},onClick:()=>N("amount"),children:["Částka ",e.jsx(S,{column:"amount",sort:k,order:j})]}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:K.map(t=>e.jsxs("tr",{children:[e.jsx("td",{children:t.supplier_name}),e.jsx("td",{className:"admin-mono",children:t.invoice_number?e.jsx("span",{className:"link-accent",style:{cursor:"pointer"},onClick:()=>se(t),children:t.invoice_number}):"—"}),e.jsx("td",{children:t.status==="paid"?e.jsx("span",{className:`admin-badge ${le[t.status]}`,children:re[t.status]}):e.jsx("button",{onClick:()=>_e(t),className:`admin-badge ${le[t.status]||""}`,style:{cursor:"pointer"},children:re[t.status]||t.status})}),e.jsx("td",{className:"admin-mono",children:ne(t.issue_date)}),e.jsx("td",{className:"admin-mono",children:ne(t.due_date)}),e.jsx("td",{className:"admin-mono text-right fw-500",children:$(t.amount,t.currency)}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[t.file_name&&e.jsx("button",{className:"admin-btn-icon",title:"Zobrazit soubor",onClick:()=>se(t),children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}),B("invoices.edit")&&e.jsx("button",{className:"admin-btn-icon",title:"Upravit",onClick:()=>ge(t),children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})}),B("invoices.delete")&&e.jsx("button",{className:"admin-btn-icon danger",title:"Smazat",onClick:()=>H({show:!0,invoice:t}),children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},t.id))})]})})]})}),e.jsx(V,{children:A&&e.jsxs(g.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:()=>!p&&w(!1)}),e.jsxs(g.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:"Nahrát přijaté faktury"})}),e.jsxs("div",{className:"admin-modal-body",children:[e.jsxs("div",{className:"mb-4",children:[e.jsx("input",{ref:te,type:"file",multiple:!0,accept:"application/pdf,image/jpeg,image/png",style:{display:"none"},onChange:xe}),e.jsxs("button",{className:"admin-btn admin-btn-secondary admin-btn-sm",onClick:()=>te.current?.click(),children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"17 8 12 3 7 8"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"15"})]}),"Vybrat soubory"]}),e.jsx("span",{style:{marginLeft:"0.75rem",fontSize:"0.8125rem",color:"var(--text-tertiary)"},children:"PDF, JPEG, PNG · max 10 MB · max 20 souborů"})]}),_.length===0&&e.jsx("div",{className:"admin-empty-state",style:{padding:"2rem 0"},children:e.jsx("p",{style:{color:"var(--text-tertiary)"},children:"Zatím nebyly vybrány žádné soubory."})}),e.jsx("div",{className:"received-upload-list",children:_.map((t,a)=>e.jsxs("div",{className:"received-upload-card",children:[e.jsxs("div",{className:"received-upload-card-header",children:[e.jsxs("div",{className:"received-upload-file-info",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),e.jsx("span",{className:"received-upload-file-name",children:t.name}),e.jsxs("span",{className:"received-upload-file-size",children:[Math.round(t.size/1024)," KB"]})]}),e.jsx("button",{className:"admin-btn-icon danger",style:{width:"24px",height:"24px"},onClick:()=>ye(a),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsxs("div",{className:"received-upload-card-fields",children:[e.jsx(d,{label:"Dodavatel",error:b[a]?.supplier_name,required:!0,children:e.jsx("input",{type:"text",className:`admin-form-input${b[a]?.supplier_name?" has-error":""}`,value:u[a]?.supplier_name||"",onChange:s=>x(a,"supplier_name",s.target.value)})}),e.jsx(d,{label:"Č. faktury",children:e.jsx("input",{type:"text",className:"admin-form-input",value:u[a]?.invoice_number||"",onChange:s=>x(a,"invoice_number",s.target.value)})}),e.jsxs("div",{className:"received-upload-row",children:[e.jsx(d,{label:"Částka",error:b[a]?.amount,required:!0,style:{flex:1},children:e.jsx("input",{type:"number",step:"0.01",min:"0",className:`admin-form-input${b[a]?.amount?" has-error":""}`,value:u[a]?.amount||"",onChange:s=>x(a,"amount",s.target.value)})}),e.jsx(d,{label:"Měna",style:{width:"90px"},children:e.jsx("select",{className:"admin-form-select",value:u[a]?.currency||"CZK",onChange:s=>x(a,"currency",s.target.value),children:oe.map(s=>e.jsx("option",{value:s,children:s},s))})}),e.jsx(d,{label:"DPH %",style:{width:"90px"},children:e.jsx("select",{className:"admin-form-select",value:u[a]?.vat_rate||"21",onChange:s=>x(a,"vat_rate",s.target.value),children:ce.map(s=>e.jsxs("option",{value:String(s),children:[s,"%"]},s))})})]}),u[a]?.amount&&e.jsxs("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"-0.25rem",marginBottom:"0.5rem"},children:["DPH: ",$(parseFloat(u[a].amount||0)*parseFloat(u[a].vat_rate||21)/100,u[a].currency||"CZK")]}),e.jsxs("div",{className:"received-upload-row",children:[e.jsx(d,{label:"Datum vystavení",style:{flex:1},children:e.jsx(O,{mode:"date",value:u[a]?.issue_date||"",onChange:s=>x(a,"issue_date",s)})}),e.jsx(d,{label:"Datum splatnosti",style:{flex:1},children:e.jsx(O,{mode:"date",value:u[a]?.due_date||"",onChange:s=>x(a,"due_date",s)})})]}),e.jsx(d,{label:"Poznámka",children:e.jsx("input",{type:"text",className:"admin-form-input",value:u[a]?.notes||"",onChange:s=>x(a,"notes",s.target.value)})})]})]},`${t.name}-${a}`))})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{className:"admin-btn admin-btn-secondary",onClick:()=>!p&&w(!1),disabled:p,children:"Zrušit"}),e.jsx("button",{className:"admin-btn admin-btn-primary",onClick:be,disabled:p||_.length===0,children:p?"Nahrávání...":"Uložit vše"})]})]})]})}),e.jsx(V,{children:ee&&i&&e.jsxs(g.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:()=>!p&&z(!1)}),e.jsx(g.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:(()=>{const t=i._originalStatus==="paid";return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:t?"Detail přijaté faktury":"Upravit přijatou fakturu"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsx(d,{label:"Dodavatel",required:!0,children:e.jsx("input",{type:"text",className:"admin-form-input",value:i.supplier_name,onChange:a=>h(s=>({...s,supplier_name:a.target.value})),readOnly:t})}),e.jsx(d,{label:"Č. faktury",children:e.jsx("input",{type:"text",className:"admin-form-input",value:i.invoice_number||"",onChange:a=>h(s=>({...s,invoice_number:a.target.value})),readOnly:t})}),e.jsxs("div",{className:"admin-form-row admin-form-row-3",children:[e.jsx(d,{label:"Částka",required:!0,children:e.jsx("input",{type:"number",step:"0.01",min:"0",className:"admin-form-input",value:i.amount,onChange:a=>h(s=>({...s,amount:a.target.value})),readOnly:t})}),e.jsx(d,{label:"Měna",children:e.jsx("select",{className:"admin-form-select",value:i.currency,onChange:a=>h(s=>({...s,currency:a.target.value})),disabled:t,children:oe.map(a=>e.jsx("option",{value:a,children:a},a))})}),e.jsx(d,{label:"DPH %",children:e.jsx("select",{className:"admin-form-select",value:i.vat_rate,onChange:a=>h(s=>({...s,vat_rate:a.target.value})),disabled:t,children:ce.map(a=>e.jsxs("option",{value:String(a),children:[a,"%"]},a))})})]}),i.amount&&e.jsxs("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginBottom:"0.75rem"},children:["DPH: ",$(parseFloat(i.amount||0)*parseFloat(i.vat_rate||21)/100,i.currency||"CZK")]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(d,{label:"Datum vystavení",children:e.jsx(O,{mode:"date",value:i.issue_date||"",onChange:a=>h(s=>({...s,issue_date:a})),disabled:t})}),e.jsx(d,{label:"Datum splatnosti",children:e.jsx(O,{mode:"date",value:i.due_date||"",onChange:a=>h(s=>({...s,due_date:a})),disabled:t})})]}),e.jsx(d,{label:"Stav",children:e.jsxs("select",{className:"admin-form-select",value:i.status,onChange:a=>h(s=>({...s,status:a.target.value})),disabled:t,children:[e.jsx("option",{value:"unpaid",children:"Neuhrazena"}),e.jsx("option",{value:"paid",children:"Uhrazena"})]})}),e.jsx(d,{label:"Poznámka",children:e.jsx("textarea",{className:"admin-form-input",rows:3,value:i.notes||"",onChange:a=>h(s=>({...s,notes:a.target.value})),readOnly:t})})]})}),e.jsx("div",{className:"admin-modal-footer",children:t?e.jsx("button",{className:"admin-btn admin-btn-secondary",onClick:()=>z(!1),children:"Zavřít"}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"admin-btn admin-btn-secondary",onClick:()=>!p&&z(!1),disabled:p,children:"Zrušit"}),e.jsx("button",{className:"admin-btn admin-btn-primary",onClick:Ne,disabled:p,children:p?"Ukládání...":"Uložit"})]})})]})})()})]})}),e.jsx(Fe,{isOpen:E.show,onClose:()=>H({show:!1,invoice:null}),onConfirm:ke,title:"Smazat přijatou fakturu",message:`Opravdu chcete smazat fakturu "${E.invoice?.supplier_name||""}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:je})]})}export{Ue as default}; diff --git a/dist/assets/Settings-CCjKAfuK.js b/dist/assets/Settings-BAJF08Eo.js similarity index 98% rename from dist/assets/Settings-CCjKAfuK.js rename to dist/assets/Settings-BAJF08Eo.js index a73eb27..fbfee51 100644 --- a/dist/assets/Settings-CCjKAfuK.js +++ b/dist/assets/Settings-BAJF08Eo.js @@ -1 +1 @@ -import{j as e,m as v,A as re}from"./vendor-animation-0s3FMHwK.js";import{g as le,r as n}from"./vendor-react-BVs3cwbi.js";import{a as oe,u as de,b as ce,c as f,F as A,C as me}from"./index-BrM8fzBu.js";import"./vendor-utils-Dyr8OjFr.js";const y="/api/admin",pe={attendance:"Docházka",trips:"Kniha jízd",offers:"Nabídky",orders:"Objednávky",projects:"Projekty",invoices:"Faktury",users:"Uživatelé",settings:"Nastavení"};function je(){const l=oe(),{hasPermission:_}=de(),F=le(),[U,P]=n.useState(!0),[V,W]=n.useState([]),[,Z]=n.useState([]),[M,I]=n.useState({}),[m,R]=n.useState(!1),[q,E]=n.useState(!0),[T,B]=n.useState(!1),[D,N]=n.useState(!1),[a,k]=n.useState(null),[w,L]=n.useState(!1),[o,p]=n.useState({name:"",display_name:"",description:"",permissions:[]}),[g,C]=n.useState({show:!1,role:null}),[G,O]=n.useState(!1),u=_("settings.roles"),j=_("settings.security");n.useEffect(()=>{!u&&!j&&F("/")},[u,j,F]),ce(D);const b=n.useCallback(async()=>{if(!u){P(!1);return}try{const s=await f(`${y}/roles.php`);if(s.status===401)return;const i=await s.json();i.success?(W(i.data.roles),Z(i.data.permissions),I(i.data.permission_groups)):l.error(i.error||"Nepodařilo se načíst role")}catch{l.error("Chyba připojení")}finally{P(!1)}},[l,u]);n.useEffect(()=>{b()},[b]);const $=n.useCallback(async()=>{if(!j){E(!1);return}try{const i=await(await f(`${y}/totp.php?action=get_required`)).json();i.success&&R(i.data.require_2fa)}catch{}finally{E(!1)}},[j]);n.useEffect(()=>{$()},[$]);const H=async()=>{B(!0);try{const i=await(await f(`${y}/totp.php?action=set_required`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({required:!m})})).json();i.success?(R(i.data.require_2fa),l.success(i.message)):l.error(i.error||"Nepodařilo se uložit nastavení")}catch{l.error("Chyba připojení")}finally{B(!1)}},J=s=>s.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),K=()=>{k(null),p({name:"",display_name:"",description:"",permissions:[]}),N(!0)},Q=s=>{k(s),p({name:s.name,display_name:s.display_name,description:s.description||"",permissions:s.permissions||[]}),N(!0)},S=()=>{N(!1),k(null)},X=s=>{const i={display_name:s};a||(i.name=J(s)),p(d=>({...d,...i}))},Y=s=>{p(i=>({...i,permissions:i.permissions.includes(s)?i.permissions.filter(d=>d!==s):[...i.permissions,s]}))},ee=s=>{const i=(M[s]||[]).map(t=>t.name),d=i.every(t=>o.permissions.includes(t));p(t=>({...t,permissions:d?t.permissions.filter(c=>!i.includes(c)):[...new Set([...t.permissions,...i])]}))},se=async s=>{if(s?.preventDefault(),!o.display_name.trim()){l.error("Zobrazovaný název je povinný");return}if(!a&&!o.name.trim()){l.error("Název role je povinný");return}L(!0);try{const i=a?`${y}/roles.php?id=${a.id}`:`${y}/roles.php`,t=await(await f(i,{method:a?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json();t.success?(S(),await new Promise(c=>setTimeout(c,300)),l.success(t.message||(a?"Role byla aktualizována":"Role byla vytvořena")),b()):l.error(t.error||"Nepodařilo se uložit roli")}catch{l.error("Chyba připojení")}finally{L(!1)}},ie=async()=>{if(g.role){O(!0);try{const i=await(await f(`${y}/roles.php?id=${g.role.id}`,{method:"DELETE"})).json();i.success?(C({show:!1,role:null}),l.success(i.message||"Role byla smazána"),b()):l.error(i.error||"Nepodařilo se smazat roli")}catch{l.error("Chyba připojení")}finally{O(!1)}}};if(U)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},s))})})]});const h=s=>s.name==="admin";function ae(){return q?e.jsx("div",{className:"admin-skeleton-line",style:{width:"200px",height:"12px"}}):m?"Všichni uživatelé musí mít aktivní 2FA pro přístup do systému":"2FA je volitelná - uživatelé si ji mohou aktivovat v profilu"}function ne(){return T?"Ukládání...":m?"Vypnout":"Zapnout"}function te(){return w?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):a?"Uložit změny":"Vytvořit roli"}return e.jsxs("div",{children:[e.jsxs(v.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nastavení"}),e.jsx("p",{className:"admin-page-subtitle",children:"Zabezpečení a správa rolí"})]}),u&&e.jsxs("button",{onClick:K,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat roli"]})]}),j&&e.jsxs(v.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h2",{className:"admin-card-title",children:"Zabezpečení"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1rem"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{style:{width:36,height:36,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:m?"var(--success-light)":"rgba(var(--text-secondary-rgb, 107, 114, 128), 0.1)",color:m?"var(--success)":"var(--text-secondary)",flexShrink:0},children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),e.jsx("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})}),e.jsxs("div",{children:[e.jsx("div",{style:{fontWeight:500,color:"var(--text-primary)",fontSize:"0.875rem"},children:"Povinné dvoufaktorové ověření (2FA)"}),e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:ae()})]})]}),!q&&e.jsx("button",{onClick:H,disabled:T,className:`admin-btn admin-btn-sm ${m?"admin-btn-secondary":"admin-btn-primary"}`,style:m?{color:"var(--danger)"}:{},children:ne()})]})})]}),u&&e.jsx(v.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsx("div",{className:"admin-card-body",children: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:"Název"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{children:"Oprávnění"}),e.jsx("th",{children:"Uživatelé"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:V.map(s=>e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("div",{style:{fontWeight:500,color:"var(--text-primary)"},children:s.display_name}),e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:s.name})]}),e.jsx("td",{style:{color:"var(--text-secondary)"},children:s.description||"—"}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-info",children:h(s)?"Vše":s.permission_count})}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-secondary",children:s.user_count})}),e.jsx("td",{children:!h(s)&&e.jsxs("div",{className:"flex-row gap-2",children:[e.jsx("button",{onClick:()=>Q(s),className:"admin-btn-icon",title:"Upravit","aria-label":"Upravit",children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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:()=>C({show:!0,role:s}),className:"admin-btn-icon danger",title:s.user_count>0?"Nelze smazat roli s přiřazenými uživateli":"Smazat","aria-label":s.user_count>0?"Nelze smazat roli s přiřazenými uživateli":"Smazat",disabled:s.user_count>0,children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id))})]})})})}),e.jsx(re,{children:D&&e.jsxs(v.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:S}),e.jsxs(v.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:a?"Upravit roli":"Nová role"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[a&&h(a)&&e.jsxs("div",{className:"admin-role-locked-notice",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),e.jsx("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]}),"Administrátor má vždy plný přístup ke všem funkcím"]}),e.jsx(A,{label:"Zobrazovaný název",children:e.jsx("input",{type:"text",value:o.display_name,onChange:s=>X(s.target.value),className:"admin-form-input",placeholder:"např. Manažer",disabled:a&&h(a)})}),e.jsxs(A,{label:"Systémový název (slug)",children:[e.jsx("input",{type:"text",value:o.name,onChange:s=>p(i=>({...i,name:s.target.value})),className:"admin-form-input",placeholder:"např. manager",disabled:!!a}),!a&&e.jsx("small",{style:{color:"var(--text-tertiary)",fontSize:"0.75rem"},children:"Pouze malá písmena, čísla a pomlčky. Nelze později změnit."})]}),e.jsx(A,{label:"Popis",children:e.jsx("textarea",{value:o.description,onChange:s=>p(i=>({...i,description:s.target.value})),className:"admin-form-input",rows:2,placeholder:"Volitelný popis role",disabled:a&&h(a)})}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",style:{marginBottom:"0.75rem"},children:"Oprávnění"}),Object.entries(M).sort(([s,i],[d,t])=>{if(s==="settings")return 1;if(d==="settings")return-1;const c=Math.min(...i.map(x=>x.id)),z=Math.min(...t.map(x=>x.id));return c-z}).map(([s,i],d)=>{const t=i.map(r=>r.name),c=t.every(r=>o.permissions.includes(r)),z=t.some(r=>o.permissions.includes(r)),x=a&&h(a);return e.jsxs("div",{children:[d>0&&e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-color, #e0e0e0)",margin:"0.75rem 0"}}),e.jsxs("div",{className:"admin-permission-group",children:[e.jsx("div",{className:"admin-permission-group-title",children:e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:c,ref:r=>{r&&(r.indeterminate=z&&!c)},onChange:()=>ee(s),disabled:x}),e.jsx("span",{children:pe[s]||s})]})}),e.jsx("div",{className:"admin-permission-list",children:i.map(r=>e.jsxs("div",{className:"admin-permission-item",children:[e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:o.permissions.includes(r.name),onChange:()=>Y(r.name),disabled:x}),e.jsx("span",{children:r.display_name})]}),r.description&&e.jsx("div",{className:"admin-permission-desc",children:r.description})]},r.id))})]})]},s)})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:S,className:"admin-btn admin-btn-secondary",disabled:w,children:"Zrušit"}),!(a&&h(a))&&e.jsx("button",{type:"button",onClick:se,className:"admin-btn admin-btn-primary",disabled:w,children:te()})]})]})]})}),e.jsx(me,{isOpen:g.show,onClose:()=>C({show:!1,role:null}),onConfirm:ie,title:"Smazat roli",message:`Opravdu chcete smazat roli "${g.role?.display_name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:G})]})}export{je as default}; +import{j as e,m as v,A as re}from"./vendor-animation-0s3FMHwK.js";import{g as le,r as n}from"./vendor-react-BVs3cwbi.js";import{a as oe,u as de,b as ce,c as f,F as A,C as me}from"./index-Bay45BGf.js";import"./vendor-utils-Dyr8OjFr.js";const y="/api/admin",pe={attendance:"Docházka",trips:"Kniha jízd",offers:"Nabídky",orders:"Objednávky",projects:"Projekty",invoices:"Faktury",users:"Uživatelé",settings:"Nastavení"};function je(){const l=oe(),{hasPermission:_}=de(),F=le(),[U,P]=n.useState(!0),[V,W]=n.useState([]),[,Z]=n.useState([]),[M,I]=n.useState({}),[m,R]=n.useState(!1),[q,E]=n.useState(!0),[T,B]=n.useState(!1),[D,N]=n.useState(!1),[a,k]=n.useState(null),[w,L]=n.useState(!1),[o,p]=n.useState({name:"",display_name:"",description:"",permissions:[]}),[g,C]=n.useState({show:!1,role:null}),[G,O]=n.useState(!1),u=_("settings.roles"),j=_("settings.security");n.useEffect(()=>{!u&&!j&&F("/")},[u,j,F]),ce(D);const b=n.useCallback(async()=>{if(!u){P(!1);return}try{const s=await f(`${y}/roles.php`);if(s.status===401)return;const i=await s.json();i.success?(W(i.data.roles),Z(i.data.permissions),I(i.data.permission_groups)):l.error(i.error||"Nepodařilo se načíst role")}catch{l.error("Chyba připojení")}finally{P(!1)}},[l,u]);n.useEffect(()=>{b()},[b]);const $=n.useCallback(async()=>{if(!j){E(!1);return}try{const i=await(await f(`${y}/totp.php?action=get_required`)).json();i.success&&R(i.data.require_2fa)}catch{}finally{E(!1)}},[j]);n.useEffect(()=>{$()},[$]);const H=async()=>{B(!0);try{const i=await(await f(`${y}/totp.php?action=set_required`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({required:!m})})).json();i.success?(R(i.data.require_2fa),l.success(i.message)):l.error(i.error||"Nepodařilo se uložit nastavení")}catch{l.error("Chyba připojení")}finally{B(!1)}},J=s=>s.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),K=()=>{k(null),p({name:"",display_name:"",description:"",permissions:[]}),N(!0)},Q=s=>{k(s),p({name:s.name,display_name:s.display_name,description:s.description||"",permissions:s.permissions||[]}),N(!0)},S=()=>{N(!1),k(null)},X=s=>{const i={display_name:s};a||(i.name=J(s)),p(d=>({...d,...i}))},Y=s=>{p(i=>({...i,permissions:i.permissions.includes(s)?i.permissions.filter(d=>d!==s):[...i.permissions,s]}))},ee=s=>{const i=(M[s]||[]).map(t=>t.name),d=i.every(t=>o.permissions.includes(t));p(t=>({...t,permissions:d?t.permissions.filter(c=>!i.includes(c)):[...new Set([...t.permissions,...i])]}))},se=async s=>{if(s?.preventDefault(),!o.display_name.trim()){l.error("Zobrazovaný název je povinný");return}if(!a&&!o.name.trim()){l.error("Název role je povinný");return}L(!0);try{const i=a?`${y}/roles.php?id=${a.id}`:`${y}/roles.php`,t=await(await f(i,{method:a?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json();t.success?(S(),await new Promise(c=>setTimeout(c,300)),l.success(t.message||(a?"Role byla aktualizována":"Role byla vytvořena")),b()):l.error(t.error||"Nepodařilo se uložit roli")}catch{l.error("Chyba připojení")}finally{L(!1)}},ie=async()=>{if(g.role){O(!0);try{const i=await(await f(`${y}/roles.php?id=${g.role.id}`,{method:"DELETE"})).json();i.success?(C({show:!1,role:null}),l.success(i.message||"Role byla smazána"),b()):l.error(i.error||"Nepodařilo se smazat roli")}catch{l.error("Chyba připojení")}finally{O(!1)}}};if(U)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},s))})})]});const h=s=>s.name==="admin";function ae(){return q?e.jsx("div",{className:"admin-skeleton-line",style:{width:"200px",height:"12px"}}):m?"Všichni uživatelé musí mít aktivní 2FA pro přístup do systému":"2FA je volitelná - uživatelé si ji mohou aktivovat v profilu"}function ne(){return T?"Ukládání...":m?"Vypnout":"Zapnout"}function te(){return w?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):a?"Uložit změny":"Vytvořit roli"}return e.jsxs("div",{children:[e.jsxs(v.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Nastavení"}),e.jsx("p",{className:"admin-page-subtitle",children:"Zabezpečení a správa rolí"})]}),u&&e.jsxs("button",{onClick:K,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat roli"]})]}),j&&e.jsxs(v.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("div",{className:"admin-card-header",children:e.jsx("h2",{className:"admin-card-title",children:"Zabezpečení"})}),e.jsx("div",{className:"admin-card-body",children:e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1rem"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{style:{width:36,height:36,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:m?"var(--success-light)":"rgba(var(--text-secondary-rgb, 107, 114, 128), 0.1)",color:m?"var(--success)":"var(--text-secondary)",flexShrink:0},children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),e.jsx("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})}),e.jsxs("div",{children:[e.jsx("div",{style:{fontWeight:500,color:"var(--text-primary)",fontSize:"0.875rem"},children:"Povinné dvoufaktorové ověření (2FA)"}),e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:ae()})]})]}),!q&&e.jsx("button",{onClick:H,disabled:T,className:`admin-btn admin-btn-sm ${m?"admin-btn-secondary":"admin-btn-primary"}`,style:m?{color:"var(--danger)"}:{},children:ne()})]})})]}),u&&e.jsx(v.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:e.jsx("div",{className:"admin-card-body",children: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:"Název"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{children:"Oprávnění"}),e.jsx("th",{children:"Uživatelé"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:V.map(s=>e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("div",{style:{fontWeight:500,color:"var(--text-primary)"},children:s.display_name}),e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:s.name})]}),e.jsx("td",{style:{color:"var(--text-secondary)"},children:s.description||"—"}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-info",children:h(s)?"Vše":s.permission_count})}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge admin-badge-secondary",children:s.user_count})}),e.jsx("td",{children:!h(s)&&e.jsxs("div",{className:"flex-row gap-2",children:[e.jsx("button",{onClick:()=>Q(s),className:"admin-btn-icon",title:"Upravit","aria-label":"Upravit",children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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:()=>C({show:!0,role:s}),className:"admin-btn-icon danger",title:s.user_count>0?"Nelze smazat roli s přiřazenými uživateli":"Smazat","aria-label":s.user_count>0?"Nelze smazat roli s přiřazenými uživateli":"Smazat",disabled:s.user_count>0,children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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"})]})})]})})]},s.id))})]})})})}),e.jsx(re,{children:D&&e.jsxs(v.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:S}),e.jsxs(v.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:a?"Upravit roli":"Nová role"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[a&&h(a)&&e.jsxs("div",{className:"admin-role-locked-notice",children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),e.jsx("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]}),"Administrátor má vždy plný přístup ke všem funkcím"]}),e.jsx(A,{label:"Zobrazovaný název",children:e.jsx("input",{type:"text",value:o.display_name,onChange:s=>X(s.target.value),className:"admin-form-input",placeholder:"např. Manažer",disabled:a&&h(a)})}),e.jsxs(A,{label:"Systémový název (slug)",children:[e.jsx("input",{type:"text",value:o.name,onChange:s=>p(i=>({...i,name:s.target.value})),className:"admin-form-input",placeholder:"např. manager",disabled:!!a}),!a&&e.jsx("small",{style:{color:"var(--text-tertiary)",fontSize:"0.75rem"},children:"Pouze malá písmena, čísla a pomlčky. Nelze později změnit."})]}),e.jsx(A,{label:"Popis",children:e.jsx("textarea",{value:o.description,onChange:s=>p(i=>({...i,description:s.target.value})),className:"admin-form-input",rows:2,placeholder:"Volitelný popis role",disabled:a&&h(a)})}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",style:{marginBottom:"0.75rem"},children:"Oprávnění"}),Object.entries(M).sort(([s,i],[d,t])=>{if(s==="settings")return 1;if(d==="settings")return-1;const c=Math.min(...i.map(x=>x.id)),z=Math.min(...t.map(x=>x.id));return c-z}).map(([s,i],d)=>{const t=i.map(r=>r.name),c=t.every(r=>o.permissions.includes(r)),z=t.some(r=>o.permissions.includes(r)),x=a&&h(a);return e.jsxs("div",{children:[d>0&&e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-color, #e0e0e0)",margin:"0.75rem 0"}}),e.jsxs("div",{className:"admin-permission-group",children:[e.jsx("div",{className:"admin-permission-group-title",children:e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:c,ref:r=>{r&&(r.indeterminate=z&&!c)},onChange:()=>ee(s),disabled:x}),e.jsx("span",{children:pe[s]||s})]})}),e.jsx("div",{className:"admin-permission-list",children:i.map(r=>e.jsxs("div",{className:"admin-permission-item",children:[e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:o.permissions.includes(r.name),onChange:()=>Y(r.name),disabled:x}),e.jsx("span",{children:r.display_name})]}),r.description&&e.jsx("div",{className:"admin-permission-desc",children:r.description})]},r.id))})]})]},s)})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:S,className:"admin-btn admin-btn-secondary",disabled:w,children:"Zrušit"}),!(a&&h(a))&&e.jsx("button",{type:"button",onClick:se,className:"admin-btn admin-btn-primary",disabled:w,children:te()})]})]})]})}),e.jsx(me,{isOpen:g.show,onClose:()=>C({show:!1,role:null}),onConfirm:ie,title:"Smazat roli",message:`Opravdu chcete smazat roli "${g.role?.display_name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:G})]})}export{je as default}; diff --git a/dist/assets/Trips-DHINOVlF.js b/dist/assets/Trips-CmUyrh1d.js similarity index 99% rename from dist/assets/Trips-DHINOVlF.js rename to dist/assets/Trips-CmUyrh1d.js index 9d6acd6..77371c7 100644 --- a/dist/assets/Trips-DHINOVlF.js +++ b/dist/assets/Trips-CmUyrh1d.js @@ -1 +1 @@ -import{j as e,m as u,A as O}from"./vendor-animation-0s3FMHwK.js";import{r,L as W}from"./vendor-react-BVs3cwbi.js";import{a as q,u as U,c as y,b as H,f as x,F as l,A as K,C as R}from"./index-BrM8fzBu.js";import{F as J}from"./Forbidden-D25jV3Oq.js";import{b as G}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const j="/api/admin";function te(){const o=q(),{hasPermission:M}=U(),[P,N]=r.useState(!0),[f,g]=r.useState(!1),[T,D]=r.useState({trips:[],vehicles:[],month:"",totals:{total:0,business:0,private:0,count:0}}),[w,m]=r.useState(!1),[h,z]=r.useState(null),[C,_]=r.useState({show:!1,tripId:null}),[a,n]=r.useState({vehicle_id:"",trip_date:new Date().toISOString().split("T")[0],start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),[c,d]=r.useState({}),[,p]=r.useState(0),v=r.useCallback(async(s=!0)=>{s&&N(!0);try{const i=await(await y(`${j}/trips.php`,{})).json();i.success&&D(i.data)}catch{o.error("Nepodařilo se načíst data")}finally{s&&N(!1)}},[o]);if(r.useEffect(()=>{v()},[v]),H(w),!M("trips.record"))return e.jsx(J,{});const B=async s=>{if(!s){p(0);return}try{const i=await(await y(`${j}/trips.php?action=last_km&vehicle_id=${s}`,{})).json();i.success&&(p(i.data.last_km),h||n(b=>({...b,start_km:i.data.last_km})))}catch{}},S=()=>{z(null);const s=new Date().toISOString().split("T")[0];n({vehicle_id:"",trip_date:s,start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),p(0),d({}),m(!0)},E=s=>{z(s),n({vehicle_id:s.vehicle_id,trip_date:s.trip_date,start_km:s.start_km,end_km:s.end_km,route_from:s.route_from,route_to:s.route_to,is_business:s.is_business,notes:s.notes||""}),p(s.start_km),d({}),m(!0)},I=s=>{n(t=>({...t,vehicle_id:s})),B(s)},V=()=>{const s={};return a.vehicle_id||(s.vehicle_id="Vyberte vozidlo"),a.trip_date||(s.trip_date="Zadejte datum"),a.start_km||(s.start_km="Zadejte počáteční km"),a.end_km||(s.end_km="Zadejte konečný km"),a.start_km&&a.end_km&&parseInt(a.end_km)<=parseInt(a.start_km)&&(s.end_km="Musí být větší než počáteční"),a.route_from||(s.route_from="Zadejte místo odjezdu"),a.route_to||(s.route_to="Zadejte místo příjezdu"),d(s),Object.keys(s).length===0},Z=async()=>{if(V()){g(!0);try{const s=h?`${j}/trips.php?id=${h.id}`:`${j}/trips.php`,i=await(await y(s,{method:h?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();i.success?(m(!1),await v(!1),await new Promise(b=>setTimeout(b,300)),o.success(i.message)):o.error(i.error)}catch{o.error("Chyba připojení")}finally{g(!1)}}},$=async s=>{try{const i=await(await y(`${j}/trips.php?id=${s}`,{method:"DELETE"})).json();i.success?(await v(!1),o.success(i.message)):o.error(i.error)}catch{o.error("Chyba připojení")}finally{_({show:!1,tripId:null})}},A=()=>{const s=parseInt(a.start_km)||0,t=parseInt(a.end_km)||0;return t>s?t-s:0};if(P)return e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-grid admin-grid-4",children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>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"})]},s))})})]})});const{trips:L,vehicles:F,totals:k}=T;return e.jsxs("div",{children:[e.jsxs(u.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Kniha jízd"}),e.jsx("p",{className:"admin-page-subtitle",children:new Date().toLocaleDateString("cs-CZ",{month:"long",year:"numeric"})})]}),e.jsx("div",{className:"admin-page-actions",children:e.jsxs("button",{onClick:S,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat jízdu"]})})]}),e.jsxs(u.div,{className:"admin-grid admin-grid-4",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"admin-stat-card info",children:[e.jsx("div",{className:"admin-stat-icon info",children:e.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("line",{x1:"12",y1:"20",x2:"12",y2:"10"}),e.jsx("line",{x1:"18",y1:"20",x2:"18",y2:"4"}),e.jsx("line",{x1:"6",y1:"20",x2:"6",y2:"16"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsx("span",{className:"admin-stat-value",children:k.count}),e.jsx("span",{className:"admin-stat-label",children:"Počet jízd"})]})]}),e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-stat-icon",children:e.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"M22 12h-4l-3 9L9 3l-3 9H2"})})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-value",children:[x(k.total)," km"]}),e.jsx("span",{className:"admin-stat-label",children:"Celkem naježděno"})]})]}),e.jsxs("div",{className:"admin-stat-card success",children:[e.jsx("div",{className:"admin-stat-icon success",children:e.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"1",y:"3",width:"15",height:"13",rx:"2",ry:"2"}),e.jsx("path",{d:"M16 8h2a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-1"}),e.jsx("circle",{cx:"5.5",cy:"18",r:"2"}),e.jsx("circle",{cx:"18.5",cy:"18",r:"2"}),e.jsx("path",{d:"M8 18h8"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-value",children:[x(k.business)," km"]}),e.jsx("span",{className:"admin-stat-label",children:"Služební"})]})]}),e.jsxs("div",{className:"admin-stat-card warning",children:[e.jsx("div",{className:"admin-stat-icon warning",children:e.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"}),e.jsx("polyline",{points:"9 22 9 12 15 12 15 22"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-value",children:[x(k.private)," km"]}),e.jsx("span",{className:"admin-stat-label",children:"Soukromé"})]})]})]}),e.jsxs(u.div,{className:"admin-card mt-6",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"admin-card-header flex-between",children:[e.jsx("h2",{className:"admin-card-title",children:"Poslední jízdy"}),e.jsx(W,{to:"/trips/history",className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Zobrazit historii"})]}),e.jsx("div",{className:"admin-card-body",children:L.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),e.jsx("p",{children:"Zatím nemáte žádné záznamy jízd."}),e.jsx("button",{onClick:S,className:"admin-btn admin-btn-primary",children:"Přidat první jízdu"})]}):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:"Datum"}),e.jsx("th",{children:"Vozidlo"}),e.jsx("th",{children:"Řidič"}),e.jsx("th",{children:"Trasa"}),e.jsx("th",{children:"Vzdálenost"}),e.jsx("th",{children:"Typ"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:L.slice(0,10).map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:G(s.trip_date)}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge",children:s.spz})}),e.jsx("td",{children:s.driver_name}),e.jsx("td",{children:e.jsxs("span",{style:{whiteSpace:"nowrap"},children:[s.route_from," → ",s.route_to]})}),e.jsx("td",{className:"admin-mono",children:e.jsxs("strong",{children:[x(s.distance)," km"]})}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${s.is_business?"admin-badge-success":"admin-badge-warning"}`,children:s.is_business?"Služební":"Soukromá"})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>E(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,tripId:s.id}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",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"})]})})]})})]},s.id))})]})})})]}),e.jsx(O,{children:w&&e.jsxs(u.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:()=>m(!1)}),e.jsxs(u.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:h?"Upravit jízdu":"Přidat jízdu"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{label:"Vozidlo",error:c.vehicle_id,required:!0,children:e.jsxs("select",{value:a.vehicle_id,onChange:s=>{I(s.target.value),d(t=>({...t,vehicle_id:void 0}))},className:"admin-form-select",children:[e.jsx("option",{value:"",children:"Vyberte vozidlo"}),F.map(s=>e.jsxs("option",{value:s.id,children:[s.spz," - ",s.name]},s.id))]})}),e.jsx(l,{label:"Datum jízdy",error:c.trip_date,required:!0,children:e.jsx(K,{mode:"date",value:a.trip_date,onChange:s=>{n({...a,trip_date:s}),d(t=>({...t,trip_date:void 0}))}})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3",children:[e.jsx(l,{label:"Počáteční stav km",error:c.start_km,required:!0,children:e.jsx("input",{type:"number",inputMode:"numeric",value:a.start_km,onChange:s=>{n({...a,start_km:s.target.value}),d(t=>({...t,start_km:void 0}))},className:"admin-form-input",min:"0"})}),e.jsx(l,{label:"Konečný stav km",error:c.end_km,required:!0,children:e.jsx("input",{type:"number",inputMode:"numeric",value:a.end_km,onChange:s=>{n({...a,end_km:s.target.value}),d(t=>({...t,end_km:void 0}))},className:"admin-form-input",min:"0"})}),e.jsx(l,{label:"Vzdálenost",children:e.jsx("input",{type:"text",value:`${x(A())} km`,className:"admin-form-input",readOnly:!0,disabled:!0})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{label:"Místo odjezdu",error:c.route_from,required:!0,children:e.jsx("input",{type:"text",value:a.route_from,onChange:s=>{n({...a,route_from:s.target.value}),d(t=>({...t,route_from:void 0}))},className:"admin-form-input",placeholder:"Např. Praha"})}),e.jsx(l,{label:"Místo příjezdu",error:c.route_to,required:!0,children:e.jsx("input",{type:"text",value:a.route_to,onChange:s=>{n({...a,route_to:s.target.value}),d(t=>({...t,route_to:void 0}))},className:"admin-form-input",placeholder:"Např. Brno"})})]}),e.jsx(l,{label:"Typ jízdy",children:e.jsxs("select",{value:a.is_business,onChange:s=>n({...a,is_business:parseInt(s.target.value)}),className:"admin-form-select",children:[e.jsx("option",{value:1,children:"Služební"}),e.jsx("option",{value:0,children:"Soukromá"})]})}),e.jsx(l,{label:"Poznámky",children:e.jsx("textarea",{value:a.notes,onChange:s=>n({...a,notes:s.target.value}),className:"admin-form-textarea",rows:2,placeholder:"Volitelné poznámky..."})})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"admin-btn admin-btn-secondary",disabled:f,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:Z,className:"admin-btn admin-btn-primary",disabled:f,children:f?"Ukládám...":"Uložit"})]})]})]})}),e.jsx(R,{isOpen:C.show,onClose:()=>_({show:!1,tripId:null}),onConfirm:()=>$(C.tripId),title:"Smazat jízdu",message:"Opravdu chcete smazat tento záznam?",confirmText:"Smazat",cancelText:"Zrušit",type:"danger"})]})}export{te as default}; +import{j as e,m as u,A as O}from"./vendor-animation-0s3FMHwK.js";import{r,L as W}from"./vendor-react-BVs3cwbi.js";import{a as q,u as U,c as y,b as H,f as x,F as l,A as K,C as R}from"./index-Bay45BGf.js";import{F as J}from"./Forbidden-D25jV3Oq.js";import{b as G}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const j="/api/admin";function te(){const o=q(),{hasPermission:M}=U(),[P,N]=r.useState(!0),[f,g]=r.useState(!1),[T,D]=r.useState({trips:[],vehicles:[],month:"",totals:{total:0,business:0,private:0,count:0}}),[w,m]=r.useState(!1),[h,z]=r.useState(null),[C,_]=r.useState({show:!1,tripId:null}),[a,n]=r.useState({vehicle_id:"",trip_date:new Date().toISOString().split("T")[0],start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),[c,d]=r.useState({}),[,p]=r.useState(0),v=r.useCallback(async(s=!0)=>{s&&N(!0);try{const i=await(await y(`${j}/trips.php`,{})).json();i.success&&D(i.data)}catch{o.error("Nepodařilo se načíst data")}finally{s&&N(!1)}},[o]);if(r.useEffect(()=>{v()},[v]),H(w),!M("trips.record"))return e.jsx(J,{});const B=async s=>{if(!s){p(0);return}try{const i=await(await y(`${j}/trips.php?action=last_km&vehicle_id=${s}`,{})).json();i.success&&(p(i.data.last_km),h||n(b=>({...b,start_km:i.data.last_km})))}catch{}},S=()=>{z(null);const s=new Date().toISOString().split("T")[0];n({vehicle_id:"",trip_date:s,start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),p(0),d({}),m(!0)},E=s=>{z(s),n({vehicle_id:s.vehicle_id,trip_date:s.trip_date,start_km:s.start_km,end_km:s.end_km,route_from:s.route_from,route_to:s.route_to,is_business:s.is_business,notes:s.notes||""}),p(s.start_km),d({}),m(!0)},I=s=>{n(t=>({...t,vehicle_id:s})),B(s)},V=()=>{const s={};return a.vehicle_id||(s.vehicle_id="Vyberte vozidlo"),a.trip_date||(s.trip_date="Zadejte datum"),a.start_km||(s.start_km="Zadejte počáteční km"),a.end_km||(s.end_km="Zadejte konečný km"),a.start_km&&a.end_km&&parseInt(a.end_km)<=parseInt(a.start_km)&&(s.end_km="Musí být větší než počáteční"),a.route_from||(s.route_from="Zadejte místo odjezdu"),a.route_to||(s.route_to="Zadejte místo příjezdu"),d(s),Object.keys(s).length===0},Z=async()=>{if(V()){g(!0);try{const s=h?`${j}/trips.php?id=${h.id}`:`${j}/trips.php`,i=await(await y(s,{method:h?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();i.success?(m(!1),await v(!1),await new Promise(b=>setTimeout(b,300)),o.success(i.message)):o.error(i.error)}catch{o.error("Chyba připojení")}finally{g(!1)}}},$=async s=>{try{const i=await(await y(`${j}/trips.php?id=${s}`,{method:"DELETE"})).json();i.success?(await v(!1),o.success(i.message)):o.error(i.error)}catch{o.error("Chyba připojení")}finally{_({show:!1,tripId:null})}},A=()=>{const s=parseInt(a.start_km)||0,t=parseInt(a.end_km)||0;return t>s?t-s:0};if(P)return e.jsx("div",{children:e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"140px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-grid admin-grid-4",children:[0,1,2,3].map(s=>e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"60%",height:"11px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"40%",height:"28px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"50%",height:"12px"}})]},s))}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3,4].map(s=>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"})]},s))})})]})});const{trips:L,vehicles:F,totals:k}=T;return e.jsxs("div",{children:[e.jsxs(u.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Kniha jízd"}),e.jsx("p",{className:"admin-page-subtitle",children:new Date().toLocaleDateString("cs-CZ",{month:"long",year:"numeric"})})]}),e.jsx("div",{className:"admin-page-actions",children:e.jsxs("button",{onClick:S,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat jízdu"]})})]}),e.jsxs(u.div,{className:"admin-grid admin-grid-4",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsxs("div",{className:"admin-stat-card info",children:[e.jsx("div",{className:"admin-stat-icon info",children:e.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("line",{x1:"12",y1:"20",x2:"12",y2:"10"}),e.jsx("line",{x1:"18",y1:"20",x2:"18",y2:"4"}),e.jsx("line",{x1:"6",y1:"20",x2:"6",y2:"16"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsx("span",{className:"admin-stat-value",children:k.count}),e.jsx("span",{className:"admin-stat-label",children:"Počet jízd"})]})]}),e.jsxs("div",{className:"admin-stat-card",children:[e.jsx("div",{className:"admin-stat-icon",children:e.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"M22 12h-4l-3 9L9 3l-3 9H2"})})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-value",children:[x(k.total)," km"]}),e.jsx("span",{className:"admin-stat-label",children:"Celkem naježděno"})]})]}),e.jsxs("div",{className:"admin-stat-card success",children:[e.jsx("div",{className:"admin-stat-icon success",children:e.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"1",y:"3",width:"15",height:"13",rx:"2",ry:"2"}),e.jsx("path",{d:"M16 8h2a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-1"}),e.jsx("circle",{cx:"5.5",cy:"18",r:"2"}),e.jsx("circle",{cx:"18.5",cy:"18",r:"2"}),e.jsx("path",{d:"M8 18h8"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-value",children:[x(k.business)," km"]}),e.jsx("span",{className:"admin-stat-label",children:"Služební"})]})]}),e.jsxs("div",{className:"admin-stat-card warning",children:[e.jsx("div",{className:"admin-stat-icon warning",children:e.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"}),e.jsx("polyline",{points:"9 22 9 12 15 12 15 22"})]})}),e.jsxs("div",{className:"admin-stat-content",children:[e.jsxs("span",{className:"admin-stat-value",children:[x(k.private)," km"]}),e.jsx("span",{className:"admin-stat-label",children:"Soukromé"})]})]})]}),e.jsxs(u.div,{className:"admin-card mt-6",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"admin-card-header flex-between",children:[e.jsx("h2",{className:"admin-card-title",children:"Poslední jízdy"}),e.jsx(W,{to:"/trips/history",className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Zobrazit historii"})]}),e.jsx("div",{className:"admin-card-body",children:L.length===0?e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),e.jsx("p",{children:"Zatím nemáte žádné záznamy jízd."}),e.jsx("button",{onClick:S,className:"admin-btn admin-btn-primary",children:"Přidat první jízdu"})]}):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:"Datum"}),e.jsx("th",{children:"Vozidlo"}),e.jsx("th",{children:"Řidič"}),e.jsx("th",{children:"Trasa"}),e.jsx("th",{children:"Vzdálenost"}),e.jsx("th",{children:"Typ"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:L.slice(0,10).map(s=>e.jsxs("tr",{children:[e.jsx("td",{className:"admin-mono",children:G(s.trip_date)}),e.jsx("td",{children:e.jsx("span",{className:"admin-badge",children:s.spz})}),e.jsx("td",{children:s.driver_name}),e.jsx("td",{children:e.jsxs("span",{style:{whiteSpace:"nowrap"},children:[s.route_from," → ",s.route_to]})}),e.jsx("td",{className:"admin-mono",children:e.jsxs("strong",{children:[x(s.distance)," km"]})}),e.jsx("td",{children:e.jsx("span",{className:`admin-badge ${s.is_business?"admin-badge-success":"admin-badge-warning"}`,children:s.is_business?"Služební":"Soukromá"})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>E(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,tripId:s.id}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",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"})]})})]})})]},s.id))})]})})})]}),e.jsx(O,{children:w&&e.jsxs(u.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:()=>m(!1)}),e.jsxs(u.div,{className:"admin-modal admin-modal-lg",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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:h?"Upravit jízdu":"Přidat jízdu"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{label:"Vozidlo",error:c.vehicle_id,required:!0,children:e.jsxs("select",{value:a.vehicle_id,onChange:s=>{I(s.target.value),d(t=>({...t,vehicle_id:void 0}))},className:"admin-form-select",children:[e.jsx("option",{value:"",children:"Vyberte vozidlo"}),F.map(s=>e.jsxs("option",{value:s.id,children:[s.spz," - ",s.name]},s.id))]})}),e.jsx(l,{label:"Datum jízdy",error:c.trip_date,required:!0,children:e.jsx(K,{mode:"date",value:a.trip_date,onChange:s=>{n({...a,trip_date:s}),d(t=>({...t,trip_date:void 0}))}})})]}),e.jsxs("div",{className:"admin-form-row admin-form-row-3",children:[e.jsx(l,{label:"Počáteční stav km",error:c.start_km,required:!0,children:e.jsx("input",{type:"number",inputMode:"numeric",value:a.start_km,onChange:s=>{n({...a,start_km:s.target.value}),d(t=>({...t,start_km:void 0}))},className:"admin-form-input",min:"0"})}),e.jsx(l,{label:"Konečný stav km",error:c.end_km,required:!0,children:e.jsx("input",{type:"number",inputMode:"numeric",value:a.end_km,onChange:s=>{n({...a,end_km:s.target.value}),d(t=>({...t,end_km:void 0}))},className:"admin-form-input",min:"0"})}),e.jsx(l,{label:"Vzdálenost",children:e.jsx("input",{type:"text",value:`${x(A())} km`,className:"admin-form-input",readOnly:!0,disabled:!0})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{label:"Místo odjezdu",error:c.route_from,required:!0,children:e.jsx("input",{type:"text",value:a.route_from,onChange:s=>{n({...a,route_from:s.target.value}),d(t=>({...t,route_from:void 0}))},className:"admin-form-input",placeholder:"Např. Praha"})}),e.jsx(l,{label:"Místo příjezdu",error:c.route_to,required:!0,children:e.jsx("input",{type:"text",value:a.route_to,onChange:s=>{n({...a,route_to:s.target.value}),d(t=>({...t,route_to:void 0}))},className:"admin-form-input",placeholder:"Např. Brno"})})]}),e.jsx(l,{label:"Typ jízdy",children:e.jsxs("select",{value:a.is_business,onChange:s=>n({...a,is_business:parseInt(s.target.value)}),className:"admin-form-select",children:[e.jsx("option",{value:1,children:"Služební"}),e.jsx("option",{value:0,children:"Soukromá"})]})}),e.jsx(l,{label:"Poznámky",children:e.jsx("textarea",{value:a.notes,onChange:s=>n({...a,notes:s.target.value}),className:"admin-form-textarea",rows:2,placeholder:"Volitelné poznámky..."})})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"admin-btn admin-btn-secondary",disabled:f,children:"Zrušit"}),e.jsx("button",{type:"button",onClick:Z,className:"admin-btn admin-btn-primary",disabled:f,children:f?"Ukládám...":"Uložit"})]})]})]})}),e.jsx(R,{isOpen:C.show,onClose:()=>_({show:!1,tripId:null}),onConfirm:()=>$(C.tripId),title:"Smazat jízdu",message:"Opravdu chcete smazat tento záznam?",confirmText:"Smazat",cancelText:"Zrušit",type:"danger"})]})}export{te as default}; diff --git a/dist/assets/TripsAdmin-CfpRqegu.js b/dist/assets/TripsAdmin-Czj2qxrv.js similarity index 99% rename from dist/assets/TripsAdmin-CfpRqegu.js rename to dist/assets/TripsAdmin-Czj2qxrv.js index e83077d..36a9dcc 100644 --- a/dist/assets/TripsAdmin-CfpRqegu.js +++ b/dist/assets/TripsAdmin-Czj2qxrv.js @@ -1,4 +1,4 @@ -import{j as e,m as p,A as Z}from"./vendor-animation-0s3FMHwK.js";import{r as i,L as J}from"./vendor-react-BVs3cwbi.js";import{a9 as G}from"./vendor-utils-Dyr8OjFr.js";import{a as q,u as Q,c as b,b as X,F as r,A as C,f as l,C as ee}from"./index-BrM8fzBu.js";import{F as se}from"./Forbidden-D25jV3Oq.js";import{b as $}from"./attendanceHelpers-D6sLEw0q.js";const N="/api/admin";function de(){const d=q(),{hasPermission:L}=Q(),[k,D]=i.useState(!0),[j,V]=i.useState(()=>{const s=new Date;return`${s.getFullYear()}-${String(s.getMonth()+1).padStart(2,"0")}-01`}),[g,A]=i.useState(()=>{const s=new Date,t=new Date(s.getFullYear(),s.getMonth()+1,0).getDate();return`${s.getFullYear()}-${String(s.getMonth()+1).padStart(2,"0")}-${String(t).padStart(2,"0")}`}),[m,F]=i.useState(""),[h,E]=i.useState(""),[P,B]=i.useState({trips:[],vehicles:[],users:[],totals:{total:0,business:0,count:0}}),[n,I]=i.useState(null),w=i.useRef(null),[T,v]=i.useState(!1),[_,U]=i.useState(null),[a,o]=i.useState({vehicle_id:"",trip_date:"",start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),[u,z]=i.useState({show:!1,trip:null}),y=i.useCallback(async(s=!0)=>{s&&D(!0);try{let t=`${N}/trips.php?action=admin&date_from=${j}&date_to=${g}`;m&&(t+=`&vehicle_id=${m}`),h&&(t+=`&user_id=${h}`);const c=await(await b(t)).json();c.success&&B(c.data)}catch{d.error("Nepodařilo se načíst data")}finally{s&&D(!1)}},[j,g,m,h,d]);if(i.useEffect(()=>{y()},[y]),X(T),!L("trips.admin"))return e.jsx(se,{});const H=s=>{U(s),o({vehicle_id:s.vehicle_id,trip_date:s.trip_date,start_km:s.start_km,end_km:s.end_km,route_from:s.route_from,route_to:s.route_to,is_business:s.is_business,notes:s.notes||""}),v(!0)},O=async()=>{if(parseInt(a.end_km)<=parseInt(a.start_km)){d.error("Konečný stav km musí být větší než počáteční");return}try{const t=await(await b(`${N}/trips.php?id=${_.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();t.success?(v(!1),await y(!1),await new Promise(x=>setTimeout(x,300)),d.success(t.message)):d.error(t.error)}catch{d.error("Chyba připojení")}},W=async()=>{if(u.trip)try{const t=await(await b(`${N}/trips.php?id=${u.trip.id}`,{method:"DELETE"})).json();t.success?(z({show:!1,trip:null}),await y(!1),d.success(t.message)):d.error(t.error)}catch{d.error("Chyba připojení")}},K=async()=>{try{let s=`${N}/trips.php?action=print&date_from=${j}&date_to=${g}`;m&&(s+=`&vehicle_id=${m}`),h&&(s+=`&user_id=${h}`);const x=await(await b(s)).json();x.success&&(I(x.data),setTimeout(()=>{if(w.current){const c=window.open("","_blank");c.document.write(` +import{j as e,m as p,A as Z}from"./vendor-animation-0s3FMHwK.js";import{r as i,L as J}from"./vendor-react-BVs3cwbi.js";import{a9 as G}from"./vendor-utils-Dyr8OjFr.js";import{a as q,u as Q,c as b,b as X,F as r,A as C,f as l,C as ee}from"./index-Bay45BGf.js";import{F as se}from"./Forbidden-D25jV3Oq.js";import{b as $}from"./attendanceHelpers-D6sLEw0q.js";const N="/api/admin";function de(){const d=q(),{hasPermission:L}=Q(),[k,D]=i.useState(!0),[j,V]=i.useState(()=>{const s=new Date;return`${s.getFullYear()}-${String(s.getMonth()+1).padStart(2,"0")}-01`}),[g,A]=i.useState(()=>{const s=new Date,t=new Date(s.getFullYear(),s.getMonth()+1,0).getDate();return`${s.getFullYear()}-${String(s.getMonth()+1).padStart(2,"0")}-${String(t).padStart(2,"0")}`}),[m,F]=i.useState(""),[h,E]=i.useState(""),[P,B]=i.useState({trips:[],vehicles:[],users:[],totals:{total:0,business:0,count:0}}),[n,I]=i.useState(null),w=i.useRef(null),[T,v]=i.useState(!1),[_,U]=i.useState(null),[a,o]=i.useState({vehicle_id:"",trip_date:"",start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),[u,z]=i.useState({show:!1,trip:null}),y=i.useCallback(async(s=!0)=>{s&&D(!0);try{let t=`${N}/trips.php?action=admin&date_from=${j}&date_to=${g}`;m&&(t+=`&vehicle_id=${m}`),h&&(t+=`&user_id=${h}`);const c=await(await b(t)).json();c.success&&B(c.data)}catch{d.error("Nepodařilo se načíst data")}finally{s&&D(!1)}},[j,g,m,h,d]);if(i.useEffect(()=>{y()},[y]),X(T),!L("trips.admin"))return e.jsx(se,{});const H=s=>{U(s),o({vehicle_id:s.vehicle_id,trip_date:s.trip_date,start_km:s.start_km,end_km:s.end_km,route_from:s.route_from,route_to:s.route_to,is_business:s.is_business,notes:s.notes||""}),v(!0)},O=async()=>{if(parseInt(a.end_km)<=parseInt(a.start_km)){d.error("Konečný stav km musí být větší než počáteční");return}try{const t=await(await b(`${N}/trips.php?id=${_.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();t.success?(v(!1),await y(!1),await new Promise(x=>setTimeout(x,300)),d.success(t.message)):d.error(t.error)}catch{d.error("Chyba připojení")}},W=async()=>{if(u.trip)try{const t=await(await b(`${N}/trips.php?id=${u.trip.id}`,{method:"DELETE"})).json();t.success?(z({show:!1,trip:null}),await y(!1),d.success(t.message)):d.error(t.error)}catch{d.error("Chyba připojení")}},K=async()=>{try{let s=`${N}/trips.php?action=print&date_from=${j}&date_to=${g}`;m&&(s+=`&vehicle_id=${m}`),h&&(s+=`&user_id=${h}`);const x=await(await b(s)).json();x.success&&(I(x.data),setTimeout(()=>{if(w.current){const c=window.open("","_blank");c.document.write(` diff --git a/dist/assets/TripsHistory-BSSzF9uv.js b/dist/assets/TripsHistory-Dpa1fSnD.js similarity index 98% rename from dist/assets/TripsHistory-BSSzF9uv.js rename to dist/assets/TripsHistory-Dpa1fSnD.js index 04eb8b1..8722d59 100644 --- a/dist/assets/TripsHistory-BSSzF9uv.js +++ b/dist/assets/TripsHistory-Dpa1fSnD.js @@ -1 +1 @@ -import{j as s,m as r}from"./vendor-animation-0s3FMHwK.js";import{r as e}from"./vendor-react-BVs3cwbi.js";import{a as f,u as w,c as S,F as u,A as z,f as n}from"./index-BrM8fzBu.js";import{F as _}from"./Forbidden-D25jV3Oq.js";import{b as L}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const C="/api/admin";function B(){const h=f(),{hasPermission:p}=w(),[c,x]=e.useState(!0),[i,y]=e.useState(()=>{const a=new Date;return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}`}),[t,v]=e.useState(""),[N,g]=e.useState({trips:[],vehicles:[],totals:{total:0,business:0,count:0}}),j=e.useCallback(async()=>{x(!0);try{let a=`${C}/trips.php?action=history&month=${i}`;t&&(a+=`&vehicle_id=${t}`);const d=await S(a);if(d.status===401)return;const l=await d.json();l.success&&g(l.data)}catch{h.error("Nepodařilo se načíst data")}finally{x(!1)}},[i,t,h]);if(e.useEffect(()=>{j()},[j]),!p("trips.history"))return s.jsx(_,{});const k=a=>{const[d,l]=a.split("-");return new Date(d,parseInt(l)-1).toLocaleDateString("cs-CZ",{month:"long",year:"numeric"})},{trips:o,vehicles:b,totals:m}=N;return s.jsxs("div",{children:[s.jsx(r.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:s.jsxs("div",{children:[s.jsx("h1",{className:"admin-page-title",children:"Historie jízd"}),s.jsx("p",{className:"admin-page-subtitle",children:k(i)})]})}),s.jsx(r.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:s.jsx("div",{className:"admin-card-body",children:s.jsxs("div",{className:"admin-form-row",children:[s.jsx(u,{label:"Měsíc",children:s.jsx(z,{mode:"month",value:i,onChange:a=>y(a)})}),s.jsx(u,{label:"Vozidlo",children:s.jsxs("select",{value:t,onChange:a=>v(a.target.value),className:"admin-form-select",children:[s.jsx("option",{value:"",children:"Všechna vozidla"}),b.map(a=>s.jsxs("option",{value:a.id,children:[a.spz," - ",a.name]},a.id))]})})]})})}),s.jsxs(r.div,{className:"admin-grid admin-grid-3 mt-6",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:[s.jsxs("div",{className:"admin-stat-card info",children:[s.jsx("div",{className:"admin-stat-icon info",children:s.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[s.jsx("line",{x1:"12",y1:"20",x2:"12",y2:"10"}),s.jsx("line",{x1:"18",y1:"20",x2:"18",y2:"4"}),s.jsx("line",{x1:"6",y1:"20",x2:"6",y2:"16"})]})}),s.jsxs("div",{className:"admin-stat-content",children:[s.jsx("span",{className:"admin-stat-value",children:m.count}),s.jsx("span",{className:"admin-stat-label",children:"Počet jízd"})]})]}),s.jsxs("div",{className:"admin-stat-card",children:[s.jsx("div",{className:"admin-stat-icon",children:s.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:s.jsx("path",{d:"M22 12h-4l-3 9L9 3l-3 9H2"})})}),s.jsxs("div",{className:"admin-stat-content",children:[s.jsxs("span",{className:"admin-stat-value",children:[n(m.total)," km"]}),s.jsx("span",{className:"admin-stat-label",children:"Celkem naježděno"})]})]}),s.jsxs("div",{className:"admin-stat-card success",children:[s.jsx("div",{className:"admin-stat-icon success",children:s.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[s.jsx("rect",{x:"1",y:"3",width:"15",height:"13",rx:"2",ry:"2"}),s.jsx("path",{d:"M16 8h2a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-1"}),s.jsx("circle",{cx:"5.5",cy:"18",r:"2"}),s.jsx("circle",{cx:"18.5",cy:"18",r:"2"}),s.jsx("path",{d:"M8 18h8"})]})}),s.jsxs("div",{className:"admin-stat-content",children:[s.jsxs("span",{className:"admin-stat-value",children:[n(m.business)," km"]}),s.jsx("span",{className:"admin-stat-label",children:"Služební km"})]})]})]}),s.jsx(r.div,{className:"admin-card mt-6",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:s.jsxs("div",{className:"admin-card-body",children:[c&&s.jsx("div",{className:"admin-skeleton gap-5",children:[0,1,2,3,4].map(a=>s.jsxs("div",{className:"admin-skeleton-row",children:[s.jsx("div",{className:"admin-skeleton-line w-1/4"}),s.jsx("div",{className:"admin-skeleton-line w-1/3"}),s.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))}),!c&&o.length===0&&s.jsx("div",{className:"admin-empty-state",children:s.jsx("p",{children:"Žádné záznamy jízd pro vybrané období."})}),!c&&o.length>0&&s.jsx("div",{className:"admin-table-responsive",children:s.jsxs("table",{className:"admin-table",children:[s.jsx("thead",{children:s.jsxs("tr",{children:[s.jsx("th",{children:"Datum"}),s.jsx("th",{children:"Vozidlo"}),s.jsx("th",{children:"Řidič"}),s.jsx("th",{children:"Trasa"}),s.jsx("th",{children:"Stav km"}),s.jsx("th",{children:"Vzdálenost"}),s.jsx("th",{children:"Typ"}),s.jsx("th",{children:"Poznámka"})]})}),s.jsx("tbody",{children:o.map(a=>s.jsxs("tr",{children:[s.jsx("td",{className:"admin-mono",children:L(a.trip_date)}),s.jsx("td",{children:s.jsx("span",{className:"admin-badge",children:a.spz})}),s.jsx("td",{style:{color:"var(--text-secondary)"},children:a.driver_name}),s.jsx("td",{children:s.jsxs("span",{style:{whiteSpace:"nowrap"},children:[a.route_from," → ",a.route_to]})}),s.jsx("td",{className:"admin-mono",children:s.jsxs("span",{style:{whiteSpace:"nowrap",color:"var(--text-secondary)"},children:[n(a.start_km)," - ",n(a.end_km)]})}),s.jsx("td",{className:"admin-mono",children:s.jsxs("strong",{children:[n(a.distance)," km"]})}),s.jsx("td",{children:s.jsx("span",{className:`admin-badge ${a.is_business?"admin-badge-success":"admin-badge-warning"}`,children:a.is_business?"Služební":"Soukromá"})}),s.jsx("td",{style:{color:"var(--text-secondary)",maxWidth:"200px"},children:a.notes||"—"})]},a.id))})]})})]})})]})}export{B as default}; +import{j as s,m as r}from"./vendor-animation-0s3FMHwK.js";import{r as e}from"./vendor-react-BVs3cwbi.js";import{a as f,u as w,c as S,F as u,A as z,f as n}from"./index-Bay45BGf.js";import{F as _}from"./Forbidden-D25jV3Oq.js";import{b as L}from"./attendanceHelpers-D6sLEw0q.js";import"./vendor-utils-Dyr8OjFr.js";const C="/api/admin";function B(){const h=f(),{hasPermission:p}=w(),[c,x]=e.useState(!0),[i,y]=e.useState(()=>{const a=new Date;return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}`}),[t,v]=e.useState(""),[N,g]=e.useState({trips:[],vehicles:[],totals:{total:0,business:0,count:0}}),j=e.useCallback(async()=>{x(!0);try{let a=`${C}/trips.php?action=history&month=${i}`;t&&(a+=`&vehicle_id=${t}`);const d=await S(a);if(d.status===401)return;const l=await d.json();l.success&&g(l.data)}catch{h.error("Nepodařilo se načíst data")}finally{x(!1)}},[i,t,h]);if(e.useEffect(()=>{j()},[j]),!p("trips.history"))return s.jsx(_,{});const k=a=>{const[d,l]=a.split("-");return new Date(d,parseInt(l)-1).toLocaleDateString("cs-CZ",{month:"long",year:"numeric"})},{trips:o,vehicles:b,totals:m}=N;return s.jsxs("div",{children:[s.jsx(r.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:s.jsxs("div",{children:[s.jsx("h1",{className:"admin-page-title",children:"Historie jízd"}),s.jsx("p",{className:"admin-page-subtitle",children:k(i)})]})}),s.jsx(r.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:s.jsx("div",{className:"admin-card-body",children:s.jsxs("div",{className:"admin-form-row",children:[s.jsx(u,{label:"Měsíc",children:s.jsx(z,{mode:"month",value:i,onChange:a=>y(a)})}),s.jsx(u,{label:"Vozidlo",children:s.jsxs("select",{value:t,onChange:a=>v(a.target.value),className:"admin-form-select",children:[s.jsx("option",{value:"",children:"Všechna vozidla"}),b.map(a=>s.jsxs("option",{value:a.id,children:[a.spz," - ",a.name]},a.id))]})})]})})}),s.jsxs(r.div,{className:"admin-grid admin-grid-3 mt-6",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:[s.jsxs("div",{className:"admin-stat-card info",children:[s.jsx("div",{className:"admin-stat-icon info",children:s.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[s.jsx("line",{x1:"12",y1:"20",x2:"12",y2:"10"}),s.jsx("line",{x1:"18",y1:"20",x2:"18",y2:"4"}),s.jsx("line",{x1:"6",y1:"20",x2:"6",y2:"16"})]})}),s.jsxs("div",{className:"admin-stat-content",children:[s.jsx("span",{className:"admin-stat-value",children:m.count}),s.jsx("span",{className:"admin-stat-label",children:"Počet jízd"})]})]}),s.jsxs("div",{className:"admin-stat-card",children:[s.jsx("div",{className:"admin-stat-icon",children:s.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:s.jsx("path",{d:"M22 12h-4l-3 9L9 3l-3 9H2"})})}),s.jsxs("div",{className:"admin-stat-content",children:[s.jsxs("span",{className:"admin-stat-value",children:[n(m.total)," km"]}),s.jsx("span",{className:"admin-stat-label",children:"Celkem naježděno"})]})]}),s.jsxs("div",{className:"admin-stat-card success",children:[s.jsx("div",{className:"admin-stat-icon success",children:s.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[s.jsx("rect",{x:"1",y:"3",width:"15",height:"13",rx:"2",ry:"2"}),s.jsx("path",{d:"M16 8h2a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-1"}),s.jsx("circle",{cx:"5.5",cy:"18",r:"2"}),s.jsx("circle",{cx:"18.5",cy:"18",r:"2"}),s.jsx("path",{d:"M8 18h8"})]})}),s.jsxs("div",{className:"admin-stat-content",children:[s.jsxs("span",{className:"admin-stat-value",children:[n(m.business)," km"]}),s.jsx("span",{className:"admin-stat-label",children:"Služební km"})]})]})]}),s.jsx(r.div,{className:"admin-card mt-6",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:s.jsxs("div",{className:"admin-card-body",children:[c&&s.jsx("div",{className:"admin-skeleton gap-5",children:[0,1,2,3,4].map(a=>s.jsxs("div",{className:"admin-skeleton-row",children:[s.jsx("div",{className:"admin-skeleton-line w-1/4"}),s.jsx("div",{className:"admin-skeleton-line w-1/3"}),s.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))}),!c&&o.length===0&&s.jsx("div",{className:"admin-empty-state",children:s.jsx("p",{children:"Žádné záznamy jízd pro vybrané období."})}),!c&&o.length>0&&s.jsx("div",{className:"admin-table-responsive",children:s.jsxs("table",{className:"admin-table",children:[s.jsx("thead",{children:s.jsxs("tr",{children:[s.jsx("th",{children:"Datum"}),s.jsx("th",{children:"Vozidlo"}),s.jsx("th",{children:"Řidič"}),s.jsx("th",{children:"Trasa"}),s.jsx("th",{children:"Stav km"}),s.jsx("th",{children:"Vzdálenost"}),s.jsx("th",{children:"Typ"}),s.jsx("th",{children:"Poznámka"})]})}),s.jsx("tbody",{children:o.map(a=>s.jsxs("tr",{children:[s.jsx("td",{className:"admin-mono",children:L(a.trip_date)}),s.jsx("td",{children:s.jsx("span",{className:"admin-badge",children:a.spz})}),s.jsx("td",{style:{color:"var(--text-secondary)"},children:a.driver_name}),s.jsx("td",{children:s.jsxs("span",{style:{whiteSpace:"nowrap"},children:[a.route_from," → ",a.route_to]})}),s.jsx("td",{className:"admin-mono",children:s.jsxs("span",{style:{whiteSpace:"nowrap",color:"var(--text-secondary)"},children:[n(a.start_km)," - ",n(a.end_km)]})}),s.jsx("td",{className:"admin-mono",children:s.jsxs("strong",{children:[n(a.distance)," km"]})}),s.jsx("td",{children:s.jsx("span",{className:`admin-badge ${a.is_business?"admin-badge-success":"admin-badge-warning"}`,children:a.is_business?"Služební":"Soukromá"})}),s.jsx("td",{style:{color:"var(--text-secondary)",maxWidth:"200px"},children:a.notes||"—"})]},a.id))})]})})]})})]})}export{B as default}; diff --git a/dist/assets/Users-D14q1sI4.js b/dist/assets/Users-WLgfF24I.js similarity index 99% rename from dist/assets/Users-D14q1sI4.js rename to dist/assets/Users-WLgfF24I.js index d24c7a8..5e11b6b 100644 --- a/dist/assets/Users-D14q1sI4.js +++ b/dist/assets/Users-WLgfF24I.js @@ -1 +1 @@ -import{j as e,m as u,A as H}from"./vendor-animation-0s3FMHwK.js";import{r as n}from"./vendor-react-BVs3cwbi.js";import{u as J,a as V,b as W,c as v,F as c,C as I}from"./index-BrM8fzBu.js";import{F as Z}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const p="/api/admin";function se(){const{user:r,updateUser:C,hasPermission:U}=J(),t=V(),[S,M]=n.useState([]),[b,$]=n.useState([]),[z,E]=n.useState(!0),[f,x]=n.useState(!1),[o,j]=n.useState(null),[m,N]=n.useState({isOpen:!1,user:null}),[T,g]=n.useState(!1),[s,l]=n.useState({username:"",email:"",password:"",first_name:"",last_name:"",role_id:"",is_active:!0});W(f);const h=n.useCallback(async()=>{try{const i=await(await v(`${p}/users.php`,{})).json();i.success?(M(i.data.users||[]),$(i.data.roles||[])):t.error(i.error||"Nepodařilo se načíst uživatele")}catch{t.error("Chyba připojení")}finally{E(!1)}},[]);if(n.useEffect(()=>{h()},[h]),!U("users.view"))return e.jsx(Z,{});const A=()=>{j(null),l({username:"",email:"",password:"",first_name:"",last_name:"",role_id:b[0]?.id||"",is_active:!0}),x(!0)},P=a=>{j(a),l({username:a.username,email:a.email,password:"",first_name:a.first_name,last_name:a.last_name,role_id:a.role_id,is_active:a.is_active}),x(!0)},y=()=>{x(!1),j(null)},D=async a=>{a?.preventDefault();const i={...s},d=o,k=o?.id;try{const R=d?`${p}/users.php?id=${k}`:`${p}/users.php`,w=await(await v(R,{method:d?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})).json();w.success?(d&&r&&Number(k)===Number(r.id)&&C({username:i.username,email:i.email,fullName:`${i.first_name} ${i.last_name}`.trim()}),y(),await new Promise(L=>setTimeout(L,300)),t.success(d?"Uživatel byl upraven":"Uživatel byl vytvořen"),h()):t.error(w.error||"Nepodařilo se uložit uživatele")}catch{t.error("Chyba připojení")}},O=a=>{N({isOpen:!0,user:a})},_=()=>{N({isOpen:!1,user:null})},F=async()=>{if(m.user){g(!0);try{const i=await(await v(`${p}/users.php?id=${m.user.id}`,{method:"DELETE"})).json();i.success?(_(),h(),t.success("Uživatel byl smazán")):t.error(i.error||"Nepodařilo se smazat uživatele")}catch{t.error("Chyba připojení")}finally{g(!1)}}},q=async a=>{try{const d=await(await v(`${p}/users.php?id=${a.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({is_active:!a.is_active})})).json();d.success?(h(),t.success(a.is_active?"Uživatel byl deaktivován":"Uživatel byl aktivován")):t.error(d.error||"Nepodařilo se změnit stav uživatele")}catch{t.error("Chyba připojení")}},B=a=>{switch(a){case"admin":return"admin-badge admin-badge-admin";default:return"admin-badge admin-badge-viewer"}};return z?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"160px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children: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 circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})})]}):e.jsxs("div",{children:[e.jsxs(u.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Uživatelé"}),e.jsx("p",{className:"admin-page-subtitle",children:"Správa uživatelských účtů a oprávnění"})]}),e.jsxs("button",{onClick:A,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat uživatele"]})]}),e.jsx(u.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children: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:"Uživatel"}),e.jsx("th",{children:"E-mail"}),e.jsx("th",{children:"Role"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:S.map(a=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsxs("div",{className:"admin-table-user",children:[e.jsx("div",{className:"admin-table-avatar",children:(a.first_name||a.username).charAt(0).toUpperCase()}),e.jsxs("div",{children:[e.jsxs("div",{className:"admin-table-name",children:[a.first_name," ",a.last_name]}),e.jsxs("div",{className:"admin-table-username",children:["@",a.username]})]})]})}),e.jsx("td",{children:a.email}),e.jsx("td",{children:e.jsx("span",{className:B(a.role_name),children:a.role_display_name||a.role_name})}),e.jsx("td",{children:e.jsx("button",{onClick:()=>a.id!==r?.id&&q(a),disabled:a.id===r?.id,className:`admin-badge ${a.is_active?"admin-badge-active":"admin-badge-inactive"}`,style:{cursor:a.id===r?.id?"not-allowed":"pointer"},children:a.is_active?"Aktivní":"Neaktivní"})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>P(a),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",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"})]})}),a.id!==r?.id&&e.jsx("button",{onClick:()=>O(a),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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.id))})]})})})}),e.jsx(H,{children:f&&e.jsxs(u.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}),e.jsxs(u.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:o?"Upravit uživatele":"Přidat nového uživatele"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(c,{label:"Jméno",children:e.jsx("input",{type:"text",value:s.first_name,onChange:a=>l({...s,first_name:a.target.value}),required:!0,className:"admin-form-input"})}),e.jsx(c,{label:"Příjmení",children:e.jsx("input",{type:"text",value:s.last_name,onChange:a=>l({...s,last_name:a.target.value}),required:!0,className:"admin-form-input"})})]}),e.jsx(c,{label:"Uživatelské jméno",children:e.jsx("input",{type:"text",value:s.username,onChange:a=>l({...s,username:a.target.value}),required:!0,className:"admin-form-input"})}),e.jsx(c,{label:"E-mail",children:e.jsx("input",{type:"email",value:s.email,onChange:a=>l({...s,email:a.target.value}),required:!0,className:"admin-form-input"})}),e.jsx(c,{label:`Heslo ${o?"(ponechte prázdné pro zachování stávajícího)":""}`,children:e.jsx("input",{type:"password",value:s.password,onChange:a=>l({...s,password:a.target.value}),required:!o,className:"admin-form-input"})}),e.jsx(c,{label:"Role",children:e.jsx("select",{value:s.role_id,onChange:a=>l({...s,role_id:a.target.value}),required:!0,className:"admin-form-select",children:b.map(a=>e.jsx("option",{value:a.id,children:a.display_name},a.id))})}),e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.is_active,onChange:a=>l({...s,is_active:a.target.checked})}),e.jsx("span",{children:"Účet je aktivní"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:y,className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"button",onClick:D,className:"admin-btn admin-btn-primary",children:o?"Uložit změny":"Vytvořit uživatele"})]})]})]})}),e.jsx(I,{isOpen:m.isOpen,onClose:_,onConfirm:F,title:"Smazat uživatele",message:`Opravdu chcete smazat uživatele "${m.user?.first_name} ${m.user?.last_name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:T})]})}export{se as default}; +import{j as e,m as u,A as H}from"./vendor-animation-0s3FMHwK.js";import{r as n}from"./vendor-react-BVs3cwbi.js";import{u as J,a as V,b as W,c as v,F as c,C as I}from"./index-Bay45BGf.js";import{F as Z}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const p="/api/admin";function se(){const{user:r,updateUser:C,hasPermission:U}=J(),t=V(),[S,M]=n.useState([]),[b,$]=n.useState([]),[z,E]=n.useState(!0),[f,x]=n.useState(!1),[o,j]=n.useState(null),[m,N]=n.useState({isOpen:!1,user:null}),[T,g]=n.useState(!1),[s,l]=n.useState({username:"",email:"",password:"",first_name:"",last_name:"",role_id:"",is_active:!0});W(f);const h=n.useCallback(async()=>{try{const i=await(await v(`${p}/users.php`,{})).json();i.success?(M(i.data.users||[]),$(i.data.roles||[])):t.error(i.error||"Nepodařilo se načíst uživatele")}catch{t.error("Chyba připojení")}finally{E(!1)}},[]);if(n.useEffect(()=>{h()},[h]),!U("users.view"))return e.jsx(Z,{});const A=()=>{j(null),l({username:"",email:"",password:"",first_name:"",last_name:"",role_id:b[0]?.id||"",is_active:!0}),x(!0)},P=a=>{j(a),l({username:a.username,email:a.email,password:"",first_name:a.first_name,last_name:a.last_name,role_id:a.role_id,is_active:a.is_active}),x(!0)},y=()=>{x(!1),j(null)},D=async a=>{a?.preventDefault();const i={...s},d=o,k=o?.id;try{const R=d?`${p}/users.php?id=${k}`:`${p}/users.php`,w=await(await v(R,{method:d?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})).json();w.success?(d&&r&&Number(k)===Number(r.id)&&C({username:i.username,email:i.email,fullName:`${i.first_name} ${i.last_name}`.trim()}),y(),await new Promise(L=>setTimeout(L,300)),t.success(d?"Uživatel byl upraven":"Uživatel byl vytvořen"),h()):t.error(w.error||"Nepodařilo se uložit uživatele")}catch{t.error("Chyba připojení")}},O=a=>{N({isOpen:!0,user:a})},_=()=>{N({isOpen:!1,user:null})},F=async()=>{if(m.user){g(!0);try{const i=await(await v(`${p}/users.php?id=${m.user.id}`,{method:"DELETE"})).json();i.success?(_(),h(),t.success("Uživatel byl smazán")):t.error(i.error||"Nepodařilo se smazat uživatele")}catch{t.error("Chyba připojení")}finally{g(!1)}}},q=async a=>{try{const d=await(await v(`${p}/users.php?id=${a.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({is_active:!a.is_active})})).json();d.success?(h(),t.success(a.is_active?"Uživatel byl deaktivován":"Uživatel byl aktivován")):t.error(d.error||"Nepodařilo se změnit stav uživatele")}catch{t.error("Chyba připojení")}},B=a=>{switch(a){case"admin":return"admin-badge admin-badge-admin";default:return"admin-badge admin-badge-viewer"}};return z?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px",marginBottom:"0.5rem"}}),e.jsx("div",{className:"admin-skeleton-line",style:{width:"140px"}})]}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"160px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children: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 circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})})]}):e.jsxs("div",{children:[e.jsxs(u.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{children:[e.jsx("h1",{className:"admin-page-title",children:"Uživatelé"}),e.jsx("p",{className:"admin-page-subtitle",children:"Správa uživatelských účtů a oprávnění"})]}),e.jsxs("button",{onClick:A,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat uživatele"]})]}),e.jsx(u.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:e.jsx("div",{className:"admin-card-body",children: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:"Uživatel"}),e.jsx("th",{children:"E-mail"}),e.jsx("th",{children:"Role"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:S.map(a=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsxs("div",{className:"admin-table-user",children:[e.jsx("div",{className:"admin-table-avatar",children:(a.first_name||a.username).charAt(0).toUpperCase()}),e.jsxs("div",{children:[e.jsxs("div",{className:"admin-table-name",children:[a.first_name," ",a.last_name]}),e.jsxs("div",{className:"admin-table-username",children:["@",a.username]})]})]})}),e.jsx("td",{children:a.email}),e.jsx("td",{children:e.jsx("span",{className:B(a.role_name),children:a.role_display_name||a.role_name})}),e.jsx("td",{children:e.jsx("button",{onClick:()=>a.id!==r?.id&&q(a),disabled:a.id===r?.id,className:`admin-badge ${a.is_active?"admin-badge-active":"admin-badge-inactive"}`,style:{cursor:a.id===r?.id?"not-allowed":"pointer"},children:a.is_active?"Aktivní":"Neaktivní"})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>P(a),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",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"})]})}),a.id!==r?.id&&e.jsx("button",{onClick:()=>O(a),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",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.id))})]})})})}),e.jsx(H,{children:f&&e.jsxs(u.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}),e.jsxs(u.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:o?"Upravit uživatele":"Přidat nového uživatele"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(c,{label:"Jméno",children:e.jsx("input",{type:"text",value:s.first_name,onChange:a=>l({...s,first_name:a.target.value}),required:!0,className:"admin-form-input"})}),e.jsx(c,{label:"Příjmení",children:e.jsx("input",{type:"text",value:s.last_name,onChange:a=>l({...s,last_name:a.target.value}),required:!0,className:"admin-form-input"})})]}),e.jsx(c,{label:"Uživatelské jméno",children:e.jsx("input",{type:"text",value:s.username,onChange:a=>l({...s,username:a.target.value}),required:!0,className:"admin-form-input"})}),e.jsx(c,{label:"E-mail",children:e.jsx("input",{type:"email",value:s.email,onChange:a=>l({...s,email:a.target.value}),required:!0,className:"admin-form-input"})}),e.jsx(c,{label:`Heslo ${o?"(ponechte prázdné pro zachování stávajícího)":""}`,children:e.jsx("input",{type:"password",value:s.password,onChange:a=>l({...s,password:a.target.value}),required:!o,className:"admin-form-input"})}),e.jsx(c,{label:"Role",children:e.jsx("select",{value:s.role_id,onChange:a=>l({...s,role_id:a.target.value}),required:!0,className:"admin-form-select",children:b.map(a=>e.jsx("option",{value:a.id,children:a.display_name},a.id))})}),e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.is_active,onChange:a=>l({...s,is_active:a.target.checked})}),e.jsx("span",{children:"Účet je aktivní"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:y,className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"button",onClick:D,className:"admin-btn admin-btn-primary",children:o?"Uložit změny":"Vytvořit uživatele"})]})]})]})}),e.jsx(I,{isOpen:m.isOpen,onClose:_,onConfirm:F,title:"Smazat uživatele",message:`Opravdu chcete smazat uživatele "${m.user?.first_name} ${m.user?.last_name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:T})]})}export{se as default}; diff --git a/dist/assets/Vehicles-uyCHwC9v.js b/dist/assets/Vehicles-Dg7Wxtdg.js similarity index 99% rename from dist/assets/Vehicles-uyCHwC9v.js rename to dist/assets/Vehicles-Dg7Wxtdg.js index 5b60bf6..13c7434 100644 --- a/dist/assets/Vehicles-uyCHwC9v.js +++ b/dist/assets/Vehicles-Dg7Wxtdg.js @@ -1 +1 @@ -import{j as e,m as p,A as $}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{a as L,u as Z,c as x,b as O,f as z,F as j,C as B}from"./index-BrM8fzBu.js";import{F}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const u="/api/admin";function H(){const i=L(),{hasPermission:C}=Z(),[S,k]=t.useState(!0),[v,_]=t.useState([]),[N,d]=t.useState(!1),[y,g]=t.useState(null),[s,l]=t.useState({spz:"",name:"",brand:"",model:"",initial_km:0,is_active:!0}),[h,c]=t.useState({}),[o,b]=t.useState({show:!1,vehicle:null}),m=t.useCallback(async(a=!0)=>{a&&k(!0);try{const r=await(await x(`${u}/trips.php?action=vehicles`,{})).json();r.success&&_(r.data.vehicles)}catch{i.error("Nepodařilo se načíst data")}finally{a&&k(!1)}},[i]);if(t.useEffect(()=>{m()},[m]),O(N),!C("trips.vehicles"))return e.jsx(F,{});const w=()=>{g(null),l({spz:"",name:"",brand:"",model:"",initial_km:0,is_active:!0}),c({}),d(!0)},P=a=>{g(a),l({spz:a.spz,name:a.name,brand:a.brand||"",model:a.model||"",initial_km:a.initial_km,is_active:!!a.is_active}),c({}),d(!0)},M=async()=>{const a={};if(s.spz||(a.spz="Zadejte SPZ"),s.name||(a.name="Zadejte název"),c(a),!(Object.keys(a).length>0))try{const n=y?{...s,id:y.id}:s,f=await(await x(`${u}/trips.php?action=vehicle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})).json();f.success?(d(!1),await m(!1),await new Promise(V=>setTimeout(V,300)),i.success(f.message)):i.error(f.error)}catch{i.error("Chyba připojení")}},A=async()=>{if(o.vehicle)try{const n=await(await x(`${u}/trips.php?action=vehicle&id=${o.vehicle.id}`,{method:"DELETE"})).json();n.success?(b({show:!1,vehicle:null}),await m(!1),i.success(n.message)):i.error(n.error)}catch{i.error("Chyba připojení")}},E=async a=>{try{const r=await(await x(`${u}/trips.php?action=vehicle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a.id,spz:a.spz,name:a.name,brand:a.brand||"",model:a.model||"",initial_km:a.initial_km,is_active:!a.is_active})})).json();r.success?(m(!1),i.success(a.is_active?"Vozidlo bylo deaktivováno":"Vozidlo bylo aktivováno")):i.error(r.error)}catch{i.error("Chyba připojení")}};return S?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsx("div",{children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"150px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children: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 circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})})]}):e.jsxs("div",{children:[e.jsxs(p.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 vozidel"})}),e.jsx("div",{className:"admin-page-actions",children:e.jsxs("button",{onClick:w,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat vozidlo"]})})]}),e.jsx(p.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:[v.length===0&&e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"1",y:"3",width:"15",height:"13"}),e.jsx("polygon",{points:"16 8 20 8 23 11 23 16 16 16 16 8"}),e.jsx("circle",{cx:"5.5",cy:"18.5",r:"2.5"}),e.jsx("circle",{cx:"18.5",cy:"18.5",r:"2.5"})]})}),e.jsx("p",{children:"Zatím nejsou žádná vozidla."}),e.jsx("button",{onClick:w,className:"admin-btn admin-btn-primary",children:"Přidat první vozidlo"})]}),v.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:"SPZ"}),e.jsx("th",{children:"Název"}),e.jsx("th",{children:"Značka / Model"}),e.jsx("th",{children:"Počáteční km"}),e.jsx("th",{children:"Aktuální km"}),e.jsx("th",{children:"Počet jízd"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:v.map(a=>e.jsxs("tr",{className:a.is_active?"":"admin-table-row-inactive",children:[e.jsx("td",{className:"admin-mono fw-500",children:a.spz}),e.jsx("td",{children:a.name}),e.jsx("td",{children:a.brand||a.model?`${a.brand||""} ${a.model||""}`.trim():"—"}),e.jsxs("td",{className:"admin-mono",children:[z(a.initial_km)," km"]}),e.jsxs("td",{className:"admin-mono fw-500",children:[z(a.current_km)," km"]}),e.jsx("td",{className:"admin-mono",children:a.trip_count}),e.jsx("td",{children:e.jsx("button",{onClick:()=>E(a),className:`admin-badge ${a.is_active?"admin-badge-active":"admin-badge-inactive"}`,children:a.is_active?"Aktivní":"Neaktivní"})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>P(a),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:()=>b({show:!0,vehicle:a}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",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.id))})]})})]})}),e.jsx($,{children:N&&e.jsxs(p.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:()=>d(!1)}),e.jsxs(p.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:y?"Upravit vozidlo":"Přidat vozidlo"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:"SPZ",error:h.spz,required:!0,children:e.jsx("input",{type:"text",value:s.spz,onChange:a=>{l({...s,spz:a.target.value.toUpperCase()}),c(n=>({...n,spz:void 0}))},className:"admin-form-input",placeholder:"1AB 2345","aria-invalid":!!h.spz})}),e.jsx(j,{label:"Název",error:h.name,required:!0,children:e.jsx("input",{type:"text",value:s.name,onChange:a=>{l({...s,name:a.target.value}),c(n=>({...n,name:void 0}))},className:"admin-form-input",placeholder:"Služební #1","aria-invalid":!!h.name})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:"Značka",children:e.jsx("input",{type:"text",value:s.brand,onChange:a=>l({...s,brand:a.target.value}),className:"admin-form-input",placeholder:"Škoda"})}),e.jsx(j,{label:"Model",children:e.jsx("input",{type:"text",value:s.model,onChange:a=>l({...s,model:a.target.value}),className:"admin-form-input",placeholder:"Octavia Combi"})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Počáteční stav km"}),e.jsx("input",{type:"number",inputMode:"numeric",value:s.initial_km,onChange:a=>l({...s,initial_km:parseInt(a.target.value)||0}),className:"admin-form-input",min:"0"}),e.jsx("small",{className:"admin-form-hint",children:"Stav tachometru při přidání vozidla"})]}),e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.is_active,onChange:a=>l({...s,is_active:a.target.checked})}),e.jsx("span",{children:"Vozidlo je aktivní"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>d(!1),className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"button",onClick:M,className:"admin-btn admin-btn-primary",children:"Uložit"})]})]})]})}),e.jsx(B,{isOpen:o.show,onClose:()=>b({show:!1,vehicle:null}),onConfirm:A,title:"Smazat vozidlo",message:o.vehicle?`Opravdu chcete smazat vozidlo ${o.vehicle.spz} - ${o.vehicle.name}?`:"",confirmText:"Smazat",confirmVariant:"danger"})]})}export{H as default}; +import{j as e,m as p,A as $}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{a as L,u as Z,c as x,b as O,f as z,F as j,C as B}from"./index-Bay45BGf.js";import{F}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const u="/api/admin";function H(){const i=L(),{hasPermission:C}=Z(),[S,k]=t.useState(!0),[v,_]=t.useState([]),[N,d]=t.useState(!1),[y,g]=t.useState(null),[s,l]=t.useState({spz:"",name:"",brand:"",model:"",initial_km:0,is_active:!0}),[h,c]=t.useState({}),[o,b]=t.useState({show:!1,vehicle:null}),m=t.useCallback(async(a=!0)=>{a&&k(!0);try{const r=await(await x(`${u}/trips.php?action=vehicles`,{})).json();r.success&&_(r.data.vehicles)}catch{i.error("Nepodařilo se načíst data")}finally{a&&k(!1)}},[i]);if(t.useEffect(()=>{m()},[m]),O(N),!C("trips.vehicles"))return e.jsx(F,{});const w=()=>{g(null),l({spz:"",name:"",brand:"",model:"",initial_km:0,is_active:!0}),c({}),d(!0)},P=a=>{g(a),l({spz:a.spz,name:a.name,brand:a.brand||"",model:a.model||"",initial_km:a.initial_km,is_active:!!a.is_active}),c({}),d(!0)},M=async()=>{const a={};if(s.spz||(a.spz="Zadejte SPZ"),s.name||(a.name="Zadejte název"),c(a),!(Object.keys(a).length>0))try{const n=y?{...s,id:y.id}:s,f=await(await x(`${u}/trips.php?action=vehicle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})).json();f.success?(d(!1),await m(!1),await new Promise(V=>setTimeout(V,300)),i.success(f.message)):i.error(f.error)}catch{i.error("Chyba připojení")}},A=async()=>{if(o.vehicle)try{const n=await(await x(`${u}/trips.php?action=vehicle&id=${o.vehicle.id}`,{method:"DELETE"})).json();n.success?(b({show:!1,vehicle:null}),await m(!1),i.success(n.message)):i.error(n.error)}catch{i.error("Chyba připojení")}},E=async a=>{try{const r=await(await x(`${u}/trips.php?action=vehicle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a.id,spz:a.spz,name:a.name,brand:a.brand||"",model:a.model||"",initial_km:a.initial_km,is_active:!a.is_active})})).json();r.success?(m(!1),i.success(a.is_active?"Vozidlo bylo deaktivováno":"Vozidlo bylo aktivováno")):i.error(r.error)}catch{i.error("Chyba připojení")}};return S?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsx("div",{children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"150px",borderRadius:"8px"}})]}),e.jsx("div",{className:"admin-card",children: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 circle"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"admin-skeleton-line w-1/3 mb-2"}),e.jsx("div",{className:"admin-skeleton-line w-1/4",style:{height:"10px"}})]}),e.jsx("div",{className:"admin-skeleton-line w-1/4"})]},a))})})]}):e.jsxs("div",{children:[e.jsxs(p.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 vozidel"})}),e.jsx("div",{className:"admin-page-actions",children:e.jsxs("button",{onClick:w,className:"admin-btn admin-btn-primary",children:[e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),"Přidat vozidlo"]})})]}),e.jsx(p.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:[v.length===0&&e.jsxs("div",{className:"admin-empty-state",children:[e.jsx("div",{className:"admin-empty-icon",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"1",y:"3",width:"15",height:"13"}),e.jsx("polygon",{points:"16 8 20 8 23 11 23 16 16 16 16 8"}),e.jsx("circle",{cx:"5.5",cy:"18.5",r:"2.5"}),e.jsx("circle",{cx:"18.5",cy:"18.5",r:"2.5"})]})}),e.jsx("p",{children:"Zatím nejsou žádná vozidla."}),e.jsx("button",{onClick:w,className:"admin-btn admin-btn-primary",children:"Přidat první vozidlo"})]}),v.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:"SPZ"}),e.jsx("th",{children:"Název"}),e.jsx("th",{children:"Značka / Model"}),e.jsx("th",{children:"Počáteční km"}),e.jsx("th",{children:"Aktuální km"}),e.jsx("th",{children:"Počet jízd"}),e.jsx("th",{children:"Stav"}),e.jsx("th",{children:"Akce"})]})}),e.jsx("tbody",{children:v.map(a=>e.jsxs("tr",{className:a.is_active?"":"admin-table-row-inactive",children:[e.jsx("td",{className:"admin-mono fw-500",children:a.spz}),e.jsx("td",{children:a.name}),e.jsx("td",{children:a.brand||a.model?`${a.brand||""} ${a.model||""}`.trim():"—"}),e.jsxs("td",{className:"admin-mono",children:[z(a.initial_km)," km"]}),e.jsxs("td",{className:"admin-mono fw-500",children:[z(a.current_km)," km"]}),e.jsx("td",{className:"admin-mono",children:a.trip_count}),e.jsx("td",{children:e.jsx("button",{onClick:()=>E(a),className:`admin-badge ${a.is_active?"admin-badge-active":"admin-badge-inactive"}`,children:a.is_active?"Aktivní":"Neaktivní"})}),e.jsx("td",{children:e.jsxs("div",{className:"admin-table-actions",children:[e.jsx("button",{onClick:()=>P(a),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:()=>b({show:!0,vehicle:a}),className:"admin-btn-icon danger",title:"Smazat","aria-label":"Smazat",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.id))})]})})]})}),e.jsx($,{children:N&&e.jsxs(p.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:()=>d(!1)}),e.jsxs(p.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.jsx("div",{className:"admin-modal-header",children:e.jsx("h2",{className:"admin-modal-title",children:y?"Upravit vozidlo":"Přidat vozidlo"})}),e.jsx("div",{className:"admin-modal-body",children:e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:"SPZ",error:h.spz,required:!0,children:e.jsx("input",{type:"text",value:s.spz,onChange:a=>{l({...s,spz:a.target.value.toUpperCase()}),c(n=>({...n,spz:void 0}))},className:"admin-form-input",placeholder:"1AB 2345","aria-invalid":!!h.spz})}),e.jsx(j,{label:"Název",error:h.name,required:!0,children:e.jsx("input",{type:"text",value:s.name,onChange:a=>{l({...s,name:a.target.value}),c(n=>({...n,name:void 0}))},className:"admin-form-input",placeholder:"Služební #1","aria-invalid":!!h.name})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(j,{label:"Značka",children:e.jsx("input",{type:"text",value:s.brand,onChange:a=>l({...s,brand:a.target.value}),className:"admin-form-input",placeholder:"Škoda"})}),e.jsx(j,{label:"Model",children:e.jsx("input",{type:"text",value:s.model,onChange:a=>l({...s,model:a.target.value}),className:"admin-form-input",placeholder:"Octavia Combi"})})]}),e.jsxs("div",{className:"admin-form-group",children:[e.jsx("label",{className:"admin-form-label",children:"Počáteční stav km"}),e.jsx("input",{type:"number",inputMode:"numeric",value:s.initial_km,onChange:a=>l({...s,initial_km:parseInt(a.target.value)||0}),className:"admin-form-input",min:"0"}),e.jsx("small",{className:"admin-form-hint",children:"Stav tachometru při přidání vozidla"})]}),e.jsxs("label",{className:"admin-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.is_active,onChange:a=>l({...s,is_active:a.target.checked})}),e.jsx("span",{children:"Vozidlo je aktivní"})]})]})}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>d(!1),className:"admin-btn admin-btn-secondary",children:"Zrušit"}),e.jsx("button",{type:"button",onClick:M,className:"admin-btn admin-btn-primary",children:"Uložit"})]})]})]})}),e.jsx(B,{isOpen:o.show,onClose:()=>b({show:!1,vehicle:null}),onConfirm:A,title:"Smazat vozidlo",message:o.vehicle?`Opravdu chcete smazat vozidlo ${o.vehicle.spz} - ${o.vehicle.name}?`:"",confirmText:"Smazat",confirmVariant:"danger"})]})}export{H as default}; diff --git a/dist/assets/index-BrM8fzBu.js b/dist/assets/index-Bay45BGf.js similarity index 98% rename from dist/assets/index-BrM8fzBu.js rename to dist/assets/index-Bay45BGf.js index 40e4d5f..2f770b5 100644 --- a/dist/assets/index-BrM8fzBu.js +++ b/dist/assets/index-Bay45BGf.js @@ -1,7 +1,7 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Users-D14q1sI4.js","assets/vendor-animation-0s3FMHwK.js","assets/vendor-react-BVs3cwbi.js","assets/Forbidden-D25jV3Oq.js","assets/vendor-utils-Dyr8OjFr.js","assets/Attendance-HkkqNom4.js","assets/attendanceHelpers-D6sLEw0q.js","assets/AttendanceHistory-DTktjavL.js","assets/AttendanceAdmin-DcoOGyDw.js","assets/AttendanceBalances-BSQpPHY4.js","assets/AttendanceCreate-CzMSkeJg.js","assets/LeaveRequests-BALGw7zC.js","assets/LeaveApproval-NYDUrW_i.js","assets/AttendanceLocation-5-mGEni2.js","assets/Trips-DHINOVlF.js","assets/TripsHistory-BSSzF9uv.js","assets/TripsAdmin-CfpRqegu.js","assets/Vehicles-uyCHwC9v.js","assets/Offers-B58QSeyz.js","assets/useListData-Bz9Xh_CU.js","assets/Pagination-B1sbY6V7.js","assets/OfferDetail-uZQN0hWh.js","assets/useSortableList-CgbuKaxB.js","assets/RichEditor-Bfur5pi6.js","assets/RichEditor-7oN3-GhD.css","assets/OffersCustomers-DRNB48Z-.js","assets/OffersTemplates-CmYh_zlm.js","assets/CompanySettings-7Kh5OyP9.js","assets/Orders-CtS3KkKW.js","assets/OrderDetail-CV53xEih.js","assets/Projects-DvLHy4pA.js","assets/ProjectCreate-CXtZIMX9.js","assets/ProjectDetail-TbZLFSAA.js","assets/Invoices-CbhjIEZE.js","assets/InvoiceCreate-Bqil74eu.js","assets/InvoiceDetail-DaTiJC_4.js","assets/Settings-CCjKAfuK.js","assets/AuditLog-D1e5uhdu.js","assets/NotFound-Cm3yLPlV.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Users-WLgfF24I.js","assets/vendor-animation-0s3FMHwK.js","assets/vendor-react-BVs3cwbi.js","assets/Forbidden-D25jV3Oq.js","assets/vendor-utils-Dyr8OjFr.js","assets/Attendance-Cx77BQZA.js","assets/attendanceHelpers-D6sLEw0q.js","assets/AttendanceHistory-CDqc-b-N.js","assets/AttendanceAdmin-Cdnpy6ht.js","assets/AttendanceBalances-DMsizH4J.js","assets/AttendanceCreate-BYIYsFoJ.js","assets/LeaveRequests-CDRutKVT.js","assets/LeaveApproval-CWyAOhiD.js","assets/AttendanceLocation-DLvgzSPu.js","assets/Trips-CmUyrh1d.js","assets/TripsHistory-Dpa1fSnD.js","assets/TripsAdmin-Czj2qxrv.js","assets/Vehicles-Dg7Wxtdg.js","assets/Offers-ZNWwIePg.js","assets/useListData-CvOpK9He.js","assets/Pagination-B1sbY6V7.js","assets/OfferDetail-CToaKJtE.js","assets/useSortableList-CgbuKaxB.js","assets/RichEditor-Bfur5pi6.js","assets/RichEditor-7oN3-GhD.css","assets/OffersCustomers-55BUJuXS.js","assets/OffersTemplates-B33mRH0a.js","assets/CompanySettings-BLIuJNHl.js","assets/Orders-D38dm3L_.js","assets/OrderDetail-BuD42-wn.js","assets/Projects-srNNxmx0.js","assets/ProjectCreate-DBbdjy48.js","assets/ProjectDetail-B_QNS7Ph.js","assets/Invoices-BeRSP7xa.js","assets/InvoiceCreate-BkvZM33j.js","assets/InvoiceDetail-CeYg6TWO.js","assets/Settings-BAJF08Eo.js","assets/AuditLog-CyUZGIls.js","assets/NotFound-Cm3yLPlV.js"])))=>i.map(i=>d[i]); var ha=Object.defineProperty;var va=(r,o,t)=>o in r?ha(r,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[o]=t;var Yn=(r,o,t)=>va(r,typeof o!="symbol"?o+"":o,t);import{j as s,m as Q,A as Ie}from"./vendor-animation-0s3FMHwK.js";import{a as Nr,r as v,u as Mr,N as ya,b as hn,O as ga,R as Er,c as x,d as xa,L as Qe,e as Pr,f as B,B as ba}from"./vendor-react-BVs3cwbi.js";import{i as pe,a as be,b as ke,g as Y,c as De,d as X,e as G,f as ht,h as re,j as ka,p as wa,t as Tr,k as ct,l as vt,m as It,n as Wn,o as zn,s as Sn,q as Or,r as yt,u as Ar,v as Cn,w as Rr,x as Lr,y as Tt,z as Ot,A as At,B as _a,C as ft,D as Se,E as Fe,F as de,G as Da,H as Ye,I as se,J as Ce,K as me,L as ja,M as Sa,N as vn,O as Bn,P as Ca,Q as Na,R as Ft,S as Ir,T as Yt,U as Wt,V as Fr,W as yn,X as Ke,Y as Ue,Z as Ma,_ as Ea,$ as Pa,a0 as Ta,a1 as Oa,a2 as Aa,a3 as Ra,a4 as Hn,a5 as en,a6 as at,a7 as ot,a8 as La}from"./vendor-utils-Dyr8OjFr.js";(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))e(n);new MutationObserver(n=>{for(const a of n)if(a.type==="childList")for(const i of a.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&e(i)}).observe(document,{childList:!0,subtree:!0});function t(n){const a={};return n.integrity&&(a.integrity=n.integrity),n.referrerPolicy&&(a.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?a.credentials="include":n.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function e(n){if(n.ep)return;n.ep=!0;const a=t(n);fetch(n.href,a)}})();var gn={},Vn=Nr;gn.createRoot=Vn.createRoot,gn.hydrateRoot=Vn.hydrateRoot;const Ia="modulepreload",Fa=function(r){return"/"+r},$n={},K=function(o,t,e){let n=Promise.resolve();if(t&&t.length>0){document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),l=i?.nonce||i?.getAttribute("nonce");n=Promise.allSettled(t.map(c=>{if(c=Fa(c),c in $n)return;$n[c]=!0;const u=c.endsWith(".css"),p=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${p}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":Ia,u||(d.as="script"),d.crossOrigin="",d.href=c,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((m,f)=>{d.addEventListener("load",m),d.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${c}`)))})}))}function a(i){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=i,window.dispatchEvent(l),!l.defaultPrevented)throw i}return n.then(i=>{for(const l of i||[])l.status==="rejected"&&a(l.reason);return o().catch(a)})};let xn=!1,bn=!1,dt=null,kn=null,Dt=null;const Ya=()=>xn?(xn=!1,!0):!1,wn=()=>{xn=!0},Wa=()=>bn?(bn=!1,!0):!1,za=()=>{bn=!0},Ba=r=>{dt=r},Ha=r=>{kn=r},ae=async(r,o={})=>{let t=null;try{t=dt?dt():null}catch{}const e={...o.headers};!e["Content-Type"]&&!(o.body instanceof FormData)&&(e["Content-Type"]="application/json"),t&&(e.Authorization=`Bearer ${t}`);let n=await fetch(r,{...o,headers:e,credentials:"include"});if(n.status===401&&kn)try{Dt||(Dt=kn().finally(()=>{Dt=null})),await Dt?(t=dt?dt():null,t&&(e.Authorization=`Bearer ${t}`),n=await fetch(r,{...o,headers:e,credentials:"include"})):wn()}catch{wn()}return n},Me="/api/admin",Yr=v.createContext(null),Wr=v.createContext(null);function Ee(r){return r?{...r,fullName:r.full_name??r.fullName,roleDisplay:r.role_display??r.roleDisplay,isAdmin:r.is_admin??r.isAdmin,totpEnabled:r.totp_enabled??r.totpEnabled,require2FA:r.require_2fa??r.require2FA}:null}let st=null,He=null,ce=null,it=!1;function Va({children:r}){const[o,t]=v.useState(ce),[e,n]=v.useState(!it),[a,i]=v.useState(null),l=v.useRef(null);v.useEffect(()=>{ce=o},[o]);const c=v.useCallback(()=>He&&Date.now()>He-3e4?null:st,[]),u=v.useCallback((D,b)=>{if(st=D,He=D?Date.now()+b*1e3:null,l.current&&(clearTimeout(l.current),l.current=null),D&&b>60){const w=(b-60)*1e3;l.current=setTimeout(()=>{p()},w)}},[]),p=v.useCallback(async()=>{try{const b=await(await fetch(`${Me}/refresh.php`,{method:"POST",credentials:"include"})).json();return b.success&&b.data?.access_token?(u(b.data.access_token,b.data.expires_in),t(Ee(b.data.user)),!0):(st=null,He=null,t(null),ce=null,wn(),!1)}catch{return!1}},[u]),d=v.useCallback(async()=>{try{const D=c(),b={"Content-Type":"application/json"};D&&(b.Authorization=`Bearer ${D}`);const w=await fetch(`${Me}/session.php`,{method:"GET",credentials:"include",headers:b});if(w.status===429||w.status>=500)return!!ce;const S=await w.json();return S.success&&S.data?.authenticated?(S.data.access_token&&u(S.data.access_token,S.data.expires_in),t(Ee(S.data.user)),ce=Ee(S.data.user),!0):(t(null),ce=null,st=null,He=null,!1)}catch{return!!ce}finally{n(!1),it=!0}},[c,u]);v.useEffect(()=>{Ba(c),Ha(p)},[c,p]),v.useEffect(()=>(d(),()=>{l.current&&clearTimeout(l.current)}),[d]);const m=v.useCallback(async(D,b,w=!1)=>{i(null);try{const N=await(await fetch(`${Me}/login.php`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({username:D,password:b,remember:w})})).json();return N.success?N.data?.requires_2fa?{success:!1,requires2FA:!0,loginToken:N.data.login_token,remember:w}:(u(N.data.access_token,N.data.expires_in),t(Ee(N.data.user)),ce=Ee(N.data.user),it=!0,{success:!0}):(i(N.error),{success:!1,error:N.error})}catch{const S="Chyba připojení. Zkontrolujte prosím připojení k internetu a zkuste to znovu.";return i(S),{success:!1,error:S}}},[u]),f=v.useCallback(async(D,b,w=!1,S=!1)=>{i(null);try{const T=await(await fetch(`${Me}/totp.php?action=${S?"backup_verify":"verify"}`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({login_token:D,code:b,remember:w})})).json();return T.success?(u(T.data.access_token,T.data.expires_in),t(Ee(T.data.user)),ce=Ee(T.data.user),it=!0,{success:!0}):(i(T.error),{success:!1,error:T.error})}catch{const N="Chyba připojení. Zkontrolujte prosím připojení k internetu a zkuste to znovu.";return i(N),{success:!1,error:N}}},[u]),h=v.useCallback(async()=>{try{const D=c();await fetch(`${Me}/logout.php`,{method:"POST",headers:{"Content-Type":"application/json",...D&&{Authorization:`Bearer ${D}`}},credentials:"include"})}catch{}finally{st=null,He=null,t(null),ce=null,it=!1,l.current&&(clearTimeout(l.current),l.current=null)}},[c]),y=v.useCallback(async(D,b={})=>{let w=c();!w&&o&&await p()&&(w=c());const S={"Content-Type":"application/json",...b.headers};w&&(S.Authorization=`Bearer ${w}`);const N=await fetch(`${Me}${D}`,{...b,headers:S,credentials:"include"});return N.status===401&&o&&await p()?(w=c(),S.Authorization=`Bearer ${w}`,fetch(`${Me}${D}`,{...b,headers:S,credentials:"include"})):N},[c,p,o]),g=v.useCallback(D=>{t(b=>b?{...b,...D}:null)},[]),k=v.useCallback(D=>o?o.isAdmin?!0:(o.permissions||[]).includes(D):!1,[o]),_=v.useMemo(()=>o?.permissions||[],[o]),j=v.useMemo(()=>({user:o,loading:e,error:a,isAuthenticated:!!o,isAdmin:o?.isAdmin||!1,permissions:_,hasPermission:k}),[o,e,a,_,k]),C=v.useMemo(()=>({login:m,verify2FA:f,logout:h,checkSession:d,getAccessToken:c,apiRequest:y,silentRefresh:p,updateUser:g}),[m,f,h,d,c,y,p,g]);return s.jsx(Wr.Provider,{value:C,children:s.jsx(Yr.Provider,{value:j,children:r})})}function tt(){const r=v.useContext(Yr),o=v.useContext(Wr);if(!r||!o)throw new Error("useAuth must be used within an AuthProvider");return{...r,...o}}const zr=v.createContext(null),Br=v.createContext(null);function $a({children:r}){const[o,t]=v.useState([]),e=v.useCallback(l=>{t(c=>c.filter(u=>u.id!==l))},[]),n=v.useRef(0),a=v.useCallback((l,c="success",u=4e3)=>{const p=`${Date.now()}-${n.current++}`;return t(d=>[...d,{id:p,message:l,type:c}]),u>0&&setTimeout(()=>{e(p)},u),p},[e]),i=v.useMemo(()=>({addAlert:a,removeAlert:e,success:(l,c)=>a(l,"success",c),error:(l,c)=>a(l,"error",c),warning:(l,c)=>a(l,"warning",c),info:(l,c)=>a(l,"info",c)}),[a,e]);return s.jsx(zr.Provider,{value:i,children:s.jsx(Br.Provider,{value:{alerts:o,removeAlert:e},children:r})})}function xt(){const r=v.useContext(zr);if(!r)throw new Error("useAlert must be used within an AlertProvider");return r}function Ka(){const r=v.useContext(Br);if(!r)throw new Error("useAlertState must be used within an AlertProvider");return r}class Ua extends v.Component{constructor(){super(...arguments);Yn(this,"state",{hasError:!1,error:null})}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,e){}render(){return this.state.hasError?s.jsxs("div",{className:"admin-empty-state",style:{minHeight:"60vh",justifyContent:"center"},children:[s.jsx("div",{className:"admin-empty-icon",style:{width:80,height:80,marginBottom:"1.5rem"},children:s.jsxs("svg",{width:"36",height:"36",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[s.jsx("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.jsx("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]})}),s.jsx("p",{className:"mb-2",children:"Něco se pokazilo při načítání stránky."}),!1,s.jsxs("div",{style:{display:"flex",gap:"0.5rem",marginTop:"0.5rem"},children:[s.jsx("a",{href:"/",className:"admin-btn admin-btn-secondary",children:"Zpět na Dashboard"}),s.jsx("button",{onClick:()=>window.location.reload(),className:"admin-btn admin-btn-primary",children:"Načíst znovu"})]})]}):this.props.children}}const Hr=v.createContext(),Qa="boha_cookie_consent";function Kn(){return document.cookie.split(";").some(r=>r.trim()===`${Qa}=accepted`)}function Za({children:r}){const[o,t]=v.useState(()=>typeof window<"u"&&Kn()&&localStorage.getItem("boha-theme")||"dark");v.useEffect(()=>{document.documentElement.setAttribute("data-theme",o),Kn()&&localStorage.setItem("boha-theme",o);const n=o==="dark"?"#12121a":"#ffffff";document.querySelector('meta[name="theme-color"]')?.setAttribute("content",n)},[o]);const e=()=>{t(n=>n==="dark"?"light":"dark")};return s.jsx(Hr.Provider,{value:{theme:o,toggleTheme:e},children:r})}function Nn(){const r=v.useContext(Hr);if(!r)throw new Error("useTheme must be used within a ThemeProvider");return r}let mt=0;function Vr(r){let o=r.target;for(;o&&o!==document.body;){if(o.scrollHeight>o.clientHeight){const e=window.getComputedStyle(o).overflowY;if(e==="auto"||e==="scroll")return}o=o.parentElement}r.preventDefault()}function qa(){if(mt===0){const r=window.innerWidth-document.documentElement.clientWidth;document.documentElement.style.overflow="hidden",document.body.style.overflow="hidden",document.addEventListener("touchmove",Vr,{passive:!1}),r>0&&(document.body.style.paddingRight=`${r}px`)}mt++}function Xa(){mt--,mt<=0&&(mt=0,document.documentElement.style.overflow="",document.body.style.overflow="",document.body.style.paddingRight="",document.removeEventListener("touchmove",Vr))}function ze(r){v.useEffect(()=>{if(r)return qa(),()=>Xa()},[r])}const Ga=[{label:"Přehled",items:[{path:"/",label:"Přehled",end:!0,icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"3",y:"3",width:"7",height:"7",rx:"1"}),s.jsx("rect",{x:"14",y:"3",width:"7",height:"7",rx:"1"}),s.jsx("rect",{x:"14",y:"14",width:"7",height:"7",rx:"1"}),s.jsx("rect",{x:"3",y:"14",width:"7",height:"7",rx:"1"})]})}]},{label:"Docházka",items:[{path:"/attendance",label:"Záznam",permission:"attendance.record",end:!0,icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"9"}),s.jsx("polyline",{points:"12 7 12 12 15 15"})]})},{path:"/attendance/history",label:"Moje historie",permission:"attendance.history",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("polyline",{points:"12 8 12 12 14 14"}),s.jsx("path",{d:"M3.05 11a9 9 0 1 1 .5 4m-.5 5v-5h5"})]})},{path:"/attendance/requests",label:"Žádosti",permission:"attendance.record",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),s.jsx("polyline",{points:"14 2 14 8 20 8"}),s.jsx("line",{x1:"12",y1:"18",x2:"12",y2:"12"}),s.jsx("line",{x1:"9",y1:"15",x2:"15",y2:"15"})]})},{path:"/attendance/approval",label:"Schvalování",permission:"attendance.approve",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M9 12l2 2 4-4"}),s.jsx("circle",{cx:"12",cy:"12",r:"10"})]})},{path:"/attendance/admin",label:"Správa",permission:"attendance.admin",matchPrefix:"/attendance/admin",matchAlso:["/attendance/create","/attendance/location"],icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("line",{x1:"4",y1:"21",x2:"4",y2:"14"}),s.jsx("line",{x1:"4",y1:"10",x2:"4",y2:"3"}),s.jsx("line",{x1:"12",y1:"21",x2:"12",y2:"12"}),s.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"3"}),s.jsx("line",{x1:"20",y1:"21",x2:"20",y2:"16"}),s.jsx("line",{x1:"20",y1:"12",x2:"20",y2:"3"}),s.jsx("line",{x1:"1",y1:"14",x2:"7",y2:"14"}),s.jsx("line",{x1:"9",y1:"8",x2:"15",y2:"8"}),s.jsx("line",{x1:"17",y1:"16",x2:"23",y2:"16"})]})},{path:"/attendance/balances",label:"Správa bilancí",permission:"attendance.balances",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("line",{x1:"18",y1:"20",x2:"18",y2:"10"}),s.jsx("line",{x1:"12",y1:"20",x2:"12",y2:"4"}),s.jsx("line",{x1:"6",y1:"20",x2:"6",y2:"14"})]})}]},{label:"Kniha jízd",items:[{path:"/trips",label:"Záznam",permission:"trips.record",end:!0,icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"5",cy:"18",r:"3"}),s.jsx("circle",{cx:"19",cy:"18",r:"3"}),s.jsx("path",{d:"M5 18V12L8 5h8l3 7v6"}),s.jsx("path",{d:"M10 18h4"})]})},{path:"/trips/history",label:"Moje historie",permission:"trips.history",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("polyline",{points:"12 8 12 12 14 14"}),s.jsx("path",{d:"M3.05 11a9 9 0 1 1 .5 4m-.5 5v-5h5"})]})},{path:"/trips/admin",label:"Správa",permission:"trips.admin",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("line",{x1:"4",y1:"21",x2:"4",y2:"14"}),s.jsx("line",{x1:"4",y1:"10",x2:"4",y2:"3"}),s.jsx("line",{x1:"12",y1:"21",x2:"12",y2:"12"}),s.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"3"}),s.jsx("line",{x1:"20",y1:"21",x2:"20",y2:"16"}),s.jsx("line",{x1:"20",y1:"12",x2:"20",y2:"3"}),s.jsx("line",{x1:"1",y1:"14",x2:"7",y2:"14"}),s.jsx("line",{x1:"9",y1:"8",x2:"15",y2:"8"}),s.jsx("line",{x1:"17",y1:"16",x2:"23",y2:"16"})]})},{path:"/vehicles",label:"Vozidla",permission:"trips.vehicles",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"1",y:"3",width:"15",height:"13",rx:"2"}),s.jsx("path",{d:"M16 8h4l3 3v5h-7V8z"}),s.jsx("circle",{cx:"5.5",cy:"18.5",r:"2.5"}),s.jsx("circle",{cx:"18.5",cy:"18.5",r:"2.5"})]})}]},{label:"Administrativa",items:[{path:"/offers",label:"Nabídky",permission:"offers.view",matchPrefix:"/offers",matchExclude:["/offers/customers","/offers/templates"],icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),s.jsx("polyline",{points:"14 2 14 8 20 8"})]})},{path:"/orders",label:"Objednávky",permission:"orders.view",matchPrefix:"/orders",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"}),s.jsx("line",{x1:"3",y1:"6",x2:"21",y2:"6"}),s.jsx("path",{d:"M16 10a4 4 0 0 1-8 0"})]})},{path:"/invoices",label:"Faktury",permission:"invoices.view",matchPrefix:"/invoices",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("line",{x1:"12",y1:"1",x2:"12",y2:"23"}),s.jsx("path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"})]})},{path:"/projects",label:"Projekty",permission:"projects.view",matchPrefix:"/projects",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2"}),s.jsx("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),s.jsx("line",{x1:"12",y1:"17",x2:"12",y2:"21"})]})},{path:"/offers/customers",label:"Zákazníci",permission:"offers.view",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),s.jsx("circle",{cx:"9",cy:"7",r:"4"}),s.jsx("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),s.jsx("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})]})},{path:"/company/settings",label:"Firma",permission:"offers.settings",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"}),s.jsx("polyline",{points:"9 22 9 12 15 12 15 22"})]})}]},{label:"Systém",items:[{path:"/users",label:"Uživatelé",permission:"users.view",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),s.jsx("circle",{cx:"9",cy:"7",r:"4"}),s.jsx("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),s.jsx("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})]})},{path:"/settings",label:"Nastavení",permission:["settings.roles","settings.security"],icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"3"}),s.jsx("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"})]})},{path:"/audit-log",label:"Audit log",permission:"settings.audit",icon:s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),s.jsx("polyline",{points:"14 2 14 8 20 8"}),s.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),s.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),s.jsx("polyline",{points:"10 9 9 9 8 9"})]})}]}];function Ja({isOpen:r,onClose:o,onLogout:t}){const{user:e,hasPermission:n}=tt(),{theme:a}=Nn(),i=Mr(),l=p=>{if(p.matchPrefix){let d=i.pathname.startsWith(p.matchPrefix);return d&&p.matchExclude&&(d=!p.matchExclude.some(m=>i.pathname.startsWith(m))),d}return p.end?i.pathname===p.path:i.pathname.startsWith(p.path)},c=p=>p.permission?Array.isArray(p.permission)?p.permission.some(d=>n(d)):n(p.permission):!0,u=Ga.map(p=>({...p,items:p.items.filter(c)})).filter(p=>p.items.length>0);return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`admin-sidebar-overlay${r?" open":""}`,onClick:o}),s.jsxs("aside",{className:`admin-sidebar${r?" open":""}`,children:[s.jsxs("div",{className:"admin-sidebar-header",children:[s.jsx("img",{src:a==="dark"?"/images/logo-dark.png":"/images/logo-light.png",alt:"Logo",className:"admin-sidebar-logo"}),s.jsx("button",{onClick:o,className:"admin-sidebar-close","aria-label":"Zavřít menu",children:s.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),s.jsx("nav",{className:"admin-sidebar-nav",children:u.map(p=>s.jsxs("div",{className:"admin-nav-section",children:[s.jsx("div",{className:"admin-nav-label",children:p.label}),p.items.map(d=>s.jsxs(ya,{to:d.path,end:d.end,onClick:o,className:()=>{let m=l(d);return!m&&d.matchAlso&&(m=d.matchAlso.some(f=>i.pathname.startsWith(f))),`admin-nav-item${m?" active":""}`},children:[d.icon,d.label]},d.path))]},p.label))}),s.jsxs("div",{className:"admin-sidebar-footer",children:[s.jsxs("div",{className:"admin-user-chip",children:[s.jsx("div",{className:"admin-user-avatar",children:e?.fullName?.charAt(0)||e?.username?.charAt(0)||"U"}),s.jsxs("div",{className:"admin-user-details",children:[s.jsx("div",{className:"admin-user-name",children:e?.fullName||e?.username}),s.jsx("div",{className:"admin-user-role",children:e?.roleDisplay||e?.role})]})]}),s.jsxs("button",{onClick:t,className:"admin-logout-btn","aria-label":"Odhlásit se",children:[s.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),s.jsx("polyline",{points:"16 17 21 12 16 7"}),s.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]}),"Odhlásit se"]})]})]})]})}function eo(r){const o=v.useCallback(t=>{const e=t.target.tagName,n=e==="INPUT"||e==="TEXTAREA"||e==="SELECT"||t.target.isContentEditable;for(const a of r){if(a.when===!1)continue;const i=a.ctrl?t.ctrlKey||t.metaKey:!(t.ctrlKey||t.metaKey),l=a.shift?t.shiftKey:!t.shiftKey,c=a.alt?t.altKey:!t.altKey;if(t.key.toLowerCase()===a.key.toLowerCase()&&i&&l&&c){if(n&&t.key!=="Escape")continue;t.preventDefault(),a.handler(t);return}}},[r]);v.useEffect(()=>(window.addEventListener("keydown",o),()=>window.removeEventListener("keydown",o)),[o])}const to=[{keys:"?",description:"Zobrazit klávesové zkratky"},{keys:"Ctrl + N",description:"Nový záznam"},{keys:"Ctrl + S",description:"Uložit"},{keys:"Escape",description:"Zavřít modal / zrušit"},{keys:"/",description:"Hledat"}];function no(){const[r,o]=v.useState(!1);return eo([{key:"?",shift:!0,handler:()=>o(t=>!t)},{key:"Escape",handler:()=>o(!1),when:r}]),r?s.jsx("div",{className:"admin-modal-overlay",onClick:()=>o(!1),children:s.jsxs("div",{className:"admin-modal",style:{maxWidth:420},onClick:t=>t.stopPropagation(),children:[s.jsxs("div",{className:"admin-modal-header",children:[s.jsx("h3",{children:"Klávesové zkratky"}),s.jsx("button",{className:"admin-modal-close",onClick:()=>o(!1),children:s.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),s.jsx("div",{className:"admin-modal-body",children:s.jsx("table",{className:"admin-table",style:{minWidth:"auto"},children:s.jsx("tbody",{children:to.map(t=>s.jsxs("tr",{children:[s.jsx("td",{style:{width:120},children:s.jsx("kbd",{className:"admin-kbd",children:t.keys})}),s.jsx("td",{children:t.description})]},t.keys))})})})]})}):null}function ro(){const{isAuthenticated:r,loading:o,checkSession:t,user:e,logout:n}=tt(),{theme:a,toggleTheme:i}=Nn(),[l,c]=v.useState(!1),[u,p]=v.useState(!1),d=Mr();v.useEffect(()=>{t()},[d.pathname,t]);const m=v.useCallback(()=>{p(!0),c(!1),za(),setTimeout(()=>n(),400)},[n]);return ze(l),o?s.jsx("div",{className:"admin-layout",children:s.jsx("div",{className:"admin-loading",style:{width:"100%"},children:s.jsx("div",{className:"admin-spinner"})})}):r?e?.require2FA&&!e?.totpEnabled&&d.pathname!=="/"?s.jsx(hn,{to:"/",replace:!0}):s.jsxs(Q.div,{className:"admin-layout",initial:{opacity:0,scale:.97},animate:u?{scale:1.5,opacity:0,filter:"blur(12px)"}:{scale:1,opacity:1,filter:"none"},transition:{duration:u?.5:.35,ease:[.4,0,.2,1]},children:[s.jsx(Ja,{isOpen:l,onClose:()=>c(!1),onLogout:m}),s.jsxs("div",{className:"admin-main",children:[s.jsxs("header",{className:"admin-header",children:[s.jsx("button",{onClick:()=>c(!0),className:"admin-menu-btn","aria-label":"Otevřít menu",children:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("line",{x1:"3",y1:"12",x2:"21",y2:"12"}),s.jsx("line",{x1:"3",y1:"6",x2:"21",y2:"6"}),s.jsx("line",{x1:"3",y1:"18",x2:"21",y2:"18"})]})}),s.jsx("div",{className:"flex-1"}),s.jsxs("button",{onClick:i,className:"admin-header-theme-btn",title:a==="dark"?"Světlý režim":"Tmavý režim","aria-label":a==="dark"?"Světlý režim":"Tmavý režim",children:[s.jsx("span",{className:`admin-theme-icon ${a==="light"?"visible":""}`,children:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"5"}),s.jsx("path",{d:"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"})]})}),s.jsx("span",{className:`admin-theme-icon ${a==="dark"?"visible":""}`,children:s.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})})})]})]}),s.jsx("main",{className:"admin-content",children:s.jsx(ga,{})})]}),s.jsx(no,{})]}):s.jsx(hn,{to:"/login",replace:!0})}const ao={success:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"}),s.jsx("polyline",{points:"22 4 12 14.01 9 11.01"})]}),error:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"10"}),s.jsx("line",{x1:"15",y1:"9",x2:"9",y2:"15"}),s.jsx("line",{x1:"9",y1:"9",x2:"15",y2:"15"})]}),warning:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.jsx("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]}),info:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"10"}),s.jsx("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),s.jsx("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]})};function oo(){const{alerts:r,removeAlert:o}=Ka();return s.jsx("div",{className:"admin-alert-container",role:"status","aria-live":"polite",children:s.jsx(Ie,{children:r.map(t=>s.jsxs(Q.div,{className:`admin-toast admin-toast-${t.type}`,initial:{opacity:0,y:20,scale:.95},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:20,scale:.95},transition:{duration:.2},children:[s.jsx("span",{className:"admin-toast-icon",children:ao[t.type]}),s.jsx("span",{className:"admin-toast-message",children:t.message}),s.jsx("button",{className:"admin-toast-close",onClick:()=>o(t.id),"aria-label":"Zavřít",children:s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),s.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]},t.id))})})}function tn({label:r,error:o,required:t,className:e,style:n,children:a}){const i=`admin-form-group${o?" has-error":""}${e?` ${e}`:""}`;return s.jsxs("div",{className:i,style:n,children:[s.jsx("label",{className:`admin-form-label${t?" required":""}`,children:r}),a,o&&s.jsx("span",{className:"admin-form-error",children:o})]})}function so(){const{login:r,verify2FA:o,isAuthenticated:t,loading:e}=tt(),n=xt(),{theme:a,toggleTheme:i}=Nn(),[l,c]=v.useState(""),[u,p]=v.useState(""),[d,m]=v.useState(!1),[f,h]=v.useState(!1),[y,g]=v.useState(!1),[k,_]=v.useState(!1),[j,C]=v.useState(!1),[D,b]=v.useState(null),[w,S]=v.useState(""),[N,A]=v.useState(!1),T=v.useRef(null);if(v.useEffect(()=>{Ya()?n.warning("Vaše relace vypršela. Přihlaste se prosím znovu."):Wa()&&n.success("Byli jste úspěšně odhlášeni.")},[]),v.useEffect(()=>{j&&T.current&&T.current.focus()},[j,N]),e)return s.jsx("div",{className:"admin-login",children:s.jsx("div",{className:"admin-loading",children:s.jsx("div",{className:"admin-spinner"})})});if(t&&!k)return s.jsx(hn,{to:"/",replace:!0});const P=async L=>{L.preventDefault(),h(!0);const R=await r(l,u,d);R.requires2FA?(b(R.loginToken),C(!0),S(""),h(!1)):R.success?(n.success("Úspěšně přihlášeno"),_(!0),setTimeout(()=>_(!1),400)):(n.error(R.error),g(!0),setTimeout(()=>g(!1),500),h(!1))},E=async L=>{if(L.preventDefault(),!w.trim())return;h(!0);const R=await o(D,w.trim(),d,N);R.success?(n.success("Úspěšně přihlášeno"),_(!0),setTimeout(()=>_(!1),400)):(n.error(R.error),g(!0),setTimeout(()=>g(!1),500),S(""),T.current&&T.current.focus(),h(!1))},O=()=>{C(!1),b(null),S(""),A(!1)};return s.jsxs(Q.div,{className:"admin-login",initial:{opacity:0,scale:.97},animate:k?{scale:1.5,opacity:0,filter:"blur(12px)"}:{scale:1,opacity:1,filter:"none"},transition:k?{duration:.5,ease:[.4,0,.2,1]}:{duration:.35,ease:[.4,0,.2,1]},children:[s.jsx("div",{className:"bg-orb bg-orb-1"}),s.jsx("div",{className:"bg-orb bg-orb-2"}),s.jsxs("button",{onClick:i,className:"admin-login-theme-btn",title:a==="dark"?"Světlý režim":"Tmavý režim",children:[s.jsx("span",{className:`admin-theme-icon ${a==="light"?"visible":""}`,children:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"5"}),s.jsx("path",{d:"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"})]})}),s.jsx("span",{className:`admin-theme-icon ${a==="dark"?"visible":""}`,children:s.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})})})]}),s.jsx(Ie,{mode:"wait",children:j?s.jsxs(Q.div,{className:"admin-login-card",initial:{opacity:0,y:30},animate:y?{opacity:1,y:0,x:[0,-12,12,-8,8,-4,4,0]}:{opacity:1,y:0},exit:{opacity:0,y:-20},transition:y?{x:{duration:.5,ease:"easeOut"}}:{duration:.3},children:[s.jsxs("div",{className:"admin-login-header",children:[s.jsx("div",{className:"admin-login-2fa-icon",children:s.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[s.jsx("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),s.jsx("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})}),s.jsx("h1",{className:"admin-login-title",children:"Dvoufaktorové ověření"}),s.jsx("p",{className:"admin-login-subtitle",children:N?"Zadejte jeden ze záložních kódů":"Zadejte 6místný kód z autentizační aplikace"})]}),s.jsxs("form",{onSubmit:E,className:"admin-form",children:[s.jsx(tn,{label:N?"Záložní kód":"Ověřovací kód",children:s.jsx("input",{ref:T,id:"totp-code",type:"text",inputMode:N?"text":"numeric",pattern:N?void 0:"[0-9]*",maxLength:N?8:6,value:w,onChange:L=>{const R=N?L.target.value:L.target.value.replace(/\D/g,"");S(R)},required:!0,autoComplete:"one-time-code",className:"admin-form-input",placeholder:N?"XXXXXXXX":"000000",style:N?{}:{textAlign:"center",fontSize:"1.5rem",letterSpacing:"0.5rem",fontFamily:"monospace"}})}),s.jsx("button",{type:"submit",disabled:f,className:"admin-btn admin-btn-primary",style:{width:"100%"},children:f?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"admin-spinner",style:{width:20,height:20,borderWidth:2}}),"Ověřování..."]}):"Ověřit"})]}),s.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem",marginTop:"0.5rem"},children:[s.jsx("button",{onClick:()=>{A(!N),S("")},className:"admin-back-link",style:{border:"none",background:"none",cursor:"pointer"},children:N?"Použít autentizační aplikaci":"Použít záložní kód"}),s.jsx("button",{onClick:O,className:"admin-back-link",style:{border:"none",background:"none",cursor:"pointer"},children:"← Zpět na přihlášení"})]})]},"2fa"):s.jsxs(Q.div,{className:"admin-login-card",initial:{opacity:0,y:30},animate:y?{opacity:1,y:0,x:[0,-12,12,-8,8,-4,4,0]}:{opacity:1,y:0},exit:{opacity:0,y:-20},transition:y?{x:{duration:.5,ease:"easeOut"}}:{duration:.3},children:[s.jsxs("div",{className:"admin-login-header",children:[s.jsx("img",{src:a==="dark"?"/images/logo-dark.png":"/images/logo-light.png",alt:"Logo",className:"admin-login-logo"}),s.jsx("h1",{className:"admin-login-title",children:"Interní systém"}),s.jsx("p",{className:"admin-login-subtitle",children:"Přihlaste se ke svému účtu"})]}),s.jsxs("form",{onSubmit:P,className:"admin-form",children:[s.jsx(tn,{label:"Uživatelské jméno nebo e-mail",children:s.jsx("input",{id:"username",type:"text",value:l,onChange:L=>c(L.target.value),required:!0,autoComplete:"username",className:"admin-form-input",placeholder:"Zadejte uživatelské jméno"})}),s.jsx(tn,{label:"Heslo",children:s.jsx("input",{id:"password",type:"password",value:u,onChange:L=>p(L.target.value),required:!0,autoComplete:"current-password",className:"admin-form-input",placeholder:"Zadejte heslo"})}),s.jsxs("label",{className:"admin-form-checkbox",children:[s.jsx("input",{type:"checkbox",checked:d,onChange:L=>m(L.target.checked)}),s.jsx("span",{children:"Zapamatovat si mě"})]}),s.jsx("button",{type:"submit",disabled:f,className:"admin-btn admin-btn-primary",style:{width:"100%"},children:f?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"admin-spinner",style:{width:20,height:20,borderWidth:2}}),"Přihlašování..."]}):"Přihlásit se"})]})]},"login")})]})}const io={vacation:"Dovolená",sick:"Nemoc",holiday:"Svátek",unpaid:"Neplacené volno"},Un={in:"dash-status-in",away:"dash-status-away",out:"dash-status-out",leave:"dash-status-leave"},lo={in:"Přítomen",away:"Přestávka",out:"Nepřihlášen",leave:"Nepřítomen"},co={user:"Uživatel",attendance:"Docházka",leave_request:"Žádost o nepřítomnost",offers_quotation:"Nabídka",offers_customer:"Zákazník",offers_item_template:"Šablona položky",offers_scope_template:"Šablona rozsahu",offers_settings:"Nastavení nabídek",orders_order:"Objednávka",invoices_invoice:"Faktura",projects_project:"Projekt",role:"Role",trips:"Jízda",vehicles:"Vozidlo",bank_account:"Bankovní účet"};function uo(){const r=new Date,o=["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],t=["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],e=o[r.getDay()],n=new Date(r.getFullYear(),0,1),a=Math.ceil(((r.getTime()-n.getTime())/864e5+n.getDay()+1)/7);return`${e}, ${r.getDate()}. ${t[r.getMonth()]} ${r.getFullYear()} · Týden ${a}`}function po(r){return{create:"success",update:"info",delete:"danger",login:"accent"}[r]||"muted"}function fo(r){const o=new Date(r),t=new Date,e=t.getTime()-o.getTime();return e<6e4?"Právě teď":e<36e5?`${Math.floor(e/6e4)} min`:o.toDateString()===t.toDateString()?o.toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"}):o.toLocaleDateString("cs-CZ",{day:"2-digit",month:"2-digit"})}function mo(r){return new Date(r).toLocaleDateString("cs-CZ",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"})}function nn(r,o){const t=Number(r)||0;switch(o){case"EUR":return`${t.toLocaleString("cs-CZ",{minimumFractionDigits:2,maximumFractionDigits:2})} €`;case"USD":return`$${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`;case"CZK":return`${t.toLocaleString("cs-CZ",{minimumFractionDigits:2,maximumFractionDigits:2})} Kč`;case"GBP":return`£${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`;default:return`${t.toFixed(2)} ${o}`}}function ec(r){return r?new Date(r).toLocaleDateString("cs-CZ"):"—"}function ho(r){return new Intl.NumberFormat("cs-CZ").format(Number(r)||0)}function tc(r,o,t,e){return r===1?o:r>=2&&r<=4?t:e}function vo(r){const o=[];return r?.attendance&&o.push({label:"Přítomní dnes",value:`${r.attendance.present_today}`,sub:`/ ${r.attendance.total_active}`,color:"success",footer:r.attendance.on_leave>0?`${r.attendance.on_leave} nepřítomných`:null}),r?.offers&&o.push({label:"Otevřené nabídky",value:`${r.offers.open_count}`,color:"info",footer:r.offers.created_this_month>0?`${r.offers.created_this_month} tento měsíc`:null}),r?.invoices&&o.push(yo(r.invoices)),r?.leave_pending&&o.push({label:"Žádosti o volno",value:`${r.leave_pending.count}`,color:"danger",footer:r.leave_pending.count>0?"čeká na schválení":null}),o}function yo(r){const o=r.revenue_this_month||[],t=o.some(u=>u.currency!=="CZK"),e=t&&r.revenue_czk!==null&&r.revenue_czk!==void 0,n=o.length>0?o.map(u=>nn(u.amount,u.currency)).join(" · "):"0 Kč",a=e?nn(r.revenue_czk,"CZK"):n,i=t&&o.length>0?o.map(u=>nn(u.amount,u.currency)).join(" · "):null,l=r.unpaid_count>0?`${r.unpaid_count} neuhrazených`:null,c=[i,l].filter(Boolean);return{label:"Tržby (měsíc)",value:a,color:"warning",footer:c.length>0?c.join(" · "):null}}const go={4:"dash-kpi-4",3:"dash-kpi-3",2:"dash-kpi-2",1:"dash-kpi-1"};function xo({dashData:r}){const o=vo(r);if(o.length===0)return null;const t=go[Math.min(o.length,4)]||"dash-kpi-4";return s.jsx(Q.div,{className:`dash-kpi-grid ${t}`,initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:o.map(e=>s.jsxs("div",{className:`admin-stat-card ${e.color}`,children:[s.jsx("div",{className:"admin-stat-label",children:e.label}),s.jsxs("div",{className:"admin-stat-value admin-mono",children:[e.value,e.sub&&s.jsx("small",{className:"text-muted",style:{fontSize:"0.75em",fontWeight:500,marginLeft:"0.25rem"},children:e.sub})]}),e.footer&&s.jsx("div",{className:"admin-stat-footer",children:e.footer})]},e.label))})}function $r(r){var o,t,e="";if(typeof r=="string"||typeof r=="number")e+=r;else if(typeof r=="object")if(Array.isArray(r)){var n=r.length;for(o=0;o"u"?!1:r instanceof ShadowRoot||r instanceof oe(r).ShadowRoot}function bt(r){const{overflow:o,overflowX:t,overflowY:e,display:n}=le(r);return/auto|scroll|overlay|hidden|clip/.test(o+e+t)&&n!=="inline"&&n!=="contents"}function bo(r){return/^(table|td|th)$/.test(nt(r))}function Qt(r){try{if(r.matches(":popover-open"))return!0}catch{}try{return r.matches(":modal")}catch{return!1}}const ko=/transform|translate|scale|rotate|perspective|filter/,wo=/paint|layout|strict|content/,Pe=r=>!!r&&r!=="none";let rn;function Mn(r){const o=ee(r)?le(r):r;return Pe(o.transform)||Pe(o.translate)||Pe(o.scale)||Pe(o.rotate)||Pe(o.perspective)||!En()&&(Pe(o.backdropFilter)||Pe(o.filter))||ko.test(o.willChange||"")||wo.test(o.contain||"")}function _o(r){let o=Ne(r);for(;_e(o)&&!Xe(o);){if(Mn(o))return o;if(Qt(o))return null;o=Ne(o)}return null}function En(){return rn==null&&(rn=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),rn}function Xe(r){return/^(html|body|#document)$/.test(nt(r))}function le(r){return oe(r).getComputedStyle(r)}function Zt(r){return ee(r)?{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}:{scrollLeft:r.scrollX,scrollTop:r.scrollY}}function Ne(r){if(nt(r)==="html")return r;const o=r.assignedSlot||r.parentNode||Qn(r)&&r.host||ve(r);return Qn(o)?o.host:o}function Ur(r){const o=Ne(r);return Xe(o)?r.ownerDocument?r.ownerDocument.body:r.body:_e(o)&&bt(o)?o:Ur(o)}function gt(r,o,t){var e;o===void 0&&(o=[]),t===void 0&&(t=!0);const n=Ur(r),a=n===((e=r.ownerDocument)==null?void 0:e.body),i=oe(n);if(a){const l=_n(i);return o.concat(i,i.visualViewport||[],bt(n)?n:[],l&&t?gt(l):[])}else return o.concat(n,gt(n,[],t))}function _n(r){return r.parent&&Object.getPrototypeOf(r.parent)?r.frameElement:null}const Ge=Math.min,We=Math.max,zt=Math.round,jt=Math.floor,he=r=>({x:r,y:r}),Do={left:"right",right:"left",bottom:"top",top:"bottom"};function jo(r,o,t){return We(r,Ge(o,t))}function qt(r,o){return typeof r=="function"?r(o):r}function Je(r){return r.split("-")[0]}function kt(r){return r.split("-")[1]}function So(r){return r==="x"?"y":"x"}function Pn(r){return r==="y"?"height":"width"}function Ae(r){const o=r[0];return o==="t"||o==="b"?"y":"x"}function Tn(r){return So(Ae(r))}function Co(r,o,t){t===void 0&&(t=!1);const e=kt(r),n=Tn(r),a=Pn(n);let i=n==="x"?e===(t?"end":"start")?"right":"left":e==="start"?"bottom":"top";return o.reference[a]>o.floating[a]&&(i=Bt(i)),[i,Bt(i)]}function No(r){const o=Bt(r);return[Dn(r),o,Dn(o)]}function Dn(r){return r.includes("start")?r.replace("start","end"):r.replace("end","start")}const Zn=["left","right"],qn=["right","left"],Mo=["top","bottom"],Eo=["bottom","top"];function Po(r,o,t){switch(r){case"top":case"bottom":return t?o?qn:Zn:o?Zn:qn;case"left":case"right":return o?Mo:Eo;default:return[]}}function To(r,o,t,e){const n=kt(r);let a=Po(Je(r),t==="start",e);return n&&(a=a.map(i=>i+"-"+n),o&&(a=a.concat(a.map(Dn)))),a}function Bt(r){const o=Je(r);return Do[o]+r.slice(o.length)}function Oo(r){return{top:0,right:0,bottom:0,left:0,...r}}function Qr(r){return typeof r!="number"?Oo(r):{top:r,right:r,bottom:r,left:r}}function Ht(r){const{x:o,y:t,width:e,height:n}=r;return{width:e,height:n,top:t,left:o,right:o+e,bottom:t+n,x:o,y:t}}var Ao=typeof document<"u",Ro=function(){},Vt=Ao?v.useLayoutEffect:Ro;const Lo={...Er},Io=Lo.useInsertionEffect,Fo=Io||(r=>r());function Yo(r){const o=v.useRef(()=>{});return Fo(()=>{o.current=r}),v.useCallback(function(){for(var t=arguments.length,e=new Array(t),n=0;n{const{placement:e="bottom",strategy:n="absolute",middleware:a=[],platform:i}=t,l=i.detectOverflow?i:{...i,detectOverflow:Wo},c=await(i.isRTL==null?void 0:i.isRTL(o));let u=await i.getElementRects({reference:r,floating:o,strategy:n}),{x:p,y:d}=Xn(u,e,c),m=e,f=0;const h={};for(let y=0;y({name:"arrow",options:r,async fn(o){const{x:t,y:e,placement:n,rects:a,platform:i,elements:l,middlewareData:c}=o,{element:u,padding:p=0}=qt(r,o)||{};if(u==null)return{};const d=Qr(p),m={x:t,y:e},f=Tn(n),h=Pn(f),y=await i.getDimensions(u),g=f==="y",k=g?"top":"left",_=g?"bottom":"right",j=g?"clientHeight":"clientWidth",C=a.reference[h]+a.reference[f]-m[f]-a.floating[h],D=m[f]-a.reference[f],b=await(i.getOffsetParent==null?void 0:i.getOffsetParent(u));let w=b?b[j]:0;(!w||!await(i.isElement==null?void 0:i.isElement(b)))&&(w=l.floating[j]||a.floating[h]);const S=C/2-D/2,N=w/2-y[h]/2-1,A=Ge(d[k],N),T=Ge(d[_],N),P=A,E=w-y[h]-T,O=w/2-y[h]/2+S,L=jo(P,O,E),R=!c.arrow&&kt(n)!=null&&O!==L&&a.reference[h]/2-(OO<=0)){var T,P;const O=(((T=a.flip)==null?void 0:T.index)||0)+1,L=w[O];if(L&&(!(d==="alignment"?_!==Ae(L):!1)||A.every(V=>Ae(V.placement)===_?V.overflows[0]>0:!0)))return{data:{index:O,overflows:A},reset:{placement:L}};let R=(P=A.filter(I=>I.overflows[0]<=0).sort((I,V)=>I.overflows[1]-V.overflows[1])[0])==null?void 0:P.placement;if(!R)switch(f){case"bestFit":{var E;const I=(E=A.filter(V=>{if(b){const z=Ae(V.placement);return z===_||z==="y"}return!0}).map(V=>[V.placement,V.overflows.filter(z=>z>0).reduce((z,$)=>z+$,0)]).sort((V,z)=>V[1]-z[1])[0])==null?void 0:E[0];I&&(R=I);break}case"initialPlacement":R=l;break}if(n!==R)return{reset:{placement:R}}}return{}}}},$o=new Set(["left","top"]);async function Ko(r,o){const{placement:t,platform:e,elements:n}=r,a=await(e.isRTL==null?void 0:e.isRTL(n.floating)),i=Je(t),l=kt(t),c=Ae(t)==="y",u=$o.has(i)?-1:1,p=a&&c?-1:1,d=qt(o,r);let{mainAxis:m,crossAxis:f,alignmentAxis:h}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return l&&typeof h=="number"&&(f=l==="end"?h*-1:h),c?{x:f*p,y:m*u}:{x:m*u,y:f*p}}const Uo=function(r){return r===void 0&&(r=0),{name:"offset",options:r,async fn(o){var t,e;const{x:n,y:a,placement:i,middlewareData:l}=o,c=await Ko(o,r);return i===((t=l.offset)==null?void 0:t.placement)&&(e=l.arrow)!=null&&e.alignmentOffset?{}:{x:n+c.x,y:a+c.y,data:{...c,placement:i}}}}};function Zr(r){const o=le(r);let t=parseFloat(o.width)||0,e=parseFloat(o.height)||0;const n=_e(r),a=n?r.offsetWidth:t,i=n?r.offsetHeight:e,l=zt(t)!==a||zt(e)!==i;return l&&(t=a,e=i),{width:t,height:e,$:l}}function On(r){return ee(r)?r:r.contextElement}function Ze(r){const o=On(r);if(!_e(o))return he(1);const t=o.getBoundingClientRect(),{width:e,height:n,$:a}=Zr(o);let i=(a?zt(t.width):t.width)/e,l=(a?zt(t.height):t.height)/n;return(!i||!Number.isFinite(i))&&(i=1),(!l||!Number.isFinite(l))&&(l=1),{x:i,y:l}}const Qo=he(0);function qr(r){const o=oe(r);return!En()||!o.visualViewport?Qo:{x:o.visualViewport.offsetLeft,y:o.visualViewport.offsetTop}}function Zo(r,o,t){return o===void 0&&(o=!1),!t||o&&t!==oe(r)?!1:o}function Be(r,o,t,e){o===void 0&&(o=!1),t===void 0&&(t=!1);const n=r.getBoundingClientRect(),a=On(r);let i=he(1);o&&(e?ee(e)&&(i=Ze(e)):i=Ze(r));const l=Zo(a,t,e)?qr(a):he(0);let c=(n.left+l.x)/i.x,u=(n.top+l.y)/i.y,p=n.width/i.x,d=n.height/i.y;if(a){const m=oe(a),f=e&&ee(e)?oe(e):e;let h=m,y=_n(h);for(;y&&e&&f!==h;){const g=Ze(y),k=y.getBoundingClientRect(),_=le(y),j=k.left+(y.clientLeft+parseFloat(_.paddingLeft))*g.x,C=k.top+(y.clientTop+parseFloat(_.paddingTop))*g.y;c*=g.x,u*=g.y,p*=g.x,d*=g.y,c+=j,u+=C,h=oe(y),y=_n(h)}}return Ht({width:p,height:d,x:c,y:u})}function Xt(r,o){const t=Zt(r).scrollLeft;return o?o.left+t:Be(ve(r)).left+t}function Xr(r,o){const t=r.getBoundingClientRect(),e=t.left+o.scrollLeft-Xt(r,t),n=t.top+o.scrollTop;return{x:e,y:n}}function qo(r){let{elements:o,rect:t,offsetParent:e,strategy:n}=r;const a=n==="fixed",i=ve(e),l=o?Qt(o.floating):!1;if(e===i||l&&a)return t;let c={scrollLeft:0,scrollTop:0},u=he(1);const p=he(0),d=_e(e);if((d||!d&&!a)&&((nt(e)!=="body"||bt(i))&&(c=Zt(e)),d)){const f=Be(e);u=Ze(e),p.x=f.x+e.clientLeft,p.y=f.y+e.clientTop}const m=i&&!d&&!a?Xr(i,c):he(0);return{width:t.width*u.x,height:t.height*u.y,x:t.x*u.x-c.scrollLeft*u.x+p.x+m.x,y:t.y*u.y-c.scrollTop*u.y+p.y+m.y}}function Xo(r){return Array.from(r.getClientRects())}function Go(r){const o=ve(r),t=Zt(r),e=r.ownerDocument.body,n=We(o.scrollWidth,o.clientWidth,e.scrollWidth,e.clientWidth),a=We(o.scrollHeight,o.clientHeight,e.scrollHeight,e.clientHeight);let i=-t.scrollLeft+Xt(r);const l=-t.scrollTop;return le(e).direction==="rtl"&&(i+=We(o.clientWidth,e.clientWidth)-n),{width:n,height:a,x:i,y:l}}const Gn=25;function Jo(r,o){const t=oe(r),e=ve(r),n=t.visualViewport;let a=e.clientWidth,i=e.clientHeight,l=0,c=0;if(n){a=n.width,i=n.height;const p=En();(!p||p&&o==="fixed")&&(l=n.offsetLeft,c=n.offsetTop)}const u=Xt(e);if(u<=0){const p=e.ownerDocument,d=p.body,m=getComputedStyle(d),f=p.compatMode==="CSS1Compat"&&parseFloat(m.marginLeft)+parseFloat(m.marginRight)||0,h=Math.abs(e.clientWidth-d.clientWidth-f);h<=Gn&&(a-=h)}else u<=Gn&&(a+=u);return{width:a,height:i,x:l,y:c}}function es(r,o){const t=Be(r,!0,o==="fixed"),e=t.top+r.clientTop,n=t.left+r.clientLeft,a=_e(r)?Ze(r):he(1),i=r.clientWidth*a.x,l=r.clientHeight*a.y,c=n*a.x,u=e*a.y;return{width:i,height:l,x:c,y:u}}function Jn(r,o,t){let e;if(o==="viewport")e=Jo(r,t);else if(o==="document")e=Go(ve(r));else if(ee(o))e=es(o,t);else{const n=qr(r);e={x:o.x-n.x,y:o.y-n.y,width:o.width,height:o.height}}return Ht(e)}function Gr(r,o){const t=Ne(r);return t===o||!ee(t)||Xe(t)?!1:le(t).position==="fixed"||Gr(t,o)}function ts(r,o){const t=o.get(r);if(t)return t;let e=gt(r,[],!1).filter(l=>ee(l)&&nt(l)!=="body"),n=null;const a=le(r).position==="fixed";let i=a?Ne(r):r;for(;ee(i)&&!Xe(i);){const l=le(i),c=Mn(i);!c&&l.position==="fixed"&&(n=null),(a?!c&&!n:!c&&l.position==="static"&&!!n&&(n.position==="absolute"||n.position==="fixed")||bt(i)&&!c&&Gr(r,i))?e=e.filter(p=>p!==i):n=l,i=Ne(i)}return o.set(r,e),e}function ns(r){let{element:o,boundary:t,rootBoundary:e,strategy:n}=r;const i=[...t==="clippingAncestors"?Qt(o)?[]:ts(o,this._c):[].concat(t),e],l=Jn(o,i[0],n);let c=l.top,u=l.right,p=l.bottom,d=l.left;for(let m=1;m{i(!1,1e-7)},1e3)}w===1&&!ea(u,r.getBoundingClientRect())&&i(),C=!1}try{t=new IntersectionObserver(D,{...j,root:n.ownerDocument})}catch{t=new IntersectionObserver(D,j)}t.observe(r)}return i(!0),a}function cs(r,o,t,e){e===void 0&&(e={});const{ancestorScroll:n=!0,ancestorResize:a=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:l=typeof IntersectionObserver=="function",animationFrame:c=!1}=e,u=On(r),p=n||a?[...u?gt(u):[],...o?gt(o):[]]:[];p.forEach(k=>{n&&k.addEventListener("scroll",t,{passive:!0}),a&&k.addEventListener("resize",t)});const d=u&&l?ls(u,t):null;let m=-1,f=null;i&&(f=new ResizeObserver(k=>{let[_]=k;_&&_.target===u&&f&&o&&(f.unobserve(o),cancelAnimationFrame(m),m=requestAnimationFrame(()=>{var j;(j=f)==null||j.observe(o)})),t()}),u&&!c&&f.observe(u),o&&f.observe(o));let h,y=c?Be(r):null;c&&g();function g(){const k=Be(r);y&&!ea(y,k)&&t(),y=k,h=requestAnimationFrame(g)}return t(),()=>{var k;p.forEach(_=>{n&&_.removeEventListener("scroll",t),a&&_.removeEventListener("resize",t)}),d?.(),(k=f)==null||k.disconnect(),f=null,c&&cancelAnimationFrame(h)}}const ds=Uo,us=Vo,tr=Ho,ps=(r,o,t)=>{const e=new Map,n={platform:is,...t},a={...n.platform,_c:e};return Bo(r,o,{...n,platform:a})};var fs=typeof document<"u",ms=function(){},Rt=fs?v.useLayoutEffect:ms;function $t(r,o){if(r===o)return!0;if(typeof r!=typeof o)return!1;if(typeof r=="function"&&r.toString()===o.toString())return!0;let t,e,n;if(r&&o&&typeof r=="object"){if(Array.isArray(r)){if(t=r.length,t!==o.length)return!1;for(e=t;e--!==0;)if(!$t(r[e],o[e]))return!1;return!0}if(n=Object.keys(r),t=n.length,t!==Object.keys(o).length)return!1;for(e=t;e--!==0;)if(!{}.hasOwnProperty.call(o,n[e]))return!1;for(e=t;e--!==0;){const a=n[e];if(!(a==="_owner"&&r.$$typeof)&&!$t(r[a],o[a]))return!1}return!0}return r!==r&&o!==o}function ta(r){return typeof window>"u"?1:(r.ownerDocument.defaultView||window).devicePixelRatio||1}function nr(r,o){const t=ta(r);return Math.round(o*t)/t}function on(r){const o=v.useRef(r);return Rt(()=>{o.current=r}),o}function hs(r){r===void 0&&(r={});const{placement:o="bottom",strategy:t="absolute",middleware:e=[],platform:n,elements:{reference:a,floating:i}={},transform:l=!0,whileElementsMounted:c,open:u}=r,[p,d]=v.useState({x:0,y:0,strategy:t,placement:o,middlewareData:{},isPositioned:!1}),[m,f]=v.useState(e);$t(m,e)||f(e);const[h,y]=v.useState(null),[g,k]=v.useState(null),_=v.useCallback(V=>{V!==b.current&&(b.current=V,y(V))},[]),j=v.useCallback(V=>{V!==w.current&&(w.current=V,k(V))},[]),C=a||h,D=i||g,b=v.useRef(null),w=v.useRef(null),S=v.useRef(p),N=c!=null,A=on(c),T=on(n),P=on(u),E=v.useCallback(()=>{if(!b.current||!w.current)return;const V={placement:o,strategy:t,middleware:m};T.current&&(V.platform=T.current),ps(b.current,w.current,V).then(z=>{const $={...z,isPositioned:P.current!==!1};O.current&&!$t(S.current,$)&&(S.current=$,Nr.flushSync(()=>{d($)}))})},[m,o,t,T,P]);Rt(()=>{u===!1&&S.current.isPositioned&&(S.current.isPositioned=!1,d(V=>({...V,isPositioned:!1})))},[u]);const O=v.useRef(!1);Rt(()=>(O.current=!0,()=>{O.current=!1}),[]),Rt(()=>{if(C&&(b.current=C),D&&(w.current=D),C&&D){if(A.current)return A.current(C,D,E);E()}},[C,D,E,A,N]);const L=v.useMemo(()=>({reference:b,floating:w,setReference:_,setFloating:j}),[_,j]),R=v.useMemo(()=>({reference:C,floating:D}),[C,D]),I=v.useMemo(()=>{const V={position:t,left:0,top:0};if(!R.floating)return V;const z=nr(R.floating,p.x),$=nr(R.floating,p.y);return l?{...V,transform:"translate("+z+"px, "+$+"px)",...ta(R.floating)>=1.5&&{willChange:"transform"}}:{position:t,left:z,top:$}},[t,l,R.floating,p.x,p.y]);return v.useMemo(()=>({...p,update:E,refs:L,elements:R,floatingStyles:I}),[p,E,L,R,I])}const vs=r=>{function o(t){return{}.hasOwnProperty.call(t,"current")}return{name:"arrow",options:r,fn(t){const{element:e,padding:n}=typeof r=="function"?r(t):r;return e&&o(e)?e.current!=null?tr({element:e.current,padding:n}).fn(t):{}:e?tr({element:e,padding:n}).fn(t):{}}}},ys=(r,o)=>{const t=ds(r);return{name:t.name,fn:t.fn,options:[r,o]}},gs=(r,o)=>{const t=us(r);return{name:t.name,fn:t.fn,options:[r,o]}},xs=(r,o)=>{const t=vs(r);return{name:t.name,fn:t.fn,options:[r,o]}},bs={...Er};let rr=!1,ks=0;const ar=()=>"floating-ui-"+Math.random().toString(36).slice(2,6)+ks++;function ws(){const[r,o]=v.useState(()=>rr?ar():void 0);return Vt(()=>{r==null&&o(ar())},[]),v.useEffect(()=>{rr=!0},[]),r}const _s=bs.useId,na=_s||ws,Ds=v.forwardRef(function(o,t){const{context:{placement:e,elements:{floating:n},middlewareData:{arrow:a,shift:i}},width:l=14,height:c=7,tipRadius:u=0,strokeWidth:p=0,staticOffset:d,stroke:m,d:f,style:{transform:h,...y}={},...g}=o,k=na(),[_,j]=v.useState(!1);if(Vt(()=>{if(!n)return;le(n).direction==="rtl"&&j(!0)},[n]),!n)return null;const[C,D]=e.split("-"),b=C==="top"||C==="bottom";let w=d;(b&&i!=null&&i.x||!b&&i!=null&&i.y)&&(w=null);const S=p*2,N=S/2,A=l/2*(u/-8+1),T=c/2*u/4,P=!!f,E=w&&D==="end"?"bottom":"top";let O=w&&D==="end"?"right":"left";w&&_&&(O=D==="end"?"left":"right");const L=a?.x!=null?w||a.x:"",R=a?.y!=null?w||a.y:"",I=f||"M0,0"+(" H"+l)+(" L"+(l-A)+","+(c-T))+(" Q"+l/2+","+c+" "+A+","+(c-T))+" Z",V={top:P?"rotate(180deg)":"",left:P?"rotate(90deg)":"rotate(-90deg)",bottom:P?"":"rotate(180deg)",right:P?"rotate(-90deg)":"rotate(90deg)"}[C];return s.jsxs("svg",{...g,"aria-hidden":!0,ref:t,width:P?l:l+S,height:l,viewBox:"0 0 "+l+" "+(c>l?c:l),style:{position:"absolute",pointerEvents:"none",[O]:L,[E]:R,[C]:b||P?"100%":"calc(100% - "+S/2+"px)",transform:[V,h].filter(z=>!!z).join(" "),...y},children:[S>0&&s.jsx("path",{clipPath:"url(#"+k+")",fill:"none",stroke:m,strokeWidth:S+(f?0:1),d:I}),s.jsx("path",{stroke:S&&!f?g.fill:"none",d:I}),s.jsx("clipPath",{id:k,children:s.jsx("rect",{x:-N,y:N*(P?-1:1),width:l+S,height:l})})]})});function js(){const r=new Map;return{emit(o,t){var e;(e=r.get(o))==null||e.forEach(n=>n(t))},on(o,t){r.has(o)||r.set(o,new Set),r.get(o).add(t)},off(o,t){var e;(e=r.get(o))==null||e.delete(t)}}}const Ss=v.createContext(null),Cs=v.createContext(null),Ns=()=>{var r;return((r=v.useContext(Ss))==null?void 0:r.id)||null},Ms=()=>v.useContext(Cs);function Es(r){const{open:o=!1,onOpenChange:t,elements:e}=r,n=na(),a=v.useRef({}),[i]=v.useState(()=>js()),l=Ns()!=null,[c,u]=v.useState(e.reference),p=Yo((f,h,y)=>{a.current.openEvent=f?h:void 0,i.emit("openchange",{open:f,event:h,reason:y,nested:l}),t?.(f,h,y)}),d=v.useMemo(()=>({setPositionReference:u}),[]),m=v.useMemo(()=>({reference:c||e.reference||null,floating:e.floating||null,domReference:e.reference}),[c,e.reference,e.floating]);return v.useMemo(()=>({dataRef:a,open:o,onOpenChange:p,elements:m,events:i,floatingId:n,refs:d}),[o,p,m,i,n,d])}function Ps(r){r===void 0&&(r={});const{nodeId:o}=r,t=Es({...r,elements:{reference:null,floating:null,...r.elements}}),e=r.rootContext||t,n=e.elements,[a,i]=v.useState(null),[l,c]=v.useState(null),p=n?.domReference||a,d=v.useRef(null),m=Ms();Vt(()=>{p&&(d.current=p)},[p]);const f=hs({...r,elements:{...n,...l&&{reference:l}}}),h=v.useCallback(j=>{const C=ee(j)?{getBoundingClientRect:()=>j.getBoundingClientRect(),getClientRects:()=>j.getClientRects(),contextElement:j}:j;c(C),f.refs.setReference(C)},[f.refs]),y=v.useCallback(j=>{(ee(j)||j===null)&&(d.current=j,i(j)),(ee(f.refs.reference.current)||f.refs.reference.current===null||j!==null&&!ee(j))&&f.refs.setReference(j)},[f.refs]),g=v.useMemo(()=>({...f.refs,setReference:y,setPositionReference:h,domReference:d}),[f.refs,y,h]),k=v.useMemo(()=>({...f.elements,domReference:p}),[f.elements,p]),_=v.useMemo(()=>({...f,...e,refs:g,elements:k,nodeId:o}),[f,g,k,o,e]);return Vt(()=>{e.dataRef.current.floatingContext=_;const j=m?.nodesRef.current.find(C=>C.id===o);j&&(j.context=_)}),v.useMemo(()=>({...f,context:_,refs:g,elements:k}),[f,g,k,_])}/*! react-datepicker v9.1.0 https://github.com/Hacker0x01/react-datepicker Released under the MIT License. */var jn=function(o,t){return jn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])},jn(o,t)};function q(r,o){if(typeof o!="function"&&o!==null)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");jn(r,o);function t(){this.constructor=r}r.prototype=o===null?Object.create(o):(t.prototype=o.prototype,new t)}var F=function(){return F=Object.assign||function(t){for(var e,n=1,a=arguments.length;n=8){var d=new Date(r);if(vt(d))return d}return null}function As(r,o){if(o===void 0&&(o=H()),!r)return null;var t=r.match(/\b(1\d{3}|2\d{3})\b/);if(!t||!t[1])return null;var e=parseInt(t[1],10),n=r.match(/(?:^|[/\-\s])?(0?[1-9]|1[0-2])(?:[/\-\s]|$)/),a=n&&n[1]?parseInt(n[1],10)-1:o.getMonth();return new Date(e,a,1)}function ne(r){return vt(r)}function Re(r){return r==null?null:ke(r)&&vt(r)?r:null}function U(r,o,t){if(t==="en")return ft(r,o,{useAdditionalWeekYearTokens:!0,useAdditionalDayOfYearTokens:!0});var e=t?et(t):void 0;return t&&!e&&console.warn('A locale object was not found for the provided string ["'.concat(t,'"].')),e=e||et(Rn()),ft(r,o,{locale:e,useAdditionalWeekYearTokens:!0,useAdditionalDayOfYearTokens:!0})}function te(r,o){var t=o.dateFormat,e=o.locale,n=Array.isArray(t)&&t.length>0?t[0]:t;return r&&U(r,n,e)||""}var aa=" - ";function Rs(r,o,t){if(!r&&!o)return"";var e=r?te(r,t):"",n=o?te(o,t):"",a=t.rangeSeparator||aa;return"".concat(e).concat(a).concat(n)}function Ls(r,o){if(!r?.length)return"";var t=r[0]?te(r[0],o):"";if(r.length===1)return t;if(r.length===2&&r[1]){var e=te(r[1],o);return"".concat(t,", ").concat(e)}var n=r.length-1;return"".concat(t," (+").concat(n,")")}function ge(r,o){var t=o.hour,e=t===void 0?0:t,n=o.minute,a=n===void 0?0:n,i=o.second,l=i===void 0?0:i;return Tt(Ot(At(r,l),a),e)}function Is(r){return Aa(r)}function Fs(r,o){return U(r,"ddd",o)}function ut(r){return Sn(r)}function je(r,o,t){var e=et(o||Rn());return Na(r,{locale:e,weekStartsOn:t})}function we(r){return Lr(r)}function pt(r){return Cn(r)}function ir(r){return Pa(r)}function lr(){return Sn(H())}function cr(r){return Or(r)}function Ys(r){return Ma(r)}function Ws(r){return Rr(r)}function ue(r,o){return r&&o?ja(r,o):!r&&!o}function J(r,o){return r&&o?Sa(r,o):!r&&!o}function Kt(r,o){return r&&o?Ea(r,o):!r&&!o}function W(r,o){return r&&o?_a(r,o):!r&&!o}function Le(r,o){return r&&o?ka(r,o):!r&&!o}function Oe(r,o,t){var e,n=Sn(o),a=Or(t);try{e=yt(r,{start:n,end:a})}catch{e=!1}return e}function zs(r,o){var t=An();t.__localeData__||(t.__localeData__={}),t.__localeData__[r]=o}function Rn(){var r=An();return r.__localeId__}function et(r){if(typeof r=="string"){var o=An();return o.__localeData__?o.__localeData__[r]:void 0}else return r}function Bs(r,o,t){return o(U(r,"EEEE",t))}function Hs(r,o){return U(r,"EEEEEE",o)}function Vs(r,o){return U(r,"EEE",o)}function Ln(r,o){return U(se(H(),r),"LLLL",o)}function oa(r,o){return U(se(H(),r),"LLL",o)}function $s(r,o){return U(Ke(H(),r),"QQQ",o)}function ie(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.maxDate,a=t.excludeDates,i=t.excludeDateIntervals,l=t.includeDates,c=t.includeDateIntervals,u=t.filterDate,p=t.disabled;return p?!0:_t(r,{minDate:e,maxDate:n})||a&&a.some(function(d){return d instanceof Date?W(r,d):W(r,d.date)})||i&&i.some(function(d){var m=d.start,f=d.end;return yt(r,{start:m,end:f})})||l&&!l.some(function(d){return W(r,d)})||c&&!c.some(function(d){var m=d.start,f=d.end;return yt(r,{start:m,end:f})})||u&&!u(H(r))||!1}function In(r,o){var t=o===void 0?{}:o,e=t.excludeDates,n=t.excludeDateIntervals;return n&&n.length>0?n.some(function(a){var i=a.start,l=a.end;return yt(r,{start:i,end:l})}):e&&e.some(function(a){var i;return a instanceof Date?W(r,a):W(r,(i=a.date)!==null&&i!==void 0?i:new Date)})||!1}function sa(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.maxDate,a=t.excludeDates,i=t.includeDates,l=t.filterDate;return _t(r,{minDate:e?Lr(e):void 0,maxDate:n?Rr(n):void 0})||a?.some(function(c){return J(r,c instanceof Date?c:c.date)})||i&&!i.some(function(c){return J(r,c)})||l&&!l(H(r))||!1}function Ct(r,o,t,e){var n=Y(r),a=re(r),i=Y(o),l=re(o),c=Y(e);return n===i&&n===c?a<=t&&t<=l:n=t||cn:!1}function Ks(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.maxDate,a=t.excludeDates,i=t.includeDates;return _t(r,{minDate:e,maxDate:n})||a&&a.some(function(l){return J(l instanceof Date?l:l.date,r)})||i&&!i.some(function(l){return J(l,r)})||!1}function Nt(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.maxDate,a=t.excludeDates,i=t.includeDates,l=t.filterDate,c=t.disabled;return c?!0:_t(r,{minDate:e,maxDate:n})||a?.some(function(u){return Kt(r,u instanceof Date?u:u.date)})||i&&!i.some(function(u){return Kt(r,u)})||l&&!l(H(r))||!1}function Mt(r,o,t){if(!o||!t||!vt(o)||!vt(t))return!1;var e=Y(o),n=Y(t);return e<=r&&n>=r}function Lt(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.maxDate,a=t.excludeDates,i=t.includeDates,l=t.filterDate,c=t.disabled;if(c)return!0;var u=new Date(r,0,1);return _t(u,{minDate:e?Cn(e):void 0,maxDate:n?Ar(n):void 0})||a?.some(function(p){return ue(u,p instanceof Date?p:p.date)})||i&&!i.some(function(p){return ue(u,p)})||l&&!l(H(u))||!1}function Et(r,o,t,e){var n=Y(r),a=Ue(r),i=Y(o),l=Ue(o),c=Y(e);return n===i&&n===c?a<=t&&t<=l:n=t||cn:!1}function _t(r,o){var t,e=o===void 0?{}:o,n=e.minDate,a=e.maxDate;return(t=n&&It(r,n)<0||a&&It(r,a)>0)!==null&&t!==void 0?t:!1}function dr(r,o){return o.some(function(t){return G(t)===G(r)&&X(t)===X(r)&&De(t)===De(r)})}function ur(r,o){var t=o===void 0?{}:o,e=t.excludeTimes,n=t.includeTimes,a=t.filterTime;return e&&dr(r,e)||n&&!dr(r,n)||a&&!a(r)||!1}function pr(r,o){var t=o.minTime,e=o.maxTime;if(!t||!e)throw new Error("Both minTime and maxTime props required");var n=H();n=Tt(n,G(r)),n=Ot(n,X(r)),n=At(n,De(r));var a=H();a=Tt(a,G(t)),a=Ot(a,X(t)),a=At(a,De(t));var i=H();i=Tt(i,G(e)),i=Ot(i,X(e)),i=At(i,De(e));var l;try{l=!yt(n,{start:a,end:i})}catch{l=!1}return l}function fr(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.includeDates,a=Fe(r,1);return e&&Ft(e,a)>0||n&&n.every(function(i){return Ft(i,a)>0})||!1}function mr(r,o){var t=o===void 0?{}:o,e=t.maxDate,n=t.includeDates,a=Se(r,1);return e&&Ft(a,e)>0||n&&n.every(function(i){return Ft(a,i)>0})||!1}function Us(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.includeDates,a=Cn(r),i=Ir(a);return e&&Yt(e,i)>0||n&&n.every(function(l){return Yt(l,i)>0})||!1}function Qs(r,o){var t=o===void 0?{}:o,e=t.maxDate,n=t.includeDates,a=Ar(r),i=Fr(a,1);return e&&Yt(i,e)>0||n&&n.every(function(l){return Yt(i,l)>0})||!1}function hr(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.includeDates,a=Ce(r,1);return e&&Wt(e,a)>0||n&&n.every(function(i){return Wt(i,a)>0})||!1}function Zs(r,o){var t=o===void 0?{}:o,e=t.minDate,n=t.yearItemNumber,a=n===void 0?wt:n,i=pt(Ce(r,a)),l=xe(i,a).endPeriod,c=e&&Y(e);return c&&c>l||!1}function vr(r,o){var t=o===void 0?{}:o,e=t.maxDate,n=t.includeDates,a=me(r,1);return e&&Wt(a,e)>0||n&&n.every(function(i){return Wt(a,i)>0})||!1}function qs(r,o){var t=o===void 0?{}:o,e=t.maxDate,n=t.yearItemNumber,a=n===void 0?wt:n,i=me(r,a),l=xe(i,a).startPeriod,c=e&&Y(e);return c&&c=0});return Wn(e)}else return t?Wn(t):o}function la(r){var o=r.maxDate,t=r.includeDates;if(t&&o){var e=t.filter(function(n){return It(n,o)<=0});return zn(e)}else return t?zn(t):o}function yr(r,o){var t;r===void 0&&(r=[]),o===void 0&&(o="react-datepicker__day--highlighted");for(var e=new Map,n=0,a=r.length;n=ai,f=!n&&!t.isWeekInMonth(l);if(m||f)if(t.props.peekNextMonth)i=!0;else break}return e},t.onMonthClick=function(e,n){var a=t.isMonthDisabledForLabelDate(n),i=a.isDisabled,l=a.labelDate;i||t.handleDayClick(we(l),e)},t.onMonthMouseEnter=function(e){var n=t.isMonthDisabledForLabelDate(e),a=n.isDisabled,i=n.labelDate;a||t.handleDayMouseEnter(we(i))},t.handleMonthNavigation=function(e,n){var a,i,l,c;(i=(a=t.props).setPreSelection)===null||i===void 0||i.call(a,n),(c=(l=t.MONTH_REFS[e])===null||l===void 0?void 0:l.current)===null||c===void 0||c.focus()},t.handleKeyboardNavigation=function(e,n,a){var i,l=t.props,c=l.selected,u=l.preSelection,p=l.setPreSelection,d=l.minDate,m=l.maxDate,f=l.showFourColumnMonthYearPicker,h=l.showTwoColumnMonthYearPicker;if(u){var y=br(f,h),g=t.getVerticalOffset(y),k=(i=cn[y])===null||i===void 0?void 0:i.grid,_=function(w,S,N){var A,T,P=S,E=N;switch(w){case M.ArrowRight:P=Se(S,Pt),E=N===11?0:N+Pt;break;case M.ArrowLeft:P=Fe(S,Pt),E=N===0?11:N-Pt;break;case M.ArrowUp:P=Fe(S,g),E=!((A=k?.[0])===null||A===void 0)&&A.includes(N)?N+12-g:N-g;break;case M.ArrowDown:P=Se(S,g),E=!((T=k?.[k.length-1])===null||T===void 0)&&T.includes(N)?N-12+g:N+g;break}return{newCalculatedDate:P,newCalculatedMonth:E}},j=function(w,S,N){for(var A=40,T=w,P=!1,E=0,O=_(T,S,N),L=O.newCalculatedDate,R=O.newCalculatedMonth;!P;){if(E>=A){L=S,R=N;break}if(d&&Lm){T=M.ArrowLeft;var I=_(T,L,R);L=I.newCalculatedDate,R=I.newCalculatedMonth}if(Ks(L,t.props)){var I=_(T,L,R);L=I.newCalculatedDate,R=I.newCalculatedMonth}else P=!0;E++}return{newCalculatedDate:L,newCalculatedMonth:R}};if(n===M.Enter){t.isMonthDisabled(a)||(t.onMonthClick(e,a),p?.(c));return}var C=j(n,u,a),D=C.newCalculatedDate,b=C.newCalculatedMonth;switch(n){case M.ArrowRight:case M.ArrowLeft:case M.ArrowUp:case M.ArrowDown:t.handleMonthNavigation(b,D);break}}},t.getVerticalOffset=function(e){var n,a;return(a=(n=cn[e])===null||n===void 0?void 0:n.verticalNavigationOffset)!==null&&a!==void 0?a:0},t.onMonthKeyDown=function(e,n){var a=t.props,i=a.disabledKeyboardNavigation,l=a.handleOnMonthKeyDown,c=e.key;c!==M.Tab&&e.preventDefault(),i||t.handleKeyboardNavigation(e,c,n),l&&l(e)},t.onQuarterClick=function(e,n){var a=Ke(t.props.day,n);Nt(a,t.props)||t.handleDayClick(ir(a),e)},t.onQuarterMouseEnter=function(e){var n=Ke(t.props.day,e);Nt(n,t.props)||t.handleDayMouseEnter(ir(n))},t.handleQuarterNavigation=function(e,n){var a,i,l,c;t.isDisabled(n)||t.isExcluded(n)||((i=(a=t.props).setPreSelection)===null||i===void 0||i.call(a,n),(c=(l=t.QUARTER_REFS[e-1])===null||l===void 0?void 0:l.current)===null||c===void 0||c.focus())},t.onQuarterKeyDown=function(e,n){var a,i,l=e.key;if(!t.props.disabledKeyboardNavigation)switch(l){case M.Enter:t.onQuarterClick(e,n),(i=(a=t.props).setPreSelection)===null||i===void 0||i.call(a,t.props.selected);break;case M.ArrowRight:if(!t.props.preSelection)break;t.handleQuarterNavigation(n===4?1:n+1,Fr(t.props.preSelection,1));break;case M.ArrowLeft:if(!t.props.preSelection)break;t.handleQuarterNavigation(n===1?4:n-1,Ir(t.props.preSelection));break}},t.isMonthDisabledForLabelDate=function(e){var n,a=t.props,i=a.day,l=a.disabled,c=a.minDate,u=a.maxDate,p=a.excludeDates,d=a.includeDates,m=se(i,e);return l?{isDisabled:!0,labelDate:se(i,e)}:{isDisabled:(n=(c||u||p||d)&&sa(m,t.props))!==null&&n!==void 0?n:!1,labelDate:m}},t.isMonthDisabled=function(e){var n=t.isMonthDisabledForLabelDate(e).isDisabled;return n},t.getMonthClassNames=function(e){var n=t.props,a=n.day,i=n.startDate,l=n.endDate,c=n.preSelection,u=n.monthClassName,p=u?u(se(a,e)):void 0,d=t.getSelection();return Z("react-datepicker__month-text","react-datepicker__month-".concat(e),p,{"react-datepicker__month-text--disabled":t.isMonthDisabled(e),"react-datepicker__month-text--selected":d?t.isSelectMonthInList(a,e,d):void 0,"react-datepicker__month-text--keyboard-selected":!t.props.disabledKeyboardNavigation&&c&&t.isSelectedMonth(a,e,c)&&!t.isMonthSelected()&&!t.isMonthDisabled(e),"react-datepicker__month-text--in-selecting-range":t.isInSelectingRangeMonth(e),"react-datepicker__month-text--in-range":i&&l?Ct(i,l,e,a):void 0,"react-datepicker__month-text--range-start":t.isRangeStartMonth(e),"react-datepicker__month-text--range-end":t.isRangeEndMonth(e),"react-datepicker__month-text--selecting-range-start":t.isSelectingMonthRangeStart(e),"react-datepicker__month-text--selecting-range-end":t.isSelectingMonthRangeEnd(e),"react-datepicker__month-text--today":t.isCurrentMonth(a,e)})},t.getTabIndex=function(e){if(t.props.preSelection==null)return"-1";var n=re(t.props.preSelection),a=t.isMonthDisabledForLabelDate(n).isDisabled,i=e===n&&!(a||t.props.disabledKeyboardNavigation)?"0":"-1";return i},t.getQuarterTabIndex=function(e){if(t.props.preSelection==null)return"-1";var n=Ue(t.props.preSelection),a=Nt(t.props.day,t.props),i=e===n&&!(a||t.props.disabledKeyboardNavigation)?"0":"-1";return i},t.getAriaLabel=function(e){var n=t.props,a=n.chooseDayAriaLabelPrefix,i=a===void 0?"Choose":a,l=n.disabledDayAriaLabelPrefix,c=l===void 0?"Not available":l,u=n.day,p=n.locale,d=se(u,e),m=t.isDisabled(d)||t.isExcluded(d)?c:i;return"".concat(m," ").concat(U(d,"MMMM yyyy",p))},t.getQuarterClassNames=function(e){var n=t.props,a=n.day,i=n.startDate,l=n.endDate,c=n.minDate,u=n.maxDate,p=n.excludeDates,d=n.includeDates,m=n.filterDate,f=n.preSelection,h=n.disabledKeyboardNavigation,y=n.disabled,g=(c||u||p||d||m||y)&&Nt(Ke(a,e),t.props),k=t.getSelection();return Z("react-datepicker__quarter-text","react-datepicker__quarter-".concat(e),{"react-datepicker__quarter-text--disabled":g,"react-datepicker__quarter-text--selected":k?t.isSelectQuarterInList(a,e,k):void 0,"react-datepicker__quarter-text--keyboard-selected":!h&&f&&t.isSelectedQuarter(a,e,f)&&!t.isQuarterSelected()&&!g,"react-datepicker__quarter-text--in-selecting-range":t.isInSelectingRangeQuarter(e),"react-datepicker__quarter-text--in-range":i&&l?Et(i,l,e,a):void 0,"react-datepicker__quarter-text--range-start":t.isRangeStartQuarter(e),"react-datepicker__quarter-text--range-end":t.isRangeEndQuarter(e),"react-datepicker__quarter-text--today":t.isCurrentQuarter(a,e)})},t.getMonthContent=function(e){var n=t.props,a=n.showFullMonthYearPicker,i=n.renderMonthContent,l=n.locale,c=n.day,u=oa(e,l),p=Ln(e,l);return i?i(e,u,p,c):a?p:u},t.getQuarterContent=function(e){var n,a=t.props,i=a.renderQuarterContent,l=a.locale,c=$s(e,l);return(n=i?.(e,c))!==null&&n!==void 0?n:c},t.renderMonths=function(){var e,n=t.props,a=n.showTwoColumnMonthYearPicker,i=n.showFourColumnMonthYearPicker,l=n.day,c=n.selected,u=(e=cn[br(i,a)])===null||e===void 0?void 0:e.grid;return u?.map(function(p,d){return x.createElement("div",{className:"react-datepicker__month-wrapper",key:d},p.map(function(m,f){return x.createElement("div",{ref:t.MONTH_REFS[m],key:f,onClick:function(h){t.onMonthClick(h,m)},onKeyDown:function(h){da(h)&&(h.preventDefault(),h.key=M.Enter),t.onMonthKeyDown(h,m)},onMouseEnter:t.props.usePointerEvent?void 0:function(){return t.onMonthMouseEnter(m)},onPointerEnter:t.props.usePointerEvent?function(){return t.onMonthMouseEnter(m)}:void 0,tabIndex:Number(t.getTabIndex(m)),className:t.getMonthClassNames(m),"aria-disabled":t.isMonthDisabled(m),role:"option","aria-label":t.getAriaLabel(m),"aria-current":t.isCurrentMonth(l,m)?"date":void 0,"aria-selected":c?t.isSelectedMonth(l,m,c):void 0},t.getMonthContent(m))}))})},t.renderQuarters=function(){var e=t.props,n=e.day,a=e.selected,i=[1,2,3,4];return x.createElement("div",{className:"react-datepicker__quarter-wrapper"},i.map(function(l,c){return x.createElement("div",{key:c,ref:t.QUARTER_REFS[c],role:"option",onClick:function(u){t.onQuarterClick(u,l)},onKeyDown:function(u){t.onQuarterKeyDown(u,l)},onMouseEnter:t.props.usePointerEvent?void 0:function(){return t.onQuarterMouseEnter(l)},onPointerEnter:t.props.usePointerEvent?function(){return t.onQuarterMouseEnter(l)}:void 0,className:t.getQuarterClassNames(l),"aria-selected":a?t.isSelectedQuarter(n,l,a):void 0,tabIndex:Number(t.getQuarterTabIndex(l)),"aria-current":t.isCurrentQuarter(n,l)?"date":void 0},t.getQuarterContent(l))}))},t.getClassNames=function(){var e=t.props,n=e.selectingDate,a=e.selectsStart,i=e.selectsEnd,l=e.showMonthYearPicker,c=e.showQuarterYearPicker,u=e.showWeekPicker;return Z("react-datepicker__month",{"react-datepicker__month--selecting-range":n&&(a||i)},{"react-datepicker__monthPicker":l},{"react-datepicker__quarterPicker":c},{"react-datepicker__weekPicker":u})},t}return o.prototype.getSelection=function(){var t=this.props,e=t.selected,n=t.selectedDates,a=t.selectsMultiple;if(a)return n;if(e)return[e]},o.prototype.render=function(){var t=this.props,e=t.showMonthYearPicker,n=t.showQuarterYearPicker,a=t.day,i=t.ariaLabelPrefix,l=i===void 0?"Month ":i,c=l?l.trim()+" ":"",u=ne(a)?"".concat(c).concat(U(a,"MMMM, yyyy",this.props.locale)):"",p=e||n;return p?x.createElement("div",{className:this.getClassNames(),onMouseLeave:this.props.usePointerEvent?void 0:this.handleMouseLeave,onPointerLeave:this.props.usePointerEvent?this.handleMouseLeave:void 0,"aria-label":u,role:"listbox"},e?this.renderMonths():this.renderQuarters()):x.createElement("div",{role:"table"},this.props.dayNamesHeader&&x.createElement("div",{role:"rowgroup"},this.props.dayNamesHeader),this.props.monthHeader&&x.createElement("div",{role:"rowgroup"},this.props.monthHeader),x.createElement("div",{className:this.getClassNames(),onMouseLeave:this.props.usePointerEvent?void 0:this.handleMouseLeave,onPointerLeave:this.props.usePointerEvent?this.handleMouseLeave:void 0,"aria-label":u,role:"rowgroup"},this.renderWeeks()),this.props.monthFooter&&x.createElement("div",{role:"rowgroup"},this.props.monthFooter))},o}(v.Component),si=function(r){q(o,r);function o(){var t=r!==null&&r.apply(this,arguments)||this;return t.monthOptionButtonsRef={},t.isSelectedMonth=function(e){return t.props.month===e},t.handleOptionKeyDown=function(e,n){var a;switch(n.key){case"Enter":n.preventDefault(),t.onChange(e);break;case"Escape":n.preventDefault(),t.props.onCancel();break;case"ArrowUp":case"ArrowDown":{n.preventDefault();var i=(e+(n.key==="ArrowUp"?-1:1)+t.props.monthNames.length)%t.props.monthNames.length;(a=t.monthOptionButtonsRef[i])===null||a===void 0||a.focus();break}}},t.renderOptions=function(){return t.monthOptionButtonsRef={},t.props.monthNames.map(function(e,n){return x.createElement("div",{ref:function(a){t.monthOptionButtonsRef[n]=a,t.isSelectedMonth(n)&&a?.focus()},role:"button",tabIndex:0,className:t.isSelectedMonth(n)?"react-datepicker__month-option react-datepicker__month-option--selected_month":"react-datepicker__month-option",key:e,onClick:t.onChange.bind(t,n),onKeyDown:t.handleOptionKeyDown.bind(t,n),"aria-selected":t.isSelectedMonth(n)?"true":void 0},t.isSelectedMonth(n)?x.createElement("span",{className:"react-datepicker__month-option--selected"},"✓"):"",e)})},t.onChange=function(e){return t.props.onChange(e)},t.handleClickOutside=function(){return t.props.onCancel()},t}return o.prototype.render=function(){return x.createElement(Gt,{className:"react-datepicker__month-dropdown",onClickOutside:this.handleClickOutside},this.renderOptions())},o}(v.Component),ii=function(r){q(o,r);function o(){var t=r!==null&&r.apply(this,arguments)||this;return t.state={dropdownVisible:!1},t.renderSelectOptions=function(e){return e.map(function(n,a){return x.createElement("option",{key:n,value:a},n)})},t.renderSelectMode=function(e){return x.createElement("select",{value:t.props.month,className:"react-datepicker__month-select",onChange:function(n){return t.onChange(parseInt(n.target.value))}},t.renderSelectOptions(e))},t.renderReadView=function(e,n){return x.createElement("button",{key:"read",type:"button",style:{visibility:e?"visible":"hidden"},className:"react-datepicker__month-read-view",onClick:t.toggleDropdown},x.createElement("span",{className:"react-datepicker__month-read-view--down-arrow"}),x.createElement("span",{className:"react-datepicker__month-read-view--selected-month"},n[t.props.month]))},t.renderDropdown=function(e){return x.createElement(si,F({key:"dropdown"},t.props,{monthNames:e,onChange:t.onChange,onCancel:t.toggleDropdown}))},t.renderScrollMode=function(e){var n=t.state.dropdownVisible,a=[t.renderReadView(!n,e)];return n&&a.unshift(t.renderDropdown(e)),a},t.onChange=function(e){t.toggleDropdown(),e!==t.props.month&&t.props.onChange(e)},t.toggleDropdown=function(){return t.setState({dropdownVisible:!t.state.dropdownVisible})},t}return o.prototype.render=function(){var t=this,e=[0,1,2,3,4,5,6,7,8,9,10,11].map(this.props.useShortMonthInDropdown?function(a){return oa(a,t.props.locale)}:function(a){return Ln(a,t.props.locale)}),n;switch(this.props.dropdownMode){case"scroll":n=this.renderScrollMode(e);break;case"select":n=this.renderSelectMode(e);break}return x.createElement("div",{className:"react-datepicker__month-dropdown-container react-datepicker__month-dropdown-container--".concat(this.props.dropdownMode)},n)},o}(v.Component),kr=5;function li(r,o,t){for(var e=[],n=r??Ce(t,kr),a=o??me(t,kr),i=we(n),l=we(a);!be(i,l);)e.push(H(i)),i=Se(i,1);return e}var ci=function(r){q(o,r);function o(t){var e=r.call(this,t)||this;return e.renderOptions=function(){return e.state.monthYearsList.map(function(n){var a=yn(n),i=ue(e.props.date,n)&&J(e.props.date,n);return x.createElement("div",{className:i?"react-datepicker__month-year-option--selected_month-year":"react-datepicker__month-year-option",key:a,onClick:e.onChange.bind(e,a),"aria-selected":i?"true":void 0},i?x.createElement("span",{className:"react-datepicker__month-year-option--selected"},"✓"):"",U(n,e.props.dateFormat,e.props.locale))})},e.onChange=function(n){return e.props.onChange(n)},e.handleClickOutside=function(){e.props.onCancel()},e.state={monthYearsList:li(e.props.minDate,e.props.maxDate,e.props.date)},e}return o.prototype.render=function(){var t=Z({"react-datepicker__month-year-dropdown":!0,"react-datepicker__month-year-dropdown--scrollable":this.props.scrollableMonthYearDropdown});return x.createElement(Gt,{className:t,onClickOutside:this.handleClickOutside},this.renderOptions())},o}(v.Component),wr=5,di=function(r){q(o,r);function o(){var t=r!==null&&r.apply(this,arguments)||this;return t.state={dropdownVisible:!1},t.renderSelectOptions=function(){for(var e,n,a=(e=t.props.minDate)!==null&&e!==void 0?e:Ce(t.props.date,wr),i=(n=t.props.maxDate)!==null&&n!==void 0?n:me(t.props.date,wr),l=we(a),c=we(i),u=[];!be(l,c);){var p=yn(l);u.push(x.createElement("option",{key:p,value:p},U(l,t.props.dateFormat,t.props.locale))),l=Se(l,1)}return u},t.onSelectChange=function(e){t.onChange(parseInt(e.target.value))},t.renderSelectMode=function(){return x.createElement("select",{value:yn(we(t.props.date)),className:"react-datepicker__month-year-select",onChange:t.onSelectChange},t.renderSelectOptions())},t.renderReadView=function(e){var n=U(t.props.date,t.props.dateFormat,t.props.locale);return x.createElement("div",{key:"read",style:{visibility:e?"visible":"hidden"},className:"react-datepicker__month-year-read-view",onClick:t.toggleDropdown},x.createElement("span",{className:"react-datepicker__month-year-read-view--down-arrow"}),x.createElement("span",{className:"react-datepicker__month-year-read-view--selected-month-year"},n))},t.renderDropdown=function(){return x.createElement(ci,F({key:"dropdown"},t.props,{onChange:t.onChange,onCancel:t.toggleDropdown}))},t.renderScrollMode=function(){var e=t.state.dropdownVisible,n=[t.renderReadView(!e)];return e&&n.unshift(t.renderDropdown()),n},t.onChange=function(e){t.toggleDropdown();var n=H(e);ue(t.props.date,n)&&J(t.props.date,n)||t.props.onChange(n)},t.toggleDropdown=function(){return t.setState({dropdownVisible:!t.state.dropdownVisible})},t}return o.prototype.render=function(){var t;switch(this.props.dropdownMode){case"scroll":t=this.renderScrollMode();break;case"select":t=this.renderSelectMode();break}return x.createElement("div",{className:"react-datepicker__month-year-dropdown-container react-datepicker__month-year-dropdown-container--".concat(this.props.dropdownMode)},t)},o}(v.Component),ui=function(r){q(o,r);function o(){var t=r!==null&&r.apply(this,arguments)||this;return t.state={height:null},t.scrollToTheSelectedTime=function(){requestAnimationFrame(function(){var e,n,a;t.list&&(t.list.scrollTop=(a=t.centerLi&&o.calcCenterPosition(t.props.monthRef?t.props.monthRef.clientHeight-((n=(e=t.header)===null||e===void 0?void 0:e.clientHeight)!==null&&n!==void 0?n:0):t.list.clientHeight,t.centerLi))!==null&&a!==void 0?a:0)})},t.handleClick=function(e){var n,a;(t.props.minTime||t.props.maxTime)&&pr(e,t.props)||(t.props.excludeTimes||t.props.includeTimes||t.props.filterTime)&&ur(e,t.props)||(a=(n=t.props).onChange)===null||a===void 0||a.call(n,e)},t.isSelectedTime=function(e){var n=Re(t.props.selected);return n&&ca(n,e)},t.isDisabledTime=function(e){return(t.props.minTime||t.props.maxTime)&&pr(e,t.props)||(t.props.excludeTimes||t.props.includeTimes||t.props.filterTime)&&ur(e,t.props)},t.liClasses=function(e){var n,a=["react-datepicker__time-list-item",t.props.timeClassName?t.props.timeClassName(e):void 0];return t.isSelectedTime(e)&&a.push("react-datepicker__time-list-item--selected"),t.isDisabledTime(e)&&a.push("react-datepicker__time-list-item--disabled"),t.props.injectTimes&&(G(e)*3600+X(e)*60+De(e))%(((n=t.props.intervals)!==null&&n!==void 0?n:o.defaultProps.intervals)*60)!==0&&a.push("react-datepicker__time-list-item--injected"),a.join(" ")},t.handleOnKeyDown=function(e,n){var a,i;e.key===M.Space&&(e.preventDefault(),e.key=M.Enter),(e.key===M.ArrowUp||e.key===M.ArrowLeft)&&e.target instanceof HTMLElement&&e.target.previousSibling&&(e.preventDefault(),e.target.previousSibling instanceof HTMLElement&&e.target.previousSibling.focus()),(e.key===M.ArrowDown||e.key===M.ArrowRight)&&e.target instanceof HTMLElement&&e.target.nextSibling&&(e.preventDefault(),e.target.nextSibling instanceof HTMLElement&&e.target.nextSibling.focus()),e.key===M.Enter&&t.handleClick(n),(i=(a=t.props).handleOnKeyDown)===null||i===void 0||i.call(a,e)},t.renderTimes=function(){for(var e,n=[],a=typeof t.props.format=="string"?t.props.format:"p",i=(e=t.props.intervals)!==null&&e!==void 0?e:o.defaultProps.intervals,l=Re(t.props.selected)||Re(t.props.openToDate)||H(),c=ut(l),u=t.props.injectTimes&&t.props.injectTimes.sort(function(g,k){return g.getTime()-k.getTime()}),p=60*ei(l),d=p/i,m=0;m=m?e.updateFocusOnPaginate(Math.abs(m-(n-f))):(u=(c=e.YEAR_REFS[n-f])===null||c===void 0?void 0:c.current)===null||u===void 0||u.focus())}},e.isSameDay=function(n,a){return W(n,a)},e.isCurrentYear=function(n){return n===Y(H())},e.isRangeStart=function(n){return e.props.startDate&&e.props.endDate&&ue(de(H(),n),e.props.startDate)},e.isRangeEnd=function(n){return e.props.startDate&&e.props.endDate&&ue(de(H(),n),e.props.endDate)},e.isInRange=function(n){return Mt(n,e.props.startDate,e.props.endDate)},e.isInSelectingRange=function(n){var a=e.props,i=a.selectsStart,l=a.selectsEnd,c=a.selectsRange,u=a.startDate,p=a.endDate;return!(i||l||c)||!e.selectingDate()?!1:i&&p?Mt(n,e.selectingDate(),p):l&&u||c&&u&&!p?Mt(n,u,e.selectingDate()):!1},e.isSelectingRangeStart=function(n){var a;if(!e.isInSelectingRange(n))return!1;var i=e.props,l=i.startDate,c=i.selectsStart,u=de(H(),n);return c?ue(u,(a=e.selectingDate())!==null&&a!==void 0?a:null):ue(u,l??null)},e.isSelectingRangeEnd=function(n){var a;if(!e.isInSelectingRange(n))return!1;var i=e.props,l=i.endDate,c=i.selectsEnd,u=i.selectsRange,p=de(H(),n);return c||u?ue(p,(a=e.selectingDate())!==null&&a!==void 0?a:null):ue(p,l??null)},e.isKeyboardSelected=function(n){if(!(e.props.disabledKeyboardNavigation||e.props.date===void 0||e.props.preSelection==null)){var a=e.props,i=a.minDate,l=a.maxDate,c=a.excludeDates,u=a.includeDates,p=a.filterDate,d=a.selected,m=pt(de(e.props.date,n)),f=(i||l||c||u||p)&&Lt(n,e.props),h=!!d&&W(m,pt(d)),y=W(m,pt(e.props.preSelection));return!e.props.inline&&!h&&y&&!f}},e.isSelectedYear=function(n){var a=e.props,i=a.selectsMultiple,l=a.selected,c=a.selectedDates;return i?c?.some(function(u){return n===Y(u)}):!!l&&n===Y(l)},e.onYearClick=function(n,a){var i=e.props.date;i!==void 0&&e.handleYearClick(pt(de(i,a)),n)},e.onYearKeyDown=function(n,a){var i,l,c=n.key,u=e.props,p=u.date,d=u.yearItemNumber,m=u.handleOnKeyDown;if(c!==M.Tab&&n.preventDefault(),!e.props.disabledKeyboardNavigation)switch(c){case M.Enter:if(e.props.selected==null)break;e.onYearClick(n,a),(l=(i=e.props).setPreSelection)===null||l===void 0||l.call(i,e.props.selected);break;case M.ArrowRight:if(e.props.preSelection==null)break;e.handleYearNavigation(a+1,me(e.props.preSelection,1));break;case M.ArrowLeft:if(e.props.preSelection==null)break;e.handleYearNavigation(a-1,Ce(e.props.preSelection,1));break;case M.ArrowUp:{if(p===void 0||d===void 0||e.props.preSelection==null)break;var f=xe(p,d).startPeriod,h=_r,y=a-h;if(y=f&&ak){var g=d%h;a<=k&&a>k-g?h=g:h+=g,y=a+h}e.handleYearNavigation(y,me(e.props.preSelection,h));break}}m&&m(n)},e.getYearClassNames=function(n){var a=e.props,i=a.date,l=a.disabled,c=a.minDate,u=a.maxDate,p=a.excludeDates,d=a.includeDates,m=a.filterDate,f=a.yearClassName;return Z("react-datepicker__year-text","react-datepicker__year-".concat(n),i?f?.(de(i,n)):void 0,{"react-datepicker__year-text--selected":e.isSelectedYear(n),"react-datepicker__year-text--disabled":(c||u||p||d||m||l)&&Lt(n,e.props),"react-datepicker__year-text--keyboard-selected":e.isKeyboardSelected(n),"react-datepicker__year-text--range-start":e.isRangeStart(n),"react-datepicker__year-text--range-end":e.isRangeEnd(n),"react-datepicker__year-text--in-range":e.isInRange(n),"react-datepicker__year-text--in-selecting-range":e.isInSelectingRange(n),"react-datepicker__year-text--selecting-range-start":e.isSelectingRangeStart(n),"react-datepicker__year-text--selecting-range-end":e.isSelectingRangeEnd(n),"react-datepicker__year-text--today":e.isCurrentYear(n)})},e.getYearTabIndex=function(n){if(e.props.disabledKeyboardNavigation||e.props.preSelection==null)return"-1";var a=Y(e.props.preSelection),i=Lt(n,e.props);return n===a&&!i?"0":"-1"},e.getYearContent=function(n){return e.props.renderYearContent?e.props.renderYearContent(n):n},e}return o.prototype.render=function(){var t=this,e=[],n=this.props,a=n.date,i=n.yearItemNumber,l=n.onYearMouseEnter,c=n.onYearMouseLeave;if(a===void 0)return null;for(var u=xe(a,i),p=u.startPeriod,d=u.endPeriod,m=function(y){e.push(x.createElement("div",{ref:f.YEAR_REFS[y-p],onClick:function(g){t.onYearClick(g,y)},onKeyDown:function(g){da(g)&&(g.preventDefault(),g.key=M.Enter),t.onYearKeyDown(g,y)},tabIndex:Number(f.getYearTabIndex(y)),className:f.getYearClassNames(y),onMouseEnter:f.props.usePointerEvent?void 0:function(g){return l(g,y)},onPointerEnter:f.props.usePointerEvent?function(g){return l(g,y)}:void 0,onMouseLeave:f.props.usePointerEvent?void 0:function(g){return c(g,y)},onPointerLeave:f.props.usePointerEvent?function(g){return c(g,y)}:void 0,key:y,"aria-current":f.isCurrentYear(y)?"date":void 0},f.getYearContent(y)))},f=this,h=p;h<=d;h++)m(h);return x.createElement("div",{className:"react-datepicker__year"},x.createElement("div",{className:"react-datepicker__year-wrapper",onMouseLeave:this.props.usePointerEvent?void 0:this.props.clearSelectingDate,onPointerLeave:this.props.usePointerEvent?this.props.clearSelectingDate:void 0},e))},o}(v.Component);function fi(r,o,t,e){for(var n=[],a=0;a<2*o+1;a++){var i=r+o-a,l=!0;t&&(l=Y(t)<=i),e&&l&&(l=Y(e)>=i),l&&n.push(i)}return n}var mi=function(r){q(o,r);function o(t){var e=r.call(this,t)||this;e.yearOptionButtonsRef={},e.handleOptionKeyDown=function(l,c){var u;switch(c.key){case"Enter":c.preventDefault(),e.onChange(l);break;case"Escape":c.preventDefault(),e.props.onCancel();break;case"ArrowUp":case"ArrowDown":{c.preventDefault();var p=l+(c.key==="ArrowUp"?1:-1);e.yearOptionButtonsRef[p]&&((u=e.yearOptionButtonsRef[p])===null||u===void 0||u.focus());break}}},e.renderOptions=function(){e.yearOptionButtonsRef={};var l=e.props.year,c=e.state.yearsList.map(function(d){return x.createElement("div",{ref:function(m){e.yearOptionButtonsRef[d]=m,d===l&&m?.focus()},role:"button",tabIndex:0,className:l===d?"react-datepicker__year-option react-datepicker__year-option--selected_year":"react-datepicker__year-option",key:d,onClick:e.onChange.bind(e,d),onKeyDown:e.handleOptionKeyDown.bind(e,d),"aria-selected":l===d?"true":void 0},l===d?x.createElement("span",{className:"react-datepicker__year-option--selected"},"✓"):"",d)}),u=e.props.minDate?Y(e.props.minDate):null,p=e.props.maxDate?Y(e.props.maxDate):null;return(!p||!e.state.yearsList.find(function(d){return d===p}))&&c.unshift(x.createElement("div",{className:"react-datepicker__year-option",key:"upcoming",onClick:e.incrementYears},x.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-upcoming"}))),(!u||!e.state.yearsList.find(function(d){return d===u}))&&c.push(x.createElement("div",{className:"react-datepicker__year-option",key:"previous",onClick:e.decrementYears},x.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-previous"}))),c},e.onChange=function(l){e.props.onChange(l)},e.handleClickOutside=function(){e.props.onCancel()},e.shiftYears=function(l){var c=e.state.yearsList.map(function(u){return u+l});e.setState({yearsList:c})},e.incrementYears=function(){return e.shiftYears(1)},e.decrementYears=function(){return e.shiftYears(-1)};var n=t.yearDropdownItemNumber,a=t.scrollableYearDropdown,i=n||(a?10:5);return e.state={yearsList:fi(e.props.year,i,e.props.minDate,e.props.maxDate)},e.dropdownRef=v.createRef(),e}return o.prototype.componentDidMount=function(){var t=this.dropdownRef.current;if(t){var e=t.children?Array.from(t.children):null,n=e?e.find(function(a){return a.ariaSelected}):null;t.scrollTop=n&&n instanceof HTMLElement?n.offsetTop+(n.clientHeight-t.clientHeight)/2:(t.scrollHeight-t.clientHeight)/2}},o.prototype.render=function(){var t=Z({"react-datepicker__year-dropdown":!0,"react-datepicker__year-dropdown--scrollable":this.props.scrollableYearDropdown});return x.createElement(Gt,{className:t,containerRef:this.dropdownRef,onClickOutside:this.handleClickOutside},this.renderOptions())},o}(v.Component),hi=function(r){q(o,r);function o(){var t=r!==null&&r.apply(this,arguments)||this;return t.state={dropdownVisible:!1},t.renderSelectOptions=function(){for(var e=t.props.minDate?Y(t.props.minDate):1900,n=t.props.maxDate?Y(t.props.maxDate):2100,a=[],i=e;i<=n;i++)a.push(x.createElement("option",{key:i,value:i},i));return a},t.onSelectChange=function(e){t.onChange(parseInt(e.target.value))},t.renderSelectMode=function(){return x.createElement("select",{value:t.props.year,className:"react-datepicker__year-select",onChange:t.onSelectChange},t.renderSelectOptions())},t.renderReadView=function(e){return x.createElement("button",{key:"read",type:"button",style:{visibility:e?"visible":"hidden"},className:"react-datepicker__year-read-view",onClick:t.toggleDropdown},x.createElement("span",{className:"react-datepicker__year-read-view--down-arrow"}),x.createElement("span",{className:"react-datepicker__year-read-view--selected-year"},t.props.year))},t.renderDropdown=function(){return x.createElement(mi,F({key:"dropdown"},t.props,{onChange:t.onChange,onCancel:t.toggleDropdown}))},t.renderScrollMode=function(){var e=t.state.dropdownVisible,n=[t.renderReadView(!e)];return e&&n.unshift(t.renderDropdown()),n},t.onChange=function(e){t.toggleDropdown(),e!==t.props.year&&t.props.onChange(e)},t.toggleDropdown=function(e){t.setState({dropdownVisible:!t.state.dropdownVisible},function(){t.props.adjustDateOnChange&&t.handleYearChange(t.props.date,e)})},t.handleYearChange=function(e,n){var a;(a=t.onSelect)===null||a===void 0||a.call(t,e,n),t.setOpen()},t.onSelect=function(e,n){var a,i;(i=(a=t.props).onSelect)===null||i===void 0||i.call(a,e,n)},t.setOpen=function(){var e,n;(n=(e=t.props).setOpen)===null||n===void 0||n.call(e,!0)},t}return o.prototype.render=function(){var t;switch(this.props.dropdownMode){case"scroll":t=this.renderScrollMode();break;case"select":t=this.renderSelectMode();break}return x.createElement("div",{className:"react-datepicker__year-dropdown-container react-datepicker__year-dropdown-container--".concat(this.props.dropdownMode)},t)},o}(v.Component),vi=["react-datepicker__year-select","react-datepicker__month-select","react-datepicker__month-year-select"],ua="react-datepicker-ignore-onclickoutside",yi=function(r){var o=(r.className||"").split(/\s+/);return vi.some(function(t){return o.indexOf(t)>=0})},gi=function(r){q(o,r);function o(t){var e=r.call(this,t)||this;return e.monthContainer=void 0,e.handleClickOutside=function(n){e.props.onClickOutside(n)},e.setClickOutsideRef=function(){return e.containerRef.current},e.handleDropdownFocus=function(n){var a,i;yi(n.target)&&((i=(a=e.props).onDropdownFocus)===null||i===void 0||i.call(a,n))},e.getDateInView=function(){var n=e.props,a=n.preSelection,i=n.selected,l=n.openToDate,c=ia(e.props),u=la(e.props),p=H(),d=l||i||a;return d||(c&&pe(p,c)?c:u&&be(p,u)?u:p)},e.increaseMonth=function(){e.setState(function(n){var a=n.date;return{date:Se(a,1)}},function(){return e.handleMonthChange(e.state.date)})},e.decreaseMonth=function(){e.setState(function(n){var a=n.date;return{date:Fe(a,1)}},function(){return e.handleMonthChange(e.state.date)})},e.handleDayClick=function(n,a,i){e.props.onSelect(n,a,i),e.props.setPreSelection&&e.props.setPreSelection(n)},e.handleDayMouseEnter=function(n){e.setState({selectingDate:n}),e.props.onDayMouseEnter&&e.props.onDayMouseEnter(n)},e.handleMonthMouseLeave=function(){e.setState({selectingDate:void 0}),e.props.onMonthMouseLeave&&e.props.onMonthMouseLeave()},e.handleYearMouseEnter=function(n,a){e.setState({selectingDate:de(H(),a)}),e.props.onYearMouseEnter&&e.props.onYearMouseEnter(n,a)},e.handleYearMouseLeave=function(n,a){e.props.onYearMouseLeave&&e.props.onYearMouseLeave(n,a)},e.handleYearChange=function(n){var a,i,l,c;(i=(a=e.props).onYearChange)===null||i===void 0||i.call(a,n),e.setState({isRenderAriaLiveMessage:!0}),e.props.adjustDateOnChange&&(e.props.onSelect(n),(c=(l=e.props).setOpen)===null||c===void 0||c.call(l,!0)),e.props.setPreSelection&&e.props.setPreSelection(n)},e.getEnabledPreSelectionDateForMonth=function(n){if(!ie(n,e.props))return n;for(var a=we(n),i=Ws(n),l=Da(i,a),c=null,u=0;u<=l;u++){var p=Ye(a,u);if(!ie(p,e.props)){c=p;break}}return c},e.handleMonthChange=function(n){var a,i,l,c=(a=e.getEnabledPreSelectionDateForMonth(n))!==null&&a!==void 0?a:n;e.handleCustomMonthChange(c),e.props.adjustDateOnChange&&(e.props.onSelect(c),(l=(i=e.props).setOpen)===null||l===void 0||l.call(i,!0)),e.props.setPreSelection&&e.props.setPreSelection(c)},e.handleCustomMonthChange=function(n){var a,i;(i=(a=e.props).onMonthChange)===null||i===void 0||i.call(a,n),e.setState({isRenderAriaLiveMessage:!0})},e.handleMonthYearChange=function(n){e.handleYearChange(n),e.handleMonthChange(n)},e.changeYear=function(n){e.setState(function(a){var i=a.date;return{date:de(i,Number(n))}},function(){return e.handleYearChange(e.state.date)})},e.changeMonth=function(n){e.setState(function(a){var i=a.date;return{date:se(i,Number(n))}},function(){var a,i;e.handleMonthChange(e.state.date),(i=(a=e.props).onMonthSelectedInChange)===null||i===void 0||i.call(a,0)})},e.changeMonthYear=function(n){e.setState(function(a){var i=a.date;return{date:de(se(i,re(n)),Y(n))}},function(){return e.handleMonthYearChange(e.state.date)})},e.header=function(n,a){if(n===void 0&&(n=e.state.date),a===void 0&&(a=0),!ne(n))return[];var i=e.props.disabled,l=je(n,e.props.locale,e.props.calendarStartDay),c=[];return e.props.showWeekNumbers&&c.push(x.createElement("div",{key:"W",className:"react-datepicker__day-name ".concat(i?"react-datepicker__day-name--disabled":""),role:"columnheader"},x.createElement("span",{className:"react-datepicker__sr-only"},"Week number"),x.createElement("span",{"aria-hidden":"true"},e.props.weekLabel||"#"))),c.concat([0,1,2,3,4,5,6].map(function(u){var p=Ye(l,u),d=e.formatWeekday(p,e.props.locale),m=U(p,"EEEE",e.props.locale),f=e.props.weekDayClassName?e.props.weekDayClassName(p):void 0;if(e.props.renderCustomDayName){var h=e.props.renderCustomDayName({day:p,shortName:d,fullName:m,locale:e.props.locale,customDayNameCount:a});return x.createElement("div",{key:u,role:"columnheader",className:Z("react-datepicker__day-name",f,i?"react-datepicker__day-name--disabled":"")},h)}return x.createElement("div",{key:u,role:"columnheader",className:Z("react-datepicker__day-name",f,i?"react-datepicker__day-name--disabled":"")},x.createElement("span",{className:"react-datepicker__sr-only"},m),x.createElement("span",{"aria-hidden":"true"},d))}))},e.formatWeekday=function(n,a){return e.props.formatWeekDay?Bs(n,e.props.formatWeekDay,a):e.props.useWeekdaysShort?Vs(n,a):Hs(n,a)},e.decreaseYear=function(){e.setState(function(n){var a,i=n.date;return{date:Ce(i,e.props.showYearPicker?(a=e.props.yearItemNumber)!==null&&a!==void 0?a:o.defaultProps.yearItemNumber:1)}},function(){return e.handleYearChange(e.state.date)})},e.clearSelectingDate=function(){e.setState({selectingDate:void 0})},e.renderPreviousButton=function(){var n,a,i;if(!e.props.renderCustomHeader){var l=(n=e.props.monthsShown)!==null&&n!==void 0?n:o.defaultProps.monthsShown,c=e.props.showPreviousMonths?l-1:0,u=(a=e.props.monthSelectedIn)!==null&&a!==void 0?a:c,p=Fe(e.state.date,u),d;switch(!0){case e.props.disabled:d=!0;break;case e.props.showMonthYearPicker:d=hr(e.state.date,e.props);break;case e.props.showYearPicker:d=Zs(e.state.date,e.props);break;case e.props.showQuarterYearPicker:d=Us(e.state.date,e.props);break;default:d=fr(p,e.props);break}if(!(!((i=e.props.forceShowMonthNavigation)!==null&&i!==void 0?i:o.defaultProps.forceShowMonthNavigation)&&!e.props.showDisabledMonthNavigation&&d||e.props.showTimeSelectOnly)){var m=["react-datepicker__navigation-icon","react-datepicker__navigation-icon--previous"],f=["react-datepicker__navigation","react-datepicker__navigation--previous"],h=e.decreaseMonth;(e.props.showMonthYearPicker||e.props.showQuarterYearPicker||e.props.showYearPicker)&&(h=e.decreaseYear),d&&e.props.showDisabledMonthNavigation&&(f.push("react-datepicker__navigation--previous--disabled"),h=void 0);var y=e.props.showMonthYearPicker||e.props.showQuarterYearPicker||e.props.showYearPicker,g=e.props,k=g.previousMonthButtonLabel,_=k===void 0?o.defaultProps.previousMonthButtonLabel:k,j=g.previousYearButtonLabel,C=j===void 0?o.defaultProps.previousYearButtonLabel:j,D=e.props,b=D.previousMonthAriaLabel,w=b===void 0?typeof _=="string"?_:"Previous Month":b,S=D.previousYearAriaLabel,N=S===void 0?typeof C=="string"?C:"Previous Year":S;return x.createElement("button",{type:"button",className:f.join(" "),onClick:h,onKeyDown:e.props.handleOnKeyDown,"aria-label":y?N:w},x.createElement("span",{className:m.join(" ")},y?C:_))}}},e.increaseYear=function(){e.setState(function(n){var a,i=n.date;return{date:me(i,e.props.showYearPicker?(a=e.props.yearItemNumber)!==null&&a!==void 0?a:o.defaultProps.yearItemNumber:1)}},function(){return e.handleYearChange(e.state.date)})},e.renderNextButton=function(){var n;if(!e.props.renderCustomHeader){var a;switch(!0){case e.props.disabled:a=!0;break;case e.props.showMonthYearPicker:a=vr(e.state.date,e.props);break;case e.props.showYearPicker:a=qs(e.state.date,e.props);break;case e.props.showQuarterYearPicker:a=Qs(e.state.date,e.props);break;default:a=mr(e.state.date,e.props);break}if(!(!((n=e.props.forceShowMonthNavigation)!==null&&n!==void 0?n:o.defaultProps.forceShowMonthNavigation)&&!e.props.showDisabledMonthNavigation&&a||e.props.showTimeSelectOnly)){var i=["react-datepicker__navigation","react-datepicker__navigation--next"],l=["react-datepicker__navigation-icon","react-datepicker__navigation-icon--next"];e.props.showTimeSelect&&i.push("react-datepicker__navigation--next--with-time"),e.props.todayButton&&i.push("react-datepicker__navigation--next--with-today-button");var c=e.increaseMonth;(e.props.showMonthYearPicker||e.props.showQuarterYearPicker||e.props.showYearPicker)&&(c=e.increaseYear),a&&e.props.showDisabledMonthNavigation&&(i.push("react-datepicker__navigation--next--disabled"),c=void 0);var u=e.props.showMonthYearPicker||e.props.showQuarterYearPicker||e.props.showYearPicker,p=e.props,d=p.nextMonthButtonLabel,m=d===void 0?o.defaultProps.nextMonthButtonLabel:d,f=p.nextYearButtonLabel,h=f===void 0?o.defaultProps.nextYearButtonLabel:f,y=e.props,g=y.nextMonthAriaLabel,k=g===void 0?typeof m=="string"?m:"Next Month":g,_=y.nextYearAriaLabel,j=_===void 0?typeof h=="string"?h:"Next Year":_;return x.createElement("button",{type:"button",className:i.join(" "),onClick:c,onKeyDown:e.props.handleOnKeyDown,"aria-label":u?j:k},x.createElement("span",{className:l.join(" ")},u?h:m))}}},e.renderCurrentMonth=function(n){n===void 0&&(n=e.state.date);var a=["react-datepicker__current-month"];return e.props.showYearDropdown&&a.push("react-datepicker__current-month--hasYearDropdown"),e.props.showMonthDropdown&&a.push("react-datepicker__current-month--hasMonthDropdown"),e.props.showMonthYearDropdown&&a.push("react-datepicker__current-month--hasMonthYearDropdown"),x.createElement("h2",{className:a.join(" ")},ne(n)?U(n,e.props.dateFormat,e.props.locale):"")},e.renderYearDropdown=function(n){if(n===void 0&&(n=!1),!(!e.props.showYearDropdown||n))return x.createElement(hi,F({},o.defaultProps,e.props,{date:e.state.date,onChange:e.changeYear,year:Y(e.state.date)}))},e.renderMonthDropdown=function(n){if(n===void 0&&(n=!1),!(!e.props.showMonthDropdown||n))return x.createElement(ii,F({},o.defaultProps,e.props,{month:re(e.state.date),onChange:e.changeMonth}))},e.renderMonthYearDropdown=function(n){if(n===void 0&&(n=!1),!(!e.props.showMonthYearDropdown||n))return x.createElement(di,F({},o.defaultProps,e.props,{date:e.state.date,onChange:e.changeMonthYear}))},e.handleTodayButtonClick=function(n){e.props.onSelect(lr(),n),e.props.setPreSelection&&e.props.setPreSelection(lr())},e.renderTodayButton=function(){if(!(!e.props.todayButton||e.props.showTimeSelectOnly))return x.createElement("div",{className:"react-datepicker__today-button",onClick:e.handleTodayButtonClick},e.props.todayButton)},e.renderDayNamesHeader=function(n,a){return a===void 0&&(a=0),x.createElement("div",{className:"react-datepicker__day-names",role:"row"},e.header(n,a))},e.renderDefaultHeader=function(n){var a=n.monthDate,i=n.i,l=x.createElement("div",{className:Z("react-datepicker__header",{"react-datepicker__header--has-time-select":e.props.showTimeSelect,"react-datepicker__header--middle":e.props.monthHeaderPosition==="middle","react-datepicker__header--bottom":e.props.monthHeaderPosition==="bottom"})},e.renderCurrentMonth(a),x.createElement("div",{className:"react-datepicker__header__dropdown react-datepicker__header__dropdown--".concat(e.props.dropdownMode),onFocus:e.handleDropdownFocus},e.renderMonthDropdown(i!==0),e.renderMonthYearDropdown(i!==0),e.renderYearDropdown(i!==0)));return e.props.monthHeaderPosition==="top"?l:x.createElement("div",{className:"react-datepicker__header-wrapper"},e.renderPreviousButton()||null,e.renderNextButton()||null,l)},e.renderCustomHeader=function(n){var a,i,l=n.monthDate,c=n.i;if(e.props.showTimeSelect&&!e.state.monthContainer||e.props.showTimeSelectOnly)return null;var u=e.props,p=u.showYearPicker,d=u.yearItemNumber,m;if(p){var f=xe(l,d),h=f.startPeriod,y=f.endPeriod;m={startYear:h,endYear:y}}var g=fr(e.state.date,e.props),k=mr(e.state.date,e.props),_=hr(e.state.date,e.props),j=vr(e.state.date,e.props);return x.createElement("div",{className:"react-datepicker__header react-datepicker__header--custom",onFocus:e.props.onDropdownFocus},(i=(a=e.props).renderCustomHeader)===null||i===void 0?void 0:i.call(a,F(F(F({},e.state),p&&{visibleYearsRange:m}),{customHeaderCount:c,monthDate:l,changeMonth:e.changeMonth,changeYear:e.changeYear,decreaseMonth:e.decreaseMonth,increaseMonth:e.increaseMonth,decreaseYear:e.decreaseYear,increaseYear:e.increaseYear,prevMonthButtonDisabled:g,nextMonthButtonDisabled:k,prevYearButtonDisabled:_,nextYearButtonDisabled:j})))},e.renderYearHeader=function(n){var a=n.monthDate,i=e.props,l=i.showYearPicker,c=i.yearItemNumber,u=c===void 0?o.defaultProps.yearItemNumber:c,p=xe(a,u),d=p.startPeriod,m=p.endPeriod;return x.createElement("div",{className:"react-datepicker__header react-datepicker-year-header"},l?"".concat(d," - ").concat(m):Y(a))},e.renderHeader=function(n){var a=n.monthDate,i=n.i,l=i===void 0?0:i,c={monthDate:a,i:l};switch(!0){case e.props.renderCustomHeader!==void 0:return e.renderCustomHeader(c);case(e.props.showMonthYearPicker||e.props.showQuarterYearPicker||e.props.showYearPicker):return e.renderYearHeader(c);default:return e.renderDefaultHeader(c)}},e.renderMonths=function(){var n,a;if(!(e.props.showTimeSelectOnly||e.props.showYearPicker)){for(var i=[],l=(n=e.props.monthsShown)!==null&&n!==void 0?n:o.defaultProps.monthsShown,c=e.props.showPreviousMonths?l-1:0,u=e.props.showMonthYearPicker||e.props.showQuarterYearPicker?me(e.state.date,c):Fe(e.state.date,c),p=(a=e.props.monthSelectedIn)!==null&&a!==void 0?a:c,d=0;d0;i.push(x.createElement("div",{key:h,ref:function(k){e.monthContainer=k??void 0},className:"react-datepicker__month-container"},e.props.monthHeaderPosition==="top"&&e.renderHeader({monthDate:f,i:d}),x.createElement(oi,F({},o.defaultProps,e.props,{containerRef:e.containerRef,ariaLabelPrefix:e.props.monthAriaLabelPrefix,day:f,onDayClick:e.handleDayClick,handleOnKeyDown:e.props.handleOnDayKeyDown,handleOnMonthKeyDown:e.props.handleOnKeyDown,onDayMouseEnter:e.handleDayMouseEnter,onMouseLeave:e.handleMonthMouseLeave,orderInDisplay:d,selectingDate:e.state.selectingDate,monthShowsDuplicateDaysEnd:y,monthShowsDuplicateDaysStart:g,dayNamesHeader:e.renderDayNamesHeader(f,d),monthHeader:e.props.monthHeaderPosition==="middle"?e.renderHeader({monthDate:f,i:d}):void 0,monthFooter:e.props.monthHeaderPosition==="bottom"?e.renderHeader({monthDate:f,i:d}):void 0}))))}return i}},e.renderYears=function(){if(!e.props.showTimeSelectOnly&&e.props.showYearPicker)return x.createElement("div",{className:"react-datepicker__year--container"},e.renderHeader({monthDate:e.state.date}),x.createElement(pi,F({},o.defaultProps,e.props,{selectingDate:e.state.selectingDate,date:e.state.date,onDayClick:e.handleDayClick,clearSelectingDate:e.clearSelectingDate,onYearMouseEnter:e.handleYearMouseEnter,onYearMouseLeave:e.handleYearMouseLeave})))},e.renderTimeSection=function(){if(e.props.showTimeSelect&&(e.state.monthContainer||e.props.showTimeSelectOnly))return x.createElement(ui,F({},o.defaultProps,e.props,{onChange:e.props.onTimeChange,format:e.props.timeFormat,intervals:e.props.timeIntervals,monthRef:e.state.monthContainer}))},e.renderInputTimeSection=function(){var n,a;if(e.props.showTimeInput){if(e.props.selectsRange){var i=e.props,l=i.startDate,c=i.endDate,u=l?new Date(l):void 0,p=u&&ne(u)&&!!l,d=p?"".concat(Ve(u.getHours()),":").concat(Ve(u.getMinutes())):"",m=c?new Date(c):void 0,f=m&&ne(m)&&!!c,h=f?"".concat(Ve(m.getHours()),":").concat(Ve(m.getMinutes())):"";return x.createElement(x.Fragment,null,x.createElement(ln,F({},o.defaultProps,e.props,{date:u,timeString:d,onChange:function(_){var j,C;(C=(j=e.props).onTimeChange)===null||C===void 0||C.call(j,_,"start")},timeInputLabel:((n=e.props.timeInputLabel)!==null&&n!==void 0?n:"Time")+" (Start)"})),x.createElement(ln,F({},o.defaultProps,e.props,{date:m,timeString:h,onChange:function(_){var j,C;(C=(j=e.props).onTimeChange)===null||C===void 0||C.call(j,_,"end")},timeInputLabel:((a=e.props.timeInputLabel)!==null&&a!==void 0?a:"Time")+" (End)"})))}var y=e.props.selected?new Date(e.props.selected):void 0,g=y&&ne(y)&&!!e.props.selected,k=g?"".concat(Ve(y.getHours()),":").concat(Ve(y.getMinutes())):"";return x.createElement(ln,F({},o.defaultProps,e.props,{date:y,timeString:k,onChange:function(_){var j,C;(C=(j=e.props).onTimeChange)===null||C===void 0||C.call(j,_)}}))}},e.renderAriaLiveRegion=function(){var n;if(!ne(e.state.date))return x.createElement("span",{role:"alert","aria-live":"polite",className:"react-datepicker__aria-live"});var a=xe(e.state.date,(n=e.props.yearItemNumber)!==null&&n!==void 0?n:o.defaultProps.yearItemNumber),i=a.startPeriod,l=a.endPeriod,c;return e.props.showYearPicker?c="".concat(i," - ").concat(l):e.props.showMonthYearPicker||e.props.showQuarterYearPicker?c=Y(e.state.date):c="".concat(Ln(re(e.state.date),e.props.locale)," ").concat(Y(e.state.date)),x.createElement("span",{role:"alert","aria-live":"polite",className:"react-datepicker__aria-live"},e.state.isRenderAriaLiveMessage&&c)},e.renderChildren=function(){if(e.props.children)return x.createElement("div",{className:"react-datepicker__children-container"},e.props.children)},e.containerRef=v.createRef(),e.state={date:e.getDateInView(),selectingDate:void 0,monthContainer:void 0,isRenderAriaLiveMessage:!1},e}return Object.defineProperty(o,"defaultProps",{get:function(){return{monthsShown:1,forceShowMonthNavigation:!1,outsideClickIgnoreClass:ua,timeCaption:"Time",previousYearButtonLabel:"Previous Year",nextYearButtonLabel:"Next Year",previousMonthButtonLabel:"Previous Month",nextMonthButtonLabel:"Next Month",yearItemNumber:wt,monthHeaderPosition:"top"}},enumerable:!1,configurable:!0}),o.prototype.componentDidMount=function(){var t=this;this.props.showTimeSelect&&(this.assignMonthContainer=function(){t.setState({monthContainer:t.monthContainer})}())},o.prototype.componentDidUpdate=function(t){var e=this;if(this.props.preSelection&&ne(this.props.preSelection)&&(!W(this.props.preSelection,t.preSelection)||this.props.monthSelectedIn!==t.monthSelectedIn)){var n=!J(this.state.date,this.props.preSelection);this.setState({date:this.props.preSelection},function(){return n&&e.handleCustomMonthChange(e.state.date)})}else this.props.openToDate&&!W(this.props.openToDate,t.openToDate)&&this.setState({date:this.props.openToDate})},o.prototype.render=function(){var t=this.props.container||Ts;return x.createElement(Gt,{onClickOutside:this.handleClickOutside,style:{display:"contents"},ignoreClass:this.props.outsideClickIgnoreClass},x.createElement("div",{style:{display:"contents"},ref:this.containerRef},x.createElement(t,{className:Z("react-datepicker",this.props.className,{"react-datepicker--time-only":this.props.showTimeSelectOnly}),showTime:this.props.showTimeSelect||this.props.showTimeInput,showTimeSelectOnly:this.props.showTimeSelectOnly,inline:this.props.inline},this.renderAriaLiveRegion(),this.props.monthHeaderPosition==="top"&&this.renderPreviousButton(),this.props.monthHeaderPosition==="top"&&this.renderNextButton(),this.renderMonths(),this.renderYears(),this.renderTodayButton(),this.renderTimeSection(),this.renderInputTimeSection(),this.renderChildren())))},o}(v.Component),xi=function(r){var o=r.icon,t=r.className,e=t===void 0?"":t,n=r.onClick,a="react-datepicker__calendar-icon";if(typeof o=="string")return x.createElement("i",{className:"".concat(a," ").concat(o," ").concat(e),"aria-hidden":"true",onClick:n});if(x.isValidElement(o)){var i=o;return x.cloneElement(i,{className:"".concat(i.props.className||""," ").concat(a," ").concat(e),onClick:function(l){typeof i.props.onClick=="function"&&i.props.onClick(l),typeof n=="function"&&n(l)}})}return x.createElement("svg",{className:"".concat(a," ").concat(e),xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",onClick:n},x.createElement("path",{d:"M96 32V64H48C21.5 64 0 85.5 0 112v48H448V112c0-26.5-21.5-48-48-48H352V32c0-17.7-14.3-32-32-32s-32 14.3-32 32V64H160V32c0-17.7-14.3-32-32-32S96 14.3 96 32zM448 192H0V464c0 26.5 21.5 48 48 48H400c26.5 0 48-21.5 48-48V192z"}))},pa=function(r){q(o,r);function o(t){var e=r.call(this,t)||this;return e.portalRoot=null,e.el=document.createElement("div"),e}return o.prototype.componentDidMount=function(){this.portalRoot=(this.props.portalHost||document).getElementById(this.props.portalId),this.portalRoot||(this.portalRoot=document.createElement("div"),this.portalRoot.setAttribute("id",this.props.portalId),(this.props.portalHost||document.body).appendChild(this.portalRoot)),this.portalRoot.appendChild(this.el)},o.prototype.componentWillUnmount=function(){this.portalRoot&&this.portalRoot.removeChild(this.el)},o.prototype.render=function(){return xa.createPortal(this.props.children,this.el)},o}(v.Component),bi="[tabindex], a, button, input, select, textarea",ki=function(r){return(r instanceof HTMLAnchorElement||!r.disabled)&&r.tabIndex!==-1},fa=function(r){q(o,r);function o(t){var e=r.call(this,t)||this;return e.getTabChildren=function(){var n;return Array.prototype.slice.call((n=e.tabLoopRef.current)===null||n===void 0?void 0:n.querySelectorAll(bi),1,-1).filter(ki)},e.handleFocusStart=function(){var n=e.getTabChildren();n&&n.length>1&&n[n.length-1].focus()},e.handleFocusEnd=function(){var n=e.getTabChildren();n&&n.length>1&&n[0].focus()},e.tabLoopRef=v.createRef(),e}return o.prototype.render=function(){var t;return((t=this.props.enableTabLoop)!==null&&t!==void 0?t:o.defaultProps.enableTabLoop)?x.createElement("div",{className:"react-datepicker__tab-loop",ref:this.tabLoopRef},x.createElement("div",{className:"react-datepicker__tab-loop__start",tabIndex:0,onFocus:this.handleFocusStart}),this.props.children,x.createElement("div",{className:"react-datepicker__tab-loop__end",tabIndex:0,onFocus:this.handleFocusEnd})):this.props.children},o.defaultProps={enableTabLoop:!0},o}(v.Component);function wi(r){function o(t){var e,n=typeof t.hidePopper=="boolean"?t.hidePopper:!0,a=v.useRef(null),i=Ps(F({open:!n,whileElementsMounted:cs,placement:t.popperPlacement,middleware:fe([gs({padding:15}),ys(10),xs({element:a})],(e=t.popperModifiers)!==null&&e!==void 0?e:[],!0)},t.popperProps)),l=F(F({},t),{hidePopper:n,popperProps:F(F({},i),{arrowRef:a})});return x.createElement(r,F({},l))}return o.displayName="withFloating(".concat(r.displayName||r.name||"Component",")"),o}var _i=function(r){var o=r.className,t=r.wrapperClassName,e=r.hidePopper,n=e===void 0?!0:e,a=r.popperComponent,i=r.targetComponent,l=r.enableTabLoop,c=r.popperOnKeyDown,u=r.portalId,p=r.portalHost,d=r.popperProps,m=r.showArrow,f=r.popperTargetRef,h=r.monthHeaderPosition;v.useEffect(function(){f?.current&&d.refs.setPositionReference(f.current)},[f,d.refs]);var y=void 0;if(!n){var g=Z("react-datepicker-popper",!m&&"react-datepicker-popper-offset",h==="middle"&&"react-datepicker-popper--header-middle",h==="bottom"&&"react-datepicker-popper--header-bottom",o);y=x.createElement(fa,{enableTabLoop:l},x.createElement("div",{ref:d.refs.setFloating,style:d.floatingStyles,className:g,"data-placement":d.placement,onKeyDown:c},a,m&&x.createElement(Ds,{ref:d.arrowRef,context:d.context,fill:"currentColor",strokeWidth:1,height:8,width:16,style:{transform:"translateY(-1px)"},className:"react-datepicker__triangle"})))}r.popperContainer&&(y=v.createElement(r.popperContainer,{},y)),u&&!n&&(y=x.createElement(pa,{portalId:u,portalHost:p},y));var k=Z("react-datepicker-wrapper",t);return x.createElement(x.Fragment,null,x.createElement("div",{ref:d.refs.setReference,className:k},i),y)},Di=wi(_i);function Dr(r,o){return r&&o?re(r)!==re(o)||Y(r)!==Y(o):r!==o}var dn="Date input not valid.",un=function(r){q(o,r);function o(t){var e=r.call(this,t)||this;return e.calendar=null,e.input=null,e.getPreSelection=function(){var n=e.props.timeZone,a=e.props.openToDate?e.props.openToDate:e.props.selectsEnd&&e.props.startDate?e.props.startDate:e.props.selectsStart&&e.props.endDate?e.props.endDate:H();return n?sr(a,n):a},e.modifyHolidays=function(){var n;return(n=e.props.holidays)===null||n===void 0?void 0:n.reduce(function(a,i){var l=Te(i.date,"yyyy-MM-dd",void 0,!1);return l?fe(fe([],a,!0),[F(F({},i),{date:l})],!1):a},[])},e.calcInitialState=function(){var n=e.props.timeZone,a=e.getPreSelection(),i=ia(e.props),l=la(e.props),c=i&&pe(a,ut(i))?i:l&&be(a,cr(l))?l:a,u=e.props.selectsRange?e.props.startDate:e.props.selected;return u&&n&&(u=sr(u,n)),{open:e.props.startOpen||!1,preventFocus:!1,inputValue:null,preSelection:u??c,highlightDates:yr(e.props.highlightDates),focused:!1,shouldFocusDayInline:!1,isRenderAriaLiveMessage:!1,wasHidden:!1}},e.getInputValue=function(){var n,a=e.props,i=a.locale,l=a.startDate,c=a.endDate,u=a.rangeSeparator,p=a.selected,d=a.selectedDates,m=a.selectsMultiple,f=a.selectsRange,h=a.formatMultipleDates,y=a.value,g=(n=e.props.dateFormat)!==null&&n!==void 0?n:o.defaultProps.dateFormat,k=e.state.inputValue;if(typeof y=="string")return y;if(typeof k=="string")return k;if(f)return Rs(l,c,{dateFormat:g,locale:i,rangeSeparator:u});if(m){if(h){var _=function(j){return te(j,{dateFormat:g,locale:i})};return h(d??[],_)}return Ls(d??[],{dateFormat:g,locale:i})}return te(p,{dateFormat:g,locale:i})},e.resetHiddenStatus=function(){e.setState(F(F({},e.state),{wasHidden:!1}))},e.setHiddenStatus=function(){e.setState(F(F({},e.state),{wasHidden:!0}))},e.setHiddenStateOnVisibilityHidden=function(){document.visibilityState==="hidden"&&e.setHiddenStatus()},e.clearPreventFocusTimeout=function(){e.preventFocusTimeout&&clearTimeout(e.preventFocusTimeout)},e.setFocus=function(){var n,a;(a=(n=e.input)===null||n===void 0?void 0:n.focus)===null||a===void 0||a.call(n,{preventScroll:!0})},e.setBlur=function(){var n,a;(a=(n=e.input)===null||n===void 0?void 0:n.blur)===null||a===void 0||a.call(n),e.cancelFocusInput()},e.deferBlur=function(){requestAnimationFrame(function(){e.setBlur()})},e.setOpen=function(n,a){a===void 0&&(a=!1),e.setState({open:n,preSelection:n&&e.state.open?e.state.preSelection:e.calcInitialState().preSelection,lastPreSelectChange:pn},function(){n||e.setState(function(i){return{focused:a?i.focused:!1}},function(){!a&&e.deferBlur(),e.setState({inputValue:null})})})},e.inputOk=function(){return ke(e.state.preSelection)},e.isCalendarOpen=function(){return e.props.open===void 0?e.state.open&&!e.props.disabled&&!e.props.readOnly:e.props.open},e.handleFocus=function(n){var a,i,l=e.state.wasHidden,c=l?e.state.open:!0;l&&e.resetHiddenStatus(),e.state.preventFocus||((i=(a=e.props).onFocus)===null||i===void 0||i.call(a,n),c&&!e.props.preventOpenOnFocus&&!e.props.readOnly&&e.setOpen(!0)),e.setState({focused:!0})},e.sendFocusBackToInput=function(){e.preventFocusTimeout&&e.clearPreventFocusTimeout(),e.setState({preventFocus:!0},function(){e.preventFocusTimeout=setTimeout(function(){e.setFocus(),e.setState({preventFocus:!1})})})},e.cancelFocusInput=function(){clearTimeout(e.inputFocusTimeout),e.inputFocusTimeout=void 0},e.deferFocusInput=function(){e.cancelFocusInput(),e.inputFocusTimeout=setTimeout(function(){return e.setFocus()},1)},e.handleDropdownFocus=function(){e.cancelFocusInput()},e.resetInputValue=function(){e.setState(F(F({},e.state),{inputValue:null}))},e.handleBlur=function(n){var a,i;(!e.state.open||e.props.withPortal||e.props.showTimeInput)&&((i=(a=e.props).onBlur)===null||i===void 0||i.call(a,n));var l=e.state.inputValue;if(typeof l=="string"&&l.length>0){var c=/[a-zA-Z0-9]/.test(l);!c&&e.props.selected&&e.setSelected(null,void 0,!0)}e.resetInputValue(),e.state.open&&e.props.open===!1&&e.setOpen(!1),e.setState({focused:!1})},e.handleCalendarClickOutside=function(n){var a,i;(i=(a=e.props).onClickOutside)===null||i===void 0||i.call(a,n),!e.props.inline&&!n.defaultPrevented&&e.setOpen(!1),e.props.withPortal&&n.preventDefault()},e.handleChange=function(){for(var n,a,i,l,c,u,p,d,m=[],f=0;f=E){I=P;break}m&&If&&(O=M.ArrowLeft,I=ie(f,e.props)?S(O,I):f),ie(I,e.props)?((O===M.PageUp||O===M.Home)&&(O=M.ArrowRight),(O===M.PageDown||O===M.End)&&(O=M.ArrowLeft),I=S(O,I)):L=!0,R++}return I};if(D===M.Enter){n.preventDefault(),e.handleSelect(w,n),!g&&e.setPreSelection(w);return}else if(D===M.Escape){n.preventDefault(),e.setOpen(!1),e.inputOk()||(c=(l=e.props).onInputError)===null||c===void 0||c.call(l,{code:1,msg:dn});return}var A=null;switch(D){case M.ArrowLeft:case M.ArrowRight:case M.ArrowUp:case M.ArrowDown:case M.PageUp:case M.PageDown:case M.Home:case M.End:A=N(D,w);break}if(!A){(p=(u=e.props).onInputError)===null||p===void 0||p.call(u,{code:1,msg:dn});return}n.preventDefault(),e.setState({lastPreSelectChange:pn}),j&&e.setSelected(A),e.setPreSelection(A),C&&e.setState({shouldFocusDayInline:!0})}},e.onPopperKeyDown=function(n){var a=n.key;a===M.Escape&&(n.preventDefault(),e.sendFocusBackToInput(),e.setOpen(!1))},e.onClearClick=function(n){n&&n.preventDefault&&n.preventDefault(),e.sendFocusBackToInput();var a=e.props,i=a.selectsRange,l=a.onChange;l?.(i?[null,null]:null,n),e.setState({inputValue:null})},e.clear=function(){e.onClearClick()},e.onScroll=function(n){typeof e.props.closeOnScroll=="boolean"&&e.props.closeOnScroll?(n.target===document||n.target===document.documentElement||n.target===document.body)&&e.setOpen(!1):typeof e.props.closeOnScroll=="function"&&e.props.closeOnScroll(n)&&e.setOpen(!1)},e.handleMonthSelectedInChange=function(n){e.setState({monthSelectedIn:n})},e.renderCalendar=function(){var n,a;return!e.props.inline&&!e.isCalendarOpen()?null:x.createElement(gi,F({showMonthYearDropdown:void 0,ref:function(i){e.calendar=i}},e.props,e.state,{setOpen:e.setOpen,dateFormat:(n=e.props.dateFormatCalendar)!==null&&n!==void 0?n:o.defaultProps.dateFormatCalendar,onSelect:e.handleSelect,onClickOutside:e.handleCalendarClickOutside,holidays:Gs(e.modifyHolidays()),outsideClickIgnoreClass:e.props.outsideClickIgnoreClass,onDropdownFocus:e.handleDropdownFocus,onTimeChange:e.handleTimeChange,className:e.props.calendarClassName,container:e.props.calendarContainer,handleOnKeyDown:e.props.onKeyDown,handleOnDayKeyDown:e.onDayKeyDown,setPreSelection:e.setPreSelection,dropdownMode:(a=e.props.dropdownMode)!==null&&a!==void 0?a:o.defaultProps.dropdownMode,onMonthSelectedInChange:e.handleMonthSelectedInChange}),e.props.children)},e.renderAriaLiveRegion=function(){var n,a=e.props.locale,i=(n=e.props.dateFormat)!==null&&n!==void 0?n:o.defaultProps.dateFormat,l=e.props.showTimeInput||e.props.showTimeSelect,c=l?"PPPPp":"PPPP",u;return e.props.selectsRange?u="Selected start date: ".concat(te(e.props.startDate,{dateFormat:c,locale:a}),". ").concat(e.props.endDate?"End date: "+te(e.props.endDate,{dateFormat:c,locale:a}):""):e.props.showTimeSelectOnly?u="Selected time: ".concat(te(e.props.selected,{dateFormat:i,locale:a})):e.props.showYearPicker?u="Selected year: ".concat(te(e.props.selected,{dateFormat:"yyyy",locale:a})):e.props.showMonthYearPicker?u="Selected month: ".concat(te(e.props.selected,{dateFormat:"MMMM yyyy",locale:a})):e.props.showQuarterYearPicker?u="Selected quarter: ".concat(te(e.props.selected,{dateFormat:"yyyy, QQQ",locale:a})):u="Selected date: ".concat(te(e.props.selected,{dateFormat:c,locale:a})),x.createElement("span",{role:"alert","aria-live":"polite",className:"react-datepicker__aria-live"},u)},e.renderDateInput=function(){var n,a,i,l,c,u,p,d=Z(e.props.className,(n={},n[e.props.outsideClickIgnoreClass||o.defaultProps.outsideClickIgnoreClass]=e.state.open,n)),m=e.props.customInput||x.createElement("input",{type:"text"}),f=e.props.customInputRef||"ref",h={},y=(i=e.props["aria-describedby"])!==null&&i!==void 0?i:e.props.ariaDescribedBy,g=(l=e.props["aria-invalid"])!==null&&l!==void 0?l:e.props.ariaInvalid,k=(c=e.props["aria-label"])!==null&&c!==void 0?c:e.props.ariaLabel,_=(u=e.props["aria-labelledby"])!==null&&u!==void 0?u:e.props.ariaLabelledBy,j=(p=e.props["aria-required"])!==null&&p!==void 0?p:e.props.ariaRequired;return y!=null&&(h["aria-describedby"]=y),g!=null&&(h["aria-invalid"]=g),k!=null&&(h["aria-label"]=k),_!=null&&(h["aria-labelledby"]=_),j!=null&&(h["aria-required"]=j),v.cloneElement(m,F((a={},a[f]=function(C){e.input=C},a.value=e.getInputValue(),a.onBlur=e.handleBlur,a.onChange=e.handleChange,a.onClick=e.onInputClick,a.onFocus=e.handleFocus,a.onKeyDown=e.onInputKeyDown,a.id=e.props.id,a.name=e.props.name,a.form=e.props.form,a.autoFocus=e.props.autoFocus,a.placeholder=e.props.placeholderText,a.disabled=e.props.disabled,a.autoComplete=e.props.autoComplete,a.className=Z(m.props.className,d),a.title=e.props.title,a.readOnly=e.props.readOnly,a.required=e.props.required,a.tabIndex=e.props.tabIndex,a),h))},e.renderClearButton=function(){var n=e.props,a=n.isClearable,i=n.disabled,l=n.selected,c=n.startDate,u=n.endDate,p=n.clearButtonTitle,d=n.clearButtonClassName,m=d===void 0?"":d,f=n.ariaLabelClose,h=f===void 0?"Close":f,y=n.selectedDates,g=n.readOnly;return a&&!g&&(l!=null||c!=null||u!=null||y?.length)?x.createElement("button",{type:"button",className:Z("react-datepicker__close-icon",m,{"react-datepicker__close-icon--disabled":i}),disabled:i,"aria-label":h,onClick:e.onClearClick,title:p,tabIndex:-1}):null},e.state=e.calcInitialState(),e.preventFocusTimeout=void 0,e}return Object.defineProperty(o,"defaultProps",{get:function(){return{allowSameDay:!1,dateFormat:"MM/dd/yyyy",dateFormatCalendar:"LLLL yyyy",disabled:!1,disabledKeyboardNavigation:!1,dropdownMode:"scroll",preventOpenOnFocus:!1,monthsShown:1,outsideClickIgnoreClass:ua,readOnly:!1,rangeSeparator:aa,withPortal:!1,selectsDisabledDaysInRange:!1,shouldCloseOnSelect:!0,showTimeSelect:!1,showTimeInput:!1,showPreviousMonths:!1,showMonthYearPicker:!1,showFullMonthYearPicker:!1,showTwoColumnMonthYearPicker:!1,showFourColumnMonthYearPicker:!1,showYearPicker:!1,showQuarterYearPicker:!1,showWeekPicker:!1,strictParsing:!1,swapRange:!1,timeIntervals:30,timeCaption:"Time",previousMonthAriaLabel:"Previous Month",previousMonthButtonLabel:"Previous Month",nextMonthAriaLabel:"Next Month",nextMonthButtonLabel:"Next Month",previousYearAriaLabel:"Previous Year",previousYearButtonLabel:"Previous Year",nextYearAriaLabel:"Next Year",nextYearButtonLabel:"Next Year",timeInputLabel:"Time",enableTabLoop:!0,yearItemNumber:wt,focusSelectedMonth:!1,showPopperArrow:!0,excludeScrollbar:!0,customTimeInput:null,calendarStartDay:void 0,toggleCalendarOnIconClick:!1,usePointerEvent:!1}},enumerable:!1,configurable:!0}),o.prototype.componentDidMount=function(){window.addEventListener("scroll",this.onScroll,!0),document.addEventListener("visibilitychange",this.setHiddenStateOnVisibilityHidden)},o.prototype.componentDidUpdate=function(t,e){var n,a,i,l;this.props.selectsRange&&Dr(t.startDate,this.props.startDate)?this.setPreSelection(this.props.startDate):Dr(t.selected,this.props.selected)&&this.setPreSelection(this.props.selected),this.state.monthSelectedIn!==void 0&&t.monthsShown!==this.props.monthsShown&&this.setState({monthSelectedIn:0}),this.props.selectsRange&&e.open===!1&&this.state.open===!0&&this.state.monthSelectedIn!==0&&this.setState({monthSelectedIn:0}),t.highlightDates!==this.props.highlightDates&&this.setState({highlightDates:yr(this.props.highlightDates)}),!e.focused&&!Le(t.selected,this.props.selected)&&this.setState({inputValue:null}),e.open!==this.state.open&&(e.open===!1&&this.state.open===!0&&((a=(n=this.props).onCalendarOpen)===null||a===void 0||a.call(n)),e.open===!0&&this.state.open===!1&&((l=(i=this.props).onCalendarClose)===null||l===void 0||l.call(i)))},o.prototype.componentWillUnmount=function(){this.clearPreventFocusTimeout(),window.removeEventListener("scroll",this.onScroll,!0),document.removeEventListener("visibilitychange",this.setHiddenStateOnVisibilityHidden)},o.prototype.renderInputContainer=function(){var t=this.props,e=t.showIcon,n=t.icon,a=t.calendarIconClassname,i=t.calendarIconClassName,l=t.toggleCalendarOnIconClick,c=this.state.open;return a&&console.warn("calendarIconClassname props is deprecated. should use calendarIconClassName props."),x.createElement("div",{className:"react-datepicker__input-container".concat(e?" react-datepicker__view-calendar-icon":"")},e&&x.createElement(xi,F({icon:n,className:Z(i,!i&&a,c&&"react-datepicker-ignore-onclickoutside")},l?{onClick:this.toggleCalendar}:null)),this.state.isRenderAriaLiveMessage&&this.renderAriaLiveRegion(),this.renderDateInput(),this.renderClearButton())},o.prototype.render=function(){var t=this.renderCalendar();if(this.props.inline)return t;if(this.props.withPortal){var e=this.state.open?x.createElement(fa,{enableTabLoop:this.props.enableTabLoop},x.createElement("div",{className:"react-datepicker__portal",tabIndex:-1,onKeyDown:this.onPortalKeyDown},t)):null;return this.state.open&&this.props.portalId&&(e=x.createElement(pa,F({portalId:this.props.portalId},this.props),e)),x.createElement(x.Fragment,null,this.renderInputContainer(),e)}return x.createElement(Di,F({},this.props,{className:this.props.popperClassName,hidePopper:!this.isCalendarOpen(),targetComponent:this.renderInputContainer(),popperComponent:t,popperOnKeyDown:this.onPopperKeyDown,showArrow:this.props.showPopperArrow,monthHeaderPosition:this.props.monthHeaderPosition}))},o}(v.Component),ji="input",pn="navigate";const Si={lessThanXSeconds:{one:{regular:"méně než 1 sekunda",past:"před méně než 1 sekundou",future:"za méně než 1 sekundu"},few:{regular:"méně než {{count}} sekundy",past:"před méně než {{count}} sekundami",future:"za méně než {{count}} sekundy"},many:{regular:"méně než {{count}} sekund",past:"před méně než {{count}} sekundami",future:"za méně než {{count}} sekund"}},xSeconds:{one:{regular:"1 sekunda",past:"před 1 sekundou",future:"za 1 sekundu"},few:{regular:"{{count}} sekundy",past:"před {{count}} sekundami",future:"za {{count}} sekundy"},many:{regular:"{{count}} sekund",past:"před {{count}} sekundami",future:"za {{count}} sekund"}},halfAMinute:{type:"other",other:{regular:"půl minuty",past:"před půl minutou",future:"za půl minuty"}},lessThanXMinutes:{one:{regular:"méně než 1 minuta",past:"před méně než 1 minutou",future:"za méně než 1 minutu"},few:{regular:"méně než {{count}} minuty",past:"před méně než {{count}} minutami",future:"za méně než {{count}} minuty"},many:{regular:"méně než {{count}} minut",past:"před méně než {{count}} minutami",future:"za méně než {{count}} minut"}},xMinutes:{one:{regular:"1 minuta",past:"před 1 minutou",future:"za 1 minutu"},few:{regular:"{{count}} minuty",past:"před {{count}} minutami",future:"za {{count}} minuty"},many:{regular:"{{count}} minut",past:"před {{count}} minutami",future:"za {{count}} minut"}},aboutXHours:{one:{regular:"přibližně 1 hodina",past:"přibližně před 1 hodinou",future:"přibližně za 1 hodinu"},few:{regular:"přibližně {{count}} hodiny",past:"přibližně před {{count}} hodinami",future:"přibližně za {{count}} hodiny"},many:{regular:"přibližně {{count}} hodin",past:"přibližně před {{count}} hodinami",future:"přibližně za {{count}} hodin"}},xHours:{one:{regular:"1 hodina",past:"před 1 hodinou",future:"za 1 hodinu"},few:{regular:"{{count}} hodiny",past:"před {{count}} hodinami",future:"za {{count}} hodiny"},many:{regular:"{{count}} hodin",past:"před {{count}} hodinami",future:"za {{count}} hodin"}},xDays:{one:{regular:"1 den",past:"před 1 dnem",future:"za 1 den"},few:{regular:"{{count}} dny",past:"před {{count}} dny",future:"za {{count}} dny"},many:{regular:"{{count}} dní",past:"před {{count}} dny",future:"za {{count}} dní"}},aboutXWeeks:{one:{regular:"přibližně 1 týden",past:"přibližně před 1 týdnem",future:"přibližně za 1 týden"},few:{regular:"přibližně {{count}} týdny",past:"přibližně před {{count}} týdny",future:"přibližně za {{count}} týdny"},many:{regular:"přibližně {{count}} týdnů",past:"přibližně před {{count}} týdny",future:"přibližně za {{count}} týdnů"}},xWeeks:{one:{regular:"1 týden",past:"před 1 týdnem",future:"za 1 týden"},few:{regular:"{{count}} týdny",past:"před {{count}} týdny",future:"za {{count}} týdny"},many:{regular:"{{count}} týdnů",past:"před {{count}} týdny",future:"za {{count}} týdnů"}},aboutXMonths:{one:{regular:"přibližně 1 měsíc",past:"přibližně před 1 měsícem",future:"přibližně za 1 měsíc"},few:{regular:"přibližně {{count}} měsíce",past:"přibližně před {{count}} měsíci",future:"přibližně za {{count}} měsíce"},many:{regular:"přibližně {{count}} měsíců",past:"přibližně před {{count}} měsíci",future:"přibližně za {{count}} měsíců"}},xMonths:{one:{regular:"1 měsíc",past:"před 1 měsícem",future:"za 1 měsíc"},few:{regular:"{{count}} měsíce",past:"před {{count}} měsíci",future:"za {{count}} měsíce"},many:{regular:"{{count}} měsíců",past:"před {{count}} měsíci",future:"za {{count}} měsíců"}},aboutXYears:{one:{regular:"přibližně 1 rok",past:"přibližně před 1 rokem",future:"přibližně za 1 rok"},few:{regular:"přibližně {{count}} roky",past:"přibližně před {{count}} roky",future:"přibližně za {{count}} roky"},many:{regular:"přibližně {{count}} roků",past:"přibližně před {{count}} roky",future:"přibližně za {{count}} roků"}},xYears:{one:{regular:"1 rok",past:"před 1 rokem",future:"za 1 rok"},few:{regular:"{{count}} roky",past:"před {{count}} roky",future:"za {{count}} roky"},many:{regular:"{{count}} roků",past:"před {{count}} roky",future:"za {{count}} roků"}},overXYears:{one:{regular:"více než 1 rok",past:"před více než 1 rokem",future:"za více než 1 rok"},few:{regular:"více než {{count}} roky",past:"před více než {{count}} roky",future:"za více než {{count}} roky"},many:{regular:"více než {{count}} roků",past:"před více než {{count}} roky",future:"za více než {{count}} roků"}},almostXYears:{one:{regular:"skoro 1 rok",past:"skoro před 1 rokem",future:"skoro za 1 rok"},few:{regular:"skoro {{count}} roky",past:"skoro před {{count}} roky",future:"skoro za {{count}} roky"},many:{regular:"skoro {{count}} roků",past:"skoro před {{count}} roky",future:"skoro za {{count}} roků"}}},Ci=(r,o,t)=>{let e;const n=Si[r];n.type==="other"?e=n.other:o===1?e=n.one:o>1&&o<5?e=n.few:e=n.many;const a=t?.addSuffix===!0,i=t?.comparison;let l;return a&&i===-1?l=e.past:a&&i===1?l=e.future:l=e.regular,l.replace("{{count}}",String(o))},Ni={full:"EEEE, d. MMMM yyyy",long:"d. MMMM yyyy",medium:"d. M. yyyy",short:"dd.MM.yyyy"},Mi={full:"H:mm:ss zzzz",long:"H:mm:ss z",medium:"H:mm:ss",short:"H:mm"},Ei={full:"{{date}} 'v' {{time}}",long:"{{date}} 'v' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Pi={date:en({formats:Ni,defaultWidth:"full"}),time:en({formats:Mi,defaultWidth:"full"}),dateTime:en({formats:Ei,defaultWidth:"full"})},Ti=["neděli","pondělí","úterý","středu","čtvrtek","pátek","sobotu"],Oi={lastWeek:"'poslední' eeee 've' p",yesterday:"'včera v' p",today:"'dnes v' p",tomorrow:"'zítra v' p",nextWeek:r=>{const o=r.getDay();return"'v "+Ti[o]+" o' p"},other:"P"},Ai=(r,o)=>{const t=Oi[r];return typeof t=="function"?t(o):t},Ri={narrow:["př. n. l.","n. l."],abbreviated:["př. n. l.","n. l."],wide:["před naším letopočtem","našeho letopočtu"]},Li={narrow:["1","2","3","4"],abbreviated:["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],wide:["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"]},Ii={narrow:["L","Ú","B","D","K","Č","Č","S","Z","Ř","L","P"],abbreviated:["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],wide:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"]},Fi={narrow:["L","Ú","B","D","K","Č","Č","S","Z","Ř","L","P"],abbreviated:["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],wide:["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"]},Yi={narrow:["ne","po","út","st","čt","pá","so"],short:["ne","po","út","st","čt","pá","so"],abbreviated:["ned","pon","úte","stř","čtv","pát","sob"],wide:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"]},Wi={narrow:{am:"dop.",pm:"odp.",midnight:"půlnoc",noon:"poledne",morning:"ráno",afternoon:"odpoledne",evening:"večer",night:"noc"},abbreviated:{am:"dop.",pm:"odp.",midnight:"půlnoc",noon:"poledne",morning:"ráno",afternoon:"odpoledne",evening:"večer",night:"noc"},wide:{am:"dopoledne",pm:"odpoledne",midnight:"půlnoc",noon:"poledne",morning:"ráno",afternoon:"odpoledne",evening:"večer",night:"noc"}},zi={narrow:{am:"dop.",pm:"odp.",midnight:"půlnoc",noon:"poledne",morning:"ráno",afternoon:"odpoledne",evening:"večer",night:"noc"},abbreviated:{am:"dop.",pm:"odp.",midnight:"půlnoc",noon:"poledne",morning:"ráno",afternoon:"odpoledne",evening:"večer",night:"noc"},wide:{am:"dopoledne",pm:"odpoledne",midnight:"půlnoc",noon:"poledne",morning:"ráno",afternoon:"odpoledne",evening:"večer",night:"noc"}},Bi=(r,o)=>Number(r)+".",Hi={ordinalNumber:Bi,era:at({values:Ri,defaultWidth:"wide"}),quarter:at({values:Li,defaultWidth:"wide",argumentCallback:r=>r-1}),month:at({values:Ii,defaultWidth:"wide",formattingValues:Fi,defaultFormattingWidth:"wide"}),day:at({values:Yi,defaultWidth:"wide"}),dayPeriod:at({values:Wi,defaultWidth:"wide",formattingValues:zi,defaultFormattingWidth:"wide"})},Vi=/^(\d+)\.?/i,$i=/\d+/i,Ki={narrow:/^(p[řr](\.|ed) Kr\.|p[řr](\.|ed) n\. l\.|po Kr\.|n\. l\.)/i,abbreviated:/^(p[řr](\.|ed) Kr\.|p[řr](\.|ed) n\. l\.|po Kr\.|n\. l\.)/i,wide:/^(p[řr](\.|ed) Kristem|p[řr](\.|ed) na[šs][íi]m letopo[čc]tem|po Kristu|na[šs]eho letopo[čc]tu)/i},Ui={any:[/^p[řr]/i,/^(po|n)/i]},Qi={narrow:/^[1234]/i,abbreviated:/^[1234]\. [čc]tvrtlet[íi]/i,wide:/^[1234]\. [čc]tvrtlet[íi]/i},Zi={any:[/1/i,/2/i,/3/i,/4/i]},qi={narrow:/^[lúubdkčcszřrlp]/i,abbreviated:/^(led|[úu]no|b[řr]e|dub|kv[ěe]|[čc]vn|[čc]vc|srp|z[áa][řr]|[řr][íi]j|lis|pro)/i,wide:/^(leden|ledna|[úu]nora?|b[řr]ezen|b[řr]ezna|duben|dubna|kv[ěe]ten|kv[ěe]tna|[čc]erven(ec|ce)?|[čc]ervna|srpen|srpna|z[áa][řr][íi]|[řr][íi]jen|[řr][íi]jna|listopad(a|u)?|prosinec|prosince)/i},Xi={narrow:[/^l/i,/^[úu]/i,/^b/i,/^d/i,/^k/i,/^[čc]/i,/^[čc]/i,/^s/i,/^z/i,/^[řr]/i,/^l/i,/^p/i],any:[/^led/i,/^[úu]n/i,/^b[řr]e/i,/^dub/i,/^kv[ěe]/i,/^[čc]vn|[čc]erven(?!\w)|[čc]ervna/i,/^[čc]vc|[čc]erven(ec|ce)/i,/^srp/i,/^z[áa][řr]/i,/^[řr][íi]j/i,/^lis/i,/^pro/i]},Gi={narrow:/^[npuúsčps]/i,short:/^(ne|po|[úu]t|st|[čc]t|p[áa]|so)/i,abbreviated:/^(ned|pon|[úu]te|st[rř]|[čc]tv|p[áa]t|sob)/i,wide:/^(ned[ěe]le|pond[ěe]l[íi]|[úu]ter[ýy]|st[řr]eda|[čc]tvrtek|p[áa]tek|sobota)/i},Ji={narrow:[/^n/i,/^p/i,/^[úu]/i,/^s/i,/^[čc]/i,/^p/i,/^s/i],any:[/^ne/i,/^po/i,/^[úu]t/i,/^st/i,/^[čc]t/i,/^p[áa]/i,/^so/i]},el={any:/^dopoledne|dop\.?|odpoledne|odp\.?|p[ůu]lnoc|poledne|r[áa]no|odpoledne|ve[čc]er|(v )?noci?/i},tl={any:{am:/^dop/i,pm:/^odp/i,midnight:/^p[ůu]lnoc/i,noon:/^poledne/i,morning:/r[áa]no/i,afternoon:/odpoledne/i,evening:/ve[čc]er/i,night:/noc/i}},nl={ordinalNumber:La({matchPattern:Vi,parsePattern:$i,valueCallback:r=>parseInt(r,10)}),era:ot({matchPatterns:Ki,defaultMatchWidth:"wide",parsePatterns:Ui,defaultParseWidth:"any"}),quarter:ot({matchPatterns:Qi,defaultMatchWidth:"wide",parsePatterns:Zi,defaultParseWidth:"any",valueCallback:r=>r+1}),month:ot({matchPatterns:qi,defaultMatchWidth:"wide",parsePatterns:Xi,defaultParseWidth:"any"}),day:ot({matchPatterns:Gi,defaultMatchWidth:"wide",parsePatterns:Ji,defaultParseWidth:"any"}),dayPeriod:ot({matchPatterns:el,defaultMatchWidth:"any",parsePatterns:tl,defaultParseWidth:"any"})},rl={code:"cs",formatDistance:Ci,formatLong:Pi,formatRelative:Ai,localize:Hi,match:nl,options:{weekStartsOn:1,firstWeekContainsDate:4}};zs("cs",rl);if(typeof document<"u"&&!document.getElementById("datepicker-portal")){const r=document.createElement("div");r.id="datepicker-portal",document.body.appendChild(r)}const al=()=>typeof window<"u"&&("ontouchstart"in window||navigator.maxTouchPoints>0),ol=v.forwardRef(({value:r,onClick:o,onChange:t,placeholder:e,required:n,readOnly:a,disabled:i},l)=>s.jsx("input",{className:"admin-form-input",onClick:o,onChange:t,value:r,placeholder:e,ref:l,required:n,readOnly:a,disabled:i,autoComplete:"off"})),sl={month:"month",time:"time"};function il({mode:r,value:o,onChange:t,required:e,minDate:n,maxDate:a,disabled:i}){const l=sl[r]||"date";return s.jsx("input",{type:l,lang:"cs",value:o||"",onChange:c=>t(c.target.value),className:"admin-form-input",required:e,disabled:i,min:n||void 0,max:a||void 0})}function ll({mode:r="date",value:o,onChange:t,required:e,minDate:n,maxDate:a,...i}){if(v.useMemo(()=>al(),[]))return s.jsx(il,{mode:r,value:o,onChange:t,required:e,minDate:n,maxDate:a,disabled:i.disabled});const c=m=>{if(!m)return null;try{if(r==="date")return ct(m,"yyyy-MM-dd",new Date);if(r==="time"){const[f,h]=m.split(":"),y=new Date;return y.setHours(parseInt(f,10),parseInt(h,10),0,0),y}if(r==="month")return ct(m,"yyyy-MM",new Date)}catch{return null}return null},u=m=>{if(!m){t("");return}r==="date"?t(ft(m,"yyyy-MM-dd")):r==="time"?t(ft(m,"HH:mm")):r==="month"&&t(ft(m,"yyyy-MM"))},p=m=>{if(m){if(m instanceof Date)return m;try{if(r==="date")return ct(m,"yyyy-MM-dd",new Date);if(r==="month")return ct(m,"yyyy-MM",new Date)}catch{return}}},d={selected:c(o),onChange:u,locale:"cs",customInput:s.jsx(ol,{required:e}),minDate:p(n),maxDate:p(a),popperPlacement:"bottom-start",portalId:"datepicker-portal",...i};return r==="time"?s.jsx(un,{...d,showTimeSelect:!0,showTimeSelectOnly:!0,timeIntervals:5,timeCaption:"Čas",dateFormat:"HH:mm",timeFormat:"HH:mm"}):r==="month"?s.jsx(un,{...d,showMonthYearPicker:!0,dateFormat:"MM/yyyy"}):s.jsx(un,{...d,dateFormat:"dd.MM.yyyy"})}const fn="/api/admin";function cl({dashData:r,punching:o,onPunch:t}){const{hasPermission:e}=tt(),n=xt(),[a,i]=v.useState(!1),[l,c]=v.useState(!1),[u,p]=v.useState([]),[d,m]=v.useState({vehicle_id:"",trip_date:"",start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),[f,h]=v.useState({});ze(a);const y=async()=>{m({vehicle_id:"",trip_date:new Date().toISOString().split("T")[0],start_km:"",end_km:"",route_from:"",route_to:"",is_business:1,notes:""}),h({}),i(!0);try{const w=await(await ae(`${fn}/trips.php?action=active_vehicles`)).json();w.success&&p(w.data.vehicles||[])}catch{}},g=async b=>{if(m(w=>({...w,vehicle_id:b})),!!b)try{const S=await(await ae(`${fn}/trips.php?action=last_km&vehicle_id=${b}`)).json();S.success&&m(N=>({...N,start_km:S.data.last_km}))}catch{}},k=async()=>{const b={};if(d.vehicle_id||(b.vehicle_id="Vyberte vozidlo"),d.trip_date||(b.trip_date="Zadejte datum"),d.start_km||(b.start_km="Zadejte počáteční km"),d.end_km||(b.end_km="Zadejte konečný km"),d.start_km&&d.end_km&&parseInt(d.end_km)<=parseInt(d.start_km)&&(b.end_km="Musí být větší než počáteční"),d.route_from||(b.route_from="Zadejte místo odjezdu"),d.route_to||(b.route_to="Zadejte místo příjezdu"),h(b),!(Object.keys(b).length>0)){c(!0);try{const S=await(await ae(`${fn}/trips.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();S.success?(i(!1),n.success(S.message)):n.error(S.error)}catch{n.error("Chyba připojení")}finally{c(!1)}}},_=()=>{const b=parseInt(d.start_km)||0,w=parseInt(d.end_km)||0;return w>b?w-b:0},j=r?.my_shift?.has_ongoing,C=j?"Zaznamenat odchod":"Zaznamenat příchod",D=[];return e("attendance.record")&&D.push({label:o?"Odesílám...":C,color:j?"danger":"success",icon:j?s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),s.jsx("polyline",{points:"16 17 21 12 16 7"}),s.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]}):s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M9 12l2 2 4-4"}),s.jsx("circle",{cx:"12",cy:"12",r:"10"})]}),onClick:t,disabled:o}),e("offers.create")&&D.push({label:"Nová nabídka",path:"/offers/new",color:"info",icon:s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),s.jsx("polyline",{points:"14 2 14 8 20 8"})]})}),e("trips.record")&&D.push({label:"Přidat jízdu",color:"warning",icon:s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"1",y:"3",width:"15",height:"13",rx:"2"}),s.jsx("circle",{cx:"8.5",cy:"16",r:"2.5"}),s.jsx("circle",{cx:"18.5",cy:"16",r:"2.5"}),s.jsx("path",{d:"M16 8h4l3 5v3h-7"})]}),onClick:y}),e("invoices.create")&&D.push({label:"Vystavit fakturu",path:"/invoices/new",color:"danger",icon:s.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("path",{d:"M12 1v22M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"})})}),s.jsxs(s.Fragment,{children:[s.jsx(Q.div,{className:"dash-quick-actions",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.15},children:D.map(b=>b.onClick?s.jsxs("button",{onClick:b.onClick,disabled:b.disabled,className:`dash-quick-btn dash-quick-btn-${b.color}`,children:[b.icon,s.jsx("span",{children:b.label})]},b.label):s.jsxs(Qe,{to:b.path,className:`dash-quick-btn dash-quick-btn-${b.color}`,children:[b.icon,s.jsx("span",{children:b.label})]},b.label))}),s.jsx(Ie,{children:a&&s.jsxs(Q.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[s.jsx("div",{className:"admin-modal-backdrop",onClick:()=>i(!1)}),s.jsxs(Q.div,{className:"admin-modal admin-modal-lg",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:[s.jsx("div",{className:"admin-modal-header",children:s.jsx("h2",{className:"admin-modal-title",children:"Přidat jízdu"})}),s.jsx("div",{className:"admin-modal-body",children:s.jsxs("div",{className:"admin-form",children:[s.jsxs("div",{className:"admin-form-row",children:[s.jsxs("div",{className:`admin-form-group${f.vehicle_id?" has-error":""}`,children:[s.jsx("label",{className:"admin-form-label required",children:"Vozidlo"}),s.jsxs("select",{value:d.vehicle_id,onChange:b=>{g(b.target.value),h(w=>({...w,vehicle_id:void 0}))},className:"admin-form-select",children:[s.jsx("option",{value:"",children:"Vyberte vozidlo"}),u.map(b=>s.jsxs("option",{value:b.id,children:[b.spz," - ",b.name]},b.id))]}),f.vehicle_id&&s.jsx("span",{className:"admin-form-error",children:f.vehicle_id})]}),s.jsxs("div",{className:`admin-form-group${f.trip_date?" has-error":""}`,children:[s.jsx("label",{className:"admin-form-label required",children:"Datum jízdy"}),s.jsx(ll,{mode:"date",value:d.trip_date,onChange:b=>{m(w=>({...w,trip_date:b})),h(w=>({...w,trip_date:void 0}))}}),f.trip_date&&s.jsx("span",{className:"admin-form-error",children:f.trip_date})]})]}),s.jsxs("div",{className:"admin-form-row admin-form-row-3",children:[s.jsxs("div",{className:`admin-form-group${f.start_km?" has-error":""}`,children:[s.jsx("label",{className:"admin-form-label required",children:"Počáteční stav km"}),s.jsx("input",{type:"number",inputMode:"numeric",value:d.start_km,onChange:b=>{m(w=>({...w,start_km:b.target.value})),h(w=>({...w,start_km:void 0}))},className:"admin-form-input",min:"0"}),f.start_km&&s.jsx("span",{className:"admin-form-error",children:f.start_km})]}),s.jsxs("div",{className:`admin-form-group${f.end_km?" has-error":""}`,children:[s.jsx("label",{className:"admin-form-label required",children:"Konečný stav km"}),s.jsx("input",{type:"number",inputMode:"numeric",value:d.end_km,onChange:b=>{m(w=>({...w,end_km:b.target.value})),h(w=>({...w,end_km:void 0}))},className:"admin-form-input",min:"0"}),f.end_km&&s.jsx("span",{className:"admin-form-error",children:f.end_km})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Vzdálenost"}),s.jsx("input",{type:"text",value:`${ho(_())} km`,className:"admin-form-input",readOnly:!0,disabled:!0})]})]}),s.jsxs("div",{className:"admin-form-row",children:[s.jsxs("div",{className:`admin-form-group${f.route_from?" has-error":""}`,children:[s.jsx("label",{className:"admin-form-label required",children:"Místo odjezdu"}),s.jsx("input",{type:"text",value:d.route_from,onChange:b=>{m(w=>({...w,route_from:b.target.value})),h(w=>({...w,route_from:void 0}))},className:"admin-form-input",placeholder:"Např. Praha"}),f.route_from&&s.jsx("span",{className:"admin-form-error",children:f.route_from})]}),s.jsxs("div",{className:`admin-form-group${f.route_to?" has-error":""}`,children:[s.jsx("label",{className:"admin-form-label required",children:"Místo příjezdu"}),s.jsx("input",{type:"text",value:d.route_to,onChange:b=>{m(w=>({...w,route_to:b.target.value})),h(w=>({...w,route_to:void 0}))},className:"admin-form-input",placeholder:"Např. Brno"}),f.route_to&&s.jsx("span",{className:"admin-form-error",children:f.route_to})]})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Typ jízdy"}),s.jsxs("select",{value:d.is_business,onChange:b=>m(w=>({...w,is_business:parseInt(b.target.value)})),className:"admin-form-select",children:[s.jsx("option",{value:1,children:"Služební"}),s.jsx("option",{value:0,children:"Soukromá"})]})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Poznámky"}),s.jsx("textarea",{value:d.notes,onChange:b=>m(w=>({...w,notes:b.target.value})),className:"admin-form-textarea",rows:2,placeholder:"Volitelné poznámky..."})]})]})}),s.jsxs("div",{className:"admin-modal-footer",children:[s.jsx("button",{type:"button",onClick:()=>i(!1),className:"admin-btn admin-btn-secondary",disabled:l,children:"Zrušit"}),s.jsx("button",{type:"button",onClick:k,className:"admin-btn admin-btn-primary",disabled:l,children:l?"Ukládám...":"Uložit"})]})]})]})})]})}function dl(r){switch(r){case"create":return s.jsxs("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),s.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]});case"update":return s.jsxs("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),s.jsx("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})]});case"delete":return s.jsxs("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("polyline",{points:"3 6 5 6 21 6"}),s.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"})]});case"login":return s.jsxs("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"}),s.jsx("polyline",{points:"10 17 15 12 10 7"}),s.jsx("line",{x1:"15",y1:"12",x2:"3",y2:"12"})]});default:return s.jsxs("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"10"}),s.jsx("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),s.jsx("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]})}}function ul({activities:r}){return r?s.jsxs("div",{className:"admin-card dash-activity-card",children:[s.jsxs("div",{className:"admin-card-header flex-between",children:[s.jsx("h2",{className:"admin-card-title",children:"Audit log"}),s.jsx(Qe,{to:"/audit-log",className:"admin-btn admin-btn-primary admin-btn-sm",children:"Detail →"})]}),s.jsx("div",{className:"admin-card-body",style:{padding:0},children:r.map(o=>s.jsxs("div",{className:"dash-activity-row",children:[s.jsx("div",{className:`dash-activity-icon ${po(o.action)}`,children:dl(o.action)}),s.jsxs("div",{className:"dash-activity-main",children:[s.jsx("div",{className:"dash-activity-text",children:o.description}),s.jsxs("div",{className:"dash-activity-sub",children:[o.username||"Systém"," · ",co[o.entity_type]||o.entity_type]})]}),s.jsx("div",{className:"dash-activity-time admin-mono",children:fo(o.created_at)})]},o.id))})]}):null}function pl({attendance:r}){return r?s.jsxs("div",{className:"admin-card dash-attendance-card",children:[s.jsxs("div",{className:"admin-card-header flex-between",children:[s.jsx("h2",{className:"admin-card-title",children:"Docházka dnes"}),s.jsx(Qe,{to:"/attendance/admin",className:"admin-btn admin-btn-primary admin-btn-sm",children:"Detail →"})]}),s.jsx("div",{className:"admin-card-body",style:{padding:0},children:r.users.map((o,t)=>s.jsxs("div",{className:"dash-presence-row",children:[s.jsx("div",{className:`dash-presence-avatar ${Un[o.status]}`,children:o.initials||"?"}),s.jsx("div",{className:"dash-presence-name",children:o.name}),s.jsxs("div",{className:"dash-presence-end",children:[s.jsx("span",{className:`dash-presence-label ${Un[o.status]}`,children:o.status==="leave"?io[o.leave_type]||"Nepřítomen":lo[o.status]}),o.arrived_at&&s.jsx("span",{className:"admin-mono dash-presence-time",children:o.arrived_at})]})]},`${o.user_id}-${t}`))})]}):null}const fl="/api/admin";function ml({totpEnabled:r,totpLoading:o,totpSubmitting:t,onStart2FASetup:e,onConfirm2FA:n,onDisable2FA:a,totpSecret:i,totpQrUri:l,totpCode:c,setTotpCode:u,backupCodes:p,setBackupCodes:d,show2FASetup:m,setShow2FASetup:f,show2FADisable:h,setShow2FADisable:y,disableCode:g,setDisableCode:k}){const{user:_,updateUser:j}=tt(),C=xt(),D=v.useRef(null),[b,w]=v.useState(!1),[S,N]=v.useState({username:"",email:"",password:"",first_name:"",last_name:""});ze(b);const A=()=>{const E=(_?.fullName||"").split(" ");N({username:_?.username||"",email:_?.email||"",password:"",first_name:E[0]||"",last_name:E.slice(1).join(" ")||""}),w(!0)},T=async E=>{E?.preventDefault();const O={...S};try{const R=await(await ae(`${fl}/profile.php`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(O)})).json();R.success?(j({username:O.username,email:O.email,fullName:`${O.first_name} ${O.last_name}`.trim()}),w(!1),await new Promise(I=>setTimeout(I,300)),C.success("Profil byl upraven")):C.error(R.error||"Nepodařilo se uložit profil")}catch{C.error("Chyba připojení")}};function P(){return o?"Načítání...":r?"Aktivní":"Neaktivní"}return s.jsxs(s.Fragment,{children:[s.jsxs(Q.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:[s.jsxs("div",{className:"admin-card-header flex-between",children:[s.jsx("h2",{className:"admin-card-title",children:"Váš účet"}),s.jsxs("button",{onClick:A,className:"admin-btn admin-btn-secondary admin-btn-sm",children:[s.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),s.jsx("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})]}),"Upravit"]})]}),s.jsxs("div",{className:"admin-card-body",children:[s.jsxs("div",{className:"dash-profile-grid",children:[s.jsxs("div",{className:"dash-profile-item",children:[s.jsx("span",{className:"dash-profile-label",children:"Uživatel"}),s.jsx("span",{className:"dash-profile-value",children:_?.username})]}),s.jsxs("div",{className:"dash-profile-item",children:[s.jsx("span",{className:"dash-profile-label",children:"E-mail"}),s.jsx("span",{className:"dash-profile-value",children:_?.email})]}),s.jsxs("div",{className:"dash-profile-item",children:[s.jsx("span",{className:"dash-profile-label",children:"Jméno"}),s.jsx("span",{className:"dash-profile-value",children:_?.fullName})]}),s.jsxs("div",{className:"dash-profile-item",children:[s.jsx("span",{className:"dash-profile-label",children:"Role"}),s.jsx("span",{className:"dash-profile-value",children:_?.roleDisplay||_?.role})]})]}),s.jsx("div",{style:{borderTop:"1px solid var(--border-color)",marginTop:"1rem",paddingTop:"1rem"},children:s.jsxs("div",{className:"flex-between",children:[s.jsxs("div",{className:"flex-row-gap",children:[s.jsx("div",{style:{width:36,height:36,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:r?"var(--success-light)":"rgba(var(--text-secondary-rgb, 107, 114, 128), 0.1)",color:r?"var(--success)":"var(--text-secondary)"},children:s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),s.jsx("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})}),s.jsxs("div",{children:[s.jsx("div",{style:{fontWeight:500,fontSize:"0.875rem"},children:"Dvoufaktorové ověření (2FA)"}),s.jsx("div",{className:r?"text-success":"text-secondary",style:{fontSize:"0.75rem"},children:P()})]})]}),!o&&(r?s.jsx("button",{onClick:()=>{k(""),y(!0)},className:"admin-btn admin-btn-primary admin-btn-sm",children:"Deaktivovat"}):s.jsx("button",{onClick:e,disabled:t,className:"admin-btn admin-btn-primary admin-btn-sm",children:t?"Generuji...":"Aktivovat"}))]})})]})]}),s.jsx(Ie,{children:b&&s.jsxs(Q.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[s.jsx("div",{className:"admin-modal-backdrop",onClick:()=>w(!1)}),s.jsxs(Q.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:[s.jsx("div",{className:"admin-modal-header",children:s.jsx("h2",{className:"admin-modal-title",children:"Upravit profil"})}),s.jsx("div",{className:"admin-modal-body",children:s.jsxs("div",{className:"admin-form",children:[s.jsxs("div",{className:"admin-form-row",children:[s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Jméno"}),s.jsx("input",{type:"text",value:S.first_name,onChange:E=>N({...S,first_name:E.target.value}),required:!0,className:"admin-form-input"})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Příjmení"}),s.jsx("input",{type:"text",value:S.last_name,onChange:E=>N({...S,last_name:E.target.value}),required:!0,className:"admin-form-input"})]})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Uživatelské jméno"}),s.jsx("input",{type:"text",value:S.username,onChange:E=>N({...S,username:E.target.value}),required:!0,className:"admin-form-input"})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"E-mail"}),s.jsx("input",{type:"email",value:S.email,onChange:E=>N({...S,email:E.target.value}),required:!0,className:"admin-form-input"})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Nové heslo (ponechte prázdné pro zachování stávajícího)"}),s.jsx("input",{type:"password",value:S.password,onChange:E=>N({...S,password:E.target.value}),className:"admin-form-input"})]})]})}),s.jsxs("div",{className:"admin-modal-footer",children:[s.jsx("button",{type:"button",onClick:()=>w(!1),className:"admin-btn admin-btn-secondary",children:"Zrušit"}),s.jsx("button",{type:"button",onClick:T,className:"admin-btn admin-btn-primary",children:"Uložit změny"})]})]})]})}),s.jsx(Ie,{children:m&&s.jsxs(Q.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[s.jsx("div",{className:"admin-modal-backdrop",onClick:()=>{p||f(!1)}}),s.jsxs(Q.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:[s.jsx("div",{className:"admin-modal-header",children:s.jsx("h2",{className:"admin-modal-title",children:p?"Záložní kódy":"Nastavení 2FA"})}),s.jsx("div",{className:"admin-modal-body",children:p?s.jsxs("div",{children:[s.jsxs("div",{className:"admin-role-locked-notice mb-4",children:[s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.jsx("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]}),"Uložte si tyto kódy na bezpečné místo. Každý kód lze použít pouze jednou. Po zavření tohoto okna je již neuvidíte."]}),s.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, 1fr)",gap:"0.5rem",padding:"1rem",background:"var(--bg-secondary)",borderRadius:"0.5rem",fontFamily:"monospace",fontSize:"1rem"},children:p.map(E=>s.jsx("div",{style:{padding:"0.25rem 0.5rem",textAlign:"center",color:"var(--text-primary)"},children:E},E))}),s.jsx("div",{style:{marginTop:"0.75rem"},children:s.jsxs("button",{onClick:()=>{navigator.clipboard?.writeText(p.join(` -`)),C.success("Kódy zkopírovány")},className:"admin-btn admin-btn-secondary admin-btn-sm",children:[s.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),s.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Kopírovat kódy"]})})]}):s.jsxs("div",{children:[s.jsx("p",{className:"text-secondary",style:{fontSize:"0.875rem",marginBottom:"1rem"},children:"Naskenujte QR kód v autentizační aplikaci (Google Authenticator, Authy, Microsoft Authenticator apod.)"}),l&&s.jsx("div",{style:{textAlign:"center",marginBottom:"1rem"},children:s.jsx("canvas",{ref:E=>{E&&l&&K(async()=>{const{renderQR:O}=await import("./qrcode-CBP_ltkV.js");return{renderQR:O}},[]).then(({renderQR:O})=>O(E,l))},style:{width:200,height:200,borderRadius:"0.5rem",border:"1px solid var(--border-color)"}})}),i&&s.jsxs("div",{className:"mb-4",children:[s.jsx("label",{className:"admin-form-label",style:{fontSize:"0.75rem"},children:"Nebo zadejte klíč ručně:"}),s.jsxs("div",{style:{padding:"0.5rem 0.75rem",background:"var(--bg-secondary)",borderRadius:"0.375rem",fontFamily:"monospace",fontSize:"0.875rem",wordBreak:"break-all",color:"var(--text-primary)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"0.5rem"},children:[s.jsx("span",{children:i}),s.jsx("button",{onClick:()=>{navigator.clipboard?.writeText(i),C.success("Klíč zkopírován")},className:"admin-btn-icon",title:"Kopírovat","aria-label":"Kopírovat",style:{flexShrink:0},children:s.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),s.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})})]})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Ověřovací kód z aplikace"}),s.jsx("input",{ref:D,type:"text",inputMode:"numeric",pattern:"[0-9]*",maxLength:6,value:c,onChange:E=>u(E.target.value.replace(/\D/g,"")),placeholder:"000000",className:"admin-form-input",style:{textAlign:"center",fontSize:"1.25rem",letterSpacing:"0.4rem",fontFamily:"monospace"},onKeyDown:E=>{E.key==="Enter"&&c.length===6&&n()}})]})]})}),s.jsx("div",{className:"admin-modal-footer",children:p?s.jsx("button",{onClick:()=>{f(!1),d(null)},className:"admin-btn admin-btn-primary",children:"Rozumím, uložil jsem si kódy"}):s.jsxs(s.Fragment,{children:[s.jsx("button",{onClick:()=>f(!1),className:"admin-btn admin-btn-secondary",disabled:t,children:"Zrušit"}),s.jsx("button",{onClick:n,className:"admin-btn admin-btn-primary",disabled:t||c.length!==6,children:t?"Ověřuji...":"Aktivovat 2FA"})]})})]})]})}),s.jsx(Ie,{children:h&&s.jsxs(Q.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[s.jsx("div",{className:"admin-modal-backdrop",onClick:()=>y(!1)}),s.jsxs(Q.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:[s.jsx("div",{className:"admin-modal-header",children:s.jsx("h2",{className:"admin-modal-title",children:"Deaktivovat 2FA"})}),s.jsxs("div",{className:"admin-modal-body",children:[s.jsx("p",{style:{color:"var(--text-secondary)",fontSize:"0.875rem",marginBottom:"1rem"},children:"Pro deaktivaci dvoufaktorového ověření zadejte aktuální kód z autentizační aplikace."}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Ověřovací kód"}),s.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",maxLength:6,value:g,onChange:E=>k(E.target.value.replace(/\D/g,"")),placeholder:"000000",className:"admin-form-input",style:{textAlign:"center",fontSize:"1.25rem",letterSpacing:"0.4rem",fontFamily:"monospace"},onKeyDown:E=>{E.key==="Enter"&&g.length===6&&a()},autoFocus:!0})]})]}),s.jsxs("div",{className:"admin-modal-footer",children:[s.jsx("button",{onClick:()=>y(!1),className:"admin-btn admin-btn-secondary",disabled:t,children:"Zrušit"}),s.jsx("button",{onClick:a,className:"admin-btn admin-btn-primary",disabled:t||g.length!==6,children:t?"Deaktivuji...":"Deaktivovat 2FA"})]})]})]})})]})}const jr='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function hl(r){const o=v.useRef(null);return v.useEffect(()=>{if(!r||!o.current)return;const t=o.current,e=document.activeElement,n=t.querySelectorAll(jr);n.length>0&&n[0].focus();const a=i=>{if(i.key!=="Tab")return;const l=t.querySelectorAll(jr);if(l.length===0)return;const c=l[0],u=l[l.length-1];i.shiftKey&&document.activeElement===c?(i.preventDefault(),u.focus()):!i.shiftKey&&document.activeElement===u&&(i.preventDefault(),c.focus())};return document.addEventListener("keydown",a),()=>{document.removeEventListener("keydown",a),e&&typeof e.focus=="function"&&e.focus()}},[r]),o}function Sr({isOpen:r,onClose:o,onConfirm:t,title:e="Potvrdit akci",message:n="Opravdu chcete provést tuto akci?",confirmText:a="Potvrdit",cancelText:i="Zrušit",type:l="danger",loading:c=!1}){ze(r);const u=hl(r);if(v.useEffect(()=>{if(!r)return;const d=m=>{m.key==="Escape"&&o()};return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[r,o]),!r)return null;const p={danger:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("polyline",{points:"3 6 5 6 21 6"}),s.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"}),s.jsx("line",{x1:"10",y1:"11",x2:"10",y2:"17"}),s.jsx("line",{x1:"14",y1:"11",x2:"14",y2:"17"})]}),warning:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.jsx("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]}),info:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"10"}),s.jsx("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),s.jsx("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]}),default:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"10"}),s.jsx("path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]})};return s.jsx(Ie,{children:r&&s.jsxs(Q.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[s.jsx("div",{className:"admin-modal-backdrop",onClick:o}),s.jsxs(Q.div,{ref:u,className:"admin-modal admin-confirm-modal",role:"alertdialog","aria-modal":"true","aria-labelledby":"confirm-modal-title",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:[s.jsxs("div",{className:"admin-modal-body admin-confirm-content",children:[s.jsx("div",{className:`admin-confirm-icon admin-confirm-icon-${l}`,children:p[l]}),s.jsx("h2",{id:"confirm-modal-title",className:"admin-confirm-title",children:e}),s.jsx("div",{className:"admin-confirm-message",children:n})]}),s.jsxs("div",{className:"admin-modal-footer",children:[s.jsx("button",{type:"button",onClick:o,className:"admin-btn admin-btn-secondary",disabled:c,children:i}),s.jsx("button",{type:"button",onClick:t,disabled:c,className:"admin-btn admin-btn-primary",children:c?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Zpracování..."]}):a})]})]})]})})}const mn="/api/admin";function vl(r){switch(r){case"smartphone":return s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"5",y:"2",width:"14",height:"20",rx:"2",ry:"2"}),s.jsx("line",{x1:"12",y1:"18",x2:"12",y2:"18"})]});case"tablet":return s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"4",y:"2",width:"16",height:"20",rx:"2",ry:"2"}),s.jsx("line",{x1:"12",y1:"18",x2:"12",y2:"18"})]});default:return s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2",ry:"2"}),s.jsx("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),s.jsx("line",{x1:"12",y1:"17",x2:"12",y2:"21"})]})}}function yl(){const r=xt(),[o,t]=v.useState([]),[e,n]=v.useState(!0),[a,i]=v.useState({isOpen:!1,session:null}),[l,c]=v.useState(!1),[u,p]=v.useState(!1);ze(l);const d=v.useCallback(async()=>{try{const y=await(await ae(`${mn}/sessions.php`)).json();y.success&&t(y.data.sessions||[])}catch{}finally{n(!1)}},[]);v.useEffect(()=>{d()},[d]);const m=async()=>{if(!a.session)return;const h=a.session.id;p(!0);try{const g=await(await ae(`${mn}/sessions.php?id=${h}`,{method:"DELETE"})).json();g.success?(i({isOpen:!1,session:null}),t(k=>k.filter(_=>_.id!==h)),r.success("Relace byla ukončena")):r.error(g.error||"Nepodařilo se ukončit relaci")}catch{r.error("Chyba připojení")}finally{p(!1)}},f=async()=>{p(!0);try{const y=await(await ae(`${mn}/sessions.php?action=all`,{method:"DELETE"})).json();y.success?(c(!1),t(g=>g.filter(k=>k.is_current)),r.success(y.message||"Ostatní relace byly ukončeny")):r.error(y.error||"Nepodařilo se ukončit relace")}catch{r.error("Chyba připojení")}finally{p(!1)}};return s.jsxs(s.Fragment,{children:[s.jsxs(Q.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[s.jsxs("div",{className:"admin-card-header",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"0.75rem"},children:[s.jsx("h2",{className:"admin-card-title",children:"Přihlášená zařízení"}),o.filter(h=>!h.is_current).length>0&&s.jsx("button",{onClick:()=>c(!0),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Odhlásit ostatní"})]}),s.jsxs("div",{className:"admin-card-body",style:{padding:0},children:[e&&s.jsx("div",{className:"admin-skeleton",style:{padding:"1rem",gap:"1rem"},children:[0,1,2].map(h=>s.jsxs("div",{className:"admin-skeleton-row",children:[s.jsx("div",{className:"admin-skeleton-line circle"}),s.jsxs("div",{className:"flex-1",children:[s.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),s.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]})]},h))}),!e&&o.length===0&&s.jsx("div",{className:"text-secondary",style:{padding:"1.5rem",textAlign:"center",fontSize:"0.875rem"},children:"Žádné aktivní relace"}),!e&&o.length>0&&s.jsx("div",{className:"sessions-list",children:o.map(h=>s.jsxs("div",{className:`session-item ${h.is_current?"session-item-current":""}`,children:[s.jsx("div",{className:"session-icon",children:vl(h.device_info?.icon)}),s.jsxs("div",{className:"session-info",children:[s.jsxs("div",{className:"session-device",children:[h.device_info?.browser," na ",h.device_info?.os,h.is_current&&s.jsx("span",{className:"admin-badge admin-badge-success",style:{marginLeft:"0.5rem"},children:"Aktuální"})]}),s.jsxs("div",{className:"session-meta",children:[s.jsx("span",{children:h.ip_address}),s.jsx("span",{className:"session-meta-separator",children:"|"}),s.jsx("span",{children:mo(h.created_at)})]})]}),s.jsx("div",{className:"session-actions",children:!h.is_current&&s.jsx("button",{onClick:()=>i({isOpen:!0,session:h}),className:"admin-btn-icon danger",title:"Ukončit relaci","aria-label":"Ukončit relaci",children:s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),s.jsx("polyline",{points:"16 17 21 12 16 7"}),s.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]})})})]},h.id))})]})]}),s.jsx(Sr,{isOpen:a.isOpen,onClose:()=>i({isOpen:!1,session:null}),onConfirm:m,title:"Ukončit relaci",message:`Opravdu chcete ukončit relaci na zařízení "${a.session?.device_info?.browser} na ${a.session?.device_info?.os}"? Toto zařízení bude odhlášeno.`,confirmText:"Ukončit",cancelText:"Zrušit",type:"danger",loading:u}),s.jsx(Sr,{isOpen:l,onClose:()=>c(!1),onConfirm:f,title:"Odhlásit ostatní zařízení",message:"Opravdu chcete ukončit všechny ostatní relace? Budete odhlášeni ze všech zařízení kromě tohoto.",confirmText:"Odhlásit vše",cancelText:"Zrušit",type:"warning",loading:u})]})}const $e="/api/admin";function gl(){const{user:r,updateUser:o}=tt(),t=xt(),[e,n]=v.useState(null),[a,i]=v.useState(!0),[l,c]=v.useState(!1),[u,p]=v.useState(!1),[d,m]=v.useState(!0),[f,h]=v.useState(!1),[y,g]=v.useState(!1),[k,_]=v.useState(null),[j,C]=v.useState(null),[D,b]=v.useState(""),[w,S]=v.useState(!1),[N,A]=v.useState(null),[T,P]=v.useState("");ze(f),ze(y);const E=v.useCallback(async()=>{try{const $=await(await ae(`${$e}/dashboard.php`)).json();$.success!==!1&&n($)}catch{}finally{i(!1)}},[]);v.useEffect(()=>{E()},[E]);const O=v.useCallback(async()=>{try{const $=await(await ae(`${$e}/totp.php?action=status`)).json();$.success&&p($.data.totp_enabled)}catch{}finally{m(!1)}},[]);v.useEffect(()=>{O()},[O]);const L=()=>{const z=e?.my_shift?.has_ongoing?"departure":"arrival";c(!0);const $=async(Jt={})=>{try{const rt=await(await ae(`${$e}/attendance.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({punch_action:z,...Jt})})).json();rt.success?(t.success(rt.message),E()):t.error(rt.error)}catch{t.error("Chyba připojení")}finally{c(!1)}};if(!navigator.geolocation){$({});return}navigator.geolocation.getCurrentPosition(Jt=>{const{latitude:Fn,longitude:rt,accuracy:ma}=Jt.coords;$({latitude:Fn,longitude:rt,accuracy:ma,address:""})},()=>$({}),{enableHighAccuracy:!0,timeout:1e4,maximumAge:6e4})},R=async()=>{S(!0);try{const $=await(await ae(`${$e}/totp.php?action=setup`,{method:"POST"})).json();$.success?(_($.data.secret),C($.data.qr_uri),b(""),A(null),h(!0)):t.error($.error||"Nepodařilo se vygenerovat 2FA klíč")}catch{t.error("Chyba připojení")}finally{S(!1)}},I=async()=>{if(D.trim()){S(!0);try{const $=await(await ae(`${$e}/totp.php?action=enable`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:D.trim()})})).json();$.success?(p(!0),A($.data.backup_codes),_(null),C(null),o({totpEnabled:!0}),t.success("2FA bylo aktivováno")):(t.error($.error||"Neplatný kód"),b(""))}catch{t.error("Chyba připojení")}finally{S(!1)}}},V=async()=>{if(T.trim()){S(!0);try{const $=await(await ae(`${$e}/totp.php?action=disable`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:T.trim()})})).json();$.success?(p(!1),g(!1),P(""),o({totpEnabled:!1}),t.success("2FA bylo deaktivováno")):(t.error($.error||"Neplatný kód"),P(""))}catch{t.error("Chyba připojení")}finally{S(!1)}}};return s.jsxs("div",{className:"dash",children:[s.jsx(Q.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:s.jsxs("div",{children:[s.jsxs("h1",{className:"admin-page-title",children:["Vítejte zpět, ",r?.fullName||r?.username]}),s.jsx("p",{className:"admin-page-subtitle",children:uo()})]})}),r?.require2FA&&!r?.totpEnabled&&s.jsx(Q.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},style:{border:"2px solid var(--danger)",background:"var(--danger-light)"},children:s.jsxs("div",{className:"admin-card-body",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1rem",flexWrap:"wrap"},children:[s.jsxs("div",{className:"flex-row-gap",children:[s.jsx("div",{style:{width:40,height:40,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"var(--danger-light)",color:"var(--danger)",flexShrink:0},children:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.jsx("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]})}),s.jsxs("div",{children:[s.jsx("div",{className:"fw-600",children:"Dvoufaktorové ověření je povinné"}),s.jsx("div",{className:"text-secondary",style:{fontSize:"0.875rem"},children:"Administrátor vyžaduje aktivaci 2FA. Dokud ji neaktivujete, nemáte přístup k ostatním sekcím systému."})]})]}),s.jsx("button",{onClick:R,disabled:w,className:"admin-btn admin-btn-primary",style:{flexShrink:0},children:w?"Generuji...":"Aktivovat 2FA nyní"})]})}),a&&s.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.25rem"},children:[s.jsx("div",{className:"dash-kpi-grid dash-kpi-4",children:[0,1,2,3].map(z=>s.jsx("div",{className:"admin-skeleton-line h-24",style:{borderRadius:"10px"}},z))}),s.jsx("div",{className:"dash-quick-actions",children:[0,1,2,3].map(z=>s.jsx("div",{className:"admin-skeleton-line",style:{height:"52px",borderRadius:"10px"}},z))}),s.jsxs("div",{className:"dash-main-grid",children:[s.jsx("div",{className:"admin-skeleton-line",style:{height:"320px",borderRadius:"10px"}}),s.jsx("div",{className:"admin-skeleton-line",style:{height:"320px",borderRadius:"10px"}}),s.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"1.25rem"},children:[s.jsx("div",{className:"admin-skeleton-line",style:{height:"150px",borderRadius:"10px"}}),s.jsx("div",{className:"admin-skeleton-line",style:{height:"150px",borderRadius:"10px"}})]})]}),s.jsxs("div",{className:"dash-bottom",children:[s.jsx("div",{className:"admin-skeleton-line",style:{height:"200px",borderRadius:"10px"}}),s.jsx("div",{className:"admin-skeleton-line",style:{height:"200px",borderRadius:"10px"}})]})]}),!a&&s.jsx(xo,{dashData:e}),!a&&s.jsx(cl,{dashData:e,punching:l,onPunch:L}),!a&&s.jsxs(Q.div,{className:"dash-main-grid",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[s.jsx(ul,{activities:e?.recent_activity}),s.jsx(pl,{attendance:e?.attendance}),s.jsxs("div",{className:"dash-right-col",children:[e?.projects&&s.jsxs("div",{className:"admin-card",children:[s.jsxs("div",{className:"admin-card-header flex-between",children:[s.jsx("h2",{className:"admin-card-title",children:"Aktivní projekty"}),s.jsx(Qe,{to:"/projects",className:"admin-btn admin-btn-primary admin-btn-sm",children:"Vše →"})]}),s.jsxs("div",{className:"admin-card-body",style:{padding:0},children:[e.projects.active_projects.length===0&&s.jsx("div",{className:"dash-empty-row",children:"Žádné aktivní projekty"}),e.projects.active_projects.map(z=>s.jsxs(Qe,{to:`/projects/${z.id}`,className:"dash-project-row",children:[s.jsx("div",{className:"dash-project-name",children:z.name}),z.customer_name&&s.jsx("div",{className:"dash-project-customer",children:z.customer_name})]},z.id))]})]}),e?.offers&&s.jsxs("div",{className:"admin-card",children:[s.jsxs("div",{className:"admin-card-header flex-between",children:[s.jsx("h2",{className:"admin-card-title",children:"Nabídky"}),s.jsx(Qe,{to:"/offers",className:"admin-btn admin-btn-primary admin-btn-sm",children:"Zobrazit →"})]}),s.jsxs("div",{className:"admin-card-body",style:{padding:0},children:[s.jsxs("div",{className:"dash-stat-row",children:[s.jsx("span",{children:"Otevřené"}),s.jsx("span",{className:"admin-badge admin-badge-info",children:e.offers.open_count})]}),s.jsxs("div",{className:"dash-stat-row",children:[s.jsx("span",{children:"Převedené na objednávku"}),s.jsx("span",{className:"admin-badge admin-badge-success",children:e.offers.converted_count})]}),s.jsxs("div",{className:"dash-stat-row",children:[s.jsx("span",{children:"Prošlé"}),s.jsx("span",{className:"admin-badge admin-badge-warning",children:e.offers.expired_count})]})]})]})]})]}),!a&&s.jsxs("div",{className:"dash-bottom",children:[s.jsx(ml,{totpEnabled:u,totpLoading:d,totpSubmitting:w,onStart2FASetup:R,onConfirm2FA:I,onDisable2FA:V,totpSecret:k,totpQrUri:j,totpCode:D,setTotpCode:b,backupCodes:N,setBackupCodes:A,show2FASetup:f,setShow2FASetup:h,show2FADisable:y,setShow2FADisable:g,disableCode:T,setDisableCode:P}),s.jsx(yl,{})]})]})}const xl=v.lazy(()=>K(()=>import("./Users-D14q1sI4.js"),__vite__mapDeps([0,1,2,3,4]))),bl=v.lazy(()=>K(()=>import("./Attendance-HkkqNom4.js"),__vite__mapDeps([5,1,2,6,3,4]))),kl=v.lazy(()=>K(()=>import("./AttendanceHistory-DTktjavL.js"),__vite__mapDeps([7,1,2,4,3,6]))),wl=v.lazy(()=>K(()=>import("./AttendanceAdmin-DcoOGyDw.js"),__vite__mapDeps([8,1,2,3,6,4]))),_l=v.lazy(()=>K(()=>import("./AttendanceBalances-BSQpPHY4.js"),__vite__mapDeps([9,1,2,3,4]))),Dl=v.lazy(()=>K(()=>import("./AttendanceCreate-CzMSkeJg.js"),__vite__mapDeps([10,1,2,3,4]))),jl=v.lazy(()=>K(()=>import("./LeaveRequests-BALGw7zC.js"),__vite__mapDeps([11,1,2,3,6,4]))),Sl=v.lazy(()=>K(()=>import("./LeaveApproval-NYDUrW_i.js"),__vite__mapDeps([12,1,2,6,3,4]))),Cl=v.lazy(()=>K(()=>import("./AttendanceLocation-5-mGEni2.js"),__vite__mapDeps([13,1,2,3,6,4]))),Nl=v.lazy(()=>K(()=>import("./Trips-DHINOVlF.js"),__vite__mapDeps([14,1,2,3,6,4]))),Ml=v.lazy(()=>K(()=>import("./TripsHistory-BSSzF9uv.js"),__vite__mapDeps([15,1,2,3,6,4]))),El=v.lazy(()=>K(()=>import("./TripsAdmin-CfpRqegu.js"),__vite__mapDeps([16,1,2,4,3,6]))),Pl=v.lazy(()=>K(()=>import("./Vehicles-uyCHwC9v.js"),__vite__mapDeps([17,1,2,3,4]))),Tl=v.lazy(()=>K(()=>import("./Offers-B58QSeyz.js"),__vite__mapDeps([18,1,2,3,19,20,4]))),Cr=v.lazy(()=>K(()=>import("./OfferDetail-uZQN0hWh.js"),__vite__mapDeps([21,1,2,3,22,4,23,24]))),Ol=v.lazy(()=>K(()=>import("./OffersCustomers-DRNB48Z-.js"),__vite__mapDeps([25,1,2,3,4]))),Al=v.lazy(()=>K(()=>import("./OffersTemplates-CmYh_zlm.js"),__vite__mapDeps([26,1,2,3,23,24,4]))),Rl=v.lazy(()=>K(()=>import("./CompanySettings-7Kh5OyP9.js"),__vite__mapDeps([27,1,2,3,4]))),Ll=v.lazy(()=>K(()=>import("./Orders-CtS3KkKW.js"),__vite__mapDeps([28,1,2,3,19,20,4]))),Il=v.lazy(()=>K(()=>import("./OrderDetail-CV53xEih.js"),__vite__mapDeps([29,1,2,4,3]))),Fl=v.lazy(()=>K(()=>import("./Projects-DvLHy4pA.js"),__vite__mapDeps([30,1,2,3,19,20,4]))),Yl=v.lazy(()=>K(()=>import("./ProjectCreate-CXtZIMX9.js"),__vite__mapDeps([31,1,2,3,4]))),Wl=v.lazy(()=>K(()=>import("./ProjectDetail-TbZLFSAA.js"),__vite__mapDeps([32,1,2,3,4]))),zl=v.lazy(()=>K(()=>import("./Invoices-CbhjIEZE.js"),__vite__mapDeps([33,1,2,3,19,20,4]))),Bl=v.lazy(()=>K(()=>import("./InvoiceCreate-Bqil74eu.js"),__vite__mapDeps([34,1,2,3,22,4]))),Hl=v.lazy(()=>K(()=>import("./InvoiceDetail-DaTiJC_4.js"),__vite__mapDeps([35,1,2,3,4]))),Vl=v.lazy(()=>K(()=>import("./Settings-CCjKAfuK.js"),__vite__mapDeps([36,1,2,4]))),$l=v.lazy(()=>K(()=>import("./AuditLog-D1e5uhdu.js"),__vite__mapDeps([37,1,2,3,20,4]))),Kl=v.lazy(()=>K(()=>import("./NotFound-Cm3yLPlV.js"),__vite__mapDeps([38,1,2])));function Ul(){return s.jsx(Va,{children:s.jsxs($a,{children:[s.jsx(oo,{}),s.jsx(Ua,{children:s.jsx(v.Suspense,{fallback:s.jsx("div",{className:"admin-loading",children:s.jsx("div",{className:"admin-spinner"})}),children:s.jsxs(Pr,{children:[s.jsx(B,{path:"login",element:s.jsx(so,{})}),s.jsxs(B,{element:s.jsx(ro,{}),children:[s.jsx(B,{index:!0,element:s.jsx(gl,{})}),s.jsx(B,{path:"users",element:s.jsx(xl,{})}),s.jsx(B,{path:"attendance",element:s.jsx(bl,{})}),s.jsx(B,{path:"attendance/history",element:s.jsx(kl,{})}),s.jsx(B,{path:"attendance/admin",element:s.jsx(wl,{})}),s.jsx(B,{path:"attendance/balances",element:s.jsx(_l,{})}),s.jsx(B,{path:"attendance/requests",element:s.jsx(jl,{})}),s.jsx(B,{path:"attendance/approval",element:s.jsx(Sl,{})}),s.jsx(B,{path:"attendance/create",element:s.jsx(Dl,{})}),s.jsx(B,{path:"attendance/location/:id",element:s.jsx(Cl,{})}),s.jsx(B,{path:"trips",element:s.jsx(Nl,{})}),s.jsx(B,{path:"trips/history",element:s.jsx(Ml,{})}),s.jsx(B,{path:"trips/admin",element:s.jsx(El,{})}),s.jsx(B,{path:"vehicles",element:s.jsx(Pl,{})}),s.jsx(B,{path:"offers",element:s.jsx(Tl,{})}),s.jsx(B,{path:"offers/new",element:s.jsx(Cr,{})}),s.jsx(B,{path:"offers/:id",element:s.jsx(Cr,{})}),s.jsx(B,{path:"offers/customers",element:s.jsx(Ol,{})}),s.jsx(B,{path:"offers/templates",element:s.jsx(Al,{})}),s.jsx(B,{path:"company/settings",element:s.jsx(Rl,{})}),s.jsx(B,{path:"orders",element:s.jsx(Ll,{})}),s.jsx(B,{path:"orders/:id",element:s.jsx(Il,{})}),s.jsx(B,{path:"projects",element:s.jsx(Fl,{})}),s.jsx(B,{path:"projects/new",element:s.jsx(Yl,{})}),s.jsx(B,{path:"projects/:id",element:s.jsx(Wl,{})}),s.jsx(B,{path:"invoices",element:s.jsx(zl,{})}),s.jsx(B,{path:"invoices/new",element:s.jsx(Bl,{})}),s.jsx(B,{path:"invoices/:id",element:s.jsx(Hl,{})}),s.jsx(B,{path:"settings",element:s.jsx(Vl,{})}),s.jsx(B,{path:"audit-log",element:s.jsx($l,{})})]}),s.jsx(B,{path:"*",element:s.jsx(Kl,{})})]})})})]})})}function Ql(){return s.jsx("div",{style:{minHeight:"100dvh",display:"flex",alignItems:"center",justifyContent:"center",background:"var(--bg-primary)"},children:s.jsx("div",{className:"admin-spinner"})})}function Zl(){return s.jsx(v.Suspense,{fallback:s.jsx(Ql,{}),children:s.jsx(Pr,{children:s.jsx(B,{path:"/*",element:s.jsx(Ul,{})})})})}gn.createRoot(document.getElementById("root")).render(s.jsx(x.StrictMode,{children:s.jsx(ba,{future:{v7_startTransition:!0,v7_relativeSplatPath:!0},children:s.jsx(Za,{children:s.jsx(Zl,{})})})}));export{ll as A,Sr as C,tn as F,K as _,xt as a,ze as b,ae as c,tc as d,ec as e,ho as f,nn as g,tt as u}; +`)),C.success("Kódy zkopírovány")},className:"admin-btn admin-btn-secondary admin-btn-sm",children:[s.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),s.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Kopírovat kódy"]})})]}):s.jsxs("div",{children:[s.jsx("p",{className:"text-secondary",style:{fontSize:"0.875rem",marginBottom:"1rem"},children:"Naskenujte QR kód v autentizační aplikaci (Google Authenticator, Authy, Microsoft Authenticator apod.)"}),l&&s.jsx("div",{style:{textAlign:"center",marginBottom:"1rem"},children:s.jsx("canvas",{ref:E=>{E&&l&&K(async()=>{const{renderQR:O}=await import("./qrcode-CBP_ltkV.js");return{renderQR:O}},[]).then(({renderQR:O})=>O(E,l))},style:{width:200,height:200,borderRadius:"0.5rem",border:"1px solid var(--border-color)"}})}),i&&s.jsxs("div",{className:"mb-4",children:[s.jsx("label",{className:"admin-form-label",style:{fontSize:"0.75rem"},children:"Nebo zadejte klíč ručně:"}),s.jsxs("div",{style:{padding:"0.5rem 0.75rem",background:"var(--bg-secondary)",borderRadius:"0.375rem",fontFamily:"monospace",fontSize:"0.875rem",wordBreak:"break-all",color:"var(--text-primary)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"0.5rem"},children:[s.jsx("span",{children:i}),s.jsx("button",{onClick:()=>{navigator.clipboard?.writeText(i),C.success("Klíč zkopírován")},className:"admin-btn-icon",title:"Kopírovat","aria-label":"Kopírovat",style:{flexShrink:0},children:s.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),s.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})})]})]}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Ověřovací kód z aplikace"}),s.jsx("input",{ref:D,type:"text",inputMode:"numeric",pattern:"[0-9]*",maxLength:6,value:c,onChange:E=>u(E.target.value.replace(/\D/g,"")),placeholder:"000000",className:"admin-form-input",style:{textAlign:"center",fontSize:"1.25rem",letterSpacing:"0.4rem",fontFamily:"monospace"},onKeyDown:E=>{E.key==="Enter"&&c.length===6&&n()}})]})]})}),s.jsx("div",{className:"admin-modal-footer",children:p?s.jsx("button",{onClick:()=>{f(!1),d(null)},className:"admin-btn admin-btn-primary",children:"Rozumím, uložil jsem si kódy"}):s.jsxs(s.Fragment,{children:[s.jsx("button",{onClick:()=>f(!1),className:"admin-btn admin-btn-secondary",disabled:t,children:"Zrušit"}),s.jsx("button",{onClick:n,className:"admin-btn admin-btn-primary",disabled:t||c.length!==6,children:t?"Ověřuji...":"Aktivovat 2FA"})]})})]})]})}),s.jsx(Ie,{children:h&&s.jsxs(Q.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[s.jsx("div",{className:"admin-modal-backdrop",onClick:()=>y(!1)}),s.jsxs(Q.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:[s.jsx("div",{className:"admin-modal-header",children:s.jsx("h2",{className:"admin-modal-title",children:"Deaktivovat 2FA"})}),s.jsxs("div",{className:"admin-modal-body",children:[s.jsx("p",{style:{color:"var(--text-secondary)",fontSize:"0.875rem",marginBottom:"1rem"},children:"Pro deaktivaci dvoufaktorového ověření zadejte aktuální kód z autentizační aplikace."}),s.jsxs("div",{className:"admin-form-group",children:[s.jsx("label",{className:"admin-form-label",children:"Ověřovací kód"}),s.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",maxLength:6,value:g,onChange:E=>k(E.target.value.replace(/\D/g,"")),placeholder:"000000",className:"admin-form-input",style:{textAlign:"center",fontSize:"1.25rem",letterSpacing:"0.4rem",fontFamily:"monospace"},onKeyDown:E=>{E.key==="Enter"&&g.length===6&&a()},autoFocus:!0})]})]}),s.jsxs("div",{className:"admin-modal-footer",children:[s.jsx("button",{onClick:()=>y(!1),className:"admin-btn admin-btn-secondary",disabled:t,children:"Zrušit"}),s.jsx("button",{onClick:a,className:"admin-btn admin-btn-primary",disabled:t||g.length!==6,children:t?"Deaktivuji...":"Deaktivovat 2FA"})]})]})]})})]})}const jr='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function hl(r){const o=v.useRef(null);return v.useEffect(()=>{if(!r||!o.current)return;const t=o.current,e=document.activeElement,n=t.querySelectorAll(jr);n.length>0&&n[0].focus();const a=i=>{if(i.key!=="Tab")return;const l=t.querySelectorAll(jr);if(l.length===0)return;const c=l[0],u=l[l.length-1];i.shiftKey&&document.activeElement===c?(i.preventDefault(),u.focus()):!i.shiftKey&&document.activeElement===u&&(i.preventDefault(),c.focus())};return document.addEventListener("keydown",a),()=>{document.removeEventListener("keydown",a),e&&typeof e.focus=="function"&&e.focus()}},[r]),o}function Sr({isOpen:r,onClose:o,onConfirm:t,title:e="Potvrdit akci",message:n="Opravdu chcete provést tuto akci?",confirmText:a="Potvrdit",cancelText:i="Zrušit",type:l="danger",loading:c=!1}){ze(r);const u=hl(r);if(v.useEffect(()=>{if(!r)return;const d=m=>{m.key==="Escape"&&o()};return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[r,o]),!r)return null;const p={danger:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("polyline",{points:"3 6 5 6 21 6"}),s.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"}),s.jsx("line",{x1:"10",y1:"11",x2:"10",y2:"17"}),s.jsx("line",{x1:"14",y1:"11",x2:"14",y2:"17"})]}),warning:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.jsx("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]}),info:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"10"}),s.jsx("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),s.jsx("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]}),default:s.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("circle",{cx:"12",cy:"12",r:"10"}),s.jsx("path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]})};return s.jsx(Ie,{children:r&&s.jsxs(Q.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[s.jsx("div",{className:"admin-modal-backdrop",onClick:o}),s.jsxs(Q.div,{ref:u,className:"admin-modal admin-confirm-modal",role:"alertdialog","aria-modal":"true","aria-labelledby":"confirm-modal-title",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:[s.jsxs("div",{className:"admin-modal-body admin-confirm-content",children:[s.jsx("div",{className:`admin-confirm-icon admin-confirm-icon-${l}`,children:p[l]}),s.jsx("h2",{id:"confirm-modal-title",className:"admin-confirm-title",children:e}),s.jsx("div",{className:"admin-confirm-message",children:n})]}),s.jsxs("div",{className:"admin-modal-footer",children:[s.jsx("button",{type:"button",onClick:o,className:"admin-btn admin-btn-secondary",disabled:c,children:i}),s.jsx("button",{type:"button",onClick:t,disabled:c,className:"admin-btn admin-btn-primary",children:c?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Zpracování..."]}):a})]})]})]})})}const mn="/api/admin";function vl(r){switch(r){case"smartphone":return s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"5",y:"2",width:"14",height:"20",rx:"2",ry:"2"}),s.jsx("line",{x1:"12",y1:"18",x2:"12",y2:"18"})]});case"tablet":return s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"4",y:"2",width:"16",height:"20",rx:"2",ry:"2"}),s.jsx("line",{x1:"12",y1:"18",x2:"12",y2:"18"})]});default:return s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2",ry:"2"}),s.jsx("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),s.jsx("line",{x1:"12",y1:"17",x2:"12",y2:"21"})]})}}function yl(){const r=xt(),[o,t]=v.useState([]),[e,n]=v.useState(!0),[a,i]=v.useState({isOpen:!1,session:null}),[l,c]=v.useState(!1),[u,p]=v.useState(!1);ze(l);const d=v.useCallback(async()=>{try{const y=await(await ae(`${mn}/sessions.php`)).json();y.success&&t(y.data.sessions||[])}catch{}finally{n(!1)}},[]);v.useEffect(()=>{d()},[d]);const m=async()=>{if(!a.session)return;const h=a.session.id;p(!0);try{const g=await(await ae(`${mn}/sessions.php?id=${h}`,{method:"DELETE"})).json();g.success?(i({isOpen:!1,session:null}),t(k=>k.filter(_=>_.id!==h)),r.success("Relace byla ukončena")):r.error(g.error||"Nepodařilo se ukončit relaci")}catch{r.error("Chyba připojení")}finally{p(!1)}},f=async()=>{p(!0);try{const y=await(await ae(`${mn}/sessions.php?action=all`,{method:"DELETE"})).json();y.success?(c(!1),t(g=>g.filter(k=>k.is_current)),r.success(y.message||"Ostatní relace byly ukončeny")):r.error(y.error||"Nepodařilo se ukončit relace")}catch{r.error("Chyba připojení")}finally{p(!1)}};return s.jsxs(s.Fragment,{children:[s.jsxs(Q.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[s.jsxs("div",{className:"admin-card-header",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"0.75rem"},children:[s.jsx("h2",{className:"admin-card-title",children:"Přihlášená zařízení"}),o.filter(h=>!h.is_current).length>0&&s.jsx("button",{onClick:()=>c(!0),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Odhlásit ostatní"})]}),s.jsxs("div",{className:"admin-card-body",style:{padding:0},children:[e&&s.jsx("div",{className:"admin-skeleton",style:{padding:"1rem",gap:"1rem"},children:[0,1,2].map(h=>s.jsxs("div",{className:"admin-skeleton-row",children:[s.jsx("div",{className:"admin-skeleton-line circle"}),s.jsxs("div",{className:"flex-1",children:[s.jsx("div",{className:"admin-skeleton-line w-1/2",style:{marginBottom:"0.5rem"}}),s.jsx("div",{className:"admin-skeleton-line w-1/3",style:{height:"10px"}})]})]},h))}),!e&&o.length===0&&s.jsx("div",{className:"text-secondary",style:{padding:"1.5rem",textAlign:"center",fontSize:"0.875rem"},children:"Žádné aktivní relace"}),!e&&o.length>0&&s.jsx("div",{className:"sessions-list",children:o.map(h=>s.jsxs("div",{className:`session-item ${h.is_current?"session-item-current":""}`,children:[s.jsx("div",{className:"session-icon",children:vl(h.device_info?.icon)}),s.jsxs("div",{className:"session-info",children:[s.jsxs("div",{className:"session-device",children:[h.device_info?.browser," na ",h.device_info?.os,h.is_current&&s.jsx("span",{className:"admin-badge admin-badge-success",style:{marginLeft:"0.5rem"},children:"Aktuální"})]}),s.jsxs("div",{className:"session-meta",children:[s.jsx("span",{children:h.ip_address}),s.jsx("span",{className:"session-meta-separator",children:"|"}),s.jsx("span",{children:mo(h.created_at)})]})]}),s.jsx("div",{className:"session-actions",children:!h.is_current&&s.jsx("button",{onClick:()=>i({isOpen:!0,session:h}),className:"admin-btn-icon danger",title:"Ukončit relaci","aria-label":"Ukončit relaci",children:s.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),s.jsx("polyline",{points:"16 17 21 12 16 7"}),s.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]})})})]},h.id))})]})]}),s.jsx(Sr,{isOpen:a.isOpen,onClose:()=>i({isOpen:!1,session:null}),onConfirm:m,title:"Ukončit relaci",message:`Opravdu chcete ukončit relaci na zařízení "${a.session?.device_info?.browser} na ${a.session?.device_info?.os}"? Toto zařízení bude odhlášeno.`,confirmText:"Ukončit",cancelText:"Zrušit",type:"danger",loading:u}),s.jsx(Sr,{isOpen:l,onClose:()=>c(!1),onConfirm:f,title:"Odhlásit ostatní zařízení",message:"Opravdu chcete ukončit všechny ostatní relace? Budete odhlášeni ze všech zařízení kromě tohoto.",confirmText:"Odhlásit vše",cancelText:"Zrušit",type:"warning",loading:u})]})}const $e="/api/admin";function gl(){const{user:r,updateUser:o}=tt(),t=xt(),[e,n]=v.useState(null),[a,i]=v.useState(!0),[l,c]=v.useState(!1),[u,p]=v.useState(!1),[d,m]=v.useState(!0),[f,h]=v.useState(!1),[y,g]=v.useState(!1),[k,_]=v.useState(null),[j,C]=v.useState(null),[D,b]=v.useState(""),[w,S]=v.useState(!1),[N,A]=v.useState(null),[T,P]=v.useState("");ze(f),ze(y);const E=v.useCallback(async()=>{try{const $=await(await ae(`${$e}/dashboard.php`)).json();$.success!==!1&&n($)}catch{}finally{i(!1)}},[]);v.useEffect(()=>{E()},[E]);const O=v.useCallback(async()=>{try{const $=await(await ae(`${$e}/totp.php?action=status`)).json();$.success&&p($.data.totp_enabled)}catch{}finally{m(!1)}},[]);v.useEffect(()=>{O()},[O]);const L=()=>{const z=e?.my_shift?.has_ongoing?"departure":"arrival";c(!0);const $=async(Jt={})=>{try{const rt=await(await ae(`${$e}/attendance.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({punch_action:z,...Jt})})).json();rt.success?(t.success(rt.message),E()):t.error(rt.error)}catch{t.error("Chyba připojení")}finally{c(!1)}};if(!navigator.geolocation){$({});return}navigator.geolocation.getCurrentPosition(Jt=>{const{latitude:Fn,longitude:rt,accuracy:ma}=Jt.coords;$({latitude:Fn,longitude:rt,accuracy:ma,address:""})},()=>$({}),{enableHighAccuracy:!0,timeout:1e4,maximumAge:6e4})},R=async()=>{S(!0);try{const $=await(await ae(`${$e}/totp.php?action=setup`,{method:"POST"})).json();$.success?(_($.data.secret),C($.data.qr_uri),b(""),A(null),h(!0)):t.error($.error||"Nepodařilo se vygenerovat 2FA klíč")}catch{t.error("Chyba připojení")}finally{S(!1)}},I=async()=>{if(D.trim()){S(!0);try{const $=await(await ae(`${$e}/totp.php?action=enable`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:D.trim()})})).json();$.success?(p(!0),A($.data.backup_codes),_(null),C(null),o({totpEnabled:!0}),t.success("2FA bylo aktivováno")):(t.error($.error||"Neplatný kód"),b(""))}catch{t.error("Chyba připojení")}finally{S(!1)}}},V=async()=>{if(T.trim()){S(!0);try{const $=await(await ae(`${$e}/totp.php?action=disable`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:T.trim()})})).json();$.success?(p(!1),g(!1),P(""),o({totpEnabled:!1}),t.success("2FA bylo deaktivováno")):(t.error($.error||"Neplatný kód"),P(""))}catch{t.error("Chyba připojení")}finally{S(!1)}}};return s.jsxs("div",{className:"dash",children:[s.jsx(Q.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:s.jsxs("div",{children:[s.jsxs("h1",{className:"admin-page-title",children:["Vítejte zpět, ",r?.fullName||r?.username]}),s.jsx("p",{className:"admin-page-subtitle",children:uo()})]})}),r?.require2FA&&!r?.totpEnabled&&s.jsx(Q.div,{className:"admin-card",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},style:{border:"2px solid var(--danger)",background:"var(--danger-light)"},children:s.jsxs("div",{className:"admin-card-body",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1rem",flexWrap:"wrap"},children:[s.jsxs("div",{className:"flex-row-gap",children:[s.jsx("div",{style:{width:40,height:40,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"var(--danger-light)",color:"var(--danger)",flexShrink:0},children:s.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[s.jsx("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.jsx("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]})}),s.jsxs("div",{children:[s.jsx("div",{className:"fw-600",children:"Dvoufaktorové ověření je povinné"}),s.jsx("div",{className:"text-secondary",style:{fontSize:"0.875rem"},children:"Administrátor vyžaduje aktivaci 2FA. Dokud ji neaktivujete, nemáte přístup k ostatním sekcím systému."})]})]}),s.jsx("button",{onClick:R,disabled:w,className:"admin-btn admin-btn-primary",style:{flexShrink:0},children:w?"Generuji...":"Aktivovat 2FA nyní"})]})}),a&&s.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.25rem"},children:[s.jsx("div",{className:"dash-kpi-grid dash-kpi-4",children:[0,1,2,3].map(z=>s.jsx("div",{className:"admin-skeleton-line h-24",style:{borderRadius:"10px"}},z))}),s.jsx("div",{className:"dash-quick-actions",children:[0,1,2,3].map(z=>s.jsx("div",{className:"admin-skeleton-line",style:{height:"52px",borderRadius:"10px"}},z))}),s.jsxs("div",{className:"dash-main-grid",children:[s.jsx("div",{className:"admin-skeleton-line",style:{height:"320px",borderRadius:"10px"}}),s.jsx("div",{className:"admin-skeleton-line",style:{height:"320px",borderRadius:"10px"}}),s.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"1.25rem"},children:[s.jsx("div",{className:"admin-skeleton-line",style:{height:"150px",borderRadius:"10px"}}),s.jsx("div",{className:"admin-skeleton-line",style:{height:"150px",borderRadius:"10px"}})]})]}),s.jsxs("div",{className:"dash-bottom",children:[s.jsx("div",{className:"admin-skeleton-line",style:{height:"200px",borderRadius:"10px"}}),s.jsx("div",{className:"admin-skeleton-line",style:{height:"200px",borderRadius:"10px"}})]})]}),!a&&s.jsx(xo,{dashData:e}),!a&&s.jsx(cl,{dashData:e,punching:l,onPunch:L}),!a&&s.jsxs(Q.div,{className:"dash-main-grid",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[s.jsx(ul,{activities:e?.recent_activity}),s.jsx(pl,{attendance:e?.attendance}),s.jsxs("div",{className:"dash-right-col",children:[e?.projects&&s.jsxs("div",{className:"admin-card",children:[s.jsxs("div",{className:"admin-card-header flex-between",children:[s.jsx("h2",{className:"admin-card-title",children:"Aktivní projekty"}),s.jsx(Qe,{to:"/projects",className:"admin-btn admin-btn-primary admin-btn-sm",children:"Vše →"})]}),s.jsxs("div",{className:"admin-card-body",style:{padding:0},children:[e.projects.active_projects.length===0&&s.jsx("div",{className:"dash-empty-row",children:"Žádné aktivní projekty"}),e.projects.active_projects.map(z=>s.jsxs(Qe,{to:`/projects/${z.id}`,className:"dash-project-row",children:[s.jsx("div",{className:"dash-project-name",children:z.name}),z.customer_name&&s.jsx("div",{className:"dash-project-customer",children:z.customer_name})]},z.id))]})]}),e?.offers&&s.jsxs("div",{className:"admin-card",children:[s.jsxs("div",{className:"admin-card-header flex-between",children:[s.jsx("h2",{className:"admin-card-title",children:"Nabídky"}),s.jsx(Qe,{to:"/offers",className:"admin-btn admin-btn-primary admin-btn-sm",children:"Zobrazit →"})]}),s.jsxs("div",{className:"admin-card-body",style:{padding:0},children:[s.jsxs("div",{className:"dash-stat-row",children:[s.jsx("span",{children:"Otevřené"}),s.jsx("span",{className:"admin-badge admin-badge-info",children:e.offers.open_count})]}),s.jsxs("div",{className:"dash-stat-row",children:[s.jsx("span",{children:"Převedené na objednávku"}),s.jsx("span",{className:"admin-badge admin-badge-success",children:e.offers.converted_count})]}),s.jsxs("div",{className:"dash-stat-row",children:[s.jsx("span",{children:"Prošlé"}),s.jsx("span",{className:"admin-badge admin-badge-warning",children:e.offers.expired_count})]})]})]})]})]}),!a&&s.jsxs("div",{className:"dash-bottom",children:[s.jsx(ml,{totpEnabled:u,totpLoading:d,totpSubmitting:w,onStart2FASetup:R,onConfirm2FA:I,onDisable2FA:V,totpSecret:k,totpQrUri:j,totpCode:D,setTotpCode:b,backupCodes:N,setBackupCodes:A,show2FASetup:f,setShow2FASetup:h,show2FADisable:y,setShow2FADisable:g,disableCode:T,setDisableCode:P}),s.jsx(yl,{})]})]})}const xl=v.lazy(()=>K(()=>import("./Users-WLgfF24I.js"),__vite__mapDeps([0,1,2,3,4]))),bl=v.lazy(()=>K(()=>import("./Attendance-Cx77BQZA.js"),__vite__mapDeps([5,1,2,6,3,4]))),kl=v.lazy(()=>K(()=>import("./AttendanceHistory-CDqc-b-N.js"),__vite__mapDeps([7,1,2,4,3,6]))),wl=v.lazy(()=>K(()=>import("./AttendanceAdmin-Cdnpy6ht.js"),__vite__mapDeps([8,1,2,3,6,4]))),_l=v.lazy(()=>K(()=>import("./AttendanceBalances-DMsizH4J.js"),__vite__mapDeps([9,1,2,3,4]))),Dl=v.lazy(()=>K(()=>import("./AttendanceCreate-BYIYsFoJ.js"),__vite__mapDeps([10,1,2,3,4]))),jl=v.lazy(()=>K(()=>import("./LeaveRequests-CDRutKVT.js"),__vite__mapDeps([11,1,2,3,6,4]))),Sl=v.lazy(()=>K(()=>import("./LeaveApproval-CWyAOhiD.js"),__vite__mapDeps([12,1,2,6,3,4]))),Cl=v.lazy(()=>K(()=>import("./AttendanceLocation-DLvgzSPu.js"),__vite__mapDeps([13,1,2,3,6,4]))),Nl=v.lazy(()=>K(()=>import("./Trips-CmUyrh1d.js"),__vite__mapDeps([14,1,2,3,6,4]))),Ml=v.lazy(()=>K(()=>import("./TripsHistory-Dpa1fSnD.js"),__vite__mapDeps([15,1,2,3,6,4]))),El=v.lazy(()=>K(()=>import("./TripsAdmin-Czj2qxrv.js"),__vite__mapDeps([16,1,2,4,3,6]))),Pl=v.lazy(()=>K(()=>import("./Vehicles-Dg7Wxtdg.js"),__vite__mapDeps([17,1,2,3,4]))),Tl=v.lazy(()=>K(()=>import("./Offers-ZNWwIePg.js"),__vite__mapDeps([18,1,2,3,19,20,4]))),Cr=v.lazy(()=>K(()=>import("./OfferDetail-CToaKJtE.js"),__vite__mapDeps([21,1,2,3,22,4,23,24]))),Ol=v.lazy(()=>K(()=>import("./OffersCustomers-55BUJuXS.js"),__vite__mapDeps([25,1,2,3,4]))),Al=v.lazy(()=>K(()=>import("./OffersTemplates-B33mRH0a.js"),__vite__mapDeps([26,1,2,3,23,24,4]))),Rl=v.lazy(()=>K(()=>import("./CompanySettings-BLIuJNHl.js"),__vite__mapDeps([27,1,2,3,4]))),Ll=v.lazy(()=>K(()=>import("./Orders-D38dm3L_.js"),__vite__mapDeps([28,1,2,3,19,20,4]))),Il=v.lazy(()=>K(()=>import("./OrderDetail-BuD42-wn.js"),__vite__mapDeps([29,1,2,4,3]))),Fl=v.lazy(()=>K(()=>import("./Projects-srNNxmx0.js"),__vite__mapDeps([30,1,2,3,19,20,4]))),Yl=v.lazy(()=>K(()=>import("./ProjectCreate-DBbdjy48.js"),__vite__mapDeps([31,1,2,3,4]))),Wl=v.lazy(()=>K(()=>import("./ProjectDetail-B_QNS7Ph.js"),__vite__mapDeps([32,1,2,3,4]))),zl=v.lazy(()=>K(()=>import("./Invoices-BeRSP7xa.js"),__vite__mapDeps([33,1,2,3,19,20,4]))),Bl=v.lazy(()=>K(()=>import("./InvoiceCreate-BkvZM33j.js"),__vite__mapDeps([34,1,2,3,22,4]))),Hl=v.lazy(()=>K(()=>import("./InvoiceDetail-CeYg6TWO.js"),__vite__mapDeps([35,1,2,3,4]))),Vl=v.lazy(()=>K(()=>import("./Settings-BAJF08Eo.js"),__vite__mapDeps([36,1,2,4]))),$l=v.lazy(()=>K(()=>import("./AuditLog-CyUZGIls.js"),__vite__mapDeps([37,1,2,3,20,4]))),Kl=v.lazy(()=>K(()=>import("./NotFound-Cm3yLPlV.js"),__vite__mapDeps([38,1,2])));function Ul(){return s.jsx(Va,{children:s.jsxs($a,{children:[s.jsx(oo,{}),s.jsx(Ua,{children:s.jsx(v.Suspense,{fallback:s.jsx("div",{className:"admin-loading",children:s.jsx("div",{className:"admin-spinner"})}),children:s.jsxs(Pr,{children:[s.jsx(B,{path:"login",element:s.jsx(so,{})}),s.jsxs(B,{element:s.jsx(ro,{}),children:[s.jsx(B,{index:!0,element:s.jsx(gl,{})}),s.jsx(B,{path:"users",element:s.jsx(xl,{})}),s.jsx(B,{path:"attendance",element:s.jsx(bl,{})}),s.jsx(B,{path:"attendance/history",element:s.jsx(kl,{})}),s.jsx(B,{path:"attendance/admin",element:s.jsx(wl,{})}),s.jsx(B,{path:"attendance/balances",element:s.jsx(_l,{})}),s.jsx(B,{path:"attendance/requests",element:s.jsx(jl,{})}),s.jsx(B,{path:"attendance/approval",element:s.jsx(Sl,{})}),s.jsx(B,{path:"attendance/create",element:s.jsx(Dl,{})}),s.jsx(B,{path:"attendance/location/:id",element:s.jsx(Cl,{})}),s.jsx(B,{path:"trips",element:s.jsx(Nl,{})}),s.jsx(B,{path:"trips/history",element:s.jsx(Ml,{})}),s.jsx(B,{path:"trips/admin",element:s.jsx(El,{})}),s.jsx(B,{path:"vehicles",element:s.jsx(Pl,{})}),s.jsx(B,{path:"offers",element:s.jsx(Tl,{})}),s.jsx(B,{path:"offers/new",element:s.jsx(Cr,{})}),s.jsx(B,{path:"offers/:id",element:s.jsx(Cr,{})}),s.jsx(B,{path:"offers/customers",element:s.jsx(Ol,{})}),s.jsx(B,{path:"offers/templates",element:s.jsx(Al,{})}),s.jsx(B,{path:"company/settings",element:s.jsx(Rl,{})}),s.jsx(B,{path:"orders",element:s.jsx(Ll,{})}),s.jsx(B,{path:"orders/:id",element:s.jsx(Il,{})}),s.jsx(B,{path:"projects",element:s.jsx(Fl,{})}),s.jsx(B,{path:"projects/new",element:s.jsx(Yl,{})}),s.jsx(B,{path:"projects/:id",element:s.jsx(Wl,{})}),s.jsx(B,{path:"invoices",element:s.jsx(zl,{})}),s.jsx(B,{path:"invoices/new",element:s.jsx(Bl,{})}),s.jsx(B,{path:"invoices/:id",element:s.jsx(Hl,{})}),s.jsx(B,{path:"settings",element:s.jsx(Vl,{})}),s.jsx(B,{path:"audit-log",element:s.jsx($l,{})})]}),s.jsx(B,{path:"*",element:s.jsx(Kl,{})})]})})})]})})}function Ql(){return s.jsx("div",{style:{minHeight:"100dvh",display:"flex",alignItems:"center",justifyContent:"center",background:"var(--bg-primary)"},children:s.jsx("div",{className:"admin-spinner"})})}function Zl(){return s.jsx(v.Suspense,{fallback:s.jsx(Ql,{}),children:s.jsx(Pr,{children:s.jsx(B,{path:"/*",element:s.jsx(Ul,{})})})})}gn.createRoot(document.getElementById("root")).render(s.jsx(x.StrictMode,{children:s.jsx(ba,{future:{v7_startTransition:!0,v7_relativeSplatPath:!0},children:s.jsx(Za,{children:s.jsx(Zl,{})})})}));export{ll as A,Sr as C,tn as F,K as _,xt as a,ze as b,ae as c,tc as d,ec as e,ho as f,nn as g,tt as u}; diff --git a/dist/assets/useListData-Bz9Xh_CU.js b/dist/assets/useListData-CvOpK9He.js similarity index 96% rename from dist/assets/useListData-Bz9Xh_CU.js rename to dist/assets/useListData-CvOpK9He.js index f59dabf..b34861c 100644 --- a/dist/assets/useListData-Bz9Xh_CU.js +++ b/dist/assets/useListData-CvOpK9He.js @@ -1 +1 @@ -import{j as x}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{a as L,c as O}from"./index-BrM8fzBu.js";function J({column:e,sort:r,order:n}){return r!==e?null:x.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",style:{marginLeft:4,verticalAlign:"middle"},children:x.jsx("path",{d:n==="ASC"?"M18 15l-6-6-6 6":"M6 9l6 6 6-6"})})}function V(e,r="DESC"){const[n,a]=t.useState(e),[o,c]=t.useState(r),i=t.useRef(!1),S=t.useCallback(u=>{i.current=!0,a(m=>m===u?(c(h=>h==="ASC"?"DESC":"ASC"),m):(c("DESC"),u))},[]),d=i.current?n:null;return{sort:n,order:o,handleSort:S,activeSort:d}}function I(e,r=300){const[n,a]=t.useState(e);return t.useEffect(()=>{const o=setTimeout(()=>a(e),r);return()=>clearTimeout(o)},[e,r]),n}const N="/api/admin";function _(e,{dataKey:r,search:n,sort:a,order:o,page:c,perPage:i,extraParams:S,errorMsg:d="Nepodařilo se načíst data"}={}){const u=L(),[m,h]=t.useState([]),[j,D]=t.useState(!0),[w,k]=t.useState(null),l=t.useRef(null),p=S?JSON.stringify(S):"",b=I(n,300),C=t.useCallback(async()=>{l.current&&l.current.abort();const g=new AbortController;l.current=g;try{const s=new URLSearchParams;if(b&&s.set("search",b),a&&s.set("sort",a),o&&s.set("order",o),c&&s.set("page",c),i&&s.set("per_page",i),p){const R=JSON.parse(p);Object.entries(R).forEach(([y,A])=>{A&&s.set(y,A)})}const E=await O(`${N}/${e}?${s}`,{signal:g.signal});if(E.status===401)return;const f=await E.json();f.success?(h(f.data[r]||[]),f.data.pagination&&k(f.data.pagination)):u.error(f.error||d)}catch(s){if(s.name==="AbortError")return;u.error("Chyba připojení")}finally{D(!1)}},[u,e,r,b,a,o,c,i,p,d]);return t.useEffect(()=>(C(),()=>{l.current&&l.current.abort()}),[C]),{items:m,setItems:h,loading:j,pagination:w,refetch:C}}export{J as S,_ as a,V as u}; +import{j as x}from"./vendor-animation-0s3FMHwK.js";import{r as t}from"./vendor-react-BVs3cwbi.js";import{a as L,c as O}from"./index-Bay45BGf.js";function J({column:e,sort:r,order:n}){return r!==e?null:x.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",style:{marginLeft:4,verticalAlign:"middle"},children:x.jsx("path",{d:n==="ASC"?"M18 15l-6-6-6 6":"M6 9l6 6 6-6"})})}function V(e,r="DESC"){const[n,a]=t.useState(e),[o,c]=t.useState(r),i=t.useRef(!1),S=t.useCallback(u=>{i.current=!0,a(m=>m===u?(c(h=>h==="ASC"?"DESC":"ASC"),m):(c("DESC"),u))},[]),d=i.current?n:null;return{sort:n,order:o,handleSort:S,activeSort:d}}function I(e,r=300){const[n,a]=t.useState(e);return t.useEffect(()=>{const o=setTimeout(()=>a(e),r);return()=>clearTimeout(o)},[e,r]),n}const N="/api/admin";function _(e,{dataKey:r,search:n,sort:a,order:o,page:c,perPage:i,extraParams:S,errorMsg:d="Nepodařilo se načíst data"}={}){const u=L(),[m,h]=t.useState([]),[j,D]=t.useState(!0),[w,k]=t.useState(null),l=t.useRef(null),p=S?JSON.stringify(S):"",b=I(n,300),C=t.useCallback(async()=>{l.current&&l.current.abort();const g=new AbortController;l.current=g;try{const s=new URLSearchParams;if(b&&s.set("search",b),a&&s.set("sort",a),o&&s.set("order",o),c&&s.set("page",c),i&&s.set("per_page",i),p){const R=JSON.parse(p);Object.entries(R).forEach(([y,A])=>{A&&s.set(y,A)})}const E=await O(`${N}/${e}?${s}`,{signal:g.signal});if(E.status===401)return;const f=await E.json();f.success?(h(f.data[r]||[]),f.data.pagination&&k(f.data.pagination)):u.error(f.error||d)}catch(s){if(s.name==="AbortError")return;u.error("Chyba připojení")}finally{D(!1)}},[u,e,r,b,a,o,c,i,p,d]);return t.useEffect(()=>(C(),()=>{l.current&&l.current.abort()}),[C]),{items:m,setItems:h,loading:j,pagination:w,refetch:C}}export{J as S,_ as a,V as u}; diff --git a/dist/index.html b/dist/index.html index 1283053..b2624ca 100644 --- a/dist/index.html +++ b/dist/index.html @@ -29,7 +29,7 @@ - + diff --git a/dist/vendor/composer/installed.php b/dist/vendor/composer/installed.php index 2895a76..8100e21 100644 --- a/dist/vendor/composer/installed.php +++ b/dist/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'boha/website', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '9e3c95e5764f4ec5167c09b9f9cf05a58891a0aa', + 'reference' => '45fd930f76debb906f6a51b10aab2cb0937ac200', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ 'boha/website' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '9e3c95e5764f4ec5167c09b9f9cf05a58891a0aa', + 'reference' => '45fd930f76debb906f6a51b10aab2cb0937ac200', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), diff --git a/src/admin/components/ProjectFileManager.jsx b/src/admin/components/ProjectFileManager.jsx index bcadc4f..dc00eb9 100644 --- a/src/admin/components/ProjectFileManager.jsx +++ b/src/admin/components/ProjectFileManager.jsx @@ -250,14 +250,32 @@ export default function ProjectFileManager({ projectId, projectNumber, hasPermis } } - const handleDownload = (item) => { + const handleDownload = async (item) => { const filePath = currentPath ? `${currentPath}/${item.name}` : item.name const params = new URLSearchParams({ action: 'download', project_id: projectId, path: filePath, }) - window.open(`${API_BASE}/project-files.php?${params}`, '_blank') + try { + const res = await apiFetch(`${API_BASE}/project-files.php?${params}`) + if (!res.ok) { + const err = await res.json().catch(() => null) + alert.error(err?.error || 'Chyba při stahování') + return + } + const blob = await res.blob() + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = item.name + document.body.appendChild(a) + a.click() + a.remove() + URL.revokeObjectURL(url) + } catch { + alert.error('Chyba připojení') + } } const handleDelete = async () => {