refactor(editor): image slash menu config extension (#10674)

This commit is contained in:
L-Sun
2025-03-07 05:48:39 +00:00
parent 66ad87c84a
commit 4e80ecd591
12 changed files with 45 additions and 32 deletions

View File

@@ -3,6 +3,7 @@ import { focusBlockEnd } from '@blocksuite/affine-shared/commands';
import { FeatureFlagService } from '@blocksuite/affine-shared/services'; import { FeatureFlagService } from '@blocksuite/affine-shared/services';
import { import {
findAncestorModel, findAncestorModel,
isInsideBlockByFlavour,
matchModels, matchModels,
} from '@blocksuite/affine-shared/utils'; } from '@blocksuite/affine-shared/utils';
import { type SlashMenuConfig } from '@blocksuite/affine-widget-slash-menu'; import { type SlashMenuConfig } from '@blocksuite/affine-widget-slash-menu';
@@ -23,8 +24,11 @@ export const calloutSlashMenuConfig: SlashMenuConfig = {
icon: FontIcon(), icon: FontIcon(),
searchAlias: ['callout'], searchAlias: ['callout'],
group: '0_Basic@9', group: '0_Basic@9',
when: ({ std }) => { when: ({ std, model }) => {
return std.get(FeatureFlagService).getFlag('enable_callout'); return (
std.get(FeatureFlagService).getFlag('enable_callout') &&
!isInsideBlockByFlavour(model.doc, model, 'affine:edgeless-text')
);
}, },
action: ({ model, std }) => { action: ({ model, std }) => {
const { doc } = model; const { doc } = model;

View File

@@ -18,6 +18,7 @@
"@blocksuite/affine-components": "workspace:*", "@blocksuite/affine-components": "workspace:*",
"@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-shared": "workspace:*", "@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*", "@blocksuite/block-std": "workspace:*",
"@blocksuite/global": "workspace:*", "@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.1", "@blocksuite/icons": "^2.2.1",

View File

@@ -0,0 +1,32 @@
import { getSelectedModelsCommand } from '@blocksuite/affine-shared/commands';
import { type SlashMenuConfig } from '@blocksuite/affine-widget-slash-menu';
import { ImageIcon } from '@blocksuite/icons/lit';
import { insertImagesCommand } from '../commands';
import { PhotoTooltip } from './tooltips';
export const imageSlashMenuConfig: SlashMenuConfig = {
items: [
{
name: 'Image',
description: 'Insert an image.',
icon: ImageIcon(),
tooltip: {
figure: PhotoTooltip,
caption: 'Photo',
},
group: '4_Content & Media@1',
when: ({ model }) =>
model.doc.schema.flavourSchemaMap.has('affine:image'),
action: ({ std }) => {
const [success, ctx] = std.command
.chain()
.pipe(getSelectedModelsCommand)
.pipe(insertImagesCommand, { removeEmptyLine: true })
.run();
if (success) ctx.insertedImageIds.catch(console.error);
},
},
],
};

View File

@@ -1,3 +1,4 @@
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
import { import {
BlockViewExtension, BlockViewExtension,
FlavourExtension, FlavourExtension,
@@ -7,6 +8,7 @@ import type { ExtensionType } from '@blocksuite/store';
import { literal } from 'lit/static-html.js'; import { literal } from 'lit/static-html.js';
import { ImageBlockAdapterExtensions } from './adapters/extension'; import { ImageBlockAdapterExtensions } from './adapters/extension';
import { imageSlashMenuConfig } from './configs/slash-menu.js';
import { ImageProxyService } from './image-proxy-service'; import { ImageProxyService } from './image-proxy-service';
import { ImageBlockService, ImageDropOption } from './image-service'; import { ImageBlockService, ImageDropOption } from './image-service';
@@ -33,6 +35,7 @@ export const ImageBlockSpec: ExtensionType[] = [
imageToolbarWidget, imageToolbarWidget,
ImageDropOption, ImageDropOption,
ImageBlockAdapterExtensions, ImageBlockAdapterExtensions,
SlashMenuConfigExtension('affine:image', imageSlashMenuConfig),
].flat(); ].flat();
export const ImageStoreSpec: ExtensionType[] = [ImageProxyService]; export const ImageStoreSpec: ExtensionType[] = [ImageProxyService];

View File

@@ -12,6 +12,7 @@
{ "path": "../components" }, { "path": "../components" },
{ "path": "../model" }, { "path": "../model" },
{ "path": "../shared" }, { "path": "../shared" },
{ "path": "../widget-slash-menu" },
{ "path": "../../framework/block-std" }, { "path": "../../framework/block-std" },
{ "path": "../../framework/global" }, { "path": "../../framework/global" },
{ "path": "../../framework/inline" }, { "path": "../../framework/inline" },

View File

@@ -15,7 +15,6 @@
"dependencies": { "dependencies": {
"@blocksuite/affine-block-attachment": "workspace:*", "@blocksuite/affine-block-attachment": "workspace:*",
"@blocksuite/affine-block-embed": "workspace:*", "@blocksuite/affine-block-embed": "workspace:*",
"@blocksuite/affine-block-image": "workspace:*",
"@blocksuite/affine-block-latex": "workspace:*", "@blocksuite/affine-block-latex": "workspace:*",
"@blocksuite/affine-block-note": "workspace:*", "@blocksuite/affine-block-note": "workspace:*",
"@blocksuite/affine-block-surface": "workspace:*", "@blocksuite/affine-block-surface": "workspace:*",

View File

@@ -1,5 +1,4 @@
import { addSiblingAttachmentBlocks } from '@blocksuite/affine-block-attachment'; import { addSiblingAttachmentBlocks } from '@blocksuite/affine-block-attachment';
import { insertImagesCommand } from '@blocksuite/affine-block-image';
import { insertLatexBlockCommand } from '@blocksuite/affine-block-latex'; import { insertLatexBlockCommand } from '@blocksuite/affine-block-latex';
import { getSurfaceBlock } from '@blocksuite/affine-block-surface'; import { getSurfaceBlock } from '@blocksuite/affine-block-surface';
import { insertSurfaceRefBlockCommand } from '@blocksuite/affine-block-surface-ref'; import { insertSurfaceRefBlockCommand } from '@blocksuite/affine-block-surface-ref';
@@ -39,7 +38,6 @@ import {
GithubDuotoneIcon, GithubDuotoneIcon,
GroupingIcon, GroupingIcon,
HeadingsIcon, HeadingsIcon,
ImageIcon,
LinkedPageIcon, LinkedPageIcon,
LinkIcon, LinkIcon,
LoomLogoDuotoneIcon, LoomLogoDuotoneIcon,
@@ -190,24 +188,6 @@ export const defaultSlashMenuConfig: SlashMenuConfig = {
// --------------------------------------------------------- // ---------------------------------------------------------
// { groupName: 'Content & Media' }, // { groupName: 'Content & Media' },
{
name: 'Image',
description: 'Insert an image.',
icon: ImageIcon(),
tooltip: slashMenuToolTips['Image'],
group: `4_Content & Media@${index++}`,
when: ({ model }) =>
model.doc.schema.flavourSchemaMap.has('affine:image'),
action: ({ std }) => {
const [success, ctx] = std.command
.chain()
.pipe(getSelectedModelsCommand)
.pipe(insertImagesCommand, { removeEmptyLine: true })
.run();
if (success) ctx.insertedImageIds.catch(console.error);
},
},
{ {
name: 'Link', name: 'Link',
description: 'Add a bookmark for reference.', description: 'Add a bookmark for reference.',

View File

@@ -25,7 +25,6 @@ import { NewDocTooltip } from './new-doc';
import { NowTooltip } from './now'; import { NowTooltip } from './now';
import { NumberedListTooltip } from './numbered-list'; import { NumberedListTooltip } from './numbered-list';
import { PDFTooltip } from './pdf'; import { PDFTooltip } from './pdf';
import { PhotoTooltip } from './photo';
import { QuoteTooltip } from './quote'; import { QuoteTooltip } from './quote';
import { StrikethroughTooltip } from './strikethrough'; import { StrikethroughTooltip } from './strikethrough';
import { TextTooltip } from './text'; import { TextTooltip } from './text';
@@ -152,11 +151,6 @@ export const slashMenuToolTips: Record<string, SlashMenuTooltip> = {
caption: 'YouTube Video', caption: 'YouTube Video',
}, },
Image: {
figure: PhotoTooltip,
caption: 'Photo',
},
'X (Twitter)': { 'X (Twitter)': {
figure: TweetTooltip, figure: TweetTooltip,
caption: 'Tweet', caption: 'Tweet',

View File

@@ -9,7 +9,6 @@
"references": [ "references": [
{ "path": "../block-attachment" }, { "path": "../block-attachment" },
{ "path": "../block-embed" }, { "path": "../block-embed" },
{ "path": "../block-image" },
{ "path": "../block-latex" }, { "path": "../block-latex" },
{ "path": "../block-note" }, { "path": "../block-note" },
{ "path": "../block-surface" }, { "path": "../block-surface" },

View File

@@ -169,6 +169,7 @@ export const PackageList = [
'blocksuite/affine/components', 'blocksuite/affine/components',
'blocksuite/affine/model', 'blocksuite/affine/model',
'blocksuite/affine/shared', 'blocksuite/affine/shared',
'blocksuite/affine/widget-slash-menu',
'blocksuite/framework/block-std', 'blocksuite/framework/block-std',
'blocksuite/framework/global', 'blocksuite/framework/global',
'blocksuite/framework/inline', 'blocksuite/framework/inline',
@@ -490,7 +491,6 @@ export const PackageList = [
workspaceDependencies: [ workspaceDependencies: [
'blocksuite/affine/block-attachment', 'blocksuite/affine/block-attachment',
'blocksuite/affine/block-embed', 'blocksuite/affine/block-embed',
'blocksuite/affine/block-image',
'blocksuite/affine/block-latex', 'blocksuite/affine/block-latex',
'blocksuite/affine/block-note', 'blocksuite/affine/block-note',
'blocksuite/affine/block-surface', 'blocksuite/affine/block-surface',

View File

@@ -2476,6 +2476,7 @@ __metadata:
"@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-components": "workspace:*"
"@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-model": "workspace:*"
"@blocksuite/affine-shared": "workspace:*" "@blocksuite/affine-shared": "workspace:*"
"@blocksuite/affine-widget-slash-menu": "workspace:*"
"@blocksuite/block-std": "workspace:*" "@blocksuite/block-std": "workspace:*"
"@blocksuite/global": "workspace:*" "@blocksuite/global": "workspace:*"
"@blocksuite/icons": "npm:^2.2.1" "@blocksuite/icons": "npm:^2.2.1"
@@ -3034,7 +3035,6 @@ __metadata:
dependencies: dependencies:
"@blocksuite/affine-block-attachment": "workspace:*" "@blocksuite/affine-block-attachment": "workspace:*"
"@blocksuite/affine-block-embed": "workspace:*" "@blocksuite/affine-block-embed": "workspace:*"
"@blocksuite/affine-block-image": "workspace:*"
"@blocksuite/affine-block-latex": "workspace:*" "@blocksuite/affine-block-latex": "workspace:*"
"@blocksuite/affine-block-note": "workspace:*" "@blocksuite/affine-block-note": "workspace:*"
"@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*"