1import{j as e}from"./ui-pZ967-NS.js";import{r as g,O as Qe,aw as _e,x as Ge,c7 as ce,c8 as de,ab as xe,i as Xe,aU as pe,$ as Je,h as Ie,aa as he,b as De,b0 as Te,X as Ze,bb as es}from"./utils-B5_VV7Cb.js";import{p as ss,h as ze,u as $e,x as oe,d as c,I as A,o as ts,B as w,s as E,D as Oe,y as Le,z as Fe,E as Re,T as as,c as Ae,F as Me}from"./blog-BCH5Rkw1.js";import{l as ne}from"./activityLog-Df4hgbNQ.js";import{C as q,a as Ve,b as qe,d as U,n as W,o as Y,p as B,q as Q,r as D,f as ns,g as is,h as ue,i as me,j as O,z as S,L as N}from"./tools-Dnd2ifXP.js";import{k as ls,l as rs,D as cs,o as ds,P as os,e as us,f as ms}from"./core.esm-Dfetfq9g.js";import{u as xs,S as Pe}from"./SimplePagination-BZ7kFgop.js";import{C as hs}from"./calendar-BtVEjx7_.js";import{P as gs,a as ps,b as js}from"./popover-BCceBuii.js";import"./vendor-COMpnQoB.js";const L={backlog:"Backlog",pending:"Pending",in_progress:"In progress",review:"Under review",waiting_approval:"Waiting approval",completed:"Completed",cancelled:"Cancelled"},ge=["backlog","pending","in_progress","review","waiting_approval","completed","cancelled"],F={critical:"Critical",high:"High",medium:"Medium",low:"Low"},ie={critical:"bg-red-500/15 text-red-600 border-red-500/30",high:"bg-orange-500/15 text-orange-600 border-orange-500/30",medium:"bg-blue-500/15 text-blue-600 border-blue-500/30",low:"bg-emerald-500/15 text-emerald-600 border-emerald-500/30"},ye={backlog:"bg-muted text-muted-foreground",pending:"bg-sky-500/15 text-sky-600",in_progress:"bg-indigo-500/15 text-indigo-600",review:"bg-amber-500/15 text-amber-700",waiting_approval:"bg-violet-500/15 text-violet-600",completed:"bg-emerald-500/15 text-emerald-700",cancelled:"bg-zinc-500/15 text-zinc-600"},Ee=()=>crypto!=null&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random()}`,Ne=r=>{const u=new Date(r);return u.setHours(0,0,0,0),u},H=r=>!!r.due_at&&r.status!=="completed"&&r.status!=="cancelled"&&new Date(r.due_at)<new Date,vs=r=>{if(!r.due_at)return!1;const u=new Date(r.due_at),n=Ne(new Date);return Ne(u).getTime()===n.getTime()},fs=r=>{if(!r.due_at)return!1;const u=new Date(r.due_at),n=Ne(new Date),j=new Date(n);return j.setDate(j.getDate()+7),u>=n&&u<j};function ws({open:r,onOpenChange:u,task:n,onSaved:j,profiles:o}){const{user:m}=ze(),[a,b]=g.useState(n??{}),[k,l]=g.useState(""),[T,C]=g.useState(""),[G,X]=g.useState(""),[J,Z]=g.useState(!1);g.useEffect(()=>{b(n??{})},[n]);const x=(t,d)=>b(p=>({...p,[t]:d})),f=async()=>{var p;if(!((p=a.title)!=null&&p.trim())){S({title:"Title required",variant:"destructive"});return}Z(!0);const t={title:a.title.trim(),description:a.description??null,status:a.status??"pending",priority:a.priority??"medium",due_at:a.due_at||null,start_at:a.start_at||null,assignees:a.assignees??[],category:a.category||null,tags:a.tags??[],attachments:a.attachments??[],subtasks:a.subtasks??[],comments:a.comments??[],dependencies:a.dependencies??[],estimated_minutes:a.estimated_minutes??null,actual_minutes:a.actual_minutes??0,recurrence:a.recurrence||null,recurrence_until:a.recurrence_until||null,is_template:!!a.is_template,completed_at:a.status==="completed"?new Date().toISOString():null};let d;if(a.id)({error:d}=await E.from("tasks").update(t).eq("id",a.id)),d||await ne({action:"task.update",entityType:"tasks",entityId:a.id,diff:t});else{const{data:y,error:I}=await E.from("tasks").insert({...t,created_by:(m==null?void 0:m.id)??null}).select().single();d=I,!d&&y&&await ne({action:"task.create",entityType:"tasks",entityId:y.id,diff:t})}if(Z(!1),d){S({title:"Save failed",description:d.message,variant:"destructive"});return}S({title:a.id?"Task updated":"Task created"}),j(),u(!1)},P=()=>{const t=k.trim();t&&(x("tags",[...a.tags??[],t]),l(""))},ee=()=>{const t=T.trim();t&&(x("subtasks",[...a.subtasks??[],{id:Ee(),title:t,done:!1}]),C(""))},se=()=>{const t=G.trim();t&&(x("comments",[...a.comments??[],{id:Ee(),author_id:(m==null?void 0:m.id)??null,author_name:(m==null?void 0:m.email)??"You",body:t,at:new Date().toISOString()}]),X(""))};return e.jsx(Oe,{open:r,onOpenChange:u,children:e.jsxs(Le,{className:"w-screen h-[100dvh] max-w-none sm:max-w-3xl sm:h-auto sm:max-h-[90vh] overflow-y-auto sm:rounded-lg rounded-none p-4 sm:p-6",children:[e.jsx(Fe,{children:e.jsx(Re,{children:a.id?"Edit task":"New task"})}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{children:[e.jsx(N,{children:"Title *"}),e.jsx(A,{value:a.title??"",onChange:t=>x("title",t.target.value),autoFocus:!0})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Description"}),e.jsx(as,{rows:3,value:a.description??"",onChange:t=>x("description",t.target.value)})]}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-3",children:[e.jsxs("div",{children:[e.jsx(N,{children:"Status"}),e.jsxs(W,{value:a.status??"pending",onValueChange:t=>x("status",t),children:[e.jsx(Y,{children:e.jsx(B,{})}),e.jsx(Q,{children:ge.map(t=>e.jsx(D,{value:t,children:L[t]},t))})]})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Priority"}),e.jsxs(W,{value:a.priority??"medium",onValueChange:t=>x("priority",t),children:[e.jsx(Y,{children:e.jsx(B,{})}),e.jsx(Q,{children:Object.keys(F).map(t=>e.jsx(D,{value:t,children:F[t]},t))})]})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Due date"}),e.jsxs(gs,{children:[e.jsx(ps,{asChild:!0,children:e.jsxs(c,{type:"button",variant:"outline",className:Ae("w-full justify-start text-left font-normal",!a.due_at&&"text-muted-foreground"),children:[e.jsx(pe,{className:"h-4 w-4"}),a.due_at?Te(new Date(a.due_at),"PPP p"):e.jsx("span",{children:"Pick a date"})]})}),e.jsxs(js,{className:"w-auto p-0",align:"start",children:[e.jsx(hs,{mode:"single",selected:a.due_at?new Date(a.due_at):void 0,onSelect:t=>{if(!t)return x("due_at",null);const d=a.due_at?new Date(a.due_at):null,p=new Date(t);d?p.setHours(d.getHours(),d.getMinutes(),0,0):p.setHours(17,0,0,0),x("due_at",p.toISOString())},initialFocus:!0,className:Ae("p-3 pointer-events-auto")}),e.jsxs("div",{className:"flex items-center gap-2 border-t p-2",children:[e.jsx(A,{type:"time",value:a.due_at?Te(new Date(a.due_at),"HH:mm"):"",onCh
1ange:t=>{const[d,p]=t.target.value.split(":").map(Number),y=a.due_at?new Date(a.due_at):new Date;y.setHours(d||0,p||0,0,0),x("due_at",y.toISOString())},className:"h-8"}),e.jsx(c,{type:"button",size:"sm",variant:"ghost",className:"ml-auto",onClick:()=>x("due_at",null),children:"Clear"})]})]})]})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Category"}),e.jsx(A,{value:a.category??"",onChange:t=>x("category",t.target.value),placeholder:"e.g. Content"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-3 gap-3",children:[e.jsxs("div",{children:[e.jsx(N,{children:"Estimated (min)"}),e.jsx(A,{type:"number",min:0,value:a.estimated_minutes??"",onChange:t=>x("estimated_minutes",t.target.value?Number(t.target.value):null)})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Actual (min)"}),e.jsx(A,{type:"number",min:0,value:a.actual_minutes??0,onChange:t=>x("actual_minutes",t.target.value?Number(t.target.value):0)})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Recurrence"}),e.jsxs(W,{value:a.recurrence??"none",onValueChange:t=>x("recurrence",t==="none"?null:t),children:[e.jsx(Y,{children:e.jsx(B,{})}),e.jsxs(Q,{children:[e.jsx(D,{value:"none",children:"None"}),e.jsx(D,{value:"daily",children:"Daily"}),e.jsx(D,{value:"weekly",children:"Weekly"}),e.jsx(D,{value:"monthly",children:"Monthly"})]})]})]})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Assignees"}),e.jsxs("div",{className:"flex flex-wrap gap-2 mt-1",children:[o.map(t=>{const d=(a.assignees??[]).includes(t.id);return e.jsxs("label",{className:`flex items-center gap-2 rounded-md border px-2 py-1 text-xs cursor-pointer ${d?"bg-primary/10 border-primary/40":""}`,children:[e.jsx(O,{checked:d,onCheckedChange:p=>{const y=new Set(a.assignees??[]);p?y.add(t.id):y.delete(t.id),x("assignees",Array.from(y))}}),t.display_name??t.id.slice(0,6)]},t.id)}),o.length===0&&e.jsx("span",{className:"text-xs text-muted-foreground",children:"No team profiles yet."})]})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Tags"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(A,{value:k,onChange:t=>l(t.target.value),onKeyDown:t=>{t.key==="Enter"&&(t.preventDefault(),P())},placeholder:"Add tag and press Enter"}),e.jsx(c,{type:"button",variant:"outline",onClick:P,children:"Add"})]}),e.jsx("div",{className:"flex flex-wrap gap-1 mt-2",children:(a.tags??[]).map((t,d)=>e.jsxs(w,{variant:"secondary",className:"gap-1",children:[t,e.jsx("button",{onClick:()=>x("tags",(a.tags??[]).filter((p,y)=>y!==d)),children:e.jsx(Ze,{className:"h-3 w-3"})})]},d))})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Subtasks / Checklist"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(A,{value:T,onChange:t=>C(t.target.value),onKeyDown:t=>{t.key==="Enter"&&(t.preventDefault(),ee())},placeholder:"Add subtask"}),e.jsx(c,{type:"button",variant:"outline",onClick:ee,children:"Add"})]}),e.jsx("div",{className:"mt-2 space-y-1",children:(a.subtasks??[]).map(t=>e.jsxs("div",{className:"flex items-center gap-2 rounded border p-2",children:[e.jsx(O,{checked:t.done,onCheckedChange:d=>x("subtasks",(a.subtasks??[]).map(p=>p.id===t.id?{...p,done:!!d}:p))}),e.jsx("span",{className:`text-sm flex-1 ${t.done?"line-through text-muted-foreground":""}`,children:t.title}),e.jsx(c,{variant:"ghost",size:"icon",onClick:()=>x("subtasks",(a.subtasks??[]).filter(d=>d.id!==t.id)),children:e.jsx(xe,{className:"h-3 w-3"})})]},t.id))})]}),e.jsxs("div",{children:[e.jsx(N,{children:"Comments"}),e.jsx("div",{className:"space-y-2 max-h-48 overflow-y-auto",children:(a.comments??[]).map(t=>e.jsxs("div",{className:"rounded border p-2 text-sm",children:[e.jsxs("div",{className:"text-xs text-muted-foreground",children:[t.author_name," · ",new Date(t.at).toLocaleString()]}),e.jsx("div",{children:t.body})]},t.id))}),e.jsxs("div",{className:"flex gap-2 mt-2",children:[e.jsx(A,{value:G,onChange:t=>X(t.target.value),placeholder:"Write a comment",onKeyDown:t=>{t.key==="Enter"&&(t.preventDefault(),se())}}),e.jsx(c,{type:"button",variant:"outline",onClick:se,children:"Post"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(O,{id:"tpl",checked:!!a.is_template,onCheckedChange:t=>x("is_template",!!t)}),e.jsx(N,{htmlFor:"tpl",className:"cursor-pointer",children:"Save as reusable template"})]})]}),e.jsxs(Me,{children:[e.jsx(c,{variant:"outline",onClick:()=>u(!1),children:"Cancel"}),e.jsx(c,{onClick:f,disabled:J,children:J?"Savingâ¦":"Save task"})]})]})})}function ys({open:r,onOpenChange:u,task:n,onEdit:j}){return n?e.jsx(Oe,{open:r,onOpenChange:u,children:e.jsxs(Le,{className:"w-screen h-[100dvh] max-w-none sm:max-w-2xl sm:h-auto sm:max-h-[90vh] overflow-y-auto sm:rounded-lg rounded-none p-4 sm:p-6",children:[e.jsx(Fe,{children:e.jsx(Re,{className:"flex items-start justify-between gap-3",children:e.jsx("span",{children:n.title})})}),e.jsxs("div",{className:"space-y-4 text-sm",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(w,{variant:"secondary",className:ye[n.status],children:L[n.status]}),e.jsx(w,{variant:"outline",className:ie[n.priority],children:F[n.priority]}),n.category&&e.jsx(w,{variant:"outline",children:n.category}),n.due_at&&e.jsxs(w,{variant:"outline",className:H(n)?"text-red-600 border-red-500/40":"",children:[e.jsx(pe,{className:"h-3 w-3 mr-1"}
1),new Date(n.due_at).toLocaleString()]})]}),n.description&&e.jsx("div",{className:"rounded border p-3 whitespace-pre-wrap",children:n.description}),n.tags.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1",children:n.tags.map(o=>e.jsxs(w,{variant:"secondary",children:["#",o]},o))}),n.subtasks.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground mb-1",children:["Subtasks (",n.subtasks.filter(o=>o.done).length,"/",n.subtasks.length,")"]}),e.jsx("ul",{className:"space-y-1",children:n.subtasks.map(o=>e.jsxs("li",{className:`flex items-center gap-2 ${o.done?"line-through text-muted-foreground":""}`,children:[e.jsx(Ie,{className:`h-3 w-3 ${o.done?"text-emerald-600":"text-muted-foreground"}`}),o.title]},o.id))})]}),n.comments.length>0&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground mb-1",children:"Comments"}),e.jsx("div",{className:"space-y-2",children:n.comments.map(o=>e.jsxs("div",{className:"rounded border p-2",children:[e.jsxs("div",{className:"text-xs text-muted-foreground",children:[o.author_name," · ",new Date(o.at).toLocaleString()]}),e.jsx("div",{children:o.body})]},o.id))})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3 text-xs text-muted-foreground",children:[n.estimated_minutes!=null&&e.jsxs("div",{children:["Estimated: ",n.estimated_minutes,"m"]}),n.actual_minutes!=null&&e.jsxs("div",{children:["Actual: ",n.actual_minutes,"m"]}),n.recurrence&&e.jsxs("div",{children:["Recurs: ",n.recurrence]}),e.jsxs("div",{children:["Created: ",new Date(n.created_at).toLocaleString()]})]})]}),e.jsxs(Me,{children:[e.jsx(c,{variant:"outline",onClick:()=>u(!1),children:"Close"}),e.jsxs(c,{onClick:()=>{u(!1),j(n)},children:[e.jsx(he,{className:"h-4 w-4"})," Edit"]})]})]})}):null}function Ns({task:r,onOpen:u}){const{attributes:n,listeners:j,setNodeRef:o,transform:m,isDragging:a}=ms({id:r.id}),b=m?{transform:`translate3d(${m.x}px, ${m.y}px, 0)`}:void 0;return e.jsxs("div",{ref:o,style:b,className:`rounded-md border bg-card p-3 text-sm shadow-sm ${a?"opacity-50":""}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("button",{type:"button",onClick:u,className:"font-medium leading-tight text-left hover:underline flex-1 min-w-0",children:r.title}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx(w,{variant:"outline",className:`text-[10px] ${ie[r.priority]}`,children:F[r.priority]}),e.jsx("button",{type:"button",...j,...n,className:"cursor-grab active:cursor-grabbing text-muted-foreground hover:text-foreground p-1 -m-1","aria-label":"Drag task",onClick:k=>k.stopPropagation(),children:e.jsx(es,{className:"h-4 w-4"})})]})]}),r.due_at&&e.jsxs("div",{className:`mt-2 flex items-center gap-1 text-xs ${H(r)?"text-red-600":"text-muted-foreground"}`,children:[e.jsx(pe,{className:"h-3 w-3"})," ",new Date(r.due_at).toLocaleDateString()]}),r.tags.length>0&&e.jsx("div",{className:"mt-2 flex flex-wrap gap-1",children:r.tags.slice(0,3).map(k=>e.jsx(w,{variant:"secondary",className:"text-[10px]",children:k},k))})]})}function bs({status:r,tasks:u,onOpen:n}){const{setNodeRef:j,isOver:o}=us({id:r});return e.jsxs("div",{ref:j,className:`flex flex-col rounded-lg border bg-muted/30 p-2 min-w-[260px] ${o?"ring-2 ring-primary":""}`,children:[e.jsxs("div",{className:"flex items-center justify-between px-1 pb-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide",children:L[r]}),e.jsx(w,{variant:"secondary",children:u.length})]}),e.jsx("div",{className:"flex flex-col gap-2 min-h-[80px]",children:u.map(m=>e.jsx(Ns,{task:m,onOpen:()=>n(m)},m.id))})]})}function zs(){const r=ss(),[u,n]=g.useState("list"),[j,o]=g.useState(""),[m,a]=g.useState("all"),[b,k]=g.useState("all"),[l,T]=g.useState(!1),[C,G]=g.useState(null),[X,J]=g.useState(!1),[Z,x]=g.useState(null),[f,P]=g.useState(new Set),[ee,se]=g.useState(""),[t,d]=g.useState(1),[p,y]=g.useState(25),{user:I}=ze(),Ue=ls(rs(os,{activationConstraint:{distance:4}})),{data:$=[],isLoading:be}=$e({queryKey:["admin-tasks",l],queryFn:async()=>{const{data:s,error:i}=await E.from("tasks").select("*").eq("is_archived",l).order("sort_order",{ascending:!0}).order("created_at",{ascending:!1});if(i)throw i;return s??[]}}),{data:He=[]}=$e({queryKey:["admin-profiles-lite"],queryFn:async()=>{const{data:s}=await E.from("profiles").select("id, display_name");return s??[]}}),R=g.useMemo(()=>{const s=j.trim().toLowerCase();return $.filter(i=>!(m!=="all"&&i.status!==m||b!=="all"&&i.priority!==b||s&&!`${i.title} ${i.description??""} ${i.tags.join(" ")} ${i.category??""}`.toLowerCase().includes(s)))},[$,j,m,b]),z=g.useMemo(()=>{const s=$.length,i=re=>$.filter(Be=>Be.status===re).length,h=$.filter(H).length,_=$.filter(vs).length,v=$.filter(fs).length,V=$.filter(re=>re.priority==="critical"||re.priority==="high").length,ae=i("completed"),Ye=s?Math.round(ae/s*100):0;return{total:s,pending:i("pending"),inProgress:i("in_progress"),completed:ae,overdue:h,dueToday:_,dueWeek:v,high:V,rate:Ye}},[$]),K=()=>
1r.invalidateQueries({queryKey:["admin-tasks"]}),je=oe({mutationFn:async({ids:s,status:i})=>{const h={status:i,completed_at:i==="completed"?new Date().toISOString():null},{error:_}=await E.from("tasks").update(h).in("id",s);if(_)throw _;return await ne({action:"task.status",entityType:"tasks",entityId:s.join(","),diff:h}),{count:s.length,status:i}},onSuccess:s=>{K(),S({title:`Status set to â${L[s.status]}â`,description:`${s.count} task${s.count>1?"s":""} updated`})},onError:s=>S({title:"Status update failed",description:s.message,variant:"destructive"})}),ve=oe({mutationFn:async({ids:s,value:i})=>{const{error:h}=await E.from("tasks").update({is_archived:i}).in("id",s);if(h)throw h;return await ne({action:i?"task.archive":"task.restore",entityType:"tasks",entityId:s.join(",")}),{count:s.length,value:i}},onSuccess:s=>{K(),P(new Set),S({title:s.value?`Archived ${s.count} task${s.count>1?"s":""}`:`Restored ${s.count} task${s.count>1?"s":""}`})},onError:s=>S({title:"Action failed",description:s.message,variant:"destructive"})}),fe=oe({mutationFn:async s=>{const{error:i}=await E.from("tasks").delete().in("id",s);if(i)throw i;return await ne({action:"task.delete",entityType:"tasks",entityId:s.join(",")}),s.length},onSuccess:s=>{K(),P(new Set),S({title:`Deleted ${s} task${s>1?"s":""}`})},onError:s=>S({title:"Delete failed",description:s.message,variant:"destructive"})}),ke=oe({mutationFn:async s=>{const{id:i,created_at:h,updated_at:_,completed_at:v,...V}=s,{error:ae}=await E.from("tasks").insert({...V,title:`${s.title} (copy)`,status:"pending",created_by:(I==null?void 0:I.id)??null});if(ae)throw ae},onSuccess:()=>{K(),S({title:"Task duplicated"})},onError:s=>S({title:"Duplicate failed",description:s.message,variant:"destructive"})}),Ke=async s=>{var v;const i=s.active.id,h=(v=s.over)==null?void 0:v.id;if(!h)return;const _=$.find(V=>V.id===i);!_||_.status===h||je.mutate({ids:[i],status:h})},Ce=async()=>{const s=ee.trim();if(!s)return;const{error:i}=await E.from("tasks").insert({title:s,created_by:(I==null?void 0:I.id)??null});if(i){S({title:"Failed to add task",description:i.message,variant:"destructive"});return}se(""),K(),S({title:"Task added",description:s})},We=()=>{const i=[["Title","Status","Priority","Due","Category","Tags","Assignees","Estimated min","Actual min","Created"],...R.map(v=>[v.title,v.status,v.priority,v.due_at??"",v.category??"",v.tags.join("|"),v.assignees.join("|"),String(v.estimated_minutes??""),String(v.actual_minutes??0),v.created_at])].map(v=>v.map(V=>`"${String(V).replace(/"/g,'""')}"`).join(",")).join(` 2`),h=URL.createObjectURL(new Blob([i],{type:"text/csv"})),_=document.createElement("a");_.href=h,_.download=`tasks-${new Date().toISOString().slice(0,10)}.csv`,_.click(),URL.revokeObjectURL(h)},M=xs(R,t,p),we=f.size>0&&M.slice.every(s=>f.has(s.id)),Se=()=>{const s=new Set(f);we?M.slice.forEach(i=>s.delete(i.id)):M.slice.forEach(i=>s.add(i.id)),P(s)},te=s=>{G(s??{status:"pending",priority:"medium"}),J(!0)},le=s=>x(s);return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold",children:"Tasks & Todos"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Operational command center for the team."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(c,{variant:"outline",onClick:We,children:[e.jsx(Qe,{className:"h-4 w-4"})," Export CSV"]}),e.jsxs(c,{onClick:()=>te(),children:[e.jsx(_e,{className:"h-4 w-4"})," New task"]})]})]}),e.jsx("div",{className:"grid gap-3 grid-cols-2 sm:grid-cols-4 lg:grid-cols-4 xl:grid-cols-4",children:[{label:"Total",value:z.total}
2,{label:"Pending",value:z.pending},{label:"In progress",value:z.inProgress},{label:"Completed",value:z.completed},{label:"Overdue",value:z.overdue,accent:"text-red-600"},{label:"Due today",value:z.dueToday,accent:"text-amber-600"},{label:"Due this week",value:z.dueWeek},{label:"Completion rate",value:`${z.rate}%`,accent:"text-emerald-600"}].map(s=>e.jsxs(q,{children:[e.jsx(Ve,{className:"p-3 pb-1",children:e.jsx(qe,{className:"text-[11px] uppercase tracking-wider text-muted-foreground",children:s.label})}),e.jsx(U,{className:"p-3 pt-0",children:e.jsx("div",{className:`text-2xl font-semibold ${s.accent??""}`,children:s.value})})]},s.label))}),e.jsx(q,{children:e.jsxs(U,{className:"p-3 flex flex-wrap gap-2 items-center",children:[e.jsxs("div",{className:"relative flex-1 min-w-[200px]",children:[e.jsx(Ge,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(A,{value:j,onChange:s=>o(s.target.value),placeholder:"Search title, tags, categoryâ¦",className:"pl-8"})]}),e.jsxs(W,{value:m,onValueChange:s=>a(s),children:[e.jsx(Y,{className:"flex-1 min-w-[140px] md:w-[160px] md:flex-none",children:e.jsx(B,{placeholder:"Status"})}),e.jsxs(Q,{children:[e.jsx(D,{value:"all",children:"All statuses"}),ge.map(s=>e.jsx(D,{value:s,children:L[s]},s))]})]}),e.jsxs(W,{value:b,onValueChange:s=>k(s),children:[e.jsx(Y,{className:"flex-1 min-w-[120px] md:w-[140px] md:flex-none",children:e.jsx(B,{placeholder:"Priority"})}),e.jsxs(Q,{children:[e.jsx(D,{value:"all",children:"All priority"}),Object.keys(F).map(s=>e.jsx(D,{value:s,children:F[s]},s))]})]}),e.jsxs(c,{variant:l?"default":"outline",onClick:()=>T(s=>!s),className:"whitespace-nowrap",children:[l?e.jsx(ce,{className:"h-4 w-4"}):e.jsx(de,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:l?"Showing archived":"Active only"})]}),e.jsxs("div",{className:"flex gap-1 md:ml-auto w-full md:w-auto",children:[e.jsx(A,{placeholder:"Quick add task⦠(Enter)",value:ee,onChange:s=>se(s.target.value),onKeyDown:s=>{s.key==="Enter"&&Ce()},className:"flex-1 md:w-[260px] md:flex-none"}),e.jsx(c,{variant:"outline",onClick:Ce,className:"shrink-0",children:e.jsx(_e,{className:"h-4 w-4"})})]})]})}),f.size>0&&e.jsx(q,{className:"border-primary/40",children:e.jsxs(U,{className:"p-3 flex flex-wrap items-center gap-2 text-sm",children:[e.jsxs("span",{children:[e.jsx("b",{children:f.size})," selected"]}),e.jsxs(W,{onValueChange:s=>je.mutate({ids:Array.from(f),status:s}),children:[e.jsx(Y,{className:"w-[160px] h-8",children:e.jsx(B,{placeholder:"Set status"})}),e.jsx(Q,{children:ge.map(s=>e.jsx(D,{value:s,children:L[s]},s))})]}),e.jsxs(c,{size:"sm",variant:"outline",onClick:()=>ve.mutate({ids:Array.from(f),value:!l}),children:[l?e.jsx(ce,{className:"h-4 w-4"}):e.jsx(de,{className:"h-4 w-4"}),l?"Restore":"Archive"]}),e.jsxs(c,{size:"sm",variant:"destructive",onClick:()=>{confirm(`Delete ${f.size} task(s)?`)&&fe.mutate(Array.from(f))},children:[e.jsx(xe,{className:"h-4 w-4"})," Delete"]}),e.jsx(c,{size:"sm",variant:"ghost",onClick:()=>P(new Set),children:"Clear"})]})}),e.jsxs(ns,{value:u,onValueChange:s=>n(s),children:[e.jsx("div",{className:"overflow-x-auto -mx-1 px-1",children:e.jsxs(is,{className:"w-max",children:[e.jsx(ue,{value:"list",children:"List"}),e.jsx(ue,{value:"kanban",children:"Kanban"}),e.jsx(ue,{value:"calendar",children:"Calendar"}),e.jsx(ue,{value:"table",children:"Table"})]})}),e.jsxs(me,{value:"list",className:"space-y-2",children:[be&&e.jsx(ts,{className:"h-40 w-full"}),!be&&R.length===0&&e.jsx(q,{children:e.jsx(U,{className:"p-8 text-center text-muted-foreground",children:"No tasks. Use the quick add above or create one."})}),e.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[M.slice.length>0&&e.jsx(O,{checked:we,onCheckedChange:Se}),M.slice.length>0&&e.jsx("span",{children:"Select all on page"})]}),M.slice.map(s=>e.jsx(q,{className:`${H(s)?"border-red-500/40":""}`,children:e.jsxs(U,{className:"p-3 flex items-start gap-2 sm:gap-3",children:[e.jsx(O,{className:"mt-1 shrink-0",checked:f.has(s.id),onCheckedChange:i=>{const h=new Set(f);i?h.add(s.id):h.delete(s.id),P(h)}}),e.jsx(O,{className:"mt-1 shrink-0",checked:s.status==="completed",onCheckedChange:i=>je.mutate({ids:[s.id],status:i?"completed":"pending"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-1.5 sm:gap-2",children:[e.jsx("button",{onClick:()=>le(s),className:`font-medium text-left hover:underline break-words min-w-0 ${s.status==="completed"?"line-through text-muted-foreground":""}`,children:s.title}),e.jsxs("div",{className:"flex gap-1 flex-wrap sm:justify-end shrink-0",children:[e.jsx(w,{variant:"outline",className:`text-[10px] ${ie[s.priority]}`,children:F[s.priority]}),e.jsx(w,{variant:"secondary",className:`text-[10px] ${ye[s.status]}`,children:L[s.status]})]})]}),s.description&&e.jsx("p",{className:"text-xs text-muted-foreground line-clamp-2 mt-1 break-words",children:s.description}),e.jsxs("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground mt-2",children:[s.due_at&&e.jsxs("span",{className:`flex items-center gap-1 ${H(s)?"text-red-600 font-medium":""}`,children:[H(s)?e.jsx(Xe,{className:"h-3 w-3"}):e.jsx(pe,{className:"h-3 w-3"}
2),new Date(s.due_at).toLocaleString()]}),s.estimated_minutes!=null&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Je,{className:"h-3 w-3"}),"~",s.estimated_minutes,"m"]}),s.category&&e.jsx(w,{variant:"outline",className:"text-[10px]",children:s.category}),s.tags.map(i=>e.jsxs(w,{variant:"secondary",className:"text-[10px]",children:["#",i]},i)),s.subtasks.length>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Ie,{className:"h-3 w-3"}),s.subtasks.filter(i=>i.done).length,"/",s.subtasks.length]})]}),e.jsxs("div",{className:"flex gap-1 mt-2 sm:hidden",children:[e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>te(s),children:e.jsx(he,{className:"h-4 w-4"})}),e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>ke.mutate(s),children:e.jsx(De,{className:"h-4 w-4"})}),e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>ve.mutate({ids:[s.id],value:!s.is_archived}),children:s.is_archived?e.jsx(ce,{className:"h-4 w-4"}):e.jsx(de,{className:"h-4 w-4"})}),e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>{confirm("Delete task?")&&fe.mutate([s.id])},children:e.jsx(xe,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"hidden sm:flex gap-1 shrink-0",children:[e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>te(s),children:e.jsx(he,{className:"h-4 w-4"})}),e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>ke.mutate(s),children:e.jsx(De,{className:"h-4 w-4"})}),e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>ve.mutate({ids:[s.id],value:!s.is_archived}),children:s.is_archived?e.jsx(ce,{className:"h-4 w-4"}):e.jsx(de,{className:"h-4 w-4"})}),e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>{confirm("Delete task?")&&fe.mutate([s.id])},children:e.jsx(xe,{className:"h-4 w-4"})})]})]})},s.id)),e.jsx(Pe,{page:t,pageSize:p,total:R.length,onPageChange:d,onPageSizeChange:y})]}),e.jsx(me,{value:"kanban",children:e.jsxs(cs,{sensors:Ue,onDragEnd:Ke,children:[e.jsx("div",{className:"flex gap-3 overflow-x-auto pb-3",children:ge.map(s=>e.jsx(bs,{status:s,tasks:R.filter(i=>i.status===s),onOpen:le},s))}),e.jsx(ds,{})]})}),e.jsx(me,{value:"calendar",children:e.jsx(ks,{tasks:R,onOpen:le})}),e.jsxs(me,{value:"table",children:[e.jsx(q,{children:e.jsx(U,{className:"p-0 overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-muted/50 text-xs uppercase tracking-wide",children:e.jsxs("tr",{children:[e.jsx("th",{className:"p-2 w-8",children:e.jsx(O,{checked:we,onCheckedChange:Se})}),e.jsx("th",{className:"p-2 text-left",children:"Title"}),e.jsx("th",{className:"p-2 text-left",children:"Status"}),e.jsx("th",{className:"p-2 text-left",children:"Priority"}),e.jsx("th",{className:"p-2 text-left",children:"Due"}),e.jsx("th",{className:"p-2 text-left",children:"Category"}),e.jsx("th",{className:"p-2 text-left",children:"Assignees"}),e.jsx("th",{className:"p-2"})]})}),e.jsx("tbody",{children:M.slice.map(s=>e.jsxs("tr",{className:"border-t hover:bg-muted/30",children:[e.jsx("td",{className:"p-2",children:e.jsx(O,{checked:f.has(s.id),onCheckedChange:i=>{const h=new Set(f);i?h.add(s.id):h.delete(s.id),P(h)}})}),e.jsx("td",{className:"p-2",children:e.jsx("button",{className:"hover:underline text-left",onClick:()=>le(s),children:s.title})}),e.jsx("td",{className:"p-2",children:e.jsx(w,{className:`text-[10px] ${ye[s.status]}`,variant:"secondary",children:L[s.status]})}),e.jsx("td",{className:"p-2",children:e.jsx(w,{variant:"outline",className:`text-[10px] ${ie[s.priority]}`,children:F[s.priority]})}),e.jsx("td",{className:`p-2 text-xs ${H(s)?"text-red-600":"text-muted-foreground"}`,children:s.due_at?new Date(s.due_at).toLocaleDateString():"â"}),e.jsx("td",{className:"p-2 text-xs",children:s.category??"â"}),e.jsx("td",{className:"p-2 text-xs",children:s.assignees.length}),e.jsx("td",{className:"p-2 text-right",children:e.jsx(c,{size:"icon",variant:"ghost",onClick:()=>te(s),children:e.jsx(he,{className:"h-4 w-4"})})})]},s.id))})]})})}),e.jsx("div",{className:"mt-3",children:e.jsx(Pe,{page:t,pageSize:p,total:R.length,onPageChange:d,onPageSizeChange:y})})]})]}),X&&e.jsx(ws,{open:X,onOpenChange:s=>{J(s),s||G(null)},task:C,profiles:He,onSaved:K}),e.jsx(ys,{open:!!Z,onOpenChange:s=>{s||x(null)},task:Z,onEdit:s=>te(s)})]})}function ks({tasks:r,onOpen:u}){const[n,j]=g.useState(()=>{const l=new Date;return l.setDate(1),l}),o=new Date(n.getFullYear(),n.getMonth(),1),m=new Date(n.getFullYear(),n.getMonth()+1,0),a=o.getDay(),b=[];for(let l=0;l<a;l++)b.push(null);for(let l=1;l<=m.getDate();l++)b.push(new Date(n.getFullYear(),n.getMonth(),l));const k=g.useMemo(()=>{const l={};for(const T of r){if(!T.due_at)continue;const C=new Date(T.due_at).toDateString();(l[C]??(l[C]=[])).push(T)}return l},[r]);return e.jsxs(q,{children:[e.jsxs(Ve,{className:"flex-row items-center justify-between space-y-0",children:[e.jsx(qe,{className:"text-base",children:n.toLocaleStr
2ing(void 0,{month:"long",year:"numeric"})}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(c,{variant:"outline",size:"sm",onClick:()=>j(new Date(n.getFullYear(),n.getMonth()-1,1)),children:"Prev"}),e.jsx(c,{variant:"outline",size:"sm",onClick:()=>{const l=new Date;l.setDate(1),j(l)},children:"Today"}),e.jsx(c,{variant:"outline",size:"sm",onClick:()=>j(new Date(n.getFullYear(),n.getMonth()+1,1)),children:"Next"})]})]}),e.jsxs(U,{children:[e.jsx("div",{className:"grid grid-cols-7 gap-1 text-xs text-muted-foreground mb-1",children:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"].map(l=>e.jsx("div",{className:"px-1",children:l},l))}),e.jsx("div",{className:"grid grid-cols-7 gap-1",children:b.map((l,T)=>e.jsx("div",{className:"min-h-[88px] rounded border bg-card p-1",children:l&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-xs font-medium",children:l.getDate()}),e.jsxs("div",{className:"space-y-0.5 mt-1",children:[(k[l.toDateString()]??[]).slice(0,3).map(C=>e.jsx("button",{onClick:()=>u(C),className:`block w-full text-left text-[10px] truncate rounded px-1 py-0.5 ${ie[C.priority]} hover:opacity-80`,children:C.title},C.id)),(k[l.toDateString()]??[]).length>3&&e.jsxs("div",{className:"text-[10px] text-muted-foreground",children:["+",(k[l.toDateString()]??[]).length-3," more"]})]})]})},T))})]})]})}export{zs as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.