- Backend: listFiles vrací full_path, detekce symlinků/junctions - Backend: resolveProjectPath povoluje navigaci přes symlinky - Frontend: zobrazení plné cesty pod breadcrumbem - Frontend: ikona odkazu u symlinků s tooltipem cíle - Fix: underline jen na názvu složky, ne na počtu položek Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 lines
6.8 KiB
JavaScript
2 lines
6.8 KiB
JavaScript
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-c9Us0bor.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};
|