Files
app/dist/assets/Projects-BEgW8Oc8.js
Simon 5550358b15 fix: oprava kritických bezpečnostních chyb a bugů z code review
- SEC-1: nahrazen exec('fsutil') za PHP-native is_link()+realpath() v NasFileManager - eliminace command injection
- SEC-2: přidáno ověření aktuálního hesla při změně hesla (profile.php + DashProfile.jsx)
- BUG-1: attendance punch obalen do transakce s SELECT FOR UPDATE - prevence race condition při dvojkliku
- BUG-2: eliminován N+1 SQL dotaz pro VAT v invoice listu - výpočet přesunut do subquery
- BUG-5/6: delete a update attendance záznamů obaleny do transakcí - prevence nekonzistentního stavu
- BUG-7: opravena duplikace nabídky - přidáno chybějící pole unit v offer items

ESLint: 0 errors | PHPCS: 0 errors | Build: OK

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 13:46:20 +01:00

2 lines
8.6 KiB
JavaScript

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-CCZhiEoc.js";import{F as M}from"./Forbidden-D25jV3Oq.js";import{u as F,a as $,S as r}from"./useListData-PgxWcjUa.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};