@dxos/plugin-kanban 0.8.4-main.c4373fc → 0.8.4-main.c85a9c8dae
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/KanbanContainer-BCXSJ6KS.mjs +304 -0
- package/dist/lib/browser/KanbanContainer-BCXSJ6KS.mjs.map +7 -0
- package/dist/lib/browser/KanbanViewEditor-IH5CJ6BW.mjs +66 -0
- package/dist/lib/browser/KanbanViewEditor-IH5CJ6BW.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-HFEKGFJK.mjs +17 -0
- package/dist/lib/browser/blueprint-definition-HFEKGFJK.mjs.map +7 -0
- package/dist/lib/browser/blueprints/index.mjs +8 -0
- package/dist/lib/browser/blueprints/index.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/browser/chunk-QSWCFMEB.mjs +385 -0
- package/dist/lib/browser/chunk-QSWCFMEB.mjs.map +7 -0
- package/dist/lib/browser/chunk-RNFIFE2P.mjs +213 -0
- package/dist/lib/browser/chunk-RNFIFE2P.mjs.map +7 -0
- package/dist/lib/browser/chunk-TLYZSC7O.mjs +29 -0
- package/dist/lib/browser/chunk-TLYZSC7O.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +65 -68
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs +162 -0
- package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs.map +7 -0
- package/dist/lib/browser/react-surface-FOMOGFVW.mjs +99 -0
- package/dist/lib/browser/react-surface-FOMOGFVW.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +14 -5
- package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs +305 -0
- package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs.map +7 -0
- package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs +67 -0
- package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs +18 -0
- package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs.map +7 -0
- package/dist/lib/node-esm/blueprints/index.mjs +9 -0
- package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4AWDHQVY.mjs +214 -0
- package/dist/lib/node-esm/chunk-4AWDHQVY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CSL3HF2X.mjs +386 -0
- package/dist/lib/node-esm/chunk-CSL3HF2X.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-X3UJUQIV.mjs +31 -0
- package/dist/lib/node-esm/chunk-X3UJUQIV.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +65 -68
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs +163 -0
- package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs.map +7 -0
- package/dist/lib/node-esm/react-surface-AITKFRBE.mjs +100 -0
- package/dist/lib/node-esm/react-surface-AITKFRBE.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +14 -5
- package/dist/types/src/KanbanPlugin.d.ts +2 -1
- package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
- package/dist/types/src/blueprints/index.d.ts +2 -0
- package/dist/types/src/blueprints/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/kanban-blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -0
- package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +12 -0
- package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/artifact-definition/index.d.ts +3 -0
- package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +6 -0
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
- package/dist/types/src/capabilities/blueprint-definition/index.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/operation-resolver/index.d.ts +3 -0
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +58 -0
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -0
- package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +70 -0
- package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -0
- package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +10 -0
- package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -0
- package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +9 -0
- package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -0
- package/dist/types/src/components/KanbanBoard/index.d.ts +2 -0
- package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +6 -0
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts +77 -0
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanContainer/index.d.ts +3 -0
- package/dist/types/src/containers/KanbanContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts +6 -0
- package/dist/types/src/containers/KanbanViewEditor/KanbanViewEditor.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanViewEditor/index.d.ts +3 -0
- package/dist/types/src/containers/KanbanViewEditor/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +4 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +6 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/hooks/useEchoChangeCallback.d.ts +13 -0
- package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -0
- package/dist/types/src/hooks/useKanbanBoardModel.d.ts +16 -0
- package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -0
- package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts +2 -0
- package/dist/types/src/hooks/useKanbanBoardModel.test.d.ts.map +1 -0
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +22 -0
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -0
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +19 -0
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -0
- package/dist/types/src/hooks/useProjectionModel.d.ts +15 -0
- package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +2 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/playwright/board-manager.d.ts +5 -0
- package/dist/types/src/playwright/board-manager.d.ts.map +1 -0
- package/dist/types/src/playwright/playwright.config.d.ts +3 -0
- package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
- package/dist/types/src/playwright/smoke.spec.d.ts +2 -0
- package/dist/types/src/playwright/smoke.spec.d.ts.map +1 -0
- package/dist/types/src/testing/KanbanCardTileSimple.d.ts +5 -0
- package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +35 -9
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Kanban.d.ts +37 -0
- package/dist/types/src/types/Kanban.d.ts.map +1 -0
- package/dist/types/src/types/constants.d.ts +6 -0
- package/dist/types/src/types/constants.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +98 -43
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +28 -0
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util/arrangement.d.ts +68 -0
- package/dist/types/src/util/arrangement.d.ts.map +1 -0
- package/dist/types/src/util/arrangement.test.d.ts +2 -0
- package/dist/types/src/util/arrangement.test.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +2 -0
- package/dist/types/src/util/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +67 -46
- package/src/KanbanPlugin.tsx +35 -54
- package/src/blueprints/index.ts +5 -0
- package/src/blueprints/kanban-blueprint.ts +31 -0
- package/src/capabilities/artifact-definition/artifact-definition.ts +151 -0
- package/src/capabilities/artifact-definition/index.ts +7 -0
- package/src/capabilities/blueprint-definition/blueprint-definition.ts +17 -0
- package/src/capabilities/blueprint-definition/index.ts +7 -0
- package/src/capabilities/index.ts +3 -5
- package/src/capabilities/operation-resolver/index.ts +7 -0
- package/src/capabilities/operation-resolver/operation-resolver.ts +133 -0
- package/src/capabilities/react-surface/index.ts +7 -0
- package/src/capabilities/react-surface/react-surface.tsx +86 -0
- package/src/components/KanbanBoard/KanbanBoard.stories.tsx +142 -0
- package/src/components/KanbanBoard/KanbanBoard.tsx +184 -0
- package/src/components/KanbanBoard/KanbanCard.tsx +87 -0
- package/src/components/KanbanBoard/KanbanColumn.tsx +69 -0
- package/src/components/KanbanBoard/index.ts +5 -0
- package/src/components/index.ts +1 -2
- package/src/containers/KanbanContainer/KanbanContainer.stories.tsx +263 -0
- package/src/containers/KanbanContainer/KanbanContainer.tsx +87 -0
- package/src/containers/KanbanContainer/index.ts +7 -0
- package/src/containers/KanbanViewEditor/KanbanViewEditor.tsx +63 -0
- package/src/containers/KanbanViewEditor/index.ts +7 -0
- package/src/containers/index.ts +8 -0
- package/src/hooks/index.ts +9 -0
- package/src/hooks/useEchoChangeCallback.ts +30 -0
- package/src/hooks/useKanbanBoardModel.test.ts +235 -0
- package/src/hooks/useKanbanBoardModel.ts +143 -0
- package/src/hooks/useKanbanColumnEventHandler.ts +106 -0
- package/src/hooks/useKanbanItemEventHandler.ts +133 -0
- package/src/hooks/useProjectionModel.ts +58 -0
- package/src/meta.ts +8 -4
- package/src/playwright/board-manager.ts +13 -0
- package/src/playwright/playwright.config.ts +19 -0
- package/src/playwright/smoke.spec.ts +107 -0
- package/src/testing/KanbanCardTileSimple.tsx +76 -0
- package/src/testing/index.ts +5 -0
- package/src/translations.ts +13 -6
- package/src/types/Kanban.ts +67 -0
- package/src/types/constants.ts +9 -0
- package/src/types/index.ts +2 -0
- package/src/types/schema.ts +84 -38
- package/src/types/types.ts +35 -0
- package/src/util/arrangement.test.ts +208 -0
- package/src/util/arrangement.ts +167 -0
- package/src/util/index.ts +5 -0
- package/dist/lib/browser/blueprint-definition-UYVX622Q.mjs +0 -28
- package/dist/lib/browser/blueprint-definition-UYVX622Q.mjs.map +0 -7
- package/dist/lib/browser/chunk-K7KYFJ3P.mjs +0 -80
- package/dist/lib/browser/chunk-K7KYFJ3P.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-LR3SDMKQ.mjs +0 -111
- package/dist/lib/browser/intent-resolver-LR3SDMKQ.mjs.map +0 -7
- package/dist/lib/browser/react-surface-R2ORFB43.mjs +0 -255
- package/dist/lib/browser/react-surface-R2ORFB43.mjs.map +0 -7
- package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs +0 -30
- package/dist/lib/node-esm/blueprint-definition-42P47FUY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VDWYSHP4.mjs +0 -82
- package/dist/lib/node-esm/chunk-VDWYSHP4.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-CKDNVLND.mjs +0 -112
- package/dist/lib/node-esm/intent-resolver-CKDNVLND.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-RMRLHCOY.mjs +0 -256
- package/dist/lib/node-esm/react-surface-RMRLHCOY.mjs.map +0 -7
- package/dist/types/src/capabilities/artifact-definition.d.ts +0 -11
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -5
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface.d.ts +0 -4
- package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
- package/dist/types/src/components/KanbanContainer.d.ts +0 -7
- package/dist/types/src/components/KanbanContainer.d.ts.map +0 -1
- package/dist/types/src/components/KanbanContainer.stories.d.ts +0 -41
- package/dist/types/src/components/KanbanContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/KanbanViewEditor.d.ts +0 -8
- package/dist/types/src/components/KanbanViewEditor.d.ts.map +0 -1
- package/src/capabilities/artifact-definition.ts +0 -148
- package/src/capabilities/blueprint-definition.ts +0 -30
- package/src/capabilities/intent-resolver.ts +0 -71
- package/src/capabilities/react-surface.tsx +0 -84
- package/src/components/KanbanContainer.stories.tsx +0 -193
- package/src/components/KanbanContainer.tsx +0 -95
- package/src/components/KanbanViewEditor.tsx +0 -64
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
__export
|
|
4
|
+
} from "./chunk-HSLMI22Q.mjs";
|
|
5
|
+
|
|
6
|
+
// src/types/constants.ts
|
|
7
|
+
var UNCATEGORIZED_VALUE = "__uncategorized__";
|
|
8
|
+
var UNCATEGORIZED_ATTRIBUTES = {
|
|
9
|
+
title: "Uncategorized",
|
|
10
|
+
color: "neutral"
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// src/types/Kanban.ts
|
|
14
|
+
var Kanban_exports = {};
|
|
15
|
+
__export(Kanban_exports, {
|
|
16
|
+
Arrangement: () => Arrangement,
|
|
17
|
+
Kanban: () => Kanban,
|
|
18
|
+
make: () => make
|
|
19
|
+
});
|
|
20
|
+
import * as Schema from "effect/Schema";
|
|
21
|
+
import { Obj, Ref, Type } from "@dxos/echo";
|
|
22
|
+
import { View } from "@dxos/echo";
|
|
23
|
+
import { FormInputAnnotation, LabelAnnotation } from "@dxos/echo/internal";
|
|
24
|
+
import { ViewAnnotation } from "@dxos/schema";
|
|
25
|
+
var ArrangementColumnEntry = Schema.Struct({
|
|
26
|
+
ids: Schema.Array(Obj.ID),
|
|
27
|
+
hidden: Schema.optional(Schema.Boolean)
|
|
28
|
+
});
|
|
29
|
+
var ArrangementColumns = Schema.Record({
|
|
30
|
+
key: Schema.String,
|
|
31
|
+
value: ArrangementColumnEntry
|
|
32
|
+
}).pipe(FormInputAnnotation.set(false));
|
|
33
|
+
var Arrangement = Schema.Struct({
|
|
34
|
+
order: Schema.Array(Schema.String).pipe(FormInputAnnotation.set(false)),
|
|
35
|
+
columns: ArrangementColumns
|
|
36
|
+
}).pipe(FormInputAnnotation.set(false));
|
|
37
|
+
var Kanban = Schema.Struct({
|
|
38
|
+
name: Schema.optional(Schema.String),
|
|
39
|
+
view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),
|
|
40
|
+
/** Column display order and per-column card ids. */
|
|
41
|
+
arrangement: Arrangement
|
|
42
|
+
}).pipe(Type.object({
|
|
43
|
+
typename: "dxos.org/type/Kanban",
|
|
44
|
+
version: "0.3.0"
|
|
45
|
+
}), LabelAnnotation.set([
|
|
46
|
+
"name"
|
|
47
|
+
]), ViewAnnotation.set(true));
|
|
48
|
+
var make = (props) => {
|
|
49
|
+
const { name, view, arrangement } = props;
|
|
50
|
+
const order = arrangement?.order ?? [];
|
|
51
|
+
const columns = arrangement?.columns ?? {};
|
|
52
|
+
return Obj.make(Kanban, {
|
|
53
|
+
name,
|
|
54
|
+
view: Ref.make(view),
|
|
55
|
+
arrangement: {
|
|
56
|
+
order,
|
|
57
|
+
columns
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// src/types/schema.ts
|
|
63
|
+
import * as Schema2 from "effect/Schema";
|
|
64
|
+
import { Capability } from "@dxos/app-framework";
|
|
65
|
+
import { View as View2 } from "@dxos/echo";
|
|
66
|
+
import { Operation } from "@dxos/operation";
|
|
67
|
+
import { TypeInputOptionsAnnotation } from "@dxos/plugin-space/types";
|
|
68
|
+
|
|
69
|
+
// src/meta.ts
|
|
70
|
+
import { trim } from "@dxos/util";
|
|
71
|
+
var meta = {
|
|
72
|
+
id: "dxos.org/plugin/kanban",
|
|
73
|
+
name: "Kanban",
|
|
74
|
+
description: trim`
|
|
75
|
+
Visual project management using customizable kanban boards to track workflow progress.
|
|
76
|
+
Organize table data into columns, drag and drop items between stages, and trigger automations based on status changes.
|
|
77
|
+
`,
|
|
78
|
+
icon: "ph--kanban--regular",
|
|
79
|
+
iconHue: "green",
|
|
80
|
+
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban",
|
|
81
|
+
screenshots: [
|
|
82
|
+
"https://dxos.network/plugin-details-kanban-dark.png"
|
|
83
|
+
]
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// src/types/schema.ts
|
|
87
|
+
var PivotColumnAnnotationId = /* @__PURE__ */ Symbol.for("@dxos/plugin-kanban/annotation/PivotColumn");
|
|
88
|
+
var SettingsSchema = Schema2.Struct({
|
|
89
|
+
columnFieldId: Schema2.String.annotations({
|
|
90
|
+
title: "Column field"
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
var CreateKanbanSchema = Schema2.Struct({
|
|
94
|
+
name: Schema2.optional(Schema2.String),
|
|
95
|
+
// TODO(wittjosiah): This should be a query input instead.
|
|
96
|
+
typename: Schema2.String.pipe(Schema2.annotations({
|
|
97
|
+
title: "Select card type"
|
|
98
|
+
}), TypeInputOptionsAnnotation.set({
|
|
99
|
+
location: [
|
|
100
|
+
"database",
|
|
101
|
+
"runtime"
|
|
102
|
+
],
|
|
103
|
+
kind: [
|
|
104
|
+
"user"
|
|
105
|
+
],
|
|
106
|
+
registered: [
|
|
107
|
+
"registered"
|
|
108
|
+
]
|
|
109
|
+
}), Schema2.optional),
|
|
110
|
+
initialPivotColumn: Schema2.optional(Schema2.String.annotations({
|
|
111
|
+
[PivotColumnAnnotationId]: true,
|
|
112
|
+
title: "Pivot column"
|
|
113
|
+
}))
|
|
114
|
+
});
|
|
115
|
+
var KANBAN_OPERATION = `${meta.id}/operation`;
|
|
116
|
+
(function(KanbanOperation2) {
|
|
117
|
+
KanbanOperation2.DeleteCardFieldOutput = Schema2.Struct({
|
|
118
|
+
field: View2.FieldSchema.annotations({
|
|
119
|
+
description: "The deleted field schema."
|
|
120
|
+
}),
|
|
121
|
+
props: Schema2.Any.annotations({
|
|
122
|
+
description: "The deleted field properties."
|
|
123
|
+
}),
|
|
124
|
+
index: Schema2.Number.annotations({
|
|
125
|
+
description: "The index the field was at."
|
|
126
|
+
})
|
|
127
|
+
});
|
|
128
|
+
KanbanOperation2.DeleteCardField = Operation.make({
|
|
129
|
+
meta: {
|
|
130
|
+
key: `${KANBAN_OPERATION}/delete-card-field`,
|
|
131
|
+
name: "Delete Card Field"
|
|
132
|
+
},
|
|
133
|
+
services: [
|
|
134
|
+
Capability.Service
|
|
135
|
+
],
|
|
136
|
+
schema: {
|
|
137
|
+
input: Schema2.Struct({
|
|
138
|
+
view: View2.View,
|
|
139
|
+
fieldId: Schema2.String
|
|
140
|
+
}),
|
|
141
|
+
output: KanbanOperation2.DeleteCardFieldOutput
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
KanbanOperation2.DeleteCardOutput = Schema2.Struct({
|
|
145
|
+
card: Schema2.Any.annotations({
|
|
146
|
+
description: "The deleted card."
|
|
147
|
+
})
|
|
148
|
+
});
|
|
149
|
+
KanbanOperation2.DeleteCard = Operation.make({
|
|
150
|
+
meta: {
|
|
151
|
+
key: `${KANBAN_OPERATION}/delete-card`,
|
|
152
|
+
name: "Delete Card"
|
|
153
|
+
},
|
|
154
|
+
schema: {
|
|
155
|
+
input: Schema2.Struct({
|
|
156
|
+
card: Schema2.Any
|
|
157
|
+
}),
|
|
158
|
+
output: KanbanOperation2.DeleteCardOutput
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
KanbanOperation2.RestoreCardField = Operation.make({
|
|
162
|
+
meta: {
|
|
163
|
+
key: `${KANBAN_OPERATION}/restore-card-field`,
|
|
164
|
+
name: "Restore Card Field"
|
|
165
|
+
},
|
|
166
|
+
services: [
|
|
167
|
+
Capability.Service
|
|
168
|
+
],
|
|
169
|
+
schema: {
|
|
170
|
+
input: Schema2.Struct({
|
|
171
|
+
view: View2.View.annotations({
|
|
172
|
+
description: "The view to restore the field to."
|
|
173
|
+
}),
|
|
174
|
+
field: View2.FieldSchema.annotations({
|
|
175
|
+
description: "The field schema to restore."
|
|
176
|
+
}),
|
|
177
|
+
props: Schema2.Any.annotations({
|
|
178
|
+
description: "The field properties to restore."
|
|
179
|
+
}),
|
|
180
|
+
index: Schema2.Number.annotations({
|
|
181
|
+
description: "The index to restore the field at."
|
|
182
|
+
})
|
|
183
|
+
}),
|
|
184
|
+
output: Schema2.Void
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
KanbanOperation2.RestoreCard = Operation.make({
|
|
188
|
+
meta: {
|
|
189
|
+
key: `${KANBAN_OPERATION}/restore-card`,
|
|
190
|
+
name: "Restore Card"
|
|
191
|
+
},
|
|
192
|
+
schema: {
|
|
193
|
+
input: Schema2.Struct({
|
|
194
|
+
card: Schema2.Any.annotations({
|
|
195
|
+
description: "The card to restore."
|
|
196
|
+
})
|
|
197
|
+
}),
|
|
198
|
+
output: Schema2.Void
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
})(KanbanOperation || (KanbanOperation = {}));
|
|
202
|
+
var KanbanOperation;
|
|
203
|
+
|
|
204
|
+
export {
|
|
205
|
+
meta,
|
|
206
|
+
UNCATEGORIZED_VALUE,
|
|
207
|
+
UNCATEGORIZED_ATTRIBUTES,
|
|
208
|
+
Kanban_exports,
|
|
209
|
+
PivotColumnAnnotationId,
|
|
210
|
+
SettingsSchema,
|
|
211
|
+
CreateKanbanSchema,
|
|
212
|
+
KanbanOperation
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=chunk-4AWDHQVY.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/constants.ts", "../../../src/types/Kanban.ts", "../../../src/types/schema.ts", "../../../src/meta.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const UNCATEGORIZED_VALUE = '__uncategorized__' as const;\nexport const UNCATEGORIZED_ATTRIBUTES = {\n title: 'Uncategorized',\n color: 'neutral',\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Obj, Ref, Type } from '@dxos/echo';\nimport { View } from '@dxos/echo';\nimport { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/internal';\nimport { ViewAnnotation } from '@dxos/schema';\n\n/** Per-column entry (ids order, optional hidden). */\nconst ArrangementColumnEntry = Schema.Struct({\n ids: Schema.Array(Obj.ID),\n hidden: Schema.optional(Schema.Boolean),\n});\n\n/** Keyed by columnValue. */\nconst ArrangementColumns = Schema.Record({\n key: Schema.String,\n value: ArrangementColumnEntry,\n}).pipe(FormInputAnnotation.set(false));\n\n/** Column order and per-column card ids. */\nexport const Arrangement = Schema.Struct({\n order: Schema.Array(Schema.String).pipe(FormInputAnnotation.set(false)),\n columns: ArrangementColumns,\n}).pipe(FormInputAnnotation.set(false));\n\nexport type Arrangement = Schema.Schema.Type<typeof Arrangement>;\n\nexport const Kanban = Schema.Struct({\n name: Schema.optional(Schema.String),\n\n view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),\n\n /** Column display order and per-column card ids. */\n arrangement: Arrangement,\n}).pipe(\n Type.object({\n typename: 'dxos.org/type/Kanban',\n version: '0.3.0',\n }),\n LabelAnnotation.set(['name']),\n ViewAnnotation.set(true),\n);\n\n/** Instance type; use Kanban.Kanban in type position so namespace has .Kanban as type and .KanbanSchema as schema. */\nexport interface Kanban extends Schema.Schema.Type<typeof Kanban> {}\n\ntype MakeProps = Omit<Partial<Obj.MakeProps<typeof Kanban>>, 'view'> & {\n view: View.View;\n};\n\n/**\n * Make a kanban as a view of a data set.\n */\nexport const make = (props: MakeProps): Kanban => {\n const { name, view, arrangement } = props;\n const order = arrangement?.order ?? [];\n const columns = arrangement?.columns ?? {};\n return Obj.make(Kanban, {\n name,\n view: Ref.make(view),\n arrangement: { order, columns },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { View } from '@dxos/echo';\nimport { Operation } from '@dxos/operation';\nimport { TypeInputOptionsAnnotation } from '@dxos/plugin-space/types';\n\nimport { meta } from '../meta';\n\n/**\n * Kanban data model.\n * A Kanban board is a collection of columns, each of which contains a collection of items.\n * The layout of columns and items is controlled by models.\n * The underlying data model may be represented by direct object relationships\n * (e.g., a column object containing an array of ordered items) or projections constructed\n * by the model (e.g., a query of items based on metadata within a column object).\n */\n\n// TODO(wittjosiah): Factor out?\nexport const PivotColumnAnnotationId = Symbol.for('@dxos/plugin-kanban/annotation/PivotColumn');\n\nexport const SettingsSchema = Schema.Struct({\n columnFieldId: Schema.String.annotations({\n title: 'Column field',\n }),\n});\n\nexport const CreateKanbanSchema = Schema.Struct({\n name: Schema.optional(Schema.String),\n // TODO(wittjosiah): This should be a query input instead.\n typename: Schema.String.pipe(\n Schema.annotations({ title: 'Select card type' }),\n TypeInputOptionsAnnotation.set({\n location: ['database', 'runtime'],\n kind: ['user'],\n registered: ['registered'],\n }),\n Schema.optional,\n ),\n initialPivotColumn: Schema.optional(\n Schema.String.annotations({\n [PivotColumnAnnotationId]: true,\n title: 'Pivot column',\n }),\n ),\n});\n\nconst KANBAN_OPERATION = `${meta.id}/operation`;\n\nexport namespace KanbanOperation {\n export 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\n export type DeleteCardFieldOutput = Schema.Schema.Type<typeof DeleteCardFieldOutput>;\n\n export const DeleteCardField = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/delete-card-field`, name: 'Delete Card Field' },\n services: [Capability.Service],\n schema: {\n input: Schema.Struct({\n view: View.View,\n fieldId: Schema.String,\n }),\n output: DeleteCardFieldOutput,\n },\n });\n\n export const DeleteCardOutput = Schema.Struct({\n card: Schema.Any.annotations({ description: 'The deleted card.' }),\n });\n\n export type DeleteCardOutput = Schema.Schema.Type<typeof DeleteCardOutput>;\n\n export const DeleteCard = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/delete-card`, name: 'Delete Card' },\n schema: {\n input: Schema.Struct({\n card: Schema.Any,\n }),\n output: DeleteCardOutput,\n },\n });\n\n /**\n * Restore a deleted card field (inverse of DeleteCardField).\n */\n export const RestoreCardField = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/restore-card-field`, name: 'Restore Card Field' },\n services: [Capability.Service],\n schema: {\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 });\n\n /**\n * Restore a deleted card (inverse of DeleteCard).\n */\n export const RestoreCard = Operation.make({\n meta: { key: `${KANBAN_OPERATION}/restore-card`, name: 'Restore Card' },\n schema: {\n input: Schema.Struct({\n card: Schema.Any.annotations({ description: 'The card to restore.' }),\n }),\n output: Schema.Void,\n },\n });\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'dxos.org/plugin/kanban',\n name: 'Kanban',\n description: trim`\n Visual project management using customizable kanban boards to track workflow progress.\n Organize table data into columns, drag and drop items between stages, and trigger automations based on status changes.\n `,\n icon: 'ph--kanban--regular',\n iconHue: 'green',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban',\n screenshots: ['https://dxos.network/plugin-details-kanban-dark.png'],\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["UNCATEGORIZED_VALUE", "UNCATEGORIZED_ATTRIBUTES", "title", "color", "Schema", "Obj", "Ref", "Type", "View", "FormInputAnnotation", "LabelAnnotation", "ViewAnnotation", "ArrangementColumnEntry", "Struct", "ids", "Array", "Obj", "ID", "hidden", "optional", "Boolean", "ArrangementColumns", "Record", "key", "String", "value", "pipe", "FormInputAnnotation", "set", "Arrangement", "order", "columns", "Kanban", "name", "view", "Ref", "View", "arrangement", "Type", "object", "typename", "version", "LabelAnnotation", "ViewAnnotation", "make", "props", "Schema", "Capability", "View", "Operation", "TypeInputOptionsAnnotation", "trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "screenshots", "PivotColumnAnnotationId", "Symbol", "for", "SettingsSchema", "Struct", "columnFieldId", "String", "annotations", "title", "CreateKanbanSchema", "name", "optional", "typename", "pipe", "TypeInputOptionsAnnotation", "set", "location", "kind", "registered", "initialPivotColumn", "KANBAN_OPERATION", "meta", "id", "KanbanOperation", "DeleteCardFieldOutput", "field", "View", "FieldSchema", "description", "props", "Any", "index", "Number", "DeleteCardField", "Operation", "make", "key", "services", "Capability", "Service", "schema", "input", "view", "fieldId", "output", "DeleteCardOutput", "card", "DeleteCard", "RestoreCardField", "Void", "RestoreCard"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
UNCATEGORIZED_VALUE
|
|
4
|
+
} from "./chunk-4AWDHQVY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/hooks/useEchoChangeCallback.ts
|
|
7
|
+
import { useMemo } from "react";
|
|
8
|
+
import { Obj } from "@dxos/echo";
|
|
9
|
+
var createEchoChangeCallback = (kanban) => ({
|
|
10
|
+
kanban: (mutate) => Obj.change(kanban, (kanban2) => mutate(kanban2)),
|
|
11
|
+
setItemField: (item, field, value) => {
|
|
12
|
+
Obj.change(item, (item2) => {
|
|
13
|
+
item2[field] = value;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
var useEchoChangeCallback = (kanban) => useMemo(() => kanban ? createEchoChangeCallback(kanban) : null, [
|
|
18
|
+
kanban
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
// src/hooks/useProjectionModel.ts
|
|
22
|
+
import { useState } from "react";
|
|
23
|
+
import { JsonSchema, Type } from "@dxos/echo";
|
|
24
|
+
import { log } from "@dxos/log";
|
|
25
|
+
import { useAsyncEffect } from "@dxos/react-ui";
|
|
26
|
+
import { ProjectionModel, createEchoChangeCallback as createEchoChangeCallback2 } from "@dxos/schema";
|
|
27
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/hooks/useProjectionModel.ts";
|
|
28
|
+
var useProjectionModel = (schema, kanban, registry) => {
|
|
29
|
+
const [projection, setProjection] = useState();
|
|
30
|
+
useAsyncEffect(async (controller) => {
|
|
31
|
+
if (!schema || !kanban) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const view = await kanban.view.load();
|
|
36
|
+
if (controller.signal.aborted) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);
|
|
40
|
+
const change = createEchoChangeCallback2(view, Type.isMutable(schema) ? schema : void 0);
|
|
41
|
+
const projection2 = new ProjectionModel({
|
|
42
|
+
registry,
|
|
43
|
+
view,
|
|
44
|
+
baseSchema: jsonSchema,
|
|
45
|
+
change
|
|
46
|
+
});
|
|
47
|
+
projection2.normalizeView();
|
|
48
|
+
if (!controller.signal.aborted) {
|
|
49
|
+
setProjection(projection2);
|
|
50
|
+
}
|
|
51
|
+
} catch (err) {
|
|
52
|
+
log.catch(err, {
|
|
53
|
+
schema,
|
|
54
|
+
kanban
|
|
55
|
+
}, {
|
|
56
|
+
F: __dxlog_file,
|
|
57
|
+
L: 51,
|
|
58
|
+
S: void 0,
|
|
59
|
+
C: (f, a) => f(...a)
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}, [
|
|
63
|
+
schema,
|
|
64
|
+
kanban,
|
|
65
|
+
registry
|
|
66
|
+
]);
|
|
67
|
+
return projection;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// src/hooks/useKanbanBoardModel.ts
|
|
71
|
+
import { Atom } from "@effect-atom/atom-react";
|
|
72
|
+
import { useMemo as useMemo2 } from "react";
|
|
73
|
+
import { Obj as Obj2 } from "@dxos/echo";
|
|
74
|
+
import { AtomObj } from "@dxos/echo-atom";
|
|
75
|
+
|
|
76
|
+
// src/util/arrangement.ts
|
|
77
|
+
var getOrderFromArrangement = (arrangement) => {
|
|
78
|
+
const order = arrangement?.order;
|
|
79
|
+
if (order != null && order.length > 0) {
|
|
80
|
+
return [
|
|
81
|
+
...order
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
return [];
|
|
85
|
+
};
|
|
86
|
+
var getOrderByColumnFromArrangement = (arrangement) => {
|
|
87
|
+
const columns = arrangement?.columns;
|
|
88
|
+
if (columns != null && Object.keys(columns).length > 0) {
|
|
89
|
+
return Object.fromEntries(Object.entries(columns).map(([key, entry]) => [
|
|
90
|
+
key,
|
|
91
|
+
{
|
|
92
|
+
ids: [
|
|
93
|
+
...entry.ids ?? []
|
|
94
|
+
],
|
|
95
|
+
...entry.hidden !== void 0 && {
|
|
96
|
+
hidden: entry.hidden
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
]));
|
|
100
|
+
}
|
|
101
|
+
return {};
|
|
102
|
+
};
|
|
103
|
+
var computeColumnStructure = (effectiveOrder, effectiveByColumn, selectOptions) => {
|
|
104
|
+
const order = [
|
|
105
|
+
...effectiveOrder
|
|
106
|
+
];
|
|
107
|
+
if (!order.includes(UNCATEGORIZED_VALUE)) {
|
|
108
|
+
order.unshift(UNCATEGORIZED_VALUE);
|
|
109
|
+
}
|
|
110
|
+
for (const opt of selectOptions) {
|
|
111
|
+
if (opt.id !== UNCATEGORIZED_VALUE && !order.includes(opt.id)) {
|
|
112
|
+
order.push(opt.id);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return order.map((columnValue) => ({
|
|
116
|
+
columnValue,
|
|
117
|
+
ids: effectiveByColumn[columnValue]?.ids ?? []
|
|
118
|
+
}));
|
|
119
|
+
};
|
|
120
|
+
var orderItemsInColumn = (items, ids, columnValue, pivotPath, validColumnValues) => {
|
|
121
|
+
const orderMap = new Map(ids.map((id, index) => [
|
|
122
|
+
id,
|
|
123
|
+
index
|
|
124
|
+
]));
|
|
125
|
+
const cardsWithExistingOrder = [];
|
|
126
|
+
const newCards = [];
|
|
127
|
+
for (const item of items) {
|
|
128
|
+
const itemColumn = pivotPath !== void 0 ? item[pivotPath] : void 0;
|
|
129
|
+
const isValidColumn = itemColumn != null && validColumnValues.has(itemColumn);
|
|
130
|
+
const belongsInColumn = columnValue === UNCATEGORIZED_VALUE ? !isValidColumn : itemColumn === columnValue;
|
|
131
|
+
if (belongsInColumn) {
|
|
132
|
+
(orderMap.has(item.id) ? cardsWithExistingOrder : newCards).push(item);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
cardsWithExistingOrder.sort((a, b) => {
|
|
136
|
+
const indexA = orderMap.get(a.id) ?? Infinity;
|
|
137
|
+
const indexB = orderMap.get(b.id) ?? Infinity;
|
|
138
|
+
return indexA - indexB;
|
|
139
|
+
});
|
|
140
|
+
return [
|
|
141
|
+
...cardsWithExistingOrder,
|
|
142
|
+
...newCards
|
|
143
|
+
];
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// src/hooks/useKanbanBoardModel.ts
|
|
147
|
+
function useKanbanBoardModel(kanban, projection, itemsAtom, registry) {
|
|
148
|
+
const arrangementAtom = useMemo2(() => AtomObj.makeProperty(kanban, "arrangement"), [
|
|
149
|
+
kanban
|
|
150
|
+
]);
|
|
151
|
+
const viewSnapshotAtom = useMemo2(() => kanban?.view ? AtomObj.make(kanban.view) : Atom.make(() => void 0), [
|
|
152
|
+
kanban?.view
|
|
153
|
+
]);
|
|
154
|
+
const pivotFieldIdAtom = useMemo2(() => Atom.make((get) => get(viewSnapshotAtom)?.projection?.pivotFieldId), [
|
|
155
|
+
viewSnapshotAtom
|
|
156
|
+
]);
|
|
157
|
+
const effectiveByColumnAtom = useMemo2(() => Atom.make((get) => getOrderByColumnFromArrangement(get(arrangementAtom))), [
|
|
158
|
+
arrangementAtom
|
|
159
|
+
]);
|
|
160
|
+
const columnsAtom = useMemo2(() => Atom.make((get) => {
|
|
161
|
+
const pivotFieldId = get(pivotFieldIdAtom);
|
|
162
|
+
if (pivotFieldId === void 0) {
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
get(projection.fields);
|
|
166
|
+
const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
|
|
167
|
+
if (!fieldProj) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const selectOptions = fieldProj.props.options ?? [];
|
|
171
|
+
if (selectOptions.length === 0) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
const arrangement = get(arrangementAtom);
|
|
175
|
+
const order = getOrderFromArrangement(arrangement);
|
|
176
|
+
const byColumn = getOrderByColumnFromArrangement(arrangement);
|
|
177
|
+
return computeColumnStructure(order, byColumn, selectOptions);
|
|
178
|
+
}), [
|
|
179
|
+
pivotFieldIdAtom,
|
|
180
|
+
arrangementAtom,
|
|
181
|
+
projection
|
|
182
|
+
]);
|
|
183
|
+
const columnArrangementAtomFamily = useMemo2(() => Atom.family((columnValue) => Atom.make((get) => {
|
|
184
|
+
const byColumn = get(effectiveByColumnAtom);
|
|
185
|
+
return {
|
|
186
|
+
columnValue,
|
|
187
|
+
ids: [
|
|
188
|
+
...byColumn[columnValue]?.ids ?? []
|
|
189
|
+
]
|
|
190
|
+
};
|
|
191
|
+
})), [
|
|
192
|
+
effectiveByColumnAtom
|
|
193
|
+
]);
|
|
194
|
+
const itemsAtomFamily = useMemo2(() => Atom.family((columnValue) => Atom.make((get) => {
|
|
195
|
+
const columnArr = get(columnArrangementAtomFamily(columnValue));
|
|
196
|
+
const allItems = get(itemsAtom);
|
|
197
|
+
const pivotFieldId = get(pivotFieldIdAtom);
|
|
198
|
+
if (pivotFieldId === void 0) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
get(projection.fields);
|
|
202
|
+
const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
|
|
203
|
+
if (!fieldProj) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
const selectOptions = fieldProj.props.options ?? [];
|
|
207
|
+
const pivotPath = fieldProj.props.property;
|
|
208
|
+
const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
|
|
209
|
+
return orderItemsInColumn(allItems, columnArr.ids, columnValue, pivotPath, validColumnValues);
|
|
210
|
+
})), [
|
|
211
|
+
columnArrangementAtomFamily,
|
|
212
|
+
itemsAtom,
|
|
213
|
+
pivotFieldIdAtom,
|
|
214
|
+
projection
|
|
215
|
+
]);
|
|
216
|
+
return useMemo2(() => ({
|
|
217
|
+
getColumnId: (data) => data.columnValue,
|
|
218
|
+
getItemId: (data) => data.id,
|
|
219
|
+
isColumn: (obj) => typeof obj === "object" && obj !== null && "columnValue" in obj && "ids" in obj,
|
|
220
|
+
// TODO(wittjosiah): This should be restricted to objects of the type of the kanban view.
|
|
221
|
+
isItem: (obj) => Obj2.isObject(obj),
|
|
222
|
+
columns: columnsAtom,
|
|
223
|
+
items: (column) => itemsAtomFamily(column.columnValue),
|
|
224
|
+
getColumns: () => registry.get(columnsAtom) ?? [],
|
|
225
|
+
getItems: (column) => registry.get(itemsAtomFamily(column.columnValue)) ?? []
|
|
226
|
+
}), [
|
|
227
|
+
columnsAtom,
|
|
228
|
+
itemsAtomFamily,
|
|
229
|
+
registry
|
|
230
|
+
]);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// src/hooks/useKanbanColumnEventHandler.ts
|
|
234
|
+
import { useMemo as useMemo3 } from "react";
|
|
235
|
+
import { arrayMove } from "@dxos/util";
|
|
236
|
+
function useKanbanColumnEventHandler({ id, model, projection, pivotFieldId, change }) {
|
|
237
|
+
return useMemo3(() => ({
|
|
238
|
+
id,
|
|
239
|
+
canDrop: ({ source }) => {
|
|
240
|
+
if (!projection) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
const data = source.data;
|
|
244
|
+
const columnValue = model.getColumnId(data);
|
|
245
|
+
return model.isColumn(source.data) && columnValue !== UNCATEGORIZED_VALUE && source.id !== UNCATEGORIZED_VALUE;
|
|
246
|
+
},
|
|
247
|
+
onDrop: ({ source, target }) => {
|
|
248
|
+
if (!projection || pivotFieldId === void 0) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const sourceColumnData = source.data;
|
|
252
|
+
const sourceColumnId = model.getColumnId(sourceColumnData);
|
|
253
|
+
if (sourceColumnId === UNCATEGORIZED_VALUE) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const currentColumns = model.getColumns();
|
|
257
|
+
const sourceIndex = currentColumns.findIndex((c) => model.getColumnId(c) === sourceColumnId);
|
|
258
|
+
if (sourceIndex === -1) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
let targetIndex;
|
|
262
|
+
if (target?.type === "tile" || target?.type === "placeholder") {
|
|
263
|
+
targetIndex = typeof target.location === "number" ? Math.floor(target.location) : -1;
|
|
264
|
+
} else if (target?.type === "container") {
|
|
265
|
+
targetIndex = currentColumns.length;
|
|
266
|
+
} else {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (targetIndex < 0) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const currentColumnIds = currentColumns.map((c) => model.getColumnId(c));
|
|
273
|
+
const reorderedColumnIds = arrayMove([
|
|
274
|
+
...currentColumnIds
|
|
275
|
+
], sourceIndex, targetIndex);
|
|
276
|
+
const fieldProjection = projection.getFieldProjection(pivotFieldId);
|
|
277
|
+
const currentOptions = [
|
|
278
|
+
...fieldProjection.props.options ?? []
|
|
279
|
+
];
|
|
280
|
+
const optionsInNewOrder = reorderedColumnIds.map((columnId) => currentOptions.find((o) => o.id === columnId)).filter((o) => o != null);
|
|
281
|
+
projection.setFieldProjection({
|
|
282
|
+
...fieldProjection,
|
|
283
|
+
props: {
|
|
284
|
+
...fieldProjection.props,
|
|
285
|
+
options: optionsInNewOrder
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
change.kanban((kanban) => {
|
|
289
|
+
kanban.arrangement.order = reorderedColumnIds.filter((columnId) => columnId !== UNCATEGORIZED_VALUE);
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}), [
|
|
293
|
+
id,
|
|
294
|
+
model,
|
|
295
|
+
projection,
|
|
296
|
+
pivotFieldId,
|
|
297
|
+
change
|
|
298
|
+
]);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// src/hooks/useKanbanItemEventHandler.ts
|
|
302
|
+
import { useMemo as useMemo4 } from "react";
|
|
303
|
+
function findColumn(id, arrangement) {
|
|
304
|
+
return arrangement.find(({ columnValue, cards }) => columnValue === id || cards.some((card) => card.id === id));
|
|
305
|
+
}
|
|
306
|
+
function useKanbanItemEventHandler({ column, columnFieldPath, model, change }) {
|
|
307
|
+
return useMemo4(() => ({
|
|
308
|
+
id: column.columnValue,
|
|
309
|
+
canDrop: ({ source }) => model.isItem(source.data),
|
|
310
|
+
onTake: ({ source }, cb) => {
|
|
311
|
+
void cb(source.data);
|
|
312
|
+
},
|
|
313
|
+
onDrop: ({ source, target }) => {
|
|
314
|
+
const columns = model.getColumns();
|
|
315
|
+
const currentArrangement = columns.map((col) => ({
|
|
316
|
+
columnValue: col.columnValue,
|
|
317
|
+
cards: model.getItems(col) ?? []
|
|
318
|
+
}));
|
|
319
|
+
const sourceColumnInSnapshot = findColumn(source.id, currentArrangement);
|
|
320
|
+
if (!sourceColumnInSnapshot) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const workingArrangement = currentArrangement.map((col) => ({
|
|
324
|
+
columnValue: col.columnValue,
|
|
325
|
+
cards: [
|
|
326
|
+
...col.cards
|
|
327
|
+
]
|
|
328
|
+
}));
|
|
329
|
+
const sourceColumnInWorking = workingArrangement.find((c) => c.columnValue === sourceColumnInSnapshot.columnValue || c.cards.some((card) => card.id === source.id));
|
|
330
|
+
const targetColumnInWorking = workingArrangement.find((c) => c.columnValue === column.columnValue);
|
|
331
|
+
if (!sourceColumnInWorking || !targetColumnInWorking) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const sourceIndex = sourceColumnInWorking.cards.findIndex((card) => card.id === source.id);
|
|
335
|
+
if (sourceIndex === -1) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const [movedCard] = sourceColumnInWorking.cards.splice(sourceIndex, 1);
|
|
339
|
+
if (columnFieldPath !== void 0) {
|
|
340
|
+
const newValue = targetColumnInWorking.columnValue === UNCATEGORIZED_VALUE ? void 0 : targetColumnInWorking.columnValue;
|
|
341
|
+
change.setItemField(movedCard, columnFieldPath, newValue);
|
|
342
|
+
}
|
|
343
|
+
const existingTargetIndex = target?.type === "tile" ? targetColumnInWorking.cards.findIndex((card) => model.getItemId(card) === target.id) : -1;
|
|
344
|
+
const closestEdge = target?.type === "placeholder" && typeof target.location === "number" ? target.location <= targetColumnInWorking.cards.length / 2 ? "top" : "bottom" : "bottom";
|
|
345
|
+
let insertIndex;
|
|
346
|
+
if (target?.type === "placeholder" && typeof target.location === "number") {
|
|
347
|
+
insertIndex = Math.max(0, Math.min(targetColumnInWorking.cards.length, Math.floor(target.location)));
|
|
348
|
+
} else if (target?.type === "container" || existingTargetIndex === -1) {
|
|
349
|
+
insertIndex = targetColumnInWorking.cards.length;
|
|
350
|
+
} else if (sourceColumnInWorking.columnValue === targetColumnInWorking.columnValue) {
|
|
351
|
+
insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
|
|
352
|
+
if (sourceIndex < existingTargetIndex) {
|
|
353
|
+
insertIndex -= 1;
|
|
354
|
+
}
|
|
355
|
+
} else {
|
|
356
|
+
insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
|
|
357
|
+
}
|
|
358
|
+
targetColumnInWorking.cards.splice(insertIndex, 0, movedCard);
|
|
359
|
+
change.kanban((kanban) => {
|
|
360
|
+
kanban.arrangement = {
|
|
361
|
+
order: workingArrangement.map(({ columnValue }) => columnValue),
|
|
362
|
+
columns: Object.fromEntries(workingArrangement.map(({ columnValue, cards }) => [
|
|
363
|
+
columnValue,
|
|
364
|
+
{
|
|
365
|
+
ids: cards.map((c) => c.id)
|
|
366
|
+
}
|
|
367
|
+
]))
|
|
368
|
+
};
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}), [
|
|
372
|
+
column,
|
|
373
|
+
columnFieldPath,
|
|
374
|
+
model,
|
|
375
|
+
change
|
|
376
|
+
]);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export {
|
|
380
|
+
useEchoChangeCallback,
|
|
381
|
+
useKanbanBoardModel,
|
|
382
|
+
useKanbanColumnEventHandler,
|
|
383
|
+
useKanbanItemEventHandler,
|
|
384
|
+
useProjectionModel
|
|
385
|
+
};
|
|
386
|
+
//# sourceMappingURL=chunk-CSL3HF2X.mjs.map
|