@syncfusion/ej2-richtexteditor 24.1.47 → 24.2.4

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 (106) hide show
  1. package/CHANGELOG.md +30 -2
  2. package/dist/ej2-richtexteditor.min.js +2 -2
  3. package/dist/ej2-richtexteditor.umd.min.js +2 -2
  4. package/dist/ej2-richtexteditor.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-richtexteditor.es2015.js +832 -209
  6. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  7. package/dist/es6/ej2-richtexteditor.es5.js +835 -203
  8. package/dist/es6/ej2-richtexteditor.es5.js.map +1 -1
  9. package/dist/global/ej2-richtexteditor.min.js +2 -2
  10. package/dist/global/ej2-richtexteditor.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/package.json +12 -12
  13. package/src/common/constant.d.ts +6 -0
  14. package/src/common/constant.js +6 -0
  15. package/src/common/util.d.ts +6 -0
  16. package/src/common/util.js +58 -20
  17. package/src/editor-manager/base/constant.d.ts +6 -0
  18. package/src/editor-manager/base/constant.js +6 -0
  19. package/src/editor-manager/base/editor-manager.d.ts +5 -0
  20. package/src/editor-manager/base/editor-manager.js +59 -0
  21. package/src/editor-manager/base/interface.d.ts +8 -0
  22. package/src/editor-manager/plugin/dom-node.js +3 -1
  23. package/src/editor-manager/plugin/format-painter-actions.js +1 -1
  24. package/src/editor-manager/plugin/inserthtml.js +7 -2
  25. package/src/editor-manager/plugin/ms-word-clean-up.d.ts +2 -0
  26. package/src/editor-manager/plugin/ms-word-clean-up.js +39 -10
  27. package/src/editor-manager/plugin/selection-commands.js +16 -0
  28. package/src/editor-manager/plugin/table.d.ts +0 -1
  29. package/src/editor-manager/plugin/table.js +14 -26
  30. package/src/editor-manager/plugin/undo.d.ts +1 -0
  31. package/src/editor-manager/plugin/undo.js +21 -1
  32. package/src/rich-text-editor/actions/base-quick-toolbar.js +3 -0
  33. package/src/rich-text-editor/actions/base-toolbar.js +8 -4
  34. package/src/rich-text-editor/actions/count.js +1 -1
  35. package/src/rich-text-editor/actions/dropdown-buttons.js +21 -2
  36. package/src/rich-text-editor/actions/emoji-picker.js +1 -1
  37. package/src/rich-text-editor/actions/full-screen.js +1 -0
  38. package/src/rich-text-editor/actions/html-editor.d.ts +2 -0
  39. package/src/rich-text-editor/actions/html-editor.js +88 -4
  40. package/src/rich-text-editor/actions/keyboard.js +3 -1
  41. package/src/rich-text-editor/actions/paste-clean-up.d.ts +1 -0
  42. package/src/rich-text-editor/actions/paste-clean-up.js +32 -4
  43. package/src/rich-text-editor/actions/toolbar.d.ts +2 -1
  44. package/src/rich-text-editor/base/constant.d.ts +25 -0
  45. package/src/rich-text-editor/base/constant.js +194 -0
  46. package/src/rich-text-editor/base/interface.d.ts +6 -1
  47. package/src/rich-text-editor/base/rich-text-editor.d.ts +1 -0
  48. package/src/rich-text-editor/base/rich-text-editor.js +34 -64
  49. package/src/rich-text-editor/base/util.d.ts +4 -0
  50. package/src/rich-text-editor/base/util.js +35 -1
  51. package/src/rich-text-editor/formatter/formatter.js +15 -4
  52. package/src/rich-text-editor/models/default-locale.js +17 -17
  53. package/src/rich-text-editor/models/items.js +2 -2
  54. package/src/rich-text-editor/renderer/audio-module.d.ts +1 -0
  55. package/src/rich-text-editor/renderer/audio-module.js +13 -0
  56. package/src/rich-text-editor/renderer/dialog-renderer.d.ts +2 -0
  57. package/src/rich-text-editor/renderer/dialog-renderer.js +7 -0
  58. package/src/rich-text-editor/renderer/iframe-content-renderer.js +1 -1
  59. package/src/rich-text-editor/renderer/image-module.d.ts +1 -0
  60. package/src/rich-text-editor/renderer/image-module.js +20 -2
  61. package/src/rich-text-editor/renderer/link-module.js +10 -1
  62. package/src/rich-text-editor/renderer/table-module.d.ts +2 -0
  63. package/src/rich-text-editor/renderer/table-module.js +22 -2
  64. package/src/rich-text-editor/renderer/toolbar-renderer.d.ts +1 -0
  65. package/src/rich-text-editor/renderer/toolbar-renderer.js +25 -3
  66. package/src/rich-text-editor/renderer/video-module.d.ts +3 -0
  67. package/src/rich-text-editor/renderer/video-module.js +54 -30
  68. package/src/selection/selection.js +3 -0
  69. package/styles/bootstrap-dark.css +44 -6
  70. package/styles/bootstrap.css +44 -6
  71. package/styles/bootstrap4.css +44 -6
  72. package/styles/bootstrap5-dark.css +44 -6
  73. package/styles/bootstrap5.css +44 -6
  74. package/styles/fabric-dark.css +44 -6
  75. package/styles/fabric.css +44 -6
  76. package/styles/fluent-dark.css +44 -6
  77. package/styles/fluent.css +44 -6
  78. package/styles/highcontrast-light.css +44 -6
  79. package/styles/highcontrast.css +44 -6
  80. package/styles/material-dark.css +44 -6
  81. package/styles/material.css +44 -6
  82. package/styles/material3-dark.css +58 -14
  83. package/styles/material3.css +58 -14
  84. package/styles/rich-text-editor/_layout.scss +39 -2
  85. package/styles/rich-text-editor/_material-definition.scss +0 -1
  86. package/styles/rich-text-editor/_material3-definition.scss +7 -7
  87. package/styles/rich-text-editor/_theme.scss +12 -5
  88. package/styles/rich-text-editor/bootstrap-dark.css +44 -6
  89. package/styles/rich-text-editor/bootstrap.css +44 -6
  90. package/styles/rich-text-editor/bootstrap4.css +44 -6
  91. package/styles/rich-text-editor/bootstrap5-dark.css +44 -6
  92. package/styles/rich-text-editor/bootstrap5.css +44 -6
  93. package/styles/rich-text-editor/fabric-dark.css +44 -6
  94. package/styles/rich-text-editor/fabric.css +44 -6
  95. package/styles/rich-text-editor/fluent-dark.css +44 -6
  96. package/styles/rich-text-editor/fluent.css +44 -6
  97. package/styles/rich-text-editor/highcontrast-light.css +44 -6
  98. package/styles/rich-text-editor/highcontrast.css +44 -6
  99. package/styles/rich-text-editor/material-dark.css +44 -6
  100. package/styles/rich-text-editor/material.css +44 -6
  101. package/styles/rich-text-editor/material3-dark.css +58 -14
  102. package/styles/rich-text-editor/material3.css +58 -14
  103. package/styles/rich-text-editor/tailwind-dark.css +44 -6
  104. package/styles/rich-text-editor/tailwind.css +44 -6
  105. package/styles/tailwind-dark.css +44 -6
  106. package/styles/tailwind.css +44 -6
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * filename: index.d.ts
3
- * version : 24.1.47
3
+ * version : 24.2.4
4
4
  * Copyright Syncfusion Inc. 2001 - 2023. All rights reserved.
5
5
  * Use of this code is subject to the terms of our license.
6
6
  * A copy of the current license can be obtained at any time by e-mailing
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "_from": "@syncfusion/ej2-richtexteditor@*",
3
- "_id": "@syncfusion/ej2-richtexteditor@24.1.46",
3
+ "_id": "@syncfusion/ej2-richtexteditor@24.2.3",
4
4
  "_inBundle": false,
5
- "_integrity": "sha512-K1mDIDbCA6xYUHgnITLvbR5bMXvuS5ohLMuOy4cZZNgxXUwey8If1jCejn71a0kGGFVk9LCmVb97JtN2t6CP6g==",
5
+ "_integrity": "sha512-qjy4z7YGj17wCO4I5dW2kqGyRSaUxHXprYekBaF78kmtSAbFQjy8QFO9+15bOUEcNTPaTaPWHNvZ61Vm3+qOEw==",
6
6
  "_location": "/@syncfusion/ej2-richtexteditor",
7
7
  "_phantomChildren": {},
8
8
  "_requested": {
@@ -25,8 +25,8 @@
25
25
  "/@syncfusion/ej2-react-richtexteditor",
26
26
  "/@syncfusion/ej2-vue-richtexteditor"
27
27
  ],
28
- "_resolved": "https://nexus.syncfusion.com/repository/ej2-hotfix-new/@syncfusion/ej2-richtexteditor/-/ej2-richtexteditor-24.1.46.tgz",
29
- "_shasum": "709472d820317afe84896ef327ab8355e8b151e3",
28
+ "_resolved": "https://nexus.syncfusion.com/repository/ej2-hotfix-new/@syncfusion/ej2-richtexteditor/-/ej2-richtexteditor-24.2.3.tgz",
29
+ "_shasum": "c6180082b7903ea03940e96f5911e093ee6fab92",
30
30
  "_spec": "@syncfusion/ej2-richtexteditor@*",
31
31
  "_where": "/jenkins/workspace/elease-automation_release_24.1.1/packages/included",
32
32
  "author": {
@@ -37,13 +37,13 @@
37
37
  },
38
38
  "bundleDependencies": false,
39
39
  "dependencies": {
40
- "@syncfusion/ej2-base": "~24.1.46",
41
- "@syncfusion/ej2-buttons": "~24.1.46",
42
- "@syncfusion/ej2-filemanager": "~24.1.47",
43
- "@syncfusion/ej2-inputs": "~24.1.47",
44
- "@syncfusion/ej2-navigations": "~24.1.46",
45
- "@syncfusion/ej2-popups": "~24.1.46",
46
- "@syncfusion/ej2-splitbuttons": "~24.1.46"
40
+ "@syncfusion/ej2-base": "~24.2.3",
41
+ "@syncfusion/ej2-buttons": "~24.2.3",
42
+ "@syncfusion/ej2-filemanager": "~24.2.3",
43
+ "@syncfusion/ej2-inputs": "~24.2.4",
44
+ "@syncfusion/ej2-navigations": "~24.2.4",
45
+ "@syncfusion/ej2-popups": "~24.2.3",
46
+ "@syncfusion/ej2-splitbuttons": "~24.2.3"
47
47
  },
48
48
  "deprecated": false,
49
49
  "description": "Essential JS 2 RichTextEditor component",
@@ -69,6 +69,6 @@
69
69
  "url": "git+https://github.com/syncfusion/ej2-javascript-ui-controls.git"
70
70
  },
71
71
  "typings": "index.d.ts",
72
- "version": "24.1.47",
72
+ "version": "24.2.4",
73
73
  "sideEffects": false
74
74
  }
@@ -91,3 +91,9 @@ export declare const FORMAT_PAINTER_ACTIONS: string;
91
91
  * @hidden
92
92
  */
93
93
  export declare const EMOJI_PICKER_ACTIONS: string;
94
+ /**
95
+ * Mouse down event constant
96
+ *
97
+ * @hidden
98
+ */
99
+ export declare const MOUSE_DOWN: string;
@@ -91,3 +91,9 @@ export var FORMAT_PAINTER_ACTIONS = 'format_painter_actions';
91
91
  * @hidden
92
92
  */
93
93
  export var EMOJI_PICKER_ACTIONS = 'emoji_picker_actions';
94
+ /**
95
+ * Mouse down event constant
96
+ *
97
+ * @hidden
98
+ */
99
+ export var MOUSE_DOWN = 'mouseDown';
@@ -34,3 +34,9 @@ export declare function getDefaultHtmlTbStatus(): IToolbarStatus;
34
34
  * @hidden
35
35
  */
36
36
  export declare function getDefaultMDTbStatus(): IToolbarStatus;
37
+ /**
38
+ * @param {Range} range - specifies the range
39
+ * @returns {void}
40
+ * @hidden
41
+ */
42
+ export declare function nestedListCleanUp(range: Range): void;
@@ -82,30 +82,41 @@ export function updateTextNode(value, enterAction) {
82
82
  }
83
83
  var tableElm = resultElm.querySelectorAll('table');
84
84
  for (var i = 0; i < tableElm.length; i++) {
85
- if (tableElm[i].getAttribute('border') === '0') {
86
- tableElm[i].removeAttribute('border');
87
- }
88
- var tdElm = tableElm[i].querySelectorAll('td');
89
- for (var j = 0; j < tdElm.length; j++) {
90
- if (tdElm[j].style.borderLeft === 'none') {
91
- tdElm[j].style.removeProperty('border-left');
92
- }
93
- if (tdElm[j].style.borderRight === 'none') {
94
- tdElm[j].style.removeProperty('border-right');
85
+ if (tableElm[i].classList.length > 0 && !tableElm[i].classList.contains('e-rte-table')) {
86
+ tableElm[i].classList.add('e-rte-paste-table');
87
+ if (tableElm[i].classList.contains('e-rte-paste-word-table')) {
88
+ tableElm[i].classList.remove('e-rte-paste-word-table');
89
+ continue; // Sking the removal of the border if the source is from word.
95
90
  }
96
- if (tdElm[j].style.borderBottom === 'none') {
97
- tdElm[j].style.removeProperty('border-bottom');
98
- }
99
- if (tdElm[j].style.borderTop === 'none') {
100
- tdElm[j].style.removeProperty('border-top');
91
+ else if (tableElm[i].classList.contains('e-rte-paste-excel-table')) {
92
+ tableElm[i].classList.remove('e-rte-paste-excel-table');
93
+ if (tableElm[i].getAttribute('border') === '0') {
94
+ tableElm[i].removeAttribute('border');
95
+ }
96
+ var tdElm = tableElm[i].querySelectorAll('td');
97
+ for (var j = 0; j < tdElm.length; j++) {
98
+ if (tdElm[j].style.borderLeft === 'none') {
99
+ tdElm[j].style.removeProperty('border-left');
100
+ }
101
+ if (tdElm[j].style.borderRight === 'none') {
102
+ tdElm[j].style.removeProperty('border-right');
103
+ }
104
+ if (tdElm[j].style.borderBottom === 'none') {
105
+ tdElm[j].style.removeProperty('border-bottom');
106
+ }
107
+ if (tdElm[j].style.borderTop === 'none') {
108
+ tdElm[j].style.removeProperty('border-top');
109
+ }
110
+ if (tdElm[j].style.border === 'none') {
111
+ tdElm[j].style.removeProperty('border');
112
+ }
113
+ }
101
114
  }
102
- if (tdElm[j].style.border === 'none') {
103
- tdElm[j].style.removeProperty('border');
115
+ else if (tableElm[i].classList.contains('e-rte-paste-onenote-table')) {
116
+ tableElm[i].classList.remove('e-rte-paste-onenote-table');
117
+ continue;
104
118
  }
105
119
  }
106
- if (!tableElm[i].classList.contains('e-rte-table')) {
107
- tableElm[i].classList.add('e-rte-table');
108
- }
109
120
  }
110
121
  var imageElm = resultElm.querySelectorAll('img');
111
122
  for (var i = 0; i < imageElm.length; i++) {
@@ -179,3 +190,30 @@ export function getDefaultMDTbStatus() {
179
190
  formats: null
180
191
  };
181
192
  }
193
+ /**
194
+ * @param {Range} range - specifies the range
195
+ * @returns {void}
196
+ * @hidden
197
+ */
198
+ export function nestedListCleanUp(range) {
199
+ if (range.startContainer.parentElement.closest('ol,ul') !== null && range.endContainer.parentElement.closest('ol,ul') !== null) {
200
+ range.extractContents();
201
+ while ((range.startContainer.nodeName === "#text" ? range.startContainer.parentElement : range.startContainer).querySelectorAll('li :empty').length > 0 ||
202
+ (range.startContainer.nodeName === "#text" ? range.startContainer.parentElement : range.startContainer).querySelectorAll('ol :empty').length > 0) {
203
+ var emptyLI = (range.startContainer.nodeName === "#text" ? range.startContainer.parentElement : range.startContainer).querySelectorAll('li :empty');
204
+ if (emptyLI.length > 0) {
205
+ emptyLI.forEach(function (item) {
206
+ item.remove();
207
+ });
208
+ }
209
+ }
210
+ var liElem = (range.startContainer.nodeName === "#text" ? range.startContainer.parentElement : range.startContainer).querySelectorAll("li");
211
+ if (liElem.length > 0) {
212
+ liElem.forEach(function (item) {
213
+ if (item.firstChild.nodeName === "OL" || item.firstChild.nodeName === "UL") {
214
+ item.style.listStyleType = "none";
215
+ }
216
+ });
217
+ }
218
+ }
219
+ }
@@ -82,3 +82,9 @@ export declare const CLEAR_TYPE: string;
82
82
  * @hidden
83
83
  */
84
84
  export declare const SELF_CLOSING_TAGS: string[];
85
+ /**
86
+ * Source
87
+ *
88
+ * @hidden
89
+ */
90
+ export declare const PASTE_SOURCE: string[];
@@ -87,3 +87,9 @@ export var CLEAR_TYPE = 'clear-type';
87
87
  * @hidden
88
88
  */
89
89
  export var SELF_CLOSING_TAGS = ['area', 'base', 'br', 'embed', 'hr', 'img', 'input', 'param', 'source', 'track', 'wbr', 'iframe', 'td', 'table'];
90
+ /**
91
+ * Source
92
+ *
93
+ * @hidden
94
+ */
95
+ export var PASTE_SOURCE = ['word', 'excel', 'onenote'];
@@ -79,4 +79,9 @@ export declare class EditorManager {
79
79
 
80
80
  */
81
81
  execCommand<T>(command: ExecCommand, value: T, event?: Event, callBack?: Function, text?: string | Node, exeValue?: T, selector?: string, enterAction?: string): void;
82
+ private editorMouseDown;
83
+ private tripleClickSelection;
84
+ private getParentBlockNode;
85
+ private getLastTextNode;
86
+ private getFirstTextNode;
82
87
  }
@@ -68,6 +68,7 @@ var EditorManager = /** @class */ (function () {
68
68
  this.observer.on(EVENTS.MODEL_CHANGED, this.onPropertyChanged, this);
69
69
  this.observer.on(EVENTS.MS_WORD_CLEANUP, this.onWordPaste, this);
70
70
  this.observer.on(EVENTS.ON_BEGIN, this.onBegin, this);
71
+ this.observer.on(EVENTS.MOUSE_DOWN, this.editorMouseDown, this);
71
72
  };
72
73
  EditorManager.prototype.onWordPaste = function (e) {
73
74
  this.observer.notify(EVENTS.MS_WORD_CLEANUP_PLUGIN, e);
@@ -211,6 +212,64 @@ var EditorManager = /** @class */ (function () {
211
212
  event: event, callBack: callBack });
212
213
  }
213
214
  };
215
+ EditorManager.prototype.editorMouseDown = function (e) {
216
+ if (e.args.detail === 3) {
217
+ this.tripleClickSelection(e.args);
218
+ }
219
+ };
220
+ EditorManager.prototype.tripleClickSelection = function (e) {
221
+ var range = this.nodeSelection.getRange(this.currentDocument);
222
+ var selection = this.nodeSelection.get(this.currentDocument);
223
+ if (selection.rangeCount > 0 && selection.toString() !== '') {
224
+ var startBlockNode = this.getParentBlockNode(range.startContainer);
225
+ var endBlockNode = this.getParentBlockNode(range.endContainer);
226
+ if (startBlockNode && endBlockNode && startBlockNode === endBlockNode) {
227
+ var newRange = this.currentDocument.createRange();
228
+ var startTextNode = this.getFirstTextNode(startBlockNode);
229
+ var endTextNode = this.getLastTextNode(endBlockNode);
230
+ if (startTextNode && endTextNode) {
231
+ newRange.setStart(startTextNode, 0);
232
+ newRange.setEnd(endTextNode, endTextNode.textContent.length);
233
+ this.nodeSelection.setRange(this.currentDocument, newRange);
234
+ e.preventDefault();
235
+ }
236
+ }
237
+ }
238
+ };
239
+ EditorManager.prototype.getParentBlockNode = function (node) {
240
+ var treeWalker = this.currentDocument.createTreeWalker(this.editableElement, // root
241
+ NodeFilter.SHOW_ELEMENT, // whatToShow
242
+ {
243
+ acceptNode: function (currentNode) {
244
+ // Check if the node is a block element
245
+ var displayStyle = window.getComputedStyle(currentNode).display;
246
+ if (displayStyle.indexOf('inline') < 0) {
247
+ return NodeFilter.FILTER_ACCEPT;
248
+ }
249
+ else {
250
+ return NodeFilter.FILTER_SKIP;
251
+ }
252
+ }
253
+ });
254
+ treeWalker.currentNode = node;
255
+ var blockParent = treeWalker.parentNode();
256
+ return blockParent;
257
+ };
258
+ EditorManager.prototype.getLastTextNode = function (node) {
259
+ var treeWalker = this.currentDocument.createTreeWalker(node, NodeFilter.SHOW_TEXT, null);
260
+ var lastTextNode = null;
261
+ var currentNode = treeWalker.nextNode();
262
+ while (currentNode) {
263
+ lastTextNode = currentNode;
264
+ currentNode = treeWalker.nextNode();
265
+ }
266
+ return lastTextNode;
267
+ };
268
+ EditorManager.prototype.getFirstTextNode = function (node) {
269
+ var treeWalker = this.currentDocument.createTreeWalker(node, NodeFilter.SHOW_TEXT, null);
270
+ var firstTextNode = treeWalker.nextNode();
271
+ return firstTextNode;
272
+ };
214
273
  return EditorManager;
215
274
  }());
216
275
  export { EditorManager };
@@ -227,3 +227,11 @@ export interface CSSPropCollection {
227
227
  value: string;
228
228
  priority: string;
229
229
  }
230
+ /**
231
+ * @private
232
+ * @hidden
233
+ */
234
+ export interface IHTMLMouseEventArgs {
235
+ name: string;
236
+ args: MouseEvent;
237
+ }
@@ -573,7 +573,9 @@ var DOMNode = /** @class */ (function () {
573
573
  else if (start.tagName === 'BR') {
574
574
  this.replaceWith(start, this.marker(className, this.encode(start.textContent)));
575
575
  var markerStart = range.startContainer.querySelector('.' + className);
576
- markerStart.parentElement.appendChild(start);
576
+ if (markerStart) {
577
+ markerStart.parentElement.appendChild(start);
578
+ }
577
579
  }
578
580
  else {
579
581
  if (start.tagName === 'IMG') {
@@ -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);
@@ -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
  *
@@ -82,7 +82,12 @@ var InsertHtml = /** @class */ (function () {
82
82
  lasNode.textContent.length : lasNode.childNodes.length);
83
83
  range = nodeSelection.getRange(docElement);
84
84
  }
85
- range.extractContents();
85
+ if (range.startContainer.parentElement.closest('ol,ul') !== null && range.endContainer.parentElement.closest('ol,ul') !== null) {
86
+ nestedListCleanUp(range);
87
+ }
88
+ else {
89
+ range.extractContents();
90
+ }
86
91
  if (insertNode.tagName === 'TABLE') {
87
92
  this.removeEmptyElements(editNode);
88
93
  }
@@ -50,5 +50,7 @@ export declare class MsWordPaste {
50
50
  private getlistStyleType;
51
51
  private makeConversion;
52
52
  private getListContent;
53
+ private processMargin;
53
54
  private removeEmptyAnchorTag;
55
+ private findSource;
54
56
  }
@@ -1,5 +1,6 @@
1
1
  import * as EVENTS from '../../common/constant';
2
2
  import { createElement, isNullOrUndefined as isNOU, detach } from '@syncfusion/ej2-base';
3
+ import { PASTE_SOURCE } from '../base/constant';
3
4
  /**
4
5
  * PasteCleanup for MsWord content
5
6
  *
@@ -66,6 +67,7 @@ var MsWordPaste = /** @class */ (function () {
66
67
  var pattern4 = /style='mso-width-source:/i;
67
68
  if (patern.test(tempHTMLContent) || patern2.test(tempHTMLContent) || patern3.test(tempHTMLContent) ||
68
69
  pattern4.test(tempHTMLContent)) {
70
+ var source = this.findSource(elm);
69
71
  this.imageConversion(elm, rtfData);
70
72
  tempHTMLContent = tempHTMLContent.replace(/<img[^>]+>/i, '');
71
73
  this.addListClass(elm);
@@ -86,16 +88,8 @@ var MsWordPaste = /** @class */ (function () {
86
88
  if (pattern4.test(tempHTMLContent)) {
87
89
  this.addTableBorderClass(elm);
88
90
  }
89
- // Removing the margin for list items
90
- var liChildren = elm.querySelectorAll('li');
91
- if (liChildren.length > 0) {
92
- for (var i = 0; i < liChildren.length; i++) {
93
- if (!isNOU(liChildren[i].style.marginLeft)) {
94
- liChildren[i].style.marginLeft = '';
95
- }
96
- }
97
- }
98
- e.callBack(elm.innerHTML, this.cropImageDimensions);
91
+ this.processMargin(elm);
92
+ e.callBack(elm.innerHTML, this.cropImageDimensions, source);
99
93
  }
100
94
  else {
101
95
  e.callBack(elm.innerHTML);
@@ -929,6 +923,25 @@ var MsWordPaste = /** @class */ (function () {
929
923
  }
930
924
  this.listContents.push(elem.innerHTML);
931
925
  };
926
+ MsWordPaste.prototype.processMargin = function (element) {
927
+ var liChildren = element.querySelectorAll('li');
928
+ if (liChildren.length > 0) {
929
+ for (var i = 0; i < liChildren.length; i++) {
930
+ if (!isNOU((liChildren[i]).style.marginLeft)) {
931
+ (liChildren[i]).style.marginLeft = '';
932
+ }
933
+ }
934
+ }
935
+ var tableChildren = element.querySelectorAll('table');
936
+ if (tableChildren.length > 0) {
937
+ for (var i = 0; i < tableChildren.length; i++) {
938
+ if (!isNOU((tableChildren[i]).style.marginLeft) &&
939
+ (tableChildren[i]).style.marginLeft.indexOf('-') >= 0) {
940
+ (tableChildren[i]).style.marginLeft = '';
941
+ }
942
+ }
943
+ }
944
+ };
932
945
  MsWordPaste.prototype.removeEmptyAnchorTag = function (element) {
933
946
  var removableElement = element.querySelectorAll('a:not([href])');
934
947
  for (var j = removableElement.length - 1; j >= 0; j--) {
@@ -939,6 +952,22 @@ var MsWordPaste = /** @class */ (function () {
939
952
  parentElem.removeChild(removableElement[j]);
940
953
  }
941
954
  };
955
+ MsWordPaste.prototype.findSource = function (element) {
956
+ var metaNodes = element.querySelectorAll('meta');
957
+ for (var i = 0; i < metaNodes.length; i++) {
958
+ var metaNode = metaNodes[i];
959
+ var content = metaNode.getAttribute('content');
960
+ var name_1 = metaNode.getAttribute('name');
961
+ if (name_1 && name_1.toLowerCase().indexOf('generator') >= 0 && content && content.toLowerCase().indexOf('microsoft') >= 0) {
962
+ for (var j = 0; j < PASTE_SOURCE.length; j++) {
963
+ if (content.toLowerCase().indexOf(PASTE_SOURCE[j]) >= 0) {
964
+ return PASTE_SOURCE[j];
965
+ }
966
+ }
967
+ }
968
+ }
969
+ return 'html';
970
+ };
942
971
  return MsWordPaste;
943
972
  }());
944
973
  export { MsWordPaste };
@@ -38,6 +38,22 @@ var SelectionCommands = /** @class */ (function () {
38
38
  var nodeCutter = new NodeCutter();
39
39
  var isFormatted = new IsFormatted();
40
40
  var range = domSelection.getRange(docElement);
41
+ if (Browser.userAgent.indexOf('Firefox') !== -1 && range.startContainer === range.endContainer && !isNOU(endNode) && range.startContainer === endNode) {
42
+ var startChildNodes = range.startContainer.childNodes;
43
+ var startNode = ((startChildNodes[(range.startOffset > 0) ? (range.startOffset - 1) :
44
+ range.startOffset]) || range.startContainer);
45
+ var endNode_1 = (range.endContainer.childNodes[(range.endOffset > 0) ? (range.endOffset - 1) :
46
+ range.endOffset] || range.endContainer);
47
+ var lastSelectionNode = (endNode_1.lastChild.nodeName === 'BR' ? (isNOU(endNode_1.lastChild.previousSibling) ? endNode_1
48
+ : endNode_1.lastChild.previousSibling) : endNode_1.firstChild);
49
+ while (!isNOU(lastSelectionNode) && lastSelectionNode.nodeName !== '#text' && lastSelectionNode.nodeName !== 'IMG' &&
50
+ lastSelectionNode.nodeName !== 'BR' && lastSelectionNode.nodeName !== 'HR') {
51
+ lastSelectionNode = lastSelectionNode.lastChild;
52
+ }
53
+ ;
54
+ domSelection.setSelectionText(docElement, startNode, lastSelectionNode, 0, 0);
55
+ range = domSelection.getRange(docElement);
56
+ }
41
57
  var save = domSelection.save(range, docElement);
42
58
  var nodes = range.collapsed ? domSelection.getSelectionNodeCollection(range) :
43
59
  domSelection.getSelectionNodeCollectionBr(range);
@@ -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,7 +60,6 @@ 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
64
  if (table.nextElementSibling === null) {
66
65
  var insertElem = void 0;
@@ -104,24 +103,6 @@ var TableCommand = /** @class */ (function () {
104
103
  }
105
104
  return styleValue;
106
105
  };
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
106
  TableCommand.prototype.insertAfter = function (newNode, referenceNode) {
126
107
  referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
127
108
  };
@@ -472,14 +453,21 @@ var TableCommand = /** @class */ (function () {
472
453
  }
473
454
  };
474
455
  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';
456
+ var value = '';
457
+ switch (e.item.subCommand) {
458
+ case 'AlignTop':
459
+ value = 'top';
460
+ break;
461
+ case 'AlignMiddle':
462
+ value = 'middle';
463
+ break;
464
+ case 'AlignBottom':
465
+ value = 'bottom';
466
+ break;
480
467
  }
481
- else {
482
- e.item.tableCell.style.verticalAlign = 'bottom';
468
+ e.item.tableCell.style.verticalAlign = value;
469
+ if (value && value !== '' && e.item.tableCell.getAttribute('valign')) {
470
+ e.item.tableCell.removeAttribute('valign');
483
471
  }
484
472
  if (e.callBack) {
485
473
  e.callBack({
@@ -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);
@@ -320,6 +320,9 @@ var BaseQuickToolbar = /** @class */ (function () {
320
320
  this.parent.enableToolbarItem(this.parent.toolbarSettings.items);
321
321
  }
322
322
  }
323
+ if (this.parent.showTooltip && !isNOU(document.querySelector('.e-tooltip-wrap'))) {
324
+ this.parent.notify(events.destroyTooltip, { args: event });
325
+ }
323
326
  this.removeEleFromDOM();
324
327
  this.isDOMElement = false;
325
328
  };
@@ -154,10 +154,14 @@ var BaseToolbar = /** @class */ (function () {
154
154
  _this.parent.formatter.saveData();
155
155
  }
156
156
  callback_1.call(_this);
157
- var currentContentElem = _this.parent.createElement('div');
158
- currentContentElem.appendChild(_this.parent.formatter.getUndoRedoStack()[_this.parent.formatter.getUndoRedoStack().length - 1].text);
159
- if (currentContentElem.innerHTML.trim() === _this.parent.inputElement.innerHTML.trim()) {
160
- return;
157
+ if (_this.parent.formatter.getUndoRedoStack().length > 0) {
158
+ var currentContentElem = _this.parent.createElement('div');
159
+ var stackItem = _this.parent.formatter.getUndoRedoStack()[_this.parent.formatter.getUndoRedoStack().length - 1];
160
+ var clonedItem = (stackItem.text).cloneNode(true);
161
+ currentContentElem.appendChild(clonedItem);
162
+ if (currentContentElem.innerHTML.trim() === _this.parent.inputElement.innerHTML.trim()) {
163
+ return;
164
+ }
161
165
  }
162
166
  if (proxy_1.undo) {
163
167
  _this.parent.formatter.saveData();
@@ -35,7 +35,7 @@ var Count = /** @class */ (function () {
35
35
  };
36
36
  Count.prototype.appendCount = function () {
37
37
  var htmlText = this.parent.editorMode === 'Markdown' ? this.editPanel.value :
38
- this.editPanel.textContent;
38
+ (this.parent.getText().replace(/(\r\n|\n|\r|\t)/gm, ''));
39
39
  if (this.parent.editorMode !== 'Markdown' && htmlText.indexOf('\u200B') !== -1) {
40
40
  this.htmlLength = htmlText.replace(/\u200B/g, '').length;
41
41
  }