@dxos/plugin-kanban 0.9.1-staging.ee54ba693a → 0.11.0
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.
- package/dist/lib/KanbanPlugin.mjs +18 -0
- package/dist/lib/KanbanPlugin.mjs.map +1 -0
- package/dist/lib/KanbanPlugin.node.mjs +11 -0
- package/dist/lib/KanbanPlugin.node.mjs.map +1 -0
- package/dist/lib/KanbanPlugin.workerd.mjs +11 -0
- package/dist/lib/KanbanPlugin.workerd.mjs.map +1 -0
- package/dist/lib/capabilities/node.mjs +10 -0
- package/dist/lib/capabilities/node.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +11 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-KanbanArticle.mjs +121 -0
- package/dist/lib/chunk-KanbanArticle.mjs.map +1 -0
- package/dist/lib/chunk-KanbanProperties.mjs +73 -0
- package/dist/lib/chunk-KanbanProperties.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +42 -0
- package/dist/lib/chunk-create-object.mjs.map +1 -0
- package/dist/lib/chunk-delete-card-field.mjs +50 -0
- package/dist/lib/chunk-delete-card-field.mjs.map +1 -0
- package/dist/lib/chunk-delete-card.mjs +23 -0
- package/dist/lib/chunk-delete-card.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-V4AVOJVU.mjs → chunk-meta.mjs} +21 -29
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +11 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +67 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-restore-card-field.mjs +48 -0
- package/dist/lib/chunk-restore-card-field.mjs.map +1 -0
- package/dist/lib/chunk-restore-card.mjs +22 -0
- package/dist/lib/chunk-restore-card.mjs.map +1 -0
- package/dist/lib/chunk-skill-definition.mjs +10 -0
- package/dist/lib/chunk-skill-definition.mjs.map +1 -0
- package/dist/lib/chunk-skills.mjs +20 -0
- package/dist/lib/chunk-skills.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +231 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/chunk-undo-mappings.mjs +25 -0
- package/dist/lib/chunk-undo-mappings.mjs.map +1 -0
- package/dist/lib/components.mjs +227 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +8 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/hooks.mjs +394 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +5 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/operations.mjs +7 -0
- package/dist/lib/operations.mjs.map +1 -0
- package/dist/lib/plugin.mjs +9 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/skills.mjs +2 -0
- package/dist/lib/testing.mjs +72 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/lib/translations.mjs +38 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/src/capabilities/PivotColumnField.d.ts +12 -0
- package/dist/types/src/capabilities/PivotColumnField.d.ts.map +1 -0
- package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -1
- package/dist/types/src/capabilities/node.d.ts +7 -0
- package/dist/types/src/capabilities/node.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/undo-mappings.d.ts +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +3 -4
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/index.d.ts +1 -0
- package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts +4 -1
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanProperties/KanbanProperties.d.ts +4 -8
- package/dist/types/src/containers/KanbanProperties/KanbanProperties.d.ts.map +1 -1
- package/dist/types/src/hooks/useKanbanBoardModel.d.ts +1 -1
- package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -1
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +4 -3
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -1
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +4 -3
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
- package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +1 -0
- package/package.json +58 -51
- package/src/capabilities/PivotColumnField.tsx +56 -0
- package/src/capabilities/node.ts +18 -0
- package/src/capabilities/react-surface.ts +45 -0
- package/src/components/KanbanBoard/KanbanBoard.stories.tsx +15 -4
- package/src/components/KanbanBoard/KanbanBoard.tsx +0 -3
- package/src/components/KanbanBoard/KanbanCard.tsx +5 -3
- package/src/components/KanbanBoard/index.ts +2 -0
- package/src/containers/KanbanArticle/KanbanArticle.stories.tsx +2 -1
- package/src/containers/KanbanArticle/KanbanArticle.tsx +3 -1
- package/src/containers/KanbanProperties/KanbanProperties.tsx +3 -1
- package/src/hooks/useItemsProjection.ts +1 -1
- package/src/hooks/useKanbanBoardModel.browser.test.ts +1 -1
- package/src/hooks/useKanbanBoardModel.ts +1 -1
- package/src/hooks/useKanbanColumnEventHandler.ts +6 -5
- package/src/hooks/useKanbanItemEventHandler.ts +6 -7
- package/src/hooks/useProjectionModel.ts +1 -1
- package/src/testing/KanbanCardTileSimple.tsx +2 -1
- package/dist/lib/neutral/KanbanArticle-JQMQQHRB.mjs +0 -132
- package/dist/lib/neutral/KanbanArticle-JQMQQHRB.mjs.map +0 -7
- package/dist/lib/neutral/KanbanPlugin.mjs +0 -44
- package/dist/lib/neutral/KanbanPlugin.mjs.map +0 -7
- package/dist/lib/neutral/KanbanPlugin.node.mjs +0 -27
- package/dist/lib/neutral/KanbanPlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/KanbanPlugin.workerd.mjs +0 -21
- package/dist/lib/neutral/KanbanPlugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/KanbanProperties-W7MZNZVJ.mjs +0 -83
- package/dist/lib/neutral/KanbanProperties-W7MZNZVJ.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -17
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7TVVF45P.mjs +0 -247
- package/dist/lib/neutral/chunk-7TVVF45P.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7YLGUKDJ.mjs +0 -8
- package/dist/lib/neutral/chunk-7YLGUKDJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CFPH5R6P.mjs +0 -26
- package/dist/lib/neutral/chunk-CFPH5R6P.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-V4AVOJVU.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -245
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -11
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/create-object-DIIFRS57.mjs +0 -45
- package/dist/lib/neutral/create-object-DIIFRS57.mjs.map +0 -7
- package/dist/lib/neutral/delete-card-TK2G6YHX.mjs +0 -24
- package/dist/lib/neutral/delete-card-TK2G6YHX.mjs.map +0 -7
- package/dist/lib/neutral/delete-card-field-LGWPBOUW.mjs +0 -39
- package/dist/lib/neutral/delete-card-field-LGWPBOUW.mjs.map +0 -7
- package/dist/lib/neutral/hooks/index.mjs +0 -431
- package/dist/lib/neutral/hooks/index.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -34
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -8
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +0 -13
- package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +0 -7
- package/dist/lib/neutral/operations/index.mjs +0 -8
- package/dist/lib/neutral/operations/index.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -16
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-FQGXRR3X.mjs +0 -89
- package/dist/lib/neutral/react-surface-FQGXRR3X.mjs.map +0 -7
- package/dist/lib/neutral/restore-card-3O6PVN7J.mjs +0 -21
- package/dist/lib/neutral/restore-card-3O6PVN7J.mjs.map +0 -7
- package/dist/lib/neutral/restore-card-field-5G4DVYYY.mjs +0 -37
- package/dist/lib/neutral/restore-card-field-5G4DVYYY.mjs.map +0 -7
- package/dist/lib/neutral/skill-definition-YGTCKXGP.mjs +0 -15
- package/dist/lib/neutral/skill-definition-YGTCKXGP.mjs.map +0 -7
- package/dist/lib/neutral/skills/index.mjs +0 -8
- package/dist/lib/neutral/skills/index.mjs.map +0 -7
- package/dist/lib/neutral/testing/index.mjs +0 -64
- package/dist/lib/neutral/testing/index.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -44
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -22
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/dist/lib/neutral/undo-mappings-EZTHO4UL.mjs +0 -42
- package/dist/lib/neutral/undo-mappings-EZTHO4UL.mjs.map +0 -7
- package/src/capabilities/react-surface.tsx +0 -95
package/dx.config.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-kanban",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Kanban DXOS Surface plugin",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,37 +16,41 @@
|
|
|
16
16
|
"#skills": {
|
|
17
17
|
"source": "./src/skills/index.ts",
|
|
18
18
|
"types": "./dist/types/src/skills/index.d.ts",
|
|
19
|
-
"default": "./dist/lib/
|
|
19
|
+
"default": "./dist/lib/skills.mjs"
|
|
20
20
|
},
|
|
21
21
|
"#capabilities": {
|
|
22
|
-
"source":
|
|
22
|
+
"source": {
|
|
23
|
+
"node": "./src/capabilities/node.ts",
|
|
24
|
+
"default": "./src/capabilities/index.ts"
|
|
25
|
+
},
|
|
23
26
|
"types": "./dist/types/src/capabilities/index.d.ts",
|
|
24
|
-
"
|
|
27
|
+
"node": "./dist/lib/capabilities/node.mjs",
|
|
28
|
+
"default": "./dist/lib/capabilities.mjs"
|
|
25
29
|
},
|
|
26
30
|
"#components": {
|
|
27
31
|
"source": "./src/components/index.ts",
|
|
28
32
|
"types": "./dist/types/src/components/index.d.ts",
|
|
29
|
-
"default": "./dist/lib/
|
|
33
|
+
"default": "./dist/lib/components.mjs"
|
|
30
34
|
},
|
|
31
35
|
"#containers": {
|
|
32
36
|
"source": "./src/containers/index.ts",
|
|
33
37
|
"types": "./dist/types/src/containers/index.d.ts",
|
|
34
|
-
"default": "./dist/lib/
|
|
38
|
+
"default": "./dist/lib/containers.mjs"
|
|
35
39
|
},
|
|
36
40
|
"#hooks": {
|
|
37
41
|
"source": "./src/hooks/index.ts",
|
|
38
42
|
"types": "./dist/types/src/hooks/index.d.ts",
|
|
39
|
-
"default": "./dist/lib/
|
|
43
|
+
"default": "./dist/lib/hooks.mjs"
|
|
40
44
|
},
|
|
41
45
|
"#meta": {
|
|
42
46
|
"source": "./src/meta.ts",
|
|
43
47
|
"types": "./dist/types/src/meta.d.ts",
|
|
44
|
-
"default": "./dist/lib/
|
|
48
|
+
"default": "./dist/lib/meta.mjs"
|
|
45
49
|
},
|
|
46
50
|
"#operations": {
|
|
47
51
|
"source": "./src/operations/index.ts",
|
|
48
52
|
"types": "./dist/types/src/operations/index.d.ts",
|
|
49
|
-
"default": "./dist/lib/
|
|
53
|
+
"default": "./dist/lib/operations.mjs"
|
|
50
54
|
},
|
|
51
55
|
"#plugin": {
|
|
52
56
|
"source": {
|
|
@@ -55,48 +59,48 @@
|
|
|
55
59
|
"default": "./src/KanbanPlugin.tsx"
|
|
56
60
|
},
|
|
57
61
|
"types": "./dist/types/src/KanbanPlugin.d.ts",
|
|
58
|
-
"workerd": "./dist/lib/
|
|
59
|
-
"node": "./dist/lib/
|
|
60
|
-
"default": "./dist/lib/
|
|
62
|
+
"workerd": "./dist/lib/KanbanPlugin.workerd.mjs",
|
|
63
|
+
"node": "./dist/lib/KanbanPlugin.node.mjs",
|
|
64
|
+
"default": "./dist/lib/KanbanPlugin.mjs"
|
|
61
65
|
},
|
|
62
66
|
"#testing": "./src/testing/index.ts",
|
|
63
67
|
"#translations": {
|
|
64
68
|
"source": "./src/translations.ts",
|
|
65
69
|
"types": "./dist/types/src/translations.d.ts",
|
|
66
|
-
"default": "./dist/lib/
|
|
70
|
+
"default": "./dist/lib/translations.mjs"
|
|
67
71
|
},
|
|
68
72
|
"#types": {
|
|
69
73
|
"source": "./src/types/index.ts",
|
|
70
74
|
"types": "./dist/types/src/types/index.d.ts",
|
|
71
|
-
"default": "./dist/lib/
|
|
75
|
+
"default": "./dist/lib/types.mjs"
|
|
72
76
|
}
|
|
73
77
|
},
|
|
74
78
|
"exports": {
|
|
75
79
|
".": {
|
|
76
80
|
"source": "./src/index.ts",
|
|
77
81
|
"types": "./dist/types/src/index.d.ts",
|
|
78
|
-
"
|
|
82
|
+
"import": "./dist/lib/index.mjs"
|
|
79
83
|
},
|
|
80
84
|
"./assets/PLUGIN.mdl": "./PLUGIN.mdl",
|
|
81
85
|
"./skills": {
|
|
82
86
|
"source": "./src/skills/index.ts",
|
|
83
87
|
"types": "./dist/types/src/skills/index.d.ts",
|
|
84
|
-
"
|
|
88
|
+
"import": "./dist/lib/skills.mjs"
|
|
85
89
|
},
|
|
86
90
|
"./plugin": {
|
|
87
91
|
"source": "./src/plugin.ts",
|
|
88
92
|
"types": "./dist/types/src/plugin.d.ts",
|
|
89
|
-
"
|
|
93
|
+
"import": "./dist/lib/plugin.mjs"
|
|
90
94
|
},
|
|
91
95
|
"./translations": {
|
|
92
96
|
"source": "./src/translations.ts",
|
|
93
97
|
"types": "./dist/types/src/translations.d.ts",
|
|
94
|
-
"
|
|
98
|
+
"import": "./dist/lib/translations.mjs"
|
|
95
99
|
},
|
|
96
100
|
"./types": {
|
|
97
101
|
"source": "./src/types/index.ts",
|
|
98
102
|
"types": "./dist/types/src/types/index.d.ts",
|
|
99
|
-
"
|
|
103
|
+
"import": "./dist/lib/types.mjs"
|
|
100
104
|
}
|
|
101
105
|
},
|
|
102
106
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -107,52 +111,55 @@
|
|
|
107
111
|
"PLUGIN.mdl"
|
|
108
112
|
],
|
|
109
113
|
"dependencies": {
|
|
114
|
+
"@effect-atom/atom": "^0.5.3",
|
|
110
115
|
"@effect-atom/atom-react": "^0.5.0",
|
|
111
116
|
"@radix-ui/react-context": "1.1.1",
|
|
112
117
|
"effect": "3.21.4",
|
|
113
|
-
"@dxos/ai": "0.
|
|
114
|
-
"@dxos/app-framework": "0.
|
|
115
|
-
"@dxos/
|
|
116
|
-
"@dxos/
|
|
117
|
-
"@dxos/
|
|
118
|
-
"@dxos/
|
|
119
|
-
"@dxos/
|
|
120
|
-
"@dxos/
|
|
121
|
-
"@dxos/
|
|
122
|
-
"@dxos/
|
|
123
|
-
"@dxos/plugin-client": "0.
|
|
124
|
-
"@dxos/
|
|
125
|
-
"@dxos/
|
|
126
|
-
"@dxos/react-
|
|
127
|
-
"@dxos/react-ui
|
|
128
|
-
"@dxos/react-ui-
|
|
129
|
-
"@dxos/
|
|
130
|
-
"@dxos/
|
|
131
|
-
"@dxos/
|
|
132
|
-
"@dxos/
|
|
118
|
+
"@dxos/ai": "0.11.0",
|
|
119
|
+
"@dxos/app-framework": "0.11.0",
|
|
120
|
+
"@dxos/app-toolkit": "0.11.0",
|
|
121
|
+
"@dxos/assistant": "0.11.0",
|
|
122
|
+
"@dxos/compute": "0.11.0",
|
|
123
|
+
"@dxos/echo": "0.11.0",
|
|
124
|
+
"@dxos/echo-react": "0.11.0",
|
|
125
|
+
"@dxos/effect": "0.11.0",
|
|
126
|
+
"@dxos/invariant": "0.11.0",
|
|
127
|
+
"@dxos/log": "0.11.0",
|
|
128
|
+
"@dxos/plugin-client": "0.11.0",
|
|
129
|
+
"@dxos/plugin-space": "0.11.0",
|
|
130
|
+
"@dxos/random": "0.11.0",
|
|
131
|
+
"@dxos/react-client": "0.11.0",
|
|
132
|
+
"@dxos/react-ui": "0.11.0",
|
|
133
|
+
"@dxos/react-ui-dnd": "0.11.0",
|
|
134
|
+
"@dxos/react-ui-form": "0.11.0",
|
|
135
|
+
"@dxos/react-ui-menu": "0.11.0",
|
|
136
|
+
"@dxos/react-ui-mosaic": "0.11.0",
|
|
137
|
+
"@dxos/schema": "0.11.0",
|
|
138
|
+
"@dxos/types": "0.11.0",
|
|
139
|
+
"@dxos/util": "0.11.0"
|
|
133
140
|
},
|
|
134
141
|
"devDependencies": {
|
|
135
142
|
"@types/react": "~19.2.17",
|
|
136
143
|
"@types/react-dom": "~19.2.3",
|
|
137
144
|
"react": "~19.2.7",
|
|
138
145
|
"react-dom": "~19.2.7",
|
|
139
|
-
"vite": "^8.
|
|
140
|
-
"@dxos/
|
|
141
|
-
"@dxos/
|
|
142
|
-
"@dxos/plugin-preview": "0.
|
|
143
|
-
"@dxos/plugin-testing": "0.
|
|
144
|
-
"@dxos/plugin-theme": "0.
|
|
145
|
-
"@dxos/react-ui-syntax-highlighter": "0.
|
|
146
|
-
"@dxos/
|
|
147
|
-
"@dxos/
|
|
148
|
-
"@dxos/
|
|
146
|
+
"vite": "^8.1.4",
|
|
147
|
+
"@dxos/echo-client": "0.11.0",
|
|
148
|
+
"@dxos/keys": "0.11.0",
|
|
149
|
+
"@dxos/plugin-preview": "0.11.0",
|
|
150
|
+
"@dxos/plugin-testing": "0.11.0",
|
|
151
|
+
"@dxos/plugin-theme": "0.11.0",
|
|
152
|
+
"@dxos/react-ui-syntax-highlighter": "0.11.0",
|
|
153
|
+
"@dxos/storybook-utils": "0.11.0",
|
|
154
|
+
"@dxos/test-utils": "0.11.0",
|
|
155
|
+
"@dxos/ui-theme": "0.11.0"
|
|
149
156
|
},
|
|
150
157
|
"peerDependencies": {
|
|
151
158
|
"effect": "3.21.4",
|
|
152
159
|
"react": "~19.2.7",
|
|
153
160
|
"react-dom": "~19.2.7",
|
|
154
|
-
"@dxos/ui
|
|
155
|
-
"@dxos/
|
|
161
|
+
"@dxos/react-ui": "^0.11.0",
|
|
162
|
+
"@dxos/ui-theme": "^0.11.0"
|
|
156
163
|
},
|
|
157
164
|
"publishConfig": {
|
|
158
165
|
"access": "public"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { type Surface } from '@dxos/app-framework/ui';
|
|
8
|
+
import { type AppSurface } from '@dxos/app-toolkit/ui';
|
|
9
|
+
import { Database, Obj, Type } from '@dxos/echo';
|
|
10
|
+
import { type FormFieldRendererProps, SelectField, useFormValues } from '@dxos/react-ui-form';
|
|
11
|
+
|
|
12
|
+
/** The form renderer's own props ride alongside `data` on the surface envelope; `type` comes from the field AST. */
|
|
13
|
+
export type PivotColumnFieldProps = Surface.ComponentProps<AppSurface.FormInputData> &
|
|
14
|
+
Omit<FormFieldRendererProps, 'type'>;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Form field offering the single-select properties of the form's currently chosen typename as the
|
|
18
|
+
* kanban's pivot column. It consumes the whole surface envelope, so it takes no `props` mapper.
|
|
19
|
+
*/
|
|
20
|
+
export const PivotColumnField = ({ data, ...inputProps }: PivotColumnFieldProps) => {
|
|
21
|
+
const ast = data.fieldPropertyAst;
|
|
22
|
+
const target = data.target;
|
|
23
|
+
const db = Database.isDatabase(target) ? target : Obj.isObject(target) ? Obj.getDatabase(target) : undefined;
|
|
24
|
+
const { typename } = useFormValues('KanbanForm');
|
|
25
|
+
const [selectedSchema] = useMemo(
|
|
26
|
+
() =>
|
|
27
|
+
db
|
|
28
|
+
? db.graph.registry
|
|
29
|
+
.list()
|
|
30
|
+
.filter(Type.isType)
|
|
31
|
+
.filter((type) => Type.getTypename(type) === typename)
|
|
32
|
+
: [],
|
|
33
|
+
[db, typename],
|
|
34
|
+
);
|
|
35
|
+
const singleSelectColumns = useMemo(() => {
|
|
36
|
+
const properties = selectedSchema?.jsonSchema.properties;
|
|
37
|
+
if (!properties) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return Object.entries(properties).reduce<string[]>((acc, [key, value]) => {
|
|
42
|
+
if (typeof value === 'object' && value !== null && (value as { format?: string }).format === 'single-select') {
|
|
43
|
+
acc.push(key);
|
|
44
|
+
}
|
|
45
|
+
return acc;
|
|
46
|
+
}, []);
|
|
47
|
+
}, [selectedSchema]);
|
|
48
|
+
|
|
49
|
+
if (!ast || !db || !typename) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const props: FormFieldRendererProps = { ...inputProps, type: ast };
|
|
54
|
+
|
|
55
|
+
return <SelectField {...props} options={singleSelectColumns.map((column) => ({ value: column }))} />;
|
|
56
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Capability } from '@dxos/app-framework';
|
|
6
|
+
import type { OperationHandlerSet } from '@dxos/compute';
|
|
7
|
+
|
|
8
|
+
// The capabilities `KanbanPlugin.node` activates, and only those. `Capability.lazy` defers the
|
|
9
|
+
// import at runtime but a bundler still walks it, so listing the React surfaces here would pull
|
|
10
|
+
// the plugin's components into every node and bun build.
|
|
11
|
+
|
|
12
|
+
export const SkillDefinition = Capability.lazy('SkillDefinition', () => import('./skill-definition'));
|
|
13
|
+
export const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));
|
|
14
|
+
export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
|
|
15
|
+
'OperationHandler',
|
|
16
|
+
() => import('./operation-handler'),
|
|
17
|
+
);
|
|
18
|
+
export const UndoMappings = Capability.lazy('UndoMappings', () => import('./undo-mappings'));
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
8
|
+
import { Surface } from '@dxos/app-framework/ui';
|
|
9
|
+
import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
10
|
+
import { SchemaEx } from '@dxos/effect';
|
|
11
|
+
import { Position } from '@dxos/util';
|
|
12
|
+
|
|
13
|
+
import { KanbanArticle, KanbanProperties } from '#containers';
|
|
14
|
+
import { Kanban, PivotColumnAnnotationId } from '#types';
|
|
15
|
+
|
|
16
|
+
import { PivotColumnField } from './PivotColumnField';
|
|
17
|
+
|
|
18
|
+
export default Capability.makeModule(() =>
|
|
19
|
+
Effect.succeed(
|
|
20
|
+
Capability.contributes(Capabilities.ReactSurface, [
|
|
21
|
+
Surface.create({
|
|
22
|
+
id: 'root',
|
|
23
|
+
// TODO(wittjosiah): Split into multiple surfaces if this filter proves too strict for non-article roles.
|
|
24
|
+
filter: AppSurface.oneOf(
|
|
25
|
+
AppSurface.object(AppSurface.Article, Kanban.Kanban),
|
|
26
|
+
AppSurface.object(AppSurface.Section, Kanban.Kanban),
|
|
27
|
+
),
|
|
28
|
+
component: KanbanArticle,
|
|
29
|
+
props: ({ role, data: { subject } }) => ({ role, subject }),
|
|
30
|
+
}),
|
|
31
|
+
Surface.create({
|
|
32
|
+
id: 'objectProperties',
|
|
33
|
+
position: Position.first,
|
|
34
|
+
filter: AppSurface.object(AppSurface.ObjectProperties, Kanban.Kanban),
|
|
35
|
+
component: KanbanProperties,
|
|
36
|
+
props: ({ data: { subject } }) => ({ subject }),
|
|
37
|
+
}),
|
|
38
|
+
Surface.create({
|
|
39
|
+
id: 'createInitialSchemaForm',
|
|
40
|
+
filter: AppSurface.formInputBySchema((ast) => !!SchemaEx.findAnnotation<boolean>(ast, PivotColumnAnnotationId)),
|
|
41
|
+
component: PivotColumnField,
|
|
42
|
+
}),
|
|
43
|
+
]),
|
|
44
|
+
),
|
|
45
|
+
);
|
|
@@ -10,7 +10,7 @@ import { Filter, JsonSchema, Obj, Query, type View } from '@dxos/echo';
|
|
|
10
10
|
import { random } from '@dxos/random';
|
|
11
11
|
import { withMosaic } from '@dxos/react-ui-mosaic/testing';
|
|
12
12
|
import { Loading, withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
13
|
-
import { ProjectionModel, ViewModel, createEchoChangeCallback } from '@dxos/schema';
|
|
13
|
+
import { ProjectionModel, ViewModel, createDirectChangeCallback, createEchoChangeCallback } from '@dxos/schema';
|
|
14
14
|
import { withRegistry } from '@dxos/storybook-utils';
|
|
15
15
|
import { Organization } from '@dxos/types';
|
|
16
16
|
|
|
@@ -46,9 +46,14 @@ const DefaultStory = () => {
|
|
|
46
46
|
}>();
|
|
47
47
|
|
|
48
48
|
useEffect(() => {
|
|
49
|
+
// Single mutable schema shared by the view, the projection base, and the change callback so
|
|
50
|
+
// schema mutations (e.g. reordering pivot-field options during a column drag) persist and read
|
|
51
|
+
// back. `createDirectChangeCallback` mutates it in place — the ECHO callback would throw
|
|
52
|
+
// "Schema is not mutable" for these non-ECHO, in-memory story objects.
|
|
53
|
+
const jsonSchema = JsonSchema.toJsonSchema(Organization.Organization);
|
|
49
54
|
const view = ViewModel.make({
|
|
50
55
|
query: Query.select(Filter.type(Organization.Organization)),
|
|
51
|
-
jsonSchema
|
|
56
|
+
jsonSchema,
|
|
52
57
|
pivotFieldName: 'status',
|
|
53
58
|
});
|
|
54
59
|
const kanban = Kanban.make({ view });
|
|
@@ -56,8 +61,14 @@ const DefaultStory = () => {
|
|
|
56
61
|
const projection = new ProjectionModel({
|
|
57
62
|
registry,
|
|
58
63
|
view,
|
|
59
|
-
baseSchema:
|
|
60
|
-
change:
|
|
64
|
+
baseSchema: jsonSchema,
|
|
65
|
+
// Hybrid change callback: the view is reactive (nested in the Kanban object) so its
|
|
66
|
+
// projection must be mutated via Obj.update, but the plain in-memory jsonSchema is
|
|
67
|
+
// mutated directly. Neither factory alone fits, so compose the correct mutator from each.
|
|
68
|
+
change: {
|
|
69
|
+
projection: createEchoChangeCallback(view).projection,
|
|
70
|
+
schema: createDirectChangeCallback(view.projection, jsonSchema).schema,
|
|
71
|
+
},
|
|
61
72
|
});
|
|
62
73
|
projection.normalizeView();
|
|
63
74
|
|
|
@@ -139,7 +139,6 @@ export const KanbanBoardContent = composable<HTMLDivElement, KanbanBoardContentP
|
|
|
139
139
|
<Board.Content
|
|
140
140
|
{...composableProps(props)}
|
|
141
141
|
ref={forwardedRef}
|
|
142
|
-
id={kanbanId}
|
|
143
142
|
eventHandler={columnEventHandler}
|
|
144
143
|
Tile={KanbanColumn}
|
|
145
144
|
/>
|
|
@@ -159,6 +158,4 @@ export const KanbanBoard = {
|
|
|
159
158
|
Card: KanbanCard,
|
|
160
159
|
};
|
|
161
160
|
|
|
162
|
-
export { useKanbanBoard };
|
|
163
|
-
|
|
164
161
|
export type { KanbanBoardRootProps as KanbanBoardProps, KanbanCardProps, KanbanColumnProps };
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import React, { forwardRef, useCallback, useMemo, useState } from 'react';
|
|
6
6
|
|
|
7
7
|
import { Surface } from '@dxos/app-framework/ui';
|
|
8
|
-
import { AppSurface, useObjectMenuItems } from '@dxos/app-toolkit/ui';
|
|
8
|
+
import { AppSurface, useCardPivot, useObjectMenuItems } from '@dxos/app-toolkit/ui';
|
|
9
9
|
import { Obj } from '@dxos/echo';
|
|
10
10
|
import { Card, IconButton, useTranslation } from '@dxos/react-ui';
|
|
11
11
|
import { Menu, createMenuAction } from '@dxos/react-ui-menu';
|
|
@@ -31,7 +31,9 @@ export const KanbanCard = forwardRef<HTMLDivElement, KanbanCardProps>(
|
|
|
31
31
|
const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);
|
|
32
32
|
const dragHandleRef = useCallback((el: HTMLButtonElement | null) => setDragHandle(el), []);
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
// Card.Root already takes the forwarded ref; walk from the header to resolve the origin plank.
|
|
35
|
+
const [cardRef, pivotId] = useCardPivot();
|
|
36
|
+
const objectMenuItems = useObjectMenuItems(data, pivotId);
|
|
35
37
|
|
|
36
38
|
const menuItems = useMemo(
|
|
37
39
|
() => [
|
|
@@ -61,7 +63,7 @@ export const KanbanCard = forwardRef<HTMLDivElement, KanbanCardProps>(
|
|
|
61
63
|
>
|
|
62
64
|
<Focus.Item asChild>
|
|
63
65
|
<Card.Root ref={forwardedRef} data-testid='board-item'>
|
|
64
|
-
<Card.Header>
|
|
66
|
+
<Card.Header ref={cardRef}>
|
|
65
67
|
<Card.DragHandle ref={dragHandleRef} testId='mosaicBoard.cardDragHandle' />
|
|
66
68
|
<Card.Title data-testid='mosaicBoard.cardTitle'>{Obj.getLabel(data)}</Card.Title>
|
|
67
69
|
{/* TODO(wittjosiah): Reconcile with Card.Menu. */}
|
|
@@ -12,6 +12,7 @@ import { withPluginManager } from '@dxos/app-framework/testing';
|
|
|
12
12
|
import { Surface } from '@dxos/app-framework/ui';
|
|
13
13
|
import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
14
14
|
import { Filter, Obj, type QueryAST, Type, View } from '@dxos/echo';
|
|
15
|
+
import { useQuery, useType } from '@dxos/echo-react';
|
|
15
16
|
import { type Mutable } from '@dxos/echo/Obj';
|
|
16
17
|
import { invariant } from '@dxos/invariant';
|
|
17
18
|
// `/plugin` entrypoints used here for the same reason as `corePlugins()` —
|
|
@@ -22,7 +23,7 @@ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
|
|
|
22
23
|
import { SpacePlugin } from '@dxos/plugin-space/testing';
|
|
23
24
|
import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
|
|
24
25
|
import { random } from '@dxos/random';
|
|
25
|
-
import { type Space,
|
|
26
|
+
import { type Space, useSpaces } from '@dxos/react-client/echo';
|
|
26
27
|
import { ViewEditor } from '@dxos/react-ui-form';
|
|
27
28
|
import { Syntax } from '@dxos/react-ui-syntax-highlighter';
|
|
28
29
|
import { withLayout } from '@dxos/react-ui/testing';
|
|
@@ -9,7 +9,7 @@ import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
|
9
9
|
import { AppCapabilities } from '@dxos/app-toolkit';
|
|
10
10
|
import { type AppSurface, useSchemaFilter } from '@dxos/app-toolkit/ui';
|
|
11
11
|
import { Filter, Obj, Query, type Ref, Type } from '@dxos/echo';
|
|
12
|
-
import { useObject, useType } from '@dxos/react
|
|
12
|
+
import { useObject, useType } from '@dxos/echo-react';
|
|
13
13
|
import { Panel, Toolbar } from '@dxos/react-ui';
|
|
14
14
|
import { getTagFromQuery, getTypeURIFromQuery } from '@dxos/schema';
|
|
15
15
|
|
|
@@ -177,3 +177,5 @@ const ItemsKanbanArticle = ({ role, subject: object }: ItemsKanbanArticleProps)
|
|
|
177
177
|
</Panel.Root>
|
|
178
178
|
);
|
|
179
179
|
};
|
|
180
|
+
|
|
181
|
+
KanbanArticle.displayName = 'KanbanArticle';
|
|
@@ -7,8 +7,8 @@ import React, { useCallback, useContext, useMemo } from 'react';
|
|
|
7
7
|
|
|
8
8
|
import { type AppSurface } from '@dxos/app-toolkit/ui';
|
|
9
9
|
import { Obj } from '@dxos/echo';
|
|
10
|
+
import { useObject, useType } from '@dxos/echo-react';
|
|
10
11
|
import { Format } from '@dxos/echo/Format';
|
|
11
|
-
import { useObject, useType } from '@dxos/react-client/echo';
|
|
12
12
|
import { Form, type FormFieldMap, SelectField } from '@dxos/react-ui-form';
|
|
13
13
|
import { getTypeURIFromQuery } from '@dxos/schema';
|
|
14
14
|
|
|
@@ -99,3 +99,5 @@ export const KanbanProperties = ({ subject: object }: KanbanPropertiesProps) =>
|
|
|
99
99
|
</Form.Section>
|
|
100
100
|
);
|
|
101
101
|
};
|
|
102
|
+
|
|
103
|
+
KanbanProperties.displayName = 'KanbanProperties';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { Atom, Registry } from '@effect-atom/atom
|
|
5
|
+
import { Atom, Registry } from '@effect-atom/atom';
|
|
6
6
|
import { act, renderHook } from '@testing-library/react';
|
|
7
7
|
import * as Schema from 'effect/Schema';
|
|
8
8
|
import { beforeEach, describe, test } from 'vitest';
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import type {
|
|
7
|
+
import type { DndContainerHandler, DndTileData } from '@dxos/react-ui-dnd';
|
|
8
|
+
import type { BoardModel } from '@dxos/react-ui-mosaic';
|
|
8
9
|
import type { ProjectionModel } from '@dxos/schema';
|
|
9
10
|
import { arrayMove } from '@dxos/util';
|
|
10
11
|
|
|
@@ -19,7 +20,7 @@ import { type BaseKanbanItem, type ColumnStructure, type KanbanChangeCallback, U
|
|
|
19
20
|
* @param projection - ProjectionModel for pivot field options (column order).
|
|
20
21
|
* @param pivotFieldId - Pivot field id; undefined disables drop.
|
|
21
22
|
* @param change - Callback to persist kanban.arrangement.order.
|
|
22
|
-
* @returns
|
|
23
|
+
* @returns DndContainerHandler for column tiles.
|
|
23
24
|
*/
|
|
24
25
|
export function useKanbanColumnEventHandler<T extends BaseKanbanItem>({
|
|
25
26
|
id,
|
|
@@ -33,8 +34,8 @@ export function useKanbanColumnEventHandler<T extends BaseKanbanItem>({
|
|
|
33
34
|
projection: ProjectionModel | undefined;
|
|
34
35
|
pivotFieldId: string | undefined;
|
|
35
36
|
change: KanbanChangeCallback<T>;
|
|
36
|
-
}):
|
|
37
|
-
return useMemo<
|
|
37
|
+
}): DndContainerHandler<ColumnStructure> {
|
|
38
|
+
return useMemo<DndContainerHandler<ColumnStructure>>(
|
|
38
39
|
() => ({
|
|
39
40
|
id,
|
|
40
41
|
canDrop: ({ source }) => {
|
|
@@ -46,7 +47,7 @@ export function useKanbanColumnEventHandler<T extends BaseKanbanItem>({
|
|
|
46
47
|
return (
|
|
47
48
|
model.isColumn(source.data) &&
|
|
48
49
|
columnValue !== UNCATEGORIZED_VALUE &&
|
|
49
|
-
(source as
|
|
50
|
+
(source as DndTileData<ColumnStructure>).id !== UNCATEGORIZED_VALUE
|
|
50
51
|
);
|
|
51
52
|
},
|
|
52
53
|
onDrop: ({ source, target }) => {
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import type {
|
|
7
|
+
import type { DndContainerHandler, DndTileData } from '@dxos/react-ui-dnd';
|
|
8
|
+
import type { BoardModel } from '@dxos/react-ui-mosaic';
|
|
8
9
|
|
|
9
10
|
import {
|
|
10
11
|
type ArrangedCards,
|
|
@@ -29,7 +30,7 @@ function findColumn<T extends BaseKanbanItem>(
|
|
|
29
30
|
* @param columnFieldPath - Item property path for the pivot field (used when moving to another column).
|
|
30
31
|
* @param model - Board model for getColumns / getItems.
|
|
31
32
|
* @param change - Callback to persist arrangement and item field updates.
|
|
32
|
-
* @returns
|
|
33
|
+
* @returns DndContainerHandler for item tiles in this column.
|
|
33
34
|
*/
|
|
34
35
|
export function useKanbanItemEventHandler<T extends BaseKanbanItem>({
|
|
35
36
|
column,
|
|
@@ -41,8 +42,8 @@ export function useKanbanItemEventHandler<T extends BaseKanbanItem>({
|
|
|
41
42
|
columnFieldPath: string | undefined;
|
|
42
43
|
model: BoardModel<ColumnStructure, T>;
|
|
43
44
|
change: KanbanChangeCallback<T>;
|
|
44
|
-
}):
|
|
45
|
-
return useMemo<
|
|
45
|
+
}): DndContainerHandler<T> {
|
|
46
|
+
return useMemo<DndContainerHandler<T>>(
|
|
46
47
|
() => ({
|
|
47
48
|
id: column.columnValue,
|
|
48
49
|
canDrop: ({ source }) => model.isItem(source.data),
|
|
@@ -91,9 +92,7 @@ export function useKanbanItemEventHandler<T extends BaseKanbanItem>({
|
|
|
91
92
|
// 5. Compute insert index in target column, then insert.
|
|
92
93
|
const existingTargetIndex =
|
|
93
94
|
target?.type === 'tile'
|
|
94
|
-
? targetColumnInWorking.cards.findIndex(
|
|
95
|
-
(card) => model.getItemId(card) === (target as MosaicTileData<T>).id,
|
|
96
|
-
)
|
|
95
|
+
? targetColumnInWorking.cards.findIndex((card) => model.getItemId(card) === (target as DndTileData<T>).id)
|
|
97
96
|
: -1;
|
|
98
97
|
const closestEdge: 'top' | 'bottom' =
|
|
99
98
|
target?.type === 'placeholder' && typeof target.location === 'number'
|
|
@@ -18,7 +18,7 @@ const KANBAN_CARD_TILE_SIMPLE_NAME = 'KanbanCardTileSimple';
|
|
|
18
18
|
* Card tile without Surface; for stories and tests when plugin manager is not available.
|
|
19
19
|
*/
|
|
20
20
|
export const KanbanCardTileSimple = forwardRef<HTMLDivElement, KanbanCardProps>(
|
|
21
|
-
({ data, location, debug }, forwardedRef) => {
|
|
21
|
+
({ data, location, debug, draggable }, forwardedRef) => {
|
|
22
22
|
const { t } = useTranslation(meta.profile.key);
|
|
23
23
|
const { model } = useBoard(KANBAN_CARD_TILE_SIMPLE_NAME);
|
|
24
24
|
const { onCardRemove } = useKanbanBoard(KANBAN_CARD_TILE_SIMPLE_NAME);
|
|
@@ -46,6 +46,7 @@ export const KanbanCardTileSimple = forwardRef<HTMLDivElement, KanbanCardProps>(
|
|
|
46
46
|
data={data}
|
|
47
47
|
location={location}
|
|
48
48
|
debug={debug}
|
|
49
|
+
draggable={draggable}
|
|
49
50
|
dragHandle={dragHandle}
|
|
50
51
|
>
|
|
51
52
|
<Focus.Item asChild>
|