@dxos/plugin-kanban 0.8.4-main.dedc0f3 → 0.8.4-main.dfabb4ec29

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 (275) hide show
  1. package/dist/lib/neutral/KanbanContainer-QK6LNCYT.mjs +132 -0
  2. package/dist/lib/neutral/KanbanContainer-QK6LNCYT.mjs.map +7 -0
  3. package/dist/lib/neutral/KanbanPlugin.mjs +36 -0
  4. package/dist/lib/neutral/KanbanPlugin.mjs.map +7 -0
  5. package/dist/lib/neutral/KanbanPlugin.node.mjs +27 -0
  6. package/dist/lib/neutral/KanbanPlugin.node.mjs.map +7 -0
  7. package/dist/lib/neutral/KanbanSettings-G6M47NSK.mjs +83 -0
  8. package/dist/lib/neutral/KanbanSettings-G6M47NSK.mjs.map +7 -0
  9. package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs +15 -0
  10. package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs.map +7 -0
  11. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  12. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  13. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  14. package/dist/lib/neutral/chunk-E65AME5F.mjs +255 -0
  15. package/dist/lib/neutral/chunk-E65AME5F.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  17. package/dist/lib/neutral/chunk-KDPM77BD.mjs +21 -0
  18. package/dist/lib/neutral/chunk-KDPM77BD.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-Z7O5CETK.mjs +8 -0
  20. package/dist/lib/neutral/chunk-Z7O5CETK.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs +26 -0
  22. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs.map +7 -0
  23. package/dist/lib/neutral/components/index.mjs +243 -0
  24. package/dist/lib/neutral/components/index.mjs.map +7 -0
  25. package/dist/lib/neutral/containers/index.mjs +11 -0
  26. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  27. package/dist/lib/neutral/create-object-DKBSI46K.mjs +40 -0
  28. package/dist/lib/neutral/create-object-DKBSI46K.mjs.map +7 -0
  29. package/dist/lib/neutral/delete-card-QKT6OXGP.mjs +24 -0
  30. package/dist/lib/neutral/delete-card-QKT6OXGP.mjs.map +7 -0
  31. package/dist/lib/neutral/delete-card-field-XQKM7ZXE.mjs +42 -0
  32. package/dist/lib/neutral/delete-card-field-XQKM7ZXE.mjs.map +7 -0
  33. package/dist/lib/neutral/hooks/index.mjs +432 -0
  34. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  35. package/dist/lib/neutral/index.mjs +34 -0
  36. package/dist/lib/neutral/index.mjs.map +7 -0
  37. package/dist/lib/neutral/meta.json +1 -0
  38. package/dist/lib/neutral/meta.mjs +8 -0
  39. package/dist/lib/neutral/meta.mjs.map +7 -0
  40. package/dist/lib/neutral/migrations-4NS6H7U2.mjs +31 -0
  41. package/dist/lib/neutral/migrations-4NS6H7U2.mjs.map +7 -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/operations/index.mjs.map +7 -0
  46. package/dist/lib/neutral/plugin.mjs +16 -0
  47. package/dist/lib/neutral/plugin.mjs.map +7 -0
  48. package/dist/lib/neutral/react-surface-6RVSCHMJ.mjs +93 -0
  49. package/dist/lib/neutral/react-surface-6RVSCHMJ.mjs.map +7 -0
  50. package/dist/lib/neutral/restore-card-XW7AHMPO.mjs +21 -0
  51. package/dist/lib/neutral/restore-card-XW7AHMPO.mjs.map +7 -0
  52. package/dist/lib/neutral/restore-card-field-QOAUY3RJ.mjs +40 -0
  53. package/dist/lib/neutral/restore-card-field-QOAUY3RJ.mjs.map +7 -0
  54. package/dist/lib/neutral/testing/index.mjs +60 -0
  55. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  56. package/dist/lib/neutral/translations.mjs +44 -0
  57. package/dist/lib/neutral/translations.mjs.map +7 -0
  58. package/dist/lib/neutral/types/index.mjs +22 -0
  59. package/dist/lib/neutral/types/index.mjs.map +7 -0
  60. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs +42 -0
  61. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs.map +7 -0
  62. package/dist/types/src/KanbanPlugin.d.ts +3 -1
  63. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  64. package/dist/types/src/KanbanPlugin.node.d.ts +4 -0
  65. package/dist/types/src/KanbanPlugin.node.d.ts.map +1 -0
  66. package/dist/types/src/KanbanPlugin.test.d.ts +2 -0
  67. package/dist/types/src/KanbanPlugin.test.d.ts.map +1 -0
  68. package/dist/types/src/blueprints/index.d.ts +2 -0
  69. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  70. package/dist/types/src/blueprints/kanban-blueprint.d.ts +4 -0
  71. package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -2
  73. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -4
  75. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  77. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  78. package/dist/types/src/capabilities/index.d.ts +13 -3
  79. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/migrations.d.ts +5 -0
  81. package/dist/types/src/capabilities/migrations.d.ts.map +1 -0
  82. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  83. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  85. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  87. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  88. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +37 -0
  89. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -0
  90. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +72 -0
  91. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +9 -0
  93. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -0
  94. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +8 -0
  95. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -0
  96. package/dist/types/src/components/KanbanBoard/context.d.ts +38 -0
  97. package/dist/types/src/components/KanbanBoard/context.d.ts.map +1 -0
  98. package/dist/types/src/components/KanbanBoard/index.d.ts +2 -0
  99. package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -0
  100. package/dist/types/src/components/index.d.ts +1 -2
  101. package/dist/types/src/components/index.d.ts.map +1 -1
  102. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +6 -0
  103. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +1 -0
  104. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts +79 -0
  105. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +1 -0
  106. package/dist/types/src/containers/KanbanContainer/index.d.ts +2 -0
  107. package/dist/types/src/containers/KanbanContainer/index.d.ts.map +1 -0
  108. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts +13 -0
  109. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -0
  110. package/dist/types/src/containers/KanbanSettings/index.d.ts +2 -0
  111. package/dist/types/src/containers/KanbanSettings/index.d.ts.map +1 -0
  112. package/dist/types/src/containers/index.d.ts +4 -0
  113. package/dist/types/src/containers/index.d.ts.map +1 -0
  114. package/dist/types/src/hooks/index.d.ts +7 -0
  115. package/dist/types/src/hooks/index.d.ts.map +1 -0
  116. package/dist/types/src/hooks/useEchoChangeCallback.d.ts +13 -0
  117. package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -0
  118. package/dist/types/src/hooks/useItemsProjection.d.ts +10 -0
  119. package/dist/types/src/hooks/useItemsProjection.d.ts.map +1 -0
  120. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts +2 -0
  121. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts.map +1 -0
  122. package/dist/types/src/hooks/useKanbanBoardModel.d.ts +16 -0
  123. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -0
  124. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +22 -0
  125. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -0
  126. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +19 -0
  127. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -0
  128. package/dist/types/src/hooks/useProjectionModel.d.ts +15 -0
  129. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -0
  130. package/dist/types/src/index.d.ts +3 -1
  131. package/dist/types/src/index.d.ts.map +1 -1
  132. package/dist/types/src/meta.d.ts +2 -3
  133. package/dist/types/src/meta.d.ts.map +1 -1
  134. package/dist/types/src/operations/delete-card-field.d.ts +5 -0
  135. package/dist/types/src/operations/delete-card-field.d.ts.map +1 -0
  136. package/dist/types/src/operations/delete-card.d.ts +5 -0
  137. package/dist/types/src/operations/delete-card.d.ts.map +1 -0
  138. package/dist/types/src/operations/index.d.ts +3 -0
  139. package/dist/types/src/operations/index.d.ts.map +1 -0
  140. package/dist/types/src/operations/restore-card-field.d.ts +5 -0
  141. package/dist/types/src/operations/restore-card-field.d.ts.map +1 -0
  142. package/dist/types/src/operations/restore-card.d.ts +5 -0
  143. package/dist/types/src/operations/restore-card.d.ts.map +1 -0
  144. package/dist/types/src/playwright/board-manager.d.ts +5 -0
  145. package/dist/types/src/playwright/board-manager.d.ts.map +1 -0
  146. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  147. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  148. package/dist/types/src/playwright/smoke.spec.d.ts +2 -0
  149. package/dist/types/src/playwright/smoke.spec.d.ts.map +1 -0
  150. package/dist/types/src/plugin.d.ts +4 -0
  151. package/dist/types/src/plugin.d.ts.map +1 -0
  152. package/dist/types/src/testing/KanbanCardTileSimple.d.ts +7 -0
  153. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -0
  154. package/dist/types/src/testing/index.d.ts +2 -0
  155. package/dist/types/src/testing/index.d.ts.map +1 -0
  156. package/dist/types/src/translations.d.ts +50 -22
  157. package/dist/types/src/translations.d.ts.map +1 -1
  158. package/dist/types/src/types/Kanban.d.ts +109 -0
  159. package/dist/types/src/types/Kanban.d.ts.map +1 -0
  160. package/dist/types/src/types/KanbanOperation.d.ts +52 -0
  161. package/dist/types/src/types/KanbanOperation.d.ts.map +1 -0
  162. package/dist/types/src/types/constants.d.ts +6 -0
  163. package/dist/types/src/types/constants.d.ts.map +1 -0
  164. package/dist/types/src/types/index.d.ts +3 -0
  165. package/dist/types/src/types/index.d.ts.map +1 -1
  166. package/dist/types/src/types/migrations.test.d.ts +2 -0
  167. package/dist/types/src/types/migrations.test.d.ts.map +1 -0
  168. package/dist/types/src/types/schema.d.ts +18 -52
  169. package/dist/types/src/types/schema.d.ts.map +1 -1
  170. package/dist/types/src/types/types.d.ts +28 -0
  171. package/dist/types/src/types/types.d.ts.map +1 -1
  172. package/dist/types/src/util/arrangement.d.ts +72 -0
  173. package/dist/types/src/util/arrangement.d.ts.map +1 -0
  174. package/dist/types/src/util/arrangement.test.d.ts +2 -0
  175. package/dist/types/src/util/arrangement.test.d.ts.map +1 -0
  176. package/dist/types/src/util/index.d.ts +2 -0
  177. package/dist/types/src/util/index.d.ts.map +1 -0
  178. package/dist/types/tsconfig.tsbuildinfo +1 -1
  179. package/package.json +120 -57
  180. package/src/KanbanPlugin.node.ts +21 -0
  181. package/src/KanbanPlugin.test.ts +31 -0
  182. package/src/KanbanPlugin.tsx +29 -57
  183. package/src/blueprints/index.ts +5 -0
  184. package/src/blueprints/kanban-blueprint.ts +27 -0
  185. package/src/capabilities/artifact-definition.ts +117 -113
  186. package/src/capabilities/blueprint-definition.ts +13 -24
  187. package/src/capabilities/create-object.ts +40 -0
  188. package/src/capabilities/index.ts +12 -4
  189. package/src/capabilities/migrations.ts +35 -0
  190. package/src/capabilities/operation-handler.ts +14 -0
  191. package/src/capabilities/react-surface.tsx +79 -68
  192. package/src/capabilities/undo-mappings.ts +34 -0
  193. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +146 -0
  194. package/src/components/KanbanBoard/KanbanBoard.tsx +164 -0
  195. package/src/components/KanbanBoard/KanbanCard.tsx +101 -0
  196. package/src/components/KanbanBoard/KanbanColumn.tsx +72 -0
  197. package/src/components/KanbanBoard/context.ts +54 -0
  198. package/src/components/KanbanBoard/index.ts +5 -0
  199. package/src/components/index.ts +1 -2
  200. package/src/containers/KanbanContainer/KanbanContainer.stories.tsx +277 -0
  201. package/src/containers/KanbanContainer/KanbanContainer.tsx +178 -0
  202. package/src/containers/KanbanContainer/index.ts +5 -0
  203. package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
  204. package/src/containers/KanbanSettings/index.ts +5 -0
  205. package/src/containers/index.ts +8 -0
  206. package/src/hooks/index.ts +10 -0
  207. package/src/hooks/useEchoChangeCallback.ts +30 -0
  208. package/src/hooks/useItemsProjection.ts +44 -0
  209. package/src/hooks/useKanbanBoardModel.browser.test.ts +235 -0
  210. package/src/hooks/useKanbanBoardModel.ts +157 -0
  211. package/src/hooks/useKanbanColumnEventHandler.ts +106 -0
  212. package/src/hooks/useKanbanItemEventHandler.ts +133 -0
  213. package/src/hooks/useProjectionModel.ts +58 -0
  214. package/src/index.ts +3 -2
  215. package/src/meta.ts +9 -7
  216. package/src/operations/delete-card-field.ts +47 -0
  217. package/src/operations/delete-card.ts +23 -0
  218. package/src/operations/index.ts +10 -0
  219. package/src/operations/restore-card-field.ts +41 -0
  220. package/src/operations/restore-card.ts +21 -0
  221. package/src/playwright/board-manager.ts +13 -0
  222. package/src/playwright/playwright.config.ts +19 -0
  223. package/src/playwright/smoke.spec.ts +107 -0
  224. package/src/plugin.ts +11 -0
  225. package/src/testing/KanbanCardTileSimple.tsx +82 -0
  226. package/src/testing/index.ts +5 -0
  227. package/src/translations.ts +28 -20
  228. package/src/types/Kanban.ts +151 -0
  229. package/src/types/KanbanOperation.ts +67 -0
  230. package/src/types/constants.ts +9 -0
  231. package/src/types/index.ts +4 -0
  232. package/src/types/migrations.test.ts +83 -0
  233. package/src/types/schema.ts +33 -45
  234. package/src/types/types.ts +35 -0
  235. package/src/util/arrangement.test.ts +218 -0
  236. package/src/util/arrangement.ts +177 -0
  237. package/src/util/index.ts +5 -0
  238. package/dist/lib/browser/blueprint-definition-GFG7LX2C.mjs +0 -28
  239. package/dist/lib/browser/blueprint-definition-GFG7LX2C.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-NCNNL74W.mjs +0 -82
  241. package/dist/lib/browser/chunk-NCNNL74W.mjs.map +0 -7
  242. package/dist/lib/browser/index.mjs +0 -106
  243. package/dist/lib/browser/index.mjs.map +0 -7
  244. package/dist/lib/browser/intent-resolver-KHOAFPNN.mjs +0 -111
  245. package/dist/lib/browser/intent-resolver-KHOAFPNN.mjs.map +0 -7
  246. package/dist/lib/browser/meta.json +0 -1
  247. package/dist/lib/browser/react-surface-UBRYXDKS.mjs +0 -253
  248. package/dist/lib/browser/react-surface-UBRYXDKS.mjs.map +0 -7
  249. package/dist/lib/browser/types/index.mjs +0 -11
  250. package/dist/lib/node-esm/blueprint-definition-MIMDXMUM.mjs +0 -30
  251. package/dist/lib/node-esm/blueprint-definition-MIMDXMUM.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-5B3LKGA7.mjs +0 -84
  253. package/dist/lib/node-esm/chunk-5B3LKGA7.mjs.map +0 -7
  254. package/dist/lib/node-esm/index.mjs +0 -107
  255. package/dist/lib/node-esm/index.mjs.map +0 -7
  256. package/dist/lib/node-esm/intent-resolver-MKO5HVES.mjs +0 -112
  257. package/dist/lib/node-esm/intent-resolver-MKO5HVES.mjs.map +0 -7
  258. package/dist/lib/node-esm/meta.json +0 -1
  259. package/dist/lib/node-esm/react-surface-B2FPS52G.mjs +0 -254
  260. package/dist/lib/node-esm/react-surface-B2FPS52G.mjs.map +0 -7
  261. package/dist/lib/node-esm/types/index.mjs +0 -12
  262. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  263. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  264. package/dist/types/src/components/KanbanContainer.d.ts +0 -7
  265. package/dist/types/src/components/KanbanContainer.d.ts.map +0 -1
  266. package/dist/types/src/components/KanbanContainer.stories.d.ts +0 -41
  267. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +0 -1
  268. package/dist/types/src/components/KanbanViewEditor.d.ts +0 -8
  269. package/dist/types/src/components/KanbanViewEditor.d.ts.map +0 -1
  270. package/src/capabilities/intent-resolver.ts +0 -71
  271. package/src/components/KanbanContainer.stories.tsx +0 -190
  272. package/src/components/KanbanContainer.tsx +0 -95
  273. package/src/components/KanbanViewEditor.tsx +0 -62
  274. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  275. /package/dist/lib/{node-esm/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -2,12 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
 
7
- import { SpaceSchema } from '@dxos/react-client/echo';
8
- import { DataType, FieldSchema, TypenameAnnotationId } from '@dxos/schema';
9
-
10
- import { KANBAN_PLUGIN } from '../meta';
7
+ import { TypeInputOptionsAnnotation } from '@dxos/plugin-space';
11
8
 
12
9
  /**
13
10
  * Kanban data model.
@@ -21,13 +18,40 @@ import { KANBAN_PLUGIN } from '../meta';
21
18
  // TODO(wittjosiah): Factor out?
22
19
  export const PivotColumnAnnotationId = Symbol.for('@dxos/plugin-kanban/annotation/PivotColumn');
23
20
 
21
+ /**
22
+ * Settings common to every Kanban (view or items). Rendered as form fields
23
+ * by `KanbanSettings`.
24
+ */
25
+ export const KanbanSettingsSchema = Schema.Struct({
26
+ hideUncategorized: Schema.Boolean.annotations({
27
+ title: 'Hide uncategorized column',
28
+ description: 'When enabled, items without a pivot value won’t be shown as a column.',
29
+ }).pipe(Schema.optional),
30
+ });
31
+
32
+ /**
33
+ * Settings for view-variant Kanbans only. Spreads {@link KanbanSettingsSchema}'s
34
+ * fields and adds a column-field picker that binds the View’s pivot field.
35
+ * Items-variant kanbans use a hardcoded `spec.pivotField` and don’t expose
36
+ * this control.
37
+ */
38
+ export const KanbanViewSettingsSchema = Schema.Struct({
39
+ columnFieldId: Schema.String.annotations({
40
+ title: 'Column field',
41
+ }),
42
+ ...KanbanSettingsSchema.fields,
43
+ });
44
+
24
45
  export const CreateKanbanSchema = Schema.Struct({
25
46
  name: Schema.optional(Schema.String),
26
- typename: Schema.optional(
27
- Schema.String.annotations({
28
- [TypenameAnnotationId]: ['used-static', 'dynamic'],
29
- title: 'Select card record type (leave empty to start fresh)',
47
+ // TODO(wittjosiah): This should be a query input instead.
48
+ typename: Schema.String.pipe(
49
+ Schema.annotations({ title: 'Select card type' }),
50
+ TypeInputOptionsAnnotation.set({
51
+ location: ['database', 'runtime'],
52
+ kind: ['user'],
30
53
  }),
54
+ Schema.optional,
31
55
  ),
32
56
  initialPivotColumn: Schema.optional(
33
57
  Schema.String.annotations({
@@ -36,39 +60,3 @@ export const CreateKanbanSchema = Schema.Struct({
36
60
  }),
37
61
  ),
38
62
  });
39
-
40
- export namespace KanbanAction {
41
- const KANBAN_ACTION = `${KANBAN_PLUGIN}/action`;
42
-
43
- export class Create extends Schema.TaggedClass<Create>()(`${KANBAN_ACTION}/create`, {
44
- input: Schema.extend(Schema.Struct({ space: SpaceSchema }), CreateKanbanSchema),
45
- output: Schema.Struct({
46
- object: DataType.View,
47
- }),
48
- }) {}
49
-
50
- export class DeleteCardField extends Schema.TaggedClass<DeleteCardField>()(`${KANBAN_ACTION}/delete-card-field`, {
51
- input: Schema.Struct({
52
- view: DataType.View,
53
- fieldId: Schema.String,
54
- // TODO(wittjosiah): Separate fields for undo data?
55
- deletionData: Schema.optional(
56
- Schema.Struct({
57
- field: FieldSchema,
58
- // TODO(wittjosiah): This creates a type error.
59
- // props: PropertySchema,
60
- props: Schema.Any,
61
- index: Schema.Number,
62
- }),
63
- ),
64
- }),
65
- output: Schema.Void,
66
- }) {}
67
-
68
- export class DeleteCard extends Schema.TaggedClass<DeleteCard>()(`${KANBAN_ACTION}/delete-card`, {
69
- input: Schema.Struct({
70
- card: Schema.Any, // The card object to delete
71
- }),
72
- output: Schema.Void,
73
- }) {}
74
- }
@@ -2,6 +2,41 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { type Obj } from '@dxos/echo';
6
+
7
+ import { type Kanban } from './Kanban';
8
+
5
9
  export type Location = {
6
10
  idx?: number;
7
11
  };
12
+
13
+ /** Snapshot shape used when reading kanban arrangement from atoms. */
14
+ export type KanbanArrangementSnapshot = Kanban | Obj.Snapshot<Kanban>;
15
+
16
+ /** Minimal item shape for arrangement; Obj.Unknown satisfies this. */
17
+ export type BaseKanbanItem = { id: string };
18
+
19
+ /** Column structure without cards; used for board model column type and derived atoms. */
20
+ export type ColumnStructure = {
21
+ columnValue: string;
22
+ ids: string[];
23
+ };
24
+
25
+ export type KanbanColumn<T extends BaseKanbanItem = BaseKanbanItem> = {
26
+ columnValue: string;
27
+ cards: T[];
28
+ };
29
+
30
+ export type ArrangedCards<T extends BaseKanbanItem = BaseKanbanItem> = KanbanColumn<T>[];
31
+
32
+ /**
33
+ * Callback type for wrapping mutations in Obj.update().
34
+ * Contains separate callbacks for kanban object and item mutations.
35
+ */
36
+ export type KanbanChangeCallback<T extends BaseKanbanItem> = {
37
+ /** Callback to wrap kanban object mutations. */
38
+ kanban: (mutate: (mutableKanban: Obj.Mutable<Kanban>) => void) => void;
39
+
40
+ /** Sets a field on an item, wrapping in Obj.update() if needed. */
41
+ setItemField: (item: T, field: string, value: unknown) => void;
42
+ };
@@ -0,0 +1,218 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { beforeEach, describe, test } from 'vitest';
7
+
8
+ import { Filter, JsonSchema, Query, Type } from '@dxos/echo';
9
+ import { type View } from '@dxos/echo';
10
+ import { ObjectId } from '@dxos/keys';
11
+ import { ViewModel } from '@dxos/schema';
12
+
13
+ import { Kanban, UNCATEGORIZED_VALUE } from '#types';
14
+
15
+ import {
16
+ computeColumnStructure,
17
+ computeItemArrangement,
18
+ getOrderByColumnFromArrangement,
19
+ getOrderFromArrangement,
20
+ } from './arrangement';
21
+
22
+ const selectOptions = [
23
+ { id: UNCATEGORIZED_VALUE, title: 'Uncategorized', color: 'neutral' },
24
+ { id: 'a', title: 'A', color: 'blue' },
25
+ { id: 'b', title: 'B', color: 'green' },
26
+ ];
27
+
28
+ const MinimalSchema = Schema.Struct({ id: Schema.String }).pipe(
29
+ Type.object({ typename: 'test/Minimal', version: '0.1.0' }),
30
+ );
31
+
32
+ describe('arrangement utils', () => {
33
+ let view: View.View;
34
+
35
+ beforeEach(() => {
36
+ view = ViewModel.make({
37
+ query: Query.select(Filter.type(MinimalSchema)),
38
+ jsonSchema: JsonSchema.toJsonSchema(MinimalSchema),
39
+ });
40
+ });
41
+
42
+ describe('getOrderFromArrangement', () => {
43
+ test('returns copy of order when present', ({ expect }) => {
44
+ const arrangement = { order: ['a', 'b'], columns: {} };
45
+ expect(getOrderFromArrangement(arrangement)).toEqual(['a', 'b']);
46
+ });
47
+
48
+ test('returns copy of order from kanban arrangement', ({ expect }) => {
49
+ const kanban = Kanban.make({
50
+ view,
51
+ arrangement: { order: ['b', 'a'], columns: {} },
52
+ });
53
+ const order = getOrderFromArrangement(kanban.arrangement);
54
+ expect(order).toEqual(['b', 'a']);
55
+ order.push('x');
56
+ expect(getOrderFromArrangement(kanban.arrangement)).toEqual(['b', 'a']);
57
+ });
58
+
59
+ test('returns empty when arrangement or order missing or empty', ({ expect }) => {
60
+ expect(getOrderFromArrangement(undefined)).toEqual([]);
61
+ expect(getOrderFromArrangement({ order: [], columns: {} })).toEqual([]);
62
+ const kanbanEmptyOrder = Kanban.make({
63
+ view,
64
+ arrangement: { order: [], columns: {} },
65
+ });
66
+ expect(getOrderFromArrangement(kanbanEmptyOrder.arrangement)).toEqual([]);
67
+ });
68
+ });
69
+
70
+ describe('getOrderByColumnFromArrangement', () => {
71
+ test('returns per-column data with mutable id arrays', ({ expect }) => {
72
+ const arrangement = {
73
+ order: [],
74
+ columns: { a: { ids: ['i1'] } },
75
+ };
76
+ const byColumn = getOrderByColumnFromArrangement(arrangement);
77
+ expect(byColumn.a.ids).toEqual(['i1']);
78
+ byColumn.a.ids.push('i2');
79
+ expect(getOrderByColumnFromArrangement(arrangement).a.ids).toEqual(['i1']);
80
+ });
81
+
82
+ test('returns per-column ids and preserves hidden from kanban arrangement', ({ expect }) => {
83
+ const id1 = ObjectId.random();
84
+ const id2 = ObjectId.random();
85
+ const id3 = ObjectId.random();
86
+ const kanban = Kanban.make({
87
+ view,
88
+ arrangement: {
89
+ order: [],
90
+ columns: {
91
+ a: { ids: [id1, id2], hidden: true },
92
+ b: { ids: [id3] },
93
+ },
94
+ },
95
+ });
96
+ const byColumn = getOrderByColumnFromArrangement(kanban.arrangement);
97
+ expect(byColumn.a).toEqual({ ids: [id1, id2], hidden: true });
98
+ expect(byColumn.b).toEqual({ ids: [id3] });
99
+ expect(byColumn.b.hidden).toBeUndefined();
100
+ });
101
+
102
+ test('treats non-array ids as empty (Automerge / corrupt layout)', ({ expect }) => {
103
+ const arrangement = {
104
+ order: [],
105
+ columns: { a: { ids: {} as unknown as string[] }, b: { ids: ['ok'] } },
106
+ };
107
+ const byColumn = getOrderByColumnFromArrangement(arrangement);
108
+ expect(byColumn.a.ids).toEqual([]);
109
+ expect(byColumn.b.ids).toEqual(['ok']);
110
+ });
111
+
112
+ test('returns mutable copies', ({ expect }) => {
113
+ const idX = ObjectId.random();
114
+ const kanban = Kanban.make({
115
+ view,
116
+ arrangement: { order: [], columns: { a: { ids: [idX] } } },
117
+ });
118
+ const byColumn = getOrderByColumnFromArrangement(kanban.arrangement);
119
+ byColumn.a.ids.push(ObjectId.random());
120
+ expect(getOrderByColumnFromArrangement(kanban.arrangement).a.ids).toEqual([idX]);
121
+ });
122
+
123
+ test('returns empty object when arrangement or columns missing', ({ expect }) => {
124
+ expect(getOrderByColumnFromArrangement(undefined)).toEqual({});
125
+ expect(getOrderByColumnFromArrangement({ order: [], columns: {} })).toEqual({});
126
+ const kanbanEmpty = Kanban.make({
127
+ view,
128
+ arrangement: { order: [], columns: {} },
129
+ });
130
+ expect(getOrderByColumnFromArrangement(kanbanEmpty.arrangement)).toEqual({});
131
+ });
132
+ });
133
+
134
+ describe('computeColumnStructure', () => {
135
+ test('uncategorized first, then effectiveOrder, then missing selectOptions', ({ expect }) => {
136
+ const effectiveOrder = ['b'];
137
+ const effectiveByColumn = { [UNCATEGORIZED_VALUE]: { ids: ['x'] }, b: { ids: ['y'] } };
138
+ const result = computeColumnStructure(effectiveOrder, effectiveByColumn, selectOptions);
139
+ expect(result.map((col) => col.columnValue)).toEqual([UNCATEGORIZED_VALUE, 'b', 'a']);
140
+ expect(result[0].ids).toEqual(['x']);
141
+ expect(result[1].ids).toEqual(['y']);
142
+ expect(result[2].ids).toEqual([]);
143
+ });
144
+
145
+ test('does not duplicate uncategorized when already in effectiveOrder', ({ expect }) => {
146
+ const effectiveOrder = [UNCATEGORIZED_VALUE, 'a'];
147
+ const effectiveByColumn = {};
148
+ const result = computeColumnStructure(effectiveOrder, effectiveByColumn, selectOptions);
149
+ expect(result.map((col) => col.columnValue)).toEqual([UNCATEGORIZED_VALUE, 'a', 'b']);
150
+ });
151
+ });
152
+
153
+ describe('computeItemArrangement', () => {
154
+ test('distributes items by pivotPath and preserves saved order within column', ({ expect }) => {
155
+ const idUc1 = ObjectId.random();
156
+ const idA1 = ObjectId.random();
157
+ const idA2 = ObjectId.random();
158
+ const idA3 = ObjectId.random();
159
+ const kanban = Kanban.make({
160
+ view,
161
+ arrangement: {
162
+ order: ['a', 'b'],
163
+ columns: {
164
+ [UNCATEGORIZED_VALUE]: { ids: [idUc1] },
165
+ a: { ids: [idA2, idA1] },
166
+ b: { ids: [] },
167
+ },
168
+ },
169
+ });
170
+ const items = [{ id: idA1, status: 'a' }, { id: idA2, status: 'a' }, { id: idA3, status: 'a' }, { id: idUc1 }];
171
+ const result = computeItemArrangement({
172
+ object: kanban,
173
+ items,
174
+ pivotPath: 'status',
175
+ selectOptions,
176
+ });
177
+ const colUncat = result.find((c) => c.columnValue === UNCATEGORIZED_VALUE);
178
+ const colA = result.find((c) => c.columnValue === 'a');
179
+ const colB = result.find((c) => c.columnValue === 'b');
180
+ expect(colUncat?.cards.map((c) => c.id)).toEqual([idUc1]);
181
+ expect(colA?.cards.map((c) => c.id)).toEqual([idA2, idA1, idA3]);
182
+ expect(colB?.cards.map((c) => c.id)).toEqual([]);
183
+ });
184
+
185
+ test('when pivotPath undefined all items go to uncategorized', ({ expect }) => {
186
+ const kanban = Kanban.make({
187
+ view,
188
+ arrangement: { order: ['a', 'b'], columns: { a: { ids: [] }, b: { ids: [] } } },
189
+ });
190
+ const items = [
191
+ { id: '1', status: 'a' },
192
+ { id: '2', status: 'b' },
193
+ ];
194
+ const result = computeItemArrangement({
195
+ object: kanban,
196
+ items,
197
+ selectOptions,
198
+ });
199
+ const colUncat = result.find((c) => c.columnValue === UNCATEGORIZED_VALUE);
200
+ const colA = result.find((c) => c.columnValue === 'a');
201
+ expect(colUncat?.cards.length).toBe(2);
202
+ expect(colA?.cards.length).toBe(0);
203
+ });
204
+
205
+ test('column order is uncategorized then selectOptions', ({ expect }) => {
206
+ const kanban = Kanban.make({
207
+ view,
208
+ arrangement: { order: ['a', 'b'], columns: {} },
209
+ });
210
+ const result = computeItemArrangement({
211
+ object: kanban,
212
+ items: [],
213
+ selectOptions,
214
+ });
215
+ expect(result.map((c) => c.columnValue)).toEqual([UNCATEGORIZED_VALUE, 'a', 'b']);
216
+ });
217
+ });
218
+ });
@@ -0,0 +1,177 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type SelectOption } from '@dxos/echo/internal';
6
+
7
+ import {
8
+ type ArrangedCards,
9
+ type BaseKanbanItem,
10
+ type ColumnStructure,
11
+ type Kanban,
12
+ UNCATEGORIZED_VALUE,
13
+ } from '#types';
14
+
15
+ /**
16
+ * Column order from a raw arrangement object (e.g. when working with arrangement only).
17
+ *
18
+ * @param arrangement - Optional arrangement; reads order.
19
+ * @returns Mutable copy of order array, or empty if arrangement/order missing or empty.
20
+ */
21
+ export const getOrderFromArrangement = (arrangement?: Kanban.Arrangement): string[] => {
22
+ const order = arrangement?.order;
23
+ if (order != null && Array.isArray(order) && order.length > 0) {
24
+ return [...order];
25
+ }
26
+
27
+ return [];
28
+ };
29
+
30
+ /**
31
+ * Per-column card id order and optional hidden flag from a raw arrangement object.
32
+ *
33
+ * Returns mutable copies so schema readonly does not leak to callers.
34
+ *
35
+ * @param arrangement - Optional arrangement; reads columns.
36
+ * @returns Map of column value → { ids, hidden? }; empty object if not set.
37
+ */
38
+ export const getOrderByColumnFromArrangement = (
39
+ arrangement?: Kanban.Arrangement,
40
+ ): Record<string, { ids: string[]; hidden?: boolean }> => {
41
+ const columns = arrangement?.columns;
42
+ if (columns != null && Object.keys(columns).length > 0) {
43
+ return Object.fromEntries(
44
+ Object.entries(columns).map(([key, entry]) => {
45
+ const rawIds = entry.ids;
46
+ const ids = Array.isArray(rawIds) ? [...rawIds] : [];
47
+ return [key, { ids, ...(entry.hidden !== undefined && { hidden: entry.hidden }) }];
48
+ }),
49
+ );
50
+ }
51
+
52
+ return {};
53
+ };
54
+
55
+ /**
56
+ * Builds the ordered list of columns (value + ids) for the board model.
57
+ *
58
+ * Column order: uncategorized first, then effectiveOrder, then any
59
+ * selectOption ids not yet in order. Each entry gets the ids from
60
+ * effectiveByColumn for that column (or empty). Columns whose entry has
61
+ * `hidden: true` are dropped from the result — currently only the
62
+ * "Uncategorized" column is toggleable from settings, but the filter is
63
+ * generic so any column can be hidden via the same flag.
64
+ *
65
+ * @param effectiveOrder - Column order from arrangement (or previous merge).
66
+ * @param effectiveByColumn - Per-column card id order + hidden flag from arrangement.
67
+ * @param selectOptions - Defines valid column ids; any missing from order are appended.
68
+ * @returns ColumnStructure array in display order.
69
+ */
70
+ export const computeColumnStructure = (
71
+ effectiveOrder: string[],
72
+ effectiveByColumn: Record<string, { ids: string[]; hidden?: boolean }>,
73
+ selectOptions: SelectOption[],
74
+ ): ColumnStructure[] => {
75
+ const order = [...effectiveOrder];
76
+ if (!order.includes(UNCATEGORIZED_VALUE)) {
77
+ order.unshift(UNCATEGORIZED_VALUE);
78
+ }
79
+
80
+ for (const opt of selectOptions) {
81
+ if (opt.id !== UNCATEGORIZED_VALUE && !order.includes(opt.id)) {
82
+ order.push(opt.id);
83
+ }
84
+ }
85
+
86
+ return order
87
+ .filter((columnValue) => effectiveByColumn[columnValue]?.hidden !== true)
88
+ .map((columnValue) => ({
89
+ columnValue,
90
+ ids: effectiveByColumn[columnValue]?.ids ?? [],
91
+ }));
92
+ };
93
+
94
+ /**
95
+ * Orders items for a single column: partition by saved order vs new, sort by orderMap, concatenate.
96
+ * Uses explicit null/undefined check for itemColumn so empty string is handled consistently.
97
+ *
98
+ * @param items - All items to filter.
99
+ * @param ids - Saved id order for this column.
100
+ * @param columnValue - Column id (e.g. UNCATEGORIZED_VALUE or option id).
101
+ * @param pivotPath - Item property key for column value (undefined = no pivot).
102
+ * @param validColumnValues - Set of valid option ids.
103
+ * @returns Items belonging to this column in display order.
104
+ */
105
+ export const orderItemsInColumn = <T extends BaseKanbanItem>(
106
+ items: T[],
107
+ ids: string[],
108
+ columnValue: string,
109
+ pivotPath: string | undefined,
110
+ validColumnValues: Set<string>,
111
+ ): T[] => {
112
+ const orderMap = new Map(ids.map((id, index) => [id, index]));
113
+ const cardsWithExistingOrder: T[] = [];
114
+ const newCards: T[] = [];
115
+
116
+ for (const item of items) {
117
+ const itemColumn = pivotPath !== undefined ? (item[pivotPath as keyof T] as string | undefined) : undefined;
118
+ const isValidColumn = itemColumn != null && validColumnValues.has(itemColumn);
119
+ const belongsInColumn = columnValue === UNCATEGORIZED_VALUE ? !isValidColumn : itemColumn === columnValue;
120
+
121
+ if (belongsInColumn) {
122
+ (orderMap.has(item.id) ? cardsWithExistingOrder : newCards).push(item);
123
+ }
124
+ }
125
+
126
+ cardsWithExistingOrder.sort((a, b) => {
127
+ const indexA = orderMap.get(a.id) ?? Infinity;
128
+ const indexB = orderMap.get(b.id) ?? Infinity;
129
+ return indexA - indexB;
130
+ });
131
+
132
+ return [...cardsWithExistingOrder, ...newCards];
133
+ };
134
+
135
+ /**
136
+ * Computes the full item arrangement for the board: one entry per column with items in display order.
137
+ *
138
+ * Columns follow selectOptions order (uncategorized first, then each option). Within each column,
139
+ * cards that appear in the kanban's saved arrangement keep that order; any other cards in that
140
+ * column are appended after them.
141
+ *
142
+ * @param object - Kanban object whose arrangement holds per-column id order.
143
+ * @param items - All items to distribute into columns.
144
+ * @param pivotPath - Optional item property key whose value is the column id (e.g. status, priority).
145
+ * @param selectOptions - Defines valid column ids and their display order.
146
+ * @returns Array of { columnValue, cards } in column order, with cards ordered as above.
147
+ */
148
+ export const computeItemArrangement = <T extends BaseKanbanItem = BaseKanbanItem>({
149
+ object,
150
+ items,
151
+ pivotPath,
152
+ selectOptions,
153
+ }: {
154
+ object: Kanban.Kanban;
155
+ items: T[];
156
+ pivotPath?: string;
157
+ selectOptions: SelectOption[];
158
+ }): ArrangedCards<T> => {
159
+ const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
160
+ const byColumn = getOrderByColumnFromArrangement(object?.arrangement);
161
+
162
+ // Column order: uncategorized first, then each select option (skip
163
+ // uncategorized if duplicated). Columns whose arrangement entry has
164
+ // `hidden: true` are dropped — same generic hide-by-column flag used
165
+ // by `computeColumnStructure`.
166
+ const columnEntries = [
167
+ { columnValue: UNCATEGORIZED_VALUE, ids: byColumn[UNCATEGORIZED_VALUE]?.ids ?? [] },
168
+ ...selectOptions
169
+ .filter((opt) => opt.id !== UNCATEGORIZED_VALUE)
170
+ .map((opt) => ({ columnValue: opt.id, ids: byColumn[opt.id]?.ids ?? [] })),
171
+ ].filter((entry) => byColumn[entry.columnValue]?.hidden !== true);
172
+
173
+ return columnEntries.map(({ columnValue, ids }) => ({
174
+ columnValue,
175
+ cards: orderItemsInColumn(items, ids, columnValue, pivotPath, validColumnValues),
176
+ }));
177
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './arrangement';
@@ -1,28 +0,0 @@
1
- // src/capabilities/blueprint-definition.ts
2
- import { Capabilities, contributes } from "@dxos/app-framework";
3
- import { Blueprint, Template } from "@dxos/blueprints";
4
- import { trim } from "@dxos/util";
5
- var functions = [];
6
- var tools = [];
7
- var blueprint_definition_default = () => {
8
- return [
9
- contributes(Capabilities.Functions, functions),
10
- contributes(Capabilities.BlueprintDefinition, Blueprint.make({
11
- key: "dxos.org/blueprint/kanban",
12
- name: "Kanban",
13
- tools: Blueprint.toolDefinitions({
14
- functions,
15
- tools
16
- }),
17
- instructions: Template.make({
18
- source: trim`
19
- You can create and update kanban boards to show data in sorted columns defined by schema.
20
- `
21
- })
22
- }))
23
- ];
24
- };
25
- export {
26
- blueprint_definition_default as default
27
- };
28
- //# sourceMappingURL=blueprint-definition-GFG7LX2C.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/blueprint-definition.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes } from '@dxos/app-framework';\nimport { Blueprint, Template } from '@dxos/blueprints';\nimport { type FunctionDefinition } from '@dxos/functions';\nimport { trim } from '@dxos/util';\n\nconst functions: FunctionDefinition[] = [];\nconst tools: string[] = [];\n\nexport default () => {\n return [\n contributes(Capabilities.Functions, functions),\n contributes(\n Capabilities.BlueprintDefinition,\n Blueprint.make({\n key: 'dxos.org/blueprint/kanban',\n name: 'Kanban',\n tools: Blueprint.toolDefinitions({ functions, tools }),\n instructions: Template.make({\n source: trim`\n You can create and update kanban boards to show data in sorted columns defined by schema.\n `,\n }),\n }),\n ),\n ];\n};\n"],
5
- "mappings": ";AAIA,SAASA,cAAcC,mBAAmB;AAC1C,SAASC,WAAWC,gBAAgB;AAEpC,SAASC,YAAY;AAErB,IAAMC,YAAkC,CAAA;AACxC,IAAMC,QAAkB,CAAA;AAExB,IAAA,+BAAe,MAAA;AACb,SAAO;IACLC,YAAYC,aAAaC,WAAWJ,SAAAA;IACpCE,YACEC,aAAaE,qBACbC,UAAUC,KAAK;MACbC,KAAK;MACLC,MAAM;MACNR,OAAOK,UAAUI,gBAAgB;QAAEV;QAAWC;MAAM,CAAA;MACpDU,cAAcC,SAASL,KAAK;QAC1BM,QAAQC;;;MAGV,CAAA;IACF,CAAA,CAAA;;AAGN;",
6
- "names": ["Capabilities", "contributes", "Blueprint", "Template", "trim", "functions", "tools", "contributes", "Capabilities", "Functions", "BlueprintDefinition", "Blueprint", "make", "key", "name", "toolDefinitions", "instructions", "Template", "source", "trim"]
7
- }
@@ -1,82 +0,0 @@
1
- // src/types/schema.ts
2
- import { Schema } from "effect";
3
- import { SpaceSchema } from "@dxos/react-client/echo";
4
- import { DataType, FieldSchema, TypenameAnnotationId } from "@dxos/schema";
5
-
6
- // src/meta.ts
7
- var KANBAN_PLUGIN = "dxos.org/plugin/kanban";
8
- var meta = {
9
- id: KANBAN_PLUGIN,
10
- name: "Kanban",
11
- description: "Kanban allows you to explore Table data in sorted columns defined by your custom schema. You can use Kanbans to track progress or trigger custom automations when cards are moved from one state to another.",
12
- icon: "ph--kanban--regular",
13
- source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban",
14
- screenshots: [
15
- "https://dxos.network/plugin-details-kanban-dark.png"
16
- ]
17
- };
18
-
19
- // src/types/schema.ts
20
- var PivotColumnAnnotationId = Symbol.for("@dxos/plugin-kanban/annotation/PivotColumn");
21
- var CreateKanbanSchema = Schema.Struct({
22
- name: Schema.optional(Schema.String),
23
- typename: Schema.optional(Schema.String.annotations({
24
- [TypenameAnnotationId]: [
25
- "used-static",
26
- "dynamic"
27
- ],
28
- title: "Select card record type (leave empty to start fresh)"
29
- })),
30
- initialPivotColumn: Schema.optional(Schema.String.annotations({
31
- [PivotColumnAnnotationId]: true,
32
- title: "Pivot column"
33
- }))
34
- });
35
- (function(KanbanAction2) {
36
- const KANBAN_ACTION = `${KANBAN_PLUGIN}/action`;
37
- class Create extends Schema.TaggedClass()(`${KANBAN_ACTION}/create`, {
38
- input: Schema.extend(Schema.Struct({
39
- space: SpaceSchema
40
- }), CreateKanbanSchema),
41
- output: Schema.Struct({
42
- object: DataType.View
43
- })
44
- }) {
45
- }
46
- KanbanAction2.Create = Create;
47
- class DeleteCardField extends Schema.TaggedClass()(`${KANBAN_ACTION}/delete-card-field`, {
48
- input: Schema.Struct({
49
- view: DataType.View,
50
- fieldId: Schema.String,
51
- // TODO(wittjosiah): Separate fields for undo data?
52
- deletionData: Schema.optional(Schema.Struct({
53
- field: FieldSchema,
54
- // TODO(wittjosiah): This creates a type error.
55
- // props: PropertySchema,
56
- props: Schema.Any,
57
- index: Schema.Number
58
- }))
59
- }),
60
- output: Schema.Void
61
- }) {
62
- }
63
- KanbanAction2.DeleteCardField = DeleteCardField;
64
- class DeleteCard extends Schema.TaggedClass()(`${KANBAN_ACTION}/delete-card`, {
65
- input: Schema.Struct({
66
- card: Schema.Any
67
- }),
68
- output: Schema.Void
69
- }) {
70
- }
71
- KanbanAction2.DeleteCard = DeleteCard;
72
- })(KanbanAction || (KanbanAction = {}));
73
- var KanbanAction;
74
-
75
- export {
76
- KANBAN_PLUGIN,
77
- meta,
78
- PivotColumnAnnotationId,
79
- CreateKanbanSchema,
80
- KanbanAction
81
- };
82
- //# sourceMappingURL=chunk-NCNNL74W.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/schema.ts", "../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { SpaceSchema } from '@dxos/react-client/echo';\nimport { DataType, FieldSchema, TypenameAnnotationId } from '@dxos/schema';\n\nimport { KANBAN_PLUGIN } from '../meta';\n\n/**\n * Kanban data model.\n * A Kanban board is a collection of columns, each of which contains a collection of items.\n * The layout of columns and items is controlled by models.\n * The underlying data model may be represented by direct object relationships\n * (e.g., a column object containing an array of ordered items) or projections constructed\n * by the model (e.g., a query of items based on metadata within a column object).\n */\n\n// TODO(wittjosiah): Factor out?\nexport const PivotColumnAnnotationId = Symbol.for('@dxos/plugin-kanban/annotation/PivotColumn');\n\nexport const CreateKanbanSchema = Schema.Struct({\n name: Schema.optional(Schema.String),\n typename: Schema.optional(\n Schema.String.annotations({\n [TypenameAnnotationId]: ['used-static', 'dynamic'],\n title: 'Select card record type (leave empty to start fresh)',\n }),\n ),\n initialPivotColumn: Schema.optional(\n Schema.String.annotations({\n [PivotColumnAnnotationId]: true,\n title: 'Pivot column',\n }),\n ),\n});\n\nexport namespace KanbanAction {\n const KANBAN_ACTION = `${KANBAN_PLUGIN}/action`;\n\n export class Create extends Schema.TaggedClass<Create>()(`${KANBAN_ACTION}/create`, {\n input: Schema.extend(Schema.Struct({ space: SpaceSchema }), CreateKanbanSchema),\n output: Schema.Struct({\n object: DataType.View,\n }),\n }) {}\n\n export class DeleteCardField extends Schema.TaggedClass<DeleteCardField>()(`${KANBAN_ACTION}/delete-card-field`, {\n input: Schema.Struct({\n view: DataType.View,\n fieldId: Schema.String,\n // TODO(wittjosiah): Separate fields for undo data?\n deletionData: Schema.optional(\n Schema.Struct({\n field: FieldSchema,\n // TODO(wittjosiah): This creates a type error.\n // props: PropertySchema,\n props: Schema.Any,\n index: Schema.Number,\n }),\n ),\n }),\n output: Schema.Void,\n }) {}\n\n export class DeleteCard extends Schema.TaggedClass<DeleteCard>()(`${KANBAN_ACTION}/delete-card`, {\n input: Schema.Struct({\n card: Schema.Any, // The card object to delete\n }),\n output: Schema.Void,\n }) {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const KANBAN_PLUGIN = 'dxos.org/plugin/kanban';\n\nexport const meta: PluginMeta = {\n id: KANBAN_PLUGIN,\n name: 'Kanban',\n description:\n 'Kanban allows you to explore Table data in sorted columns defined by your custom schema. You can use Kanbans to track progress or trigger custom automations when cards are moved from one state to another.',\n icon: 'ph--kanban--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban',\n screenshots: ['https://dxos.network/plugin-details-kanban-dark.png'],\n};\n"],
5
- "mappings": ";AAIA,SAASA,cAAc;AAEvB,SAASC,mBAAmB;AAC5B,SAASC,UAAUC,aAAaC,4BAA4B;;;ACDrD,IAAMC,gBAAgB;AAEtB,IAAMC,OAAmB;EAC9BC,IAAIF;EACJG,MAAM;EACNC,aACE;EACFC,MAAM;EACNC,QAAQ;EACRC,aAAa;IAAC;;AAChB;;;ADKO,IAAMC,0BAA0BC,OAAOC,IAAI,4CAAA;AAE3C,IAAMC,qBAAqBC,OAAOC,OAAO;EAC9CC,MAAMF,OAAOG,SAASH,OAAOI,MAAM;EACnCC,UAAUL,OAAOG,SACfH,OAAOI,OAAOE,YAAY;IACxB,CAACC,oBAAAA,GAAuB;MAAC;MAAe;;IACxCC,OAAO;EACT,CAAA,CAAA;EAEFC,oBAAoBT,OAAOG,SACzBH,OAAOI,OAAOE,YAAY;IACxB,CAACV,uBAAAA,GAA0B;IAC3BY,OAAO;EACT,CAAA,CAAA;AAEJ,CAAA;UAEiBE,eAAAA;AACf,QAAMC,gBAAgB,GAAGC,aAAAA;EAElB,MAAMC,eAAeb,OAAOc,YAAW,EAAW,GAAGH,aAAAA,WAAwB;IAClFI,OAAOf,OAAOgB,OAAOhB,OAAOC,OAAO;MAAEgB,OAAOC;IAAY,CAAA,GAAInB,kBAAAA;IAC5DoB,QAAQnB,OAAOC,OAAO;MACpBmB,QAAQC,SAASC;IACnB,CAAA;EACF,CAAA,EAAA;EAAI;gBALST,SAAAA;EAON,MAAMU,wBAAwBvB,OAAOc,YAAW,EAAoB,GAAGH,aAAAA,sBAAmC;IAC/GI,OAAOf,OAAOC,OAAO;MACnBuB,MAAMH,SAASC;MACfG,SAASzB,OAAOI;;MAEhBsB,cAAc1B,OAAOG,SACnBH,OAAOC,OAAO;QACZ0B,OAAOC;;;QAGPC,OAAO7B,OAAO8B;QACdC,OAAO/B,OAAOgC;MAChB,CAAA,CAAA;IAEJ,CAAA;IACAb,QAAQnB,OAAOiC;EACjB,CAAA,EAAA;EAAI;gBAhBSV,kBAAAA;EAkBN,MAAMW,mBAAmBlC,OAAOc,YAAW,EAAe,GAAGH,aAAAA,gBAA6B;IAC/FI,OAAOf,OAAOC,OAAO;MACnBkC,MAAMnC,OAAO8B;IACf,CAAA;IACAX,QAAQnB,OAAOiC;EACjB,CAAA,EAAA;EAAI;gBALSC,aAAAA;AAMf,GAlCiBxB,iBAAAA,eAAAA,CAAAA,EAAAA;;",
6
- "names": ["Schema", "SpaceSchema", "DataType", "FieldSchema", "TypenameAnnotationId", "KANBAN_PLUGIN", "meta", "id", "name", "description", "icon", "source", "screenshots", "PivotColumnAnnotationId", "Symbol", "for", "CreateKanbanSchema", "Schema", "Struct", "name", "optional", "String", "typename", "annotations", "TypenameAnnotationId", "title", "initialPivotColumn", "KanbanAction", "KANBAN_ACTION", "KANBAN_PLUGIN", "Create", "TaggedClass", "input", "extend", "space", "SpaceSchema", "output", "object", "DataType", "View", "DeleteCardField", "view", "fieldId", "deletionData", "field", "FieldSchema", "props", "Any", "index", "Number", "Void", "DeleteCard", "card"]
7
- }