UNPKG

@ckeditor/ckeditor5-table

Version:

Table feature for CKEditor 5.

268 lines (267 loc) • 9.88 kB
/** * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options */ import { Plugin, type Editor, type PluginDependenciesOf } from "@ckeditor/ckeditor5-core"; import type { ViewDowncastWriter, ModelElement, ModelWriter, ViewElement } from "@ckeditor/ckeditor5-engine"; import { TableEditing } from "../tableediting.js"; import { TableUtils } from "../tableutils.js"; /** * The table column resize editing plugin. */ export declare class TableColumnResizeEditing extends Plugin { /** * A flag indicating if the column resizing is in progress. * * @observable * @internal */ _isResizingActive: boolean; /** * A flag indicating if the column resizing is allowed. It is not allowed if the editor is in read-only * or comments-only mode or the `TableColumnResize` plugin is disabled. * * @observable * @internal */ _isResizingAllowed: boolean; /** * A temporary storage for the required data needed to correctly calculate the widths of the resized columns. This storage is * initialized when column resizing begins, and is purged upon completion. */ private _resizingData; /** * DOM emitter. */ private _domEmitter; /** * A local reference to the {@link module:table/tableutils~TableUtils} plugin. */ private _tableUtilsPlugin; /** * Starting mouse position data used to add a threshold to the resizing process. */ private _initialMouseEventData; /** * @inheritDoc */ static get requires(): PluginDependenciesOf<[TableEditing, TableUtils]>; /** * @inheritDoc */ static get pluginName(): "TableColumnResizeEditing"; /** * @inheritDoc * @internal */ static get licenseFeatureCode(): string; /** * @inheritDoc */ static override get isOfficialPlugin(): true; /** * @inheritDoc */ static override get isPremiumPlugin(): true; /** * @inheritDoc */ constructor(editor: Editor); /** * @inheritDoc */ init(): void; /** * @inheritDoc */ afterInit(): void; /** * @inheritDoc */ override destroy(): void; /** * The table for which a column resize is currently in progress, or `null` if no resize is active. * Only one table can be resized at a time. */ get resizingTable(): ModelElement | null; /** * Returns a 'tableColumnGroup' element from the 'table'. * * @param element A 'table' or 'tableColumnGroup' element. * @returns A 'tableColumnGroup' element. */ getColumnGroupElement(element: ModelElement): ModelElement | undefined; /** * Returns an array of 'tableColumn' elements. * * @param element A 'table' or 'tableColumnGroup' element. * @returns An array of 'tableColumn' elements. */ getTableColumnElements(element: ModelElement): Array<ModelElement>; /** * Returns an array of table column widths. * * @param element A 'table' or 'tableColumnGroup' element. * @returns An array of table column widths. */ getTableColumnsWidths(element: ModelElement): Array<string>; /** * Returns the table and the sorted, unique indexes of the columns covered by the given cells (a `colspan` cell * covers several columns). Returns `null` when the selection cannot be mapped onto columns - a non-resized table * or an irregular column structure. * * @param cells An array of 'tableCell' model elements. */ getColumnIndexesForCells(cells: Array<ModelElement>): { table: ModelElement; columnIndexes: Array<number>; } | null; /** * Applies the given width to every column in `columnIndexes`, keeping the whole table's width mode consistent * (see {@link module:table/tablecolumnresize/utils~isTableWidthInPixels}). * * @param writer A model writer instance. * @param table A 'table' model element. * @param columnIndexes Indexes of the columns the width is applied to. * @param value The width to apply. May be expressed in pixels or as a percentage. */ applyColumnWidths(writer: ModelWriter, table: ModelElement, columnIndexes: Array<number>, value: string): void; /** * Converts the column widths of a resized table to the unit of the table's own width (`px` or `%`), so a table * width change (in the table properties) also switches the columns' unit. It is a no-op when the table is not * resized or the columns already use that unit. */ private _reconcileColumnUnits; /** * Applies a column width in the percentage mode: the target column gets the (clamped) percentage and the remaining * columns are redistributed proportionally so that all the widths keep summing up to 100%. */ private _applyPercentageColumnWidths; /** * Applies a width to the target columns in the percentage mode when the selection reaches the last column. As * there is no next column to balance against, the table itself grows or shrinks (like dragging the last column's * right edge): every other column keeps its absolute width, so expressed against the resized table their * percentages scale, and the table's own width scales by the inverse. */ private _growTableToColumnWidths; /** * Applies `width` to whichever element currently represents the table's actual width - by default the * widget's `<figure>`. Passing `null` clears it instead of setting anything. * * @internal */ _setResizingTableWidth(writer: ViewDowncastWriter, viewFigure: ViewElement, width: string | null): void; /** * Returns the table's current actual width, read from whichever element holds it - by default the * widget's `<figure>`. * * @internal */ _getResizingTableWidth(viewFigure: ViewElement): string; /** * Registers new attributes for a table model element. */ private _extendSchema; /** * Registers table column resize post-fixer. * * It checks if the change from the differ concerns a table-related element or attribute. For detected changes it: * * Adjusts the `columnWidths` attribute to guarantee that the sum of the widths from all columns is 100%. * * Checks if the `columnWidths` attribute gets updated accordingly after columns have been added or removed. */ private _registerPostFixer; /** * Registers table column resize converters. */ private _registerConverters; /** * Registers listeners to handle resizing process. */ private _registerResizingListeners; /** * Calculate and set `top` and `bottom` styles to the column resizer element to fit the height of the table. * * @param viewResizer The column resizer element. */ private _recalculateResizerElement; /** * Remove `top` and `bottom` styles of the column resizer element. * * @param viewResizer The column resizer element. */ private _resetResizerStyles; /** * Handles the `mouseover` event on column resizer element. * Recalculates the `top` and `bottom` styles of the column resizer element to fit the height of the table. * * @param eventInfo An object containing information about the fired event. * @param domEventData The data related to the DOM event. */ private _onMouseOverHandler; /** * Handles the `mouseout` event on column resizer element. * When resizing is not active, it resets the `top` and `bottom` styles of the column resizer element. * * @param eventInfo An object containing information about the fired event. * @param domEventData The data related to the DOM event. */ private _onMouseOutHandler; /** * Handles the `mousedown` event on column resizer element: * * calculates the initial column pixel widths, * * inserts the `<colgroup>` element if it is not present in the `<table>`, * * puts the necessary data in the temporary storage, * * applies the attributes to the `<table>` view element. * * @param eventInfo An object containing information about the fired event. * @param domEventData The data related to the DOM event. */ private _onMouseDownHandler; /** * Starts the resizing process after the threshold is reached. */ private _startResizingAfterThreshold; /** * Handles the `mousemove` event. * * If resizing process is not in progress, it does nothing. * * If resizing is active but not allowed, it stops the resizing process instantly calling the `mousedown` event handler. * * Otherwise it dynamically updates the widths of the resized columns. * * @param eventInfo An object containing information about the fired event. * @param mouseEventData The native DOM event. */ private _onMouseMoveHandler; /** * Handles the `mouseup` event. * * If resizing process is not in progress, it does nothing. * * If resizing is active but not allowed, it cancels the resizing process restoring the original widths. * * Otherwise it propagates the changes from view to the model by executing the adequate commands. */ private _onMouseUpHandler; /** * Retrieves and returns required data needed for the resizing process. * * @param domEventData The data of the `mousedown` event. * @param columnWidths The current widths of the columns. * @returns The data needed for the resizing process. */ private _getResizingData; /** * Registers a listener ensuring that each resizable cell have a resizer handle. */ private _registerResizerInserter; } /** * Given the table width a drag would naturally produce, returns the width that should actually be applied * once snapping and growth resistance around the container's width are taken into account: * * * if the natural width lands close to the container's width (on either side), it's pulled to exactly * match it, * * if the natural width is past the container's width, it stays pinned at the container's width until the * drag has gone far enough beyond it (the "resistance" zone) - past that point it keeps growing 1:1, * continuing smoothly from where the resistance was overcome instead of jumping, * * shrinking below the container's width is never resisted, only snapped when close. * * @internal */ export declare function applyContainerWidthResistance(naturalTableWidth: number, containerWidth: number): number;