mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-30 16:49:55 +08:00
61 lines
1.8 KiB
TypeScript
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;
|
|
},
|
|
});
|