@dxos/plugin-kanban 0.8.1 → 0.8.2-main.10c050d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/lib/browser/{artifact-definition-SVNHDJQT.mjs → artifact-definition-7AVKC5KJ.mjs} +24 -23
  2. package/dist/lib/browser/artifact-definition-7AVKC5KJ.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-K5BYEZ4Z.mjs → chunk-NJ6WHYLY.mjs} +25 -40
  4. package/dist/lib/browser/chunk-NJ6WHYLY.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +4 -4
  6. package/dist/lib/browser/intent-resolver-2R6I36UA.mjs +297 -0
  7. package/dist/lib/browser/intent-resolver-2R6I36UA.mjs.map +7 -0
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/react-surface-W43CBHJ2.mjs +328 -0
  10. package/dist/lib/browser/react-surface-W43CBHJ2.mjs.map +7 -0
  11. package/dist/lib/browser/types.mjs +1 -3
  12. package/dist/lib/node/{artifact-definition-M2XAYUI2.cjs → artifact-definition-GAKXWPS3.cjs} +32 -31
  13. package/dist/lib/node/artifact-definition-GAKXWPS3.cjs.map +7 -0
  14. package/dist/lib/node/{chunk-3EUR6ZR2.cjs → chunk-3BKBOGOH.cjs} +27 -43
  15. package/dist/lib/node/chunk-3BKBOGOH.cjs.map +7 -0
  16. package/dist/lib/node/index.cjs +16 -16
  17. package/dist/lib/node/intent-resolver-3WEAK7UE.cjs +308 -0
  18. package/dist/lib/node/intent-resolver-3WEAK7UE.cjs.map +7 -0
  19. package/dist/lib/node/meta.json +1 -1
  20. package/dist/lib/node/react-surface-YEBNJKHD.cjs +344 -0
  21. package/dist/lib/node/react-surface-YEBNJKHD.cjs.map +7 -0
  22. package/dist/lib/node/types.cjs +6 -8
  23. package/dist/lib/node/types.cjs.map +2 -2
  24. package/dist/lib/node-esm/{artifact-definition-HQ5I2OO5.mjs → artifact-definition-RH5KY7FP.mjs} +24 -23
  25. package/dist/lib/node-esm/artifact-definition-RH5KY7FP.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-2N7CO3DI.mjs → chunk-4J76H6FE.mjs} +25 -40
  27. package/dist/lib/node-esm/chunk-4J76H6FE.mjs.map +7 -0
  28. package/dist/lib/node-esm/index.mjs +4 -4
  29. package/dist/lib/node-esm/intent-resolver-XHHFK6V7.mjs +298 -0
  30. package/dist/lib/node-esm/intent-resolver-XHHFK6V7.mjs.map +7 -0
  31. package/dist/lib/node-esm/meta.json +1 -1
  32. package/dist/lib/node-esm/react-surface-Q73OORPI.mjs +329 -0
  33. package/dist/lib/node-esm/react-surface-Q73OORPI.mjs.map +7 -0
  34. package/dist/lib/node-esm/types.mjs +1 -3
  35. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  36. package/dist/types/src/capabilities/index.d.ts +1 -1
  37. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  38. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  39. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  40. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  41. package/dist/types/src/components/KanbanContainer.d.ts.map +1 -1
  42. package/dist/types/src/components/KanbanContainer.stories.d.ts +10 -0
  43. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +1 -0
  44. package/dist/types/src/components/KanbanViewEditor.d.ts.map +1 -1
  45. package/dist/types/src/meta.d.ts.map +1 -1
  46. package/dist/types/src/testing/index.d.ts +3 -0
  47. package/dist/types/src/testing/index.d.ts.map +1 -0
  48. package/dist/types/src/testing/initialize-kanban.d.ts +17 -0
  49. package/dist/types/src/testing/initialize-kanban.d.ts.map +1 -0
  50. package/dist/types/src/testing/kanban-manager.d.ts +7 -0
  51. package/dist/types/src/testing/kanban-manager.d.ts.map +1 -0
  52. package/dist/types/src/testing/playwright/smoke.spec.d.ts +2 -0
  53. package/dist/types/src/testing/playwright/smoke.spec.d.ts.map +1 -0
  54. package/dist/types/src/translations.d.ts +2 -28
  55. package/dist/types/src/translations.d.ts.map +1 -1
  56. package/dist/types/src/types.d.ts +34 -50
  57. package/dist/types/src/types.d.ts.map +1 -1
  58. package/dist/types/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +33 -26
  60. package/src/capabilities/artifact-definition.ts +15 -14
  61. package/src/capabilities/intent-resolver.ts +10 -6
  62. package/src/capabilities/react-surface.tsx +46 -12
  63. package/src/components/KanbanContainer.stories.tsx +191 -0
  64. package/src/components/KanbanContainer.tsx +24 -11
  65. package/src/components/KanbanViewEditor.tsx +12 -8
  66. package/src/meta.ts +1 -2
  67. package/src/testing/index.ts +6 -0
  68. package/src/testing/initialize-kanban.ts +139 -0
  69. package/src/testing/kanban-manager.ts +13 -0
  70. package/src/testing/playwright/playwright.config.cts +18 -0
  71. package/src/testing/playwright/smoke.spec.ts +7 -0
  72. package/src/types.ts +26 -43
  73. package/dist/lib/browser/artifact-definition-SVNHDJQT.mjs.map +0 -7
  74. package/dist/lib/browser/chunk-K5BYEZ4Z.mjs.map +0 -7
  75. package/dist/lib/browser/intent-resolver-XCDQ5N3Q.mjs +0 -132
  76. package/dist/lib/browser/intent-resolver-XCDQ5N3Q.mjs.map +0 -7
  77. package/dist/lib/browser/react-surface-5DLU7L63.mjs +0 -281
  78. package/dist/lib/browser/react-surface-5DLU7L63.mjs.map +0 -7
  79. package/dist/lib/node/artifact-definition-M2XAYUI2.cjs.map +0 -7
  80. package/dist/lib/node/chunk-3EUR6ZR2.cjs.map +0 -7
  81. package/dist/lib/node/intent-resolver-P3PSZO7H.cjs +0 -146
  82. package/dist/lib/node/intent-resolver-P3PSZO7H.cjs.map +0 -7
  83. package/dist/lib/node/react-surface-OWAYP7VQ.cjs +0 -297
  84. package/dist/lib/node/react-surface-OWAYP7VQ.cjs.map +0 -7
  85. package/dist/lib/node-esm/artifact-definition-HQ5I2OO5.mjs.map +0 -7
  86. package/dist/lib/node-esm/chunk-2N7CO3DI.mjs.map +0 -7
  87. package/dist/lib/node-esm/intent-resolver-4G47V67J.mjs +0 -133
  88. package/dist/lib/node-esm/intent-resolver-4G47V67J.mjs.map +0 -7
  89. package/dist/lib/node-esm/react-surface-CLEITUUD.mjs +0 -282
  90. package/dist/lib/node-esm/react-surface-CLEITUUD.mjs.map +0 -7
@@ -0,0 +1,329 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ KANBAN_PLUGIN,
4
+ KanbanAction,
5
+ PivotColumnAnnotationId,
6
+ TypenameAnnotationId,
7
+ isKanban
8
+ } from "./chunk-4J76H6FE.mjs";
9
+
10
+ // packages/plugins/plugin-kanban/src/capabilities/react-surface.tsx
11
+ import React3, { useMemo as useMemo3 } from "react";
12
+ import { Capabilities, contributes, createSurface, useCapabilities } from "@dxos/app-framework";
13
+ import { getTypenameOrThrow as getTypenameOrThrow2, toJsonSchema as toJsonSchema2 } from "@dxos/echo-schema";
14
+ import { findAnnotation } from "@dxos/effect";
15
+ import { ClientCapabilities } from "@dxos/plugin-client";
16
+ import { useClient as useClient3 } from "@dxos/react-client";
17
+ import { getSpace as getSpace3, isSpace } from "@dxos/react-client/echo";
18
+ import { SelectInput as SelectInput2, useFormValues } from "@dxos/react-ui-form";
19
+
20
+ // packages/plugins/plugin-kanban/src/components/KanbanContainer.tsx
21
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
22
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
23
+ import { createIntent, useIntentDispatcher } from "@dxos/app-framework";
24
+ import { EchoSchema, getTypenameOrThrow, toJsonSchema } from "@dxos/echo-schema";
25
+ import { useGlobalFilteredObjects } from "@dxos/plugin-search";
26
+ import { useClient } from "@dxos/react-client";
27
+ import { Filter, useQuery, getSpace, live } from "@dxos/react-client/echo";
28
+ import { useKanbanModel, Kanban } from "@dxos/react-ui-kanban";
29
+ import { StackItem } from "@dxos/react-ui-stack";
30
+ import { ViewProjection } from "@dxos/schema";
31
+ var KanbanContainer = ({ kanban }) => {
32
+ var _effect = _useSignals();
33
+ try {
34
+ const client = useClient();
35
+ const [cardSchema, setCardSchema] = useState();
36
+ const [projection, setProjection] = useState();
37
+ const space = getSpace(kanban);
38
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
39
+ const jsonSchema = useMemo(() => cardSchema instanceof EchoSchema ? cardSchema.jsonSchema : cardSchema ? toJsonSchema(cardSchema) : void 0, [
40
+ cardSchema
41
+ ]);
42
+ useEffect(() => {
43
+ const typename = kanban.cardView?.target?.query?.typename;
44
+ const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => getTypenameOrThrow(schema) === typename);
45
+ if (staticSchema) {
46
+ setCardSchema(() => staticSchema);
47
+ }
48
+ if (!staticSchema && typename && space) {
49
+ const query = space.db.schemaRegistry.query({
50
+ typename
51
+ });
52
+ const unsubscribe = query.subscribe(() => {
53
+ const [schema] = query.results;
54
+ if (schema) {
55
+ setCardSchema(schema);
56
+ }
57
+ }, {
58
+ fire: true
59
+ });
60
+ return unsubscribe;
61
+ }
62
+ }, [
63
+ kanban.cardView?.target?.query,
64
+ space
65
+ ]);
66
+ useEffect(() => {
67
+ if (kanban.cardView?.target && jsonSchema) {
68
+ setProjection(new ViewProjection(jsonSchema, kanban.cardView.target));
69
+ }
70
+ }, [
71
+ kanban.cardView?.target,
72
+ JSON.stringify(jsonSchema)
73
+ ]);
74
+ const objects = useQuery(space, cardSchema ? Filter.type(cardSchema) : Filter.nothing());
75
+ const filteredObjects = useGlobalFilteredObjects(objects);
76
+ const model = useKanbanModel({
77
+ kanban,
78
+ schema: cardSchema,
79
+ projection,
80
+ items: filteredObjects
81
+ });
82
+ const handleAddCard = useCallback((columnValue) => {
83
+ const path = model?.columnFieldPath;
84
+ if (space && cardSchema && path) {
85
+ const card = live(cardSchema, {
86
+ [path]: columnValue
87
+ });
88
+ space.db.add(card);
89
+ return card.id;
90
+ }
91
+ }, [
92
+ space,
93
+ cardSchema,
94
+ model
95
+ ]);
96
+ const handleRemoveCard = useCallback((card) => {
97
+ void dispatch(createIntent(KanbanAction.DeleteCard, {
98
+ card
99
+ }));
100
+ }, [
101
+ dispatch
102
+ ]);
103
+ return /* @__PURE__ */ React.createElement(StackItem.Content, null, model && /* @__PURE__ */ React.createElement(Kanban, {
104
+ model,
105
+ onAddCard: handleAddCard,
106
+ onRemoveCard: handleRemoveCard
107
+ }));
108
+ } finally {
109
+ _effect.f();
110
+ }
111
+ };
112
+
113
+ // packages/plugins/plugin-kanban/src/components/KanbanViewEditor.tsx
114
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
115
+ import React2, { useCallback as useCallback2, useMemo as useMemo2 } from "react";
116
+ import { createIntent as createIntent2, useIntentDispatcher as useIntentDispatcher2 } from "@dxos/app-framework";
117
+ import { Type } from "@dxos/echo";
118
+ import { assertEchoSchema, FormatEnum, isMutable } from "@dxos/echo-schema";
119
+ import { invariant } from "@dxos/invariant";
120
+ import { useClient as useClient2 } from "@dxos/react-client";
121
+ import { Filter as Filter2, getSpace as getSpace2, useQuery as useQuery2, useSchema } from "@dxos/react-client/echo";
122
+ import { ViewEditor, Form, SelectInput } from "@dxos/react-ui-form";
123
+ import { KanbanSettingsSchema } from "@dxos/react-ui-kanban";
124
+ import { ViewType, ViewProjection as ViewProjection2 } from "@dxos/schema";
125
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-kanban/src/components/KanbanViewEditor.tsx";
126
+ var KanbanViewEditor = ({ kanban }) => {
127
+ var _effect = _useSignals2();
128
+ try {
129
+ const { dispatchPromise: dispatch } = useIntentDispatcher2();
130
+ const client = useClient2();
131
+ const space = getSpace2(kanban);
132
+ const currentTypename = useMemo2(() => kanban?.cardView?.target?.query?.typename, [
133
+ kanban?.cardView?.target?.query?.typename
134
+ ]);
135
+ const schema = useSchema(client, space, currentTypename);
136
+ const views = useQuery2(space, Filter2.type(ViewType));
137
+ const handleUpdateTypename = useCallback2((newTypename) => {
138
+ invariant(schema, void 0, {
139
+ F: __dxlog_file,
140
+ L: 34,
141
+ S: void 0,
142
+ A: [
143
+ "schema",
144
+ ""
145
+ ]
146
+ });
147
+ const matchingViews = views.filter((view) => view.query.typename === currentTypename);
148
+ for (const view of matchingViews) {
149
+ view.query.typename = newTypename;
150
+ }
151
+ assertEchoSchema(schema).updateTypename(newTypename);
152
+ }, [
153
+ views,
154
+ schema
155
+ ]);
156
+ const handleDelete = useCallback2((fieldId) => {
157
+ void dispatch?.(createIntent2(KanbanAction.DeleteCardField, {
158
+ kanban,
159
+ fieldId
160
+ }));
161
+ }, [
162
+ dispatch,
163
+ kanban
164
+ ]);
165
+ const projection = useMemo2(() => {
166
+ if (kanban?.cardView?.target && schema) {
167
+ const jsonSchema = Type.toJsonSchema(schema);
168
+ return new ViewProjection2(jsonSchema, kanban.cardView.target);
169
+ }
170
+ }, [
171
+ kanban?.cardView?.target,
172
+ schema,
173
+ JSON.stringify(schema ? Type.toJsonSchema(schema) : {})
174
+ ]);
175
+ const fieldProjections = projection?.getFieldProjections() || [];
176
+ const selectFields = fieldProjections.filter((field) => field.props.format === FormatEnum.SingleSelect).map(({ field }) => ({
177
+ value: field.id,
178
+ label: field.path
179
+ }));
180
+ const onSave = useCallback2((values) => {
181
+ kanban.columnFieldId = values.columnFieldId;
182
+ }, [
183
+ kanban
184
+ ]);
185
+ const initialValues = useMemo2(() => ({
186
+ columnFieldId: kanban.columnFieldId
187
+ }), [
188
+ kanban.columnFieldId
189
+ ]);
190
+ const custom = useMemo2(() => ({
191
+ columnFieldId: (props) => /* @__PURE__ */ React2.createElement(SelectInput, {
192
+ ...props,
193
+ options: selectFields
194
+ })
195
+ }), [
196
+ selectFields
197
+ ]);
198
+ if (!space || !schema || !kanban.cardView?.target) {
199
+ return null;
200
+ }
201
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("div", {
202
+ role: "none",
203
+ className: "p-2"
204
+ }, /* @__PURE__ */ React2.createElement(Form, {
205
+ schema: KanbanSettingsSchema,
206
+ values: initialValues,
207
+ onSave,
208
+ autoSave: true,
209
+ Custom: custom
210
+ })), /* @__PURE__ */ React2.createElement(ViewEditor, {
211
+ registry: space.db.schemaRegistry,
212
+ schema,
213
+ view: kanban.cardView.target,
214
+ onTypenameChanged: isMutable(schema) ? handleUpdateTypename : void 0,
215
+ onDelete: isMutable(schema) ? handleDelete : void 0
216
+ }));
217
+ } finally {
218
+ _effect.f();
219
+ }
220
+ };
221
+
222
+ // packages/plugins/plugin-kanban/src/capabilities/react-surface.tsx
223
+ var react_surface_default = () => contributes(Capabilities.ReactSurface, [
224
+ createSurface({
225
+ id: `${KANBAN_PLUGIN}/kanban`,
226
+ role: [
227
+ "article",
228
+ "section"
229
+ ],
230
+ filter: (data) => isKanban(data.subject),
231
+ component: ({ data, role }) => /* @__PURE__ */ React3.createElement(KanbanContainer, {
232
+ kanban: data.subject,
233
+ role
234
+ })
235
+ }),
236
+ createSurface({
237
+ id: `${KANBAN_PLUGIN}/object-settings`,
238
+ role: "object-settings",
239
+ filter: (data) => isKanban(data.subject),
240
+ component: ({ data }) => /* @__PURE__ */ React3.createElement(KanbanViewEditor, {
241
+ kanban: data.subject
242
+ })
243
+ }),
244
+ createSurface({
245
+ id: `${KANBAN_PLUGIN}/create-initial-schema-form`,
246
+ role: "form-input",
247
+ filter: (data) => {
248
+ if (data.prop !== "typename") {
249
+ return false;
250
+ }
251
+ const annotation = findAnnotation(data.schema.ast, TypenameAnnotationId);
252
+ return !!annotation;
253
+ },
254
+ component: ({ data: { target }, ...inputProps }) => {
255
+ const client = useClient3();
256
+ const props = inputProps;
257
+ const space = isSpace(target) ? target : getSpace3(target);
258
+ if (!space) {
259
+ return null;
260
+ }
261
+ const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);
262
+ const whitelistedTypenames = useMemo3(() => new Set(schemaWhitelists.flatMap((typeArray) => typeArray.map((type) => type.typename))), [
263
+ schemaWhitelists
264
+ ]);
265
+ const fixed = client.graph.schemaRegistry.schemas.filter((schema) => whitelistedTypenames.has(getTypenameOrThrow2(schema)));
266
+ const dynamic = space?.db.schemaRegistry.query().runSync();
267
+ const typenames = Array.from(/* @__PURE__ */ new Set([
268
+ ...fixed.map((schema) => getTypenameOrThrow2(schema)),
269
+ ...dynamic.map((schema) => schema.typename)
270
+ ])).sort();
271
+ return /* @__PURE__ */ React3.createElement(SelectInput2, {
272
+ ...props,
273
+ options: typenames.map((typename) => ({
274
+ value: typename
275
+ }))
276
+ });
277
+ }
278
+ }),
279
+ createSurface({
280
+ id: `${KANBAN_PLUGIN}/create-initial-schema-form-[pivot-column]`,
281
+ role: "form-input",
282
+ filter: (data) => {
283
+ const annotation = findAnnotation(data.schema.ast, PivotColumnAnnotationId);
284
+ return !!annotation;
285
+ },
286
+ component: ({ data: { target }, ...inputProps }) => {
287
+ const props = inputProps;
288
+ const space = isSpace(target) ? target : getSpace3(target);
289
+ if (!space) {
290
+ return null;
291
+ }
292
+ const { typename } = useFormValues();
293
+ const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);
294
+ const staticSchema = schemaWhitelists.flat().find((schema) => getTypenameOrThrow2(schema) === typename);
295
+ const [selectedSchema] = space?.db.schemaRegistry.query({
296
+ typename
297
+ }).runSync();
298
+ const singleSelectColumns = useMemo3(() => {
299
+ const properties = staticSchema ? toJsonSchema2(staticSchema).properties : selectedSchema?.jsonSchema?.properties;
300
+ if (!properties) {
301
+ return [];
302
+ }
303
+ const columns = Object.entries(properties).reduce((acc, [key, value]) => {
304
+ if (typeof value === "object" && value?.format === "single-select") {
305
+ acc.push(key);
306
+ }
307
+ return acc;
308
+ }, []);
309
+ return columns;
310
+ }, [
311
+ selectedSchema?.jsonSchema,
312
+ staticSchema
313
+ ]);
314
+ if (!typename) {
315
+ return null;
316
+ }
317
+ return /* @__PURE__ */ React3.createElement(SelectInput2, {
318
+ ...props,
319
+ options: singleSelectColumns.map((column) => ({
320
+ value: column
321
+ }))
322
+ });
323
+ }
324
+ })
325
+ ]);
326
+ export {
327
+ react_surface_default as default
328
+ };
329
+ //# sourceMappingURL=react-surface-Q73OORPI.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/KanbanContainer.tsx", "../../../src/components/KanbanViewEditor.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Schema } from 'effect';\nimport React, { useMemo } from 'react';\n\nimport { Capabilities, contributes, createSurface, useCapabilities } from '@dxos/app-framework';\nimport { getTypenameOrThrow, toJsonSchema } from '@dxos/echo-schema';\nimport { findAnnotation } from '@dxos/effect';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { type CollectionType } from '@dxos/plugin-space/types';\nimport { useClient } from '@dxos/react-client';\nimport { getSpace, isSpace, type Space } from '@dxos/react-client/echo';\nimport { type InputProps, SelectInput, useFormValues } from '@dxos/react-ui-form';\nimport { type KanbanType } from '@dxos/react-ui-kanban';\n\nimport { KanbanContainer, KanbanViewEditor } from '../components';\nimport { KANBAN_PLUGIN } from '../meta';\nimport { isKanban, TypenameAnnotationId, PivotColumnAnnotationId } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${KANBAN_PLUGIN}/kanban`,\n role: ['article', 'section'],\n filter: (data): data is { subject: KanbanType } => isKanban(data.subject),\n component: ({ data, role }) => <KanbanContainer kanban={data.subject} role={role} />,\n }),\n createSurface({\n id: `${KANBAN_PLUGIN}/object-settings`,\n role: 'object-settings',\n filter: (data): data is { subject: KanbanType } => isKanban(data.subject),\n component: ({ data }) => <KanbanViewEditor kanban={data.subject} />,\n }),\n createSurface({\n id: `${KANBAN_PLUGIN}/create-initial-schema-form`,\n role: 'form-input',\n filter: (\n data,\n ): data is { prop: string; schema: Schema.Schema<any>; target: Space | CollectionType | undefined } => {\n if (data.prop !== 'typename') {\n return false;\n }\n\n const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, TypenameAnnotationId);\n return !!annotation;\n },\n component: ({ data: { target }, ...inputProps }) => {\n const client = useClient();\n const props = inputProps as any as InputProps;\n const space = isSpace(target) ? target : getSpace(target);\n if (!space) {\n return null;\n }\n\n const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);\n const whitelistedTypenames = useMemo(\n () => new Set(schemaWhitelists.flatMap((typeArray) => typeArray.map((type) => type.typename))),\n [schemaWhitelists],\n );\n\n const fixed = client.graph.schemaRegistry.schemas.filter((schema) =>\n whitelistedTypenames.has(getTypenameOrThrow(schema)),\n );\n const dynamic = space?.db.schemaRegistry.query().runSync();\n const typenames = Array.from(\n new Set<string>([\n ...fixed.map((schema) => getTypenameOrThrow(schema)),\n ...dynamic.map((schema) => schema.typename),\n ]),\n ).sort();\n\n return <SelectInput {...props} options={typenames.map((typename) => ({ value: typename }))} />;\n },\n }),\n createSurface({\n id: `${KANBAN_PLUGIN}/create-initial-schema-form-[pivot-column]`,\n role: 'form-input',\n filter: (\n data,\n ): data is { prop: string; schema: Schema.Schema<any>; target: Space | CollectionType | undefined } => {\n const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, PivotColumnAnnotationId);\n return !!annotation;\n },\n component: ({ data: { target }, ...inputProps }) => {\n const props = inputProps as any as InputProps;\n const space = isSpace(target) ? target : getSpace(target);\n if (!space) {\n return null;\n }\n const { typename } = useFormValues();\n // TODO(wittjosiah): Unify this schema lookup.\n const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);\n const staticSchema = schemaWhitelists.flat().find((schema) => getTypenameOrThrow(schema) === typename);\n const [selectedSchema] = space?.db.schemaRegistry.query({ typename }).runSync();\n\n const singleSelectColumns = useMemo(() => {\n const properties = staticSchema\n ? toJsonSchema(staticSchema).properties\n : selectedSchema?.jsonSchema?.properties;\n if (!properties) {\n return [];\n }\n\n const columns = Object.entries(properties).reduce<string[]>((acc, [key, value]) => {\n if (typeof value === 'object' && value?.format === 'single-select') {\n acc.push(key);\n }\n return acc;\n }, []);\n\n return columns;\n }, [selectedSchema?.jsonSchema, staticSchema]);\n\n if (!typename) {\n return null;\n }\n\n return <SelectInput {...props} options={singleSelectColumns.map((column) => ({ value: column }))} />;\n },\n }),\n ]);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { EchoSchema, getTypenameOrThrow, toJsonSchema, type TypedObject } from '@dxos/echo-schema';\nimport { useGlobalFilteredObjects } from '@dxos/plugin-search';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, useQuery, getSpace, live } from '@dxos/react-client/echo';\nimport { type KanbanType, useKanbanModel, Kanban } from '@dxos/react-ui-kanban';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { ViewProjection } from '@dxos/schema';\n\nimport { KanbanAction } from '../types';\n\nexport const KanbanContainer = ({ kanban }: { kanban: KanbanType; role: string }) => {\n const client = useClient();\n const [cardSchema, setCardSchema] = useState<TypedObject<any, any>>();\n const [projection, setProjection] = useState<ViewProjection>();\n const space = getSpace(kanban);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const jsonSchema = useMemo(\n () =>\n cardSchema instanceof EchoSchema ? cardSchema.jsonSchema : cardSchema ? toJsonSchema(cardSchema) : undefined,\n [cardSchema],\n );\n\n useEffect(() => {\n const typename = kanban.cardView?.target?.query?.typename;\n const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => getTypenameOrThrow(schema) === typename);\n if (staticSchema) {\n setCardSchema(() => staticSchema as TypedObject<any, any>);\n }\n if (!staticSchema && typename && space) {\n const query = space.db.schemaRegistry.query({ typename });\n const unsubscribe = query.subscribe(\n () => {\n const [schema] = query.results;\n if (schema) {\n setCardSchema(schema);\n }\n },\n { fire: true },\n );\n return unsubscribe;\n }\n }, [kanban.cardView?.target?.query, space]);\n\n useEffect(() => {\n if (kanban.cardView?.target && jsonSchema) {\n setProjection(new ViewProjection(jsonSchema, kanban.cardView.target));\n }\n // TODO(ZaymonFC): Is there a better way to get notified about deep changes in the json schema?\n }, [kanban.cardView?.target, JSON.stringify(jsonSchema)]);\n\n const objects = useQuery(space, cardSchema ? Filter.type(cardSchema) : Filter.nothing());\n const filteredObjects = useGlobalFilteredObjects(objects);\n\n const model = useKanbanModel({\n kanban,\n schema: cardSchema,\n projection,\n items: filteredObjects,\n });\n\n const handleAddCard = useCallback(\n (columnValue: string | undefined) => {\n const path = model?.columnFieldPath;\n if (space && cardSchema && path) {\n const card = live(cardSchema, { [path]: columnValue });\n space.db.add(card);\n return card.id;\n }\n },\n [space, cardSchema, model],\n );\n\n const handleRemoveCard = useCallback(\n (card: { id: string }) => {\n void dispatch(createIntent(KanbanAction.DeleteCard, { card }));\n },\n [dispatch],\n );\n\n return (\n <StackItem.Content>\n {model && <Kanban model={model} onAddCard={handleAddCard} onRemoveCard={handleRemoveCard} />}\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { Type } from '@dxos/echo';\nimport { assertEchoSchema, FormatEnum, isMutable } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, getSpace, useQuery, useSchema } from '@dxos/react-client/echo';\nimport { ViewEditor, Form, SelectInput, type CustomInputMap } from '@dxos/react-ui-form';\nimport { type KanbanType, KanbanSettingsSchema } from '@dxos/react-ui-kanban';\nimport { ViewType, ViewProjection } from '@dxos/schema';\n\nimport { KanbanAction } from '../types';\n\ntype KanbanViewEditorProps = { kanban: KanbanType };\n\nexport const KanbanViewEditor = ({ kanban }: KanbanViewEditorProps) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const client = useClient();\n const space = getSpace(kanban);\n const currentTypename = useMemo(\n () => kanban?.cardView?.target?.query?.typename,\n [kanban?.cardView?.target?.query?.typename],\n );\n const schema = useSchema(client, space, currentTypename);\n const views = useQuery(space, Filter.type(ViewType));\n\n const handleUpdateTypename = useCallback(\n (newTypename: string) => {\n invariant(schema);\n const matchingViews = views.filter((view) => view.query.typename === currentTypename);\n for (const view of matchingViews) {\n view.query.typename = newTypename;\n }\n\n assertEchoSchema(schema).updateTypename(newTypename);\n },\n [views, schema],\n );\n\n const handleDelete = useCallback(\n (fieldId: string) => {\n void dispatch?.(createIntent(KanbanAction.DeleteCardField, { kanban, fieldId }));\n },\n [dispatch, kanban],\n );\n\n const projection = useMemo(() => {\n if (kanban?.cardView?.target && schema) {\n const jsonSchema = Type.toJsonSchema(schema);\n return new ViewProjection(jsonSchema, kanban.cardView.target);\n }\n }, [kanban?.cardView?.target, schema, JSON.stringify(schema ? Type.toJsonSchema(schema) : {})]);\n\n const fieldProjections = projection?.getFieldProjections() || [];\n const selectFields = fieldProjections\n .filter((field) => field.props.format === FormatEnum.SingleSelect)\n .map(({ field }) => ({ value: field.id, label: field.path }));\n\n const onSave = useCallback(\n (values: Partial<{ columnFieldId: string }>) => {\n kanban.columnFieldId = values.columnFieldId;\n },\n [kanban],\n );\n\n const initialValues = useMemo(() => ({ columnFieldId: kanban.columnFieldId }), [kanban.columnFieldId]);\n const custom: CustomInputMap = useMemo(\n () => ({ columnFieldId: (props) => <SelectInput {...props} options={selectFields} /> }),\n [selectFields],\n );\n\n if (!space || !schema || !kanban.cardView?.target) {\n return null;\n }\n\n return (\n <>\n <div role='none' className='p-2'>\n <Form schema={KanbanSettingsSchema} values={initialValues} onSave={onSave} autoSave Custom={custom} />\n </div>\n <ViewEditor\n registry={space.db.schemaRegistry}\n schema={schema}\n view={kanban.cardView.target}\n onTypenameChanged={isMutable(schema) ? handleUpdateTypename : undefined}\n onDelete={isMutable(schema) ? handleDelete : undefined}\n />\n </>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useMemo", "Capabilities", "contributes", "createSurface", "useCapabilities", "getTypenameOrThrow", "toJsonSchema", "findAnnotation", "ClientCapabilities", "useClient", "getSpace", "isSpace", "SelectInput", "useFormValues", "React", "useCallback", "useEffect", "useMemo", "useState", "createIntent", "useIntentDispatcher", "EchoSchema", "getTypenameOrThrow", "toJsonSchema", "useGlobalFilteredObjects", "useClient", "Filter", "useQuery", "getSpace", "live", "useKanbanModel", "Kanban", "StackItem", "ViewProjection", "KanbanContainer", "kanban", "client", "useClient", "cardSchema", "setCardSchema", "useState", "projection", "setProjection", "space", "getSpace", "dispatchPromise", "dispatch", "useIntentDispatcher", "jsonSchema", "useMemo", "EchoSchema", "toJsonSchema", "undefined", "useEffect", "typename", "cardView", "target", "query", "staticSchema", "graph", "schemaRegistry", "schemas", "find", "schema", "getTypenameOrThrow", "db", "unsubscribe", "subscribe", "results", "fire", "ViewProjection", "JSON", "stringify", "objects", "useQuery", "Filter", "type", "nothing", "filteredObjects", "useGlobalFilteredObjects", "model", "useKanbanModel", "items", "handleAddCard", "useCallback", "columnValue", "path", "columnFieldPath", "card", "live", "add", "id", "handleRemoveCard", "createIntent", "KanbanAction", "DeleteCard", "StackItem", "Content", "Kanban", "onAddCard", "onRemoveCard", "React", "useCallback", "useMemo", "createIntent", "useIntentDispatcher", "Type", "assertEchoSchema", "FormatEnum", "isMutable", "invariant", "useClient", "Filter", "getSpace", "useQuery", "useSchema", "ViewEditor", "Form", "SelectInput", "KanbanSettingsSchema", "ViewType", "ViewProjection", "KanbanViewEditor", "kanban", "dispatchPromise", "dispatch", "useIntentDispatcher", "client", "useClient", "space", "getSpace", "currentTypename", "useMemo", "cardView", "target", "query", "typename", "schema", "useSchema", "views", "useQuery", "Filter", "type", "ViewType", "handleUpdateTypename", "useCallback", "newTypename", "invariant", "matchingViews", "filter", "view", "assertEchoSchema", "updateTypename", "handleDelete", "fieldId", "createIntent", "KanbanAction", "DeleteCardField", "projection", "jsonSchema", "Type", "toJsonSchema", "ViewProjection", "JSON", "stringify", "fieldProjections", "getFieldProjections", "selectFields", "field", "props", "format", "FormatEnum", "SingleSelect", "map", "value", "id", "label", "path", "onSave", "values", "columnFieldId", "initialValues", "custom", "React", "SelectInput", "options", "div", "role", "className", "Form", "KanbanSettingsSchema", "autoSave", "Custom", "ViewEditor", "registry", "db", "schemaRegistry", "onTypenameChanged", "isMutable", "undefined", "onDelete", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "KANBAN_PLUGIN", "role", "filter", "data", "isKanban", "subject", "component", "React", "KanbanContainer", "kanban", "KanbanViewEditor", "prop", "annotation", "findAnnotation", "schema", "ast", "TypenameAnnotationId", "target", "inputProps", "client", "useClient", "props", "space", "isSpace", "getSpace", "schemaWhitelists", "useCapabilities", "ClientCapabilities", "SchemaWhiteList", "whitelistedTypenames", "useMemo", "Set", "flatMap", "typeArray", "map", "type", "typename", "fixed", "graph", "schemaRegistry", "schemas", "has", "getTypenameOrThrow", "dynamic", "db", "query", "runSync", "typenames", "Array", "from", "sort", "SelectInput", "options", "value", "PivotColumnAnnotationId", "useFormValues", "staticSchema", "flat", "find", "selectedSchema", "singleSelectColumns", "properties", "toJsonSchema", "jsonSchema", "columns", "Object", "entries", "reduce", "acc", "key", "format", "push", "column"]
7
+ }
@@ -4,15 +4,13 @@ import {
4
4
  KanbanAction,
5
5
  PivotColumnAnnotationId,
6
6
  TypenameAnnotationId,
7
- createKanban,
8
7
  isKanban
9
- } from "./chunk-2N7CO3DI.mjs";
8
+ } from "./chunk-4J76H6FE.mjs";
10
9
  export {
11
10
  CreateKanbanSchema,
12
11
  KanbanAction,
13
12
  PivotColumnAnnotationId,
14
13
  TypenameAnnotationId,
15
- createKanban,
16
14
  isKanban
17
15
  };
18
16
  //# sourceMappingURL=types.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-definition.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/artifact-definition.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkD,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAMnH,OAAO,EAA4B,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAU/E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,QAAQ,CAAC,EAAE,uBAAuB,CAAC;KACpC;CACF;;AAED,wBAyGE"}
1
+ {"version":3,"file":"artifact-definition.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/artifact-definition.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkD,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAMnH,OAAO,EAA4B,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAU/E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,QAAQ,CAAC,EAAE,uBAAuB,CAAC;KACpC;CACF;;AAED,wBAyGE"}
@@ -1,4 +1,4 @@
1
1
  export declare const ArtifactDefinition: (props?: unknown) => Promise<() => Promise<import("@dxos/app-framework").Capability<import("@dxos/artifact").ArtifactDefinition> | import("@dxos/app-framework").AnyCapability[]>>;
2
- export declare const IntentResolver: (props?: unknown) => Promise<() => Promise<import("@dxos/app-framework").Capability<import("@dxos/app-framework").Capabilities.IntentResolver> | import("@dxos/app-framework").AnyCapability[]>>;
2
+ export declare const IntentResolver: (props?: import("@dxos/app-framework").PluginContext | undefined) => Promise<() => Promise<import("@dxos/app-framework").Capability<import("@dxos/app-framework").Capabilities.IntentResolver> | import("@dxos/app-framework").AnyCapability[]>>;
3
3
  export declare const ReactSurface: (props?: unknown) => Promise<() => Promise<import("@dxos/app-framework").Capability<import("@dxos/app-framework").Capabilities.ReactSurface> | import("@dxos/app-framework").AnyCapability[]>>;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,oLAA8C,CAAC;AAC9E,eAAO,MAAM,cAAc,kMAA0C,CAAC;AACtE,eAAO,MAAM,YAAY,gMAAwC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,oLAA8C,CAAC;AAC9E,eAAO,MAAM,cAAc,kPAA0C,CAAC;AACtE,eAAO,MAAM,YAAY,gMAAwC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Capabilities } from '@dxos/app-framework';
2
- declare const _default: () => import("@dxos/app-framework").Capability<Capabilities.IntentResolver>;
1
+ import { Capabilities, type PluginContext } from '@dxos/app-framework';
2
+ declare const _default: (context: PluginContext) => import("@dxos/app-framework").Capability<Capabilities.IntentResolver>;
3
3
  export default _default;
4
4
  //# sourceMappingURL=intent-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-resolver.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/intent-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,YAAY,EAAkB,MAAM,qBAAqB,CAAC;;AAQhF,wBAsDK"}
1
+ {"version":3,"file":"intent-resolver.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/intent-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,YAAY,EAAkB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;yBAUpF,SAAS,aAAa;AAAtC,wBAwDK"}
@@ -1 +1 @@
1
- {"version":3,"file":"react-surface.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/react-surface.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAA8B,MAAM,qBAAqB,CAAC;;AAY/E,wBAsEK"}
1
+ {"version":3,"file":"react-surface.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/react-surface.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAA+C,MAAM,qBAAqB,CAAC;;AAchG,wBAqGK"}
@@ -1 +1 @@
1
- {"version":3,"file":"KanbanContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/KanbanContainer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAMhE,OAAO,EAAE,KAAK,UAAU,EAA0B,MAAM,uBAAuB,CAAC;AAMhF,eAAO,MAAM,eAAe,eAAgB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,sBA+D/E,CAAC"}
1
+ {"version":3,"file":"KanbanContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/KanbanContainer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAOzE,OAAO,EAAE,KAAK,UAAU,EAA0B,MAAM,uBAAuB,CAAC;AAMhF,eAAO,MAAM,eAAe,GAAI,YAAY;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,sBA2E/E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import '@dxos-theme';
2
+ import { type StoryObj, type Meta } from '@storybook/react';
3
+ type StoryProps = {
4
+ rows?: number;
5
+ };
6
+ declare const meta: Meta<StoryProps>;
7
+ export default meta;
8
+ type Story = StoryObj<StoryProps>;
9
+ export declare const Default: Story;
10
+ //# sourceMappingURL=KanbanContainer.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanContainer.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/KanbanContainer.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAmI5D,KAAK,UAAU,GAAG;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAMF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAAU,CAwC1B,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAElC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"KanbanViewEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/KanbanViewEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAQpD,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AAK9E,KAAK,qBAAqB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAEpD,eAAO,MAAM,gBAAgB,eAAgB,qBAAqB,6BAuEjE,CAAC"}
1
+ {"version":3,"file":"KanbanViewEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/KanbanViewEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA+B,MAAM,OAAO,CAAC;AASpD,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AAK9E,KAAK,qBAAqB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAEpD,eAAO,MAAM,gBAAgB,GAAI,YAAY,qBAAqB,6BA0EjE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,eAAO,MAAM,IAAI,EAAE,UASlB,CAAC"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,eAAO,MAAM,IAAI,EAAE,UAQlB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './kanban-manager';
2
+ export * from './initialize-kanban';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type EchoSchema } from '@dxos/echo-schema';
2
+ import { type Client } from '@dxos/react-client';
3
+ import { type Space } from '@dxos/react-client/echo';
4
+ import { KanbanType } from '@dxos/react-ui-kanban';
5
+ type InitializeKanbanProps = {
6
+ client: Client;
7
+ space: Space;
8
+ name?: string;
9
+ typename?: string;
10
+ initialPivotColumn?: string;
11
+ };
12
+ export declare const initializeKanban: ({ client, space, name, typename, initialPivotColumn, }: InitializeKanbanProps) => Promise<{
13
+ kanban: KanbanType;
14
+ schema?: EchoSchema;
15
+ }>;
16
+ export {};
17
+ //# sourceMappingURL=initialize-kanban.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialize-kanban.d.ts","sourceRoot":"","sources":["../../../../src/testing/initialize-kanban.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,UAAU,EAGhB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,KAAK,KAAK,EAAiB,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMnD,KAAK,qBAAqB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAyBF,eAAO,MAAM,gBAAgB,GAAU,wDAMpC,qBAAqB,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,CA6E7E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Locator } from '@playwright/test';
2
+ export declare class KanbanManager {
3
+ readonly locator: Locator;
4
+ private readonly _page;
5
+ constructor(locator: Locator);
6
+ }
7
+ //# sourceMappingURL=kanban-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanban-manager.d.ts","sourceRoot":"","sources":["../../../../src/testing/kanban-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,kBAAkB,CAAC;AAEtD,qBAAa,aAAa;IAGZ,QAAQ,CAAC,OAAO,EAAE,OAAO;IAFrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;gBAER,OAAO,EAAE,OAAO;CAGtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=smoke.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.spec.d.ts","sourceRoot":"","sources":["../../../../../src/testing/playwright/smoke.spec.ts"],"names":[],"mappings":""}
@@ -1,35 +1,9 @@
1
+ import { KanbanType } from '@dxos/react-ui-kanban';
1
2
  declare const _default: {
2
3
  'en-US': {
3
- [x: string]: {
4
+ [KanbanType.typename]: {
4
5
  'typename label': string;
5
6
  'object name placeholder': string;
6
- 'plugin name'?: undefined;
7
- 'kanban title label'?: undefined;
8
- 'column title label'?: undefined;
9
- 'column title placeholder'?: undefined;
10
- 'item title label'?: undefined;
11
- 'item title placeholder'?: undefined;
12
- 'add column label'?: undefined;
13
- 'add item label'?: undefined;
14
- 'delete column label'?: undefined;
15
- 'delete item label'?: undefined;
16
- 'card field deleted label'?: undefined;
17
- 'card deleted label'?: undefined;
18
- } | {
19
- 'plugin name': string;
20
- 'kanban title label': string;
21
- 'column title label': string;
22
- 'column title placeholder': string;
23
- 'item title label': string;
24
- 'item title placeholder': string;
25
- 'add column label': string;
26
- 'add item label': string;
27
- 'delete column label': string;
28
- 'delete item label': string;
29
- 'card field deleted label': string;
30
- 'card deleted label': string;
31
- 'typename label'?: undefined;
32
- 'object name placeholder'?: undefined;
33
7
  };
34
8
  "dxos.org/plugin/kanban": {
35
9
  'plugin name': string;
@@ -1 +1 @@
1
- {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../../src/translations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAuBE"}
1
+ {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../../src/translations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;;;QAO7C,CAAC,UAAU,CAAC,QAAQ,CAAC;;;UAGpB;;;;;;;;;;;;;;;;;AANP,wBAuBE"}