@dxos/plugin-kanban 0.8.4-main.9be5663bfe → 0.8.4-main.abd8ff62ef
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/blueprints/index.mjs +1 -1
- package/dist/lib/browser/blueprints/index.mjs.map +3 -3
- package/dist/lib/browser/{chunk-A3PBV3S5.mjs → chunk-T32TEM55.mjs} +2 -2
- package/dist/lib/browser/chunk-T32TEM55.mjs.map +7 -0
- package/dist/lib/browser/{delete-card-VPNVIWOA.mjs → delete-card-7OSCNCW2.mjs} +4 -12
- package/dist/lib/browser/delete-card-7OSCNCW2.mjs.map +7 -0
- package/dist/lib/browser/{delete-card-field-4HHF2GYX.mjs → delete-card-field-NSB2RE3Z.mjs} +4 -12
- package/dist/lib/browser/delete-card-field-NSB2RE3Z.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +5 -97
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/operations/index.mjs +3 -3
- package/dist/lib/browser/operations/index.mjs.map +3 -3
- package/dist/lib/browser/{restore-card-4GG2RYKR.mjs → restore-card-FO3WERIE.mjs} +4 -12
- package/dist/lib/browser/restore-card-FO3WERIE.mjs.map +7 -0
- package/dist/lib/browser/{restore-card-field-3T26ACYX.mjs → restore-card-field-U5XYEEOW.mjs} +4 -12
- package/dist/lib/browser/restore-card-field-U5XYEEOW.mjs.map +7 -0
- package/dist/lib/browser/translations.mjs +44 -0
- package/dist/lib/browser/translations.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +70 -10
- package/dist/lib/browser/types/index.mjs.map +3 -3
- package/dist/lib/node-esm/blueprints/index.mjs +1 -1
- package/dist/lib/node-esm/blueprints/index.mjs.map +3 -3
- package/dist/lib/node-esm/{chunk-6LELYA2G.mjs → chunk-W2RNFBMZ.mjs} +2 -2
- package/dist/lib/node-esm/chunk-W2RNFBMZ.mjs.map +7 -0
- package/dist/lib/node-esm/{delete-card-5PW5OMFN.mjs → delete-card-ZIREL6HN.mjs} +4 -12
- package/dist/lib/node-esm/delete-card-ZIREL6HN.mjs.map +7 -0
- package/dist/lib/node-esm/{delete-card-field-KPJU2AQ3.mjs → delete-card-field-IPTEGVPP.mjs} +4 -12
- package/dist/lib/node-esm/delete-card-field-IPTEGVPP.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +5 -97
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/operations/index.mjs +3 -3
- package/dist/lib/node-esm/operations/index.mjs.map +3 -3
- package/dist/lib/node-esm/{restore-card-X2TKMU5A.mjs → restore-card-WJJ4YB7K.mjs} +4 -12
- package/dist/lib/node-esm/restore-card-WJJ4YB7K.mjs.map +7 -0
- package/dist/lib/node-esm/{restore-card-field-IUTL4RTR.mjs → restore-card-field-L24WJXAW.mjs} +4 -12
- package/dist/lib/node-esm/restore-card-field-L24WJXAW.mjs.map +7 -0
- package/dist/lib/node-esm/translations.mjs +45 -0
- package/dist/lib/node-esm/translations.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +70 -10
- package/dist/lib/node-esm/types/index.mjs.map +3 -3
- package/dist/types/src/KanbanPlugin.d.ts +1 -0
- package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
- package/dist/types/src/KanbanPlugin.node.d.ts +4 -0
- package/dist/types/src/KanbanPlugin.node.d.ts.map +1 -0
- package/dist/types/src/KanbanPlugin.test.d.ts +2 -0
- package/dist/types/src/KanbanPlugin.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/kanban-blueprint.d.ts +2 -2
- package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +2 -2
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +3 -2
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/migrations.d.ts +5 -0
- package/dist/types/src/capabilities/migrations.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +6 -6
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +24 -24
- package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +2 -2
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts +24 -24
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts +13 -0
- package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanSettings/index.d.ts +2 -0
- package/dist/types/src/containers/KanbanSettings/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/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -1
- package/dist/types/src/hooks/useItemsProjection.d.ts +10 -0
- package/dist/types/src/hooks/useItemsProjection.d.ts.map +1 -0
- package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts +2 -0
- package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts.map +1 -0
- package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -1
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +1 -1
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -1
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +1 -1
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/definitions.d.ts +2 -2
- package/dist/types/src/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/operations/delete-card-field.d.ts +1 -1
- package/dist/types/src/operations/delete-card-field.d.ts.map +1 -1
- package/dist/types/src/operations/delete-card.d.ts +1 -1
- package/dist/types/src/operations/delete-card.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/restore-card-field.d.ts +1 -1
- package/dist/types/src/operations/restore-card-field.d.ts.map +1 -1
- package/dist/types/src/operations/restore-card.d.ts +1 -1
- package/dist/types/src/operations/restore-card.d.ts.map +1 -1
- package/dist/types/src/playwright/board-manager.d.ts.map +1 -1
- package/dist/types/src/playwright/playwright.config.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +24 -24
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Kanban.d.ts +78 -6
- package/dist/types/src/types/Kanban.d.ts.map +1 -1
- package/dist/types/src/types/constants.d.ts +3 -3
- package/dist/types/src/types/constants.d.ts.map +1 -1
- package/dist/types/src/types/migrations.test.d.ts +2 -0
- package/dist/types/src/types/migrations.test.d.ts.map +1 -0
- package/dist/types/src/types/schema.d.ts +15 -1
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +2 -2
- package/dist/types/src/util/arrangement.d.ts +7 -3
- package/dist/types/src/util/arrangement.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +50 -50
- package/src/KanbanPlugin.node.ts +55 -0
- package/src/KanbanPlugin.test.ts +31 -0
- package/src/KanbanPlugin.tsx +11 -5
- package/src/blueprints/kanban-blueprint.ts +2 -3
- package/src/capabilities/artifact-definition.ts +1 -1
- package/src/capabilities/blueprint-definition.ts +2 -0
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/migrations.ts +35 -0
- package/src/capabilities/operation-handler.ts +1 -1
- package/src/capabilities/react-surface.tsx +16 -8
- package/src/components/KanbanBoard/KanbanBoard.stories.tsx +7 -3
- package/src/components/KanbanBoard/KanbanBoard.tsx +7 -2
- package/src/components/KanbanBoard/KanbanCard.tsx +15 -3
- package/src/components/KanbanBoard/KanbanColumn.tsx +7 -5
- package/src/containers/KanbanContainer/KanbanContainer.stories.tsx +21 -16
- package/src/containers/KanbanContainer/KanbanContainer.tsx +89 -7
- package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
- package/src/containers/KanbanSettings/index.ts +5 -0
- package/src/containers/index.ts +1 -1
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useEchoChangeCallback.ts +2 -2
- package/src/hooks/useItemsProjection.ts +44 -0
- package/src/hooks/{useKanbanBoardModel.test.ts → useKanbanBoardModel.browser.test.ts} +3 -3
- package/src/hooks/useKanbanBoardModel.ts +18 -5
- package/src/hooks/useProjectionModel.ts +2 -2
- package/src/index.ts +6 -2
- package/src/operations/definitions.ts +1 -1
- package/src/operations/delete-card-field.ts +1 -1
- package/src/operations/delete-card.ts +1 -1
- package/src/operations/index.ts +1 -1
- package/src/operations/restore-card-field.ts +1 -1
- package/src/operations/restore-card.ts +1 -1
- package/src/types/Kanban.ts +92 -12
- package/src/types/migrations.test.ts +83 -0
- package/src/types/schema.ts +19 -1
- package/src/types/types.ts +2 -2
- package/src/util/arrangement.test.ts +10 -0
- package/src/util/arrangement.ts +24 -14
- package/dist/lib/browser/chunk-A3PBV3S5.mjs.map +0 -7
- package/dist/lib/browser/delete-card-VPNVIWOA.mjs.map +0 -7
- package/dist/lib/browser/delete-card-field-4HHF2GYX.mjs.map +0 -7
- package/dist/lib/browser/restore-card-4GG2RYKR.mjs.map +0 -7
- package/dist/lib/browser/restore-card-field-3T26ACYX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6LELYA2G.mjs.map +0 -7
- package/dist/lib/node-esm/delete-card-5PW5OMFN.mjs.map +0 -7
- package/dist/lib/node-esm/delete-card-field-KPJU2AQ3.mjs.map +0 -7
- package/dist/lib/node-esm/restore-card-X2TKMU5A.mjs.map +0 -7
- package/dist/lib/node-esm/restore-card-field-IUTL4RTR.mjs.map +0 -7
- package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts +0 -6
- package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts.map +0 -1
- package/dist/types/src/containers/KanbanViewEditor/index.d.ts +0 -2
- package/dist/types/src/containers/KanbanViewEditor/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts +0 -2
- package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts.map +0 -1
- package/src/containers/KanbanViewEditor/KanbanViewEditor.tsx +0 -63
- package/src/containers/KanbanViewEditor/index.ts +0 -5
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import { afterEach, beforeEach, describe, test } from 'vitest';
|
|
7
|
+
|
|
8
|
+
import { defineObjectMigration } from '@dxos/client/echo';
|
|
9
|
+
import { Filter, JsonSchema, Obj, Query, Ref, Type, View } from '@dxos/echo';
|
|
10
|
+
import { EchoTestBuilder } from '@dxos/echo-db/testing';
|
|
11
|
+
import { ViewModel } from '@dxos/schema';
|
|
12
|
+
|
|
13
|
+
import { Kanban } from './Kanban';
|
|
14
|
+
import { KanbanV1 } from './Kanban';
|
|
15
|
+
|
|
16
|
+
const TestCardSchema = Schema.Struct({ id: Schema.String }).pipe(
|
|
17
|
+
Type.object({ typename: 'com.example/TestCard', version: '0.1.0' }),
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* v0.1.0 → v0.2.0 migration: nests `view` under `spec: { kind: 'view', view }`.
|
|
22
|
+
*
|
|
23
|
+
* Mirrors the migration registered in `capabilities/migrations.ts`. Running it
|
|
24
|
+
* here against a real ECHO database verifies that the transform produces a
|
|
25
|
+
* v0.2.0-shaped object that's queryable as `Kanban.Kanban`.
|
|
26
|
+
*/
|
|
27
|
+
describe('Kanban migration v1 → v2', () => {
|
|
28
|
+
let builder: EchoTestBuilder;
|
|
29
|
+
|
|
30
|
+
beforeEach(async () => {
|
|
31
|
+
builder = await new EchoTestBuilder().open();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterEach(async () => {
|
|
35
|
+
await builder.close();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const migration = defineObjectMigration({
|
|
39
|
+
from: KanbanV1,
|
|
40
|
+
to: Kanban,
|
|
41
|
+
transform: async (from) => ({
|
|
42
|
+
name: from.name,
|
|
43
|
+
arrangement: from.arrangement,
|
|
44
|
+
spec: { kind: 'view' as const, view: from.view },
|
|
45
|
+
}),
|
|
46
|
+
onMigration: async () => {},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('migrates a v1 Kanban into the v2 view-variant shape', async ({ expect }) => {
|
|
50
|
+
const { db, graph } = await builder.createDatabase();
|
|
51
|
+
await graph.schemaRegistry.register([KanbanV1, Kanban, View.View]);
|
|
52
|
+
|
|
53
|
+
// Build a real View object so the v1 Kanban has a valid ref to migrate.
|
|
54
|
+
const view = ViewModel.make({
|
|
55
|
+
query: Query.select(Filter.type(TestCardSchema)),
|
|
56
|
+
jsonSchema: JsonSchema.toJsonSchema(TestCardSchema),
|
|
57
|
+
});
|
|
58
|
+
db.add(view);
|
|
59
|
+
|
|
60
|
+
db.add(
|
|
61
|
+
Obj.make(KanbanV1, {
|
|
62
|
+
name: 'My Board',
|
|
63
|
+
view: Ref.make(view),
|
|
64
|
+
arrangement: { order: ['todo'], columns: { todo: { ids: [] } } },
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
67
|
+
await db.flush();
|
|
68
|
+
|
|
69
|
+
await db.runMigrations([migration]);
|
|
70
|
+
|
|
71
|
+
const results = await db.query(Filter.type(Kanban)).run();
|
|
72
|
+
expect(results).toHaveLength(1);
|
|
73
|
+
|
|
74
|
+
const migrated = results[0];
|
|
75
|
+
expect(migrated.name).toBe('My Board');
|
|
76
|
+
expect(migrated.arrangement.order).toEqual(['todo']);
|
|
77
|
+
expect(migrated.spec.kind).toBe('view');
|
|
78
|
+
if (migrated.spec.kind === 'view') {
|
|
79
|
+
expect(migrated.spec.view.dxn.toString()).toBe(Ref.make(view).dxn.toString());
|
|
80
|
+
}
|
|
81
|
+
expect(Type.getVersion(Obj.getSchema(migrated)!)).toBe('0.2.0');
|
|
82
|
+
});
|
|
83
|
+
});
|
package/src/types/schema.ts
CHANGED
|
@@ -18,10 +18,28 @@ import { TypeInputOptionsAnnotation } from '@dxos/plugin-space/types';
|
|
|
18
18
|
// TODO(wittjosiah): Factor out?
|
|
19
19
|
export const PivotColumnAnnotationId = Symbol.for('@dxos/plugin-kanban/annotation/PivotColumn');
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Settings common to every Kanban (view or items). Rendered as form fields
|
|
23
|
+
* by `KanbanSettings`.
|
|
24
|
+
*/
|
|
25
|
+
export const KanbanSettingsSchema = Schema.Struct({
|
|
26
|
+
hideUncategorized: Schema.Boolean.annotations({
|
|
27
|
+
title: 'Hide uncategorized column',
|
|
28
|
+
description: 'When enabled, items without a pivot value won’t be shown as a column.',
|
|
29
|
+
}).pipe(Schema.optional),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Settings for view-variant Kanbans only. Spreads {@link KanbanSettingsSchema}'s
|
|
34
|
+
* fields and adds a column-field picker that binds the View’s pivot field.
|
|
35
|
+
* Items-variant kanbans use a hardcoded `spec.pivotField` and don’t expose
|
|
36
|
+
* this control.
|
|
37
|
+
*/
|
|
38
|
+
export const KanbanViewSettingsSchema = Schema.Struct({
|
|
22
39
|
columnFieldId: Schema.String.annotations({
|
|
23
40
|
title: 'Column field',
|
|
24
41
|
}),
|
|
42
|
+
...KanbanSettingsSchema.fields,
|
|
25
43
|
});
|
|
26
44
|
|
|
27
45
|
export const CreateKanbanSchema = Schema.Struct({
|
package/src/types/types.ts
CHANGED
|
@@ -30,13 +30,13 @@ export type KanbanColumn<T extends BaseKanbanItem = BaseKanbanItem> = {
|
|
|
30
30
|
export type ArrangedCards<T extends BaseKanbanItem = BaseKanbanItem> = KanbanColumn<T>[];
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* Callback type for wrapping mutations in Obj.
|
|
33
|
+
* Callback type for wrapping mutations in Obj.update().
|
|
34
34
|
* Contains separate callbacks for kanban object and item mutations.
|
|
35
35
|
*/
|
|
36
36
|
export type KanbanChangeCallback<T extends BaseKanbanItem> = {
|
|
37
37
|
/** Callback to wrap kanban object mutations. */
|
|
38
38
|
kanban: (mutate: (mutableKanban: Obj.Mutable<Kanban>) => void) => void;
|
|
39
39
|
|
|
40
|
-
/** Sets a field on an item, wrapping in Obj.
|
|
40
|
+
/** Sets a field on an item, wrapping in Obj.update() if needed. */
|
|
41
41
|
setItemField: (item: T, field: string, value: unknown) => void;
|
|
42
42
|
};
|
|
@@ -99,6 +99,16 @@ describe('arrangement utils', () => {
|
|
|
99
99
|
expect(byColumn.b.hidden).toBeUndefined();
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
+
test('treats non-array ids as empty (Automerge / corrupt layout)', ({ expect }) => {
|
|
103
|
+
const arrangement = {
|
|
104
|
+
order: [],
|
|
105
|
+
columns: { a: { ids: {} as unknown as string[] }, b: { ids: ['ok'] } },
|
|
106
|
+
};
|
|
107
|
+
const byColumn = getOrderByColumnFromArrangement(arrangement);
|
|
108
|
+
expect(byColumn.a.ids).toEqual([]);
|
|
109
|
+
expect(byColumn.b.ids).toEqual(['ok']);
|
|
110
|
+
});
|
|
111
|
+
|
|
102
112
|
test('returns mutable copies', ({ expect }) => {
|
|
103
113
|
const idX = ObjectId.random();
|
|
104
114
|
const kanban = Kanban.make({
|
package/src/util/arrangement.ts
CHANGED
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
*/
|
|
21
21
|
export const getOrderFromArrangement = (arrangement?: Kanban.Arrangement): string[] => {
|
|
22
22
|
const order = arrangement?.order;
|
|
23
|
-
if (order != null && order.length > 0) {
|
|
23
|
+
if (order != null && Array.isArray(order) && order.length > 0) {
|
|
24
24
|
return [...order];
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -41,10 +41,11 @@ export const getOrderByColumnFromArrangement = (
|
|
|
41
41
|
const columns = arrangement?.columns;
|
|
42
42
|
if (columns != null && Object.keys(columns).length > 0) {
|
|
43
43
|
return Object.fromEntries(
|
|
44
|
-
Object.entries(columns).map(([key, entry]) =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
Object.entries(columns).map(([key, entry]) => {
|
|
45
|
+
const rawIds = entry.ids;
|
|
46
|
+
const ids = Array.isArray(rawIds) ? [...rawIds] : [];
|
|
47
|
+
return [key, { ids, ...(entry.hidden !== undefined && { hidden: entry.hidden }) }];
|
|
48
|
+
}),
|
|
48
49
|
);
|
|
49
50
|
}
|
|
50
51
|
|
|
@@ -54,11 +55,15 @@ export const getOrderByColumnFromArrangement = (
|
|
|
54
55
|
/**
|
|
55
56
|
* Builds the ordered list of columns (value + ids) for the board model.
|
|
56
57
|
*
|
|
57
|
-
* Column order: uncategorized first, then effectiveOrder, then any
|
|
58
|
-
* Each entry gets the ids from
|
|
58
|
+
* Column order: uncategorized first, then effectiveOrder, then any
|
|
59
|
+
* selectOption ids not yet in order. Each entry gets the ids from
|
|
60
|
+
* effectiveByColumn for that column (or empty). Columns whose entry has
|
|
61
|
+
* `hidden: true` are dropped from the result — currently only the
|
|
62
|
+
* "Uncategorized" column is toggleable from settings, but the filter is
|
|
63
|
+
* generic so any column can be hidden via the same flag.
|
|
59
64
|
*
|
|
60
65
|
* @param effectiveOrder - Column order from arrangement (or previous merge).
|
|
61
|
-
* @param effectiveByColumn - Per-column card id order from arrangement.
|
|
66
|
+
* @param effectiveByColumn - Per-column card id order + hidden flag from arrangement.
|
|
62
67
|
* @param selectOptions - Defines valid column ids; any missing from order are appended.
|
|
63
68
|
* @returns ColumnStructure array in display order.
|
|
64
69
|
*/
|
|
@@ -78,10 +83,12 @@ export const computeColumnStructure = (
|
|
|
78
83
|
}
|
|
79
84
|
}
|
|
80
85
|
|
|
81
|
-
return order
|
|
82
|
-
columnValue
|
|
83
|
-
|
|
84
|
-
|
|
86
|
+
return order
|
|
87
|
+
.filter((columnValue) => effectiveByColumn[columnValue]?.hidden !== true)
|
|
88
|
+
.map((columnValue) => ({
|
|
89
|
+
columnValue,
|
|
90
|
+
ids: effectiveByColumn[columnValue]?.ids ?? [],
|
|
91
|
+
}));
|
|
85
92
|
};
|
|
86
93
|
|
|
87
94
|
/**
|
|
@@ -152,13 +159,16 @@ export const computeItemArrangement = <T extends BaseKanbanItem = BaseKanbanItem
|
|
|
152
159
|
const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
|
|
153
160
|
const byColumn = getOrderByColumnFromArrangement(object?.arrangement);
|
|
154
161
|
|
|
155
|
-
// Column order: uncategorized first, then each select option (skip
|
|
162
|
+
// Column order: uncategorized first, then each select option (skip
|
|
163
|
+
// uncategorized if duplicated). Columns whose arrangement entry has
|
|
164
|
+
// `hidden: true` are dropped — same generic hide-by-column flag used
|
|
165
|
+
// by `computeColumnStructure`.
|
|
156
166
|
const columnEntries = [
|
|
157
167
|
{ columnValue: UNCATEGORIZED_VALUE, ids: byColumn[UNCATEGORIZED_VALUE]?.ids ?? [] },
|
|
158
168
|
...selectOptions
|
|
159
169
|
.filter((opt) => opt.id !== UNCATEGORIZED_VALUE)
|
|
160
170
|
.map((opt) => ({ columnValue: opt.id, ids: byColumn[opt.id]?.ids ?? [] })),
|
|
161
|
-
];
|
|
171
|
+
].filter((entry) => byColumn[entry.columnValue]?.hidden !== true);
|
|
162
172
|
|
|
163
173
|
return columnEntries.map(({ columnValue, ids }) => ({
|
|
164
174
|
columnValue,
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/definitions.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { View } from '@dxos/echo';\nimport { Operation } from '@dxos/operation';\n\nimport { meta } from '#meta';\n\nconst KANBAN_OPERATION = `${meta.id}.operation`;\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: { key: `${KANBAN_OPERATION}.delete-card-field`, name: 'Delete Card Field' },\n services: [Capability.Service],\n input: Schema.Struct({\n view: 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: `${KANBAN_OPERATION}.delete-card`, name: 'Delete Card' },\n input: Schema.Struct({\n card: Schema.Any,\n }),\n output: DeleteCardOutput,\n});\n\nexport const RestoreCardField = Operation.make({\n meta: { key: `${KANBAN_OPERATION}.restore-card-field`, name: 'Restore Card Field' },\n services: [Capability.Service],\n input: Schema.Struct({\n view: View.View.annotations({ description: 'The view to restore the field to.' }),\n field: View.FieldSchema.annotations({ description: 'The field schema to restore.' }),\n props: Schema.Any.annotations({ description: 'The field properties to restore.' }),\n index: Schema.Number.annotations({ description: 'The index to restore the field at.' }),\n }),\n output: Schema.Void,\n});\n\nexport const RestoreCard = Operation.make({\n meta: { key: `${KANBAN_OPERATION}.restore-card`, name: 'Restore Card' },\n input: Schema.Struct({\n card: Schema.Any.annotations({ description: 'The card to restore.' }),\n }),\n output: Schema.Void,\n});\n"],
|
|
5
|
-
"mappings": ";;;;;AAAA;;;;;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,YAAY;AACrB,SAASC,iBAAiB;AAE1B,SAASC,YAAY;AAErB,IAAMC,mBAAmB,GAAGC,KAAKC,EAAE;AAE5B,IAAMC,wBAA+BC,cAAO;EACjDC,OAAOC,KAAKC,YAAYC,YAAY;IAAEC,aAAa;EAA4B,CAAA;EAC/EC,OAAcC,WAAIH,YAAY;IAAEC,aAAa;EAAgC,CAAA;EAC7EG,OAAcC,cAAOL,YAAY;IAAEC,aAAa;EAA8B,CAAA;AAChF,CAAA;AAIO,IAAMK,kBAAkBC,UAAUC,KAAK;EAC5Cf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAsCkB,MAAM;EAAoB;EAChFC,UAAU;IAACC,WAAWC;;EACtBC,OAAclB,cAAO;IACnBmB,MAAMjB,KAAKA;IACXkB,SAAgBC;EAClB,CAAA;EACAC,QAAQvB;AACV,CAAA;AAEO,IAAMwB,mBAA0BvB,cAAO;EAC5CwB,MAAajB,WAAIH,YAAY;IAAEC,aAAa;EAAoB,CAAA;AAClE,CAAA;AAIO,IAAMoB,aAAad,UAAUC,KAAK;EACvCf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAgCkB,MAAM;EAAc;EACpEI,OAAclB,cAAO;IACnBwB,MAAajB;EACf,CAAA;EACAe,QAAQC;AACV,CAAA;AAEO,IAAMG,mBAAmBf,UAAUC,KAAK;EAC7Cf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAuCkB,MAAM;EAAqB;EAClFC,UAAU;IAACC,WAAWC;;EACtBC,OAAclB,cAAO;IACnBmB,MAAMjB,KAAKA,KAAKE,YAAY;MAAEC,aAAa;IAAoC,CAAA;IAC/EJ,OAAOC,KAAKC,YAAYC,YAAY;MAAEC,aAAa;IAA+B,CAAA;IAClFC,OAAcC,WAAIH,YAAY;MAAEC,aAAa;IAAmC,CAAA;IAChFG,OAAcC,cAAOL,YAAY;MAAEC,aAAa;IAAqC,CAAA;EACvF,CAAA;EACAiB,QAAeK;AACjB,CAAA;AAEO,IAAMC,cAAcjB,UAAUC,KAAK;EACxCf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAiCkB,MAAM;EAAe;EACtEI,OAAclB,cAAO;IACnBwB,MAAajB,WAAIH,YAAY;MAAEC,aAAa;IAAuB,CAAA;EACrE,CAAA;EACAiB,QAAeK;AACjB,CAAA;",
|
|
6
|
-
"names": ["Schema", "Capability", "View", "Operation", "meta", "KANBAN_OPERATION", "meta", "id", "DeleteCardFieldOutput", "Struct", "field", "View", "FieldSchema", "annotations", "description", "props", "Any", "index", "Number", "DeleteCardField", "Operation", "make", "key", "name", "services", "Capability", "Service", "input", "view", "fieldId", "String", "output", "DeleteCardOutput", "card", "DeleteCard", "RestoreCardField", "Void", "RestoreCard"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/delete-card.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\n\nimport { DeleteCard } from './definitions';\n\nconst handler: Operation.WithHandler<typeof DeleteCard> = DeleteCard.pipe(\n Operation.withHandler(({ card }) =>\n Effect.sync(() => {\n const db = Obj.getDatabase(card);\n invariant(db);\n db.remove(card);\n\n return { card };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,WAAW;AACpB,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;;AAI1B,IAAMC,UAAoDC,WAAWC,KACnEC,UAAUC,YAAY,CAAC,EAAEC,KAAI,MACpBC,YAAK,MAAA;AACV,QAAMC,KAAKC,IAAIC,YAAYJ,IAAAA;AAC3BK,YAAUH,IAAAA,QAAAA;;;;;;;;;AACVA,KAAGI,OAAON,IAAAA;AAEV,SAAO;IAAEA;EAAK;AAChB,CAAA,CAAA,CAAA;AAIJ,IAAA,sBAAeL;",
|
|
6
|
-
"names": ["Effect", "Obj", "invariant", "Operation", "handler", "DeleteCard", "pipe", "Operation", "withHandler", "card", "sync", "db", "Obj", "getDatabase", "invariant", "remove"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/delete-card-field.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { JsonSchema, Obj } from '@dxos/echo';\nimport { type EchoSchema } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\nimport { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } from '@dxos/schema';\n\nimport { DeleteCardField } from './definitions';\n\nconst handler: Operation.WithHandler<typeof DeleteCardField> = DeleteCardField.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ view, fieldId }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const db = Obj.getDatabase(view);\n invariant(db, 'Database not found');\n const schema = yield* Effect.promise(() =>\n db.schemaRegistry\n .query({\n typename: getTypenameFromQuery(view.query.ast)!,\n location: ['database', 'runtime'],\n })\n .first(),\n );\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: JsonSchema.toJsonSchema(schema),\n change: createEchoChangeCallback(view, schema as EchoSchema),\n });\n\n const result = projection.deleteFieldProjection(fieldId);\n\n return {\n field: result.deleted.field,\n props: result.deleted.props,\n index: result.index,\n };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,YAAYC,WAAW;AAEhC,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,iBAAiBC,0BAA0BC,4BAA4B;;AAIhF,IAAMC,UAAyDC,gBAAgBC,KAC7EC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,QAAO,GAAE;AAC5C,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,KAAKC,IAAIC,YAAYT,IAAAA;AAC3BU,YAAUH,IAAI,sBAAA;;;;;;;;;AACd,QAAMI,SAAS,OAAcC,eAAQ,MACnCL,GAAGM,eACAC,MAAM;IACLC,UAAUC,qBAAqBhB,KAAKc,MAAMG,GAAG;IAC7CC,UAAU;MAAC;MAAY;;EACzB,CAAA,EACCC,MAAK,CAAA;AAGV,QAAMC,aAAa,IAAIC,gBAAgB;IACrCnB;IACAF;IACAsB,YAAYC,WAAWC,aAAab,MAAAA;IACpCc,QAAQC,yBAAyB1B,MAAMW,MAAAA;EACzC,CAAA;AAEA,QAAMgB,SAASP,WAAWQ,sBAAsB3B,OAAAA;AAEhD,SAAO;IACL4B,OAAOF,OAAOG,QAAQD;IACtBE,OAAOJ,OAAOG,QAAQC;IACtBC,OAAOL,OAAOK;EAChB;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,4BAAetC;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "JsonSchema", "Obj", "invariant", "Operation", "ProjectionModel", "createEchoChangeCallback", "getTypenameFromQuery", "handler", "DeleteCardField", "pipe", "Operation", "withHandler", "fnUntraced", "view", "fieldId", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "db", "Obj", "getDatabase", "invariant", "schema", "promise", "schemaRegistry", "query", "typename", "getTypenameFromQuery", "ast", "location", "first", "projection", "ProjectionModel", "baseSchema", "JsonSchema", "toJsonSchema", "change", "createEchoChangeCallback", "result", "deleteFieldProjection", "field", "deleted", "props", "index"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/restore-card.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\n\nimport { RestoreCard } from './definitions';\n\nconst handler: Operation.WithHandler<typeof RestoreCard> = RestoreCard.pipe(\n Operation.withHandler(({ card }) =>\n Effect.sync(() => {\n const db = Obj.getDatabase(card);\n invariant(db);\n db.add(card);\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,WAAW;AACpB,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;;AAI1B,IAAMC,UAAqDC,YAAYC,KACrEC,UAAUC,YAAY,CAAC,EAAEC,KAAI,MACpBC,YAAK,MAAA;AACV,QAAMC,KAAKC,IAAIC,YAAYJ,IAAAA;AAC3BK,YAAUH,IAAAA,QAAAA;;;;;;;;;AACVA,KAAGI,IAAIN,IAAAA;AACT,CAAA,CAAA,CAAA;AAIJ,IAAA,uBAAeL;",
|
|
6
|
-
"names": ["Effect", "Obj", "invariant", "Operation", "handler", "RestoreCard", "pipe", "Operation", "withHandler", "card", "sync", "db", "Obj", "getDatabase", "invariant", "add"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/restore-card-field.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { JsonSchema, Obj } from '@dxos/echo';\nimport { type EchoSchema } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\nimport { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } from '@dxos/schema';\n\nimport { RestoreCardField } from './definitions';\n\nconst handler: Operation.WithHandler<typeof RestoreCardField> = RestoreCardField.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ view, field, props, index }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const db = Obj.getDatabase(view);\n invariant(db, 'Database not found');\n const schema = yield* Effect.promise(() =>\n db.schemaRegistry\n .query({\n typename: getTypenameFromQuery(view.query.ast)!,\n location: ['database', 'runtime'],\n })\n .first(),\n );\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: JsonSchema.toJsonSchema(schema),\n change: createEchoChangeCallback(view, schema as EchoSchema),\n });\n\n projection.setFieldProjection({ field, props }, index);\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,YAAYC,WAAW;AAEhC,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,iBAAiBC,0BAA0BC,4BAA4B;;AAIhF,IAAMC,UAA0DC,iBAAiBC,KAC/EC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,OAAOC,OAAOC,MAAK,GAAE;AACxD,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,KAAKC,IAAIC,YAAYX,IAAAA;AAC3BY,YAAUH,IAAI,sBAAA;;;;;;;;;AACd,QAAMI,SAAS,OAAcC,eAAQ,MACnCL,GAAGM,eACAC,MAAM;IACLC,UAAUC,qBAAqBlB,KAAKgB,MAAMG,GAAG;IAC7CC,UAAU;MAAC;MAAY;;EACzB,CAAA,EACCC,MAAK,CAAA;AAGV,QAAMC,aAAa,IAAIC,gBAAgB;IACrCnB;IACAJ;IACAwB,YAAYC,WAAWC,aAAab,MAAAA;IACpCc,QAAQC,yBAAyB5B,MAAMa,MAAAA;EACzC,CAAA;AAEAS,aAAWO,mBAAmB;IAAE5B;IAAOC;EAAM,GAAGC,KAAAA;AAClD,CAAA,CAAA,CAAA;AAIJ,IAAA,6BAAeT;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "JsonSchema", "Obj", "invariant", "Operation", "ProjectionModel", "createEchoChangeCallback", "getTypenameFromQuery", "handler", "RestoreCardField", "pipe", "Operation", "withHandler", "fnUntraced", "view", "field", "props", "index", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "db", "Obj", "getDatabase", "invariant", "schema", "promise", "schemaRegistry", "query", "typename", "getTypenameFromQuery", "ast", "location", "first", "projection", "ProjectionModel", "baseSchema", "JsonSchema", "toJsonSchema", "change", "createEchoChangeCallback", "setFieldProjection"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/definitions.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { View } from '@dxos/echo';\nimport { Operation } from '@dxos/operation';\n\nimport { meta } from '#meta';\n\nconst KANBAN_OPERATION = `${meta.id}.operation`;\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: { key: `${KANBAN_OPERATION}.delete-card-field`, name: 'Delete Card Field' },\n services: [Capability.Service],\n input: Schema.Struct({\n view: 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: `${KANBAN_OPERATION}.delete-card`, name: 'Delete Card' },\n input: Schema.Struct({\n card: Schema.Any,\n }),\n output: DeleteCardOutput,\n});\n\nexport const RestoreCardField = Operation.make({\n meta: { key: `${KANBAN_OPERATION}.restore-card-field`, name: 'Restore Card Field' },\n services: [Capability.Service],\n input: Schema.Struct({\n view: View.View.annotations({ description: 'The view to restore the field to.' }),\n field: View.FieldSchema.annotations({ description: 'The field schema to restore.' }),\n props: Schema.Any.annotations({ description: 'The field properties to restore.' }),\n index: Schema.Number.annotations({ description: 'The index to restore the field at.' }),\n }),\n output: Schema.Void,\n});\n\nexport const RestoreCard = Operation.make({\n meta: { key: `${KANBAN_OPERATION}.restore-card`, name: 'Restore Card' },\n input: Schema.Struct({\n card: Schema.Any.annotations({ description: 'The card to restore.' }),\n }),\n output: Schema.Void,\n});\n"],
|
|
5
|
-
"mappings": ";;;;;;AAAA;;;;;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,YAAY;AACrB,SAASC,iBAAiB;AAE1B,SAASC,YAAY;AAErB,IAAMC,mBAAmB,GAAGC,KAAKC,EAAE;AAE5B,IAAMC,wBAA+BC,cAAO;EACjDC,OAAOC,KAAKC,YAAYC,YAAY;IAAEC,aAAa;EAA4B,CAAA;EAC/EC,OAAcC,WAAIH,YAAY;IAAEC,aAAa;EAAgC,CAAA;EAC7EG,OAAcC,cAAOL,YAAY;IAAEC,aAAa;EAA8B,CAAA;AAChF,CAAA;AAIO,IAAMK,kBAAkBC,UAAUC,KAAK;EAC5Cf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAsCkB,MAAM;EAAoB;EAChFC,UAAU;IAACC,WAAWC;;EACtBC,OAAclB,cAAO;IACnBmB,MAAMjB,KAAKA;IACXkB,SAAgBC;EAClB,CAAA;EACAC,QAAQvB;AACV,CAAA;AAEO,IAAMwB,mBAA0BvB,cAAO;EAC5CwB,MAAajB,WAAIH,YAAY;IAAEC,aAAa;EAAoB,CAAA;AAClE,CAAA;AAIO,IAAMoB,aAAad,UAAUC,KAAK;EACvCf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAgCkB,MAAM;EAAc;EACpEI,OAAclB,cAAO;IACnBwB,MAAajB;EACf,CAAA;EACAe,QAAQC;AACV,CAAA;AAEO,IAAMG,mBAAmBf,UAAUC,KAAK;EAC7Cf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAuCkB,MAAM;EAAqB;EAClFC,UAAU;IAACC,WAAWC;;EACtBC,OAAclB,cAAO;IACnBmB,MAAMjB,KAAKA,KAAKE,YAAY;MAAEC,aAAa;IAAoC,CAAA;IAC/EJ,OAAOC,KAAKC,YAAYC,YAAY;MAAEC,aAAa;IAA+B,CAAA;IAClFC,OAAcC,WAAIH,YAAY;MAAEC,aAAa;IAAmC,CAAA;IAChFG,OAAcC,cAAOL,YAAY;MAAEC,aAAa;IAAqC,CAAA;EACvF,CAAA;EACAiB,QAAeK;AACjB,CAAA;AAEO,IAAMC,cAAcjB,UAAUC,KAAK;EACxCf,MAAM;IAAEgB,KAAK,GAAGjB,gBAAAA;IAAiCkB,MAAM;EAAe;EACtEI,OAAclB,cAAO;IACnBwB,MAAajB,WAAIH,YAAY;MAAEC,aAAa;IAAuB,CAAA;EACrE,CAAA;EACAiB,QAAeK;AACjB,CAAA;",
|
|
6
|
-
"names": ["Schema", "Capability", "View", "Operation", "meta", "KANBAN_OPERATION", "meta", "id", "DeleteCardFieldOutput", "Struct", "field", "View", "FieldSchema", "annotations", "description", "props", "Any", "index", "Number", "DeleteCardField", "Operation", "make", "key", "name", "services", "Capability", "Service", "input", "view", "fieldId", "String", "output", "DeleteCardOutput", "card", "DeleteCard", "RestoreCardField", "Void", "RestoreCard"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/delete-card.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\n\nimport { DeleteCard } from './definitions';\n\nconst handler: Operation.WithHandler<typeof DeleteCard> = DeleteCard.pipe(\n Operation.withHandler(({ card }) =>\n Effect.sync(() => {\n const db = Obj.getDatabase(card);\n invariant(db);\n db.remove(card);\n\n return { card };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,WAAW;AACpB,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;;AAI1B,IAAMC,UAAoDC,WAAWC,KACnEC,UAAUC,YAAY,CAAC,EAAEC,KAAI,MACpBC,YAAK,MAAA;AACV,QAAMC,KAAKC,IAAIC,YAAYJ,IAAAA;AAC3BK,YAAUH,IAAAA,QAAAA;;;;;;;;;AACVA,KAAGI,OAAON,IAAAA;AAEV,SAAO;IAAEA;EAAK;AAChB,CAAA,CAAA,CAAA;AAIJ,IAAA,sBAAeL;",
|
|
6
|
-
"names": ["Effect", "Obj", "invariant", "Operation", "handler", "DeleteCard", "pipe", "Operation", "withHandler", "card", "sync", "db", "Obj", "getDatabase", "invariant", "remove"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/delete-card-field.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { JsonSchema, Obj } from '@dxos/echo';\nimport { type EchoSchema } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\nimport { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } from '@dxos/schema';\n\nimport { DeleteCardField } from './definitions';\n\nconst handler: Operation.WithHandler<typeof DeleteCardField> = DeleteCardField.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ view, fieldId }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const db = Obj.getDatabase(view);\n invariant(db, 'Database not found');\n const schema = yield* Effect.promise(() =>\n db.schemaRegistry\n .query({\n typename: getTypenameFromQuery(view.query.ast)!,\n location: ['database', 'runtime'],\n })\n .first(),\n );\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: JsonSchema.toJsonSchema(schema),\n change: createEchoChangeCallback(view, schema as EchoSchema),\n });\n\n const result = projection.deleteFieldProjection(fieldId);\n\n return {\n field: result.deleted.field,\n props: result.deleted.props,\n index: result.index,\n };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,YAAYC,WAAW;AAEhC,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,iBAAiBC,0BAA0BC,4BAA4B;;AAIhF,IAAMC,UAAyDC,gBAAgBC,KAC7EC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,QAAO,GAAE;AAC5C,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,KAAKC,IAAIC,YAAYT,IAAAA;AAC3BU,YAAUH,IAAI,sBAAA;;;;;;;;;AACd,QAAMI,SAAS,OAAcC,eAAQ,MACnCL,GAAGM,eACAC,MAAM;IACLC,UAAUC,qBAAqBhB,KAAKc,MAAMG,GAAG;IAC7CC,UAAU;MAAC;MAAY;;EACzB,CAAA,EACCC,MAAK,CAAA;AAGV,QAAMC,aAAa,IAAIC,gBAAgB;IACrCnB;IACAF;IACAsB,YAAYC,WAAWC,aAAab,MAAAA;IACpCc,QAAQC,yBAAyB1B,MAAMW,MAAAA;EACzC,CAAA;AAEA,QAAMgB,SAASP,WAAWQ,sBAAsB3B,OAAAA;AAEhD,SAAO;IACL4B,OAAOF,OAAOG,QAAQD;IACtBE,OAAOJ,OAAOG,QAAQC;IACtBC,OAAOL,OAAOK;EAChB;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,4BAAetC;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "JsonSchema", "Obj", "invariant", "Operation", "ProjectionModel", "createEchoChangeCallback", "getTypenameFromQuery", "handler", "DeleteCardField", "pipe", "Operation", "withHandler", "fnUntraced", "view", "fieldId", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "db", "Obj", "getDatabase", "invariant", "schema", "promise", "schemaRegistry", "query", "typename", "getTypenameFromQuery", "ast", "location", "first", "projection", "ProjectionModel", "baseSchema", "JsonSchema", "toJsonSchema", "change", "createEchoChangeCallback", "result", "deleteFieldProjection", "field", "deleted", "props", "index"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/restore-card.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\n\nimport { RestoreCard } from './definitions';\n\nconst handler: Operation.WithHandler<typeof RestoreCard> = RestoreCard.pipe(\n Operation.withHandler(({ card }) =>\n Effect.sync(() => {\n const db = Obj.getDatabase(card);\n invariant(db);\n db.add(card);\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,WAAW;AACpB,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;;AAI1B,IAAMC,UAAqDC,YAAYC,KACrEC,UAAUC,YAAY,CAAC,EAAEC,KAAI,MACpBC,YAAK,MAAA;AACV,QAAMC,KAAKC,IAAIC,YAAYJ,IAAAA;AAC3BK,YAAUH,IAAAA,QAAAA;;;;;;;;;AACVA,KAAGI,IAAIN,IAAAA;AACT,CAAA,CAAA,CAAA;AAIJ,IAAA,uBAAeL;",
|
|
6
|
-
"names": ["Effect", "Obj", "invariant", "Operation", "handler", "RestoreCard", "pipe", "Operation", "withHandler", "card", "sync", "db", "Obj", "getDatabase", "invariant", "add"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/restore-card-field.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { JsonSchema, Obj } from '@dxos/echo';\nimport { type EchoSchema } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { Operation } from '@dxos/operation';\nimport { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } from '@dxos/schema';\n\nimport { RestoreCardField } from './definitions';\n\nconst handler: Operation.WithHandler<typeof RestoreCardField> = RestoreCardField.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ view, field, props, index }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const db = Obj.getDatabase(view);\n invariant(db, 'Database not found');\n const schema = yield* Effect.promise(() =>\n db.schemaRegistry\n .query({\n typename: getTypenameFromQuery(view.query.ast)!,\n location: ['database', 'runtime'],\n })\n .first(),\n );\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: JsonSchema.toJsonSchema(schema),\n change: createEchoChangeCallback(view, schema as EchoSchema),\n });\n\n projection.setFieldProjection({ field, props }, index);\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,YAAYC,WAAW;AAEhC,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,iBAAiBC,0BAA0BC,4BAA4B;;AAIhF,IAAMC,UAA0DC,iBAAiBC,KAC/EC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,OAAOC,OAAOC,MAAK,GAAE;AACxD,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,KAAKC,IAAIC,YAAYX,IAAAA;AAC3BY,YAAUH,IAAI,sBAAA;;;;;;;;;AACd,QAAMI,SAAS,OAAcC,eAAQ,MACnCL,GAAGM,eACAC,MAAM;IACLC,UAAUC,qBAAqBlB,KAAKgB,MAAMG,GAAG;IAC7CC,UAAU;MAAC;MAAY;;EACzB,CAAA,EACCC,MAAK,CAAA;AAGV,QAAMC,aAAa,IAAIC,gBAAgB;IACrCnB;IACAJ;IACAwB,YAAYC,WAAWC,aAAab,MAAAA;IACpCc,QAAQC,yBAAyB5B,MAAMa,MAAAA;EACzC,CAAA;AAEAS,aAAWO,mBAAmB;IAAE5B;IAAOC;EAAM,GAAGC,KAAAA;AAClD,CAAA,CAAA,CAAA;AAIJ,IAAA,6BAAeT;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "JsonSchema", "Obj", "invariant", "Operation", "ProjectionModel", "createEchoChangeCallback", "getTypenameFromQuery", "handler", "RestoreCardField", "pipe", "Operation", "withHandler", "fnUntraced", "view", "field", "props", "index", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "db", "Obj", "getDatabase", "invariant", "schema", "promise", "schemaRegistry", "query", "typename", "getTypenameFromQuery", "ast", "location", "first", "projection", "ProjectionModel", "baseSchema", "JsonSchema", "toJsonSchema", "change", "createEchoChangeCallback", "setFieldProjection"]
|
|
7
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { type AppSurface } from '@dxos/app-toolkit/ui';
|
|
3
|
-
import { type Kanban } from '#types';
|
|
4
|
-
export type KanbanViewEditorProps = AppSurface.ObjectPropertiesProps<Kanban.Kanban>;
|
|
5
|
-
export declare const KanbanViewEditor: ({ subject: object }: KanbanViewEditorProps) => React.JSX.Element;
|
|
6
|
-
//# sourceMappingURL=KanbanViewEditor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"KanbanViewEditor.d.ts","sourceRoot":"","sources":["../../../../../src/containers/KanbanViewEditor/KanbanViewEditor.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAQvD,OAAO,EAAE,KAAK,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAErD,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAEpF,eAAO,MAAM,gBAAgB,GAAI,qBAAqB,qBAAqB,sBA2C1E,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/containers/KanbanViewEditor/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useKanbanBoardModel.test.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useKanbanBoardModel.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { RegistryContext } from '@effect-atom/atom-react';
|
|
6
|
-
import React, { useCallback, useContext, useMemo } from 'react';
|
|
7
|
-
|
|
8
|
-
import { type AppSurface } from '@dxos/app-toolkit/ui';
|
|
9
|
-
import { Obj } from '@dxos/echo';
|
|
10
|
-
import { Format } from '@dxos/echo/internal';
|
|
11
|
-
import { useObject, useSchema } from '@dxos/react-client/echo';
|
|
12
|
-
import { Form, type FormFieldMap, SelectField } from '@dxos/react-ui-form';
|
|
13
|
-
import { getTypenameFromQuery } from '@dxos/schema';
|
|
14
|
-
|
|
15
|
-
import { useProjectionModel } from '#hooks';
|
|
16
|
-
import { type Kanban, SettingsSchema } from '#types';
|
|
17
|
-
|
|
18
|
-
export type KanbanViewEditorProps = AppSurface.ObjectPropertiesProps<Kanban.Kanban>;
|
|
19
|
-
|
|
20
|
-
export const KanbanViewEditor = ({ subject: object }: KanbanViewEditorProps) => {
|
|
21
|
-
const registry = useContext(RegistryContext);
|
|
22
|
-
const db = Obj.getDatabase(object);
|
|
23
|
-
const [view, updateView] = useObject(object.view);
|
|
24
|
-
const currentTypename = view?.query ? getTypenameFromQuery(view.query.ast) : undefined;
|
|
25
|
-
const schema = useSchema(db, currentTypename);
|
|
26
|
-
const projection = useProjectionModel(schema, object, registry);
|
|
27
|
-
|
|
28
|
-
const fieldProjections = projection?.getFieldProjections() ?? [];
|
|
29
|
-
const selectFields = useMemo(
|
|
30
|
-
() =>
|
|
31
|
-
fieldProjections
|
|
32
|
-
.filter((field) => field.props.format === Format.TypeFormat.SingleSelect)
|
|
33
|
-
.map(({ field }) => ({ value: field.id, label: field.path })),
|
|
34
|
-
[fieldProjections],
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
const handleValuesChanged = useCallback(
|
|
38
|
-
(values: Partial<{ columnFieldId: string }>) => {
|
|
39
|
-
if (values.columnFieldId != null) {
|
|
40
|
-
updateView((view) => {
|
|
41
|
-
view.projection.pivotFieldId = values.columnFieldId;
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
[updateView],
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
const initialValues = useMemo(
|
|
49
|
-
() => ({ columnFieldId: view?.projection.pivotFieldId }),
|
|
50
|
-
[view?.projection.pivotFieldId],
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
const fieldMap: FormFieldMap = useMemo(
|
|
54
|
-
() => ({ columnFieldId: (props) => <SelectField {...props} options={selectFields} /> }),
|
|
55
|
-
[selectFields],
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<Form.Root schema={SettingsSchema} values={initialValues} fieldMap={fieldMap} onValuesChanged={handleValuesChanged}>
|
|
60
|
-
<Form.FieldSet />
|
|
61
|
-
</Form.Root>
|
|
62
|
-
);
|
|
63
|
-
};
|