@dxos/plugin-kanban 0.8.4-main.c85a9c8dae → 0.8.4-main.d9fc60f731

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 (285) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +398 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/KanbanArticle-V3UCZQB6.mjs +133 -0
  5. package/dist/lib/neutral/KanbanArticle-V3UCZQB6.mjs.map +7 -0
  6. package/dist/lib/neutral/KanbanPlugin.mjs +44 -0
  7. package/dist/lib/neutral/KanbanPlugin.mjs.map +7 -0
  8. package/dist/lib/neutral/KanbanPlugin.node.mjs +27 -0
  9. package/dist/lib/neutral/KanbanPlugin.node.mjs.map +7 -0
  10. package/dist/lib/neutral/KanbanPlugin.workerd.mjs +21 -0
  11. package/dist/lib/neutral/KanbanPlugin.workerd.mjs.map +7 -0
  12. package/dist/lib/{browser/KanbanViewEditor-IH5CJ6BW.mjs → neutral/KanbanSettings-Q2RJW4U4.mjs} +38 -21
  13. package/dist/lib/neutral/KanbanSettings-Q2RJW4U4.mjs.map +7 -0
  14. package/dist/lib/{browser/blueprint-definition-HFEKGFJK.mjs → neutral/blueprint-definition-FHVIEKTQ.mjs} +4 -6
  15. package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs.map +7 -0
  16. package/dist/lib/{browser → neutral}/blueprints/index.mjs +1 -1
  17. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  18. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-6ZHHQWO5.mjs +39 -0
  20. package/dist/lib/neutral/chunk-6ZHHQWO5.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-PNGVV67W.mjs +246 -0
  22. package/dist/lib/neutral/chunk-PNGVV67W.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-UWUD7L3O.mjs +8 -0
  24. package/dist/lib/neutral/chunk-UWUD7L3O.mjs.map +7 -0
  25. package/dist/lib/{browser/chunk-TLYZSC7O.mjs → neutral/chunk-ZTQW5KQS.mjs} +3 -6
  26. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs.map +7 -0
  27. package/dist/lib/{browser/KanbanContainer-BCXSJ6KS.mjs → neutral/components/index.mjs} +81 -142
  28. package/dist/lib/neutral/components/index.mjs.map +7 -0
  29. package/dist/lib/neutral/containers/index.mjs +11 -0
  30. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  31. package/dist/lib/neutral/create-object-DKBSI46K.mjs +40 -0
  32. package/dist/lib/neutral/create-object-DKBSI46K.mjs.map +7 -0
  33. package/dist/lib/neutral/delete-card-4QF3TKXO.mjs +24 -0
  34. package/dist/lib/neutral/delete-card-4QF3TKXO.mjs.map +7 -0
  35. package/dist/lib/neutral/delete-card-field-5M4ZHKLO.mjs +39 -0
  36. package/dist/lib/neutral/delete-card-field-5M4ZHKLO.mjs.map +7 -0
  37. package/dist/lib/{node-esm/chunk-CSL3HF2X.mjs → neutral/hooks/index.mjs} +128 -82
  38. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  39. package/dist/lib/neutral/index.mjs +34 -0
  40. package/dist/lib/neutral/meta.json +1 -0
  41. package/dist/lib/neutral/meta.mjs +8 -0
  42. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +13 -0
  43. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +7 -0
  44. package/dist/lib/neutral/operations/index.mjs +8 -0
  45. package/dist/lib/neutral/plugin.mjs +16 -0
  46. package/dist/lib/neutral/plugin.mjs.map +7 -0
  47. package/dist/lib/{browser/react-surface-FOMOGFVW.mjs → neutral/react-surface-MROAQQQ6.mjs} +30 -38
  48. package/dist/lib/neutral/react-surface-MROAQQQ6.mjs.map +7 -0
  49. package/dist/lib/neutral/restore-card-5NI7HMIJ.mjs +21 -0
  50. package/dist/lib/neutral/restore-card-5NI7HMIJ.mjs.map +7 -0
  51. package/dist/lib/neutral/restore-card-field-QM2R67J5.mjs +37 -0
  52. package/dist/lib/neutral/restore-card-field-QM2R67J5.mjs.map +7 -0
  53. package/dist/lib/neutral/testing/index.mjs +62 -0
  54. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  55. package/dist/lib/neutral/translations.mjs +44 -0
  56. package/dist/lib/neutral/translations.mjs.map +7 -0
  57. package/dist/lib/{browser → neutral}/types/index.mjs +7 -5
  58. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs +42 -0
  59. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs.map +7 -0
  60. package/dist/types/src/KanbanPlugin.d.ts +1 -0
  61. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  62. package/dist/types/src/KanbanPlugin.node.d.ts +4 -0
  63. package/dist/types/src/KanbanPlugin.node.d.ts.map +1 -0
  64. package/dist/types/src/KanbanPlugin.test.d.ts +2 -0
  65. package/dist/types/src/KanbanPlugin.test.d.ts.map +1 -0
  66. package/dist/types/src/KanbanPlugin.workerd.d.ts +4 -0
  67. package/dist/types/src/KanbanPlugin.workerd.d.ts.map +1 -0
  68. package/dist/types/src/blueprints/kanban-blueprint.d.ts +2 -2
  69. package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  72. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  74. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/index.d.ts +12 -3
  76. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  78. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  81. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  82. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +17 -38
  83. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -1
  84. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +48 -46
  85. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +2 -3
  87. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -1
  88. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +2 -3
  89. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -1
  90. package/dist/types/src/components/KanbanBoard/context.d.ts +38 -0
  91. package/dist/types/src/components/KanbanBoard/context.d.ts.map +1 -0
  92. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts +6 -0
  93. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -0
  94. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts +79 -0
  95. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts.map +1 -0
  96. package/dist/types/src/containers/KanbanArticle/index.d.ts +2 -0
  97. package/dist/types/src/containers/KanbanArticle/index.d.ts.map +1 -0
  98. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts +13 -0
  99. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -0
  100. package/dist/types/src/containers/KanbanSettings/index.d.ts +2 -0
  101. package/dist/types/src/containers/KanbanSettings/index.d.ts.map +1 -0
  102. package/dist/types/src/containers/index.d.ts +2 -2
  103. package/dist/types/src/containers/index.d.ts.map +1 -1
  104. package/dist/types/src/hooks/index.d.ts +1 -0
  105. package/dist/types/src/hooks/index.d.ts.map +1 -1
  106. package/dist/types/src/hooks/useEchoChangeCallback.d.ts +1 -1
  107. package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useItemsProjection.d.ts +10 -0
  109. package/dist/types/src/hooks/useItemsProjection.d.ts.map +1 -0
  110. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts +2 -0
  111. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts.map +1 -0
  112. package/dist/types/src/hooks/useKanbanBoardModel.d.ts +1 -1
  113. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -1
  114. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +2 -2
  115. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -1
  116. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +2 -2
  117. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -1
  118. package/dist/types/src/hooks/useProjectionModel.d.ts +1 -1
  119. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
  120. package/dist/types/src/index.d.ts +3 -1
  121. package/dist/types/src/index.d.ts.map +1 -1
  122. package/dist/types/src/meta.d.ts +1 -1
  123. package/dist/types/src/meta.d.ts.map +1 -1
  124. package/dist/types/src/operations/delete-card-field.d.ts +5 -0
  125. package/dist/types/src/operations/delete-card-field.d.ts.map +1 -0
  126. package/dist/types/src/operations/delete-card.d.ts +5 -0
  127. package/dist/types/src/operations/delete-card.d.ts.map +1 -0
  128. package/dist/types/src/operations/index.d.ts +3 -0
  129. package/dist/types/src/operations/index.d.ts.map +1 -0
  130. package/dist/types/src/operations/restore-card-field.d.ts +5 -0
  131. package/dist/types/src/operations/restore-card-field.d.ts.map +1 -0
  132. package/dist/types/src/operations/restore-card.d.ts +5 -0
  133. package/dist/types/src/operations/restore-card.d.ts.map +1 -0
  134. package/dist/types/src/playwright/board-manager.d.ts.map +1 -1
  135. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -1
  136. package/dist/types/src/plugin.d.ts +4 -0
  137. package/dist/types/src/plugin.d.ts.map +1 -0
  138. package/dist/types/src/testing/KanbanCardTileSimple.d.ts +4 -2
  139. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -1
  140. package/dist/types/src/translations.d.ts +48 -46
  141. package/dist/types/src/translations.d.ts.map +1 -1
  142. package/dist/types/src/types/Kanban.d.ts +66 -9
  143. package/dist/types/src/types/Kanban.d.ts.map +1 -1
  144. package/dist/types/src/types/KanbanOperation.d.ts +52 -0
  145. package/dist/types/src/types/KanbanOperation.d.ts.map +1 -0
  146. package/dist/types/src/types/constants.d.ts +3 -3
  147. package/dist/types/src/types/constants.d.ts.map +1 -1
  148. package/dist/types/src/types/index.d.ts +2 -1
  149. package/dist/types/src/types/index.d.ts.map +1 -1
  150. package/dist/types/src/types/schema.d.ts +15 -104
  151. package/dist/types/src/types/schema.d.ts.map +1 -1
  152. package/dist/types/src/types/types.d.ts +2 -2
  153. package/dist/types/src/util/arrangement.d.ts +8 -4
  154. package/dist/types/src/util/arrangement.d.ts.map +1 -1
  155. package/dist/types/tsconfig.tsbuildinfo +1 -1
  156. package/package.json +115 -63
  157. package/src/KanbanPlugin.node.ts +21 -0
  158. package/src/KanbanPlugin.test.ts +31 -0
  159. package/src/KanbanPlugin.tsx +15 -29
  160. package/src/KanbanPlugin.workerd.ts +18 -0
  161. package/src/blueprints/kanban-blueprint.ts +4 -8
  162. package/src/capabilities/{artifact-definition/artifact-definition.ts → artifact-definition.ts} +12 -11
  163. package/src/capabilities/{blueprint-definition/blueprint-definition.ts → blueprint-definition.ts} +3 -1
  164. package/src/capabilities/create-object.ts +40 -0
  165. package/src/capabilities/index.ts +12 -3
  166. package/src/capabilities/operation-handler.ts +14 -0
  167. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +35 -19
  168. package/src/capabilities/undo-mappings.ts +34 -0
  169. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +22 -19
  170. package/src/components/KanbanBoard/KanbanBoard.tsx +43 -63
  171. package/src/components/KanbanBoard/KanbanCard.tsx +77 -63
  172. package/src/components/KanbanBoard/KanbanColumn.tsx +19 -16
  173. package/src/components/KanbanBoard/context.ts +54 -0
  174. package/src/containers/{KanbanContainer/KanbanContainer.stories.tsx → KanbanArticle/KanbanArticle.stories.tsx} +67 -53
  175. package/src/containers/KanbanArticle/KanbanArticle.tsx +180 -0
  176. package/src/containers/KanbanArticle/index.ts +5 -0
  177. package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
  178. package/src/containers/KanbanSettings/index.ts +5 -0
  179. package/src/containers/index.ts +2 -2
  180. package/src/hooks/index.ts +1 -0
  181. package/src/hooks/useEchoChangeCallback.ts +3 -3
  182. package/src/hooks/useItemsProjection.ts +44 -0
  183. package/src/hooks/{useKanbanBoardModel.test.ts → useKanbanBoardModel.browser.test.ts} +13 -19
  184. package/src/hooks/useKanbanBoardModel.ts +20 -6
  185. package/src/hooks/useKanbanColumnEventHandler.ts +1 -1
  186. package/src/hooks/useKanbanItemEventHandler.ts +1 -1
  187. package/src/hooks/useProjectionModel.ts +5 -5
  188. package/src/index.ts +3 -2
  189. package/src/meta.ts +22 -5
  190. package/src/operations/delete-card-field.ts +42 -0
  191. package/src/operations/delete-card.ts +23 -0
  192. package/src/operations/index.ts +10 -0
  193. package/src/operations/restore-card-field.ts +36 -0
  194. package/src/operations/restore-card.ts +21 -0
  195. package/src/playwright/smoke.spec.ts +3 -3
  196. package/src/plugin.ts +11 -0
  197. package/src/testing/KanbanCardTileSimple.tsx +29 -23
  198. package/src/translations.ts +26 -25
  199. package/src/types/Kanban.ts +85 -18
  200. package/src/types/KanbanOperation.ts +79 -0
  201. package/src/types/index.ts +3 -1
  202. package/src/types/schema.ts +20 -78
  203. package/src/types/types.ts +2 -2
  204. package/src/util/arrangement.test.ts +23 -14
  205. package/src/util/arrangement.ts +25 -15
  206. package/src/vite-env.d.ts +10 -0
  207. package/dist/lib/browser/KanbanContainer-BCXSJ6KS.mjs.map +0 -7
  208. package/dist/lib/browser/KanbanViewEditor-IH5CJ6BW.mjs.map +0 -7
  209. package/dist/lib/browser/blueprint-definition-HFEKGFJK.mjs.map +0 -7
  210. package/dist/lib/browser/chunk-QSWCFMEB.mjs +0 -385
  211. package/dist/lib/browser/chunk-QSWCFMEB.mjs.map +0 -7
  212. package/dist/lib/browser/chunk-RNFIFE2P.mjs +0 -213
  213. package/dist/lib/browser/chunk-RNFIFE2P.mjs.map +0 -7
  214. package/dist/lib/browser/chunk-TLYZSC7O.mjs.map +0 -7
  215. package/dist/lib/browser/index.mjs +0 -101
  216. package/dist/lib/browser/index.mjs.map +0 -7
  217. package/dist/lib/browser/meta.json +0 -1
  218. package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs +0 -162
  219. package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs.map +0 -7
  220. package/dist/lib/browser/react-surface-FOMOGFVW.mjs.map +0 -7
  221. package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs +0 -305
  222. package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs.map +0 -7
  223. package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs +0 -67
  224. package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs.map +0 -7
  225. package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs +0 -18
  226. package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs.map +0 -7
  227. package/dist/lib/node-esm/blueprints/index.mjs +0 -9
  228. package/dist/lib/node-esm/chunk-4AWDHQVY.mjs +0 -214
  229. package/dist/lib/node-esm/chunk-4AWDHQVY.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-CSL3HF2X.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  232. package/dist/lib/node-esm/chunk-X3UJUQIV.mjs +0 -31
  233. package/dist/lib/node-esm/chunk-X3UJUQIV.mjs.map +0 -7
  234. package/dist/lib/node-esm/index.mjs +0 -102
  235. package/dist/lib/node-esm/index.mjs.map +0 -7
  236. package/dist/lib/node-esm/meta.json +0 -1
  237. package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs +0 -163
  238. package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs.map +0 -7
  239. package/dist/lib/node-esm/react-surface-AITKFRBE.mjs +0 -100
  240. package/dist/lib/node-esm/react-surface-AITKFRBE.mjs.map +0 -7
  241. package/dist/lib/node-esm/types/index.mjs +0 -21
  242. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +0 -1
  243. package/dist/types/src/capabilities/artifact-definition/index.d.ts +0 -3
  244. package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +0 -1
  245. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -6
  246. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
  247. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
  248. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
  249. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  250. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  251. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  252. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  253. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  254. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  255. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  256. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +0 -6
  257. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +0 -1
  258. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts +0 -77
  259. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +0 -1
  260. package/dist/types/src/containers/KanbanContainer/index.d.ts +0 -3
  261. package/dist/types/src/containers/KanbanContainer/index.d.ts.map +0 -1
  262. package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts +0 -6
  263. package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts.map +0 -1
  264. package/dist/types/src/containers/KanbanViewEditor/index.d.ts +0 -3
  265. package/dist/types/src/containers/KanbanViewEditor/index.d.ts.map +0 -1
  266. package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts +0 -2
  267. package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts.map +0 -1
  268. package/src/capabilities/artifact-definition/index.ts +0 -7
  269. package/src/capabilities/blueprint-definition/index.ts +0 -7
  270. package/src/capabilities/operation-resolver/index.ts +0 -7
  271. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -133
  272. package/src/capabilities/react-surface/index.ts +0 -7
  273. package/src/containers/KanbanContainer/KanbanContainer.tsx +0 -87
  274. package/src/containers/KanbanContainer/index.ts +0 -7
  275. package/src/containers/KanbanViewEditor/KanbanViewEditor.tsx +0 -63
  276. package/src/containers/KanbanViewEditor/index.ts +0 -7
  277. /package/dist/lib/{browser → neutral}/blueprints/index.mjs.map +0 -0
  278. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  279. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
  280. /package/dist/lib/{browser/types → neutral}/index.mjs.map +0 -0
  281. /package/dist/lib/{node-esm/blueprints/index.mjs.map → neutral/meta.mjs.map} +0 -0
  282. /package/dist/lib/{node-esm/types → neutral/operations}/index.mjs.map +0 -0
  283. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/types/index.mjs.map} +0 -0
  284. /package/dist/types/src/capabilities/{artifact-definition/artifact-definition.d.ts → artifact-definition.d.ts} +0 -0
  285. /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
package/LICENSE CHANGED
@@ -1,8 +1,105 @@
1
- MIT License
2
- Copyright (c) 2022 DXOS
1
+ # Functional Source License, Version 1.1, ALv2 Future License
3
2
 
4
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
3
+ ## Abbreviation
5
4
 
6
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
5
+ FSL-1.1-Apache-2.0
7
6
 
8
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7
+ ## Notice
8
+
9
+ Copyright 2026 DXOS
10
+
11
+ ## Terms and Conditions
12
+
13
+ ### Licensor ("We")
14
+
15
+ The party offering the Software under these Terms and Conditions.
16
+
17
+ ### The Software
18
+
19
+ The "Software" is each version of the software that we make available under
20
+ these Terms and Conditions, as indicated by our inclusion of these Terms and
21
+ Conditions with the Software.
22
+
23
+ ### License Grant
24
+
25
+ Subject to your compliance with this License Grant and the Patents,
26
+ Redistribution and Trademark clauses below, we hereby grant you the right to
27
+ use, copy, modify, create derivative works, publicly perform, publicly display
28
+ and redistribute the Software for any Permitted Purpose identified below.
29
+
30
+ ### Permitted Purpose
31
+
32
+ A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
33
+ means making the Software available to others in a commercial product or
34
+ service that:
35
+
36
+ 1. substitutes for the Software;
37
+
38
+ 2. substitutes for any other product or service we offer using the Software
39
+ that exists as of the date we make the Software available; or
40
+
41
+ 3. offers the same or substantially similar functionality as the Software.
42
+
43
+ Permitted Purposes specifically include using the Software:
44
+
45
+ 1. for your internal use and access;
46
+
47
+ 2. for non-commercial education;
48
+
49
+ 3. for non-commercial research; and
50
+
51
+ 4. in connection with professional services that you provide to a licensee
52
+ using the Software in accordance with these Terms and Conditions.
53
+
54
+ ### Patents
55
+
56
+ To the extent your use for a Permitted Purpose would necessarily infringe our
57
+ patents, the license grant above includes a license under our patents. If you
58
+ make a claim against any party that the Software infringes or contributes to
59
+ the infringement of any patent, then your patent license to the Software ends
60
+ immediately.
61
+
62
+ ### Redistribution
63
+
64
+ The Terms and Conditions apply to all copies, modifications and derivatives of
65
+ the Software.
66
+
67
+ If you redistribute any copies, modifications or derivatives of the Software,
68
+ you must include a copy of or a link to these Terms and Conditions and not
69
+ remove any copyright notices provided in or with the Software.
70
+
71
+ ### Disclaimer
72
+
73
+ THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
74
+ IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
75
+ PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
76
+
77
+ IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
78
+ SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
79
+ EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
80
+
81
+ ### Trademarks
82
+
83
+ Except for displaying the License Details and identifying us as the origin of
84
+ the Software, you have no right under these Terms and Conditions to use our
85
+ trademarks, trade names, service marks or product names.
86
+
87
+ ## Grant of Future License
88
+
89
+ We hereby irrevocably grant you an additional license to use the Software under
90
+ the Apache License, Version 2.0 that is effective on the second anniversary of
91
+ the date we make the Software available. On or after that date, you may use the
92
+ Software under the Apache License, Version 2.0, in which case the following
93
+ will apply:
94
+
95
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
96
+ this file except in compliance with the License.
97
+
98
+ You may obtain a copy of the License at
99
+
100
+ http://www.apache.org/licenses/LICENSE-2.0
101
+
102
+ Unless required by applicable law or agreed to in writing, software distributed
103
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
104
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
105
+ specific language governing permissions and limitations under the License.
package/PLUGIN.mdl ADDED
@@ -0,0 +1,398 @@
1
+ ---
2
+ id: org.dxos.plugin.kanban
3
+ name: KanbanPlugin
4
+ version: 0.1.0
5
+ ---
6
+
7
+ Visual project management plugin for `DXOS` Composer — organise any ECHO type into drag-and-drop columns driven by a single-select field, with full local-first persistence and real-time peer replication.
8
+
9
+ ## Extensions
10
+
11
+ The following extension dialects are used in this document.
12
+ Each extension is defined in the Appendix or resolved via its URI.
13
+
14
+ | Term | URI |
15
+ |-------------|--------------------------------|
16
+ | `type` | `org.dxos.mdl.type@1.0` |
17
+ | `feat` | `org.dxos.mdl.feat@1.0` |
18
+ | `test` | `org.dxos.mdl.test@1.0` |
19
+ | `component` | `org.dxos.mdl.component@1.0` |
20
+ | `op` | `org.dxos.mdl.op@1.0` |
21
+
22
+ ## Types
23
+
24
+ ```mdl
25
+ type ArrangementColumnEntry
26
+ fields:
27
+ ids: string[] # ordered card ids within the column
28
+ hidden?: boolean # when true the column is hidden from the board
29
+ ```
30
+
31
+ ```mdl
32
+ type Arrangement
33
+ fields:
34
+ order: string[] # ordered column values
35
+ columns: Map<string, ArrangementColumnEntry>
36
+ ```
37
+
38
+ ```mdl
39
+ type KanbanViewSpec
40
+ fields:
41
+ kind: "view" # discriminator — items sourced from a View query
42
+ view: Ref<View> # the View whose query drives card membership
43
+ ```
44
+
45
+ ```mdl
46
+ type KanbanItemsSpec
47
+ fields:
48
+ kind: "items" # discriminator — kanban owns items explicitly
49
+ pivotField: string # property path that drives column membership
50
+ items: Ref<object>[] # items owned directly by the kanban
51
+ ```
52
+
53
+ ```mdl
54
+ type KanbanSpec
55
+ desc: Discriminated union of item-source strategies.
56
+ literals: KanbanViewSpec | KanbanItemsSpec
57
+ ```
58
+
59
+ ```mdl
60
+ type Kanban
61
+ desc: Root ECHO object for a kanban board. Stored with typename org.dxos.type.kanban v0.2.0.
62
+ fields:
63
+ name?: string
64
+ arrangement: Arrangement
65
+ spec: KanbanSpec # discriminated by spec.kind
66
+ ```
67
+
68
+ ```mdl
69
+ type KanbanSettings
70
+ fields:
71
+ hideUncategorized?: boolean # hides items with no pivot value
72
+ ```
73
+
74
+ ```mdl
75
+ type KanbanViewSettings
76
+ fields:
77
+ columnFieldId: string # id of the View field used as pivot column
78
+ hideUncategorized?: boolean
79
+ ```
80
+
81
+ ```mdl
82
+ type CreateKanbanInput
83
+ fields:
84
+ name?: string
85
+ typename?: string # ECHO typename of card objects
86
+ initialPivotColumn?: string # initial single-select field to pivot on
87
+ ```
88
+
89
+ ## Components
90
+
91
+ ```mdl
92
+ component KanbanArticle
93
+ desc: Main article surface for a Kanban. Branches internally on spec.kind — view-variant runs a typename query via the linked View; items-variant dereferences spec.items directly.
94
+ props:
95
+ subject: Kanban
96
+ role: "article" | "section"
97
+ state:
98
+ projection: ProjectionModel # column/field projection derived from View + schema
99
+ items: AtomQuery # reactive card query (view-variant) or array (items-variant)
100
+ actions:
101
+ addCard(columnValue: string) → string # returns new card id
102
+ removeCard(card: object)
103
+ moveCard(card: object, toColumn: string, toIndex: number)
104
+ deleteCardField(fieldId: string)
105
+ layout: |
106
+ ┌──────────────────────────────────────┐
107
+ │ [toolbar slot] │
108
+ ├──────────────────────────────────────┤
109
+ │ Col A │ Col B │ Col C │
110
+ │ ┌─────────┐ │ ┌─────────┐ │ … │
111
+ │ │ card │ │ │ card │ │ │
112
+ │ └─────────┘ │ └─────────┘ │ │
113
+ │ [+ Add card]│ │ │
114
+ └──────────────────────────────────────┘
115
+ ```
116
+
117
+ ```mdl
118
+ component KanbanSettings
119
+ desc: Properties panel for a Kanban. View-variant shows a column-field picker plus common settings; items-variant shows only common settings.
120
+ props:
121
+ subject: Kanban
122
+ state:
123
+ selectFields: { value: string; label: string }[] # single-select fields available as pivot
124
+ actions:
125
+ changeColumnField(fieldId: string)
126
+ toggleHideUncategorized(hidden: boolean)
127
+ ```
128
+
129
+ ## Operations
130
+
131
+ ```mdl
132
+ op deleteCard
133
+ desc: Removes a card object from the ECHO database.
134
+ input:
135
+ card: object # the card to remove
136
+ output: DeleteCardOutput # { card } snapshot of the removed card
137
+ effects: [echo:write]
138
+ ```
139
+
140
+ ```mdl
141
+ op deleteCardField
142
+ desc: Removes a field projection from the View's schema; returns enough data to undo.
143
+ input:
144
+ view: View
145
+ fieldId: string
146
+ output: DeleteCardFieldOutput # { field, props, index }
147
+ effects: [echo:write]
148
+ requires: [AtomRegistry, Database]
149
+ ```
150
+
151
+ ```mdl
152
+ op restoreCard
153
+ desc: Undo counterpart to deleteCard — re-adds a previously removed card to the database.
154
+ input:
155
+ card: object # the card snapshot to restore
156
+ output: void
157
+ effects: [echo:write]
158
+ ```
159
+
160
+ ```mdl
161
+ op restoreCardField
162
+ desc: Undo counterpart to deleteCardField — re-inserts a field projection at its original index.
163
+ input:
164
+ view: View
165
+ field: FieldSchema
166
+ props: object # field properties
167
+ index: number # position to restore at
168
+ output: void
169
+ effects: [echo:write]
170
+ requires: [AtomRegistry, Database]
171
+ ```
172
+
173
+ ## Features
174
+
175
+ ```mdl
176
+ feat F-1: Board Layout
177
+
178
+ req F-1.1: Columns are ordered by Arrangement.order; each column contains its cards in Arrangement.columns[value].ids order.
179
+ req F-1.2: Cards within a column are rendered in the stored id order.
180
+ req F-1.3:
181
+ when: settings.hideUncategorized is true
182
+ then: the uncategorized column is not rendered
183
+ ```
184
+
185
+ ```mdl
186
+ feat F-2: Drag and Drop
187
+
188
+ req F-2.1:
189
+ when: user drags a card to a different column
190
+ then: card's pivot field is updated to the target column value; Arrangement updated
191
+
192
+ req F-2.2:
193
+ when: user drags a card within the same column
194
+ then: card ids are reordered in Arrangement.columns[value].ids
195
+
196
+ req F-2.3:
197
+ when: user drags a column header
198
+ then: Arrangement.order is updated to reflect the new column order
199
+ ```
200
+
201
+ ```mdl
202
+ feat F-3: Card Management
203
+
204
+ req F-3.1:
205
+ when: user clicks Add Card in a column
206
+ then: a new ECHO object of the board's card type is created with the pivot field set to that column's value
207
+
208
+ req F-3.2:
209
+ when: user removes a card
210
+ then: op:deleteCard runs; card is removed from the ECHO database and from the board
211
+
212
+ req F-3.3:
213
+ when: user undoes a delete-card action
214
+ then: op:restoreCard re-adds the card; board reflects restored state
215
+ ```
216
+
217
+ ```mdl
218
+ feat F-4: Column Configuration
219
+
220
+ req F-4.1:
221
+ when: user opens KanbanSettings for a view-variant board
222
+ then: column-field picker shows all single-select fields from the card schema
223
+
224
+ req F-4.2:
225
+ when: user selects a different column field
226
+ then: View.projection.pivotFieldId is updated; board re-renders with new columns
227
+
228
+ req F-4.3:
229
+ when: user removes a column field
230
+ then: op:deleteCardField removes the projection; op:restoreCardField can reverse it
231
+ ```
232
+
233
+ ```mdl
234
+ feat F-5: Item Source Variants
235
+
236
+ req F-5.1:
237
+ when: spec.kind === "view"
238
+ then: items come from running the View's typename query against the ECHO database
239
+
240
+ req F-5.2:
241
+ when: spec.kind === "items"
242
+ then: items come from spec.items (explicit ref array); used by externally-synced boards (e.g. Linear, GitHub)
243
+
244
+ req F-5.3: Both variants share the same Arrangement persistence and drag-and-drop logic.
245
+ ```
246
+
247
+ ```mdl
248
+ feat F-6: ECHO Persistence and Collaboration
249
+
250
+ req F-6.1: All Kanban, Arrangement, and card mutations are written to ECHO and replicated to peers.
251
+ req F-6.2:
252
+ when: a peer updates a card or moves it
253
+ then: KanbanArticle re-renders reactively via AtomQuery / AtomObj subscriptions
254
+
255
+ req F-6.3: View-variant kanbans own an associated View object that is hidden from the space browser.
256
+ ```
257
+
258
+ ```mdl
259
+ feat F-7: AI Blueprint
260
+
261
+ req F-7.1: Plugin contributes a Kanban blueprint that lets an AI agent create and update kanban boards.
262
+ req F-7.2:
263
+ when: an AI agent calls the blueprint
264
+ then: agent can create boards, place cards in columns, and update card fields
265
+ ```
266
+
267
+ ## Acceptance
268
+
269
+ ```mdl
270
+ test T-1: Create kanban board
271
+ given: a space with a custom ECHO type that has a single-select field "status"
272
+ when: user creates a new Kanban selecting that type and "status" as the pivot column
273
+ then:
274
+ - Kanban object written to ECHO with spec.kind === "view"
275
+ - columns correspond to the "status" field's enum values
276
+ - existing objects appear as cards in their respective columns
277
+ ```
278
+
279
+ ```mdl
280
+ test T-2: Drag card between columns
281
+ given: a Kanban with columns "todo", "in-progress", "done" and a card in "todo"
282
+ when: user drags the card to "in-progress"
283
+ then:
284
+ - card's "status" field updated to "in-progress"
285
+ - Arrangement reflects card in "in-progress" column
286
+ - change replicated to peers via ECHO
287
+ ```
288
+
289
+ ```mdl
290
+ test T-3: Reorder cards within a column
291
+ given: a column with cards [A, B, C] in order
292
+ when: user drags card C above card A
293
+ then:
294
+ - Arrangement.columns["col"].ids === [C, A, B]
295
+ - board renders in new order
296
+ ```
297
+
298
+ ```mdl
299
+ test T-4: Add card to column
300
+ given: a board with a "todo" column
301
+ when: user clicks Add Card in "todo"
302
+ then:
303
+ - new ECHO object created with pivot field set to "todo"
304
+ - card appears at the bottom of the "todo" column
305
+ ```
306
+
307
+ ```mdl
308
+ test T-5: Delete and restore card
309
+ given: a board with card X in column "todo"
310
+ when: user deletes card X, then undoes
311
+ then:
312
+ - after delete: card X absent from board and ECHO database
313
+ - after undo: card X restored to ECHO and reappears in "todo"
314
+ ```
315
+
316
+ ```mdl
317
+ test T-6: Hide uncategorized column
318
+ given: a board with some cards that have no pivot value (uncategorized)
319
+ when: user enables "Hide uncategorized column" in KanbanSettings
320
+ then:
321
+ - uncategorized column no longer rendered
322
+ - Arrangement.columns[UNCATEGORIZED].hidden === true
323
+ ```
324
+
325
+ ```mdl
326
+ test T-7: Switch pivot column field
327
+ given: a view-variant board currently pivoting on "status"
328
+ when: user opens settings and selects "priority" as the column field
329
+ then:
330
+ - View.projection.pivotFieldId updated to "priority"
331
+ - board re-renders with columns derived from "priority" enum values
332
+ ```
333
+
334
+ ---
335
+
336
+ ## Appendix: Extension Definitions
337
+
338
+ ```mdl
339
+ ext type
340
+ uri: org.dxos.mdl.type@1.0
341
+ desc: A named data structure with typed fields and optional literals.
342
+ fields:
343
+ desc?: Prose
344
+ fields?: FieldMap
345
+ literals?: UnionList
346
+ extends?: TypeRef[]
347
+ ```
348
+
349
+ ```mdl
350
+ ext feat
351
+ uri: org.dxos.mdl.feat@1.0
352
+ desc: A named feature grouping one or more requirements.
353
+ fields:
354
+ desc?: Prose
355
+ req: RequirementList
356
+ nesting: self
357
+ ```
358
+
359
+ ```mdl
360
+ ext test
361
+ uri: org.dxos.mdl.test@1.0
362
+ desc: An acceptance scenario expressed as given / when / then steps.
363
+ fields:
364
+ given?: Step | Step[]
365
+ when?: Step | Step[]
366
+ then: Step | Step[]
367
+ tags?: TagList
368
+ ```
369
+
370
+ ```mdl
371
+ ext component
372
+ uri: org.dxos.mdl.component@1.0
373
+ desc: A UI component with props, internal state, slots, actions, and events.
374
+ fields:
375
+ desc?: Prose
376
+ props?: FieldMap
377
+ state?: FieldMap
378
+ slots?: FieldMap
379
+ actions?: ActionMap
380
+ emits?: EventMap
381
+ layout?: CodeBlock
382
+ ```
383
+
384
+ ```mdl
385
+ ext op
386
+ uri: org.dxos.mdl.op@1.0
387
+ desc: |
388
+ A named operation with typed inputs, outputs, and declared errors.
389
+ Pure ops have no effects or requires. Effectful ops declare both.
390
+ fields:
391
+ desc?: Prose
392
+ input?: FieldMap
393
+ output?: TypeExpr
394
+ errors?: ErrorMap
395
+ effects?: EffectList
396
+ requires?: ServiceList
397
+ note?: Prose
398
+ ```
package/README.md CHANGED
@@ -12,4 +12,4 @@ Surface plugin for kanban entities.
12
12
 
13
13
  Your ideas, issues, and code are most welcome. Please take a look at our [community code of conduct](https://github.com/dxos/dxos/blob/main/CODE_OF_CONDUCT.md), the [issue guide](https://github.com/dxos/dxos/blob/main/CONTRIBUTING.md#submitting-issues), and the [PR contribution guide](https://github.com/dxos/dxos/blob/main/CONTRIBUTING.md#submitting-prs).
14
14
 
15
- License: [MIT](./LICENSE) Copyright 2023 © DXOS
15
+ License: [FSL-1.1-Apache-2.0](./LICENSE) Copyright 2023 © DXOS
@@ -0,0 +1,133 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/containers/KanbanArticle/KanbanArticle.tsx
4
+ import { Atom, RegistryContext } from "@effect-atom/atom-react";
5
+ import React, { useCallback, useContext, useMemo } from "react";
6
+ import { useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
7
+ import { AppCapabilities } from "@dxos/app-toolkit";
8
+ import { useSchemaFilter } from "@dxos/app-toolkit/ui";
9
+ import { Filter, Obj, Query, Type } from "@dxos/echo";
10
+ import { AtomObj, AtomQuery } from "@dxos/echo-atom";
11
+ import { useObject, useType } from "@dxos/react-client/echo";
12
+ import { Panel, Toolbar } from "@dxos/react-ui";
13
+ import { getTagFromQuery, getTypenameFromQuery } from "@dxos/schema";
14
+ import { KanbanBoard } from "#components";
15
+ import { useEchoChangeCallback, useItemsProjection, useProjectionModel } from "#hooks";
16
+ import { KanbanOperation } from "#types";
17
+ import { Kanban } from "#types";
18
+ var KanbanArticle = (props) => {
19
+ return Kanban.isKanbanItems(props.subject) ? /* @__PURE__ */ React.createElement(ItemsKanbanArticle, {
20
+ ...props,
21
+ subject: props.subject
22
+ }) : /* @__PURE__ */ React.createElement(ViewKanbanArticle, props);
23
+ };
24
+ var ViewKanbanArticle = ({ role, subject: object }) => {
25
+ const registry = useContext(RegistryContext);
26
+ const schemas = useCapabilities(AppCapabilities.Schema);
27
+ const db = Obj.getDatabase(object);
28
+ const { invokePromise } = useOperationInvoker();
29
+ const [view] = useObject(object.spec.kind === "view" ? object.spec.view : void 0);
30
+ const typename = view?.query ? getTypenameFromQuery(view.query.ast) : void 0;
31
+ const tag = view?.query ? getTagFromQuery(view.query.ast) : void 0;
32
+ const schemaFromDb = useType(db, typename);
33
+ const cardSchema = useMemo(() => schemaFromDb ?? schemas.flat().find((schema) => Type.getTypename(schema) === typename), [
34
+ schemaFromDb,
35
+ schemas,
36
+ typename
37
+ ]);
38
+ const baseFilter = useSchemaFilter(cardSchema);
39
+ const items = useMemo(() => {
40
+ if (!db) {
41
+ return null;
42
+ }
43
+ const query = tag ? Query.select(baseFilter).select(Filter.tag(tag)) : Query.select(baseFilter);
44
+ return AtomQuery.make(db, query);
45
+ }, [
46
+ db,
47
+ baseFilter,
48
+ tag
49
+ ]);
50
+ const projection = useProjectionModel(cardSchema, object, registry);
51
+ const change = useEchoChangeCallback(object);
52
+ const pivotFieldId = view?.projection?.pivotFieldId;
53
+ const columnFieldPath = projection && pivotFieldId ? projection.tryGetFieldProjection(pivotFieldId)?.props.property : void 0;
54
+ const handleCardAdd = useCallback((columnValue) => {
55
+ if (db && cardSchema && columnFieldPath) {
56
+ const card = Obj.make(Type.assertObject(cardSchema), {
57
+ [columnFieldPath]: columnValue
58
+ });
59
+ db.add(card);
60
+ return card.id;
61
+ }
62
+ }, [
63
+ db,
64
+ cardSchema,
65
+ columnFieldPath
66
+ ]);
67
+ const handleCardRemove = useCallback((card) => {
68
+ void invokePromise(KanbanOperation.DeleteCard, {
69
+ card
70
+ });
71
+ }, [
72
+ invokePromise
73
+ ]);
74
+ if (!object || !db || !items || !projection || !change) {
75
+ return null;
76
+ }
77
+ return /* @__PURE__ */ React.createElement(Panel.Root, {
78
+ role
79
+ }, /* @__PURE__ */ React.createElement(Panel.Toolbar, {
80
+ asChild: true
81
+ }, /* @__PURE__ */ React.createElement(Toolbar.Root, null)), /* @__PURE__ */ React.createElement(KanbanBoard.Root, {
82
+ kanban: object,
83
+ projection,
84
+ items,
85
+ change,
86
+ onCardAdd: handleCardAdd,
87
+ onCardRemove: handleCardRemove
88
+ }, /* @__PURE__ */ React.createElement(Panel.Content, {
89
+ asChild: true
90
+ }, /* @__PURE__ */ React.createElement(KanbanBoard.Content, null))));
91
+ };
92
+ var ItemsKanbanArticle = ({ role, subject: object }) => {
93
+ const db = Obj.getDatabase(object);
94
+ const projection = useItemsProjection(object);
95
+ const change = useEchoChangeCallback(object);
96
+ const itemsAtom = useMemo(() => Atom.make((get) => {
97
+ const out = [];
98
+ for (const ref of object.spec.items) {
99
+ const target = get(AtomObj.make(ref));
100
+ if (target == null) {
101
+ continue;
102
+ }
103
+ if (Obj.isDeleted(target)) {
104
+ continue;
105
+ }
106
+ out.push(target);
107
+ }
108
+ return out;
109
+ }), [
110
+ object.spec.items
111
+ ]);
112
+ const handleCardRemove = useCallback(() => void 0, []);
113
+ if (!object || !db || !change) {
114
+ return null;
115
+ }
116
+ return /* @__PURE__ */ React.createElement(Panel.Root, {
117
+ role
118
+ }, /* @__PURE__ */ React.createElement(Panel.Toolbar, {
119
+ asChild: true
120
+ }, /* @__PURE__ */ React.createElement(Toolbar.Root, null)), /* @__PURE__ */ React.createElement(KanbanBoard.Root, {
121
+ kanban: object,
122
+ projection,
123
+ items: itemsAtom,
124
+ change,
125
+ onCardRemove: handleCardRemove
126
+ }, /* @__PURE__ */ React.createElement(Panel.Content, {
127
+ asChild: true
128
+ }, /* @__PURE__ */ React.createElement(KanbanBoard.Content, null))));
129
+ };
130
+ export {
131
+ KanbanArticle as default
132
+ };
133
+ //# sourceMappingURL=KanbanArticle-V3UCZQB6.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/KanbanArticle/KanbanArticle.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { useSchemaFilter, type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Filter, Obj, Query, type Ref, Type } from '@dxos/echo';\nimport { AtomObj, AtomQuery } from '@dxos/echo-atom';\nimport { useObject, useType } from '@dxos/react-client/echo';\nimport { Panel, Toolbar } from '@dxos/react-ui';\nimport { getTagFromQuery, getTypenameFromQuery } from '@dxos/schema';\n\nimport { KanbanBoard } from '#components';\nimport { useEchoChangeCallback, useItemsProjection, useProjectionModel } from '#hooks';\nimport { KanbanOperation } from '#types';\nimport { Kanban } from '#types';\n\nexport type KanbanArticleProps = AppSurface.ObjectArticleProps<Kanban.Kanban>;\n\nexport const KanbanArticle = (props: KanbanArticleProps) => {\n // Branch on `kanban.spec.kind`: view-variant runs a typename query through\n // `useProjectionModel`; items-variant dereferences `kanban.spec.items` and\n // uses a stub projection from `useItemsProjection`.\n return Kanban.isKanbanItems(props.subject) ? (\n <ItemsKanbanArticle {...props} subject={props.subject} />\n ) : (\n <ViewKanbanArticle {...props} />\n );\n};\n\nconst ViewKanbanArticle = ({ role, subject: object }: KanbanArticleProps) => {\n const registry = useContext(RegistryContext);\n const schemas = useCapabilities(AppCapabilities.Schema);\n const db = Obj.getDatabase(object);\n const { invokePromise } = useOperationInvoker();\n const [view] = useObject(object.spec.kind === 'view' ? object.spec.view : undefined);\n const typename = view?.query ? getTypenameFromQuery(view.query.ast) : undefined;\n const tag = view?.query ? getTagFromQuery(view.query.ast) : undefined;\n\n const schemaFromDb = useType(db, typename);\n const cardSchema = useMemo(\n () => schemaFromDb ?? schemas.flat().find((schema) => Type.getTypename(schema) === typename),\n [schemaFromDb, schemas, typename],\n );\n\n const baseFilter = useSchemaFilter(cardSchema);\n const items = useMemo(() => {\n if (!db) {\n return null;\n }\n const query = tag ? Query.select(baseFilter).select(Filter.tag(tag)) : Query.select(baseFilter);\n return AtomQuery.make(db, query);\n }, [db, baseFilter, tag]);\n\n const projection = useProjectionModel(cardSchema, object, registry);\n const change = useEchoChangeCallback(object);\n\n const pivotFieldId = view?.projection?.pivotFieldId;\n const columnFieldPath =\n projection && pivotFieldId ? projection.tryGetFieldProjection(pivotFieldId)?.props.property : undefined;\n\n const handleCardAdd = useCallback(\n (columnValue: string | undefined) => {\n if (db && cardSchema && columnFieldPath) {\n const card = Obj.make(Type.assertObject(cardSchema), {\n [columnFieldPath]: columnValue,\n });\n db.add(card);\n return card.id;\n }\n },\n [db, cardSchema, columnFieldPath],\n );\n\n const handleCardRemove = useCallback(\n (card: { id: string }) => {\n void invokePromise(KanbanOperation.DeleteCard, { card });\n },\n [invokePromise],\n );\n\n if (!object || !db || !items || !projection || !change) {\n return null;\n }\n\n return (\n <Panel.Root role={role}>\n <Panel.Toolbar asChild>\n <Toolbar.Root />\n </Panel.Toolbar>\n <KanbanBoard.Root\n kanban={object}\n projection={projection}\n items={items}\n change={change}\n onCardAdd={handleCardAdd}\n onCardRemove={handleCardRemove}\n >\n <Panel.Content asChild>\n <KanbanBoard.Content />\n </Panel.Content>\n </KanbanBoard.Root>\n </Panel.Root>\n );\n};\n\ntype ItemsKanbanArticleProps = Omit<KanbanArticleProps, 'subject'> & { subject: Kanban.KanbanItems };\n\nconst ItemsKanbanArticle = ({ role, subject: object }: ItemsKanbanArticleProps) => {\n const db = Obj.getDatabase(object);\n const projection = useItemsProjection(object);\n const change = useEchoChangeCallback(object);\n\n // TODO(wittjosiah): pass refs (not loaded objects) through to the kanban\n // board and let `KanbanCard` subscribe to its own ref via `useObject`.\n // Today this atom subscribes to *every* item — any one changing causes the\n // container (and the model's per-column atoms) to recompute. With cards\n // subscribing themselves, the container only needs the refs and the\n // per-card render is independent. Requires:\n // - `KanbanCard` to accept `Ref<Obj.Unknown>` as `data` and call\n // `useObject(ref)` internally.\n // - The model to handle a ref-bearing item shape (id from\n // `ref.dxn.asEchoDXN()?.echoUri`) and use arrangement-only ordering\n // for items-variant (no pivot-value fallback, since refs don't expose\n // the pivot field without loading).\n // - `Mosaic.isItem` to accept the ref wrapper alongside `Obj.isObject`.\n const itemsAtom = useMemo(\n () =>\n Atom.make((get) => {\n const out: Obj.Unknown[] = [];\n for (const ref of object.spec.items as ReadonlyArray<Ref.Ref<Obj.Unknown>>) {\n const target = get(AtomObj.make(ref));\n if (target == null) {\n continue;\n }\n // Drop soft-deleted cards (e.g. Trello-closed cards). The ref\n // stays in `spec.items` so arrangement is preserved, but the card\n // shouldn't render.\n if (Obj.isDeleted(target)) {\n continue;\n }\n out.push(target as unknown as Obj.Unknown);\n }\n return out;\n }),\n [object.spec.items],\n );\n\n const handleCardRemove = useCallback(() => undefined, []);\n\n if (!object || !db || !change) {\n return null;\n }\n\n // TODO(wittjosiah): wire `onCardAdd` to the create-object flow so\n // users can add items directly from the kanban (currently the column's\n // \"+\" button is hidden because `onCardAdd` is undefined).\n return (\n <Panel.Root role={role}>\n <Panel.Toolbar asChild>\n <Toolbar.Root />\n </Panel.Toolbar>\n <KanbanBoard.Root\n kanban={object}\n projection={projection}\n items={itemsAtom}\n change={change}\n onCardRemove={handleCardRemove}\n >\n <Panel.Content asChild>\n <KanbanBoard.Content />\n </Panel.Content>\n </KanbanBoard.Root>\n </Panel.Root>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Atom", "RegistryContext", "React", "useCallback", "useContext", "useMemo", "useCapabilities", "useOperationInvoker", "AppCapabilities", "useSchemaFilter", "Filter", "Obj", "Query", "Type", "AtomObj", "AtomQuery", "useObject", "useType", "Panel", "Toolbar", "getTagFromQuery", "getTypenameFromQuery", "KanbanBoard", "useEchoChangeCallback", "useItemsProjection", "useProjectionModel", "KanbanOperation", "Kanban", "KanbanArticle", "props", "isKanbanItems", "subject", "ItemsKanbanArticle", "ViewKanbanArticle", "role", "object", "registry", "schemas", "Schema", "db", "getDatabase", "invokePromise", "view", "spec", "kind", "undefined", "typename", "query", "ast", "tag", "schemaFromDb", "cardSchema", "flat", "find", "schema", "getTypename", "baseFilter", "items", "select", "make", "projection", "change", "pivotFieldId", "columnFieldPath", "tryGetFieldProjection", "property", "handleCardAdd", "columnValue", "card", "assertObject", "add", "id", "handleCardRemove", "DeleteCard", "Root", "asChild", "kanban", "onCardAdd", "onCardRemove", "Content", "itemsAtom", "get", "out", "ref", "target", "isDeleted", "push"]
7
+ }