@dxos/plugin-kanban 0.9.1-main.c7dcc2e112 → 0.10.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/PLUGIN.mdl +3 -3
- package/dist/lib/neutral/{KanbanArticle-T4CPKAZH.mjs → KanbanArticle-JQMQQHRB.mjs} +1 -1
- package/dist/lib/neutral/{KanbanArticle-T4CPKAZH.mjs.map → KanbanArticle-JQMQQHRB.mjs.map} +2 -2
- package/dist/lib/neutral/KanbanPlugin.mjs +4 -4
- package/dist/lib/neutral/KanbanPlugin.mjs.map +3 -3
- package/dist/lib/neutral/KanbanPlugin.node.mjs +3 -3
- package/dist/lib/neutral/KanbanPlugin.node.mjs.map +3 -3
- package/dist/lib/neutral/{KanbanSettings-FTIIR6PR.mjs → KanbanProperties-W7MZNZVJ.mjs} +4 -4
- package/dist/lib/neutral/KanbanProperties-W7MZNZVJ.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +4 -4
- package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
- package/dist/lib/neutral/{chunk-Y2G24ZGD.mjs → chunk-7TVVF45P.mjs} +6 -5
- package/dist/lib/neutral/chunk-7TVVF45P.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7YLGUKDJ.mjs +8 -0
- package/dist/lib/neutral/chunk-CFPH5R6P.mjs +26 -0
- package/dist/lib/neutral/chunk-CFPH5R6P.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-2IGEE5J5.mjs → chunk-V4AVOJVU.mjs} +2 -2
- package/dist/lib/neutral/{chunk-2IGEE5J5.mjs.map → chunk-V4AVOJVU.mjs.map} +1 -1
- package/dist/lib/neutral/containers/index.mjs +3 -3
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/{create-object-DKBSI46K.mjs → create-object-DIIFRS57.mjs} +14 -9
- package/dist/lib/neutral/create-object-DIIFRS57.mjs.map +7 -0
- package/dist/lib/neutral/{delete-card-NMULYEXS.mjs → delete-card-TK2G6YHX.mjs} +2 -2
- package/dist/lib/neutral/{delete-card-field-NGYNI6GL.mjs → delete-card-field-LGWPBOUW.mjs} +2 -2
- package/dist/lib/neutral/index.mjs +6 -6
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/operations/index.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +2 -2
- package/dist/lib/neutral/{react-surface-5Y6IHGKR.mjs → react-surface-FQGXRR3X.mjs} +5 -4
- package/dist/lib/neutral/react-surface-FQGXRR3X.mjs.map +7 -0
- package/dist/lib/neutral/{restore-card-JQ5N7G6G.mjs → restore-card-3O6PVN7J.mjs} +2 -2
- package/dist/lib/neutral/{restore-card-field-4SU6IR4V.mjs → restore-card-field-5G4DVYYY.mjs} +2 -2
- package/dist/lib/neutral/skill-definition-YGTCKXGP.mjs +15 -0
- package/dist/lib/neutral/skill-definition-YGTCKXGP.mjs.map +7 -0
- package/dist/lib/neutral/skills/index.mjs +8 -0
- package/dist/lib/neutral/types/index.mjs +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -7
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
- package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts +2 -2
- package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -1
- package/dist/types/src/containers/{KanbanSettings/KanbanSettings.d.ts → KanbanProperties/KanbanProperties.d.ts} +4 -4
- package/dist/types/src/containers/KanbanProperties/KanbanProperties.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanProperties/index.d.ts +2 -0
- package/dist/types/src/containers/KanbanProperties/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +1 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +4 -0
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/skills/index.d.ts +2 -0
- package/dist/types/src/skills/index.d.ts.map +1 -0
- package/dist/types/src/skills/kanban-skill.d.ts +4 -0
- package/dist/types/src/skills/kanban-skill.d.ts.map +1 -0
- package/dist/types/src/types/Kanban.d.ts +3 -6
- package/dist/types/src/types/Kanban.d.ts.map +1 -1
- package/dist/types/src/types/KanbanOperation.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +1 -1
- package/package.json +47 -47
- package/src/KanbanPlugin.node.ts +2 -2
- package/src/KanbanPlugin.test.ts +2 -2
- package/src/KanbanPlugin.tsx +2 -2
- package/src/capabilities/create-object.ts +9 -7
- package/src/capabilities/index.ts +1 -1
- package/src/capabilities/react-surface.tsx +4 -3
- package/src/capabilities/skill-definition.ts +14 -0
- package/src/containers/KanbanArticle/KanbanArticle.stories.tsx +1 -1
- package/src/containers/KanbanArticle/KanbanArticle.tsx +1 -1
- package/src/containers/{KanbanSettings/KanbanSettings.tsx → KanbanProperties/KanbanProperties.tsx} +3 -3
- package/src/containers/KanbanProperties/index.ts +5 -0
- package/src/containers/index.ts +1 -1
- package/src/hooks/useKanbanBoardModel.browser.test.ts +20 -18
- package/src/index.ts +1 -1
- package/src/skills/index.ts +5 -0
- package/src/{blueprints/kanban-blueprint.ts → skills/kanban-skill.ts} +8 -8
- package/src/types/Kanban.ts +13 -17
- package/src/types/KanbanOperation.ts +1 -1
- package/src/types/schema.ts +1 -1
- package/dist/lib/neutral/KanbanSettings-FTIIR6PR.mjs.map +0 -7
- package/dist/lib/neutral/blueprint-definition-6DV3Q5MC.mjs +0 -15
- package/dist/lib/neutral/blueprint-definition-6DV3Q5MC.mjs.map +0 -7
- package/dist/lib/neutral/blueprints/index.mjs +0 -8
- package/dist/lib/neutral/chunk-NDJNHR4K.mjs +0 -8
- package/dist/lib/neutral/chunk-Y2G24ZGD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZTQW5KQS.mjs +0 -26
- package/dist/lib/neutral/chunk-ZTQW5KQS.mjs.map +0 -7
- package/dist/lib/neutral/create-object-DKBSI46K.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-5Y6IHGKR.mjs.map +0 -7
- package/dist/types/src/blueprints/index.d.ts +0 -2
- package/dist/types/src/blueprints/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/kanban-blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -6
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
- package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +0 -1
- package/dist/types/src/containers/KanbanSettings/index.d.ts +0 -2
- package/dist/types/src/containers/KanbanSettings/index.d.ts.map +0 -1
- package/src/blueprints/index.ts +0 -5
- package/src/capabilities/blueprint-definition.ts +0 -19
- package/src/containers/KanbanSettings/index.ts +0 -5
- /package/dist/lib/neutral/{chunk-NDJNHR4K.mjs.map → chunk-7YLGUKDJ.mjs.map} +0 -0
- /package/dist/lib/neutral/{delete-card-NMULYEXS.mjs.map → delete-card-TK2G6YHX.mjs.map} +0 -0
- /package/dist/lib/neutral/{delete-card-field-NGYNI6GL.mjs.map → delete-card-field-LGWPBOUW.mjs.map} +0 -0
- /package/dist/lib/neutral/{restore-card-JQ5N7G6G.mjs.map → restore-card-3O6PVN7J.mjs.map} +0 -0
- /package/dist/lib/neutral/{restore-card-field-4SU6IR4V.mjs.map → restore-card-field-5G4DVYYY.mjs.map} +0 -0
- /package/dist/lib/neutral/{blueprints → skills}/index.mjs.map +0 -0
package/dx.config.ts
CHANGED
|
@@ -25,7 +25,7 @@ export default Config2.make({
|
|
|
25
25
|
optionally hide the uncategorized column for items that have no pivot value.
|
|
26
26
|
Field-level undo support allows deleted card fields to be restored without data loss.
|
|
27
27
|
|
|
28
|
-
The plugin contributes a Kanban
|
|
28
|
+
The plugin contributes a Kanban skill that exposes board creation and card management
|
|
29
29
|
to AI agents, enabling automated project tracking workflows.
|
|
30
30
|
`,
|
|
31
31
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-kanban",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Kanban DXOS Surface plugin",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"sideEffects": true,
|
|
14
14
|
"type": "module",
|
|
15
15
|
"imports": {
|
|
16
|
-
"#
|
|
17
|
-
"source": "./src/
|
|
18
|
-
"types": "./dist/types/src/
|
|
19
|
-
"default": "./dist/lib/neutral/
|
|
16
|
+
"#skills": {
|
|
17
|
+
"source": "./src/skills/index.ts",
|
|
18
|
+
"types": "./dist/types/src/skills/index.d.ts",
|
|
19
|
+
"default": "./dist/lib/neutral/skills/index.mjs"
|
|
20
20
|
},
|
|
21
21
|
"#capabilities": {
|
|
22
22
|
"source": "./src/capabilities/index.ts",
|
|
@@ -78,10 +78,10 @@
|
|
|
78
78
|
"default": "./dist/lib/neutral/index.mjs"
|
|
79
79
|
},
|
|
80
80
|
"./assets/PLUGIN.mdl": "./PLUGIN.mdl",
|
|
81
|
-
"./
|
|
82
|
-
"source": "./src/
|
|
83
|
-
"types": "./dist/types/src/
|
|
84
|
-
"default": "./dist/lib/neutral/
|
|
81
|
+
"./skills": {
|
|
82
|
+
"source": "./src/skills/index.ts",
|
|
83
|
+
"types": "./dist/types/src/skills/index.d.ts",
|
|
84
|
+
"default": "./dist/lib/neutral/skills/index.mjs"
|
|
85
85
|
},
|
|
86
86
|
"./plugin": {
|
|
87
87
|
"source": "./src/plugin.ts",
|
|
@@ -109,50 +109,50 @@
|
|
|
109
109
|
"dependencies": {
|
|
110
110
|
"@effect-atom/atom-react": "^0.5.0",
|
|
111
111
|
"@radix-ui/react-context": "1.1.1",
|
|
112
|
-
"effect": "3.21.
|
|
113
|
-
"@dxos/ai": "0.
|
|
114
|
-
"@dxos/app-framework": "0.
|
|
115
|
-
"@dxos/app-toolkit": "0.
|
|
116
|
-
"@dxos/assistant": "0.
|
|
117
|
-
"@dxos/
|
|
118
|
-
"@dxos/
|
|
119
|
-
"@dxos/
|
|
120
|
-
"@dxos/
|
|
121
|
-
"@dxos/
|
|
122
|
-
"@dxos/
|
|
123
|
-
"@dxos/
|
|
124
|
-
"@dxos/
|
|
125
|
-
"@dxos/
|
|
126
|
-
"@dxos/react-ui": "0.
|
|
127
|
-
"@dxos/react-ui-
|
|
128
|
-
"@dxos/react-ui-mosaic": "0.
|
|
129
|
-
"@dxos/
|
|
130
|
-
"@dxos/schema": "0.
|
|
131
|
-
"@dxos/types": "0.
|
|
132
|
-
"@dxos/util": "0.
|
|
112
|
+
"effect": "3.21.4",
|
|
113
|
+
"@dxos/ai": "0.10.0",
|
|
114
|
+
"@dxos/app-framework": "0.10.0",
|
|
115
|
+
"@dxos/app-toolkit": "0.10.0",
|
|
116
|
+
"@dxos/assistant": "0.10.0",
|
|
117
|
+
"@dxos/compute": "0.10.0",
|
|
118
|
+
"@dxos/echo": "0.10.0",
|
|
119
|
+
"@dxos/effect": "0.10.0",
|
|
120
|
+
"@dxos/log": "0.10.0",
|
|
121
|
+
"@dxos/invariant": "0.10.0",
|
|
122
|
+
"@dxos/plugin-client": "0.10.0",
|
|
123
|
+
"@dxos/react-ui": "0.10.0",
|
|
124
|
+
"@dxos/random": "0.10.0",
|
|
125
|
+
"@dxos/react-client": "0.10.0",
|
|
126
|
+
"@dxos/react-ui-menu": "0.10.0",
|
|
127
|
+
"@dxos/react-ui-form": "0.10.0",
|
|
128
|
+
"@dxos/react-ui-mosaic": "0.10.0",
|
|
129
|
+
"@dxos/plugin-space": "0.10.0",
|
|
130
|
+
"@dxos/schema": "0.10.0",
|
|
131
|
+
"@dxos/types": "0.10.0",
|
|
132
|
+
"@dxos/util": "0.10.0"
|
|
133
133
|
},
|
|
134
134
|
"devDependencies": {
|
|
135
|
-
"@types/react": "~19.2.
|
|
135
|
+
"@types/react": "~19.2.17",
|
|
136
136
|
"@types/react-dom": "~19.2.3",
|
|
137
|
-
"react": "~19.2.
|
|
138
|
-
"react-dom": "~19.2.
|
|
137
|
+
"react": "~19.2.7",
|
|
138
|
+
"react-dom": "~19.2.7",
|
|
139
139
|
"vite": "^8.0.16",
|
|
140
|
-
"@dxos/echo-client": "0.
|
|
141
|
-
"@dxos/keys": "0.
|
|
142
|
-
"@dxos/plugin-preview": "0.
|
|
143
|
-
"@dxos/plugin-testing": "0.
|
|
144
|
-
"@dxos/
|
|
145
|
-
"@dxos/
|
|
146
|
-
"@dxos/storybook-utils": "0.
|
|
147
|
-
"@dxos/test-utils": "0.
|
|
148
|
-
"@dxos/ui-theme": "0.
|
|
140
|
+
"@dxos/echo-client": "0.10.0",
|
|
141
|
+
"@dxos/keys": "0.10.0",
|
|
142
|
+
"@dxos/plugin-preview": "0.10.0",
|
|
143
|
+
"@dxos/plugin-testing": "0.10.0",
|
|
144
|
+
"@dxos/react-ui-syntax-highlighter": "0.10.0",
|
|
145
|
+
"@dxos/plugin-theme": "0.10.0",
|
|
146
|
+
"@dxos/storybook-utils": "0.10.0",
|
|
147
|
+
"@dxos/test-utils": "0.10.0",
|
|
148
|
+
"@dxos/ui-theme": "0.10.0"
|
|
149
149
|
},
|
|
150
150
|
"peerDependencies": {
|
|
151
|
-
"effect": "3.21.
|
|
152
|
-
"react": "~19.2.
|
|
153
|
-
"react-dom": "~19.2.
|
|
154
|
-
"@dxos/react-ui": "0.
|
|
155
|
-
"@dxos/ui-theme": "0.
|
|
151
|
+
"effect": "3.21.4",
|
|
152
|
+
"react": "~19.2.7",
|
|
153
|
+
"react-dom": "~19.2.7",
|
|
154
|
+
"@dxos/react-ui": "0.10.0",
|
|
155
|
+
"@dxos/ui-theme": "0.10.0"
|
|
156
156
|
},
|
|
157
157
|
"publishConfig": {
|
|
158
158
|
"access": "public"
|
package/src/KanbanPlugin.node.ts
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
import { Plugin } from '@dxos/app-framework';
|
|
6
6
|
import { AppPlugin } from '@dxos/app-toolkit';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { CreateObject, OperationHandler, SkillDefinition, UndoMappings } from '#capabilities';
|
|
9
9
|
import { meta } from '#meta';
|
|
10
10
|
import { Kanban } from '#types';
|
|
11
11
|
|
|
12
12
|
export const KanbanPlugin = Plugin.define(meta).pipe(
|
|
13
|
-
AppPlugin.
|
|
13
|
+
AppPlugin.addSkillDefinitionModule({ activate: SkillDefinition }),
|
|
14
14
|
AppPlugin.addCreateObjectModule({ activate: CreateObject }),
|
|
15
15
|
AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),
|
|
16
16
|
AppPlugin.addUndoMappingsModule({ activate: UndoMappings }),
|
package/src/KanbanPlugin.test.ts
CHANGED
|
@@ -24,8 +24,8 @@ describe('KanbanPlugin', () => {
|
|
|
24
24
|
expect.arrayContaining([moduleId('OperationHandler'), moduleId('UndoMappings')]),
|
|
25
25
|
);
|
|
26
26
|
|
|
27
|
-
//
|
|
27
|
+
// SkillDefinition fires when AssistantPlugin loads skill definitions.
|
|
28
28
|
await harness.fire(AppActivationEvents.SetupArtifactDefinition);
|
|
29
|
-
expect(harness.manager.getActive()).toContain(moduleId('
|
|
29
|
+
expect(harness.manager.getActive()).toContain(moduleId('SkillDefinition'));
|
|
30
30
|
});
|
|
31
31
|
});
|
package/src/KanbanPlugin.tsx
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { Plugin } from '@dxos/app-framework';
|
|
6
6
|
import { AppPlugin } from '@dxos/app-toolkit';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { CreateObject, OperationHandler, ReactSurface, SkillDefinition, UndoMappings } from '#capabilities';
|
|
9
9
|
import { meta } from '#meta';
|
|
10
10
|
import { translations } from '#translations';
|
|
11
11
|
import { Kanban } from '#types';
|
|
@@ -14,7 +14,7 @@ import { Kanban } from '#types';
|
|
|
14
14
|
import pluginSpec from '../PLUGIN.mdl?raw';
|
|
15
15
|
|
|
16
16
|
export const KanbanPlugin = Plugin.define(meta).pipe(
|
|
17
|
-
AppPlugin.
|
|
17
|
+
AppPlugin.addSkillDefinitionModule({ activate: SkillDefinition }),
|
|
18
18
|
AppPlugin.addCreateObjectModule({ activate: CreateObject }),
|
|
19
19
|
AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),
|
|
20
20
|
AppPlugin.addUndoMappingsModule({ activate: UndoMappings }),
|
|
@@ -21,17 +21,19 @@ export default Capability.makeModule(
|
|
|
21
21
|
createObject: (props, options) =>
|
|
22
22
|
Effect.gen(function* () {
|
|
23
23
|
const object = yield* Effect.promise(async () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
if (props.typename) {
|
|
25
|
+
const { view } = await ViewModel.makeFromDatabase({
|
|
26
|
+
db: options.db,
|
|
27
|
+
typename: props.typename,
|
|
28
|
+
pivotFieldName: props.initialPivotColumn,
|
|
29
|
+
});
|
|
30
|
+
return Kanban.make({ name: props.name, view });
|
|
31
|
+
}
|
|
32
|
+
return Kanban.makeItems({ name: props.name, pivotField: props.initialPivotColumn ?? '' });
|
|
30
33
|
});
|
|
31
34
|
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
32
35
|
object,
|
|
33
36
|
target: options.target,
|
|
34
|
-
hidden: true,
|
|
35
37
|
targetNodeId: options.targetNodeId,
|
|
36
38
|
});
|
|
37
39
|
}),
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { Capability } from '@dxos/app-framework';
|
|
6
6
|
import type { OperationHandlerSet } from '@dxos/compute';
|
|
7
7
|
|
|
8
|
-
export const
|
|
8
|
+
export const SkillDefinition = Capability.lazy('SkillDefinition', () => import('./skill-definition'));
|
|
9
9
|
export const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));
|
|
10
10
|
export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
|
|
11
11
|
'OperationHandler',
|
|
@@ -11,8 +11,9 @@ import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
|
11
11
|
import { Database, Obj, Type } from '@dxos/echo';
|
|
12
12
|
import { SchemaEx } from '@dxos/effect';
|
|
13
13
|
import { type FormFieldRendererProps, SelectField, useFormValues } from '@dxos/react-ui-form';
|
|
14
|
+
import { Position } from '@dxos/util';
|
|
14
15
|
|
|
15
|
-
import { KanbanArticle,
|
|
16
|
+
import { KanbanArticle, KanbanProperties } from '#containers';
|
|
16
17
|
import { Kanban, PivotColumnAnnotationId } from '#types';
|
|
17
18
|
|
|
18
19
|
export default Capability.makeModule(() =>
|
|
@@ -29,9 +30,9 @@ export default Capability.makeModule(() =>
|
|
|
29
30
|
}),
|
|
30
31
|
Surface.create({
|
|
31
32
|
id: 'objectProperties',
|
|
32
|
-
position:
|
|
33
|
+
position: Position.first,
|
|
33
34
|
filter: AppSurface.object(AppSurface.ObjectProperties, Kanban.Kanban),
|
|
34
|
-
component: ({ data }) => <
|
|
35
|
+
component: ({ data }) => <KanbanProperties subject={data.subject} />,
|
|
35
36
|
}),
|
|
36
37
|
Surface.create({
|
|
37
38
|
id: 'createInitialSchemaForm',
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { Capability } from '@dxos/app-framework';
|
|
8
|
+
import { AppCapabilities } from '@dxos/app-toolkit';
|
|
9
|
+
|
|
10
|
+
import { KanbanSkill } from '#skills';
|
|
11
|
+
|
|
12
|
+
const skillDefinition = () => Effect.succeed([Capability.contributes(AppCapabilities.SkillDefinition, KanbanSkill)]);
|
|
13
|
+
|
|
14
|
+
export default skillDefinition;
|
|
@@ -22,7 +22,7 @@ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
|
|
|
22
22
|
import { SpacePlugin } from '@dxos/plugin-space/testing';
|
|
23
23
|
import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
|
|
24
24
|
import { random } from '@dxos/random';
|
|
25
|
-
import { type Space, useQuery,
|
|
25
|
+
import { type Space, useQuery, useSpaces, useType } from '@dxos/react-client/echo';
|
|
26
26
|
import { ViewEditor } from '@dxos/react-ui-form';
|
|
27
27
|
import { Syntax } from '@dxos/react-ui-syntax-highlighter';
|
|
28
28
|
import { withLayout } from '@dxos/react-ui/testing';
|
|
@@ -7,7 +7,7 @@ import React, { useCallback, useContext, useMemo } from 'react';
|
|
|
7
7
|
|
|
8
8
|
import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
9
9
|
import { AppCapabilities } from '@dxos/app-toolkit';
|
|
10
|
-
import {
|
|
10
|
+
import { type AppSurface, useSchemaFilter } from '@dxos/app-toolkit/ui';
|
|
11
11
|
import { Filter, Obj, Query, type Ref, Type } from '@dxos/echo';
|
|
12
12
|
import { useObject, useType } from '@dxos/react-client/echo';
|
|
13
13
|
import { Panel, Toolbar } from '@dxos/react-ui';
|
package/src/containers/{KanbanSettings/KanbanSettings.tsx → KanbanProperties/KanbanProperties.tsx}
RENAMED
|
@@ -15,16 +15,16 @@ import { getTypeURIFromQuery } from '@dxos/schema';
|
|
|
15
15
|
import { useProjectionModel } from '#hooks';
|
|
16
16
|
import { type Kanban, KanbanSettingsSchema, KanbanViewSettingsSchema, UNCATEGORIZED_VALUE } from '#types';
|
|
17
17
|
|
|
18
|
-
export type
|
|
18
|
+
export type KanbanPropertiesProps = AppSurface.ObjectPropertiesProps<Kanban.Kanban>;
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* Object-properties panel for a Kanban. Renders fields common to every kanban
|
|
22
22
|
* (currently the "Hide uncategorized column" toggle); for view-variant
|
|
23
23
|
* kanbans an additional "Column field" picker drives the View's pivot
|
|
24
24
|
* field. Items-variant kanbans use a hardcoded `spec.pivotField`, so that
|
|
25
25
|
* field is omitted there.
|
|
26
26
|
*/
|
|
27
|
-
export const
|
|
27
|
+
export const KanbanProperties = ({ subject: object }: KanbanPropertiesProps) => {
|
|
28
28
|
const registry = useContext(RegistryContext);
|
|
29
29
|
const db = Obj.getDatabase(object);
|
|
30
30
|
const isView = object.spec.kind === 'view';
|
package/src/containers/index.ts
CHANGED
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
import { type ComponentType, lazy } from 'react';
|
|
6
6
|
|
|
7
7
|
export const KanbanArticle: ComponentType<any> = lazy(() => import('./KanbanArticle'));
|
|
8
|
-
export const
|
|
8
|
+
export const KanbanProperties: ComponentType<any> = lazy(() => import('./KanbanProperties'));
|
|
@@ -18,25 +18,27 @@ import { Kanban } from '#types';
|
|
|
18
18
|
import { useKanbanBoardModel } from './useKanbanBoardModel';
|
|
19
19
|
|
|
20
20
|
// TODO(wittjosiah): Consider adding single-select to TestSchema.Task and using that instead.
|
|
21
|
-
const KanbanTaskSchema =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
21
|
+
const KanbanTaskSchema = Type.makeObject(DXN.make('com.example.type.kanbanTask', '0.1.0'))(
|
|
22
|
+
Schema.Struct({
|
|
23
|
+
title: Schema.optional(Schema.String),
|
|
24
|
+
status: Schema.Literal('__uncategorized__', 'a', 'b').pipe(
|
|
25
|
+
FormatAnnotation.set(Format.TypeFormat.SingleSelect),
|
|
26
|
+
Schema.annotations({
|
|
27
|
+
title: 'Status',
|
|
28
|
+
[PropertyMetaAnnotationId]: {
|
|
29
|
+
singleSelect: {
|
|
30
|
+
options: [
|
|
31
|
+
{ id: '__uncategorized__', title: 'Uncategorized', color: 'neutral' },
|
|
32
|
+
{ id: 'a', title: 'A', color: 'blue' },
|
|
33
|
+
{ id: 'b', title: 'B', color: 'green' },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
34
36
|
},
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
),
|
|
39
|
-
|
|
37
|
+
}),
|
|
38
|
+
Schema.optional,
|
|
39
|
+
),
|
|
40
|
+
}),
|
|
41
|
+
);
|
|
40
42
|
|
|
41
43
|
type KanbanTask = Type.InstanceType<typeof KanbanTaskSchema>;
|
|
42
44
|
|
package/src/index.ts
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Skill, Template } from '@dxos/compute';
|
|
6
6
|
import { trim } from '@dxos/util';
|
|
7
7
|
|
|
8
|
-
const
|
|
8
|
+
const SKILL_KEY = 'org.dxos.skill.kanban';
|
|
9
9
|
|
|
10
10
|
const make = () =>
|
|
11
|
-
|
|
12
|
-
key:
|
|
11
|
+
Skill.make({
|
|
12
|
+
key: SKILL_KEY,
|
|
13
13
|
name: 'Kanban',
|
|
14
|
-
tools:
|
|
14
|
+
tools: Skill.toolDefinitions({ tools: [] }),
|
|
15
15
|
instructions: Template.make({
|
|
16
16
|
source: trim`
|
|
17
17
|
You can create and update kanban boards to show data in sorted columns defined by schema.
|
|
@@ -19,9 +19,9 @@ const make = () =>
|
|
|
19
19
|
}),
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
const
|
|
23
|
-
key:
|
|
22
|
+
const skill: Skill.Definition = {
|
|
23
|
+
key: SKILL_KEY,
|
|
24
24
|
make,
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
-
export default
|
|
27
|
+
export default skill;
|
package/src/types/Kanban.ts
CHANGED
|
@@ -8,7 +8,7 @@ import * as Schema from 'effect/Schema';
|
|
|
8
8
|
// (Ref.Ref(View.View) → View.View → QueryAST.Query) in the emitted .d.ts; the
|
|
9
9
|
// namespace import keeps the inferred types portable.
|
|
10
10
|
// eslint-disable-next-line unused-imports/no-unused-imports
|
|
11
|
-
import {
|
|
11
|
+
import { Annotation, DXN, Obj, QueryAST, Ref, Type, View } from '@dxos/echo';
|
|
12
12
|
import { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/Annotation';
|
|
13
13
|
import { ViewAnnotation } from '@dxos/schema';
|
|
14
14
|
|
|
@@ -66,22 +66,18 @@ export type KanbanItemsSpec = Schema.Schema.Type<typeof KanbanItemsSpec>;
|
|
|
66
66
|
export const KanbanSpec = Schema.Union(KanbanViewSpec, KanbanItemsSpec);
|
|
67
67
|
export type KanbanSpec = Schema.Schema.Type<typeof KanbanSpec>;
|
|
68
68
|
|
|
69
|
-
export
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Instance type; narrow on `kanban.spec.kind` (or use the guards below).
|
|
83
|
-
*/
|
|
84
|
-
export interface Kanban extends Type.InstanceType<typeof Kanban> {}
|
|
69
|
+
export class Kanban extends Type.makeObject<Kanban>(DXN.make('org.dxos.type.kanban', '0.2.0'))(
|
|
70
|
+
Schema.Struct({
|
|
71
|
+
name: Schema.String.pipe(Schema.optional),
|
|
72
|
+
arrangement: Arrangement,
|
|
73
|
+
/** How this kanban sources its items. Discriminated by `spec.kind`. */
|
|
74
|
+
spec: KanbanSpec,
|
|
75
|
+
}).pipe(
|
|
76
|
+
LabelAnnotation.set(['name']),
|
|
77
|
+
ViewAnnotation.set(['spec', 'view']),
|
|
78
|
+
Annotation.IconAnnotation.set({ icon: 'ph--kanban--regular', hue: 'green' }),
|
|
79
|
+
),
|
|
80
|
+
) {}
|
|
85
81
|
|
|
86
82
|
/** Narrowed view-variant kanban. */
|
|
87
83
|
export type KanbanView = Kanban & { spec: KanbanViewSpec };
|
|
@@ -8,7 +8,7 @@ import * as Schema from 'effect/Schema';
|
|
|
8
8
|
|
|
9
9
|
import { Capability } from '@dxos/app-framework';
|
|
10
10
|
import { Operation } from '@dxos/compute';
|
|
11
|
-
import { Type, View
|
|
11
|
+
import { DXN, Type, View } from '@dxos/echo';
|
|
12
12
|
|
|
13
13
|
import { meta } from '#meta';
|
|
14
14
|
|
package/src/types/schema.ts
CHANGED
|
@@ -20,7 +20,7 @@ export const PivotColumnAnnotationId = Symbol.for('@dxos/plugin-kanban/annotatio
|
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Settings common to every Kanban (view or items). Rendered as form fields
|
|
23
|
-
* by `
|
|
23
|
+
* by `KanbanProperties`.
|
|
24
24
|
*/
|
|
25
25
|
export const KanbanSettingsSchema = Schema.Struct({
|
|
26
26
|
hideUncategorized: Schema.Boolean.annotations({
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/KanbanSettings/KanbanSettings.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Format } from '@dxos/echo/Format';\nimport { useObject, useType } from '@dxos/react-client/echo';\nimport { Form, type FormFieldMap, SelectField } from '@dxos/react-ui-form';\nimport { getTypeURIFromQuery } from '@dxos/schema';\n\nimport { useProjectionModel } from '#hooks';\nimport { type Kanban, KanbanSettingsSchema, KanbanViewSettingsSchema, UNCATEGORIZED_VALUE } from '#types';\n\nexport type KanbanSettingsProps = AppSurface.ObjectPropertiesProps<Kanban.Kanban>;\n\n/**\n * Settings panel for a Kanban. Renders fields common to every kanban\n * (currently the \"Hide uncategorized column\" toggle); for view-variant\n * kanbans an additional \"Column field\" picker drives the View's pivot\n * field. Items-variant kanbans use a hardcoded `spec.pivotField`, so that\n * field is omitted there.\n */\nexport const KanbanSettings = ({ subject: object }: KanbanSettingsProps) => {\n const registry = useContext(RegistryContext);\n const db = Obj.getDatabase(object);\n const isView = object.spec.kind === 'view';\n const [view, updateView] = useObject(object.spec.kind === 'view' ? object.spec.view : undefined);\n const [, updateKanban] = useObject(object);\n const currentTypeUri = view?.query ? getTypeURIFromQuery(view.query.ast) : undefined;\n const schema = useType(db, currentTypeUri);\n const projection = useProjectionModel(schema, object, registry);\n\n const fieldProjections = projection?.getFieldProjections() ?? [];\n const selectFields = useMemo(\n () =>\n fieldProjections\n .filter((field) => field.props.format === Format.TypeFormat.SingleSelect)\n .map(({ field }) => ({ value: field.id, label: field.path })),\n [fieldProjections],\n );\n\n const hideUncategorized = object.arrangement.columns[UNCATEGORIZED_VALUE]?.hidden ?? false;\n\n const handleValuesChanged = useCallback(\n (values: Partial<{ columnFieldId: string; hideUncategorized: boolean }>) => {\n if (isView && values.columnFieldId != null) {\n updateView((view) => {\n view.projection.pivotFieldId = values.columnFieldId!;\n });\n }\n if (values.hideUncategorized !== undefined) {\n updateKanban((kanban) => {\n const existing = kanban.arrangement.columns[UNCATEGORIZED_VALUE];\n if (existing) {\n existing.hidden = values.hideUncategorized;\n } else {\n kanban.arrangement.columns[UNCATEGORIZED_VALUE] = {\n ids: [],\n hidden: values.hideUncategorized,\n };\n }\n });\n }\n },\n [isView, updateView, updateKanban],\n );\n\n const initialValues = useMemo(\n () => ({\n ...(isView ? { columnFieldId: view?.projection.pivotFieldId } : {}),\n hideUncategorized,\n }),\n [isView, view?.projection.pivotFieldId, hideUncategorized],\n );\n\n const fieldMap: FormFieldMap = useMemo(\n () => ({ columnFieldId: (props) => <SelectField {...props} options={selectFields} /> }),\n [selectFields],\n );\n\n // Schema is picked by `kanban.spec.kind` — they have different shapes,\n // so cast for `Form.Root`'s single-schema prop.\n const settingsSchema = (isView ? KanbanViewSettingsSchema : KanbanSettingsSchema) as any;\n\n return (\n <Form.Section>\n <Form.Root\n schema={settingsSchema}\n values={initialValues}\n fieldMap={fieldMap}\n onValuesChanged={handleValuesChanged}\n >\n <Form.FieldSet />\n </Form.Root>\n </Form.Section>\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAASA,uBAAuB;AAChC,OAAOC,SAASC,aAAaC,YAAYC,eAAe;AAGxD,SAASC,WAAW;AACpB,SAASC,cAAc;AACvB,SAASC,WAAWC,eAAe;AACnC,SAASC,MAAyBC,mBAAmB;AACrD,SAASC,2BAA2B;AAEpC,SAASC,0BAA0B;AACnC,SAAsBC,sBAAsBC,0BAA0BC,2BAA2B;AAW1F,IAAMC,iBAAiB,CAAC,EAAEC,SAASC,OAAM,MAAuB;AACrE,QAAMC,WAAWhB,WAAWH,eAAAA;AAC5B,QAAMoB,KAAKf,IAAIgB,YAAYH,MAAAA;AAC3B,QAAMI,SAASJ,OAAOK,KAAKC,SAAS;AACpC,QAAM,CAACC,MAAMC,UAAAA,IAAcnB,UAAUW,OAAOK,KAAKC,SAAS,SAASN,OAAOK,KAAKE,OAAOE,MAAAA;AACtF,QAAM,CAAA,EAAGC,YAAAA,IAAgBrB,UAAUW,MAAAA;AACnC,QAAMW,iBAAiBJ,MAAMK,QAAQnB,oBAAoBc,KAAKK,MAAMC,GAAG,IAAIJ;AAC3E,QAAMK,SAASxB,QAAQY,IAAIS,cAAAA;AAC3B,QAAMI,aAAarB,mBAAmBoB,QAAQd,QAAQC,QAAAA;AAEtD,QAAMe,mBAAmBD,YAAYE,oBAAAA,KAAyB,CAAA;AAC9D,QAAMC,eAAehC,QACnB,MACE8B,iBACGG,OAAO,CAACC,UAAUA,MAAMC,MAAMC,WAAWlC,OAAOmC,WAAWC,YAAY,EACvEC,IAAI,CAAC,EAAEL,MAAK,OAAQ;IAAEM,OAAON,MAAMO;IAAIC,OAAOR,MAAMS;EAAK,EAAA,GAC9D;IAACb;GAAiB;AAGpB,QAAMc,oBAAoB9B,OAAO+B,YAAYC,QAAQnC,mBAAAA,GAAsBoC,UAAU;AAErF,QAAMC,sBAAsBlD,YAC1B,CAACmD,WAAAA;AACC,QAAI/B,UAAU+B,OAAOC,iBAAiB,MAAM;AAC1C5B,iBAAW,CAACD,UAAAA;AACVA,QAAAA,MAAKQ,WAAWsB,eAAeF,OAAOC;MACxC,CAAA;IACF;AACA,QAAID,OAAOL,sBAAsBrB,QAAW;AAC1CC,mBAAa,CAAC4B,WAAAA;AACZ,cAAMC,WAAWD,OAAOP,YAAYC,QAAQnC,mBAAAA;AAC5C,YAAI0C,UAAU;AACZA,mBAASN,SAASE,OAAOL;QAC3B,OAAO;AACLQ,iBAAOP,YAAYC,QAAQnC,mBAAAA,IAAuB;YAChD2C,KAAK,CAAA;YACLP,QAAQE,OAAOL;UACjB;QACF;MACF,CAAA;IACF;EACF,GACA;IAAC1B;IAAQI;IAAYE;GAAa;AAGpC,QAAM+B,gBAAgBvD,QACpB,OAAO;IACL,GAAIkB,SAAS;MAAEgC,eAAe7B,MAAMQ,WAAWsB;IAAa,IAAI,CAAC;IACjEP;EACF,IACA;IAAC1B;IAAQG,MAAMQ,WAAWsB;IAAcP;GAAkB;AAG5D,QAAMY,WAAyBxD,QAC7B,OAAO;IAAEkD,eAAe,CAACf,UAAU,sBAAA,cAAC7B,aAAAA;MAAa,GAAG6B;MAAOsB,SAASzB;;EAAiB,IACrF;IAACA;GAAa;AAKhB,QAAM0B,iBAAkBxC,SAASR,2BAA2BD;AAE5D,SACE,sBAAA,cAACJ,KAAKsD,SAAO,MACX,sBAAA,cAACtD,KAAKuD,MAAI;IACRhC,QAAQ8B;IACRT,QAAQM;IACRC;IACAK,iBAAiBb;KAEjB,sBAAA,cAAC3C,KAAKyD,UAAQ,IAAA,CAAA,CAAA;AAItB;",
|
|
6
|
-
"names": ["RegistryContext", "React", "useCallback", "useContext", "useMemo", "Obj", "Format", "useObject", "useType", "Form", "SelectField", "getTypeURIFromQuery", "useProjectionModel", "KanbanSettingsSchema", "KanbanViewSettingsSchema", "UNCATEGORIZED_VALUE", "KanbanSettings", "subject", "object", "registry", "db", "getDatabase", "isView", "spec", "kind", "view", "updateView", "undefined", "updateKanban", "currentTypeUri", "query", "ast", "schema", "projection", "fieldProjections", "getFieldProjections", "selectFields", "filter", "field", "props", "format", "TypeFormat", "SingleSelect", "map", "value", "id", "label", "path", "hideUncategorized", "arrangement", "columns", "hidden", "handleValuesChanged", "values", "columnFieldId", "pivotFieldId", "kanban", "existing", "ids", "initialValues", "fieldMap", "options", "settingsSchema", "Section", "Root", "onValuesChanged", "FieldSet"]
|
|
7
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
-
|
|
3
|
-
// src/capabilities/blueprint-definition.ts
|
|
4
|
-
import * as Effect from "effect/Effect";
|
|
5
|
-
import { Capability } from "@dxos/app-framework";
|
|
6
|
-
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
7
|
-
import { KanbanBlueprint } from "#blueprints";
|
|
8
|
-
var blueprintDefinition = () => Effect.succeed([
|
|
9
|
-
Capability.contributes(AppCapabilities.BlueprintDefinition, KanbanBlueprint)
|
|
10
|
-
]);
|
|
11
|
-
var blueprint_definition_default = blueprintDefinition;
|
|
12
|
-
export {
|
|
13
|
-
blueprint_definition_default as default
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=blueprint-definition-6DV3Q5MC.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/blueprint-definition.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\n\nimport { KanbanBlueprint } from '#blueprints';\n\n// NOTE: Explicit annotation required: d.ts emit cannot portably name the inferred @dxos/compute types (TS2883).\nconst blueprintDefinition: () => Effect.Effect<\n Capability.Capability<typeof AppCapabilities.BlueprintDefinition>[],\n never,\n Capability.Service\n> = () => Effect.succeed([Capability.contributes(AppCapabilities.BlueprintDefinition, KanbanBlueprint)]);\n\nexport default blueprintDefinition;\n"],
|
|
5
|
-
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAEhC,SAASC,uBAAuB;AAGhC,IAAMC,sBAIF,MAAaC,eAAQ;EAACJ,WAAWK,YAAYJ,gBAAgBK,qBAAqBJ,eAAAA;CAAiB;AAEvG,IAAA,+BAAeC;",
|
|
6
|
-
"names": ["Effect", "Capability", "AppCapabilities", "KanbanBlueprint", "blueprintDefinition", "succeed", "contributes", "BlueprintDefinition"]
|
|
7
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// src/operations/index.ts
|
|
2
|
-
import { OperationHandlerSet } from "@dxos/compute";
|
|
3
|
-
var KanbanOperationHandlerSet = OperationHandlerSet.lazy(() => import("./delete-card-NMULYEXS.mjs"), () => import("./delete-card-field-NGYNI6GL.mjs"), () => import("./restore-card-JQ5N7G6G.mjs"), () => import("./restore-card-field-4SU6IR4V.mjs"));
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
KanbanOperationHandlerSet
|
|
7
|
-
};
|
|
8
|
-
//# sourceMappingURL=chunk-NDJNHR4K.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/types/constants.ts", "../../../src/types/schema.ts", "../../../src/types/Kanban.ts", "../../../src/types/KanbanOperation.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 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { TypeInputOptionsAnnotation } from '@dxos/plugin-space';\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\n/**\n * Settings common to every Kanban (view or items). Rendered as form fields\n * by `KanbanSettings`.\n */\nexport const KanbanSettingsSchema = Schema.Struct({\n hideUncategorized: Schema.Boolean.annotations({\n title: 'Hide uncategorized column',\n description: 'When enabled, items without a pivot value won’t be shown as a column.',\n }).pipe(Schema.optional),\n});\n\n/**\n * Settings for view-variant Kanbans only. Spreads {@link KanbanSettingsSchema}'s\n * fields and adds a column-field picker that binds the View’s pivot field.\n * Items-variant kanbans use a hardcoded `spec.pivotField` and don’t expose\n * this control.\n */\nexport const KanbanViewSettingsSchema = Schema.Struct({\n columnFieldId: Schema.String.annotations({\n title: 'Column field',\n }),\n ...KanbanSettingsSchema.fields,\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 }),\n Schema.optional,\n ),\n initialPivotColumn: Schema.optional(\n Schema.String.annotations({\n [PivotColumnAnnotationId]: true,\n title: 'Pivot column',\n }),\n ),\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\n// QueryAST is referenced indirectly through `Type.InstanceType<typeof ...Schema>`\n// (Ref.Ref(View.View) → View.View → QueryAST.Query) in the emitted .d.ts; the\n// namespace import keeps the inferred types portable.\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { DXN, Annotation, Obj, QueryAST, Ref, Type, View } from '@dxos/echo';\nimport { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/Annotation';\nimport { ViewAnnotation } from '@dxos/schema';\n\n/**\n * Per-column entry: ordered card ids plus an optional `hidden` flag that\n * removes the column from the rendered board (and from the model's column\n * list). Today only the uncategorized column is exposed in settings, but\n * the data structure supports per-column hiding generally.\n */\nconst ArrangementColumnEntry = Schema.Struct({\n ids: Schema.Array(Obj.ID),\n hidden: Schema.Boolean.pipe(Schema.optional),\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\n//\n// Mirrors the canonical DXOS pattern (see `Trigger.Spec` in\n// `@dxos/functions/src/types/Trigger.ts` and `Sequence.Source` in\n// `@dxos/plugin-zen`): the `Type.makeObject` schema is a flat `Schema.Struct`,\n// and the discriminated union lives one level down as a single field whose\n// variants are tagged with a `kind` literal.\n//\n\n/** View-variant: items come from running the View's query (the original behaviour). */\nexport const KanbanViewSpec = Schema.Struct({\n kind: Schema.Literal('view').pipe(FormInputAnnotation.set(false)),\n view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),\n});\nexport type KanbanViewSpec = Schema.Schema.Type<typeof KanbanViewSpec>;\n\n/** Items-variant: kanban owns its items as an explicit ref array (used by externally-synced kanbans). */\nexport const KanbanItemsSpec = Schema.Struct({\n kind: Schema.Literal('items').pipe(FormInputAnnotation.set(false)),\n /** Property path on each item that drives column membership (e.g. `'listName'`). */\n pivotField: Schema.String,\n /** Items owned directly by the kanban. */\n items: Schema.Array(Ref.Ref(Obj.Unknown)).pipe(FormInputAnnotation.set(false)),\n});\nexport type KanbanItemsSpec = Schema.Schema.Type<typeof KanbanItemsSpec>;\n\n/** Discriminated union of source specs. Distinguished by `kind`. */\nexport const KanbanSpec = Schema.Union(KanbanViewSpec, KanbanItemsSpec);\nexport type KanbanSpec = Schema.Schema.Type<typeof KanbanSpec>;\n\nexport const Kanban = Schema.Struct({\n name: Schema.String.pipe(Schema.optional),\n arrangement: Arrangement,\n /** How this kanban sources its items. Discriminated by `spec.kind`. */\n spec: KanbanSpec,\n}).pipe(\n LabelAnnotation.set(['name']),\n ViewAnnotation.set(['spec', 'view']),\n Annotation.IconAnnotation.set({ icon: 'ph--kanban--regular', hue: 'green' }),\n Type.makeObject(DXN.make('org.dxos.type.kanban', '0.2.0')),\n);\n\n/**\n * Instance type; narrow on `kanban.spec.kind` (or use the guards below).\n */\nexport interface Kanban extends Type.InstanceType<typeof Kanban> {}\n\n/** Narrowed view-variant kanban. */\nexport type KanbanView = Kanban & { spec: KanbanViewSpec };\n\n/** Narrowed items-variant kanban. */\nexport type KanbanItems = Kanban & { spec: KanbanItemsSpec };\n\nexport const isKanbanView = (kanban: Kanban): kanban is KanbanView => kanban.spec.kind === 'view';\nexport const isKanbanItems = (kanban: Kanban): kanban is KanbanItems => kanban.spec.kind === 'items';\n\ntype MakeViewProps = {\n name?: string;\n view: View.View;\n arrangement?: Arrangement;\n};\n\n/**\n * Make a view-variant kanban (items sourced via the View's query).\n */\nexport const make = (props: MakeViewProps): 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 arrangement: { order, columns },\n spec: { kind: 'view' as const, view: Ref.make(view) },\n });\n};\n\ntype MakeItemsProps = {\n name?: string;\n arrangement?: Arrangement;\n pivotField: string;\n items?: ReadonlyArray<Ref.Ref<Obj.Unknown>>;\n};\n\n/**\n * Make an items-variant kanban (items list owned by the kanban itself, e.g. populated by a sync integration).\n */\nexport const makeItems = (props: MakeItemsProps): Kanban => {\n const { name, arrangement, pivotField, items = [] } = props;\n const order = arrangement?.order ?? [];\n const columns = arrangement?.columns ?? {};\n return Obj.make(Kanban, {\n name,\n arrangement: { order, columns },\n spec: { kind: 'items' as const, pivotField, items },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type, View, DXN } from '@dxos/echo';\n\nimport { meta } from '#meta';\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\nexport 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\nexport type DeleteCardFieldOutput = Schema.Schema.Type<typeof DeleteCardFieldOutput>;\n\nexport const DeleteCardField = Operation.make({\n meta: {\n key: makeKey('deleteCardField'),\n name: 'Delete Card Field',\n icon: 'ph--minus-circle--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n view: Type.getSchema(View.View),\n fieldId: Schema.String,\n }),\n output: DeleteCardFieldOutput,\n});\n\nexport const DeleteCardOutput = Schema.Struct({\n card: Schema.Any.annotations({ description: 'The deleted card.' }),\n});\n\nexport type DeleteCardOutput = Schema.Schema.Type<typeof DeleteCardOutput>;\n\nexport const DeleteCard = Operation.make({\n meta: { key: makeKey('deleteCard'), name: 'Delete Card', icon: 'ph--trash--regular' },\n input: Schema.Struct({\n card: Schema.Any,\n }),\n output: DeleteCardOutput,\n});\n\nexport const RestoreCardField = Operation.make({\n meta: {\n key: makeKey('restoreCardField'),\n name: 'Restore Card Field',\n icon: 'ph--clock-counter-clockwise--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n view: Type.getSchema(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\nexport const RestoreCard = Operation.make({\n meta: {\n key: makeKey('restoreCard'),\n name: 'Restore Card',\n icon: 'ph--clock-counter-clockwise--regular',\n },\n input: Schema.Struct({\n card: Schema.Any.annotations({ description: 'The card to restore.' }),\n }),\n output: Schema.Void,\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["UNCATEGORIZED_VALUE", "UNCATEGORIZED_ATTRIBUTES", "title", "color", "Schema", "TypeInputOptionsAnnotation", "PivotColumnAnnotationId", "Symbol", "for", "KanbanSettingsSchema", "Struct", "hideUncategorized", "Boolean", "annotations", "title", "description", "pipe", "optional", "KanbanViewSettingsSchema", "columnFieldId", "String", "fields", "CreateKanbanSchema", "name", "typename", "set", "location", "kind", "initialPivotColumn", "Schema", "DXN", "Annotation", "Obj", "Ref", "Type", "View", "FormInputAnnotation", "LabelAnnotation", "ViewAnnotation", "ArrangementColumnEntry", "Struct", "ids", "Array", "ID", "hidden", "Boolean", "pipe", "optional", "ArrangementColumns", "Record", "key", "String", "value", "set", "Arrangement", "order", "columns", "KanbanViewSpec", "kind", "Literal", "view", "KanbanItemsSpec", "pivotField", "items", "Unknown", "KanbanSpec", "Union", "Kanban", "name", "arrangement", "spec", "IconAnnotation", "icon", "hue", "makeObject", "make", "isKanbanView", "kanban", "isKanbanItems", "props", "makeItems", "Schema", "Capability", "Operation", "Type", "View", "DXN", "meta", "makeKey", "name", "make", "profile", "key", "DeleteCardFieldOutput", "Struct", "field", "FieldSchema", "annotations", "description", "props", "Any", "index", "Number", "DeleteCardField", "icon", "services", "Service", "input", "view", "getSchema", "fieldId", "String", "output", "DeleteCardOutput", "card", "DeleteCard", "RestoreCardField", "Void", "RestoreCard"]
|
|
7
|
-
}
|