@dxos/plugin-kanban 0.8.4-main.c85a9c8dae → 0.8.4-main.d9fc60f731
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/LICENSE +102 -5
- package/PLUGIN.mdl +398 -0
- package/README.md +1 -1
- package/dist/lib/neutral/KanbanArticle-V3UCZQB6.mjs +133 -0
- package/dist/lib/neutral/KanbanArticle-V3UCZQB6.mjs.map +7 -0
- package/dist/lib/neutral/KanbanPlugin.mjs +44 -0
- package/dist/lib/neutral/KanbanPlugin.mjs.map +7 -0
- package/dist/lib/neutral/KanbanPlugin.node.mjs +27 -0
- package/dist/lib/neutral/KanbanPlugin.node.mjs.map +7 -0
- package/dist/lib/neutral/KanbanPlugin.workerd.mjs +21 -0
- package/dist/lib/neutral/KanbanPlugin.workerd.mjs.map +7 -0
- package/dist/lib/{browser/KanbanViewEditor-IH5CJ6BW.mjs → neutral/KanbanSettings-Q2RJW4U4.mjs} +38 -21
- package/dist/lib/neutral/KanbanSettings-Q2RJW4U4.mjs.map +7 -0
- package/dist/lib/{browser/blueprint-definition-HFEKGFJK.mjs → neutral/blueprint-definition-FHVIEKTQ.mjs} +4 -6
- package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/blueprints/index.mjs +1 -1
- package/dist/lib/neutral/capabilities/index.mjs +17 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6ZHHQWO5.mjs +39 -0
- package/dist/lib/neutral/chunk-6ZHHQWO5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-PNGVV67W.mjs +246 -0
- package/dist/lib/neutral/chunk-PNGVV67W.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UWUD7L3O.mjs +8 -0
- package/dist/lib/neutral/chunk-UWUD7L3O.mjs.map +7 -0
- package/dist/lib/{browser/chunk-TLYZSC7O.mjs → neutral/chunk-ZTQW5KQS.mjs} +3 -6
- package/dist/lib/neutral/chunk-ZTQW5KQS.mjs.map +7 -0
- package/dist/lib/{browser/KanbanContainer-BCXSJ6KS.mjs → neutral/components/index.mjs} +81 -142
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +11 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/neutral/create-object-DKBSI46K.mjs +40 -0
- package/dist/lib/neutral/create-object-DKBSI46K.mjs.map +7 -0
- package/dist/lib/neutral/delete-card-4QF3TKXO.mjs +24 -0
- package/dist/lib/neutral/delete-card-4QF3TKXO.mjs.map +7 -0
- package/dist/lib/neutral/delete-card-field-5M4ZHKLO.mjs +39 -0
- package/dist/lib/neutral/delete-card-field-5M4ZHKLO.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-CSL3HF2X.mjs → neutral/hooks/index.mjs} +128 -82
- package/dist/lib/neutral/hooks/index.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +34 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +8 -0
- package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +13 -0
- package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +8 -0
- package/dist/lib/neutral/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/{browser/react-surface-FOMOGFVW.mjs → neutral/react-surface-MROAQQQ6.mjs} +30 -38
- package/dist/lib/neutral/react-surface-MROAQQQ6.mjs.map +7 -0
- package/dist/lib/neutral/restore-card-5NI7HMIJ.mjs +21 -0
- package/dist/lib/neutral/restore-card-5NI7HMIJ.mjs.map +7 -0
- package/dist/lib/neutral/restore-card-field-QM2R67J5.mjs +37 -0
- package/dist/lib/neutral/restore-card-field-QM2R67J5.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +62 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +44 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/types/index.mjs +7 -5
- package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs +42 -0
- package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs.map +7 -0
- 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/KanbanPlugin.workerd.d.ts +4 -0
- package/dist/types/src/KanbanPlugin.workerd.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 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/create-object.d.ts +11 -0
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +12 -3
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +17 -38
- package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +48 -46
- package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +2 -3
- package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +2 -3
- package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -1
- package/dist/types/src/components/KanbanBoard/context.d.ts +38 -0
- package/dist/types/src/components/KanbanBoard/context.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts +6 -0
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts +79 -0
- package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/KanbanArticle/index.d.ts +2 -0
- package/dist/types/src/containers/KanbanArticle/index.d.ts.map +1 -0
- 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 +2 -2
- 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 +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 +1 -1
- package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -1
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +2 -2
- package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -1
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +2 -2
- package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/delete-card-field.d.ts +5 -0
- package/dist/types/src/operations/delete-card-field.d.ts.map +1 -0
- package/dist/types/src/operations/delete-card.d.ts +5 -0
- package/dist/types/src/operations/delete-card.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +3 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/operations/restore-card-field.d.ts +5 -0
- package/dist/types/src/operations/restore-card-field.d.ts.map +1 -0
- package/dist/types/src/operations/restore-card.d.ts +5 -0
- package/dist/types/src/operations/restore-card.d.ts.map +1 -0
- 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/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/testing/KanbanCardTileSimple.d.ts +4 -2
- package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +48 -46
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Kanban.d.ts +66 -9
- package/dist/types/src/types/Kanban.d.ts.map +1 -1
- package/dist/types/src/types/KanbanOperation.d.ts +52 -0
- package/dist/types/src/types/KanbanOperation.d.ts.map +1 -0
- 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/index.d.ts +2 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +15 -104
- 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 +8 -4
- package/dist/types/src/util/arrangement.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +115 -63
- package/src/KanbanPlugin.node.ts +21 -0
- package/src/KanbanPlugin.test.ts +31 -0
- package/src/KanbanPlugin.tsx +15 -29
- package/src/KanbanPlugin.workerd.ts +18 -0
- package/src/blueprints/kanban-blueprint.ts +4 -8
- package/src/capabilities/{artifact-definition/artifact-definition.ts → artifact-definition.ts} +12 -11
- package/src/capabilities/{blueprint-definition/blueprint-definition.ts → blueprint-definition.ts} +3 -1
- package/src/capabilities/create-object.ts +40 -0
- package/src/capabilities/index.ts +12 -3
- package/src/capabilities/operation-handler.ts +14 -0
- package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +35 -19
- package/src/capabilities/undo-mappings.ts +34 -0
- package/src/components/KanbanBoard/KanbanBoard.stories.tsx +22 -19
- package/src/components/KanbanBoard/KanbanBoard.tsx +43 -63
- package/src/components/KanbanBoard/KanbanCard.tsx +77 -63
- package/src/components/KanbanBoard/KanbanColumn.tsx +19 -16
- package/src/components/KanbanBoard/context.ts +54 -0
- package/src/containers/{KanbanContainer/KanbanContainer.stories.tsx → KanbanArticle/KanbanArticle.stories.tsx} +67 -53
- package/src/containers/KanbanArticle/KanbanArticle.tsx +180 -0
- package/src/containers/KanbanArticle/index.ts +5 -0
- package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
- package/src/containers/KanbanSettings/index.ts +5 -0
- package/src/containers/index.ts +2 -2
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useEchoChangeCallback.ts +3 -3
- package/src/hooks/useItemsProjection.ts +44 -0
- package/src/hooks/{useKanbanBoardModel.test.ts → useKanbanBoardModel.browser.test.ts} +13 -19
- package/src/hooks/useKanbanBoardModel.ts +20 -6
- package/src/hooks/useKanbanColumnEventHandler.ts +1 -1
- package/src/hooks/useKanbanItemEventHandler.ts +1 -1
- package/src/hooks/useProjectionModel.ts +5 -5
- package/src/index.ts +3 -2
- package/src/meta.ts +22 -5
- package/src/operations/delete-card-field.ts +42 -0
- package/src/operations/delete-card.ts +23 -0
- package/src/operations/index.ts +10 -0
- package/src/operations/restore-card-field.ts +36 -0
- package/src/operations/restore-card.ts +21 -0
- package/src/playwright/smoke.spec.ts +3 -3
- package/src/plugin.ts +11 -0
- package/src/testing/KanbanCardTileSimple.tsx +29 -23
- package/src/translations.ts +26 -25
- package/src/types/Kanban.ts +85 -18
- package/src/types/KanbanOperation.ts +79 -0
- package/src/types/index.ts +3 -1
- package/src/types/schema.ts +20 -78
- package/src/types/types.ts +2 -2
- package/src/util/arrangement.test.ts +23 -14
- package/src/util/arrangement.ts +25 -15
- package/src/vite-env.d.ts +10 -0
- package/dist/lib/browser/KanbanContainer-BCXSJ6KS.mjs.map +0 -7
- package/dist/lib/browser/KanbanViewEditor-IH5CJ6BW.mjs.map +0 -7
- package/dist/lib/browser/blueprint-definition-HFEKGFJK.mjs.map +0 -7
- package/dist/lib/browser/chunk-QSWCFMEB.mjs +0 -385
- package/dist/lib/browser/chunk-QSWCFMEB.mjs.map +0 -7
- package/dist/lib/browser/chunk-RNFIFE2P.mjs +0 -213
- package/dist/lib/browser/chunk-RNFIFE2P.mjs.map +0 -7
- package/dist/lib/browser/chunk-TLYZSC7O.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -101
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs +0 -162
- package/dist/lib/browser/operation-resolver-BRA2OHUE.mjs.map +0 -7
- package/dist/lib/browser/react-surface-FOMOGFVW.mjs.map +0 -7
- package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs +0 -305
- package/dist/lib/node-esm/KanbanContainer-EHRTLE7M.mjs.map +0 -7
- package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs +0 -67
- package/dist/lib/node-esm/KanbanViewEditor-WDACFC35.mjs.map +0 -7
- package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs +0 -18
- package/dist/lib/node-esm/blueprint-definition-NARBX32U.mjs.map +0 -7
- package/dist/lib/node-esm/blueprints/index.mjs +0 -9
- package/dist/lib/node-esm/chunk-4AWDHQVY.mjs +0 -214
- package/dist/lib/node-esm/chunk-4AWDHQVY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CSL3HF2X.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
- package/dist/lib/node-esm/chunk-X3UJUQIV.mjs +0 -31
- package/dist/lib/node-esm/chunk-X3UJUQIV.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -102
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs +0 -163
- package/dist/lib/node-esm/operation-resolver-UEQ64LCN.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-AITKFRBE.mjs +0 -100
- package/dist/lib/node-esm/react-surface-AITKFRBE.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -21
- package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/artifact-definition/index.d.ts +0 -3
- package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -6
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +0 -6
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +0 -1
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts +0 -77
- package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +0 -1
- package/dist/types/src/containers/KanbanContainer/index.d.ts +0 -3
- package/dist/types/src/containers/KanbanContainer/index.d.ts.map +0 -1
- 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 -3
- 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/capabilities/artifact-definition/index.ts +0 -7
- package/src/capabilities/blueprint-definition/index.ts +0 -7
- package/src/capabilities/operation-resolver/index.ts +0 -7
- package/src/capabilities/operation-resolver/operation-resolver.ts +0 -133
- package/src/capabilities/react-surface/index.ts +0 -7
- package/src/containers/KanbanContainer/KanbanContainer.tsx +0 -87
- package/src/containers/KanbanContainer/index.ts +0 -7
- package/src/containers/KanbanViewEditor/KanbanViewEditor.tsx +0 -63
- package/src/containers/KanbanViewEditor/index.ts +0 -7
- /package/dist/lib/{browser → neutral}/blueprints/index.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
- /package/dist/lib/{browser/types → neutral}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/blueprints/index.mjs.map → neutral/meta.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types → neutral/operations}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/types/index.mjs.map} +0 -0
- /package/dist/types/src/capabilities/{artifact-definition/artifact-definition.d.ts → artifact-definition.d.ts} +0 -0
- /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
package/src/types/Kanban.ts
CHANGED
|
@@ -4,15 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
// QueryAST is referenced indirectly through `Type.InstanceType<typeof ...Schema>`
|
|
8
|
+
// (Ref.Ref(View.View) → View.View → QueryAST.Query) in the emitted .d.ts; the
|
|
9
|
+
// namespace import keeps the inferred types portable.
|
|
10
|
+
// eslint-disable-next-line unused-imports/no-unused-imports
|
|
11
|
+
import { DXN, Annotation, Obj, QueryAST, Ref, Type, View } from '@dxos/echo';
|
|
9
12
|
import { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/internal';
|
|
10
13
|
import { ViewAnnotation } from '@dxos/schema';
|
|
11
14
|
|
|
12
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Per-column entry: ordered card ids plus an optional `hidden` flag that
|
|
17
|
+
* removes the column from the rendered board (and from the model's column
|
|
18
|
+
* list). Today only the uncategorized column is exposed in settings, but
|
|
19
|
+
* the data structure supports per-column hiding generally.
|
|
20
|
+
*/
|
|
13
21
|
const ArrangementColumnEntry = Schema.Struct({
|
|
14
22
|
ids: Schema.Array(Obj.ID),
|
|
15
|
-
hidden: Schema.
|
|
23
|
+
hidden: Schema.Boolean.pipe(Schema.optional),
|
|
16
24
|
});
|
|
17
25
|
|
|
18
26
|
/** Keyed by columnValue. */
|
|
@@ -29,39 +37,98 @@ export const Arrangement = Schema.Struct({
|
|
|
29
37
|
|
|
30
38
|
export type Arrangement = Schema.Schema.Type<typeof Arrangement>;
|
|
31
39
|
|
|
32
|
-
|
|
33
|
-
|
|
40
|
+
//
|
|
41
|
+
// Mirrors the canonical DXOS pattern (see `Trigger.Spec` in
|
|
42
|
+
// `@dxos/functions/src/types/Trigger.ts` and `Sequence.Source` in
|
|
43
|
+
// `@dxos/plugin-zen`): the `Type.makeObject` schema is a flat `Schema.Struct`,
|
|
44
|
+
// and the discriminated union lives one level down as a single field whose
|
|
45
|
+
// variants are tagged with a `kind` literal.
|
|
46
|
+
//
|
|
34
47
|
|
|
48
|
+
/** View-variant: items come from running the View's query (the original behaviour). */
|
|
49
|
+
export const KanbanViewSpec = Schema.Struct({
|
|
50
|
+
kind: Schema.Literal('view').pipe(FormInputAnnotation.set(false)),
|
|
35
51
|
view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),
|
|
52
|
+
});
|
|
53
|
+
export type KanbanViewSpec = Schema.Schema.Type<typeof KanbanViewSpec>;
|
|
54
|
+
|
|
55
|
+
/** Items-variant: kanban owns its items as an explicit ref array (used by externally-synced kanbans). */
|
|
56
|
+
export const KanbanItemsSpec = Schema.Struct({
|
|
57
|
+
kind: Schema.Literal('items').pipe(FormInputAnnotation.set(false)),
|
|
58
|
+
/** Property path on each item that drives column membership (e.g. `'listName'`). */
|
|
59
|
+
pivotField: Schema.String,
|
|
60
|
+
/** Items owned directly by the kanban. */
|
|
61
|
+
items: Schema.Array(Ref.Ref(Obj.Unknown)).pipe(FormInputAnnotation.set(false)),
|
|
62
|
+
});
|
|
63
|
+
export type KanbanItemsSpec = Schema.Schema.Type<typeof KanbanItemsSpec>;
|
|
64
|
+
|
|
65
|
+
/** Discriminated union of source specs. Distinguished by `kind`. */
|
|
66
|
+
export const KanbanSpec = Schema.Union(KanbanViewSpec, KanbanItemsSpec);
|
|
67
|
+
export type KanbanSpec = Schema.Schema.Type<typeof KanbanSpec>;
|
|
36
68
|
|
|
37
|
-
|
|
69
|
+
export const Kanban = Schema.Struct({
|
|
70
|
+
name: Schema.String.pipe(Schema.optional),
|
|
38
71
|
arrangement: Arrangement,
|
|
72
|
+
/** How this kanban sources its items. Discriminated by `spec.kind`. */
|
|
73
|
+
spec: KanbanSpec,
|
|
39
74
|
}).pipe(
|
|
40
|
-
Type.object({
|
|
41
|
-
typename: 'dxos.org/type/Kanban',
|
|
42
|
-
version: '0.3.0',
|
|
43
|
-
}),
|
|
44
75
|
LabelAnnotation.set(['name']),
|
|
45
|
-
ViewAnnotation.set(
|
|
76
|
+
ViewAnnotation.set(['spec', 'view']),
|
|
77
|
+
Annotation.IconAnnotation.set({ icon: 'ph--kanban--regular', hue: 'green' }),
|
|
78
|
+
Type.makeObject(DXN.make('org.dxos.type.kanban', '0.2.0')),
|
|
46
79
|
);
|
|
47
80
|
|
|
48
|
-
/**
|
|
49
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Instance type; narrow on `kanban.spec.kind` (or use the guards below).
|
|
83
|
+
*/
|
|
84
|
+
export interface Kanban extends Type.InstanceType<typeof Kanban> {}
|
|
85
|
+
|
|
86
|
+
/** Narrowed view-variant kanban. */
|
|
87
|
+
export type KanbanView = Kanban & { spec: KanbanViewSpec };
|
|
88
|
+
|
|
89
|
+
/** Narrowed items-variant kanban. */
|
|
90
|
+
export type KanbanItems = Kanban & { spec: KanbanItemsSpec };
|
|
50
91
|
|
|
51
|
-
|
|
92
|
+
export const isKanbanView = (kanban: Kanban): kanban is KanbanView => kanban.spec.kind === 'view';
|
|
93
|
+
export const isKanbanItems = (kanban: Kanban): kanban is KanbanItems => kanban.spec.kind === 'items';
|
|
94
|
+
|
|
95
|
+
type MakeViewProps = {
|
|
96
|
+
name?: string;
|
|
52
97
|
view: View.View;
|
|
98
|
+
arrangement?: Arrangement;
|
|
53
99
|
};
|
|
54
100
|
|
|
55
101
|
/**
|
|
56
|
-
* Make a kanban
|
|
102
|
+
* Make a view-variant kanban (items sourced via the View's query).
|
|
57
103
|
*/
|
|
58
|
-
export const make = (props:
|
|
104
|
+
export const make = (props: MakeViewProps): Kanban => {
|
|
59
105
|
const { name, view, arrangement } = props;
|
|
60
106
|
const order = arrangement?.order ?? [];
|
|
61
107
|
const columns = arrangement?.columns ?? {};
|
|
62
108
|
return Obj.make(Kanban, {
|
|
63
109
|
name,
|
|
64
|
-
view: Ref.make(view),
|
|
65
110
|
arrangement: { order, columns },
|
|
111
|
+
spec: { kind: 'view' as const, view: Ref.make(view) },
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
type MakeItemsProps = {
|
|
116
|
+
name?: string;
|
|
117
|
+
arrangement?: Arrangement;
|
|
118
|
+
pivotField: string;
|
|
119
|
+
items?: ReadonlyArray<Ref.Ref<Obj.Unknown>>;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Make an items-variant kanban (items list owned by the kanban itself, e.g. populated by a sync integration).
|
|
124
|
+
*/
|
|
125
|
+
export const makeItems = (props: MakeItemsProps): Kanban => {
|
|
126
|
+
const { name, arrangement, pivotField, items = [] } = props;
|
|
127
|
+
const order = arrangement?.order ?? [];
|
|
128
|
+
const columns = arrangement?.columns ?? {};
|
|
129
|
+
return Obj.make(Kanban, {
|
|
130
|
+
name,
|
|
131
|
+
arrangement: { order, columns },
|
|
132
|
+
spec: { kind: 'items' as const, pivotField, items },
|
|
66
133
|
});
|
|
67
134
|
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// @import-as-namespace
|
|
6
|
+
|
|
7
|
+
import * as Schema from 'effect/Schema';
|
|
8
|
+
|
|
9
|
+
import { Capability } from '@dxos/app-framework';
|
|
10
|
+
import { Operation } from '@dxos/compute';
|
|
11
|
+
import { Type, View, DXN } from '@dxos/echo';
|
|
12
|
+
|
|
13
|
+
import { meta } from '#meta';
|
|
14
|
+
|
|
15
|
+
const makeKey = (name: string) => DXN.make(`${meta.id}.operation.${name}`);
|
|
16
|
+
|
|
17
|
+
export const DeleteCardFieldOutput = Schema.Struct({
|
|
18
|
+
field: View.FieldSchema.annotations({ description: 'The deleted field schema.' }),
|
|
19
|
+
props: Schema.Any.annotations({ description: 'The deleted field properties.' }),
|
|
20
|
+
index: Schema.Number.annotations({ description: 'The index the field was at.' }),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export type DeleteCardFieldOutput = Schema.Schema.Type<typeof DeleteCardFieldOutput>;
|
|
24
|
+
|
|
25
|
+
export const DeleteCardField = Operation.make({
|
|
26
|
+
meta: {
|
|
27
|
+
key: makeKey('deleteCardField'),
|
|
28
|
+
name: 'Delete Card Field',
|
|
29
|
+
icon: 'ph--minus-circle--regular',
|
|
30
|
+
},
|
|
31
|
+
services: [Capability.Service],
|
|
32
|
+
input: Schema.Struct({
|
|
33
|
+
view: Type.getSchema(View.View),
|
|
34
|
+
fieldId: Schema.String,
|
|
35
|
+
}),
|
|
36
|
+
output: DeleteCardFieldOutput,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const DeleteCardOutput = Schema.Struct({
|
|
40
|
+
card: Schema.Any.annotations({ description: 'The deleted card.' }),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export type DeleteCardOutput = Schema.Schema.Type<typeof DeleteCardOutput>;
|
|
44
|
+
|
|
45
|
+
export const DeleteCard = Operation.make({
|
|
46
|
+
meta: { key: makeKey('deleteCard'), name: 'Delete Card', icon: 'ph--trash--regular' },
|
|
47
|
+
input: Schema.Struct({
|
|
48
|
+
card: Schema.Any,
|
|
49
|
+
}),
|
|
50
|
+
output: DeleteCardOutput,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export const RestoreCardField = Operation.make({
|
|
54
|
+
meta: {
|
|
55
|
+
key: makeKey('restoreCardField'),
|
|
56
|
+
name: 'Restore Card Field',
|
|
57
|
+
icon: 'ph--clock-counter-clockwise--regular',
|
|
58
|
+
},
|
|
59
|
+
services: [Capability.Service],
|
|
60
|
+
input: Schema.Struct({
|
|
61
|
+
view: Type.getSchema(View.View).annotations({ description: 'The view to restore the field to.' }),
|
|
62
|
+
field: View.FieldSchema.annotations({ description: 'The field schema to restore.' }),
|
|
63
|
+
props: Schema.Any.annotations({ description: 'The field properties to restore.' }),
|
|
64
|
+
index: Schema.Number.annotations({ description: 'The index to restore the field at.' }),
|
|
65
|
+
}),
|
|
66
|
+
output: Schema.Void,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
export const RestoreCard = Operation.make({
|
|
70
|
+
meta: {
|
|
71
|
+
key: makeKey('restoreCard'),
|
|
72
|
+
name: 'Restore Card',
|
|
73
|
+
icon: 'ph--clock-counter-clockwise--regular',
|
|
74
|
+
},
|
|
75
|
+
input: Schema.Struct({
|
|
76
|
+
card: Schema.Any.annotations({ description: 'The card to restore.' }),
|
|
77
|
+
}),
|
|
78
|
+
output: Schema.Void,
|
|
79
|
+
});
|
package/src/types/index.ts
CHANGED
package/src/types/schema.ts
CHANGED
|
@@ -4,12 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import { View } from '@dxos/echo';
|
|
9
|
-
import { Operation } from '@dxos/operation';
|
|
10
|
-
import { TypeInputOptionsAnnotation } from '@dxos/plugin-space/types';
|
|
11
|
-
|
|
12
|
-
import { meta } from '../meta';
|
|
7
|
+
import { TypeInputOptionsAnnotation } from '@dxos/plugin-space';
|
|
13
8
|
|
|
14
9
|
/**
|
|
15
10
|
* Kanban data model.
|
|
@@ -23,10 +18,28 @@ import { meta } from '../meta';
|
|
|
23
18
|
// TODO(wittjosiah): Factor out?
|
|
24
19
|
export const PivotColumnAnnotationId = Symbol.for('@dxos/plugin-kanban/annotation/PivotColumn');
|
|
25
20
|
|
|
26
|
-
|
|
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({
|
|
27
39
|
columnFieldId: Schema.String.annotations({
|
|
28
40
|
title: 'Column field',
|
|
29
41
|
}),
|
|
42
|
+
...KanbanSettingsSchema.fields,
|
|
30
43
|
});
|
|
31
44
|
|
|
32
45
|
export const CreateKanbanSchema = Schema.Struct({
|
|
@@ -37,7 +50,6 @@ export const CreateKanbanSchema = Schema.Struct({
|
|
|
37
50
|
TypeInputOptionsAnnotation.set({
|
|
38
51
|
location: ['database', 'runtime'],
|
|
39
52
|
kind: ['user'],
|
|
40
|
-
registered: ['registered'],
|
|
41
53
|
}),
|
|
42
54
|
Schema.optional,
|
|
43
55
|
),
|
|
@@ -48,73 +60,3 @@ export const CreateKanbanSchema = Schema.Struct({
|
|
|
48
60
|
}),
|
|
49
61
|
),
|
|
50
62
|
});
|
|
51
|
-
|
|
52
|
-
const KANBAN_OPERATION = `${meta.id}/operation`;
|
|
53
|
-
|
|
54
|
-
export namespace KanbanOperation {
|
|
55
|
-
export const DeleteCardFieldOutput = Schema.Struct({
|
|
56
|
-
field: View.FieldSchema.annotations({ description: 'The deleted field schema.' }),
|
|
57
|
-
props: Schema.Any.annotations({ description: 'The deleted field properties.' }),
|
|
58
|
-
index: Schema.Number.annotations({ description: 'The index the field was at.' }),
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
export type DeleteCardFieldOutput = Schema.Schema.Type<typeof DeleteCardFieldOutput>;
|
|
62
|
-
|
|
63
|
-
export const DeleteCardField = Operation.make({
|
|
64
|
-
meta: { key: `${KANBAN_OPERATION}/delete-card-field`, name: 'Delete Card Field' },
|
|
65
|
-
services: [Capability.Service],
|
|
66
|
-
schema: {
|
|
67
|
-
input: Schema.Struct({
|
|
68
|
-
view: View.View,
|
|
69
|
-
fieldId: Schema.String,
|
|
70
|
-
}),
|
|
71
|
-
output: DeleteCardFieldOutput,
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
export const DeleteCardOutput = Schema.Struct({
|
|
76
|
-
card: Schema.Any.annotations({ description: 'The deleted card.' }),
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
export type DeleteCardOutput = Schema.Schema.Type<typeof DeleteCardOutput>;
|
|
80
|
-
|
|
81
|
-
export const DeleteCard = Operation.make({
|
|
82
|
-
meta: { key: `${KANBAN_OPERATION}/delete-card`, name: 'Delete Card' },
|
|
83
|
-
schema: {
|
|
84
|
-
input: Schema.Struct({
|
|
85
|
-
card: Schema.Any,
|
|
86
|
-
}),
|
|
87
|
-
output: DeleteCardOutput,
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Restore a deleted card field (inverse of DeleteCardField).
|
|
93
|
-
*/
|
|
94
|
-
export const RestoreCardField = Operation.make({
|
|
95
|
-
meta: { key: `${KANBAN_OPERATION}/restore-card-field`, name: 'Restore Card Field' },
|
|
96
|
-
services: [Capability.Service],
|
|
97
|
-
schema: {
|
|
98
|
-
input: Schema.Struct({
|
|
99
|
-
view: View.View.annotations({ description: 'The view to restore the field to.' }),
|
|
100
|
-
field: View.FieldSchema.annotations({ description: 'The field schema to restore.' }),
|
|
101
|
-
props: Schema.Any.annotations({ description: 'The field properties to restore.' }),
|
|
102
|
-
index: Schema.Number.annotations({ description: 'The index to restore the field at.' }),
|
|
103
|
-
}),
|
|
104
|
-
output: Schema.Void,
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Restore a deleted card (inverse of DeleteCard).
|
|
110
|
-
*/
|
|
111
|
-
export const RestoreCard = Operation.make({
|
|
112
|
-
meta: { key: `${KANBAN_OPERATION}/restore-card`, name: 'Restore Card' },
|
|
113
|
-
schema: {
|
|
114
|
-
input: Schema.Struct({
|
|
115
|
-
card: Schema.Any.annotations({ description: 'The card to restore.' }),
|
|
116
|
-
}),
|
|
117
|
-
output: Schema.Void,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
}
|
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
|
};
|
|
@@ -5,12 +5,11 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
import { beforeEach, describe, test } from 'vitest';
|
|
7
7
|
|
|
8
|
-
import { Filter, JsonSchema, Query, Type } from '@dxos/echo';
|
|
9
|
-
import {
|
|
10
|
-
import { ObjectId } from '@dxos/keys';
|
|
8
|
+
import { DXN, Filter, JsonSchema, Query, Type, type View } from '@dxos/echo';
|
|
9
|
+
import { EntityId } from '@dxos/keys';
|
|
11
10
|
import { ViewModel } from '@dxos/schema';
|
|
12
11
|
|
|
13
|
-
import { Kanban, UNCATEGORIZED_VALUE } from '
|
|
12
|
+
import { Kanban, UNCATEGORIZED_VALUE } from '#types';
|
|
14
13
|
|
|
15
14
|
import {
|
|
16
15
|
computeColumnStructure,
|
|
@@ -26,7 +25,7 @@ const selectOptions = [
|
|
|
26
25
|
];
|
|
27
26
|
|
|
28
27
|
const MinimalSchema = Schema.Struct({ id: Schema.String }).pipe(
|
|
29
|
-
Type.
|
|
28
|
+
Type.makeObject(DXN.make('com.example.type.minimal', '0.1.0')),
|
|
30
29
|
);
|
|
31
30
|
|
|
32
31
|
describe('arrangement utils', () => {
|
|
@@ -80,9 +79,9 @@ describe('arrangement utils', () => {
|
|
|
80
79
|
});
|
|
81
80
|
|
|
82
81
|
test('returns per-column ids and preserves hidden from kanban arrangement', ({ expect }) => {
|
|
83
|
-
const id1 =
|
|
84
|
-
const id2 =
|
|
85
|
-
const id3 =
|
|
82
|
+
const id1 = EntityId.random();
|
|
83
|
+
const id2 = EntityId.random();
|
|
84
|
+
const id3 = EntityId.random();
|
|
86
85
|
const kanban = Kanban.make({
|
|
87
86
|
view,
|
|
88
87
|
arrangement: {
|
|
@@ -99,14 +98,24 @@ describe('arrangement utils', () => {
|
|
|
99
98
|
expect(byColumn.b.hidden).toBeUndefined();
|
|
100
99
|
});
|
|
101
100
|
|
|
101
|
+
test('treats non-array ids as empty (Automerge / corrupt layout)', ({ expect }) => {
|
|
102
|
+
const arrangement = {
|
|
103
|
+
order: [],
|
|
104
|
+
columns: { a: { ids: {} as unknown as string[] }, b: { ids: ['ok'] } },
|
|
105
|
+
};
|
|
106
|
+
const byColumn = getOrderByColumnFromArrangement(arrangement);
|
|
107
|
+
expect(byColumn.a.ids).toEqual([]);
|
|
108
|
+
expect(byColumn.b.ids).toEqual(['ok']);
|
|
109
|
+
});
|
|
110
|
+
|
|
102
111
|
test('returns mutable copies', ({ expect }) => {
|
|
103
|
-
const idX =
|
|
112
|
+
const idX = EntityId.random();
|
|
104
113
|
const kanban = Kanban.make({
|
|
105
114
|
view,
|
|
106
115
|
arrangement: { order: [], columns: { a: { ids: [idX] } } },
|
|
107
116
|
});
|
|
108
117
|
const byColumn = getOrderByColumnFromArrangement(kanban.arrangement);
|
|
109
|
-
byColumn.a.ids.push(
|
|
118
|
+
byColumn.a.ids.push(EntityId.random());
|
|
110
119
|
expect(getOrderByColumnFromArrangement(kanban.arrangement).a.ids).toEqual([idX]);
|
|
111
120
|
});
|
|
112
121
|
|
|
@@ -142,10 +151,10 @@ describe('arrangement utils', () => {
|
|
|
142
151
|
|
|
143
152
|
describe('computeItemArrangement', () => {
|
|
144
153
|
test('distributes items by pivotPath and preserves saved order within column', ({ expect }) => {
|
|
145
|
-
const idUc1 =
|
|
146
|
-
const idA1 =
|
|
147
|
-
const idA2 =
|
|
148
|
-
const idA3 =
|
|
154
|
+
const idUc1 = EntityId.random();
|
|
155
|
+
const idA1 = EntityId.random();
|
|
156
|
+
const idA2 = EntityId.random();
|
|
157
|
+
const idA3 = EntityId.random();
|
|
149
158
|
const kanban = Kanban.make({
|
|
150
159
|
view,
|
|
151
160
|
arrangement: {
|
package/src/util/arrangement.ts
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
type ColumnStructure,
|
|
11
11
|
type Kanban,
|
|
12
12
|
UNCATEGORIZED_VALUE,
|
|
13
|
-
} from '
|
|
13
|
+
} from '#types';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Column order from a raw arrangement object (e.g. when working with arrangement only).
|
|
@@ -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/containers/KanbanContainer/KanbanContainer.tsx", "../../../src/components/KanbanBoard/KanbanBoard.tsx", "../../../src/components/KanbanBoard/KanbanCard.tsx", "../../../src/components/KanbanBoard/KanbanColumn.tsx", "../../../src/containers/KanbanContainer/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';\nimport { Filter, Obj, Type } from '@dxos/echo';\nimport { AtomQuery } from '@dxos/echo-atom';\nimport { useObject, useSchema } from '@dxos/react-client/echo';\nimport { Panel } from '@dxos/react-ui';\nimport { getTypenameFromQuery } from '@dxos/schema';\n\nimport { KanbanBoard } from '../../components';\nimport { useEchoChangeCallback, useProjectionModel } from '../../hooks';\nimport { type Kanban, KanbanOperation } from '../../types';\n\nexport type KanbanContainerProps = SurfaceComponentProps<Kanban.Kanban>;\n\nexport const KanbanContainer = ({ role, subject: object }: KanbanContainerProps) => {\n const registry = useContext(RegistryContext);\n const schemas = useCapabilities(AppCapabilities.Schema);\n const db = Obj.getDatabase(object);\n const { invokePromise } = useOperationInvoker();\n const [view] = useObject(object.view);\n const typename = view?.query ? getTypenameFromQuery(view.query.ast) : undefined;\n\n const schemaFromDb = useSchema(db, typename);\n const cardSchema = useMemo(\n () => schemaFromDb ?? schemas.flat().find((schema) => Type.getTypename(schema) === typename),\n [schemaFromDb, schemas, typename],\n );\n\n const items = useMemo(\n () => (db ? AtomQuery.make(db, cardSchema ? Filter.type(cardSchema) : Filter.nothing()) : null),\n [db, cardSchema],\n );\n\n const projection = useProjectionModel(cardSchema, object, registry);\n const change = useEchoChangeCallback(object);\n\n const pivotFieldId = view?.projection?.pivotFieldId;\n const columnFieldPath =\n projection && pivotFieldId ? projection.tryGetFieldProjection(pivotFieldId)?.props.property : undefined;\n\n const handleCardAdd = useCallback(\n (columnValue: string | undefined) => {\n if (db && cardSchema && columnFieldPath) {\n const card = Obj.make(cardSchema, { [columnFieldPath]: columnValue });\n db.add(card);\n return card.id;\n }\n },\n [db, cardSchema, columnFieldPath],\n );\n\n const handleCardRemove = useCallback(\n (card: { id: string }) => {\n void invokePromise(KanbanOperation.DeleteCard, { card });\n },\n [invokePromise],\n );\n\n if (!object || !db || !items || !projection || !change) {\n return null;\n }\n\n return (\n <Panel.Root role={role}>\n <Panel.Content asChild>\n <KanbanBoard.Root\n kanban={object}\n projection={projection}\n items={items}\n change={change}\n onCardAdd={handleCardAdd}\n onCardRemove={handleCardRemove}\n >\n <KanbanBoard.Content />\n </KanbanBoard.Root>\n </Panel.Content>\n </Panel.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, RegistryContext } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, {\n type ComponentPropsWithoutRef,\n type ComponentType,\n type PropsWithChildren,\n useCallback,\n useContext,\n useMemo,\n} from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Board, useBoard } from '@dxos/react-ui-mosaic';\nimport type { ProjectionModel } from '@dxos/schema';\n\nimport { useKanbanBoardModel, useKanbanColumnEventHandler } from '../../hooks';\nimport { meta } from '../../meta';\nimport { type Kanban, type KanbanChangeCallback, UNCATEGORIZED_ATTRIBUTES, UNCATEGORIZED_VALUE } from '../../types';\n\nimport { KanbanCard, type KanbanCardProps } from './KanbanCard';\nimport { KanbanColumn, type KanbanColumnProps } from './KanbanColumn';\n\n// TODO(burdon): Rename Kanban.\n\n//\n// Context\n//\n\nconst KANBAN_BOARD_NAME = 'KanbanBoard.Context';\n\n/**\n * Context value for the Kanban board.\n * Items are Echo objects (Obj.Unknown).\n */\ntype KanbanBoardContextValue = {\n kanbanId: string;\n projection: ProjectionModel | undefined;\n columnFieldPath: string | undefined;\n change: KanbanChangeCallback<Obj.Unknown>;\n pivotFieldId: string | undefined;\n getPivotAttributes: (columnValue: string) => { title: string; color: string };\n itemTile?: ComponentType<KanbanCardProps>; // TODO(burdon): Prop.\n onCardAdd?: (columnValue: string | undefined) => string | undefined;\n onCardRemove?: (card: Obj.Unknown) => void;\n};\n\nconst [KanbanBoardContext, useKanbanBoard] = createContext<KanbanBoardContextValue>(KANBAN_BOARD_NAME, {\n kanbanId: 'never',\n projection: undefined,\n columnFieldPath: undefined,\n change: { kanban: () => {}, setItemField: () => {} },\n pivotFieldId: undefined,\n getPivotAttributes: (id: string) =>\n id === UNCATEGORIZED_VALUE ? UNCATEGORIZED_ATTRIBUTES : { title: id, color: 'neutral' },\n itemTile: (() => null) as ComponentType<KanbanCardProps>,\n});\n\n//\n// Root\n//\n\nconst KANBAN_BOARD_ROOT = 'KanbanBoard.Root';\n\ntype KanbanBoardRootProps = PropsWithChildren<\n Pick<KanbanBoardContextValue, 'change' | 'itemTile'> & {\n kanban: Kanban.Kanban;\n /** Required when providing context; Root derives columnFieldPath, pivotFieldId, getPivotAttributes from kanban + projection. */\n projection: ProjectionModel;\n /** Atom of items (e.g. from AtomQuery for DB, or Atom.make([]) for in-memory). */\n items: Atom.Atom<Obj.Unknown[]>;\n onCardAdd?: (columnValue: string | undefined) => string | undefined;\n onCardRemove?: (card: Obj.Unknown) => void;\n } & ComponentPropsWithoutRef<'div'>\n>;\n\nexport const KanbanBoardRoot = ({\n children,\n change,\n itemTile = KanbanCard,\n kanban,\n projection,\n items,\n onCardAdd,\n onCardRemove,\n ...props\n}: KanbanBoardRootProps) => {\n const registry = useContext(RegistryContext);\n const { t } = useTranslation(meta.id);\n const model = useKanbanBoardModel(kanban, projection, items, registry);\n const columns = model?.getColumns?.() ?? [];\n const view = kanban?.view?.target;\n const pivotFieldId = view?.projection?.pivotFieldId;\n const columnFieldPath = useMemo(() => {\n if (pivotFieldId === undefined || !projection) {\n return undefined;\n }\n\n return projection.tryGetFieldProjection(pivotFieldId)?.props.property;\n }, [projection, pivotFieldId]);\n\n const getPivotAttributes = useCallback<KanbanBoardContextValue['getPivotAttributes']>(\n (columnValue) => {\n if (columnValue === UNCATEGORIZED_VALUE) {\n return UNCATEGORIZED_ATTRIBUTES;\n }\n\n const options = projection?.tryGetFieldProjection(pivotFieldId ?? '')?.props.options ?? [];\n const option = options.find((option) => option.id === columnValue);\n return option ?? ({ title: columnValue, color: 'neutral' } as const);\n },\n [projection, pivotFieldId],\n );\n\n if (columns.length === 0) {\n return (\n <div {...props} className='flex flex-1 items-center justify-center p-8 text-center text-description'>\n {t('select pivot placeholder')}\n </div>\n );\n }\n\n return (\n <KanbanBoardContext\n kanbanId={Obj.getDXN(kanban).toString()}\n projection={projection}\n columnFieldPath={columnFieldPath}\n pivotFieldId={pivotFieldId}\n getPivotAttributes={getPivotAttributes}\n itemTile={itemTile}\n change={change}\n onCardAdd={onCardAdd}\n onCardRemove={onCardRemove}\n >\n <Board.Root model={model}>\n <div {...props}>{children}</div>\n </Board.Root>\n </KanbanBoardContext>\n );\n};\n\nKanbanBoardRoot.displayName = KANBAN_BOARD_ROOT;\n\n//\n// KanbanBoardContent\n//\n\nconst KANBAN_BOARD_CONTENT = 'KanbanBoard.Content';\n\nexport const KanbanBoardContent = () => {\n const { model } = useBoard(KANBAN_BOARD_CONTENT);\n const { kanbanId, projection, pivotFieldId, change } = useKanbanBoard(KANBAN_BOARD_CONTENT);\n\n const columnEventHandler = useKanbanColumnEventHandler({\n id: `${kanbanId}-columns`,\n model,\n projection: projection ?? undefined,\n pivotFieldId: pivotFieldId ?? undefined,\n change,\n });\n\n return <Board.Content id={kanbanId} eventHandler={columnEventHandler} Tile={KanbanColumn} />;\n};\n\nKanbanBoardContent.displayName = KANBAN_BOARD_CONTENT;\n\n//\n// KanbanBoard\n//\n\nexport const KanbanBoard = {\n Root: KanbanBoardRoot,\n Content: KanbanBoardContent,\n Column: KanbanColumn,\n Card: KanbanCard,\n};\n\nexport { useKanbanBoard };\n\nexport type { KanbanBoardRootProps as KanbanBoardProps, KanbanCardProps, KanbanColumnProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useMemo, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { useObjectMenuItems, useObjectNavigate } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Card, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { Focus, Mosaic, type MosaicTileProps, useBoard } from '@dxos/react-ui-mosaic';\n\nimport { meta } from '../../meta';\n\nimport { useKanbanBoard } from './KanbanBoard';\n\nconst KANBAN_CARD_TILE_NAME = 'KanbanBoard.Card';\n\nexport type KanbanCardProps = Pick<MosaicTileProps<Obj.Unknown>, 'location' | 'data' | 'debug'>;\n\n/**\n * Mosaic Tile for Kanban card.\n * Uses Surface for content; requires plugin manager context.\n */\nexport const KanbanCard = forwardRef<HTMLDivElement, KanbanCardProps>(({ data, location, debug }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const { model } = useBoard(KANBAN_CARD_TILE_NAME);\n const { projection, onCardRemove } = useKanbanBoard(KANBAN_CARD_TILE_NAME);\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n const dragHandleRef = useCallback((el: HTMLButtonElement | null) => setDragHandle(el), []);\n\n const objectMenuItems = useObjectMenuItems(data);\n const handleNavigate = useObjectNavigate(data);\n\n const menuItems = useMemo(\n () => [\n ...objectMenuItems,\n ...(onCardRemove\n ? [\n createMenuAction('remove', () => onCardRemove(data), {\n label: t('remove card label'),\n icon: 'ph--trash--regular',\n }),\n ]\n : []),\n ],\n [objectMenuItems, onCardRemove, data, t],\n );\n\n return (\n <Mosaic.Tile\n asChild\n id={model.getItemId(data)}\n data={data}\n location={location}\n debug={debug}\n dragHandle={dragHandle}\n >\n <Focus.Group asChild>\n <Menu.Root>\n <Card.Root ref={forwardedRef} data-testid='board-item'>\n <Card.Toolbar>\n <Card.DragHandle ref={dragHandleRef} />\n <Card.Title onClick={handleNavigate}>{Obj.getLabel(data)}</Card.Title>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Menu.Trigger asChild disabled={!menuItems?.length}>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action menu label')}\n />\n </Menu.Trigger>\n <Menu.Content items={menuItems} />\n </Card.Toolbar>\n <Card.Content>\n {projection && <Surface.Surface role='card--content' limit={1} data={{ subject: data, projection }} />}\n </Card.Content>\n </Card.Root>\n </Menu.Root>\n </Focus.Group>\n </Mosaic.Tile>\n );\n});\n\nKanbanCard.displayName = KANBAN_CARD_TILE_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useRef } from 'react';\n\nimport type { Obj } from '@dxos/echo';\nimport { Board, type MosaicTileProps, useBoard } from '@dxos/react-ui-mosaic';\n\nimport { useKanbanItemEventHandler } from '../../hooks';\nimport { type ColumnStructure, UNCATEGORIZED_VALUE } from '../../types';\n\nimport { useKanbanBoard } from './KanbanBoard';\n\nconst KANBAN_COLUMN_NAME = 'KanbanBoard.Column';\n\nexport type KanbanColumnProps = Pick<MosaicTileProps<ColumnStructure>, 'location' | 'data' | 'debug'>;\n\n/**\n * Mosaic Tile for Kanban column.\n */\nexport const KanbanColumn = forwardRef<HTMLDivElement, KanbanColumnProps>(\n ({ data: column, location, debug }, forwardedRef) => {\n const { model } = useBoard<ColumnStructure, Obj.Unknown>(KANBAN_COLUMN_NAME);\n const { columnFieldPath, change, onCardAdd, getPivotAttributes, itemTile } = useKanbanBoard(KANBAN_COLUMN_NAME);\n\n const { title } = getPivotAttributes(column.columnValue);\n const uncategorized = column.columnValue === UNCATEGORIZED_VALUE;\n const dragHandleRef = useRef<HTMLButtonElement | null>(null);\n\n const eventHandler = useKanbanItemEventHandler({\n column,\n columnFieldPath,\n model,\n change,\n });\n\n return (\n <Board.Column.Root\n data={column}\n location={location}\n classNames='grid grid-rows-[var(--dx-rail-action)_1fr_var(--dx-rail-action)]'\n debug={debug}\n dragHandleRef={dragHandleRef}\n ref={forwardedRef}\n >\n {uncategorized ? (\n <div className='border-b border-separator p-2' data-testid='board-column-header'>\n <span className='font-medium'>{title}</span>\n </div>\n ) : (\n <Board.Column.Header label={title} dragHandleRef={dragHandleRef as React.RefObject<HTMLButtonElement>} />\n )}\n <Board.Column.Body\n data={column}\n eventHandler={eventHandler}\n Tile={itemTile as React.FC<MosaicTileProps<Obj.Unknown>>}\n />\n {onCardAdd && (\n <Board.Column.Footer\n onAdd={() => onCardAdd(column.columnValue === UNCATEGORIZED_VALUE ? undefined : column.columnValue)}\n />\n )}\n </Board.Column.Root>\n );\n },\n);\n\nKanbanColumn.displayName = KANBAN_COLUMN_NAME;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { KanbanContainer } from './KanbanContainer';\n\nexport default KanbanContainer;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["RegistryContext", "React", "useCallback", "useContext", "useMemo", "useCapabilities", "useOperationInvoker", "AppCapabilities", "Filter", "Obj", "Type", "AtomQuery", "useObject", "useSchema", "Panel", "getTypenameFromQuery", "RegistryContext", "createContext", "React", "useCallback", "useContext", "useMemo", "Obj", "useTranslation", "Board", "useBoard", "React", "forwardRef", "useCallback", "useMemo", "useState", "Surface", "useObjectMenuItems", "useObjectNavigate", "Obj", "Card", "Toolbar", "useTranslation", "Menu", "createMenuAction", "Focus", "Mosaic", "useBoard", "KANBAN_CARD_TILE_NAME", "KanbanCard", "forwardRef", "data", "location", "debug", "forwardedRef", "t", "useTranslation", "meta", "id", "model", "useBoard", "projection", "onCardRemove", "useKanbanBoard", "dragHandle", "setDragHandle", "useState", "dragHandleRef", "useCallback", "el", "objectMenuItems", "useObjectMenuItems", "handleNavigate", "useObjectNavigate", "menuItems", "useMemo", "createMenuAction", "label", "icon", "Mosaic", "Tile", "asChild", "getItemId", "Focus", "Group", "Menu", "Root", "Card", "ref", "data-testid", "Toolbar", "DragHandle", "Title", "onClick", "Obj", "getLabel", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "items", "Surface", "role", "limit", "subject", "displayName", "React", "forwardRef", "useRef", "Board", "useBoard", "KANBAN_COLUMN_NAME", "KanbanColumn", "forwardRef", "data", "column", "location", "debug", "forwardedRef", "model", "useBoard", "columnFieldPath", "change", "onCardAdd", "getPivotAttributes", "itemTile", "useKanbanBoard", "title", "columnValue", "uncategorized", "UNCATEGORIZED_VALUE", "dragHandleRef", "useRef", "eventHandler", "useKanbanItemEventHandler", "React", "Board", "Column", "Root", "classNames", "ref", "div", "className", "data-testid", "span", "Header", "label", "Body", "Tile", "Footer", "onAdd", "undefined", "displayName", "KANBAN_BOARD_NAME", "KanbanBoardContext", "useKanbanBoard", "createContext", "kanbanId", "projection", "undefined", "columnFieldPath", "change", "kanban", "setItemField", "pivotFieldId", "getPivotAttributes", "id", "UNCATEGORIZED_VALUE", "UNCATEGORIZED_ATTRIBUTES", "title", "color", "itemTile", "KANBAN_BOARD_ROOT", "KanbanBoardRoot", "children", "KanbanCard", "items", "onCardAdd", "onCardRemove", "props", "registry", "useContext", "RegistryContext", "t", "useTranslation", "meta", "model", "useKanbanBoardModel", "columns", "getColumns", "view", "target", "useMemo", "tryGetFieldProjection", "property", "useCallback", "columnValue", "options", "option", "find", "length", "React", "div", "className", "Obj", "getDXN", "toString", "Board", "Root", "displayName", "KANBAN_BOARD_CONTENT", "KanbanBoardContent", "useBoard", "columnEventHandler", "useKanbanColumnEventHandler", "Content", "eventHandler", "Tile", "KanbanColumn", "KanbanBoard", "Column", "Card", "KanbanContainer", "role", "subject", "object", "registry", "useContext", "RegistryContext", "schemas", "useCapabilities", "AppCapabilities", "Schema", "db", "Obj", "getDatabase", "invokePromise", "useOperationInvoker", "view", "useObject", "typename", "query", "getTypenameFromQuery", "ast", "undefined", "schemaFromDb", "useSchema", "cardSchema", "useMemo", "flat", "find", "schema", "Type", "getTypename", "items", "AtomQuery", "make", "Filter", "type", "nothing", "projection", "useProjectionModel", "change", "useEchoChangeCallback", "pivotFieldId", "columnFieldPath", "tryGetFieldProjection", "props", "property", "handleCardAdd", "useCallback", "columnValue", "card", "add", "id", "handleCardRemove", "KanbanOperation", "DeleteCard", "React", "Panel", "Root", "Content", "asChild", "KanbanBoard", "kanban", "onCardAdd", "onCardRemove", "KanbanContainer"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/KanbanViewEditor/KanbanViewEditor.tsx", "../../../src/containers/KanbanViewEditor/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Format } from '@dxos/echo/internal';\nimport { useObject, useSchema } from '@dxos/react-client/echo';\nimport { Form, type FormFieldMap, SelectField } from '@dxos/react-ui-form';\nimport { getTypenameFromQuery } from '@dxos/schema';\n\nimport { useProjectionModel } from '../../hooks';\nimport { type Kanban, SettingsSchema } from '../../types';\n\nexport type KanbanViewEditorProps = SurfaceComponentProps<Kanban.Kanban>;\n\nexport const KanbanViewEditor = ({ subject: object }: KanbanViewEditorProps) => {\n const registry = useContext(RegistryContext);\n const db = Obj.getDatabase(object);\n const [view, updateView] = useObject(object.view);\n const currentTypename = view?.query ? getTypenameFromQuery(view.query.ast) : undefined;\n const schema = useSchema(db, currentTypename);\n const projection = useProjectionModel(schema, object, registry);\n\n const fieldProjections = projection?.getFieldProjections() ?? [];\n const selectFields = useMemo(\n () =>\n fieldProjections\n .filter((field) => field.props.format === Format.TypeFormat.SingleSelect)\n .map(({ field }) => ({ value: field.id, label: field.path })),\n [fieldProjections],\n );\n\n const handleValuesChanged = useCallback(\n (values: Partial<{ columnFieldId: string }>) => {\n if (values.columnFieldId != null) {\n updateView((view) => {\n view.projection.pivotFieldId = values.columnFieldId;\n });\n }\n },\n [updateView],\n );\n\n const initialValues = useMemo(\n () => ({ columnFieldId: view?.projection.pivotFieldId }),\n [view?.projection.pivotFieldId],\n );\n\n const fieldMap: FormFieldMap = useMemo(\n () => ({ columnFieldId: (props) => <SelectField {...props} options={selectFields} /> }),\n [selectFields],\n );\n\n return (\n <Form.Root schema={SettingsSchema} values={initialValues} fieldMap={fieldMap} onValuesChanged={handleValuesChanged}>\n <Form.FieldSet />\n </Form.Root>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { KanbanViewEditor } from './KanbanViewEditor';\n\nexport default KanbanViewEditor;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;AAIA,SAASA,uBAAuB;AAChC,OAAOC,SAASC,aAAaC,YAAYC,eAAe;AAGxD,SAASC,WAAW;AACpB,SAASC,cAAc;AACvB,SAASC,WAAWC,iBAAiB;AACrC,SAASC,MAAyBC,mBAAmB;AACrD,SAASC,4BAA4B;AAO9B,IAAMC,mBAAmB,CAAC,EAAEC,SAASC,OAAM,MAAyB;AACzE,QAAMC,WAAWC,WAAWC,eAAAA;AAC5B,QAAMC,KAAKC,IAAIC,YAAYN,MAAAA;AAC3B,QAAM,CAACO,MAAMC,UAAAA,IAAcC,UAAUT,OAAOO,IAAI;AAChD,QAAMG,kBAAkBH,MAAMI,QAAQC,qBAAqBL,KAAKI,MAAME,GAAG,IAAIC;AAC7E,QAAMC,SAASC,UAAUZ,IAAIM,eAAAA;AAC7B,QAAMO,aAAaC,mBAAmBH,QAAQf,QAAQC,QAAAA;AAEtD,QAAMkB,mBAAmBF,YAAYG,oBAAAA,KAAyB,CAAA;AAC9D,QAAMC,eAAeC,QACnB,MACEH,iBACGI,OAAO,CAACC,UAAUA,MAAMC,MAAMC,WAAWC,OAAOC,WAAWC,YAAY,EACvEC,IAAI,CAAC,EAAEN,MAAK,OAAQ;IAAEO,OAAOP,MAAMQ;IAAIC,OAAOT,MAAMU;EAAK,EAAA,GAC9D;IAACf;GAAiB;AAGpB,QAAMgB,sBAAsBC,YAC1B,CAACC,WAAAA;AACC,QAAIA,OAAOC,iBAAiB,MAAM;AAChC9B,iBAAW,CAACD,UAAAA;AACVA,QAAAA,MAAKU,WAAWsB,eAAeF,OAAOC;MACxC,CAAA;IACF;EACF,GACA;IAAC9B;GAAW;AAGd,QAAMgC,gBAAgBlB,QACpB,OAAO;IAAEgB,eAAe/B,MAAMU,WAAWsB;EAAa,IACtD;IAAChC,MAAMU,WAAWsB;GAAa;AAGjC,QAAME,WAAyBnB,QAC7B,OAAO;IAAEgB,eAAe,CAACb,UAAU,sBAAA,cAACiB,aAAAA;MAAa,GAAGjB;MAAOkB,SAAStB;;EAAiB,IACrF;IAACA;GAAa;AAGhB,SACE,sBAAA,cAACuB,KAAKC,MAAI;IAAC9B,QAAQ+B;IAAgBT,QAAQG;IAAeC;IAAoBM,iBAAiBZ;KAC7F,sBAAA,cAACS,KAAKI,UAAQ,IAAA,CAAA;AAGpB;;;ACxDA,IAAA,2BAAeC;",
|
|
6
|
-
"names": ["RegistryContext", "React", "useCallback", "useContext", "useMemo", "Obj", "Format", "useObject", "useSchema", "Form", "SelectField", "getTypenameFromQuery", "KanbanViewEditor", "subject", "object", "registry", "useContext", "RegistryContext", "db", "Obj", "getDatabase", "view", "updateView", "useObject", "currentTypename", "query", "getTypenameFromQuery", "ast", "undefined", "schema", "useSchema", "projection", "useProjectionModel", "fieldProjections", "getFieldProjections", "selectFields", "useMemo", "filter", "field", "props", "format", "Format", "TypeFormat", "SingleSelect", "map", "value", "id", "label", "path", "handleValuesChanged", "useCallback", "values", "columnFieldId", "pivotFieldId", "initialValues", "fieldMap", "SelectField", "options", "Form", "Root", "SettingsSchema", "onValuesChanged", "FieldSet", "KanbanViewEditor"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/blueprint-definition/blueprint-definition.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\n\nimport { KanbanBlueprint } from '../../blueprints';\n\nconst blueprintDefinition = Capability.makeModule<\n [],\n Capability.Capability<typeof AppCapabilities.BlueprintDefinition>[]\n>(() => Effect.succeed([Capability.contributes(AppCapabilities.BlueprintDefinition, KanbanBlueprint)]));\n\nexport default blueprintDefinition;\n"],
|
|
5
|
-
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAIhC,IAAMC,sBAAsBC,WAAWC,WAGrC,MAAaC,eAAQ;EAACF,WAAWG,YAAYC,gBAAgBC,qBAAqBC,wBAAAA;CAAiB,CAAA;AAErG,IAAA,+BAAeP;",
|
|
6
|
-
"names": ["Effect", "Capability", "AppCapabilities", "blueprintDefinition", "Capability", "makeModule", "succeed", "contributes", "AppCapabilities", "BlueprintDefinition", "KanbanBlueprint"]
|
|
7
|
-
}
|