@syncfusion/ej2-richtexteditor 26.2.5 → 26.2.8

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 (29) hide show
  1. package/dist/ej2-richtexteditor.min.js +2 -2
  2. package/dist/ej2-richtexteditor.umd.min.js +2 -2
  3. package/dist/ej2-richtexteditor.umd.min.js.map +1 -1
  4. package/dist/es6/ej2-richtexteditor.es2015.js +70 -21
  5. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  6. package/dist/es6/ej2-richtexteditor.es5.js +70 -22
  7. package/dist/es6/ej2-richtexteditor.es5.js.map +1 -1
  8. package/dist/global/ej2-richtexteditor.min.js +2 -2
  9. package/dist/global/ej2-richtexteditor.min.js.map +1 -1
  10. package/dist/global/index.d.ts +1 -1
  11. package/package.json +9 -9
  12. package/src/editor-manager/plugin/inserthtml.d.ts +1 -0
  13. package/src/editor-manager/plugin/inserthtml.js +25 -12
  14. package/src/editor-manager/plugin/lists.d.ts +1 -0
  15. package/src/editor-manager/plugin/lists.js +18 -4
  16. package/src/rich-text-editor/actions/base-quick-toolbar.js +0 -1
  17. package/src/rich-text-editor/actions/html-editor.js +7 -0
  18. package/src/rich-text-editor/base/rich-text-editor.js +4 -4
  19. package/src/rich-text-editor/renderer/audio-module.js +1 -0
  20. package/src/rich-text-editor/renderer/image-module.js +1 -0
  21. package/src/rich-text-editor/renderer/toolbar-renderer.d.ts +2 -0
  22. package/src/rich-text-editor/renderer/toolbar-renderer.js +14 -2
  23. package/src/rich-text-editor/renderer/video-module.js +1 -0
  24. package/styles/fluent2.css +5 -1033
  25. package/styles/material3-dark.css +1 -54
  26. package/styles/material3.css +3 -110
  27. package/styles/rich-text-editor/fluent2.css +5 -1033
  28. package/styles/rich-text-editor/material3-dark.css +1 -54
  29. package/styles/rich-text-editor/material3.css +3 -110
@@ -5428,11 +5428,11 @@ class ToolbarRenderer {
5428
5428
  if (this.parent.showTooltip && args.type === 'toolbar') {
5429
5429
  this.tooltip = new Tooltip({
5430
5430
  target: '#' + this.parent.getID() + '_toolbar_wrapper [title]',
5431
- container: this.toolbarPanel,
5432
5431
  showTipPointer: true,
5433
5432
  openDelay: 400,
5434
5433
  opensOn: 'Hover',
5435
5434
  beforeRender: this.tooltipBeforeRender.bind(this),
5435
+ beforeOpen: this.tooltipBeforeOpen.bind(this),
5436
5436
  cssClass: this.parent.getCssClass(),
5437
5437
  windowCollision: true,
5438
5438
  position: 'BottomCenter'
@@ -5440,6 +5440,11 @@ class ToolbarRenderer {
5440
5440
  this.tooltip.appendTo(args.target.parentElement);
5441
5441
  }
5442
5442
  }
5443
+ tooltipBeforeOpen(args) {
5444
+ if (args.element) {
5445
+ args.element.setAttribute('data-rte-id', this.parent.getID());
5446
+ }
5447
+ }
5443
5448
  /**
5444
5449
  * renderDropDownButton method
5445
5450
  *
@@ -5981,6 +5986,13 @@ class ToolbarRenderer {
5981
5986
  }
5982
5987
  if (this.tooltip && !this.tooltip.isDestroyed) {
5983
5988
  this.tooltip.destroy();
5989
+ const tooltipElements = document.querySelectorAll('[data-rte-id="' + this.parent.getID() + '"]');
5990
+ for (let i = 0; i < tooltipElements.length; i++) {
5991
+ const tooltipEle = tooltipElements[i];
5992
+ if (this.parent.getID() === tooltipEle.getAttribute('data-rte-id')) {
5993
+ detach(tooltipEle);
5994
+ }
5995
+ }
5984
5996
  }
5985
5997
  this.unWireEvent();
5986
5998
  this.mode = null;
@@ -6797,6 +6809,7 @@ class Image$1 {
6797
6809
  if (this.parent.insertImageSettings.resize) {
6798
6810
  EventHandler.remove(this.parent.contentModule.getEditPanel(), Browser.touchStartEvent, this.resizeStart);
6799
6811
  this.parent.element.ownerDocument.removeEventListener('mousedown', this.docClick, true);
6812
+ this.docClick = null;
6800
6813
  EventHandler.remove(this.contentModule.getEditPanel(), 'cut', this.onCutHandler);
6801
6814
  EventHandler.remove(this.contentModule.getDocument(), Browser.touchMoveEvent, this.resizing);
6802
6815
  }
@@ -9145,6 +9158,7 @@ class Audio {
9145
9158
  EventHandler.remove(this.parent.contentModule.getEditPanel(), Browser.touchStartEvent, this.touchStart);
9146
9159
  EventHandler.remove(this.contentModule.getEditPanel(), Browser.touchEndEvent, this.audioClick);
9147
9160
  this.parent.element.ownerDocument.removeEventListener('mousedown', this.docClick, true);
9161
+ this.docClick = null;
9148
9162
  }
9149
9163
  }
9150
9164
  afterRender() {
@@ -10042,6 +10056,7 @@ class Video {
10042
10056
  if (this.parent.insertVideoSettings.resize) {
10043
10057
  EventHandler.remove(this.parent.contentModule.getEditPanel(), Browser.touchStartEvent, this.resizeStart);
10044
10058
  this.parent.element.ownerDocument.removeEventListener('mousedown', this.docClick, true);
10059
+ this.docClick = null;
10045
10060
  EventHandler.remove(this.contentModule.getEditPanel(), 'cut', this.onCutHandler);
10046
10061
  EventHandler.remove(this.contentModule.getDocument(), Browser.touchMoveEvent, this.resizing);
10047
10062
  }
@@ -16647,7 +16662,6 @@ class BaseQuickToolbar {
16647
16662
  this.tooltip = new Tooltip({
16648
16663
  target: '#' + this.element.id + ' [title]',
16649
16664
  openDelay: 400,
16650
- container: this.parent.rootContainer,
16651
16665
  showTipPointer: true,
16652
16666
  beforeRender: this.tooltipBeforeRender.bind(this),
16653
16667
  windowCollision: true,
@@ -21930,13 +21944,15 @@ class Lists {
21930
21944
  const commonAncestor = range.commonAncestorContainer;
21931
21945
  const startEle = range.startContainer;
21932
21946
  const endEle = range.endContainer;
21933
- const startNode = startEle.nodeType === 3 ? startEle.parentElement : startEle;
21934
- const endNode = endEle.nodeType === 3 ? endEle.parentElement : endEle;
21947
+ const startNode = startEle.nodeType === 3 ? this.domNode.blockParentNode(startEle) : startEle;
21948
+ const endNode = endEle.nodeType === 3 ? this.domNode.blockParentNode(endEle) : endEle;
21935
21949
  if ((commonAncestor.nodeName === 'UL' || commonAncestor.nodeName === 'OL') && startNode !== endNode
21936
21950
  && (!isNullOrUndefined(closest(startNode, 'ul')) || !isNullOrUndefined(closest(startNode, 'ol')))
21937
21951
  && (!isNullOrUndefined(closest(endNode, 'ul')) || !isNullOrUndefined(closest(endNode, 'ol')))
21938
- && (commonAncestor.lastElementChild === closest(endNode, 'li')) && !range.collapsed) {
21939
- detach(commonAncestor);
21952
+ && ((commonAncestor.lastElementChild === closest(endNode, 'li') && commonAncestor.lastChild !== endNode)) && !range.collapsed) {
21953
+ if (this.areAllListItemsSelected(commonAncestor, range)) {
21954
+ detach(commonAncestor);
21955
+ }
21940
21956
  }
21941
21957
  this.removeList(range, e);
21942
21958
  }
@@ -22607,6 +22623,18 @@ class Lists {
22607
22623
  this.domNode = null;
22608
22624
  }
22609
22625
  }
22626
+ areAllListItemsSelected(list, range) {
22627
+ const listItems = list.querySelectorAll('li');
22628
+ for (let i = 0; i < listItems.length; i++) {
22629
+ const listItem = listItems[i];
22630
+ const listItemRange = this.parent.currentDocument.createRange();
22631
+ listItemRange.selectNodeContents(listItem);
22632
+ if (!range.intersectsNode(listItem)) {
22633
+ return false;
22634
+ }
22635
+ }
22636
+ return true;
22637
+ }
22610
22638
  }
22611
22639
 
22612
22640
  /**
@@ -23679,6 +23707,9 @@ class InsertHtml {
23679
23707
  const rangeElement = closest(nearestAnchor, 'span');
23680
23708
  rangeElement.appendChild(tempSpan);
23681
23709
  }
23710
+ else if (nodes[0].nodeName === '#text' && nodes[0].nodeValue.includes('\u200B') && !isNullOrUndefined(nodes[0].parentElement) && !isNullOrUndefined(nodes[0].parentElement.previousElementSibling) && nodes[0].parentElement.previousElementSibling.classList.contains('e-mention-chip')) {
23711
+ range.startContainer.parentElement.insertAdjacentElement('afterend', tempSpan);
23712
+ }
23682
23713
  else {
23683
23714
  range.insertNode(tempSpan);
23684
23715
  }
@@ -23767,17 +23798,7 @@ class InsertHtml {
23767
23798
  else {
23768
23799
  this.cursorPos(lastSelectionNode, node, nodeSelection, docElement, editNode, enterAction);
23769
23800
  }
23770
- const spanAligns = editNode.querySelectorAll('span[style*="text-align"]');
23771
- if (spanAligns.length > 0) {
23772
- spanAligns.forEach((spanAlign) => {
23773
- if (!isNullOrUndefined(spanAlign)) {
23774
- const blockAlign = this.getImmediateBlockNode(spanAlign, null);
23775
- if (blockAlign && blockAlign.textContent.trim() === spanAlign.textContent.trim()) {
23776
- blockAlign.style.textAlign = spanAlign.style.textAlign;
23777
- }
23778
- }
23779
- });
23780
- }
23801
+ this.alignCheck(editNode);
23781
23802
  }
23782
23803
  static placeCursorEnd(lastSelectionNode, node, nodeSelection, docElement, editNode) {
23783
23804
  lastSelectionNode = lastSelectionNode.nodeName === 'BR' ? (isNullOrUndefined(lastSelectionNode.previousSibling) ? lastSelectionNode.parentNode
@@ -24017,6 +24038,27 @@ class InsertHtml {
24017
24038
  }
24018
24039
  insertNode.classList.add('ignore-table');
24019
24040
  }
24041
+ static alignCheck(editNode) {
24042
+ const spanAligns = editNode.querySelectorAll('span[style*="text-align"]');
24043
+ for (let i = 0; i < spanAligns.length; i++) {
24044
+ const spanAlign = spanAligns[i];
24045
+ if (spanAlign) {
24046
+ const blockAlign = this.getImmediateBlockNode(spanAlign, null);
24047
+ if (blockAlign) {
24048
+ let totalSpanText = '';
24049
+ for (let j = 0; j < spanAligns.length; j++) {
24050
+ const span = spanAligns[j];
24051
+ if (blockAlign.contains(span)) {
24052
+ totalSpanText += span.textContent;
24053
+ }
24054
+ }
24055
+ if (blockAlign.textContent.trim() === totalSpanText.trim()) {
24056
+ blockAlign.style.textAlign = spanAlign.style.textAlign;
24057
+ }
24058
+ }
24059
+ }
24060
+ }
24061
+ }
24020
24062
  }
24021
24063
  /**
24022
24064
  * Insert method
@@ -30795,6 +30837,13 @@ class HtmlEditor {
30795
30837
  let isRootParent = false;
30796
30838
  if (restrictKeys.indexOf(args.keyCode) < 0 && !args.shiftKey && !args.ctrlKey && !args.altKey && !isEmptyNode) {
30797
30839
  pointer = range.startOffset;
30840
+ const container = range.startContainer;
30841
+ // Check if the container is a text node and contains a zero-width space
30842
+ if (container.nodeType === Node.TEXT_NODE && container.nodeValue.includes("\u200B")) {
30843
+ const beforeZeroWidthSpace = container.splitText(container.nodeValue.indexOf("\u200B"));
30844
+ beforeZeroWidthSpace.splitText(1); // The zero-width space is at the beginning of this node
30845
+ beforeZeroWidthSpace.parentNode.removeChild(beforeZeroWidthSpace);
30846
+ }
30798
30847
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
30799
30848
  range.startContainer.nodeName === '#text' ? range.startContainer.parentElement !== this.parent.inputElement ? range.startContainer.parentElement.classList.add('currentStartMark')
30800
30849
  : isRootParent = true : range.startContainer.classList.add('currentStartMark');
@@ -35964,8 +36013,6 @@ let RichTextEditor = class RichTextEditor extends Component {
35964
36013
  */
35965
36014
  preRender() {
35966
36015
  this.initializeValue();
35967
- this.onBlurHandler = this.blurHandler.bind(this);
35968
- this.onFocusHandler = this.focusHandler.bind(this);
35969
36016
  this.clickPoints = { clientX: 0, clientY: 0 };
35970
36017
  this.initialValue = this.value;
35971
36018
  this.serviceLocator = new ServiceLocator;
@@ -36604,7 +36651,7 @@ let RichTextEditor = class RichTextEditor extends Component {
36604
36651
  this.inputElement.innerHTML = this.enterKey !== 'BR' ? '<' + this.enterKey + '><br></' + this.enterKey + '>' : '<br>';
36605
36652
  this.isSelectAll = false;
36606
36653
  }
36607
- if (selection.rangeCount > 0) {
36654
+ if (selection.rangeCount > 0 && this.contentModule.getDocument().activeElement.tagName !== 'INPUT' && this.inputElement.contains(this.contentModule.getDocument().activeElement)) {
36608
36655
  selection.removeAllRanges();
36609
36656
  selection.addRange(currentRange);
36610
36657
  }
@@ -38208,6 +38255,9 @@ let RichTextEditor = class RichTextEditor extends Component {
38208
38255
  }
38209
38256
  }
38210
38257
  wireEvents() {
38258
+ this.onResizeHandler = this.resizeHandler.bind(this);
38259
+ this.onBlurHandler = this.blurHandler.bind(this);
38260
+ this.onFocusHandler = this.focusHandler.bind(this);
38211
38261
  this.element.addEventListener('focusin', this.onFocusHandler, true);
38212
38262
  this.element.addEventListener('focusout', this.onBlurHandler, true);
38213
38263
  this.on(contentChanged, this.contentChanged, this);
@@ -38263,7 +38313,6 @@ let RichTextEditor = class RichTextEditor extends Component {
38263
38313
  EventHandler.add(this.inputElement, 'input', this.inputHandler, this);
38264
38314
  this.wireContextEvent();
38265
38315
  this.formatter.editorManager.observer.on(KEY_DOWN_HANDLER, this.editorKeyDown, this);
38266
- this.onResizeHandler = this.resizeHandler.bind(this);
38267
38316
  this.element.ownerDocument.defaultView.addEventListener('resize', this.onResizeHandler, true);
38268
38317
  if (this.iframeSettings.enable) {
38269
38318
  EventHandler.add(this.inputElement, 'focusin', this.focusHandler, this);