@dxos/plugin-kanban 0.8.4-main.2e9d522 → 0.8.4-main.406dc2a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/lib/browser/blueprint-definition-UYVX622Q.mjs +28 -0
  2. package/dist/lib/browser/blueprint-definition-UYVX622Q.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-X44RHBZK.mjs → chunk-K7KYFJ3P.mjs} +6 -34
  4. package/dist/lib/browser/chunk-K7KYFJ3P.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +14 -15
  6. package/dist/lib/browser/index.mjs.map +3 -3
  7. package/dist/lib/browser/{intent-resolver-E6O3LBAB.mjs → intent-resolver-LR3SDMKQ.mjs} +15 -15
  8. package/dist/lib/browser/intent-resolver-LR3SDMKQ.mjs.map +7 -0
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/{react-surface-MWNNZYMN.mjs → react-surface-R2ORFB43.mjs} +25 -26
  11. package/dist/lib/browser/react-surface-R2ORFB43.mjs.map +7 -0
  12. package/dist/lib/browser/types/index.mjs +3 -5
  13. package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs +30 -0
  14. package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs.map +7 -0
  15. package/dist/lib/node-esm/{chunk-6WK5CGYY.mjs → chunk-VDWYSHP4.mjs} +6 -34
  16. package/dist/lib/node-esm/chunk-VDWYSHP4.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +14 -15
  18. package/dist/lib/node-esm/index.mjs.map +3 -3
  19. package/dist/lib/node-esm/{intent-resolver-LPASDELU.mjs → intent-resolver-CKDNVLND.mjs} +15 -15
  20. package/dist/lib/node-esm/intent-resolver-CKDNVLND.mjs.map +7 -0
  21. package/dist/lib/node-esm/meta.json +1 -1
  22. package/dist/lib/node-esm/{react-surface-T52BBG45.mjs → react-surface-RMRLHCOY.mjs} +25 -26
  23. package/dist/lib/node-esm/react-surface-RMRLHCOY.mjs.map +7 -0
  24. package/dist/lib/node-esm/types/index.mjs +3 -5
  25. package/dist/types/src/KanbanPlugin.d.ts +1 -1
  26. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  27. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
  28. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  29. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  30. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  31. package/dist/types/src/capabilities/index.d.ts +3 -3
  32. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  33. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  34. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  35. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  36. package/dist/types/src/components/KanbanContainer.d.ts.map +1 -1
  37. package/dist/types/src/components/KanbanContainer.stories.d.ts +37 -6
  38. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/KanbanViewEditor.d.ts.map +1 -1
  40. package/dist/types/src/meta.d.ts +0 -1
  41. package/dist/types/src/meta.d.ts.map +1 -1
  42. package/dist/types/src/translations.d.ts +2 -2
  43. package/dist/types/src/translations.d.ts.map +1 -1
  44. package/dist/types/src/types/index.d.ts +0 -1
  45. package/dist/types/src/types/index.d.ts.map +1 -1
  46. package/dist/types/src/types/schema.d.ts +11 -54
  47. package/dist/types/src/types/schema.d.ts.map +1 -1
  48. package/dist/types/tsconfig.tsbuildinfo +1 -1
  49. package/package.json +42 -40
  50. package/src/KanbanPlugin.tsx +50 -50
  51. package/src/capabilities/artifact-definition.ts +10 -6
  52. package/src/capabilities/blueprint-definition.ts +30 -0
  53. package/src/capabilities/index.ts +1 -1
  54. package/src/capabilities/intent-resolver.ts +10 -9
  55. package/src/capabilities/react-surface.tsx +5 -5
  56. package/src/components/KanbanContainer.stories.tsx +34 -30
  57. package/src/components/KanbanContainer.tsx +6 -6
  58. package/src/components/KanbanViewEditor.tsx +15 -11
  59. package/src/meta.ts +1 -3
  60. package/src/translations.ts +2 -2
  61. package/src/types/index.ts +0 -1
  62. package/src/types/schema.ts +5 -5
  63. package/dist/lib/browser/artifact-definition-WMSZK3RW.mjs +0 -174
  64. package/dist/lib/browser/artifact-definition-WMSZK3RW.mjs.map +0 -7
  65. package/dist/lib/browser/chunk-X44RHBZK.mjs.map +0 -7
  66. package/dist/lib/browser/intent-resolver-E6O3LBAB.mjs.map +0 -7
  67. package/dist/lib/browser/react-surface-MWNNZYMN.mjs.map +0 -7
  68. package/dist/lib/node-esm/artifact-definition-QVZXPDXK.mjs +0 -175
  69. package/dist/lib/node-esm/artifact-definition-QVZXPDXK.mjs.map +0 -7
  70. package/dist/lib/node-esm/chunk-6WK5CGYY.mjs.map +0 -7
  71. package/dist/lib/node-esm/intent-resolver-LPASDELU.mjs.map +0 -7
  72. package/dist/lib/node-esm/react-surface-T52BBG45.mjs.map +0 -7
  73. package/dist/types/src/types/kanban.d.ts +0 -11
  74. package/dist/types/src/types/kanban.d.ts.map +0 -1
  75. 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.2e9d522",
3
+ "version": "0.8.4-main.406dc2a",
4
4
  "description": "Kanban DXOS Surface plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,11 +10,13 @@
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
16
  "node": "./dist/lib/node-esm/index.mjs"
16
17
  },
17
18
  "./types": {
19
+ "source": "./src/types/index.ts",
18
20
  "types": "./dist/types/src/types/index.d.ts",
19
21
  "browser": "./dist/lib/browser/types/index.mjs",
20
22
  "node": "./dist/lib/node-esm/types/index.mjs"
@@ -34,50 +36,50 @@
34
36
  ],
35
37
  "dependencies": {
36
38
  "@preact-signals/safe-react": "^0.9.0",
37
- "@preact/signals-core": "^1.9.0",
38
- "effect": "3.17.0",
39
- "@dxos/ai": "0.8.4-main.2e9d522",
40
- "@dxos/assistant": "0.8.4-main.2e9d522",
41
- "@dxos/async": "0.8.4-main.2e9d522",
42
- "@dxos/blueprints": "0.8.4-main.2e9d522",
43
- "@dxos/echo": "0.8.4-main.2e9d522",
44
- "@dxos/echo-schema": "0.8.4-main.2e9d522",
45
- "@dxos/app-framework": "0.8.4-main.2e9d522",
46
- "@dxos/effect": "0.8.4-main.2e9d522",
47
- "@dxos/log": "0.8.4-main.2e9d522",
48
- "@dxos/plugin-client": "0.8.4-main.2e9d522",
49
- "@dxos/plugin-graph": "0.8.4-main.2e9d522",
50
- "@dxos/plugin-search": "0.8.4-main.2e9d522",
51
- "@dxos/plugin-space": "0.8.4-main.2e9d522",
52
- "@dxos/random": "0.8.4-main.2e9d522",
53
- "@dxos/invariant": "0.8.4-main.2e9d522",
54
- "@dxos/react-client": "0.8.4-main.2e9d522",
55
- "@dxos/react-ui": "0.8.4-main.2e9d522",
56
- "@dxos/react-ui-form": "0.8.4-main.2e9d522",
57
- "@dxos/react-ui-kanban": "0.8.4-main.2e9d522",
58
- "@dxos/schema": "0.8.4-main.2e9d522",
59
- "@dxos/react-ui-stack": "0.8.4-main.2e9d522",
60
- "@dxos/util": "0.8.4-main.2e9d522"
39
+ "@preact/signals-core": "^1.12.1",
40
+ "effect": "3.18.3",
41
+ "@dxos/ai": "0.8.4-main.406dc2a",
42
+ "@dxos/app-framework": "0.8.4-main.406dc2a",
43
+ "@dxos/assistant": "0.8.4-main.406dc2a",
44
+ "@dxos/async": "0.8.4-main.406dc2a",
45
+ "@dxos/effect": "0.8.4-main.406dc2a",
46
+ "@dxos/echo": "0.8.4-main.406dc2a",
47
+ "@dxos/functions": "0.8.4-main.406dc2a",
48
+ "@dxos/blueprints": "0.8.4-main.406dc2a",
49
+ "@dxos/invariant": "0.8.4-main.406dc2a",
50
+ "@dxos/log": "0.8.4-main.406dc2a",
51
+ "@dxos/plugin-client": "0.8.4-main.406dc2a",
52
+ "@dxos/plugin-graph": "0.8.4-main.406dc2a",
53
+ "@dxos/plugin-search": "0.8.4-main.406dc2a",
54
+ "@dxos/random": "0.8.4-main.406dc2a",
55
+ "@dxos/react-client": "0.8.4-main.406dc2a",
56
+ "@dxos/plugin-space": "0.8.4-main.406dc2a",
57
+ "@dxos/react-ui": "0.8.4-main.406dc2a",
58
+ "@dxos/react-ui-kanban": "0.8.4-main.406dc2a",
59
+ "@dxos/react-ui-stack": "0.8.4-main.406dc2a",
60
+ "@dxos/react-ui-form": "0.8.4-main.406dc2a",
61
+ "@dxos/schema": "0.8.4-main.406dc2a",
62
+ "@dxos/util": "0.8.4-main.406dc2a"
61
63
  },
62
64
  "devDependencies": {
63
- "@types/react": "~18.2.0",
64
- "@types/react-dom": "~18.2.0",
65
- "react": "~18.2.0",
66
- "react-dom": "~18.2.0",
67
- "vite": "5.4.7",
68
- "@dxos/plugin-preview": "0.8.4-main.2e9d522",
69
- "@dxos/plugin-theme": "0.8.4-main.2e9d522",
70
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.2e9d522",
71
- "@dxos/storybook-utils": "0.8.4-main.2e9d522",
72
- "@dxos/test-utils": "0.8.4-main.2e9d522",
73
- "@dxos/react-ui-theme": "0.8.4-main.2e9d522"
65
+ "@types/react": "~19.2.2",
66
+ "@types/react-dom": "~19.2.1",
67
+ "react": "~19.2.0",
68
+ "react-dom": "~19.2.0",
69
+ "vite": "7.1.9",
70
+ "@dxos/plugin-theme": "0.8.4-main.406dc2a",
71
+ "@dxos/plugin-preview": "0.8.4-main.406dc2a",
72
+ "@dxos/react-ui-theme": "0.8.4-main.406dc2a",
73
+ "@dxos/storybook-utils": "0.8.4-main.406dc2a",
74
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.406dc2a",
75
+ "@dxos/test-utils": "0.8.4-main.406dc2a"
74
76
  },
75
77
  "peerDependencies": {
76
78
  "effect": "^3.13.3",
77
- "react": "~18.2.0",
78
- "react-dom": "~18.2.0",
79
- "@dxos/react-ui": "0.8.4-main.2e9d522",
80
- "@dxos/react-ui-theme": "0.8.4-main.2e9d522"
79
+ "react": "^19.0.0",
80
+ "react-dom": "^19.0.0",
81
+ "@dxos/react-ui": "0.8.4-main.406dc2a",
82
+ "@dxos/react-ui-theme": "0.8.4-main.406dc2a"
81
83
  },
82
84
  "publishConfig": {
83
85
  "access": "public"
@@ -2,62 +2,62 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { createIntent, defineModule, contributes, Capabilities, Events, definePlugin } from '@dxos/app-framework';
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 { KanbanView, translations as kanbanTranslations } from '@dxos/react-ui-kanban';
9
+ import { translations as kanbanTranslations } from '@dxos/react-ui-kanban';
10
+ import { Kanban } from '@dxos/react-ui-kanban/types';
10
11
 
11
- import { ArtifactDefinition, IntentResolver, ReactSurface } from './capabilities';
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';
15
16
 
16
- export const KanbanPlugin = () =>
17
- definePlugin(meta, [
18
- defineModule({
19
- id: `${meta.id}/module/translations`,
20
- activatesOn: Events.SetupTranslations,
21
- activate: () => contributes(Capabilities.Translations, [...translations, ...kanbanTranslations]),
22
- }),
23
- defineModule({
24
- id: `${meta.id}/module/metadata`,
25
- activatesOn: Events.SetupMetadata,
26
- activate: () =>
27
- contributes(Capabilities.Metadata, {
28
- id: KanbanView.typename,
29
- metadata: {
30
- icon: 'ph--kanban--regular',
31
- },
17
+ export const KanbanPlugin = definePlugin(meta, () => [
18
+ defineModule({
19
+ id: `${meta.id}/module/translations`,
20
+ activatesOn: Events.SetupTranslations,
21
+ activate: () => contributes(Capabilities.Translations, [...translations, ...kanbanTranslations]),
22
+ }),
23
+ defineModule({
24
+ id: `${meta.id}/module/metadata`,
25
+ activatesOn: Events.SetupMetadata,
26
+ activate: () =>
27
+ contributes(Capabilities.Metadata, {
28
+ id: Kanban.Kanban.typename,
29
+ metadata: {
30
+ icon: 'ph--kanban--regular',
31
+ },
32
+ }),
33
+ }),
34
+ defineModule({
35
+ id: `${meta.id}/module/object-form`,
36
+ activatesOn: ClientEvents.SetupSchema,
37
+ activate: () =>
38
+ contributes(
39
+ SpaceCapabilities.ObjectForm,
40
+ defineObjectForm({
41
+ objectSchema: Kanban.Kanban,
42
+ formSchema: CreateKanbanSchema,
43
+ hidden: true,
44
+ getIntent: (props, options) => createIntent(KanbanAction.Create, { ...props, space: options.space }),
32
45
  }),
33
- }),
34
- defineModule({
35
- id: `${meta.id}/module/object-form`,
36
- activatesOn: ClientEvents.SetupSchema,
37
- activate: () =>
38
- contributes(
39
- SpaceCapabilities.ObjectForm,
40
- defineObjectForm({
41
- objectSchema: KanbanView,
42
- formSchema: CreateKanbanSchema,
43
- hidden: true,
44
- getIntent: (props, options) => createIntent(KanbanAction.Create, { ...props, space: options.space }),
45
- }),
46
- ),
47
- }),
48
- defineModule({
49
- id: `${meta.id}/module/react-surface`,
50
- activatesOn: Events.SetupReactSurface,
51
- activate: ReactSurface,
52
- }),
53
- defineModule({
54
- id: `${meta.id}/module/intent-resolver`,
55
- activatesOn: Events.SetupIntentResolver,
56
- activate: IntentResolver,
57
- }),
58
- defineModule({
59
- id: `${meta.id}/module/artifact-definition`,
60
- activatesOn: Events.SetupArtifactDefinition,
61
- activate: ArtifactDefinition,
62
- }),
63
- ]);
46
+ ),
47
+ }),
48
+ defineModule({
49
+ id: `${meta.id}/module/react-surface`,
50
+ activatesOn: Events.SetupReactSurface,
51
+ activate: ReactSurface,
52
+ }),
53
+ defineModule({
54
+ id: `${meta.id}/module/intent-resolver`,
55
+ activatesOn: Events.SetupIntentResolver,
56
+ activate: IntentResolver,
57
+ }),
58
+ defineModule({
59
+ id: `${meta.id}/module/blueprint`,
60
+ activatesOn: Events.SetupArtifactDefinition,
61
+ activate: BlueprintDefinition,
62
+ }),
63
+ ]);
@@ -2,16 +2,20 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Schema, pipe } from 'effect';
5
+ // ISSUE(burdon): defineArtifact
6
+ // @ts-nocheck
6
7
 
7
- import { createTool, ToolResult } from '@dxos/ai';
8
- import { Capabilities, chain, contributes, createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';
8
+ import * as Function from 'effect/Function';
9
+ import * as Schema from 'effect/Schema';
10
+
11
+ import { ToolResult, createTool } from '@dxos/ai';
12
+ import { Capabilities, type PromiseIntentDispatcher, chain, contributes, createIntent } from '@dxos/app-framework';
9
13
  import { createArtifactElement } from '@dxos/assistant';
10
14
  import { defineArtifact } from '@dxos/blueprints';
11
15
  import { Obj, Query } from '@dxos/echo';
12
16
  import { invariant } from '@dxos/invariant';
13
17
  import { SpaceAction } from '@dxos/plugin-space/types';
14
- import { Filter, fullyQualifiedId, type Space } from '@dxos/react-client/echo';
18
+ import { Filter, type Space, fullyQualifiedId } from '@dxos/react-client/echo';
15
19
  import { KanbanView } from '@dxos/react-ui-kanban';
16
20
  import { DataType } from '@dxos/schema';
17
21
  import { isNonNullable } from '@dxos/util';
@@ -49,7 +53,7 @@ export default () => {
49
53
  caption: 'Creating kanban board...',
50
54
  schema: Schema.Struct({
51
55
  typename: Schema.String.annotations({
52
- description: 'The fully qualified typename of the schema to use for the kanban cards.',
56
+ description: 'The fully qualified name of the record type to use for the kanban cards.',
53
57
  }),
54
58
  pivotColumn: Schema.optional(Schema.String).annotations({
55
59
  description: 'Optional field name to use as the column pivot.',
@@ -65,7 +69,7 @@ export default () => {
65
69
  return ToolResult.Error(`Schema not found: ${typename}`);
66
70
  }
67
71
 
68
- const intent = pipe(
72
+ const intent = Function.pipe(
69
73
  createIntent(KanbanAction.Create, {
70
74
  space: extensions.space,
71
75
  typename,
@@ -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 ArtifactDefinition = lazy(() => import('./artifact-definition'));
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 { contributes, Capabilities, createResolver, type PluginContext } from '@dxos/app-framework';
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 { ProjectionModel } from '@dxos/schema';
9
+ import { Kanban } from '@dxos/react-ui-kanban/types';
10
+ import { ProjectionModel, getTypenameFromQuery } from '@dxos/schema';
10
11
 
11
- import { KANBAN_PLUGIN } from '../meta';
12
- import { createKanban, KanbanAction } from '../types';
12
+ import { meta } from '../meta';
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 createKanban({
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.typename!);
34
+ const schema = getSpace(view)?.db.schemaRegistry.getSchema(getTypenameFromQuery(view.query.ast)!);
34
35
  invariant(schema);
35
36
  const projection = new ProjectionModel(schema.jsonSchema, view.projection);
36
37
 
@@ -38,7 +39,7 @@ export default (context: PluginContext) =>
38
39
  const { deleted, index } = projection.deleteFieldProjection(fieldId);
39
40
  return {
40
41
  undoable: {
41
- message: ['card field deleted label', { ns: KANBAN_PLUGIN }],
42
+ message: ['card field deleted label', { ns: meta.id }],
42
43
  data: { deletionData: { ...deleted, index } },
43
44
  },
44
45
  };
@@ -58,7 +59,7 @@ export default (context: PluginContext) =>
58
59
  space.db.remove(card);
59
60
  return {
60
61
  undoable: {
61
- message: ['card deleted label', { ns: KANBAN_PLUGIN }],
62
+ message: ['card deleted label', { ns: meta.id }],
62
63
  data: { card },
63
64
  },
64
65
  };
@@ -2,16 +2,16 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Schema } from 'effect';
5
+ import type * as Schema from 'effect/Schema';
6
6
  import React, { useMemo } from 'react';
7
7
 
8
8
  import { Capabilities, contributes, createSurface, useCapabilities } from '@dxos/app-framework';
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, type Space } from '@dxos/react-client/echo';
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 { KanbanView } from '@dxos/react-ui-kanban';
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(KanbanView, data.subject.presentation.target),
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(KanbanView, data.subject.presentation.target),
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({
@@ -2,14 +2,12 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useCallback, useEffect, useState } from 'react';
9
7
 
10
8
  import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
11
9
  import { withPluginManager } from '@dxos/app-framework/testing';
12
- import { Obj, Type } from '@dxos/echo';
10
+ import { Obj, type QueryAST, Type } from '@dxos/echo';
13
11
  import { invariant } from '@dxos/invariant';
14
12
  import { ClientPlugin } from '@dxos/plugin-client';
15
13
  import { PreviewPlugin } from '@dxos/plugin-preview';
@@ -19,16 +17,16 @@ import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
19
17
  import { ThemePlugin } from '@dxos/plugin-theme';
20
18
  import { faker } from '@dxos/random';
21
19
  import { useClient } from '@dxos/react-client';
22
- import { Filter, useSpaces, useQuery, useSchema } from '@dxos/react-client/echo';
20
+ import { Filter, useQuery, useSchema, useSpaces } from '@dxos/react-client/echo';
21
+ import { withTheme } from '@dxos/react-ui/testing';
23
22
  import { ViewEditor } from '@dxos/react-ui-form';
24
- import { Kanban, KanbanView, useKanbanModel } from '@dxos/react-ui-kanban';
23
+ import { Kanban as KanbanComponent, useKanbanModel } from '@dxos/react-ui-kanban';
24
+ import { Kanban } from '@dxos/react-ui-kanban/types';
25
25
  import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
26
26
  import { defaultTx } from '@dxos/react-ui-theme';
27
- import { DataType, ProjectionModel } from '@dxos/schema';
28
- import { withLayout } from '@dxos/storybook-utils';
27
+ import { DataType, ProjectionModel, getTypenameFromQuery } from '@dxos/schema';
29
28
 
30
29
  import { translations } from '../translations';
31
- import { createKanban } from '../types';
32
30
 
33
31
  faker.seed(0);
34
32
 
@@ -51,7 +49,8 @@ const StorybookKanban = () => {
51
49
  const views = useQuery(space, Filter.type(DataType.View));
52
50
  const [view, setView] = useState<DataType.View>();
53
51
  const [projection, setProjection] = useState<ProjectionModel>();
54
- const schema = useSchema(client, space, view?.query.typename);
52
+ const typename = view?.query ? getTypenameFromQuery(view.query.ast) : undefined;
53
+ const schema = useSchema(client, space, typename);
55
54
 
56
55
  useEffect(() => {
57
56
  if (views.length && !view) {
@@ -97,14 +96,14 @@ const StorybookKanban = () => {
97
96
 
98
97
  const handleRemoveCard = useCallback((card: { id: string }) => space.db.remove(card), [space]);
99
98
 
100
- const handleTypenameChanged = useCallback(
101
- (typename: string) => {
99
+ const handleUpdateQuery = useCallback(
100
+ (newQuery: QueryAST.Query) => {
102
101
  invariant(schema);
103
102
  invariant(Type.isMutable(schema));
104
103
  invariant(view);
105
104
 
106
- schema.updateTypename(typename);
107
- view.query.typename = typename;
105
+ schema.updateTypename(getTypenameFromQuery(newQuery));
106
+ view.query.ast = newQuery;
108
107
  },
109
108
  [view, schema],
110
109
  );
@@ -115,18 +114,18 @@ const StorybookKanban = () => {
115
114
 
116
115
  return (
117
116
  <div className='grow grid grid-cols-[1fr_350px]'>
118
- {model ? <Kanban model={model} onAddCard={handleAddCard} onRemoveCard={handleRemoveCard} /> : <div />}
117
+ {model ? <KanbanComponent model={model} onAddCard={handleAddCard} onRemoveCard={handleRemoveCard} /> : <div />}
119
118
  <div className='flex flex-col bs-full border-is border-separator overflow-y-auto'>
120
119
  <ViewEditor
121
120
  registry={space?.db.schemaRegistry}
122
121
  schema={schema}
123
122
  view={view}
124
- onTypenameChanged={handleTypenameChanged}
123
+ onQueryChanged={handleUpdateQuery}
125
124
  onDelete={(fieldId: string) => {
126
125
  console.log('[ViewEditor]', 'onDelete', fieldId);
127
126
  }}
128
127
  />
129
- <SyntaxHighlighter language='json' className='w-full text-xs'>
128
+ <SyntaxHighlighter language='json' className='text-xs'>
130
129
  {JSON.stringify({ view, schema }, null, 2)}
131
130
  </SyntaxHighlighter>
132
131
  </div>
@@ -142,27 +141,25 @@ type StoryProps = {
142
141
  // Story definitions.
143
142
  //
144
143
 
145
- const meta: Meta<StoryProps> = {
144
+ const meta = {
146
145
  title: 'plugins/plugin-kanban/Kanban',
147
146
  component: StorybookKanban,
148
147
  render: () => <StorybookKanban />,
149
- parameters: { translations },
150
148
  decorators: [
151
- withLayout({ fullscreen: true }),
149
+ withTheme,
152
150
  withPluginManager({
153
151
  plugins: [
154
- ThemePlugin({ tx: defaultTx }),
155
152
  ClientPlugin({
156
- types: [DataType.Organization, DataType.Person, DataType.View, KanbanView],
157
- onClientInitialized: async (_, client) => {
153
+ types: [DataType.Organization, DataType.Person, DataType.View, Kanban.Kanban],
154
+ onClientInitialized: async ({ client }) => {
158
155
  await client.halo.createIdentity();
159
156
  const space = await client.spaces.create();
160
157
  await space.waitUntilReady();
161
- const { view } = await createKanban({
158
+ const { view } = await Kanban.makeView({
162
159
  client,
163
160
  space,
164
161
  typename: DataType.Organization.typename,
165
- initialPivotColumn: 'status',
162
+ pivotFieldName: 'status',
166
163
  });
167
164
  space.db.add(view);
168
165
 
@@ -172,18 +169,25 @@ const meta: Meta<StoryProps> = {
172
169
  });
173
170
  },
174
171
  }),
175
- StorybookLayoutPlugin(),
176
- PreviewPlugin(),
177
- SpacePlugin(),
172
+ SpacePlugin({}),
178
173
  IntentPlugin(),
179
174
  SettingsPlugin(),
175
+
176
+ // UI
177
+ ThemePlugin({ tx: defaultTx }),
178
+ PreviewPlugin(),
179
+ StorybookLayoutPlugin({}),
180
180
  ],
181
181
  }),
182
182
  ],
183
- };
183
+ parameters: {
184
+ layout: 'fullscreen',
185
+ translations,
186
+ },
187
+ } satisfies Meta<typeof StorybookKanban>;
184
188
 
185
189
  export default meta;
186
190
 
187
- type Story = StoryObj<StoryProps>;
191
+ type Story = StoryObj<typeof meta>;
188
192
 
189
193
  export const Default: Story = {};
@@ -6,13 +6,13 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
6
 
7
7
  import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { Filter, Obj, Type } from '@dxos/echo';
9
- import { EchoSchema, type TypedObject } from '@dxos/echo-schema';
9
+ import { EchoSchema, type TypedObject } from '@dxos/echo/internal';
10
10
  import { useGlobalFilteredObjects } from '@dxos/plugin-search';
11
11
  import { useClient } from '@dxos/react-client';
12
- import { useQuery, getSpace } from '@dxos/react-client/echo';
13
- import { useKanbanModel, Kanban } from '@dxos/react-ui-kanban';
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, type DataType } from '@dxos/schema';
15
+ import { type DataType, ProjectionModel, getTypenameFromQuery } 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 ? getTypenameFromQuery(view.query.ast) : 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
- }, [view.query.typename, space]);
52
+ }, [typename, space]);
53
53
 
54
54
  useEffect(() => {
55
55
  if (jsonSchema) {