@dxos/plugin-kanban 0.8.4-main.67995b8 → 0.8.4-main.dedc0f3
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/browser/blueprint-definition-GFG7LX2C.mjs +28 -0
- package/dist/lib/browser/blueprint-definition-GFG7LX2C.mjs.map +7 -0
- package/dist/lib/browser/{chunk-MUK4JV7A.mjs → chunk-NCNNL74W.mjs} +2 -28
- package/dist/lib/browser/chunk-NCNNL74W.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +13 -12
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-6GPK64NB.mjs → intent-resolver-KHOAFPNN.mjs} +11 -11
- package/dist/lib/browser/intent-resolver-KHOAFPNN.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-Y2GO6B24.mjs → react-surface-UBRYXDKS.mjs} +18 -21
- package/dist/lib/browser/react-surface-UBRYXDKS.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +3 -5
- package/dist/lib/node-esm/blueprint-definition-MIMDXMUM.mjs +30 -0
- package/dist/lib/node-esm/blueprint-definition-MIMDXMUM.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-2GCFRKS2.mjs → chunk-5B3LKGA7.mjs} +2 -28
- package/dist/lib/node-esm/chunk-5B3LKGA7.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +13 -12
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-CXHLNVEN.mjs → intent-resolver-MKO5HVES.mjs} +11 -11
- package/dist/lib/node-esm/intent-resolver-MKO5HVES.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-UEQNH6S4.mjs → react-surface-B2FPS52G.mjs} +18 -21
- package/dist/lib/node-esm/react-surface-B2FPS52G.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +3 -5
- package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +3 -3
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/components/KanbanContainer.d.ts.map +1 -1
- package/dist/types/src/components/KanbanContainer.stories.d.ts +36 -5
- package/dist/types/src/components/KanbanContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/KanbanViewEditor.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +2 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +0 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +4 -47
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +38 -37
- package/src/KanbanPlugin.tsx +8 -7
- package/src/capabilities/artifact-definition.ts +7 -4
- package/src/capabilities/blueprint-definition.ts +30 -0
- package/src/capabilities/index.ts +1 -1
- package/src/capabilities/intent-resolver.ts +7 -6
- package/src/capabilities/react-surface.tsx +4 -4
- package/src/components/KanbanContainer.stories.tsx +20 -19
- package/src/components/KanbanContainer.tsx +5 -5
- package/src/components/KanbanViewEditor.tsx +11 -9
- package/src/translations.ts +2 -2
- package/src/types/index.ts +0 -1
- package/src/types/schema.ts +1 -1
- package/dist/lib/browser/artifact-definition-NIFSAHUK.mjs +0 -174
- package/dist/lib/browser/artifact-definition-NIFSAHUK.mjs.map +0 -7
- package/dist/lib/browser/chunk-MUK4JV7A.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-6GPK64NB.mjs.map +0 -7
- package/dist/lib/browser/react-surface-Y2GO6B24.mjs.map +0 -7
- package/dist/lib/node-esm/artifact-definition-NACXLTWB.mjs +0 -175
- package/dist/lib/node-esm/artifact-definition-NACXLTWB.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2GCFRKS2.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-CXHLNVEN.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-UEQNH6S4.mjs.map +0 -7
- package/dist/types/src/types/kanban.d.ts +0 -11
- package/dist/types/src/types/kanban.d.ts.map +0 -1
- package/src/types/kanban.ts +0 -29
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-kanban",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.dedc0f3",
|
|
4
4
|
"description": "Kanban DXOS Surface plugin",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -10,16 +10,16 @@
|
|
|
10
10
|
"type": "module",
|
|
11
11
|
"exports": {
|
|
12
12
|
".": {
|
|
13
|
+
"source": "./src/index.ts",
|
|
13
14
|
"types": "./dist/types/src/index.d.ts",
|
|
14
15
|
"browser": "./dist/lib/browser/index.mjs",
|
|
15
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
16
|
-
"source": "./src/index.ts"
|
|
16
|
+
"node": "./dist/lib/node-esm/index.mjs"
|
|
17
17
|
},
|
|
18
18
|
"./types": {
|
|
19
|
+
"source": "./src/types/index.ts",
|
|
19
20
|
"types": "./dist/types/src/types/index.d.ts",
|
|
20
21
|
"browser": "./dist/lib/browser/types/index.mjs",
|
|
21
|
-
"node": "./dist/lib/node-esm/types/index.mjs"
|
|
22
|
-
"source": "./src/types/index.ts"
|
|
22
|
+
"node": "./dist/lib/node-esm/types/index.mjs"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -37,49 +37,50 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@preact-signals/safe-react": "^0.9.0",
|
|
39
39
|
"@preact/signals-core": "^1.9.0",
|
|
40
|
-
"effect": "3.17.
|
|
41
|
-
"@dxos/ai": "0.8.4-main.
|
|
42
|
-
"@dxos/assistant": "0.8.4-main.
|
|
43
|
-
"@dxos/app-framework": "0.8.4-main.
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/effect": "0.8.4-main.
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/invariant": "0.8.4-main.
|
|
50
|
-
"@dxos/log": "0.8.4-main.
|
|
51
|
-
"@dxos/plugin-client": "0.8.4-main.
|
|
52
|
-
"@dxos/plugin-
|
|
53
|
-
"@dxos/plugin-
|
|
54
|
-
"@dxos/plugin-space": "0.8.4-main.
|
|
55
|
-
"@dxos/
|
|
56
|
-
"@dxos/react-client": "0.8.4-main.
|
|
57
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
58
|
-
"@dxos/react-ui-
|
|
59
|
-
"@dxos/react-ui-
|
|
60
|
-
"@dxos/
|
|
61
|
-
"@dxos/
|
|
62
|
-
"@dxos/
|
|
40
|
+
"effect": "3.17.7",
|
|
41
|
+
"@dxos/ai": "0.8.4-main.dedc0f3",
|
|
42
|
+
"@dxos/assistant": "0.8.4-main.dedc0f3",
|
|
43
|
+
"@dxos/app-framework": "0.8.4-main.dedc0f3",
|
|
44
|
+
"@dxos/echo": "0.8.4-main.dedc0f3",
|
|
45
|
+
"@dxos/echo-schema": "0.8.4-main.dedc0f3",
|
|
46
|
+
"@dxos/blueprints": "0.8.4-main.dedc0f3",
|
|
47
|
+
"@dxos/effect": "0.8.4-main.dedc0f3",
|
|
48
|
+
"@dxos/functions": "0.8.4-main.dedc0f3",
|
|
49
|
+
"@dxos/invariant": "0.8.4-main.dedc0f3",
|
|
50
|
+
"@dxos/log": "0.8.4-main.dedc0f3",
|
|
51
|
+
"@dxos/plugin-client": "0.8.4-main.dedc0f3",
|
|
52
|
+
"@dxos/plugin-search": "0.8.4-main.dedc0f3",
|
|
53
|
+
"@dxos/plugin-graph": "0.8.4-main.dedc0f3",
|
|
54
|
+
"@dxos/plugin-space": "0.8.4-main.dedc0f3",
|
|
55
|
+
"@dxos/async": "0.8.4-main.dedc0f3",
|
|
56
|
+
"@dxos/react-client": "0.8.4-main.dedc0f3",
|
|
57
|
+
"@dxos/react-ui": "0.8.4-main.dedc0f3",
|
|
58
|
+
"@dxos/react-ui-form": "0.8.4-main.dedc0f3",
|
|
59
|
+
"@dxos/react-ui-kanban": "0.8.4-main.dedc0f3",
|
|
60
|
+
"@dxos/schema": "0.8.4-main.dedc0f3",
|
|
61
|
+
"@dxos/react-ui-stack": "0.8.4-main.dedc0f3",
|
|
62
|
+
"@dxos/random": "0.8.4-main.dedc0f3",
|
|
63
|
+
"@dxos/util": "0.8.4-main.dedc0f3"
|
|
63
64
|
},
|
|
64
65
|
"devDependencies": {
|
|
65
66
|
"@types/react": "~18.2.0",
|
|
66
67
|
"@types/react-dom": "~18.2.0",
|
|
67
68
|
"react": "~18.2.0",
|
|
68
69
|
"react-dom": "~18.2.0",
|
|
69
|
-
"vite": "
|
|
70
|
-
"@dxos/plugin-preview": "0.8.4-main.
|
|
71
|
-
"@dxos/plugin-theme": "0.8.4-main.
|
|
72
|
-
"@dxos/react-ui-syntax-highlighter": "0.8.4-main.
|
|
73
|
-
"@dxos/
|
|
74
|
-
"@dxos/
|
|
75
|
-
"@dxos/test-utils": "0.8.4-main.
|
|
70
|
+
"vite": "7.1.1",
|
|
71
|
+
"@dxos/plugin-preview": "0.8.4-main.dedc0f3",
|
|
72
|
+
"@dxos/plugin-theme": "0.8.4-main.dedc0f3",
|
|
73
|
+
"@dxos/react-ui-syntax-highlighter": "0.8.4-main.dedc0f3",
|
|
74
|
+
"@dxos/react-ui-theme": "0.8.4-main.dedc0f3",
|
|
75
|
+
"@dxos/storybook-utils": "0.8.4-main.dedc0f3",
|
|
76
|
+
"@dxos/test-utils": "0.8.4-main.dedc0f3"
|
|
76
77
|
},
|
|
77
78
|
"peerDependencies": {
|
|
78
79
|
"effect": "^3.13.3",
|
|
79
80
|
"react": "~18.2.0",
|
|
80
81
|
"react-dom": "~18.2.0",
|
|
81
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
82
|
-
"@dxos/react-ui-theme": "0.8.4-main.
|
|
82
|
+
"@dxos/react-ui": "0.8.4-main.dedc0f3",
|
|
83
|
+
"@dxos/react-ui-theme": "0.8.4-main.dedc0f3"
|
|
83
84
|
},
|
|
84
85
|
"publishConfig": {
|
|
85
86
|
"access": "public"
|
package/src/KanbanPlugin.tsx
CHANGED
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Capabilities, Events, contributes, createIntent, defineModule, definePlugin } from '@dxos/app-framework';
|
|
6
6
|
import { ClientEvents } from '@dxos/plugin-client';
|
|
7
7
|
import { SpaceCapabilities } from '@dxos/plugin-space';
|
|
8
8
|
import { defineObjectForm } from '@dxos/plugin-space/types';
|
|
9
|
-
import {
|
|
9
|
+
import { translations as kanbanTranslations } from '@dxos/react-ui-kanban';
|
|
10
|
+
import { Kanban } from '@dxos/react-ui-kanban/types';
|
|
10
11
|
|
|
11
|
-
import {
|
|
12
|
+
import { BlueprintDefinition, IntentResolver, ReactSurface } from './capabilities';
|
|
12
13
|
import { meta } from './meta';
|
|
13
14
|
import { translations } from './translations';
|
|
14
15
|
import { CreateKanbanSchema, KanbanAction } from './types';
|
|
@@ -25,7 +26,7 @@ export const KanbanPlugin = () =>
|
|
|
25
26
|
activatesOn: Events.SetupMetadata,
|
|
26
27
|
activate: () =>
|
|
27
28
|
contributes(Capabilities.Metadata, {
|
|
28
|
-
id:
|
|
29
|
+
id: Kanban.Kanban.typename,
|
|
29
30
|
metadata: {
|
|
30
31
|
icon: 'ph--kanban--regular',
|
|
31
32
|
},
|
|
@@ -38,7 +39,7 @@ export const KanbanPlugin = () =>
|
|
|
38
39
|
contributes(
|
|
39
40
|
SpaceCapabilities.ObjectForm,
|
|
40
41
|
defineObjectForm({
|
|
41
|
-
objectSchema:
|
|
42
|
+
objectSchema: Kanban.Kanban,
|
|
42
43
|
formSchema: CreateKanbanSchema,
|
|
43
44
|
hidden: true,
|
|
44
45
|
getIntent: (props, options) => createIntent(KanbanAction.Create, { ...props, space: options.space }),
|
|
@@ -56,8 +57,8 @@ export const KanbanPlugin = () =>
|
|
|
56
57
|
activate: IntentResolver,
|
|
57
58
|
}),
|
|
58
59
|
defineModule({
|
|
59
|
-
id: `${meta.id}/module/
|
|
60
|
+
id: `${meta.id}/module/blueprint`,
|
|
60
61
|
activatesOn: Events.SetupArtifactDefinition,
|
|
61
|
-
activate:
|
|
62
|
+
activate: BlueprintDefinition,
|
|
62
63
|
}),
|
|
63
64
|
]);
|
|
@@ -2,16 +2,19 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
// ISSUE(burdon): defineArtifact
|
|
6
|
+
// @ts-nocheck
|
|
7
|
+
|
|
5
8
|
import { Schema, pipe } from 'effect';
|
|
6
9
|
|
|
7
|
-
import {
|
|
8
|
-
import { Capabilities, chain, contributes, createIntent
|
|
10
|
+
import { ToolResult, createTool } from '@dxos/ai';
|
|
11
|
+
import { Capabilities, type PromiseIntentDispatcher, chain, contributes, createIntent } from '@dxos/app-framework';
|
|
9
12
|
import { createArtifactElement } from '@dxos/assistant';
|
|
10
13
|
import { defineArtifact } from '@dxos/blueprints';
|
|
11
14
|
import { Obj, Query } from '@dxos/echo';
|
|
12
15
|
import { invariant } from '@dxos/invariant';
|
|
13
16
|
import { SpaceAction } from '@dxos/plugin-space/types';
|
|
14
|
-
import { Filter,
|
|
17
|
+
import { Filter, type Space, fullyQualifiedId } from '@dxos/react-client/echo';
|
|
15
18
|
import { KanbanView } from '@dxos/react-ui-kanban';
|
|
16
19
|
import { DataType } from '@dxos/schema';
|
|
17
20
|
import { isNonNullable } from '@dxos/util';
|
|
@@ -49,7 +52,7 @@ export default () => {
|
|
|
49
52
|
caption: 'Creating kanban board...',
|
|
50
53
|
schema: Schema.Struct({
|
|
51
54
|
typename: Schema.String.annotations({
|
|
52
|
-
description: 'The fully qualified
|
|
55
|
+
description: 'The fully qualified name of the record type to use for the kanban cards.',
|
|
53
56
|
}),
|
|
54
57
|
pivotColumn: Schema.optional(Schema.String).annotations({
|
|
55
58
|
description: 'Optional field name to use as the column pivot.',
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Capabilities, contributes } from '@dxos/app-framework';
|
|
6
|
+
import { Blueprint, Template } from '@dxos/blueprints';
|
|
7
|
+
import { type FunctionDefinition } from '@dxos/functions';
|
|
8
|
+
import { trim } from '@dxos/util';
|
|
9
|
+
|
|
10
|
+
const functions: FunctionDefinition[] = [];
|
|
11
|
+
const tools: string[] = [];
|
|
12
|
+
|
|
13
|
+
export default () => {
|
|
14
|
+
return [
|
|
15
|
+
contributes(Capabilities.Functions, functions),
|
|
16
|
+
contributes(
|
|
17
|
+
Capabilities.BlueprintDefinition,
|
|
18
|
+
Blueprint.make({
|
|
19
|
+
key: 'dxos.org/blueprint/kanban',
|
|
20
|
+
name: 'Kanban',
|
|
21
|
+
tools: Blueprint.toolDefinitions({ functions, tools }),
|
|
22
|
+
instructions: Template.make({
|
|
23
|
+
source: trim`
|
|
24
|
+
You can create and update kanban boards to show data in sorted columns defined by schema.
|
|
25
|
+
`,
|
|
26
|
+
}),
|
|
27
|
+
}),
|
|
28
|
+
),
|
|
29
|
+
];
|
|
30
|
+
};
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
import { lazy } from '@dxos/app-framework';
|
|
6
6
|
|
|
7
|
-
export const
|
|
7
|
+
export const BlueprintDefinition = lazy(() => import('./blueprint-definition'));
|
|
8
8
|
export const IntentResolver = lazy(() => import('./intent-resolver'));
|
|
9
9
|
export const ReactSurface = lazy(() => import('./react-surface'));
|
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Capabilities, type PluginContext, contributes, createResolver } from '@dxos/app-framework';
|
|
6
6
|
import { invariant } from '@dxos/invariant';
|
|
7
7
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
8
8
|
import { getSpace } from '@dxos/react-client/echo';
|
|
9
|
-
import {
|
|
9
|
+
import { Kanban } from '@dxos/react-ui-kanban/types';
|
|
10
|
+
import { ProjectionModel, typenameFromQuery } from '@dxos/schema';
|
|
10
11
|
|
|
11
12
|
import { KANBAN_PLUGIN } from '../meta';
|
|
12
|
-
import {
|
|
13
|
+
import { KanbanAction } from '../types';
|
|
13
14
|
|
|
14
15
|
export default (context: PluginContext) =>
|
|
15
16
|
contributes(Capabilities.IntentResolver, [
|
|
@@ -17,12 +18,12 @@ export default (context: PluginContext) =>
|
|
|
17
18
|
intent: KanbanAction.Create,
|
|
18
19
|
resolve: async ({ space, name, typename, initialPivotColumn }) => {
|
|
19
20
|
const client = context.getCapability(ClientCapabilities.Client);
|
|
20
|
-
const { view } = await
|
|
21
|
+
const { view } = await Kanban.makeView({
|
|
21
22
|
client,
|
|
22
23
|
space,
|
|
23
24
|
name,
|
|
24
25
|
typename,
|
|
25
|
-
initialPivotColumn,
|
|
26
|
+
pivotFieldName: initialPivotColumn,
|
|
26
27
|
});
|
|
27
28
|
return { data: { object: view } };
|
|
28
29
|
},
|
|
@@ -30,7 +31,7 @@ export default (context: PluginContext) =>
|
|
|
30
31
|
createResolver({
|
|
31
32
|
intent: KanbanAction.DeleteCardField,
|
|
32
33
|
resolve: async ({ view, fieldId, deletionData }, undo) => {
|
|
33
|
-
const schema = getSpace(view)?.db.schemaRegistry.getSchema(view.query
|
|
34
|
+
const schema = getSpace(view)?.db.schemaRegistry.getSchema(typenameFromQuery(view.query)!);
|
|
34
35
|
invariant(schema);
|
|
35
36
|
const projection = new ProjectionModel(schema.jsonSchema, view.projection);
|
|
36
37
|
|
|
@@ -9,9 +9,9 @@ import { Capabilities, contributes, createSurface, useCapabilities } from '@dxos
|
|
|
9
9
|
import { Obj, Type } from '@dxos/echo';
|
|
10
10
|
import { findAnnotation } from '@dxos/effect';
|
|
11
11
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
12
|
-
import { getSpace, isSpace
|
|
12
|
+
import { type Space, getSpace, isSpace } from '@dxos/react-client/echo';
|
|
13
13
|
import { type InputProps, SelectInput, useFormValues } from '@dxos/react-ui-form';
|
|
14
|
-
import {
|
|
14
|
+
import { Kanban } from '@dxos/react-ui-kanban/types';
|
|
15
15
|
import { DataType } from '@dxos/schema';
|
|
16
16
|
|
|
17
17
|
import { KanbanContainer, KanbanViewEditor } from '../components';
|
|
@@ -24,7 +24,7 @@ export default () =>
|
|
|
24
24
|
id: meta.id,
|
|
25
25
|
role: ['article', 'section'],
|
|
26
26
|
filter: (data): data is { subject: DataType.View } =>
|
|
27
|
-
Obj.instanceOf(DataType.View, data.subject) && Obj.instanceOf(
|
|
27
|
+
Obj.instanceOf(DataType.View, data.subject) && Obj.instanceOf(Kanban.Kanban, data.subject.presentation.target),
|
|
28
28
|
component: ({ data, role }) => <KanbanContainer view={data.subject} role={role} />,
|
|
29
29
|
}),
|
|
30
30
|
createSurface({
|
|
@@ -32,7 +32,7 @@ export default () =>
|
|
|
32
32
|
role: 'object-settings',
|
|
33
33
|
position: 'hoist',
|
|
34
34
|
filter: (data): data is { subject: DataType.View } =>
|
|
35
|
-
Obj.instanceOf(DataType.View, data.subject) && Obj.instanceOf(
|
|
35
|
+
Obj.instanceOf(DataType.View, data.subject) && Obj.instanceOf(Kanban.Kanban, data.subject.presentation.target),
|
|
36
36
|
component: ({ data }) => <KanbanViewEditor view={data.subject} />,
|
|
37
37
|
}),
|
|
38
38
|
createSurface({
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
import '@dxos-theme';
|
|
6
6
|
|
|
7
|
-
import { type
|
|
7
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
8
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
9
9
|
|
|
10
10
|
import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
|
|
11
11
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
12
|
-
import { Obj, Type } from '@dxos/echo';
|
|
12
|
+
import { Obj, Query, Type } from '@dxos/echo';
|
|
13
13
|
import { invariant } from '@dxos/invariant';
|
|
14
14
|
import { ClientPlugin } from '@dxos/plugin-client';
|
|
15
15
|
import { PreviewPlugin } from '@dxos/plugin-preview';
|
|
@@ -19,16 +19,16 @@ import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
|
|
|
19
19
|
import { ThemePlugin } from '@dxos/plugin-theme';
|
|
20
20
|
import { faker } from '@dxos/random';
|
|
21
21
|
import { useClient } from '@dxos/react-client';
|
|
22
|
-
import { Filter,
|
|
22
|
+
import { Filter, useQuery, useSchema, useSpaces } from '@dxos/react-client/echo';
|
|
23
23
|
import { ViewEditor } from '@dxos/react-ui-form';
|
|
24
|
-
import { Kanban
|
|
24
|
+
import { Kanban as KanbanComponent, useKanbanModel } from '@dxos/react-ui-kanban';
|
|
25
|
+
import { Kanban } from '@dxos/react-ui-kanban/types';
|
|
25
26
|
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
26
27
|
import { defaultTx } from '@dxos/react-ui-theme';
|
|
27
|
-
import { DataType, ProjectionModel } from '@dxos/schema';
|
|
28
|
+
import { DataType, ProjectionModel, typenameFromQuery } from '@dxos/schema';
|
|
28
29
|
import { withLayout } from '@dxos/storybook-utils';
|
|
29
30
|
|
|
30
31
|
import { translations } from '../translations';
|
|
31
|
-
import { createKanban } from '../types';
|
|
32
32
|
|
|
33
33
|
faker.seed(0);
|
|
34
34
|
|
|
@@ -51,7 +51,8 @@ const StorybookKanban = () => {
|
|
|
51
51
|
const views = useQuery(space, Filter.type(DataType.View));
|
|
52
52
|
const [view, setView] = useState<DataType.View>();
|
|
53
53
|
const [projection, setProjection] = useState<ProjectionModel>();
|
|
54
|
-
const
|
|
54
|
+
const typename = view?.query ? typenameFromQuery(view.query) : undefined;
|
|
55
|
+
const schema = useSchema(client, space, typename);
|
|
55
56
|
|
|
56
57
|
useEffect(() => {
|
|
57
58
|
if (views.length && !view) {
|
|
@@ -97,14 +98,14 @@ const StorybookKanban = () => {
|
|
|
97
98
|
|
|
98
99
|
const handleRemoveCard = useCallback((card: { id: string }) => space.db.remove(card), [space]);
|
|
99
100
|
|
|
100
|
-
const
|
|
101
|
+
const handleUpdateQuery = useCallback(
|
|
101
102
|
(typename: string) => {
|
|
102
103
|
invariant(schema);
|
|
103
104
|
invariant(Type.isMutable(schema));
|
|
104
105
|
invariant(view);
|
|
105
106
|
|
|
106
107
|
schema.updateTypename(typename);
|
|
107
|
-
view.query
|
|
108
|
+
view.query = Query.select(Filter.typename(typename)).ast;
|
|
108
109
|
},
|
|
109
110
|
[view, schema],
|
|
110
111
|
);
|
|
@@ -115,18 +116,18 @@ const StorybookKanban = () => {
|
|
|
115
116
|
|
|
116
117
|
return (
|
|
117
118
|
<div className='grow grid grid-cols-[1fr_350px]'>
|
|
118
|
-
{model ? <
|
|
119
|
+
{model ? <KanbanComponent model={model} onAddCard={handleAddCard} onRemoveCard={handleRemoveCard} /> : <div />}
|
|
119
120
|
<div className='flex flex-col bs-full border-is border-separator overflow-y-auto'>
|
|
120
121
|
<ViewEditor
|
|
121
122
|
registry={space?.db.schemaRegistry}
|
|
122
123
|
schema={schema}
|
|
123
124
|
view={view}
|
|
124
|
-
|
|
125
|
+
onQueryChanged={handleUpdateQuery}
|
|
125
126
|
onDelete={(fieldId: string) => {
|
|
126
127
|
console.log('[ViewEditor]', 'onDelete', fieldId);
|
|
127
128
|
}}
|
|
128
129
|
/>
|
|
129
|
-
<SyntaxHighlighter language='json' className='
|
|
130
|
+
<SyntaxHighlighter language='json' className='text-xs'>
|
|
130
131
|
{JSON.stringify({ view, schema }, null, 2)}
|
|
131
132
|
</SyntaxHighlighter>
|
|
132
133
|
</div>
|
|
@@ -142,7 +143,7 @@ type StoryProps = {
|
|
|
142
143
|
// Story definitions.
|
|
143
144
|
//
|
|
144
145
|
|
|
145
|
-
const meta
|
|
146
|
+
const meta = {
|
|
146
147
|
title: 'plugins/plugin-kanban/Kanban',
|
|
147
148
|
component: StorybookKanban,
|
|
148
149
|
render: () => <StorybookKanban />,
|
|
@@ -153,16 +154,16 @@ const meta: Meta<StoryProps> = {
|
|
|
153
154
|
plugins: [
|
|
154
155
|
ThemePlugin({ tx: defaultTx }),
|
|
155
156
|
ClientPlugin({
|
|
156
|
-
types: [DataType.Organization, DataType.Person, DataType.View,
|
|
157
|
-
onClientInitialized: async (
|
|
157
|
+
types: [DataType.Organization, DataType.Person, DataType.View, Kanban.Kanban],
|
|
158
|
+
onClientInitialized: async ({ client }) => {
|
|
158
159
|
await client.halo.createIdentity();
|
|
159
160
|
const space = await client.spaces.create();
|
|
160
161
|
await space.waitUntilReady();
|
|
161
|
-
const { view } = await
|
|
162
|
+
const { view } = await Kanban.makeView({
|
|
162
163
|
client,
|
|
163
164
|
space,
|
|
164
165
|
typename: DataType.Organization.typename,
|
|
165
|
-
|
|
166
|
+
pivotFieldName: 'status',
|
|
166
167
|
});
|
|
167
168
|
space.db.add(view);
|
|
168
169
|
|
|
@@ -180,10 +181,10 @@ const meta: Meta<StoryProps> = {
|
|
|
180
181
|
],
|
|
181
182
|
}),
|
|
182
183
|
],
|
|
183
|
-
}
|
|
184
|
+
} satisfies Meta<typeof StorybookKanban>;
|
|
184
185
|
|
|
185
186
|
export default meta;
|
|
186
187
|
|
|
187
|
-
type Story = StoryObj<
|
|
188
|
+
type Story = StoryObj<typeof meta>;
|
|
188
189
|
|
|
189
190
|
export const Default: Story = {};
|
|
@@ -9,10 +9,10 @@ import { Filter, Obj, Type } from '@dxos/echo';
|
|
|
9
9
|
import { EchoSchema, type TypedObject } from '@dxos/echo-schema';
|
|
10
10
|
import { useGlobalFilteredObjects } from '@dxos/plugin-search';
|
|
11
11
|
import { useClient } from '@dxos/react-client';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { getSpace, useQuery } from '@dxos/react-client/echo';
|
|
13
|
+
import { Kanban, useKanbanModel } from '@dxos/react-ui-kanban';
|
|
14
14
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
15
|
-
import { ProjectionModel,
|
|
15
|
+
import { type DataType, ProjectionModel, typenameFromQuery } from '@dxos/schema';
|
|
16
16
|
|
|
17
17
|
import { KanbanAction } from '../types';
|
|
18
18
|
|
|
@@ -22,6 +22,7 @@ export const KanbanContainer = ({ view }: { view: DataType.View; role: string })
|
|
|
22
22
|
const [projection, setProjection] = useState<ProjectionModel>();
|
|
23
23
|
const space = getSpace(view);
|
|
24
24
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
25
|
+
const typename = view.query ? typenameFromQuery(view.query) : undefined;
|
|
25
26
|
|
|
26
27
|
const jsonSchema = useMemo(() => {
|
|
27
28
|
if (!cardSchema) {
|
|
@@ -31,7 +32,6 @@ export const KanbanContainer = ({ view }: { view: DataType.View; role: string })
|
|
|
31
32
|
}, [cardSchema]);
|
|
32
33
|
|
|
33
34
|
useEffect(() => {
|
|
34
|
-
const typename = view.query.typename;
|
|
35
35
|
const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename);
|
|
36
36
|
if (staticSchema) {
|
|
37
37
|
setCardSchema(() => staticSchema as TypedObject<any, any>);
|
|
@@ -49,7 +49,7 @@ export const KanbanContainer = ({ view }: { view: DataType.View; role: string })
|
|
|
49
49
|
);
|
|
50
50
|
return unsubscribe;
|
|
51
51
|
}
|
|
52
|
-
}, [
|
|
52
|
+
}, [typename, space]);
|
|
53
53
|
|
|
54
54
|
useEffect(() => {
|
|
55
55
|
if (jsonSchema) {
|
|
@@ -8,17 +8,16 @@ import { Type } from '@dxos/echo';
|
|
|
8
8
|
import { EchoSchema, FormatEnum } from '@dxos/echo-schema';
|
|
9
9
|
import { useClient } from '@dxos/react-client';
|
|
10
10
|
import { getSpace, useSchema } from '@dxos/react-client/echo';
|
|
11
|
-
import { Form, SelectInput
|
|
12
|
-
import {
|
|
13
|
-
import { type DataType, ProjectionModel } from '@dxos/schema';
|
|
11
|
+
import { type CustomInputMap, Form, SelectInput } from '@dxos/react-ui-form';
|
|
12
|
+
import { Kanban } from '@dxos/react-ui-kanban/types';
|
|
13
|
+
import { type DataType, ProjectionModel, typenameFromQuery } from '@dxos/schema';
|
|
14
14
|
|
|
15
15
|
type KanbanViewEditorProps = { view: DataType.View };
|
|
16
16
|
|
|
17
17
|
export const KanbanViewEditor = ({ view }: KanbanViewEditorProps) => {
|
|
18
18
|
const client = useClient();
|
|
19
19
|
const space = getSpace(view);
|
|
20
|
-
const
|
|
21
|
-
const currentTypename = useMemo(() => view.query.typename, [view.query.typename]);
|
|
20
|
+
const currentTypename = view.query ? typenameFromQuery(view.query) : undefined;
|
|
22
21
|
const schema = useSchema(client, space, currentTypename);
|
|
23
22
|
|
|
24
23
|
const projection = useMemo(() => {
|
|
@@ -35,12 +34,15 @@ export const KanbanViewEditor = ({ view }: KanbanViewEditorProps) => {
|
|
|
35
34
|
|
|
36
35
|
const handleSave = useCallback(
|
|
37
36
|
(values: Partial<{ columnFieldId: string }>) => {
|
|
38
|
-
|
|
37
|
+
view.projection.pivotFieldId = values.columnFieldId;
|
|
39
38
|
},
|
|
40
|
-
[
|
|
39
|
+
[view],
|
|
41
40
|
);
|
|
42
41
|
|
|
43
|
-
const initialValues = useMemo(
|
|
42
|
+
const initialValues = useMemo(
|
|
43
|
+
() => ({ columnFieldId: view.projection.pivotFieldId }),
|
|
44
|
+
[view.projection.pivotFieldId],
|
|
45
|
+
);
|
|
44
46
|
const custom: CustomInputMap = useMemo(
|
|
45
47
|
() => ({ columnFieldId: (props) => <SelectInput {...props} options={selectFields} /> }),
|
|
46
48
|
[selectFields],
|
|
@@ -49,7 +51,7 @@ export const KanbanViewEditor = ({ view }: KanbanViewEditorProps) => {
|
|
|
49
51
|
return (
|
|
50
52
|
<Form
|
|
51
53
|
Custom={custom}
|
|
52
|
-
schema={
|
|
54
|
+
schema={Kanban.SettingsSchema}
|
|
53
55
|
values={initialValues}
|
|
54
56
|
onSave={handleSave}
|
|
55
57
|
autoSave
|
package/src/translations.ts
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type Resource } from '@dxos/react-ui';
|
|
6
|
-
import {
|
|
6
|
+
import { Kanban } from '@dxos/react-ui-kanban/types';
|
|
7
7
|
|
|
8
8
|
import { meta } from './meta';
|
|
9
9
|
|
|
10
10
|
export const translations = [
|
|
11
11
|
{
|
|
12
12
|
'en-US': {
|
|
13
|
-
[
|
|
13
|
+
[Kanban.Kanban.typename]: {
|
|
14
14
|
'typename label': 'Kanban',
|
|
15
15
|
'typename label_zero': 'Kanbans',
|
|
16
16
|
'typename label_one': 'Kanban',
|
package/src/types/index.ts
CHANGED
package/src/types/schema.ts
CHANGED
|
@@ -26,7 +26,7 @@ export const CreateKanbanSchema = Schema.Struct({
|
|
|
26
26
|
typename: Schema.optional(
|
|
27
27
|
Schema.String.annotations({
|
|
28
28
|
[TypenameAnnotationId]: ['used-static', 'dynamic'],
|
|
29
|
-
title: 'Select card
|
|
29
|
+
title: 'Select card record type (leave empty to start fresh)',
|
|
30
30
|
}),
|
|
31
31
|
),
|
|
32
32
|
initialPivotColumn: Schema.optional(
|