@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
@@ -451,19 +451,6 @@ var DOMNode = /** @class */ (function () {
451
451
  var end = this.parent.querySelector('.' + markerClassName.endSelection);
452
452
  var startTextNode;
453
453
  var endTextNode;
454
- if (start.textContent === '' && isNOU(end) && action !== 'tab') {
455
- // To Do Apply Heading and Back space press in empty content.
456
- // if (isNOU(action) && save.range.startContainer.nodeType === 1 &&
457
- // (save.range.startContainer as HTMLElement).querySelectorAll('audio,video,image').length === 0) {
458
- // start.innerHTML = '<br>';
459
- // }
460
- if (start.childNodes.length === 1 && start.childNodes[0].nodeName === 'BR') {
461
- start.innerHTML = '&#65279;&#65279;<br>';
462
- }
463
- else {
464
- start.innerHTML = '&#65279;&#65279;';
465
- }
466
- }
467
454
  if (this.hasClass(start, markerClassName.startSelection) && start.classList.length > 1) {
468
455
  var replace = this.createTagString(CONSTANT.DEFAULT_TAG, start, this.encode(start.textContent));
469
456
  this.replaceWith(start, replace);
@@ -503,9 +490,11 @@ var DOMNode = /** @class */ (function () {
503
490
  var range = save.range;
504
491
  var startChildNodes = range.startContainer.childNodes;
505
492
  var isTableStart = startChildNodes.length > 1 && startChildNodes[0].nodeName === 'TABLE';
493
+ var isImgOnlySelected = startChildNodes.length > 1 && startChildNodes[0].nodeName === 'IMAGE' &&
494
+ range.endOffset === 1 && range.endContainer.nodeName === '#text' && range.endContainer.textContent.length === 0;
506
495
  var start = ((isTableStart ? getLastTextNode(startChildNodes[range.startOffset + 1]) :
507
496
  startChildNodes[(range.startOffset > 0) ? (range.startOffset - 1) : range.startOffset]) || range.startContainer);
508
- var end = (range.endContainer.childNodes[(range.endOffset > 0) ? (range.endOffset - 1) : range.endOffset]
497
+ var end = (range.endContainer.childNodes[(range.endOffset > 0) ? (isImgOnlySelected ? range.endOffset : (range.endOffset - 1)) : range.endOffset]
509
498
  || range.endContainer);
510
499
  if ((start.nodeType === Node.ELEMENT_NODE && end.nodeType === Node.ELEMENT_NODE) && (start.contains(end) || end.contains(start))) {
511
500
  var existNode = start.contains(end) ? start : end;
@@ -586,10 +575,13 @@ var DOMNode = /** @class */ (function () {
586
575
  else if (start.tagName === 'BR') {
587
576
  this.replaceWith(start, this.marker(className, this.encode(start.textContent)));
588
577
  var markerStart = range.startContainer.querySelector('.' + className);
589
- markerStart.appendChild(start);
578
+ if (markerStart) {
579
+ markerStart.parentElement.appendChild(start);
580
+ }
590
581
  }
591
582
  else {
592
- if (start.tagName === 'IMG') {
583
+ var tagName = !isNOU(start.parentElement) ? start.parentElement.tagName.toLocaleLowerCase() : '';
584
+ if (start.tagName === 'IMG' && tagName !== 'p' && tagName !== 'div') {
593
585
  var parNode = document.createElement('p');
594
586
  start.parentElement.insertBefore(parNode, start);
595
587
  parNode.appendChild(start);
@@ -679,11 +671,12 @@ var DOMNode = /** @class */ (function () {
679
671
  /**
680
672
  * blockNodes method
681
673
  *
674
+ * @param {boolean} action - Optional Boolean that specifies the action is whether performed.
682
675
  * @returns {Node[]} - returns the node array values
683
676
  * @hidden
684
677
  * @deprecated
685
678
  */
686
- DOMNode.prototype.blockNodes = function () {
679
+ DOMNode.prototype.blockNodes = function (action) {
687
680
  var collectionNodes = [];
688
681
  var selection = this.getSelection();
689
682
  if (this.isEditorArea() && selection.rangeCount) {
@@ -697,23 +690,46 @@ var DOMNode = /** @class */ (function () {
697
690
  collectionNodes.push(startNode);
698
691
  }
699
692
  parentNode = this.blockParentNode(startNode);
693
+ var endParentNode = this.blockParentNode(endNode);
700
694
  if (parentNode && collectionNodes.indexOf(parentNode) < 0) {
701
- if (CONSTANT.IGNORE_BLOCK_TAGS.indexOf(parentNode.tagName.toLocaleLowerCase()) >= 0 && (startNode.tagName === 'BR' ||
702
- startNode.nodeType === Node.TEXT_NODE ||
703
- startNode.classList.contains(markerClassName.startSelection) ||
704
- startNode.classList.contains(markerClassName.endSelection))) {
705
- var tempNode = startNode.previousSibling &&
706
- startNode.previousSibling.nodeType === Node.TEXT_NODE ?
707
- startNode.previousSibling : startNode;
708
- if (!startNode.nextSibling && !startNode.previousSibling && startNode.tagName === 'BR') {
709
- collectionNodes.push(tempNode);
695
+ if (!isNOU(action) && action) {
696
+ if (range.commonAncestorContainer.nodeName === 'TD' || parentNode.nodeName === 'TD' || endParentNode.nodeName === 'TD') {
697
+ var processedNodes = this.getPreBlockNodeCollection(range);
698
+ if (processedNodes.length > 1) {
699
+ this.wrapWithBlockNode(processedNodes, collectionNodes);
700
+ }
701
+ else if (processedNodes.length > 0) {
702
+ if (startNode !== endNode && startNode.nodeName !== 'BR') {
703
+ collectionNodes.push(this.createTempNode(startNode));
704
+ }
705
+ else if (startNode === endNode && startNode.nodeName === 'SPAN' && (startNode.classList.contains(markerClassName.startSelection)
706
+ || startNode.classList.contains(markerClassName.endSelection))) {
707
+ collectionNodes.push(this.createTempNode(startNode));
708
+ }
709
+ }
710
710
  }
711
711
  else {
712
- collectionNodes.push(this.createTempNode(tempNode));
712
+ collectionNodes.push(parentNode);
713
713
  }
714
714
  }
715
715
  else {
716
- collectionNodes.push(parentNode);
716
+ if (CONSTANT.IGNORE_BLOCK_TAGS.indexOf(parentNode.tagName.toLocaleLowerCase()) >= 0 && (startNode.tagName === 'BR' ||
717
+ startNode.nodeType === Node.TEXT_NODE ||
718
+ startNode.classList.contains(markerClassName.startSelection) ||
719
+ startNode.classList.contains(markerClassName.endSelection))) {
720
+ var tempNode = startNode.previousSibling &&
721
+ startNode.previousSibling.nodeType === Node.TEXT_NODE ?
722
+ startNode.previousSibling : startNode;
723
+ if (!startNode.nextSibling && !startNode.previousSibling && startNode.tagName === 'BR') {
724
+ collectionNodes.push(tempNode);
725
+ }
726
+ else {
727
+ collectionNodes.push(this.createTempNode(tempNode));
728
+ }
729
+ }
730
+ else {
731
+ collectionNodes.push(parentNode);
732
+ }
717
733
  }
718
734
  }
719
735
  var nodes = [];
@@ -782,6 +798,131 @@ var DOMNode = /** @class */ (function () {
782
798
  DOMNode.prototype.ignoreTableTag = function (element) {
783
799
  return !(CONSTANT.TABLE_BLOCK_TAGS.indexOf(element.tagName.toLocaleLowerCase()) >= 0);
784
800
  };
801
+ DOMNode.prototype.getPreBlockNodeCollection = function (range) {
802
+ var startNode = this.getSelectedNode(range.startContainer, range.startOffset);
803
+ var endNode = this.getSelectedNode(range.endContainer, range.endOffset);
804
+ var nodes = [];
805
+ var rootNode = startNode.closest('td, th');
806
+ if (isNOU(rootNode)) {
807
+ return nodes;
808
+ }
809
+ var rootChildNode = Array.from(rootNode.childNodes);
810
+ var isContinue = true;
811
+ var processedStart = this.getClosestInlineParent(startNode, rootNode, true);
812
+ var processedEnd = this.getClosestInlineParent(endNode, rootNode, false);
813
+ for (var i = 0; i < rootChildNode.length; i++) {
814
+ var child = rootChildNode[i];
815
+ if (processedStart === processedEnd && child === processedStart) {
816
+ nodes.push(child);
817
+ isContinue = true;
818
+ }
819
+ else if (child === processedStart) {
820
+ isContinue = false;
821
+ }
822
+ else if (child === processedEnd) {
823
+ nodes.push(child); // Early Exit so Push the end node.
824
+ isContinue = true;
825
+ }
826
+ if (isContinue) {
827
+ continue;
828
+ }
829
+ else {
830
+ nodes.push(child);
831
+ }
832
+ }
833
+ return nodes;
834
+ };
835
+ DOMNode.prototype.getClosestInlineParent = function (node, rootNode, isStart) {
836
+ // 1. If the node is a text node, return the node
837
+ // 2. If the node is a block node return block node
838
+ // 3. If the node is a inline node,
839
+ // Traverse back untill the TD or TH node
840
+ // Check if the the previous sibling , next sibling is a block node.
841
+ // If yes return the inline node that is closest to the block node.
842
+ if (node.nodeType === Node.TEXT_NODE) {
843
+ return node;
844
+ }
845
+ if (this.isBlockNode(node)) {
846
+ return node;
847
+ }
848
+ var currentNode = node;
849
+ var rootFlag = false;
850
+ while (currentNode) {
851
+ var previousNode = currentNode;
852
+ if (rootFlag) {
853
+ if (this.isBlockNode(currentNode)) {
854
+ return previousNode;
855
+ }
856
+ if (isStart && currentNode.previousSibling) {
857
+ if (this.isBlockNode(currentNode.previousSibling) || currentNode.previousSibling.nodeName === 'BR') {
858
+ return previousNode;
859
+ }
860
+ else {
861
+ currentNode = currentNode.previousSibling;
862
+ }
863
+ }
864
+ else if (!isStart && currentNode.nextSibling) {
865
+ if (this.isBlockNode(currentNode.nextSibling) || currentNode.nextSibling.nodeName === 'BR') {
866
+ return previousNode;
867
+ }
868
+ else {
869
+ currentNode = currentNode.nextSibling;
870
+ }
871
+ }
872
+ else {
873
+ return currentNode;
874
+ }
875
+ }
876
+ else {
877
+ currentNode = currentNode.parentElement;
878
+ if (currentNode === rootNode) {
879
+ currentNode = previousNode;
880
+ rootFlag = true;
881
+ }
882
+ }
883
+ }
884
+ return null;
885
+ };
886
+ DOMNode.prototype.wrapWithBlockNode = function (nodes, collectionNodes) {
887
+ var wrapperElement = createElement('p');
888
+ for (var i = 0; i < nodes.length; i++) {
889
+ var child = nodes[i];
890
+ if (child.nodeName === 'BR') {
891
+ child.parentNode.insertBefore(wrapperElement, child);
892
+ wrapperElement.appendChild(child);
893
+ if (wrapperElement.childNodes.length > 0) {
894
+ collectionNodes.push(wrapperElement);
895
+ }
896
+ wrapperElement = createElement('p');
897
+ }
898
+ else {
899
+ if (!this.isBlockNode(child)) {
900
+ if (child.nodeName === '#text' && child.textContent.trim() === '') {
901
+ continue;
902
+ }
903
+ if (wrapperElement.childElementCount === 0) {
904
+ child.parentNode.insertBefore(wrapperElement, child);
905
+ wrapperElement.appendChild(child);
906
+ }
907
+ else {
908
+ wrapperElement.appendChild(child);
909
+ }
910
+ }
911
+ else {
912
+ collectionNodes.push(child);
913
+ }
914
+ // Use case when the BR is next sibling but the BR is not the part of selection.
915
+ if ((i === nodes.length - 1) && wrapperElement.nextElementSibling &&
916
+ wrapperElement.querySelectorAll('br').length === 0 &&
917
+ wrapperElement.nextElementSibling.nodeName === 'BR') {
918
+ wrapperElement.appendChild(wrapperElement.nextElementSibling);
919
+ }
920
+ }
921
+ }
922
+ if (wrapperElement.childNodes.length > 0 && collectionNodes.indexOf(wrapperElement) < 0) {
923
+ collectionNodes.push(wrapperElement);
924
+ }
925
+ };
785
926
  return DOMNode;
786
927
  }());
787
928
  export { DOMNode };
@@ -35,6 +35,7 @@ export declare class FormatPainterActions implements IFormatPainterEditor {
35
35
  private validateELementTag;
36
36
  private findCurrentContext;
37
37
  private insertFormatNode;
38
+ private isListCopied;
38
39
  private insertBlockNode;
39
40
  private insertNewList;
40
41
  private insertSameList;
@@ -174,7 +174,7 @@ var FormatPainterActions = /** @class */ (function () {
174
174
  };
175
175
  FormatPainterActions.prototype.copyAction = function () {
176
176
  var copyCollection = [];
177
- var range = this.parent.nodeSelection.getRange(document);
177
+ var range = this.parent.nodeSelection.getRange(this.parent.currentDocument);
178
178
  var domSelection = this.parent.nodeSelection;
179
179
  var nodes = range.collapsed ? domSelection.getSelectionNodeCollection(range) :
180
180
  domSelection.getSelectionNodeCollectionBr(range);
@@ -363,6 +363,14 @@ var FormatPainterActions = /** @class */ (function () {
363
363
  var range = this.parent.nodeSelection.getRange(docElement);
364
364
  var isCollapsed = range.collapsed;
365
365
  var blockNodes = this.parent.domNode.blockNodes();
366
+ var isListCopied = this.isListCopied();
367
+ if (isListCopied) {
368
+ for (var i = 0; i < blockNodes.length; i++) {
369
+ if (closest(blockNodes[i], 'li')) {
370
+ blockNodes[i] = closest(blockNodes[i], 'li');
371
+ }
372
+ }
373
+ }
366
374
  var isFullNodeSelected = false;
367
375
  if (blockNodes.length === 1) {
368
376
  isFullNodeSelected = blockNodes[0].textContent.trim() === range.toString().trim();
@@ -371,6 +379,16 @@ var FormatPainterActions = /** @class */ (function () {
371
379
  this.insertBlockNode(clonedElem, range, docElement, blockNodes);
372
380
  }
373
381
  };
382
+ FormatPainterActions.prototype.isListCopied = function () {
383
+ var isListCopied = false;
384
+ for (var i = 0; i < this.copyCollection.length; i++) {
385
+ if (this.copyCollection[i].tagName === 'OL' || this.copyCollection[i].tagName === 'UL') {
386
+ isListCopied = true;
387
+ break;
388
+ }
389
+ }
390
+ return isListCopied;
391
+ };
374
392
  FormatPainterActions.prototype.insertBlockNode = function (element, range, docElement, nodes) {
375
393
  var domSelection = this.parent.nodeSelection;
376
394
  var saveSelection = domSelection.save(range, docElement);
@@ -18,6 +18,7 @@ export declare class Formats {
18
18
  private addEventListener;
19
19
  private getParentNode;
20
20
  private onKeyUp;
21
+ private getBlockParent;
21
22
  private onKeyDown;
22
23
  private removeCodeContent;
23
24
  private deleteContent;
@@ -52,6 +52,14 @@ var Formats = /** @class */ (function () {
52
52
  }
53
53
  }
54
54
  };
55
+ Formats.prototype.getBlockParent = function (node, endNode) {
56
+ var currentParent;
57
+ while (node != endNode) {
58
+ currentParent = node;
59
+ node = node.parentElement;
60
+ }
61
+ return currentParent;
62
+ };
55
63
  Formats.prototype.onKeyDown = function (e) {
56
64
  if (e.event.which === 13) {
57
65
  var range = this.parent.nodeSelection.getRange(this.parent.currentDocument);
@@ -61,6 +69,8 @@ var Formats = /** @class */ (function () {
61
69
  ? range.endContainer : range.endContainer.parentElement;
62
70
  var preElem = closest(startCon, 'pre');
63
71
  var endPreElem = closest(endCon, 'pre');
72
+ var blockquoteEle = closest(startCon, 'blockquote');
73
+ var endBlockquoteEle = closest(endCon, 'blockquote');
64
74
  var liParent = !isNOU(preElem) && !isNOU(preElem.parentElement) && preElem.parentElement.tagName === 'LI';
65
75
  if (liParent) {
66
76
  return;
@@ -72,6 +82,17 @@ var Formats = /** @class */ (function () {
72
82
  range = this.parent.nodeSelection.getRange(this.parent.currentDocument);
73
83
  this.parent.nodeSelection.setCursorPoint(this.parent.currentDocument, endCon, 0);
74
84
  }
85
+ if (e.event.which === 13 && ((!isNOU(blockquoteEle) && !isNOU(endBlockquoteEle)) || (!isNOU(blockquoteEle) && isNOU(endBlockquoteEle)))) {
86
+ var startParent = this.getBlockParent(range.startContainer, blockquoteEle);
87
+ if ((startParent.textContent.charCodeAt(0) === 8203 &&
88
+ startParent.textContent.length === 1) || startParent.textContent.length === 0) {
89
+ if (isNOU(startParent.nextSibling) && ((startParent.previousSibling.textContent.charCodeAt(0) === 8203 &&
90
+ startParent.previousSibling.textContent.length === 1) || startParent.previousSibling.textContent.length === 0)) {
91
+ e.event.preventDefault();
92
+ this.paraFocus(startParent.parentElement); //Revert from blockquotes while pressing enter key
93
+ }
94
+ }
95
+ }
75
96
  if (e.event.which === 13 && !isNOU(preElem) && !isNOU(endPreElem)) {
76
97
  e.event.preventDefault();
77
98
  this.deleteContent(range);
@@ -221,7 +242,7 @@ var Formats = /** @class */ (function () {
221
242
  }
222
243
  var save = this.parent.nodeSelection.save(range, this.parent.currentDocument);
223
244
  this.parent.domNode.setMarker(save);
224
- var formatsNodes = this.parent.domNode.blockNodes();
245
+ var formatsNodes = this.parent.domNode.blockNodes(true);
225
246
  if (e.enterAction === 'BR') {
226
247
  this.setSelectionBRConfig();
227
248
  var allSelectedNode = this.parent.nodeSelection.getSelectedNodes(this.parent.currentDocument);
@@ -295,7 +316,7 @@ var Formats = /** @class */ (function () {
295
316
  replaceHTML = parentNode.innerHTML;
296
317
  }
297
318
  if ((e.subCommand.toLowerCase() === parentNode.tagName.toLowerCase() &&
298
- (e.subCommand.toLowerCase() !== 'pre' ||
319
+ (e.subCommand.toLowerCase() !== 'pre' && e.subCommand.toLowerCase() !== 'blockquote' ||
299
320
  (!isNOU(e.exeValue) && e.exeValue.name === 'dropDownSelect'))) ||
300
321
  isNOU(parentNode.parentNode) ||
301
322
  (parentNode.tagName === 'TABLE' && e.subCommand.toLowerCase() === 'pre')) {
@@ -304,7 +325,21 @@ var Formats = /** @class */ (function () {
304
325
  this.cleanFormats(parentNode, e.subCommand);
305
326
  var replaceNode = (e.subCommand.toLowerCase() === 'pre' && parentNode.tagName.toLowerCase() === 'pre') ?
306
327
  'p' : e.subCommand;
307
- var replaceTag = this.parent.domNode.createTagString(replaceNode, parentNode, replaceHTML.replace(/>\s+</g, '><'));
328
+ var isToggleBlockquoteList = e.subCommand.toLowerCase() === parentNode.tagName.toLowerCase() &&
329
+ e.subCommand.toLowerCase() === 'blockquote' && this.parent.domNode.isList(parentNode.firstElementChild);
330
+ var isToggleBlockquote = e.subCommand.toLowerCase() === parentNode.tagName.toLowerCase()
331
+ && e.subCommand.toLowerCase() === 'blockquote';
332
+ var replaceTag = void 0;
333
+ if (isToggleBlockquoteList) {
334
+ replaceTag = replaceHTML.replace(/>\s+</g, '><');
335
+ }
336
+ else if (isToggleBlockquote) {
337
+ var tagWrap = (e.enterAction == 'BR' || e.enterAction == 'P') ? 'P' : e.enterAction;
338
+ replaceTag = this.parent.domNode.createTagString(tagWrap, parentNode, replaceHTML.replace(/>\s+</g, '><'));
339
+ }
340
+ else {
341
+ replaceTag = this.parent.domNode.createTagString(replaceNode, parentNode, replaceHTML.replace(/>\s+</g, '><'));
342
+ }
308
343
  if (parentNode.tagName === 'LI') {
309
344
  parentNode.innerHTML = '';
310
345
  parentNode.insertAdjacentHTML('beforeend', replaceTag);
@@ -79,13 +79,12 @@ var ImageCommand = /** @class */ (function () {
79
79
  }
80
80
  };
81
81
  ImageCommand.prototype.createImage = function (e) {
82
- var _this = this;
83
82
  var isReplaced = false;
84
83
  e.item.url = isNOU(e.item.url) || e.item.url === 'undefined' ? e.item.src : e.item.url;
85
84
  if (!isNOU(e.item.selectParent) && e.item.selectParent[0].tagName === 'IMG') {
86
85
  var imgEle = e.item.selectParent[0];
87
- this.setStyle(imgEle, e);
88
86
  isReplaced = true;
87
+ this.setStyle(imgEle, e, isReplaced);
89
88
  }
90
89
  else {
91
90
  var imgElement = createElement('img');
@@ -109,24 +108,43 @@ var ImageCommand = /** @class */ (function () {
109
108
  var selectedNode = this.parent.nodeSelection.getSelectedNodes(this.parent.currentDocument)[0];
110
109
  var imgElm_1 = (e.value === 'Replace' || isReplaced) ? e.item.selectParent[0] :
111
110
  (Browser.isIE ? selectedNode.previousSibling : selectedNode.previousElementSibling);
112
- imgElm_1.addEventListener('load', function () {
113
- if (e.value !== 'Replace' || !isReplaced) {
114
- e.callBack({
115
- requestType: 'Images',
116
- editorMode: 'HTML',
117
- event: e.event,
118
- range: _this.parent.nodeSelection.getRange(_this.parent.currentDocument),
119
- elements: [imgElm_1]
120
- });
121
- }
122
- });
111
+ var imageInstance_1 = this;
112
+ var onImageLoadEvent_1 = function () {
113
+ e.callBack({
114
+ requestType: (e.value === 'Replace') ? (e.item.subCommand = 'Replace', "Replace") : 'Images',
115
+ editorMode: 'HTML',
116
+ event: e.event,
117
+ range: imageInstance_1.parent.nodeSelection.getRange(imageInstance_1.parent.currentDocument),
118
+ elements: [imgElm_1]
119
+ });
120
+ imgElm_1.removeEventListener('load', onImageLoadEvent_1);
121
+ };
122
+ imgElm_1.addEventListener('load', onImageLoadEvent_1);
123
123
  }
124
124
  };
125
- ImageCommand.prototype.setStyle = function (imgElement, e) {
125
+ ImageCommand.prototype.setStyle = function (imgElement, e, imgReplace) {
126
126
  if (!isNOU(e.item.url)) {
127
127
  imgElement.setAttribute('src', e.item.url);
128
128
  }
129
- imgElement.setAttribute('class', 'e-rte-image' + (isNOU(e.item.cssClass) ? '' : ' ' + e.item.cssClass));
129
+ var alignClassName;
130
+ if (imgReplace) {
131
+ var alignClass = {
132
+ 'e-imgcenter': 'e-imgcenter',
133
+ 'e-imgright': 'e-imgright',
134
+ 'e-imgleft': 'e-imgleft'
135
+ };
136
+ var imgClassList = imgElement.classList;
137
+ var classArray = [];
138
+ for (var i = 0; i < imgClassList.length; i++) {
139
+ // eslint-disable-next-line
140
+ if (!isNOU(alignClass[imgClassList[i]])) {
141
+ // eslint-disable-next-line
142
+ alignClassName = alignClass[imgClassList[i]];
143
+ }
144
+ }
145
+ }
146
+ imgElement.setAttribute('class', 'e-rte-image' + (isNOU(e.item.cssClass) ? '' : ' ' + e.item.cssClass)
147
+ + (isNOU(alignClassName) ? '' : ' ' + alignClassName));
130
148
  if (!isNOU(e.item.altText)) {
131
149
  imgElement.setAttribute('alt', e.item.altText);
132
150
  }
@@ -178,6 +196,9 @@ var ImageCommand = /** @class */ (function () {
178
196
  if (!isNOU(e.item.target)) {
179
197
  anchor.setAttribute('target', e.item.target);
180
198
  }
199
+ if (!isNOU(e.item.ariaLabel)) {
200
+ anchor.setAttribute('aria-label', e.item.ariaLabel);
201
+ }
181
202
  InsertHtml.Insert(this.parent.currentDocument, anchor, this.parent.editableElement);
182
203
  this.callBack(e);
183
204
  };
@@ -209,9 +230,11 @@ var ImageCommand = /** @class */ (function () {
209
230
  e.item.selectNode[0].parentElement.href = e.item.url;
210
231
  if (isNOU(e.item.target)) {
211
232
  e.item.selectNode[0].parentElement.removeAttribute('target');
233
+ e.item.selectNode[0].parentElement.removeAttribute('aria-label');
212
234
  }
213
235
  else {
214
236
  e.item.selectNode[0].parentElement.target = e.item.target;
237
+ e.item.selectNode[0].parentElement.ariaLabel = e.item.ariaLabel;
215
238
  }
216
239
  this.callBack(e);
217
240
  };
@@ -26,4 +26,5 @@ export declare class InsertHtml {
26
26
  private static findDetachEmptyElem;
27
27
  private static removeEmptyElements;
28
28
  private static closestEle;
29
+ private static insertTableInList;
29
30
  }
@@ -3,7 +3,7 @@ import { NodeCutter } from './nodecutter';
3
3
  import * as CONSTANT from './../base/constant';
4
4
  import { detach, Browser, isNullOrUndefined as isNOU, createElement, closest } from '@syncfusion/ej2-base';
5
5
  import { InsertMethods } from './insert-methods';
6
- import { updateTextNode } from './../../common/util';
6
+ import { updateTextNode, nestedListCleanUp } from './../../common/util';
7
7
  /**
8
8
  * Insert a HTML Node or Text
9
9
  *
@@ -59,6 +59,10 @@ var InsertHtml = /** @class */ (function () {
59
59
  var isCollapsed = range.collapsed;
60
60
  var nodes = this.getNodeCollection(range, nodeSelection, node);
61
61
  var closestParentNode = (node.nodeName.toLowerCase() === 'table') ? this.closestEle(nodes[0].parentNode, editNode) : nodes[0];
62
+ if (closestParentNode && closestParentNode.nodeName === 'LI' && node.nodeName.toLowerCase() === 'table') {
63
+ this.insertTableInList(range, node, closestParentNode, nodes[0], nodeCutter);
64
+ return;
65
+ }
62
66
  if (isExternal || (!isNOU(node) && !isNOU(node.classList) &&
63
67
  node.classList.contains('pasteContent'))) {
64
68
  this.pasteInsertHTML(nodes, node, range, nodeSelection, nodeCutter, docElement, isCollapsed, closestParentNode, editNode, enterAction);
@@ -82,7 +86,12 @@ var InsertHtml = /** @class */ (function () {
82
86
  lasNode.textContent.length : lasNode.childNodes.length);
83
87
  range = nodeSelection.getRange(docElement);
84
88
  }
85
- range.extractContents();
89
+ if (range.startContainer.parentElement.closest('ol,ul') !== null && range.endContainer.parentElement.closest('ol,ul') !== null) {
90
+ nestedListCleanUp(range);
91
+ }
92
+ else {
93
+ range.extractContents();
94
+ }
86
95
  if (insertNode.tagName === 'TABLE') {
87
96
  this.removeEmptyElements(editNode);
88
97
  }
@@ -119,6 +128,9 @@ var InsertHtml = /** @class */ (function () {
119
128
  InsertMethods.AppendBefore(node, parentNode.firstChild, false);
120
129
  }
121
130
  }
131
+ else if (isNOU(preNode.previousSibling) && insertNode.tagName === 'TABLE') {
132
+ parentNode.prepend(node);
133
+ }
122
134
  else {
123
135
  parentNode.appendChild(node);
124
136
  }
@@ -203,7 +215,12 @@ var InsertHtml = /** @class */ (function () {
203
215
  CONSTANT.TABLE_BLOCK_TAGS.indexOf(closestParentNode.tagName.toLocaleLowerCase()) !== -1))
204
216
  || (node.nodeName.toLowerCase() === 'table' && closestParentNode &&
205
217
  CONSTANT.TABLE_BLOCK_TAGS.indexOf(closestParentNode.tagName.toLocaleLowerCase()) === -1))) {
206
- preNode = nodeCutter.GetSpliceNode(range, closestParentNode);
218
+ if (isCollapsed) {
219
+ preNode = nodeCutter.SplitNode(range, closestParentNode, true);
220
+ }
221
+ else {
222
+ preNode = nodeCutter.SplitNode(range, closestParentNode, false);
223
+ }
207
224
  sibNode = isNOU(preNode.previousSibling) ? preNode.parentNode.previousSibling : preNode.previousSibling;
208
225
  if (nodes.length === 1) {
209
226
  nodeSelection.setSelectionContents(docElement, preNode);
@@ -240,12 +257,17 @@ var InsertHtml = /** @class */ (function () {
240
257
  preNode.parentNode.replaceChild(fragment, preNode);
241
258
  }
242
259
  else {
260
+ var startContainerParent = range.startContainer.parentNode;
261
+ // Get the index of the start container among its siblings
262
+ var startIndex = Array.prototype.indexOf.call(startContainerParent.childNodes, range.startContainer);
243
263
  range.deleteContents();
264
+ range.setStart(startContainerParent, startIndex);
265
+ range.setEnd(startContainerParent, startIndex);
244
266
  if (!isNOU(lasNode)) {
245
267
  detach(lasNode);
246
268
  }
247
269
  // eslint-disable-next-line
248
- !isNOU(sibNode) ? sibNode.parentNode.appendChild(fragment) : editNode.appendChild(fragment);
270
+ !isNOU(sibNode) ? (sibNode.parentNode === editNode ? sibNode.appendChild(fragment) : sibNode.parentNode.appendChild(fragment)) : range.insertNode(fragment);
249
271
  }
250
272
  }
251
273
  else {
@@ -285,6 +307,9 @@ var InsertHtml = /** @class */ (function () {
285
307
  var paraElm = void 0;
286
308
  var previousParent = void 0;
287
309
  if (!this.contentsDeleted) {
310
+ if (!isCollapsed && range.startContainer.parentElement.textContent.length === 0 && range.startContainer.nodeName === 'BR' && range.startContainer.parentElement.nodeName === 'P') {
311
+ editNode.removeChild(range.startContainer.parentElement);
312
+ }
288
313
  range.deleteContents();
289
314
  }
290
315
  while (node.firstChild) {
@@ -296,7 +321,7 @@ var InsertHtml = /** @class */ (function () {
296
321
  (this.inlineNode.indexOf(node.firstChild.nodeName.toLocaleLowerCase()) >= 0 && isFirstTextNode)) {
297
322
  lastSelectionNode = node.firstChild;
298
323
  if (isNOU(node.previousElementSibling)) {
299
- var firstParaElm = createElement('p');
324
+ var firstParaElm = enterAction === 'DIV' ? createElement('div') : createElement('p');
300
325
  node.parentElement.insertBefore(firstParaElm, node);
301
326
  }
302
327
  if (node.previousElementSibling.nodeName === 'BR') {
@@ -311,7 +336,7 @@ var InsertHtml = /** @class */ (function () {
311
336
  if (node.firstChild.nodeName === '#text' ||
312
337
  (this.inlineNode.indexOf(node.firstChild.nodeName.toLocaleLowerCase()) >= 0)) {
313
338
  if (!isPreviousInlineElem) {
314
- paraElm = createElement('p');
339
+ paraElm = enterAction === 'DIV' ? createElement('div') : createElement('p');
315
340
  paraElm.appendChild(node.firstChild);
316
341
  fragment.appendChild(paraElm);
317
342
  }
@@ -470,7 +495,15 @@ var InsertHtml = /** @class */ (function () {
470
495
  };
471
496
  InsertHtml.imageFocus = function (node, nodeSelection, docElement) {
472
497
  var focusNode = document.createTextNode(' ');
473
- node.parentNode.insertBefore(focusNode, node.nextSibling);
498
+ if (node.parentNode && node.parentNode.nodeName === 'A') {
499
+ var anchorTag = node.parentNode;
500
+ var parentNode = anchorTag.parentNode;
501
+ parentNode.insertBefore(focusNode, anchorTag.nextSibling);
502
+ parentNode.insertBefore(node, focusNode);
503
+ }
504
+ else {
505
+ node.parentNode.insertBefore(focusNode, node.nextSibling);
506
+ }
474
507
  nodeSelection.setSelectionText(docElement, node.nextSibling, node.nextSibling, 0, 0);
475
508
  };
476
509
  // eslint-disable-next-line
@@ -525,6 +558,9 @@ var InsertHtml = /** @class */ (function () {
525
558
  };
526
559
  InsertHtml.closestEle = function (element, editNode) {
527
560
  var el = element;
561
+ if (closest(el, 'li')) {
562
+ return closest(el, 'li');
563
+ }
528
564
  while (el && el.nodeType === 1) {
529
565
  if (el.parentNode === editNode ||
530
566
  (!isNOU(el.parentNode.tagName) &&
@@ -535,6 +571,30 @@ var InsertHtml = /** @class */ (function () {
535
571
  }
536
572
  return null;
537
573
  };
574
+ InsertHtml.insertTableInList = function (range, insertNode, parentNode, currentNode, nodeCutter) {
575
+ if (range.collapsed) {
576
+ var isStart = range.startOffset === 0;
577
+ var isEnd = range.startContainer.textContent.trimEnd().length === range.startOffset;
578
+ if (isStart || isEnd) {
579
+ if (isStart) {
580
+ InsertMethods.AppendBefore(insertNode, currentNode, false);
581
+ }
582
+ else {
583
+ InsertMethods.AppendBefore(insertNode, currentNode, true);
584
+ }
585
+ }
586
+ else {
587
+ var preNode = nodeCutter.SplitNode(range, parentNode, true);
588
+ var sibNode = preNode.previousSibling;
589
+ sibNode.appendChild(insertNode);
590
+ }
591
+ }
592
+ else {
593
+ range.deleteContents();
594
+ parentNode.appendChild(insertNode);
595
+ }
596
+ insertNode.classList.add('ignore-table');
597
+ };
538
598
  /**
539
599
  * Insert method
540
600
  *