@syncfusion/ej2-richtexteditor 23.2.7-52849 → 24.1.41-569781

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.
Files changed (171) hide show
  1. package/.eslintrc.json +260 -0
  2. package/CHANGELOG.md +177 -1
  3. package/dist/ej2-richtexteditor.umd.min.js +1 -1
  4. package/dist/ej2-richtexteditor.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-richtexteditor.es2015.js +2919 -1147
  6. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  7. package/dist/es6/ej2-richtexteditor.es5.js +2906 -1133
  8. package/dist/es6/ej2-richtexteditor.es5.js.map +1 -1
  9. package/package.json +13 -13
  10. package/src/common/config.d.ts +7 -0
  11. package/src/common/config.js +12 -1
  12. package/src/common/constant.d.ts +6 -0
  13. package/src/common/constant.js +6 -0
  14. package/src/common/interface.d.ts +12 -0
  15. package/src/common/types.d.ts +6 -0
  16. package/src/common/util.d.ts +6 -0
  17. package/src/common/util.js +61 -20
  18. package/src/editor-manager/base/constant.d.ts +6 -0
  19. package/src/editor-manager/base/constant.js +6 -0
  20. package/src/editor-manager/base/editor-manager.d.ts +5 -0
  21. package/src/editor-manager/base/editor-manager.js +59 -0
  22. package/src/editor-manager/base/interface.d.ts +8 -0
  23. package/src/editor-manager/plugin/audio.js +13 -3
  24. package/src/editor-manager/plugin/dom-node.d.ts +5 -1
  25. package/src/editor-manager/plugin/dom-node.js +169 -28
  26. package/src/editor-manager/plugin/format-painter-actions.d.ts +1 -0
  27. package/src/editor-manager/plugin/format-painter-actions.js +19 -1
  28. package/src/editor-manager/plugin/formats.d.ts +1 -0
  29. package/src/editor-manager/plugin/formats.js +38 -3
  30. package/src/editor-manager/plugin/image.js +38 -15
  31. package/src/editor-manager/plugin/inserthtml.d.ts +1 -0
  32. package/src/editor-manager/plugin/inserthtml.js +67 -7
  33. package/src/editor-manager/plugin/link.js +4 -1
  34. package/src/editor-manager/plugin/lists.js +121 -65
  35. package/src/editor-manager/plugin/ms-word-clean-up.d.ts +3 -0
  36. package/src/editor-manager/plugin/ms-word-clean-up.js +215 -85
  37. package/src/editor-manager/plugin/nodecutter.js +2 -2
  38. package/src/editor-manager/plugin/selection-commands.d.ts +1 -0
  39. package/src/editor-manager/plugin/selection-commands.js +165 -3
  40. package/src/editor-manager/plugin/table.d.ts +0 -1
  41. package/src/editor-manager/plugin/table.js +33 -30
  42. package/src/editor-manager/plugin/toolbar-status.d.ts +2 -2
  43. package/src/editor-manager/plugin/toolbar-status.js +20 -10
  44. package/src/editor-manager/plugin/undo.d.ts +1 -0
  45. package/src/editor-manager/plugin/undo.js +21 -1
  46. package/src/rich-text-editor/actions/base-quick-toolbar.d.ts +3 -3
  47. package/src/rich-text-editor/actions/base-quick-toolbar.js +66 -15
  48. package/src/rich-text-editor/actions/base-toolbar.js +32 -34
  49. package/src/rich-text-editor/actions/color-picker.d.ts +1 -0
  50. package/src/rich-text-editor/actions/color-picker.js +13 -3
  51. package/src/rich-text-editor/actions/count.js +1 -1
  52. package/src/rich-text-editor/actions/dropdown-buttons.js +25 -4
  53. package/src/rich-text-editor/actions/emoji-picker.js +15 -6
  54. package/src/rich-text-editor/actions/enter-key.js +6 -4
  55. package/src/rich-text-editor/actions/file-manager.js +1 -1
  56. package/src/rich-text-editor/actions/format-painter.js +1 -1
  57. package/src/rich-text-editor/actions/full-screen.js +5 -4
  58. package/src/rich-text-editor/actions/html-editor.d.ts +2 -0
  59. package/src/rich-text-editor/actions/html-editor.js +127 -17
  60. package/src/rich-text-editor/actions/keyboard.js +3 -1
  61. package/src/rich-text-editor/actions/markdown-editor.js +3 -1
  62. package/src/rich-text-editor/actions/paste-clean-up.d.ts +5 -0
  63. package/src/rich-text-editor/actions/paste-clean-up.js +156 -28
  64. package/src/rich-text-editor/actions/quick-toolbar.d.ts +7 -0
  65. package/src/rich-text-editor/actions/quick-toolbar.js +45 -11
  66. package/src/rich-text-editor/actions/resize.js +2 -1
  67. package/src/rich-text-editor/actions/toolbar-action.js +1 -1
  68. package/src/rich-text-editor/actions/toolbar.d.ts +3 -3
  69. package/src/rich-text-editor/actions/toolbar.js +35 -96
  70. package/src/rich-text-editor/base/classes.d.ts +5 -5
  71. package/src/rich-text-editor/base/classes.js +5 -5
  72. package/src/rich-text-editor/base/constant.d.ts +46 -1
  73. package/src/rich-text-editor/base/constant.js +215 -1
  74. package/src/rich-text-editor/base/interface.d.ts +47 -3
  75. package/src/rich-text-editor/base/rich-text-editor-model.d.ts +3 -3
  76. package/src/rich-text-editor/base/rich-text-editor.d.ts +16 -4
  77. package/src/rich-text-editor/base/rich-text-editor.js +196 -100
  78. package/src/rich-text-editor/base/util.d.ts +4 -0
  79. package/src/rich-text-editor/base/util.js +57 -5
  80. package/src/rich-text-editor/formatter/formatter.js +15 -4
  81. package/src/rich-text-editor/models/default-locale.js +31 -25
  82. package/src/rich-text-editor/models/items.js +3 -3
  83. package/src/rich-text-editor/models/toolbar-settings-model.d.ts +1 -1
  84. package/src/rich-text-editor/models/toolbar-settings.d.ts +1 -1
  85. package/src/rich-text-editor/models/toolbar-settings.js +1 -1
  86. package/src/rich-text-editor/renderer/audio-module.d.ts +1 -0
  87. package/src/rich-text-editor/renderer/audio-module.js +13 -0
  88. package/src/rich-text-editor/renderer/dialog-renderer.d.ts +2 -0
  89. package/src/rich-text-editor/renderer/dialog-renderer.js +22 -2
  90. package/src/rich-text-editor/renderer/iframe-content-renderer.js +2 -1
  91. package/src/rich-text-editor/renderer/image-module.d.ts +9 -1
  92. package/src/rich-text-editor/renderer/image-module.js +244 -212
  93. package/src/rich-text-editor/renderer/link-module.js +53 -24
  94. package/src/rich-text-editor/renderer/table-module.d.ts +10 -1
  95. package/src/rich-text-editor/renderer/table-module.js +330 -165
  96. package/src/rich-text-editor/renderer/toolbar-renderer.d.ts +4 -6
  97. package/src/rich-text-editor/renderer/toolbar-renderer.js +105 -106
  98. package/src/rich-text-editor/renderer/video-module.d.ts +3 -0
  99. package/src/rich-text-editor/renderer/video-module.js +61 -34
  100. package/src/rich-text-editor/renderer/view-source.d.ts +1 -0
  101. package/src/rich-text-editor/renderer/view-source.js +15 -5
  102. package/src/selection/selection.js +3 -0
  103. package/styles/bootstrap-dark.css +345 -99
  104. package/styles/bootstrap.css +353 -108
  105. package/styles/bootstrap4.css +337 -95
  106. package/styles/bootstrap5-dark.css +343 -96
  107. package/styles/bootstrap5.css +343 -96
  108. package/styles/fabric-dark.css +331 -89
  109. package/styles/fabric.css +332 -90
  110. package/styles/fluent-dark.css +342 -92
  111. package/styles/fluent.css +342 -92
  112. package/styles/highcontrast-light.css +331 -89
  113. package/styles/highcontrast.css +335 -90
  114. package/styles/material-dark.css +337 -90
  115. package/styles/material.css +337 -90
  116. package/styles/material3-dark.css +347 -99
  117. package/styles/material3.css +347 -99
  118. package/styles/rich-text-editor/_bds-definition.scss +279 -0
  119. package/styles/rich-text-editor/_bootstrap-dark-definition.scss +14 -10
  120. package/styles/rich-text-editor/_bootstrap-definition.scss +20 -17
  121. package/styles/rich-text-editor/_bootstrap4-definition.scss +11 -7
  122. package/styles/rich-text-editor/_bootstrap5-definition.scss +8 -4
  123. package/styles/rich-text-editor/_fabric-dark-definition.scss +6 -2
  124. package/styles/rich-text-editor/_fabric-definition.scss +7 -3
  125. package/styles/rich-text-editor/_fluent-definition.scss +9 -5
  126. package/styles/rich-text-editor/_fusionnew-definition.scss +7 -3
  127. package/styles/rich-text-editor/_highcontrast-definition.scss +7 -3
  128. package/styles/rich-text-editor/_highcontrast-light-definition.scss +6 -2
  129. package/styles/rich-text-editor/_layout.scss +208 -31
  130. package/styles/rich-text-editor/_material-dark-definition.scss +6 -2
  131. package/styles/rich-text-editor/_material-definition.scss +6 -2
  132. package/styles/rich-text-editor/_material3-definition.scss +16 -12
  133. package/styles/rich-text-editor/_tailwind-definition.scss +25 -21
  134. package/styles/rich-text-editor/_theme.scss +93 -24
  135. package/styles/rich-text-editor/bootstrap-dark.css +345 -99
  136. package/styles/rich-text-editor/bootstrap.css +353 -108
  137. package/styles/rich-text-editor/bootstrap4.css +337 -95
  138. package/styles/rich-text-editor/bootstrap5-dark.css +343 -96
  139. package/styles/rich-text-editor/bootstrap5.css +343 -96
  140. package/styles/rich-text-editor/fabric-dark.css +331 -89
  141. package/styles/rich-text-editor/fabric.css +332 -90
  142. package/styles/rich-text-editor/fluent-dark.css +342 -92
  143. package/styles/rich-text-editor/fluent.css +342 -92
  144. package/styles/rich-text-editor/highcontrast-light.css +331 -89
  145. package/styles/rich-text-editor/highcontrast.css +335 -90
  146. package/styles/rich-text-editor/icons/_bds.scss +348 -0
  147. package/styles/rich-text-editor/icons/_bootstrap-dark.scss +4 -4
  148. package/styles/rich-text-editor/icons/_bootstrap.scss +4 -4
  149. package/styles/rich-text-editor/icons/_bootstrap4.scss +4 -4
  150. package/styles/rich-text-editor/icons/_bootstrap5.scss +4 -4
  151. package/styles/rich-text-editor/icons/_fabric-dark.scss +4 -4
  152. package/styles/rich-text-editor/icons/_fabric.scss +4 -4
  153. package/styles/rich-text-editor/icons/_fluent.scss +4 -4
  154. package/styles/rich-text-editor/icons/_fusionnew.scss +3 -3
  155. package/styles/rich-text-editor/icons/_highcontrast-light.scss +4 -4
  156. package/styles/rich-text-editor/icons/_highcontrast.scss +4 -4
  157. package/styles/rich-text-editor/icons/_material-dark.scss +4 -4
  158. package/styles/rich-text-editor/icons/_material.scss +4 -4
  159. package/styles/rich-text-editor/icons/_material3.scss +4 -4
  160. package/styles/rich-text-editor/icons/_tailwind.scss +4 -4
  161. package/styles/rich-text-editor/material-dark.css +337 -90
  162. package/styles/rich-text-editor/material.css +337 -90
  163. package/styles/rich-text-editor/material3-dark.css +347 -99
  164. package/styles/rich-text-editor/material3.css +347 -99
  165. package/styles/rich-text-editor/tailwind-dark.css +386 -116
  166. package/styles/rich-text-editor/tailwind.css +386 -116
  167. package/styles/tailwind-dark.css +386 -116
  168. package/styles/tailwind.css +386 -116
  169. package/.github/PULL_REQUEST_TEMPLATE/Bug.md +0 -41
  170. package/.github/PULL_REQUEST_TEMPLATE/Feature.md +0 -27
  171. package/src/global.d.ts +0 -1
@@ -38,6 +38,45 @@ var SelectionCommands = /** @class */ (function () {
38
38
  var nodeCutter = new NodeCutter();
39
39
  var isFormatted = new IsFormatted();
40
40
  var range = domSelection.getRange(docElement);
41
+ var currentAnchorNode = range.startContainer.parentElement;
42
+ if (range.collapsed && !isNOU(currentAnchorNode) &&
43
+ currentAnchorNode.tagName === 'A' &&
44
+ (range.startOffset === currentAnchorNode.textContent.length || range.startOffset === 0)) {
45
+ var emptyTextNode = document.createTextNode('');
46
+ if (range.startOffset === 0) {
47
+ currentAnchorNode.parentNode.insertBefore(emptyTextNode, currentAnchorNode);
48
+ }
49
+ else {
50
+ if (!isNOU(currentAnchorNode.nextSibling)) {
51
+ currentAnchorNode.parentElement.insertBefore(emptyTextNode, currentAnchorNode.nextSibling);
52
+ }
53
+ else {
54
+ currentAnchorNode.parentNode.appendChild(emptyTextNode);
55
+ }
56
+ }
57
+ // Set the range to the empty text node
58
+ var newRange = docElement.createRange();
59
+ range.setStart(emptyTextNode, 0);
60
+ range.setEnd(emptyTextNode, 0);
61
+ range.collapse(true);
62
+ domSelection.setRange(docElement, newRange);
63
+ }
64
+ if (Browser.userAgent.indexOf('Firefox') !== -1 && range.startContainer === range.endContainer && !isNOU(endNode) && range.startContainer === endNode) {
65
+ var startChildNodes = range.startContainer.childNodes;
66
+ var startNode = ((startChildNodes[(range.startOffset > 0) ? (range.startOffset - 1) :
67
+ range.startOffset]) || range.startContainer);
68
+ var endNode_1 = (range.endContainer.childNodes[(range.endOffset > 0) ? (range.endOffset - 1) :
69
+ range.endOffset] || range.endContainer);
70
+ var lastSelectionNode = (endNode_1.lastChild.nodeName === 'BR' ? (isNOU(endNode_1.lastChild.previousSibling) ? endNode_1
71
+ : endNode_1.lastChild.previousSibling) : endNode_1.firstChild);
72
+ while (!isNOU(lastSelectionNode) && lastSelectionNode.nodeName !== '#text' && lastSelectionNode.nodeName !== 'IMG' &&
73
+ lastSelectionNode.nodeName !== 'BR' && lastSelectionNode.nodeName !== 'HR') {
74
+ lastSelectionNode = lastSelectionNode.lastChild;
75
+ }
76
+ ;
77
+ domSelection.setSelectionText(docElement, startNode, lastSelectionNode, 0, 0);
78
+ range = domSelection.getRange(docElement);
79
+ }
41
80
  var save = domSelection.save(range, docElement);
42
81
  var nodes = range.collapsed ? domSelection.getSelectionNodeCollection(range) :
43
82
  domSelection.getSelectionNodeCollectionBr(range);
@@ -185,8 +224,7 @@ var SelectionCommands = /** @class */ (function () {
185
224
  cursorNodes[0].firstElementChild.tagName.toLowerCase() === 'br')) {
186
225
  cursorNodes[0].innerHTML = '';
187
226
  }
188
- if (cursorNodes.length === 1 && range.startOffset === 0 && (cursorNodes[0].nodeName === 'BR' ||
189
- cursorNodes[0].nextSibling.nodeName === 'BR')) {
227
+ if (cursorNodes.length === 1 && range.startOffset === 0 && (cursorNodes[0].nodeName === 'BR' || (isNOU(cursorNodes[0].nextSibling) ? false : cursorNodes[0].nextSibling.nodeName === 'BR'))) {
190
228
  detach(cursorNodes[0].nodeName === '#text' ? cursorNodes[0].nextSibling : cursorNodes[0]);
191
229
  }
192
230
  cursorNode = this.getInsertNode(docElement, range, format, value).firstChild;
@@ -211,11 +249,15 @@ var SelectionCommands = /** @class */ (function () {
211
249
  && range.endOffset === range.startContainer.length)) {
212
250
  var nodeIndex = [];
213
251
  var cloneNode = nodes[index];
252
+ var clonedElement = cloneNode;
214
253
  do {
215
254
  nodeIndex.push(domSelection.getIndex(cloneNode));
216
255
  cloneNode = cloneNode.parentNode;
217
256
  } while (cloneNode && (cloneNode !== formatNode));
218
257
  if (nodes[index].nodeName !== 'BR') {
258
+ if (clonedElement.nodeName === '#text' && clonedElement.textContent.includes('\u200B')) {
259
+ clonedElement.remove();
260
+ }
219
261
  cloneNode = splitNode = (isCursor && (formatNode.textContent.length - 1) === range.startOffset) ?
220
262
  nodeCutter.SplitNode(range, formatNode, true)
221
263
  : nodeCutter.GetSpliceNode(range, formatNode);
@@ -293,8 +335,45 @@ var SelectionCommands = /** @class */ (function () {
293
335
  formatNode.style.textDecoration = 'none';
294
336
  child = [formatNode];
295
337
  }
338
+ else if (IsFormatted.inlineTags.indexOf(formatNodeTagName.toLowerCase()) !== -1 && isFontStyle && formatNodeTagName.toLocaleLowerCase() !== 'span') {
339
+ var fontNodeStyle = formatNode.style;
340
+ if (fontNodeStyle.color && format === 'fontcolor') {
341
+ if (formatNode.nodeName === 'A') {
342
+ fontNodeStyle.color = value;
343
+ }
344
+ else {
345
+ fontNodeStyle.color = '';
346
+ }
347
+ }
348
+ else if (fontNodeStyle.backgroundColor && format === 'backgroundcolor') {
349
+ fontNodeStyle.backgroundColor = '';
350
+ }
351
+ else if (fontNodeStyle.fontSize && format === 'fontsize') {
352
+ fontNodeStyle.fontSize = '';
353
+ }
354
+ else if (fontNodeStyle.fontFamily && format === 'fontname') {
355
+ fontNodeStyle.fontFamily = '';
356
+ }
357
+ if (formatNode.getAttribute("style") === '') {
358
+ formatNode.removeAttribute("style");
359
+ }
360
+ child = [formatNode];
361
+ }
296
362
  else {
297
363
  child = InsertMethods.unwrap(formatNode);
364
+ var liElement = nodes[index].parentElement;
365
+ if (!isNOU(liElement) && liElement.tagName.toLowerCase() !== 'li') {
366
+ liElement = closest(liElement, 'li');
367
+ }
368
+ if (!isNOU(liElement) && liElement.tagName.toLowerCase() === 'li' &&
369
+ liElement.textContent.trim() === nodes[index].textContent.trim()) {
370
+ if (format === 'bold') {
371
+ liElement.style.fontWeight = 'normal';
372
+ }
373
+ else if (format === "italic") {
374
+ liElement.style.fontStyle = 'normal';
375
+ }
376
+ }
298
377
  }
299
378
  if (child[0] && !isFontStyle) {
300
379
  var nodeTraverse = child[index] ? child[index] : child[0];
@@ -343,6 +422,16 @@ var SelectionCommands = /** @class */ (function () {
343
422
  if (child[num].nodeType !== 3 || (child[num].textContent &&
344
423
  child[num].textContent.trim().length > 0)) {
345
424
  child[num] = InsertMethods.Wrap(child[num], this.GetFormatNode(format, value, formatNodeTagName, formatNodeStyles));
425
+ var liElement = nodes[index].parentElement;
426
+ if (!isNOU(liElement) && liElement.tagName.toLowerCase() !== 'li') {
427
+ liElement = closest(liElement, 'li');
428
+ }
429
+ if (!isNOU(liElement) && liElement.tagName.toLowerCase() === 'li' &&
430
+ liElement.textContent.trim() === nodes[index].textContent.trim()) {
431
+ if (format === 'fontname') {
432
+ liElement.style.fontFamily = value;
433
+ }
434
+ }
346
435
  if (child[num].textContent === startText) {
347
436
  if (num === 0) {
348
437
  range.setStartBefore(child[num]);
@@ -375,7 +464,10 @@ var SelectionCommands = /** @class */ (function () {
375
464
  }
376
465
  var num = index;
377
466
  var liChildContent = '';
378
- while (num >= 0 && !isNOU(liElement) && liElement.tagName.toLowerCase() === 'li' && liElement.textContent.replace('/\u200B/g', '').trim().includes(nodes[num].textContent.trim())) {
467
+ /* eslint-disable security/detect-object-injection */
468
+ while (num >= 0 && !isNOU(liElement) && liElement.tagName.toLowerCase() === 'li' && liElement.contains(nodes[num]) &&
469
+ liElement.textContent.replace('/\u200B/g', '').trim().includes(nodes[num].textContent.trim())) {
470
+ /* eslint-enable security/detect-object-injection */
379
471
  liChildContent = ' ' + nodes[num].textContent.trim() + liChildContent;
380
472
  num--;
381
473
  }
@@ -447,6 +539,48 @@ var SelectionCommands = /** @class */ (function () {
447
539
  parentElement = parentElement.parentElement;
448
540
  liElement = parentElement;
449
541
  }
542
+ if (format === 'fontcolor' || format === 'fontname') {
543
+ var parentElem = nodes[index].parentElement;
544
+ if (!isNOU(parentElem) && parentElem.childNodes) {
545
+ for (var i = 0; i < parentElem.childNodes.length; i++) {
546
+ if (this.concatenateTextExcludingList(nodes, index) === nodes[index].textContent) {
547
+ var liElement_1 = void 0;
548
+ if (parentElem.tagName === 'LI') {
549
+ liElement_1 = parentElem;
550
+ }
551
+ else if (parentElem.closest('li')) {
552
+ liElement_1 = parentElem.closest('li');
553
+ }
554
+ if (!isNOU(liElement_1)) {
555
+ switch (format) {
556
+ case 'fontcolor':
557
+ liElement_1.style.color = value;
558
+ break;
559
+ case 'fontname':
560
+ liElement_1.style.fontFamily = value;
561
+ break;
562
+ default:
563
+ break;
564
+ }
565
+ }
566
+ }
567
+ // eslint-disable-next-line
568
+ var childElement = parentElem.childNodes[i];
569
+ if (childElement.tagName === 'OL' || childElement.tagName === 'UL') {
570
+ switch (format) {
571
+ case 'fontcolor':
572
+ childElement.style.color = 'initial';
573
+ break;
574
+ case 'fontname':
575
+ childElement.style.fontFamily = 'initial';
576
+ break;
577
+ default:
578
+ break;
579
+ }
580
+ }
581
+ }
582
+ }
583
+ }
450
584
  if (!isNOU(liElement) && liElement.tagName.toLowerCase() === 'li' &&
451
585
  liElement.textContent.trim() === nodes[index].textContent.trim()) {
452
586
  if (format === 'fontsize') {
@@ -456,6 +590,9 @@ var SelectionCommands = /** @class */ (function () {
456
590
  liElement.style.color = value;
457
591
  liElement.style.textDecoration = 'inherit';
458
592
  }
593
+ else if (format === 'fontname') {
594
+ liElement.style.fontFamily = value;
595
+ }
459
596
  }
460
597
  if (value === 'formatPainter') {
461
598
  return this.insertFormatPainterElem(nodes, index, range, nodeCutter, painterValues, domNode);
@@ -503,6 +640,19 @@ var SelectionCommands = /** @class */ (function () {
503
640
  }
504
641
  else {
505
642
  nodes[index] = this.applyStyles(nodes, index, element);
643
+ var liElement = nodes[index].parentElement;
644
+ if (!isNOU(liElement) && liElement.tagName.toLowerCase() !== 'li') {
645
+ liElement = closest(liElement, 'li');
646
+ }
647
+ if (!isNOU(liElement) && liElement.tagName.toLowerCase() === 'li' &&
648
+ liElement.textContent.trim() === nodes[index].textContent.trim()) {
649
+ if (format === 'bold') {
650
+ liElement.style.fontWeight = 'bold';
651
+ }
652
+ else if (format === "italic") {
653
+ liElement.style.fontStyle = 'italic';
654
+ }
655
+ }
506
656
  }
507
657
  }
508
658
  }
@@ -730,6 +880,18 @@ var SelectionCommands = /** @class */ (function () {
730
880
  }
731
881
  }
732
882
  };
883
+ SelectionCommands.concatenateTextExcludingList = function (nodes, index) {
884
+ var result = '';
885
+ var parentNode = nodes[index].parentElement;
886
+ for (var i = 0; i < parentNode.childNodes.length; i++) {
887
+ // eslint-disable-next-line
888
+ var childNode = parentNode.childNodes[i];
889
+ if ((childNode.nodeType === 3) || (childNode.nodeType === 1 && (childNode.tagName !== 'OL' && childNode.tagName !== 'UL'))) {
890
+ result += childNode.textContent;
891
+ }
892
+ }
893
+ return result;
894
+ };
733
895
  SelectionCommands.enterAction = 'P';
734
896
  return SelectionCommands;
735
897
  }());
@@ -20,7 +20,6 @@ export declare class TableCommand {
20
20
  private addEventListener;
21
21
  private createTable;
22
22
  private calculateStyleValue;
23
- private removeEmptyNode;
24
23
  private insertAfter;
25
24
  private getSelectedCellMinMaxIndex;
26
25
  private insertRow;
@@ -60,9 +60,8 @@ var TableCommand = /** @class */ (function () {
60
60
  table.appendChild(tblBody);
61
61
  e.item.selection.restore();
62
62
  InsertHtml.Insert(this.parent.currentDocument, table, this.parent.editableElement);
63
- this.removeEmptyNode();
64
63
  e.item.selection.setSelectionText(this.parent.currentDocument, table.querySelector('td'), table.querySelector('td'), 0, 0);
65
- if (table.nextElementSibling === null) {
64
+ if (table.nextElementSibling === null && !table.classList.contains('ignore-table')) {
66
65
  var insertElem = void 0;
67
66
  if (e.enterAction === 'DIV') {
68
67
  insertElem = createElement('div');
@@ -77,6 +76,9 @@ var TableCommand = /** @class */ (function () {
77
76
  }
78
77
  this.insertAfter(insertElem, table);
79
78
  }
79
+ if (table.classList.contains('ignore-table')) {
80
+ table.classList.remove('ignore-table');
81
+ }
80
82
  table.querySelector('td').classList.add('e-cell-select');
81
83
  if (e.callBack) {
82
84
  e.callBack({
@@ -104,24 +106,6 @@ var TableCommand = /** @class */ (function () {
104
106
  }
105
107
  return styleValue;
106
108
  };
107
- TableCommand.prototype.removeEmptyNode = function () {
108
- var emptyUl = this.parent.editableElement.querySelectorAll('ul:empty, ol:empty');
109
- for (var i = 0; i < emptyUl.length; i++) {
110
- detach(emptyUl[i]);
111
- }
112
- var emptyLiChild = this.parent.editableElement.querySelectorAll('li *:empty:not(img)');
113
- for (var i = 0; i < emptyLiChild.length; i++) {
114
- detach(emptyLiChild[i]);
115
- if (emptyLiChild.length === i + 1) {
116
- emptyLiChild = this.parent.editableElement.querySelectorAll('li *:empty:not(img)');
117
- i = -1;
118
- }
119
- }
120
- var emptyLi = this.parent.editableElement.querySelectorAll('li:empty');
121
- for (var i = 0; i < emptyLi.length; i++) {
122
- detach(emptyLi[i]);
123
- }
124
- };
125
109
  TableCommand.prototype.insertAfter = function (newNode, referenceNode) {
126
110
  referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
127
111
  };
@@ -472,14 +456,21 @@ var TableCommand = /** @class */ (function () {
472
456
  }
473
457
  };
474
458
  TableCommand.prototype.tableVerticalAlign = function (e) {
475
- if (e.item.subCommand === 'AlignTop') {
476
- e.item.tableCell.style.verticalAlign = 'top';
477
- }
478
- else if (e.item.subCommand === 'AlignMiddle') {
479
- e.item.tableCell.style.verticalAlign = 'middle';
459
+ var value = '';
460
+ switch (e.item.subCommand) {
461
+ case 'AlignTop':
462
+ value = 'top';
463
+ break;
464
+ case 'AlignMiddle':
465
+ value = 'middle';
466
+ break;
467
+ case 'AlignBottom':
468
+ value = 'bottom';
469
+ break;
480
470
  }
481
- else {
482
- e.item.tableCell.style.verticalAlign = 'bottom';
471
+ e.item.tableCell.style.verticalAlign = value;
472
+ if (value && value !== '' && e.item.tableCell.getAttribute('valign')) {
473
+ e.item.tableCell.removeAttribute('valign');
483
474
  }
484
475
  if (e.callBack) {
485
476
  e.callBack({
@@ -510,10 +501,22 @@ var TableCommand = /** @class */ (function () {
510
501
  firstCell.setAttribute('rowspan', (minMaxIndexes.endRow - minMaxIndexes.startRow + 1).toString());
511
502
  }
512
503
  var totalWidth = 0;
504
+ var unit;
513
505
  for (var j = rowSelectedCells.length - 1; j >= 0; j--) {
514
- totalWidth = totalWidth + parseFloat(rowSelectedCells[j].style.width);
506
+ if (!isNOU(rowSelectedCells[j].style.width)
507
+ && rowSelectedCells[j].style.width !== '') {
508
+ if (!unit) {
509
+ var match = rowSelectedCells[j].style.width.match(/^([\d.]+)([a-z%]+)$/i);
510
+ unit = match ? match[2] : '%';
511
+ }
512
+ totalWidth = totalWidth + parseFloat(rowSelectedCells[j].style.width);
513
+ }
514
+ else {
515
+ totalWidth = totalWidth + ((rowSelectedCells[j].offsetWidth / this.curTable.offsetWidth) * 100);
516
+ unit = '%';
517
+ }
515
518
  }
516
- firstCell.style.width = totalWidth + '%';
519
+ firstCell.style.width = totalWidth + unit;
517
520
  for (var i = 1; i <= selectedCells.length - 1; i++) {
518
521
  detach(selectedCells[i]);
519
522
  }
@@ -550,7 +553,7 @@ var TableCommand = /** @class */ (function () {
550
553
  var eleArray = elements;
551
554
  //eslint-disable-next-line
552
555
  if (min < (max = Math.min(max, eleArray[0].length - 1))) {
553
- for (colIndex === min; colIndex <= max; colIndex++) {
556
+ for (colIndex = min; colIndex <= max; colIndex++) {
554
557
  // eslint-disable-next-line
555
558
  if (!(min < colIndex && eleArray[0][colIndex] === eleArray[0][colIndex - 1]) && 1 < (index =
556
559
  Math.min(parseInt(eleArray[0][colIndex].getAttribute('colspan'), 10) || 1, max - min + 1)) &&
@@ -11,7 +11,7 @@ export declare class ToolbarStatus {
11
11
  * get method
12
12
  *
13
13
  * @param {Document} docElement - specifies the document element
14
- * @param {Node} targetNode - specifies the target node
14
+ * @param {Node} rootNode - specifies the content editable element
15
15
  * @param {string[]} formatNode - specifies the format node
16
16
  * @param {string[]} fontSize - specifies the font size
17
17
  * @param {string[]} fontName - specifies the font name.
@@ -20,7 +20,7 @@ export declare class ToolbarStatus {
20
20
  * @hidden
21
21
  * @deprecated
22
22
  */
23
- static get(docElement: Document, targetNode: Node, formatNode?: string[], fontSize?: string[], fontName?: string[], documentNode?: Node): IToolbarStatus;
23
+ static get(docElement: Document, rootNode: Node, formatNode?: string[], fontSize?: string[], fontName?: string[], documentNode?: Node): IToolbarStatus;
24
24
  private static getImmediateBlockNode;
25
25
  private static getFormatParent;
26
26
  private static isFormattedNode;
@@ -2,6 +2,7 @@ import { IsFormatted } from './isformatted';
2
2
  import * as CONSTANT from './../base/constant';
3
3
  import { NodeSelection } from './../../selection/index';
4
4
  import { getDefaultHtmlTbStatus } from './../../common/util';
5
+ import { isNullOrUndefined } from '@syncfusion/ej2-base';
5
6
  /**
6
7
  * Update Toolbar Status
7
8
  *
@@ -16,7 +17,7 @@ var ToolbarStatus = /** @class */ (function () {
16
17
  * get method
17
18
  *
18
19
  * @param {Document} docElement - specifies the document element
19
- * @param {Node} targetNode - specifies the target node
20
+ * @param {Node} rootNode - specifies the content editable element
20
21
  * @param {string[]} formatNode - specifies the format node
21
22
  * @param {string[]} fontSize - specifies the font size
22
23
  * @param {string[]} fontName - specifies the font name.
@@ -25,7 +26,7 @@ var ToolbarStatus = /** @class */ (function () {
25
26
  * @hidden
26
27
  * @deprecated
27
28
  */
28
- ToolbarStatus.get = function (docElement, targetNode, formatNode, fontSize, fontName, documentNode) {
29
+ ToolbarStatus.get = function (docElement, rootNode, formatNode, fontSize, fontName, documentNode) {
29
30
  var formatCollection = JSON.parse(JSON.stringify(statusCollection));
30
31
  var nodeCollection = JSON.parse(JSON.stringify(statusCollection));
31
32
  var nodeSelection = new NodeSelection();
@@ -55,7 +56,7 @@ var ToolbarStatus = /** @class */ (function () {
55
56
  }
56
57
  for (var index = 0; index < nodes.length; index++) {
57
58
  // eslint-disable-next-line max-len
58
- formatCollection = this.getFormatParent(docElement, formatCollection, nodes[index], targetNode, formatNode, fontSize, fontName);
59
+ formatCollection = this.getFormatParent(docElement, formatCollection, nodes[index], rootNode, formatNode, fontSize, fontName);
59
60
  if ((index === 0 && formatCollection.bold) || !formatCollection.bold) {
60
61
  nodeCollection.bold = formatCollection.bold;
61
62
  }
@@ -130,16 +131,24 @@ var ToolbarStatus = /** @class */ (function () {
130
131
  return node;
131
132
  };
132
133
  ToolbarStatus.getFormatParent = function (docElement, formatCollection, node, targetNode, formatNode, fontSize, fontName) {
134
+ var isListUpdated = false;
135
+ var isComplexListUpdated = false;
133
136
  if (targetNode.contains(node) ||
134
137
  (node.nodeType === 3 && targetNode.nodeType !== 3 && targetNode.contains(node.parentNode))) {
135
138
  do {
136
- formatCollection = this.isFormattedNode(docElement, formatCollection, node, formatNode, fontSize, fontName);
139
+ formatCollection = this.isFormattedNode(docElement, formatCollection, node, isListUpdated, isComplexListUpdated, formatNode, fontSize, fontName);
140
+ if (formatCollection.orderedlist || formatCollection.unorderedlist) {
141
+ isListUpdated = true;
142
+ }
143
+ if (formatCollection.bulletFormatList || formatCollection.numberFormatList) {
144
+ isComplexListUpdated = true;
145
+ }
137
146
  node = node.parentNode;
138
147
  } while (node && (node !== targetNode));
139
148
  }
140
149
  return formatCollection;
141
150
  };
142
- ToolbarStatus.isFormattedNode = function (docElement, formatCollection, node, formatNode, fontSize, fontName) {
151
+ ToolbarStatus.isFormattedNode = function (docElement, formatCollection, node, isListUpdated, isComplexListUpdated, formatNode, fontSize, fontName) {
143
152
  if (!formatCollection.bold) {
144
153
  formatCollection.bold = IsFormatted.isBold(node);
145
154
  }
@@ -170,10 +179,10 @@ var ToolbarStatus = /** @class */ (function () {
170
179
  if (!formatCollection.backgroundcolor) {
171
180
  formatCollection.backgroundcolor = this.isBackgroundColor(node);
172
181
  }
173
- if (!formatCollection.orderedlist) {
182
+ if (!formatCollection.orderedlist && !isListUpdated) {
174
183
  formatCollection.orderedlist = this.isOrderedList(node);
175
184
  }
176
- if (!formatCollection.unorderedlist) {
185
+ if (!formatCollection.unorderedlist && !isListUpdated) {
177
186
  formatCollection.unorderedlist = this.isUnorderedList(node);
178
187
  }
179
188
  if (!formatCollection.alignments) {
@@ -188,10 +197,10 @@ var ToolbarStatus = /** @class */ (function () {
188
197
  if (!formatCollection.createlink) {
189
198
  formatCollection.createlink = this.isLink(node);
190
199
  }
191
- if (!formatCollection.numberFormatList) {
200
+ if (!formatCollection.numberFormatList && !isComplexListUpdated) {
192
201
  formatCollection.numberFormatList = this.isNumberFormatList(node);
193
202
  }
194
- if (!formatCollection.bulletFormatList) {
203
+ if (!formatCollection.bulletFormatList && !isComplexListUpdated) {
195
204
  formatCollection.bulletFormatList = this.isBulletFormatList(node);
196
205
  }
197
206
  return formatCollection;
@@ -250,7 +259,8 @@ var ToolbarStatus = /** @class */ (function () {
250
259
  // eslint-disable-next-line
251
260
  var pattern = new RegExp(name, 'i');
252
261
  if ((value.replace(/"/g, '').replace(/ /g, '').toLowerCase() === name.replace(/"/g, '').replace(/ /g, '').toLowerCase()) ||
253
- (value.split(',')[0] && value.split(',')[0].search(pattern) > -1)) {
262
+ (value.split(',')[0] && !isNullOrUndefined(value.split(',')[0].trim().match(pattern)) &&
263
+ value.split(',')[0].trim() === value.split(',')[0].trim().match(pattern)[0])) {
254
264
  index = pos;
255
265
  }
256
266
  }) && (index !== null)))) {
@@ -39,6 +39,7 @@ export declare class UndoRedoManager {
39
39
  private keyDown;
40
40
  private keyUp;
41
41
  private getTextContentFromFragment;
42
+ private isElementStructureEqual;
42
43
  /**
43
44
  * RTE collection stored html format.
44
45
  *
@@ -98,6 +98,25 @@ var UndoRedoManager = /** @class */ (function () {
98
98
  }
99
99
  return textContent;
100
100
  };
101
+ UndoRedoManager.prototype.isElementStructureEqual = function (previousFragment, currentFragment) {
102
+ if (previousFragment.childNodes.length !== currentFragment.childNodes.length) {
103
+ return false;
104
+ }
105
+ for (var i = 0; i < previousFragment.childNodes.length; i++) {
106
+ var previousFragmentNode = previousFragment.childNodes[i];
107
+ var currentFragmentNode = currentFragment.childNodes[i];
108
+ if (!previousFragmentNode || !currentFragmentNode) {
109
+ return false;
110
+ }
111
+ if (previousFragmentNode.nodeType !== currentFragmentNode.nodeType) {
112
+ return false;
113
+ }
114
+ if (previousFragmentNode.outerHTML !== currentFragmentNode.outerHTML) {
115
+ return false;
116
+ }
117
+ }
118
+ return true;
119
+ };
101
120
  /**
102
121
  * RTE collection stored html format.
103
122
  *
@@ -134,7 +153,8 @@ var UndoRedoManager = /** @class */ (function () {
134
153
  (this.undoRedoStack[this.undoRedoStack.length - 1].range.endOffset === save.range.endOffset) &&
135
154
  (this.undoRedoStack[this.undoRedoStack.length - 1].range.range.startContainer === save.range.startContainer) &&
136
155
  (this.getTextContentFromFragment(this.undoRedoStack[this.undoRedoStack.length - 1].text).trim() ===
137
- this.getTextContentFromFragment(changEle.text).trim())) {
156
+ this.getTextContentFromFragment(changEle.text).trim()) &&
157
+ this.isElementStructureEqual(this.undoRedoStack[this.undoRedoStack.length - 1].text, changEle.text)) {
138
158
  return;
139
159
  }
140
160
  this.undoRedoStack.push(changEle);
@@ -1,5 +1,5 @@
1
1
  import { Popup } from '@syncfusion/ej2-popups';
2
- import { IRichTextEditor } from '../base/interface';
2
+ import { IRichTextEditor, IBaseQuickToolbar } from '../base/interface';
3
3
  import { IToolbarItems, IQuickToolbarOptions } from '../base/interface';
4
4
  import { ServiceLocator } from '../services/service-locator';
5
5
  import { BaseToolbar } from './base-toolbar';
@@ -7,10 +7,10 @@ import { RichTextEditorModel } from '../base/rich-text-editor-model';
7
7
  /**
8
8
  * `Quick toolbar` module is used to handle Quick toolbar actions.
9
9
  */
10
- export declare class BaseQuickToolbar {
10
+ export declare class BaseQuickToolbar implements IBaseQuickToolbar {
11
11
  popupObj: Popup;
12
12
  element: HTMLElement;
13
- private isDOMElement;
13
+ isRendered: boolean;
14
14
  quickTBarObj: BaseToolbar;
15
15
  private stringItems;
16
16
  private dropDownButtons;