import type { Ctx } from '@milkdown/ctx' import type { Node } from '@milkdown/prose/model' import type { EditorView } from '@milkdown/prose/view' import { defineComponent, ref, type VNodeRef, h, onMounted, type Ref, } from 'vue' import type { TableBlockConfig } from '../config' import type { CellIndex, DragInfo, Refs } from './types' import { Icon } from '../../__internal__/components/icon' import { keepAlive } from '../../__internal__/keep-alive' import { useDragHandlers } from './drag' import { useOperation } from './operation' import { usePointerHandlers } from './pointer' import { recoveryStateBetweenUpdate } from './utils' keepAlive(h) type TableBlockProps = { view: EditorView ctx: Ctx getPos: () => number | undefined config: TableBlockConfig onMount: (div: Element) => void node: Ref } export const TableBlock = defineComponent({ props: { view: { type: Object, required: true, }, ctx: { type: Object, required: true, }, getPos: { type: Function, required: true, }, config: { type: Object, required: true, }, onMount: { type: Function, required: true, }, node: { type: Object, required: true, }, }, setup({ view, node, ctx, getPos, config, onMount }) { const contentWrapperRef = ref() const contentWrapperFunctionRef: VNodeRef = (div) => { if (div == null) return if (div instanceof HTMLElement) { contentWrapperRef.value = div onMount(div) } else { contentWrapperRef.value = undefined } } const colHandleRef = ref() const rowHandleRef = ref() const xLineHandleRef = ref() const yLineHandleRef = ref() const tableWrapperRef = ref() const dragPreviewRef = ref() const hoverIndex = ref([0, 0]) const lineHoverIndex = ref([-1, -1]) const dragInfo = ref() const refs: Refs = { dragPreviewRef, tableWrapperRef, contentWrapperRef, yLineHandleRef, xLineHandleRef, colHandleRef, rowHandleRef, hoverIndex, lineHoverIndex, dragInfo, } const { pointerLeave, pointerMove } = usePointerHandlers(refs, view) const { dragRow, dragCol } = useDragHandlers(refs, ctx, getPos) const { onAddRow, onAddCol, selectCol, selectRow, deleteSelected, onAlign, } = useOperation(refs, ctx, getPos) onMounted(() => { requestAnimationFrame(() => { // This is a wordaround to keep the popover open when click the select col/row button if (view.editable) recoveryStateBetweenUpdate(refs, view, node.value) }) }) return () => { return (
e.preventDefault()} onDragover={(e) => e.preventDefault()} onDragleave={(e) => e.preventDefault()} onPointermove={pointerMove} onPointerleave={pointerLeave} >
e.stopPropagation()} onPointermove={(e: PointerEvent) => e.stopPropagation()} ref={colHandleRef} >
e.stopPropagation()} >
e.stopPropagation()} onPointermove={(e: PointerEvent) => e.stopPropagation()} ref={rowHandleRef} >
e.stopPropagation()} >
e.stopPropagation()} ref={xLineHandleRef} >
e.stopPropagation()} ref={yLineHandleRef} >
) } }, })