@progress/kendo-angular-editor 3.0.0-dev.202112211443 → 3.0.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/LICENSE.md +1 -1
- package/NOTICE.txt +119 -79
- package/README.md +1 -1
- package/dist/cdn/js/kendo-angular-editor.js +2 -2
- package/dist/cdn/main.js +1 -1
- package/dist/es/common/error-messages.js +1 -1
- package/dist/es/config/command-icons.js +1 -0
- package/dist/es/config/commands.js +18 -17
- package/dist/es/config/schema.js +2 -4
- package/dist/es/config/table-commands.js +1 -363
- package/dist/es/dialogs/colorpicker-dialog.component.js +1 -1
- package/dist/es/dialogs/file-link-dialog.component.js +1 -1
- package/dist/es/dialogs/image-dialog.component.js +1 -1
- package/dist/es/editor-toolbar-state.js +12 -2
- package/dist/es/editor.component.js +11 -11
- package/dist/es/editor.module.js +6 -3
- package/dist/es/index.js +2 -0
- package/dist/es/localization/messages.js +4 -0
- package/dist/es/package-metadata.js +1 -1
- package/dist/es/tools/blockquote/editor-blockquote-button.directive.js +48 -0
- package/dist/es/tools/colorpicker/editor-colorpicker.component.js +24 -7
- package/dist/es/tools/format/editor-format-dropdownlist.component.js +1 -1
- package/dist/es/tools/format/editor-format.component.js +0 -1
- package/dist/es/tools/tables/popup-table-grid.component.js +1 -1
- package/dist/es2015/common/commands.d.ts +1 -1
- package/dist/es2015/common/error-messages.js +1 -1
- package/dist/es2015/common/format-item.interface.d.ts +1 -1
- package/dist/es2015/config/command-icons.js +1 -0
- package/dist/es2015/config/commands.js +18 -17
- package/dist/es2015/config/schema.d.ts +1 -1
- package/dist/es2015/config/schema.js +2 -3
- package/dist/es2015/config/table-commands.d.ts +0 -36
- package/dist/es2015/config/table-commands.js +1 -357
- package/dist/es2015/dialogs/colorpicker-dialog.component.js +1 -1
- package/dist/es2015/dialogs/file-link-dialog.component.js +4 -4
- package/dist/es2015/dialogs/image-dialog.component.js +4 -4
- package/dist/es2015/editor-toolbar-state.js +12 -2
- package/dist/es2015/editor.component.d.ts +1 -1
- package/dist/es2015/editor.component.js +12 -10
- package/dist/es2015/editor.module.js +6 -3
- package/dist/es2015/index.d.ts +2 -0
- package/dist/es2015/index.js +2 -0
- package/dist/es2015/index.metadata.json +1 -1
- package/dist/es2015/localization/messages.d.ts +4 -0
- package/dist/es2015/localization/messages.js +4 -0
- package/dist/es2015/package-metadata.js +1 -1
- package/dist/es2015/tools/blockquote/editor-blockquote-button.directive.d.ts +30 -0
- package/dist/es2015/tools/blockquote/editor-blockquote-button.directive.js +45 -0
- package/dist/es2015/tools/colorpicker/editor-colorpicker.component.d.ts +8 -2
- package/dist/es2015/tools/colorpicker/editor-colorpicker.component.js +20 -7
- package/dist/es2015/tools/format/editor-format-dropdownlist.component.js +0 -4
- package/dist/es2015/tools/format/editor-format.component.js +0 -1
- package/dist/es2015/tools/tables/popup-table-grid.component.js +2 -2
- package/dist/fesm2015/index.js +261 -1575
- package/dist/fesm5/index.js +280 -1611
- package/dist/npm/common/error-messages.js +1 -1
- package/dist/npm/config/command-icons.js +1 -0
- package/dist/npm/config/commands.js +16 -14
- package/dist/npm/config/schema.js +2 -4
- package/dist/npm/config/table-commands.js +1 -368
- package/dist/npm/dialogs/colorpicker-dialog.component.js +1 -1
- package/dist/npm/dialogs/file-link-dialog.component.js +1 -1
- package/dist/npm/dialogs/image-dialog.component.js +1 -1
- package/dist/npm/editor-toolbar-state.js +11 -1
- package/dist/npm/editor.component.js +10 -10
- package/dist/npm/editor.module.js +7 -4
- package/dist/npm/index.js +5 -0
- package/dist/npm/localization/messages.js +4 -0
- package/dist/npm/package-metadata.js +1 -1
- package/dist/npm/tools/blockquote/editor-blockquote-button.directive.js +50 -0
- package/dist/npm/tools/colorpicker/editor-colorpicker.component.js +24 -7
- package/dist/npm/tools/format/editor-format-dropdownlist.component.js +1 -1
- package/dist/npm/tools/format/editor-format.component.js +0 -1
- package/dist/npm/tools/tables/popup-table-grid.component.js +1 -1
- package/dist/systemjs/kendo-angular-editor.js +1 -1
- package/package.json +18 -18
- package/dist/es/config/table-nodes.js +0 -146
- package/dist/es/config/tables/CellSelection.js +0 -268
- package/dist/es/config/tables/TableMap.js +0 -333
- package/dist/es/config/tables/table-utils.js +0 -302
- package/dist/es2015/config/table-nodes.d.ts +0 -9
- package/dist/es2015/config/table-nodes.js +0 -145
- package/dist/es2015/config/tables/CellSelection.d.ts +0 -35
- package/dist/es2015/config/tables/CellSelection.js +0 -256
- package/dist/es2015/config/tables/TableMap.d.ts +0 -35
- package/dist/es2015/config/tables/TableMap.js +0 -329
- package/dist/es2015/config/tables/table-utils.d.ts +0 -77
- package/dist/es2015/config/tables/table-utils.js +0 -299
- package/dist/npm/config/table-nodes.js +0 -157
- package/dist/npm/config/tables/CellSelection.js +0 -270
- package/dist/npm/config/tables/TableMap.js +0 -338
- package/dist/npm/config/tables/table-utils.js +0 -307
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
* Copyright © 2021 Progress Software Corporation. All rights reserved.
|
|
3
3
|
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
4
|
*-------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { insertNode,
|
|
6
|
-
import { createTable, isInTable, selectedRect, tableNodeTypes, rowIsHeader, setAttr, addColSpan, removeColSpan, isCellEmpty, splitCellWithType, cellsOverlapRectangle, findParentNodeClosestToPos } from './tables/table-utils';
|
|
7
|
-
import { isTable, isTableBody, isTableHead, isTableFoot, isTableHeaderCell, isTableCell } from './utils';
|
|
8
|
-
import { TableMap } from './tables/TableMap';
|
|
9
|
-
import { CellSelection } from './tables/CellSelection';
|
|
5
|
+
import { insertNode, createTable } from '@progress/kendo-editor-common';
|
|
10
6
|
/**
|
|
11
7
|
* @hidden
|
|
12
8
|
*/
|
|
@@ -16,355 +12,3 @@ export const insertTable = (attrs) => (state, dispatch) => {
|
|
|
16
12
|
insertNode(newTable, true)(state, dispatch);
|
|
17
13
|
}
|
|
18
14
|
};
|
|
19
|
-
const addTableGroupColumn = (tr, { left, right }, col, mainTable, requiredGroup, doc) => {
|
|
20
|
-
let refColumn = col > 0 ? -1 : 0;
|
|
21
|
-
// not sure if this should be deleted
|
|
22
|
-
// if (columnIsHeader(map, table, col + refColumn)) {
|
|
23
|
-
// refColumn = col === 0 || col === map.width ? null : 0;
|
|
24
|
-
// }
|
|
25
|
-
let rect;
|
|
26
|
-
mainTable.node.descendants((tableChildNode, offset) => {
|
|
27
|
-
if (requiredGroup(tableChildNode)) {
|
|
28
|
-
let i = -1;
|
|
29
|
-
tableChildNode.firstChild.descendants((childNode, pos) => {
|
|
30
|
-
if (isTableCell(childNode) || isTableHeaderCell(childNode)) {
|
|
31
|
-
i = i + 1;
|
|
32
|
-
if (i === right || i === left) {
|
|
33
|
-
const selection = new Selection(doc.resolve(pos + offset + mainTable.start), doc.resolve(pos + offset + mainTable.start));
|
|
34
|
-
rect = selectedRect(selection);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
// Do nothing if thead, tfoot or tbody is missing
|
|
41
|
-
if (!rect) {
|
|
42
|
-
return tr;
|
|
43
|
-
}
|
|
44
|
-
for (let row = 0; row < rect.map.height; row++) {
|
|
45
|
-
const index = row * rect.map.width + col;
|
|
46
|
-
// If this position falls inside a col-spanning cell
|
|
47
|
-
if (col > 0 && col < rect.map.width && rect.map.map[index - 1] === rect.map.map[index]) {
|
|
48
|
-
const pos = rect.map.map[index];
|
|
49
|
-
const cell = rect.table.nodeAt(pos);
|
|
50
|
-
tr.setNodeMarkup(tr.mapping.map(rect.tableStart + pos), null, addColSpan(cell.attrs, col - rect.map.colCount(pos)));
|
|
51
|
-
// Skip ahead if rowspan > 1
|
|
52
|
-
row += cell.attrs.rowspan - 1;
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
const type = rect.table.nodeAt(rect.map.map[index + refColumn]).type;
|
|
56
|
-
const pos = rect.map.positionAt(row, col, rect.table);
|
|
57
|
-
tr.insert(tr.mapping.map(rect.tableStart + pos), type.createAndFill());
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return tr;
|
|
61
|
-
};
|
|
62
|
-
const ɵ0 = addTableGroupColumn;
|
|
63
|
-
const removeTableGroupColumn = (tr, { right, left }, mainTable, requiredGroup, doc) => {
|
|
64
|
-
let rect;
|
|
65
|
-
mainTable.node.descendants((tableChildNode, offset) => {
|
|
66
|
-
if (requiredGroup(tableChildNode)) {
|
|
67
|
-
let i = -1;
|
|
68
|
-
tableChildNode.firstChild.descendants((childNode, pos) => {
|
|
69
|
-
if (isTableCell(childNode) || isTableHeaderCell(childNode)) {
|
|
70
|
-
i = i + 1;
|
|
71
|
-
if (i >= left && i < right) {
|
|
72
|
-
const resolvedPos = doc.resolve(pos + offset + mainTable.start + childNode.nodeSize);
|
|
73
|
-
const selection = new Selection(resolvedPos, resolvedPos);
|
|
74
|
-
rect = selectedRect(selection);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
// Do nothing if thead, tfoot or tbody is missing
|
|
81
|
-
if (!rect) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
for (let i = rect.right - 1;; i--) {
|
|
85
|
-
removeColumn(tr, rect, i);
|
|
86
|
-
if (i === rect.left) {
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
rect.table = rect.tableStart ? tr.doc.nodeAt(rect.tableStart - 1) : tr.doc;
|
|
90
|
-
rect.map = TableMap.get(rect.table);
|
|
91
|
-
}
|
|
92
|
-
return;
|
|
93
|
-
};
|
|
94
|
-
const ɵ1 = removeTableGroupColumn;
|
|
95
|
-
const removeColumn = (tr, { map, table, tableStart }, col) => {
|
|
96
|
-
for (let row = 0; row < map.height;) {
|
|
97
|
-
const index = row * map.width + col;
|
|
98
|
-
const pos = map.map[index];
|
|
99
|
-
const cell = table.nodeAt(pos);
|
|
100
|
-
// If this is part of a col-spanning cell
|
|
101
|
-
if ((col > 0 && map.map[index - 1] === pos) || (col < map.width - 1 && map.map[index + 1] === pos)) {
|
|
102
|
-
tr.setNodeMarkup(tr.mapping.map(tableStart + pos), null, removeColSpan(cell.attrs, col - map.colCount(pos)));
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
const start = tr.mapping.map(tableStart + pos);
|
|
106
|
-
tr.delete(start, start + cell.nodeSize);
|
|
107
|
-
}
|
|
108
|
-
row += cell.attrs.rowspan;
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
const ɵ2 = removeColumn;
|
|
112
|
-
/**
|
|
113
|
-
* @hidden
|
|
114
|
-
*/
|
|
115
|
-
// Command to add a column before the column with the selection.
|
|
116
|
-
export const addColumnBefore = (state, dispatch) => {
|
|
117
|
-
if (!isInTable(state)) {
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
if (dispatch) {
|
|
121
|
-
const rect = selectedRect(state.selection);
|
|
122
|
-
const mainTable = findParentNodeClosestToPos(state.selection.$anchor, isTable);
|
|
123
|
-
const tHeadTr = addTableGroupColumn(state.tr, rect, rect.left, mainTable, isTableHead, state.doc);
|
|
124
|
-
const tBodyTr = addTableGroupColumn(tHeadTr, rect, rect.left, mainTable, isTableBody, state.doc);
|
|
125
|
-
const tFootTr = addTableGroupColumn(tBodyTr, rect, rect.left, mainTable, isTableFoot, state.doc);
|
|
126
|
-
dispatch(tFootTr);
|
|
127
|
-
}
|
|
128
|
-
return true;
|
|
129
|
-
};
|
|
130
|
-
/**
|
|
131
|
-
* @hidden
|
|
132
|
-
*/
|
|
133
|
-
// Command to add a column after the column with the selection.
|
|
134
|
-
export const addColumnAfter = (state, dispatch) => {
|
|
135
|
-
if (!isInTable(state)) {
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
if (dispatch) {
|
|
139
|
-
const rect = selectedRect(state.selection);
|
|
140
|
-
const mainTable = findParentNodeClosestToPos(state.selection.$anchor, isTable);
|
|
141
|
-
const theadTr = addTableGroupColumn(state.tr, rect, rect.right, mainTable, isTableHead, state.doc);
|
|
142
|
-
const tBodyTr = addTableGroupColumn(theadTr, rect, rect.right, mainTable, isTableBody, state.doc);
|
|
143
|
-
const tFootTr = addTableGroupColumn(tBodyTr, rect, rect.right, mainTable, isTableFoot, state.doc);
|
|
144
|
-
dispatch(tFootTr);
|
|
145
|
-
}
|
|
146
|
-
return true;
|
|
147
|
-
};
|
|
148
|
-
const addRow = (tr, { map, tableStart, table }, row) => {
|
|
149
|
-
let rowPos = tableStart;
|
|
150
|
-
for (let i = 0; i < row; i++) {
|
|
151
|
-
rowPos += table.child(i).nodeSize;
|
|
152
|
-
}
|
|
153
|
-
const cells = [];
|
|
154
|
-
let refRow = row > 0 ? -1 : 0;
|
|
155
|
-
if (rowIsHeader(map, table, row + refRow)) {
|
|
156
|
-
refRow = row === 0 || row === map.height ? null : 0;
|
|
157
|
-
}
|
|
158
|
-
for (let col = 0, index = map.width * row; col < map.width; col++, index++) {
|
|
159
|
-
// Covered by a rowspan cell
|
|
160
|
-
if (row > 0 && row < map.height && map.map[index] === map.map[index - map.width]) {
|
|
161
|
-
const pos = map.map[index];
|
|
162
|
-
const attrs = table.nodeAt(pos).attrs;
|
|
163
|
-
tr.setNodeMarkup(tableStart + pos, null, setAttr(attrs, 'rowspan', attrs.rowspan + 1));
|
|
164
|
-
col += attrs.colspan - 1;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
const type = refRow == null ? tableNodeTypes(table.type.schema).cell : table.nodeAt(map.map[index + refRow * map.width]).type;
|
|
168
|
-
cells.push(type.createAndFill());
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
tr.insert(rowPos, tableNodeTypes(table.type.schema).row.create(null, cells));
|
|
172
|
-
return tr;
|
|
173
|
-
};
|
|
174
|
-
const ɵ3 = addRow;
|
|
175
|
-
/**
|
|
176
|
-
* @hidden
|
|
177
|
-
*/
|
|
178
|
-
// Add a table row before the selection.
|
|
179
|
-
export const addRowBefore = (state, dispatch) => {
|
|
180
|
-
if (!isInTable(state)) {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
if (dispatch) {
|
|
184
|
-
const rect = selectedRect(state.selection);
|
|
185
|
-
dispatch(addRow(state.tr, rect, rect.top));
|
|
186
|
-
}
|
|
187
|
-
return true;
|
|
188
|
-
};
|
|
189
|
-
/**
|
|
190
|
-
* @hidden
|
|
191
|
-
*/
|
|
192
|
-
// Add a table row after the selection.
|
|
193
|
-
export const addRowAfter = (state, dispatch) => {
|
|
194
|
-
if (!isInTable(state)) {
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
if (dispatch) {
|
|
198
|
-
const rect = selectedRect(state.selection);
|
|
199
|
-
dispatch(addRow(state.tr, rect, rect.bottom));
|
|
200
|
-
}
|
|
201
|
-
return true;
|
|
202
|
-
};
|
|
203
|
-
/**
|
|
204
|
-
* @hidden
|
|
205
|
-
*/
|
|
206
|
-
// Command function that removes the selected columns from a table.
|
|
207
|
-
export const deleteColumn = (state, dispatch) => {
|
|
208
|
-
if (!isInTable(state)) {
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
if (dispatch) {
|
|
212
|
-
const rect = selectedRect(state.selection);
|
|
213
|
-
// if only one column left - delete the whole table
|
|
214
|
-
if (rect.left === 0 && rect.right === rect.map.width) {
|
|
215
|
-
return deleteTable(state, dispatch);
|
|
216
|
-
}
|
|
217
|
-
const mainTable = findParentNodeClosestToPos(state.selection.$anchor, isTable);
|
|
218
|
-
const tr = state.tr;
|
|
219
|
-
removeTableGroupColumn(tr, rect, mainTable, isTableFoot, tr.doc);
|
|
220
|
-
removeTableGroupColumn(tr, rect, mainTable, isTableBody, tr.doc);
|
|
221
|
-
removeTableGroupColumn(tr, rect, mainTable, isTableHead, tr.doc);
|
|
222
|
-
dispatch(tr);
|
|
223
|
-
}
|
|
224
|
-
return true;
|
|
225
|
-
};
|
|
226
|
-
const removeRow = (tr, { map, table, tableStart }, row) => {
|
|
227
|
-
let rowPos = 0;
|
|
228
|
-
for (let i = 0; i < row; i++) {
|
|
229
|
-
rowPos += table.child(i).nodeSize;
|
|
230
|
-
}
|
|
231
|
-
const nextRow = rowPos + table.child(row).nodeSize;
|
|
232
|
-
const mapFrom = tr.mapping.maps.length;
|
|
233
|
-
tr.delete(rowPos + tableStart, nextRow + tableStart);
|
|
234
|
-
for (let col = 0, index = row * map.width; col < map.width; col++, index++) {
|
|
235
|
-
const pos = map.map[index];
|
|
236
|
-
if (row > 0 && pos === map.map[index - map.width]) {
|
|
237
|
-
// If this cell starts in the row above, simply reduce its rowspan
|
|
238
|
-
const attrs = table.nodeAt(pos).attrs;
|
|
239
|
-
tr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + tableStart), null, setAttr(attrs, 'rowspan', attrs.rowspan - 1));
|
|
240
|
-
col += attrs.colspan - 1;
|
|
241
|
-
}
|
|
242
|
-
else if (row < map.width && pos === map.map[index + map.width]) {
|
|
243
|
-
// Else, if it continues in the row below, it has to be moved down
|
|
244
|
-
const cell = table.nodeAt(pos);
|
|
245
|
-
const copy = cell.type.create(setAttr(cell.attrs, 'rowspan', cell.attrs.rowspan - 1), cell.content);
|
|
246
|
-
const newPos = map.positionAt(row + 1, col, table);
|
|
247
|
-
tr.insert(tr.mapping.slice(mapFrom).map(tableStart + newPos), copy);
|
|
248
|
-
col += cell.attrs.colspan - 1;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
};
|
|
252
|
-
const ɵ4 = removeRow;
|
|
253
|
-
/**
|
|
254
|
-
* @hidden
|
|
255
|
-
*/
|
|
256
|
-
// Remove the selected rows from a table.
|
|
257
|
-
export const deleteRow = (state, dispatch) => {
|
|
258
|
-
if (!isInTable(state)) {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
if (dispatch) {
|
|
262
|
-
const rect = selectedRect(state.selection);
|
|
263
|
-
const tr = state.tr;
|
|
264
|
-
if (rect.top === 0 && rect.bottom === rect.map.height) {
|
|
265
|
-
const mainTable = findParentNodeClosestToPos(state.selection.$anchor, isTable);
|
|
266
|
-
if (mainTable.node.childCount === 1) {
|
|
267
|
-
deleteTable(state, dispatch);
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
deleteTableElement(n => n.type.name === rect.table.type.name)(state, dispatch);
|
|
271
|
-
}
|
|
272
|
-
return true;
|
|
273
|
-
}
|
|
274
|
-
for (let i = rect.bottom - 1;; i--) {
|
|
275
|
-
removeRow(tr, rect, i);
|
|
276
|
-
if (i === rect.top) {
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
rect.table = rect.tableStart ? tr.doc.nodeAt(rect.tableStart - 1) : tr.doc;
|
|
280
|
-
rect.map = TableMap.get(rect.table);
|
|
281
|
-
}
|
|
282
|
-
dispatch(tr);
|
|
283
|
-
}
|
|
284
|
-
return true;
|
|
285
|
-
};
|
|
286
|
-
/**
|
|
287
|
-
* @hidden
|
|
288
|
-
*/
|
|
289
|
-
// Merge the selected cells into a single cell. Only available when
|
|
290
|
-
// the selected cells' outline forms a rectangle.
|
|
291
|
-
export const mergeCells = (state, dispatch) => {
|
|
292
|
-
const sel = state.selection;
|
|
293
|
-
if (!(sel instanceof CellSelection) || sel.$anchorCell.pos === sel.$headCell.pos) {
|
|
294
|
-
return false;
|
|
295
|
-
}
|
|
296
|
-
const rect = selectedRect(state.selection);
|
|
297
|
-
const { map } = rect;
|
|
298
|
-
if (cellsOverlapRectangle(map, rect)) {
|
|
299
|
-
return false;
|
|
300
|
-
}
|
|
301
|
-
if (dispatch) {
|
|
302
|
-
const tr = state.tr;
|
|
303
|
-
const seen = {};
|
|
304
|
-
let content = Fragment.empty;
|
|
305
|
-
let mergedPos;
|
|
306
|
-
let mergedCell;
|
|
307
|
-
for (let row = rect.top; row < rect.bottom; row++) {
|
|
308
|
-
for (let col = rect.left; col < rect.right; col++) {
|
|
309
|
-
const cellPos = map.map[row * map.width + col], cell = rect.table.nodeAt(cellPos);
|
|
310
|
-
if (seen[cellPos]) {
|
|
311
|
-
continue;
|
|
312
|
-
}
|
|
313
|
-
seen[cellPos] = true;
|
|
314
|
-
if (mergedPos === null) {
|
|
315
|
-
mergedPos = cellPos;
|
|
316
|
-
mergedCell = cell;
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
if (!isCellEmpty(cell)) {
|
|
320
|
-
content = content.append(cell.content);
|
|
321
|
-
}
|
|
322
|
-
const mapped = tr.mapping.map(cellPos + rect.tableStart);
|
|
323
|
-
tr.delete(mapped, mapped + cell.nodeSize);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
tr.setNodeMarkup(mergedPos + rect.tableStart, null, setAttr(addColSpan(mergedCell.attrs, mergedCell.attrs.colspan, rect.right - rect.left - mergedCell.attrs.colspan), 'rowspan', rect.bottom - rect.top));
|
|
328
|
-
if (content.size) {
|
|
329
|
-
const end = mergedPos + 1 + mergedCell.content.size;
|
|
330
|
-
const start = isCellEmpty(mergedCell) ? mergedPos + 1 : end;
|
|
331
|
-
tr.replaceWith(start + rect.tableStart, end + rect.tableStart, content);
|
|
332
|
-
}
|
|
333
|
-
tr.setSelection(new CellSelection(tr.doc.resolve(mergedPos + rect.tableStart)));
|
|
334
|
-
dispatch(tr);
|
|
335
|
-
}
|
|
336
|
-
return true;
|
|
337
|
-
};
|
|
338
|
-
/**
|
|
339
|
-
* @hidden
|
|
340
|
-
*/
|
|
341
|
-
// Split a selected cell, whose rowpan or colspan is greater than one,
|
|
342
|
-
// into smaller cells. Use the first cell type for the new cells.
|
|
343
|
-
export const splitCell = (state, dispatch) => {
|
|
344
|
-
const nodeTypes = tableNodeTypes(state.schema);
|
|
345
|
-
return splitCellWithType(({ node }) => {
|
|
346
|
-
return nodeTypes[node.type.spec.tableRole];
|
|
347
|
-
})(state, dispatch);
|
|
348
|
-
};
|
|
349
|
-
const deleteTableElement = (selector) => (state, dispatch) => {
|
|
350
|
-
const $pos = state.selection.$anchor;
|
|
351
|
-
for (let d = $pos.depth; d > 0; d--) {
|
|
352
|
-
const node = $pos.node(d);
|
|
353
|
-
if (selector(node)) {
|
|
354
|
-
if (dispatch) {
|
|
355
|
-
const tr = state.tr;
|
|
356
|
-
tr.delete($pos.before(d), $pos.after(d)).scrollIntoView();
|
|
357
|
-
dispatch(tr);
|
|
358
|
-
}
|
|
359
|
-
return true;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
return false;
|
|
363
|
-
};
|
|
364
|
-
const ɵ5 = deleteTableElement;
|
|
365
|
-
/**
|
|
366
|
-
* @hidden
|
|
367
|
-
*/
|
|
368
|
-
// Deletes the table around the selection, if any.
|
|
369
|
-
export const deleteTable = deleteTableElement(isTable);
|
|
370
|
-
export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5 };
|
|
@@ -66,7 +66,7 @@ ColorPickerDialogComponent = tslib_1.__decorate([
|
|
|
66
66
|
<div class="k-edit-form-container k-window-content" style="text-align: center;">
|
|
67
67
|
<kendo-colorpicker
|
|
68
68
|
#colorpicker
|
|
69
|
-
[
|
|
69
|
+
[views]="['palette']"
|
|
70
70
|
[format]="'hex'"
|
|
71
71
|
[attr.title]="title"
|
|
72
72
|
[icon]="icon"
|
|
@@ -123,26 +123,26 @@ FileLinkDialogComponent = tslib_1.__decorate([
|
|
|
123
123
|
<label (click)="hrefInput.focus()">{{ textForWithPrefix('WebAddress') }}</label>
|
|
124
124
|
</div>
|
|
125
125
|
<div class="k-edit-field">
|
|
126
|
-
<input #hrefInput formControlName="href" type="text" class="k-textbox" />
|
|
126
|
+
<input #hrefInput formControlName="href" type="text" class="k-textbox k-input k-rounded-md" />
|
|
127
127
|
</div>
|
|
128
128
|
|
|
129
129
|
<div class="k-edit-label">
|
|
130
130
|
<label (click)="textInput.focus()">{{ textForWithPrefix('Text') }}</label>
|
|
131
131
|
</div>
|
|
132
132
|
<div class="k-edit-field">
|
|
133
|
-
<input #textInput formControlName="text" type="text" class="k-textbox" />
|
|
133
|
+
<input #textInput formControlName="text" type="text" class="k-textbox k-input k-rounded-md" />
|
|
134
134
|
</div>
|
|
135
135
|
|
|
136
136
|
<div class="k-edit-label">
|
|
137
137
|
<label (click)="titleInput.focus()">{{ textForWithPrefix('Title') }}</label>
|
|
138
138
|
</div>
|
|
139
139
|
<div class="k-edit-field">
|
|
140
|
-
<input #titleInput formControlName="title" type="text" class="k-textbox" />
|
|
140
|
+
<input #titleInput formControlName="title" type="text" class="k-textbox k-input k-rounded-md" />
|
|
141
141
|
</div>
|
|
142
142
|
<ng-container *ngIf="command === 'createLink'">
|
|
143
143
|
<div class="k-edit-label"></div>
|
|
144
144
|
<div class="k-edit-field">
|
|
145
|
-
<input type="checkbox" id="k-target-blank"
|
|
145
|
+
<input type="checkbox" id="k-target-blank" kendoCheckBox formControlName="target" />
|
|
146
146
|
<label class="k-checkbox-label" for="k-target-blank">{{ textForWithPrefix('OpenInNewWindow') }}</label>
|
|
147
147
|
</div>
|
|
148
148
|
</ng-container>
|
|
@@ -101,25 +101,25 @@ ImageDialogComponent = tslib_1.__decorate([
|
|
|
101
101
|
<label [for]="srcInputId">{{ textFor('imageWebAddress') }}</label>
|
|
102
102
|
</div>
|
|
103
103
|
<div class="k-edit-field">
|
|
104
|
-
<input [id]="srcInputId" #srcInput [formControl]="src" type="text" class="k-textbox" />
|
|
104
|
+
<input [id]="srcInputId" #srcInput [formControl]="src" type="text" class="k-textbox k-input k-rounded-md" />
|
|
105
105
|
</div>
|
|
106
106
|
<div class="k-edit-label">
|
|
107
107
|
<label [for]="altTextInputId">{{ textFor('imageAltText') }}</label>
|
|
108
108
|
</div>
|
|
109
109
|
<div class="k-edit-field">
|
|
110
|
-
<input [id]="altTextInputId" [formControl]="alt" type="text" class="k-textbox" />
|
|
110
|
+
<input [id]="altTextInputId" [formControl]="alt" type="text" class="k-textbox k-input k-rounded-md" />
|
|
111
111
|
</div>
|
|
112
112
|
<div class="k-edit-label">
|
|
113
113
|
<label [for]="widthInputId">{{ textFor('imageWidth') }}</label>
|
|
114
114
|
</div>
|
|
115
115
|
<div class="k-edit-field">
|
|
116
|
-
<input [id]="widthInputId" [formControl]="width" type="text" class="k-textbox" />
|
|
116
|
+
<input [id]="widthInputId" [formControl]="width" type="text" class="k-textbox k-input k-rounded-md" />
|
|
117
117
|
</div>
|
|
118
118
|
<div class="k-edit-label">
|
|
119
119
|
<label [for]="heightInputId">{{ textFor('imageHeight') }}</label>
|
|
120
120
|
</div>
|
|
121
121
|
<div class="k-edit-field">
|
|
122
|
-
<input [id]="heightInputId" [formControl]="height" type="text" class="k-textbox" />
|
|
122
|
+
<input [id]="heightInputId" [formControl]="height" type="text" class="k-textbox k-input k-rounded-md" />
|
|
123
123
|
</div>
|
|
124
124
|
</div>
|
|
125
125
|
</div>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright © 2021 Progress Software Corporation. All rights reserved.
|
|
3
3
|
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
4
|
*-------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { cleanFormatting } from '@progress/kendo-editor-common';
|
|
5
|
+
import { blockquote, cleanFormatting, isIndented } from '@progress/kendo-editor-common';
|
|
6
6
|
import { alignRightRules, alignCenterRules, alignLeftRules, alignJustifyRules, isAligned, bold, italic, underline, strikethrough, subscript, superscript, link, activeNode, hasNode, getActiveMarks, hasMark, expandSelection, indentRules, outdentRules, canIndentAsListItem, canOutdentAsListItem, canBeIndented, undo, redo, addRowBefore, addRowAfter, addColumnBefore, addColumnAfter, deleteRow, deleteColumn, deleteTable, mergeCells, splitCell } from '@progress/kendo-editor-common';
|
|
7
7
|
/**
|
|
8
8
|
* @hidden
|
|
@@ -36,6 +36,10 @@ export const getToolbarState = (state, options) => ({
|
|
|
36
36
|
selected: activeNode(state),
|
|
37
37
|
disabled: false
|
|
38
38
|
},
|
|
39
|
+
blockquote: {
|
|
40
|
+
selected: false,
|
|
41
|
+
disabled: !blockquote(state)
|
|
42
|
+
},
|
|
39
43
|
indent: {
|
|
40
44
|
selected: false,
|
|
41
45
|
disabled: !(canIndentAsListItem(state, state.schema.nodes.list_item) || canBeIndented(state, indentRules))
|
|
@@ -58,7 +62,11 @@ export const getToolbarState = (state, options) => ({
|
|
|
58
62
|
},
|
|
59
63
|
outdent: {
|
|
60
64
|
selected: false,
|
|
61
|
-
disabled
|
|
65
|
+
get disabled() {
|
|
66
|
+
return !(hasNode(state, state.schema.nodes.blockquote) ||
|
|
67
|
+
canOutdentAsListItem(state, outdentRules) ||
|
|
68
|
+
isIndented(state, outdentRules.nodes));
|
|
69
|
+
}
|
|
62
70
|
},
|
|
63
71
|
redo: {
|
|
64
72
|
selected: false,
|
|
@@ -184,6 +192,7 @@ export const initialToolBarState = {
|
|
|
184
192
|
format: { selected: { text: 'Format', tag: null }, disabled: false },
|
|
185
193
|
style: { selected: { marks: [], hasNodesWithoutMarks: false }, disabled: false },
|
|
186
194
|
cleanFormatting: { selected: false, disabled: true },
|
|
195
|
+
blockquote: { selected: false, disabled: false },
|
|
187
196
|
//indent
|
|
188
197
|
indent: { selected: false, disabled: false },
|
|
189
198
|
outdent: { selected: false, disabled: false },
|
|
@@ -236,6 +245,7 @@ export const disabledToolBarState = {
|
|
|
236
245
|
format: { selected: { text: 'Format', tag: null }, disabled: true },
|
|
237
246
|
style: { selected: { marks: [], hasNodesWithoutMarks: false }, disabled: true },
|
|
238
247
|
cleanFormatting: { selected: false, disabled: true },
|
|
248
|
+
blockquote: { selected: false, disabled: true },
|
|
239
249
|
//indent
|
|
240
250
|
indent: { selected: false, disabled: true },
|
|
241
251
|
outdent: { selected: false, disabled: true },
|
|
@@ -189,7 +189,7 @@ export declare class EditorComponent implements AfterViewInit, ControlValueAcces
|
|
|
189
189
|
* @param {any} attr - Optional parameters for the command. Apart from the following list,
|
|
190
190
|
* the parameters do not expect specific attributes when you call them:
|
|
191
191
|
* - `format` - Accepts an object with the `tag` property.
|
|
192
|
-
* The supported tags are `p
|
|
192
|
+
* The supported tags are `p` and any of the `h1` to `h6` heading tags.
|
|
193
193
|
* - `createLink` - Accepts an object with the `href`, `title`, and `target` properties. The `href` property is mandatory.
|
|
194
194
|
* - `setHTML` - Accepts a `string` parameter.
|
|
195
195
|
* - `insertTable` - Accepts an object with the `rows` and `cols` properties. The number values are zero based.
|
|
@@ -11,7 +11,7 @@ import { map, filter, take } from 'rxjs/operators';
|
|
|
11
11
|
import { ToolBarComponent } from '@progress/kendo-angular-toolbar';
|
|
12
12
|
import { DialogService } from '@progress/kendo-angular-dialog';
|
|
13
13
|
import { hasObservers, isDocumentAvailable, KendoInput } from '@progress/kendo-angular-common';
|
|
14
|
-
import { buildKeymap, buildListKeymap, getHtml, pasteCleanup, sanitize, removeComments, sanitizeClassAttr, sanitizeStyleAttr, removeAttribute, placeholder, EditorView, EditorState, baseKeymap, keymap, history, parseContent, Plugin, PluginKey, TextSelection, Schema, AllSelection, gapCursor, getSelectionText, imageResizing } from '@progress/kendo-editor-common';
|
|
14
|
+
import { buildKeymap, buildListKeymap, getHtml, pasteCleanup, sanitize, removeComments, sanitizeClassAttr, sanitizeStyleAttr, removeAttribute, placeholder, EditorView, EditorState, baseKeymap, keymap, history, parseContent, Plugin, PluginKey, TextSelection, Schema, AllSelection, gapCursor, getSelectionText, imageResizing, tableEditing } from '@progress/kendo-editor-common';
|
|
15
15
|
import { validatePackage } from '@progress/kendo-licensing';
|
|
16
16
|
import { packageMetadata } from './package-metadata';
|
|
17
17
|
import { schema } from './config/schema';
|
|
@@ -122,6 +122,9 @@ let EditorComponent = EditorComponent_1 = class EditorComponent {
|
|
|
122
122
|
this.contentAreaLoaded = new Subject();
|
|
123
123
|
this.dispatchTransaction = (tr) => {
|
|
124
124
|
const docChanged = tr.docChanged;
|
|
125
|
+
if (this.disabled || (this.readonly && docChanged)) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
125
128
|
if (docChanged) {
|
|
126
129
|
const doc = tr.doc;
|
|
127
130
|
const html = getHtml({ doc });
|
|
@@ -418,7 +421,7 @@ let EditorComponent = EditorComponent_1 = class EditorComponent {
|
|
|
418
421
|
* @param {any} attr - Optional parameters for the command. Apart from the following list,
|
|
419
422
|
* the parameters do not expect specific attributes when you call them:
|
|
420
423
|
* - `format` - Accepts an object with the `tag` property.
|
|
421
|
-
* The supported tags are `p
|
|
424
|
+
* The supported tags are `p` and any of the `h1` to `h6` heading tags.
|
|
422
425
|
* - `createLink` - Accepts an object with the `href`, `title`, and `target` properties. The `href` property is mandatory.
|
|
423
426
|
* - `setHTML` - Accepts a `string` parameter.
|
|
424
427
|
* - `insertTable` - Accepts an object with the `rows` and `cols` properties. The number values are zero based.
|
|
@@ -629,16 +632,13 @@ let EditorComponent = EditorComponent_1 = class EditorComponent {
|
|
|
629
632
|
}
|
|
630
633
|
})
|
|
631
634
|
}),
|
|
632
|
-
new Plugin({
|
|
633
|
-
key: new PluginKey('editor-filter-disabled-state'),
|
|
634
|
-
filterTransaction: () => !this.disabled || this.inForm
|
|
635
|
-
}),
|
|
636
635
|
history(),
|
|
637
636
|
keymap(buildListKeymap(currentSchema)),
|
|
638
637
|
keymap(buildKeymap(currentSchema, { applyToWord: this.applyToWord })),
|
|
639
638
|
keymap(baseKeymap),
|
|
640
639
|
gapCursor(),
|
|
641
|
-
imageResizing()
|
|
640
|
+
imageResizing(),
|
|
641
|
+
tableEditing()
|
|
642
642
|
];
|
|
643
643
|
if (this.placeholder) {
|
|
644
644
|
defaultPlugins.push(placeholder(this.placeholder));
|
|
@@ -677,7 +677,7 @@ let EditorComponent = EditorComponent_1 = class EditorComponent {
|
|
|
677
677
|
this.subs.add(fromEvent(containerElement, 'focusin')
|
|
678
678
|
.subscribe(() => {
|
|
679
679
|
if (this.readonly) {
|
|
680
|
-
contentAreaClasslist.add('k-
|
|
680
|
+
contentAreaClasslist.add('k-focus');
|
|
681
681
|
}
|
|
682
682
|
if (!this.focusChangedProgrammatically || this.shouldEmitFocus) {
|
|
683
683
|
this.ngZone.run(() => this.onFocus.emit());
|
|
@@ -687,7 +687,7 @@ let EditorComponent = EditorComponent_1 = class EditorComponent {
|
|
|
687
687
|
this.subs.add(fromEvent(containerElement, 'focusout')
|
|
688
688
|
.subscribe(() => {
|
|
689
689
|
if (this.readonly) {
|
|
690
|
-
contentAreaClasslist.remove('k-
|
|
690
|
+
contentAreaClasslist.remove('k-focus');
|
|
691
691
|
}
|
|
692
692
|
if (!this.focusChangedProgrammatically) {
|
|
693
693
|
this.ngZone.run(() => this.onBlur.emit());
|
|
@@ -833,7 +833,7 @@ tslib_1.__decorate([
|
|
|
833
833
|
tslib_1.__metadata("design:paramtypes", [])
|
|
834
834
|
], EditorComponent.prototype, "resizableClass", null);
|
|
835
835
|
tslib_1.__decorate([
|
|
836
|
-
HostBinding('class.k-
|
|
836
|
+
HostBinding('class.k-disabled'),
|
|
837
837
|
tslib_1.__metadata("design:type", Boolean),
|
|
838
838
|
tslib_1.__metadata("design:paramtypes", [])
|
|
839
839
|
], EditorComponent.prototype, "isDisabled", null);
|
|
@@ -939,6 +939,8 @@ EditorComponent = EditorComponent_1 = tslib_1.__decorate([
|
|
|
939
939
|
alignRight="Align text right"
|
|
940
940
|
i18n-backColor="kendo.editor.backColor|The title of the tool that changes the text background color."
|
|
941
941
|
backColor="Background color"
|
|
942
|
+
i18n-blockquote="kendo.editor.blockquote|The title of the tool that wraps an element in a blockquote"
|
|
943
|
+
blockquote="Quotation"
|
|
942
944
|
i18n-bold="kendo.editor.bold|The title of the tool that makes text bold."
|
|
943
945
|
bold="Bold"
|
|
944
946
|
i18n-cleanFormatting="kendo.editor.cleanFormatting|The title of the Clean Formatting tool."
|
|
@@ -10,8 +10,7 @@ import { ToolBarModule } from '@progress/kendo-angular-toolbar';
|
|
|
10
10
|
import { DropDownsModule } from '@progress/kendo-angular-dropdowns';
|
|
11
11
|
import { DialogModule } from '@progress/kendo-angular-dialog';
|
|
12
12
|
import { ButtonModule } from '@progress/kendo-angular-buttons';
|
|
13
|
-
import { ColorPickerModule } from '@progress/kendo-angular-inputs';
|
|
14
|
-
import { NumericTextBoxModule, TextBoxModule } from '@progress/kendo-angular-inputs';
|
|
13
|
+
import { NumericTextBoxModule, TextBoxModule, ColorPickerModule, CheckBoxModule } from '@progress/kendo-angular-inputs';
|
|
15
14
|
import { EditorComponent } from './editor.component';
|
|
16
15
|
import { ImageDialogComponent } from './dialogs/image-dialog.component';
|
|
17
16
|
import { SourceDialogComponent } from './dialogs/source-dialog.component';
|
|
@@ -30,6 +29,7 @@ import { EditorAlignLeftButtonDirective } from './tools/alignment/editor-align-l
|
|
|
30
29
|
import { EditorAlignCenterButtonDirective } from './tools/alignment/editor-align-center-button.directive';
|
|
31
30
|
import { EditorAlignRightButtonDirective } from './tools/alignment/editor-align-right-button.directive';
|
|
32
31
|
import { EditorAlignJustifyButtonDirective } from './tools/alignment/editor-align-justify-button.directive';
|
|
32
|
+
import { EditorBlockquoteDirective } from './tools/blockquote/editor-blockquote-button.directive';
|
|
33
33
|
import { EditorRedoButtonDirective } from './tools/history/editor-redo-button.directive';
|
|
34
34
|
import { EditorUndoButtonDirective } from './tools/history/editor-undo-button.directive';
|
|
35
35
|
import { EditorInsertImageButtonDirective } from './tools/image/editor-insert-image-button.directive';
|
|
@@ -123,7 +123,9 @@ const COMPONENT_DIRECTIVES = [
|
|
|
123
123
|
// print
|
|
124
124
|
EditorPrintDirective,
|
|
125
125
|
// select all
|
|
126
|
-
EditorSelectAllButtonDirective
|
|
126
|
+
EditorSelectAllButtonDirective,
|
|
127
|
+
// blockquote
|
|
128
|
+
EditorBlockquoteDirective
|
|
127
129
|
];
|
|
128
130
|
const TOOLBAR_TOOLS = [
|
|
129
131
|
EditorFontSizeComponent,
|
|
@@ -227,6 +229,7 @@ EditorModule = tslib_1.__decorate([
|
|
|
227
229
|
DialogModule,
|
|
228
230
|
DropDownsModule,
|
|
229
231
|
NumericTextBoxModule,
|
|
232
|
+
CheckBoxModule,
|
|
230
233
|
ToolBarModule,
|
|
231
234
|
TextBoxModule
|
|
232
235
|
]
|
package/dist/es2015/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export * from './main';
|
|
9
9
|
export { DialogCommand, EditorCommand } from './common/commands';
|
|
10
|
+
export { semanticNodes, semanticTagNames } from './config/semantic-nodes';
|
|
10
11
|
export { ColorPickerDialogComponent } from './dialogs/colorpicker-dialog.component';
|
|
11
12
|
export { FileLinkDialogComponent } from './dialogs/file-link-dialog.component';
|
|
12
13
|
export { FontFamilyDialogComponent } from './dialogs/font-family-dialog.component';
|
|
@@ -23,6 +24,7 @@ export { EditorAlignCenterButtonDirective } from './tools/alignment/editor-align
|
|
|
23
24
|
export { EditorAlignJustifyButtonDirective } from './tools/alignment/editor-align-justify-button.directive';
|
|
24
25
|
export { EditorAlignLeftButtonDirective } from './tools/alignment/editor-align-left-button.directive';
|
|
25
26
|
export { EditorAlignRightButtonDirective } from './tools/alignment/editor-align-right-button.directive';
|
|
27
|
+
export { EditorBlockquoteDirective } from './tools/blockquote/editor-blockquote-button.directive';
|
|
26
28
|
export { EditorBackColorDirective } from './tools/colorpicker/editor-back-color.directive';
|
|
27
29
|
export { EditorColorPickerComponent } from './tools/colorpicker/editor-colorpicker.component';
|
|
28
30
|
export { EditorForeColorDirective } from './tools/colorpicker/editor-fore-color.directive';
|
package/dist/es2015/index.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* Generated bundle index. Do not edit.
|
|
7
7
|
*/
|
|
8
8
|
export * from './main';
|
|
9
|
+
export { semanticNodes, semanticTagNames } from './config/semantic-nodes';
|
|
9
10
|
export { ColorPickerDialogComponent } from './dialogs/colorpicker-dialog.component';
|
|
10
11
|
export { FileLinkDialogComponent } from './dialogs/file-link-dialog.component';
|
|
11
12
|
export { FontFamilyDialogComponent } from './dialogs/font-family-dialog.component';
|
|
@@ -22,6 +23,7 @@ export { EditorAlignCenterButtonDirective } from './tools/alignment/editor-align
|
|
|
22
23
|
export { EditorAlignJustifyButtonDirective } from './tools/alignment/editor-align-justify-button.directive';
|
|
23
24
|
export { EditorAlignLeftButtonDirective } from './tools/alignment/editor-align-left-button.directive';
|
|
24
25
|
export { EditorAlignRightButtonDirective } from './tools/alignment/editor-align-right-button.directive';
|
|
26
|
+
export { EditorBlockquoteDirective } from './tools/blockquote/editor-blockquote-button.directive';
|
|
25
27
|
export { EditorBackColorDirective } from './tools/colorpicker/editor-back-color.directive';
|
|
26
28
|
export { EditorColorPickerComponent } from './tools/colorpicker/editor-colorpicker.component';
|
|
27
29
|
export { EditorForeColorDirective } from './tools/colorpicker/editor-fore-color.directive';
|