Files
app/dist/assets/ProjectDetail-DCOqYzFf.js
Simon 10fbb9ebc7 refactor: CSS utility tridy + slouceni badge souboru
- pridano 20 utility trid (flex-1, mb-2, text-right, fw-500, admin-spinner-sm, atd.)
- nahrazeno ~100 opakovanych inline stylu ve 39 JSX souborech
- slouceno leave.css, orders.css, projects.css do admin.css (status badges)
- bundle size: 228.91 -> 228.43 kB (-0.48 kB)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:27:15 +01:00

2 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{j as e,m as f}from"./vendor-animation-0s3FMHwK.js";import{h as K,g as Y,u as G,r as i,L as z}from"./vendor-react-BVs3cwbi.js";import{a as Q,u as V,F as l,A as B,C as X,c as p}from"./index-CIpK9ruO.js";import{F as ee}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const u="/api/admin",se={aktivni:"Aktivní",dokonceny:"Dokončený",zruseny:"Zrušený"};function te(o){if(!o)return"";const t=new Date(o),y=t.getDate(),g=t.getMonth()+1,c=t.getFullYear(),h=String(t.getHours()).padStart(2,"0"),N=String(t.getMinutes()).padStart(2,"0");return`${y}. ${g}. ${c} ${h}:${N}`}function de(){const{id:o}=K(),t=Q(),{hasPermission:y,isAdmin:g}=V(),c=Y(),h=G(),[N,M]=i.useState(!0),[_,C]=i.useState(!1),[a,O]=i.useState(null),[d,$]=i.useState({name:"",status:"aktivni",start_date:"",end_date:""}),[Z,D]=i.useState(!1),[R,P]=i.useState(!1),[k,b]=i.useState([]),[w,I]=i.useState(!0),[j,A]=i.useState(""),[E,L]=i.useState(!1),[S,T]=i.useState(null);i.useEffect(()=>{h.state?.created&&(t.success("Projekt byl vytvořen"),c(h.pathname,{replace:!0,state:{}}))},[h.state]);const W=async()=>{try{const s=await p(`${u}/projects.php?action=notes&id=${o}`);if(s.status===401)return;const n=await s.json();n.success&&b(n.data.notes||[])}catch{}finally{I(!1)}};if(i.useEffect(()=>{(async()=>{try{const n=await p(`${u}/projects.php?action=detail&id=${o}`);if(n.status===401)return;const r=await n.json();if(r.success){const m=r.data;O(m),$({name:m.name||"",status:m.status||"aktivni",start_date:(m.start_date||"").substring(0,10),end_date:(m.end_date||"").substring(0,10)})}else t.error(r.error||"Nepodařilo se načíst projekt"),c("/projects")}catch{t.error("Chyba připojení"),c("/projects")}finally{M(!1)}})(),W()},[o,t,c]),!y("projects.view"))return e.jsx(ee,{});const v=(s,n)=>$(r=>({...r,[s]:n})),H=async()=>{if(!d.name.trim()){t.error("Název projektu je povinný");return}C(!0);try{const n=await(await p(`${u}/projects.php?id=${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:d.name,status:d.status,start_date:d.start_date||null,end_date:d.end_date||null})})).json();n.success?t.success(n.message||"Projekt byl aktualizován"):t.error(n.error||"Nepodařilo se uložit projekt")}catch{t.error("Chyba připojení")}finally{C(!1)}},U=async()=>{P(!0);try{const n=await(await p(`${u}/projects.php?id=${o}`,{method:"DELETE"})).json();n.success?(c("/projects"),setTimeout(()=>t.success("Projekt byl smazán"),300)):t.error(n.error||"Nepodařilo se smazat projekt")}catch{t.error("Chyba připojení")}finally{P(!1)}},F=async()=>{if(j.trim()){L(!0);try{const n=await(await p(`${u}/projects.php?action=add_note&id=${o}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:j.trim()})})).json();n.success?(b(r=>[n.data.note,...r]),A(""),t.success("Poznámka byla přidána")):t.error(n.error||"Nepodařilo se přidat poznámku")}catch{t.error("Chyba připojení")}finally{L(!1)}}},q=async s=>{T(s);try{const r=await(await p(`${u}/projects.php?action=delete_note&noteId=${s}`,{method:"DELETE"})).json();r.success?(b(m=>m.filter(J=>J.id!==s)),t.success("Poznámka byla smazána")):t.error(r.error||"Nepodařilo se smazat poznámku")}catch{t.error("Chyba připojení")}finally{T(null)}};if(N)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(!a)return null;const x=y("projects.edit");return e.jsxs("div",{children:[e.jsxs(f.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(z,{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 ",a.project_number]})})]}),x&&e.jsxs("div",{className:"admin-page-actions",children:[e.jsx("button",{onClick:H,className:"admin-btn admin-btn-primary",disabled:_,children:_?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"}),!a.order_id&&e.jsx("button",{onClick:()=>D(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsx(f.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(l,{label:"Číslo projektu",children:e.jsx("input",{type:"text",value:a.project_number,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(l,{label:"Název",children:e.jsx("input",{type:"text",value:d.name,onChange:s=>v("name",s.target.value),className:"admin-form-input",placeholder:"Název projektu",disabled:!x})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{label:"Zákazník",children:e.jsx("input",{type:"text",value:a.customer_name||"—",className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})}),e.jsx(l,{label:"Stav",children:e.jsxs("select",{value:d.status,onChange:s=>v("status",s.target.value),className:"admin-form-select",disabled:!x,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.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{label:"Datum zahájení",children:e.jsx(B,{mode:"date",value:d.start_date,onChange:s=>v("start_date",s),disabled:!x})}),e.jsx(l,{label:"Datum ukončení",children:e.jsx(B,{mode:"date",value:d.end_date,onChange:s=>v("end_date",s),disabled:!x})})]})]})]})}),e.jsx(f.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:j,onChange:s=>A(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&&j.trim()&&F()}}),e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:F,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:E||!j.trim(),children:E?e.jsx("div",{className:"admin-spinner admin-spinner-sm"}):"Přidat poznámku"})})]}),a.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:a.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&&k.length===0&&!a.notes&&e.jsx("div",{style:{color:"var(--text-tertiary)",fontSize:"0.875rem",textAlign:"center",padding:"1rem 0"},children:"Zatím žádné poznámky"}),!w&&(k.length>0||a.notes)&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:k.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:te(s.created_at)})]}),e.jsx("div",{style:{whiteSpace:"pre-wrap",fontSize:"0.875rem",lineHeight:1.5},children:s.content})]}),g&&e.jsx("button",{onClick:()=>q(s.id),className:"admin-btn-icon",title:"Smazat poznámku",disabled:S===s.id,style:{flexShrink:0,opacity:S===s.id?.5:1},children:S===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(f.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:"Propojení"}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{label:"Objednávka",children:e.jsx("div",{children:a.order_id?e.jsxs(z,{to:`/orders/${a.order_id}`,className:"link-accent",children:[a.order_number,a.order_status&&e.jsxs("span",{className:"text-tertiary",style:{fontWeight:400,marginLeft:"0.5rem"},children:["(",se[a.order_status]||a.order_status,")"]})]}):"—"})}),e.jsx(l,{label:"Nabídka",children:e.jsx("div",{children:a.quotation_id?e.jsx(z,{to:`/offers/${a.quotation_id}`,className:"link-accent",children:a.quotation_number}):"—"})})]})]})}),e.jsx(X,{isOpen:Z,onClose:()=>D(!1),onConfirm:U,title:"Smazat projekt",message:`Opravdu chcete smazat projekt "${a.project_number} ${a.name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:R})]})}export{de as default};