@syncfusion/ej2-richtexteditor 25.1.35 → 25.1.38

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 (61) hide show
  1. package/CHANGELOG.md +28 -0
  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 +71 -50
  6. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  7. package/dist/es6/ej2-richtexteditor.es5.js +71 -50
  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 +10 -10
  13. package/src/editor-manager/plugin/dom-node.js +2 -1
  14. package/src/editor-manager/plugin/inserthtml.js +16 -19
  15. package/src/editor-manager/plugin/lists.js +31 -11
  16. package/src/editor-manager/plugin/ms-word-clean-up.js +2 -2
  17. package/src/editor-manager/plugin/selection-commands.js +4 -0
  18. package/src/rich-text-editor/actions/html-editor.js +0 -3
  19. package/src/rich-text-editor/actions/quick-toolbar.js +4 -0
  20. package/src/rich-text-editor/base/rich-text-editor.js +2 -4
  21. package/src/rich-text-editor/renderer/toolbar-renderer.js +10 -10
  22. package/styles/bootstrap-dark.css +14 -7
  23. package/styles/bootstrap.css +7 -3
  24. package/styles/bootstrap4.css +4 -0
  25. package/styles/bootstrap5-dark.css +4 -0
  26. package/styles/bootstrap5.css +4 -0
  27. package/styles/fabric-dark.css +4 -0
  28. package/styles/fabric.css +4 -0
  29. package/styles/fluent-dark.css +21 -5
  30. package/styles/fluent.css +21 -5
  31. package/styles/highcontrast-light.css +4 -0
  32. package/styles/highcontrast.css +4 -0
  33. package/styles/material-dark.css +5 -1
  34. package/styles/material.css +5 -1
  35. package/styles/material3-dark.css +4 -0
  36. package/styles/material3.css +4 -0
  37. package/styles/rich-text-editor/_bootstrap-dark-definition.scss +4 -4
  38. package/styles/rich-text-editor/_bootstrap-definition.scss +2 -2
  39. package/styles/rich-text-editor/_fluent-definition.scss +5 -5
  40. package/styles/rich-text-editor/_layout.scss +7 -7
  41. package/styles/rich-text-editor/_tailwind-definition.scss +5 -5
  42. package/styles/rich-text-editor/_theme.scss +21 -0
  43. package/styles/rich-text-editor/bootstrap-dark.css +14 -7
  44. package/styles/rich-text-editor/bootstrap.css +7 -3
  45. package/styles/rich-text-editor/bootstrap4.css +4 -0
  46. package/styles/rich-text-editor/bootstrap5-dark.css +4 -0
  47. package/styles/rich-text-editor/bootstrap5.css +4 -0
  48. package/styles/rich-text-editor/fabric-dark.css +4 -0
  49. package/styles/rich-text-editor/fabric.css +4 -0
  50. package/styles/rich-text-editor/fluent-dark.css +21 -5
  51. package/styles/rich-text-editor/fluent.css +21 -5
  52. package/styles/rich-text-editor/highcontrast-light.css +4 -0
  53. package/styles/rich-text-editor/highcontrast.css +4 -0
  54. package/styles/rich-text-editor/material-dark.css +5 -1
  55. package/styles/rich-text-editor/material.css +5 -1
  56. package/styles/rich-text-editor/material3-dark.css +4 -0
  57. package/styles/rich-text-editor/material3.css +4 -0
  58. package/styles/rich-text-editor/tailwind-dark.css +13 -13
  59. package/styles/rich-text-editor/tailwind.css +13 -13
  60. package/styles/tailwind-dark.css +13 -13
  61. package/styles/tailwind.css +13 -13
@@ -3945,9 +3945,11 @@ class ToolbarRenderer {
3945
3945
  for (let index = 0; index < args.element.childNodes.length; index++) {
3946
3946
  if (currentListStyle === args.element.childNodes[index].innerHTML.split(' ').join('').toLocaleLowerCase()) {
3947
3947
  addClass([args.element.childNodes[index]], 'e-active');
3948
+ break;
3948
3949
  }
3949
- else if (currentListStyle === '') {
3950
+ else if (currentListStyle === '' && args.element.childNodes[index].innerHTML !== 'None') {
3950
3951
  addClass([args.element.childNodes[index]], 'e-active');
3952
+ break;
3951
3953
  }
3952
3954
  }
3953
3955
  }
@@ -4035,8 +4037,6 @@ class ToolbarRenderer {
4035
4037
  target: colorPicker.element.parentElement, cssClass: css,
4036
4038
  enablePersistence: this.parent.enablePersistence, enableRtl: this.parent.enableRtl,
4037
4039
  beforeOpen: (dropDownArgs) => {
4038
- colorPicker.inline = true;
4039
- colorPicker.dataBind();
4040
4040
  if (proxy.parent.readonly || !proxy.parent.enabled) {
4041
4041
  dropDownArgs.cancel = true;
4042
4042
  return;
@@ -4174,14 +4174,18 @@ class ToolbarRenderer {
4174
4174
  const colorPicker = new ColorPicker({
4175
4175
  enablePersistence: this.parent.enablePersistence,
4176
4176
  enableRtl: this.parent.enableRtl,
4177
- inline: false,
4178
- value: '#fff',
4177
+ inline: true,
4178
+ value: null,
4179
+ cssClass: ((item === 'backgroundcolor') ? CLS_BACKGROUND_COLOR_PICKER : CLS_FONT_COLOR_PICKER) + ' ' + args.cssClass + ' ' + 'e-rte-picker-init',
4179
4180
  created: () => {
4180
4181
  const value = (item === 'backgroundcolor') ? proxy.parent.backgroundColor.default : proxy.parent.fontColor.default;
4181
- colorPicker.setProperties({ value: value });
4182
+ colorPicker.cssClass = ((item === 'backgroundcolor') ? CLS_BACKGROUND_COLOR_PICKER : CLS_FONT_COLOR_PICKER) + ' ' + args.cssClass;
4183
+ colorPicker.value = value;
4182
4184
  },
4183
4185
  mode: ((item === 'backgroundcolor') ? proxy.parent.backgroundColor.mode : proxy.parent.fontColor.mode),
4184
4186
  modeSwitcher: ((item === 'backgroundcolor') ? proxy.parent.backgroundColor.modeSwitcher : proxy.parent.fontColor.modeSwitcher),
4187
+ presetColors: (item === 'backgroundcolor') ? this.parent.backgroundColor.colorCode : this.parent.fontColor.colorCode,
4188
+ columns: (item === 'backgroundcolor') ? this.parent.backgroundColor.columns : this.parent.fontColor.columns,
4185
4189
  beforeTileRender: (args) => {
4186
4190
  args.element.classList.add(CLS_COLOR_PALETTE);
4187
4191
  args.element.classList.add(CLS_CUSTOM_TILE);
@@ -4226,10 +4230,6 @@ class ToolbarRenderer {
4226
4230
  }
4227
4231
  });
4228
4232
  colorPicker.isStringTemplate = true;
4229
- colorPicker.columns = (item === 'backgroundcolor') ? this.parent.backgroundColor.columns : this.parent.fontColor.columns;
4230
- colorPicker.presetColors = (item === 'backgroundcolor') ? this.parent.backgroundColor.colorCode :
4231
- this.parent.fontColor.colorCode;
4232
- colorPicker.cssClass = ((item === 'backgroundcolor') ? CLS_BACKGROUND_COLOR_PICKER : CLS_FONT_COLOR_PICKER) + ' ' + args.cssClass;
4233
4233
  colorPicker.createElement = this.parent.createElement;
4234
4234
  colorPicker.appendTo(document.getElementById(args.target));
4235
4235
  return colorPicker;
@@ -7067,6 +7067,10 @@ class QuickToolbar {
7067
7067
  }
7068
7068
  keyDownHandler(e) {
7069
7069
  const preventHide = e.args.altKey;
7070
+ if (this.parent.inlineMode.enable && e.args.metaKey && e.args.keyCode === 65) {
7071
+ this.showInlineQTBar(this.offsetX, this.offsetY, e.args.target);
7072
+ return;
7073
+ }
7070
7074
  if (!preventHide) {
7071
7075
  if ((this.parent.inlineMode.enable && (!Browser.isDevice || isIDevice()))
7072
7076
  && !isNullOrUndefined(select('.' + CLS_INLINE_POP, document))) {
@@ -11857,7 +11861,8 @@ class DOMNode {
11857
11861
  }
11858
11862
  }
11859
11863
  else {
11860
- if (start.tagName === 'IMG') {
11864
+ let tagName = !isNullOrUndefined(start.parentElement) ? start.parentElement.tagName.toLocaleLowerCase() : '';
11865
+ if (start.tagName === 'IMG' && tagName !== 'p' && tagName !== 'div') {
11861
11866
  const parNode = document.createElement('p');
11862
11867
  start.parentElement.insertBefore(parNode, start);
11863
11868
  parNode.appendChild(start);
@@ -12408,6 +12413,7 @@ class Lists {
12408
12413
  endNode = endNode.nodeName === 'BR' ? endNode.parentElement : endNode;
12409
12414
  startNode = startNode.nodeName !== 'LI' && !isNullOrUndefined(startNode.closest('LI')) ? startNode.closest('LI') : startNode;
12410
12415
  endNode = endNode.nodeName !== 'LI' && endNode.nodeName !== '#text' && !isNullOrUndefined(endNode.closest('LI')) ? endNode.closest('LI') : endNode;
12416
+ const parentList = (range.startContainer.nodeName === '#text') ? range.startContainer.parentElement.closest('li') : range.startContainer.closest('li');
12411
12417
  if (((range.commonAncestorContainer.nodeName === 'OL' || range.commonAncestorContainer.nodeName === 'UL' || range.commonAncestorContainer.nodeName === 'LI') &&
12412
12418
  isNullOrUndefined(endNode.nextElementSibling) && endNode.textContent.length === range.endOffset &&
12413
12419
  isNullOrUndefined(startNode.previousElementSibling) && range.startOffset === 0) ||
@@ -12424,6 +12430,12 @@ class Lists {
12424
12430
  }
12425
12431
  e.event.preventDefault();
12426
12432
  }
12433
+ else if (!isNullOrUndefined(parentList) && parentList.textContent === range.startContainer.textContent && parentList.closest('li').previousElementSibling === null) {
12434
+ range.deleteContents();
12435
+ this.parent.editableElement.querySelectorAll('li:empty').forEach((e) => e.remove());
12436
+ this.parent.editableElement.querySelectorAll('ol:empty').forEach((e) => e.remove());
12437
+ e.event.preventDefault();
12438
+ }
12427
12439
  }
12428
12440
  onKeyUp() {
12429
12441
  if (!isNullOrUndefined(this.commonLIParent) && !isNullOrUndefined(this.commonLIParent.querySelector('.removeList'))) {
@@ -12463,7 +12475,7 @@ class Lists {
12463
12475
  if (e.event.which === 8) {
12464
12476
  this.backspaceList(e);
12465
12477
  }
12466
- if (e.event.which === 46 && e.event.action === 'delete') {
12478
+ if ((e.event.which === 46 && e.event.action === 'delete') || (e.event.which === 88 && e.event.action === 'cut')) {
12467
12479
  const range = this.parent.nodeSelection.getRange(this.parent.currentDocument);
12468
12480
  const commonAncestor = range.commonAncestorContainer;
12469
12481
  const startEle = range.startContainer;
@@ -12935,8 +12947,17 @@ class Lists {
12935
12947
  }
12936
12948
  cleanNode() {
12937
12949
  const liParents = this.parent.editableElement.querySelectorAll('ol + ol, ul + ul');
12950
+ let listStyleType;
12951
+ let firstNodeOL;
12938
12952
  for (let c = 0; c < liParents.length; c++) {
12939
12953
  const node = liParents[c];
12954
+ let toFindtopOlUl = true;
12955
+ if (toFindtopOlUl && (liParents[c].parentElement.parentElement.nodeName === 'OL' || liParents[c].parentElement.parentElement.nodeName === 'UL')) {
12956
+ toFindtopOlUl = false;
12957
+ const preElement = liParents[c].parentElement.parentElement;
12958
+ listStyleType = preElement.style.listStyleType;
12959
+ firstNodeOL = node.previousElementSibling;
12960
+ }
12940
12961
  if (this.domNode.isList(node.previousElementSibling) &&
12941
12962
  this.domNode.openTagString(node) === this.domNode.openTagString(node.previousElementSibling)) {
12942
12963
  const contentNodes = this.domNode.contents(node);
@@ -12951,6 +12972,9 @@ class Lists {
12951
12972
  }
12952
12973
  }
12953
12974
  }
12975
+ if (firstNodeOL) {
12976
+ firstNodeOL.style.listStyleType = listStyleType;
12977
+ }
12954
12978
  }
12955
12979
  findUnSelected(temp, elements) {
12956
12980
  temp = temp.slice().reverse();
@@ -13040,18 +13064,19 @@ class Lists {
13040
13064
  if (DEFAULT_TAG && 0 === element.querySelectorAll(BLOCK_TAGS.join(', ')).length) {
13041
13065
  const wrapperclass = isNullOrUndefined(className) ? ' class="e-rte-wrap-inner"' :
13042
13066
  ' class="' + className + ' e-rte-wrap-inner"';
13043
- let parentElement = parentNode;
13044
- if (!isNullOrUndefined(parentElement.style.listStyleType)) {
13045
- parentNode.style.removeProperty("list-style-type");
13046
- }
13047
- if (!isNullOrUndefined(parentElement.style.listStyleImage)) {
13048
- parentNode.style.removeProperty("list-style-image");
13049
- }
13050
- if (parentElement.style.length === 0) {
13051
- parentNode.removeAttribute("style");
13067
+ const parentElement = parentNode;
13068
+ if (elements.length === parentElement.querySelectorAll('li').length) {
13069
+ if (!isNullOrUndefined(parentElement.style.listStyleType)) {
13070
+ parentNode.style.removeProperty('list-style-type');
13071
+ }
13072
+ if (!isNullOrUndefined(parentElement.style.listStyleImage)) {
13073
+ parentNode.style.removeProperty('list-style-image');
13074
+ }
13075
+ if (parentElement.style.length === 0) {
13076
+ parentNode.removeAttribute('style');
13077
+ }
13052
13078
  }
13053
- const wrapper = '<' + DEFAULT_TAG + wrapperclass +
13054
- this.domNode.attributes(parentElement) + '></' + DEFAULT_TAG + '>';
13079
+ const wrapper = '<' + DEFAULT_TAG + wrapperclass + '></' + DEFAULT_TAG + '>';
13055
13080
  if (e.enterAction !== 'BR') {
13056
13081
  this.domNode.wrapInner(element, this.domNode.parseHTMLFragment(wrapper));
13057
13082
  }
@@ -14004,25 +14029,22 @@ class InsertHtml {
14004
14029
  TABLE_BLOCK_TAGS.indexOf(closestParentNode.tagName.toLocaleLowerCase()) !== -1))
14005
14030
  || (node.nodeName.toLowerCase() === 'table' && closestParentNode &&
14006
14031
  TABLE_BLOCK_TAGS.indexOf(closestParentNode.tagName.toLocaleLowerCase()) === -1))) {
14007
- if (isCollapsed) {
14008
- preNode = nodeCutter.SplitNode(range, closestParentNode, true);
14009
- }
14010
- else {
14011
- preNode = nodeCutter.SplitNode(range, closestParentNode, false);
14012
- }
14013
- sibNode = isNullOrUndefined(preNode.previousSibling) ? preNode.parentNode.previousSibling : preNode.previousSibling;
14014
- if (nodes.length === 1) {
14015
- nodeSelection.setSelectionContents(docElement, preNode);
14016
- range = nodeSelection.getRange(docElement);
14017
- isSingleNode = true;
14018
- }
14019
- else {
14020
- lasNode = nodeCutter.GetSpliceNode(range, nodes[nodes.length - 1].parentElement);
14021
- lasNode = isNullOrUndefined(lasNode) ? preNode : lasNode;
14022
- nodeSelection.setSelectionText(docElement, preNode, lasNode, 0, (lasNode.nodeType === 3) ?
14023
- lasNode.textContent.length : lasNode.childNodes.length);
14024
- range = nodeSelection.getRange(docElement);
14025
- isSingleNode = false;
14032
+ preNode = nodeCutter.GetSpliceNode(range, closestParentNode);
14033
+ if (!isNullOrUndefined(preNode)) {
14034
+ sibNode = isNullOrUndefined(preNode.previousSibling) ? preNode.parentNode.previousSibling : preNode.previousSibling;
14035
+ if (nodes.length === 1) {
14036
+ nodeSelection.setSelectionContents(docElement, preNode);
14037
+ range = nodeSelection.getRange(docElement);
14038
+ isSingleNode = true;
14039
+ }
14040
+ else {
14041
+ lasNode = nodeCutter.GetSpliceNode(range, nodes[nodes.length - 1].parentElement);
14042
+ lasNode = isNullOrUndefined(lasNode) ? preNode : lasNode;
14043
+ nodeSelection.setSelectionText(docElement, preNode, lasNode, 0, (lasNode.nodeType === 3) ?
14044
+ lasNode.textContent.length : lasNode.childNodes.length);
14045
+ range = nodeSelection.getRange(docElement);
14046
+ isSingleNode = false;
14047
+ }
14026
14048
  }
14027
14049
  }
14028
14050
  let containsBlockNode = false;
@@ -17147,11 +17169,15 @@ class SelectionCommands {
17147
17169
  && range.endOffset === range.startContainer.length)) {
17148
17170
  const nodeIndex = [];
17149
17171
  let cloneNode = nodes[index];
17172
+ const clonedElement = cloneNode;
17150
17173
  do {
17151
17174
  nodeIndex.push(domSelection.getIndex(cloneNode));
17152
17175
  cloneNode = cloneNode.parentNode;
17153
17176
  } while (cloneNode && (cloneNode !== formatNode));
17154
17177
  if (nodes[index].nodeName !== 'BR') {
17178
+ if (clonedElement.nodeName === '#text' && clonedElement.textContent.includes('\u200B')) {
17179
+ clonedElement.remove();
17180
+ }
17155
17181
  cloneNode = splitNode = (isCursor && (formatNode.textContent.length - 1) === range.startOffset) ?
17156
17182
  nodeCutter.SplitNode(range, formatNode, true)
17157
17183
  : nodeCutter.GetSpliceNode(range, formatNode);
@@ -18470,7 +18496,7 @@ class MsWordPaste {
18470
18496
  'x', 'xi', 'xii', 'xiii', 'xiv', 'xv', 'xvi', 'xvii', 'xviii', 'xix', 'xx'];
18471
18497
  this.lowerGreekNumber = ['α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ',
18472
18498
  'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω'];
18473
- this.removableElements = ['o:p', 'style'];
18499
+ this.removableElements = ['o:p', 'style', 'w:sdt'];
18474
18500
  this.listContents = [];
18475
18501
  this.cropImageDimensions = [];
18476
18502
  this.parent = parent;
@@ -18835,7 +18861,7 @@ class MsWordPaste {
18835
18861
  let innerElement = elm.innerHTML;
18836
18862
  for (let i = 0; i < this.removableElements.length; i++) {
18837
18863
  // eslint-disable-next-line security/detect-non-literal-regexp
18838
- const regExpStartElem = new RegExp('<' + this.removableElements[i] + '>', 'g');
18864
+ const regExpStartElem = new RegExp('<' + this.removableElements[i] + '\\s*[^>]*>', 'g');
18839
18865
  // eslint-disable-next-line security/detect-non-literal-regexp
18840
18866
  const regExpEndElem = new RegExp('</' + this.removableElements[i] + '>', 'g');
18841
18867
  innerElement = innerElement.replace(regExpStartElem, '');
@@ -21450,9 +21476,6 @@ class HtmlEditor {
21450
21476
  }
21451
21477
  onSelectionRestore(e) {
21452
21478
  this.parent.isBlur = false;
21453
- if (isNullOrUndefined(this.saveSelection) || isNullOrUndefined(closest(this.saveSelection.range.startContainer.parentElement, ".e-img-caption")) ? true : !(closest(this.saveSelection.range.startContainer.parentElement, ".e-img-caption").getAttribute("contenteditable") == "false")) {
21454
- this.contentRenderer.getEditPanel().focus();
21455
- }
21456
21479
  if (isNullOrUndefined(e.items) || e.items) {
21457
21480
  this.saveSelection.restore();
21458
21481
  }
@@ -35883,9 +35906,7 @@ let RichTextEditor = class RichTextEditor extends Component {
35883
35906
  }
35884
35907
  else if (this.iframeSettings.enable) {
35885
35908
  const iframeElement = this.element.querySelector('#' + this.getID() + '_rte-view');
35886
- setTimeout(() => {
35887
- this.setAutoHeight(iframeElement);
35888
- }, 100);
35909
+ this.setAutoHeight(iframeElement);
35889
35910
  this.inputElement.style.overflow = 'hidden';
35890
35911
  }
35891
35912
  }