@btst/stack 1.10.0 → 1.12.0

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 (237) hide show
  1. package/dist/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@dnd-kit/core/dist/core.esm.cjs +1 -1
  2. package/dist/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@dnd-kit/core/dist/core.esm.mjs +1 -1
  3. package/dist/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs +77 -0
  4. package/dist/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/sortable/dist/sortable.esm.mjs +79 -3
  5. package/dist/node_modules/.pnpm/@radix-ui_react-avatar@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react_850cfbef1935a6e49a6ad6c93c7ca70d/node_modules/@radix-ui/react-avatar/dist/index.cjs +140 -0
  6. package/dist/node_modules/.pnpm/@radix-ui_react-avatar@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react_850cfbef1935a6e49a6ad6c93c7ca70d/node_modules/@radix-ui/react-avatar/dist/index.mjs +119 -0
  7. package/dist/node_modules/.pnpm/@radix-ui_react-context@1.1.3_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.cjs +80 -0
  8. package/dist/node_modules/.pnpm/@radix-ui_react-context@1.1.3_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.mjs +64 -0
  9. package/dist/node_modules/.pnpm/@radix-ui_react-use-is-hydrated@0.1.0_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-use-is-hydrated/dist/index.cjs +18 -0
  10. package/dist/node_modules/.pnpm/@radix-ui_react-use-is-hydrated@0.1.0_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-use-is-hydrated/dist/index.mjs +16 -0
  11. package/dist/packages/better-stack/src/plugins/kanban/api/plugin.cjs +846 -0
  12. package/dist/packages/better-stack/src/plugins/kanban/api/plugin.mjs +844 -0
  13. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/board-form.cjs +85 -0
  14. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/board-form.mjs +83 -0
  15. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/column-form.cjs +72 -0
  16. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/column-form.mjs +70 -0
  17. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/task-form.cjs +200 -0
  18. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/task-form.mjs +198 -0
  19. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/board-skeleton.cjs +47 -0
  20. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/board-skeleton.mjs +45 -0
  21. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/boards-list-skeleton.cjs +30 -0
  22. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/boards-list-skeleton.mjs +28 -0
  23. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/404-page.cjs +27 -0
  24. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/404-page.mjs +25 -0
  25. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.cjs +31 -0
  26. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.internal.cjs +458 -0
  27. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.internal.mjs +456 -0
  28. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.mjs +29 -0
  29. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.cjs +30 -0
  30. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.internal.cjs +72 -0
  31. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.internal.mjs +70 -0
  32. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.mjs +28 -0
  33. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.cjs +30 -0
  34. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.internal.cjs +51 -0
  35. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.internal.mjs +49 -0
  36. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.mjs +28 -0
  37. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/column-content.cjs +76 -0
  38. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/column-content.mjs +74 -0
  39. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/default-error.cjs +27 -0
  40. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/default-error.mjs +25 -0
  41. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/empty-state.cjs +32 -0
  42. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/empty-state.mjs +30 -0
  43. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/kanban-board.cjs +78 -0
  44. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/kanban-board.mjs +76 -0
  45. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/page-wrapper.cjs +15 -0
  46. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/page-wrapper.mjs +13 -0
  47. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/task-card.cjs +68 -0
  48. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/task-card.mjs +66 -0
  49. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/user-avatar.cjs +32 -0
  50. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/user-avatar.mjs +30 -0
  51. package/dist/packages/better-stack/src/plugins/kanban/client/hooks/kanban-hooks.cjs +391 -0
  52. package/dist/packages/better-stack/src/plugins/kanban/client/hooks/kanban-hooks.mjs +381 -0
  53. package/dist/packages/better-stack/src/plugins/kanban/client/plugin.cjs +290 -0
  54. package/dist/packages/better-stack/src/plugins/kanban/client/plugin.mjs +288 -0
  55. package/dist/packages/better-stack/src/plugins/kanban/db.cjs +125 -0
  56. package/dist/packages/better-stack/src/plugins/kanban/db.mjs +123 -0
  57. package/dist/packages/better-stack/src/plugins/kanban/schemas.cjs +117 -0
  58. package/dist/packages/better-stack/src/plugins/kanban/schemas.mjs +102 -0
  59. package/dist/packages/better-stack/src/plugins/kanban/utils.cjs +49 -0
  60. package/dist/packages/better-stack/src/plugins/kanban/utils.mjs +45 -0
  61. package/dist/packages/ui/src/components/avatar.cjs +58 -0
  62. package/dist/packages/ui/src/components/avatar.mjs +54 -0
  63. package/dist/packages/ui/src/components/command.cjs +3 -3
  64. package/dist/packages/ui/src/components/command.mjs +3 -3
  65. package/dist/packages/ui/src/components/form-builder/index.mjs +2 -2
  66. package/dist/packages/ui/src/components/kanban.cjs +835 -0
  67. package/dist/packages/ui/src/components/kanban.mjs +805 -0
  68. package/dist/packages/ui/src/components/minimal-tiptap/utils.cjs +15 -11
  69. package/dist/packages/ui/src/components/minimal-tiptap/utils.mjs +15 -11
  70. package/dist/packages/ui/src/components/popover.cjs +8 -3
  71. package/dist/packages/ui/src/components/popover.mjs +9 -4
  72. package/dist/packages/ui/src/components/search-select.cjs +75 -0
  73. package/dist/packages/ui/src/components/search-select.mjs +73 -0
  74. package/dist/packages/ui/src/components/ui-builder/index.cjs +9 -7
  75. package/dist/packages/ui/src/components/ui-builder/index.mjs +9 -7
  76. package/dist/packages/ui/src/components/ui-builder/internal/canvas/auto-frame.cjs +6 -3
  77. package/dist/packages/ui/src/components/ui-builder/internal/canvas/auto-frame.mjs +6 -3
  78. package/dist/packages/ui/src/components/ui-builder/internal/components/add-component-popover.cjs +228 -48
  79. package/dist/packages/ui/src/components/ui-builder/internal/components/add-component-popover.mjs +228 -48
  80. package/dist/packages/ui/src/components/ui-builder/internal/components/element-selector.cjs +1 -1
  81. package/dist/packages/ui/src/components/ui-builder/internal/components/element-selector.mjs +1 -1
  82. package/dist/packages/ui/src/components/ui-builder/internal/components/error-fallback.cjs +4 -2
  83. package/dist/packages/ui/src/components/ui-builder/internal/components/error-fallback.mjs +4 -2
  84. package/dist/packages/ui/src/components/ui-builder/internal/components/multi-select.cjs +6 -3
  85. package/dist/packages/ui/src/components/ui-builder/internal/components/multi-select.mjs +6 -3
  86. package/dist/packages/ui/src/components/ui-builder/internal/dnd/draggable-new-component.cjs +67 -0
  87. package/dist/packages/ui/src/components/ui-builder/internal/dnd/draggable-new-component.mjs +62 -0
  88. package/dist/packages/ui/src/components/ui-builder/internal/dnd/drop-zone.cjs +181 -37
  89. package/dist/packages/ui/src/components/ui-builder/internal/dnd/drop-zone.mjs +181 -38
  90. package/dist/packages/ui/src/components/ui-builder/internal/editor-panel.cjs +1 -1
  91. package/dist/packages/ui/src/components/ui-builder/internal/editor-panel.mjs +1 -1
  92. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-group-control.cjs +1 -1
  93. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-group-control.mjs +1 -1
  94. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-item-control.cjs +9 -2
  95. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-item-control.mjs +9 -2
  96. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/iconname-field.cjs +3 -2
  97. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/iconname-field.mjs +3 -2
  98. package/dist/packages/ui/src/components/ui-builder/internal/layers-panel.cjs +1 -1
  99. package/dist/packages/ui/src/components/ui-builder/internal/layers-panel.mjs +1 -1
  100. package/dist/packages/ui/src/components/ui-builder/internal/props-panel.cjs +17 -5
  101. package/dist/packages/ui/src/components/ui-builder/internal/props-panel.mjs +17 -5
  102. package/dist/packages/ui/src/components/ui-builder/internal/utils/render-utils.cjs +70 -16
  103. package/dist/packages/ui/src/components/ui-builder/internal/utils/render-utils.mjs +73 -20
  104. package/dist/packages/ui/src/lib/compose-refs.cjs +56 -0
  105. package/dist/packages/ui/src/lib/compose-refs.mjs +39 -0
  106. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context-colission-utils.cjs +14 -9
  107. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context-colission-utils.mjs +14 -9
  108. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context.cjs +38 -10
  109. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context.mjs +35 -11
  110. package/dist/packages/ui/src/lib/ui-builder/context/dnd-contexts.cjs +1 -0
  111. package/dist/packages/ui/src/lib/ui-builder/context/dnd-contexts.mjs +1 -0
  112. package/dist/packages/ui/src/lib/ui-builder/context/drag-overlay.cjs +7 -4
  113. package/dist/packages/ui/src/lib/ui-builder/context/drag-overlay.mjs +7 -4
  114. package/dist/packages/ui/src/lib/ui-builder/hooks/use-auto-scroll.cjs +4 -4
  115. package/dist/packages/ui/src/lib/ui-builder/hooks/use-auto-scroll.mjs +4 -4
  116. package/dist/packages/ui/src/lib/ui-builder/hooks/use-dnd-event-handlers.cjs +53 -16
  117. package/dist/packages/ui/src/lib/ui-builder/hooks/use-dnd-event-handlers.mjs +53 -16
  118. package/dist/packages/ui/src/lib/ui-builder/hooks/use-drop-validation.cjs +23 -7
  119. package/dist/packages/ui/src/lib/ui-builder/hooks/use-drop-validation.mjs +23 -7
  120. package/dist/packages/ui/src/lib/ui-builder/registry/form-field-overrides.cjs +110 -11
  121. package/dist/packages/ui/src/lib/ui-builder/registry/form-field-overrides.mjs +111 -13
  122. package/dist/packages/ui/src/lib/ui-builder/store/editor-store.cjs +3 -2
  123. package/dist/packages/ui/src/lib/ui-builder/store/editor-store.mjs +3 -2
  124. package/dist/packages/ui/src/lib/ui-builder/store/layer-store.cjs +53 -7
  125. package/dist/packages/ui/src/lib/ui-builder/store/layer-store.mjs +54 -8
  126. package/dist/packages/ui/src/lib/ui-builder/store/layer-utils.cjs +4 -3
  127. package/dist/packages/ui/src/lib/ui-builder/store/layer-utils.mjs +4 -3
  128. package/dist/packages/ui/src/lib/ui-builder/utils/variable-resolver.cjs +12 -0
  129. package/dist/packages/ui/src/lib/ui-builder/utils/variable-resolver.mjs +12 -1
  130. package/dist/plugins/blog/api/index.d.cts +1 -1
  131. package/dist/plugins/blog/api/index.d.mts +1 -1
  132. package/dist/plugins/blog/api/index.d.ts +1 -1
  133. package/dist/plugins/blog/client/hooks/index.d.cts +2 -2
  134. package/dist/plugins/blog/client/hooks/index.d.mts +2 -2
  135. package/dist/plugins/blog/client/hooks/index.d.ts +2 -2
  136. package/dist/plugins/blog/client/index.d.cts +1 -1
  137. package/dist/plugins/blog/client/index.d.mts +1 -1
  138. package/dist/plugins/blog/client/index.d.ts +1 -1
  139. package/dist/plugins/blog/query-keys.d.cts +2 -2
  140. package/dist/plugins/blog/query-keys.d.mts +2 -2
  141. package/dist/plugins/blog/query-keys.d.ts +2 -2
  142. package/dist/plugins/kanban/api/index.cjs +7 -0
  143. package/dist/plugins/kanban/api/index.d.cts +403 -0
  144. package/dist/plugins/kanban/api/index.d.mts +403 -0
  145. package/dist/plugins/kanban/api/index.d.ts +403 -0
  146. package/dist/plugins/kanban/api/index.mjs +1 -0
  147. package/dist/plugins/kanban/client/components/index.cjs +35 -0
  148. package/dist/plugins/kanban/client/components/index.d.cts +102 -0
  149. package/dist/plugins/kanban/client/components/index.d.mts +102 -0
  150. package/dist/plugins/kanban/client/components/index.d.ts +102 -0
  151. package/dist/plugins/kanban/client/components/index.mjs +15 -0
  152. package/dist/plugins/kanban/client/hooks/index.cjs +15 -0
  153. package/dist/plugins/kanban/client/hooks/index.d.cts +143 -0
  154. package/dist/plugins/kanban/client/hooks/index.d.mts +143 -0
  155. package/dist/plugins/kanban/client/hooks/index.d.ts +143 -0
  156. package/dist/plugins/kanban/client/hooks/index.mjs +1 -0
  157. package/dist/plugins/kanban/client/index.cjs +7 -0
  158. package/dist/plugins/kanban/client/index.d.cts +196 -0
  159. package/dist/plugins/kanban/client/index.d.mts +196 -0
  160. package/dist/plugins/kanban/client/index.d.ts +196 -0
  161. package/dist/plugins/kanban/client/index.mjs +1 -0
  162. package/dist/plugins/kanban/client.css +68 -0
  163. package/dist/plugins/kanban/query-keys.cjs +105 -0
  164. package/dist/plugins/kanban/query-keys.d.cts +59 -0
  165. package/dist/plugins/kanban/query-keys.d.mts +59 -0
  166. package/dist/plugins/kanban/query-keys.d.ts +59 -0
  167. package/dist/plugins/kanban/query-keys.mjs +103 -0
  168. package/dist/plugins/kanban/style.css +7 -0
  169. package/dist/plugins/ui-builder/client/components/index.d.cts +1 -1
  170. package/dist/plugins/ui-builder/client/components/index.d.mts +1 -1
  171. package/dist/plugins/ui-builder/client/components/index.d.ts +1 -1
  172. package/dist/plugins/ui-builder/client/hooks/index.d.cts +2 -2
  173. package/dist/plugins/ui-builder/client/hooks/index.d.mts +2 -2
  174. package/dist/plugins/ui-builder/client/hooks/index.d.ts +2 -2
  175. package/dist/plugins/ui-builder/client/index.d.cts +17 -7
  176. package/dist/plugins/ui-builder/client/index.d.mts +17 -7
  177. package/dist/plugins/ui-builder/client/index.d.ts +17 -7
  178. package/dist/plugins/ui-builder/index.d.cts +2 -2
  179. package/dist/plugins/ui-builder/index.d.mts +2 -2
  180. package/dist/plugins/ui-builder/index.d.ts +2 -2
  181. package/dist/plugins/ui-builder/style.css +6 -0
  182. package/dist/shared/{stack.BSM2cgoq.d.cts → stack.BYysGdHl.d.cts} +1 -1
  183. package/dist/shared/{stack.CqfZWfjJ.d.cts → stack.BdJFrdyt.d.cts} +8 -2
  184. package/dist/shared/{stack.e1FN86dE.d.mts → stack.ChVuHi5e.d.mts} +8 -2
  185. package/dist/shared/stack.DKDMI-QO.d.cts +70 -0
  186. package/dist/shared/stack.DKDMI-QO.d.mts +70 -0
  187. package/dist/shared/stack.DKDMI-QO.d.ts +70 -0
  188. package/dist/shared/{stack.CLtOoAqF.d.mts → stack.DYCFcnkL.d.mts} +1 -1
  189. package/dist/shared/{stack.MMntCVZZ.d.ts → stack.EhM4pmtN.d.ts} +8 -2
  190. package/dist/shared/stack.FeaWkglm.d.cts +190 -0
  191. package/dist/shared/stack.FeaWkglm.d.mts +190 -0
  192. package/dist/shared/stack.FeaWkglm.d.ts +190 -0
  193. package/dist/shared/{stack.BD1m-4yB.d.ts → stack.kFbDspnF.d.ts} +1 -1
  194. package/package.json +56 -2
  195. package/src/plugins/kanban/api/index.ts +6 -0
  196. package/src/plugins/kanban/api/plugin.ts +1245 -0
  197. package/src/plugins/kanban/client/components/forms/board-form.tsx +108 -0
  198. package/src/plugins/kanban/client/components/forms/column-form.tsx +97 -0
  199. package/src/plugins/kanban/client/components/forms/task-form.tsx +274 -0
  200. package/src/plugins/kanban/client/components/index.tsx +21 -0
  201. package/src/plugins/kanban/client/components/loading/board-skeleton.tsx +49 -0
  202. package/src/plugins/kanban/client/components/loading/boards-list-skeleton.tsx +34 -0
  203. package/src/plugins/kanban/client/components/loading/index.tsx +2 -0
  204. package/src/plugins/kanban/client/components/pages/404-page.tsx +28 -0
  205. package/src/plugins/kanban/client/components/pages/board-page.internal.tsx +575 -0
  206. package/src/plugins/kanban/client/components/pages/board-page.tsx +31 -0
  207. package/src/plugins/kanban/client/components/pages/boards-list-page.internal.tsx +101 -0
  208. package/src/plugins/kanban/client/components/pages/boards-list-page.tsx +26 -0
  209. package/src/plugins/kanban/client/components/pages/new-board-page.internal.tsx +65 -0
  210. package/src/plugins/kanban/client/components/pages/new-board-page.tsx +26 -0
  211. package/src/plugins/kanban/client/components/shared/column-content.tsx +108 -0
  212. package/src/plugins/kanban/client/components/shared/default-error.tsx +32 -0
  213. package/src/plugins/kanban/client/components/shared/empty-state.tsx +37 -0
  214. package/src/plugins/kanban/client/components/shared/kanban-board.tsx +87 -0
  215. package/src/plugins/kanban/client/components/shared/page-wrapper.tsx +20 -0
  216. package/src/plugins/kanban/client/components/shared/task-card.tsx +79 -0
  217. package/src/plugins/kanban/client/components/shared/user-avatar.tsx +63 -0
  218. package/src/plugins/kanban/client/hooks/index.tsx +11 -0
  219. package/src/plugins/kanban/client/hooks/kanban-hooks.tsx +560 -0
  220. package/src/plugins/kanban/client/index.ts +8 -0
  221. package/src/plugins/kanban/client/localization/index.ts +28 -0
  222. package/src/plugins/kanban/client/localization/kanban-common.ts +69 -0
  223. package/src/plugins/kanban/client/localization/kanban-forms.ts +70 -0
  224. package/src/plugins/kanban/client/localization/kanban-list.ts +36 -0
  225. package/src/plugins/kanban/client/overrides.ts +145 -0
  226. package/src/plugins/kanban/client/plugin.tsx +463 -0
  227. package/src/plugins/kanban/client.css +68 -0
  228. package/src/plugins/kanban/db.ts +125 -0
  229. package/src/plugins/kanban/query-keys.ts +154 -0
  230. package/src/plugins/kanban/schemas.ts +143 -0
  231. package/src/plugins/kanban/style.css +7 -0
  232. package/src/plugins/kanban/types.ts +106 -0
  233. package/src/plugins/kanban/utils.ts +107 -0
  234. package/src/plugins/ui-builder/style.css +6 -0
  235. package/dist/shared/{stack.DLhzx1-D.d.mts → stack.CcI4sYJP.d.cts} +1 -1
  236. package/dist/shared/{stack.DLhzx1-D.d.ts → stack.CcI4sYJP.d.mts} +1 -1
  237. package/dist/shared/{stack.DLhzx1-D.d.cts → stack.CcI4sYJP.d.ts} +1 -1
@@ -0,0 +1,458 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ const jsxRuntime = require('react/jsx-runtime');
5
+ const React = require('react');
6
+ const LucideIcons = require('lucide-react');
7
+ const sonner = require('sonner');
8
+ const button = require('../../../../../../../ui/src/components/button.cjs');
9
+ const dropdownMenu = require('../../../../../../../ui/src/components/dropdown-menu.cjs');
10
+ const dialog = require('../../../../../../../ui/src/components/dialog.cjs');
11
+ const alertDialog = require('../../../../../../../ui/src/components/alert-dialog.cjs');
12
+ const kanbanHooks = require('../../hooks/kanban-hooks.cjs');
13
+ const context = require('@btst/stack/context');
14
+ const kanbanBoard = require('../shared/kanban-board.cjs');
15
+ const columnForm = require('../forms/column-form.cjs');
16
+ const boardForm = require('../forms/board-form.cjs');
17
+ const taskForm = require('../forms/task-form.cjs');
18
+ const pageWrapper = require('../shared/page-wrapper.cjs');
19
+ const emptyState = require('../shared/empty-state.cjs');
20
+
21
+ function BoardPage({ boardId }) {
22
+ const { data: board, error, refetch, isFetching } = kanbanHooks.useSuspenseBoard(boardId);
23
+ if (error && !isFetching) {
24
+ throw error;
25
+ }
26
+ const { Link: OverrideLink, navigate: overrideNavigate } = context.usePluginOverrides("kanban");
27
+ const navigate = overrideNavigate || ((path) => {
28
+ window.location.href = path;
29
+ });
30
+ const Link = OverrideLink || "a";
31
+ const { deleteBoard, isDeleting } = kanbanHooks.useBoardMutations();
32
+ const { deleteColumn, reorderColumns } = kanbanHooks.useColumnMutations();
33
+ const { deleteTask, moveTask, reorderTasks } = kanbanHooks.useTaskMutations();
34
+ const [modalState, setModalState] = React.useState({ type: "none" });
35
+ const computeKanbanData = React.useCallback(
36
+ (columns) => {
37
+ if (!columns) return {};
38
+ return columns.reduce(
39
+ (acc, column) => {
40
+ acc[column.id] = column.tasks || [];
41
+ return acc;
42
+ },
43
+ {}
44
+ );
45
+ },
46
+ []
47
+ );
48
+ const [kanbanState, setKanbanState] = React.useState(() => computeKanbanData(board?.columns));
49
+ const serverKanbanData = React.useMemo(
50
+ () => computeKanbanData(board?.columns),
51
+ [board?.columns, computeKanbanData]
52
+ );
53
+ React.useEffect(() => {
54
+ setKanbanState(serverKanbanData);
55
+ }, [serverKanbanData]);
56
+ const closeModal = React.useCallback(() => {
57
+ setModalState({ type: "none" });
58
+ }, []);
59
+ const handleDeleteBoard = React.useCallback(async () => {
60
+ try {
61
+ await deleteBoard(boardId);
62
+ closeModal();
63
+ navigate("/pages/kanban");
64
+ if (typeof window !== "undefined") {
65
+ setTimeout(() => {
66
+ if (window.location.pathname.includes(boardId)) {
67
+ window.location.href = "/pages/kanban";
68
+ }
69
+ }, 100);
70
+ }
71
+ } catch (error2) {
72
+ const message = error2 instanceof Error ? error2.message : "Failed to delete board";
73
+ sonner.toast.error(message);
74
+ }
75
+ }, [deleteBoard, boardId, navigate, closeModal]);
76
+ const handleKanbanChange = React.useCallback(
77
+ async (newData) => {
78
+ if (!board) return;
79
+ let previousState = {};
80
+ setKanbanState((current) => {
81
+ previousState = current;
82
+ return newData;
83
+ });
84
+ try {
85
+ const oldKeys = Object.keys(previousState);
86
+ const newKeys = Object.keys(newData);
87
+ const isColumnMove = oldKeys.length === newKeys.length && oldKeys.join("") !== newKeys.join("");
88
+ if (isColumnMove) {
89
+ await reorderColumns(board.id, newKeys);
90
+ } else {
91
+ const crossColumnMoves = [];
92
+ const columnsToReorder = /* @__PURE__ */ new Map();
93
+ const targetColumnsOfCrossMove = /* @__PURE__ */ new Set();
94
+ for (const [columnId, tasks] of Object.entries(newData)) {
95
+ const oldTasks = previousState[columnId] || [];
96
+ let hasOrderChanges = false;
97
+ for (let i = 0; i < tasks.length; i++) {
98
+ const task = tasks[i];
99
+ if (!task) continue;
100
+ if (task.columnId !== columnId) {
101
+ crossColumnMoves.push({
102
+ taskId: task.id,
103
+ targetColumnId: columnId,
104
+ targetOrder: i
105
+ });
106
+ targetColumnsOfCrossMove.add(columnId);
107
+ } else if (task.order !== i) {
108
+ hasOrderChanges = true;
109
+ }
110
+ }
111
+ const newTaskIds = new Set(tasks.map((t) => t.id));
112
+ const tasksRemoved = oldTasks.some((t) => !newTaskIds.has(t.id));
113
+ if (hasOrderChanges && !targetColumnsOfCrossMove.has(columnId) && !tasksRemoved) {
114
+ columnsToReorder.set(
115
+ columnId,
116
+ tasks.map((t) => t.id)
117
+ );
118
+ }
119
+ }
120
+ for (const move of crossColumnMoves) {
121
+ await moveTask(move.taskId, move.targetColumnId, move.targetOrder);
122
+ }
123
+ for (const [columnId, taskIds] of columnsToReorder) {
124
+ await reorderTasks(columnId, taskIds);
125
+ }
126
+ for (const targetColumnId of targetColumnsOfCrossMove) {
127
+ const tasks = newData[targetColumnId];
128
+ if (tasks) {
129
+ await reorderTasks(
130
+ targetColumnId,
131
+ tasks.map((t) => t.id)
132
+ );
133
+ }
134
+ }
135
+ }
136
+ refetch();
137
+ } catch (error2) {
138
+ refetch();
139
+ throw error2;
140
+ }
141
+ },
142
+ [board, reorderColumns, moveTask, reorderTasks, refetch]
143
+ );
144
+ const orderedColumns = React.useMemo(() => {
145
+ if (!board?.columns) return [];
146
+ const columnMap = new Map(board.columns.map((c) => [c.id, c]));
147
+ return Object.keys(kanbanState).map((columnId) => {
148
+ const column = columnMap.get(columnId);
149
+ if (!column) return null;
150
+ return {
151
+ ...column,
152
+ tasks: kanbanState[columnId] || []
153
+ };
154
+ }).filter(
155
+ (c) => c !== null
156
+ );
157
+ }, [board?.columns, kanbanState]);
158
+ if (!board) {
159
+ return /* @__PURE__ */ jsxRuntime.jsx(
160
+ emptyState.EmptyState,
161
+ {
162
+ title: "Board not found",
163
+ description: "The board you're looking for doesn't exist or you don't have access to it.",
164
+ action: /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { onClick: () => navigate("/pages/kanban"), children: [
165
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.ArrowLeft, { className: "mr-2 h-4 w-4" }),
166
+ "Back to Boards"
167
+ ] })
168
+ }
169
+ );
170
+ }
171
+ return /* @__PURE__ */ jsxRuntime.jsxs(
172
+ pageWrapper.PageWrapper,
173
+ {
174
+ "data-testid": "board-page",
175
+ className: "flex flex-col items-center",
176
+ children: [
177
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full flex items-center justify-between mb-8", children: [
178
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
179
+ /* @__PURE__ */ jsxRuntime.jsx(
180
+ Link,
181
+ {
182
+ href: "/pages/kanban",
183
+ className: "text-muted-foreground hover:text-foreground",
184
+ children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.ArrowLeft, { className: "h-5 w-5" })
185
+ }
186
+ ),
187
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
188
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold", "data-testid": "page-header", children: board.name }),
189
+ board.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mt-1", children: board.description })
190
+ ] })
191
+ ] }),
192
+ /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
193
+ /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { variant: "outline", children: [
194
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Settings, { className: "mr-2 h-4 w-4" }),
195
+ "Actions"
196
+ ] }) }),
197
+ /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuContent, { align: "end", children: [
198
+ /* @__PURE__ */ jsxRuntime.jsxs(
199
+ dropdownMenu.DropdownMenuItem,
200
+ {
201
+ onClick: () => setModalState({ type: "addColumn" }),
202
+ children: [
203
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Plus, { className: "mr-2 h-4 w-4" }),
204
+ "Add Column"
205
+ ]
206
+ }
207
+ ),
208
+ /* @__PURE__ */ jsxRuntime.jsxs(
209
+ dropdownMenu.DropdownMenuItem,
210
+ {
211
+ onClick: () => setModalState({ type: "editBoard" }),
212
+ children: [
213
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Pencil, { className: "mr-2 h-4 w-4" }),
214
+ "Edit Board"
215
+ ]
216
+ }
217
+ ),
218
+ /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, {}),
219
+ /* @__PURE__ */ jsxRuntime.jsxs(
220
+ dropdownMenu.DropdownMenuItem,
221
+ {
222
+ onClick: () => setModalState({ type: "deleteBoard" }),
223
+ className: "text-red-600 focus:text-red-600",
224
+ children: [
225
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Trash2, { className: "mr-2 h-4 w-4" }),
226
+ "Delete Board"
227
+ ]
228
+ }
229
+ )
230
+ ] })
231
+ ] })
232
+ ] }),
233
+ orderedColumns.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
234
+ kanbanBoard.KanbanBoard,
235
+ {
236
+ columns: orderedColumns,
237
+ kanbanState,
238
+ onKanbanChange: handleKanbanChange,
239
+ onAddTask: (columnId) => setModalState({ type: "addTask", columnId }),
240
+ onEditTask: (columnId, taskId) => setModalState({ type: "editTask", columnId, taskId }),
241
+ onEditColumn: (columnId) => setModalState({ type: "editColumn", columnId }),
242
+ onDeleteColumn: (columnId) => setModalState({ type: "deleteColumn", columnId })
243
+ }
244
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
245
+ emptyState.EmptyState,
246
+ {
247
+ title: "No columns yet",
248
+ description: "Create your first column to start organizing tasks.",
249
+ action: /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { onClick: () => setModalState({ type: "addColumn" }), children: [
250
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Plus, { className: "mr-2 h-4 w-4" }),
251
+ "Add Column"
252
+ ] })
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsxRuntime.jsx(
256
+ dialog.Dialog,
257
+ {
258
+ open: modalState.type === "addColumn",
259
+ onOpenChange: (open) => !open && closeModal(),
260
+ children: /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogContent, { children: [
261
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogHeader, { children: [
262
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogTitle, { children: "Add Column" }),
263
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogDescription, { children: "Add a new column to this board." })
264
+ ] }),
265
+ /* @__PURE__ */ jsxRuntime.jsx(
266
+ columnForm.ColumnForm,
267
+ {
268
+ boardId,
269
+ onClose: closeModal,
270
+ onSuccess: () => {
271
+ closeModal();
272
+ refetch();
273
+ }
274
+ }
275
+ )
276
+ ] })
277
+ }
278
+ ),
279
+ /* @__PURE__ */ jsxRuntime.jsx(
280
+ dialog.Dialog,
281
+ {
282
+ open: modalState.type === "editColumn",
283
+ onOpenChange: (open) => !open && closeModal(),
284
+ children: /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogContent, { children: [
285
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogHeader, { children: [
286
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogTitle, { children: "Edit Column" }),
287
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogDescription, { children: "Update the column details." })
288
+ ] }),
289
+ modalState.type === "editColumn" && /* @__PURE__ */ jsxRuntime.jsx(
290
+ columnForm.ColumnForm,
291
+ {
292
+ boardId,
293
+ columnId: modalState.columnId,
294
+ column: board.columns?.find((c) => c.id === modalState.columnId),
295
+ onClose: closeModal,
296
+ onSuccess: () => {
297
+ closeModal();
298
+ refetch();
299
+ }
300
+ }
301
+ )
302
+ ] })
303
+ }
304
+ ),
305
+ /* @__PURE__ */ jsxRuntime.jsx(
306
+ alertDialog.AlertDialog,
307
+ {
308
+ open: modalState.type === "deleteColumn",
309
+ onOpenChange: (open) => !open && closeModal(),
310
+ children: /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogContent, { children: [
311
+ /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogHeader, { children: [
312
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogTitle, { children: "Delete Column" }),
313
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogDescription, { children: "Are you sure you want to delete this column? All tasks in this column will be permanently removed." })
314
+ ] }),
315
+ /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogFooter, { children: [
316
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogCancel, { children: "Cancel" }),
317
+ /* @__PURE__ */ jsxRuntime.jsx(
318
+ alertDialog.AlertDialogAction,
319
+ {
320
+ onClick: async () => {
321
+ if (modalState.type === "deleteColumn") {
322
+ try {
323
+ await deleteColumn(modalState.columnId);
324
+ closeModal();
325
+ refetch();
326
+ } catch (error2) {
327
+ const message = error2 instanceof Error ? error2.message : "Failed to delete column";
328
+ sonner.toast.error(message);
329
+ }
330
+ }
331
+ },
332
+ className: "bg-red-600 hover:bg-red-700",
333
+ children: "Delete"
334
+ }
335
+ )
336
+ ] })
337
+ ] })
338
+ }
339
+ ),
340
+ /* @__PURE__ */ jsxRuntime.jsx(
341
+ dialog.Dialog,
342
+ {
343
+ open: modalState.type === "editBoard",
344
+ onOpenChange: (open) => !open && closeModal(),
345
+ children: /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogContent, { children: [
346
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogHeader, { children: [
347
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogTitle, { children: "Edit Board" }),
348
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogDescription, { children: "Update board details." })
349
+ ] }),
350
+ /* @__PURE__ */ jsxRuntime.jsx(
351
+ boardForm.BoardForm,
352
+ {
353
+ board,
354
+ onClose: closeModal,
355
+ onSuccess: () => {
356
+ closeModal();
357
+ refetch();
358
+ }
359
+ }
360
+ )
361
+ ] })
362
+ }
363
+ ),
364
+ /* @__PURE__ */ jsxRuntime.jsx(
365
+ alertDialog.AlertDialog,
366
+ {
367
+ open: modalState.type === "deleteBoard",
368
+ onOpenChange: (open) => !open && closeModal(),
369
+ children: /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogContent, { children: [
370
+ /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogHeader, { children: [
371
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogTitle, { children: "Delete Board" }),
372
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogDescription, { children: "Are you sure you want to delete this board? This action cannot be undone. All columns and tasks will be permanently removed." })
373
+ ] }),
374
+ /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogFooter, { children: [
375
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogCancel, { children: "Cancel" }),
376
+ /* @__PURE__ */ jsxRuntime.jsx(
377
+ button.Button,
378
+ {
379
+ onClick: handleDeleteBoard,
380
+ disabled: isDeleting,
381
+ className: "bg-red-600 hover:bg-red-700",
382
+ children: isDeleting ? "Deleting..." : "Delete"
383
+ }
384
+ )
385
+ ] })
386
+ ] })
387
+ }
388
+ ),
389
+ /* @__PURE__ */ jsxRuntime.jsx(
390
+ dialog.Dialog,
391
+ {
392
+ open: modalState.type === "addTask",
393
+ onOpenChange: (open) => !open && closeModal(),
394
+ children: /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogContent, { className: "max-w-3xl! max-h-screen overflow-y-auto", children: [
395
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogHeader, { children: [
396
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogTitle, { children: "Add Task" }),
397
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogDescription, { children: "Create a new task." })
398
+ ] }),
399
+ modalState.type === "addTask" && /* @__PURE__ */ jsxRuntime.jsx(
400
+ taskForm.TaskForm,
401
+ {
402
+ columnId: modalState.columnId,
403
+ boardId,
404
+ columns: board.columns || [],
405
+ onClose: closeModal,
406
+ onSuccess: () => {
407
+ closeModal();
408
+ refetch();
409
+ }
410
+ }
411
+ )
412
+ ] })
413
+ }
414
+ ),
415
+ /* @__PURE__ */ jsxRuntime.jsx(
416
+ dialog.Dialog,
417
+ {
418
+ open: modalState.type === "editTask",
419
+ onOpenChange: (open) => !open && closeModal(),
420
+ children: /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogContent, { className: "max-w-3xl! max-h-screen overflow-y-auto", children: [
421
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogHeader, { children: [
422
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogTitle, { children: "Edit Task" }),
423
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogDescription, { children: "Update task details." })
424
+ ] }),
425
+ modalState.type === "editTask" && /* @__PURE__ */ jsxRuntime.jsx(
426
+ taskForm.TaskForm,
427
+ {
428
+ columnId: modalState.columnId,
429
+ boardId,
430
+ taskId: modalState.taskId,
431
+ task: board.columns?.find((c) => c.id === modalState.columnId)?.tasks?.find((t) => t.id === modalState.taskId),
432
+ columns: board.columns || [],
433
+ onClose: closeModal,
434
+ onSuccess: () => {
435
+ closeModal();
436
+ refetch();
437
+ },
438
+ onDelete: async () => {
439
+ try {
440
+ await deleteTask(modalState.taskId);
441
+ closeModal();
442
+ refetch();
443
+ } catch (error2) {
444
+ const message = error2 instanceof Error ? error2.message : "Failed to delete task";
445
+ sonner.toast.error(message);
446
+ }
447
+ }
448
+ }
449
+ )
450
+ ] })
451
+ }
452
+ )
453
+ ]
454
+ }
455
+ );
456
+ }
457
+
458
+ exports.BoardPage = BoardPage;