Files
AFFiNE-Mirror/blocksuite/blocks/src/database-block/config.ts
T
2024-12-20 15:38:06 +08:00

61 lines
1.8 KiB
TypeScript

import type { MenuOptions } from '@blocksuite/affine-components/context-menu';
import {
type DatabaseBlockModel,
DatabaseBlockSchema,
} from '@blocksuite/affine-model';
import { DragHandleConfigExtension } from '@blocksuite/affine-shared/services';
import { captureEventTarget } from '@blocksuite/affine-shared/utils';
export interface DatabaseOptionsConfig {
configure: (model: DatabaseBlockModel, options: MenuOptions) => MenuOptions;
}
let canDrop = false;
export const DatabaseDragHandleOption = DragHandleConfigExtension({
flavour: DatabaseBlockSchema.model.flavour,
onDragMove: ({ state }) => {
const target = captureEventTarget(state.raw.target);
const database = target?.closest('affine-database');
if (!database) return false;
const view = database.view;
if (view && target instanceof HTMLElement && database.contains(target)) {
canDrop = view.showIndicator?.(state.raw) ?? false;
return false;
}
if (canDrop) {
view?.hideIndicator?.();
canDrop = false;
}
return false;
},
onDragEnd: ({ state, draggingElements, editorHost }) => {
const target = state.raw.target;
const targetEl = captureEventTarget(state.raw.target);
const database = targetEl?.closest('affine-database');
if (!database) {
return false;
}
const view = database.view;
if (
canDrop &&
view &&
view.moveTo &&
target instanceof HTMLElement &&
database.parentElement?.contains(target)
) {
const blocks = draggingElements.map(v => v.model);
editorHost.doc.moveBlocks(blocks, database.model);
blocks.forEach(model => {
view.moveTo?.(model.id, state.raw);
});
view.hideIndicator?.();
return false;
}
if (canDrop) {
view?.hideIndicator?.();
canDrop = false;
}
return false;
},
});