@ram_28/kf-ai-sdk 1.0.13 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth.cjs +1 -1
- package/dist/auth.mjs +90 -90
- package/dist/form.cjs +1 -1
- package/dist/form.mjs +736 -1745
- package/dist/kanban.cjs +2 -2
- package/dist/kanban.mjs +469 -835
- package/dist/kanban.ui.cjs +1 -1
- package/dist/kanban.ui.mjs +27 -27
- package/dist/table.cjs +1 -1
- package/dist/table.mjs +1 -1
- package/package.json +1 -1
- package/dist/jsx-runtime-BYECrxsp.cjs +0 -30
- package/dist/jsx-runtime-DGlMoOmv.js +0 -630
- package/dist/useQuery-BScHEo7x.cjs +0 -1
- package/dist/useQuery-KpZFg80c.js +0 -748
package/dist/kanban.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react"),A=require("@tanstack/react-query"),F=require("./client-C15j4O5B.cjs"),St=require("./useFilter-D-bCDo6Z.cjs"),nt=50,st=5,it=5;function ot({onCardMove:s,onError:c,columns:l,announceMove:a}){const[i,S]=u.useState({isDragging:!1,draggedCard:null,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:null}),O=u.useRef(null),w=u.useRef(null),K=u.useRef(null),_=u.useCallback(()=>{S({isDragging:!1,draggedCard:null,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:null}),w.current&&(clearTimeout(w.current),w.current=null)},[]),D=u.useCallback(d=>l.find(o=>o._id===d)||null,[l]),X=u.useCallback(d=>{for(const o of l){const y=o.cards.find(m=>m._id===d);if(y)return{card:y,column:o}}return null},[l]),P=u.useCallback((d,o)=>{var y,m;try{const g=d.target,f=D(o.columnId);if(!f)throw new Error("Source column not found");(y=d.dataTransfer)==null||y.setData("text/plain",o._id),(m=d.dataTransfer)==null||m.setData("application/json",JSON.stringify(o));const k=g.cloneNode(!0);k.style.cssText=`
|
|
2
2
|
position: fixed;
|
|
3
3
|
top: -1000px;
|
|
4
4
|
left: -1000px;
|
|
@@ -10,4 +10,4 @@
|
|
|
10
10
|
max-width: 300px;
|
|
11
11
|
background: white;
|
|
12
12
|
border-radius: 8px;
|
|
13
|
-
`,document.body.appendChild($),p.current=$,g.dataTransfer&&g.dataTransfer.setDragImage($,g.offsetX||50,g.offsetY||20),d({isDragging:!0,draggedCard:c,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:D._id}),t==null||t(c,D.title,"being moved")}catch(y){e==null||e(y instanceof Error?y:new Error("Drag start failed")),E()}},[w,e,E,t]),q=h.useCallback((g,c)=>{if(g.preventDefault(),!i.isDragging||!i.draggedCard)return;const b=c?w(c):null;d(O=>({...O,dragOverColumn:(b==null?void 0:b._id)||null,dragOverPosition:null})),P(g)},[i.isDragging,i.draggedCard,w]),V=h.useCallback((g,c)=>{if(g.preventDefault(),!(!i.isDragging||!i.draggedCard))try{const b=i.draggedCard,O=i.dragSourceColumn,y=w(c),D=w(O);if(!y||!D)throw new Error("Target or source column not found");if(O===c){E();return}if(y.limit&&y.cards.length>=y.limit)throw new Error(`Column "${y.title}" has reached its limit of ${y.limit} cards`);a==null||a(b,O,c),t==null||t(b,D.title,y.title)}catch(b){e==null||e(b instanceof Error?b:new Error("Drop failed"))}finally{E()}},[i,w,a,e,E,t]),f=h.useCallback(()=>{p.current&&(document.body.removeChild(p.current),p.current=null),E()},[E]),P=h.useCallback(g=>{const c=g.target.closest(".kanban-container");if(!c)return;const b=c.getBoundingClientRect(),O=g.clientX-b.left,y=b.width;let D=0;if(O<Ft?D=-Lt:O>y-Ft&&(D=Lt),D!==0){m.current&&clearTimeout(m.current);const $=()=>{c.scrollLeft+=D,m.current=setTimeout($,16)};m.current=setTimeout($,100)}else m.current&&(clearTimeout(m.current),m.current=null)},[]),R=h.useCallback((g,c)=>{if(!["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Enter","Space","Escape"].includes(g.key))return;g.preventDefault();const b=_(c._id);if(!b)return;const{column:O}=b,y=s.findIndex(D=>D._id===O._id);try{switch(g.key){case"ArrowLeft":if(y>0){const D=s[y-1];a==null||a(c,O._id,D._id),t==null||t(c,O.title,D.title)}break;case"ArrowRight":if(y<s.length-1){const D=s[y+1];a==null||a(c,O._id,D._id),t==null||t(c,O.title,D.title)}break;case"ArrowUp":t==null||t(c,"current position","position above");break;case"ArrowDown":t==null||t(c,"current position","position below");break;case"Enter":case"Space":t==null||t(c,O.title,"drag mode");break;case"Escape":t==null||t(c,"drag mode","cancelled");break}}catch(D){e==null||e(D instanceof Error?D:new Error("Keyboard navigation failed"))}},[_,s,a,e,t]),N=h.useCallback((g,c)=>{const b=g.touches[0];Q.current={x:b.clientX,y:b.clientY,card:c}},[]),et=h.useCallback(g=>{if(!Q.current)return;const c=g.touches[0],b=Math.abs(c.clientX-Q.current.x),O=Math.abs(c.clientY-Q.current.y);if(b>$t||O>$t){const y=Q.current.card,D=w(y.columnId);if(!D)return;d({isDragging:!0,draggedCard:y,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:D._id}),t==null||t(y,D.title,"being moved")}},[w,t]),k=h.useCallback(g=>{if(!i.isDragging||!i.draggedCard||!Q.current){Q.current=null;return}try{const c=g.changedTouches[0],b=document.elementFromPoint(c.clientX,c.clientY),O=b==null?void 0:b.closest("[data-column-id]");if(O){const y=O.dataset.columnId,D=i.draggedCard,$=i.dragSourceColumn,U=w(y),ht=w($);if(U&&ht&&$!==y){if(U.limit&&U.cards.length>=U.limit)throw new Error(`Column "${U.title}" has reached its limit of ${U.limit} cards`);a==null||a(D,$,y),t==null||t(D,ht.title,U.title)}}}catch(c){e==null||e(c instanceof Error?c:new Error("Touch drop failed"))}finally{Q.current=null,E()}},[i,w,a,e,E,t]),x=h.useCallback((g,c,b)=>{const O=`Moved "${g.title}" from ${c} to ${b}`,y=document.createElement("div");y.setAttribute("aria-live","polite"),y.setAttribute("aria-atomic","true"),y.className="sr-only",y.textContent=O,document.body.appendChild(y),setTimeout(()=>{document.body.removeChild(y)},1e3),console.log(`Kanban: ${O}`)},[]);return h.useEffect(()=>()=>{m.current&&clearTimeout(m.current),p.current&&document.body.contains(p.current)&&document.body.removeChild(p.current)},[]),{isDragging:i.isDragging,draggedCard:i.draggedCard,dragOverColumn:i.dragOverColumn,dragOverPosition:i.dragOverPosition,dragSourceColumn:i.dragSourceColumn,handleDragStart:K,handleDragOver:q,handleDrop:V,handleDragEnd:f,handleKeyDown:R,handleTouchStart:N,handleTouchMove:et,handleTouchEnd:k,announceMove:t||x,reset:E}}function le(a){var Kt,qt,Pt;const{columns:e,source:s,enableDragDrop:t=!0,initialState:i,onCardMove:d,onCardCreate:p,onCardUpdate:m,onCardDelete:Q,onError:E}=a,[w,_]=h.useState({query:(i==null?void 0:i.search)||""}),[K]=h.useState({field:((Kt=i==null?void 0:i.sorting)==null?void 0:Kt.field)||null,direction:((qt=i==null?void 0:i.sorting)==null?void 0:qt.direction)||null}),[q,V]=h.useState(()=>{const r={};return e.forEach(o=>{r[o.id]=10}),r}),f=h.useRef(E),P=h.useRef(d),R=h.useRef(p),N=h.useRef(m),et=h.useRef(Q);h.useEffect(()=>{f.current=E,P.current=d,R.current=p,N.current=m,et.current=Q},[E,d,p,m,Q]);const k=C.useQueryClient(),x=se.useFilter({initialConditions:i==null?void 0:i.filters,initialOperator:(i==null?void 0:i.filterOperator)||"And"}),g=h.useCallback(r=>{const o={LHSField:"columnId",Operator:"EQ",RHSValue:r,RHSType:"Constant"},n=x.payload;let u;n?n.Operator==="And"?u={...n,Condition:[...n.Condition||[],o]}:u={Operator:"And",Condition:[n,o]}:u={Operator:"And",Condition:[o]};const S={Page:1,PageSize:q[r]||10,Filter:u};return K.field&&K.direction?S.Sort=[{[String(K.field)]:K.direction==="asc"?"ASC":"DESC"},{position:"ASC"}]:S.Sort=[{columnId:"ASC"},{position:"ASC"}],w.query&&(S.Search=w.query),S},[x.payload,q,K,w.query]),c=ce({queries:e.map(r=>{const o=g(r.id);return{queryKey:["kanban-cards",s,r.id,o],queryFn:async()=>{try{return await M.api(s).list(o)}catch(n){throw n}},placeholderData:C.keepPreviousData,staleTime:30*1e3}})}),b=c.some(r=>r.isLoading),O=c.some(r=>r.isFetching),y=((Pt=c.find(r=>r.error))==null?void 0:Pt.error)||null,D=async()=>{await Promise.all(c.map(r=>r.refetch()))},$=h.useMemo(()=>{const r={};return w.query&&(r.Search=w.query),x.payload&&(r.Filter=x.payload),r},[w.query,x.payload]),{data:U,isLoading:ht,error:zt}=C.useQuery({queryKey:["kanban-count",s,$],queryFn:async()=>{try{return await M.api(s).count($)}catch(r){throw f.current&&f.current(r),r}},staleTime:30*1e3,gcTime:60*1e3}),vt=ut({mutationFn:async r=>{const o=r.position??999999;return(await M.api(s).create({...r,position:o}))._id},onMutate:async r=>{const o=r.columnId,n=g(o),u=["kanban-cards",s,o,n];await k.cancelQueries({queryKey:u});const S=k.getQueryData(u);if(S){const rt=S.Data,z=r.position??rt.length,st=`temp-${Date.now()}`,Z={...r,_id:st,position:z,_created_at:new Date,_modified_at:new Date};k.setQueryData(u,{...S,Data:[...S.Data,Z]})}return{previousCards:S,queryKey:u}},onSuccess:async(r,o,n)=>{var u;n!=null&&n.queryKey&&await k.invalidateQueries({queryKey:n.queryKey}),(u=R.current)==null||u.call(R,{_id:r,...o})},onError:(r,o,n)=>{var u;n!=null&&n.previousCards&&(n!=null&&n.queryKey)&&k.setQueryData(n.queryKey,n.previousCards),(u=f.current)==null||u.call(f,r)},onSettled:(r,o,n)=>{const u=n.columnId,S=g(u);k.invalidateQueries({queryKey:["kanban-cards",s,u,S]})}}),yt=ut({mutationFn:async({id:r,updates:o})=>(await M.api(s).update(r,o),{id:r,updates:o}),onMutate:async()=>(await k.cancelQueries({queryKey:["kanban-cards",s]}),{}),onSuccess:async r=>{var o;(o=N.current)==null||o.call(N,{_id:r.id,...r.updates})},onError:(r,o,n)=>{var u;(u=f.current)==null||u.call(f,r)},onSettled:()=>{k.invalidateQueries({queryKey:["kanban-cards",s]})}}),mt=ut({mutationFn:async r=>(await M.api(s).delete(r),r),onMutate:async()=>(await k.cancelQueries({queryKey:["kanban-cards",s]}),{}),onSuccess:async r=>{var o;(o=et.current)==null||o.call(et,r)},onError:(r,o,n)=>{var u;(u=f.current)==null||u.call(f,r)},onSettled:()=>{k.invalidateQueries({queryKey:["kanban-cards",s]})}}),nt=ut({mutationFn:async({cardId:r,fromColumnId:o,toColumnId:n,position:u})=>{const S={columnId:n,...u!==void 0&&{position:u}};return await M.api(s).update(r,S),{cardId:r,fromColumnId:o,toColumnId:n,position:u}},onMutate:async({cardId:r,fromColumnId:o,toColumnId:n,position:u})=>{const S=g(o),rt=g(n),z=["kanban-cards",s,o,S],st=["kanban-cards",s,n,rt];await k.cancelQueries({queryKey:z}),await k.cancelQueries({queryKey:st});const Z=k.getQueryData(z),ot=k.getQueryData(st);if(Z&&ot){const Rt=Z.Data.find(Ct=>Ct._id===r);if(Rt){const Ct={...Z,Data:Z.Data.filter(Dt=>Dt._id!==r)},te={...Rt,columnId:n,position:u??ot.Data.length,_modified_at:new Date},ee={...ot,Data:[...ot.Data,te].sort((Dt,re)=>Dt.position-re.position)};k.setQueryData(z,Ct),k.setQueryData(st,ee)}}return{previousFromData:Z,previousToData:ot,fromQueryKey:z,toQueryKey:st,fromColumnId:o,toColumnId:n}},onSuccess:async r=>{var o;(o=P.current)==null||o.call(P,{_id:r.cardId},r.fromColumnId,r.toColumnId)},onError:(r,o,n)=>{var u;n!=null&&n.previousFromData&&(n!=null&&n.fromQueryKey)&&k.setQueryData(n.fromQueryKey,n.previousFromData),n!=null&&n.previousToData&&(n!=null&&n.toQueryKey)&&k.setQueryData(n.toQueryKey,n.previousToData),(u=f.current)==null||u.call(f,r)},onSettled:(r,o,n)=>{const u=g(n.fromColumnId),S=g(n.toColumnId);k.invalidateQueries({queryKey:["kanban-cards",s,n.fromColumnId,u]}),k.invalidateQueries({queryKey:["kanban-cards",s,n.toColumnId,S]})}}),bt=ut({mutationFn:async({cardIds:r,columnId:o})=>{const n=r.map((u,S)=>({id:u,position:S,columnId:o}));await Promise.all(n.map(u=>M.api(s).update(u.id,{position:u.position,columnId:u.columnId})))},onMutate:async({columnId:r})=>{const o=g(r),n=["kanban-cards",s,r,o];return await k.cancelQueries({queryKey:n}),{}},onSuccess:()=>{},onError:(r,o,n)=>{var u;(u=f.current)==null||u.call(f,r)},onSettled:(r,o,n)=>{const u=g(n.columnId);k.invalidateQueries({queryKey:["kanban-cards",s,n.columnId,u]})}}),Bt=h.useCallback(async(r,o,n)=>{try{await nt.mutateAsync({cardId:r._id,fromColumnId:o,toColumnId:n,position:void 0})}catch{}},[nt]),gt=h.useMemo(()=>e.sort((r,o)=>r.position-o.position).map((r,o)=>{var S;const u=((S=c[o].data)==null?void 0:S.Data)||[];return{_id:r.id,title:r.title,position:r.position,color:r.color,limit:r.limit,cards:u.sort((rt,z)=>rt.position-z.position),_created_at:new Date,_modified_at:new Date}}),[e,c]),A=It({onCardMove:Bt,onError:f.current,columns:gt,announceMove:(r,o,n)=>{console.log(`Kanban: Moved "${r.title}" from ${o} to ${n}`)}}),Nt=h.useCallback(r=>{var o,n;return{draggable:!0,role:"option","aria-selected":t&&((o=A.draggedCard)==null?void 0:o._id)===r._id,"aria-grabbed":t&&((n=A.draggedCard)==null?void 0:n._id)===r._id,onDragStart:u=>{if(!t)return;u.dataTransfer.setData("text/plain",JSON.stringify(r));const S=u.nativeEvent||u;A.handleDragStart(S,r)},onDragEnd:A.handleDragEnd,onKeyDown:u=>{if(!t)return;const S=u.nativeEvent||u;A.handleKeyDown(S,r)}}},[t,A]),Xt=h.useCallback(r=>({"data-column-id":r,role:"listbox",onDragOver:o=>{if(!t)return;const n=o.nativeEvent||o;A.handleDragOver(n,r)},onDrop:o=>{if(!t)return;const n=o.nativeEvent||o;A.handleDrop(n,r)}}),[t,A]),Yt=h.useCallback(r=>{_({query:r})},[]),Jt=h.useCallback(()=>{_({query:""})},[]),Vt=(U==null?void 0:U.Count)||0,xt=b||ht,Gt=O,Wt=vt.isPending||yt.isPending||mt.isPending||nt.isPending||bt.isPending,ft=y||zt,Zt=h.useCallback(async()=>{await D()},[D]),Mt=h.useCallback(async()=>{await k.invalidateQueries({predicate:r=>r.queryKey[0]==="kanban-cards"||r.queryKey[0]==="kanban-count"})},[k]);return h.useEffect(()=>{ft&&f.current&&f.current(ft)},[ft]),{columns:gt,totalCards:Vt,isLoading:xt,isFetching:Gt,isUpdating:Wt,error:ft,createCard:vt.mutateAsync,updateCard:h.useCallback(async(r,o)=>{await yt.mutateAsync({id:r,updates:o})},[yt]),deleteCard:h.useCallback(async r=>{await mt.mutateAsync(r)},[mt]),moveCard:h.useCallback(async(r,o,n,u)=>{if(!u){for(const S of gt)if(S.cards.find(z=>z._id===r)){u=S._id;break}if(!u)throw new Error(`Card ${r} not found in any column`)}await nt.mutateAsync({cardId:r,fromColumnId:u,toColumnId:o,position:n})},[nt,gt]),reorderCards:h.useCallback(async(r,o)=>{await bt.mutateAsync({cardIds:r,columnId:o})},[bt]),searchQuery:w.query,setSearchQuery:Yt,clearSearch:Jt,filter:x,isDragging:t?A.isDragging:!1,draggedCard:t?A.draggedCard:null,dragOverColumn:t?A.dragOverColumn:null,handleDragStart:t?A.handleDragStart:()=>{},handleDragOver:t?A.handleDragOver:()=>{},handleDrop:t?A.handleDrop:()=>{},handleDragEnd:t?A.handleDragEnd:()=>{},handleKeyDown:t?A.handleKeyDown:()=>{},getCardProps:t?Nt:r=>({}),getColumnProps:t?Xt:r=>({}),loadMore:h.useCallback(r=>{V(o=>({...o,[r]:(o[r]||10)+10}))},[]),refetch:Zt,refresh:Mt}}const Ut=h.createContext(null);function de(){const a=h.useContext(Ut);if(!a)throw new Error("Kanban components must be used within a KanbanBoard component");return a}function he(a,e){const s=e.reduce((t,i)=>(t[i.columnId]||(t[i.columnId]=[]),t[i.columnId].push(i),t),{});return a.map(t=>({...t,cards:(s[t._id]||[]).sort((i,d)=>i.position-d.position)}))}function ge(a,e){if(a.cards.length===0)return 0;if(e===void 0||e>=a.cards.length)return a.cards[a.cards.length-1].position+1;if(e===0){const i=a.cards[0];return Math.max(0,i.position-1)}const s=a.cards[e-1],t=a.cards[e];return Math.floor((s.position+t.position)/2)}function fe(a,e){if(a.length===0)return 0;if(e===void 0||e>=a.length)return a[a.length-1].position+1;if(e===0){const i=a[0];return Math.max(0,i.position-1)}const s=a[e-1],t=a[e];return Math.floor((s.position+t.position)/2)}function pe(a){return a.sort((e,s)=>e.position-s.position).map((e,s)=>({...e,position:s}))}function ye(a,e,s,t){const i=`Failed to ${e} ${s}`,d=t?` (ID: ${t})`:"";return a instanceof Error?new Error(`${i}${d}: ${a.message}`):new Error(`${i}${d}: Unknown error`)}function me(a,e){switch(e){case"list":return a&&Array.isArray(a.Data);case"single":return a&&typeof a=="object";case"create":return a&&typeof a._id=="string";case"delete":return a&&a.status==="success";default:return!1}}exports.KanbanContext=Ut;exports.calculateCardPosition=ge;exports.calculateColumnPosition=fe;exports.handleKanbanApiError=ye;exports.mergeCardsIntoColumns=he;exports.normalizePositions=pe;exports.useDragDropManager=It;exports.useKanban=le;exports.useKanbanContext=de;exports.validateApiResponse=me;
|
|
13
|
+
`,document.body.appendChild(k),O.current=k,d.dataTransfer&&d.dataTransfer.setDragImage(k,d.offsetX||50,d.offsetY||20),S({isDragging:!0,draggedCard:o,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:f._id}),a==null||a(o,f.title,"being moved")}catch(g){c==null||c(g instanceof Error?g:new Error("Drag start failed")),_()}},[D,c,_,a]),z=u.useCallback((d,o)=>{if(d.preventDefault(),!i.isDragging||!i.draggedCard)return;const y=o?D(o):null;S(m=>({...m,dragOverColumn:(y==null?void 0:y._id)||null,dragOverPosition:null})),$(d)},[i.isDragging,i.draggedCard,D]),v=u.useCallback((d,o)=>{if(d.preventDefault(),!(!i.isDragging||!i.draggedCard))try{const y=i.draggedCard,m=i.dragSourceColumn,g=D(o),f=D(m);if(!g||!f)throw new Error("Target or source column not found");if(m===o){_();return}if(g.limit&&g.cards.length>=g.limit)throw new Error(`Column "${g.title}" has reached its limit of ${g.limit} cards`);s==null||s(y,m,o),a==null||a(y,f.title,g.title)}catch(y){c==null||c(y instanceof Error?y:new Error("Drop failed"))}finally{_()}},[i,D,s,c,_,a]),h=u.useCallback(()=>{O.current&&(document.body.removeChild(O.current),O.current=null),_()},[_]),$=u.useCallback(d=>{const o=d.target.closest(".kanban-container");if(!o)return;const y=o.getBoundingClientRect(),m=d.clientX-y.left,g=y.width;let f=0;if(m<nt?f=-st:m>g-nt&&(f=st),f!==0){w.current&&clearTimeout(w.current);const k=()=>{o.scrollLeft+=f,w.current=setTimeout(k,16)};w.current=setTimeout(k,100)}else w.current&&(clearTimeout(w.current),w.current=null)},[]),L=u.useCallback((d,o)=>{if(!["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Enter","Space","Escape"].includes(d.key))return;d.preventDefault();const y=X(o._id);if(!y)return;const{column:m}=y,g=l.findIndex(f=>f._id===m._id);try{switch(d.key){case"ArrowLeft":if(g>0){const f=l[g-1];s==null||s(o,m._id,f._id),a==null||a(o,m.title,f.title)}break;case"ArrowRight":if(g<l.length-1){const f=l[g+1];s==null||s(o,m._id,f._id),a==null||a(o,m.title,f.title)}break;case"ArrowUp":a==null||a(o,"current position","position above");break;case"ArrowDown":a==null||a(o,"current position","position below");break;case"Enter":case"Space":a==null||a(o,m.title,"drag mode");break;case"Escape":a==null||a(o,"drag mode","cancelled");break}}catch(f){c==null||c(f instanceof Error?f:new Error("Keyboard navigation failed"))}},[X,l,s,c,a]),I=u.useCallback((d,o)=>{const y=d.touches[0];K.current={x:y.clientX,y:y.clientY,card:o}},[]),R=u.useCallback(d=>{if(!K.current)return;const o=d.touches[0],y=Math.abs(o.clientX-K.current.x),m=Math.abs(o.clientY-K.current.y);if(y>it||m>it){const g=K.current.card,f=D(g.columnId);if(!f)return;S({isDragging:!0,draggedCard:g,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:f._id}),a==null||a(g,f.title,"being moved")}},[D,a]),C=u.useCallback(d=>{if(!i.isDragging||!i.draggedCard||!K.current){K.current=null;return}try{const o=d.changedTouches[0],y=document.elementFromPoint(o.clientX,o.clientY),m=y==null?void 0:y.closest("[data-column-id]");if(m){const g=m.dataset.columnId,f=i.draggedCard,k=i.dragSourceColumn,q=D(g),B=D(k);if(q&&B&&k!==g){if(q.limit&&q.cards.length>=q.limit)throw new Error(`Column "${q.title}" has reached its limit of ${q.limit} cards`);s==null||s(f,k,g),a==null||a(f,B.title,q.title)}}}catch(o){c==null||c(o instanceof Error?o:new Error("Touch drop failed"))}finally{K.current=null,_()}},[i,D,s,c,_,a]),T=u.useCallback((d,o,y)=>{const m=`Moved "${d.title}" from ${o} to ${y}`,g=document.createElement("div");g.setAttribute("aria-live","polite"),g.setAttribute("aria-atomic","true"),g.className="sr-only",g.textContent=m,document.body.appendChild(g),setTimeout(()=>{document.body.removeChild(g)},1e3),console.log(`Kanban: ${m}`)},[]);return u.useEffect(()=>()=>{w.current&&clearTimeout(w.current),O.current&&document.body.contains(O.current)&&document.body.removeChild(O.current)},[]),{isDragging:i.isDragging,draggedCard:i.draggedCard,dragOverColumn:i.dragOverColumn,dragOverPosition:i.dragOverPosition,dragSourceColumn:i.dragSourceColumn,handleDragStart:P,handleDragOver:z,handleDrop:v,handleDragEnd:h,handleKeyDown:L,handleTouchStart:I,handleTouchMove:R,handleTouchEnd:C,announceMove:a||T,reset:_}}function Kt(s){var tt,rt,et;const{columns:c,source:l,enableDragDrop:a=!0,initialState:i,onCardMove:S,onCardCreate:O,onCardUpdate:w,onCardDelete:K,onError:_}=s,[D,X]=u.useState({query:(i==null?void 0:i.search)||""}),[P]=u.useState({field:((tt=i==null?void 0:i.sorting)==null?void 0:tt.field)||null,direction:((rt=i==null?void 0:i.sorting)==null?void 0:rt.direction)||null}),[z,v]=u.useState(()=>{const t={};return c.forEach(e=>{t[e.id]=10}),t}),h=u.useRef(_),$=u.useRef(S),L=u.useRef(O),I=u.useRef(w),R=u.useRef(K);u.useEffect(()=>{h.current=_,$.current=S,L.current=O,I.current=w,R.current=K},[_,S,O,w,K]);const C=A.useQueryClient(),T=St.useFilter({initialConditions:i==null?void 0:i.filters,initialOperator:(i==null?void 0:i.filterOperator)||"And"}),d=u.useCallback(t=>{const e={LHSField:"columnId",Operator:"EQ",RHSValue:t,RHSType:"Constant"},r=T.payload;let n;r?r.Operator==="And"?n={...r,Condition:[...r.Condition||[],e]}:n={Operator:"And",Condition:[r,e]}:n={Operator:"And",Condition:[e]};const p={Page:1,PageSize:z[t]||10,Filter:n};return P.field&&P.direction?p.Sort=[{[String(P.field)]:P.direction==="asc"?"ASC":"DESC"},{position:"ASC"}]:p.Sort=[{columnId:"ASC"},{position:"ASC"}],D.query&&(p.Search=D.query),p},[T.payload,z,P,D.query]),o=A.useQueries({queries:c.map(t=>{const e=d(t.id);return{queryKey:["kanban-cards",l,t.id,e],queryFn:async()=>{try{return await F.api(l).list(e)}catch(r){throw r}},placeholderData:A.keepPreviousData,staleTime:30*1e3}})}),y=o.some(t=>t.isLoading),m=o.some(t=>t.isFetching),g=((et=o.find(t=>t.error))==null?void 0:et.error)||null,f=async()=>{await Promise.all(o.map(t=>t.refetch()))},k=u.useMemo(()=>{const t={};return D.query&&(t.Search=D.query),T.payload&&(t.Filter=T.payload),t},[D.query,T.payload]),{data:q,isLoading:B,error:ct}=A.useQuery({queryKey:["kanban-count",l,k],queryFn:async()=>{try{return await F.api(l).count(k)}catch(t){throw h.current&&h.current(t),t}},staleTime:30*1e3,gcTime:60*1e3}),M=A.useMutation({mutationFn:async t=>{const e=t.position??999999;return(await F.api(l).create({...t,position:e}))._id},onMutate:async t=>{const e=t.columnId,r=d(e),n=["kanban-cards",l,e,r];await C.cancelQueries({queryKey:n});const p=C.getQueryData(n);if(p){const H=p.Data,Q=t.position??H.length,U=`temp-${Date.now()}`,E={...t,_id:U,position:Q,_created_at:new Date,_modified_at:new Date};C.setQueryData(n,{...p,Data:[...p.Data,E]})}return{previousCards:p,queryKey:n}},onSuccess:async(t,e,r)=>{var n;r!=null&&r.queryKey&&await C.invalidateQueries({queryKey:r.queryKey}),(n=L.current)==null||n.call(L,{_id:t,...e})},onError:(t,e,r)=>{var n;r!=null&&r.previousCards&&(r!=null&&r.queryKey)&&C.setQueryData(r.queryKey,r.previousCards),(n=h.current)==null||n.call(h,t)},onSettled:(t,e,r)=>{const n=r.columnId,p=d(n);C.invalidateQueries({queryKey:["kanban-cards",l,n,p]})}}),W=A.useMutation({mutationFn:async({id:t,updates:e})=>(await F.api(l).update(t,e),{id:t,updates:e}),onMutate:async()=>(await C.cancelQueries({queryKey:["kanban-cards",l]}),{}),onSuccess:async t=>{var e;(e=I.current)==null||e.call(I,{_id:t.id,...t.updates})},onError:(t,e,r)=>{var n;(n=h.current)==null||n.call(h,t)},onSettled:()=>{C.invalidateQueries({queryKey:["kanban-cards",l]})}}),G=A.useMutation({mutationFn:async t=>(await F.api(l).delete(t),t),onMutate:async()=>(await C.cancelQueries({queryKey:["kanban-cards",l]}),{}),onSuccess:async t=>{var e;(e=R.current)==null||e.call(R,t)},onError:(t,e,r)=>{var n;(n=h.current)==null||n.call(h,t)},onSettled:()=>{C.invalidateQueries({queryKey:["kanban-cards",l]})}}),Y=A.useMutation({mutationFn:async({cardId:t,fromColumnId:e,toColumnId:r,position:n})=>{const p={columnId:r,...n!==void 0&&{position:n}};return await F.api(l).update(t,p),{cardId:t,fromColumnId:e,toColumnId:r,position:n}},onMutate:async({cardId:t,fromColumnId:e,toColumnId:r,position:n})=>{const p=d(e),H=d(r),Q=["kanban-cards",l,e,p],U=["kanban-cards",l,r,H];await C.cancelQueries({queryKey:Q}),await C.cancelQueries({queryKey:U});const E=C.getQueryData(Q),j=C.getQueryData(U);if(E&&j){const at=E.Data.find(Z=>Z._id===t);if(at){const Z={...E,Data:E.Data.filter(x=>x._id!==t)},wt={...at,columnId:r,position:n??j.Data.length,_modified_at:new Date},_t={...j,Data:[...j.Data,wt].sort((x,kt)=>x.position-kt.position)};C.setQueryData(Q,Z),C.setQueryData(U,_t)}}return{previousFromData:E,previousToData:j,fromQueryKey:Q,toQueryKey:U,fromColumnId:e,toColumnId:r}},onSuccess:async t=>{var e;(e=$.current)==null||e.call($,{_id:t.cardId},t.fromColumnId,t.toColumnId)},onError:(t,e,r)=>{var n;r!=null&&r.previousFromData&&(r!=null&&r.fromQueryKey)&&C.setQueryData(r.fromQueryKey,r.previousFromData),r!=null&&r.previousToData&&(r!=null&&r.toQueryKey)&&C.setQueryData(r.toQueryKey,r.previousToData),(n=h.current)==null||n.call(h,t)},onSettled:(t,e,r)=>{const n=d(r.fromColumnId),p=d(r.toColumnId);C.invalidateQueries({queryKey:["kanban-cards",l,r.fromColumnId,n]}),C.invalidateQueries({queryKey:["kanban-cards",l,r.toColumnId,p]})}}),V=A.useMutation({mutationFn:async({cardIds:t,columnId:e})=>{const r=t.map((n,p)=>({id:n,position:p,columnId:e}));await Promise.all(r.map(n=>F.api(l).update(n.id,{position:n.position,columnId:n.columnId})))},onMutate:async({columnId:t})=>{const e=d(t),r=["kanban-cards",l,t,e];return await C.cancelQueries({queryKey:r}),{}},onSuccess:()=>{},onError:(t,e,r)=>{var n;(n=h.current)==null||n.call(h,t)},onSettled:(t,e,r)=>{const n=d(r.columnId);C.invalidateQueries({queryKey:["kanban-cards",l,r.columnId,n]})}}),lt=u.useCallback(async(t,e,r)=>{try{await Y.mutateAsync({cardId:t._id,fromColumnId:e,toColumnId:r,position:void 0})}catch{}},[Y]),N=u.useMemo(()=>c.sort((t,e)=>t.position-e.position).map((t,e)=>{var p;const n=((p=o[e].data)==null?void 0:p.Data)||[];return{_id:t.id,title:t.title,position:t.position,color:t.color,limit:t.limit,cards:n.sort((H,Q)=>H.position-Q.position),_created_at:new Date,_modified_at:new Date}}),[c,o]),b=ot({onCardMove:lt,onError:h.current,columns:N,announceMove:(t,e,r)=>{console.log(`Kanban: Moved "${t.title}" from ${e} to ${r}`)}}),dt=u.useCallback(t=>{var e,r;return{draggable:!0,role:"option","aria-selected":a&&((e=b.draggedCard)==null?void 0:e._id)===t._id,"aria-grabbed":a&&((r=b.draggedCard)==null?void 0:r._id)===t._id,onDragStart:n=>{if(!a)return;n.dataTransfer.setData("text/plain",JSON.stringify(t));const p=n.nativeEvent||n;b.handleDragStart(p,t)},onDragEnd:b.handleDragEnd,onKeyDown:n=>{if(!a)return;const p=n.nativeEvent||n;b.handleKeyDown(p,t)}}},[a,b]),gt=u.useCallback(t=>({"data-column-id":t,role:"listbox",onDragOver:e=>{if(!a)return;const r=e.nativeEvent||e;b.handleDragOver(r,t)},onDrop:e=>{if(!a)return;const r=e.nativeEvent||e;b.handleDrop(r,t)}}),[a,b]),yt=u.useCallback(t=>{X({query:t})},[]),ft=u.useCallback(()=>{X({query:""})},[]),mt=(q==null?void 0:q.Count)||0,pt=y||B,Ct=m,ht=M.isPending||W.isPending||G.isPending||Y.isPending||V.isPending,J=g||ct,Dt=u.useCallback(async()=>{await f()},[f]),bt=u.useCallback(async()=>{await C.invalidateQueries({predicate:t=>t.queryKey[0]==="kanban-cards"||t.queryKey[0]==="kanban-count"})},[C]);return u.useEffect(()=>{J&&h.current&&h.current(J)},[J]),{columns:N,totalCards:mt,isLoading:pt,isFetching:Ct,isUpdating:ht,error:J,createCard:M.mutateAsync,updateCard:u.useCallback(async(t,e)=>{await W.mutateAsync({id:t,updates:e})},[W]),deleteCard:u.useCallback(async t=>{await G.mutateAsync(t)},[G]),moveCard:u.useCallback(async(t,e,r,n)=>{if(!n){for(const p of N)if(p.cards.find(Q=>Q._id===t)){n=p._id;break}if(!n)throw new Error(`Card ${t} not found in any column`)}await Y.mutateAsync({cardId:t,fromColumnId:n,toColumnId:e,position:r})},[Y,N]),reorderCards:u.useCallback(async(t,e)=>{await V.mutateAsync({cardIds:t,columnId:e})},[V]),searchQuery:D.query,setSearchQuery:yt,clearSearch:ft,filter:T,isDragging:a?b.isDragging:!1,draggedCard:a?b.draggedCard:null,dragOverColumn:a?b.dragOverColumn:null,handleDragStart:a?b.handleDragStart:()=>{},handleDragOver:a?b.handleDragOver:()=>{},handleDrop:a?b.handleDrop:()=>{},handleDragEnd:a?b.handleDragEnd:()=>{},handleKeyDown:a?b.handleKeyDown:()=>{},getCardProps:a?dt:t=>({}),getColumnProps:a?gt:t=>({}),loadMore:u.useCallback(t=>{v(e=>({...e,[t]:(e[t]||10)+10}))},[]),refetch:Dt,refresh:bt}}const ut=u.createContext(null);function Ot(){const s=u.useContext(ut);if(!s)throw new Error("Kanban components must be used within a KanbanBoard component");return s}function qt(s,c){const l=c.reduce((a,i)=>(a[i.columnId]||(a[i.columnId]=[]),a[i.columnId].push(i),a),{});return s.map(a=>({...a,cards:(l[a._id]||[]).sort((i,S)=>i.position-S.position)}))}function Qt(s,c){if(s.cards.length===0)return 0;if(c===void 0||c>=s.cards.length)return s.cards[s.cards.length-1].position+1;if(c===0){const i=s.cards[0];return Math.max(0,i.position-1)}const l=s.cards[c-1],a=s.cards[c];return Math.floor((l.position+a.position)/2)}function At(s,c){if(s.length===0)return 0;if(c===void 0||c>=s.length)return s[s.length-1].position+1;if(c===0){const i=s[0];return Math.max(0,i.position-1)}const l=s[c-1],a=s[c];return Math.floor((l.position+a.position)/2)}function Tt(s){return s.sort((c,l)=>c.position-l.position).map((c,l)=>({...c,position:l}))}function Pt(s,c,l,a){const i=`Failed to ${c} ${l}`,S=a?` (ID: ${a})`:"";return s instanceof Error?new Error(`${i}${S}: ${s.message}`):new Error(`${i}${S}: Unknown error`)}function Et(s,c){switch(c){case"list":return s&&Array.isArray(s.Data);case"single":return s&&typeof s=="object";case"create":return s&&typeof s._id=="string";case"delete":return s&&s.status==="success";default:return!1}}exports.KanbanContext=ut;exports.calculateCardPosition=Qt;exports.calculateColumnPosition=At;exports.handleKanbanApiError=Pt;exports.mergeCardsIntoColumns=qt;exports.normalizePositions=Tt;exports.useDragDropManager=ot;exports.useKanban=Kt;exports.useKanbanContext=Ot;exports.validateApiResponse=Et;
|