chore(editor): remove edgeless element toolbar (#10900)

This commit is contained in:
fundon
2025-03-20 02:08:21 +00:00
parent 831f290f84
commit 8b995ea420
71 changed files with 330 additions and 6449 deletions

View File

@@ -45,7 +45,7 @@ import {
actionToErrorResponse,
actionToGenerating,
actionToResponse,
getElementToolbar,
getToolbar,
} from './edgeless-response';
async function getContentFromEmbedSyncedDocModel(
@@ -400,7 +400,7 @@ export function actionToHandler<T extends keyof BlockSuitePresets.AIActions>(
trackerOptions
);
const elementToolbar = getElementToolbar(host);
const toolbar = getToolbar(host);
const isEmpty = selectedElements.length === 0;
const isCreateImageAction = id === 'createImage';
const isMakeItRealAction = !isCreateImageAction && id === 'makeItReal';
@@ -411,8 +411,8 @@ export function actionToHandler<T extends keyof BlockSuitePresets.AIActions>(
referenceElement = selectedBlocks.at(-1);
} else if (edgelessCopilot.visible && edgelessCopilot.selectionElem) {
referenceElement = edgelessCopilot.selectionElem;
} else if (elementToolbar.toolbarVisible) {
referenceElement = getElementToolbar(host);
} else if (toolbar?.dataset.open) {
referenceElement = toolbar;
} else if (!isEmpty) {
const lastSelected = selectedElements.at(-1)?.id;
if (!lastSelected) return;

View File

@@ -5,10 +5,6 @@ import {
EDGELESS_TEXT_BLOCK_MIN_WIDTH,
} from '@blocksuite/affine/blocks/edgeless-text';
import { addImages } from '@blocksuite/affine/blocks/image';
import {
EDGELESS_ELEMENT_TOOLBAR_WIDGET,
type EdgelessElementToolbarWidget,
} from '@blocksuite/affine/blocks/root';
import {
fitContent,
getSurfaceBlock,
@@ -26,6 +22,10 @@ import {
NoteDisplayMode,
} from '@blocksuite/affine/model';
import { TelemetryProvider } from '@blocksuite/affine/shared/services';
import {
AFFINE_TOOLBAR_WIDGET,
type AffineToolbarWidget,
} from '@blocksuite/affine/widgets/toolbar';
import {
ChatWithAiIcon,
DeleteIcon,
@@ -65,16 +65,14 @@ type ErrorConfig = Exclude<
null
>['errorStateConfig'];
export function getElementToolbar(
host: EditorHost
): EdgelessElementToolbarWidget {
export function getToolbar(host: EditorHost) {
const rootBlockId = host.doc.root?.id as string;
const elementToolbar = host.view.getWidget(
EDGELESS_ELEMENT_TOOLBAR_WIDGET,
const toolbar = host.view.getWidget(
AFFINE_TOOLBAR_WIDGET,
rootBlockId
) as EdgelessElementToolbarWidget;
) as AffineToolbarWidget;
return elementToolbar;
return toolbar.querySelector('editor-toolbar');
}
export function getTriggerEntry(host: EditorHost) {

View File

@@ -1,7 +1,3 @@
import type {
EdgelessElementToolbarWidget,
EdgelessRootBlockComponent,
} from '@blocksuite/affine/blocks/root';
import { noop } from '@blocksuite/affine/global/utils';
import type { DocMode } from '@blocksuite/affine/model';
import {
@@ -25,64 +21,6 @@ export function setupEdgelessCopilot(widget: EdgelessCopilotWidget) {
widget.groups = edgelessAIGroups;
}
export function setupEdgelessElementToolbarAIEntry(
widget: EdgelessElementToolbarWidget
) {
widget.registerEntry({
when: () => {
return true;
},
render: (edgeless: EdgelessRootBlockComponent) => {
const chain = edgeless.service.std.command.chain();
const filteredGroups = edgelessAIGroups.reduce((pre, group) => {
const filtered = group.items.filter(item =>
item.showWhen?.(chain, 'edgeless' as DocMode, edgeless.host)
);
if (filtered.length > 0) pre.push({ ...group, items: filtered });
return pre;
}, [] as AIItemGroupConfig[]);
if (filteredGroups.every(group => group.items.length === 0)) return null;
const handler = () => {
const aiPanel = getAIPanelWidget(edgeless.host);
if (aiPanel.config) {
aiPanel.config.generateAnswer = ({ finish, input }) => {
finish('success');
aiPanel.hide();
extractSelectedContent(edgeless.host)
.then(context => {
AIProvider.slots.requestSendWithChat.next({
input,
context,
host: edgeless.host,
});
})
.catch(console.error);
};
aiPanel.config.inputCallback = text => {
const copilotWidget = getEdgelessCopilotWidget(edgeless.host);
const panel = copilotWidget.shadowRoot?.querySelector(
'edgeless-copilot-panel'
);
if (panel instanceof HTMLElement) {
panel.style.visibility = text ? 'hidden' : 'visible';
}
};
}
};
return html`<edgeless-copilot-toolbar-entry
.host=${edgeless.host}
.groups=${edgelessAIGroups}
.onClick=${handler}
></edgeless-copilot-toolbar-entry>`;
},
});
}
export function edgelessToolbarAIEntryConfig(): ToolbarModuleConfig {
return {
actions: [

View File

@@ -2,10 +2,7 @@ import {
BlockFlavourIdentifier,
LifeCycleWatcher,
} from '@blocksuite/affine/block-std';
import {
EdgelessElementToolbarWidget,
EdgelessRootBlockSpec,
} from '@blocksuite/affine/blocks/root';
import { EdgelessRootBlockSpec } from '@blocksuite/affine/blocks/root';
import { ToolbarModuleExtension } from '@blocksuite/affine/shared/services';
import type { ExtensionType } from '@blocksuite/affine/store';
import type { FrameworkProvider } from '@toeverything/infra';
@@ -15,7 +12,6 @@ import { toolbarAIEntryConfig } from '../entries';
import {
edgelessToolbarAIEntryConfig,
setupEdgelessCopilot,
setupEdgelessElementToolbarAIEntry,
} from '../entries/edgeless/index';
import { setupSpaceAIEntry } from '../entries/space/setup-space';
import { CopilotTool } from '../tool/copilot-tool';
@@ -72,10 +68,6 @@ function getAIEdgelessRootWatcher(framework: FrameworkProvider) {
if (component instanceof EdgelessCopilotWidget) {
setupEdgelessCopilot(component);
}
if (component instanceof EdgelessElementToolbarWidget) {
setupEdgelessElementToolbarAIEntry(component);
}
});
}
}

View File

@@ -54,7 +54,6 @@ import { getSelectedModelsCommand } from '@blocksuite/affine/shared/commands';
import { ImageSelection } from '@blocksuite/affine/shared/selection';
import {
ActionPlacement,
FeatureFlagService,
GenerateDocUrlProvider,
isRemovedUserInfo,
OpenDocExtensionIdentifier,
@@ -316,8 +315,7 @@ function createToolbarMoreMenuConfigV2(baseUrl?: string) {
{
id: 'block-meta-display',
when: ctx => {
const featureFlag = ctx.std.get(FeatureFlagService);
const isEnabled = featureFlag.getFlag('enable_block_meta');
const isEnabled = ctx.features.getFlag('enable_block_meta');
if (!isEnabled) return false;
// only display when one block is selected by block selection