feat(editor): add more open doc options to editor toolbar (#9588)

fix AF-2036, AF-2092
This commit is contained in:
pengx17
2025-01-09 08:04:21 +00:00
parent 890a962196
commit f78857bb11
41 changed files with 558 additions and 271 deletions
@@ -9,6 +9,7 @@ export * from './font-loader';
export * from './generate-url-service';
export * from './native-clipboard-service';
export * from './notification-service';
export * from './open-doc-config';
export * from './page-viewport-service';
export * from './parse-url-service';
export * from './quick-search-service';
@@ -0,0 +1,59 @@
import { createIdentifier } from '@blocksuite/global/di';
import { CenterPeekIcon, ExpandFullIcon } from '@blocksuite/icons/lit';
import { type ExtensionType } from '@blocksuite/store';
import type { TemplateResult } from 'lit';
export type OpenDocMode =
| 'open-in-active-view'
| 'open-in-new-view'
| 'open-in-new-tab'
| 'open-in-center-peek';
// todo: later this will be used to generate the menu items.
// for now we only use it as a hint for whether or not to show the open doc buttons.
export interface OpenDocConfigItem {
type: OpenDocMode;
label: string;
icon: TemplateResult<1>;
}
export interface OpenDocConfig {
items: OpenDocConfigItem[];
}
export interface OpenDocService {
isAllowed: (mode: OpenDocMode) => boolean;
items: OpenDocConfig['items'];
}
export const OpenDocExtensionIdentifier = createIdentifier<OpenDocService>(
'AffineOpenDocExtension'
);
const defaultConfig: OpenDocConfig = {
items: [
{
type: 'open-in-active-view',
label: 'Open this doc',
icon: ExpandFullIcon(),
},
{
type: 'open-in-center-peek',
label: 'Open in center peek',
icon: CenterPeekIcon(),
},
],
};
export const OpenDocExtension = (config: OpenDocConfig): ExtensionType => ({
setup: di => {
di.override(OpenDocExtensionIdentifier, () => {
const allowedOpenDocModes = new Set(config.items.map(item => item.type));
return {
isAllowed: (mode: OpenDocMode) => allowedOpenDocModes.has(mode),
items: config.items,
};
});
},
});
export const DefaultOpenDocExtension = OpenDocExtension(defaultConfig);
@@ -44,6 +44,16 @@ export function isControlledKeyboardEvent(e: KeyboardEvent) {
return e.ctrlKey || e.metaKey || e.altKey;
}
export function isNewTabTrigger(event?: MouseEvent) {
return event
? (event.ctrlKey || event.metaKey || event.button === 1) && !event.altKey
: false;
}
export function isNewViewTrigger(event?: MouseEvent) {
return event ? (event.ctrlKey || event.metaKey) && event.altKey : false;
}
export function on<
T extends HTMLElement,
K extends keyof M,