@ckeditor/ckeditor5-table 45.0.0-alpha.0 → 45.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/table.js +1 -1
- package/build/translations/ar.js +1 -1
- package/build/translations/bg.js +1 -1
- package/build/translations/bn.js +1 -1
- package/build/translations/ca.js +1 -1
- package/build/translations/cs.js +1 -1
- package/build/translations/da.js +1 -1
- package/build/translations/de.js +1 -1
- package/build/translations/el.js +1 -1
- package/build/translations/es.js +1 -1
- package/build/translations/et.js +1 -1
- package/build/translations/fi.js +1 -1
- package/build/translations/fr.js +1 -1
- package/build/translations/he.js +1 -1
- package/build/translations/hi.js +1 -1
- package/build/translations/hu.js +1 -1
- package/build/translations/id.js +1 -1
- package/build/translations/it.js +1 -1
- package/build/translations/ja.js +1 -1
- package/build/translations/ko.js +1 -1
- package/build/translations/lt.js +1 -1
- package/build/translations/lv.js +1 -1
- package/build/translations/ms.js +1 -1
- package/build/translations/nl.js +1 -1
- package/build/translations/no.js +1 -1
- package/build/translations/pl.js +1 -1
- package/build/translations/pt-br.js +1 -1
- package/build/translations/pt.js +1 -1
- package/build/translations/ro.js +1 -1
- package/build/translations/ru.js +1 -1
- package/build/translations/sk.js +1 -1
- package/build/translations/sr.js +1 -1
- package/build/translations/sv.js +1 -1
- package/build/translations/th.js +1 -1
- package/build/translations/tr.js +1 -1
- package/build/translations/uk.js +1 -1
- package/build/translations/vi.js +1 -1
- package/build/translations/zh-cn.js +1 -1
- package/build/translations/zh.js +1 -1
- package/ckeditor5-metadata.json +2 -2
- package/dist/index-content.css +0 -4
- package/dist/index-editor.css +9 -3
- package/dist/index.css +13 -11
- package/dist/index.css.map +1 -1
- package/dist/index.js +278 -50
- package/dist/index.js.map +1 -1
- package/dist/translations/ar.js +1 -1
- package/dist/translations/ar.umd.js +1 -1
- package/dist/translations/bg.js +1 -1
- package/dist/translations/bg.umd.js +1 -1
- package/dist/translations/bn.js +1 -1
- package/dist/translations/bn.umd.js +1 -1
- package/dist/translations/ca.js +1 -1
- package/dist/translations/ca.umd.js +1 -1
- package/dist/translations/cs.js +1 -1
- package/dist/translations/cs.umd.js +1 -1
- package/dist/translations/da.js +1 -1
- package/dist/translations/da.umd.js +1 -1
- package/dist/translations/de.js +1 -1
- package/dist/translations/de.umd.js +1 -1
- package/dist/translations/el.js +1 -1
- package/dist/translations/el.umd.js +1 -1
- package/dist/translations/es.js +1 -1
- package/dist/translations/es.umd.js +1 -1
- package/dist/translations/et.js +1 -1
- package/dist/translations/et.umd.js +1 -1
- package/dist/translations/fi.js +1 -1
- package/dist/translations/fi.umd.js +1 -1
- package/dist/translations/fr.js +1 -1
- package/dist/translations/fr.umd.js +1 -1
- package/dist/translations/he.js +1 -1
- package/dist/translations/he.umd.js +1 -1
- package/dist/translations/hi.js +1 -1
- package/dist/translations/hi.umd.js +1 -1
- package/dist/translations/hu.js +1 -1
- package/dist/translations/hu.umd.js +1 -1
- package/dist/translations/id.js +1 -1
- package/dist/translations/id.umd.js +1 -1
- package/dist/translations/it.js +1 -1
- package/dist/translations/it.umd.js +1 -1
- package/dist/translations/ja.js +1 -1
- package/dist/translations/ja.umd.js +1 -1
- package/dist/translations/ko.js +1 -1
- package/dist/translations/ko.umd.js +1 -1
- package/dist/translations/lt.js +1 -1
- package/dist/translations/lt.umd.js +1 -1
- package/dist/translations/lv.js +1 -1
- package/dist/translations/lv.umd.js +1 -1
- package/dist/translations/ms.js +1 -1
- package/dist/translations/ms.umd.js +1 -1
- package/dist/translations/nl.js +1 -1
- package/dist/translations/nl.umd.js +1 -1
- package/dist/translations/no.js +1 -1
- package/dist/translations/no.umd.js +1 -1
- package/dist/translations/pl.js +1 -1
- package/dist/translations/pl.umd.js +1 -1
- package/dist/translations/pt-br.js +1 -1
- package/dist/translations/pt-br.umd.js +1 -1
- package/dist/translations/pt.js +1 -1
- package/dist/translations/pt.umd.js +1 -1
- package/dist/translations/ro.js +1 -1
- package/dist/translations/ro.umd.js +1 -1
- package/dist/translations/ru.js +1 -1
- package/dist/translations/ru.umd.js +1 -1
- package/dist/translations/sk.js +1 -1
- package/dist/translations/sk.umd.js +1 -1
- package/dist/translations/sr.js +1 -1
- package/dist/translations/sr.umd.js +1 -1
- package/dist/translations/sv.js +1 -1
- package/dist/translations/sv.umd.js +1 -1
- package/dist/translations/th.js +1 -1
- package/dist/translations/th.umd.js +1 -1
- package/dist/translations/tr.js +1 -1
- package/dist/translations/tr.umd.js +1 -1
- package/dist/translations/uk.js +1 -1
- package/dist/translations/uk.umd.js +1 -1
- package/dist/translations/vi.js +1 -1
- package/dist/translations/vi.umd.js +1 -1
- package/dist/translations/zh-cn.js +1 -1
- package/dist/translations/zh-cn.umd.js +1 -1
- package/dist/translations/zh.js +1 -1
- package/dist/translations/zh.umd.js +1 -1
- package/lang/translations/ar.po +7 -7
- package/lang/translations/bg.po +7 -7
- package/lang/translations/bn.po +7 -7
- package/lang/translations/ca.po +7 -7
- package/lang/translations/cs.po +7 -7
- package/lang/translations/da.po +7 -7
- package/lang/translations/de.po +7 -7
- package/lang/translations/el.po +7 -7
- package/lang/translations/es.po +7 -7
- package/lang/translations/et.po +7 -7
- package/lang/translations/fi.po +7 -7
- package/lang/translations/fr.po +7 -7
- package/lang/translations/he.po +7 -7
- package/lang/translations/hi.po +7 -7
- package/lang/translations/hu.po +7 -7
- package/lang/translations/id.po +7 -7
- package/lang/translations/it.po +7 -7
- package/lang/translations/ja.po +7 -7
- package/lang/translations/ko.po +7 -7
- package/lang/translations/lt.po +7 -7
- package/lang/translations/lv.po +7 -7
- package/lang/translations/ms.po +7 -7
- package/lang/translations/nl.po +7 -7
- package/lang/translations/no.po +7 -7
- package/lang/translations/pl.po +7 -7
- package/lang/translations/pt-br.po +7 -7
- package/lang/translations/pt.po +7 -7
- package/lang/translations/ro.po +7 -7
- package/lang/translations/ru.po +7 -7
- package/lang/translations/sk.po +7 -7
- package/lang/translations/sr.po +7 -7
- package/lang/translations/sv.po +7 -7
- package/lang/translations/th.po +7 -7
- package/lang/translations/tr.po +7 -7
- package/lang/translations/uk.po +7 -7
- package/lang/translations/vi.po +7 -7
- package/lang/translations/zh-cn.po +7 -7
- package/lang/translations/zh.po +7 -7
- package/package.json +9 -9
- package/src/converters/tableproperties.d.ts +5 -1
- package/src/converters/tableproperties.js +27 -5
- package/src/tablecellproperties/commands/tablecellpropertycommand.d.ts +11 -1
- package/src/tablecellproperties/commands/tablecellpropertycommand.js +32 -2
- package/src/tablecellproperties/tablecellpropertiesediting.js +13 -9
- package/src/tablecellproperties/tablecellpropertiesui.d.ts +13 -1
- package/src/tablecellproperties/tablecellpropertiesui.js +36 -9
- package/src/tablecolumnresize/tablecolumnresizeediting.d.ts +28 -0
- package/src/tablecolumnresize/tablecolumnresizeediting.js +81 -2
- package/src/tablelayout.d.ts +1 -1
- package/src/tablelayout.js +1 -1
- package/src/tableproperties/commands/tablepropertycommand.d.ts +11 -1
- package/src/tableproperties/commands/tablepropertycommand.js +15 -1
- package/src/tableproperties/tablepropertiesediting.js +53 -12
- package/src/tableproperties/tablepropertiesui.d.ts +13 -1
- package/src/tableproperties/tablepropertiesui.js +30 -8
- package/src/tableproperties/ui/tablepropertiesview.d.ts +2 -2
- package/src/utils/table-properties.d.ts +3 -3
- package/src/utils/ui/table-properties.js +7 -1
- package/theme/tablecolumnresize.css +0 -10
- package/theme/tablelayout.css +13 -1
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @module table/tablecolumnresize/tablecolumnresizeediting
|
|
7
7
|
*/
|
|
8
8
|
import { throttle, isEqual } from 'es-toolkit/compat';
|
|
9
|
-
import { global, DomEmitterMixin } from 'ckeditor5/src/utils.js';
|
|
9
|
+
import { global, DomEmitterMixin, Rect, toUnit } from 'ckeditor5/src/utils.js';
|
|
10
10
|
import { Plugin } from 'ckeditor5/src/core.js';
|
|
11
11
|
import MouseEventsObserver from '../../src/tablemouse/mouseeventsobserver.js';
|
|
12
12
|
import TableEditing from '../tableediting.js';
|
|
@@ -16,6 +16,7 @@ import TableWidthsCommand from './tablewidthscommand.js';
|
|
|
16
16
|
import { downcastTableResizedClass, upcastColgroupElement } from './converters.js';
|
|
17
17
|
import { clamp, createFilledArray, sumArray, getColumnEdgesIndexes, getChangedResizedTables, getColumnMinWidthAsPercentage, getElementWidthInPixels, getTableWidthInPixels, normalizeColumnWidths, toPrecision, getDomCellOuterWidth, updateColumnElements, getColumnGroupElement, getTableColumnElements, getTableColumnsWidths } from './utils.js';
|
|
18
18
|
import { COLUMN_MIN_WIDTH_IN_PIXELS, COLUMN_RESIZE_DISTANCE_THRESHOLD } from './constants.js';
|
|
19
|
+
const toPx = /* #__PURE__ */ toUnit('px');
|
|
19
20
|
/**
|
|
20
21
|
* The table column resize editing plugin.
|
|
21
22
|
*/
|
|
@@ -326,10 +327,83 @@ export default class TableColumnResizeEditing extends Plugin {
|
|
|
326
327
|
_registerResizingListeners() {
|
|
327
328
|
const editingView = this.editor.editing.view;
|
|
328
329
|
editingView.addObserver(MouseEventsObserver);
|
|
330
|
+
editingView.document.on('mouseover', this._onMouseOverHandler.bind(this), { priority: 'high' });
|
|
329
331
|
editingView.document.on('mousedown', this._onMouseDownHandler.bind(this), { priority: 'high' });
|
|
332
|
+
editingView.document.on('mouseout', this._onMouseOutHandler.bind(this), { priority: 'high' });
|
|
330
333
|
this._domEmitter.listenTo(global.window.document, 'mousemove', throttle(this._onMouseMoveHandler.bind(this), 50));
|
|
331
334
|
this._domEmitter.listenTo(global.window.document, 'mouseup', this._onMouseUpHandler.bind(this));
|
|
332
335
|
}
|
|
336
|
+
/**
|
|
337
|
+
* Calculate and set `top` and `bottom` styles to the column resizer element to fit the height of the table.
|
|
338
|
+
*
|
|
339
|
+
* @param viewResizer The column resizer element.
|
|
340
|
+
*/
|
|
341
|
+
_recalculateResizerElement(viewResizer) {
|
|
342
|
+
const editor = this.editor;
|
|
343
|
+
const domConverter = editor.editing.view.domConverter;
|
|
344
|
+
// Get DOM target figure ancestor element.
|
|
345
|
+
const domTable = domConverter.mapViewToDom(viewResizer.findAncestor('table'));
|
|
346
|
+
// Get DOM table cell element.
|
|
347
|
+
const domCell = domConverter.mapViewToDom(viewResizer.findAncestor(item => ['td', 'th'].includes(item.name)));
|
|
348
|
+
const rectTable = new Rect(domTable);
|
|
349
|
+
const rectCell = new Rect(domCell);
|
|
350
|
+
// Calculate the top, and bottom positions of the column resizer element.
|
|
351
|
+
const targetTopPosition = toPx(Number((rectTable.top - rectCell.top).toFixed(4)));
|
|
352
|
+
const targetBottomPosition = toPx(Number((rectCell.bottom - rectTable.bottom).toFixed(4)));
|
|
353
|
+
// Set `top` and `bottom` styles to the column resizer element.
|
|
354
|
+
editor.editing.view.change(viewWriter => {
|
|
355
|
+
viewWriter.setStyle('top', targetTopPosition, viewResizer);
|
|
356
|
+
viewWriter.setStyle('bottom', targetBottomPosition, viewResizer);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Remove `top` and `bottom` styles of the column resizer element.
|
|
361
|
+
*
|
|
362
|
+
* @param viewResizer The column resizer element.
|
|
363
|
+
*/
|
|
364
|
+
_resetResizerStyles(viewResizer) {
|
|
365
|
+
this.editor.editing.view.change(viewWriter => {
|
|
366
|
+
viewWriter.removeStyle('top', viewResizer);
|
|
367
|
+
viewWriter.removeStyle('bottom', viewResizer);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Handles the `mouseover` event on column resizer element.
|
|
372
|
+
* Recalculates the `top` and `bottom` styles of the column resizer element to fit the height of the table.
|
|
373
|
+
*
|
|
374
|
+
* @param eventInfo An object containing information about the fired event.
|
|
375
|
+
* @param domEventData The data related to the DOM event.
|
|
376
|
+
*/
|
|
377
|
+
_onMouseOverHandler(eventInfo, domEventData) {
|
|
378
|
+
const target = domEventData.target;
|
|
379
|
+
if (!target.hasClass('ck-table-column-resizer')) {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if (!this._isResizingAllowed) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
this._recalculateResizerElement(target);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Handles the `mouseout` event on column resizer element.
|
|
389
|
+
* When resizing is not active, it resets the `top` and `bottom` styles of the column resizer element.
|
|
390
|
+
*
|
|
391
|
+
* @param eventInfo An object containing information about the fired event.
|
|
392
|
+
* @param domEventData The data related to the DOM event.
|
|
393
|
+
*/
|
|
394
|
+
_onMouseOutHandler(eventInfo, domEventData) {
|
|
395
|
+
const target = domEventData.target;
|
|
396
|
+
if (!target.hasClass('ck-table-column-resizer')) {
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
if (!this._isResizingAllowed) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (this._isResizingActive) {
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
this._resetResizerStyles(target);
|
|
406
|
+
}
|
|
333
407
|
/**
|
|
334
408
|
* Handles the `mousedown` event on column resizer element:
|
|
335
409
|
* * calculates the initial column pixel widths,
|
|
@@ -461,7 +535,7 @@ export default class TableColumnResizeEditing extends Plugin {
|
|
|
461
535
|
this._onMouseUpHandler();
|
|
462
536
|
return;
|
|
463
537
|
}
|
|
464
|
-
const { columnPosition, flags: { isRightEdge, isTableCentered, isLtrContent }, elements: { viewFigure, viewLeftColumn, viewRightColumn }, widths: { viewFigureParentWidth, tableWidth, leftColumnWidth, rightColumnWidth } } = this._resizingData;
|
|
538
|
+
const { columnPosition, flags: { isRightEdge, isTableCentered, isLtrContent }, elements: { viewFigure, viewLeftColumn, viewRightColumn, viewResizer }, widths: { viewFigureParentWidth, tableWidth, leftColumnWidth, rightColumnWidth } } = this._resizingData;
|
|
465
539
|
const dxLowerBound = -leftColumnWidth + COLUMN_MIN_WIDTH_IN_PIXELS;
|
|
466
540
|
const dxUpperBound = isRightEdge ?
|
|
467
541
|
viewFigureParentWidth - tableWidth :
|
|
@@ -486,6 +560,7 @@ export default class TableColumnResizeEditing extends Plugin {
|
|
|
486
560
|
writer.setStyle('width', `${rightColumnWidthAsPercentage}%`, viewRightColumn);
|
|
487
561
|
}
|
|
488
562
|
});
|
|
563
|
+
this._recalculateResizerElement(viewResizer);
|
|
489
564
|
}
|
|
490
565
|
/**
|
|
491
566
|
* Handles the `mouseup` event.
|
|
@@ -556,6 +631,10 @@ export default class TableColumnResizeEditing extends Plugin {
|
|
|
556
631
|
editingView.change(writer => {
|
|
557
632
|
writer.removeClass('ck-table-column-resizer__active', viewResizer);
|
|
558
633
|
});
|
|
634
|
+
const element = editingView.domConverter.mapViewToDom(viewResizer);
|
|
635
|
+
if (!element.matches(':hover')) {
|
|
636
|
+
this._resetResizerStyles(viewResizer);
|
|
637
|
+
}
|
|
559
638
|
this._isResizingActive = false;
|
|
560
639
|
this._resizingData = null;
|
|
561
640
|
}
|
package/src/tablelayout.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ import TableColumnResize from './tablecolumnresize.js';
|
|
|
13
13
|
/**
|
|
14
14
|
* The table plugin.
|
|
15
15
|
*
|
|
16
|
-
* For a detailed overview, check the {@glink features/tables/tables
|
|
16
|
+
* For a detailed overview, check the {@glink features/tables/layout-tables Layout table feature documentation}.
|
|
17
17
|
*/
|
|
18
18
|
export default class TableLayout extends Plugin {
|
|
19
19
|
/**
|
package/src/tablelayout.js
CHANGED
|
@@ -13,7 +13,7 @@ import TableColumnResize from './tablecolumnresize.js';
|
|
|
13
13
|
/**
|
|
14
14
|
* The table plugin.
|
|
15
15
|
*
|
|
16
|
-
* For a detailed overview, check the {@glink features/tables/tables
|
|
16
|
+
* For a detailed overview, check the {@glink features/tables/layout-tables Layout table feature documentation}.
|
|
17
17
|
*/
|
|
18
18
|
export default class TableLayout extends Plugin {
|
|
19
19
|
/**
|
|
@@ -26,8 +26,18 @@ export default class TablePropertyCommand extends Command {
|
|
|
26
26
|
readonly attributeName: string;
|
|
27
27
|
/**
|
|
28
28
|
* The default value for the attribute.
|
|
29
|
+
*
|
|
30
|
+
* @readonly
|
|
31
|
+
*/
|
|
32
|
+
protected _defaultValue: string | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* The default value for the attribute for the content table.
|
|
35
|
+
*/
|
|
36
|
+
private readonly _defaultContentTableValue;
|
|
37
|
+
/**
|
|
38
|
+
* The default value for the attribute for the layout table.
|
|
29
39
|
*/
|
|
30
|
-
|
|
40
|
+
private readonly _defaultLayoutTableValue;
|
|
31
41
|
/**
|
|
32
42
|
* Creates a new `TablePropertyCommand` instance.
|
|
33
43
|
*
|
|
@@ -16,8 +16,18 @@ export default class TablePropertyCommand extends Command {
|
|
|
16
16
|
attributeName;
|
|
17
17
|
/**
|
|
18
18
|
* The default value for the attribute.
|
|
19
|
+
*
|
|
20
|
+
* @readonly
|
|
19
21
|
*/
|
|
20
22
|
_defaultValue;
|
|
23
|
+
/**
|
|
24
|
+
* The default value for the attribute for the content table.
|
|
25
|
+
*/
|
|
26
|
+
_defaultContentTableValue;
|
|
27
|
+
/**
|
|
28
|
+
* The default value for the attribute for the layout table.
|
|
29
|
+
*/
|
|
30
|
+
_defaultLayoutTableValue;
|
|
21
31
|
/**
|
|
22
32
|
* Creates a new `TablePropertyCommand` instance.
|
|
23
33
|
*
|
|
@@ -28,7 +38,8 @@ export default class TablePropertyCommand extends Command {
|
|
|
28
38
|
constructor(editor, attributeName, defaultValue) {
|
|
29
39
|
super(editor);
|
|
30
40
|
this.attributeName = attributeName;
|
|
31
|
-
this.
|
|
41
|
+
this._defaultContentTableValue = defaultValue;
|
|
42
|
+
this._defaultLayoutTableValue = attributeName === 'tableBorderStyle' ? 'none' : undefined;
|
|
32
43
|
}
|
|
33
44
|
/**
|
|
34
45
|
* @inheritDoc
|
|
@@ -37,6 +48,9 @@ export default class TablePropertyCommand extends Command {
|
|
|
37
48
|
const editor = this.editor;
|
|
38
49
|
const selection = editor.model.document.selection;
|
|
39
50
|
const table = getSelectionAffectedTable(selection);
|
|
51
|
+
this._defaultValue = !table || table.getAttribute('tableType') !== 'layout' ?
|
|
52
|
+
this._defaultContentTableValue :
|
|
53
|
+
this._defaultLayoutTableValue;
|
|
40
54
|
this.isEnabled = !!table;
|
|
41
55
|
this.value = this._getValue(table);
|
|
42
56
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { Plugin } from 'ckeditor5/src/core.js';
|
|
9
9
|
import { addBackgroundRules, addBorderRules } from 'ckeditor5/src/engine.js';
|
|
10
10
|
import TableEditing from '../tableediting.js';
|
|
11
|
-
import { downcastAttributeToStyle, downcastTableAttribute, upcastBorderStyles, upcastStyleToAttribute } from '../converters/tableproperties.js';
|
|
11
|
+
import { downcastAttributeToStyle, downcastTableAttribute, getDefaultValueAdjusted, upcastBorderStyles, upcastStyleToAttribute } from '../converters/tableproperties.js';
|
|
12
12
|
import TableBackgroundColorCommand from './commands/tablebackgroundcolorcommand.js';
|
|
13
13
|
import TableBorderColorCommand from './commands/tablebordercolorcommand.js';
|
|
14
14
|
import TableBorderStyleCommand from './commands/tableborderstylecommand.js';
|
|
@@ -133,15 +133,36 @@ function enableAlignmentProperty(schema, conversion, defaultValue) {
|
|
|
133
133
|
.attributeToAttribute({
|
|
134
134
|
model: {
|
|
135
135
|
name: 'table',
|
|
136
|
-
key: 'tableAlignment'
|
|
136
|
+
key: 'tableAlignment',
|
|
137
|
+
values: ['left', 'center', 'right']
|
|
137
138
|
},
|
|
138
|
-
view:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
view: {
|
|
140
|
+
left: {
|
|
141
|
+
key: 'style',
|
|
142
|
+
value: {
|
|
143
|
+
float: 'left'
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
right: {
|
|
147
|
+
key: 'style',
|
|
148
|
+
value: {
|
|
149
|
+
float: 'right'
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
center: (alignment, conversionApi, data) => {
|
|
153
|
+
const value = data.item.getAttribute('tableType') !== 'layout' ? {
|
|
154
|
+
// Model: `alignment:center` => CSS: `float:none`.
|
|
155
|
+
float: 'none'
|
|
156
|
+
} : {
|
|
157
|
+
'margin-left': 'auto',
|
|
158
|
+
'margin-right': 'auto'
|
|
159
|
+
};
|
|
160
|
+
return {
|
|
161
|
+
key: 'style',
|
|
162
|
+
value
|
|
163
|
+
};
|
|
143
164
|
}
|
|
144
|
-
}
|
|
165
|
+
},
|
|
145
166
|
converterPriority: 'high'
|
|
146
167
|
});
|
|
147
168
|
conversion.for('upcast')
|
|
@@ -155,13 +176,32 @@ function enableAlignmentProperty(schema, conversion, defaultValue) {
|
|
|
155
176
|
},
|
|
156
177
|
model: {
|
|
157
178
|
key: 'tableAlignment',
|
|
158
|
-
value: (viewElement) => {
|
|
179
|
+
value: (viewElement, conversionApi, data) => {
|
|
180
|
+
const localDefaultValue = getDefaultValueAdjusted(defaultValue, '', data);
|
|
159
181
|
let align = viewElement.getStyle('float');
|
|
160
182
|
// CSS: `float:none` => Model: `alignment:center`.
|
|
161
183
|
if (align === 'none') {
|
|
162
184
|
align = 'center';
|
|
163
185
|
}
|
|
164
|
-
return align ===
|
|
186
|
+
return align === localDefaultValue ? null : align;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
})
|
|
190
|
+
// Support for the `margin-left:auto; margin-right:auto;` CSS definition for the table alignment.
|
|
191
|
+
.attributeToAttribute({
|
|
192
|
+
view: {
|
|
193
|
+
name: /^(table|figure)$/,
|
|
194
|
+
styles: {
|
|
195
|
+
'margin-left': 'auto',
|
|
196
|
+
'margin-right': 'auto'
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
model: {
|
|
200
|
+
key: 'tableAlignment',
|
|
201
|
+
value: (viewElement, conversionApi, data) => {
|
|
202
|
+
const localDefaultValue = getDefaultValueAdjusted(defaultValue, '', data);
|
|
203
|
+
const align = 'center';
|
|
204
|
+
return align === localDefaultValue ? null : align;
|
|
165
205
|
}
|
|
166
206
|
}
|
|
167
207
|
})
|
|
@@ -175,9 +215,10 @@ function enableAlignmentProperty(schema, conversion, defaultValue) {
|
|
|
175
215
|
model: {
|
|
176
216
|
name: 'table',
|
|
177
217
|
key: 'tableAlignment',
|
|
178
|
-
value: (viewElement) => {
|
|
218
|
+
value: (viewElement, conversionApi, data) => {
|
|
219
|
+
const localDefaultValue = getDefaultValueAdjusted(defaultValue, '', data);
|
|
179
220
|
const align = viewElement.getAttribute('align');
|
|
180
|
-
return align ===
|
|
221
|
+
return align === localDefaultValue ? null : align;
|
|
181
222
|
}
|
|
182
223
|
}
|
|
183
224
|
});
|
|
@@ -18,7 +18,11 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
18
18
|
/**
|
|
19
19
|
* The default table properties.
|
|
20
20
|
*/
|
|
21
|
-
private
|
|
21
|
+
private _defaultContentTableProperties;
|
|
22
|
+
/**
|
|
23
|
+
* The default layout table properties.
|
|
24
|
+
*/
|
|
25
|
+
private _defaultLayoutTableProperties;
|
|
22
26
|
/**
|
|
23
27
|
* The contextual balloon plugin instance.
|
|
24
28
|
*/
|
|
@@ -27,6 +31,14 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
27
31
|
* The properties form view displayed inside the balloon.
|
|
28
32
|
*/
|
|
29
33
|
view: TablePropertiesView | null;
|
|
34
|
+
/**
|
|
35
|
+
* The properties form view displayed inside the balloon (content table).
|
|
36
|
+
*/
|
|
37
|
+
private _viewWithContentTableDefaults;
|
|
38
|
+
/**
|
|
39
|
+
* The properties form view displayed inside the balloon (layout table).
|
|
40
|
+
*/
|
|
41
|
+
private _viewWithLayoutTableDefaults;
|
|
30
42
|
/**
|
|
31
43
|
* The batch used to undo all changes made by the form (which are live, as the user types)
|
|
32
44
|
* when "Cancel" was pressed. Each time the view is shown, a new batch is created.
|
|
@@ -13,7 +13,7 @@ import TablePropertiesView from './ui/tablepropertiesview.js';
|
|
|
13
13
|
import { colorFieldValidator, getLocalizedColorErrorText, getLocalizedLengthErrorText, lengthFieldValidator, lineWidthFieldValidator, defaultColors } from '../utils/ui/table-properties.js';
|
|
14
14
|
import { getSelectionAffectedTableWidget } from '../utils/ui/widget.js';
|
|
15
15
|
import { getBalloonTablePositionData, repositionContextualBalloon } from '../utils/ui/contextualballoon.js';
|
|
16
|
-
import { getNormalizedDefaultTableProperties } from '../utils/table-properties.js';
|
|
16
|
+
import { getNormalizedDefaultProperties, getNormalizedDefaultTableProperties } from '../utils/table-properties.js';
|
|
17
17
|
const ERROR_TEXT_TIMEOUT = 500;
|
|
18
18
|
// Map of view properties and related commands.
|
|
19
19
|
const propertyToCommandMap = {
|
|
@@ -35,7 +35,11 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
35
35
|
/**
|
|
36
36
|
* The default table properties.
|
|
37
37
|
*/
|
|
38
|
-
|
|
38
|
+
_defaultContentTableProperties;
|
|
39
|
+
/**
|
|
40
|
+
* The default layout table properties.
|
|
41
|
+
*/
|
|
42
|
+
_defaultLayoutTableProperties;
|
|
39
43
|
/**
|
|
40
44
|
* The contextual balloon plugin instance.
|
|
41
45
|
*/
|
|
@@ -44,6 +48,14 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
44
48
|
* The properties form view displayed inside the balloon.
|
|
45
49
|
*/
|
|
46
50
|
view = null;
|
|
51
|
+
/**
|
|
52
|
+
* The properties form view displayed inside the balloon (content table).
|
|
53
|
+
*/
|
|
54
|
+
_viewWithContentTableDefaults = null;
|
|
55
|
+
/**
|
|
56
|
+
* The properties form view displayed inside the balloon (layout table).
|
|
57
|
+
*/
|
|
58
|
+
_viewWithLayoutTableDefaults = null;
|
|
47
59
|
/**
|
|
48
60
|
* The batch used to undo all changes made by the form (which are live, as the user types)
|
|
49
61
|
* when "Cancel" was pressed. Each time the view is shown, a new batch is created.
|
|
@@ -87,9 +99,10 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
87
99
|
*/
|
|
88
100
|
init() {
|
|
89
101
|
const editor = this.editor;
|
|
90
|
-
this.
|
|
102
|
+
this._defaultContentTableProperties = getNormalizedDefaultTableProperties(editor.config.get('table.tableProperties.defaultProperties'), {
|
|
91
103
|
includeAlignmentProperty: true
|
|
92
104
|
});
|
|
105
|
+
this._defaultLayoutTableProperties = getNormalizedDefaultProperties();
|
|
93
106
|
this._balloon = editor.plugins.get(ContextualBalloon);
|
|
94
107
|
editor.ui.componentFactory.add('tableProperties', () => this._createTablePropertiesButton());
|
|
95
108
|
}
|
|
@@ -129,7 +142,7 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
129
142
|
*
|
|
130
143
|
* @returns The table properties form view instance.
|
|
131
144
|
*/
|
|
132
|
-
_createPropertiesView() {
|
|
145
|
+
_createPropertiesView(defaultTableProperties) {
|
|
133
146
|
const editor = this.editor;
|
|
134
147
|
const config = editor.config.get('table.tableProperties');
|
|
135
148
|
const borderColorsConfig = normalizeColorOptions(config.borderColors);
|
|
@@ -140,7 +153,7 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
140
153
|
const view = new TablePropertiesView(editor.locale, {
|
|
141
154
|
borderColors: localizedBorderColors,
|
|
142
155
|
backgroundColors: localizedBackgroundColors,
|
|
143
|
-
defaultTableProperties
|
|
156
|
+
defaultTableProperties,
|
|
144
157
|
colorPickerConfig: hasColorPicker ? (config.colorPicker || {}) : false
|
|
145
158
|
});
|
|
146
159
|
const t = editor.t;
|
|
@@ -223,7 +236,9 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
223
236
|
Object.entries(propertyToCommandMap)
|
|
224
237
|
.map(([property, commandName]) => {
|
|
225
238
|
const propertyKey = property;
|
|
226
|
-
const defaultValue = this.
|
|
239
|
+
const defaultValue = this.view === this._viewWithContentTableDefaults ?
|
|
240
|
+
this._defaultContentTableProperties[propertyKey] || '' :
|
|
241
|
+
this._defaultLayoutTableProperties[propertyKey] || '';
|
|
227
242
|
return [propertyKey, (commands.get(commandName).value || defaultValue)];
|
|
228
243
|
})
|
|
229
244
|
.forEach(([property, value]) => {
|
|
@@ -244,9 +259,16 @@ export default class TablePropertiesUI extends Plugin {
|
|
|
244
259
|
*/
|
|
245
260
|
_showView() {
|
|
246
261
|
const editor = this.editor;
|
|
247
|
-
|
|
248
|
-
|
|
262
|
+
const viewTable = getSelectionAffectedTableWidget(editor.editing.view.document.selection);
|
|
263
|
+
const modelTable = viewTable && editor.editing.mapper.toModelElement(viewTable);
|
|
264
|
+
const useDefaults = !modelTable || modelTable.getAttribute('tableType') !== 'layout';
|
|
265
|
+
if (useDefaults && !this._viewWithContentTableDefaults) {
|
|
266
|
+
this._viewWithContentTableDefaults = this._createPropertiesView(this._defaultContentTableProperties);
|
|
267
|
+
}
|
|
268
|
+
else if (!useDefaults && !this._viewWithLayoutTableDefaults) {
|
|
269
|
+
this._viewWithLayoutTableDefaults = this._createPropertiesView(this._defaultLayoutTableProperties);
|
|
249
270
|
}
|
|
271
|
+
this.view = useDefaults ? this._viewWithContentTableDefaults : this._viewWithLayoutTableDefaults;
|
|
250
272
|
this.listenTo(editor.ui, 'update', () => {
|
|
251
273
|
this._updateView();
|
|
252
274
|
});
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { ButtonView, FocusCycler, LabeledFieldView, ToolbarView, View, ViewCollection, type DropdownView, type InputTextView, type NormalizedColorOption, type ColorPickerConfig, type FocusableView } from 'ckeditor5/src/ui.js';
|
|
9
9
|
import { FocusTracker, KeystrokeHandler, type Locale } from 'ckeditor5/src/utils.js';
|
|
10
|
+
import type ColorInputView from '../../ui/colorinputview.js';
|
|
11
|
+
import type { TablePropertiesOptions } from '../../tableconfig.js';
|
|
10
12
|
import '@ckeditor/ckeditor5-ui/theme/components/form/form.css';
|
|
11
13
|
import '../../../theme/formrow.css';
|
|
12
14
|
import '../../../theme/tableform.css';
|
|
13
15
|
import '../../../theme/tableproperties.css';
|
|
14
|
-
import type ColorInputView from '../../ui/colorinputview.js';
|
|
15
|
-
import type { TablePropertiesOptions } from '../../tableconfig.js';
|
|
16
16
|
/**
|
|
17
17
|
* Additional configuration of the view.
|
|
18
18
|
*/
|
|
@@ -80,18 +80,18 @@ export type NormalizeTableDefaultPropertiesOptions = {
|
|
|
80
80
|
* @param config The configuration to normalize.
|
|
81
81
|
* @param options Options used to determine which properties should be added.
|
|
82
82
|
*/
|
|
83
|
-
export declare function getNormalizedDefaultProperties(config
|
|
83
|
+
export declare function getNormalizedDefaultProperties(config?: Partial<NormalizedDefaultProperties>, options?: NormalizeTableDefaultPropertiesOptions): NormalizedDefaultProperties;
|
|
84
84
|
/**
|
|
85
85
|
* Returns the normalized default table properties.
|
|
86
86
|
*
|
|
87
87
|
* @param config The configuration to normalize.
|
|
88
88
|
* @param options Options used to determine which properties should be added.
|
|
89
89
|
*/
|
|
90
|
-
export declare function getNormalizedDefaultTableProperties(config
|
|
90
|
+
export declare function getNormalizedDefaultTableProperties(config?: Partial<NormalizedDefaultProperties>, options?: NormalizeTableDefaultPropertiesOptions): NormalizedDefaultProperties;
|
|
91
91
|
/**
|
|
92
92
|
* Returns the normalized default cell properties.
|
|
93
93
|
*
|
|
94
94
|
* @param config The configuration to normalize.
|
|
95
95
|
* @param options Options used to determine which properties should be added.
|
|
96
96
|
*/
|
|
97
|
-
export declare function getNormalizedDefaultCellProperties(config
|
|
97
|
+
export declare function getNormalizedDefaultCellProperties(config?: Partial<NormalizedDefaultProperties>, options?: NormalizeTableDefaultPropertiesOptions): NormalizedDefaultProperties;
|
|
@@ -146,7 +146,13 @@ export function fillToolbar(options) {
|
|
|
146
146
|
return buttonValue === valueToCompare;
|
|
147
147
|
});
|
|
148
148
|
button.on('execute', () => {
|
|
149
|
-
|
|
149
|
+
// Allow toggling alignment if there is no default value specified (especially for layout tables).
|
|
150
|
+
if (!defaultValue && buttonValue && view[propertyName] === buttonValue) {
|
|
151
|
+
view[propertyName] = undefined;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
view[propertyName] = buttonValue;
|
|
155
|
+
}
|
|
150
156
|
});
|
|
151
157
|
toolbar.items.add(button);
|
|
152
158
|
}
|
|
@@ -16,10 +16,6 @@
|
|
|
16
16
|
table-layout: fixed;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
.ck-content .table table {
|
|
20
|
-
overflow: hidden;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
19
|
.ck-content .table td,
|
|
24
20
|
.ck-content .table th {
|
|
25
21
|
/* To prevent text overflowing beyond its cell when columns are resized by resize handler
|
|
@@ -58,12 +54,6 @@
|
|
|
58
54
|
.ck.ck-editor__editable .table .ck-table-column-resizer__active {
|
|
59
55
|
background-color: var(--ck-color-selector-column-resizer-hover);
|
|
60
56
|
opacity: 0.25;
|
|
61
|
-
/* The resizer element resides in each cell so to occupy the entire height of the table, which is unknown from a CSS point of view,
|
|
62
|
-
it is extended to an extremely high height. Even for screens with a very high pixel density, the resizer will fulfill its role as
|
|
63
|
-
it should, i.e. for a screen of 476 ppi the total height of the resizer will take over 350 sheets of A4 format, which is totally
|
|
64
|
-
unrealistic height for a single table. */
|
|
65
|
-
top: -999999px;
|
|
66
|
-
bottom: -999999px;
|
|
67
57
|
}
|
|
68
58
|
|
|
69
59
|
.ck.ck-editor__editable[dir=rtl] .table .ck-table-column-resizer {
|
package/theme/tablelayout.css
CHANGED
|
@@ -27,6 +27,12 @@
|
|
|
27
27
|
|
|
28
28
|
/* Widget type around overrides. */
|
|
29
29
|
&.ck-widget {
|
|
30
|
+
&:hover {
|
|
31
|
+
/* To prevent the widget outline from being cut off at the bottom
|
|
32
|
+
when the next cell or table has a background color, for example. */
|
|
33
|
+
z-index: var(--ck-z-default);
|
|
34
|
+
}
|
|
35
|
+
|
|
30
36
|
&:hover > .ck-widget__selection-handle {
|
|
31
37
|
opacity: 0.75;
|
|
32
38
|
visibility: visible;
|
|
@@ -39,10 +45,16 @@
|
|
|
39
45
|
/* Because of setting the opacity to 0.75 to the selection handle for the layout table,
|
|
40
46
|
it overrides the similar selector in widget (specificity is higher),
|
|
41
47
|
thats why we must override it here also. */
|
|
42
|
-
&:has( .ck-widget:hover ) > .ck-widget__selection-handle {
|
|
48
|
+
&:has( .ck-widget.table:hover ) > .ck-widget__selection-handle {
|
|
43
49
|
opacity: 0;
|
|
44
50
|
visibility: hidden;
|
|
45
51
|
}
|
|
52
|
+
|
|
53
|
+
&.ck-widget_selected {
|
|
54
|
+
/* To prevent the widget outline from being cut off at the bottom
|
|
55
|
+
when the next cell or table has a background color, for example. */
|
|
56
|
+
z-index: var(--ck-z-default);
|
|
57
|
+
}
|
|
46
58
|
}
|
|
47
59
|
}
|
|
48
60
|
}
|