@dxos/plugin-kanban 0.8.4-main.fcfe5033a5 → 0.8.4-staging.60fe92afc8

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 (256) 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-T4CPKAZH.mjs +132 -0
  5. package/dist/lib/neutral/KanbanArticle-T4CPKAZH.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/neutral/KanbanSettings-5WOS4CUE.mjs +83 -0
  13. package/dist/lib/neutral/KanbanSettings-5WOS4CUE.mjs.map +7 -0
  14. package/dist/lib/neutral/blueprint-definition-6DV3Q5MC.mjs +15 -0
  15. package/dist/lib/neutral/blueprint-definition-6DV3Q5MC.mjs.map +7 -0
  16. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  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-DAKIZO46.mjs +246 -0
  22. package/dist/lib/neutral/chunk-DAKIZO46.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-M5ISZWZU.mjs +8 -0
  24. package/dist/lib/neutral/chunk-M5ISZWZU.mjs.map +7 -0
  25. package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-ZTQW5KQS.mjs} +4 -5
  26. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs.map +7 -0
  27. package/dist/lib/neutral/components/index.mjs +243 -0
  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/{browser/delete-card-VPNVIWOA.mjs → neutral/delete-card-VNAV3CZV.mjs} +6 -14
  34. package/dist/lib/neutral/delete-card-VNAV3CZV.mjs.map +7 -0
  35. package/dist/lib/neutral/delete-card-field-XHOLGS6L.mjs +39 -0
  36. package/dist/lib/neutral/delete-card-field-XHOLGS6L.mjs.map +7 -0
  37. package/dist/lib/neutral/hooks/index.mjs +431 -0
  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/index.mjs.map +7 -0
  41. package/dist/lib/neutral/meta.json +1 -0
  42. package/dist/lib/neutral/meta.mjs +8 -0
  43. package/dist/lib/neutral/meta.mjs.map +7 -0
  44. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +13 -0
  45. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +7 -0
  46. package/dist/lib/neutral/operations/index.mjs +8 -0
  47. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  48. package/dist/lib/neutral/plugin.mjs +16 -0
  49. package/dist/lib/neutral/plugin.mjs.map +7 -0
  50. package/dist/lib/neutral/react-surface-VZEVEJL5.mjs +91 -0
  51. package/dist/lib/neutral/react-surface-VZEVEJL5.mjs.map +7 -0
  52. package/dist/lib/{browser/restore-card-4GG2RYKR.mjs → neutral/restore-card-EKVEPATL.mjs} +6 -14
  53. package/dist/lib/neutral/restore-card-EKVEPATL.mjs.map +7 -0
  54. package/dist/lib/neutral/restore-card-field-TQCTGGNO.mjs +37 -0
  55. package/dist/lib/neutral/restore-card-field-TQCTGGNO.mjs.map +7 -0
  56. package/dist/lib/neutral/testing/index.mjs +62 -0
  57. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  58. package/dist/lib/neutral/translations.mjs +44 -0
  59. package/dist/lib/neutral/translations.mjs.map +7 -0
  60. package/dist/lib/neutral/types/index.mjs +22 -0
  61. package/dist/lib/neutral/types/index.mjs.map +7 -0
  62. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs +42 -0
  63. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs.map +7 -0
  64. package/dist/types/src/KanbanPlugin.d.ts +1 -0
  65. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  66. package/dist/types/src/KanbanPlugin.node.d.ts +4 -0
  67. package/dist/types/src/KanbanPlugin.node.d.ts.map +1 -0
  68. package/dist/types/src/KanbanPlugin.test.d.ts +2 -0
  69. package/dist/types/src/KanbanPlugin.test.d.ts.map +1 -0
  70. package/dist/types/src/KanbanPlugin.workerd.d.ts +4 -0
  71. package/dist/types/src/KanbanPlugin.workerd.d.ts.map +1 -0
  72. package/dist/types/src/blueprints/kanban-blueprint.d.ts +2 -2
  73. package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/blueprint-definition.d.ts +1 -1
  76. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  78. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/index.d.ts +9 -2
  80. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  82. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -1
  85. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +9 -29
  86. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -1
  87. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +24 -24
  88. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +2 -3
  90. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -1
  91. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +2 -3
  92. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -1
  93. package/dist/types/src/components/KanbanBoard/context.d.ts +38 -0
  94. package/dist/types/src/components/KanbanBoard/context.d.ts.map +1 -0
  95. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts +6 -0
  96. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -0
  97. package/dist/types/src/containers/{KanbanContainer/KanbanContainer.stories.d.ts → KanbanArticle/KanbanArticle.stories.d.ts} +26 -26
  98. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts.map +1 -0
  99. package/dist/types/src/containers/KanbanArticle/index.d.ts +2 -0
  100. package/dist/types/src/containers/KanbanArticle/index.d.ts.map +1 -0
  101. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts +13 -0
  102. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -0
  103. package/dist/types/src/containers/KanbanSettings/index.d.ts +2 -0
  104. package/dist/types/src/containers/KanbanSettings/index.d.ts.map +1 -0
  105. package/dist/types/src/containers/index.d.ts +2 -2
  106. package/dist/types/src/containers/index.d.ts.map +1 -1
  107. package/dist/types/src/hooks/index.d.ts +1 -0
  108. package/dist/types/src/hooks/index.d.ts.map +1 -1
  109. package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -1
  110. package/dist/types/src/hooks/useItemsProjection.d.ts +10 -0
  111. package/dist/types/src/hooks/useItemsProjection.d.ts.map +1 -0
  112. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts +2 -0
  113. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts.map +1 -0
  114. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -1
  115. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +1 -1
  116. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -1
  117. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +1 -1
  118. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +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 +3 -3
  125. package/dist/types/src/operations/delete-card-field.d.ts.map +1 -1
  126. package/dist/types/src/operations/delete-card.d.ts +3 -3
  127. package/dist/types/src/operations/delete-card.d.ts.map +1 -1
  128. package/dist/types/src/operations/index.d.ts +1 -2
  129. package/dist/types/src/operations/index.d.ts.map +1 -1
  130. package/dist/types/src/operations/restore-card-field.d.ts +3 -3
  131. package/dist/types/src/operations/restore-card-field.d.ts.map +1 -1
  132. package/dist/types/src/operations/restore-card.d.ts +3 -3
  133. package/dist/types/src/operations/restore-card.d.ts.map +1 -1
  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/translations.d.ts +24 -24
  139. package/dist/types/src/translations.d.ts.map +1 -1
  140. package/dist/types/src/types/Kanban.d.ts +66 -9
  141. package/dist/types/src/types/Kanban.d.ts.map +1 -1
  142. package/dist/types/src/{operations/definitions.d.ts → types/KanbanOperation.d.ts} +4 -4
  143. package/dist/types/src/types/KanbanOperation.d.ts.map +1 -0
  144. package/dist/types/src/types/constants.d.ts +3 -3
  145. package/dist/types/src/types/constants.d.ts.map +1 -1
  146. package/dist/types/src/types/index.d.ts +2 -1
  147. package/dist/types/src/types/index.d.ts.map +1 -1
  148. package/dist/types/src/types/schema.d.ts +15 -1
  149. package/dist/types/src/types/schema.d.ts.map +1 -1
  150. package/dist/types/src/types/types.d.ts +2 -2
  151. package/dist/types/src/util/arrangement.d.ts +8 -4
  152. package/dist/types/src/util/arrangement.d.ts.map +1 -1
  153. package/dist/types/tsconfig.tsbuildinfo +1 -1
  154. package/package.json +110 -76
  155. package/src/KanbanPlugin.node.ts +21 -0
  156. package/src/KanbanPlugin.test.ts +31 -0
  157. package/src/KanbanPlugin.tsx +12 -39
  158. package/src/KanbanPlugin.workerd.ts +18 -0
  159. package/src/blueprints/kanban-blueprint.ts +2 -3
  160. package/src/capabilities/artifact-definition.ts +10 -9
  161. package/src/capabilities/blueprint-definition.ts +6 -4
  162. package/src/capabilities/create-object.ts +40 -0
  163. package/src/capabilities/index.ts +9 -2
  164. package/src/capabilities/operation-handler.ts +1 -1
  165. package/src/capabilities/react-surface.tsx +31 -14
  166. package/src/capabilities/undo-mappings.ts +1 -1
  167. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +9 -6
  168. package/src/components/KanbanBoard/KanbanBoard.tsx +22 -51
  169. package/src/components/KanbanBoard/KanbanCard.tsx +75 -60
  170. package/src/components/KanbanBoard/KanbanColumn.tsx +16 -13
  171. package/src/components/KanbanBoard/context.ts +54 -0
  172. package/src/containers/{KanbanContainer/KanbanContainer.stories.tsx → KanbanArticle/KanbanArticle.stories.tsx} +48 -42
  173. package/src/containers/KanbanArticle/KanbanArticle.tsx +179 -0
  174. package/src/containers/KanbanArticle/index.ts +5 -0
  175. package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
  176. package/src/containers/KanbanSettings/index.ts +5 -0
  177. package/src/containers/index.ts +2 -2
  178. package/src/hooks/index.ts +1 -0
  179. package/src/hooks/useEchoChangeCallback.ts +2 -2
  180. package/src/hooks/useItemsProjection.ts +44 -0
  181. package/src/hooks/{useKanbanBoardModel.test.ts → useKanbanBoardModel.browser.test.ts} +14 -19
  182. package/src/hooks/useKanbanBoardModel.ts +19 -7
  183. package/src/hooks/useProjectionModel.ts +4 -4
  184. package/src/index.ts +3 -2
  185. package/src/meta.ts +22 -5
  186. package/src/operations/delete-card-field.ts +11 -16
  187. package/src/operations/delete-card.ts +3 -3
  188. package/src/operations/index.ts +1 -3
  189. package/src/operations/restore-card-field.ts +11 -16
  190. package/src/operations/restore-card.ts +3 -3
  191. package/src/playwright/smoke.spec.ts +3 -3
  192. package/src/plugin.ts +11 -0
  193. package/src/testing/KanbanCardTileSimple.tsx +6 -6
  194. package/src/types/Kanban.ts +86 -23
  195. package/src/{operations/definitions.ts → types/KanbanOperation.ts} +25 -9
  196. package/src/types/index.ts +3 -1
  197. package/src/types/schema.ts +20 -2
  198. package/src/types/types.ts +2 -2
  199. package/src/util/arrangement.test.ts +22 -13
  200. package/src/util/arrangement.ts +25 -15
  201. package/src/vite-env.d.ts +10 -0
  202. package/dist/lib/browser/blueprints/index.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-A3PBV3S5.mjs +0 -105
  204. package/dist/lib/browser/chunk-A3PBV3S5.mjs.map +0 -7
  205. package/dist/lib/browser/delete-card-VPNVIWOA.mjs.map +0 -7
  206. package/dist/lib/browser/delete-card-field-4HHF2GYX.mjs +0 -50
  207. package/dist/lib/browser/delete-card-field-4HHF2GYX.mjs.map +0 -7
  208. package/dist/lib/browser/index.mjs +0 -121
  209. package/dist/lib/browser/index.mjs.map +0 -7
  210. package/dist/lib/browser/meta.json +0 -1
  211. package/dist/lib/browser/operations/index.mjs +0 -13
  212. package/dist/lib/browser/operations/index.mjs.map +0 -7
  213. package/dist/lib/browser/restore-card-4GG2RYKR.mjs.map +0 -7
  214. package/dist/lib/browser/restore-card-field-3T26ACYX.mjs +0 -48
  215. package/dist/lib/browser/restore-card-field-3T26ACYX.mjs.map +0 -7
  216. package/dist/lib/browser/types/index.mjs +0 -100
  217. package/dist/lib/browser/types/index.mjs.map +0 -7
  218. package/dist/lib/node-esm/blueprints/index.mjs +0 -28
  219. package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
  220. package/dist/lib/node-esm/chunk-6LELYA2G.mjs +0 -106
  221. package/dist/lib/node-esm/chunk-6LELYA2G.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  223. package/dist/lib/node-esm/delete-card-5PW5OMFN.mjs +0 -33
  224. package/dist/lib/node-esm/delete-card-5PW5OMFN.mjs.map +0 -7
  225. package/dist/lib/node-esm/delete-card-field-KPJU2AQ3.mjs +0 -51
  226. package/dist/lib/node-esm/delete-card-field-KPJU2AQ3.mjs.map +0 -7
  227. package/dist/lib/node-esm/index.mjs +0 -122
  228. package/dist/lib/node-esm/index.mjs.map +0 -7
  229. package/dist/lib/node-esm/meta.json +0 -1
  230. package/dist/lib/node-esm/operations/index.mjs +0 -14
  231. package/dist/lib/node-esm/operations/index.mjs.map +0 -7
  232. package/dist/lib/node-esm/restore-card-X2TKMU5A.mjs +0 -30
  233. package/dist/lib/node-esm/restore-card-X2TKMU5A.mjs.map +0 -7
  234. package/dist/lib/node-esm/restore-card-field-IUTL4RTR.mjs +0 -49
  235. package/dist/lib/node-esm/restore-card-field-IUTL4RTR.mjs.map +0 -7
  236. package/dist/lib/node-esm/types/index.mjs +0 -101
  237. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  238. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +0 -6
  239. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +0 -1
  240. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +0 -1
  241. package/dist/types/src/containers/KanbanContainer/index.d.ts +0 -2
  242. package/dist/types/src/containers/KanbanContainer/index.d.ts.map +0 -1
  243. package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts +0 -6
  244. package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts.map +0 -1
  245. package/dist/types/src/containers/KanbanViewEditor/index.d.ts +0 -2
  246. package/dist/types/src/containers/KanbanViewEditor/index.d.ts.map +0 -1
  247. package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts +0 -2
  248. package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts.map +0 -1
  249. package/dist/types/src/operations/definitions.d.ts.map +0 -1
  250. package/src/containers/KanbanContainer/KanbanContainer.tsx +0 -96
  251. package/src/containers/KanbanContainer/index.ts +0 -5
  252. package/src/containers/KanbanViewEditor/KanbanViewEditor.tsx +0 -63
  253. package/src/containers/KanbanViewEditor/index.ts +0 -5
  254. /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/blueprints/index.mjs.map} +0 -0
  255. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  256. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/containers/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const KanbanArticle: ComponentType<any> = lazy(() => import('./KanbanArticle'));\nexport const KanbanSettings: ComponentType<any> = lazy(() => import('./KanbanSettings'));\n"],
5
+ "mappings": ";;;AAIA,SAA6BA,YAAY;AAElC,IAAMC,gBAAoCD,KAAK,MAAM,OAAO,+BAAA,CAAA;AAC5D,IAAME,iBAAqCF,KAAK,MAAM,OAAO,gCAAA,CAAA;",
6
+ "names": ["lazy", "KanbanArticle", "KanbanSettings"]
7
+ }
@@ -0,0 +1,40 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/capabilities/create-object.ts
4
+ import * as Effect from "effect/Effect";
5
+ import { Capability } from "@dxos/app-framework";
6
+ import { Operation } from "@dxos/compute";
7
+ import { Type } from "@dxos/echo";
8
+ import { SpaceOperation } from "@dxos/plugin-space";
9
+ import { SpaceCapabilities } from "@dxos/plugin-space";
10
+ import { ViewModel } from "@dxos/schema";
11
+ import { CreateKanbanSchema, Kanban } from "#types";
12
+ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
13
+ return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
14
+ id: Type.getTypename(Kanban.Kanban),
15
+ inputSchema: CreateKanbanSchema,
16
+ createObject: (props, options) => Effect.gen(function* () {
17
+ const object = yield* Effect.promise(async () => {
18
+ const { view } = await ViewModel.makeFromDatabase({
19
+ db: options.db,
20
+ typename: props.typename,
21
+ pivotFieldName: props.initialPivotColumn
22
+ });
23
+ return Kanban.make({
24
+ name: props.name,
25
+ view
26
+ });
27
+ });
28
+ return yield* Operation.invoke(SpaceOperation.AddObject, {
29
+ object,
30
+ target: options.target,
31
+ hidden: true,
32
+ targetNodeId: options.targetNodeId
33
+ });
34
+ })
35
+ });
36
+ }));
37
+ export {
38
+ create_object_default as default
39
+ };
40
+ //# sourceMappingURL=create-object-DKBSI46K.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/create-object.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { ViewModel } from '@dxos/schema';\n\nimport { CreateKanbanSchema, Kanban } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Kanban.Kanban),\n inputSchema: CreateKanbanSchema,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = yield* Effect.promise(async () => {\n const { view } = await ViewModel.makeFromDatabase({\n db: options.db,\n typename: props.typename,\n pivotFieldName: props.initialPivotColumn,\n });\n return Kanban.make({ name: props.name, view });\n });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n hidden: true,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAClC,SAASC,iBAAiB;AAE1B,SAASC,oBAAoBC,cAAc;AAE3C,IAAA,wBAAeP,WAAWQ,WACjBC,kBAAW,aAAA;AAChB,SAAOT,WAAWU,YAAYN,kBAAkBO,mBAAmB;IACjEC,IAAIV,KAAKW,YAAYN,OAAOA,MAAM;IAClCO,aAAaR;IACbS,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAAS,OAAcC,eAAQ,YAAA;AACnC,cAAM,EAAEC,KAAI,IAAK,MAAMhB,UAAUiB,iBAAiB;UAChDC,IAAIN,QAAQM;UACZC,UAAUR,MAAMQ;UAChBC,gBAAgBT,MAAMU;QACxB,CAAA;AACA,eAAOnB,OAAOoB,KAAK;UAAEC,MAAMZ,MAAMY;UAAMP;QAAK,CAAA;MAC9C,CAAA;AACA,aAAO,OAAOpB,UAAU4B,OAAO1B,eAAe2B,WAAW;QACvDX;QACAY,QAAQd,QAAQc;QAChBC,QAAQ;QACRC,cAAchB,QAAQgB;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "Operation", "Type", "SpaceOperation", "SpaceCapabilities", "ViewModel", "CreateKanbanSchema", "Kanban", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "getTypename", "inputSchema", "createObject", "props", "options", "gen", "object", "promise", "view", "makeFromDatabase", "db", "typename", "pivotFieldName", "initialPivotColumn", "make", "name", "invoke", "AddObject", "target", "hidden", "targetNodeId"]
7
+ }
@@ -1,25 +1,17 @@
1
1
  import {
2
- DeleteCard
3
- } from "./chunk-A3PBV3S5.mjs";
2
+ KanbanOperation_exports
3
+ } from "./chunk-DAKIZO46.mjs";
4
4
  import "./chunk-J5LGTIGS.mjs";
5
5
 
6
6
  // src/operations/delete-card.ts
7
7
  import * as Effect from "effect/Effect";
8
+ import { Operation } from "@dxos/compute";
8
9
  import { Obj } from "@dxos/echo";
9
10
  import { invariant } from "@dxos/invariant";
10
- import { Operation } from "@dxos/operation";
11
11
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/operations/delete-card.ts";
12
- var handler = DeleteCard.pipe(Operation.withHandler(({ card }) => Effect.sync(() => {
12
+ var handler = KanbanOperation_exports.DeleteCard.pipe(Operation.withHandler(({ card }) => Effect.sync(() => {
13
13
  const db = Obj.getDatabase(card);
14
- invariant(db, void 0, {
15
- F: __dxlog_file,
16
- L: 15,
17
- S: void 0,
18
- A: [
19
- "db",
20
- ""
21
- ]
22
- });
14
+ invariant(db, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 9, S: void 0, A: ["db", ""] });
23
15
  db.remove(card);
24
16
  return {
25
17
  card
@@ -29,4 +21,4 @@ var delete_card_default = handler;
29
21
  export {
30
22
  delete_card_default as default
31
23
  };
32
- //# sourceMappingURL=delete-card-VPNVIWOA.mjs.map
24
+ //# sourceMappingURL=delete-card-VNAV3CZV.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/delete-card.ts"],
4
+ "sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\n\nimport { KanbanOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof KanbanOperation.DeleteCard> = KanbanOperation.DeleteCard.pipe(\n Operation.withHandler(({ card }) =>\n Effect.sync(() => {\n const db = Obj.getDatabase(card);\n invariant(db);\n db.remove(card);\n\n return { card };\n }),\n ),\n);\n\nexport default handler;\n"],
5
+ "mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,iBAAiB;AAC1B,SAASC,WAAW;AACpB,SAASC,iBAAiB;AAI1B,IAAA,eAA0EC;cAIpEC,wBAAUC,WAAAA,KAAAA,UAAAA,YAAAA,CAAAA,EAAAA,KAAAA,MAAAA,YAAAA,MAAAA;AACVA,QAAGC,KAAOC,IAAAA,YAAAA,IAAAA;AAEV,YAAO,IAAA,QAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,GAAA,GAAA,QAAA,GAAA,CAAA,MAAA,EAAA,EAAA,CAAA;YAAEA,IAAAA;AAAK,SAAA;IAChB;EAIJ;;;",
6
+ "names": ["Effect", "Operation", "Obj", "invariant", "KanbanOperation", "invariant", "db", "remove", "card"]
7
+ }
@@ -0,0 +1,39 @@
1
+ import {
2
+ KanbanOperation_exports
3
+ } from "./chunk-DAKIZO46.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/operations/delete-card-field.ts
7
+ import * as Effect from "effect/Effect";
8
+ import { Capabilities, Capability } from "@dxos/app-framework";
9
+ import { Operation } from "@dxos/compute";
10
+ import { Obj, Type } from "@dxos/echo";
11
+ import { invariant } from "@dxos/invariant";
12
+ import { ProjectionModel, createEchoChangeCallback, getTypeURIFromQuery } from "@dxos/schema";
13
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/operations/delete-card-field.ts";
14
+ var handler = KanbanOperation_exports.DeleteCardField.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ view, fieldId }) {
15
+ const registry = yield* Capability.get(Capabilities.AtomRegistry);
16
+ const db = Obj.getDatabase(view);
17
+ invariant(db, "Database not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 12, S: this, A: ["db", "'Database not found'"] });
18
+ const types = yield* Effect.sync(() => db.graph.registry.list().filter(Type.isType));
19
+ const schema = types.find((t) => Type.getURI(t) === getTypeURIFromQuery(view.query.ast));
20
+ invariant(schema, "Schema not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 15, S: this, A: ["schema", "'Schema not found'"] });
21
+ invariant(Type.isType(schema), "expected stored Type.Type for card schema", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 16, S: this, A: ["Type.isType(schema)", "'expected stored Type.Type for card schema'"] });
22
+ const projection = new ProjectionModel({
23
+ registry,
24
+ view,
25
+ baseSchema: schema.jsonSchema,
26
+ change: createEchoChangeCallback(view, schema)
27
+ });
28
+ const result = projection.deleteFieldProjection(fieldId);
29
+ return {
30
+ field: result.deleted.field,
31
+ props: result.deleted.props,
32
+ index: result.index
33
+ };
34
+ })));
35
+ var delete_card_field_default = handler;
36
+ export {
37
+ delete_card_field_default as default
38
+ };
39
+ //# sourceMappingURL=delete-card-field-XHOLGS6L.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/delete-card-field.ts"],
4
+ "sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Obj, Type } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ProjectionModel, createEchoChangeCallback, getTypeURIFromQuery } from '@dxos/schema';\n\nimport { KanbanOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof KanbanOperation.DeleteCardField> = KanbanOperation.DeleteCardField.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ view, fieldId }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const db = Obj.getDatabase(view);\n invariant(db, 'Database not found');\n const types = yield* Effect.sync(() => db.graph.registry.list().filter(Type.isType));\n const schema = types.find((t) => Type.getURI(t) === getTypeURIFromQuery(view.query.ast));\n invariant(schema, 'Schema not found');\n\n invariant(Type.isType(schema), 'expected stored Type.Type for card schema');\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: schema.jsonSchema,\n change: createEchoChangeCallback(view, schema),\n });\n\n const result = projection.deleteFieldProjection(fieldId);\n\n return {\n field: result.deleted.field,\n props: result.deleted.props,\n index: result.index,\n };\n }),\n ),\n);\n\nexport default handler;\n"],
5
+ "mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,YAAY;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,iBAAiBC,0BAA0BC,2BAA2B;AAI/E,IAAA,eAA+EC;IAIzE,UAAWC,wBAAgBC,gBAAAA,KAAAA,UAAAA,YAAAA,kBAAAA,WAAAA,EAAAA,MAAAA,QAAAA,GAAAA;AAC3BC,QAAAA,WAAc,OAAA,WAAA,IAAA,aAAA,YAAA;AACd,QAAMC,KAAAA,IAAQ,YAAOC,IAAOC;AAC5B,YAAMC,IAAAA,sBAA2BC,EAAKC,YAAOC,YAAOC,GAAAA,cAAoBT,GAAKU,IAAAA,GAAK,MAAI,GAAA,CAAA,MAAA,sBAAA,EAAA,CAAA;AACtFT,QAAAA,QAAUI,OAAQ,YAAA,MAAA,GAAA,MAAA,SAAA,KAAA,EAAA,OAAA,KAAA,MAAA,CAAA;AAElBJ,QAAAA,SAAeU,MAAM,KAACN,CAAAA,MAAS,KAAA,OAAA,CAAA,MAAA,oBAAA,KAAA,MAAA,GAAA,CAAA;AAC/B,YAAMO,QAAAA,oBAAiBC,EAAAA,YAAgB,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,UAAA,oBAAA,EAAA,CAAA;YACrCC,KAAAA,OAAAA,MAAAA,GAAAA,6CAAAA,EAAAA,YAAAA,YAAAA,GAAAA,cAAAA,GAAAA,IAAAA,GAAAA,MAAAA,GAAAA,CAAAA,uBAAAA,6CAAAA,EAAAA,CAAAA;QACAd,aAAAA,IAAAA,gBAAAA;IACAe;IACAC;IACF,YAAA,OAAA;IAEA,QAAMC,yBAAoBC,MAAAA,MAAsBC;EAEhD,CAAA;QACEC,SAAOH,WAAeG,sBAAK,OAAA;SAC3BC;IACAC,OAAOL,OAAOK,QAAK;IACrB,OAAA,OAAA,QAAA;IACF,OAAA,OAAA;EAIJ;;;",
6
+ "names": ["Effect", "Capabilities", "Capability", "Operation", "Obj", "Type", "invariant", "ProjectionModel", "createEchoChangeCallback", "getTypeURIFromQuery", "KanbanOperation", "Obj", "view", "invariant", "types", "Effect", "sync", "schema", "Type", "getURI", "t", "getTypeURIFromQuery", "query", "isType", "projection", "ProjectionModel", "registry", "baseSchema", "change", "result", "deleteFieldProjection", "fieldId", "field", "props", "index"]
7
+ }
@@ -0,0 +1,431 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/hooks/useEchoChangeCallback.ts
4
+ import { useMemo } from "react";
5
+ import { Obj } from "@dxos/echo";
6
+ var createEchoChangeCallback = (kanban) => ({
7
+ kanban: (mutate) => Obj.update(kanban, (kanban2) => mutate(kanban2)),
8
+ setItemField: (item, field, value) => {
9
+ Obj.update(item, (item2) => {
10
+ item2[field] = value;
11
+ });
12
+ }
13
+ });
14
+ var useEchoChangeCallback = (kanban) => useMemo(() => kanban ? createEchoChangeCallback(kanban) : null, [
15
+ kanban
16
+ ]);
17
+
18
+ // src/hooks/useItemsProjection.ts
19
+ import { Atom } from "@effect-atom/atom-react";
20
+ import { useMemo as useMemo2 } from "react";
21
+ var useItemsProjection = (kanban) => {
22
+ return useMemo2(() => {
23
+ const pivotField = kanban.spec.pivotField;
24
+ const optionIds = Object.keys(kanban.arrangement?.columns ?? {});
25
+ const options = optionIds.map((id) => ({
26
+ id,
27
+ title: id,
28
+ color: "neutral"
29
+ }));
30
+ const fieldProjection = {
31
+ field: {
32
+ id: pivotField,
33
+ path: pivotField
34
+ },
35
+ props: {
36
+ property: pivotField,
37
+ options
38
+ }
39
+ };
40
+ const fields = Atom.make(() => [
41
+ fieldProjection.field
42
+ ]);
43
+ const stub = {
44
+ fields,
45
+ tryGetFieldProjection: (id) => id === pivotField ? fieldProjection : void 0,
46
+ getFieldProjections: () => [],
47
+ getHiddenProperties: () => [
48
+ pivotField
49
+ ]
50
+ };
51
+ return stub;
52
+ }, [
53
+ kanban.arrangement?.columns,
54
+ kanban.spec.pivotField
55
+ ]);
56
+ };
57
+
58
+ // src/hooks/useKanbanBoardModel.ts
59
+ import { Atom as Atom2 } from "@effect-atom/atom-react";
60
+ import { useMemo as useMemo3 } from "react";
61
+ import { Obj as Obj2 } from "@dxos/echo";
62
+
63
+ // src/util/arrangement.ts
64
+ import { UNCATEGORIZED_VALUE } from "#types";
65
+ var getOrderFromArrangement = (arrangement) => {
66
+ const order = arrangement?.order;
67
+ if (order != null && Array.isArray(order) && order.length > 0) {
68
+ return [
69
+ ...order
70
+ ];
71
+ }
72
+ return [];
73
+ };
74
+ var getOrderByColumnFromArrangement = (arrangement) => {
75
+ const columns = arrangement?.columns;
76
+ if (columns != null && Object.keys(columns).length > 0) {
77
+ return Object.fromEntries(Object.entries(columns).map(([key, entry]) => {
78
+ const rawIds = entry.ids;
79
+ const ids = Array.isArray(rawIds) ? [
80
+ ...rawIds
81
+ ] : [];
82
+ return [
83
+ key,
84
+ {
85
+ ids,
86
+ ...entry.hidden !== void 0 && {
87
+ hidden: entry.hidden
88
+ }
89
+ }
90
+ ];
91
+ }));
92
+ }
93
+ return {};
94
+ };
95
+ var computeColumnStructure = (effectiveOrder, effectiveByColumn, selectOptions) => {
96
+ const order = [
97
+ ...effectiveOrder
98
+ ];
99
+ if (!order.includes(UNCATEGORIZED_VALUE)) {
100
+ order.unshift(UNCATEGORIZED_VALUE);
101
+ }
102
+ for (const opt of selectOptions) {
103
+ if (opt.id !== UNCATEGORIZED_VALUE && !order.includes(opt.id)) {
104
+ order.push(opt.id);
105
+ }
106
+ }
107
+ return order.filter((columnValue) => effectiveByColumn[columnValue]?.hidden !== true).map((columnValue) => ({
108
+ columnValue,
109
+ ids: effectiveByColumn[columnValue]?.ids ?? []
110
+ }));
111
+ };
112
+ var orderItemsInColumn = (items, ids, columnValue, pivotPath, validColumnValues) => {
113
+ const orderMap = new Map(ids.map((id, index) => [
114
+ id,
115
+ index
116
+ ]));
117
+ const cardsWithExistingOrder = [];
118
+ const newCards = [];
119
+ for (const item of items) {
120
+ const itemColumn = pivotPath !== void 0 ? item[pivotPath] : void 0;
121
+ const isValidColumn = itemColumn != null && validColumnValues.has(itemColumn);
122
+ const belongsInColumn = columnValue === UNCATEGORIZED_VALUE ? !isValidColumn : itemColumn === columnValue;
123
+ if (belongsInColumn) {
124
+ (orderMap.has(item.id) ? cardsWithExistingOrder : newCards).push(item);
125
+ }
126
+ }
127
+ cardsWithExistingOrder.sort((a, b) => {
128
+ const indexA = orderMap.get(a.id) ?? Infinity;
129
+ const indexB = orderMap.get(b.id) ?? Infinity;
130
+ return indexA - indexB;
131
+ });
132
+ return [
133
+ ...cardsWithExistingOrder,
134
+ ...newCards
135
+ ];
136
+ };
137
+
138
+ // src/hooks/useKanbanBoardModel.ts
139
+ function useKanbanBoardModel(kanban, projection, itemsAtom, registry) {
140
+ const arrangementAtom = useMemo3(() => Obj2.atomProperty(kanban, "arrangement"), [
141
+ kanban
142
+ ]);
143
+ const viewSnapshotAtom = useMemo3(() => kanban?.spec?.kind === "view" && kanban.spec.view ? Obj2.atom(kanban.spec.view) : Atom2.make(() => void 0), [
144
+ kanban?.spec
145
+ ]);
146
+ const pivotFieldIdAtom = useMemo3(() => Atom2.make((get) => {
147
+ if (kanban?.spec.kind === "items") {
148
+ return kanban.spec.pivotField;
149
+ }
150
+ return get(viewSnapshotAtom)?.projection?.pivotFieldId;
151
+ }), [
152
+ kanban?.spec,
153
+ viewSnapshotAtom
154
+ ]);
155
+ const effectiveByColumnAtom = useMemo3(() => Atom2.make((get) => getOrderByColumnFromArrangement(get(arrangementAtom))), [
156
+ arrangementAtom
157
+ ]);
158
+ const columnsAtom = useMemo3(() => Atom2.make((get) => {
159
+ const pivotFieldId = get(pivotFieldIdAtom);
160
+ if (pivotFieldId === void 0) {
161
+ return [];
162
+ }
163
+ get(projection.fields);
164
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
165
+ if (!fieldProj) {
166
+ return [];
167
+ }
168
+ const selectOptions = fieldProj.props.options ?? [];
169
+ if (selectOptions.length === 0) {
170
+ return [];
171
+ }
172
+ const arrangement = get(arrangementAtom);
173
+ const order = getOrderFromArrangement(arrangement);
174
+ const byColumn = getOrderByColumnFromArrangement(arrangement);
175
+ return computeColumnStructure(order, byColumn, selectOptions);
176
+ }), [
177
+ pivotFieldIdAtom,
178
+ arrangementAtom,
179
+ projection
180
+ ]);
181
+ const columnArrangementAtomFamily = useMemo3(() => Atom2.family((columnValue) => Atom2.make((get) => {
182
+ const byColumn = get(effectiveByColumnAtom);
183
+ return {
184
+ columnValue,
185
+ ids: [
186
+ ...byColumn[columnValue]?.ids ?? []
187
+ ]
188
+ };
189
+ })), [
190
+ effectiveByColumnAtom
191
+ ]);
192
+ const itemsAtomFamily = useMemo3(() => Atom2.family((columnValue) => Atom2.make((get) => {
193
+ const columnArr = get(columnArrangementAtomFamily(columnValue));
194
+ const allItems = get(itemsAtom);
195
+ const pivotFieldId = get(pivotFieldIdAtom);
196
+ if (pivotFieldId === void 0) {
197
+ return [];
198
+ }
199
+ get(projection.fields);
200
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
201
+ if (!fieldProj) {
202
+ return [];
203
+ }
204
+ const selectOptions = fieldProj.props.options ?? [];
205
+ const pivotPath = fieldProj.props.property;
206
+ const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
207
+ return orderItemsInColumn(allItems, columnArr.ids, columnValue, pivotPath, validColumnValues);
208
+ })), [
209
+ columnArrangementAtomFamily,
210
+ itemsAtom,
211
+ pivotFieldIdAtom,
212
+ projection
213
+ ]);
214
+ return useMemo3(() => ({
215
+ getColumnId: (data) => data.columnValue,
216
+ getItemId: (data) => data.id,
217
+ isColumn: (obj) => typeof obj === "object" && obj !== null && "columnValue" in obj && "ids" in obj,
218
+ // TODO(wittjosiah): This should be restricted to objects of the type of the kanban view.
219
+ isItem: (obj) => Obj2.isObject(obj),
220
+ columns: columnsAtom,
221
+ items: (column) => itemsAtomFamily(column.columnValue),
222
+ getColumns: () => registry.get(columnsAtom) ?? [],
223
+ getItems: (column) => registry.get(itemsAtomFamily(column.columnValue)) ?? []
224
+ }), [
225
+ columnsAtom,
226
+ itemsAtomFamily,
227
+ registry
228
+ ]);
229
+ }
230
+
231
+ // src/hooks/useKanbanColumnEventHandler.ts
232
+ import { useMemo as useMemo4 } from "react";
233
+ import { arrayMove } from "@dxos/util";
234
+ import { UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE2 } from "#types";
235
+ function useKanbanColumnEventHandler({ id, model, projection, pivotFieldId, change }) {
236
+ return useMemo4(() => ({
237
+ id,
238
+ canDrop: ({ source }) => {
239
+ if (!projection) {
240
+ return false;
241
+ }
242
+ const data = source.data;
243
+ const columnValue = model.getColumnId(data);
244
+ return model.isColumn(source.data) && columnValue !== UNCATEGORIZED_VALUE2 && source.id !== UNCATEGORIZED_VALUE2;
245
+ },
246
+ onDrop: ({ source, target }) => {
247
+ if (!projection || pivotFieldId === void 0) {
248
+ return;
249
+ }
250
+ const sourceColumnData = source.data;
251
+ const sourceColumnId = model.getColumnId(sourceColumnData);
252
+ if (sourceColumnId === UNCATEGORIZED_VALUE2) {
253
+ return;
254
+ }
255
+ const currentColumns = model.getColumns();
256
+ const sourceIndex = currentColumns.findIndex((c) => model.getColumnId(c) === sourceColumnId);
257
+ if (sourceIndex === -1) {
258
+ return;
259
+ }
260
+ let targetIndex;
261
+ if (target?.type === "tile" || target?.type === "placeholder") {
262
+ targetIndex = typeof target.location === "number" ? Math.floor(target.location) : -1;
263
+ } else if (target?.type === "container") {
264
+ targetIndex = currentColumns.length;
265
+ } else {
266
+ return;
267
+ }
268
+ if (targetIndex < 0) {
269
+ return;
270
+ }
271
+ const currentColumnIds = currentColumns.map((c) => model.getColumnId(c));
272
+ const reorderedColumnIds = arrayMove([
273
+ ...currentColumnIds
274
+ ], sourceIndex, targetIndex);
275
+ const fieldProjection = projection.getFieldProjection(pivotFieldId);
276
+ const currentOptions = [
277
+ ...fieldProjection.props.options ?? []
278
+ ];
279
+ const optionsInNewOrder = reorderedColumnIds.map((columnId) => currentOptions.find((o) => o.id === columnId)).filter((o) => o != null);
280
+ projection.setFieldProjection({
281
+ ...fieldProjection,
282
+ props: {
283
+ ...fieldProjection.props,
284
+ options: optionsInNewOrder
285
+ }
286
+ });
287
+ change.kanban((kanban) => {
288
+ kanban.arrangement.order = reorderedColumnIds.filter((columnId) => columnId !== UNCATEGORIZED_VALUE2);
289
+ });
290
+ }
291
+ }), [
292
+ id,
293
+ model,
294
+ projection,
295
+ pivotFieldId,
296
+ change
297
+ ]);
298
+ }
299
+
300
+ // src/hooks/useKanbanItemEventHandler.ts
301
+ import { useMemo as useMemo5 } from "react";
302
+ import { UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE3 } from "#types";
303
+ function findColumn(id, arrangement) {
304
+ return arrangement.find(({ columnValue, cards }) => columnValue === id || cards.some((card) => card.id === id));
305
+ }
306
+ function useKanbanItemEventHandler({ column, columnFieldPath, model, change }) {
307
+ return useMemo5(() => ({
308
+ id: column.columnValue,
309
+ canDrop: ({ source }) => model.isItem(source.data),
310
+ onTake: ({ source }, cb) => {
311
+ void cb(source.data);
312
+ },
313
+ onDrop: ({ source, target }) => {
314
+ const columns = model.getColumns();
315
+ const currentArrangement = columns.map((col) => ({
316
+ columnValue: col.columnValue,
317
+ cards: model.getItems(col) ?? []
318
+ }));
319
+ const sourceColumnInSnapshot = findColumn(source.id, currentArrangement);
320
+ if (!sourceColumnInSnapshot) {
321
+ return;
322
+ }
323
+ const workingArrangement = currentArrangement.map((col) => ({
324
+ columnValue: col.columnValue,
325
+ cards: [
326
+ ...col.cards
327
+ ]
328
+ }));
329
+ const sourceColumnInWorking = workingArrangement.find((c) => c.columnValue === sourceColumnInSnapshot.columnValue || c.cards.some((card) => card.id === source.id));
330
+ const targetColumnInWorking = workingArrangement.find((c) => c.columnValue === column.columnValue);
331
+ if (!sourceColumnInWorking || !targetColumnInWorking) {
332
+ return;
333
+ }
334
+ const sourceIndex = sourceColumnInWorking.cards.findIndex((card) => card.id === source.id);
335
+ if (sourceIndex === -1) {
336
+ return;
337
+ }
338
+ const [movedCard] = sourceColumnInWorking.cards.splice(sourceIndex, 1);
339
+ if (columnFieldPath !== void 0) {
340
+ const newValue = targetColumnInWorking.columnValue === UNCATEGORIZED_VALUE3 ? void 0 : targetColumnInWorking.columnValue;
341
+ change.setItemField(movedCard, columnFieldPath, newValue);
342
+ }
343
+ const existingTargetIndex = target?.type === "tile" ? targetColumnInWorking.cards.findIndex((card) => model.getItemId(card) === target.id) : -1;
344
+ const closestEdge = target?.type === "placeholder" && typeof target.location === "number" ? target.location <= targetColumnInWorking.cards.length / 2 ? "top" : "bottom" : "bottom";
345
+ let insertIndex;
346
+ if (target?.type === "placeholder" && typeof target.location === "number") {
347
+ insertIndex = Math.max(0, Math.min(targetColumnInWorking.cards.length, Math.floor(target.location)));
348
+ } else if (target?.type === "container" || existingTargetIndex === -1) {
349
+ insertIndex = targetColumnInWorking.cards.length;
350
+ } else if (sourceColumnInWorking.columnValue === targetColumnInWorking.columnValue) {
351
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
352
+ if (sourceIndex < existingTargetIndex) {
353
+ insertIndex -= 1;
354
+ }
355
+ } else {
356
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
357
+ }
358
+ targetColumnInWorking.cards.splice(insertIndex, 0, movedCard);
359
+ change.kanban((kanban) => {
360
+ kanban.arrangement = {
361
+ order: workingArrangement.map(({ columnValue }) => columnValue),
362
+ columns: Object.fromEntries(workingArrangement.map(({ columnValue, cards }) => [
363
+ columnValue,
364
+ {
365
+ ids: cards.map((c) => c.id)
366
+ }
367
+ ]))
368
+ };
369
+ });
370
+ }
371
+ }), [
372
+ column,
373
+ columnFieldPath,
374
+ model,
375
+ change
376
+ ]);
377
+ }
378
+
379
+ // src/hooks/useProjectionModel.ts
380
+ import { useState } from "react";
381
+ import { JsonSchema, Type } from "@dxos/echo";
382
+ import { log } from "@dxos/log";
383
+ import { useAsyncEffect } from "@dxos/react-ui";
384
+ import { ProjectionModel, createEchoChangeCallback as createEchoChangeCallback2 } from "@dxos/schema";
385
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/hooks/useProjectionModel.ts";
386
+ var useProjectionModel = (schema, kanban, registry) => {
387
+ const [projection, setProjection] = useState();
388
+ useAsyncEffect(async (controller) => {
389
+ if (!schema || !kanban || kanban.spec.kind !== "view") {
390
+ return;
391
+ }
392
+ try {
393
+ const view = await kanban.spec.view.load();
394
+ if (controller.signal.aborted) {
395
+ return;
396
+ }
397
+ const jsonSchema = Type.getDatabase(schema) != null ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);
398
+ const change = createEchoChangeCallback2(view, Type.getDatabase(schema) != null ? schema : void 0);
399
+ const projection2 = new ProjectionModel({
400
+ registry,
401
+ view,
402
+ baseSchema: jsonSchema,
403
+ change
404
+ });
405
+ projection2.normalizeView();
406
+ if (!controller.signal.aborted) {
407
+ setProjection(projection2);
408
+ }
409
+ } catch (err) {
410
+ log.catch(err, {
411
+ schema,
412
+ kanban
413
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 41, S: void 0 });
414
+ }
415
+ }, [
416
+ schema,
417
+ kanban,
418
+ registry
419
+ ]);
420
+ return projection;
421
+ };
422
+ export {
423
+ createEchoChangeCallback,
424
+ useEchoChangeCallback,
425
+ useItemsProjection,
426
+ useKanbanBoardModel,
427
+ useKanbanColumnEventHandler,
428
+ useKanbanItemEventHandler,
429
+ useProjectionModel
430
+ };
431
+ //# sourceMappingURL=index.mjs.map