@dxos/plugin-kanban 0.8.4-main.c4373fc → 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 -68
  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 +14 -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 -68
  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 +14 -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 -2
  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 -0
  130. package/dist/types/src/types/index.d.ts.map +1 -1
  131. package/dist/types/src/types/schema.d.ts +98 -43
  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 +67 -46
  143. package/src/KanbanPlugin.tsx +35 -54
  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 +8 -4
  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 -0
  184. package/src/types/schema.ts +84 -38
  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/blueprint-definition-UYVX622Q.mjs +0 -28
  190. package/dist/lib/browser/blueprint-definition-UYVX622Q.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-K7KYFJ3P.mjs +0 -80
  192. package/dist/lib/browser/chunk-K7KYFJ3P.mjs.map +0 -7
  193. package/dist/lib/browser/intent-resolver-LR3SDMKQ.mjs +0 -111
  194. package/dist/lib/browser/intent-resolver-LR3SDMKQ.mjs.map +0 -7
  195. package/dist/lib/browser/react-surface-R2ORFB43.mjs +0 -255
  196. package/dist/lib/browser/react-surface-R2ORFB43.mjs.map +0 -7
  197. package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs +0 -30
  198. package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs.map +0 -7
  199. package/dist/lib/node-esm/chunk-VDWYSHP4.mjs +0 -82
  200. package/dist/lib/node-esm/chunk-VDWYSHP4.mjs.map +0 -7
  201. package/dist/lib/node-esm/intent-resolver-CKDNVLND.mjs +0 -112
  202. package/dist/lib/node-esm/intent-resolver-CKDNVLND.mjs.map +0 -7
  203. package/dist/lib/node-esm/react-surface-RMRLHCOY.mjs +0 -256
  204. package/dist/lib/node-esm/react-surface-RMRLHCOY.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/blueprint-definition.d.ts +0 -5
  208. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  209. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  210. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  211. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  212. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  213. package/dist/types/src/components/KanbanContainer.d.ts +0 -7
  214. package/dist/types/src/components/KanbanContainer.d.ts.map +0 -1
  215. package/dist/types/src/components/KanbanContainer.stories.d.ts +0 -41
  216. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +0 -1
  217. package/dist/types/src/components/KanbanViewEditor.d.ts +0 -8
  218. package/dist/types/src/components/KanbanViewEditor.d.ts.map +0 -1
  219. package/src/capabilities/artifact-definition.ts +0 -148
  220. package/src/capabilities/blueprint-definition.ts +0 -30
  221. package/src/capabilities/intent-resolver.ts +0 -71
  222. package/src/capabilities/react-surface.tsx +0 -84
  223. package/src/components/KanbanContainer.stories.tsx +0 -193
  224. package/src/components/KanbanContainer.tsx +0 -95
  225. package/src/components/KanbanViewEditor.tsx +0 -64
@@ -0,0 +1,214 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ __export
4
+ } from "./chunk-HSLMI22Q.mjs";
5
+
6
+ // src/types/constants.ts
7
+ var UNCATEGORIZED_VALUE = "__uncategorized__";
8
+ var UNCATEGORIZED_ATTRIBUTES = {
9
+ title: "Uncategorized",
10
+ color: "neutral"
11
+ };
12
+
13
+ // src/types/Kanban.ts
14
+ var Kanban_exports = {};
15
+ __export(Kanban_exports, {
16
+ Arrangement: () => Arrangement,
17
+ Kanban: () => Kanban,
18
+ make: () => make
19
+ });
20
+ import * as Schema from "effect/Schema";
21
+ import { Obj, Ref, Type } from "@dxos/echo";
22
+ import { View } from "@dxos/echo";
23
+ import { FormInputAnnotation, LabelAnnotation } from "@dxos/echo/internal";
24
+ import { ViewAnnotation } from "@dxos/schema";
25
+ var ArrangementColumnEntry = Schema.Struct({
26
+ ids: Schema.Array(Obj.ID),
27
+ hidden: Schema.optional(Schema.Boolean)
28
+ });
29
+ var ArrangementColumns = Schema.Record({
30
+ key: Schema.String,
31
+ value: ArrangementColumnEntry
32
+ }).pipe(FormInputAnnotation.set(false));
33
+ var Arrangement = Schema.Struct({
34
+ order: Schema.Array(Schema.String).pipe(FormInputAnnotation.set(false)),
35
+ columns: ArrangementColumns
36
+ }).pipe(FormInputAnnotation.set(false));
37
+ var Kanban = Schema.Struct({
38
+ name: Schema.optional(Schema.String),
39
+ view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),
40
+ /** Column display order and per-column card ids. */
41
+ arrangement: Arrangement
42
+ }).pipe(Type.object({
43
+ typename: "dxos.org/type/Kanban",
44
+ version: "0.3.0"
45
+ }), LabelAnnotation.set([
46
+ "name"
47
+ ]), ViewAnnotation.set(true));
48
+ var make = (props) => {
49
+ const { name, view, arrangement } = props;
50
+ const order = arrangement?.order ?? [];
51
+ const columns = arrangement?.columns ?? {};
52
+ return Obj.make(Kanban, {
53
+ name,
54
+ view: Ref.make(view),
55
+ arrangement: {
56
+ order,
57
+ columns
58
+ }
59
+ });
60
+ };
61
+
62
+ // src/types/schema.ts
63
+ import * as Schema2 from "effect/Schema";
64
+ import { Capability } from "@dxos/app-framework";
65
+ import { View as View2 } from "@dxos/echo";
66
+ import { Operation } from "@dxos/operation";
67
+ import { TypeInputOptionsAnnotation } from "@dxos/plugin-space/types";
68
+
69
+ // src/meta.ts
70
+ import { trim } from "@dxos/util";
71
+ var meta = {
72
+ id: "dxos.org/plugin/kanban",
73
+ name: "Kanban",
74
+ description: trim`
75
+ Visual project management using customizable kanban boards to track workflow progress.
76
+ Organize table data into columns, drag and drop items between stages, and trigger automations based on status changes.
77
+ `,
78
+ icon: "ph--kanban--regular",
79
+ iconHue: "green",
80
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban",
81
+ screenshots: [
82
+ "https://dxos.network/plugin-details-kanban-dark.png"
83
+ ]
84
+ };
85
+
86
+ // src/types/schema.ts
87
+ var PivotColumnAnnotationId = /* @__PURE__ */ Symbol.for("@dxos/plugin-kanban/annotation/PivotColumn");
88
+ var SettingsSchema = Schema2.Struct({
89
+ columnFieldId: Schema2.String.annotations({
90
+ title: "Column field"
91
+ })
92
+ });
93
+ var CreateKanbanSchema = Schema2.Struct({
94
+ name: Schema2.optional(Schema2.String),
95
+ // TODO(wittjosiah): This should be a query input instead.
96
+ typename: Schema2.String.pipe(Schema2.annotations({
97
+ title: "Select card type"
98
+ }), TypeInputOptionsAnnotation.set({
99
+ location: [
100
+ "database",
101
+ "runtime"
102
+ ],
103
+ kind: [
104
+ "user"
105
+ ],
106
+ registered: [
107
+ "registered"
108
+ ]
109
+ }), Schema2.optional),
110
+ initialPivotColumn: Schema2.optional(Schema2.String.annotations({
111
+ [PivotColumnAnnotationId]: true,
112
+ title: "Pivot column"
113
+ }))
114
+ });
115
+ var KANBAN_OPERATION = `${meta.id}/operation`;
116
+ (function(KanbanOperation2) {
117
+ KanbanOperation2.DeleteCardFieldOutput = Schema2.Struct({
118
+ field: View2.FieldSchema.annotations({
119
+ description: "The deleted field schema."
120
+ }),
121
+ props: Schema2.Any.annotations({
122
+ description: "The deleted field properties."
123
+ }),
124
+ index: Schema2.Number.annotations({
125
+ description: "The index the field was at."
126
+ })
127
+ });
128
+ KanbanOperation2.DeleteCardField = Operation.make({
129
+ meta: {
130
+ key: `${KANBAN_OPERATION}/delete-card-field`,
131
+ name: "Delete Card Field"
132
+ },
133
+ services: [
134
+ Capability.Service
135
+ ],
136
+ schema: {
137
+ input: Schema2.Struct({
138
+ view: View2.View,
139
+ fieldId: Schema2.String
140
+ }),
141
+ output: KanbanOperation2.DeleteCardFieldOutput
142
+ }
143
+ });
144
+ KanbanOperation2.DeleteCardOutput = Schema2.Struct({
145
+ card: Schema2.Any.annotations({
146
+ description: "The deleted card."
147
+ })
148
+ });
149
+ KanbanOperation2.DeleteCard = Operation.make({
150
+ meta: {
151
+ key: `${KANBAN_OPERATION}/delete-card`,
152
+ name: "Delete Card"
153
+ },
154
+ schema: {
155
+ input: Schema2.Struct({
156
+ card: Schema2.Any
157
+ }),
158
+ output: KanbanOperation2.DeleteCardOutput
159
+ }
160
+ });
161
+ KanbanOperation2.RestoreCardField = Operation.make({
162
+ meta: {
163
+ key: `${KANBAN_OPERATION}/restore-card-field`,
164
+ name: "Restore Card Field"
165
+ },
166
+ services: [
167
+ Capability.Service
168
+ ],
169
+ schema: {
170
+ input: Schema2.Struct({
171
+ view: View2.View.annotations({
172
+ description: "The view to restore the field to."
173
+ }),
174
+ field: View2.FieldSchema.annotations({
175
+ description: "The field schema to restore."
176
+ }),
177
+ props: Schema2.Any.annotations({
178
+ description: "The field properties to restore."
179
+ }),
180
+ index: Schema2.Number.annotations({
181
+ description: "The index to restore the field at."
182
+ })
183
+ }),
184
+ output: Schema2.Void
185
+ }
186
+ });
187
+ KanbanOperation2.RestoreCard = Operation.make({
188
+ meta: {
189
+ key: `${KANBAN_OPERATION}/restore-card`,
190
+ name: "Restore Card"
191
+ },
192
+ schema: {
193
+ input: Schema2.Struct({
194
+ card: Schema2.Any.annotations({
195
+ description: "The card to restore."
196
+ })
197
+ }),
198
+ output: Schema2.Void
199
+ }
200
+ });
201
+ })(KanbanOperation || (KanbanOperation = {}));
202
+ var KanbanOperation;
203
+
204
+ export {
205
+ meta,
206
+ UNCATEGORIZED_VALUE,
207
+ UNCATEGORIZED_ATTRIBUTES,
208
+ Kanban_exports,
209
+ PivotColumnAnnotationId,
210
+ SettingsSchema,
211
+ CreateKanbanSchema,
212
+ KanbanOperation
213
+ };
214
+ //# sourceMappingURL=chunk-4AWDHQVY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/constants.ts", "../../../src/types/Kanban.ts", "../../../src/types/schema.ts", "../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const UNCATEGORIZED_VALUE = '__uncategorized__' as const;\nexport const UNCATEGORIZED_ATTRIBUTES = {\n title: 'Uncategorized',\n color: 'neutral',\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Obj, Ref, Type } from '@dxos/echo';\nimport { View } from '@dxos/echo';\nimport { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/internal';\nimport { ViewAnnotation } from '@dxos/schema';\n\n/** Per-column entry (ids order, optional hidden). */\nconst ArrangementColumnEntry = Schema.Struct({\n ids: Schema.Array(Obj.ID),\n hidden: Schema.optional(Schema.Boolean),\n});\n\n/** Keyed by columnValue. */\nconst ArrangementColumns = Schema.Record({\n key: Schema.String,\n value: ArrangementColumnEntry,\n}).pipe(FormInputAnnotation.set(false));\n\n/** Column order and per-column card ids. */\nexport const Arrangement = Schema.Struct({\n order: Schema.Array(Schema.String).pipe(FormInputAnnotation.set(false)),\n columns: ArrangementColumns,\n}).pipe(FormInputAnnotation.set(false));\n\nexport type Arrangement = Schema.Schema.Type<typeof Arrangement>;\n\nexport const Kanban = Schema.Struct({\n name: Schema.optional(Schema.String),\n\n view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),\n\n /** Column display order and per-column card ids. */\n arrangement: Arrangement,\n}).pipe(\n Type.object({\n typename: 'dxos.org/type/Kanban',\n version: '0.3.0',\n }),\n LabelAnnotation.set(['name']),\n ViewAnnotation.set(true),\n);\n\n/** Instance type; use Kanban.Kanban in type position so namespace has .Kanban as type and .KanbanSchema as schema. */\nexport interface Kanban extends Schema.Schema.Type<typeof Kanban> {}\n\ntype MakeProps = Omit<Partial<Obj.MakeProps<typeof Kanban>>, 'view'> & {\n view: View.View;\n};\n\n/**\n * Make a kanban as a view of a data set.\n */\nexport const make = (props: MakeProps): Kanban => {\n const { name, view, arrangement } = props;\n const order = arrangement?.order ?? [];\n const columns = arrangement?.columns ?? {};\n return Obj.make(Kanban, {\n name,\n view: Ref.make(view),\n arrangement: { order, columns },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { View } from '@dxos/echo';\nimport { Operation } from '@dxos/operation';\nimport { TypeInputOptionsAnnotation } from '@dxos/plugin-space/types';\n\nimport { meta } 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 SettingsSchema = Schema.Struct({\n columnFieldId: Schema.String.annotations({\n title: 'Column field',\n }),\n});\n\nexport const CreateKanbanSchema = Schema.Struct({\n name: Schema.optional(Schema.String),\n // TODO(wittjosiah): This should be a query input instead.\n typename: Schema.String.pipe(\n Schema.annotations({ title: 'Select card type' }),\n TypeInputOptionsAnnotation.set({\n location: ['database', 'runtime'],\n kind: ['user'],\n registered: ['registered'],\n }),\n Schema.optional,\n ),\n initialPivotColumn: Schema.optional(\n Schema.String.annotations({\n [PivotColumnAnnotationId]: true,\n title: 'Pivot column',\n }),\n ),\n});\n\nconst KANBAN_OPERATION = `${meta.id}/operation`;\n\nexport namespace KanbanOperation {\n export const DeleteCardFieldOutput = Schema.Struct({\n field: View.FieldSchema.annotations({ description: 'The deleted field schema.' }),\n props: Schema.Any.annotations({ description: 'The deleted field properties.' }),\n index: Schema.Number.annotations({ description: 'The index the field was at.' }),\n });\n\n export type DeleteCardFieldOutput = Schema.Schema.Type<typeof DeleteCardFieldOutput>;\n\n export const DeleteCardField = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/delete-card-field`, name: 'Delete Card Field' },\n services: [Capability.Service],\n schema: {\n input: Schema.Struct({\n view: View.View,\n fieldId: Schema.String,\n }),\n output: DeleteCardFieldOutput,\n },\n });\n\n export const DeleteCardOutput = Schema.Struct({\n card: Schema.Any.annotations({ description: 'The deleted card.' }),\n });\n\n export type DeleteCardOutput = Schema.Schema.Type<typeof DeleteCardOutput>;\n\n export const DeleteCard = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/delete-card`, name: 'Delete Card' },\n schema: {\n input: Schema.Struct({\n card: Schema.Any,\n }),\n output: DeleteCardOutput,\n },\n });\n\n /**\n * Restore a deleted card field (inverse of DeleteCardField).\n */\n export const RestoreCardField = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/restore-card-field`, name: 'Restore Card Field' },\n services: [Capability.Service],\n schema: {\n input: Schema.Struct({\n view: View.View.annotations({ description: 'The view to restore the field to.' }),\n field: View.FieldSchema.annotations({ description: 'The field schema to restore.' }),\n props: Schema.Any.annotations({ description: 'The field properties to restore.' }),\n index: Schema.Number.annotations({ description: 'The index to restore the field at.' }),\n }),\n output: Schema.Void,\n },\n });\n\n /**\n * Restore a deleted card (inverse of DeleteCard).\n */\n export const RestoreCard = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/restore-card`, name: 'Restore Card' },\n schema: {\n input: Schema.Struct({\n card: Schema.Any.annotations({ description: 'The card to restore.' }),\n }),\n output: Schema.Void,\n },\n });\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'dxos.org/plugin/kanban',\n name: 'Kanban',\n description: trim`\n Visual project management using customizable kanban boards to track workflow progress.\n Organize table data into columns, drag and drop items between stages, and trigger automations based on status changes.\n `,\n icon: 'ph--kanban--regular',\n iconHue: 'green',\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": ";;;;;;AAIO,IAAMA,sBAAsB;AAC5B,IAAMC,2BAA2B;EACtCC,OAAO;EACPC,OAAO;AACT;;;ACRA;;;;;;AAIA,YAAYC,YAAY;AAExB,SAASC,KAAKC,KAAKC,YAAY;AAC/B,SAASC,YAAY;AACrB,SAASC,qBAAqBC,uBAAuB;AACrD,SAASC,sBAAsB;AAG/B,IAAMC,yBAAgCC,cAAO;EAC3CC,KAAYC,aAAMC,IAAIC,EAAE;EACxBC,QAAeC,gBAAgBC,cAAO;AACxC,CAAA;AAGA,IAAMC,qBAA4BC,cAAO;EACvCC,KAAYC;EACZC,OAAOb;AACT,CAAA,EAAGc,KAAKC,oBAAoBC,IAAI,KAAA,CAAA;AAGzB,IAAMC,cAAqBhB,cAAO;EACvCiB,OAAcf,aAAaS,aAAM,EAAEE,KAAKC,oBAAoBC,IAAI,KAAA,CAAA;EAChEG,SAASV;AACX,CAAA,EAAGK,KAAKC,oBAAoBC,IAAI,KAAA,CAAA;AAIzB,IAAMI,SAAgBnB,cAAO;EAClCoB,MAAad,gBAAgBK,aAAM;EAEnCU,MAAMC,IAAIA,IAAIC,KAAKA,IAAI,EAAEV,KAAKC,oBAAoBC,IAAI,KAAA,CAAA;;EAGtDS,aAAaR;AACf,CAAA,EAAGH,KACDY,KAAKC,OAAO;EACVC,UAAU;EACVC,SAAS;AACX,CAAA,GACAC,gBAAgBd,IAAI;EAAC;CAAO,GAC5Be,eAAef,IAAI,IAAA,CAAA;AAad,IAAMgB,OAAO,CAACC,UAAAA;AACnB,QAAM,EAAEZ,MAAMC,MAAMG,YAAW,IAAKQ;AACpC,QAAMf,QAAQO,aAAaP,SAAS,CAAA;AACpC,QAAMC,UAAUM,aAAaN,WAAW,CAAC;AACzC,SAAOf,IAAI4B,KAAKZ,QAAQ;IACtBC;IACAC,MAAMC,IAAIS,KAAKV,IAAAA;IACfG,aAAa;MAAEP;MAAOC;IAAQ;EAChC,CAAA;AACF;;;AC9DA,YAAYe,aAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,QAAAA,aAAY;AACrB,SAASC,iBAAiB;AAC1B,SAASC,kCAAkC;;;ACJ3C,SAASC,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,aAAa;IAAC;;AAChB;;;ADKO,IAAMC,0BAA0BC,uBAAOC,IAAI,4CAAA;AAE3C,IAAMC,iBAAwBC,eAAO;EAC1CC,eAAsBC,eAAOC,YAAY;IACvCC,OAAO;EACT,CAAA;AACF,CAAA;AAEO,IAAMC,qBAA4BL,eAAO;EAC9CM,MAAaC,iBAAgBL,cAAM;;EAEnCM,UAAiBN,eAAOO,KACfN,oBAAY;IAAEC,OAAO;EAAmB,CAAA,GAC/CM,2BAA2BC,IAAI;IAC7BC,UAAU;MAAC;MAAY;;IACvBC,MAAM;MAAC;;IACPC,YAAY;MAAC;;EACf,CAAA,GACOP,gBAAQ;EAEjBQ,oBAA2BR,iBAClBL,eAAOC,YAAY;IACxB,CAACP,uBAAAA,GAA0B;IAC3BQ,OAAO;EACT,CAAA,CAAA;AAEJ,CAAA;AAEA,IAAMY,mBAAmB,GAAGC,KAAKC,EAAE;UAElBC,kBAAAA;mBACFC,wBAA+BpB,eAAO;IACjDqB,OAAOC,MAAKC,YAAYpB,YAAY;MAAEqB,aAAa;IAA4B,CAAA;IAC/EC,OAAcC,YAAIvB,YAAY;MAAEqB,aAAa;IAAgC,CAAA;IAC7EG,OAAcC,eAAOzB,YAAY;MAAEqB,aAAa;IAA8B,CAAA;EAChF,CAAA;mBAIaK,kBAAkBC,UAAUC,KAAK;IAC5Cd,MAAM;MAAEe,KAAK,GAAGhB,gBAAAA;MAAsCV,MAAM;IAAoB;IAChF2B,UAAU;MAACC,WAAWC;;IACtBC,QAAQ;MACNC,OAAcrC,eAAO;QACnBsC,MAAMhB,MAAKA;QACXiB,SAAgBrC;MAClB,CAAA;MACAsC,QAAMrB,iBAAEC;IACV;EACF,CAAA;mBAEaqB,mBAA0BzC,eAAO;IAC5C0C,MAAahB,YAAIvB,YAAY;MAAEqB,aAAa;IAAoB,CAAA;EAClE,CAAA;mBAIamB,aAAab,UAAUC,KAAK;IACvCd,MAAM;MAAEe,KAAK,GAAGhB,gBAAAA;MAAgCV,MAAM;IAAc;IACpE8B,QAAQ;MACNC,OAAcrC,eAAO;QACnB0C,MAAahB;MACf,CAAA;MACAc,QAAMrB,iBAAEsB;IACV;EACF,CAAA;mBAKaG,mBAAmBd,UAAUC,KAAK;IAC7Cd,MAAM;MAAEe,KAAK,GAAGhB,gBAAAA;MAAuCV,MAAM;IAAqB;IAClF2B,UAAU;MAACC,WAAWC;;IACtBC,QAAQ;MACNC,OAAcrC,eAAO;QACnBsC,MAAMhB,MAAKA,KAAKnB,YAAY;UAAEqB,aAAa;QAAoC,CAAA;QAC/EH,OAAOC,MAAKC,YAAYpB,YAAY;UAAEqB,aAAa;QAA+B,CAAA;QAClFC,OAAcC,YAAIvB,YAAY;UAAEqB,aAAa;QAAmC,CAAA;QAChFG,OAAcC,eAAOzB,YAAY;UAAEqB,aAAa;QAAqC,CAAA;MACvF,CAAA;MACAgB,QAAeK;IACjB;EACF,CAAA;mBAKaC,cAAchB,UAAUC,KAAK;IACxCd,MAAM;MAAEe,KAAK,GAAGhB,gBAAAA;MAAiCV,MAAM;IAAe;IACtE8B,QAAQ;MACNC,OAAcrC,eAAO;QACnB0C,MAAahB,YAAIvB,YAAY;UAAEqB,aAAa;QAAuB,CAAA;MACrE,CAAA;MACAgB,QAAeK;IACjB;EACF,CAAA;AACF,GAlEiB1B,oBAAAA,kBAAAA,CAAAA,EAAAA;;",
6
+ "names": ["UNCATEGORIZED_VALUE", "UNCATEGORIZED_ATTRIBUTES", "title", "color", "Schema", "Obj", "Ref", "Type", "View", "FormInputAnnotation", "LabelAnnotation", "ViewAnnotation", "ArrangementColumnEntry", "Struct", "ids", "Array", "Obj", "ID", "hidden", "optional", "Boolean", "ArrangementColumns", "Record", "key", "String", "value", "pipe", "FormInputAnnotation", "set", "Arrangement", "order", "columns", "Kanban", "name", "view", "Ref", "View", "arrangement", "Type", "object", "typename", "version", "LabelAnnotation", "ViewAnnotation", "make", "props", "Schema", "Capability", "View", "Operation", "TypeInputOptionsAnnotation", "trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "screenshots", "PivotColumnAnnotationId", "Symbol", "for", "SettingsSchema", "Struct", "columnFieldId", "String", "annotations", "title", "CreateKanbanSchema", "name", "optional", "typename", "pipe", "TypeInputOptionsAnnotation", "set", "location", "kind", "registered", "initialPivotColumn", "KANBAN_OPERATION", "meta", "id", "KanbanOperation", "DeleteCardFieldOutput", "field", "View", "FieldSchema", "description", "props", "Any", "index", "Number", "DeleteCardField", "Operation", "make", "key", "services", "Capability", "Service", "schema", "input", "view", "fieldId", "output", "DeleteCardOutput", "card", "DeleteCard", "RestoreCardField", "Void", "RestoreCard"]
7
+ }
@@ -0,0 +1,386 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ UNCATEGORIZED_VALUE
4
+ } from "./chunk-4AWDHQVY.mjs";
5
+
6
+ // src/hooks/useEchoChangeCallback.ts
7
+ import { useMemo } from "react";
8
+ import { Obj } from "@dxos/echo";
9
+ var createEchoChangeCallback = (kanban) => ({
10
+ kanban: (mutate) => Obj.change(kanban, (kanban2) => mutate(kanban2)),
11
+ setItemField: (item, field, value) => {
12
+ Obj.change(item, (item2) => {
13
+ item2[field] = value;
14
+ });
15
+ }
16
+ });
17
+ var useEchoChangeCallback = (kanban) => useMemo(() => kanban ? createEchoChangeCallback(kanban) : null, [
18
+ kanban
19
+ ]);
20
+
21
+ // src/hooks/useProjectionModel.ts
22
+ import { useState } from "react";
23
+ import { JsonSchema, Type } from "@dxos/echo";
24
+ import { log } from "@dxos/log";
25
+ import { useAsyncEffect } from "@dxos/react-ui";
26
+ import { ProjectionModel, createEchoChangeCallback as createEchoChangeCallback2 } from "@dxos/schema";
27
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/hooks/useProjectionModel.ts";
28
+ var useProjectionModel = (schema, kanban, registry) => {
29
+ const [projection, setProjection] = useState();
30
+ useAsyncEffect(async (controller) => {
31
+ if (!schema || !kanban) {
32
+ return;
33
+ }
34
+ try {
35
+ const view = await kanban.view.load();
36
+ if (controller.signal.aborted) {
37
+ return;
38
+ }
39
+ const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);
40
+ const change = createEchoChangeCallback2(view, Type.isMutable(schema) ? schema : void 0);
41
+ const projection2 = new ProjectionModel({
42
+ registry,
43
+ view,
44
+ baseSchema: jsonSchema,
45
+ change
46
+ });
47
+ projection2.normalizeView();
48
+ if (!controller.signal.aborted) {
49
+ setProjection(projection2);
50
+ }
51
+ } catch (err) {
52
+ log.catch(err, {
53
+ schema,
54
+ kanban
55
+ }, {
56
+ F: __dxlog_file,
57
+ L: 51,
58
+ S: void 0,
59
+ C: (f, a) => f(...a)
60
+ });
61
+ }
62
+ }, [
63
+ schema,
64
+ kanban,
65
+ registry
66
+ ]);
67
+ return projection;
68
+ };
69
+
70
+ // src/hooks/useKanbanBoardModel.ts
71
+ import { Atom } from "@effect-atom/atom-react";
72
+ import { useMemo as useMemo2 } from "react";
73
+ import { Obj as Obj2 } from "@dxos/echo";
74
+ import { AtomObj } from "@dxos/echo-atom";
75
+
76
+ // src/util/arrangement.ts
77
+ var getOrderFromArrangement = (arrangement) => {
78
+ const order = arrangement?.order;
79
+ if (order != null && order.length > 0) {
80
+ return [
81
+ ...order
82
+ ];
83
+ }
84
+ return [];
85
+ };
86
+ var getOrderByColumnFromArrangement = (arrangement) => {
87
+ const columns = arrangement?.columns;
88
+ if (columns != null && Object.keys(columns).length > 0) {
89
+ return Object.fromEntries(Object.entries(columns).map(([key, entry]) => [
90
+ key,
91
+ {
92
+ ids: [
93
+ ...entry.ids ?? []
94
+ ],
95
+ ...entry.hidden !== void 0 && {
96
+ hidden: entry.hidden
97
+ }
98
+ }
99
+ ]));
100
+ }
101
+ return {};
102
+ };
103
+ var computeColumnStructure = (effectiveOrder, effectiveByColumn, selectOptions) => {
104
+ const order = [
105
+ ...effectiveOrder
106
+ ];
107
+ if (!order.includes(UNCATEGORIZED_VALUE)) {
108
+ order.unshift(UNCATEGORIZED_VALUE);
109
+ }
110
+ for (const opt of selectOptions) {
111
+ if (opt.id !== UNCATEGORIZED_VALUE && !order.includes(opt.id)) {
112
+ order.push(opt.id);
113
+ }
114
+ }
115
+ return order.map((columnValue) => ({
116
+ columnValue,
117
+ ids: effectiveByColumn[columnValue]?.ids ?? []
118
+ }));
119
+ };
120
+ var orderItemsInColumn = (items, ids, columnValue, pivotPath, validColumnValues) => {
121
+ const orderMap = new Map(ids.map((id, index) => [
122
+ id,
123
+ index
124
+ ]));
125
+ const cardsWithExistingOrder = [];
126
+ const newCards = [];
127
+ for (const item of items) {
128
+ const itemColumn = pivotPath !== void 0 ? item[pivotPath] : void 0;
129
+ const isValidColumn = itemColumn != null && validColumnValues.has(itemColumn);
130
+ const belongsInColumn = columnValue === UNCATEGORIZED_VALUE ? !isValidColumn : itemColumn === columnValue;
131
+ if (belongsInColumn) {
132
+ (orderMap.has(item.id) ? cardsWithExistingOrder : newCards).push(item);
133
+ }
134
+ }
135
+ cardsWithExistingOrder.sort((a, b) => {
136
+ const indexA = orderMap.get(a.id) ?? Infinity;
137
+ const indexB = orderMap.get(b.id) ?? Infinity;
138
+ return indexA - indexB;
139
+ });
140
+ return [
141
+ ...cardsWithExistingOrder,
142
+ ...newCards
143
+ ];
144
+ };
145
+
146
+ // src/hooks/useKanbanBoardModel.ts
147
+ function useKanbanBoardModel(kanban, projection, itemsAtom, registry) {
148
+ const arrangementAtom = useMemo2(() => AtomObj.makeProperty(kanban, "arrangement"), [
149
+ kanban
150
+ ]);
151
+ const viewSnapshotAtom = useMemo2(() => kanban?.view ? AtomObj.make(kanban.view) : Atom.make(() => void 0), [
152
+ kanban?.view
153
+ ]);
154
+ const pivotFieldIdAtom = useMemo2(() => Atom.make((get) => get(viewSnapshotAtom)?.projection?.pivotFieldId), [
155
+ viewSnapshotAtom
156
+ ]);
157
+ const effectiveByColumnAtom = useMemo2(() => Atom.make((get) => getOrderByColumnFromArrangement(get(arrangementAtom))), [
158
+ arrangementAtom
159
+ ]);
160
+ const columnsAtom = useMemo2(() => Atom.make((get) => {
161
+ const pivotFieldId = get(pivotFieldIdAtom);
162
+ if (pivotFieldId === void 0) {
163
+ return [];
164
+ }
165
+ get(projection.fields);
166
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
167
+ if (!fieldProj) {
168
+ return [];
169
+ }
170
+ const selectOptions = fieldProj.props.options ?? [];
171
+ if (selectOptions.length === 0) {
172
+ return [];
173
+ }
174
+ const arrangement = get(arrangementAtom);
175
+ const order = getOrderFromArrangement(arrangement);
176
+ const byColumn = getOrderByColumnFromArrangement(arrangement);
177
+ return computeColumnStructure(order, byColumn, selectOptions);
178
+ }), [
179
+ pivotFieldIdAtom,
180
+ arrangementAtom,
181
+ projection
182
+ ]);
183
+ const columnArrangementAtomFamily = useMemo2(() => Atom.family((columnValue) => Atom.make((get) => {
184
+ const byColumn = get(effectiveByColumnAtom);
185
+ return {
186
+ columnValue,
187
+ ids: [
188
+ ...byColumn[columnValue]?.ids ?? []
189
+ ]
190
+ };
191
+ })), [
192
+ effectiveByColumnAtom
193
+ ]);
194
+ const itemsAtomFamily = useMemo2(() => Atom.family((columnValue) => Atom.make((get) => {
195
+ const columnArr = get(columnArrangementAtomFamily(columnValue));
196
+ const allItems = get(itemsAtom);
197
+ const pivotFieldId = get(pivotFieldIdAtom);
198
+ if (pivotFieldId === void 0) {
199
+ return [];
200
+ }
201
+ get(projection.fields);
202
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
203
+ if (!fieldProj) {
204
+ return [];
205
+ }
206
+ const selectOptions = fieldProj.props.options ?? [];
207
+ const pivotPath = fieldProj.props.property;
208
+ const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
209
+ return orderItemsInColumn(allItems, columnArr.ids, columnValue, pivotPath, validColumnValues);
210
+ })), [
211
+ columnArrangementAtomFamily,
212
+ itemsAtom,
213
+ pivotFieldIdAtom,
214
+ projection
215
+ ]);
216
+ return useMemo2(() => ({
217
+ getColumnId: (data) => data.columnValue,
218
+ getItemId: (data) => data.id,
219
+ isColumn: (obj) => typeof obj === "object" && obj !== null && "columnValue" in obj && "ids" in obj,
220
+ // TODO(wittjosiah): This should be restricted to objects of the type of the kanban view.
221
+ isItem: (obj) => Obj2.isObject(obj),
222
+ columns: columnsAtom,
223
+ items: (column) => itemsAtomFamily(column.columnValue),
224
+ getColumns: () => registry.get(columnsAtom) ?? [],
225
+ getItems: (column) => registry.get(itemsAtomFamily(column.columnValue)) ?? []
226
+ }), [
227
+ columnsAtom,
228
+ itemsAtomFamily,
229
+ registry
230
+ ]);
231
+ }
232
+
233
+ // src/hooks/useKanbanColumnEventHandler.ts
234
+ import { useMemo as useMemo3 } from "react";
235
+ import { arrayMove } from "@dxos/util";
236
+ function useKanbanColumnEventHandler({ id, model, projection, pivotFieldId, change }) {
237
+ return useMemo3(() => ({
238
+ id,
239
+ canDrop: ({ source }) => {
240
+ if (!projection) {
241
+ return false;
242
+ }
243
+ const data = source.data;
244
+ const columnValue = model.getColumnId(data);
245
+ return model.isColumn(source.data) && columnValue !== UNCATEGORIZED_VALUE && source.id !== UNCATEGORIZED_VALUE;
246
+ },
247
+ onDrop: ({ source, target }) => {
248
+ if (!projection || pivotFieldId === void 0) {
249
+ return;
250
+ }
251
+ const sourceColumnData = source.data;
252
+ const sourceColumnId = model.getColumnId(sourceColumnData);
253
+ if (sourceColumnId === UNCATEGORIZED_VALUE) {
254
+ return;
255
+ }
256
+ const currentColumns = model.getColumns();
257
+ const sourceIndex = currentColumns.findIndex((c) => model.getColumnId(c) === sourceColumnId);
258
+ if (sourceIndex === -1) {
259
+ return;
260
+ }
261
+ let targetIndex;
262
+ if (target?.type === "tile" || target?.type === "placeholder") {
263
+ targetIndex = typeof target.location === "number" ? Math.floor(target.location) : -1;
264
+ } else if (target?.type === "container") {
265
+ targetIndex = currentColumns.length;
266
+ } else {
267
+ return;
268
+ }
269
+ if (targetIndex < 0) {
270
+ return;
271
+ }
272
+ const currentColumnIds = currentColumns.map((c) => model.getColumnId(c));
273
+ const reorderedColumnIds = arrayMove([
274
+ ...currentColumnIds
275
+ ], sourceIndex, targetIndex);
276
+ const fieldProjection = projection.getFieldProjection(pivotFieldId);
277
+ const currentOptions = [
278
+ ...fieldProjection.props.options ?? []
279
+ ];
280
+ const optionsInNewOrder = reorderedColumnIds.map((columnId) => currentOptions.find((o) => o.id === columnId)).filter((o) => o != null);
281
+ projection.setFieldProjection({
282
+ ...fieldProjection,
283
+ props: {
284
+ ...fieldProjection.props,
285
+ options: optionsInNewOrder
286
+ }
287
+ });
288
+ change.kanban((kanban) => {
289
+ kanban.arrangement.order = reorderedColumnIds.filter((columnId) => columnId !== UNCATEGORIZED_VALUE);
290
+ });
291
+ }
292
+ }), [
293
+ id,
294
+ model,
295
+ projection,
296
+ pivotFieldId,
297
+ change
298
+ ]);
299
+ }
300
+
301
+ // src/hooks/useKanbanItemEventHandler.ts
302
+ import { useMemo as useMemo4 } from "react";
303
+ function findColumn(id, arrangement) {
304
+ return arrangement.find(({ columnValue, cards }) => columnValue === id || cards.some((card) => card.id === id));
305
+ }
306
+ function useKanbanItemEventHandler({ column, columnFieldPath, model, change }) {
307
+ return useMemo4(() => ({
308
+ id: column.columnValue,
309
+ canDrop: ({ source }) => model.isItem(source.data),
310
+ onTake: ({ source }, cb) => {
311
+ void cb(source.data);
312
+ },
313
+ onDrop: ({ source, target }) => {
314
+ const columns = model.getColumns();
315
+ const currentArrangement = columns.map((col) => ({
316
+ columnValue: col.columnValue,
317
+ cards: model.getItems(col) ?? []
318
+ }));
319
+ const sourceColumnInSnapshot = findColumn(source.id, currentArrangement);
320
+ if (!sourceColumnInSnapshot) {
321
+ return;
322
+ }
323
+ const workingArrangement = currentArrangement.map((col) => ({
324
+ columnValue: col.columnValue,
325
+ cards: [
326
+ ...col.cards
327
+ ]
328
+ }));
329
+ const sourceColumnInWorking = workingArrangement.find((c) => c.columnValue === sourceColumnInSnapshot.columnValue || c.cards.some((card) => card.id === source.id));
330
+ const targetColumnInWorking = workingArrangement.find((c) => c.columnValue === column.columnValue);
331
+ if (!sourceColumnInWorking || !targetColumnInWorking) {
332
+ return;
333
+ }
334
+ const sourceIndex = sourceColumnInWorking.cards.findIndex((card) => card.id === source.id);
335
+ if (sourceIndex === -1) {
336
+ return;
337
+ }
338
+ const [movedCard] = sourceColumnInWorking.cards.splice(sourceIndex, 1);
339
+ if (columnFieldPath !== void 0) {
340
+ const newValue = targetColumnInWorking.columnValue === UNCATEGORIZED_VALUE ? void 0 : targetColumnInWorking.columnValue;
341
+ change.setItemField(movedCard, columnFieldPath, newValue);
342
+ }
343
+ const existingTargetIndex = target?.type === "tile" ? targetColumnInWorking.cards.findIndex((card) => model.getItemId(card) === target.id) : -1;
344
+ const closestEdge = target?.type === "placeholder" && typeof target.location === "number" ? target.location <= targetColumnInWorking.cards.length / 2 ? "top" : "bottom" : "bottom";
345
+ let insertIndex;
346
+ if (target?.type === "placeholder" && typeof target.location === "number") {
347
+ insertIndex = Math.max(0, Math.min(targetColumnInWorking.cards.length, Math.floor(target.location)));
348
+ } else if (target?.type === "container" || existingTargetIndex === -1) {
349
+ insertIndex = targetColumnInWorking.cards.length;
350
+ } else if (sourceColumnInWorking.columnValue === targetColumnInWorking.columnValue) {
351
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
352
+ if (sourceIndex < existingTargetIndex) {
353
+ insertIndex -= 1;
354
+ }
355
+ } else {
356
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
357
+ }
358
+ targetColumnInWorking.cards.splice(insertIndex, 0, movedCard);
359
+ change.kanban((kanban) => {
360
+ kanban.arrangement = {
361
+ order: workingArrangement.map(({ columnValue }) => columnValue),
362
+ columns: Object.fromEntries(workingArrangement.map(({ columnValue, cards }) => [
363
+ columnValue,
364
+ {
365
+ ids: cards.map((c) => c.id)
366
+ }
367
+ ]))
368
+ };
369
+ });
370
+ }
371
+ }), [
372
+ column,
373
+ columnFieldPath,
374
+ model,
375
+ change
376
+ ]);
377
+ }
378
+
379
+ export {
380
+ useEchoChangeCallback,
381
+ useKanbanBoardModel,
382
+ useKanbanColumnEventHandler,
383
+ useKanbanItemEventHandler,
384
+ useProjectionModel
385
+ };
386
+ //# sourceMappingURL=chunk-CSL3HF2X.mjs.map