@tuturuuu/ui 0.17.0 → 0.19.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 (643) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/biome.json +1 -1
  3. package/package.json +111 -152
  4. package/src/components/ui/calendar-app/calendar-client-page.tsx +30 -3
  5. package/src/components/ui/calendar-app/calendar-page-shell.tsx +60 -29
  6. package/src/components/ui/calendar-app/components/calendar-connections-manager-helpers.ts +70 -0
  7. package/src/components/ui/calendar-app/components/calendar-connections-settings-content.tsx +516 -578
  8. package/src/components/ui/calendar-app/components/calendar-connections-unified.tsx +1 -0
  9. package/src/components/ui/calendar-app/components/calendar-sync-settings-panel.tsx +155 -0
  10. package/src/components/ui/calendar-app/components/merge-provider-calendars.test.ts +46 -0
  11. package/src/components/ui/calendar-app/components/merge-provider-calendars.ts +81 -0
  12. package/src/components/ui/calendar-app/components/use-calendar-connections-manager.ts +22 -129
  13. package/src/components/ui/chat/chat-agent-details-operations-panel.test.tsx +17 -3
  14. package/src/components/ui/chat/chat-agent-details-utils.tsx +2 -0
  15. package/src/components/ui/chat/chat-agent-details-zalo-personal-panel.tsx +17 -6
  16. package/src/components/ui/custom/__tests__/settings-dialog-shell.test.tsx +35 -0
  17. package/src/components/ui/custom/__tests__/workspace-select-helpers.test.ts +17 -0
  18. package/src/components/ui/custom/nav-link.test.tsx +1 -0
  19. package/src/components/ui/custom/nav-link.tsx +4 -1
  20. package/src/components/ui/custom/notification-popover-client.tsx +3 -3
  21. package/src/components/ui/custom/settings-dialog-shell.tsx +23 -14
  22. package/src/components/ui/custom/statistic-card.tsx +3 -5
  23. package/src/components/ui/custom/structure.test.tsx +4 -0
  24. package/src/components/ui/custom/user-filters.tsx +4 -7
  25. package/src/components/ui/custom/workspace-access/workspace-access-page-header.tsx +1 -1
  26. package/src/components/ui/custom/workspace-access/workspace-access-tabs-toolbar.tsx +1 -1
  27. package/src/components/ui/custom/workspace-select.tsx +38 -53
  28. package/src/components/ui/finance/analytics/category-spending-chart.test.tsx +3 -3
  29. package/src/components/ui/finance/budgets/budget-card.test.tsx +3 -3
  30. package/src/components/ui/finance/debts/debt-loan-card.test.tsx +3 -3
  31. package/src/components/ui/finance/debts/debt-loan-detail-cards.test.tsx +3 -3
  32. package/src/components/ui/finance/invoices/charts/invoice-totals-chart.test.tsx +3 -3
  33. package/src/components/ui/finance/invoices/columns.test.tsx +3 -3
  34. package/src/components/ui/finance/invoices/components/invoice-customer-select-card.tsx +1 -1
  35. package/src/components/ui/finance/shared/numbers-visibility-toggle.test.tsx +1 -1
  36. package/src/components/ui/finance/tags/tag-manager.test.tsx +2 -2
  37. package/src/components/ui/finance/transactions/categories/columns.test.tsx +5 -5
  38. package/src/components/ui/finance/transactions/columns.test.tsx +2 -2
  39. package/src/components/ui/finance/transactions/confidential-field.test.tsx +2 -2
  40. package/src/components/ui/finance/transactions/transaction-edit-dialog.test.tsx +2 -2
  41. package/src/components/ui/finance/transactions/transaction-statistics.test.tsx +3 -3
  42. package/src/components/ui/finance/wallets/form.test.tsx +3 -3
  43. package/src/components/ui/finance/wallets/wallets-data-table.test.tsx +10 -0
  44. package/src/components/ui/legacy/calendar/calendar-cell.tsx +1 -1
  45. package/src/components/ui/storefront/accent-button.tsx +4 -1
  46. package/src/components/ui/storefront/browse-panel.tsx +6 -1
  47. package/src/components/ui/storefront/cart-summary-parts.tsx +18 -4
  48. package/src/components/ui/storefront/cart-summary.tsx +22 -6
  49. package/src/components/ui/storefront/hero-panel.tsx +13 -17
  50. package/src/components/ui/storefront/index.ts +2 -0
  51. package/src/components/ui/storefront/listing-card.tsx +6 -4
  52. package/src/components/ui/storefront/product-detail.tsx +51 -21
  53. package/src/components/ui/storefront/product-dialog.tsx +8 -1
  54. package/src/components/ui/storefront/storefront-surface.test.tsx +79 -3
  55. package/src/components/ui/storefront/storefront-surface.tsx +151 -100
  56. package/src/components/ui/storefront/types.ts +3 -0
  57. package/src/components/ui/storefront/utils.ts +5 -1
  58. package/src/components/ui/tasks/progress/activity-heatmap.tsx +256 -0
  59. package/src/components/ui/tasks/progress/breakdown-bars.tsx +79 -0
  60. package/src/components/ui/tasks/progress/cumulative-progress-chart.tsx +185 -0
  61. package/src/components/ui/tasks/progress/daily-bar-chart.tsx +97 -0
  62. package/src/components/ui/tasks/progress/habit-gauge.tsx +92 -0
  63. package/src/components/ui/tasks/progress/mini-sparkline.tsx +56 -0
  64. package/src/components/ui/tasks/progress/weekday-distribution-chart.tsx +72 -0
  65. package/src/components/ui/text-editor/__tests__/task-mention-checkbox.test.ts +23 -6
  66. package/src/components/ui/text-editor/__tests__/upload-placeholder.test.ts +1 -10
  67. package/src/components/ui/text-editor/color-controls.tsx +1 -1
  68. package/src/components/ui/text-editor/editor.tsx +7 -1
  69. package/src/components/ui/text-editor/extensions.ts +4 -1
  70. package/src/components/ui/text-editor/mention-extension.tsx +33 -121
  71. package/src/globals.css +20 -0
  72. package/src/globals.test.ts +75 -0
  73. package/src/hooks/__tests__/use-calendar-sync.test.tsx +103 -1
  74. package/src/hooks/use-calendar-sync.tsx +51 -14
  75. package/src/lib/task-personal-external.ts +1 -1
  76. package/src/lib/workspace-actions.ts +15 -4
  77. package/src/components/ui/calendar-app/components/actions-dropdown.tsx +0 -269
  78. package/src/components/ui/calendar-app/components/auto-schedule-comprehensive-dialog.tsx +0 -220
  79. package/src/components/ui/calendar-app/components/calendar-header-actions.tsx +0 -67
  80. package/src/components/ui/calendar-app/components/experimental-feature-dialog.tsx +0 -56
  81. package/src/components/ui/calendar-app/components/habits-panel.tsx +0 -335
  82. package/src/components/ui/calendar-app/components/load-smart-scheduling-tasks.tsx +0 -143
  83. package/src/components/ui/calendar-app/components/priority-dropdown.tsx +0 -113
  84. package/src/components/ui/calendar-app/components/priority-view.tsx +0 -954
  85. package/src/components/ui/calendar-app/components/quick-task-dialog.tsx +0 -335
  86. package/src/components/ui/calendar-app/components/quick-task-timer.tsx +0 -112
  87. package/src/components/ui/calendar-app/components/scheduling-dialog.tsx +0 -664
  88. package/src/components/ui/calendar-app/components/sidebar/calendar-sidebar.tsx +0 -128
  89. package/src/components/ui/calendar-app/components/sidebar/index.tsx +0 -1
  90. package/src/components/ui/calendar-app/components/smart-schedule-button.tsx +0 -117
  91. package/src/components/ui/calendar-app/components/smart-schedule-preview-dialog.tsx +0 -845
  92. package/src/components/ui/calendar-app/components/smart-schedule-preview-panel.tsx +0 -941
  93. package/src/components/ui/calendar-app/components/task-fetcher.ts +0 -51
  94. package/src/components/ui/calendar-app/components/task-form.tsx +0 -132
  95. package/src/components/ui/calendar-app/components/task-list-form.tsx +0 -84
  96. package/src/components/ui/calendar-app/components/task-scheduler-panel.tsx +0 -494
  97. package/src/components/ui/calendar-app/components/tasks-sidebar-content.tsx +0 -232
  98. package/src/components/ui/calendar-app/components/tasks-sidebar.tsx +0 -31
  99. package/src/components/ui/calendar-app/components/time-tracker/components/active-session-card.tsx +0 -113
  100. package/src/components/ui/calendar-app/components/time-tracker/components/index.ts +0 -3
  101. package/src/components/ui/calendar-app/components/time-tracker/components/session-card.tsx +0 -153
  102. package/src/components/ui/calendar-app/components/time-tracker/components/stats-cards.tsx +0 -58
  103. package/src/components/ui/calendar-app/components/time-tracker/dialogs/create-task-dialog.tsx +0 -190
  104. package/src/components/ui/calendar-app/components/time-tracker/dialogs/delete-session-dialog.tsx +0 -52
  105. package/src/components/ui/calendar-app/components/time-tracker/dialogs/edit-session-dialog.tsx +0 -173
  106. package/src/components/ui/calendar-app/components/time-tracker/dialogs/index.ts +0 -3
  107. package/src/components/ui/calendar-app/components/time-tracker/hooks/index.ts +0 -2
  108. package/src/components/ui/calendar-app/components/time-tracker/hooks/use-sessions.ts +0 -191
  109. package/src/components/ui/calendar-app/components/time-tracker/hooks/use-time-tracker.ts +0 -408
  110. package/src/components/ui/calendar-app/components/time-tracker/index.tsx +0 -907
  111. package/src/components/ui/calendar-app/components/time-tracker/tabs/history-tab.tsx +0 -28
  112. package/src/components/ui/calendar-app/components/time-tracker/tabs/index.ts +0 -2
  113. package/src/components/ui/calendar-app/components/time-tracker/tabs/recent-sessions-tab.tsx +0 -173
  114. package/src/components/ui/calendar-app/components/time-tracker/time-tracker-trigger.tsx +0 -50
  115. package/src/components/ui/calendar-app/components/time-tracker/utils/category-colors.ts +0 -38
  116. package/src/components/ui/calendar-app/components/time-tracker/utils/format-time.ts +0 -26
  117. package/src/components/ui/calendar-app/components/time-tracker/utils/index.ts +0 -2
  118. package/src/components/ui/calendar-app/components/time-tracker.tsx +0 -2040
  119. package/src/components/ui/custom/settings/task-settings.tsx +0 -543
  120. package/src/components/ui/custom/settings/task-sound-settings.test.tsx +0 -146
  121. package/src/components/ui/text-editor/__tests__/task-mention-chip.test.tsx +0 -476
  122. package/src/components/ui/text-editor/task-mention-chip.tsx +0 -1397
  123. package/src/components/ui/text-editor/task-mention-resolution.ts +0 -235
  124. package/src/components/ui/text-editor/task-summary-popover.tsx +0 -360
  125. package/src/components/ui/tu-do/boards/__tests__/board-share-dialog.test.tsx +0 -286
  126. package/src/components/ui/tu-do/boards/__tests__/quick-create-board-dialog.test.tsx +0 -52
  127. package/src/components/ui/tu-do/boards/__tests__/task-board-form.test.tsx +0 -142
  128. package/src/components/ui/tu-do/boards/__tests__/workspace-projects-client-page.test.tsx +0 -169
  129. package/src/components/ui/tu-do/boards/analytics/GanttChart.tsx +0 -419
  130. package/src/components/ui/tu-do/boards/analytics/GanttControls.tsx +0 -123
  131. package/src/components/ui/tu-do/boards/analytics/GanttHeader.tsx +0 -48
  132. package/src/components/ui/tu-do/boards/analytics/GanttTimeline.tsx +0 -355
  133. package/src/components/ui/tu-do/boards/analytics/StatusDistribution.tsx +0 -130
  134. package/src/components/ui/tu-do/boards/analytics/TaskCreationAnalytics.tsx +0 -285
  135. package/src/components/ui/tu-do/boards/analytics/TaskDetailCard.tsx +0 -270
  136. package/src/components/ui/tu-do/boards/analytics/TaskGroup.tsx +0 -282
  137. package/src/components/ui/tu-do/boards/analytics/TaskWorkflowAnalytics.tsx +0 -280
  138. package/src/components/ui/tu-do/boards/board-public-link-section.tsx +0 -231
  139. package/src/components/ui/tu-do/boards/board-selector.tsx +0 -301
  140. package/src/components/ui/tu-do/boards/board-share-dialog.tsx +0 -69
  141. package/src/components/ui/tu-do/boards/board-share-settings-panel.tsx +0 -351
  142. package/src/components/ui/tu-do/boards/boardId/__tests__/list-actions.test.tsx +0 -199
  143. package/src/components/ui/tu-do/boards/boardId/board-column-external-retry.test.tsx +0 -185
  144. package/src/components/ui/tu-do/boards/boardId/board-column-initial-load.test.ts +0 -38
  145. package/src/components/ui/tu-do/boards/boardId/board-column.tsx +0 -922
  146. package/src/components/ui/tu-do/boards/boardId/board-text-utils.test.ts +0 -24
  147. package/src/components/ui/tu-do/boards/boardId/board-text-utils.ts +0 -11
  148. package/src/components/ui/tu-do/boards/boardId/enhanced-task-list.tsx +0 -543
  149. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/__tests__/bulk-mutations-external-workspaces.test.tsx +0 -392
  150. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/__tests__/bulk-mutations-move.test.tsx +0 -252
  151. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-actions-island.test.tsx +0 -57
  152. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-actions-island.tsx +0 -106
  153. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-actions-menu.tsx +0 -689
  154. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-custom-date-dialog.tsx +0 -82
  155. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-delete-dialog.tsx +0 -58
  156. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-clear-delete.ts +0 -418
  157. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-move.ts +0 -662
  158. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations-assignees.ts +0 -375
  159. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations-labels.ts +0 -278
  160. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations-projects.ts +0 -297
  161. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations.ts +0 -12
  162. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-updates.ts +0 -462
  163. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operation-i18n.ts +0 -524
  164. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operation-types.ts +0 -34
  165. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operation-utils.ts +0 -377
  166. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operations.ts +0 -348
  167. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-personal-external-move.ts +0 -132
  168. package/src/components/ui/tu-do/boards/boardId/kanban/data/kanban-deadline-query.ts +0 -90
  169. package/src/components/ui/tu-do/boards/boardId/kanban/data/use-applied-sets.ts +0 -79
  170. package/src/components/ui/tu-do/boards/boardId/kanban/data/use-bulk-resources.ts +0 -112
  171. package/src/components/ui/tu-do/boards/boardId/kanban/data/use-filtered-resources.ts +0 -54
  172. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/__tests__/column-reorder.test.ts +0 -80
  173. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/auto-scroll.test.ts +0 -118
  174. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/auto-scroll.ts +0 -160
  175. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/column-reorder.ts +0 -65
  176. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/drag-preview.tsx +0 -117
  177. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/kanban-sort-helpers.ts +0 -76
  178. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-cache.ts +0 -367
  179. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-geometry.test.ts +0 -67
  180. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-geometry.ts +0 -94
  181. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-order.ts +0 -150
  182. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-pending.test.ts +0 -37
  183. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-pending.ts +0 -42
  184. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-preview.test.ts +0 -318
  185. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-preview.ts +0 -260
  186. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-types.ts +0 -39
  187. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-sort-key.ts +0 -47
  188. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/use-kanban-dnd.test.ts +0 -859
  189. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/use-kanban-dnd.ts +0 -1659
  190. package/src/components/ui/tu-do/boards/boardId/kanban/kanban-column-collapse.ts +0 -16
  191. package/src/components/ui/tu-do/boards/boardId/kanban/kanban-constants.ts +0 -43
  192. package/src/components/ui/tu-do/boards/boardId/kanban/planner/__tests__/kanban-planner-island.test.tsx +0 -380
  193. package/src/components/ui/tu-do/boards/boardId/kanban/planner/kanban-planner-dialog.tsx +0 -204
  194. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-digest-panel.tsx +0 -61
  195. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-item-strip.tsx +0 -54
  196. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-plan-toolbar.tsx +0 -251
  197. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-scope-badge.tsx +0 -27
  198. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-section.tsx +0 -58
  199. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-share-dialog.tsx +0 -238
  200. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-target-controls.tsx +0 -143
  201. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-utils.ts +0 -65
  202. package/src/components/ui/tu-do/boards/boardId/kanban/planner/use-kanban-planner-state.ts +0 -234
  203. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-column-width.ts +0 -30
  204. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-columns.test.tsx +0 -1077
  205. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-columns.tsx +0 -447
  206. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-deadline-panels.tsx +0 -703
  207. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-deadline-tasks.test.ts +0 -267
  208. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-deadline-tasks.ts +0 -112
  209. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-skeleton.tsx +0 -113
  210. package/src/components/ui/tu-do/boards/boardId/kanban/selection/use-keyboard-shortcuts.ts +0 -137
  211. package/src/components/ui/tu-do/boards/boardId/kanban/selection/use-multi-select.ts +0 -119
  212. package/src/components/ui/tu-do/boards/boardId/kanban.tsx +0 -631
  213. package/src/components/ui/tu-do/boards/boardId/list-actions.tsx +0 -522
  214. package/src/components/ui/tu-do/boards/boardId/menus/__tests__/task-estimation-menu.test.tsx +0 -261
  215. package/src/components/ui/tu-do/boards/boardId/menus/__tests__/task-menus.test.tsx +0 -708
  216. package/src/components/ui/tu-do/boards/boardId/menus/index.ts +0 -12
  217. package/src/components/ui/tu-do/boards/boardId/menus/task-assignees-menu.tsx +0 -176
  218. package/src/components/ui/tu-do/boards/boardId/menus/task-blocking-menu.tsx +0 -304
  219. package/src/components/ui/tu-do/boards/boardId/menus/task-due-date-menu.tsx +0 -201
  220. package/src/components/ui/tu-do/boards/boardId/menus/task-estimation-menu.tsx +0 -103
  221. package/src/components/ui/tu-do/boards/boardId/menus/task-labels-menu.tsx +0 -134
  222. package/src/components/ui/tu-do/boards/boardId/menus/task-move-menu.tsx +0 -66
  223. package/src/components/ui/tu-do/boards/boardId/menus/task-parent-menu.tsx +0 -228
  224. package/src/components/ui/tu-do/boards/boardId/menus/task-picker-popover.tsx +0 -300
  225. package/src/components/ui/tu-do/boards/boardId/menus/task-priority-menu.tsx +0 -178
  226. package/src/components/ui/tu-do/boards/boardId/menus/task-projects-menu.tsx +0 -143
  227. package/src/components/ui/tu-do/boards/boardId/menus/task-related-menu.tsx +0 -242
  228. package/src/components/ui/tu-do/boards/boardId/menus/task-scheduling-menu.tsx +0 -465
  229. package/src/components/ui/tu-do/boards/boardId/menus/task-scheduling-utils.ts +0 -109
  230. package/src/components/ui/tu-do/boards/boardId/status-grouped-board.tsx +0 -533
  231. package/src/components/ui/tu-do/boards/boardId/status-section.tsx +0 -274
  232. package/src/components/ui/tu-do/boards/boardId/task-actions.tsx +0 -675
  233. package/src/components/ui/tu-do/boards/boardId/task-board-server-page.test.tsx +0 -209
  234. package/src/components/ui/tu-do/boards/boardId/task-board-server-page.tsx +0 -109
  235. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardCheckbox.tsx +0 -50
  236. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardDates.tsx +0 -123
  237. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardHeader.tsx +0 -97
  238. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardMetadata.tsx +0 -152
  239. package/src/components/ui/tu-do/boards/boardId/task-card/measured-task-card.tsx +0 -118
  240. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-archive-visibility.test.ts +0 -44
  241. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-archive-visibility.ts +0 -17
  242. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-checkbox-style.ts +0 -39
  243. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-comparator.test.ts +0 -104
  244. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-comparator.ts +0 -123
  245. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-completion-checkbox-visibility.test.ts +0 -31
  246. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-completion-checkbox-visibility.ts +0 -9
  247. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-identifier-row.test.tsx +0 -124
  248. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-identifier-row.tsx +0 -88
  249. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-label-options.ts +0 -24
  250. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-open-options.test.ts +0 -166
  251. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-open-options.ts +0 -148
  252. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-resource-context.test.ts +0 -113
  253. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-resource-context.ts +0 -50
  254. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-visibility.test.ts +0 -41
  255. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-visibility.ts +0 -14
  256. package/src/components/ui/tu-do/boards/boardId/task-card/task-card.tsx +0 -2889
  257. package/src/components/ui/tu-do/boards/boardId/task-card/task-scheduling-badge.tsx +0 -174
  258. package/src/components/ui/tu-do/boards/boardId/task-dialogs/BoardEstimationConfigDialog.tsx +0 -499
  259. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskCustomDateDialog.tsx +0 -109
  260. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskDeleteDialog.tsx +0 -96
  261. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskNewLabelDialog.tsx +0 -178
  262. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskNewProjectDialog.tsx +0 -127
  263. package/src/components/ui/tu-do/boards/boardId/task-filter.test.tsx +0 -152
  264. package/src/components/ui/tu-do/boards/boardId/task-filter.tsx +0 -996
  265. package/src/components/ui/tu-do/boards/boardId/task-form.tsx +0 -498
  266. package/src/components/ui/tu-do/boards/boardId/task-list-drag-preview.test.ts +0 -101
  267. package/src/components/ui/tu-do/boards/boardId/task-list-form.tsx +0 -91
  268. package/src/components/ui/tu-do/boards/boardId/task-list.tsx +0 -535
  269. package/src/components/ui/tu-do/boards/boardId/task-parent-badge-state.test.ts +0 -64
  270. package/src/components/ui/tu-do/boards/boardId/task-parent-badge-state.ts +0 -31
  271. package/src/components/ui/tu-do/boards/boardId/task.tsx +0 -2
  272. package/src/components/ui/tu-do/boards/boardId/timeline/task-edit-dialog.tsx +0 -109
  273. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-display.ts +0 -103
  274. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-grid.tsx +0 -381
  275. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-task-row.tsx +0 -339
  276. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-toolbar.tsx +0 -356
  277. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-utils.test.ts +0 -169
  278. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-utils.ts +0 -517
  279. package/src/components/ui/tu-do/boards/boardId/timeline-board-open-task.test.tsx +0 -164
  280. package/src/components/ui/tu-do/boards/boardId/timeline-board.test.tsx +0 -217
  281. package/src/components/ui/tu-do/boards/boardId/timeline-board.tsx +0 -834
  282. package/src/components/ui/tu-do/boards/boards-list-skeleton.tsx +0 -62
  283. package/src/components/ui/tu-do/boards/columns.tsx +0 -159
  284. package/src/components/ui/tu-do/boards/copy-board-dialog.tsx +0 -156
  285. package/src/components/ui/tu-do/boards/enhanced-boards-view.tsx +0 -347
  286. package/src/components/ui/tu-do/boards/form.tsx +0 -264
  287. package/src/components/ui/tu-do/boards/quick-create-board-dialog.tsx +0 -75
  288. package/src/components/ui/tu-do/boards/row-actions.tsx +0 -397
  289. package/src/components/ui/tu-do/boards/share-section.tsx +0 -100
  290. package/src/components/ui/tu-do/boards/workspace-projects-client-page.tsx +0 -192
  291. package/src/components/ui/tu-do/boards/workspace-projects-page.tsx +0 -155
  292. package/src/components/ui/tu-do/cycles/task-cycles-client.tsx +0 -753
  293. package/src/components/ui/tu-do/cycles/task-cycles-page.tsx +0 -103
  294. package/src/components/ui/tu-do/drafts/draft-card.tsx +0 -204
  295. package/src/components/ui/tu-do/drafts/draft-convert-dialog.tsx +0 -195
  296. package/src/components/ui/tu-do/drafts/drafts-page.tsx +0 -122
  297. package/src/components/ui/tu-do/drafts/task-drafts-page.tsx +0 -90
  298. package/src/components/ui/tu-do/estimates/client.tsx +0 -292
  299. package/src/components/ui/tu-do/estimates/edit-estimation-dialog.tsx +0 -374
  300. package/src/components/ui/tu-do/estimates/task-estimates-page.tsx +0 -57
  301. package/src/components/ui/tu-do/estimates/use-task-estimates.ts +0 -324
  302. package/src/components/ui/tu-do/habits/client.tsx +0 -263
  303. package/src/components/ui/tu-do/habits/habit-card.tsx +0 -183
  304. package/src/components/ui/tu-do/habits/habit-form-dialog.tsx +0 -701
  305. package/src/components/ui/tu-do/habits/habits-page.tsx +0 -27
  306. package/src/components/ui/tu-do/hooks/__tests__/useDraftPersistence.test.ts +0 -494
  307. package/src/components/ui/tu-do/hooks/__tests__/useTaskDialog.test.tsx +0 -127
  308. package/src/components/ui/tu-do/hooks/__tests__/useTaskDialogState.test.ts +0 -217
  309. package/src/components/ui/tu-do/hooks/__tests__/useTaskLabelManagement.test.tsx +0 -572
  310. package/src/components/ui/tu-do/hooks/__tests__/useTaskProjectManagement.test.tsx +0 -144
  311. package/src/components/ui/tu-do/hooks/useDraftPersistence.ts +0 -199
  312. package/src/components/ui/tu-do/hooks/useTaskCardRelationships.ts +0 -340
  313. package/src/components/ui/tu-do/hooks/useTaskDialog.ts +0 -122
  314. package/src/components/ui/tu-do/hooks/useTaskDialogState.ts +0 -145
  315. package/src/components/ui/tu-do/hooks/useTaskFormState.ts +0 -206
  316. package/src/components/ui/tu-do/hooks/useTaskKeyboardShortcuts.ts +0 -58
  317. package/src/components/ui/tu-do/hooks/useTaskLabelManagement.ts +0 -425
  318. package/src/components/ui/tu-do/hooks/useTaskProjectManagement.ts +0 -454
  319. package/src/components/ui/tu-do/initiatives/task-initiatives-client.tsx +0 -889
  320. package/src/components/ui/tu-do/initiatives/task-initiatives-page.tsx +0 -116
  321. package/src/components/ui/tu-do/labels/client.tsx +0 -201
  322. package/src/components/ui/tu-do/labels/components/delete-label-dialog.tsx +0 -57
  323. package/src/components/ui/tu-do/labels/components/label-card.tsx +0 -86
  324. package/src/components/ui/tu-do/labels/components/label-dialog.tsx +0 -259
  325. package/src/components/ui/tu-do/labels/components/label-list.tsx +0 -83
  326. package/src/components/ui/tu-do/labels/hooks/use-task-labels.ts +0 -170
  327. package/src/components/ui/tu-do/labels/task-labels-page.tsx +0 -53
  328. package/src/components/ui/tu-do/labels/types.ts +0 -6
  329. package/src/components/ui/tu-do/logs/columns.tsx +0 -755
  330. package/src/components/ui/tu-do/logs/logs-client.tsx +0 -1006
  331. package/src/components/ui/tu-do/logs/logs-timeline.tsx +0 -2483
  332. package/src/components/ui/tu-do/logs/task-logs-page.tsx +0 -59
  333. package/src/components/ui/tu-do/my-tasks/__tests__/my-tasks-content.test.tsx +0 -408
  334. package/src/components/ui/tu-do/my-tasks/__tests__/use-my-tasks-query.test.ts +0 -469
  335. package/src/components/ui/tu-do/my-tasks/__tests__/use-my-tasks-state.test.ts +0 -1017
  336. package/src/components/ui/tu-do/my-tasks/__tests__/use-task-context-actions.test.ts +0 -584
  337. package/src/components/ui/tu-do/my-tasks/ai-credit-indicator.tsx +0 -143
  338. package/src/components/ui/tu-do/my-tasks/board-selector-dialog.tsx +0 -239
  339. package/src/components/ui/tu-do/my-tasks/command-bar.tsx +0 -1351
  340. package/src/components/ui/tu-do/my-tasks/label-project-filter.tsx +0 -194
  341. package/src/components/ui/tu-do/my-tasks/my-task-context-menu.tsx +0 -356
  342. package/src/components/ui/tu-do/my-tasks/my-tasks-content.tsx +0 -328
  343. package/src/components/ui/tu-do/my-tasks/my-tasks-data-loader.tsx +0 -17
  344. package/src/components/ui/tu-do/my-tasks/my-tasks-filters.tsx +0 -258
  345. package/src/components/ui/tu-do/my-tasks/my-tasks-header.tsx +0 -121
  346. package/src/components/ui/tu-do/my-tasks/my-tasks-page.tsx +0 -40
  347. package/src/components/ui/tu-do/my-tasks/personal-placement-dialog.tsx +0 -188
  348. package/src/components/ui/tu-do/my-tasks/task-filter.tsx +0 -235
  349. package/src/components/ui/tu-do/my-tasks/task-list-with-completion.tsx +0 -832
  350. package/src/components/ui/tu-do/my-tasks/task-list.tsx +0 -258
  351. package/src/components/ui/tu-do/my-tasks/task-preview-dialog.tsx +0 -1597
  352. package/src/components/ui/tu-do/my-tasks/task-section.tsx +0 -261
  353. package/src/components/ui/tu-do/my-tasks/use-my-tasks-query.ts +0 -149
  354. package/src/components/ui/tu-do/my-tasks/use-my-tasks-state.ts +0 -1037
  355. package/src/components/ui/tu-do/my-tasks/use-task-context-actions.ts +0 -474
  356. package/src/components/ui/tu-do/notes/note-edit-dialog.tsx +0 -118
  357. package/src/components/ui/tu-do/notes/note-list.tsx +0 -799
  358. package/src/components/ui/tu-do/notes/notes-content.tsx +0 -178
  359. package/src/components/ui/tu-do/notes/notes-page.tsx +0 -27
  360. package/src/components/ui/tu-do/progress/task-progress-import-panel.tsx +0 -60
  361. package/src/components/ui/tu-do/progress/task-progress-leaderboards-panel.tsx +0 -156
  362. package/src/components/ui/tu-do/progress/task-progress-page.tsx +0 -382
  363. package/src/components/ui/tu-do/progress/task-progress-panels.tsx +0 -303
  364. package/src/components/ui/tu-do/projects/components/index.ts +0 -11
  365. package/src/components/ui/tu-do/projects/components/project-actions-menu.tsx +0 -66
  366. package/src/components/ui/tu-do/projects/components/project-badges.tsx +0 -84
  367. package/src/components/ui/tu-do/projects/components/project-filter-menu.tsx +0 -170
  368. package/src/components/ui/tu-do/projects/components/project-grid-card.tsx +0 -198
  369. package/src/components/ui/tu-do/projects/components/project-list-item.tsx +0 -195
  370. package/src/components/ui/tu-do/projects/components/project-metrics.tsx +0 -87
  371. package/src/components/ui/tu-do/projects/components/project-progress-meter.tsx +0 -33
  372. package/src/components/ui/tu-do/projects/components/project-sort-menu.tsx +0 -71
  373. package/src/components/ui/tu-do/projects/components/projects-empty-state.tsx +0 -38
  374. package/src/components/ui/tu-do/projects/components/projects-loading-state.tsx +0 -26
  375. package/src/components/ui/tu-do/projects/components/projects-toolbar.tsx +0 -179
  376. package/src/components/ui/tu-do/projects/dialogs/create-project-dialog.tsx +0 -117
  377. package/src/components/ui/tu-do/projects/dialogs/edit-project-dialog.tsx +0 -125
  378. package/src/components/ui/tu-do/projects/dialogs/index.ts +0 -3
  379. package/src/components/ui/tu-do/projects/dialogs/manage-tasks-dialog.tsx +0 -205
  380. package/src/components/ui/tu-do/projects/hooks/index.ts +0 -2
  381. package/src/components/ui/tu-do/projects/hooks/use-project-filters.ts +0 -248
  382. package/src/components/ui/tu-do/projects/hooks/use-task-projects.ts +0 -238
  383. package/src/components/ui/tu-do/projects/projectId/components/__tests__/tasks-tab-layout.test.tsx +0 -169
  384. package/src/components/ui/tu-do/projects/projectId/components/documents-tab.tsx +0 -90
  385. package/src/components/ui/tu-do/projects/projectId/components/index.ts +0 -9
  386. package/src/components/ui/tu-do/projects/projectId/components/overview/description-card.tsx +0 -77
  387. package/src/components/ui/tu-do/projects/projectId/components/overview/linked-documents-card.tsx +0 -81
  388. package/src/components/ui/tu-do/projects/projectId/components/overview/linked-tasks-card.tsx +0 -85
  389. package/src/components/ui/tu-do/projects/projectId/components/overview/updates-card.tsx +0 -85
  390. package/src/components/ui/tu-do/projects/projectId/components/overview-tab.tsx +0 -35
  391. package/src/components/ui/tu-do/projects/projectId/components/project-configuration.tsx +0 -229
  392. package/src/components/ui/tu-do/projects/projectId/components/project-header.tsx +0 -115
  393. package/src/components/ui/tu-do/projects/projectId/components/project-lead-selector.tsx +0 -55
  394. package/src/components/ui/tu-do/projects/projectId/components/project-overview-context.tsx +0 -82
  395. package/src/components/ui/tu-do/projects/projectId/components/project-sidebar.tsx +0 -246
  396. package/src/components/ui/tu-do/projects/projectId/components/tasks-tab.tsx +0 -266
  397. package/src/components/ui/tu-do/projects/projectId/components/update-card.tsx +0 -162
  398. package/src/components/ui/tu-do/projects/projectId/components/updates-tab.tsx +0 -129
  399. package/src/components/ui/tu-do/projects/projectId/dialogs/index.ts +0 -1
  400. package/src/components/ui/tu-do/projects/projectId/dialogs/link-task-dialog.tsx +0 -114
  401. package/src/components/ui/tu-do/projects/projectId/hooks/index.ts +0 -4
  402. package/src/components/ui/tu-do/projects/projectId/hooks/use-animation-variants.ts +0 -68
  403. package/src/components/ui/tu-do/projects/projectId/hooks/use-project-form.ts +0 -214
  404. package/src/components/ui/tu-do/projects/projectId/hooks/use-project-updates.ts +0 -209
  405. package/src/components/ui/tu-do/projects/projectId/hooks/use-task-linking.ts +0 -101
  406. package/src/components/ui/tu-do/projects/projectId/task-project-detail-page-client.tsx +0 -93
  407. package/src/components/ui/tu-do/projects/projectId/task-project-detail-page.tsx +0 -78
  408. package/src/components/ui/tu-do/projects/projectId/task-project-detail.tsx +0 -367
  409. package/src/components/ui/tu-do/projects/projectId/types.ts +0 -51
  410. package/src/components/ui/tu-do/projects/task-projects-client.tsx +0 -270
  411. package/src/components/ui/tu-do/projects/task-projects-page.tsx +0 -97
  412. package/src/components/ui/tu-do/projects/types.ts +0 -62
  413. package/src/components/ui/tu-do/providers/__tests__/task-dialog-provider.test.tsx +0 -616
  414. package/src/components/ui/tu-do/providers/task-dialog-provider.tsx +0 -923
  415. package/src/components/ui/tu-do/providers/workspace-presence-provider.tsx +0 -88
  416. package/src/components/ui/tu-do/shared/AccessibleButton.tsx +0 -79
  417. package/src/components/ui/tu-do/shared/__tests__/assignee-select.test.tsx +0 -143
  418. package/src/components/ui/tu-do/shared/__tests__/board-client.test.tsx +0 -358
  419. package/src/components/ui/tu-do/shared/__tests__/board-header.test.tsx +0 -598
  420. package/src/components/ui/tu-do/shared/__tests__/board-query-cache.test.ts +0 -219
  421. package/src/components/ui/tu-do/shared/__tests__/board-switcher.test.tsx +0 -374
  422. package/src/components/ui/tu-do/shared/__tests__/board-views.test.tsx +0 -1288
  423. package/src/components/ui/tu-do/shared/__tests__/create-list-dialog.test.tsx +0 -118
  424. package/src/components/ui/tu-do/shared/__tests__/task-board-loading-state.test.tsx +0 -99
  425. package/src/components/ui/tu-do/shared/__tests__/task-cache-patches.test.ts +0 -147
  426. package/src/components/ui/tu-do/shared/__tests__/task-detail-page.test.tsx +0 -170
  427. package/src/components/ui/tu-do/shared/__tests__/task-dialog-manager.test.tsx +0 -945
  428. package/src/components/ui/tu-do/shared/__tests__/task-legacy-route-recovery.test.tsx +0 -101
  429. package/src/components/ui/tu-do/shared/__tests__/use-progressive-board-loader.test.tsx +0 -645
  430. package/src/components/ui/tu-do/shared/assignee-select.tsx +0 -592
  431. package/src/components/ui/tu-do/shared/board-broadcast-context.tsx +0 -45
  432. package/src/components/ui/tu-do/shared/board-client.tsx +0 -283
  433. package/src/components/ui/tu-do/shared/board-config-storage.ts +0 -94
  434. package/src/components/ui/tu-do/shared/board-header.tsx +0 -803
  435. package/src/components/ui/tu-do/shared/board-layout-settings.tsx +0 -1134
  436. package/src/components/ui/tu-do/shared/board-query-cache.ts +0 -157
  437. package/src/components/ui/tu-do/shared/board-switcher.tsx +0 -322
  438. package/src/components/ui/tu-do/shared/board-user-presence-avatars.tsx +0 -578
  439. package/src/components/ui/tu-do/shared/board-views.tsx +0 -1238
  440. package/src/components/ui/tu-do/shared/clear-menu-item.tsx +0 -34
  441. package/src/components/ui/tu-do/shared/create-list-dialog.tsx +0 -401
  442. package/src/components/ui/tu-do/shared/cursor-overlay-multi-wrapper.tsx +0 -245
  443. package/src/components/ui/tu-do/shared/cursor-overlay.tsx +0 -78
  444. package/src/components/ui/tu-do/shared/custom-date-picker/custom-date-picker-dialog.tsx +0 -157
  445. package/src/components/ui/tu-do/shared/description-overflow-warning-dialog.tsx +0 -68
  446. package/src/components/ui/tu-do/shared/edit-list-dialog.tsx +0 -383
  447. package/src/components/ui/tu-do/shared/empty-state-card.tsx +0 -46
  448. package/src/components/ui/tu-do/shared/estimation-mapping.test.ts +0 -32
  449. package/src/components/ui/tu-do/shared/estimation-mapping.ts +0 -74
  450. package/src/components/ui/tu-do/shared/estimation-utils.ts +0 -54
  451. package/src/components/ui/tu-do/shared/fade-setting-initializer.tsx +0 -61
  452. package/src/components/ui/tu-do/shared/label-chip.tsx +0 -46
  453. package/src/components/ui/tu-do/shared/list-view-context-menu.test.tsx +0 -203
  454. package/src/components/ui/tu-do/shared/list-view-sorting.test.ts +0 -50
  455. package/src/components/ui/tu-do/shared/list-view-sorting.ts +0 -108
  456. package/src/components/ui/tu-do/shared/list-view.tsx +0 -1248
  457. package/src/components/ui/tu-do/shared/mention-system/__tests__/mention-system.test.ts +0 -250
  458. package/src/components/ui/tu-do/shared/mention-system/mention-menu.tsx +0 -217
  459. package/src/components/ui/tu-do/shared/mention-system/types.ts +0 -141
  460. package/src/components/ui/tu-do/shared/mention-system/use-mention-suggestions.ts +0 -244
  461. package/src/components/ui/tu-do/shared/progressive-loader-context.tsx +0 -45
  462. package/src/components/ui/tu-do/shared/recent-sidebar-events.ts +0 -58
  463. package/src/components/ui/tu-do/shared/recycle-bin-panel.tsx +0 -651
  464. package/src/components/ui/tu-do/shared/relationship-task-identifier.ts +0 -14
  465. package/src/components/ui/tu-do/shared/slash-commands/__tests__/slash-commands.test.ts +0 -315
  466. package/src/components/ui/tu-do/shared/slash-commands/definitions.ts +0 -167
  467. package/src/components/ui/tu-do/shared/slash-commands/slash-command-menu.tsx +0 -114
  468. package/src/components/ui/tu-do/shared/special-task-list-pins.ts +0 -51
  469. package/src/components/ui/tu-do/shared/sync-warning-dialog.tsx +0 -133
  470. package/src/components/ui/tu-do/shared/task-board-errors.ts +0 -19
  471. package/src/components/ui/tu-do/shared/task-board-loading-state.tsx +0 -82
  472. package/src/components/ui/tu-do/shared/task-cache-patches.ts +0 -394
  473. package/src/components/ui/tu-do/shared/task-detail-page.tsx +0 -176
  474. package/src/components/ui/tu-do/shared/task-detail-server-page.tsx +0 -37
  475. package/src/components/ui/tu-do/shared/task-dialog-manager.tsx +0 -596
  476. package/src/components/ui/tu-do/shared/task-dialog-presentation.test.ts +0 -53
  477. package/src/components/ui/tu-do/shared/task-dialog-presentation.ts +0 -30
  478. package/src/components/ui/tu-do/shared/task-dialog-wrapper.tsx +0 -28
  479. package/src/components/ui/tu-do/shared/task-due-date-visibility.test.ts +0 -72
  480. package/src/components/ui/tu-do/shared/task-due-date-visibility.ts +0 -38
  481. package/src/components/ui/tu-do/shared/task-edit-dialog/components/compact-task-create-popover.test.tsx +0 -325
  482. package/src/components/ui/tu-do/shared/task-edit-dialog/components/compact-task-create-popover.tsx +0 -268
  483. package/src/components/ui/tu-do/shared/task-edit-dialog/components/mobile-floating-save-button.tsx +0 -46
  484. package/src/components/ui/tu-do/shared/task-edit-dialog/components/quick-settings-popover.tsx +0 -198
  485. package/src/components/ui/tu-do/shared/task-edit-dialog/components/smart-task-suggestions-panel.test.tsx +0 -129
  486. package/src/components/ui/tu-do/shared/task-edit-dialog/components/smart-task-suggestions-panel.tsx +0 -358
  487. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-description-editor.tsx +0 -496
  488. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-dialog-header.tsx +0 -545
  489. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-list-picker-panel.tsx +0 -220
  490. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-list-selector.tsx +0 -165
  491. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-list-trigger-styles.ts +0 -69
  492. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-name-input.test.tsx +0 -180
  493. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-name-input.tsx +0 -218
  494. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-suggestion-menus.tsx +0 -148
  495. package/src/components/ui/tu-do/shared/task-edit-dialog/constants.ts +0 -18
  496. package/src/components/ui/tu-do/shared/task-edit-dialog/context-menu-guard.test.ts +0 -37
  497. package/src/components/ui/tu-do/shared/task-edit-dialog/description-diff-viewer.tsx +0 -1665
  498. package/src/components/ui/tu-do/shared/task-edit-dialog/description-versions.test.ts +0 -97
  499. package/src/components/ui/tu-do/shared/task-edit-dialog/description-versions.ts +0 -210
  500. package/src/components/ui/tu-do/shared/task-edit-dialog/field-diff-viewer.tsx +0 -716
  501. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-dialog-close.test.ts +0 -218
  502. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-dialog-keyboard-shortcuts.test.ts +0 -140
  503. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-mutations.test.tsx +0 -231
  504. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-overrides.test.ts +0 -412
  505. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-realtime-sync.test.tsx +0 -237
  506. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-yjs-sync.test.ts +0 -190
  507. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-update-shared-task.test.ts +0 -107
  508. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/task-api.test.ts +0 -171
  509. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/task-api.ts +0 -296
  510. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-editor-commands.ts +0 -314
  511. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-suggestion-menus.ts +0 -503
  512. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-change-detection.ts +0 -175
  513. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-data.ts +0 -401
  514. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-dependencies.ts +0 -773
  515. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-dialog-close.ts +0 -193
  516. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-dialog-keyboard-shortcuts.ts +0 -365
  517. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-form-reset.ts +0 -231
  518. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-form-state.ts +0 -307
  519. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-mutations.ts +0 -609
  520. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-overrides.ts +0 -134
  521. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-realtime-sync.ts +0 -270
  522. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-relationships.test.tsx +0 -212
  523. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-relationships.ts +0 -554
  524. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-revert.ts +0 -140
  525. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-save.test.ts +0 -289
  526. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-save.ts +0 -1473
  527. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-snapshot.ts +0 -59
  528. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-yjs-sync.ts +0 -224
  529. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-update-shared-task.ts +0 -60
  530. package/src/components/ui/tu-do/shared/task-edit-dialog/personal-overrides-section.tsx +0 -368
  531. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/clickable-task-item.tsx +0 -90
  532. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/index.ts +0 -4
  533. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/subtask-action-buttons.tsx +0 -140
  534. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/tab-button.tsx +0 -76
  535. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/task-relationship-action-buttons.tsx +0 -178
  536. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/dependencies-section.tsx +0 -140
  537. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/index.ts +0 -35
  538. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/parent-section.tsx +0 -70
  539. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/related-section.tsx +0 -81
  540. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/subtasks-section.tsx +0 -87
  541. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/task-search-popover.tsx +0 -229
  542. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/types/task-relationships.types.ts +0 -194
  543. package/src/components/ui/tu-do/shared/task-edit-dialog/selective-revert-panel.test.tsx +0 -91
  544. package/src/components/ui/tu-do/shared/task-edit-dialog/selective-revert-panel.tsx +0 -365
  545. package/src/components/ui/tu-do/shared/task-edit-dialog/task-activity-section.tsx +0 -802
  546. package/src/components/ui/tu-do/shared/task-edit-dialog/task-delete-dialog.tsx +0 -104
  547. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-change-dialog.test.tsx +0 -63
  548. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-change-dialog.tsx +0 -218
  549. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-restore-banner.tsx +0 -83
  550. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-version-restore-dialog.test.tsx +0 -120
  551. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-version-restore-dialog.tsx +0 -180
  552. package/src/components/ui/tu-do/shared/task-edit-dialog/task-dialog-actions.test.tsx +0 -68
  553. package/src/components/ui/tu-do/shared/task-edit-dialog/task-dialog-actions.tsx +0 -239
  554. package/src/components/ui/tu-do/shared/task-edit-dialog/task-instances-section.tsx +0 -173
  555. package/src/components/ui/tu-do/shared/task-edit-dialog/task-properties-section.test.tsx +0 -303
  556. package/src/components/ui/tu-do/shared/task-edit-dialog/task-properties-section.tsx +0 -2213
  557. package/src/components/ui/tu-do/shared/task-edit-dialog/task-relationships-properties.tsx +0 -315
  558. package/src/components/ui/tu-do/shared/task-edit-dialog/task-snapshot-dialog.tsx +0 -167
  559. package/src/components/ui/tu-do/shared/task-edit-dialog/types/pending-relationship.test.ts +0 -52
  560. package/src/components/ui/tu-do/shared/task-edit-dialog/types/pending-relationship.ts +0 -134
  561. package/src/components/ui/tu-do/shared/task-edit-dialog/types.ts +0 -64
  562. package/src/components/ui/tu-do/shared/task-edit-dialog/user-display.test.ts +0 -58
  563. package/src/components/ui/tu-do/shared/task-edit-dialog/user-display.ts +0 -45
  564. package/src/components/ui/tu-do/shared/task-edit-dialog/utils/inline-task-target-list.test.ts +0 -98
  565. package/src/components/ui/tu-do/shared/task-edit-dialog/utils/inline-task-target-list.ts +0 -39
  566. package/src/components/ui/tu-do/shared/task-edit-dialog/utils.test.ts +0 -504
  567. package/src/components/ui/tu-do/shared/task-edit-dialog/utils.ts +0 -582
  568. package/src/components/ui/tu-do/shared/task-edit-dialog/yjs-prosemirror-compat.test.ts +0 -65
  569. package/src/components/ui/tu-do/shared/task-edit-dialog.tsx +0 -3196
  570. package/src/components/ui/tu-do/shared/task-estimation-display.tsx +0 -52
  571. package/src/components/ui/tu-do/shared/task-estimation-picker.tsx +0 -226
  572. package/src/components/ui/tu-do/shared/task-filter.types.ts +0 -65
  573. package/src/components/ui/tu-do/shared/task-label-selector.tsx +0 -217
  574. package/src/components/ui/tu-do/shared/task-labels-display.test.tsx +0 -51
  575. package/src/components/ui/tu-do/shared/task-labels-display.tsx +0 -119
  576. package/src/components/ui/tu-do/shared/task-legacy-route-recovery.tsx +0 -65
  577. package/src/components/ui/tu-do/shared/task-projects-display.tsx +0 -80
  578. package/src/components/ui/tu-do/shared/task-quick-create-target-list.ts +0 -20
  579. package/src/components/ui/tu-do/shared/task-resource-search-field.tsx +0 -49
  580. package/src/components/ui/tu-do/shared/task-resource-search-filters.ts +0 -27
  581. package/src/components/ui/tu-do/shared/task-row-actions-menu.test.tsx +0 -138
  582. package/src/components/ui/tu-do/shared/task-row-actions-menu.tsx +0 -402
  583. package/src/components/ui/tu-do/shared/task-share-dialog/components/share-link-settings.tsx +0 -86
  584. package/src/components/ui/tu-do/shared/task-share-dialog/components/shares-list.tsx +0 -85
  585. package/src/components/ui/tu-do/shared/task-share-dialog/hooks/use-task-sharing.ts +0 -296
  586. package/src/components/ui/tu-do/shared/task-share-dialog.tsx +0 -144
  587. package/src/components/ui/tu-do/shared/task-sound-effects.test.ts +0 -189
  588. package/src/components/ui/tu-do/shared/task-sound-effects.tsx +0 -468
  589. package/src/components/ui/tu-do/shared/task-url.ts +0 -56
  590. package/src/components/ui/tu-do/shared/text-diff-viewer.tsx +0 -55
  591. package/src/components/ui/tu-do/shared/types.ts +0 -14
  592. package/src/components/ui/tu-do/shared/unsaved-changes-warning-dialog.tsx +0 -71
  593. package/src/components/ui/tu-do/shared/use-progressive-board-loader.ts +0 -312
  594. package/src/components/ui/tu-do/shared/user-avatar.tsx +0 -46
  595. package/src/components/ui/tu-do/shared/user-presence-avatars.tsx +0 -415
  596. package/src/components/ui/tu-do/shared/utils/translate-task-list-display-name.ts +0 -28
  597. package/src/components/ui/tu-do/tasks-route-context.tsx +0 -50
  598. package/src/components/ui/tu-do/templates/client.tsx +0 -505
  599. package/src/components/ui/tu-do/templates/marketplace/client.tsx +0 -487
  600. package/src/components/ui/tu-do/templates/marketplace/task-marketplace-page.tsx +0 -169
  601. package/src/components/ui/tu-do/templates/save-as-template-dialog.tsx +0 -381
  602. package/src/components/ui/tu-do/templates/task-template-api.ts +0 -142
  603. package/src/components/ui/tu-do/templates/task-template-card.tsx +0 -118
  604. package/src/components/ui/tu-do/templates/task-template-client.test.tsx +0 -52
  605. package/src/components/ui/tu-do/templates/task-template-client.tsx +0 -258
  606. package/src/components/ui/tu-do/templates/task-template-dialogs.test.tsx +0 -167
  607. package/src/components/ui/tu-do/templates/task-template-dialogs.tsx +0 -376
  608. package/src/components/ui/tu-do/templates/task-templates-hub.test.tsx +0 -114
  609. package/src/components/ui/tu-do/templates/task-templates-hub.tsx +0 -53
  610. package/src/components/ui/tu-do/templates/task-templates-page.tsx +0 -157
  611. package/src/components/ui/tu-do/templates/templateId/client.tsx +0 -674
  612. package/src/components/ui/tu-do/templates/templateId/edit-template-dialog.tsx +0 -300
  613. package/src/components/ui/tu-do/templates/templateId/share-template-dialog.tsx +0 -261
  614. package/src/components/ui/tu-do/templates/templateId/task-template-detail-page-client.tsx +0 -127
  615. package/src/components/ui/tu-do/templates/templateId/task-template-detail-page.tsx +0 -89
  616. package/src/components/ui/tu-do/templates/templateId/use-template-dialog.tsx +0 -165
  617. package/src/components/ui/tu-do/templates/types.ts +0 -53
  618. package/src/components/ui/tu-do/utils/__tests__/label-colors.test.ts +0 -43
  619. package/src/components/ui/tu-do/utils/__tests__/taskColorUtils.test.ts +0 -267
  620. package/src/components/ui/tu-do/utils/__tests__/taskConstants.test.ts +0 -178
  621. package/src/components/ui/tu-do/utils/__tests__/taskDateUtils.test.ts +0 -226
  622. package/src/components/ui/tu-do/utils/__tests__/weekDateUtils.test.ts +0 -182
  623. package/src/components/ui/tu-do/utils/label-colors.test.ts +0 -15
  624. package/src/components/ui/tu-do/utils/label-colors.ts +0 -59
  625. package/src/components/ui/tu-do/utils/taskColorUtils.ts +0 -116
  626. package/src/components/ui/tu-do/utils/taskConstants.ts +0 -102
  627. package/src/components/ui/tu-do/utils/taskDateUtils.ts +0 -81
  628. package/src/components/ui/tu-do/utils/taskPriorityUtils.tsx +0 -80
  629. package/src/components/ui/tu-do/utils/weekDateUtils.ts +0 -64
  630. package/src/hooks/__tests__/use-task-actions.test.tsx +0 -2098
  631. package/src/hooks/__tests__/useBoardPresence.test.tsx +0 -191
  632. package/src/hooks/__tests__/useBoardRealtime.test.tsx +0 -1036
  633. package/src/hooks/__tests__/useCursorTracking.test.tsx +0 -212
  634. package/src/hooks/task-actions-personal-external.ts +0 -313
  635. package/src/hooks/use-task-actions.ts +0 -1910
  636. package/src/hooks/useBoardPresence.ts +0 -364
  637. package/src/hooks/useBoardRealtime.ts +0 -428
  638. package/src/hooks/useBoardRealtime.types.ts +0 -56
  639. package/src/hooks/useBoardRealtimeEventHandler.ts +0 -452
  640. package/src/hooks/useCursorTracking.ts +0 -402
  641. package/src/hooks/usePresence.ts +0 -272
  642. package/src/hooks/useTaskUserRealtime.ts +0 -340
  643. /package/src/{components/ui/tu-do/shared → lib}/task-open-events.ts +0 -0
@@ -1,1134 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- closestCenter,
5
- DndContext,
6
- type DragEndEvent,
7
- KeyboardSensor,
8
- PointerSensor,
9
- useSensor,
10
- useSensors,
11
- } from '@dnd-kit/core';
12
- import {
13
- arrayMove,
14
- SortableContext,
15
- sortableKeyboardCoordinates,
16
- useSortable,
17
- verticalListSortingStrategy,
18
- } from '@dnd-kit/sortable';
19
- import { CSS } from '@dnd-kit/utilities';
20
- import { useMutation, useQueryClient } from '@tanstack/react-query';
21
- import {
22
- Circle,
23
- CircleCheck,
24
- CircleDashed,
25
- CircleX,
26
- ClipboardCheck,
27
- FileText,
28
- GripVertical,
29
- MoreVertical,
30
- Pencil,
31
- Plus,
32
- Trash2,
33
- } from '@tuturuuu/icons';
34
- import { updateWorkspaceTaskList } from '@tuturuuu/internal-api/tasks';
35
- import type { WorkspaceTaskList } from '@tuturuuu/types';
36
- import type { SupportedColor } from '@tuturuuu/types/primitives/SupportedColors';
37
- import type { Task } from '@tuturuuu/types/primitives/Task';
38
- import type { TaskBoardStatus } from '@tuturuuu/types/primitives/TaskBoard';
39
- import {
40
- AlertDialog,
41
- AlertDialogAction,
42
- AlertDialogCancel,
43
- AlertDialogContent,
44
- AlertDialogDescription,
45
- AlertDialogFooter,
46
- AlertDialogHeader,
47
- AlertDialogTitle,
48
- } from '@tuturuuu/ui/alert-dialog';
49
- import { Badge } from '@tuturuuu/ui/badge';
50
- import { Button } from '@tuturuuu/ui/button';
51
- import {
52
- Dialog,
53
- DialogContent,
54
- DialogDescription,
55
- DialogFooter,
56
- DialogHeader,
57
- DialogTitle,
58
- } from '@tuturuuu/ui/dialog';
59
- import {
60
- DropdownMenu,
61
- DropdownMenuContent,
62
- DropdownMenuItem,
63
- DropdownMenuSeparator,
64
- DropdownMenuTrigger,
65
- } from '@tuturuuu/ui/dropdown-menu';
66
- import { ScrollArea } from '@tuturuuu/ui/scroll-area';
67
- import { toast } from '@tuturuuu/ui/sonner';
68
- import { cn } from '@tuturuuu/utils/format';
69
- import { useCallback, useMemo, useState } from 'react';
70
- import {
71
- getActiveBroadcast,
72
- useBoardBroadcast,
73
- } from './board-broadcast-context';
74
- import { CreateListDialog } from './create-list-dialog';
75
- import { EditListDialog } from './edit-list-dialog';
76
- import { isTaskListNameExistsError } from './task-board-errors';
77
- import { translateTaskListNameForDisplay } from './utils/translate-task-list-display-name';
78
-
79
- interface BoardLayoutSettingsContentProps {
80
- boardId: string;
81
- wsId?: string;
82
- lists: WorkspaceTaskList[];
83
- onUpdate: () => void;
84
- disableScrollArea?: boolean;
85
- scrollAreaClassName?: string;
86
- translations?: {
87
- boardLayoutSettings?: string;
88
- boardLayoutSettingsDescription?: string;
89
- addNewList?: string;
90
- noListsInStatus?: string;
91
- done?: string;
92
- editList?: string;
93
- updateListDescription?: string;
94
- listName?: string;
95
- statusCategory?: string;
96
- color?: string;
97
- cancel?: string;
98
- saving?: string;
99
- saveChanges?: string;
100
- deleteListTitle?: string;
101
- deleteListDescription?: string;
102
- deleteListConfirm?: string;
103
- listUpdatedSuccessfully?: string;
104
- failedToUpdateList?: string;
105
- listNameAlreadyExists?: string;
106
- colorUpdated?: string;
107
- failedToUpdateColor?: string;
108
- listDeletedSuccessfully?: string;
109
- failedToDeleteList?: string;
110
- cannotMoveToClosedStatus?: string;
111
- listsReordered?: string;
112
- failedToReorderLists?: string;
113
- movedToStatus?: string;
114
- // Status labels
115
- backlog?: string;
116
- active?: string;
117
- review?: string;
118
- doneStatus?: string;
119
- closed?: string;
120
- documents?: string;
121
- // Common
122
- task?: string;
123
- tasks?: string;
124
- changeColor?: string;
125
- deleteList?: string;
126
- gray?: string;
127
- red?: string;
128
- blue?: string;
129
- green?: string;
130
- yellow?: string;
131
- orange?: string;
132
- purple?: string;
133
- pink?: string;
134
- indigo?: string;
135
- cyan?: string;
136
- };
137
- }
138
-
139
- interface BoardLayoutSettingsProps extends BoardLayoutSettingsContentProps {
140
- open: boolean;
141
- onOpenChange: (open: boolean) => void;
142
- }
143
-
144
- const statusConfig = {
145
- not_started: {
146
- icon: CircleDashed,
147
- label: 'Backlog',
148
- color: 'text-dynamic-gray',
149
- bgColor: 'bg-dynamic-gray/10',
150
- borderColor: 'border-dynamic-gray/30',
151
- },
152
- active: {
153
- icon: Circle,
154
- label: 'Active',
155
- color: 'text-dynamic-blue',
156
- bgColor: 'bg-dynamic-blue/10',
157
- borderColor: 'border-dynamic-blue/30',
158
- },
159
- review: {
160
- icon: ClipboardCheck,
161
- label: 'Review',
162
- color: 'text-dynamic-orange',
163
- bgColor: 'bg-dynamic-orange/10',
164
- borderColor: 'border-dynamic-orange/30',
165
- },
166
- done: {
167
- icon: CircleCheck,
168
- label: 'Done',
169
- color: 'text-dynamic-green',
170
- bgColor: 'bg-dynamic-green/10',
171
- borderColor: 'border-dynamic-green/30',
172
- },
173
- closed: {
174
- icon: CircleX,
175
- label: 'Closed',
176
- color: 'text-dynamic-purple',
177
- bgColor: 'bg-dynamic-purple/10',
178
- borderColor: 'border-dynamic-purple/30',
179
- },
180
- documents: {
181
- icon: FileText,
182
- label: 'Documents',
183
- color: 'text-dynamic-cyan',
184
- bgColor: 'bg-dynamic-cyan/10',
185
- borderColor: 'border-dynamic-cyan/30',
186
- },
187
- };
188
-
189
- const colorClasses: Record<SupportedColor, string> = {
190
- GRAY: 'border-dynamic-gray/30 bg-dynamic-gray/10',
191
- RED: 'border-dynamic-red/30 bg-dynamic-red/10',
192
- BLUE: 'border-dynamic-blue/30 bg-dynamic-blue/10',
193
- GREEN: 'border-dynamic-green/30 bg-dynamic-green/10',
194
- YELLOW: 'border-dynamic-yellow/30 bg-dynamic-yellow/10',
195
- ORANGE: 'border-dynamic-orange/30 bg-dynamic-orange/10',
196
- PURPLE: 'border-dynamic-purple/30 bg-dynamic-purple/10',
197
- PINK: 'border-dynamic-pink/30 bg-dynamic-pink/10',
198
- INDIGO: 'border-dynamic-indigo/30 bg-dynamic-indigo/10',
199
- CYAN: 'border-dynamic-cyan/30 bg-dynamic-cyan/10',
200
- };
201
-
202
- interface SortableListItemProps {
203
- list: WorkspaceTaskList;
204
- taskCount: number;
205
- onEdit: (list: WorkspaceTaskList) => void;
206
- onDelete: (list: WorkspaceTaskList) => void;
207
- onColorChange: (listId: string, color: SupportedColor) => void;
208
- isDragging?: boolean;
209
- translations?: {
210
- task?: string;
211
- tasks?: string;
212
- changeColor?: string;
213
- editList?: string;
214
- deleteList?: string;
215
- backlog?: string;
216
- active?: string;
217
- review?: string;
218
- doneStatus?: string;
219
- closed?: string;
220
- documents?: string;
221
- gray?: string;
222
- red?: string;
223
- blue?: string;
224
- green?: string;
225
- yellow?: string;
226
- orange?: string;
227
- purple?: string;
228
- pink?: string;
229
- indigo?: string;
230
- cyan?: string;
231
- };
232
- }
233
-
234
- function SortableListItem({
235
- list,
236
- taskCount,
237
- onEdit,
238
- onDelete,
239
- onColorChange,
240
- isDragging,
241
- translations,
242
- }: SortableListItemProps) {
243
- const t = {
244
- task: translations?.task ?? 'task',
245
- tasks: translations?.tasks ?? 'tasks',
246
- changeColor: translations?.changeColor ?? 'Change Color',
247
- editList: translations?.editList ?? 'Edit List',
248
- deleteList: translations?.deleteList ?? 'Delete List',
249
- backlog: translations?.backlog ?? 'Backlog',
250
- active: translations?.active ?? 'Active',
251
- review: translations?.review ?? 'Review',
252
- doneStatus: translations?.doneStatus ?? 'Done',
253
- closed: translations?.closed ?? 'Closed',
254
- documents: translations?.documents ?? 'Documents',
255
- gray: translations?.gray ?? 'Gray',
256
- red: translations?.red ?? 'Red',
257
- blue: translations?.blue ?? 'Blue',
258
- green: translations?.green ?? 'Green',
259
- yellow: translations?.yellow ?? 'Yellow',
260
- orange: translations?.orange ?? 'Orange',
261
- purple: translations?.purple ?? 'Purple',
262
- pink: translations?.pink ?? 'Pink',
263
- indigo: translations?.indigo ?? 'Indigo',
264
- cyan: translations?.cyan ?? 'Cyan',
265
- };
266
-
267
- const statusLabels: Record<TaskBoardStatus, string> = {
268
- not_started: t.backlog,
269
- active: t.active,
270
- review: t.review,
271
- done: t.doneStatus,
272
- closed: t.closed,
273
- documents: t.documents,
274
- };
275
-
276
- const rawListName = list.name ?? '';
277
-
278
- const listDisplayName = translateTaskListNameForDisplay(rawListName, {
279
- toDo: statusLabels.not_started,
280
- inProgress: statusLabels.active,
281
- review: statusLabels.review,
282
- done: statusLabels.done,
283
- closed: statusLabels.closed,
284
- documents: statusLabels.documents,
285
- });
286
-
287
- const colorOptions = useMemo(
288
- () => [
289
- {
290
- value: 'GRAY' as SupportedColor,
291
- label: t.gray,
292
- class: 'bg-dynamic-gray/30',
293
- },
294
- {
295
- value: 'RED' as SupportedColor,
296
- label: t.red,
297
- class: 'bg-dynamic-red/30',
298
- },
299
- {
300
- value: 'BLUE' as SupportedColor,
301
- label: t.blue,
302
- class: 'bg-dynamic-blue/30',
303
- },
304
- {
305
- value: 'GREEN' as SupportedColor,
306
- label: t.green,
307
- class: 'bg-dynamic-green/30',
308
- },
309
- {
310
- value: 'YELLOW' as SupportedColor,
311
- label: t.yellow,
312
- class: 'bg-dynamic-yellow/30',
313
- },
314
- {
315
- value: 'ORANGE' as SupportedColor,
316
- label: t.orange,
317
- class: 'bg-dynamic-orange/30',
318
- },
319
- {
320
- value: 'PURPLE' as SupportedColor,
321
- label: t.purple,
322
- class: 'bg-dynamic-purple/30',
323
- },
324
- {
325
- value: 'PINK' as SupportedColor,
326
- label: t.pink,
327
- class: 'bg-dynamic-pink/30',
328
- },
329
- {
330
- value: 'INDIGO' as SupportedColor,
331
- label: t.indigo,
332
- class: 'bg-dynamic-indigo/30',
333
- },
334
- {
335
- value: 'CYAN' as SupportedColor,
336
- label: t.cyan,
337
- class: 'bg-dynamic-cyan/30',
338
- },
339
- ],
340
- [
341
- t.gray,
342
- t.red,
343
- t.blue,
344
- t.green,
345
- t.yellow,
346
- t.orange,
347
- t.purple,
348
- t.pink,
349
- t.indigo,
350
- t.cyan,
351
- ]
352
- );
353
-
354
- const {
355
- attributes,
356
- listeners,
357
- setNodeRef,
358
- transform,
359
- transition,
360
- isDragging: isSortableDragging,
361
- } = useSortable({ id: list.id });
362
-
363
- const style = {
364
- transform: CSS.Transform.toString(transform),
365
- transition,
366
- };
367
-
368
- const StatusIcon = list.status && statusConfig[list.status].icon;
369
- const listColor = (list.color as SupportedColor) || 'GRAY';
370
- const colorClass = colorClasses[listColor] || colorClasses.GRAY;
371
-
372
- return (
373
- <div
374
- ref={setNodeRef}
375
- style={style}
376
- className={cn(
377
- 'group flex items-center gap-3 rounded-lg border-l-4 bg-background p-3 transition-all',
378
- (isDragging || isSortableDragging) && 'opacity-50',
379
- 'hover:border-primary/50 hover:shadow-sm',
380
- colorClass
381
- )}
382
- >
383
- <button
384
- type="button"
385
- {...attributes}
386
- {...listeners}
387
- className="cursor-grab text-muted-foreground transition-colors hover:text-foreground active:cursor-grabbing"
388
- >
389
- <GripVertical className="h-4 w-4" />
390
- </button>
391
-
392
- <div className="flex min-w-0 flex-1 items-center gap-3">
393
- {list.status && StatusIcon && (
394
- <div
395
- className={cn(
396
- 'flex h-8 w-8 shrink-0 items-center justify-center rounded-md',
397
- statusConfig[list.status].bgColor
398
- )}
399
- >
400
- <StatusIcon
401
- className={cn('h-4 w-4', statusConfig[list.status].color)}
402
- />
403
- </div>
404
- )}
405
-
406
- <div className="min-w-0 flex-1">
407
- <div className="flex items-center gap-2">
408
- <span className="truncate font-medium text-sm">
409
- {listDisplayName}
410
- </span>
411
- <Badge variant="secondary" className="shrink-0 text-[10px]">
412
- {taskCount} {taskCount === 1 ? t.task : t.tasks}
413
- </Badge>
414
- </div>
415
- </div>
416
- </div>
417
-
418
- <DropdownMenu>
419
- <DropdownMenuTrigger asChild>
420
- <Button
421
- variant="ghost"
422
- size="icon"
423
- className="h-8 w-8 opacity-0 transition-opacity group-hover:opacity-100"
424
- >
425
- <MoreVertical className="h-4 w-4" />
426
- </Button>
427
- </DropdownMenuTrigger>
428
- <DropdownMenuContent align="end" className="w-48">
429
- <div className="px-2 py-1 font-medium text-muted-foreground text-xs">
430
- {t.changeColor}
431
- </div>
432
- <div className="grid grid-cols-5 gap-1 p-2">
433
- {colorOptions.map((color) => (
434
- <button
435
- type="button"
436
- key={color.value}
437
- onClick={() => onColorChange(list.id, color.value)}
438
- className={cn(
439
- 'h-6 w-6 rounded border-2 transition-all',
440
- color.class,
441
- listColor === color.value && 'scale-110 ring-2 ring-primary'
442
- )}
443
- title={color.label}
444
- />
445
- ))}
446
- </div>
447
- <DropdownMenuSeparator />
448
- <DropdownMenuItem onClick={() => onEdit(list)} className="gap-2">
449
- <Pencil className="h-4 w-4" />
450
- {t.editList}
451
- </DropdownMenuItem>
452
- <DropdownMenuSeparator />
453
- <DropdownMenuItem
454
- onClick={() => onDelete(list)}
455
- className="gap-2 text-dynamic-red/80 focus:text-dynamic-red"
456
- >
457
- <Trash2 className="h-4 w-4" />
458
- {t.deleteList}
459
- </DropdownMenuItem>
460
- </DropdownMenuContent>
461
- </DropdownMenu>
462
- </div>
463
- );
464
- }
465
-
466
- export function BoardLayoutSettingsContent({
467
- boardId,
468
- wsId,
469
- lists,
470
- onUpdate,
471
- disableScrollArea = false,
472
- scrollAreaClassName,
473
- translations,
474
- }: BoardLayoutSettingsContentProps) {
475
- const t = useMemo(
476
- () => ({
477
- boardLayoutSettings:
478
- translations?.boardLayoutSettings ?? 'Board Layout Settings',
479
- boardLayoutSettingsDescription:
480
- translations?.boardLayoutSettingsDescription ??
481
- 'Manage your board columns and organize them by status. Drag to reorder within each status group.',
482
- addNewList: translations?.addNewList ?? 'Add New List',
483
- noListsInStatus:
484
- translations?.noListsInStatus ?? 'No lists in this status',
485
- done: translations?.done ?? 'Done',
486
- editList: translations?.editList ?? 'Edit List',
487
- updateListDescription:
488
- translations?.updateListDescription ??
489
- 'Update the list name and status category.',
490
- listName: translations?.listName ?? 'List Name',
491
- statusCategory: translations?.statusCategory ?? 'Status Category',
492
- color: translations?.color ?? 'Color',
493
- cancel: translations?.cancel ?? 'Cancel',
494
- saving: translations?.saving ?? 'Saving...',
495
- saveChanges: translations?.saveChanges ?? 'Save Changes',
496
- deleteListTitle: translations?.deleteListTitle ?? 'Delete List?',
497
- deleteListDescription:
498
- translations?.deleteListDescription ??
499
- 'Are you sure you want to delete this list? All tasks in this list will also be deleted. This action cannot be undone.',
500
- deleteListConfirm: translations?.deleteListConfirm ?? 'Delete List',
501
- listUpdatedSuccessfully:
502
- translations?.listUpdatedSuccessfully ?? 'List updated successfully',
503
- failedToUpdateList:
504
- translations?.failedToUpdateList ?? 'Failed to update list',
505
- listNameAlreadyExists:
506
- translations?.listNameAlreadyExists ??
507
- 'A list with this name already exists on this board',
508
- colorUpdated: translations?.colorUpdated ?? 'Color updated',
509
- failedToUpdateColor:
510
- translations?.failedToUpdateColor ?? 'Failed to update color',
511
- listDeletedSuccessfully:
512
- translations?.listDeletedSuccessfully ?? 'List deleted successfully',
513
- failedToDeleteList:
514
- translations?.failedToDeleteList ?? 'Failed to delete list',
515
- cannotMoveToClosedStatus:
516
- translations?.cannotMoveToClosedStatus ??
517
- 'Cannot move lists to or from closed status',
518
- listsReordered: translations?.listsReordered ?? 'Lists reordered',
519
- failedToReorderLists:
520
- translations?.failedToReorderLists ?? 'Failed to reorder lists',
521
- movedToStatus: translations?.movedToStatus ?? 'Moved to {status}',
522
- // Status labels
523
- backlog: translations?.backlog ?? 'Backlog',
524
- active: translations?.active ?? 'Active',
525
- review: translations?.review ?? 'Review',
526
- doneStatus: translations?.doneStatus ?? 'Done',
527
- closed: translations?.closed ?? 'Closed',
528
- documents: translations?.documents ?? 'Documents',
529
- // Common
530
- task: translations?.task ?? 'task',
531
- tasks: translations?.tasks ?? 'tasks',
532
- changeColor: translations?.changeColor ?? 'Change Color',
533
- deleteList: translations?.deleteList ?? 'Delete List',
534
- gray: translations?.gray ?? 'Gray',
535
- red: translations?.red ?? 'Red',
536
- blue: translations?.blue ?? 'Blue',
537
- green: translations?.green ?? 'Green',
538
- yellow: translations?.yellow ?? 'Yellow',
539
- orange: translations?.orange ?? 'Orange',
540
- purple: translations?.purple ?? 'Purple',
541
- pink: translations?.pink ?? 'Pink',
542
- indigo: translations?.indigo ?? 'Indigo',
543
- cyan: translations?.cyan ?? 'Cyan',
544
- }),
545
- [translations]
546
- );
547
-
548
- const statusLabels: Record<TaskBoardStatus, string> = useMemo(
549
- () => ({
550
- not_started: t.backlog,
551
- active: t.active,
552
- review: t.review,
553
- done: t.doneStatus,
554
- closed: t.closed,
555
- documents: t.documents,
556
- }),
557
- [t]
558
- );
559
- const queryClient = useQueryClient();
560
- const [editingList, setEditingList] = useState<WorkspaceTaskList | null>(
561
- null
562
- );
563
- const [deletingList, setDeletingList] = useState<WorkspaceTaskList | null>(
564
- null
565
- );
566
- const [creatingList, setCreatingList] = useState(false);
567
- const [createListStatus, setCreateListStatus] =
568
- useState<TaskBoardStatus>('active');
569
-
570
- // Broadcast for realtime sync with other clients
571
- const contextBroadcast = useBoardBroadcast();
572
- const broadcast = contextBroadcast ?? getActiveBroadcast();
573
-
574
- // Group lists by status
575
- const groupedLists = lists.reduce(
576
- (acc, list) => {
577
- if (!list.status) return acc;
578
- if (!acc[list.status]) {
579
- acc[list.status] = [];
580
- }
581
- acc[list.status].push(list);
582
- return acc;
583
- },
584
- {} as Record<TaskBoardStatus, WorkspaceTaskList[]>
585
- );
586
-
587
- const sensors = useSensors(
588
- useSensor(PointerSensor),
589
- useSensor(KeyboardSensor, {
590
- coordinateGetter: sortableKeyboardCoordinates,
591
- })
592
- );
593
-
594
- const updateListMutation = useMutation({
595
- mutationFn: async ({
596
- listId,
597
- updates,
598
- }: {
599
- listId: string;
600
- updates: Partial<WorkspaceTaskList>;
601
- }) => {
602
- if (!wsId) throw new Error('Workspace ID is required');
603
- await updateWorkspaceTaskList(wsId, boardId, listId, {
604
- name: updates.name ?? undefined,
605
- status: updates.status ?? undefined,
606
- color: (updates.color as SupportedColor | undefined) ?? undefined,
607
- position: updates.position ?? undefined,
608
- deleted: updates.deleted ?? undefined,
609
- });
610
- },
611
- onMutate: async ({ listId, updates }) => {
612
- await queryClient.cancelQueries({ queryKey: ['task_lists', boardId] });
613
- const previous = queryClient.getQueryData<WorkspaceTaskList[]>([
614
- 'task_lists',
615
- boardId,
616
- ]);
617
- queryClient.setQueryData(
618
- ['task_lists', boardId],
619
- (old: WorkspaceTaskList[] | undefined) => {
620
- if (!old) return old;
621
- return old.map((l) => (l.id === listId ? { ...l, ...updates } : l));
622
- }
623
- );
624
- return { previous };
625
- },
626
- onSuccess: (_, { listId, updates }) => {
627
- toast.success(t.listUpdatedSuccessfully);
628
- broadcast?.('list:upsert', { list: { id: listId, ...updates } });
629
- setEditingList(null);
630
- onUpdate();
631
- },
632
- onError: (error: unknown, _, context) => {
633
- if (context?.previous) {
634
- queryClient.setQueryData(['task_lists', boardId], context.previous);
635
- }
636
- toast.error(
637
- isTaskListNameExistsError(error)
638
- ? t.listNameAlreadyExists
639
- : error instanceof Error
640
- ? error.message
641
- : t.failedToUpdateList
642
- );
643
- },
644
- });
645
-
646
- const updateColorMutation = useMutation({
647
- mutationFn: async ({
648
- listId,
649
- color,
650
- }: {
651
- listId: string;
652
- color: SupportedColor;
653
- }) => {
654
- if (!wsId) throw new Error('Workspace ID is required');
655
- await updateWorkspaceTaskList(wsId, boardId, listId, { color });
656
- },
657
- onMutate: async ({ listId, color }) => {
658
- await queryClient.cancelQueries({ queryKey: ['task_lists', boardId] });
659
- const previous = queryClient.getQueryData<WorkspaceTaskList[]>([
660
- 'task_lists',
661
- boardId,
662
- ]);
663
- queryClient.setQueryData(
664
- ['task_lists', boardId],
665
- (old: WorkspaceTaskList[] | undefined) => {
666
- if (!old) return old;
667
- return old.map((l) => (l.id === listId ? { ...l, color } : l));
668
- }
669
- );
670
- return { previous };
671
- },
672
- onSuccess: (_, { listId, color }) => {
673
- toast.success(t.colorUpdated);
674
- broadcast?.('list:upsert', { list: { id: listId, color } });
675
- onUpdate();
676
- },
677
- onError: (error: unknown, _, context) => {
678
- if (context?.previous) {
679
- queryClient.setQueryData(['task_lists', boardId], context.previous);
680
- }
681
- toast.error(
682
- error instanceof Error ? error.message : t.failedToUpdateColor
683
- );
684
- },
685
- });
686
-
687
- const deleteListMutation = useMutation({
688
- mutationFn: async (listId: string) => {
689
- if (!wsId) throw new Error('Workspace ID is required');
690
- await updateWorkspaceTaskList(wsId, boardId, listId, { deleted: true });
691
- },
692
- onMutate: async (listId) => {
693
- await Promise.all([
694
- queryClient.cancelQueries({ queryKey: ['task_lists', boardId] }),
695
- queryClient.cancelQueries({ queryKey: ['tasks', boardId] }),
696
- ]);
697
-
698
- const previousLists = queryClient.getQueryData<WorkspaceTaskList[]>([
699
- 'task_lists',
700
- boardId,
701
- ]);
702
- const previousTasks = queryClient.getQueryData<Task[]>([
703
- 'tasks',
704
- boardId,
705
- ]);
706
-
707
- queryClient.setQueryData(
708
- ['task_lists', boardId],
709
- (old: WorkspaceTaskList[] | undefined) => {
710
- if (!old) return old;
711
- return old.filter((list) => list.id !== listId);
712
- }
713
- );
714
- queryClient.setQueryData(
715
- ['tasks', boardId],
716
- (old: Task[] | undefined) => {
717
- if (!old) return old;
718
- return old.filter((task) => task.list_id !== listId);
719
- }
720
- );
721
-
722
- return { previousLists, previousTasks };
723
- },
724
- onSuccess: (_, listId) => {
725
- toast.success(t.listDeletedSuccessfully);
726
- broadcast?.('list:delete', { listId });
727
- setDeletingList(null);
728
- onUpdate();
729
- },
730
- onError: (error: any, _, context) => {
731
- if (context?.previousLists) {
732
- queryClient.setQueryData(
733
- ['task_lists', boardId],
734
- context.previousLists
735
- );
736
- }
737
- if (context?.previousTasks) {
738
- queryClient.setQueryData(['tasks', boardId], context.previousTasks);
739
- }
740
- toast.error(error.message || t.failedToDeleteList);
741
- },
742
- });
743
-
744
- const handleDragEnd = useCallback(
745
- async (event: DragEndEvent) => {
746
- const { active, over } = event;
747
-
748
- if (!over || active.id === over.id) return;
749
-
750
- // Find the dragged list
751
- const draggedList = lists.find((l) => l.id === active.id);
752
- if (!draggedList) return;
753
-
754
- // Find which status the target belongs to
755
- let targetStatus: TaskBoardStatus | null = null;
756
-
757
- for (const [s, statusLists] of Object.entries(groupedLists)) {
758
- const found = statusLists.find((l) => l.id === over.id);
759
- if (found) {
760
- targetStatus = s as TaskBoardStatus;
761
- break;
762
- }
763
- }
764
-
765
- if (!targetStatus) return;
766
-
767
- // Prevent moving to/from closed status
768
- if (draggedList.status === 'closed' || targetStatus === 'closed') {
769
- toast.error(t.cannotMoveToClosedStatus);
770
- return;
771
- }
772
-
773
- // Store snapshot for rollback
774
- const previousLists = queryClient.getQueryData<WorkspaceTaskList[]>([
775
- 'task_lists',
776
- boardId,
777
- ]);
778
-
779
- // Check if moving within same status or across statuses
780
- if (draggedList.status === targetStatus) {
781
- // Same status - reorder
782
- const statusLists = groupedLists[targetStatus] || [];
783
- const oldIndex = statusLists.findIndex((l) => l.id === active.id);
784
- const newIndex = statusLists.findIndex((l) => l.id === over.id);
785
-
786
- if (oldIndex === -1 || newIndex === -1) return;
787
-
788
- const newOrder = arrayMove(statusLists, oldIndex, newIndex);
789
-
790
- // Optimistically update
791
- queryClient.setQueryData(
792
- ['task_lists', boardId],
793
- (oldData: WorkspaceTaskList[] | undefined) => {
794
- if (!oldData) return oldData;
795
- return oldData.map((list) => {
796
- const newPos = newOrder.findIndex((l) => l.id === list.id);
797
- return newPos !== -1 ? { ...list, position: newPos } : list;
798
- });
799
- }
800
- );
801
-
802
- // Persist changes
803
- try {
804
- if (!wsId) throw new Error('Workspace ID is required');
805
- await Promise.all(
806
- newOrder.map((list, index) =>
807
- updateWorkspaceTaskList(wsId, boardId, list.id, {
808
- position: index,
809
- })
810
- )
811
- );
812
- toast.success(t.listsReordered);
813
- } catch (error) {
814
- console.error('Failed to reorder lists:', error);
815
- toast.error(t.failedToReorderLists);
816
- if (previousLists) {
817
- queryClient.setQueryData(['task_lists', boardId], previousLists);
818
- } else {
819
- queryClient.invalidateQueries({
820
- queryKey: ['task_lists', boardId],
821
- });
822
- }
823
- }
824
- } else {
825
- // Cross-status move
826
- const targetStatusLists = (groupedLists[targetStatus] || []).sort(
827
- (a, b) => (a?.position || 0) - (b?.position || 0)
828
- );
829
-
830
- // Find insertion position
831
- const insertIndex = targetStatusLists.findIndex(
832
- (l) => l.id === over.id
833
- );
834
-
835
- let newPosition: number;
836
- if (insertIndex === 0) {
837
- // Insert at beginning
838
- newPosition = (targetStatusLists[0]?.position || 0) - 1;
839
- } else if (insertIndex > 0) {
840
- // Insert between
841
- const prevPos = targetStatusLists[insertIndex - 1]?.position || 0;
842
- const nextPos = targetStatusLists[insertIndex]?.position || 0;
843
- newPosition = (prevPos + nextPos) / 2;
844
- } else {
845
- // Append to end
846
- newPosition =
847
- Math.max(0, ...targetStatusLists.map((l) => l.position || 0)) + 1;
848
- }
849
-
850
- // Optimistically update
851
- queryClient.setQueryData(
852
- ['task_lists', boardId],
853
- (oldData: WorkspaceTaskList[] | undefined) => {
854
- if (!oldData) return oldData;
855
- return oldData.map((list) =>
856
- list.id === draggedList.id
857
- ? { ...list, status: targetStatus, position: newPosition }
858
- : list
859
- );
860
- }
861
- );
862
-
863
- // Persist to database
864
- try {
865
- if (!wsId) throw new Error('Workspace ID is required');
866
- await updateWorkspaceTaskList(wsId, boardId, draggedList.id, {
867
- status: targetStatus,
868
- position: newPosition,
869
- });
870
- toast.success(
871
- t.movedToStatus.replace('{status}', statusLabels[targetStatus])
872
- );
873
- } catch (error) {
874
- console.error('Failed to move list:', error);
875
- toast.error(t.failedToUpdateList);
876
- if (previousLists) {
877
- queryClient.setQueryData(['task_lists', boardId], previousLists);
878
- } else {
879
- queryClient.invalidateQueries({
880
- queryKey: ['task_lists', boardId],
881
- });
882
- }
883
- }
884
- }
885
- },
886
- [boardId, groupedLists, lists, queryClient, statusLabels, t, wsId]
887
- );
888
-
889
- const handleColorChange = (listId: string, color: SupportedColor) => {
890
- updateColorMutation.mutate({ listId, color });
891
- };
892
-
893
- const statuses = useMemo<TaskBoardStatus[]>(
894
- () => ['documents', 'not_started', 'active', 'review', 'done', 'closed'],
895
- []
896
- );
897
-
898
- const openCreateListDialog = useCallback((status: TaskBoardStatus) => {
899
- setCreateListStatus(status);
900
- setCreatingList(true);
901
- }, []);
902
-
903
- const listGroups = (
904
- <DndContext
905
- sensors={sensors}
906
- collisionDetection={closestCenter}
907
- onDragEnd={handleDragEnd}
908
- >
909
- <div className="space-y-6">
910
- {statuses.map((status) => {
911
- const StatusIcon = statusConfig[status].icon;
912
- const statusLists = (groupedLists[status] || []).sort(
913
- (a, b) => (a?.position || 0) - (b?.position || 0)
914
- );
915
-
916
- return (
917
- <div key={status} className="space-y-3">
918
- <div className="flex items-center justify-between gap-3">
919
- <div className="flex items-center gap-2">
920
- <div
921
- className={cn(
922
- 'flex h-6 w-6 items-center justify-center rounded',
923
- statusConfig[status].bgColor
924
- )}
925
- >
926
- <StatusIcon
927
- className={cn('h-3.5 w-3.5', statusConfig[status].color)}
928
- />
929
- </div>
930
- <h3 className="font-semibold text-sm">
931
- {statusLabels[status]}
932
- </h3>
933
- <Badge variant="secondary" className="text-[10px]">
934
- {statusLists.length}
935
- </Badge>
936
- </div>
937
- <Button
938
- variant="ghost"
939
- size="sm"
940
- className="h-8 gap-1.5 px-2 text-muted-foreground hover:text-foreground"
941
- onClick={() => openCreateListDialog(status)}
942
- >
943
- <Plus className="h-3.5 w-3.5" />
944
- {t.addNewList}
945
- </Button>
946
- </div>
947
-
948
- {statusLists.length === 0 ? (
949
- <div className="rounded-lg border-2 border-dashed p-4 text-center">
950
- <p className="text-muted-foreground text-sm">
951
- {t.noListsInStatus}
952
- </p>
953
- <Button
954
- variant="outline"
955
- size="sm"
956
- className="mt-3 gap-1.5"
957
- onClick={() => openCreateListDialog(status)}
958
- >
959
- <Plus className="h-3.5 w-3.5" />
960
- {t.addNewList}
961
- </Button>
962
- </div>
963
- ) : (
964
- <SortableContext
965
- items={statusLists.map((l) => l.id)}
966
- strategy={verticalListSortingStrategy}
967
- >
968
- <div className="space-y-2">
969
- {statusLists.map((list) => (
970
- <SortableListItem
971
- key={list.id}
972
- list={list}
973
- taskCount={0}
974
- onEdit={setEditingList}
975
- onDelete={setDeletingList}
976
- onColorChange={handleColorChange}
977
- translations={{
978
- task: t.task,
979
- tasks: t.tasks,
980
- changeColor: t.changeColor,
981
- editList: t.editList,
982
- deleteList: t.deleteList,
983
- backlog: t.backlog,
984
- active: t.active,
985
- review: t.review,
986
- doneStatus: t.doneStatus,
987
- closed: t.closed,
988
- documents: t.documents,
989
- gray: t.gray,
990
- red: t.red,
991
- blue: t.blue,
992
- green: t.green,
993
- yellow: t.yellow,
994
- orange: t.orange,
995
- purple: t.purple,
996
- pink: t.pink,
997
- indigo: t.indigo,
998
- cyan: t.cyan,
999
- }}
1000
- />
1001
- ))}
1002
- </div>
1003
- </SortableContext>
1004
- )}
1005
- </div>
1006
- );
1007
- })}
1008
- </div>
1009
- </DndContext>
1010
- );
1011
-
1012
- return (
1013
- <>
1014
- <div className="space-y-6">
1015
- {/* Lists by Status */}
1016
- {disableScrollArea ? (
1017
- <div className={scrollAreaClassName}>{listGroups}</div>
1018
- ) : (
1019
- <ScrollArea className={cn('h-125 pr-4', scrollAreaClassName)}>
1020
- {listGroups}
1021
- </ScrollArea>
1022
- )}
1023
- </div>
1024
-
1025
- {/* Create List Dialog */}
1026
- <CreateListDialog
1027
- open={creatingList}
1028
- onOpenChange={setCreatingList}
1029
- boardId={boardId}
1030
- wsId={wsId}
1031
- initialStatus={createListStatus}
1032
- onSuccess={() => {
1033
- onUpdate();
1034
- }}
1035
- translations={{
1036
- listNameAlreadyExists: t.listNameAlreadyExists,
1037
- }}
1038
- />
1039
-
1040
- <EditListDialog
1041
- open={!!editingList}
1042
- onOpenChange={(nextOpen) => {
1043
- if (!nextOpen) {
1044
- setEditingList(null);
1045
- }
1046
- }}
1047
- list={
1048
- editingList
1049
- ? {
1050
- id: editingList.id,
1051
- name: editingList.name ?? '',
1052
- status: editingList.status,
1053
- color: (editingList.color as SupportedColor | null) ?? null,
1054
- }
1055
- : null
1056
- }
1057
- isSaving={updateListMutation.isPending}
1058
- onSave={({ listId, updates }) => {
1059
- updateListMutation.mutate({ listId, updates });
1060
- }}
1061
- />
1062
-
1063
- {/* Delete Confirmation Dialog */}
1064
- <AlertDialog
1065
- open={!!deletingList}
1066
- onOpenChange={() => setDeletingList(null)}
1067
- >
1068
- <AlertDialogContent>
1069
- <AlertDialogHeader>
1070
- <AlertDialogTitle>{t.deleteListTitle}</AlertDialogTitle>
1071
- <AlertDialogDescription>
1072
- {t.deleteListDescription.replace(
1073
- '{name}',
1074
- deletingList?.name || ''
1075
- )}
1076
- </AlertDialogDescription>
1077
- </AlertDialogHeader>
1078
- <AlertDialogFooter>
1079
- <AlertDialogCancel disabled={deleteListMutation.isPending}>
1080
- {t.cancel}
1081
- </AlertDialogCancel>
1082
- <AlertDialogAction
1083
- onClick={() => {
1084
- if (deletingList) {
1085
- deleteListMutation.mutate(deletingList.id);
1086
- }
1087
- }}
1088
- disabled={deleteListMutation.isPending}
1089
- className="bg-dynamic-red/90 text-white hover:bg-dynamic-red"
1090
- >
1091
- {deleteListMutation.isPending ? t.saving : t.deleteListConfirm}
1092
- </AlertDialogAction>
1093
- </AlertDialogFooter>
1094
- </AlertDialogContent>
1095
- </AlertDialog>
1096
- </>
1097
- );
1098
- }
1099
-
1100
- export function BoardLayoutSettings({
1101
- open,
1102
- onOpenChange,
1103
- translations,
1104
- ...contentProps
1105
- }: BoardLayoutSettingsProps) {
1106
- const title = translations?.boardLayoutSettings ?? 'Board Layout Settings';
1107
- const description =
1108
- translations?.boardLayoutSettingsDescription ??
1109
- 'Manage your board columns and organize them by status. Drag to reorder within each status group.';
1110
- const done = translations?.done ?? 'Done';
1111
-
1112
- return (
1113
- <Dialog open={open} onOpenChange={onOpenChange}>
1114
- <DialogContent className="max-w-3xl">
1115
- <DialogHeader>
1116
- <DialogTitle>{title}</DialogTitle>
1117
- <DialogDescription>{description}</DialogDescription>
1118
- </DialogHeader>
1119
-
1120
- <BoardLayoutSettingsContent
1121
- {...contentProps}
1122
- scrollAreaClassName="h-125 pr-4"
1123
- translations={translations}
1124
- />
1125
-
1126
- <DialogFooter>
1127
- <Button variant="outline" onClick={() => onOpenChange(false)}>
1128
- {done}
1129
- </Button>
1130
- </DialogFooter>
1131
- </DialogContent>
1132
- </Dialog>
1133
- );
1134
- }