@syncfusion/ej2-richtexteditor 20.4.43 → 20.4.48

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 (69) hide show
  1. package/CHANGELOG.md +30 -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 +89 -30
  6. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  7. package/dist/es6/ej2-richtexteditor.es5.js +89 -30
  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/editor-manager/plugin/inserthtml.js +1 -1
  14. package/src/editor-manager/plugin/lists.js +6 -1
  15. package/src/editor-manager/plugin/selection-commands.js +57 -17
  16. package/src/rich-text-editor/base/rich-text-editor-model.d.ts +1 -1
  17. package/src/rich-text-editor/base/rich-text-editor.d.ts +1 -1
  18. package/src/rich-text-editor/base/rich-text-editor.js +4 -4
  19. package/src/rich-text-editor/models/items.js +1 -1
  20. package/src/rich-text-editor/renderer/audio-module.js +4 -1
  21. package/src/rich-text-editor/renderer/image-module.js +4 -1
  22. package/src/rich-text-editor/renderer/table-module.js +5 -2
  23. package/src/rich-text-editor/renderer/toolbar-renderer.js +3 -1
  24. package/src/rich-text-editor/renderer/video-module.js +4 -1
  25. package/styles/bootstrap-dark.css +18 -18
  26. package/styles/bootstrap.css +18 -18
  27. package/styles/bootstrap4.css +18 -18
  28. package/styles/bootstrap5-dark.css +18 -18
  29. package/styles/bootstrap5.css +18 -18
  30. package/styles/fabric-dark.css +18 -18
  31. package/styles/fabric.css +18 -18
  32. package/styles/fluent-dark.css +18 -18
  33. package/styles/fluent.css +18 -18
  34. package/styles/highcontrast-light.css +18 -18
  35. package/styles/highcontrast.css +18 -18
  36. package/styles/material-dark.css +18 -18
  37. package/styles/material.css +18 -18
  38. package/styles/rich-text-editor/_layout.scss +3 -3
  39. package/styles/rich-text-editor/bootstrap-dark.css +18 -18
  40. package/styles/rich-text-editor/bootstrap.css +18 -18
  41. package/styles/rich-text-editor/bootstrap4.css +18 -18
  42. package/styles/rich-text-editor/bootstrap5-dark.css +18 -18
  43. package/styles/rich-text-editor/bootstrap5.css +18 -18
  44. package/styles/rich-text-editor/fabric-dark.css +18 -18
  45. package/styles/rich-text-editor/fabric.css +18 -18
  46. package/styles/rich-text-editor/fluent-dark.css +18 -18
  47. package/styles/rich-text-editor/fluent.css +18 -18
  48. package/styles/rich-text-editor/highcontrast-light.css +18 -18
  49. package/styles/rich-text-editor/highcontrast.css +18 -18
  50. package/styles/rich-text-editor/icons/_bootstrap-dark.scss +1 -1
  51. package/styles/rich-text-editor/icons/_bootstrap.scss +1 -1
  52. package/styles/rich-text-editor/icons/_bootstrap4.scss +1 -1
  53. package/styles/rich-text-editor/icons/_bootstrap5.scss +1 -1
  54. package/styles/rich-text-editor/icons/_fabric-dark.scss +1 -1
  55. package/styles/rich-text-editor/icons/_fabric.scss +1 -1
  56. package/styles/rich-text-editor/icons/_fluent.scss +1 -1
  57. package/styles/rich-text-editor/icons/_fusionnew.scss +1 -1
  58. package/styles/rich-text-editor/icons/_highcontrast-light.scss +1 -1
  59. package/styles/rich-text-editor/icons/_highcontrast.scss +1 -1
  60. package/styles/rich-text-editor/icons/_material-dark.scss +1 -1
  61. package/styles/rich-text-editor/icons/_material.scss +1 -1
  62. package/styles/rich-text-editor/icons/_material3.scss +1 -1
  63. package/styles/rich-text-editor/icons/_tailwind.scss +1 -1
  64. package/styles/rich-text-editor/material-dark.css +18 -18
  65. package/styles/rich-text-editor/material.css +18 -18
  66. package/styles/rich-text-editor/tailwind-dark.css +18 -18
  67. package/styles/rich-text-editor/tailwind.css +18 -18
  68. package/styles/tailwind-dark.css +18 -18
  69. package/styles/tailwind.css +18 -18
@@ -1457,7 +1457,7 @@ let tools = {
1457
1457
  },
1458
1458
  'fontcolor': {
1459
1459
  'id': 'FontColor',
1460
- 'icon': 'e-font-color',
1460
+ 'icon': 'e-rte-font-color',
1461
1461
  'tooltip': 'Font Color',
1462
1462
  'command': 'Font',
1463
1463
  'subCommand': 'FontColor',
@@ -3330,6 +3330,8 @@ class ToolbarRenderer {
3330
3330
  target: colorPicker.element.parentElement, cssClass: css,
3331
3331
  enablePersistence: this.parent.enablePersistence, enableRtl: this.parent.enableRtl,
3332
3332
  beforeOpen: (dropDownArgs) => {
3333
+ colorPicker.inline = true;
3334
+ colorPicker.dataBind();
3333
3335
  if (proxy.parent.readonly || !proxy.parent.enabled) {
3334
3336
  dropDownArgs.cancel = true;
3335
3337
  return;
@@ -3496,7 +3498,7 @@ class ToolbarRenderer {
3496
3498
  const colorPicker = new ColorPicker({
3497
3499
  enablePersistence: this.parent.enablePersistence,
3498
3500
  enableRtl: this.parent.enableRtl,
3499
- inline: true,
3501
+ inline: false,
3500
3502
  value: '#fff',
3501
3503
  created: () => {
3502
3504
  const value = (item === 'backgroundcolor') ? proxy.parent.backgroundColor.default : proxy.parent.fontColor.default;
@@ -11182,7 +11184,7 @@ class Lists {
11182
11184
  range.startContainer.parentElement.closest('LI');
11183
11185
  const endNode = range.endContainer.nodeName === 'LI' ? range.endContainer :
11184
11186
  range.endContainer.parentElement.closest('LI');
11185
- // Checks for Image, Audio , Video Element inside List Element
11187
+ // Checks for Image, Audio , Video Element inside List Element
11186
11188
  let hasMediaElem = false;
11187
11189
  if (!isNullOrUndefined(startNode)) {
11188
11190
  const videoElemList = startNode.querySelectorAll('.e-video-clickelem');
@@ -11809,6 +11811,11 @@ class Lists {
11809
11811
  }
11810
11812
  node.parentNode.removeChild(node);
11811
11813
  }
11814
+ else if (!isNullOrUndefined(node.getAttribute('level'))) {
11815
+ if (node.tagName === node.previousElementSibling.tagName) {
11816
+ node.previousElementSibling.lastChild.append(node);
11817
+ }
11818
+ }
11812
11819
  }
11813
11820
  }
11814
11821
  findUnSelected(temp, elements) {
@@ -13002,7 +13009,7 @@ class InsertHtml {
13002
13009
  detach(currentNode.nextSibling);
13003
13010
  }
13004
13011
  }
13005
- else if (currentNode.nodeName === '#text' && !isNullOrUndefined(currentNode.parentElement) &&
13012
+ else if ((currentNode.nodeName === '#text' || currentNode.nodeName === "BR") && !isNullOrUndefined(currentNode.parentElement) &&
13006
13013
  (currentNode.parentElement.nodeName === 'LI' || (blockNode === editNode && currentNode.parentElement === blockNode)) &&
13007
13014
  currentNode.parentElement.textContent.trim().length > 0) {
13008
13015
  splitedElm = currentNode;
@@ -15622,14 +15629,17 @@ class SelectionCommands {
15622
15629
  isSubSup = formatNode === null ? false : true;
15623
15630
  }
15624
15631
  }
15632
+ else if ((format === 'fontsize' || format === 'fontname' || format === 'fontcolor' || format === 'backgroundcolor') && range.startContainer.parentElement === endNode) {
15633
+ formatNode = null;
15634
+ }
15625
15635
  if (index === 0 && formatNode === null) {
15626
15636
  isFormat = true;
15627
15637
  }
15628
15638
  if (formatNode !== null && (!isFormat || isFontStyle)) {
15629
15639
  nodes[index] = this.removeFormat(nodes, index, formatNode, isCursor, isFormat, isFontStyle, range, nodeCutter, format, value, domSelection, endNode, domNode);
15630
15640
  }
15631
- else {
15632
- nodes[index] = this.insertFormat(docElement, nodes, index, formatNode, isCursor, isFormat, isFontStyle, range, nodeCutter, format, value);
15641
+ else if (range.startContainer.parentElement !== endNode || (range.commonAncestorContainer === endNode || nodes.length === 1)) {
15642
+ nodes[index] = this.insertFormat(docElement, nodes, index, formatNode, isCursor, isFormat, isFontStyle, range, nodeCutter, format, value, domNode, endNode);
15633
15643
  }
15634
15644
  domSelection = this.applySelection(nodes, domSelection, nodeCutter, index, isCollapsed);
15635
15645
  }
@@ -15884,10 +15894,24 @@ class SelectionCommands {
15884
15894
  }
15885
15895
  return nodes[index];
15886
15896
  }
15887
- static insertFormat(docElement, nodes, index, formatNode, isCursor, isFormat, isFontStyle, range, nodeCutter, format, value) {
15897
+ static insertFormat(docElement, nodes, index, formatNode, isCursor, isFormat, isFontStyle, range, nodeCutter, format, value, domNode, endNode) {
15898
+ let rootElementNode;
15888
15899
  if (!isCursor) {
15889
15900
  if ((formatNode === null && isFormat) || isFontStyle) {
15890
15901
  if (nodes[index].nodeName !== 'BR') {
15902
+ if (format === 'fontsize' || format === 'fontname' || format === 'fontcolor' || format === 'backgroundcolor') {
15903
+ let rangeNode = nodes[index];
15904
+ while (rangeNode && !domNode.isBlockNode(rangeNode) && rangeNode !== endNode) {
15905
+ if (domNode.isBlockNode(rangeNode.parentElement)) {
15906
+ rootElementNode = rangeNode;
15907
+ }
15908
+ rangeNode = rangeNode.parentElement;
15909
+ }
15910
+ if (rootElementNode && rootElementNode.nodeType !== 3) {
15911
+ nodeCutter.SplitNode(range, rootElementNode, true).cloneNode(true);
15912
+ nodeCutter.SplitNode(range, rootElementNode, false).cloneNode(false);
15913
+ }
15914
+ }
15891
15915
  nodes[index] = nodeCutter.GetSpliceNode(range, nodes[index]);
15892
15916
  nodes[index].textContent = nodeCutter.TrimLineBreak(nodes[index].textContent);
15893
15917
  }
@@ -15897,24 +15921,47 @@ class SelectionCommands {
15897
15921
  }
15898
15922
  else if (!(isFontStyle === true && value === '')) {
15899
15923
  const element = this.GetFormatNode(format, value);
15900
- if (format === 'fontsize' || format === 'fontcolor') {
15901
- let liElement = nodes[index].parentElement;
15902
- let parentElement = nodes[index].parentElement;
15903
- while (!isNullOrUndefined(parentElement) && parentElement.tagName.toLowerCase() !== 'li') {
15904
- parentElement = parentElement.parentElement;
15905
- liElement = parentElement;
15924
+ if (format === 'fontsize' || format === 'fontcolor' || format === 'fontname' || format === 'backgroundcolor') {
15925
+ if (format !== 'fontname' && format !== 'backgroundcolor') {
15926
+ let liElement = nodes[index].parentElement;
15927
+ let parentElement = nodes[index].parentElement;
15928
+ while (!isNullOrUndefined(parentElement) && parentElement.tagName.toLowerCase() !== 'li' && parentElement !== endNode) {
15929
+ parentElement = parentElement.parentElement;
15930
+ liElement = parentElement;
15931
+ }
15932
+ if (!isNullOrUndefined(liElement) && liElement.tagName.toLowerCase() === 'li' &&
15933
+ liElement.textContent.trim() === nodes[index].textContent.trim()) {
15934
+ if (format === 'fontsize') {
15935
+ liElement.style.fontSize = value;
15936
+ }
15937
+ else {
15938
+ liElement.style.color = value;
15939
+ liElement.style.textDecoration = 'inherit';
15940
+ }
15941
+ }
15906
15942
  }
15907
- if (!isNullOrUndefined(liElement) && liElement.tagName.toLowerCase() === 'li' &&
15908
- liElement.textContent.trim() === nodes[index].textContent.trim()) {
15909
- if (format === 'fontsize') {
15910
- liElement.style.fontSize = value;
15943
+ if (rootElementNode && rootElementNode.nodeType !== 3) {
15944
+ const save = new NodeSelection();
15945
+ save.save(range, docElement);
15946
+ domNode.setMarker(save);
15947
+ var cloneNode = rootElementNode.cloneNode(true);
15948
+ element.appendChild(cloneNode);
15949
+ domNode.replaceWith(rootElementNode, element.outerHTML);
15950
+ const currentStartNode = endNode.querySelector('.e-editor-select-start');
15951
+ const currrentEndNode = endNode.querySelector('.e-editor-select-end');
15952
+ if (index === 0) {
15953
+ nodes[index] = currentStartNode ? currentStartNode.lastChild : nodes[index];
15911
15954
  }
15912
- else {
15913
- liElement.style.color = value;
15914
- liElement.style.textDecoration = 'inherit';
15955
+ if (range.startContainer.parentElement === endNode) {
15956
+ if (nodes.length > 1) {
15957
+ nodes[nodes.length - 1] = currrentEndNode ? currrentEndNode.lastChild : nodes[index];
15958
+ }
15915
15959
  }
15960
+ domNode.saveMarker(save, null);
15961
+ }
15962
+ else {
15963
+ nodes[index] = this.applyStyles(nodes, index, element);
15916
15964
  }
15917
- nodes[index] = this.applyStyles(nodes, index, element);
15918
15965
  if (format === 'fontsize') {
15919
15966
  const bg = closest(nodes[index].parentElement, 'span[style*=' + 'background-color' + ']');
15920
15967
  if (!isNullOrUndefined(bg)) {
@@ -21963,7 +22010,6 @@ class Image {
21963
22010
  if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection) &&
21964
22011
  originalEvent.code !== 'KeyK') {
21965
22012
  range = this.parent.formatter.editorManager.nodeSelection.getRange(this.parent.contentModule.getDocument());
21966
- save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
21967
22013
  selectNodeEle = this.parent.formatter.editorManager.nodeSelection.getNodeCollection(range);
21968
22014
  selectParentEle = this.parent.formatter.editorManager.nodeSelection.getParentNodeCollection(range);
21969
22015
  if (!originalEvent.ctrlKey && originalEvent.key && (originalEvent.key.length === 1 || originalEvent.action === 'enter') &&
@@ -21982,6 +22028,8 @@ class Image {
21982
22028
  }
21983
22029
  if (originalEvent.keyCode === 8 || originalEvent.keyCode === 46) {
21984
22030
  if (selectNodeEle && selectNodeEle[0].nodeName === 'IMG' && selectNodeEle.length < 1) {
22031
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection))
22032
+ save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
21985
22033
  originalEvent.preventDefault();
21986
22034
  const event = {
21987
22035
  selectNode: selectNodeEle, selection: save, selectParent: selectParentEle,
@@ -22040,6 +22088,8 @@ class Image {
22040
22088
  }
22041
22089
  break;
22042
22090
  case 'insert-image':
22091
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection))
22092
+ save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
22043
22093
  this.openDialog(true, originalEvent, save, selectNodeEle, selectParentEle);
22044
22094
  originalEvent.preventDefault();
22045
22095
  break;
@@ -23811,7 +23861,6 @@ class Audio {
23811
23861
  if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection) &&
23812
23862
  originalEvent.code !== 'KeyK') {
23813
23863
  range = this.parent.formatter.editorManager.nodeSelection.getRange(this.parent.contentModule.getDocument());
23814
- save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
23815
23864
  selectNodeEle = this.parent.formatter.editorManager.nodeSelection.getNodeCollection(range);
23816
23865
  selectParentEle = this.parent.formatter.editorManager.nodeSelection.getParentNodeCollection(range);
23817
23866
  if (!originalEvent.ctrlKey && originalEvent.key && (originalEvent.key.length === 1 || originalEvent.action === 'enter') &&
@@ -23827,6 +23876,8 @@ class Audio {
23827
23876
  }
23828
23877
  if (originalEvent.keyCode === 8 || originalEvent.keyCode === 46) {
23829
23878
  if (selectNodeEle && this.isAudioElem(selectNodeEle[0]) && selectNodeEle.length < 1) {
23879
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection))
23880
+ save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
23830
23881
  originalEvent.preventDefault();
23831
23882
  const event = {
23832
23883
  selectNode: selectNodeEle, selection: save, selectParent: selectParentEle,
@@ -23875,6 +23926,8 @@ class Audio {
23875
23926
  }
23876
23927
  break;
23877
23928
  case 'insert-audio':
23929
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection))
23930
+ save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
23878
23931
  this.openDialog(true, originalEvent, save, selectNodeEle, selectParentEle);
23879
23932
  originalEvent.preventDefault();
23880
23933
  break;
@@ -25108,7 +25161,6 @@ class Video {
25108
25161
  if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection) &&
25109
25162
  originalEvent.code !== 'KeyK') {
25110
25163
  range = this.parent.formatter.editorManager.nodeSelection.getRange(this.parent.contentModule.getDocument());
25111
- save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
25112
25164
  selectNodeEle = this.parent.formatter.editorManager.nodeSelection.getNodeCollection(range);
25113
25165
  selectParentEle = this.parent.formatter.editorManager.nodeSelection.getParentNodeCollection(range);
25114
25166
  if (!originalEvent.ctrlKey && originalEvent.key && (originalEvent.key.length === 1 || originalEvent.action === 'enter') &&
@@ -25128,6 +25180,8 @@ class Video {
25128
25180
  }
25129
25181
  if (originalEvent.keyCode === 8 || originalEvent.keyCode === 46) {
25130
25182
  if (selectNodeEle && (selectNodeEle[0].nodeName === 'VIDEO' || this.isEmbedVidElem(selectNodeEle[0])) && selectNodeEle.length < 1) {
25183
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection))
25184
+ save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
25131
25185
  originalEvent.preventDefault();
25132
25186
  const event = {
25133
25187
  selectNode: selectNodeEle, selection: save, selectParent: selectParentEle,
@@ -25180,6 +25234,8 @@ class Video {
25180
25234
  }
25181
25235
  break;
25182
25236
  case 'insert-video':
25237
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection))
25238
+ save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
25183
25239
  this.openDialog(true, originalEvent, save, selectNodeEle, selectParentEle);
25184
25240
  originalEvent.preventDefault();
25185
25241
  break;
@@ -26363,14 +26419,15 @@ class Table {
26363
26419
  }
26364
26420
  if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection) && this.contentModule
26365
26421
  && event.code !== 'KeyK') {
26422
+ let selection;
26366
26423
  const range = this.parent.formatter.editorManager.nodeSelection.getRange(this.parent.contentModule.getDocument());
26367
- const selection = this.parent.formatter.editorManager.
26368
- nodeSelection.save(range, this.contentModule.getDocument());
26369
26424
  let ele = this.parent.formatter.editorManager.nodeSelection.getParentNodeCollection(range)[0];
26370
26425
  ele = (ele && ele.tagName !== 'TD' && ele.tagName !== 'TH') ? ele.parentElement : ele;
26371
26426
  if ((event.keyCode === 8 || event.keyCode === 46) ||
26372
26427
  (event.ctrlKey && event.keyCode === 88)) {
26373
26428
  if (ele && ele.tagName === 'TBODY') {
26429
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection) && this.contentModule)
26430
+ selection = this.parent.formatter.editorManager.nodeSelection.save(range, this.contentModule.getDocument());
26374
26431
  event.preventDefault();
26375
26432
  proxy.removeTable(selection, event, true);
26376
26433
  }
@@ -26384,6 +26441,8 @@ class Table {
26384
26441
  ele = !isNullOrUndefined(closestTd) && this.parent.inputElement.contains(closestTd) ? closestTd : ele;
26385
26442
  }
26386
26443
  if (ele && (ele.tagName === 'TD' || ele.tagName === 'TH')) {
26444
+ if (!isNullOrUndefined(this.parent.formatter.editorManager.nodeSelection) && this.contentModule)
26445
+ selection = this.parent.formatter.editorManager.nodeSelection.save(range, this.contentModule.getDocument());
26387
26446
  switch (event.keyCode) {
26388
26447
  case 9:
26389
26448
  case 37:
@@ -29687,6 +29746,10 @@ let RichTextEditor = class RichTextEditor extends Component {
29687
29746
  if (this.isDestroyed || !this.isRendered) {
29688
29747
  return;
29689
29748
  }
29749
+ if (!isNullOrUndefined(this.timeInterval)) {
29750
+ clearInterval(this.timeInterval);
29751
+ this.timeInterval = null;
29752
+ }
29690
29753
  if (this.element.offsetParent === null) {
29691
29754
  if (!isNullOrUndefined(this.toolbarModule)) {
29692
29755
  this.toolbarModule.destroy();
@@ -29696,10 +29759,6 @@ let RichTextEditor = class RichTextEditor extends Component {
29696
29759
  }
29697
29760
  this.notify(destroy, {});
29698
29761
  this.destroyDependentModules();
29699
- if (!isNullOrUndefined(this.timeInterval)) {
29700
- clearInterval(this.timeInterval);
29701
- this.timeInterval = null;
29702
- }
29703
29762
  this.unWireEvents();
29704
29763
  if (this.originalElement.tagName === 'TEXTAREA') {
29705
29764
  this.element.parentElement.insertBefore(this.valueContainer, this.element);