@tuturuuu/ui 0.16.0 → 0.18.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 (597) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/biome.json +1 -1
  3. package/package.json +78 -119
  4. package/src/components/ui/calendar-app/calendar-client-page.tsx +12 -3
  5. package/src/components/ui/calendar-app/calendar-page-shell.tsx +38 -28
  6. package/src/components/ui/custom/notification-popover-client.tsx +3 -3
  7. package/src/components/ui/storefront/browse-panel.tsx +161 -0
  8. package/src/components/ui/storefront/bundle-selection-dialog.tsx +1 -1
  9. package/src/components/ui/storefront/cart-popover.tsx +1 -1
  10. package/src/components/ui/storefront/hero-panel.tsx +35 -30
  11. package/src/components/ui/storefront/listing-card.tsx +10 -5
  12. package/src/components/ui/storefront/merch-sections.tsx +7 -5
  13. package/src/components/ui/storefront/product-detail.tsx +79 -6
  14. package/src/components/ui/storefront/product-dialog.tsx +5 -1
  15. package/src/components/ui/storefront/storefront-surface.test.tsx +72 -0
  16. package/src/components/ui/storefront/storefront-surface.tsx +67 -63
  17. package/src/components/ui/storefront/types.ts +28 -0
  18. package/src/components/ui/storefront/utils.ts +4 -5
  19. package/src/components/ui/tasks/progress/activity-heatmap.tsx +256 -0
  20. package/src/components/ui/tasks/progress/breakdown-bars.tsx +79 -0
  21. package/src/components/ui/tasks/progress/cumulative-progress-chart.tsx +185 -0
  22. package/src/components/ui/tasks/progress/daily-bar-chart.tsx +97 -0
  23. package/src/components/ui/tasks/progress/habit-gauge.tsx +92 -0
  24. package/src/components/ui/tasks/progress/mini-sparkline.tsx +56 -0
  25. package/src/components/ui/tasks/progress/weekday-distribution-chart.tsx +72 -0
  26. package/src/components/ui/text-editor/editor.tsx +7 -1
  27. package/src/components/ui/text-editor/extensions.ts +4 -1
  28. package/src/components/ui/text-editor/mention-extension.tsx +33 -121
  29. package/src/globals.css +1 -0
  30. package/src/lib/workspace-actions.ts +15 -4
  31. package/src/components/ui/calendar-app/components/actions-dropdown.tsx +0 -269
  32. package/src/components/ui/calendar-app/components/auto-schedule-comprehensive-dialog.tsx +0 -220
  33. package/src/components/ui/calendar-app/components/calendar-header-actions.tsx +0 -67
  34. package/src/components/ui/calendar-app/components/experimental-feature-dialog.tsx +0 -56
  35. package/src/components/ui/calendar-app/components/habits-panel.tsx +0 -335
  36. package/src/components/ui/calendar-app/components/load-smart-scheduling-tasks.tsx +0 -143
  37. package/src/components/ui/calendar-app/components/priority-dropdown.tsx +0 -113
  38. package/src/components/ui/calendar-app/components/priority-view.tsx +0 -954
  39. package/src/components/ui/calendar-app/components/quick-task-dialog.tsx +0 -335
  40. package/src/components/ui/calendar-app/components/quick-task-timer.tsx +0 -112
  41. package/src/components/ui/calendar-app/components/scheduling-dialog.tsx +0 -664
  42. package/src/components/ui/calendar-app/components/sidebar/calendar-sidebar.tsx +0 -128
  43. package/src/components/ui/calendar-app/components/sidebar/index.tsx +0 -1
  44. package/src/components/ui/calendar-app/components/smart-schedule-button.tsx +0 -117
  45. package/src/components/ui/calendar-app/components/smart-schedule-preview-dialog.tsx +0 -845
  46. package/src/components/ui/calendar-app/components/smart-schedule-preview-panel.tsx +0 -941
  47. package/src/components/ui/calendar-app/components/task-fetcher.ts +0 -51
  48. package/src/components/ui/calendar-app/components/task-form.tsx +0 -132
  49. package/src/components/ui/calendar-app/components/task-list-form.tsx +0 -84
  50. package/src/components/ui/calendar-app/components/task-scheduler-panel.tsx +0 -494
  51. package/src/components/ui/calendar-app/components/tasks-sidebar-content.tsx +0 -232
  52. package/src/components/ui/calendar-app/components/tasks-sidebar.tsx +0 -31
  53. package/src/components/ui/calendar-app/components/time-tracker/components/active-session-card.tsx +0 -113
  54. package/src/components/ui/calendar-app/components/time-tracker/components/index.ts +0 -3
  55. package/src/components/ui/calendar-app/components/time-tracker/components/session-card.tsx +0 -153
  56. package/src/components/ui/calendar-app/components/time-tracker/components/stats-cards.tsx +0 -58
  57. package/src/components/ui/calendar-app/components/time-tracker/dialogs/create-task-dialog.tsx +0 -190
  58. package/src/components/ui/calendar-app/components/time-tracker/dialogs/delete-session-dialog.tsx +0 -52
  59. package/src/components/ui/calendar-app/components/time-tracker/dialogs/edit-session-dialog.tsx +0 -173
  60. package/src/components/ui/calendar-app/components/time-tracker/dialogs/index.ts +0 -3
  61. package/src/components/ui/calendar-app/components/time-tracker/hooks/index.ts +0 -2
  62. package/src/components/ui/calendar-app/components/time-tracker/hooks/use-sessions.ts +0 -191
  63. package/src/components/ui/calendar-app/components/time-tracker/hooks/use-time-tracker.ts +0 -408
  64. package/src/components/ui/calendar-app/components/time-tracker/index.tsx +0 -907
  65. package/src/components/ui/calendar-app/components/time-tracker/tabs/history-tab.tsx +0 -28
  66. package/src/components/ui/calendar-app/components/time-tracker/tabs/index.ts +0 -2
  67. package/src/components/ui/calendar-app/components/time-tracker/tabs/recent-sessions-tab.tsx +0 -173
  68. package/src/components/ui/calendar-app/components/time-tracker/time-tracker-trigger.tsx +0 -50
  69. package/src/components/ui/calendar-app/components/time-tracker/utils/category-colors.ts +0 -38
  70. package/src/components/ui/calendar-app/components/time-tracker/utils/format-time.ts +0 -26
  71. package/src/components/ui/calendar-app/components/time-tracker/utils/index.ts +0 -2
  72. package/src/components/ui/calendar-app/components/time-tracker.tsx +0 -2040
  73. package/src/components/ui/custom/settings/task-settings.tsx +0 -543
  74. package/src/components/ui/custom/settings/task-sound-settings.test.tsx +0 -146
  75. package/src/components/ui/text-editor/__tests__/task-mention-chip.test.tsx +0 -476
  76. package/src/components/ui/text-editor/task-mention-chip.tsx +0 -1397
  77. package/src/components/ui/text-editor/task-mention-resolution.ts +0 -235
  78. package/src/components/ui/text-editor/task-summary-popover.tsx +0 -360
  79. package/src/components/ui/tu-do/boards/__tests__/board-share-dialog.test.tsx +0 -286
  80. package/src/components/ui/tu-do/boards/__tests__/quick-create-board-dialog.test.tsx +0 -52
  81. package/src/components/ui/tu-do/boards/__tests__/task-board-form.test.tsx +0 -142
  82. package/src/components/ui/tu-do/boards/__tests__/workspace-projects-client-page.test.tsx +0 -169
  83. package/src/components/ui/tu-do/boards/analytics/GanttChart.tsx +0 -419
  84. package/src/components/ui/tu-do/boards/analytics/GanttControls.tsx +0 -123
  85. package/src/components/ui/tu-do/boards/analytics/GanttHeader.tsx +0 -48
  86. package/src/components/ui/tu-do/boards/analytics/GanttTimeline.tsx +0 -355
  87. package/src/components/ui/tu-do/boards/analytics/StatusDistribution.tsx +0 -130
  88. package/src/components/ui/tu-do/boards/analytics/TaskCreationAnalytics.tsx +0 -285
  89. package/src/components/ui/tu-do/boards/analytics/TaskDetailCard.tsx +0 -270
  90. package/src/components/ui/tu-do/boards/analytics/TaskGroup.tsx +0 -282
  91. package/src/components/ui/tu-do/boards/analytics/TaskWorkflowAnalytics.tsx +0 -280
  92. package/src/components/ui/tu-do/boards/board-public-link-section.tsx +0 -231
  93. package/src/components/ui/tu-do/boards/board-selector.tsx +0 -301
  94. package/src/components/ui/tu-do/boards/board-share-dialog.tsx +0 -69
  95. package/src/components/ui/tu-do/boards/board-share-settings-panel.tsx +0 -351
  96. package/src/components/ui/tu-do/boards/boardId/__tests__/list-actions.test.tsx +0 -199
  97. package/src/components/ui/tu-do/boards/boardId/board-column-external-retry.test.tsx +0 -127
  98. package/src/components/ui/tu-do/boards/boardId/board-column-initial-load.test.ts +0 -38
  99. package/src/components/ui/tu-do/boards/boardId/board-column.tsx +0 -893
  100. package/src/components/ui/tu-do/boards/boardId/board-text-utils.test.ts +0 -24
  101. package/src/components/ui/tu-do/boards/boardId/board-text-utils.ts +0 -11
  102. package/src/components/ui/tu-do/boards/boardId/enhanced-task-list.tsx +0 -543
  103. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/__tests__/bulk-mutations-external-workspaces.test.tsx +0 -392
  104. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/__tests__/bulk-mutations-move.test.tsx +0 -252
  105. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-actions-island.test.tsx +0 -57
  106. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-actions-island.tsx +0 -106
  107. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-actions-menu.tsx +0 -689
  108. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-custom-date-dialog.tsx +0 -82
  109. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-delete-dialog.tsx +0 -58
  110. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-clear-delete.ts +0 -418
  111. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-move.ts +0 -662
  112. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations-assignees.ts +0 -375
  113. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations-labels.ts +0 -278
  114. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations-projects.ts +0 -297
  115. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-relations.ts +0 -12
  116. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-mutations-updates.ts +0 -462
  117. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operation-i18n.ts +0 -524
  118. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operation-types.ts +0 -34
  119. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operation-utils.ts +0 -377
  120. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-operations.ts +0 -348
  121. package/src/components/ui/tu-do/boards/boardId/kanban/bulk/bulk-personal-external-move.ts +0 -132
  122. package/src/components/ui/tu-do/boards/boardId/kanban/data/kanban-deadline-query.ts +0 -90
  123. package/src/components/ui/tu-do/boards/boardId/kanban/data/use-applied-sets.ts +0 -79
  124. package/src/components/ui/tu-do/boards/boardId/kanban/data/use-bulk-resources.ts +0 -112
  125. package/src/components/ui/tu-do/boards/boardId/kanban/data/use-filtered-resources.ts +0 -54
  126. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/__tests__/column-reorder.test.ts +0 -80
  127. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/auto-scroll.test.ts +0 -118
  128. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/auto-scroll.ts +0 -160
  129. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/column-reorder.ts +0 -65
  130. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/drag-preview.tsx +0 -117
  131. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/kanban-sort-helpers.ts +0 -76
  132. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-cache.ts +0 -367
  133. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-geometry.test.ts +0 -67
  134. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-geometry.ts +0 -94
  135. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-order.ts +0 -150
  136. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-pending.test.ts +0 -37
  137. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-pending.ts +0 -42
  138. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-preview.test.ts +0 -318
  139. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-preview.ts +0 -260
  140. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-drag-types.ts +0 -39
  141. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/task-sort-key.ts +0 -47
  142. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/use-kanban-dnd.test.ts +0 -859
  143. package/src/components/ui/tu-do/boards/boardId/kanban/dnd/use-kanban-dnd.ts +0 -1659
  144. package/src/components/ui/tu-do/boards/boardId/kanban/kanban-column-collapse.ts +0 -16
  145. package/src/components/ui/tu-do/boards/boardId/kanban/kanban-constants.ts +0 -43
  146. package/src/components/ui/tu-do/boards/boardId/kanban/planner/__tests__/kanban-planner-island.test.tsx +0 -380
  147. package/src/components/ui/tu-do/boards/boardId/kanban/planner/kanban-planner-dialog.tsx +0 -204
  148. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-digest-panel.tsx +0 -61
  149. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-item-strip.tsx +0 -54
  150. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-plan-toolbar.tsx +0 -251
  151. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-scope-badge.tsx +0 -27
  152. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-section.tsx +0 -58
  153. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-share-dialog.tsx +0 -238
  154. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-target-controls.tsx +0 -143
  155. package/src/components/ui/tu-do/boards/boardId/kanban/planner/planner-utils.ts +0 -65
  156. package/src/components/ui/tu-do/boards/boardId/kanban/planner/use-kanban-planner-state.ts +0 -234
  157. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-column-width.ts +0 -30
  158. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-columns.test.tsx +0 -1077
  159. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-columns.tsx +0 -447
  160. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-deadline-panels.tsx +0 -703
  161. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-deadline-tasks.test.ts +0 -267
  162. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-deadline-tasks.ts +0 -112
  163. package/src/components/ui/tu-do/boards/boardId/kanban/rendering/kanban-skeleton.tsx +0 -113
  164. package/src/components/ui/tu-do/boards/boardId/kanban/selection/use-keyboard-shortcuts.ts +0 -137
  165. package/src/components/ui/tu-do/boards/boardId/kanban/selection/use-multi-select.ts +0 -119
  166. package/src/components/ui/tu-do/boards/boardId/kanban.tsx +0 -631
  167. package/src/components/ui/tu-do/boards/boardId/list-actions.tsx +0 -522
  168. package/src/components/ui/tu-do/boards/boardId/menus/__tests__/task-estimation-menu.test.tsx +0 -261
  169. package/src/components/ui/tu-do/boards/boardId/menus/__tests__/task-menus.test.tsx +0 -708
  170. package/src/components/ui/tu-do/boards/boardId/menus/index.ts +0 -12
  171. package/src/components/ui/tu-do/boards/boardId/menus/task-assignees-menu.tsx +0 -176
  172. package/src/components/ui/tu-do/boards/boardId/menus/task-blocking-menu.tsx +0 -304
  173. package/src/components/ui/tu-do/boards/boardId/menus/task-due-date-menu.tsx +0 -201
  174. package/src/components/ui/tu-do/boards/boardId/menus/task-estimation-menu.tsx +0 -103
  175. package/src/components/ui/tu-do/boards/boardId/menus/task-labels-menu.tsx +0 -134
  176. package/src/components/ui/tu-do/boards/boardId/menus/task-move-menu.tsx +0 -66
  177. package/src/components/ui/tu-do/boards/boardId/menus/task-parent-menu.tsx +0 -228
  178. package/src/components/ui/tu-do/boards/boardId/menus/task-picker-popover.tsx +0 -300
  179. package/src/components/ui/tu-do/boards/boardId/menus/task-priority-menu.tsx +0 -178
  180. package/src/components/ui/tu-do/boards/boardId/menus/task-projects-menu.tsx +0 -143
  181. package/src/components/ui/tu-do/boards/boardId/menus/task-related-menu.tsx +0 -242
  182. package/src/components/ui/tu-do/boards/boardId/menus/task-scheduling-menu.tsx +0 -465
  183. package/src/components/ui/tu-do/boards/boardId/menus/task-scheduling-utils.ts +0 -109
  184. package/src/components/ui/tu-do/boards/boardId/status-grouped-board.tsx +0 -533
  185. package/src/components/ui/tu-do/boards/boardId/status-section.tsx +0 -274
  186. package/src/components/ui/tu-do/boards/boardId/task-actions.tsx +0 -675
  187. package/src/components/ui/tu-do/boards/boardId/task-board-server-page.test.tsx +0 -209
  188. package/src/components/ui/tu-do/boards/boardId/task-board-server-page.tsx +0 -109
  189. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardCheckbox.tsx +0 -50
  190. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardDates.tsx +0 -123
  191. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardHeader.tsx +0 -97
  192. package/src/components/ui/tu-do/boards/boardId/task-card/TaskCardMetadata.tsx +0 -152
  193. package/src/components/ui/tu-do/boards/boardId/task-card/measured-task-card.tsx +0 -118
  194. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-archive-visibility.test.ts +0 -44
  195. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-archive-visibility.ts +0 -17
  196. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-checkbox-style.ts +0 -39
  197. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-comparator.test.ts +0 -104
  198. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-comparator.ts +0 -123
  199. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-completion-checkbox-visibility.test.ts +0 -31
  200. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-completion-checkbox-visibility.ts +0 -9
  201. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-identifier-row.test.tsx +0 -124
  202. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-identifier-row.tsx +0 -88
  203. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-label-options.ts +0 -24
  204. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-open-options.test.ts +0 -166
  205. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-open-options.ts +0 -148
  206. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-resource-context.test.ts +0 -113
  207. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-resource-context.ts +0 -50
  208. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-visibility.test.ts +0 -41
  209. package/src/components/ui/tu-do/boards/boardId/task-card/task-card-visibility.ts +0 -14
  210. package/src/components/ui/tu-do/boards/boardId/task-card/task-card.tsx +0 -2889
  211. package/src/components/ui/tu-do/boards/boardId/task-card/task-scheduling-badge.tsx +0 -174
  212. package/src/components/ui/tu-do/boards/boardId/task-dialogs/BoardEstimationConfigDialog.tsx +0 -499
  213. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskCustomDateDialog.tsx +0 -109
  214. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskDeleteDialog.tsx +0 -96
  215. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskNewLabelDialog.tsx +0 -178
  216. package/src/components/ui/tu-do/boards/boardId/task-dialogs/TaskNewProjectDialog.tsx +0 -127
  217. package/src/components/ui/tu-do/boards/boardId/task-filter.test.tsx +0 -152
  218. package/src/components/ui/tu-do/boards/boardId/task-filter.tsx +0 -996
  219. package/src/components/ui/tu-do/boards/boardId/task-form.tsx +0 -498
  220. package/src/components/ui/tu-do/boards/boardId/task-list-drag-preview.test.ts +0 -101
  221. package/src/components/ui/tu-do/boards/boardId/task-list-form.tsx +0 -91
  222. package/src/components/ui/tu-do/boards/boardId/task-list.tsx +0 -535
  223. package/src/components/ui/tu-do/boards/boardId/task-parent-badge-state.test.ts +0 -64
  224. package/src/components/ui/tu-do/boards/boardId/task-parent-badge-state.ts +0 -31
  225. package/src/components/ui/tu-do/boards/boardId/task.tsx +0 -2
  226. package/src/components/ui/tu-do/boards/boardId/timeline/task-edit-dialog.tsx +0 -109
  227. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-display.ts +0 -103
  228. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-grid.tsx +0 -381
  229. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-task-row.tsx +0 -339
  230. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-toolbar.tsx +0 -356
  231. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-utils.test.ts +0 -169
  232. package/src/components/ui/tu-do/boards/boardId/timeline/timeline-utils.ts +0 -517
  233. package/src/components/ui/tu-do/boards/boardId/timeline-board-open-task.test.tsx +0 -164
  234. package/src/components/ui/tu-do/boards/boardId/timeline-board.test.tsx +0 -217
  235. package/src/components/ui/tu-do/boards/boardId/timeline-board.tsx +0 -834
  236. package/src/components/ui/tu-do/boards/boards-list-skeleton.tsx +0 -62
  237. package/src/components/ui/tu-do/boards/columns.tsx +0 -159
  238. package/src/components/ui/tu-do/boards/copy-board-dialog.tsx +0 -156
  239. package/src/components/ui/tu-do/boards/enhanced-boards-view.tsx +0 -347
  240. package/src/components/ui/tu-do/boards/form.tsx +0 -264
  241. package/src/components/ui/tu-do/boards/quick-create-board-dialog.tsx +0 -75
  242. package/src/components/ui/tu-do/boards/row-actions.tsx +0 -397
  243. package/src/components/ui/tu-do/boards/share-section.tsx +0 -100
  244. package/src/components/ui/tu-do/boards/workspace-projects-client-page.tsx +0 -192
  245. package/src/components/ui/tu-do/boards/workspace-projects-page.tsx +0 -155
  246. package/src/components/ui/tu-do/cycles/task-cycles-client.tsx +0 -753
  247. package/src/components/ui/tu-do/cycles/task-cycles-page.tsx +0 -103
  248. package/src/components/ui/tu-do/drafts/draft-card.tsx +0 -204
  249. package/src/components/ui/tu-do/drafts/draft-convert-dialog.tsx +0 -195
  250. package/src/components/ui/tu-do/drafts/drafts-page.tsx +0 -122
  251. package/src/components/ui/tu-do/drafts/task-drafts-page.tsx +0 -90
  252. package/src/components/ui/tu-do/estimates/client.tsx +0 -292
  253. package/src/components/ui/tu-do/estimates/edit-estimation-dialog.tsx +0 -374
  254. package/src/components/ui/tu-do/estimates/task-estimates-page.tsx +0 -57
  255. package/src/components/ui/tu-do/estimates/use-task-estimates.ts +0 -324
  256. package/src/components/ui/tu-do/habits/client.tsx +0 -263
  257. package/src/components/ui/tu-do/habits/habit-card.tsx +0 -183
  258. package/src/components/ui/tu-do/habits/habit-form-dialog.tsx +0 -701
  259. package/src/components/ui/tu-do/habits/habits-page.tsx +0 -27
  260. package/src/components/ui/tu-do/hooks/__tests__/useDraftPersistence.test.ts +0 -494
  261. package/src/components/ui/tu-do/hooks/__tests__/useTaskDialog.test.tsx +0 -127
  262. package/src/components/ui/tu-do/hooks/__tests__/useTaskDialogState.test.ts +0 -217
  263. package/src/components/ui/tu-do/hooks/__tests__/useTaskLabelManagement.test.tsx +0 -572
  264. package/src/components/ui/tu-do/hooks/__tests__/useTaskProjectManagement.test.tsx +0 -144
  265. package/src/components/ui/tu-do/hooks/useDraftPersistence.ts +0 -199
  266. package/src/components/ui/tu-do/hooks/useTaskCardRelationships.ts +0 -340
  267. package/src/components/ui/tu-do/hooks/useTaskDialog.ts +0 -122
  268. package/src/components/ui/tu-do/hooks/useTaskDialogState.ts +0 -145
  269. package/src/components/ui/tu-do/hooks/useTaskFormState.ts +0 -206
  270. package/src/components/ui/tu-do/hooks/useTaskKeyboardShortcuts.ts +0 -58
  271. package/src/components/ui/tu-do/hooks/useTaskLabelManagement.ts +0 -425
  272. package/src/components/ui/tu-do/hooks/useTaskProjectManagement.ts +0 -454
  273. package/src/components/ui/tu-do/initiatives/task-initiatives-client.tsx +0 -889
  274. package/src/components/ui/tu-do/initiatives/task-initiatives-page.tsx +0 -116
  275. package/src/components/ui/tu-do/labels/client.tsx +0 -201
  276. package/src/components/ui/tu-do/labels/components/delete-label-dialog.tsx +0 -57
  277. package/src/components/ui/tu-do/labels/components/label-card.tsx +0 -86
  278. package/src/components/ui/tu-do/labels/components/label-dialog.tsx +0 -259
  279. package/src/components/ui/tu-do/labels/components/label-list.tsx +0 -83
  280. package/src/components/ui/tu-do/labels/hooks/use-task-labels.ts +0 -170
  281. package/src/components/ui/tu-do/labels/task-labels-page.tsx +0 -53
  282. package/src/components/ui/tu-do/labels/types.ts +0 -6
  283. package/src/components/ui/tu-do/logs/columns.tsx +0 -755
  284. package/src/components/ui/tu-do/logs/logs-client.tsx +0 -1006
  285. package/src/components/ui/tu-do/logs/logs-timeline.tsx +0 -2483
  286. package/src/components/ui/tu-do/logs/task-logs-page.tsx +0 -59
  287. package/src/components/ui/tu-do/my-tasks/__tests__/my-tasks-content.test.tsx +0 -408
  288. package/src/components/ui/tu-do/my-tasks/__tests__/use-my-tasks-query.test.ts +0 -469
  289. package/src/components/ui/tu-do/my-tasks/__tests__/use-my-tasks-state.test.ts +0 -1017
  290. package/src/components/ui/tu-do/my-tasks/__tests__/use-task-context-actions.test.ts +0 -584
  291. package/src/components/ui/tu-do/my-tasks/ai-credit-indicator.tsx +0 -143
  292. package/src/components/ui/tu-do/my-tasks/board-selector-dialog.tsx +0 -239
  293. package/src/components/ui/tu-do/my-tasks/command-bar.tsx +0 -1351
  294. package/src/components/ui/tu-do/my-tasks/label-project-filter.tsx +0 -194
  295. package/src/components/ui/tu-do/my-tasks/my-task-context-menu.tsx +0 -356
  296. package/src/components/ui/tu-do/my-tasks/my-tasks-content.tsx +0 -328
  297. package/src/components/ui/tu-do/my-tasks/my-tasks-data-loader.tsx +0 -17
  298. package/src/components/ui/tu-do/my-tasks/my-tasks-filters.tsx +0 -258
  299. package/src/components/ui/tu-do/my-tasks/my-tasks-header.tsx +0 -121
  300. package/src/components/ui/tu-do/my-tasks/my-tasks-page.tsx +0 -40
  301. package/src/components/ui/tu-do/my-tasks/personal-placement-dialog.tsx +0 -188
  302. package/src/components/ui/tu-do/my-tasks/task-filter.tsx +0 -235
  303. package/src/components/ui/tu-do/my-tasks/task-list-with-completion.tsx +0 -832
  304. package/src/components/ui/tu-do/my-tasks/task-list.tsx +0 -258
  305. package/src/components/ui/tu-do/my-tasks/task-preview-dialog.tsx +0 -1597
  306. package/src/components/ui/tu-do/my-tasks/task-section.tsx +0 -261
  307. package/src/components/ui/tu-do/my-tasks/use-my-tasks-query.ts +0 -149
  308. package/src/components/ui/tu-do/my-tasks/use-my-tasks-state.ts +0 -1037
  309. package/src/components/ui/tu-do/my-tasks/use-task-context-actions.ts +0 -474
  310. package/src/components/ui/tu-do/notes/note-edit-dialog.tsx +0 -118
  311. package/src/components/ui/tu-do/notes/note-list.tsx +0 -799
  312. package/src/components/ui/tu-do/notes/notes-content.tsx +0 -178
  313. package/src/components/ui/tu-do/notes/notes-page.tsx +0 -27
  314. package/src/components/ui/tu-do/progress/task-progress-import-panel.tsx +0 -60
  315. package/src/components/ui/tu-do/progress/task-progress-leaderboards-panel.tsx +0 -156
  316. package/src/components/ui/tu-do/progress/task-progress-page.tsx +0 -394
  317. package/src/components/ui/tu-do/progress/task-progress-panels.tsx +0 -303
  318. package/src/components/ui/tu-do/projects/components/index.ts +0 -11
  319. package/src/components/ui/tu-do/projects/components/project-actions-menu.tsx +0 -66
  320. package/src/components/ui/tu-do/projects/components/project-badges.tsx +0 -84
  321. package/src/components/ui/tu-do/projects/components/project-filter-menu.tsx +0 -170
  322. package/src/components/ui/tu-do/projects/components/project-grid-card.tsx +0 -198
  323. package/src/components/ui/tu-do/projects/components/project-list-item.tsx +0 -195
  324. package/src/components/ui/tu-do/projects/components/project-metrics.tsx +0 -87
  325. package/src/components/ui/tu-do/projects/components/project-progress-meter.tsx +0 -33
  326. package/src/components/ui/tu-do/projects/components/project-sort-menu.tsx +0 -71
  327. package/src/components/ui/tu-do/projects/components/projects-empty-state.tsx +0 -38
  328. package/src/components/ui/tu-do/projects/components/projects-loading-state.tsx +0 -26
  329. package/src/components/ui/tu-do/projects/components/projects-toolbar.tsx +0 -179
  330. package/src/components/ui/tu-do/projects/dialogs/create-project-dialog.tsx +0 -117
  331. package/src/components/ui/tu-do/projects/dialogs/edit-project-dialog.tsx +0 -125
  332. package/src/components/ui/tu-do/projects/dialogs/index.ts +0 -3
  333. package/src/components/ui/tu-do/projects/dialogs/manage-tasks-dialog.tsx +0 -205
  334. package/src/components/ui/tu-do/projects/hooks/index.ts +0 -2
  335. package/src/components/ui/tu-do/projects/hooks/use-project-filters.ts +0 -248
  336. package/src/components/ui/tu-do/projects/hooks/use-task-projects.ts +0 -238
  337. package/src/components/ui/tu-do/projects/projectId/components/__tests__/tasks-tab-layout.test.tsx +0 -169
  338. package/src/components/ui/tu-do/projects/projectId/components/documents-tab.tsx +0 -90
  339. package/src/components/ui/tu-do/projects/projectId/components/index.ts +0 -9
  340. package/src/components/ui/tu-do/projects/projectId/components/overview/description-card.tsx +0 -77
  341. package/src/components/ui/tu-do/projects/projectId/components/overview/linked-documents-card.tsx +0 -81
  342. package/src/components/ui/tu-do/projects/projectId/components/overview/linked-tasks-card.tsx +0 -85
  343. package/src/components/ui/tu-do/projects/projectId/components/overview/updates-card.tsx +0 -85
  344. package/src/components/ui/tu-do/projects/projectId/components/overview-tab.tsx +0 -35
  345. package/src/components/ui/tu-do/projects/projectId/components/project-configuration.tsx +0 -229
  346. package/src/components/ui/tu-do/projects/projectId/components/project-header.tsx +0 -115
  347. package/src/components/ui/tu-do/projects/projectId/components/project-lead-selector.tsx +0 -55
  348. package/src/components/ui/tu-do/projects/projectId/components/project-overview-context.tsx +0 -82
  349. package/src/components/ui/tu-do/projects/projectId/components/project-sidebar.tsx +0 -246
  350. package/src/components/ui/tu-do/projects/projectId/components/tasks-tab.tsx +0 -266
  351. package/src/components/ui/tu-do/projects/projectId/components/update-card.tsx +0 -162
  352. package/src/components/ui/tu-do/projects/projectId/components/updates-tab.tsx +0 -129
  353. package/src/components/ui/tu-do/projects/projectId/dialogs/index.ts +0 -1
  354. package/src/components/ui/tu-do/projects/projectId/dialogs/link-task-dialog.tsx +0 -114
  355. package/src/components/ui/tu-do/projects/projectId/hooks/index.ts +0 -4
  356. package/src/components/ui/tu-do/projects/projectId/hooks/use-animation-variants.ts +0 -68
  357. package/src/components/ui/tu-do/projects/projectId/hooks/use-project-form.ts +0 -214
  358. package/src/components/ui/tu-do/projects/projectId/hooks/use-project-updates.ts +0 -209
  359. package/src/components/ui/tu-do/projects/projectId/hooks/use-task-linking.ts +0 -101
  360. package/src/components/ui/tu-do/projects/projectId/task-project-detail-page-client.tsx +0 -93
  361. package/src/components/ui/tu-do/projects/projectId/task-project-detail-page.tsx +0 -78
  362. package/src/components/ui/tu-do/projects/projectId/task-project-detail.tsx +0 -367
  363. package/src/components/ui/tu-do/projects/projectId/types.ts +0 -51
  364. package/src/components/ui/tu-do/projects/task-projects-client.tsx +0 -270
  365. package/src/components/ui/tu-do/projects/task-projects-page.tsx +0 -97
  366. package/src/components/ui/tu-do/projects/types.ts +0 -62
  367. package/src/components/ui/tu-do/providers/__tests__/task-dialog-provider.test.tsx +0 -616
  368. package/src/components/ui/tu-do/providers/task-dialog-provider.tsx +0 -923
  369. package/src/components/ui/tu-do/providers/workspace-presence-provider.tsx +0 -88
  370. package/src/components/ui/tu-do/shared/AccessibleButton.tsx +0 -79
  371. package/src/components/ui/tu-do/shared/__tests__/assignee-select.test.tsx +0 -143
  372. package/src/components/ui/tu-do/shared/__tests__/board-client.test.tsx +0 -358
  373. package/src/components/ui/tu-do/shared/__tests__/board-header.test.tsx +0 -598
  374. package/src/components/ui/tu-do/shared/__tests__/board-query-cache.test.ts +0 -219
  375. package/src/components/ui/tu-do/shared/__tests__/board-switcher.test.tsx +0 -374
  376. package/src/components/ui/tu-do/shared/__tests__/board-views.test.tsx +0 -1288
  377. package/src/components/ui/tu-do/shared/__tests__/create-list-dialog.test.tsx +0 -118
  378. package/src/components/ui/tu-do/shared/__tests__/task-board-loading-state.test.tsx +0 -99
  379. package/src/components/ui/tu-do/shared/__tests__/task-cache-patches.test.ts +0 -147
  380. package/src/components/ui/tu-do/shared/__tests__/task-detail-page.test.tsx +0 -170
  381. package/src/components/ui/tu-do/shared/__tests__/task-dialog-manager.test.tsx +0 -945
  382. package/src/components/ui/tu-do/shared/__tests__/task-legacy-route-recovery.test.tsx +0 -101
  383. package/src/components/ui/tu-do/shared/__tests__/use-progressive-board-loader.test.tsx +0 -645
  384. package/src/components/ui/tu-do/shared/assignee-select.tsx +0 -592
  385. package/src/components/ui/tu-do/shared/board-broadcast-context.tsx +0 -45
  386. package/src/components/ui/tu-do/shared/board-client.tsx +0 -283
  387. package/src/components/ui/tu-do/shared/board-config-storage.ts +0 -94
  388. package/src/components/ui/tu-do/shared/board-header.tsx +0 -803
  389. package/src/components/ui/tu-do/shared/board-layout-settings.tsx +0 -1134
  390. package/src/components/ui/tu-do/shared/board-query-cache.ts +0 -157
  391. package/src/components/ui/tu-do/shared/board-switcher.tsx +0 -322
  392. package/src/components/ui/tu-do/shared/board-user-presence-avatars.tsx +0 -578
  393. package/src/components/ui/tu-do/shared/board-views.tsx +0 -1238
  394. package/src/components/ui/tu-do/shared/clear-menu-item.tsx +0 -34
  395. package/src/components/ui/tu-do/shared/create-list-dialog.tsx +0 -401
  396. package/src/components/ui/tu-do/shared/cursor-overlay-multi-wrapper.tsx +0 -245
  397. package/src/components/ui/tu-do/shared/cursor-overlay.tsx +0 -78
  398. package/src/components/ui/tu-do/shared/custom-date-picker/custom-date-picker-dialog.tsx +0 -157
  399. package/src/components/ui/tu-do/shared/description-overflow-warning-dialog.tsx +0 -68
  400. package/src/components/ui/tu-do/shared/edit-list-dialog.tsx +0 -383
  401. package/src/components/ui/tu-do/shared/empty-state-card.tsx +0 -46
  402. package/src/components/ui/tu-do/shared/estimation-mapping.test.ts +0 -32
  403. package/src/components/ui/tu-do/shared/estimation-mapping.ts +0 -74
  404. package/src/components/ui/tu-do/shared/estimation-utils.ts +0 -54
  405. package/src/components/ui/tu-do/shared/fade-setting-initializer.tsx +0 -61
  406. package/src/components/ui/tu-do/shared/label-chip.tsx +0 -46
  407. package/src/components/ui/tu-do/shared/list-view-context-menu.test.tsx +0 -203
  408. package/src/components/ui/tu-do/shared/list-view-sorting.test.ts +0 -50
  409. package/src/components/ui/tu-do/shared/list-view-sorting.ts +0 -108
  410. package/src/components/ui/tu-do/shared/list-view.tsx +0 -1248
  411. package/src/components/ui/tu-do/shared/mention-system/__tests__/mention-system.test.ts +0 -250
  412. package/src/components/ui/tu-do/shared/mention-system/mention-menu.tsx +0 -217
  413. package/src/components/ui/tu-do/shared/mention-system/types.ts +0 -141
  414. package/src/components/ui/tu-do/shared/mention-system/use-mention-suggestions.ts +0 -244
  415. package/src/components/ui/tu-do/shared/progressive-loader-context.tsx +0 -45
  416. package/src/components/ui/tu-do/shared/recent-sidebar-events.ts +0 -58
  417. package/src/components/ui/tu-do/shared/recycle-bin-panel.tsx +0 -651
  418. package/src/components/ui/tu-do/shared/relationship-task-identifier.ts +0 -14
  419. package/src/components/ui/tu-do/shared/slash-commands/__tests__/slash-commands.test.ts +0 -315
  420. package/src/components/ui/tu-do/shared/slash-commands/definitions.ts +0 -167
  421. package/src/components/ui/tu-do/shared/slash-commands/slash-command-menu.tsx +0 -114
  422. package/src/components/ui/tu-do/shared/special-task-list-pins.ts +0 -51
  423. package/src/components/ui/tu-do/shared/sync-warning-dialog.tsx +0 -133
  424. package/src/components/ui/tu-do/shared/task-board-errors.ts +0 -19
  425. package/src/components/ui/tu-do/shared/task-board-loading-state.tsx +0 -82
  426. package/src/components/ui/tu-do/shared/task-cache-patches.ts +0 -394
  427. package/src/components/ui/tu-do/shared/task-detail-page.tsx +0 -176
  428. package/src/components/ui/tu-do/shared/task-detail-server-page.tsx +0 -37
  429. package/src/components/ui/tu-do/shared/task-dialog-manager.tsx +0 -596
  430. package/src/components/ui/tu-do/shared/task-dialog-presentation.test.ts +0 -53
  431. package/src/components/ui/tu-do/shared/task-dialog-presentation.ts +0 -30
  432. package/src/components/ui/tu-do/shared/task-dialog-wrapper.tsx +0 -28
  433. package/src/components/ui/tu-do/shared/task-due-date-visibility.test.ts +0 -72
  434. package/src/components/ui/tu-do/shared/task-due-date-visibility.ts +0 -38
  435. package/src/components/ui/tu-do/shared/task-edit-dialog/components/compact-task-create-popover.test.tsx +0 -325
  436. package/src/components/ui/tu-do/shared/task-edit-dialog/components/compact-task-create-popover.tsx +0 -268
  437. package/src/components/ui/tu-do/shared/task-edit-dialog/components/mobile-floating-save-button.tsx +0 -46
  438. package/src/components/ui/tu-do/shared/task-edit-dialog/components/quick-settings-popover.tsx +0 -198
  439. package/src/components/ui/tu-do/shared/task-edit-dialog/components/smart-task-suggestions-panel.test.tsx +0 -129
  440. package/src/components/ui/tu-do/shared/task-edit-dialog/components/smart-task-suggestions-panel.tsx +0 -358
  441. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-description-editor.tsx +0 -496
  442. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-dialog-header.tsx +0 -545
  443. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-list-picker-panel.tsx +0 -220
  444. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-list-selector.tsx +0 -165
  445. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-list-trigger-styles.ts +0 -69
  446. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-name-input.test.tsx +0 -180
  447. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-name-input.tsx +0 -218
  448. package/src/components/ui/tu-do/shared/task-edit-dialog/components/task-suggestion-menus.tsx +0 -148
  449. package/src/components/ui/tu-do/shared/task-edit-dialog/constants.ts +0 -18
  450. package/src/components/ui/tu-do/shared/task-edit-dialog/context-menu-guard.test.ts +0 -37
  451. package/src/components/ui/tu-do/shared/task-edit-dialog/description-diff-viewer.tsx +0 -1665
  452. package/src/components/ui/tu-do/shared/task-edit-dialog/description-versions.test.ts +0 -97
  453. package/src/components/ui/tu-do/shared/task-edit-dialog/description-versions.ts +0 -210
  454. package/src/components/ui/tu-do/shared/task-edit-dialog/field-diff-viewer.tsx +0 -716
  455. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-dialog-close.test.ts +0 -218
  456. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-dialog-keyboard-shortcuts.test.ts +0 -140
  457. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-mutations.test.tsx +0 -231
  458. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-overrides.test.ts +0 -412
  459. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-realtime-sync.test.tsx +0 -237
  460. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-task-yjs-sync.test.ts +0 -190
  461. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/__tests__/use-update-shared-task.test.ts +0 -107
  462. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/task-api.test.ts +0 -171
  463. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/task-api.ts +0 -296
  464. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-editor-commands.ts +0 -314
  465. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-suggestion-menus.ts +0 -503
  466. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-change-detection.ts +0 -175
  467. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-data.ts +0 -401
  468. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-dependencies.ts +0 -773
  469. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-dialog-close.ts +0 -193
  470. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-dialog-keyboard-shortcuts.ts +0 -365
  471. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-form-reset.ts +0 -231
  472. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-form-state.ts +0 -307
  473. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-mutations.ts +0 -609
  474. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-overrides.ts +0 -134
  475. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-realtime-sync.ts +0 -270
  476. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-relationships.test.tsx +0 -212
  477. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-relationships.ts +0 -554
  478. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-revert.ts +0 -140
  479. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-save.test.ts +0 -289
  480. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-save.ts +0 -1473
  481. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-snapshot.ts +0 -59
  482. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-task-yjs-sync.ts +0 -224
  483. package/src/components/ui/tu-do/shared/task-edit-dialog/hooks/use-update-shared-task.ts +0 -60
  484. package/src/components/ui/tu-do/shared/task-edit-dialog/personal-overrides-section.tsx +0 -368
  485. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/clickable-task-item.tsx +0 -90
  486. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/index.ts +0 -4
  487. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/subtask-action-buttons.tsx +0 -140
  488. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/tab-button.tsx +0 -76
  489. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/components/task-relationship-action-buttons.tsx +0 -178
  490. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/dependencies-section.tsx +0 -140
  491. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/index.ts +0 -35
  492. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/parent-section.tsx +0 -70
  493. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/related-section.tsx +0 -81
  494. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/subtasks-section.tsx +0 -87
  495. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/task-search-popover.tsx +0 -229
  496. package/src/components/ui/tu-do/shared/task-edit-dialog/relationships/types/task-relationships.types.ts +0 -194
  497. package/src/components/ui/tu-do/shared/task-edit-dialog/selective-revert-panel.test.tsx +0 -91
  498. package/src/components/ui/tu-do/shared/task-edit-dialog/selective-revert-panel.tsx +0 -365
  499. package/src/components/ui/tu-do/shared/task-edit-dialog/task-activity-section.tsx +0 -802
  500. package/src/components/ui/tu-do/shared/task-edit-dialog/task-delete-dialog.tsx +0 -104
  501. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-change-dialog.test.tsx +0 -63
  502. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-change-dialog.tsx +0 -218
  503. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-restore-banner.tsx +0 -83
  504. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-version-restore-dialog.test.tsx +0 -120
  505. package/src/components/ui/tu-do/shared/task-edit-dialog/task-description-version-restore-dialog.tsx +0 -180
  506. package/src/components/ui/tu-do/shared/task-edit-dialog/task-dialog-actions.test.tsx +0 -68
  507. package/src/components/ui/tu-do/shared/task-edit-dialog/task-dialog-actions.tsx +0 -239
  508. package/src/components/ui/tu-do/shared/task-edit-dialog/task-instances-section.tsx +0 -173
  509. package/src/components/ui/tu-do/shared/task-edit-dialog/task-properties-section.test.tsx +0 -303
  510. package/src/components/ui/tu-do/shared/task-edit-dialog/task-properties-section.tsx +0 -2213
  511. package/src/components/ui/tu-do/shared/task-edit-dialog/task-relationships-properties.tsx +0 -315
  512. package/src/components/ui/tu-do/shared/task-edit-dialog/task-snapshot-dialog.tsx +0 -167
  513. package/src/components/ui/tu-do/shared/task-edit-dialog/types/pending-relationship.test.ts +0 -52
  514. package/src/components/ui/tu-do/shared/task-edit-dialog/types/pending-relationship.ts +0 -134
  515. package/src/components/ui/tu-do/shared/task-edit-dialog/types.ts +0 -64
  516. package/src/components/ui/tu-do/shared/task-edit-dialog/user-display.test.ts +0 -58
  517. package/src/components/ui/tu-do/shared/task-edit-dialog/user-display.ts +0 -45
  518. package/src/components/ui/tu-do/shared/task-edit-dialog/utils/inline-task-target-list.test.ts +0 -98
  519. package/src/components/ui/tu-do/shared/task-edit-dialog/utils/inline-task-target-list.ts +0 -39
  520. package/src/components/ui/tu-do/shared/task-edit-dialog/utils.test.ts +0 -504
  521. package/src/components/ui/tu-do/shared/task-edit-dialog/utils.ts +0 -582
  522. package/src/components/ui/tu-do/shared/task-edit-dialog/yjs-prosemirror-compat.test.ts +0 -65
  523. package/src/components/ui/tu-do/shared/task-edit-dialog.tsx +0 -3196
  524. package/src/components/ui/tu-do/shared/task-estimation-display.tsx +0 -52
  525. package/src/components/ui/tu-do/shared/task-estimation-picker.tsx +0 -226
  526. package/src/components/ui/tu-do/shared/task-filter.types.ts +0 -65
  527. package/src/components/ui/tu-do/shared/task-label-selector.tsx +0 -217
  528. package/src/components/ui/tu-do/shared/task-labels-display.test.tsx +0 -51
  529. package/src/components/ui/tu-do/shared/task-labels-display.tsx +0 -119
  530. package/src/components/ui/tu-do/shared/task-legacy-route-recovery.tsx +0 -65
  531. package/src/components/ui/tu-do/shared/task-projects-display.tsx +0 -80
  532. package/src/components/ui/tu-do/shared/task-quick-create-target-list.ts +0 -20
  533. package/src/components/ui/tu-do/shared/task-resource-search-field.tsx +0 -49
  534. package/src/components/ui/tu-do/shared/task-resource-search-filters.ts +0 -27
  535. package/src/components/ui/tu-do/shared/task-row-actions-menu.test.tsx +0 -138
  536. package/src/components/ui/tu-do/shared/task-row-actions-menu.tsx +0 -402
  537. package/src/components/ui/tu-do/shared/task-share-dialog/components/share-link-settings.tsx +0 -86
  538. package/src/components/ui/tu-do/shared/task-share-dialog/components/shares-list.tsx +0 -85
  539. package/src/components/ui/tu-do/shared/task-share-dialog/hooks/use-task-sharing.ts +0 -296
  540. package/src/components/ui/tu-do/shared/task-share-dialog.tsx +0 -144
  541. package/src/components/ui/tu-do/shared/task-sound-effects.test.ts +0 -189
  542. package/src/components/ui/tu-do/shared/task-sound-effects.tsx +0 -468
  543. package/src/components/ui/tu-do/shared/task-url.ts +0 -56
  544. package/src/components/ui/tu-do/shared/text-diff-viewer.tsx +0 -55
  545. package/src/components/ui/tu-do/shared/types.ts +0 -14
  546. package/src/components/ui/tu-do/shared/unsaved-changes-warning-dialog.tsx +0 -71
  547. package/src/components/ui/tu-do/shared/use-progressive-board-loader.ts +0 -312
  548. package/src/components/ui/tu-do/shared/user-avatar.tsx +0 -46
  549. package/src/components/ui/tu-do/shared/user-presence-avatars.tsx +0 -415
  550. package/src/components/ui/tu-do/shared/utils/translate-task-list-display-name.ts +0 -28
  551. package/src/components/ui/tu-do/tasks-route-context.tsx +0 -50
  552. package/src/components/ui/tu-do/templates/client.tsx +0 -505
  553. package/src/components/ui/tu-do/templates/marketplace/client.tsx +0 -487
  554. package/src/components/ui/tu-do/templates/marketplace/task-marketplace-page.tsx +0 -169
  555. package/src/components/ui/tu-do/templates/save-as-template-dialog.tsx +0 -381
  556. package/src/components/ui/tu-do/templates/task-template-api.ts +0 -142
  557. package/src/components/ui/tu-do/templates/task-template-card.tsx +0 -118
  558. package/src/components/ui/tu-do/templates/task-template-client.test.tsx +0 -52
  559. package/src/components/ui/tu-do/templates/task-template-client.tsx +0 -258
  560. package/src/components/ui/tu-do/templates/task-template-dialogs.test.tsx +0 -167
  561. package/src/components/ui/tu-do/templates/task-template-dialogs.tsx +0 -376
  562. package/src/components/ui/tu-do/templates/task-templates-hub.test.tsx +0 -114
  563. package/src/components/ui/tu-do/templates/task-templates-hub.tsx +0 -53
  564. package/src/components/ui/tu-do/templates/task-templates-page.tsx +0 -157
  565. package/src/components/ui/tu-do/templates/templateId/client.tsx +0 -674
  566. package/src/components/ui/tu-do/templates/templateId/edit-template-dialog.tsx +0 -300
  567. package/src/components/ui/tu-do/templates/templateId/share-template-dialog.tsx +0 -261
  568. package/src/components/ui/tu-do/templates/templateId/task-template-detail-page-client.tsx +0 -127
  569. package/src/components/ui/tu-do/templates/templateId/task-template-detail-page.tsx +0 -89
  570. package/src/components/ui/tu-do/templates/templateId/use-template-dialog.tsx +0 -165
  571. package/src/components/ui/tu-do/templates/types.ts +0 -53
  572. package/src/components/ui/tu-do/utils/__tests__/label-colors.test.ts +0 -43
  573. package/src/components/ui/tu-do/utils/__tests__/taskColorUtils.test.ts +0 -267
  574. package/src/components/ui/tu-do/utils/__tests__/taskConstants.test.ts +0 -178
  575. package/src/components/ui/tu-do/utils/__tests__/taskDateUtils.test.ts +0 -226
  576. package/src/components/ui/tu-do/utils/__tests__/weekDateUtils.test.ts +0 -182
  577. package/src/components/ui/tu-do/utils/label-colors.test.ts +0 -15
  578. package/src/components/ui/tu-do/utils/label-colors.ts +0 -59
  579. package/src/components/ui/tu-do/utils/taskColorUtils.ts +0 -116
  580. package/src/components/ui/tu-do/utils/taskConstants.ts +0 -102
  581. package/src/components/ui/tu-do/utils/taskDateUtils.ts +0 -81
  582. package/src/components/ui/tu-do/utils/taskPriorityUtils.tsx +0 -80
  583. package/src/components/ui/tu-do/utils/weekDateUtils.ts +0 -64
  584. package/src/hooks/__tests__/use-task-actions.test.tsx +0 -2098
  585. package/src/hooks/__tests__/useBoardPresence.test.tsx +0 -191
  586. package/src/hooks/__tests__/useBoardRealtime.test.tsx +0 -1036
  587. package/src/hooks/__tests__/useCursorTracking.test.tsx +0 -212
  588. package/src/hooks/task-actions-personal-external.ts +0 -313
  589. package/src/hooks/use-task-actions.ts +0 -1910
  590. package/src/hooks/useBoardPresence.ts +0 -364
  591. package/src/hooks/useBoardRealtime.ts +0 -428
  592. package/src/hooks/useBoardRealtime.types.ts +0 -56
  593. package/src/hooks/useBoardRealtimeEventHandler.ts +0 -452
  594. package/src/hooks/useCursorTracking.ts +0 -402
  595. package/src/hooks/usePresence.ts +0 -272
  596. package/src/hooks/useTaskUserRealtime.ts +0 -340
  597. /package/src/{components/ui/tu-do/shared → lib}/task-open-events.ts +0 -0
@@ -1,1238 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- formatHotkeySequence,
5
- useHotkey,
6
- useHotkeySequence,
7
- } from '@tanstack/react-hotkeys';
8
- import { useQuery, useQueryClient } from '@tanstack/react-query';
9
- import {
10
- type ListWorkspaceTasksOptions,
11
- listWorkspaceTasks,
12
- } from '@tuturuuu/internal-api/tasks';
13
- import {
14
- TASK_BOARD_PINNED_SPECIAL_LISTS_CONFIG_ID,
15
- TASK_LAST_BOARD_VIEW_CONFIG_ID,
16
- TASK_QUICK_CREATE_TARGET_LIST_CONFIG_ID,
17
- } from '@tuturuuu/internal-api/users';
18
- import type {
19
- Workspace,
20
- WorkspaceProductTier,
21
- WorkspaceTaskBoard,
22
- } from '@tuturuuu/types';
23
- import type { Task } from '@tuturuuu/types/primitives/Task';
24
- import type { TaskList } from '@tuturuuu/types/primitives/TaskList';
25
- import {
26
- getPersonalExternalStagingListId,
27
- priorityCompare,
28
- type WorkspaceLabel,
29
- } from '@tuturuuu/utils/task-helper';
30
- import { useTranslations } from 'next-intl';
31
- import {
32
- type ReactNode,
33
- useCallback,
34
- useEffect,
35
- useLayoutEffect,
36
- useMemo,
37
- useState,
38
- } from 'react';
39
- import { useUserConfig } from '../../../../hooks/use-user-config';
40
- import {
41
- useUpdateUserWorkspaceConfig,
42
- useUserWorkspaceConfig,
43
- } from '../../../../hooks/use-user-workspace-config';
44
- import { KanbanBoard } from '../boards/boardId/kanban';
45
- import type {
46
- KanbanDeadlineCollapsedState,
47
- KanbanDeadlineSection,
48
- } from '../boards/boardId/kanban/rendering/kanban-deadline-panels';
49
- import type { TaskFilters } from '../boards/boardId/task-filter';
50
- import { TimelineBoard } from '../boards/boardId/timeline-board';
51
- import { DraftsPage } from '../drafts/drafts-page';
52
- import { useTaskDialog } from '../hooks/useTaskDialog';
53
- import MyTasksContent from '../my-tasks/my-tasks-content';
54
- import { BoardHeader, type ListStatusFilter } from '../shared/board-header';
55
- import { ListView } from '../shared/list-view';
56
- import { RecycleBinContent } from '../shared/recycle-bin-panel';
57
- import { loadBoardConfig } from './board-config-storage';
58
- import {
59
- parseSpecialTaskListPins,
60
- type SpecialTaskListPin,
61
- serializeSpecialTaskListPins,
62
- } from './special-task-list-pins';
63
- import {
64
- DEFAULT_TASK_QUICK_CREATE_TARGET_LIST,
65
- normalizeTaskQuickCreateTargetList,
66
- } from './task-quick-create-target-list';
67
-
68
- export type ViewType =
69
- | 'kanban'
70
- | 'list'
71
- | 'my_tasks'
72
- | 'timeline'
73
- | 'drafts'
74
- | 'recycle_bin';
75
-
76
- const HOTKEY_CREATE_TASK = 'C';
77
- const HOTKEY_GO_TO_KANBAN: ['G', 'K'] = ['G', 'K'];
78
- const HOTKEY_GO_TO_LIST: ['G', 'L'] = ['G', 'L'];
79
- const HOTKEY_GO_TO_MY_TASKS: ['G', 'M'] = ['G', 'M'];
80
- const HOTKEY_GO_TO_TIMELINE: ['G', 'T'] = ['G', 'T'];
81
- const HOTKEY_GO_TO_DRAFTS: ['G', 'D'] = ['G', 'D'];
82
- const HOTKEY_GO_TO_RECYCLE_BIN: ['G', 'R'] = ['G', 'R'];
83
- const EXTERNAL_TASKS_COLLAPSED_STORAGE_PREFIX =
84
- 'personal-board-external-tasks-collapsed';
85
- const CLOSED_TASK_LIST_COLLAPSED_STORAGE_PREFIX =
86
- 'task-board-closed-list-collapsed';
87
- const DEADLINE_SECTION_COLLAPSED_STORAGE_PREFIX =
88
- 'task-board-deadline-section-collapsed';
89
- const DEFAULT_TASK_FILTERS: TaskFilters = {
90
- labels: [],
91
- assignees: [],
92
- projects: [],
93
- priorities: [],
94
- dueDateRange: null,
95
- estimationRange: null,
96
- includeMyTasks: false,
97
- includeUnassigned: false,
98
- sourceScope: 'all_visible',
99
- sourceWorkspaceIds: [],
100
- sourceBoardIds: [],
101
- };
102
-
103
- function getClosedTaskListCollapsedStorageKey(boardId: string, listId: string) {
104
- return `${CLOSED_TASK_LIST_COLLAPSED_STORAGE_PREFIX}:${boardId}:${listId}`;
105
- }
106
-
107
- function getDeadlineSectionCollapsedStorageKey(
108
- boardId: string,
109
- section: KanbanDeadlineSection
110
- ) {
111
- return `${DEADLINE_SECTION_COLLAPSED_STORAGE_PREFIX}:${boardId}:${section}`;
112
- }
113
-
114
- function taskMatchesLocalFilters(
115
- task: Task,
116
- filters: TaskFilters,
117
- currentUserId?: string
118
- ) {
119
- const query = filters.searchQuery?.trim().toLowerCase();
120
- if (query) {
121
- const searchableText = [
122
- task.name,
123
- task.display_number ? String(task.display_number) : null,
124
- ...(task.labels ?? []).map((label) => label.name),
125
- ...(task.projects ?? []).map((project) => project.name),
126
- ...(task.assignees ?? []).map(
127
- (assignee) => assignee.display_name ?? assignee.email ?? assignee.handle
128
- ),
129
- ]
130
- .filter(Boolean)
131
- .join(' ')
132
- .toLowerCase();
133
-
134
- if (!searchableText.includes(query)) return false;
135
- }
136
-
137
- if (
138
- filters.labels.length > 0 &&
139
- !filters.labels.every((label) =>
140
- task.labels?.some((taskLabel) => taskLabel.id === label.id)
141
- )
142
- ) {
143
- return false;
144
- }
145
-
146
- if (
147
- filters.projects.length > 0 &&
148
- !filters.projects.every((project) =>
149
- task.projects?.some((taskProject) => taskProject.id === project.id)
150
- )
151
- ) {
152
- return false;
153
- }
154
-
155
- if (
156
- filters.priorities.length > 0 &&
157
- (!task.priority || !filters.priorities.includes(task.priority))
158
- ) {
159
- return false;
160
- }
161
-
162
- if (filters.assignees.length > 0) {
163
- const assigneeIds = new Set(
164
- filters.assignees.map((assignee) => assignee.id)
165
- );
166
- if (!task.assignees?.some((assignee) => assigneeIds.has(assignee.id))) {
167
- return false;
168
- }
169
- }
170
-
171
- if (
172
- filters.includeMyTasks &&
173
- currentUserId &&
174
- !task.assignees?.some((assignee) => assignee.id === currentUserId)
175
- ) {
176
- return false;
177
- }
178
-
179
- if (filters.includeUnassigned && (task.assignees?.length ?? 0) > 0) {
180
- return false;
181
- }
182
-
183
- if (filters.dueDateRange?.from || filters.dueDateRange?.to) {
184
- if (!task.end_date) return false;
185
- const dueTime = new Date(task.end_date).getTime();
186
- const fromTime = filters.dueDateRange.from?.getTime() ?? -Infinity;
187
- const toTime = filters.dueDateRange.to?.getTime() ?? Infinity;
188
- if (dueTime < fromTime || dueTime > toTime) return false;
189
- }
190
-
191
- if (
192
- typeof filters.estimationRange?.min === 'number' ||
193
- typeof filters.estimationRange?.max === 'number'
194
- ) {
195
- const estimate = task.estimation_points ?? 0;
196
- const min = filters.estimationRange.min ?? -Infinity;
197
- const max = filters.estimationRange.max ?? Infinity;
198
- if (estimate < min || estimate > max) return false;
199
- }
200
-
201
- return true;
202
- }
203
-
204
- function getTaskTimestamp(value: string | null | undefined) {
205
- if (!value) return Number.MAX_SAFE_INTEGER;
206
- const time = new Date(value).getTime();
207
- return Number.isFinite(time) ? time : Number.MAX_SAFE_INTEGER;
208
- }
209
-
210
- function sortLocalTasks(tasks: Task[], sortBy: TaskFilters['sortBy']) {
211
- if (!sortBy) return tasks;
212
-
213
- return [...tasks].sort((a, b) => {
214
- switch (sortBy) {
215
- case 'name-asc':
216
- return a.name.localeCompare(b.name);
217
- case 'name-desc':
218
- return b.name.localeCompare(a.name);
219
- case 'priority-high':
220
- return priorityCompare(a.priority ?? null, b.priority ?? null);
221
- case 'priority-low':
222
- return priorityCompare(b.priority ?? null, a.priority ?? null);
223
- case 'due-date-asc':
224
- return getTaskTimestamp(a.end_date) - getTaskTimestamp(b.end_date);
225
- case 'due-date-desc':
226
- return getTaskTimestamp(b.end_date) - getTaskTimestamp(a.end_date);
227
- case 'created-date-asc':
228
- return getTaskTimestamp(a.created_at) - getTaskTimestamp(b.created_at);
229
- case 'created-date-desc':
230
- return getTaskTimestamp(b.created_at) - getTaskTimestamp(a.created_at);
231
- case 'estimation-high':
232
- return (b.estimation_points ?? 0) - (a.estimation_points ?? 0);
233
- case 'estimation-low':
234
- return (a.estimation_points ?? 0) - (b.estimation_points ?? 0);
235
- default:
236
- return 0;
237
- }
238
- });
239
- }
240
-
241
- interface Props {
242
- workspace: Workspace;
243
- workspaceTier?: WorkspaceProductTier | null;
244
- board: WorkspaceTaskBoard & {
245
- access_type?: 'member' | 'guest';
246
- guest_permission?: 'view' | 'edit' | null;
247
- has_guest_access?: boolean;
248
- };
249
- tasks: Task[];
250
- lists: TaskList[];
251
- workspaceLabels: WorkspaceLabel[];
252
- availableViews?: ViewType[];
253
- canManageBoard?: boolean;
254
- currentUserId?: string;
255
- defaultView?: ViewType;
256
- idleBottomIsland?: ReactNode;
257
- publicHeaderPrefix?: ReactNode;
258
- publicView?: boolean;
259
- readOnly?: boolean;
260
- }
261
-
262
- export function BoardViews({
263
- workspace,
264
- workspaceTier,
265
- board,
266
- tasks,
267
- lists,
268
- availableViews,
269
- canManageBoard = true,
270
- currentUserId,
271
- defaultView,
272
- idleBottomIsland,
273
- publicHeaderPrefix,
274
- publicView = false,
275
- readOnly = false,
276
- }: Props) {
277
- const t = useTranslations('common');
278
- const tTasks = useTranslations('ws-tasks');
279
- const tBoards = useTranslations('ws-task-boards');
280
- const queryClient = useQueryClient();
281
- const effectiveWorkspaceId = board.ws_id ?? workspace.id;
282
- const [currentView, setCurrentView] = useState<ViewType>('kanban');
283
- const [externalTasksCollapsed, setExternalTasksCollapsed] = useState(false);
284
- const [closedTaskListsCollapsed, setClosedTaskListsCollapsed] = useState<
285
- Record<string, boolean>
286
- >({});
287
- const [deadlineSectionsCollapsed, setDeadlineSectionsCollapsed] =
288
- useState<KanbanDeadlineCollapsedState>({});
289
- const [filters, setFilters] = useState<TaskFilters>(DEFAULT_TASK_FILTERS);
290
- const [listStatusFilter, setListStatusFilter] =
291
- useState<ListStatusFilter>('all');
292
- // Local per-session optimistic overrides (e.g., timeline resize) so switching views preserves changes
293
- const [taskOverrides, setTaskOverrides] = useState<
294
- Record<string, Partial<Task>>
295
- >({});
296
- const [isMultiSelectMode, setIsMultiSelectMode] = useState(false);
297
- const [kanbanBulkSelectionActive, setKanbanBulkSelectionActive] =
298
- useState(false);
299
- const [hoveredTaskListId, setHoveredTaskListId] = useState<string | null>(
300
- null
301
- );
302
- const { createTask } = useTaskDialog();
303
- const localTaskState = readOnly || publicView;
304
- const { data: quickCreateTargetListRaw } = useUserConfig(
305
- TASK_QUICK_CREATE_TARGET_LIST_CONFIG_ID,
306
- DEFAULT_TASK_QUICK_CREATE_TARGET_LIST,
307
- { enabled: !localTaskState }
308
- );
309
- const quickCreateTargetList = normalizeTaskQuickCreateTargetList(
310
- quickCreateTargetListRaw
311
- );
312
- const boardAssigneesEnabled =
313
- !workspace.personal ||
314
- board.access_type === 'guest' ||
315
- board.has_guest_access === true;
316
- const assigneeMemberSource: 'workspace' | 'board' | 'workspace-and-board' =
317
- board.access_type === 'guest'
318
- ? 'board'
319
- : board.has_guest_access === true
320
- ? workspace.personal
321
- ? 'board'
322
- : 'workspace-and-board'
323
- : 'workspace';
324
- const { data: pinnedSpecialListsRaw } = useUserWorkspaceConfig(
325
- effectiveWorkspaceId,
326
- TASK_BOARD_PINNED_SPECIAL_LISTS_CONFIG_ID,
327
- null,
328
- { enabled: !localTaskState }
329
- );
330
- const updateUserWorkspaceConfig = useUpdateUserWorkspaceConfig();
331
- const specialTaskListPins = useMemo(
332
- () => parseSpecialTaskListPins(pinnedSpecialListsRaw),
333
- [pinnedSpecialListsRaw]
334
- );
335
- const handleSpecialTaskListPinnedChange = useCallback(
336
- (pin: SpecialTaskListPin, pinned: boolean) => {
337
- const nextPins = {
338
- ...specialTaskListPins,
339
- [pin]: pinned,
340
- };
341
-
342
- if (!pinned) delete nextPins[pin];
343
-
344
- updateUserWorkspaceConfig.mutate({
345
- configId: TASK_BOARD_PINNED_SPECIAL_LISTS_CONFIG_ID,
346
- value: serializeSpecialTaskListPins(nextPins),
347
- workspaceId: effectiveWorkspaceId,
348
- });
349
- },
350
- [effectiveWorkspaceId, specialTaskListPins, updateUserWorkspaceConfig]
351
- );
352
- const enabledViews = useMemo(
353
- () =>
354
- availableViews ??
355
- (publicView || readOnly
356
- ? (['kanban', 'list', 'timeline'] as ViewType[])
357
- : ([
358
- 'kanban',
359
- 'list',
360
- 'my_tasks',
361
- 'timeline',
362
- 'drafts',
363
- 'recycle_bin',
364
- ] as ViewType[])),
365
- [availableViews, publicView, readOnly]
366
- );
367
- const viewIsEnabled = useCallback(
368
- (view: ViewType) => !enabledViews || enabledViews.includes(view),
369
- [enabledViews]
370
- );
371
- const sourceScope = filters.sourceScope ?? 'all_visible';
372
- const sourceWorkspaceIds = filters.sourceWorkspaceIds ?? [];
373
- const sourceBoardIds = filters.sourceBoardIds ?? [];
374
- const isExternalSourceScope =
375
- sourceScope === 'external_current_workspace' ||
376
- sourceScope === 'external_specific';
377
- const listStatusesForQuery = useMemo(
378
- () => (listStatusFilter === 'all' ? undefined : [listStatusFilter]),
379
- [listStatusFilter]
380
- );
381
- const hasTaskFilters = useMemo(
382
- () =>
383
- filters.labels.length > 0 ||
384
- filters.assignees.length > 0 ||
385
- filters.projects.length > 0 ||
386
- filters.priorities.length > 0 ||
387
- !!filters.dueDateRange?.from ||
388
- !!filters.dueDateRange?.to ||
389
- typeof filters.estimationRange?.min === 'number' ||
390
- typeof filters.estimationRange?.max === 'number' ||
391
- !!filters.searchQuery?.trim() ||
392
- filters.includeMyTasks ||
393
- filters.includeUnassigned ||
394
- sourceScope !== 'all_visible' ||
395
- sourceWorkspaceIds.length > 0 ||
396
- sourceBoardIds.length > 0,
397
- [filters, sourceBoardIds.length, sourceScope, sourceWorkspaceIds.length]
398
- );
399
- const hasServerTaskQuery = hasTaskFilters || !!filters.sortBy;
400
- const taskQueryOptions = useMemo<ListWorkspaceTasksOptions>(
401
- () => ({
402
- assignedToMe: filters.includeMyTasks || undefined,
403
- assigneeIds: filters.includeMyTasks
404
- ? undefined
405
- : filters.assignees.map((assignee) => assignee.id),
406
- dueDateFrom: filters.dueDateRange?.from?.toISOString(),
407
- dueDateTo: filters.dueDateRange?.to?.toISOString(),
408
- estimationMax: filters.estimationRange?.max,
409
- estimationMin: filters.estimationRange?.min,
410
- includeUnassigned: filters.includeUnassigned || undefined,
411
- labelIds: filters.labels.map((label) => label.id),
412
- priorities: filters.priorities,
413
- projectIds: filters.projects.map((project) => project.id),
414
- q: filters.searchQuery?.trim() || undefined,
415
- sortBy: filters.sortBy,
416
- sourceBoardIds,
417
- sourceScope,
418
- sourceWorkspaceIds,
419
- }),
420
- [
421
- filters.assignees,
422
- filters.dueDateRange?.from,
423
- filters.dueDateRange?.to,
424
- filters.estimationRange?.max,
425
- filters.estimationRange?.min,
426
- filters.includeMyTasks,
427
- filters.includeUnassigned,
428
- filters.labels,
429
- filters.priorities,
430
- filters.projects,
431
- filters.searchQuery,
432
- filters.sortBy,
433
- sourceBoardIds,
434
- sourceScope,
435
- sourceWorkspaceIds,
436
- ]
437
- );
438
- const taskFilterKey = useMemo(
439
- () =>
440
- JSON.stringify({
441
- listStatusFilter,
442
- query: taskQueryOptions,
443
- scope: sourceScope,
444
- sourceBoardIds: [...sourceBoardIds].sort(),
445
- sourceWorkspaceIds: [...sourceWorkspaceIds].sort(),
446
- }),
447
- [
448
- listStatusFilter,
449
- sourceBoardIds,
450
- sourceScope,
451
- sourceWorkspaceIds,
452
- taskQueryOptions,
453
- ]
454
- );
455
- const deadlineTaskQueryOptions = useMemo<ListWorkspaceTasksOptions>(() => {
456
- const { sortBy: _sortBy, ...filterOptions } = taskQueryOptions;
457
- return {
458
- ...filterOptions,
459
- listStatuses: listStatusesForQuery,
460
- };
461
- }, [listStatusesForQuery, taskQueryOptions]);
462
- const viewHotkeyLabels = useMemo(
463
- () => ({
464
- kanban: formatHotkeySequence(HOTKEY_GO_TO_KANBAN),
465
- list: formatHotkeySequence(HOTKEY_GO_TO_LIST),
466
- my_tasks: formatHotkeySequence(HOTKEY_GO_TO_MY_TASKS),
467
- timeline: formatHotkeySequence(HOTKEY_GO_TO_TIMELINE),
468
- drafts: formatHotkeySequence(HOTKEY_GO_TO_DRAFTS),
469
- recycle_bin: formatHotkeySequence(HOTKEY_GO_TO_RECYCLE_BIN),
470
- }),
471
- []
472
- );
473
- const shouldEagerLoadTasks =
474
- currentView === 'list' || currentView === 'timeline' || hasServerTaskQuery;
475
- const fetchBoardTasks = useCallback(async () => {
476
- const result = await listWorkspaceTasks(effectiveWorkspaceId, {
477
- ...taskQueryOptions,
478
- boardId: board.id,
479
- includeRelationshipSummary: false,
480
- listStatuses: listStatusesForQuery,
481
- limit: 200,
482
- });
483
- return result.tasks;
484
- }, [board.id, effectiveWorkspaceId, listStatusesForQuery, taskQueryOptions]);
485
-
486
- const primeFullTaskCache = useCallback(
487
- (nextView: ViewType) => {
488
- if (localTaskState) return;
489
- if (nextView !== 'list' && nextView !== 'timeline') return;
490
-
491
- void queryClient.prefetchQuery({
492
- queryKey: ['tasks-full', board.id, taskFilterKey],
493
- queryFn: fetchBoardTasks,
494
- staleTime: 0,
495
- });
496
- },
497
- [board.id, fetchBoardTasks, localTaskState, queryClient, taskFilterKey]
498
- );
499
-
500
- const handleViewChange = useCallback(
501
- (nextView: ViewType) => {
502
- if (!viewIsEnabled(nextView)) return;
503
- setCurrentView(nextView);
504
- primeFullTaskCache(nextView);
505
- if (!localTaskState) {
506
- updateUserWorkspaceConfig.mutate({
507
- configId: TASK_LAST_BOARD_VIEW_CONFIG_ID,
508
- value: nextView,
509
- workspaceId: effectiveWorkspaceId,
510
- });
511
- }
512
-
513
- if (typeof window !== 'undefined') {
514
- const currentUrl = new URL(window.location.href);
515
- if (!currentUrl.pathname.includes('/tasks/boards/')) return;
516
-
517
- const params = currentUrl.searchParams;
518
- if (nextView === 'kanban') {
519
- params.delete('view');
520
- } else {
521
- params.set('view', nextView);
522
- }
523
- const nextQuery = params.toString();
524
- window.history.replaceState(
525
- window.history.state,
526
- '',
527
- `${currentUrl.pathname}${nextQuery ? `?${nextQuery}` : ''}${currentUrl.hash}`
528
- );
529
- }
530
- },
531
- [
532
- effectiveWorkspaceId,
533
- localTaskState,
534
- primeFullTaskCache,
535
- updateUserWorkspaceConfig,
536
- viewIsEnabled,
537
- ]
538
- );
539
-
540
- const { data: fullTasks = [], isFetching: isFullTasksFetching } = useQuery({
541
- queryKey: ['tasks-full', board.id, taskFilterKey],
542
- enabled: !localTaskState && shouldEagerLoadTasks,
543
- queryFn: fetchBoardTasks,
544
- refetchOnMount: 'always',
545
- staleTime: 0,
546
- });
547
-
548
- const initialTaskLists = useMemo(
549
- () => lists.filter((list) => !list.deleted),
550
- [lists]
551
- );
552
-
553
- const { data: boardLists = initialTaskLists } = useQuery({
554
- queryKey: ['task_lists', board.id],
555
- queryFn: async () => initialTaskLists,
556
- initialData: initialTaskLists,
557
- staleTime: Infinity,
558
- });
559
-
560
- useEffect(() => {
561
- queryClient.setQueryData(['task_lists', board.id], initialTaskLists);
562
- }, [board.id, initialTaskLists, queryClient]);
563
-
564
- useLayoutEffect(() => {
565
- const savedConfig = loadBoardConfig(board.id);
566
- const requestedView =
567
- typeof window === 'undefined' ||
568
- !window.location.pathname.includes('/tasks/boards/')
569
- ? null
570
- : (new URLSearchParams(window.location.search).get(
571
- 'view'
572
- ) as ViewType | null);
573
- const fallbackView = enabledViews?.[0] ?? 'kanban';
574
- const routeDefaultView =
575
- defaultView && viewIsEnabled(defaultView) ? defaultView : null;
576
- const effectiveDefaultView = routeDefaultView ?? fallbackView;
577
- const initialView =
578
- requestedView && viewIsEnabled(requestedView) ? requestedView : null;
579
-
580
- if (!savedConfig) {
581
- setCurrentView(initialView ?? effectiveDefaultView);
582
- setFilters(DEFAULT_TASK_FILTERS);
583
- setListStatusFilter('all');
584
- return;
585
- }
586
-
587
- setCurrentView(
588
- initialView ??
589
- routeDefaultView ??
590
- (viewIsEnabled(savedConfig.currentView)
591
- ? savedConfig.currentView
592
- : effectiveDefaultView)
593
- );
594
- setFilters({
595
- ...DEFAULT_TASK_FILTERS,
596
- ...savedConfig.filters,
597
- });
598
- setListStatusFilter(savedConfig.listStatusFilter);
599
- }, [board.id, defaultView, enabledViews, viewIsEnabled]);
600
-
601
- useEffect(() => {
602
- if (!workspace.personal || typeof window === 'undefined') {
603
- setExternalTasksCollapsed(false);
604
- return;
605
- }
606
-
607
- const storedValue = window.localStorage.getItem(
608
- `${EXTERNAL_TASKS_COLLAPSED_STORAGE_PREFIX}:${board.id}`
609
- );
610
- const storedPreference =
611
- storedValue === null ? null : storedValue === 'true';
612
-
613
- setExternalTasksCollapsed(storedPreference ?? true);
614
- }, [board.id, workspace.personal]);
615
-
616
- const handleExternalTasksCollapsedChange = useCallback(
617
- (collapsed: boolean) => {
618
- setExternalTasksCollapsed(collapsed);
619
-
620
- if (!workspace.personal || typeof window === 'undefined') return;
621
-
622
- window.localStorage.setItem(
623
- `${EXTERNAL_TASKS_COLLAPSED_STORAGE_PREFIX}:${board.id}`,
624
- String(collapsed)
625
- );
626
- },
627
- [board.id, workspace.personal]
628
- );
629
-
630
- useEffect(() => {
631
- const closedLists = boardLists.filter(
632
- (list) => !list.deleted && list.status === 'closed'
633
- );
634
-
635
- if (closedLists.length === 0) {
636
- setClosedTaskListsCollapsed({});
637
- return;
638
- }
639
-
640
- setClosedTaskListsCollapsed((previous) => {
641
- const next: Record<string, boolean> = {};
642
-
643
- for (const list of closedLists) {
644
- const storedValue =
645
- typeof window === 'undefined'
646
- ? null
647
- : window.localStorage.getItem(
648
- getClosedTaskListCollapsedStorageKey(board.id, list.id)
649
- );
650
-
651
- next[list.id] =
652
- storedValue === null
653
- ? (previous[list.id] ?? true)
654
- : storedValue === 'true';
655
- }
656
-
657
- return next;
658
- });
659
- }, [board.id, boardLists]);
660
-
661
- const handleTaskListCollapsedChange = useCallback(
662
- (listId: string, collapsed: boolean) => {
663
- setClosedTaskListsCollapsed((previous) => ({
664
- ...previous,
665
- [listId]: collapsed,
666
- }));
667
-
668
- if (typeof window === 'undefined') return;
669
-
670
- window.localStorage.setItem(
671
- getClosedTaskListCollapsedStorageKey(board.id, listId),
672
- String(collapsed)
673
- );
674
- },
675
- [board.id]
676
- );
677
-
678
- useEffect(() => {
679
- setDeadlineSectionsCollapsed((previous) => {
680
- const next: KanbanDeadlineCollapsedState = {};
681
-
682
- for (const section of ['overdue', 'upcoming'] as const) {
683
- const storedValue =
684
- typeof window === 'undefined'
685
- ? null
686
- : window.localStorage.getItem(
687
- getDeadlineSectionCollapsedStorageKey(board.id, section)
688
- );
689
-
690
- next[section] =
691
- storedValue === null
692
- ? (previous[section] ?? true)
693
- : storedValue === 'true';
694
- }
695
-
696
- return next;
697
- });
698
- }, [board.id]);
699
-
700
- const handleDeadlineSectionCollapsedChange = useCallback(
701
- (section: KanbanDeadlineSection, collapsed: boolean) => {
702
- setDeadlineSectionsCollapsed((previous) => ({
703
- ...previous,
704
- [section]: collapsed,
705
- }));
706
-
707
- if (typeof window === 'undefined') return;
708
-
709
- window.localStorage.setItem(
710
- getDeadlineSectionCollapsedStorageKey(board.id, section),
711
- String(collapsed)
712
- );
713
- },
714
- [board.id]
715
- );
716
-
717
- const externalStagingList = useMemo<TaskList | null>(() => {
718
- if (!workspace.personal) return null;
719
-
720
- return {
721
- id: getPersonalExternalStagingListId(board.id),
722
- name: tTasks('external_tasks'),
723
- archived: false,
724
- deleted: false,
725
- created_at: board.created_at ?? '',
726
- board_id: board.id,
727
- creator_id: '',
728
- status: 'not_started',
729
- color: 'CYAN',
730
- position: Number.MIN_SAFE_INTEGER,
731
- is_external_staging: true,
732
- is_external_collapsed: externalTasksCollapsed,
733
- };
734
- }, [
735
- board.created_at,
736
- board.id,
737
- externalTasksCollapsed,
738
- tTasks,
739
- workspace.personal,
740
- ]);
741
-
742
- const activeLists = useMemo(() => {
743
- const realLists = boardLists
744
- .filter((list) => !list.deleted)
745
- .map((list) =>
746
- list.status === 'closed'
747
- ? {
748
- ...list,
749
- is_collapsed: closedTaskListsCollapsed[list.id] ?? true,
750
- }
751
- : list
752
- );
753
- return externalStagingList
754
- ? [externalStagingList, ...realLists]
755
- : realLists;
756
- }, [boardLists, closedTaskListsCollapsed, externalStagingList]);
757
-
758
- const effectiveDeadlineSectionsCollapsed =
759
- useMemo<KanbanDeadlineCollapsedState>(
760
- () => ({
761
- overdue: deadlineSectionsCollapsed.overdue,
762
- upcoming: deadlineSectionsCollapsed.upcoming,
763
- }),
764
- [deadlineSectionsCollapsed.overdue, deadlineSectionsCollapsed.upcoming]
765
- );
766
-
767
- const { data: filteredListCounts, isFetching: isFilteredListCountsFetching } =
768
- useQuery({
769
- queryKey: ['task-list-counts', board.id, taskFilterKey],
770
- enabled: !localTaskState && hasTaskFilters,
771
- queryFn: async () => {
772
- const result = await listWorkspaceTasks(effectiveWorkspaceId, {
773
- ...taskQueryOptions,
774
- boardId: board.id,
775
- includeListCounts: true,
776
- includeRelationshipSummary: false,
777
- limit: 0,
778
- listStatuses: listStatusesForQuery,
779
- });
780
- return result.listCounts ?? [];
781
- },
782
- staleTime: 30_000,
783
- });
784
-
785
- const locallyFilteredTasks = useMemo(
786
- () =>
787
- sortLocalTasks(
788
- tasks.filter((task) =>
789
- taskMatchesLocalFilters(task, filters, currentUserId)
790
- ),
791
- filters.sortBy
792
- ),
793
- [currentUserId, filters, tasks]
794
- );
795
-
796
- const localListCounts = useMemo(() => {
797
- if (!localTaskState || !hasTaskFilters) return null;
798
-
799
- const counts = new Map<string, number>();
800
- for (const task of locallyFilteredTasks) {
801
- counts.set(task.list_id, (counts.get(task.list_id) ?? 0) + 1);
802
- }
803
-
804
- return [...counts.entries()].map(([list_id, count]) => ({
805
- list_id,
806
- count,
807
- }));
808
- }, [hasTaskFilters, localTaskState, locallyFilteredTasks]);
809
-
810
- // Filter lists based on selected status filter
811
- const statusFilteredLists = useMemo(() => {
812
- if (listStatusFilter === 'all') return activeLists;
813
-
814
- const stagingLists = activeLists.filter((list) => list.is_external_staging);
815
- const realLists = activeLists.filter(
816
- (list) => !list.is_external_staging && list.status === listStatusFilter
817
- );
818
- return [...stagingLists, ...realLists];
819
- }, [activeLists, listStatusFilter]);
820
-
821
- const filteredLists = useMemo(() => {
822
- const listCounts = localTaskState ? localListCounts : filteredListCounts;
823
- if (!hasTaskFilters || !listCounts) return statusFilteredLists;
824
-
825
- const countByListId = new Map(
826
- listCounts.map((entry) => [entry.list_id, entry.count] as const)
827
- );
828
-
829
- return statusFilteredLists.filter(
830
- (list) => (countByListId.get(list.id) ?? 0) > 0
831
- );
832
- }, [
833
- filteredListCounts,
834
- hasTaskFilters,
835
- localListCounts,
836
- localTaskState,
837
- statusFilteredLists,
838
- ]);
839
-
840
- useEffect(() => {
841
- if (!hoveredTaskListId) return;
842
-
843
- const stillSelectable = filteredLists.some(
844
- (list) => list.id === hoveredTaskListId && !list.is_external_staging
845
- );
846
- if (!stillSelectable) setHoveredTaskListId(null);
847
- }, [filteredLists, hoveredTaskListId]);
848
-
849
- const sourceTasks = useMemo(() => {
850
- if (localTaskState) return locallyFilteredTasks;
851
-
852
- if (!shouldEagerLoadTasks) return tasks;
853
-
854
- if (fullTasks.length === 0) {
855
- return hasServerTaskQuery || sourceScope !== 'all_visible' ? [] : tasks;
856
- }
857
-
858
- if (hasServerTaskQuery || sourceScope !== 'all_visible') {
859
- return fullTasks;
860
- }
861
-
862
- const progressiveById = new Map(
863
- tasks.map((task) => [task.id, task] as const)
864
- );
865
- const merged = fullTasks.map(
866
- (task) => ({ ...(progressiveById.get(task.id) ?? {}), ...task }) as Task
867
- );
868
-
869
- for (const task of tasks) {
870
- if (!merged.some((item) => item.id === task.id)) {
871
- merged.push(task);
872
- }
873
- }
874
-
875
- return merged;
876
- }, [
877
- fullTasks,
878
- hasServerTaskQuery,
879
- localTaskState,
880
- locallyFilteredTasks,
881
- shouldEagerLoadTasks,
882
- sourceScope,
883
- tasks,
884
- ]);
885
-
886
- // Keep only tasks that belong to the server-visible lists/status scope.
887
- const filteredTasks = useMemo(() => {
888
- const listIds = new Set(filteredLists.map((list) => list.id));
889
- return isExternalSourceScope
890
- ? sourceTasks
891
- : sourceTasks.filter((task) => listIds.has(task.list_id));
892
- }, [filteredLists, isExternalSourceScope, sourceTasks]);
893
-
894
- // Apply optimistic overrides so views receive up-to-date edits (durations, name, dates) even before refetch.
895
- const effectiveTasks = useMemo(() => {
896
- let tasks = filteredTasks;
897
-
898
- // Apply overrides
899
- if (Object.keys(taskOverrides).length) {
900
- tasks = tasks.map((t) => {
901
- const o = taskOverrides[t.id];
902
- return o ? ({ ...t, ...o } as Task) : t;
903
- });
904
- }
905
-
906
- tasks = tasks.filter((task) => !task.deleted_at);
907
-
908
- return tasks;
909
- }, [filteredTasks, taskOverrides]);
910
-
911
- const handleTaskPartialUpdate = (taskId: string, partial: Partial<Task>) => {
912
- setTaskOverrides((prev) => ({
913
- ...prev,
914
- [taskId]: { ...(prev[taskId] || {}), ...partial },
915
- }));
916
- };
917
-
918
- const handleUpdate = async () => {
919
- // Note: We intentionally do NOT invalidate queries here.
920
- // Optimistic updates handle immediate UI feedback, and realtime
921
- // subscription handles cross-user sync. Invalidating would cause
922
- // all tasks to flicker (disappear then reappear).
923
- };
924
-
925
- useHotkey(
926
- HOTKEY_CREATE_TASK,
927
- () => {
928
- const selectableLists = filteredLists.filter(
929
- (list) => !list.is_external_staging
930
- );
931
- const defaultTargetList =
932
- selectableLists.find((list) => list.id === board.default_list_id) ??
933
- selectableLists[0];
934
- const hoveredTargetList =
935
- quickCreateTargetList === 'hovered_list'
936
- ? selectableLists.find((list) => list.id === hoveredTaskListId)
937
- : undefined;
938
- const targetList = hoveredTargetList ?? defaultTargetList;
939
- if (!targetList) return;
940
- createTask(board.id, targetList.id, selectableLists, filters);
941
- },
942
- {
943
- enabled:
944
- !readOnly &&
945
- currentView !== 'drafts' &&
946
- currentView !== 'recycle_bin' &&
947
- filteredLists.some((list) => !list.is_external_staging),
948
- ignoreInputs: true,
949
- preventDefault: true,
950
- }
951
- );
952
-
953
- useHotkeySequence(
954
- HOTKEY_GO_TO_KANBAN,
955
- () => {
956
- handleViewChange('kanban');
957
- },
958
- {
959
- enabled: viewIsEnabled('kanban'),
960
- ignoreInputs: true,
961
- preventDefault: true,
962
- }
963
- );
964
-
965
- useHotkeySequence(
966
- HOTKEY_GO_TO_LIST,
967
- () => {
968
- handleViewChange('list');
969
- },
970
- {
971
- enabled: viewIsEnabled('list'),
972
- ignoreInputs: true,
973
- preventDefault: true,
974
- }
975
- );
976
-
977
- useHotkeySequence(
978
- HOTKEY_GO_TO_MY_TASKS,
979
- () => {
980
- handleViewChange('my_tasks');
981
- },
982
- {
983
- enabled: viewIsEnabled('my_tasks'),
984
- ignoreInputs: true,
985
- preventDefault: true,
986
- }
987
- );
988
-
989
- useHotkeySequence(
990
- HOTKEY_GO_TO_TIMELINE,
991
- () => {
992
- handleViewChange('timeline');
993
- },
994
- {
995
- enabled: viewIsEnabled('timeline'),
996
- ignoreInputs: true,
997
- preventDefault: true,
998
- }
999
- );
1000
-
1001
- useHotkeySequence(
1002
- HOTKEY_GO_TO_DRAFTS,
1003
- () => {
1004
- handleViewChange('drafts');
1005
- },
1006
- {
1007
- enabled: viewIsEnabled('drafts'),
1008
- ignoreInputs: true,
1009
- preventDefault: true,
1010
- }
1011
- );
1012
-
1013
- useHotkeySequence(
1014
- HOTKEY_GO_TO_RECYCLE_BIN,
1015
- () => {
1016
- handleViewChange('recycle_bin');
1017
- },
1018
- {
1019
- enabled: viewIsEnabled('recycle_bin'),
1020
- ignoreInputs: true,
1021
- preventDefault: true,
1022
- }
1023
- );
1024
-
1025
- const renderView = () => {
1026
- switch (currentView) {
1027
- case 'kanban':
1028
- return (
1029
- <KanbanBoard
1030
- workspace={workspace}
1031
- workspaceTier={workspaceTier}
1032
- workspaceId={effectiveWorkspaceId}
1033
- boardId={board.id}
1034
- tasks={effectiveTasks}
1035
- lists={filteredLists}
1036
- isLoading={false}
1037
- disableSort={!!filters.sortBy}
1038
- deadlineTaskQueryOptions={deadlineTaskQueryOptions}
1039
- listStatusFilter={listStatusFilter}
1040
- filters={filters}
1041
- isMultiSelectMode={readOnly ? false : isMultiSelectMode}
1042
- setIsMultiSelectMode={readOnly ? () => {} : setIsMultiSelectMode}
1043
- onExternalTasksCollapsedChange={handleExternalTasksCollapsedChange}
1044
- onTaskListCollapsedChange={handleTaskListCollapsedChange}
1045
- deadlineSectionsCollapsed={effectiveDeadlineSectionsCollapsed}
1046
- onDeadlineSectionCollapsedChange={
1047
- handleDeadlineSectionCollapsedChange
1048
- }
1049
- specialTaskListPins={specialTaskListPins}
1050
- onSpecialTaskListPinnedChange={handleSpecialTaskListPinnedChange}
1051
- onBulkSelectionActiveChange={setKanbanBulkSelectionActive}
1052
- canUseBoardAssignees={boardAssigneesEnabled}
1053
- assigneeMemberSource={assigneeMemberSource}
1054
- onHoveredTaskListChange={setHoveredTaskListId}
1055
- readOnly={readOnly}
1056
- />
1057
- );
1058
- case 'my_tasks':
1059
- return (
1060
- <div className="h-full overflow-y-auto p-3 sm:p-4">
1061
- <div className="mx-auto max-w-5xl pb-20">
1062
- {currentUserId ? (
1063
- <MyTasksContent
1064
- disableAutoCreateBoard
1065
- embedded
1066
- initialBoard={{
1067
- id: board.id,
1068
- name: board.name ?? null,
1069
- }}
1070
- initialLists={boardLists}
1071
- initialListId={board.default_list_id ?? undefined}
1072
- isPersonal={workspace.personal}
1073
- userId={currentUserId}
1074
- wsId={effectiveWorkspaceId}
1075
- />
1076
- ) : null}
1077
- </div>
1078
- </div>
1079
- );
1080
- case 'list':
1081
- return (
1082
- <ListView
1083
- workspaceId={effectiveWorkspaceId}
1084
- boardId={board.id}
1085
- tasks={effectiveTasks}
1086
- lists={filteredLists}
1087
- isPersonalWorkspace={workspace.personal}
1088
- canUseBoardAssignees={boardAssigneesEnabled}
1089
- assigneeMemberSource={assigneeMemberSource}
1090
- preserveTaskOrder={!!filters.sortBy}
1091
- searchQuery={filters.searchQuery}
1092
- readOnly={readOnly}
1093
- />
1094
- );
1095
- case 'timeline':
1096
- return (
1097
- <TimelineBoard
1098
- wsId={effectiveWorkspaceId}
1099
- boardId={board.id}
1100
- tasks={effectiveTasks}
1101
- lists={filteredLists}
1102
- isPersonalWorkspace={workspace.personal}
1103
- canUseBoardAssignees={boardAssigneesEnabled}
1104
- assigneeMemberSource={assigneeMemberSource}
1105
- onTaskPartialUpdate={handleTaskPartialUpdate}
1106
- />
1107
- );
1108
- case 'drafts':
1109
- return (
1110
- <div className="h-full overflow-y-auto p-3 sm:p-4">
1111
- <DraftsPage
1112
- boardId={board.id}
1113
- includeUnassignedForBoard
1114
- wsId={effectiveWorkspaceId}
1115
- />
1116
- </div>
1117
- );
1118
- case 'recycle_bin':
1119
- return (
1120
- <RecycleBinContent
1121
- active
1122
- boardId={board.id}
1123
- className="h-full"
1124
- lists={boardLists}
1125
- translations={{
1126
- recycleBin: t('recycle_bin'),
1127
- recycleBinDescription: t('recycle_bin_description'),
1128
- noDeletedTasks: t('no_deleted_tasks'),
1129
- deletedTasksWillAppearHere: t('deleted_tasks_will_appear_here'),
1130
- selectedOfTotal: t('selected_of_total', {
1131
- selected: '{selected}',
1132
- total: '{total}',
1133
- }),
1134
- deletedTasksCount: t('deleted_tasks_count', { count: '{count}' }),
1135
- restore: t('restore'),
1136
- delete: t('delete'),
1137
- restoreTasksTitle: t('restore_tasks_title', { count: '{count}' }),
1138
- restoreTasksDescription: t('restore_tasks_description'),
1139
- cancel: t('cancel'),
1140
- restoring: t('restoring'),
1141
- permanentlyDeleteTitle: t('permanently_delete_title', {
1142
- count: '{count}',
1143
- }),
1144
- permanentlyDeleteDescription: t('permanently_delete_description'),
1145
- deleting: t('deleting'),
1146
- deletePermanently: t('delete_permanently'),
1147
- noListsAvailable: t('no_lists_available'),
1148
- restoredTasks: t('restored_tasks', { count: '{count}' }),
1149
- failedToRestore: t('failed_to_restore'),
1150
- permanentlyDeleted: t('permanently_deleted', {
1151
- count: '{count}',
1152
- }),
1153
- failedToDelete: t('failed_to_delete'),
1154
- deletedAgo: t('deleted_ago', { time: '{time}' }),
1155
- fromList: t('from_list', { list: '{list}' }),
1156
- nProjects: t('n_projects', { count: '{count}' }),
1157
- selectAllTasks: t('select_all_tasks'),
1158
- selectTask: t('select_task', { name: '{name}' }),
1159
- critical: tBoards('dialog.priority.critical'),
1160
- high: tBoards('dialog.priority.high'),
1161
- normal: tBoards('dialog.priority.normal'),
1162
- low: tBoards('dialog.priority.low'),
1163
- unknownList: t('unknown_list'),
1164
- }}
1165
- wsId={effectiveWorkspaceId}
1166
- />
1167
- );
1168
- default:
1169
- return (
1170
- <KanbanBoard
1171
- workspace={workspace}
1172
- workspaceTier={workspaceTier}
1173
- workspaceId={effectiveWorkspaceId}
1174
- boardId={board.id}
1175
- tasks={effectiveTasks}
1176
- lists={filteredLists}
1177
- isLoading={false}
1178
- disableSort={!!filters.sortBy}
1179
- deadlineTaskQueryOptions={deadlineTaskQueryOptions}
1180
- listStatusFilter={listStatusFilter}
1181
- filters={filters}
1182
- isMultiSelectMode={readOnly ? false : isMultiSelectMode}
1183
- setIsMultiSelectMode={readOnly ? () => {} : setIsMultiSelectMode}
1184
- onExternalTasksCollapsedChange={handleExternalTasksCollapsedChange}
1185
- onTaskListCollapsedChange={handleTaskListCollapsedChange}
1186
- deadlineSectionsCollapsed={effectiveDeadlineSectionsCollapsed}
1187
- onDeadlineSectionCollapsedChange={
1188
- handleDeadlineSectionCollapsedChange
1189
- }
1190
- specialTaskListPins={specialTaskListPins}
1191
- onSpecialTaskListPinnedChange={handleSpecialTaskListPinnedChange}
1192
- onBulkSelectionActiveChange={setKanbanBulkSelectionActive}
1193
- canUseBoardAssignees={boardAssigneesEnabled}
1194
- assigneeMemberSource={assigneeMemberSource}
1195
- readOnly={readOnly}
1196
- />
1197
- );
1198
- }
1199
- };
1200
-
1201
- const showIdleBottomIsland =
1202
- !readOnly &&
1203
- !!idleBottomIsland &&
1204
- (currentView !== 'kanban' || !kanbanBulkSelectionActive);
1205
-
1206
- return (
1207
- <div className="-m-2 -mb-4 flex h-[calc(100vh-0.5rem)] flex-1 flex-col md:-mx-4">
1208
- <BoardHeader
1209
- workspaceId={effectiveWorkspaceId}
1210
- board={board}
1211
- currentUserId={currentUserId}
1212
- currentView={currentView}
1213
- onViewChange={handleViewChange}
1214
- viewHotkeyLabels={viewHotkeyLabels}
1215
- filters={filters}
1216
- onFiltersChange={setFilters}
1217
- listStatusFilter={listStatusFilter}
1218
- onListStatusFilterChange={setListStatusFilter}
1219
- isPersonalWorkspace={workspace.personal}
1220
- isSearching={
1221
- !localTaskState &&
1222
- (isFullTasksFetching || isFilteredListCountsFetching)
1223
- }
1224
- lists={boardLists}
1225
- onUpdate={handleUpdate}
1226
- isMultiSelectMode={readOnly ? false : isMultiSelectMode}
1227
- setIsMultiSelectMode={readOnly ? () => {} : setIsMultiSelectMode}
1228
- availableViews={enabledViews ?? undefined}
1229
- hideActions={!canManageBoard || readOnly}
1230
- publicView={publicView}
1231
- readOnly={readOnly}
1232
- titlePrefix={publicHeaderPrefix}
1233
- />
1234
- <div className="h-full overflow-hidden">{renderView()}</div>
1235
- {showIdleBottomIsland ? idleBottomIsland : null}
1236
- </div>
1237
- );
1238
- }