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

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 (225) hide show
  1. package/dist/lib/browser/KanbanContainer-BCXSJ6KS.mjs +304 -0
  2. package/dist/lib/browser/KanbanContainer-BCXSJ6KS.mjs.map +7 -0
  3. package/dist/lib/browser/KanbanViewEditor-IH5CJ6BW.mjs +66 -0
  4. package/dist/lib/browser/KanbanViewEditor-IH5CJ6BW.mjs.map +7 -0
  5. package/dist/lib/browser/blueprint-definition-HFEKGFJK.mjs +17 -0
  6. package/dist/lib/browser/blueprint-definition-HFEKGFJK.mjs.map +7 -0
  7. package/dist/lib/browser/blueprints/index.mjs +8 -0
  8. package/dist/lib/browser/blueprints/index.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  10. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-QSWCFMEB.mjs +385 -0
  12. package/dist/lib/browser/chunk-QSWCFMEB.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-RNFIFE2P.mjs +213 -0
  14. package/dist/lib/browser/chunk-RNFIFE2P.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-TLYZSC7O.mjs +29 -0
  16. package/dist/lib/browser/chunk-TLYZSC7O.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +65 -69
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs +162 -0
  21. package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs.map +7 -0
  22. package/dist/lib/browser/react-surface-FOMOGFVW.mjs +99 -0
  23. package/dist/lib/browser/react-surface-FOMOGFVW.mjs.map +7 -0
  24. package/dist/lib/browser/types/index.mjs +12 -5
  25. package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs +305 -0
  26. package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs.map +7 -0
  27. package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs +67 -0
  28. package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs.map +7 -0
  29. package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs +18 -0
  30. package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs.map +7 -0
  31. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  32. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-4AWDHQVY.mjs +214 -0
  34. package/dist/lib/node-esm/chunk-4AWDHQVY.mjs.map +7 -0
  35. package/dist/lib/node-esm/chunk-CSL3HF2X.mjs +386 -0
  36. package/dist/lib/node-esm/chunk-CSL3HF2X.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  38. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  39. package/dist/lib/node-esm/chunk-X3UJUQIV.mjs +31 -0
  40. package/dist/lib/node-esm/chunk-X3UJUQIV.mjs.map +7 -0
  41. package/dist/lib/node-esm/index.mjs +65 -69
  42. package/dist/lib/node-esm/index.mjs.map +4 -4
  43. package/dist/lib/node-esm/meta.json +1 -1
  44. package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs +163 -0
  45. package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs.map +7 -0
  46. package/dist/lib/node-esm/react-surface-AITKFRBE.mjs +100 -0
  47. package/dist/lib/node-esm/react-surface-AITKFRBE.mjs.map +7 -0
  48. package/dist/lib/node-esm/types/index.mjs +12 -5
  49. package/dist/types/src/KanbanPlugin.d.ts +2 -1
  50. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  51. package/dist/types/src/blueprints/index.d.ts +2 -0
  52. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  53. package/dist/types/src/blueprints/kanban-blueprint.d.ts +4 -0
  54. package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -0
  55. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +12 -0
  56. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +1 -0
  57. package/dist/types/src/capabilities/artifact-definition/index.d.ts +3 -0
  58. package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +6 -0
  60. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  62. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/index.d.ts +3 -3
  64. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  68. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  70. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  72. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  73. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +58 -0
  74. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -0
  75. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +70 -0
  76. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -0
  77. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +10 -0
  78. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -0
  79. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +9 -0
  80. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -0
  81. package/dist/types/src/components/KanbanBoard/index.d.ts +2 -0
  82. package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -0
  83. package/dist/types/src/components/index.d.ts +1 -2
  84. package/dist/types/src/components/index.d.ts.map +1 -1
  85. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +6 -0
  86. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +1 -0
  87. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts +77 -0
  88. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +1 -0
  89. package/dist/types/src/containers/KanbanContainer/index.d.ts +3 -0
  90. package/dist/types/src/containers/KanbanContainer/index.d.ts.map +1 -0
  91. package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts +6 -0
  92. package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts.map +1 -0
  93. package/dist/types/src/containers/KanbanViewEditor/index.d.ts +3 -0
  94. package/dist/types/src/containers/KanbanViewEditor/index.d.ts.map +1 -0
  95. package/dist/types/src/containers/index.d.ts +4 -0
  96. package/dist/types/src/containers/index.d.ts.map +1 -0
  97. package/dist/types/src/hooks/index.d.ts +6 -0
  98. package/dist/types/src/hooks/index.d.ts.map +1 -0
  99. package/dist/types/src/hooks/useEchoChangeCallback.d.ts +13 -0
  100. package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -0
  101. package/dist/types/src/hooks/useKanbanBoardModel.d.ts +16 -0
  102. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -0
  103. package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts +2 -0
  104. package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts.map +1 -0
  105. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +22 -0
  106. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -0
  107. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +19 -0
  108. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -0
  109. package/dist/types/src/hooks/useProjectionModel.d.ts +15 -0
  110. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -0
  111. package/dist/types/src/meta.d.ts +2 -3
  112. package/dist/types/src/meta.d.ts.map +1 -1
  113. package/dist/types/src/playwright/board-manager.d.ts +5 -0
  114. package/dist/types/src/playwright/board-manager.d.ts.map +1 -0
  115. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  116. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  117. package/dist/types/src/playwright/smoke.spec.d.ts +2 -0
  118. package/dist/types/src/playwright/smoke.spec.d.ts.map +1 -0
  119. package/dist/types/src/testing/KanbanCardTileSimple.d.ts +5 -0
  120. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -0
  121. package/dist/types/src/testing/index.d.ts +2 -0
  122. package/dist/types/src/testing/index.d.ts.map +1 -0
  123. package/dist/types/src/translations.d.ts +35 -9
  124. package/dist/types/src/translations.d.ts.map +1 -1
  125. package/dist/types/src/types/Kanban.d.ts +37 -0
  126. package/dist/types/src/types/Kanban.d.ts.map +1 -0
  127. package/dist/types/src/types/constants.d.ts +6 -0
  128. package/dist/types/src/types/constants.d.ts.map +1 -0
  129. package/dist/types/src/types/index.d.ts +2 -1
  130. package/dist/types/src/types/index.d.ts.map +1 -1
  131. package/dist/types/src/types/schema.d.ts +100 -88
  132. package/dist/types/src/types/schema.d.ts.map +1 -1
  133. package/dist/types/src/types/types.d.ts +28 -0
  134. package/dist/types/src/types/types.d.ts.map +1 -1
  135. package/dist/types/src/util/arrangement.d.ts +68 -0
  136. package/dist/types/src/util/arrangement.d.ts.map +1 -0
  137. package/dist/types/src/util/arrangement.test.d.ts +2 -0
  138. package/dist/types/src/util/arrangement.test.d.ts.map +1 -0
  139. package/dist/types/src/util/index.d.ts +2 -0
  140. package/dist/types/src/util/index.d.ts.map +1 -0
  141. package/dist/types/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +69 -46
  143. package/src/KanbanPlugin.tsx +36 -55
  144. package/src/blueprints/index.ts +5 -0
  145. package/src/blueprints/kanban-blueprint.ts +31 -0
  146. package/src/capabilities/artifact-definition/artifact-definition.ts +151 -0
  147. package/src/capabilities/artifact-definition/index.ts +7 -0
  148. package/src/capabilities/blueprint-definition/blueprint-definition.ts +17 -0
  149. package/src/capabilities/blueprint-definition/index.ts +7 -0
  150. package/src/capabilities/index.ts +3 -5
  151. package/src/capabilities/operation-resolver/index.ts +7 -0
  152. package/src/capabilities/operation-resolver/operation-resolver.ts +133 -0
  153. package/src/capabilities/react-surface/index.ts +7 -0
  154. package/src/capabilities/react-surface/react-surface.tsx +86 -0
  155. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +142 -0
  156. package/src/components/KanbanBoard/KanbanBoard.tsx +184 -0
  157. package/src/components/KanbanBoard/KanbanCard.tsx +87 -0
  158. package/src/components/KanbanBoard/KanbanColumn.tsx +69 -0
  159. package/src/components/KanbanBoard/index.ts +5 -0
  160. package/src/components/index.ts +1 -2
  161. package/src/containers/KanbanContainer/KanbanContainer.stories.tsx +263 -0
  162. package/src/containers/KanbanContainer/KanbanContainer.tsx +87 -0
  163. package/src/containers/KanbanContainer/index.ts +7 -0
  164. package/src/containers/KanbanViewEditor/KanbanViewEditor.tsx +63 -0
  165. package/src/containers/KanbanViewEditor/index.ts +7 -0
  166. package/src/containers/index.ts +8 -0
  167. package/src/hooks/index.ts +9 -0
  168. package/src/hooks/useEchoChangeCallback.ts +30 -0
  169. package/src/hooks/useKanbanBoardModel.test.ts +235 -0
  170. package/src/hooks/useKanbanBoardModel.ts +143 -0
  171. package/src/hooks/useKanbanColumnEventHandler.ts +106 -0
  172. package/src/hooks/useKanbanItemEventHandler.ts +133 -0
  173. package/src/hooks/useProjectionModel.ts +58 -0
  174. package/src/meta.ts +9 -7
  175. package/src/playwright/board-manager.ts +13 -0
  176. package/src/playwright/playwright.config.ts +19 -0
  177. package/src/playwright/smoke.spec.ts +107 -0
  178. package/src/testing/KanbanCardTileSimple.tsx +76 -0
  179. package/src/testing/index.ts +5 -0
  180. package/src/translations.ts +13 -6
  181. package/src/types/Kanban.ts +67 -0
  182. package/src/types/constants.ts +9 -0
  183. package/src/types/index.ts +2 -1
  184. package/src/types/schema.ts +86 -40
  185. package/src/types/types.ts +35 -0
  186. package/src/util/arrangement.test.ts +208 -0
  187. package/src/util/arrangement.ts +167 -0
  188. package/src/util/index.ts +5 -0
  189. package/dist/lib/browser/artifact-definition-WMSZK3RW.mjs +0 -174
  190. package/dist/lib/browser/artifact-definition-WMSZK3RW.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-X44RHBZK.mjs +0 -108
  192. package/dist/lib/browser/chunk-X44RHBZK.mjs.map +0 -7
  193. package/dist/lib/browser/intent-resolver-E6O3LBAB.mjs +0 -111
  194. package/dist/lib/browser/intent-resolver-E6O3LBAB.mjs.map +0 -7
  195. package/dist/lib/browser/react-surface-MWNNZYMN.mjs +0 -256
  196. package/dist/lib/browser/react-surface-MWNNZYMN.mjs.map +0 -7
  197. package/dist/lib/node-esm/artifact-definition-QVZXPDXK.mjs +0 -175
  198. package/dist/lib/node-esm/artifact-definition-QVZXPDXK.mjs.map +0 -7
  199. package/dist/lib/node-esm/chunk-6WK5CGYY.mjs +0 -110
  200. package/dist/lib/node-esm/chunk-6WK5CGYY.mjs.map +0 -7
  201. package/dist/lib/node-esm/intent-resolver-LPASDELU.mjs +0 -112
  202. package/dist/lib/node-esm/intent-resolver-LPASDELU.mjs.map +0 -7
  203. package/dist/lib/node-esm/react-surface-T52BBG45.mjs +0 -257
  204. package/dist/lib/node-esm/react-surface-T52BBG45.mjs.map +0 -7
  205. package/dist/types/src/capabilities/artifact-definition.d.ts +0 -11
  206. package/dist/types/src/capabilities/artifact-definition.d.ts.map +0 -1
  207. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  208. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  209. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  210. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  211. package/dist/types/src/components/KanbanContainer.d.ts +0 -7
  212. package/dist/types/src/components/KanbanContainer.d.ts.map +0 -1
  213. package/dist/types/src/components/KanbanContainer.stories.d.ts +0 -10
  214. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +0 -1
  215. package/dist/types/src/components/KanbanViewEditor.d.ts +0 -8
  216. package/dist/types/src/components/KanbanViewEditor.d.ts.map +0 -1
  217. package/dist/types/src/types/kanban.d.ts +0 -11
  218. package/dist/types/src/types/kanban.d.ts.map +0 -1
  219. package/src/capabilities/artifact-definition.ts +0 -144
  220. package/src/capabilities/intent-resolver.ts +0 -70
  221. package/src/capabilities/react-surface.tsx +0 -84
  222. package/src/components/KanbanContainer.stories.tsx +0 -189
  223. package/src/components/KanbanContainer.tsx +0 -95
  224. package/src/components/KanbanViewEditor.tsx +0 -60
  225. package/src/types/kanban.ts +0 -29
@@ -0,0 +1,208 @@
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('returns mutable copies', ({ expect }) => {
103
+ const idX = ObjectId.random();
104
+ const kanban = Kanban.make({
105
+ view,
106
+ arrangement: { order: [], columns: { a: { ids: [idX] } } },
107
+ });
108
+ const byColumn = getOrderByColumnFromArrangement(kanban.arrangement);
109
+ byColumn.a.ids.push(ObjectId.random());
110
+ expect(getOrderByColumnFromArrangement(kanban.arrangement).a.ids).toEqual([idX]);
111
+ });
112
+
113
+ test('returns empty object when arrangement or columns missing', ({ expect }) => {
114
+ expect(getOrderByColumnFromArrangement(undefined)).toEqual({});
115
+ expect(getOrderByColumnFromArrangement({ order: [], columns: {} })).toEqual({});
116
+ const kanbanEmpty = Kanban.make({
117
+ view,
118
+ arrangement: { order: [], columns: {} },
119
+ });
120
+ expect(getOrderByColumnFromArrangement(kanbanEmpty.arrangement)).toEqual({});
121
+ });
122
+ });
123
+
124
+ describe('computeColumnStructure', () => {
125
+ test('uncategorized first, then effectiveOrder, then missing selectOptions', ({ expect }) => {
126
+ const effectiveOrder = ['b'];
127
+ const effectiveByColumn = { [UNCATEGORIZED_VALUE]: { ids: ['x'] }, b: { ids: ['y'] } };
128
+ const result = computeColumnStructure(effectiveOrder, effectiveByColumn, selectOptions);
129
+ expect(result.map((col) => col.columnValue)).toEqual([UNCATEGORIZED_VALUE, 'b', 'a']);
130
+ expect(result[0].ids).toEqual(['x']);
131
+ expect(result[1].ids).toEqual(['y']);
132
+ expect(result[2].ids).toEqual([]);
133
+ });
134
+
135
+ test('does not duplicate uncategorized when already in effectiveOrder', ({ expect }) => {
136
+ const effectiveOrder = [UNCATEGORIZED_VALUE, 'a'];
137
+ const effectiveByColumn = {};
138
+ const result = computeColumnStructure(effectiveOrder, effectiveByColumn, selectOptions);
139
+ expect(result.map((col) => col.columnValue)).toEqual([UNCATEGORIZED_VALUE, 'a', 'b']);
140
+ });
141
+ });
142
+
143
+ describe('computeItemArrangement', () => {
144
+ test('distributes items by pivotPath and preserves saved order within column', ({ expect }) => {
145
+ const idUc1 = ObjectId.random();
146
+ const idA1 = ObjectId.random();
147
+ const idA2 = ObjectId.random();
148
+ const idA3 = ObjectId.random();
149
+ const kanban = Kanban.make({
150
+ view,
151
+ arrangement: {
152
+ order: ['a', 'b'],
153
+ columns: {
154
+ [UNCATEGORIZED_VALUE]: { ids: [idUc1] },
155
+ a: { ids: [idA2, idA1] },
156
+ b: { ids: [] },
157
+ },
158
+ },
159
+ });
160
+ const items = [{ id: idA1, status: 'a' }, { id: idA2, status: 'a' }, { id: idA3, status: 'a' }, { id: idUc1 }];
161
+ const result = computeItemArrangement({
162
+ object: kanban,
163
+ items,
164
+ pivotPath: 'status',
165
+ selectOptions,
166
+ });
167
+ const colUncat = result.find((c) => c.columnValue === UNCATEGORIZED_VALUE);
168
+ const colA = result.find((c) => c.columnValue === 'a');
169
+ const colB = result.find((c) => c.columnValue === 'b');
170
+ expect(colUncat?.cards.map((c) => c.id)).toEqual([idUc1]);
171
+ expect(colA?.cards.map((c) => c.id)).toEqual([idA2, idA1, idA3]);
172
+ expect(colB?.cards.map((c) => c.id)).toEqual([]);
173
+ });
174
+
175
+ test('when pivotPath undefined all items go to uncategorized', ({ expect }) => {
176
+ const kanban = Kanban.make({
177
+ view,
178
+ arrangement: { order: ['a', 'b'], columns: { a: { ids: [] }, b: { ids: [] } } },
179
+ });
180
+ const items = [
181
+ { id: '1', status: 'a' },
182
+ { id: '2', status: 'b' },
183
+ ];
184
+ const result = computeItemArrangement({
185
+ object: kanban,
186
+ items,
187
+ selectOptions,
188
+ });
189
+ const colUncat = result.find((c) => c.columnValue === UNCATEGORIZED_VALUE);
190
+ const colA = result.find((c) => c.columnValue === 'a');
191
+ expect(colUncat?.cards.length).toBe(2);
192
+ expect(colA?.cards.length).toBe(0);
193
+ });
194
+
195
+ test('column order is uncategorized then selectOptions', ({ expect }) => {
196
+ const kanban = Kanban.make({
197
+ view,
198
+ arrangement: { order: ['a', 'b'], columns: {} },
199
+ });
200
+ const result = computeItemArrangement({
201
+ object: kanban,
202
+ items: [],
203
+ selectOptions,
204
+ });
205
+ expect(result.map((c) => c.columnValue)).toEqual([UNCATEGORIZED_VALUE, 'a', 'b']);
206
+ });
207
+ });
208
+ });
@@ -0,0 +1,167 @@
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 && 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
+ key,
46
+ { ids: [...(entry.ids ?? [])], ...(entry.hidden !== undefined && { hidden: entry.hidden }) },
47
+ ]),
48
+ );
49
+ }
50
+
51
+ return {};
52
+ };
53
+
54
+ /**
55
+ * Builds the ordered list of columns (value + ids) for the board model.
56
+ *
57
+ * Column order: uncategorized first, then effectiveOrder, then any selectOption ids not yet in order.
58
+ * Each entry gets the ids from effectiveByColumn for that column (or empty).
59
+ *
60
+ * @param effectiveOrder - Column order from arrangement (or previous merge).
61
+ * @param effectiveByColumn - Per-column card id order from arrangement.
62
+ * @param selectOptions - Defines valid column ids; any missing from order are appended.
63
+ * @returns ColumnStructure array in display order.
64
+ */
65
+ export const computeColumnStructure = (
66
+ effectiveOrder: string[],
67
+ effectiveByColumn: Record<string, { ids: string[]; hidden?: boolean }>,
68
+ selectOptions: SelectOption[],
69
+ ): ColumnStructure[] => {
70
+ const order = [...effectiveOrder];
71
+ if (!order.includes(UNCATEGORIZED_VALUE)) {
72
+ order.unshift(UNCATEGORIZED_VALUE);
73
+ }
74
+
75
+ for (const opt of selectOptions) {
76
+ if (opt.id !== UNCATEGORIZED_VALUE && !order.includes(opt.id)) {
77
+ order.push(opt.id);
78
+ }
79
+ }
80
+
81
+ return order.map((columnValue) => ({
82
+ columnValue,
83
+ ids: effectiveByColumn[columnValue]?.ids ?? [],
84
+ }));
85
+ };
86
+
87
+ /**
88
+ * Orders items for a single column: partition by saved order vs new, sort by orderMap, concatenate.
89
+ * Uses explicit null/undefined check for itemColumn so empty string is handled consistently.
90
+ *
91
+ * @param items - All items to filter.
92
+ * @param ids - Saved id order for this column.
93
+ * @param columnValue - Column id (e.g. UNCATEGORIZED_VALUE or option id).
94
+ * @param pivotPath - Item property key for column value (undefined = no pivot).
95
+ * @param validColumnValues - Set of valid option ids.
96
+ * @returns Items belonging to this column in display order.
97
+ */
98
+ export const orderItemsInColumn = <T extends BaseKanbanItem>(
99
+ items: T[],
100
+ ids: string[],
101
+ columnValue: string,
102
+ pivotPath: string | undefined,
103
+ validColumnValues: Set<string>,
104
+ ): T[] => {
105
+ const orderMap = new Map(ids.map((id, index) => [id, index]));
106
+ const cardsWithExistingOrder: T[] = [];
107
+ const newCards: T[] = [];
108
+
109
+ for (const item of items) {
110
+ const itemColumn = pivotPath !== undefined ? (item[pivotPath as keyof T] as string | undefined) : undefined;
111
+ const isValidColumn = itemColumn != null && validColumnValues.has(itemColumn);
112
+ const belongsInColumn = columnValue === UNCATEGORIZED_VALUE ? !isValidColumn : itemColumn === columnValue;
113
+
114
+ if (belongsInColumn) {
115
+ (orderMap.has(item.id) ? cardsWithExistingOrder : newCards).push(item);
116
+ }
117
+ }
118
+
119
+ cardsWithExistingOrder.sort((a, b) => {
120
+ const indexA = orderMap.get(a.id) ?? Infinity;
121
+ const indexB = orderMap.get(b.id) ?? Infinity;
122
+ return indexA - indexB;
123
+ });
124
+
125
+ return [...cardsWithExistingOrder, ...newCards];
126
+ };
127
+
128
+ /**
129
+ * Computes the full item arrangement for the board: one entry per column with items in display order.
130
+ *
131
+ * Columns follow selectOptions order (uncategorized first, then each option). Within each column,
132
+ * cards that appear in the kanban's saved arrangement keep that order; any other cards in that
133
+ * column are appended after them.
134
+ *
135
+ * @param object - Kanban object whose arrangement holds per-column id order.
136
+ * @param items - All items to distribute into columns.
137
+ * @param pivotPath - Optional item property key whose value is the column id (e.g. status, priority).
138
+ * @param selectOptions - Defines valid column ids and their display order.
139
+ * @returns Array of { columnValue, cards } in column order, with cards ordered as above.
140
+ */
141
+ export const computeItemArrangement = <T extends BaseKanbanItem = BaseKanbanItem>({
142
+ object,
143
+ items,
144
+ pivotPath,
145
+ selectOptions,
146
+ }: {
147
+ object: Kanban.Kanban;
148
+ items: T[];
149
+ pivotPath?: string;
150
+ selectOptions: SelectOption[];
151
+ }): ArrangedCards<T> => {
152
+ const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
153
+ const byColumn = getOrderByColumnFromArrangement(object?.arrangement);
154
+
155
+ // Column order: uncategorized first, then each select option (skip uncategorized if duplicated).
156
+ const columnEntries = [
157
+ { columnValue: UNCATEGORIZED_VALUE, ids: byColumn[UNCATEGORIZED_VALUE]?.ids ?? [] },
158
+ ...selectOptions
159
+ .filter((opt) => opt.id !== UNCATEGORIZED_VALUE)
160
+ .map((opt) => ({ columnValue: opt.id, ids: byColumn[opt.id]?.ids ?? [] })),
161
+ ];
162
+
163
+ return columnEntries.map(({ columnValue, ids }) => ({
164
+ columnValue,
165
+ cards: orderItemsInColumn(items, ids, columnValue, pivotPath, validColumnValues),
166
+ }));
167
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './arrangement';
@@ -1,174 +0,0 @@
1
- import {
2
- KanbanAction,
3
- meta
4
- } from "./chunk-X44RHBZK.mjs";
5
-
6
- // src/capabilities/artifact-definition.ts
7
- import { Schema, pipe } from "effect";
8
- import { createTool, ToolResult } from "@dxos/ai";
9
- import { Capabilities, chain, contributes, createIntent } from "@dxos/app-framework";
10
- import { createArtifactElement } from "@dxos/assistant";
11
- import { defineArtifact } from "@dxos/blueprints";
12
- import { Obj, Query } from "@dxos/echo";
13
- import { invariant } from "@dxos/invariant";
14
- import { SpaceAction } from "@dxos/plugin-space/types";
15
- import { Filter, fullyQualifiedId } from "@dxos/react-client/echo";
16
- import { KanbanView } from "@dxos/react-ui-kanban";
17
- import { DataType } from "@dxos/schema";
18
- import { isNonNullable } from "@dxos/util";
19
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/capabilities/artifact-definition.ts";
20
- var QualifiedId = Schema.String.annotations({
21
- description: "The fully qualified ID of the kanban `spaceID:objectID`"
22
- });
23
- var artifact_definition_default = () => {
24
- const definition = defineArtifact({
25
- id: `artifact:${meta.id}`,
26
- name: meta.name,
27
- instructions: `
28
- - Before adding items to a kanban board, inspect the board to see its schema
29
- - When adding items, you must not include the 'id' field -- it is automatically generated
30
- - BEFORE adding items, always make sure the board has been shown to the user!
31
- `,
32
- schema: KanbanView,
33
- tools: [
34
- createTool(meta.id, {
35
- name: "create",
36
- description: `
37
- Create a new kanban board using an existing schema.
38
- Use schema_create first to create a schema, or schema_list to choose an existing one.`,
39
- caption: "Creating kanban board...",
40
- schema: Schema.Struct({
41
- typename: Schema.String.annotations({
42
- description: "The fully qualified typename of the schema to use for the kanban cards."
43
- }),
44
- pivotColumn: Schema.optional(Schema.String).annotations({
45
- description: "Optional field name to use as the column pivot."
46
- })
47
- }),
48
- execute: async ({ typename, pivotColumn }, { extensions }) => {
49
- invariant(extensions?.space, "No space", {
50
- F: __dxlog_file,
51
- L: 59,
52
- S: void 0,
53
- A: [
54
- "extensions?.space",
55
- "'No space'"
56
- ]
57
- });
58
- invariant(extensions?.dispatch, "No intent dispatcher", {
59
- F: __dxlog_file,
60
- L: 60,
61
- S: void 0,
62
- A: [
63
- "extensions?.dispatch",
64
- "'No intent dispatcher'"
65
- ]
66
- });
67
- const schema = await extensions.space.db.schemaRegistry.query({
68
- typename
69
- }).firstOrUndefined();
70
- if (!schema) {
71
- return ToolResult.Error(`Schema not found: ${typename}`);
72
- }
73
- const intent = pipe(createIntent(KanbanAction.Create, {
74
- space: extensions.space,
75
- typename,
76
- initialPivotColumn: pivotColumn
77
- }), chain(SpaceAction.AddObject, {
78
- target: extensions.space
79
- }));
80
- const { data, error } = await extensions.dispatch(intent);
81
- if (!data || error) {
82
- return ToolResult.Error(error?.message ?? "Failed to create kanban board");
83
- }
84
- return ToolResult.Success(createArtifactElement(data.id));
85
- }
86
- }),
87
- createTool(meta.id, {
88
- name: "list",
89
- description: "List all kanban boards in the current space.",
90
- caption: "Listing kanban boards...",
91
- schema: Schema.Struct({}),
92
- execute: async (_input, { extensions }) => {
93
- invariant(extensions?.space, "No space", {
94
- F: __dxlog_file,
95
- L: 91,
96
- S: void 0,
97
- A: [
98
- "extensions?.space",
99
- "'No space'"
100
- ]
101
- });
102
- const space = extensions.space;
103
- const { objects } = await space.db.query(Filter.type(DataType.View)).run();
104
- const boardInfo = await Promise.all(objects.map(async (view) => {
105
- const kanban = await view.presentation.load();
106
- if (!Obj.instanceOf(KanbanView, kanban)) {
107
- return null;
108
- }
109
- return {
110
- id: fullyQualifiedId(view),
111
- name: view.name ?? "Unnamed Kanban",
112
- typename: view.query.typename
113
- };
114
- }));
115
- return ToolResult.Success(boardInfo.filter(isNonNullable));
116
- }
117
- }),
118
- createTool(meta.id, {
119
- name: "inspect",
120
- description: "Get details about a specific kanban board.",
121
- caption: "Inspecting kanban board...",
122
- schema: Schema.Struct({
123
- id: QualifiedId
124
- }),
125
- execute: async ({ id }, { extensions }) => {
126
- invariant(extensions?.space, "No space", {
127
- F: __dxlog_file,
128
- L: 119,
129
- S: void 0,
130
- A: [
131
- "extensions?.space",
132
- "'No space'"
133
- ]
134
- });
135
- const space = extensions.space;
136
- const view = await space.db.query(Query.select(Filter.and(Filter.type(DataType.View), Filter.ids(id)))).first();
137
- const kanban = await view.presentation.load();
138
- invariant(Obj.instanceOf(KanbanView, kanban), void 0, {
139
- F: __dxlog_file,
140
- L: 127,
141
- S: void 0,
142
- A: [
143
- "Obj.instanceOf(KanbanView, kanban)",
144
- ""
145
- ]
146
- });
147
- const typename = view.query.typename;
148
- const schema = await space.db.schemaRegistry.query({
149
- typename
150
- }).firstOrUndefined();
151
- invariant(schema, void 0, {
152
- F: __dxlog_file,
153
- L: 131,
154
- S: void 0,
155
- A: [
156
- "schema",
157
- ""
158
- ]
159
- });
160
- return ToolResult.Success({
161
- schema,
162
- columnField: kanban.columnFieldId,
163
- viewFields: view.projection.fields
164
- });
165
- }
166
- })
167
- ]
168
- });
169
- return contributes(Capabilities.ArtifactDefinition, definition);
170
- };
171
- export {
172
- artifact_definition_default as default
173
- };
174
- //# sourceMappingURL=artifact-definition-WMSZK3RW.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/artifact-definition.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema, pipe } from 'effect';\n\nimport { createTool, ToolResult } from '@dxos/ai';\nimport { Capabilities, chain, contributes, createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { createArtifactElement } from '@dxos/assistant';\nimport { defineArtifact } from '@dxos/blueprints';\nimport { Obj, Query } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { Filter, fullyQualifiedId, type Space } from '@dxos/react-client/echo';\nimport { KanbanView } from '@dxos/react-ui-kanban';\nimport { DataType } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '../meta';\nimport { KanbanAction } from '../types';\n\nconst QualifiedId = Schema.String.annotations({\n description: 'The fully qualified ID of the kanban `spaceID:objectID`',\n});\n\ndeclare global {\n interface ToolContextExtensions {\n space?: Space;\n dispatch?: PromiseIntentDispatcher;\n }\n}\n\nexport default () => {\n const definition = defineArtifact({\n id: `artifact:${meta.id}`,\n name: meta.name,\n instructions: `\n - Before adding items to a kanban board, inspect the board to see its schema\n - When adding items, you must not include the 'id' field -- it is automatically generated\n - BEFORE adding items, always make sure the board has been shown to the user!\n `,\n schema: KanbanView,\n tools: [\n createTool(meta.id, {\n name: 'create',\n description: `\n Create a new kanban board using an existing schema.\n Use schema_create first to create a schema, or schema_list to choose an existing one.`,\n caption: 'Creating kanban board...',\n schema: Schema.Struct({\n typename: Schema.String.annotations({\n description: 'The fully qualified typename of the schema to use for the kanban cards.',\n }),\n pivotColumn: Schema.optional(Schema.String).annotations({\n description: 'Optional field name to use as the column pivot.',\n }),\n }),\n execute: async ({ typename, pivotColumn }, { extensions }) => {\n invariant(extensions?.space, 'No space');\n invariant(extensions?.dispatch, 'No intent dispatcher');\n\n // Validate schema exists first\n const schema = await extensions.space.db.schemaRegistry.query({ typename }).firstOrUndefined();\n if (!schema) {\n return ToolResult.Error(`Schema not found: ${typename}`);\n }\n\n const intent = pipe(\n createIntent(KanbanAction.Create, {\n space: extensions.space,\n typename,\n initialPivotColumn: pivotColumn,\n }),\n chain(SpaceAction.AddObject, { target: extensions.space }),\n );\n\n const { data, error } = await extensions.dispatch(intent);\n if (!data || error) {\n return ToolResult.Error(error?.message ?? 'Failed to create kanban board');\n }\n\n return ToolResult.Success(createArtifactElement(data.id));\n },\n }),\n createTool(meta.id, {\n name: 'list',\n description: 'List all kanban boards in the current space.',\n caption: 'Listing kanban boards...',\n schema: Schema.Struct({}),\n execute: async (_input, { extensions }) => {\n invariant(extensions?.space, 'No space');\n const space = extensions.space;\n const { objects } = await space.db.query(Filter.type(DataType.View)).run();\n\n const boardInfo = await Promise.all(\n objects.map(async (view) => {\n const kanban = await view.presentation.load();\n if (!Obj.instanceOf(KanbanView, kanban)) {\n return null;\n }\n\n return {\n id: fullyQualifiedId(view),\n name: view.name ?? 'Unnamed Kanban',\n typename: view.query.typename,\n };\n }),\n );\n\n return ToolResult.Success(boardInfo.filter(isNonNullable));\n },\n }),\n createTool(meta.id, {\n name: 'inspect',\n description: 'Get details about a specific kanban board.',\n caption: 'Inspecting kanban board...',\n schema: Schema.Struct({ id: QualifiedId }),\n execute: async ({ id }, { extensions }) => {\n invariant(extensions?.space, 'No space');\n const space = extensions.space;\n const view = (await space.db\n // TODO(wittjosiah): Filter.and should aggregate type\n .query(Query.select(Filter.and(Filter.type(DataType.View), Filter.ids(id))))\n .first()) as DataType.View;\n\n const kanban = await view.presentation.load();\n invariant(Obj.instanceOf(KanbanView, kanban));\n\n const typename = view.query.typename;\n const schema = await space.db.schemaRegistry.query({ typename }).firstOrUndefined();\n invariant(schema);\n\n return ToolResult.Success({\n schema,\n columnField: kanban.columnFieldId,\n viewFields: view.projection.fields,\n });\n },\n }),\n ],\n });\n\n return contributes(Capabilities.ArtifactDefinition, definition);\n};\n"],
5
- "mappings": "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",
6
- "names": ["Schema", "pipe", "createTool", "ToolResult", "Capabilities", "chain", "contributes", "createIntent", "createArtifactElement", "defineArtifact", "Obj", "Query", "invariant", "SpaceAction", "Filter", "fullyQualifiedId", "KanbanView", "DataType", "isNonNullable", "QualifiedId", "Schema", "String", "annotations", "description", "definition", "defineArtifact", "id", "meta", "name", "instructions", "schema", "KanbanView", "tools", "createTool", "caption", "Struct", "typename", "pivotColumn", "optional", "execute", "extensions", "invariant", "space", "dispatch", "db", "schemaRegistry", "query", "firstOrUndefined", "ToolResult", "Error", "intent", "pipe", "createIntent", "KanbanAction", "Create", "initialPivotColumn", "chain", "SpaceAction", "AddObject", "target", "data", "error", "message", "Success", "createArtifactElement", "_input", "objects", "Filter", "type", "DataType", "View", "run", "boardInfo", "Promise", "all", "map", "view", "kanban", "presentation", "load", "Obj", "instanceOf", "fullyQualifiedId", "filter", "isNonNullable", "Query", "select", "and", "ids", "first", "columnField", "columnFieldId", "viewFields", "projection", "fields", "contributes", "Capabilities", "ArtifactDefinition"]
7
- }
@@ -1,108 +0,0 @@
1
- // src/types/kanban.ts
2
- import { Obj } from "@dxos/echo";
3
- import { KanbanView } from "@dxos/react-ui-kanban";
4
- import { createViewFromSpace, ProjectionModel } from "@dxos/schema";
5
- var createKanban = async ({ initialPivotColumn, ...props }) => {
6
- const kanban = Obj.make(KanbanView, {
7
- columnFieldId: void 0
8
- });
9
- const { jsonSchema, view } = await createViewFromSpace({
10
- ...props,
11
- presentation: kanban
12
- });
13
- if (initialPivotColumn) {
14
- const projection = new ProjectionModel(jsonSchema, view.projection);
15
- const fieldId = projection.getFieldId(initialPivotColumn);
16
- if (fieldId) {
17
- kanban.columnFieldId = fieldId;
18
- }
19
- }
20
- return {
21
- jsonSchema,
22
- view
23
- };
24
- };
25
-
26
- // src/types/schema.ts
27
- import { Schema } from "effect";
28
- import { SpaceSchema } from "@dxos/react-client/echo";
29
- import { DataType, FieldSchema, TypenameAnnotationId } from "@dxos/schema";
30
-
31
- // src/meta.ts
32
- var KANBAN_PLUGIN = "dxos.org/plugin/kanban";
33
- var meta = {
34
- id: KANBAN_PLUGIN,
35
- name: "Kanban",
36
- 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.",
37
- icon: "ph--kanban--regular",
38
- source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban",
39
- screenshots: [
40
- "https://dxos.network/plugin-details-kanban-dark.png"
41
- ]
42
- };
43
-
44
- // src/types/schema.ts
45
- var PivotColumnAnnotationId = Symbol.for("@dxos/plugin-kanban/annotation/PivotColumn");
46
- var CreateKanbanSchema = Schema.Struct({
47
- name: Schema.optional(Schema.String),
48
- typename: Schema.optional(Schema.String.annotations({
49
- [TypenameAnnotationId]: [
50
- "limited-static",
51
- "dynamic"
52
- ],
53
- title: "Select card schema (leave empty to start fresh)"
54
- })),
55
- initialPivotColumn: Schema.optional(Schema.String.annotations({
56
- [PivotColumnAnnotationId]: true,
57
- title: "Pivot column"
58
- }))
59
- });
60
- (function(KanbanAction2) {
61
- const KANBAN_ACTION = `${KANBAN_PLUGIN}/action`;
62
- class Create extends Schema.TaggedClass()(`${KANBAN_ACTION}/create`, {
63
- input: Schema.extend(Schema.Struct({
64
- space: SpaceSchema
65
- }), CreateKanbanSchema),
66
- output: Schema.Struct({
67
- object: DataType.View
68
- })
69
- }) {
70
- }
71
- KanbanAction2.Create = Create;
72
- class DeleteCardField extends Schema.TaggedClass()(`${KANBAN_ACTION}/delete-card-field`, {
73
- input: Schema.Struct({
74
- view: DataType.View,
75
- fieldId: Schema.String,
76
- // TODO(wittjosiah): Separate fields for undo data?
77
- deletionData: Schema.optional(Schema.Struct({
78
- field: FieldSchema,
79
- // TODO(wittjosiah): This creates a type error.
80
- // props: PropertySchema,
81
- props: Schema.Any,
82
- index: Schema.Number
83
- }))
84
- }),
85
- output: Schema.Void
86
- }) {
87
- }
88
- KanbanAction2.DeleteCardField = DeleteCardField;
89
- class DeleteCard extends Schema.TaggedClass()(`${KANBAN_ACTION}/delete-card`, {
90
- input: Schema.Struct({
91
- card: Schema.Any
92
- }),
93
- output: Schema.Void
94
- }) {
95
- }
96
- KanbanAction2.DeleteCard = DeleteCard;
97
- })(KanbanAction || (KanbanAction = {}));
98
- var KanbanAction;
99
-
100
- export {
101
- KANBAN_PLUGIN,
102
- meta,
103
- createKanban,
104
- PivotColumnAnnotationId,
105
- CreateKanbanSchema,
106
- KanbanAction
107
- };
108
- //# sourceMappingURL=chunk-X44RHBZK.mjs.map