@modusoperandi/licit 1.4.10 → 1.6.0
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/EditorCommands.js +2 -0
- package/EditorCommands.js.flow +2 -0
- package/TableDetailsCommand.js +123 -0
- package/TableDetailsCommand.js.flow +125 -0
- package/TableNodesSpecs.js +19 -4
- package/TableNodesSpecs.js.flow +8 -2
- package/bom.xml +9909 -8727
- package/client/Licit.js +11 -2
- package/client/Licit.js.flow +28 -21
- package/package.json +25 -25
- package/toClosestFontPtSize.js +1 -1
- package/toClosestFontPtSize.js.flow +20 -1
- package/ui/EditorToolbarConfig.js +3 -0
- package/ui/EditorToolbarConfig.js.flow +4 -0
- package/ui/FontSizeCommandMenuButton.js +1 -1
- package/ui/FontSizeCommandMenuButton.js.flow +7 -1
- package/ui/TableDetails.js +63 -0
- package/ui/TableDetails.js.flow +68 -0
- package/ui/TableNodeView.js +6 -1
- package/ui/TableNodeView.js.flow +5 -0
- package/ui/czi-custom-menu-item.css +2 -2
- package/ui/czi-table.css +65 -0
package/EditorCommands.js
CHANGED
|
@@ -16,6 +16,7 @@ import MarksClearCommand from './MarksClearCommand.js';
|
|
|
16
16
|
import PrintCommand from './PrintCommand.js';
|
|
17
17
|
import TableBackgroundColorCommand from './TableBackgroundColorCommand.js';
|
|
18
18
|
import TableBorderColorCommand from './TableBorderColorCommand.js';
|
|
19
|
+
import TableDetailsCommand from './TableDetailsCommand.js';
|
|
19
20
|
import TableInsertCommand from './TableInsertCommand.js';
|
|
20
21
|
import TableMergeCellsCommand from './TableMergeCellsCommand.js';
|
|
21
22
|
import { HeadingCommand, IndentCommand, MarkToggleCommand, TextAlignCommand, TextColorCommand, TextHighlightCommand, TextLineSpacingCommand } from '@modusoperandi/licit-ui-commands';
|
|
@@ -79,6 +80,7 @@ export var TABLE_ADD_ROW_AFTER = createCommand(addRowAfter);
|
|
|
79
80
|
export var TABLE_ADD_ROW_BEFORE = createCommand(addRowBefore);
|
|
80
81
|
export var TABLE_BACKGROUND_COLOR = new TableBackgroundColorCommand();
|
|
81
82
|
export var TABLE_BORDER_COLOR = new TableBorderColorCommand();
|
|
83
|
+
export var TABLE_DETAILS = new TableDetailsCommand();
|
|
82
84
|
export var TABLE_DELETE_COLUMN = createCommand(deleteColumn);
|
|
83
85
|
export var TABLE_DELETE_ROW = createCommand(deleteRow);
|
|
84
86
|
export var TABLE_DELETE_TABLE = createCommand(deleteTable);
|
package/EditorCommands.js.flow
CHANGED
|
@@ -18,6 +18,7 @@ import MarksClearCommand from './MarksClearCommand.js';
|
|
|
18
18
|
import PrintCommand from './PrintCommand.js';
|
|
19
19
|
import TableBackgroundColorCommand from './TableBackgroundColorCommand.js';
|
|
20
20
|
import TableBorderColorCommand from './TableBorderColorCommand.js';
|
|
21
|
+
import TableDetailsCommand from './TableDetailsCommand.js';
|
|
21
22
|
import TableInsertCommand from './TableInsertCommand.js';
|
|
22
23
|
import TableMergeCellsCommand from './TableMergeCellsCommand.js';
|
|
23
24
|
import {
|
|
@@ -101,6 +102,7 @@ export const TABLE_ADD_ROW_AFTER = createCommand(addRowAfter);
|
|
|
101
102
|
export const TABLE_ADD_ROW_BEFORE = createCommand(addRowBefore);
|
|
102
103
|
export const TABLE_BACKGROUND_COLOR = new TableBackgroundColorCommand();
|
|
103
104
|
export const TABLE_BORDER_COLOR = new TableBorderColorCommand();
|
|
105
|
+
export const TABLE_DETAILS = new TableDetailsCommand();
|
|
104
106
|
export const TABLE_DELETE_COLUMN = createCommand(deleteColumn);
|
|
105
107
|
export const TABLE_DELETE_ROW = createCommand(deleteRow);
|
|
106
108
|
export const TABLE_DELETE_TABLE = createCommand(deleteTable);
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
3
|
+
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
4
|
+
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
5
|
+
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
6
|
+
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
|
|
7
|
+
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
|
8
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
9
|
+
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
|
|
10
|
+
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
|
|
11
|
+
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
|
|
12
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
13
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
14
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
15
|
+
import { EditorState, TextSelection } from 'prosemirror-state';
|
|
16
|
+
import * as React from 'react';
|
|
17
|
+
import { Transform } from 'prosemirror-transform';
|
|
18
|
+
import { EditorView } from 'prosemirror-view';
|
|
19
|
+
import TableDetails from './ui/TableDetails';
|
|
20
|
+
import { findParentNodeOfType } from 'prosemirror-utils';
|
|
21
|
+
import { createPopUp } from '@modusoperandi/licit-ui-commands';
|
|
22
|
+
import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
|
|
23
|
+
var TableDetailsCommand = /*#__PURE__*/function (_UICommand) {
|
|
24
|
+
function TableDetailsCommand() {
|
|
25
|
+
var _this;
|
|
26
|
+
_classCallCheck(this, TableDetailsCommand);
|
|
27
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
28
|
+
args[_key] = arguments[_key];
|
|
29
|
+
}
|
|
30
|
+
_this = _callSuper(this, TableDetailsCommand, [].concat(args));
|
|
31
|
+
_defineProperty(_this, "_popUp", null);
|
|
32
|
+
_defineProperty(_this, "isEnabled", function (state) {
|
|
33
|
+
return true;
|
|
34
|
+
});
|
|
35
|
+
_defineProperty(_this, "execute", function (state, dispatch, view) {
|
|
36
|
+
if (!view) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
var selection = state.selection,
|
|
40
|
+
schema = state.schema;
|
|
41
|
+
var tableNode = findParentNodeOfType(schema.nodes.table)(selection);
|
|
42
|
+
if (!tableNode) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
var tableDOM = _this.findTableDOM(view, tableNode.start);
|
|
46
|
+
if (!tableDOM) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
var tableRect = tableDOM.getBoundingClientRect();
|
|
50
|
+
var cellDOM = _this.getSelectedCellDOM(view);
|
|
51
|
+
var cellRect = cellDOM === null || cellDOM === void 0 ? void 0 : cellDOM.getBoundingClientRect();
|
|
52
|
+
var viewProps = {
|
|
53
|
+
close: function close() {
|
|
54
|
+
var _this$_popUp;
|
|
55
|
+
(_this$_popUp = _this._popUp) === null || _this$_popUp === void 0 || _this$_popUp.close(undefined);
|
|
56
|
+
},
|
|
57
|
+
editorView: view,
|
|
58
|
+
table: {
|
|
59
|
+
width: Math.round(tableRect.width),
|
|
60
|
+
height: Math.round(tableRect.height)
|
|
61
|
+
},
|
|
62
|
+
cell: cellRect ? {
|
|
63
|
+
width: Math.round(cellRect.width),
|
|
64
|
+
height: Math.round(cellRect.height)
|
|
65
|
+
} : null
|
|
66
|
+
};
|
|
67
|
+
return new Promise(function (resolve) {
|
|
68
|
+
_this._popUp = createPopUp(TableDetails, viewProps, {
|
|
69
|
+
modal: true,
|
|
70
|
+
onClose: function onClose(val) {
|
|
71
|
+
if (_this._popUp) {
|
|
72
|
+
resolve(val);
|
|
73
|
+
_this._popUp = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
_defineProperty(_this, "waitForUserInput", function (_state, _dispatch, _view, _event) {
|
|
80
|
+
return Promise.resolve(undefined);
|
|
81
|
+
});
|
|
82
|
+
_defineProperty(_this, "executeWithUserInput", function (_state, _dispatch, _view, _inputs) {
|
|
83
|
+
return false;
|
|
84
|
+
});
|
|
85
|
+
return _this;
|
|
86
|
+
}
|
|
87
|
+
_inherits(TableDetailsCommand, _UICommand);
|
|
88
|
+
return _createClass(TableDetailsCommand, [{
|
|
89
|
+
key: "findTableDOM",
|
|
90
|
+
value: function findTableDOM(view, pos) {
|
|
91
|
+
var dom = view.domAtPos(pos);
|
|
92
|
+
if (dom.node instanceof HTMLElement) {
|
|
93
|
+
return dom.node.closest('table');
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Finds the currently selected cell DOM
|
|
99
|
+
*/
|
|
100
|
+
}, {
|
|
101
|
+
key: "getSelectedCellDOM",
|
|
102
|
+
value: function getSelectedCellDOM(view) {
|
|
103
|
+
var selection = view.state.selection;
|
|
104
|
+
if (!(selection instanceof TextSelection)) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
var _view$domAtPos = view.domAtPos(selection.from),
|
|
108
|
+
node = _view$domAtPos.node;
|
|
109
|
+
|
|
110
|
+
// 👇 Convert Text node → Element safely
|
|
111
|
+
var element = node.nodeType === Node.TEXT_NODE ? node.parentElement : node instanceof HTMLElement ? node : null;
|
|
112
|
+
if (!element) return null;
|
|
113
|
+
return element.closest('td, th');
|
|
114
|
+
}
|
|
115
|
+
}, {
|
|
116
|
+
key: "cancel",
|
|
117
|
+
value: function cancel() {
|
|
118
|
+
var _this$_popUp2;
|
|
119
|
+
(_this$_popUp2 = this._popUp) === null || _this$_popUp2 === void 0 || _this$_popUp2.close(undefined);
|
|
120
|
+
}
|
|
121
|
+
}]);
|
|
122
|
+
}(UICommand);
|
|
123
|
+
export default TableDetailsCommand;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import { EditorState, TextSelection } from 'prosemirror-state';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { Transform } from 'prosemirror-transform';
|
|
6
|
+
import { EditorView } from 'prosemirror-view';
|
|
7
|
+
import TableDetails from './ui/TableDetails';
|
|
8
|
+
import { findParentNodeOfType } from 'prosemirror-utils';
|
|
9
|
+
import { createPopUp } from '@modusoperandi/licit-ui-commands';
|
|
10
|
+
import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TableDetailsCommand extends UICommand {
|
|
14
|
+
_popUp = null;
|
|
15
|
+
isEnabled = (state: EditorState): boolean => {
|
|
16
|
+
return true;
|
|
17
|
+
};
|
|
18
|
+
execute = (
|
|
19
|
+
state: EditorState,
|
|
20
|
+
dispatch: ?(tr: Transform) => void,
|
|
21
|
+
view: ?EditorView
|
|
22
|
+
): boolean => {
|
|
23
|
+
if (!view) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const { selection, schema } = state;
|
|
27
|
+
const tableNode = findParentNodeOfType(schema.nodes.table)(selection);
|
|
28
|
+
if (!tableNode) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const tableDOM = this.findTableDOM(view, tableNode.start);
|
|
32
|
+
if (!tableDOM) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
const tableRect = tableDOM.getBoundingClientRect();
|
|
36
|
+
|
|
37
|
+
const cellDOM = this.getSelectedCellDOM(view);
|
|
38
|
+
const cellRect = cellDOM?.getBoundingClientRect();
|
|
39
|
+
|
|
40
|
+
const viewProps = {
|
|
41
|
+
close: () => {
|
|
42
|
+
this._popUp?.close(undefined);
|
|
43
|
+
},
|
|
44
|
+
editorView: view,
|
|
45
|
+
table: {
|
|
46
|
+
width: Math.round(tableRect.width),
|
|
47
|
+
height: Math.round(tableRect.height),
|
|
48
|
+
},
|
|
49
|
+
cell: cellRect
|
|
50
|
+
? {
|
|
51
|
+
width: Math.round(cellRect.width),
|
|
52
|
+
height: Math.round(cellRect.height),
|
|
53
|
+
}
|
|
54
|
+
: null,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
return new Promise((resolve) => {
|
|
58
|
+
this._popUp = createPopUp(TableDetails, viewProps, {
|
|
59
|
+
modal: true,
|
|
60
|
+
onClose: (val) => {
|
|
61
|
+
if (this._popUp) {
|
|
62
|
+
resolve(val);
|
|
63
|
+
this._popUp = null;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
waitForUserInput = (
|
|
71
|
+
_state: EditorState,
|
|
72
|
+
_dispatch: ?(tr: Transform) => void,
|
|
73
|
+
_view: ?EditorView,
|
|
74
|
+
_event: ?React.SyntheticEvent
|
|
75
|
+
): Promise<undefined> => {
|
|
76
|
+
return Promise.resolve(undefined);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
executeWithUserInput = (
|
|
80
|
+
_state: EditorState,
|
|
81
|
+
_dispatch: ?(tr: Transform) => void,
|
|
82
|
+
_view: ?EditorView,
|
|
83
|
+
_inputs: ?string
|
|
84
|
+
): boolean => {
|
|
85
|
+
return false;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
findTableDOM(view: EditorView, pos: number): HTMLElement | null {
|
|
89
|
+
const dom = view.domAtPos(pos);
|
|
90
|
+
|
|
91
|
+
if (dom.node instanceof HTMLElement) {
|
|
92
|
+
return dom.node.closest('table');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Finds the currently selected cell DOM
|
|
99
|
+
*/
|
|
100
|
+
getSelectedCellDOM(view: EditorView): HTMLElement | null {
|
|
101
|
+
const { selection } = view.state;
|
|
102
|
+
|
|
103
|
+
if (!(selection instanceof TextSelection)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const { node } = view.domAtPos(selection.from);
|
|
108
|
+
|
|
109
|
+
// 👇 Convert Text node → Element safely
|
|
110
|
+
const element =
|
|
111
|
+
node.nodeType === Node.TEXT_NODE
|
|
112
|
+
? node.parentElement
|
|
113
|
+
: (node instanceof HTMLElement ? node : null);
|
|
114
|
+
|
|
115
|
+
if (!element) return null;
|
|
116
|
+
|
|
117
|
+
return element.closest('td, th');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
cancel(): void {
|
|
121
|
+
this._popUp?.close(undefined);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export default TableDetailsCommand;
|
package/TableNodesSpecs.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
1
7
|
import toCSSColor from './ui/toCSSColor.js';
|
|
2
8
|
import { Node } from 'prosemirror-model';
|
|
3
9
|
import { tableNodes } from 'prosemirror-tables';
|
|
@@ -99,21 +105,26 @@ var TableNodesSpecs = tableNodes({
|
|
|
99
105
|
|
|
100
106
|
// Override the default table node spec to support custom attributes.
|
|
101
107
|
var TableNodeSpec = Object.assign({}, TableNodesSpecs.table, {
|
|
102
|
-
attrs: {
|
|
108
|
+
attrs: _objectSpread(_objectSpread({}, TableNodesSpecs.table.attrs), {}, {
|
|
103
109
|
marginLeft: {
|
|
104
110
|
"default": null
|
|
105
111
|
},
|
|
106
112
|
dirty: {
|
|
107
113
|
"default": false
|
|
114
|
+
},
|
|
115
|
+
coverPage: {
|
|
116
|
+
"default": false
|
|
108
117
|
}
|
|
109
|
-
},
|
|
118
|
+
}),
|
|
110
119
|
parseDOM: [{
|
|
111
120
|
tag: 'table',
|
|
112
121
|
getAttrs: function getAttrs(dom) {
|
|
113
122
|
var dirty = dom.getAttribute('dirty') || false;
|
|
123
|
+
var coverPage = dom.getAttribute('data-cover-page') === 'true';
|
|
114
124
|
var marginLeft = dom.style.marginLeft;
|
|
115
125
|
var attrs = {
|
|
116
|
-
dirty: dirty
|
|
126
|
+
dirty: dirty,
|
|
127
|
+
coverPage: coverPage
|
|
117
128
|
};
|
|
118
129
|
if (marginLeft && /\d+px/.test(marginLeft)) {
|
|
119
130
|
attrs.marginLeft = parseFloat(marginLeft);
|
|
@@ -128,7 +139,8 @@ var TableNodeSpec = Object.assign({}, TableNodesSpecs.table, {
|
|
|
128
139
|
// that calles this method.
|
|
129
140
|
var _node$attrs = node.attrs,
|
|
130
141
|
marginLeft = _node$attrs.marginLeft,
|
|
131
|
-
dirty = _node$attrs.dirty
|
|
142
|
+
dirty = _node$attrs.dirty,
|
|
143
|
+
coverPage = _node$attrs.coverPage;
|
|
132
144
|
var domAttrs = {};
|
|
133
145
|
if (marginLeft) {
|
|
134
146
|
domAttrs.style = "margin-left: ".concat(marginLeft, "px");
|
|
@@ -136,6 +148,9 @@ var TableNodeSpec = Object.assign({}, TableNodesSpecs.table, {
|
|
|
136
148
|
if (dirty) {
|
|
137
149
|
domAttrs.dirty = dirty;
|
|
138
150
|
}
|
|
151
|
+
if (coverPage) {
|
|
152
|
+
domAttrs['data-cover-page'] = 'true';
|
|
153
|
+
}
|
|
139
154
|
return ['table', domAttrs, 0];
|
|
140
155
|
}
|
|
141
156
|
});
|
package/TableNodesSpecs.js.flow
CHANGED
|
@@ -104,16 +104,19 @@ const TableNodesSpecs = tableNodes({
|
|
|
104
104
|
// Override the default table node spec to support custom attributes.
|
|
105
105
|
const TableNodeSpec = Object.assign({}, TableNodesSpecs.table, {
|
|
106
106
|
attrs: {
|
|
107
|
+
...TableNodesSpecs.table.attrs,
|
|
107
108
|
marginLeft: { default: null },
|
|
108
109
|
dirty: { default: false },
|
|
110
|
+
coverPage: { default: false },
|
|
109
111
|
},
|
|
110
112
|
parseDOM: [
|
|
111
113
|
{
|
|
112
114
|
tag: 'table',
|
|
113
115
|
getAttrs(dom: HTMLElement): ?Object {
|
|
114
116
|
const dirty = dom.getAttribute('dirty') || false;
|
|
117
|
+
const coverPage = dom.getAttribute('data-cover-page') === 'true';
|
|
115
118
|
const { marginLeft } = dom.style;
|
|
116
|
-
const attrs = { dirty };
|
|
119
|
+
const attrs = { dirty, coverPage };
|
|
117
120
|
|
|
118
121
|
if (marginLeft && /\d+px/.test(marginLeft)) {
|
|
119
122
|
attrs.marginLeft = parseFloat(marginLeft);
|
|
@@ -128,7 +131,7 @@ const TableNodeSpec = Object.assign({}, TableNodesSpecs.table, {
|
|
|
128
131
|
// `TableNodeView`. This method is only called when user selects a
|
|
129
132
|
// table node and copies it, which triggers the "serialize to HTML" flow
|
|
130
133
|
// that calles this method.
|
|
131
|
-
const { marginLeft, dirty } = node.attrs;
|
|
134
|
+
const { marginLeft, dirty, coverPage } = node.attrs;
|
|
132
135
|
const domAttrs = {};
|
|
133
136
|
if (marginLeft) {
|
|
134
137
|
domAttrs.style = `margin-left: ${marginLeft}px`;
|
|
@@ -136,6 +139,9 @@ const TableNodeSpec = Object.assign({}, TableNodesSpecs.table, {
|
|
|
136
139
|
if (dirty) {
|
|
137
140
|
domAttrs.dirty = dirty;
|
|
138
141
|
}
|
|
142
|
+
if (coverPage) {
|
|
143
|
+
domAttrs['data-cover-page'] = 'true';
|
|
144
|
+
}
|
|
139
145
|
return ['table', domAttrs, 0];
|
|
140
146
|
},
|
|
141
147
|
});
|