mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-25 18:26:05 +08:00
refactor(editor): image slash menu config extension (#10674)
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
32
blocksuite/affine/block-image/src/configs/slash-menu.ts
Normal file
32
blocksuite/affine/block-image/src/configs/slash-menu.ts
Normal 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);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
@@ -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];
|
||||||
|
|||||||
@@ -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" },
|
||||||
|
|||||||
@@ -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:*",
|
||||||
|
|||||||
@@ -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.',
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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" },
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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:*"
|
||||||
|
|||||||
Reference in New Issue
Block a user