Skip to content

Commit c06828b

Browse files
committed
refactor(editor): edgeless html embed card toolbar config extension
1 parent 625707a commit c06828b

File tree

2 files changed

+66
-39
lines changed

2 files changed

+66
-39
lines changed

blocksuite/affine/blocks/block-embed/src/embed-html-block/configs/toolbar.ts

+62-28
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,56 @@ import {
55
type ToolbarAction,
66
type ToolbarActionGroup,
77
type ToolbarModuleConfig,
8+
ToolbarModuleExtension,
89
} from '@blocksuite/affine-shared/services';
910
import { getBlockProps } from '@blocksuite/affine-shared/utils';
11+
import { BlockFlavourIdentifier } from '@blocksuite/block-std';
1012
import {
1113
CaptionIcon,
1214
CopyIcon,
1315
DeleteIcon,
1416
DuplicateIcon,
1517
ExpandFullIcon,
1618
} from '@blocksuite/icons/lit';
17-
import { Slice } from '@blocksuite/store';
19+
import { type ExtensionType, Slice } from '@blocksuite/store';
1820
import { html } from 'lit';
1921
import { keyed } from 'lit/directives/keyed.js';
2022

2123
import { EmbedHtmlBlockComponent } from '../embed-html-block';
2224

2325
const trackBaseProps = {
24-
segment: 'doc',
25-
page: 'doc editor',
26-
module: 'toolbar',
2726
category: 'html',
2827
type: 'card view',
2928
};
3029

31-
export const builtinToolbarConfig = {
30+
const openDocAction = {
31+
id: 'a.open-doc',
32+
icon: ExpandFullIcon(),
33+
tooltip: 'Open this doc',
34+
run(ctx) {
35+
const block = ctx.getCurrentBlockByType(EmbedHtmlBlockComponent);
36+
block?.open();
37+
},
38+
} as const satisfies ToolbarAction;
39+
40+
const captionAction = {
41+
id: 'c.caption',
42+
tooltip: 'Caption',
43+
icon: CaptionIcon(),
44+
run(ctx) {
45+
const block = ctx.getCurrentBlockByType(EmbedHtmlBlockComponent);
46+
block?.captionEditor?.show();
47+
48+
ctx.track('OpenedCaptionEditor', {
49+
...trackBaseProps,
50+
control: 'add caption',
51+
});
52+
},
53+
} as const satisfies ToolbarAction;
54+
55+
const builtinToolbarConfig = {
3256
actions: [
33-
{
34-
id: 'a.open-doc',
35-
icon: ExpandFullIcon(),
36-
tooltip: 'Open this doc',
37-
run(ctx) {
38-
const block = ctx.getCurrentBlockByType(EmbedHtmlBlockComponent);
39-
block?.open();
40-
},
41-
},
57+
openDocAction,
4258
{
4359
id: 'b.style',
4460
actions: [
@@ -68,6 +84,7 @@ export const builtinToolbarConfig = {
6884
},
6985
}));
7086
const onToggle = (e: CustomEvent<boolean>) => {
87+
e.stopPropagation();
7188
const opened = e.detail;
7289
if (!opened) return;
7390

@@ -88,20 +105,7 @@ export const builtinToolbarConfig = {
88105
)}`;
89106
},
90107
} satisfies ToolbarActionGroup<ToolbarAction>,
91-
{
92-
id: 'c.caption',
93-
tooltip: 'Caption',
94-
icon: CaptionIcon(),
95-
run(ctx) {
96-
const block = ctx.getCurrentBlockByType(EmbedHtmlBlockComponent);
97-
block?.captionEditor?.show();
98-
99-
ctx.track('OpenedCaptionEditor', {
100-
...trackBaseProps,
101-
control: 'add caption',
102-
});
103-
},
104-
},
108+
captionAction,
105109
{
106110
placement: ActionPlacement.More,
107111
id: 'a.clipboard',
@@ -156,4 +160,34 @@ export const builtinToolbarConfig = {
156160
},
157161
},
158162
],
163+
164+
when: ctx => ctx.getSurfaceModelsByType(EmbedHtmlModel).length === 1,
159165
} as const satisfies ToolbarModuleConfig;
166+
167+
const builtinSurfaceToolbarConfig = {
168+
actions: [
169+
openDocAction,
170+
{
171+
...captionAction,
172+
id: 'b.caption',
173+
},
174+
],
175+
} as const satisfies ToolbarModuleConfig;
176+
177+
export const createBuiltinToolbarConfigExtension = (
178+
flavour: string
179+
): ExtensionType[] => {
180+
const name = flavour.split(':').pop();
181+
182+
return [
183+
ToolbarModuleExtension({
184+
id: BlockFlavourIdentifier(flavour),
185+
config: builtinToolbarConfig,
186+
}),
187+
188+
ToolbarModuleExtension({
189+
id: BlockFlavourIdentifier(`affine:surface:${name}`),
190+
config: builtinSurfaceToolbarConfig,
191+
}),
192+
];
193+
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
import { EmbedHtmlBlockSchema } from '@blocksuite/affine-model';
2-
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
3-
import {
4-
BlockFlavourIdentifier,
5-
BlockViewExtension,
6-
} from '@blocksuite/block-std';
2+
import { BlockViewExtension } from '@blocksuite/block-std';
73
import type { ExtensionType } from '@blocksuite/store';
84
import { literal } from 'lit/static-html.js';
95

10-
import { builtinToolbarConfig } from './configs/toolbar';
6+
import { createBuiltinToolbarConfigExtension } from './configs/toolbar';
117

128
const flavour = EmbedHtmlBlockSchema.model.flavour;
139

@@ -17,8 +13,5 @@ export const EmbedHtmlBlockSpec: ExtensionType[] = [
1713
? literal`affine-embed-edgeless-html-block`
1814
: literal`affine-embed-html-block`;
1915
}),
20-
ToolbarModuleExtension({
21-
id: BlockFlavourIdentifier(flavour),
22-
config: builtinToolbarConfig,
23-
}),
24-
];
16+
createBuiltinToolbarConfigExtension(flavour),
17+
].flat();

0 commit comments

Comments
 (0)