# quill-table-up **Repository Path**: cloudie/quill-table-up ## Basic Information - **Project Name**: quill-table-up - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-13 - **Last Updated**: 2025-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # quill-table-up Enhancement of quill table module [demo](https://zzxming.github.io/quill-table-up/) [quill@1.3.7 table module](https://github.com/zzxming/quill-table) - [x] complete UI operation process - [x] insert/delete row/column/table; merge/split cells - [x] support all origin quill formats - [x] control cells width/height/border/background color - [x] 100 percent table width or fixed pixel width - [x] line break in cells - [x] redo and undo - [x] support whole table align left/center/right - [x] `` `` `` `` support ## Usage ```sh npm install quill-table-up ``` > the registe module name is used internal. so if you want to change it, place use the function [`updateTableConstants`](https://github.com/zzxming/quill-table-up?tab=readme-ov-file#change-internal-constants-variable) ```js import Quill from 'quill'; import TableUp, { defaultCustomSelect, TableAlign, TableMenuContextmenu, TableResizeBox, TableResizeScale, TableSelection, TableVirtualScrollbar } from 'quill-table-up'; import 'quill/dist/quill.snow.css'; import 'quill-table-up/index.css'; // If using the default customSelect option. You need to import this css import 'quill-table-up/table-creator.css'; Quill.register({ [`modules/${TableUp.moduleName}`]: TableUp }, true); // or // Quill.register({ 'modules/table-up': TableUp }, true); const quill = new Quill('#editor', { // ... modules: { // ... toolbar: [ // ... [ // use picker to enable the customSelect option { [TableUp.toolName]: [] } ], ], [TableUp.moduleName]: { customSelect: defaultCustomSelect, modules: [ { module: TableVirtualScrollbar }, { module: TableAlign }, { module: TableResizeLine }, { module: TableResizeScale }, { module: TableSelection }, { module: TableMenuContextmenu, }, ], }, }, }); ``` ## Options **Full options usage see [demo](https://github.com/zzxming/quill-table-up/blob/master/docs/index.js#L38)** | Attribute | Description | Type | Default | | ------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------ | | full | if set `true`. width max will be 100% | `boolean` | `false` | | fullSwitch | enable to choose insert a full width table | `boolean` | `true` | | texts | the text used to create the table | `TableTextOptions` | `defaultTexts` | | customSelect | display a custom select to custom row and column number add a table. module provides default selector `defaultCustomSelect` | `(tableModule: TableUp, picker: Picker) => Promise \| HTMLElement` | - | | customBtn | display a custom button to custom row and column number add a table. it only when use `defaultCustomSelect` will effect | `boolean` | `false` | | icon | picker svg icon string. it will set with `innerHTML` | `string` | `origin table icon` | | autoMergeCell | empty row or column will auto merge to one | `boolean` | `true` | | modules | the module plugin to help user control about table operate. see [`Export Internal Module`](#export-internal-module) | `[]` | `{ module: Contstructor, options: any }[]` | > I'm not suggest to use `TableVirtualScrollbar` and `TableResizeLine` at same time, because it have a little conflict when user hover on it. Just like the first editor in [demo](https://zzxming.github.io/quill-table-up/) > If you doesn't use `TableVirtualScrollbar`, you may need to set css `.ql-editor .ql-table-wrapper { scrollbar-width: auto; }` to display the browser origin scrollbar.
default value ```ts const defaultTexts = { fullCheckboxText: 'Insert full width table', customBtnText: 'Custom', confirmText: 'Confirm', cancelText: 'Cancel', rowText: 'Row', colText: 'Column', notPositiveNumberError: 'Please enter a positive integer', custom: 'Custom', clear: 'Clear', transparent: 'Transparent', perWidthInsufficient: 'The percentage width is insufficient. To complete the operation, the table needs to be converted to a fixed width. Do you want to continue?', InsertTop: 'Insert a row above', InsertRight: 'Insert a column right', InsertBottom: 'Insert a row below', InsertLeft: 'Insert a column Left', MergeCell: 'Merge Cell', SplitCell: 'Split Cell', DeleteRow: 'Delete Row', DeleteColumn: 'Delete Column', DeleteTable: 'Delete table', BackgroundColor: 'Set background color', BorderColor: 'Set border color', SwitchWidth: 'Switch table width', InsertCaption: 'Insert table caption', ToggleTdBetweenTh: 'Toggle td between th', }; ```
## Export Internal Module ### TableSelection The table cell selection handler #### Options | Attribute | Description | Type | Default | | ----------- | --------------------- | -------- | --------- | | selectColor | selector border color | `string` | `#0589f3` | ### TableResizeLine / TableResizeBox The table cell resize handler ### TableMenuContextmenu / TableMenuSelect The table operate menu > This module needs to be used together with `TableSelection` #### Options | Attribute | Description | Type | Default | | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ----------------------- | | tipText | when `tableMenuClass` set `TableUp.TableMenuSelect`, display tip text when hover icon. when `tableMenuClass` set `TableUp.TableMenuContextmenu`, display tip text after icon | `boolean` | `true` | | localstorageKey | used color save localstorage key | `string` | `__table-bg-used-color` | | tools | menu items | `Tool[]` | `defaultTools` | | defaultColorMap | color map | `string[][]` | in source code |
types and default value ```ts interface ToolOption { name: string; icon: string | ((tableModule: TableUp) => HTMLElement); tip?: string; isColorChoose?: boolean; // trigger a color picker first. need set `key` key?: string; // the style name to set on td. handle: (this: TableMenu, tableModule: TableUp, selectedTds: TableCellInnerFormat[], e: Event | string) => void; } interface ToolOptionBreak { name: 'break'; } type Tool = ToolOption | ToolOptionBreak; const tableMenuTools: Record = { Break: { name: 'break', }, CopyCell: { name: 'CopyCell', tip: 'Copy cell', icon: Copy, handle: (tableModule, selectedTds) => {}, }, CutCell: { name: 'CutCell', tip: 'Cut cell', icon: Cut, handle: (tableModule, selectedTds) => {}, }, InsertTop: { name: 'InsertTop', icon: InsertTop, tip: 'Insert row above', handle: (tableModule, selectedTds) => {}, }, InsertRight: { name: 'InsertRight', icon: InsertRight, tip: 'Insert column right', handle: (tableModule, selectedTds) => {}, }, InsertBottom: { name: 'InsertBottom', icon: InsertBottom, tip: 'Insert row below', handle: (tableModule, selectedTds) => {}, }, InsertLeft: { name: 'InsertLeft', icon: InsertLeft, tip: 'Insert column Left', handle: (tableModule, selectedTds) => {}, }, MergeCell: { name: 'MergeCell', icon: MergeCell, tip: 'Merge Cell', handle: (tableModule, selectedTds) => {}, }, SplitCell: { name: 'SplitCell', icon: SplitCell, tip: 'Split Cell', handle: (tableModule, selectedTds) => {}, }, DeleteRow: { name: 'DeleteRow', icon: RemoveRow, tip: 'Delete Row', handle: (tableModule, selectedTds) => {}, }, DeleteColumn: { name: 'DeleteColumn', icon: RemoveColumn, tip: 'Delete Column', handle: (tableModule, selectedTds) => {}, }, DeleteTable: { name: 'DeleteTable', icon: RemoveTable, tip: 'Delete table', handle: (tableModule, selectedTds) => {}, }, BackgroundColor: { name: 'BackgroundColor', icon: Background, isColorChoose: true, tip: 'Set background color', key: 'background-color', handle: (tableModule, selectedTds, color) => {}, }, BorderColor: { name: 'BorderColor', icon: Border, isColorChoose: true, tip: 'Set border color', key: 'border-color', handle: (tableModule, selectedTds, color) => {}, }, SwitchWidth: { name: 'SwitchWidth', icon: AutoFull, tip: 'Switch table width', handle: (tableModule) => {}, }, InsertCaption: { name: 'InsertCaption', icon: TableHead, tip: 'Insert table caption', handle: (tableModule) => {}, }, ToggleTdBetweenTh: { name: 'ToggleTdBetweenTh', icon: ConvertCell, tip: 'Toggle td between th', handle: (tableModule, selectedTds) => {}, }, }; const defaultTools = [ tableMenuTools.InsertTop, tableMenuTools.InsertRight, tableMenuTools.InsertBottom, tableMenuTools.InsertLeft, tableMenuTools.Break, tableMenuTools.MergeCell, tableMenuTools.SplitCell, tableMenuTools.Break, tableMenuTools.DeleteRow, tableMenuTools.DeleteColumn, tableMenuTools.DeleteTable, tableMenuTools.Break, tableMenuTools.BackgroundColor, tableMenuTools.BorderColor, ]; ```
### TableResizeScale Equal scale table cell handler #### Options | Attribute | Description | Type | Default | | --------- | ------------------------ | -------- | ------- | | blockSize | resize handle block size | `number` | `12` | ### TableAlign The table alignment tool ### TableVirtualScrollbar The table virtual scrollbar ## Migrate to 3.x In version 3.x, only changed the way options are passed in, the relevant additional modules are used in the `modules` option. e.g. ```ts new Quill('#editor', { theme: 'snow', modules: { toolbar: toolbarConfig, [TableUp.moduleName]: { customSelect: defaultCustomSelect, customBtn: true, modules: [ { module: TableVirtualScrollbar }, { module: TableAlign }, { module: TableResizeLine }, { module: TableResizeScale, options: { blockSize: 12, }, }, { module: TableSelection, options: { selectColor: '#00ff8b4d', }, }, { module: TableMenuContextmenu, options: { localstorageKey: 'used-color', tipText: true, tools: [], defaultColorMap: [], }, }, ], }, }, }); ``` You can use `quill.getModule(TableUp.moduleName).getModule(TableSelection.moduleName)` to get the TableSelection instance in the TableUp ### Other - add new attributes `tag` and `wrap-tag` in `table-up-cell-inner` which to represent parent label types ## Overrides If you need to rewrite extends from quill `Block` or `Scroll` blot. you need to use `Quill.import()` after `TableUp` registed. beacuse module internal rewrite some functions, but those change only effect formats about table. `Header`, `List'`, `Blockquote` and `CodeBlock` have been overrides. If you need to rewrite them, you need to rewrite them before `TableUp` registed. Please read [source code](https://github.com/zzxming/quill-table-up/tree/master/src/formats/overrides) to know those change. ```ts import { BlockOverride, ScrollOverride, } from 'quill-table-up'; class ScrollBlot extends ScrollOverride { // ... } ``` ## Other ### Change Internal Constants Variable If it's not necessary, you should import constants variable from `quill-table-up` directly but not edit it. ```ts import { blotName, tableUpEvent, tableUpInternal, tableUpSize, } from 'quill-table-up'; ```
You can change internal constants variable by importing `updateTableConstants` from `quill-table-up` and call it before `TableUp` registed. It helps to migrate from other table modules with the same data structure. - [full variable demo](https://github.com/zzxming/quill-table-up/blob/master/docs/update-constants.js) - [change blot name that in delta demo](https://github.com/zzxming/quill-table-up/blob/master/docs/update-formats-value.js) If you change the `TableWrapperFormat` blot name, you also need to add new css style to make toolbar icon have correct style. ```css /* change 'table-up' to your new blot name */ .ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up { width: 28px; } .ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-label { padding: 2px 4px; } .ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-label svg { position: static; margin-top: 0; } ```