Files
app/dist/assets/ProjectDetail-Dg0G_KTk.js
Simon 9e3c95e576 feat: zodpovedna osoba za projekt - novy sloupec + editace
Pridano pole responsible_user_id do tabulky projects s FK na users.
Select zodpovedne osoby v ProjectDetail, ProjectCreate a sloupec v seznamu projektu.

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

2 lines
12 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 g}from"./vendor-animation-0s3FMHwK.js";import{h as G,g as Q,u as V,r as i,L as z}from"./vendor-react-BVs3cwbi.js";import{a as X,u as ee,F as l,A as B,C as se,c as u}from"./index-CNxd7jIT.js";import{F as ae}from"./Forbidden-D25jV3Oq.js";import"./vendor-utils-Dyr8OjFr.js";const h="/api/admin",te={aktivni:"Aktivní",dokonceny:"Dokončený",zruseny:"Zrušený"};function ne(d){if(!d)return"";const a=new Date(d),f=a.getDate(),N=a.getMonth()+1,p=a.getFullYear(),x=String(a.getHours()).padStart(2,"0"),b=String(a.getMinutes()).padStart(2,"0");return`${f}. ${N}. ${p} ${x}:${b}`}function ce(){const{id:d}=G(),a=X(),{hasPermission:f,isAdmin:N}=ee(),p=Q(),x=V(),[b,M]=i.useState(!0),[C,$]=i.useState(!1),[t,O]=i.useState(null),[o,D]=i.useState({name:"",status:"aktivni",start_date:"",end_date:"",responsible_user_id:""}),[R,U]=i.useState([]),[I,P]=i.useState(!1),[W,A]=i.useState(!1),[k,w]=i.useState([]),[_,H]=i.useState(!0),[y,E]=i.useState(""),[L,T]=i.useState(!1),[S,F]=i.useState(null);i.useEffect(()=>{x.state?.created&&(a.success("Projekt byl vytvořen"),p(x.pathname,{replace:!0,state:{}}))},[x.state]);const q=async()=>{try{const s=await u(`${h}/projects.php?action=notes&id=${d}`);if(s.status===401)return;const n=await s.json();n.success&&w(n.data.notes||[])}catch{}finally{H(!1)}};if(i.useEffect(()=>{const s=async()=>{try{const r=await u(`${h}/projects.php?action=detail&id=${d}`);if(r.status===401)return;const c=await r.json();if(c.success){const m=c.data;O(m),D({name:m.name||"",status:m.status||"aktivni",start_date:(m.start_date||"").substring(0,10),end_date:(m.end_date||"").substring(0,10),responsible_user_id:m.responsible_user_id||""})}else a.error(c.error||"Nepodařilo se načíst projekt"),p("/projects")}catch{a.error("Chyba připojení"),p("/projects")}finally{M(!1)}},n=async()=>{try{const r=await u(`${h}/projects.php?action=users`);if(r.status===401)return;const c=await r.json();c.success&&U(c.data.users||[])}catch{}};s(),q(),n()},[d,a,p]),!f("projects.view"))return e.jsx(ae,{});const v=(s,n)=>D(r=>({...r,[s]:n})),J=async()=>{if(!o.name.trim()){a.error("Název projektu je povinný");return}$(!0);try{const n=await(await u(`${h}/projects.php?id=${d}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:o.name,status:o.status,start_date:o.start_date||null,end_date:o.end_date||null,responsible_user_id:o.responsible_user_id||null})})).json();n.success?a.success(n.message||"Projekt byl aktualizován"):a.error(n.error||"Nepodařilo se uložit projekt")}catch{a.error("Chyba připojení")}finally{$(!1)}},K=async()=>{A(!0);try{const n=await(await u(`${h}/projects.php?id=${d}`,{method:"DELETE"})).json();n.success?(p("/projects"),setTimeout(()=>a.success("Projekt byl smazán"),300)):a.error(n.error||"Nepodařilo se smazat projekt")}catch{a.error("Chyba připojení")}finally{A(!1)}},Z=async()=>{if(y.trim()){T(!0);try{const n=await(await u(`${h}/projects.php?action=add_note&id=${d}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:y.trim()})})).json();n.success?(w(r=>[n.data.note,...r]),E(""),a.success("Poznámka byla přidána")):a.error(n.error||"Nepodařilo se přidat poznámku")}catch{a.error("Chyba připojení")}finally{T(!1)}}},Y=async s=>{F(s);try{const r=await(await u(`${h}/projects.php?action=delete_note&noteId=${s}`,{method:"DELETE"})).json();r.success?(w(c=>c.filter(m=>m.id!==s)),a.success("Poznámka byla smazána")):a.error(r.error||"Nepodařilo se smazat poznámku")}catch{a.error("Chyba připojení")}finally{F(null)}};if(b)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 j=f("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(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 ",t.project_number]})})]}),j&&e.jsxs("div",{className:"admin-page-actions",children:[e.jsx("button",{onClick:J,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"}),!t.order_id&&e.jsx("button",{onClick:()=>P(!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(l,{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(l,{label:"Název",children:e.jsx("input",{type:"text",value:o.name,onChange:s=>v("name",s.target.value),className:"admin-form-input",placeholder:"Název projektu",disabled:!j})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(l,{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(l,{label:"Zodpovědná osoba",children:e.jsxs("select",{value:o.responsible_user_id,onChange:s=>v("responsible_user_id",s.target.value),className:"admin-form-select",disabled:!j,children:[e.jsx("option",{value:"",children:"— Nevybráno —"}),R.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(l,{label:"Stav",children:e.jsxs("select",{value:o.status,onChange:s=>v("status",s.target.value),className:"admin-form-select",disabled:!j,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(l,{label:"Datum zahájení",children:e.jsx(B,{mode:"date",value:o.start_date,onChange:s=>v("start_date",s),disabled:!j})}),e.jsx(l,{label:"Datum ukončení",children:e.jsx(B,{mode:"date",value:o.end_date,onChange:s=>v("end_date",s),disabled:!j})})]})]})]})}),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:y,onChange:s=>E(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&&y.trim()&&Z()}}),e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:Z,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:L||!y.trim(),children:L?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})]}),_&&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))}),!_&&k.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"}),!_&&(k.length>0||t.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:ne(s.created_at)})]}),e.jsx("div",{style:{whiteSpace:"pre-wrap",fontSize:"0.875rem",lineHeight:1.5},children:s.content})]}),N&&e.jsx("button",{onClick:()=>Y(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(g.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:t.order_id?e.jsxs(z,{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:["(",te[t.order_status]||t.order_status,")"]})]}):"—"})}),e.jsx(l,{label:"Nabídka",children:e.jsx("div",{children:t.quotation_id?e.jsx(z,{to:`/offers/${t.quotation_id}`,className:"link-accent",children:t.quotation_number}):"—"})})]})]})}),e.jsx(se,{isOpen:I,onClose:()=>P(!1),onConfirm:K,title:"Smazat projekt",message:`Opravdu chcete smazat projekt "${t.project_number} ${t.name}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:W})]})}export{ce as default};