@dxos/plugin-stack 0.8.4-main.d05673bc65 → 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 +326 -0
- package/README.md +1 -1
- package/dist/lib/neutral/StackArticle-M7AYNDZN.mjs +125 -0
- package/dist/lib/neutral/StackArticle-M7AYNDZN.mjs.map +7 -0
- package/dist/lib/neutral/StackPlugin.mjs +34 -0
- package/dist/lib/neutral/StackPlugin.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +7 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-RGJSGQGF.mjs +36 -0
- package/dist/lib/neutral/chunk-RGJSGQGF.mjs.map +7 -0
- package/dist/lib/{browser/chunk-YPQYUBQP.mjs → neutral/chunk-T4NSFSPH.mjs} +3 -6
- package/dist/lib/neutral/chunk-T4NSFSPH.mjs.map +7 -0
- package/dist/lib/{browser/StackContainer-OLHE5F4E.mjs → neutral/components/index.mjs} +37 -149
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +7 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +15 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +9 -0
- package/dist/lib/neutral/plugin.mjs +11 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-MD3CVY2N.mjs +23 -0
- package/dist/lib/neutral/react-surface-MD3CVY2N.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +37 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/types/index.mjs +1 -1
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/types/src/StackPlugin.d.ts +1 -0
- package/dist/types/src/StackPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +2 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/components/StackContext/StackContext.d.ts +1 -1
- package/dist/types/src/components/StackContext/StackContext.d.ts.map +1 -1
- package/dist/types/src/components/StackSection/CaretDownUp.d.ts +1 -1
- package/dist/types/src/components/StackSection/CaretDownUp.d.ts.map +1 -1
- package/dist/types/src/components/StackSection/StackSection.d.ts +1 -1
- package/dist/types/src/components/StackSection/StackSection.d.ts.map +1 -1
- package/dist/types/src/components/StackSettings/StackSettings.d.ts +1 -1
- package/dist/types/src/components/StackSettings/StackSettings.d.ts.map +1 -1
- package/dist/types/src/containers/StackArticle/StackArticle.d.ts +7 -0
- package/dist/types/src/containers/StackArticle/StackArticle.d.ts.map +1 -0
- package/dist/types/src/containers/StackArticle/index.d.ts +2 -0
- package/dist/types/src/containers/StackArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +1 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +3 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts +3 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +30 -30
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/stack.d.ts +1 -2
- package/dist/types/src/types/stack.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +1 -2
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +76 -48
- package/src/StackPlugin.ts +12 -22
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +5 -8
- package/src/components/StackContext/StackContext.tsx +1 -1
- package/src/components/StackSection/StackSection.tsx +20 -19
- package/src/components/StackSettings/StackSettings.tsx +13 -15
- package/src/containers/{StackContainer/StackContainer.tsx → StackArticle/StackArticle.tsx} +19 -25
- package/src/containers/StackArticle/index.ts +5 -0
- package/src/containers/index.ts +1 -1
- package/src/index.ts +1 -1
- package/src/meta.ts +21 -7
- package/src/plugin.ts +9 -0
- package/src/translations.ts +23 -22
- package/src/types/stack.ts +3 -8
- package/src/types/types.ts +1 -2
- package/src/vite-env.d.ts +10 -0
- package/dist/lib/browser/StackContainer-OLHE5F4E.mjs.map +0 -7
- package/dist/lib/browser/chunk-G4CLPE5A.mjs +0 -21
- package/dist/lib/browser/chunk-G4CLPE5A.mjs.map +0 -7
- package/dist/lib/browser/chunk-YPQYUBQP.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -84
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/react-surface-JS4ERDMQ.mjs +0 -33
- package/dist/lib/browser/react-surface-JS4ERDMQ.mjs.map +0 -7
- package/dist/lib/node-esm/StackContainer-W3M7BKLT.mjs +0 -295
- package/dist/lib/node-esm/StackContainer-W3M7BKLT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LELGTQAL.mjs +0 -29
- package/dist/lib/node-esm/chunk-LELGTQAL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LOZ6GH5A.mjs +0 -23
- package/dist/lib/node-esm/chunk-LOZ6GH5A.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -85
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/react-surface-YKS4OHR3.mjs +0 -34
- package/dist/lib/node-esm/react-surface-YKS4OHR3.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -10
- 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/StackContainer/StackContainer.d.ts +0 -7
- package/dist/types/src/containers/StackContainer/StackContainer.d.ts.map +0 -1
- package/dist/types/src/containers/StackContainer/index.d.ts +0 -3
- package/dist/types/src/containers/StackContainer/index.d.ts.map +0 -1
- package/src/capabilities/react-surface/index.ts +0 -7
- package/src/containers/StackContainer/index.ts +0 -7
- /package/dist/lib/{browser/types → neutral}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/types/index.mjs.map → neutral/meta.mjs.map} +0 -0
- /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-stack",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.d9fc60f731",
|
|
4
4
|
"description": "DXOS Surface plugin for Stack entities",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -8,63 +8,90 @@
|
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "https://github.com/dxos/dxos"
|
|
10
10
|
},
|
|
11
|
-
"license": "
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
12
12
|
"author": "DXOS.org",
|
|
13
13
|
"sideEffects": true,
|
|
14
14
|
"type": "module",
|
|
15
|
+
"imports": {
|
|
16
|
+
"#capabilities": {
|
|
17
|
+
"source": "./src/capabilities/index.ts",
|
|
18
|
+
"types": "./dist/types/src/capabilities/index.d.ts",
|
|
19
|
+
"default": "./dist/lib/neutral/capabilities/index.mjs"
|
|
20
|
+
},
|
|
21
|
+
"#components": {
|
|
22
|
+
"source": "./src/components/index.ts",
|
|
23
|
+
"types": "./dist/types/src/components/index.d.ts",
|
|
24
|
+
"default": "./dist/lib/neutral/components/index.mjs"
|
|
25
|
+
},
|
|
26
|
+
"#containers": {
|
|
27
|
+
"source": "./src/containers/index.ts",
|
|
28
|
+
"types": "./dist/types/src/containers/index.d.ts",
|
|
29
|
+
"default": "./dist/lib/neutral/containers/index.mjs"
|
|
30
|
+
},
|
|
31
|
+
"#meta": {
|
|
32
|
+
"source": "./src/meta.ts",
|
|
33
|
+
"types": "./dist/types/src/meta.d.ts",
|
|
34
|
+
"default": "./dist/lib/neutral/meta.mjs"
|
|
35
|
+
},
|
|
36
|
+
"#plugin": {
|
|
37
|
+
"source": "./src/StackPlugin.ts",
|
|
38
|
+
"types": "./dist/types/src/StackPlugin.d.ts",
|
|
39
|
+
"default": "./dist/lib/neutral/StackPlugin.mjs"
|
|
40
|
+
},
|
|
41
|
+
"#translations": {
|
|
42
|
+
"source": "./src/translations.ts",
|
|
43
|
+
"types": "./dist/types/src/translations.d.ts",
|
|
44
|
+
"default": "./dist/lib/neutral/translations.mjs"
|
|
45
|
+
},
|
|
46
|
+
"#types": {
|
|
47
|
+
"source": "./src/types/index.ts",
|
|
48
|
+
"types": "./dist/types/src/types/index.d.ts",
|
|
49
|
+
"default": "./dist/lib/neutral/types/index.mjs"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
15
52
|
"exports": {
|
|
16
53
|
".": {
|
|
17
54
|
"source": "./src/index.ts",
|
|
18
55
|
"types": "./dist/types/src/index.d.ts",
|
|
19
|
-
"
|
|
20
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
56
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
21
57
|
},
|
|
22
|
-
"./
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
58
|
+
"./assets/PLUGIN.mdl": "./PLUGIN.mdl",
|
|
59
|
+
"./plugin": {
|
|
60
|
+
"source": "./src/plugin.ts",
|
|
61
|
+
"types": "./dist/types/src/plugin.d.ts",
|
|
62
|
+
"default": "./dist/lib/neutral/plugin.mjs"
|
|
63
|
+
},
|
|
64
|
+
"./translations": {
|
|
65
|
+
"source": "./src/translations.ts",
|
|
66
|
+
"types": "./dist/types/src/translations.d.ts",
|
|
67
|
+
"default": "./dist/lib/neutral/translations.mjs"
|
|
27
68
|
}
|
|
28
69
|
},
|
|
29
70
|
"types": "dist/types/src/index.d.ts",
|
|
30
|
-
"typesVersions": {
|
|
31
|
-
"*": {
|
|
32
|
-
"types": [
|
|
33
|
-
"dist/types/src/types/index.d.ts"
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
71
|
"files": [
|
|
38
72
|
"dist",
|
|
39
|
-
"src"
|
|
73
|
+
"src",
|
|
74
|
+
"PLUGIN.mdl"
|
|
40
75
|
],
|
|
41
76
|
"dependencies": {
|
|
42
77
|
"@effect-atom/atom-react": "^0.5.0",
|
|
43
|
-
"@fluentui/react-tabster": "9.26.11",
|
|
44
78
|
"@radix-ui/react-collapsible": "1.1.3",
|
|
45
|
-
"effect": "3.
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"@dxos/app-
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/
|
|
54
|
-
"@dxos/
|
|
55
|
-
"@dxos/
|
|
56
|
-
"@dxos/
|
|
57
|
-
"@dxos/
|
|
58
|
-
"@dxos/
|
|
59
|
-
"@dxos/
|
|
60
|
-
"@dxos/plugin-
|
|
61
|
-
"@dxos/react-ui-attention": "0.8.4-main.d05673bc65",
|
|
62
|
-
"@dxos/react-ui-stack": "0.8.4-main.d05673bc65",
|
|
63
|
-
"@dxos/react-ui-form": "0.8.4-main.d05673bc65",
|
|
64
|
-
"@dxos/react-ui-searchlist": "0.8.4-main.d05673bc65",
|
|
65
|
-
"@dxos/schema": "0.8.4-main.d05673bc65",
|
|
66
|
-
"@dxos/types": "0.8.4-main.d05673bc65",
|
|
67
|
-
"@dxos/util": "0.8.4-main.d05673bc65"
|
|
79
|
+
"effect": "3.21.2",
|
|
80
|
+
"@dxos/app-framework": "0.8.4-main.d9fc60f731",
|
|
81
|
+
"@dxos/echo-atom": "0.8.4-main.d9fc60f731",
|
|
82
|
+
"@dxos/app-toolkit": "0.8.4-main.d9fc60f731",
|
|
83
|
+
"@dxos/invariant": "0.8.4-main.d9fc60f731",
|
|
84
|
+
"@dxos/echo": "0.8.4-main.d9fc60f731",
|
|
85
|
+
"@dxos/keys": "0.8.4-main.d9fc60f731",
|
|
86
|
+
"@dxos/operation": "0.8.4-main.d9fc60f731",
|
|
87
|
+
"@dxos/plugin-client": "0.8.4-main.d9fc60f731",
|
|
88
|
+
"@dxos/plugin-deck": "0.8.4-main.d9fc60f731",
|
|
89
|
+
"@dxos/react-ui-form": "0.8.4-main.d9fc60f731",
|
|
90
|
+
"@dxos/util": "0.8.4-main.d9fc60f731",
|
|
91
|
+
"@dxos/react-ui-stack": "0.8.4-main.d9fc60f731",
|
|
92
|
+
"@dxos/plugin-space": "0.8.4-main.d9fc60f731",
|
|
93
|
+
"@dxos/react-ui-attention": "0.8.4-main.d9fc60f731",
|
|
94
|
+
"@dxos/plugin-graph": "0.8.4-main.d9fc60f731"
|
|
68
95
|
},
|
|
69
96
|
"devDependencies": {
|
|
70
97
|
"@babel/core": "^7.18.13",
|
|
@@ -72,18 +99,19 @@
|
|
|
72
99
|
"@types/react-dom": "~19.2.3",
|
|
73
100
|
"react": "~19.2.3",
|
|
74
101
|
"react-dom": "~19.2.3",
|
|
75
|
-
"vite": "^
|
|
76
|
-
"@dxos/
|
|
77
|
-
"@dxos/
|
|
78
|
-
"@dxos/ui-theme": "0.8.4-main.
|
|
102
|
+
"vite": "^8.0.14",
|
|
103
|
+
"@dxos/plugin-testing": "0.8.4-main.d9fc60f731",
|
|
104
|
+
"@dxos/react-ui": "0.8.4-main.d9fc60f731",
|
|
105
|
+
"@dxos/ui-theme": "0.8.4-main.d9fc60f731",
|
|
106
|
+
"@dxos/storybook-utils": "0.8.4-main.d9fc60f731"
|
|
79
107
|
},
|
|
80
108
|
"peerDependencies": {
|
|
81
109
|
"@effect-atom/atom-react": "^0.5.0",
|
|
82
|
-
"effect": "3.
|
|
110
|
+
"effect": "3.21.2",
|
|
83
111
|
"react": "~19.2.3",
|
|
84
112
|
"react-dom": "~19.2.3",
|
|
85
|
-
"@dxos/ui
|
|
86
|
-
"@dxos/
|
|
113
|
+
"@dxos/react-ui": "0.8.4-main.d9fc60f731",
|
|
114
|
+
"@dxos/ui-theme": "0.8.4-main.d9fc60f731"
|
|
87
115
|
},
|
|
88
116
|
"publishConfig": {
|
|
89
117
|
"access": "public"
|
package/src/StackPlugin.ts
CHANGED
|
@@ -4,33 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
import { Plugin } from '@dxos/app-framework';
|
|
6
6
|
import { AppPlugin } from '@dxos/app-toolkit';
|
|
7
|
-
import { type Obj } from '@dxos/echo';
|
|
8
7
|
|
|
9
|
-
import { ReactSurface } from '
|
|
10
|
-
import {
|
|
11
|
-
import { translations } from '
|
|
12
|
-
import { StackViewType } from '
|
|
8
|
+
import { ReactSurface } from '#capabilities';
|
|
9
|
+
import { meta } from '#meta';
|
|
10
|
+
import { translations } from '#translations';
|
|
11
|
+
import { StackViewType } from '#types';
|
|
12
|
+
|
|
13
|
+
// eslint-disable-next-line import/no-relative-packages
|
|
14
|
+
import pluginSpec from '../PLUGIN.mdl?raw';
|
|
13
15
|
|
|
14
16
|
export const StackPlugin = Plugin.define(meta).pipe(
|
|
15
|
-
AppPlugin.addMetadataModule({
|
|
16
|
-
metadata: {
|
|
17
|
-
id: SECTION_IDENTIFIER,
|
|
18
|
-
metadata: {
|
|
19
|
-
parse: (section: { object: Obj.Unknown }, type: string) => {
|
|
20
|
-
switch (type) {
|
|
21
|
-
case 'node':
|
|
22
|
-
return { id: section.object.id, label: (section.object as any).title, data: section.object };
|
|
23
|
-
case 'object':
|
|
24
|
-
return section.object;
|
|
25
|
-
case 'view-object':
|
|
26
|
-
return section;
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
}),
|
|
32
17
|
AppPlugin.addSchemaModule({ schema: [StackViewType] }),
|
|
33
18
|
AppPlugin.addSurfaceModule({ activate: ReactSurface }),
|
|
34
19
|
AppPlugin.addTranslationsModule({ translations }),
|
|
20
|
+
AppPlugin.addPluginAssetModule({
|
|
21
|
+
asset: { pluginId: meta.id, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },
|
|
22
|
+
}),
|
|
35
23
|
Plugin.make,
|
|
36
24
|
);
|
|
25
|
+
|
|
26
|
+
export default StackPlugin;
|
|
@@ -7,23 +7,20 @@ import React from 'react';
|
|
|
7
7
|
|
|
8
8
|
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
9
|
import { Surface } from '@dxos/app-framework/ui';
|
|
10
|
-
import {
|
|
10
|
+
import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
11
11
|
import { Collection } from '@dxos/echo';
|
|
12
12
|
|
|
13
|
-
import {
|
|
14
|
-
import { meta } from '../../meta';
|
|
13
|
+
import { StackArticle } from '#containers';
|
|
15
14
|
|
|
16
15
|
export default Capability.makeModule(() =>
|
|
17
16
|
Effect.succeed(
|
|
18
17
|
Capability.contributes(
|
|
19
18
|
Capabilities.ReactSurface,
|
|
20
19
|
Surface.create({
|
|
21
|
-
id:
|
|
22
|
-
|
|
23
|
-
filter: (data): data is { attendableId: string; subject: Collection.Collection } =>
|
|
24
|
-
typeof data.attendableId === 'string' && Obj.instanceOf(Collection.Collection, data.subject),
|
|
20
|
+
id: 'article',
|
|
21
|
+
filter: AppSurface.object(AppSurface.Article, Collection.Collection),
|
|
25
22
|
component: ({ role, data }) => {
|
|
26
|
-
return <
|
|
23
|
+
return <StackArticle attendableId={data.attendableId} role={role} subject={data.subject} />;
|
|
27
24
|
},
|
|
28
25
|
}),
|
|
29
26
|
),
|
|
@@ -6,16 +6,17 @@ import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
|
|
|
6
6
|
import React, { useMemo, useState } from 'react';
|
|
7
7
|
|
|
8
8
|
import { Surface } from '@dxos/app-framework/ui';
|
|
9
|
+
import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
9
10
|
import { DropdownMenu, Icon, IconButton, useTranslation } from '@dxos/react-ui';
|
|
10
11
|
import { useAttentionAttributes } from '@dxos/react-ui-attention';
|
|
11
12
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
12
|
-
import { getSize, mx
|
|
13
|
+
import { getSize, mx } from '@dxos/ui-theme';
|
|
13
14
|
|
|
14
|
-
import { meta } from '
|
|
15
|
-
import { type StackSectionItem } from '
|
|
15
|
+
import { meta } from '#meta';
|
|
16
|
+
import { type StackSectionItem } from '#types';
|
|
16
17
|
|
|
17
|
-
import { CaretDownUp } from './CaretDownUp';
|
|
18
18
|
import { useStack } from '../StackContext';
|
|
19
|
+
import { CaretDownUp } from './CaretDownUp';
|
|
19
20
|
|
|
20
21
|
const sectionActionDimensions = 'p-1 my-1 shrink-0 min-h-0 w-(--dx-rail-action) h-min';
|
|
21
22
|
|
|
@@ -25,7 +26,7 @@ export const StackSection = ({
|
|
|
25
26
|
id,
|
|
26
27
|
view,
|
|
27
28
|
object,
|
|
28
|
-
metadata: { icon = 'ph--
|
|
29
|
+
metadata: { icon = 'ph--circle-dashed--regular' },
|
|
29
30
|
}: StackSectionProps) => {
|
|
30
31
|
const { t } = useTranslation(meta.id);
|
|
31
32
|
const { attendableId: parentAttendableId, onNavigate, onAdd, onCollapse, onDelete } = useStack();
|
|
@@ -49,7 +50,7 @@ export const StackSection = ({
|
|
|
49
50
|
>
|
|
50
51
|
<DropdownMenu.Trigger asChild>
|
|
51
52
|
<StackItem.SigilButton>
|
|
52
|
-
<Icon icon={icon}
|
|
53
|
+
<Icon icon={icon} classNames='transition-opacity' />
|
|
53
54
|
</StackItem.SigilButton>
|
|
54
55
|
</DropdownMenu.Trigger>
|
|
55
56
|
<DropdownMenu.Portal>
|
|
@@ -57,28 +58,28 @@ export const StackSection = ({
|
|
|
57
58
|
<DropdownMenu.Viewport>
|
|
58
59
|
{view.collapsed ? (
|
|
59
60
|
<DropdownMenu.Item onClick={() => onNavigate(id)} data-testid='section.navigate-to'>
|
|
60
|
-
<Icon icon='ph--arrow-right--regular'
|
|
61
|
-
<span className='ms-2 grow'>{t('navigate
|
|
61
|
+
<Icon icon='ph--arrow-right--regular' />
|
|
62
|
+
<span className='ms-2 grow'>{t('navigate-to-section.label')}</span>
|
|
62
63
|
</DropdownMenu.Item>
|
|
63
64
|
) : (
|
|
64
65
|
<CollapsiblePrimitive.Trigger asChild>
|
|
65
66
|
<DropdownMenu.Item>
|
|
66
67
|
<CaretDownUp className={getSize(5)} />
|
|
67
|
-
<span className='ms-2 grow'>{t('collapse
|
|
68
|
+
<span className='ms-2 grow'>{t('collapse.label')}</span>
|
|
68
69
|
</DropdownMenu.Item>
|
|
69
70
|
</CollapsiblePrimitive.Trigger>
|
|
70
71
|
)}
|
|
71
72
|
<DropdownMenu.Item onClick={() => onAdd(id, 'before')} data-testid='section.add-before'>
|
|
72
|
-
<Icon icon='ph--arrow-line-up--regular'
|
|
73
|
-
<span className='ms-2 grow'>{t('add
|
|
73
|
+
<Icon icon='ph--arrow-line-up--regular' />
|
|
74
|
+
<span className='ms-2 grow'>{t('add-section-before.label')}</span>
|
|
74
75
|
</DropdownMenu.Item>
|
|
75
76
|
<DropdownMenu.Item onClick={() => onAdd(id, 'after')} data-testid='section.add-after'>
|
|
76
|
-
<Icon icon='ph--arrow-line-down--regular'
|
|
77
|
-
<span className='ms-2 grow'>{t('add
|
|
77
|
+
<Icon icon='ph--arrow-line-down--regular' />
|
|
78
|
+
<span className='ms-2 grow'>{t('add-section-after.label')}</span>
|
|
78
79
|
</DropdownMenu.Item>
|
|
79
80
|
<DropdownMenu.Item onClick={() => onDelete(id)} data-testid='section.remove'>
|
|
80
|
-
<Icon icon='ph--trash--regular'
|
|
81
|
-
<span className='ms-2 grow'>{t('remove
|
|
81
|
+
<Icon icon='ph--trash--regular' />
|
|
82
|
+
<span className='ms-2 grow'>{t('remove-section.label')}</span>
|
|
82
83
|
</DropdownMenu.Item>
|
|
83
84
|
</DropdownMenu.Viewport>
|
|
84
85
|
<DropdownMenu.Arrow />
|
|
@@ -90,7 +91,7 @@ export const StackSection = ({
|
|
|
90
91
|
<IconButton
|
|
91
92
|
iconOnly
|
|
92
93
|
variant='ghost'
|
|
93
|
-
label={t('expand
|
|
94
|
+
label={t('expand.label')}
|
|
94
95
|
icon='ph--caret-up-down--regular'
|
|
95
96
|
classNames={sectionActionDimensions}
|
|
96
97
|
/>
|
|
@@ -100,7 +101,7 @@ export const StackSection = ({
|
|
|
100
101
|
iconOnly
|
|
101
102
|
variant='ghost'
|
|
102
103
|
onClick={() => onNavigate(id)}
|
|
103
|
-
label={t('navigate
|
|
104
|
+
label={t('navigate-to-section.label')}
|
|
104
105
|
icon='ph--arrow-right--regular'
|
|
105
106
|
data-testid='section.navigate-to'
|
|
106
107
|
classNames={sectionActionDimensions}
|
|
@@ -109,11 +110,11 @@ export const StackSection = ({
|
|
|
109
110
|
</StackItem.HeadingStickyContent>
|
|
110
111
|
</StackItem.Heading>
|
|
111
112
|
<CollapsiblePrimitive.Content>
|
|
112
|
-
<Surface.Surface
|
|
113
|
+
<Surface.Surface type={AppSurface.Section} data={data} limit={1} placeholder={<></>} />
|
|
113
114
|
</CollapsiblePrimitive.Content>
|
|
114
115
|
{view.collapsed && (
|
|
115
116
|
<StackItem.Content classNames='dx-attention-surface'>
|
|
116
|
-
<h2 className={mx('flex items-center p-4 font-medium'
|
|
117
|
+
<h2 className={mx('flex items-center p-4 font-medium')}>{view.title}</h2>
|
|
117
118
|
</StackItem.Content>
|
|
118
119
|
)}
|
|
119
120
|
</StackItem.Root>
|
|
@@ -5,26 +5,24 @@
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
7
|
import { Input, useTranslation } from '@dxos/react-ui';
|
|
8
|
-
import { Settings } from '@dxos/react-ui-form';
|
|
8
|
+
import { Settings as SettingsForm } from '@dxos/react-ui-form';
|
|
9
9
|
|
|
10
|
-
import { meta } from '
|
|
11
|
-
import { type StackSettingsProps } from '
|
|
10
|
+
import { meta } from '#meta';
|
|
11
|
+
import { type StackSettingsProps } from '#types';
|
|
12
12
|
|
|
13
13
|
export const StackSettings = ({ settings }: { settings: StackSettingsProps }) => {
|
|
14
14
|
const { t } = useTranslation(meta.id);
|
|
15
15
|
|
|
16
16
|
return (
|
|
17
|
-
<
|
|
18
|
-
<
|
|
19
|
-
<
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
</Settings.Section>
|
|
28
|
-
</Settings.Root>
|
|
17
|
+
<SettingsForm.Viewport>
|
|
18
|
+
<SettingsForm.Section title={t('settings.title', { ns: meta.id })}>
|
|
19
|
+
<SettingsForm.Item title={t('settings.separation.label')} description={t('settings.separation.description')}>
|
|
20
|
+
<Input.Switch
|
|
21
|
+
checked={settings.separation}
|
|
22
|
+
onCheckedChange={(checked) => (settings.separation = !!checked)}
|
|
23
|
+
/>
|
|
24
|
+
</SettingsForm.Item>
|
|
25
|
+
</SettingsForm.Section>
|
|
26
|
+
</SettingsForm.Viewport>
|
|
29
27
|
);
|
|
30
28
|
};
|
|
@@ -6,28 +6,26 @@ import { Atom, useAtomValue } from '@effect-atom/atom-react';
|
|
|
6
6
|
import * as Option from 'effect/Option';
|
|
7
7
|
import React, { useCallback, useState } from 'react';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { type
|
|
12
|
-
import {
|
|
13
|
-
import { Obj, type Ref } from '@dxos/echo';
|
|
14
|
-
import { type Collection } from '@dxos/echo';
|
|
9
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
10
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
11
|
+
import { useAppGraph, type AppSurface } from '@dxos/app-toolkit/ui';
|
|
12
|
+
import { type Collection, Obj, type Ref } from '@dxos/echo';
|
|
15
13
|
import { AtomObj } from '@dxos/echo-atom';
|
|
16
14
|
import { Graph } from '@dxos/plugin-graph';
|
|
17
|
-
import { SpaceOperation } from '@dxos/plugin-space
|
|
15
|
+
import { SpaceOperation } from '@dxos/plugin-space';
|
|
18
16
|
import { Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
19
17
|
import { Stack, StackItem } from '@dxos/react-ui-stack';
|
|
20
18
|
import { isNonNullable } from '@dxos/util';
|
|
21
19
|
|
|
22
|
-
import { StackContext, StackSection } from '
|
|
23
|
-
import { meta } from '
|
|
20
|
+
import { StackContext, StackSection } from '#components';
|
|
21
|
+
import { meta } from '#meta';
|
|
24
22
|
import {
|
|
25
23
|
type AddSectionPosition,
|
|
26
24
|
type CollapsedSections,
|
|
27
25
|
type StackSectionItem,
|
|
28
26
|
type StackSectionMetadata,
|
|
29
27
|
type StackSectionView,
|
|
30
|
-
} from '
|
|
28
|
+
} from '#types';
|
|
31
29
|
|
|
32
30
|
const collectionObjectsFamily = Atom.family((collection: Collection.Collection) =>
|
|
33
31
|
Atom.make((get) => {
|
|
@@ -41,13 +39,12 @@ const collectionObjectsFamily = Atom.family((collection: Collection.Collection)
|
|
|
41
39
|
}),
|
|
42
40
|
);
|
|
43
41
|
|
|
44
|
-
type
|
|
42
|
+
type StackArticleProps = AppSurface.ObjectArticleProps<Collection.Collection>;
|
|
45
43
|
|
|
46
|
-
export const
|
|
44
|
+
export const StackArticle = ({ attendableId, subject: collection }: StackArticleProps) => {
|
|
47
45
|
const { invokePromise } = useOperationInvoker();
|
|
48
46
|
const { graph } = useAppGraph();
|
|
49
47
|
const { t } = useTranslation(meta.id);
|
|
50
|
-
const allMetadata = useCapabilities(AppCapabilities.Metadata);
|
|
51
48
|
const [collapsedSections, setCollapsedSections] = useState<CollapsedSections>({});
|
|
52
49
|
|
|
53
50
|
// TODO(wittjosiah): Re-implement stack views with relations.
|
|
@@ -61,20 +58,17 @@ export const StackContainer = ({ attendableId, subject: collection }: StackConta
|
|
|
61
58
|
|
|
62
59
|
const collectionObjects = useAtomValue(collectionObjectsFamily(collection));
|
|
63
60
|
const items = collectionObjects.map((object: Obj.Unknown) => {
|
|
64
|
-
const
|
|
65
|
-
|
|
61
|
+
const iconAnnotation = Obj.getIcon(object);
|
|
62
|
+
const metadata: StackSectionMetadata = { icon: iconAnnotation?.icon };
|
|
66
63
|
const view = {
|
|
67
64
|
// ...stack.sections[object.id],
|
|
68
|
-
collapsed: collapsedSections[Obj.
|
|
65
|
+
collapsed: collapsedSections[Obj.getURI(object)],
|
|
69
66
|
title:
|
|
70
67
|
(object as any)?.title ??
|
|
71
68
|
// TODO(wittjosiah): `getNode` is not reactive.
|
|
72
|
-
toLocalizedString(
|
|
73
|
-
Graph.getNode(graph, Obj.getDXN(object).toString()).pipe(Option.getOrNull)?.properties.label,
|
|
74
|
-
t,
|
|
75
|
-
),
|
|
69
|
+
toLocalizedString(Graph.getNode(graph, Obj.getURI(object)).pipe(Option.getOrNull)?.properties.label, t),
|
|
76
70
|
} as StackSectionView;
|
|
77
|
-
return { id: Obj.
|
|
71
|
+
return { id: Obj.getURI(object), object, metadata, view } satisfies StackSectionItem;
|
|
78
72
|
});
|
|
79
73
|
|
|
80
74
|
const handleDelete = useCallback(
|
|
@@ -82,7 +76,7 @@ export const StackContainer = ({ attendableId, subject: collection }: StackConta
|
|
|
82
76
|
const index = collection.objects
|
|
83
77
|
.map((object) => object.target)
|
|
84
78
|
.filter(isNonNullable)
|
|
85
|
-
.findIndex((section) => Obj.
|
|
79
|
+
.findIndex((section) => Obj.getURI(section) === id);
|
|
86
80
|
const object = collection.objects[index].target;
|
|
87
81
|
if (Obj.isObject(object)) {
|
|
88
82
|
await invokePromise(SpaceOperation.RemoveObjects, {
|
|
@@ -135,7 +129,7 @@ export const StackContainer = ({ attendableId, subject: collection }: StackConta
|
|
|
135
129
|
);
|
|
136
130
|
|
|
137
131
|
return (
|
|
138
|
-
<StackItem.Content toolbar classNames='dx-
|
|
132
|
+
<StackItem.Content toolbar classNames='dx-document'>
|
|
139
133
|
<Toolbar.Root>
|
|
140
134
|
<Toolbar.IconButton
|
|
141
135
|
icon='ph--plus--regular'
|
|
@@ -147,7 +141,7 @@ export const StackContainer = ({ attendableId, subject: collection }: StackConta
|
|
|
147
141
|
</Toolbar.Root>
|
|
148
142
|
<StackContext.Provider
|
|
149
143
|
value={{
|
|
150
|
-
attendableId
|
|
144
|
+
attendableId,
|
|
151
145
|
onCollapse: handleCollapse,
|
|
152
146
|
onNavigate: handleNavigate,
|
|
153
147
|
onDelete: handleDelete,
|
|
@@ -157,7 +151,7 @@ export const StackContainer = ({ attendableId, subject: collection }: StackConta
|
|
|
157
151
|
<Stack
|
|
158
152
|
orientation='vertical'
|
|
159
153
|
size='intrinsic'
|
|
160
|
-
id={Obj.
|
|
154
|
+
id={Obj.getURI(collection)}
|
|
161
155
|
data-testid='main.stack'
|
|
162
156
|
classNames='overflow-y-auto'
|
|
163
157
|
>
|
package/src/containers/index.ts
CHANGED
package/src/index.ts
CHANGED
package/src/meta.ts
CHANGED
|
@@ -2,20 +2,34 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Plugin } from '@dxos/app-framework';
|
|
6
|
+
import { DXN } from '@dxos/keys';
|
|
6
7
|
import { trim } from '@dxos/util';
|
|
7
8
|
|
|
8
|
-
export const SECTION_IDENTIFIER = 'org.dxos.type.
|
|
9
|
+
export const SECTION_IDENTIFIER = DXN.make('org.dxos.type.stackSection');
|
|
9
10
|
|
|
10
|
-
export const meta
|
|
11
|
-
|
|
11
|
+
export const meta = Plugin.makeMeta({
|
|
12
|
+
key: DXN.make('org.dxos.plugin.stack'),
|
|
12
13
|
// TODO(wittjosiah): Prevents "stacks" language from being exposed to users in settings panel.
|
|
13
14
|
// Conside renaming this to the collection plugin and trying to factor more collections logic from the space plugin.
|
|
14
15
|
name: 'Collections',
|
|
16
|
+
author: 'DXOS',
|
|
17
|
+
spec: 'PLUGIN.mdl',
|
|
15
18
|
description: trim`
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
StackPlugin renders any Collection object as a vertically scrollable stack of collapsible sections in the
|
|
20
|
+
Composer article surface. Each section wraps an arbitrary ECHO object and delegates its content rendering
|
|
21
|
+
to the section surface role, enabling any other plugin to contribute its own section renderer.
|
|
22
|
+
|
|
23
|
+
Sections can be individually collapsed to show only their title, expanded to reveal full content, navigated
|
|
24
|
+
to directly, or removed from the collection. New sections can be inserted before or after any existing
|
|
25
|
+
section via a per-section dropdown menu, or appended via the toolbar Add button.
|
|
26
|
+
|
|
27
|
+
The plugin registers StackViewType with the ECHO schema module so that per-section view metadata
|
|
28
|
+
(height overrides, custom display data) can be stored and replicated alongside the collection.
|
|
29
|
+
|
|
30
|
+
A settings panel exposes a separation toggle that controls whether visual dividers are rendered between
|
|
31
|
+
sections.
|
|
18
32
|
`,
|
|
19
33
|
icon: 'ph--stack-simple--regular',
|
|
20
34
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-stack',
|
|
21
|
-
};
|
|
35
|
+
});
|