Files
edentext/src/lib/editor/tableRow.ts
T

38 lines
1.5 KiB
TypeScript

import { TableRow } from '@tiptap/extension-table';
// TableRow extended with a draggable row height.
//
// TipTap's stock TableRow has no height attribute. We add `rowHeight` (integer
// CSS px, unscaled document pixels at 96 dpi) and render it as `style="height: Npx"`
// on the <tr>. CSS treats a row's height as a *minimum* (the row grows if its
// content is taller), which is exactly the semantics we export — odf-kit gets a
// `style:min-row-height` (see export/odt.ts applyTableRowHeights). `null` means
// "no explicit height" → the row auto-sizes to its content (back-compat for
// documents saved before this feature).
//
// The actual drag interaction + live preview live in tableRowResize.ts; this file
// only owns the persisted attribute and its DOM/serialization mapping.
export const ResizableTableRow = TableRow.extend({
addAttributes() {
return {
...this.parent?.(),
rowHeight: {
default: null as number | null,
// Round-trip a pasted/imported <tr style="height: …px">. Non-px units are
// ignored (null) — the editor only ever writes px.
parseHTML: (element) => {
const h = (element as HTMLElement).style?.height;
if (!h) return null;
const m = /^([\d.]+)px$/.exec(h.trim());
return m ? Math.round(parseFloat(m[1])) : null;
},
renderHTML: (attributes) => {
const h = attributes.rowHeight as number | null;
return h ? { style: `height: ${h}px` } : {};
},
},
};
},
});