@ram_28/kf-ai-sdk 1.0.19 → 1.0.20

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.
Files changed (64) hide show
  1. package/README.md +45 -12
  2. package/dist/components/hooks/useFilter/types.d.ts +14 -11
  3. package/dist/components/hooks/useFilter/types.d.ts.map +1 -1
  4. package/dist/components/hooks/useFilter/useFilter.d.ts +1 -1
  5. package/dist/components/hooks/useFilter/useFilter.d.ts.map +1 -1
  6. package/dist/components/hooks/useForm/apiClient.d.ts.map +1 -1
  7. package/dist/components/hooks/useForm/useForm.d.ts.map +1 -1
  8. package/dist/components/hooks/useKanban/types.d.ts +5 -22
  9. package/dist/components/hooks/useKanban/types.d.ts.map +1 -1
  10. package/dist/components/hooks/useKanban/useKanban.d.ts.map +1 -1
  11. package/dist/components/hooks/useTable/types.d.ts +19 -31
  12. package/dist/components/hooks/useTable/types.d.ts.map +1 -1
  13. package/dist/components/hooks/useTable/useTable.d.ts.map +1 -1
  14. package/dist/error-handling-CAoD0Kwb.cjs +1 -0
  15. package/dist/error-handling-CrhTtD88.js +14 -0
  16. package/dist/filter.cjs +1 -1
  17. package/dist/filter.mjs +1 -1
  18. package/dist/form.cjs +1 -1
  19. package/dist/form.mjs +338 -327
  20. package/dist/index.d.ts +18 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/kanban.cjs +2 -2
  23. package/dist/kanban.mjs +332 -322
  24. package/dist/table.cjs +1 -1
  25. package/dist/table.mjs +113 -96
  26. package/dist/table.types.d.ts +1 -1
  27. package/dist/table.types.d.ts.map +1 -1
  28. package/dist/types/common.d.ts +26 -6
  29. package/dist/types/common.d.ts.map +1 -1
  30. package/dist/useFilter-DzpP_ag0.cjs +1 -0
  31. package/dist/useFilter-H5bgAZQF.js +120 -0
  32. package/dist/utils/api/buildListOptions.d.ts +43 -0
  33. package/dist/utils/api/buildListOptions.d.ts.map +1 -0
  34. package/dist/utils/api/index.d.ts +2 -0
  35. package/dist/utils/api/index.d.ts.map +1 -0
  36. package/dist/utils/error-handling.d.ts +41 -0
  37. package/dist/utils/error-handling.d.ts.map +1 -0
  38. package/dist/utils/index.d.ts +2 -0
  39. package/dist/utils/index.d.ts.map +1 -1
  40. package/docs/QUICK_REFERENCE.md +142 -420
  41. package/docs/useAuth.md +52 -340
  42. package/docs/useFilter.md +858 -162
  43. package/docs/useForm.md +712 -501
  44. package/docs/useKanban.md +534 -279
  45. package/docs/useTable.md +725 -214
  46. package/package.json +1 -1
  47. package/sdk/components/hooks/useFilter/types.ts +14 -11
  48. package/sdk/components/hooks/useFilter/useFilter.ts +20 -18
  49. package/sdk/components/hooks/useForm/apiClient.ts +2 -1
  50. package/sdk/components/hooks/useForm/useForm.ts +35 -11
  51. package/sdk/components/hooks/useKanban/types.ts +7 -23
  52. package/sdk/components/hooks/useKanban/useKanban.ts +54 -18
  53. package/sdk/components/hooks/useTable/types.ts +26 -32
  54. package/sdk/components/hooks/useTable/useTable.llm.txt +8 -22
  55. package/sdk/components/hooks/useTable/useTable.ts +70 -25
  56. package/sdk/index.ts +154 -10
  57. package/sdk/table.types.ts +3 -0
  58. package/sdk/types/common.ts +31 -6
  59. package/sdk/utils/api/buildListOptions.ts +120 -0
  60. package/sdk/utils/api/index.ts +2 -0
  61. package/sdk/utils/error-handling.ts +150 -0
  62. package/sdk/utils/index.ts +6 -0
  63. package/dist/useFilter-Dofowpr_.cjs +0 -1
  64. package/dist/useFilter-Dv-mr9QW.js +0 -117
package/dist/index.d.ts CHANGED
@@ -1,3 +1,21 @@
1
+ export { useTable } from './components/hooks/useTable';
2
+ export type { UseTableOptionsType, UseTableReturnType, } from './components/hooks/useTable';
3
+ export { useForm } from './components/hooks/useForm';
4
+ export type { UseFormOptionsType, UseFormReturnType, FormFieldConfigType, FormSchemaConfigType, } from './components/hooks/useForm';
5
+ export { useKanban } from './components/hooks/useKanban';
6
+ export type { UseKanbanOptionsType, UseKanbanReturnType, KanbanCardType, KanbanColumnType, ColumnConfigType, } from './components/hooks/useKanban';
7
+ export { useFilter, isCondition, isConditionGroup } from './components/hooks/useFilter';
8
+ export type { UseFilterOptionsType, UseFilterReturnType, } from './components/hooks/useFilter';
9
+ export { AuthProvider, useAuth } from './auth';
10
+ export type { UseAuthReturnType, UserDetailsType, AuthStatusType, AuthProviderPropsType, } from './auth/types';
11
+ export { api, setApiBaseUrl, getApiBaseUrl, getBdoSchema } from './api';
12
+ export type { SortType, SortDirectionType, FilterType, ConditionType, ConditionGroupType, ConditionOperatorType, ConditionGroupOperatorType, ListResponseType, ListOptionsType, ColumnDefinitionType, } from './types/common';
13
+ export type { IdFieldType, StringFieldType, TextAreaFieldType, NumberFieldType, LongFieldType, BooleanFieldType, DateFieldType, DateTimeFieldType, CurrencyFieldType, SelectFieldType, LookupFieldType, ArrayFieldType, JSONFieldType, } from './types/base-fields';
14
+ export { formatCurrency, formatDate, formatDateTime, formatNumber, formatBoolean, formatArray, formatJSON, formatFieldValue, } from './utils/formatting';
15
+ export { cn } from './utils/cn';
16
+ export { toError, isError, getErrorMessage, isNetworkError, isTimeoutError, isAbortError, tryCatch, wrapError, } from './utils/error-handling';
17
+ export { buildListOptions, buildCountOptions, combineFilters, } from './utils/api';
18
+ export { Kanban, KanbanColumn, KanbanColumnHeader, KanbanColumnTitle, KanbanColumnContent, KanbanCard, KanbanCardTitle, KanbanCardDescription, KanbanColumnFooter, } from './components/ui';
1
19
  export * from './types';
2
20
  export * from './api';
3
21
  export * from './utils';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sdk/index.ts"],"names":[],"mappings":"AAGA,cAAc,SAAS,CAAC;AAGxB,cAAc,OAAO,CAAC;AAGtB,cAAc,SAAS,CAAC;AAGxB,cAAc,cAAc,CAAC;AAG7B,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sdk/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,YAAY,EACV,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACxF,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAMtB,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAOxE,YAAY,EACV,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,cAAc,EACd,UAAU,EACV,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAGhC,OAAO,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,SAAS,GACV,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAOzB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC"}
package/dist/kanban.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react"),A=require("@tanstack/react-query"),F=require("./client-DgtkT50N.cjs"),St=require("./useFilter-Dofowpr_.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=`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),T=require("@tanstack/react-query"),F=require("./client-DgtkT50N.cjs"),A=require("./error-handling-CAoD0Kwb.cjs"),Tt=require("./useFilter-DzpP_ag0.cjs"),ut=50,ct=5,lt=5;function dt({onCardMove:o,onError:l,columns:d,announceMove:a}){const[i,_]=c.useState({isDragging:!1,draggedCard:null,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:null}),Q=c.useRef(null),D=c.useRef(null),S=c.useRef(null),w=c.useCallback(()=>{_({isDragging:!1,draggedCard:null,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:null}),D.current&&(clearTimeout(D.current),D.current=null)},[]),h=c.useCallback(s=>d.find(u=>u._id===s)||null,[d]),$=c.useCallback(s=>{for(const u of d){const g=u.cards.find(f=>f._id===s);if(g)return{card:g,column:u}}return null},[d]),E=c.useCallback((s,u)=>{var g,f;try{const y=s.target,m=h(u.columnId);if(!m)throw new Error("Source column not found");(g=s.dataTransfer)==null||g.setData("text/plain",u._id),(f=s.dataTransfer)==null||f.setData("application/json",JSON.stringify(u));const k=y.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(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;
13
+ `,document.body.appendChild(k),Q.current=k,s.dataTransfer&&s.dataTransfer.setDragImage(k,s.offsetX||50,s.offsetY||20),_({isDragging:!0,draggedCard:u,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:m._id}),a==null||a(u,m.title,"being moved")}catch(y){l==null||l(y instanceof Error?y:new Error("Drag start failed")),w()}},[h,l,w,a]),W=c.useCallback((s,u)=>{if(s.preventDefault(),!i.isDragging||!i.draggedCard)return;const g=u?h(u):null;_(f=>({...f,dragOverColumn:(g==null?void 0:g._id)||null,dragOverPosition:null})),G(s)},[i.isDragging,i.draggedCard,h]),q=c.useCallback((s,u)=>{if(s.preventDefault(),!(!i.isDragging||!i.draggedCard))try{const g=i.draggedCard,f=i.dragSourceColumn,y=h(u),m=h(f);if(!y||!m)throw new Error("Target or source column not found");if(f===u){w();return}if(y.limit&&y.cards.length>=y.limit)throw new Error(`Column "${y.title}" has reached its limit of ${y.limit} cards`);o==null||o(g,f,u),a==null||a(g,m.title,y.title)}catch(g){l==null||l(g instanceof Error?g:new Error("Drop failed"))}finally{w()}},[i,h,o,l,w,a]),z=c.useCallback(()=>{Q.current&&(document.body.removeChild(Q.current),Q.current=null),w()},[w]),G=c.useCallback(s=>{const u=s.target.closest(".kanban-container");if(!u)return;const g=u.getBoundingClientRect(),f=s.clientX-g.left,y=g.width;let m=0;if(f<ut?m=-ct:f>y-ut&&(m=ct),m!==0){D.current&&clearTimeout(D.current);const k=()=>{u.scrollLeft+=m,D.current=setTimeout(k,16)};D.current=setTimeout(k,100)}else D.current&&(clearTimeout(D.current),D.current=null)},[]),C=c.useCallback((s,u)=>{if(!["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Enter","Space","Escape"].includes(s.key))return;s.preventDefault();const g=$(u._id);if(!g)return;const{column:f}=g,y=d.findIndex(m=>m._id===f._id);try{switch(s.key){case"ArrowLeft":if(y>0){const m=d[y-1];o==null||o(u,f._id,m._id),a==null||a(u,f.title,m.title)}break;case"ArrowRight":if(y<d.length-1){const m=d[y+1];o==null||o(u,f._id,m._id),a==null||a(u,f.title,m.title)}break;case"ArrowUp":a==null||a(u,"current position","position above");break;case"ArrowDown":a==null||a(u,"current position","position below");break;case"Enter":case"Space":a==null||a(u,f.title,"drag mode");break;case"Escape":a==null||a(u,"drag mode","cancelled");break}}catch(m){l==null||l(m instanceof Error?m:new Error("Keyboard navigation failed"))}},[$,d,o,l,a]),L=c.useCallback((s,u)=>{const g=s.touches[0];S.current={x:g.clientX,y:g.clientY,card:u}},[]),R=c.useCallback(s=>{if(!S.current)return;const u=s.touches[0],g=Math.abs(u.clientX-S.current.x),f=Math.abs(u.clientY-S.current.y);if(g>lt||f>lt){const y=S.current.card,m=h(y.columnId);if(!m)return;_({isDragging:!0,draggedCard:y,dragOverColumn:null,dragOverPosition:null,dragSourceColumn:m._id}),a==null||a(y,m.title,"being moved")}},[h,a]),I=c.useCallback(s=>{if(!i.isDragging||!i.draggedCard||!S.current){S.current=null;return}try{const u=s.changedTouches[0],g=document.elementFromPoint(u.clientX,u.clientY),f=g==null?void 0:g.closest("[data-column-id]");if(f){const y=f.dataset.columnId,m=i.draggedCard,k=i.dragSourceColumn,K=h(y),B=h(k);if(K&&B&&k!==y){if(K.limit&&K.cards.length>=K.limit)throw new Error(`Column "${K.title}" has reached its limit of ${K.limit} cards`);o==null||o(m,k,y),a==null||a(m,B.title,K.title)}}}catch(u){l==null||l(u instanceof Error?u:new Error("Touch drop failed"))}finally{S.current=null,w()}},[i,h,o,l,w,a]),H=c.useCallback((s,u,g)=>{const f=`Moved "${s.title}" from ${u} to ${g}`,y=document.createElement("div");y.setAttribute("aria-live","polite"),y.setAttribute("aria-atomic","true"),y.className="sr-only",y.textContent=f,document.body.appendChild(y),setTimeout(()=>{document.body.removeChild(y)},1e3),console.log(`Kanban: ${f}`)},[]);return c.useEffect(()=>()=>{D.current&&clearTimeout(D.current),Q.current&&document.body.contains(Q.current)&&document.body.removeChild(Q.current)},[]),{isDragging:i.isDragging,draggedCard:i.draggedCard,dragOverColumn:i.dragOverColumn,dragOverPosition:i.dragOverPosition,dragSourceColumn:i.dragSourceColumn,handleDragStart:E,handleDragOver:W,handleDrop:q,handleDragEnd:z,handleKeyDown:C,handleTouchStart:L,handleTouchMove:R,handleTouchEnd:I,announceMove:a||H,reset:w}}function At(o){var et,at,nt,st,it;const{columns:l,source:d,enableDragDrop:a=!0,initialState:i,onCardMove:_,onCardCreate:Q,onCardUpdate:D,onCardDelete:S,onError:w}=o,[h,$]=c.useState({query:(i==null?void 0:i.search)||"",debouncedQuery:(i==null?void 0:i.search)||""}),E=c.useRef(null),W=300,[q]=c.useState({field:((et=i==null?void 0:i.sorting)==null?void 0:et.field)||null,direction:((at=i==null?void 0:i.sorting)==null?void 0:at.direction)||null}),[z,G]=c.useState(()=>{const t={};return l.forEach(e=>{t[e.id]=10}),t}),C=c.useRef(w),L=c.useRef(_),R=c.useRef(Q),I=c.useRef(D),H=c.useRef(S);c.useEffect(()=>{C.current=w,L.current=_,R.current=Q,I.current=D,H.current=S},[w,_,Q,D,S]);const s=T.useQueryClient(),u=Tt.useFilter({conditions:(nt=i==null?void 0:i.filter)==null?void 0:nt.conditions,operator:((st=i==null?void 0:i.filter)==null?void 0:st.operator)||"And"}),g=c.useCallback(t=>{const e={LHSField:"columnId",Operator:"EQ",RHSValue:t,RHSType:"Constant"},r=u.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 q.field&&q.direction?p.Sort=[{[String(q.field)]:q.direction==="asc"?"ASC":"DESC"},{position:"ASC"}]:p.Sort=[{columnId:"ASC"},{position:"ASC"}],h.debouncedQuery&&(p.Search=h.debouncedQuery),p},[u.payload,z,q,h.debouncedQuery]),f=T.useQueries({queries:l.map(t=>{const e=g(t.id);return{queryKey:["kanban-cards",d,t.id,e],queryFn:async()=>{try{return await F.api(d).list(e)}catch(r){throw r}},placeholderData:T.keepPreviousData,staleTime:30*1e3}})}),y=f.some(t=>t.isLoading),m=f.some(t=>t.isFetching),k=((it=f.find(t=>t.error))==null?void 0:it.error)||null,K=async()=>{await Promise.all(f.map(t=>t.refetch()))},B=c.useMemo(()=>{const t={};return h.debouncedQuery&&(t.Search=h.debouncedQuery),u.payload&&(t.Filter=u.payload),t},[h.debouncedQuery,u.payload]),{data:V,isLoading:yt,error:ft}=T.useQuery({queryKey:["kanban-count",d,B],queryFn:async()=>{try{return await F.api(d).count(B)}catch(t){throw C.current&&C.current(A.toError(t)),t}},staleTime:30*1e3,gcTime:60*1e3}),rt=T.useMutation({mutationFn:async t=>{const e=t.position??999999;return(await F.api(d).create({...t,position:e}))._id},onMutate:async t=>{const e=t.columnId,r=g(e),n=["kanban-cards",d,e,r];await s.cancelQueries({queryKey:n});const p=s.getQueryData(n);if(p){const U=p.Data,O=t.position??U.length,X=`temp-${Date.now()}`,P={...t,_id:X,position:O,_created_at:new Date,_modified_at:new Date};s.setQueryData(n,{...p,Data:[...p.Data,P]})}return{previousCards:p,queryKey:n}},onSuccess:async(t,e,r)=>{var n;r!=null&&r.queryKey&&await s.invalidateQueries({queryKey:r.queryKey}),(n=R.current)==null||n.call(R,{_id:t,...e})},onError:(t,e,r)=>{var n;r!=null&&r.previousCards&&(r!=null&&r.queryKey)&&s.setQueryData(r.queryKey,r.previousCards),(n=C.current)==null||n.call(C,A.toError(t))},onSettled:(t,e,r)=>{const n=r.columnId,p=g(n);s.invalidateQueries({queryKey:["kanban-cards",d,n,p]})}}),Z=T.useMutation({mutationFn:async({id:t,updates:e})=>(await F.api(d).update(t,e),{id:t,updates:e}),onMutate:async()=>(await s.cancelQueries({queryKey:["kanban-cards",d]}),{}),onSuccess:async t=>{var e;(e=I.current)==null||e.call(I,{_id:t.id,...t.updates})},onError:(t,e,r)=>{var n;(n=C.current)==null||n.call(C,A.toError(t))},onSettled:()=>{s.invalidateQueries({queryKey:["kanban-cards",d]})}}),v=T.useMutation({mutationFn:async t=>(await F.api(d).delete(t),t),onMutate:async()=>(await s.cancelQueries({queryKey:["kanban-cards",d]}),{}),onSuccess:async t=>{var e;(e=H.current)==null||e.call(H,t)},onError:(t,e,r)=>{var n;(n=C.current)==null||n.call(C,A.toError(t))},onSettled:()=>{s.invalidateQueries({queryKey:["kanban-cards",d]})}}),N=T.useMutation({mutationFn:async({cardId:t,fromColumnId:e,toColumnId:r,position:n})=>{const p={columnId:r,...n!==void 0&&{position:n}};return await F.api(d).update(t,p),{cardId:t,fromColumnId:e,toColumnId:r,position:n}},onMutate:async({cardId:t,fromColumnId:e,toColumnId:r,position:n})=>{const p=g(e),U=g(r),O=["kanban-cards",d,e,p],X=["kanban-cards",d,r,U];await s.cancelQueries({queryKey:O}),await s.cancelQueries({queryKey:X});const P=s.getQueryData(O),j=s.getQueryData(X);if(P&&j){const ot=P.Data.find(M=>M._id===t);if(ot){const M={...P,Data:P.Data.filter(tt=>tt._id!==t)},Kt={...ot,columnId:r,position:n??j.Data.length,_modified_at:new Date},Ot={...j,Data:[...j.Data,Kt].sort((tt,Et)=>tt.position-Et.position)};s.setQueryData(O,M),s.setQueryData(X,Ot)}}return{previousFromData:P,previousToData:j,fromQueryKey:O,toQueryKey:X,fromColumnId:e,toColumnId:r}},onSuccess:async t=>{var e;(e=L.current)==null||e.call(L,{_id:t.cardId},t.fromColumnId,t.toColumnId)},onError:(t,e,r)=>{var n;r!=null&&r.previousFromData&&(r!=null&&r.fromQueryKey)&&s.setQueryData(r.fromQueryKey,r.previousFromData),r!=null&&r.previousToData&&(r!=null&&r.toQueryKey)&&s.setQueryData(r.toQueryKey,r.previousToData),(n=C.current)==null||n.call(C,A.toError(t))},onSettled:(t,e,r)=>{const n=g(r.fromColumnId),p=g(r.toColumnId);s.invalidateQueries({queryKey:["kanban-cards",d,r.fromColumnId,n]}),s.invalidateQueries({queryKey:["kanban-cards",d,r.toColumnId,p]})}}),x=T.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(d).update(n.id,{position:n.position,columnId:n.columnId})))},onMutate:async({columnId:t})=>{const e=g(t),r=["kanban-cards",d,t,e];return await s.cancelQueries({queryKey:r}),{}},onSuccess:()=>{},onError:(t,e,r)=>{var n;(n=C.current)==null||n.call(C,A.toError(t))},onSettled:(t,e,r)=>{const n=g(r.columnId);s.invalidateQueries({queryKey:["kanban-cards",d,r.columnId,n]})}}),mt=c.useCallback(async(t,e,r)=>{try{await N.mutateAsync({cardId:t._id,fromColumnId:e,toColumnId:r,position:void 0})}catch{}},[N]),J=c.useMemo(()=>l.sort((t,e)=>t.position-e.position).map((t,e)=>{var p;const n=((p=f[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((U,O)=>U.position-O.position),_created_at:new Date,_modified_at:new Date}}),[l,f]),b=dt({onCardMove:mt,onError:C.current,columns:J,announceMove:(t,e,r)=>{console.log(`Kanban: Moved "${t.title}" from ${e} to ${r}`)}}),pt=c.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]),Ct=c.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]),ht=c.useCallback(t=>{if(t.length>255){console.warn("Search query exceeds maximum length of 255 characters");return}$(e=>({...e,query:t})),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>{$(e=>({...e,debouncedQuery:t}))},W)},[]),bt=c.useCallback(()=>{E.current&&clearTimeout(E.current),$({query:"",debouncedQuery:""})},[]),Dt=(V==null?void 0:V.Count)||0,wt=y||yt,_t=m,kt=rt.isPending||Z.isPending||v.isPending||N.isPending||x.isPending,Y=k||ft,St=c.useCallback(async()=>{await K()},[K]),Qt=c.useCallback(async()=>{await s.invalidateQueries({predicate:t=>t.queryKey[0]==="kanban-cards"||t.queryKey[0]==="kanban-count"})},[s]);return c.useEffect(()=>{Y&&C.current&&C.current(A.toError(Y))},[Y]),c.useEffect(()=>()=>{E.current&&clearTimeout(E.current)},[]),{columns:J,totalCards:Dt,isLoading:wt,isFetching:_t,isUpdating:kt,error:Y?A.toError(Y):null,createCard:rt.mutateAsync,updateCard:c.useCallback(async(t,e)=>{await Z.mutateAsync({id:t,updates:e})},[Z]),deleteCard:c.useCallback(async t=>{await v.mutateAsync(t)},[v]),moveCard:c.useCallback(async(t,e,r,n)=>{if(!n){for(const p of J)if(p.cards.find(O=>O._id===t)){n=p._id;break}if(!n)throw new Error(`Card ${t} not found in any column`)}await N.mutateAsync({cardId:t,fromColumnId:n,toColumnId:e,position:r})},[N,J]),reorderCards:c.useCallback(async(t,e)=>{await x.mutateAsync({cardIds:t,columnId:e})},[x]),searchQuery:h.query,setSearchQuery:ht,clearSearch:bt,filter:u,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?pt:t=>({}),getColumnProps:a?Ct:t=>({}),loadMore:c.useCallback(t=>{G(e=>({...e,[t]:(e[t]||10)+10}))},[]),refetch:St,refresh:Qt}}const gt=c.createContext(null);function qt(){const o=c.useContext(gt);if(!o)throw new Error("Kanban components must be used within a KanbanBoard component");return o}function Pt(o,l){const d=l.reduce((a,i)=>(a[i.columnId]||(a[i.columnId]=[]),a[i.columnId].push(i),a),{});return o.map(a=>({...a,cards:(d[a._id]||[]).sort((i,_)=>i.position-_.position)}))}function Ft(o,l){if(o.cards.length===0)return 0;if(l===void 0||l>=o.cards.length)return o.cards[o.cards.length-1].position+1;if(l===0){const i=o.cards[0];return Math.max(0,i.position-1)}const d=o.cards[l-1],a=o.cards[l];return Math.floor((d.position+a.position)/2)}function $t(o,l){if(o.length===0)return 0;if(l===void 0||l>=o.length)return o[o.length-1].position+1;if(l===0){const i=o[0];return Math.max(0,i.position-1)}const d=o[l-1],a=o[l];return Math.floor((d.position+a.position)/2)}function Lt(o){return o.sort((l,d)=>l.position-d.position).map((l,d)=>({...l,position:d}))}function Rt(o,l,d,a){const i=`Failed to ${l} ${d}`,_=a?` (ID: ${a})`:"";return o instanceof Error?new Error(`${i}${_}: ${o.message}`):new Error(`${i}${_}: Unknown error`)}function It(o,l){switch(l){case"list":return o&&Array.isArray(o.Data);case"single":return o&&typeof o=="object";case"create":return o&&typeof o._id=="string";case"delete":return o&&o.status==="success";default:return!1}}exports.KanbanContext=gt;exports.calculateCardPosition=Ft;exports.calculateColumnPosition=$t;exports.handleKanbanApiError=Rt;exports.mergeCardsIntoColumns=Pt;exports.normalizePositions=Lt;exports.useDragDropManager=dt;exports.useKanban=At;exports.useKanbanContext=qt;exports.validateApiResponse=It;