Files
app/dist/assets/OffersCustomers-BjvYTLYl.js
2026-03-13 09:19:40 +01:00

2 lines
13 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. 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 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-BBlIrj2z.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"],W={street:"Ulice",city_postal:"Město + PSČ",country:"Země",company_id:"IČO",vat_id:"DIČ"};function re(){const o=Q(),{hasPermission:x}=X(),[A,U]=l.useState(!0),[F,Z]=l.useState([]),[h,R]=l.useState(""),[B,N]=l.useState(!1),[p,z]=l.useState(null),[j,D]=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(B);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;s<r.length;s++){const n=`custom_${s}`;t.includes(n)||t.push(n)}return t.filter(s=>s.startsWith("custom_")?parseInt(s.split("_")[1])<r.length:!0)},[O,r]),I=(a,t)=>{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(W[a])return W[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}D(!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{D(!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(A)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",{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 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",style:{marginBottom:"1rem"},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:B&&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",style:{width:16,height:16,borderWidth:2}}),"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};