@dxos/plugin-kanban 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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 (282) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/KanbanArticle-NEJ3LNBO.mjs +132 -0
  4. package/dist/lib/neutral/KanbanArticle-NEJ3LNBO.mjs.map +7 -0
  5. package/dist/lib/neutral/KanbanPlugin.mjs +36 -0
  6. package/dist/lib/neutral/KanbanPlugin.mjs.map +7 -0
  7. package/dist/lib/neutral/KanbanPlugin.node.mjs +27 -0
  8. package/dist/lib/neutral/KanbanPlugin.node.mjs.map +7 -0
  9. package/dist/lib/neutral/KanbanPlugin.workerd.mjs +21 -0
  10. package/dist/lib/neutral/KanbanPlugin.workerd.mjs.map +7 -0
  11. package/dist/lib/neutral/KanbanSettings-G6M47NSK.mjs +83 -0
  12. package/dist/lib/neutral/KanbanSettings-G6M47NSK.mjs.map +7 -0
  13. package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs +15 -0
  14. package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs.map +7 -0
  15. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  16. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  17. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-6FPBLOS3.mjs +8 -0
  19. package/dist/lib/neutral/chunk-6FPBLOS3.mjs.map +7 -0
  20. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  21. package/dist/lib/neutral/chunk-KDPM77BD.mjs +21 -0
  22. package/dist/lib/neutral/chunk-KDPM77BD.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-OQ72EEGU.mjs +254 -0
  24. package/dist/lib/neutral/chunk-OQ72EEGU.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs +26 -0
  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/neutral/delete-card-356CBACE.mjs +24 -0
  34. package/dist/lib/neutral/delete-card-356CBACE.mjs.map +7 -0
  35. package/dist/lib/neutral/delete-card-field-IRCZL2BR.mjs +42 -0
  36. package/dist/lib/neutral/delete-card-field-IRCZL2BR.mjs.map +7 -0
  37. package/dist/lib/neutral/hooks/index.mjs +432 -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/migrations-IWBT35UT.mjs +31 -0
  45. package/dist/lib/neutral/migrations-IWBT35UT.mjs.map +7 -0
  46. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +13 -0
  47. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +7 -0
  48. package/dist/lib/neutral/operations/index.mjs +8 -0
  49. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  50. package/dist/lib/neutral/plugin.mjs +16 -0
  51. package/dist/lib/neutral/plugin.mjs.map +7 -0
  52. package/dist/lib/neutral/react-surface-QROEHBRW.mjs +93 -0
  53. package/dist/lib/neutral/react-surface-QROEHBRW.mjs.map +7 -0
  54. package/dist/lib/neutral/restore-card-P25Y4YSE.mjs +21 -0
  55. package/dist/lib/neutral/restore-card-P25Y4YSE.mjs.map +7 -0
  56. package/dist/lib/neutral/restore-card-field-NHR3R4XI.mjs +40 -0
  57. package/dist/lib/neutral/restore-card-field-NHR3R4XI.mjs.map +7 -0
  58. package/dist/lib/neutral/testing/index.mjs +60 -0
  59. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  60. package/dist/lib/neutral/translations.mjs +44 -0
  61. package/dist/lib/neutral/translations.mjs.map +7 -0
  62. package/dist/lib/neutral/types/index.mjs +22 -0
  63. package/dist/lib/neutral/types/index.mjs.map +7 -0
  64. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs +42 -0
  65. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs.map +7 -0
  66. package/dist/types/src/KanbanPlugin.d.ts +3 -1
  67. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  68. package/dist/types/src/KanbanPlugin.node.d.ts +4 -0
  69. package/dist/types/src/KanbanPlugin.node.d.ts.map +1 -0
  70. package/dist/types/src/KanbanPlugin.test.d.ts +2 -0
  71. package/dist/types/src/KanbanPlugin.test.d.ts.map +1 -0
  72. package/dist/types/src/KanbanPlugin.workerd.d.ts +4 -0
  73. package/dist/types/src/KanbanPlugin.workerd.d.ts.map +1 -0
  74. package/dist/types/src/blueprints/index.d.ts +2 -0
  75. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  76. package/dist/types/src/blueprints/kanban-blueprint.d.ts +4 -0
  77. package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -0
  78. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -2
  79. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -4
  81. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  83. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/index.d.ts +13 -3
  85. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/migrations.d.ts +6 -0
  87. package/dist/types/src/capabilities/migrations.d.ts.map +1 -0
  88. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  89. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  91. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  93. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  94. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +37 -0
  95. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -0
  96. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +72 -0
  97. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -0
  98. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +9 -0
  99. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -0
  100. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +8 -0
  101. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -0
  102. package/dist/types/src/components/KanbanBoard/context.d.ts +38 -0
  103. package/dist/types/src/components/KanbanBoard/context.d.ts.map +1 -0
  104. package/dist/types/src/components/KanbanBoard/index.d.ts +2 -0
  105. package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -0
  106. package/dist/types/src/components/index.d.ts +1 -2
  107. package/dist/types/src/components/index.d.ts.map +1 -1
  108. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts +6 -0
  109. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -0
  110. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts +79 -0
  111. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts.map +1 -0
  112. package/dist/types/src/containers/KanbanArticle/index.d.ts +2 -0
  113. package/dist/types/src/containers/KanbanArticle/index.d.ts.map +1 -0
  114. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts +13 -0
  115. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -0
  116. package/dist/types/src/containers/KanbanSettings/index.d.ts +2 -0
  117. package/dist/types/src/containers/KanbanSettings/index.d.ts.map +1 -0
  118. package/dist/types/src/containers/index.d.ts +4 -0
  119. package/dist/types/src/containers/index.d.ts.map +1 -0
  120. package/dist/types/src/hooks/index.d.ts +7 -0
  121. package/dist/types/src/hooks/index.d.ts.map +1 -0
  122. package/dist/types/src/hooks/useEchoChangeCallback.d.ts +13 -0
  123. package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -0
  124. package/dist/types/src/hooks/useItemsProjection.d.ts +10 -0
  125. package/dist/types/src/hooks/useItemsProjection.d.ts.map +1 -0
  126. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts +2 -0
  127. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts.map +1 -0
  128. package/dist/types/src/hooks/useKanbanBoardModel.d.ts +16 -0
  129. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -0
  130. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +22 -0
  131. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -0
  132. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +19 -0
  133. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -0
  134. package/dist/types/src/hooks/useProjectionModel.d.ts +15 -0
  135. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -0
  136. package/dist/types/src/index.d.ts +3 -1
  137. package/dist/types/src/index.d.ts.map +1 -1
  138. package/dist/types/src/meta.d.ts +2 -2
  139. package/dist/types/src/meta.d.ts.map +1 -1
  140. package/dist/types/src/operations/delete-card-field.d.ts +5 -0
  141. package/dist/types/src/operations/delete-card-field.d.ts.map +1 -0
  142. package/dist/types/src/operations/delete-card.d.ts +5 -0
  143. package/dist/types/src/operations/delete-card.d.ts.map +1 -0
  144. package/dist/types/src/operations/index.d.ts +3 -0
  145. package/dist/types/src/operations/index.d.ts.map +1 -0
  146. package/dist/types/src/operations/restore-card-field.d.ts +5 -0
  147. package/dist/types/src/operations/restore-card-field.d.ts.map +1 -0
  148. package/dist/types/src/operations/restore-card.d.ts +5 -0
  149. package/dist/types/src/operations/restore-card.d.ts.map +1 -0
  150. package/dist/types/src/playwright/board-manager.d.ts +5 -0
  151. package/dist/types/src/playwright/board-manager.d.ts.map +1 -0
  152. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  153. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  154. package/dist/types/src/playwright/smoke.spec.d.ts +2 -0
  155. package/dist/types/src/playwright/smoke.spec.d.ts.map +1 -0
  156. package/dist/types/src/plugin.d.ts +4 -0
  157. package/dist/types/src/plugin.d.ts.map +1 -0
  158. package/dist/types/src/testing/KanbanCardTileSimple.d.ts +7 -0
  159. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -0
  160. package/dist/types/src/testing/index.d.ts +2 -0
  161. package/dist/types/src/testing/index.d.ts.map +1 -0
  162. package/dist/types/src/translations.d.ts +50 -22
  163. package/dist/types/src/translations.d.ts.map +1 -1
  164. package/dist/types/src/types/Kanban.d.ts +108 -0
  165. package/dist/types/src/types/Kanban.d.ts.map +1 -0
  166. package/dist/types/src/types/KanbanOperation.d.ts +52 -0
  167. package/dist/types/src/types/KanbanOperation.d.ts.map +1 -0
  168. package/dist/types/src/types/constants.d.ts +6 -0
  169. package/dist/types/src/types/constants.d.ts.map +1 -0
  170. package/dist/types/src/types/index.d.ts +3 -0
  171. package/dist/types/src/types/index.d.ts.map +1 -1
  172. package/dist/types/src/types/migrations.test.d.ts +2 -0
  173. package/dist/types/src/types/migrations.test.d.ts.map +1 -0
  174. package/dist/types/src/types/schema.d.ts +17 -51
  175. package/dist/types/src/types/schema.d.ts.map +1 -1
  176. package/dist/types/src/types/types.d.ts +28 -0
  177. package/dist/types/src/types/types.d.ts.map +1 -1
  178. package/dist/types/src/util/arrangement.d.ts +72 -0
  179. package/dist/types/src/util/arrangement.d.ts.map +1 -0
  180. package/dist/types/src/util/arrangement.test.d.ts +2 -0
  181. package/dist/types/src/util/arrangement.test.d.ts.map +1 -0
  182. package/dist/types/src/util/index.d.ts +2 -0
  183. package/dist/types/src/util/index.d.ts.map +1 -0
  184. package/dist/types/tsconfig.tsbuildinfo +1 -1
  185. package/package.json +123 -57
  186. package/src/KanbanPlugin.node.ts +21 -0
  187. package/src/KanbanPlugin.test.ts +31 -0
  188. package/src/KanbanPlugin.tsx +28 -56
  189. package/src/KanbanPlugin.workerd.ts +18 -0
  190. package/src/blueprints/index.ts +5 -0
  191. package/src/blueprints/kanban-blueprint.ts +27 -0
  192. package/src/capabilities/artifact-definition.ts +116 -114
  193. package/src/capabilities/blueprint-definition.ts +13 -24
  194. package/src/capabilities/create-object.ts +40 -0
  195. package/src/capabilities/index.ts +12 -4
  196. package/src/capabilities/migrations.ts +35 -0
  197. package/src/capabilities/operation-handler.ts +14 -0
  198. package/src/capabilities/react-surface.tsx +77 -67
  199. package/src/capabilities/undo-mappings.ts +34 -0
  200. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +145 -0
  201. package/src/components/KanbanBoard/KanbanBoard.tsx +164 -0
  202. package/src/components/KanbanBoard/KanbanCard.tsx +101 -0
  203. package/src/components/KanbanBoard/KanbanColumn.tsx +72 -0
  204. package/src/components/KanbanBoard/context.ts +54 -0
  205. package/src/components/KanbanBoard/index.ts +5 -0
  206. package/src/components/index.ts +1 -2
  207. package/src/containers/KanbanArticle/KanbanArticle.stories.tsx +276 -0
  208. package/src/containers/KanbanArticle/KanbanArticle.tsx +178 -0
  209. package/src/containers/KanbanArticle/index.ts +5 -0
  210. package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
  211. package/src/containers/KanbanSettings/index.ts +5 -0
  212. package/src/containers/index.ts +8 -0
  213. package/src/hooks/index.ts +10 -0
  214. package/src/hooks/useEchoChangeCallback.ts +30 -0
  215. package/src/hooks/useItemsProjection.ts +44 -0
  216. package/src/hooks/useKanbanBoardModel.browser.test.ts +234 -0
  217. package/src/hooks/useKanbanBoardModel.ts +157 -0
  218. package/src/hooks/useKanbanColumnEventHandler.ts +106 -0
  219. package/src/hooks/useKanbanItemEventHandler.ts +133 -0
  220. package/src/hooks/useProjectionModel.ts +58 -0
  221. package/src/index.ts +3 -2
  222. package/src/meta.ts +3 -3
  223. package/src/operations/delete-card-field.ts +47 -0
  224. package/src/operations/delete-card.ts +23 -0
  225. package/src/operations/index.ts +10 -0
  226. package/src/operations/restore-card-field.ts +41 -0
  227. package/src/operations/restore-card.ts +21 -0
  228. package/src/playwright/board-manager.ts +13 -0
  229. package/src/playwright/playwright.config.ts +19 -0
  230. package/src/playwright/smoke.spec.ts +107 -0
  231. package/src/plugin.ts +11 -0
  232. package/src/testing/KanbanCardTileSimple.tsx +82 -0
  233. package/src/testing/index.ts +5 -0
  234. package/src/translations.ts +28 -20
  235. package/src/types/Kanban.ts +150 -0
  236. package/src/types/KanbanOperation.ts +67 -0
  237. package/src/types/constants.ts +9 -0
  238. package/src/types/index.ts +4 -0
  239. package/src/types/migrations.test.ts +82 -0
  240. package/src/types/schema.ts +32 -44
  241. package/src/types/types.ts +35 -0
  242. package/src/util/arrangement.test.ts +217 -0
  243. package/src/util/arrangement.ts +177 -0
  244. package/src/util/index.ts +5 -0
  245. package/dist/lib/browser/blueprint-definition-UYVX622Q.mjs +0 -28
  246. package/dist/lib/browser/blueprint-definition-UYVX622Q.mjs.map +0 -7
  247. package/dist/lib/browser/chunk-3UDST345.mjs +0 -85
  248. package/dist/lib/browser/chunk-3UDST345.mjs.map +0 -7
  249. package/dist/lib/browser/index.mjs +0 -105
  250. package/dist/lib/browser/index.mjs.map +0 -7
  251. package/dist/lib/browser/intent-resolver-VVBNS2TO.mjs +0 -111
  252. package/dist/lib/browser/intent-resolver-VVBNS2TO.mjs.map +0 -7
  253. package/dist/lib/browser/meta.json +0 -1
  254. package/dist/lib/browser/react-surface-FNXJ6VJX.mjs +0 -255
  255. package/dist/lib/browser/react-surface-FNXJ6VJX.mjs.map +0 -7
  256. package/dist/lib/browser/types/index.mjs +0 -11
  257. package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs +0 -30
  258. package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs.map +0 -7
  259. package/dist/lib/node-esm/chunk-JBOARUAT.mjs +0 -87
  260. package/dist/lib/node-esm/chunk-JBOARUAT.mjs.map +0 -7
  261. package/dist/lib/node-esm/index.mjs +0 -106
  262. package/dist/lib/node-esm/index.mjs.map +0 -7
  263. package/dist/lib/node-esm/intent-resolver-ACN7UALP.mjs +0 -112
  264. package/dist/lib/node-esm/intent-resolver-ACN7UALP.mjs.map +0 -7
  265. package/dist/lib/node-esm/meta.json +0 -1
  266. package/dist/lib/node-esm/react-surface-ZHYHCV5N.mjs +0 -256
  267. package/dist/lib/node-esm/react-surface-ZHYHCV5N.mjs.map +0 -7
  268. package/dist/lib/node-esm/types/index.mjs +0 -12
  269. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  270. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  271. package/dist/types/src/components/KanbanContainer.d.ts +0 -7
  272. package/dist/types/src/components/KanbanContainer.d.ts.map +0 -1
  273. package/dist/types/src/components/KanbanContainer.stories.d.ts +0 -41
  274. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +0 -1
  275. package/dist/types/src/components/KanbanViewEditor.d.ts +0 -8
  276. package/dist/types/src/components/KanbanViewEditor.d.ts.map +0 -1
  277. package/src/capabilities/intent-resolver.ts +0 -71
  278. package/src/components/KanbanContainer.stories.tsx +0 -193
  279. package/src/components/KanbanContainer.tsx +0 -95
  280. package/src/components/KanbanViewEditor.tsx +0 -64
  281. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  282. /package/dist/lib/{node-esm/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -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
+ }
@@ -0,0 +1,24 @@
1
+ import {
2
+ KanbanOperation_exports
3
+ } from "./chunk-OQ72EEGU.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/operations/delete-card.ts
7
+ import * as Effect from "effect/Effect";
8
+ import { Operation } from "@dxos/compute";
9
+ import { Obj } from "@dxos/echo";
10
+ import { invariant } from "@dxos/invariant";
11
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/operations/delete-card.ts";
12
+ var handler = KanbanOperation_exports.DeleteCard.pipe(Operation.withHandler(({ card }) => Effect.sync(() => {
13
+ const db = Obj.getDatabase(card);
14
+ invariant(db, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 9, S: void 0, A: ["db", ""] });
15
+ db.remove(card);
16
+ return {
17
+ card
18
+ };
19
+ })));
20
+ var delete_card_default = handler;
21
+ export {
22
+ delete_card_default as default
23
+ };
24
+ //# sourceMappingURL=delete-card-356CBACE.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,42 @@
1
+ import {
2
+ KanbanOperation_exports
3
+ } from "./chunk-OQ72EEGU.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 { JsonSchema, Obj } from "@dxos/echo";
11
+ import { invariant } from "@dxos/invariant";
12
+ import { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } 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 schema = yield* Effect.promise(() => db.schemaRegistry.query({
19
+ typename: getTypenameFromQuery(view.query.ast),
20
+ location: [
21
+ "database",
22
+ "runtime"
23
+ ]
24
+ }).first());
25
+ const projection = new ProjectionModel({
26
+ registry,
27
+ view,
28
+ baseSchema: JsonSchema.toJsonSchema(schema),
29
+ change: createEchoChangeCallback(view, schema)
30
+ });
31
+ const result = projection.deleteFieldProjection(fieldId);
32
+ return {
33
+ field: result.deleted.field,
34
+ props: result.deleted.props,
35
+ index: result.index
36
+ };
37
+ })));
38
+ var delete_card_field_default = handler;
39
+ export {
40
+ delete_card_field_default as default
41
+ };
42
+ //# sourceMappingURL=delete-card-field-IRCZL2BR.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 { JsonSchema, Obj } from '@dxos/echo';\nimport { type EchoSchema } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } 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 schema = yield* Effect.promise(() =>\n db.schemaRegistry\n .query({\n typename: getTypenameFromQuery(view.query.ast)!,\n location: ['database', 'runtime'],\n })\n .first(),\n );\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: JsonSchema.toJsonSchema(schema),\n change: createEchoChangeCallback(view, schema as EchoSchema),\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,YAAYC,WAAW;AAEhC,SAASC,iBAAiB;AAC1B,SAASC,iBAAiBC,0BAA0BC,4BAA4B;AAIhF,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,IAAS,YAAOC,IAAOC;YAGvBC,IAAAA,sBAAUC,EAAAA,YAA0BC,YAAS,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,MAAA,sBAAA,EAAA,CAAA;iBAC7CC,OAAU,eAAA,MAAA,GAAA,eAAA,MAAA;cAAC,qBAAA,KAAA,MAAA,GAAA;cAAY;MAAU;MAE7B;IAGJC;EACJC,CAAAA,EAAAA,MAAAA,CAAAA;QACAV,aAAAA,IAAAA,gBAAAA;IACAW;IACAC;IACF,YAAA,WAAA,aAAA,MAAA;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", "JsonSchema", "Obj", "invariant", "ProjectionModel", "createEchoChangeCallback", "getTypenameFromQuery", "KanbanOperation", "Obj", "view", "invariant", "schema", "Effect", "promise", "typename", "getTypenameFromQuery", "query", "location", "projection", "registry", "baseSchema", "change", "result", "deleteFieldProjection", "fieldId", "field", "props", "index"]
7
+ }
@@ -0,0 +1,432 @@
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
+ import { AtomObj } from "@dxos/echo-atom";
63
+
64
+ // src/util/arrangement.ts
65
+ import { UNCATEGORIZED_VALUE } from "#types";
66
+ var getOrderFromArrangement = (arrangement) => {
67
+ const order = arrangement?.order;
68
+ if (order != null && Array.isArray(order) && order.length > 0) {
69
+ return [
70
+ ...order
71
+ ];
72
+ }
73
+ return [];
74
+ };
75
+ var getOrderByColumnFromArrangement = (arrangement) => {
76
+ const columns = arrangement?.columns;
77
+ if (columns != null && Object.keys(columns).length > 0) {
78
+ return Object.fromEntries(Object.entries(columns).map(([key, entry]) => {
79
+ const rawIds = entry.ids;
80
+ const ids = Array.isArray(rawIds) ? [
81
+ ...rawIds
82
+ ] : [];
83
+ return [
84
+ key,
85
+ {
86
+ ids,
87
+ ...entry.hidden !== void 0 && {
88
+ hidden: entry.hidden
89
+ }
90
+ }
91
+ ];
92
+ }));
93
+ }
94
+ return {};
95
+ };
96
+ var computeColumnStructure = (effectiveOrder, effectiveByColumn, selectOptions) => {
97
+ const order = [
98
+ ...effectiveOrder
99
+ ];
100
+ if (!order.includes(UNCATEGORIZED_VALUE)) {
101
+ order.unshift(UNCATEGORIZED_VALUE);
102
+ }
103
+ for (const opt of selectOptions) {
104
+ if (opt.id !== UNCATEGORIZED_VALUE && !order.includes(opt.id)) {
105
+ order.push(opt.id);
106
+ }
107
+ }
108
+ return order.filter((columnValue) => effectiveByColumn[columnValue]?.hidden !== true).map((columnValue) => ({
109
+ columnValue,
110
+ ids: effectiveByColumn[columnValue]?.ids ?? []
111
+ }));
112
+ };
113
+ var orderItemsInColumn = (items, ids, columnValue, pivotPath, validColumnValues) => {
114
+ const orderMap = new Map(ids.map((id, index) => [
115
+ id,
116
+ index
117
+ ]));
118
+ const cardsWithExistingOrder = [];
119
+ const newCards = [];
120
+ for (const item of items) {
121
+ const itemColumn = pivotPath !== void 0 ? item[pivotPath] : void 0;
122
+ const isValidColumn = itemColumn != null && validColumnValues.has(itemColumn);
123
+ const belongsInColumn = columnValue === UNCATEGORIZED_VALUE ? !isValidColumn : itemColumn === columnValue;
124
+ if (belongsInColumn) {
125
+ (orderMap.has(item.id) ? cardsWithExistingOrder : newCards).push(item);
126
+ }
127
+ }
128
+ cardsWithExistingOrder.sort((a, b) => {
129
+ const indexA = orderMap.get(a.id) ?? Infinity;
130
+ const indexB = orderMap.get(b.id) ?? Infinity;
131
+ return indexA - indexB;
132
+ });
133
+ return [
134
+ ...cardsWithExistingOrder,
135
+ ...newCards
136
+ ];
137
+ };
138
+
139
+ // src/hooks/useKanbanBoardModel.ts
140
+ function useKanbanBoardModel(kanban, projection, itemsAtom, registry) {
141
+ const arrangementAtom = useMemo3(() => AtomObj.makeProperty(kanban, "arrangement"), [
142
+ kanban
143
+ ]);
144
+ const viewSnapshotAtom = useMemo3(() => kanban?.spec?.kind === "view" && kanban.spec.view ? AtomObj.make(kanban.spec.view) : Atom2.make(() => void 0), [
145
+ kanban?.spec
146
+ ]);
147
+ const pivotFieldIdAtom = useMemo3(() => Atom2.make((get) => {
148
+ if (kanban?.spec.kind === "items") {
149
+ return kanban.spec.pivotField;
150
+ }
151
+ return get(viewSnapshotAtom)?.projection?.pivotFieldId;
152
+ }), [
153
+ kanban?.spec,
154
+ viewSnapshotAtom
155
+ ]);
156
+ const effectiveByColumnAtom = useMemo3(() => Atom2.make((get) => getOrderByColumnFromArrangement(get(arrangementAtom))), [
157
+ arrangementAtom
158
+ ]);
159
+ const columnsAtom = useMemo3(() => Atom2.make((get) => {
160
+ const pivotFieldId = get(pivotFieldIdAtom);
161
+ if (pivotFieldId === void 0) {
162
+ return [];
163
+ }
164
+ get(projection.fields);
165
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
166
+ if (!fieldProj) {
167
+ return [];
168
+ }
169
+ const selectOptions = fieldProj.props.options ?? [];
170
+ if (selectOptions.length === 0) {
171
+ return [];
172
+ }
173
+ const arrangement = get(arrangementAtom);
174
+ const order = getOrderFromArrangement(arrangement);
175
+ const byColumn = getOrderByColumnFromArrangement(arrangement);
176
+ return computeColumnStructure(order, byColumn, selectOptions);
177
+ }), [
178
+ pivotFieldIdAtom,
179
+ arrangementAtom,
180
+ projection
181
+ ]);
182
+ const columnArrangementAtomFamily = useMemo3(() => Atom2.family((columnValue) => Atom2.make((get) => {
183
+ const byColumn = get(effectiveByColumnAtom);
184
+ return {
185
+ columnValue,
186
+ ids: [
187
+ ...byColumn[columnValue]?.ids ?? []
188
+ ]
189
+ };
190
+ })), [
191
+ effectiveByColumnAtom
192
+ ]);
193
+ const itemsAtomFamily = useMemo3(() => Atom2.family((columnValue) => Atom2.make((get) => {
194
+ const columnArr = get(columnArrangementAtomFamily(columnValue));
195
+ const allItems = get(itemsAtom);
196
+ const pivotFieldId = get(pivotFieldIdAtom);
197
+ if (pivotFieldId === void 0) {
198
+ return [];
199
+ }
200
+ get(projection.fields);
201
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
202
+ if (!fieldProj) {
203
+ return [];
204
+ }
205
+ const selectOptions = fieldProj.props.options ?? [];
206
+ const pivotPath = fieldProj.props.property;
207
+ const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
208
+ return orderItemsInColumn(allItems, columnArr.ids, columnValue, pivotPath, validColumnValues);
209
+ })), [
210
+ columnArrangementAtomFamily,
211
+ itemsAtom,
212
+ pivotFieldIdAtom,
213
+ projection
214
+ ]);
215
+ return useMemo3(() => ({
216
+ getColumnId: (data) => data.columnValue,
217
+ getItemId: (data) => data.id,
218
+ isColumn: (obj) => typeof obj === "object" && obj !== null && "columnValue" in obj && "ids" in obj,
219
+ // TODO(wittjosiah): This should be restricted to objects of the type of the kanban view.
220
+ isItem: (obj) => Obj2.isObject(obj),
221
+ columns: columnsAtom,
222
+ items: (column) => itemsAtomFamily(column.columnValue),
223
+ getColumns: () => registry.get(columnsAtom) ?? [],
224
+ getItems: (column) => registry.get(itemsAtomFamily(column.columnValue)) ?? []
225
+ }), [
226
+ columnsAtom,
227
+ itemsAtomFamily,
228
+ registry
229
+ ]);
230
+ }
231
+
232
+ // src/hooks/useKanbanColumnEventHandler.ts
233
+ import { useMemo as useMemo4 } from "react";
234
+ import { arrayMove } from "@dxos/util";
235
+ import { UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE2 } from "#types";
236
+ function useKanbanColumnEventHandler({ id, model, projection, pivotFieldId, change }) {
237
+ return useMemo4(() => ({
238
+ id,
239
+ canDrop: ({ source }) => {
240
+ if (!projection) {
241
+ return false;
242
+ }
243
+ const data = source.data;
244
+ const columnValue = model.getColumnId(data);
245
+ return model.isColumn(source.data) && columnValue !== UNCATEGORIZED_VALUE2 && source.id !== UNCATEGORIZED_VALUE2;
246
+ },
247
+ onDrop: ({ source, target }) => {
248
+ if (!projection || pivotFieldId === void 0) {
249
+ return;
250
+ }
251
+ const sourceColumnData = source.data;
252
+ const sourceColumnId = model.getColumnId(sourceColumnData);
253
+ if (sourceColumnId === UNCATEGORIZED_VALUE2) {
254
+ return;
255
+ }
256
+ const currentColumns = model.getColumns();
257
+ const sourceIndex = currentColumns.findIndex((c) => model.getColumnId(c) === sourceColumnId);
258
+ if (sourceIndex === -1) {
259
+ return;
260
+ }
261
+ let targetIndex;
262
+ if (target?.type === "tile" || target?.type === "placeholder") {
263
+ targetIndex = typeof target.location === "number" ? Math.floor(target.location) : -1;
264
+ } else if (target?.type === "container") {
265
+ targetIndex = currentColumns.length;
266
+ } else {
267
+ return;
268
+ }
269
+ if (targetIndex < 0) {
270
+ return;
271
+ }
272
+ const currentColumnIds = currentColumns.map((c) => model.getColumnId(c));
273
+ const reorderedColumnIds = arrayMove([
274
+ ...currentColumnIds
275
+ ], sourceIndex, targetIndex);
276
+ const fieldProjection = projection.getFieldProjection(pivotFieldId);
277
+ const currentOptions = [
278
+ ...fieldProjection.props.options ?? []
279
+ ];
280
+ const optionsInNewOrder = reorderedColumnIds.map((columnId) => currentOptions.find((o) => o.id === columnId)).filter((o) => o != null);
281
+ projection.setFieldProjection({
282
+ ...fieldProjection,
283
+ props: {
284
+ ...fieldProjection.props,
285
+ options: optionsInNewOrder
286
+ }
287
+ });
288
+ change.kanban((kanban) => {
289
+ kanban.arrangement.order = reorderedColumnIds.filter((columnId) => columnId !== UNCATEGORIZED_VALUE2);
290
+ });
291
+ }
292
+ }), [
293
+ id,
294
+ model,
295
+ projection,
296
+ pivotFieldId,
297
+ change
298
+ ]);
299
+ }
300
+
301
+ // src/hooks/useKanbanItemEventHandler.ts
302
+ import { useMemo as useMemo5 } from "react";
303
+ import { UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE3 } from "#types";
304
+ function findColumn(id, arrangement) {
305
+ return arrangement.find(({ columnValue, cards }) => columnValue === id || cards.some((card) => card.id === id));
306
+ }
307
+ function useKanbanItemEventHandler({ column, columnFieldPath, model, change }) {
308
+ return useMemo5(() => ({
309
+ id: column.columnValue,
310
+ canDrop: ({ source }) => model.isItem(source.data),
311
+ onTake: ({ source }, cb) => {
312
+ void cb(source.data);
313
+ },
314
+ onDrop: ({ source, target }) => {
315
+ const columns = model.getColumns();
316
+ const currentArrangement = columns.map((col) => ({
317
+ columnValue: col.columnValue,
318
+ cards: model.getItems(col) ?? []
319
+ }));
320
+ const sourceColumnInSnapshot = findColumn(source.id, currentArrangement);
321
+ if (!sourceColumnInSnapshot) {
322
+ return;
323
+ }
324
+ const workingArrangement = currentArrangement.map((col) => ({
325
+ columnValue: col.columnValue,
326
+ cards: [
327
+ ...col.cards
328
+ ]
329
+ }));
330
+ const sourceColumnInWorking = workingArrangement.find((c) => c.columnValue === sourceColumnInSnapshot.columnValue || c.cards.some((card) => card.id === source.id));
331
+ const targetColumnInWorking = workingArrangement.find((c) => c.columnValue === column.columnValue);
332
+ if (!sourceColumnInWorking || !targetColumnInWorking) {
333
+ return;
334
+ }
335
+ const sourceIndex = sourceColumnInWorking.cards.findIndex((card) => card.id === source.id);
336
+ if (sourceIndex === -1) {
337
+ return;
338
+ }
339
+ const [movedCard] = sourceColumnInWorking.cards.splice(sourceIndex, 1);
340
+ if (columnFieldPath !== void 0) {
341
+ const newValue = targetColumnInWorking.columnValue === UNCATEGORIZED_VALUE3 ? void 0 : targetColumnInWorking.columnValue;
342
+ change.setItemField(movedCard, columnFieldPath, newValue);
343
+ }
344
+ const existingTargetIndex = target?.type === "tile" ? targetColumnInWorking.cards.findIndex((card) => model.getItemId(card) === target.id) : -1;
345
+ const closestEdge = target?.type === "placeholder" && typeof target.location === "number" ? target.location <= targetColumnInWorking.cards.length / 2 ? "top" : "bottom" : "bottom";
346
+ let insertIndex;
347
+ if (target?.type === "placeholder" && typeof target.location === "number") {
348
+ insertIndex = Math.max(0, Math.min(targetColumnInWorking.cards.length, Math.floor(target.location)));
349
+ } else if (target?.type === "container" || existingTargetIndex === -1) {
350
+ insertIndex = targetColumnInWorking.cards.length;
351
+ } else if (sourceColumnInWorking.columnValue === targetColumnInWorking.columnValue) {
352
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
353
+ if (sourceIndex < existingTargetIndex) {
354
+ insertIndex -= 1;
355
+ }
356
+ } else {
357
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
358
+ }
359
+ targetColumnInWorking.cards.splice(insertIndex, 0, movedCard);
360
+ change.kanban((kanban) => {
361
+ kanban.arrangement = {
362
+ order: workingArrangement.map(({ columnValue }) => columnValue),
363
+ columns: Object.fromEntries(workingArrangement.map(({ columnValue, cards }) => [
364
+ columnValue,
365
+ {
366
+ ids: cards.map((c) => c.id)
367
+ }
368
+ ]))
369
+ };
370
+ });
371
+ }
372
+ }), [
373
+ column,
374
+ columnFieldPath,
375
+ model,
376
+ change
377
+ ]);
378
+ }
379
+
380
+ // src/hooks/useProjectionModel.ts
381
+ import { useState } from "react";
382
+ import { JsonSchema, Type } from "@dxos/echo";
383
+ import { log } from "@dxos/log";
384
+ import { useAsyncEffect } from "@dxos/react-ui";
385
+ import { ProjectionModel, createEchoChangeCallback as createEchoChangeCallback2 } from "@dxos/schema";
386
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/hooks/useProjectionModel.ts";
387
+ var useProjectionModel = (schema, kanban, registry) => {
388
+ const [projection, setProjection] = useState();
389
+ useAsyncEffect(async (controller) => {
390
+ if (!schema || !kanban || kanban.spec.kind !== "view") {
391
+ return;
392
+ }
393
+ try {
394
+ const view = await kanban.spec.view.load();
395
+ if (controller.signal.aborted) {
396
+ return;
397
+ }
398
+ const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);
399
+ const change = createEchoChangeCallback2(view, Type.isMutable(schema) ? schema : void 0);
400
+ const projection2 = new ProjectionModel({
401
+ registry,
402
+ view,
403
+ baseSchema: jsonSchema,
404
+ change
405
+ });
406
+ projection2.normalizeView();
407
+ if (!controller.signal.aborted) {
408
+ setProjection(projection2);
409
+ }
410
+ } catch (err) {
411
+ log.catch(err, {
412
+ schema,
413
+ kanban
414
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 41, S: void 0 });
415
+ }
416
+ }, [
417
+ schema,
418
+ kanban,
419
+ registry
420
+ ]);
421
+ return projection;
422
+ };
423
+ export {
424
+ createEchoChangeCallback,
425
+ useEchoChangeCallback,
426
+ useItemsProjection,
427
+ useKanbanBoardModel,
428
+ useKanbanColumnEventHandler,
429
+ useKanbanItemEventHandler,
430
+ useProjectionModel
431
+ };
432
+ //# sourceMappingURL=index.mjs.map