@syncfusion/ej2-richtexteditor 22.2.10 → 23.1.36

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 (82) hide show
  1. package/CHANGELOG.md +46 -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 +381 -262
  6. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  7. package/dist/es6/ej2-richtexteditor.es5.js +381 -258
  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 +13 -13
  13. package/src/editor-manager/plugin/dom-node.js +6 -5
  14. package/src/editor-manager/plugin/ms-word-clean-up.d.ts +2 -0
  15. package/src/editor-manager/plugin/ms-word-clean-up.js +68 -11
  16. package/src/editor-manager/plugin/table.js +1 -1
  17. package/src/rich-text-editor/actions/base-quick-toolbar.d.ts +2 -1
  18. package/src/rich-text-editor/actions/base-quick-toolbar.js +10 -6
  19. package/src/rich-text-editor/actions/emoji-picker.js +29 -14
  20. package/src/rich-text-editor/actions/enter-key.js +6 -2
  21. package/src/rich-text-editor/actions/format-painter.js +12 -6
  22. package/src/rich-text-editor/actions/html-editor.js +14 -1
  23. package/src/rich-text-editor/actions/paste-clean-up.d.ts +2 -0
  24. package/src/rich-text-editor/actions/paste-clean-up.js +63 -32
  25. package/src/rich-text-editor/actions/quick-toolbar.js +32 -2
  26. package/src/rich-text-editor/actions/toolbar.js +1 -1
  27. package/src/rich-text-editor/actions/xhtml-validation.js +1 -1
  28. package/src/rich-text-editor/base/classes.d.ts +5 -0
  29. package/src/rich-text-editor/base/classes.js +5 -0
  30. package/src/rich-text-editor/base/constant.d.ts +5 -0
  31. package/src/rich-text-editor/base/constant.js +5 -0
  32. package/src/rich-text-editor/base/enum.d.ts +4 -0
  33. package/src/rich-text-editor/base/interface.d.ts +10 -22
  34. package/src/rich-text-editor/base/rich-text-editor-model.d.ts +1 -39
  35. package/src/rich-text-editor/base/rich-text-editor.d.ts +1 -39
  36. package/src/rich-text-editor/base/rich-text-editor.js +2 -8
  37. package/src/rich-text-editor/base/util.js +5 -1
  38. package/src/rich-text-editor/models/items.js +34 -22
  39. package/src/rich-text-editor/models/toolbar-settings-model.d.ts +4 -5
  40. package/src/rich-text-editor/models/toolbar-settings.d.ts +4 -5
  41. package/src/rich-text-editor/models/toolbar-settings.js +1 -1
  42. package/src/rich-text-editor/renderer/audio-module.js +5 -33
  43. package/src/rich-text-editor/renderer/dialog-renderer.d.ts +2 -0
  44. package/src/rich-text-editor/renderer/dialog-renderer.js +16 -1
  45. package/src/rich-text-editor/renderer/image-module.js +9 -65
  46. package/src/rich-text-editor/renderer/link-module.js +3 -0
  47. package/src/rich-text-editor/renderer/table-module.js +18 -7
  48. package/src/rich-text-editor/renderer/toolbar-renderer.d.ts +5 -1
  49. package/src/rich-text-editor/renderer/toolbar-renderer.js +28 -2
  50. package/src/rich-text-editor/renderer/video-module.js +6 -33
  51. package/src/rich-text-editor/renderer/view-source.js +1 -0
  52. package/styles/material-dark.css +0 -1
  53. package/styles/material.css +0 -1
  54. package/styles/material3-dark.css +0 -1
  55. package/styles/material3-dark.scss +1 -1
  56. package/styles/material3.css +0 -1
  57. package/styles/material3.scss +1 -1
  58. package/styles/rich-text-editor/bootstrap-dark.scss +1 -1
  59. package/styles/rich-text-editor/bootstrap.scss +1 -1
  60. package/styles/rich-text-editor/bootstrap4.scss +1 -1
  61. package/styles/rich-text-editor/bootstrap5-dark.scss +1 -1
  62. package/styles/rich-text-editor/bootstrap5.scss +1 -1
  63. package/styles/rich-text-editor/fabric-dark.scss +1 -1
  64. package/styles/rich-text-editor/fabric.scss +1 -1
  65. package/styles/rich-text-editor/fluent-dark.scss +1 -1
  66. package/styles/rich-text-editor/fluent.scss +1 -1
  67. package/styles/rich-text-editor/highcontrast-light.scss +1 -1
  68. package/styles/rich-text-editor/highcontrast.scss +1 -1
  69. package/styles/rich-text-editor/material-dark.css +0 -1
  70. package/styles/rich-text-editor/material-dark.scss +1 -1
  71. package/styles/rich-text-editor/material.css +0 -1
  72. package/styles/rich-text-editor/material.scss +1 -1
  73. package/styles/rich-text-editor/material3-dark.css +0 -1
  74. package/styles/rich-text-editor/material3-dark.scss +1 -1
  75. package/styles/rich-text-editor/material3.css +0 -1
  76. package/styles/rich-text-editor/material3.scss +1 -1
  77. package/styles/rich-text-editor/tailwind-dark.css +0 -1
  78. package/styles/rich-text-editor/tailwind-dark.scss +1 -1
  79. package/styles/rich-text-editor/tailwind.css +0 -1
  80. package/styles/rich-text-editor/tailwind.scss +1 -1
  81. package/styles/tailwind-dark.css +0 -1
  82. package/styles/tailwind.css +0 -1
@@ -739,6 +739,11 @@ const emojiPicker = 'emojiPicker';
739
739
  * @deprecated
740
740
  */
741
741
  const maximizeMinimizeClick = 'maximizeMinimizeClick';
742
+ /**
743
+ * @hidden
744
+ * @deprecated
745
+ */
746
+ const hidePopup = 'hidePopup';
742
747
  /**
743
748
  * @hidden
744
749
  * @deprecated
@@ -860,6 +865,11 @@ const CLS_QUICK_DROPDOWN = 'e-quick-dropdown';
860
865
  * @deprecated
861
866
  */
862
867
  const CLS_IMAGE_POP = 'e-rte-image-popup';
868
+ /**
869
+ * @hidden
870
+ * @deprecated
871
+ */
872
+ const CLS_TEXT_POP = 'e-rte-text-popup';
863
873
  /**
864
874
  * @hidden
865
875
  * @deprecated
@@ -2177,29 +2187,41 @@ function updateDropDownLocale(self) {
2177
2187
  });
2178
2188
  }
2179
2189
  let windowKeys = {
2180
- 'Insert Link': 'Ctrl + K',
2181
- 'Insert Image': 'Ctrl + Shift + I',
2182
- 'Create Table': 'Ctrl + Shift + E',
2183
- 'Undo': 'Ctrl + Z',
2184
- 'Redo': 'Ctrl + Y',
2185
- 'Copy': 'Ctrl + C',
2186
- 'Cut': 'Ctrl + X',
2187
- 'Paste': 'Ctrl + V',
2188
- 'Bold': 'Ctrl + B',
2189
- 'Italic': 'Ctrl + I',
2190
- 'Underline': 'Ctrl + U',
2191
- 'Strikethrough': 'Ctrl + Shift + S',
2192
- 'Upper Case': 'Ctrl + Shift + U',
2193
- 'Lower Case': 'Ctrl + Shift + L',
2194
- 'Superscript': 'Ctrl + Shift + =',
2195
- 'Subscript': 'Ctrl + =',
2196
- 'Source Code': 'Ctrl + Shift + H',
2197
- 'Maximize': 'Ctrl + Shift + F',
2190
+ 'Insert Link': 'Ctrl+K',
2191
+ 'Insert Image': 'Ctrl+Shift+I',
2192
+ 'Create Table': 'Ctrl+Shift+E',
2193
+ 'Undo': 'Ctrl+Z',
2194
+ 'Redo': 'Ctrl+Y',
2195
+ 'Copy': 'Ctrl+C',
2196
+ 'Cut': 'Ctrl+X',
2197
+ 'Paste': 'Ctrl+V',
2198
+ 'Bold': 'Ctrl+B',
2199
+ 'Italic': 'Ctrl+I',
2200
+ 'Underline': 'Ctrl+U',
2201
+ 'Strikethrough': 'Ctrl+Shift+S',
2202
+ 'Upper Case': 'Ctrl+Shift+U',
2203
+ 'Lower Case': 'Ctrl+Shift+L',
2204
+ 'Superscript': 'Ctrl+Shift+=',
2205
+ 'Subscript': 'Ctrl+=',
2206
+ 'Code View': 'Ctrl+Shift+H',
2207
+ 'Maximize': 'Ctrl+Shift+F',
2198
2208
  'Minimize': 'Esc',
2199
- 'Clear Format': 'Ctrl + Shift + R',
2200
- 'Numbered List': 'Ctrl + Shift + O',
2201
- 'Bulleted List': 'Ctrl + Alt + O',
2202
- 'Format Painter': 'Alt + Shift + C, Alt + Shift + V'
2209
+ 'Clear Format': 'Ctrl+Shift+R',
2210
+ 'Numbered List': 'Ctrl+Shift+O',
2211
+ 'Bulleted List': 'Ctrl+Alt+O',
2212
+ 'Number Format List': 'Ctrl+Shift+O',
2213
+ 'Bullet Format List': 'Ctrl+Alt+O',
2214
+ 'Insert Audio': 'Ctrl+Shift+A',
2215
+ 'Insert Video': 'Ctrl+Shift+V',
2216
+ 'Increase Indent': 'Ctrl+]',
2217
+ 'Decrease Indent': 'Ctrl+[',
2218
+ 'Decrease Fontsize': 'Ctrl+Shift+<',
2219
+ 'Increase Fontsize': 'Ctrl+Shift+>',
2220
+ 'Justify Center': 'Ctrl+E',
2221
+ 'Justify Full': 'Ctrl+J',
2222
+ 'Justify Left': 'Ctrl+L',
2223
+ 'Justify Right': 'Ctrl+R',
2224
+ 'Format Painter': 'Alt+Shift+C, Alt+Shift+V'
2203
2225
  };
2204
2226
  const defaultEmojiIcons = [{
2205
2227
  name: 'Smilies & People', code: '1F600', iconCss: 'e-emoji', icons: [{ code: '1F600', desc: 'Grinning face' },
@@ -2869,7 +2891,7 @@ function setToolbarStatus(e, isPopToolbar, self) {
2869
2891
  }
2870
2892
  }
2871
2893
  else if ((typeof data[`${key}`] === 'string' || data[`${key}`] === null) &&
2872
- getIndex(key, e.parent.toolbarSettings.items) > -1) {
2894
+ getIndex(key, e.parent.toolbarSettings.items) >= -1) {
2873
2895
  const value = ((data[`${key}`]) ? data[`${key}`] : '');
2874
2896
  let result = '';
2875
2897
  switch (key) {
@@ -2934,6 +2956,10 @@ function setToolbarStatus(e, isPopToolbar, self) {
2934
2956
  dropDown.fontSizeDropDown.dataBind();
2935
2957
  break;
2936
2958
  }
2959
+ case 'bulletFormatList':
2960
+ case 'numberFormatList': {
2961
+ removeClass([e.tbElements[j]], [CLS_ACTIVE]);
2962
+ }
2937
2963
  }
2938
2964
  }
2939
2965
  }
@@ -3298,9 +3324,13 @@ class ToolbarRenderer {
3298
3324
  * Constructor for toolbar renderer module
3299
3325
  *
3300
3326
  * @param {IRichTextEditor} parent - specifies the parent element.
3327
+ * @param {ServiceLocator} serviceLocator - specifies the serviceLocator
3301
3328
  */
3302
- constructor(parent) {
3329
+ constructor(parent, serviceLocator) {
3303
3330
  this.parent = parent;
3331
+ if (serviceLocator) {
3332
+ this.l10n = serviceLocator.getService('rteLocale');
3333
+ }
3304
3334
  this.wireEvent();
3305
3335
  }
3306
3336
  wireEvent() {
@@ -3308,7 +3338,11 @@ class ToolbarRenderer {
3308
3338
  this.parent.on(maximizeMinimizeClick, this.destroyTooltip, this);
3309
3339
  }
3310
3340
  destroyTooltip() {
3311
- this.tooltip.close();
3341
+ if (!isNullOrUndefined(document.querySelector('.e-tooltip-wrap')) && !isNullOrUndefined(document.querySelector(' [data-tooltip-id]'))) {
3342
+ const tooltipTargetEle = document.querySelector('#' + (this.parent.element).id + ' [data-tooltip-id]');
3343
+ const event = new MouseEvent('mouseleave', { bubbles: true, cancelable: true });
3344
+ tooltipTargetEle.dispatchEvent(event);
3345
+ }
3312
3346
  }
3313
3347
  unWireEvent() {
3314
3348
  this.parent.off(destroy, this.unWireEvent);
@@ -3344,6 +3378,22 @@ class ToolbarRenderer {
3344
3378
  }
3345
3379
  this.parent.notify(beforeDropDownItemRender, args);
3346
3380
  }
3381
+ tooltipBeforeRender(args) {
3382
+ if (!isNullOrUndefined(args.target.getAttribute('title'))) {
3383
+ const tooltipTarget = args.target.getAttribute('title');
3384
+ let tooltipText;
3385
+ switch (tooltipTarget) {
3386
+ case 'Minimize':
3387
+ tooltipText = this.l10n.getConstant('minimize');
3388
+ args.target.setAttribute('title', tooltipText + ' (Esc)');
3389
+ break;
3390
+ case 'Maximize':
3391
+ tooltipText = this.l10n.getConstant('maximize');
3392
+ args.target.setAttribute('title', tooltipText + ' (Ctrl+Shift+F)');
3393
+ break;
3394
+ }
3395
+ }
3396
+ }
3347
3397
  dropDownOpen(args) {
3348
3398
  if (args.element.parentElement.getAttribute('id').indexOf('TableCell') > -1 && !isNullOrUndefined(args.element.parentElement.querySelector('.e-cell-merge')) &&
3349
3399
  (!isNullOrUndefined(args.element.parentElement.querySelector('.e-cell-horizontal-split')) || !isNullOrUndefined(args.element.parentElement.querySelector('.e-cell-vertical-split')))) {
@@ -3409,6 +3459,8 @@ class ToolbarRenderer {
3409
3459
  target: '#' + this.parent.getID() + '_toolbar_wrapper [title]',
3410
3460
  showTipPointer: true,
3411
3461
  openDelay: 400,
3462
+ opensOn: 'Hover',
3463
+ beforeRender: this.tooltipBeforeRender.bind(this),
3412
3464
  cssClass: this.parent.cssClass,
3413
3465
  windowCollision: true,
3414
3466
  position: 'BottomCenter'
@@ -4754,7 +4806,7 @@ class Toolbar$2 {
4754
4806
  this.renderFactory = this.locator.getService('rendererFactory');
4755
4807
  updateDropDownLocale(this.parent);
4756
4808
  updateDropDownFontFormatLocale(this.parent);
4757
- this.renderFactory.addRenderer(RenderType.Toolbar, new ToolbarRenderer(this.parent));
4809
+ this.renderFactory.addRenderer(RenderType.Toolbar, new ToolbarRenderer(this.parent, this.locator));
4758
4810
  this.toolbarRenderer = this.renderFactory.getRenderer(RenderType.Toolbar);
4759
4811
  this.baseToolbar = new BaseToolbar(this.parent, this.locator);
4760
4812
  this.addEventListener();
@@ -5926,6 +5978,9 @@ class BaseQuickToolbar {
5926
5978
  else if (args.popupType === 'Inline') {
5927
5979
  className = CLS_INLINE_POP;
5928
5980
  }
5981
+ else if (args.popupType === 'Text') {
5982
+ className = CLS_TEXT_POP;
5983
+ }
5929
5984
  else {
5930
5985
  className = '';
5931
5986
  }
@@ -6005,7 +6060,7 @@ class BaseQuickToolbar {
6005
6060
  case 'bottom': {
6006
6061
  let posY;
6007
6062
  if (viewPort === 'document') {
6008
- if (type === 'inline') {
6063
+ if (type === 'inline' || type === 'text') {
6009
6064
  posY = (e.y - e.popHeight - 10);
6010
6065
  }
6011
6066
  else {
@@ -6034,7 +6089,7 @@ class BaseQuickToolbar {
6034
6089
  break;
6035
6090
  }
6036
6091
  case 'right':
6037
- if (type === 'inline') {
6092
+ if (type === 'inline' || type === 'text') {
6038
6093
  x = window.pageXOffset + (e.windowWidth - (e.popWidth + e.bodyRightSpace + 10));
6039
6094
  }
6040
6095
  else {
@@ -6042,7 +6097,7 @@ class BaseQuickToolbar {
6042
6097
  }
6043
6098
  break;
6044
6099
  case 'left':
6045
- if (type === 'inline') {
6100
+ if (type === 'inline' || type === 'text') {
6046
6101
  x = 0;
6047
6102
  }
6048
6103
  else {
@@ -6061,11 +6116,12 @@ class BaseQuickToolbar {
6061
6116
  * @param {number} x - specifies the x value
6062
6117
  * @param {number} y - specifies the y value
6063
6118
  * @param {Element} target - specifies the element
6119
+ * @param {string} type - specifies the type
6064
6120
  * @returns {void}
6065
6121
  * @hidden
6066
6122
  * @deprecated
6067
6123
  */
6068
- showPopup(x, y, target) {
6124
+ showPopup(x, y, target, type) {
6069
6125
  const eventArgs = { popup: this.popupObj, cancel: false, targetElement: target,
6070
6126
  positionX: x, positionY: y };
6071
6127
  this.parent.trigger(beforeQuickToolbarOpen, eventArgs, (beforeQuickToolbarArgs) => {
@@ -6095,7 +6151,7 @@ class BaseQuickToolbar {
6095
6151
  editPanelTop = (cntEle) ? cntEle.scrollTop : 0;
6096
6152
  editPanelHeight = (cntEle) ? cntEle.offsetHeight : 0;
6097
6153
  }
6098
- if (!this.parent.inlineMode.enable && !closest(target, 'table')) {
6154
+ if (!this.parent.inlineMode.enable && !closest(target, 'table') && type !== 'text') {
6099
6155
  this.parent.disableToolbarItem(this.parent.toolbarSettings.items);
6100
6156
  this.parent.enableToolbarItem(['Undo', 'Redo']);
6101
6157
  }
@@ -6148,7 +6204,7 @@ class BaseQuickToolbar {
6148
6204
  if (!this.parent.inlineMode.enable) {
6149
6205
  this.checkCollision(showPopupData, 'parent', '');
6150
6206
  }
6151
- this.checkCollision(showPopupData, 'document', ((this.parent.inlineMode.enable) ? 'inline' : ''));
6207
+ this.checkCollision(showPopupData, 'document', ((this.parent.inlineMode.enable) ? 'inline' : (type === 'text') ? 'text' : ''));
6152
6208
  this.popupObj.element.classList.remove('e-popup-open');
6153
6209
  removeClass([this.element], [CLS_HIDE]);
6154
6210
  this.popupObj.show({ name: 'ZoomIn', duration: (Browser.isIE ? 250 : 400) });
@@ -6475,8 +6531,10 @@ class QuickToolbar {
6475
6531
  }
6476
6532
  this.linkQTBar = this.createQTBar('Link', 'Scrollable', this.parent.quickToolbarSettings.link, RenderType.LinkToolbar);
6477
6533
  this.renderFactory.addRenderer(RenderType.LinkToolbar, this.linkQTBar);
6478
- this.textQTBar = this.createQTBar('Text', 'Scrollable', this.parent.quickToolbarSettings.text, RenderType.TextToolbar);
6479
- this.renderFactory.addRenderer(RenderType.TextToolbar, this.textQTBar);
6534
+ if (!isNullOrUndefined(this.parent.quickToolbarSettings.text) && !this.parent.inlineMode.enable) {
6535
+ this.textQTBar = this.createQTBar('Text', 'MultiRow', this.parent.quickToolbarSettings.text, RenderType.TextToolbar);
6536
+ this.renderFactory.addRenderer(RenderType.TextToolbar, this.textQTBar);
6537
+ }
6480
6538
  this.imageQTBar = this.createQTBar('Image', 'MultiRow', this.parent.quickToolbarSettings.image, RenderType.ImageToolbar);
6481
6539
  this.renderFactory.addRenderer(RenderType.ImageToolbar, this.imageQTBar);
6482
6540
  this.audioQTBar = this.createQTBar('Audio', 'MultiRow', this.parent.quickToolbarSettings.audio, RenderType.AudioToolbar);
@@ -6617,6 +6675,24 @@ class QuickToolbar {
6617
6675
  }
6618
6676
  }
6619
6677
  }
6678
+ if (!isNullOrUndefined(this.textQTBar) && !isNullOrUndefined(this.parent.quickToolbarSettings.text) && !this.parent.inlineMode.enable) {
6679
+ const args = e.args.touches ?
6680
+ e.args.changedTouches[0] : e.args;
6681
+ const target = e.args.target;
6682
+ this.hideQuickToolbars();
6683
+ const parentLeft = this.parent.element.getBoundingClientRect().left;
6684
+ this.offsetX = this.parent.iframeSettings.enable ? this.parent.element.ownerDocument.documentElement.scrollLeft
6685
+ + parentLeft + args.clientX : args.pageX;
6686
+ this.offsetY = pageYOffset(args, this.parent.element, this.parent.iframeSettings.enable);
6687
+ const range = this.parent.getRange();
6688
+ if ((range.endContainer.parentElement.tagName === range.startContainer.parentElement.tagName && (range.startContainer.parentElement.tagName === 'A' && range.endContainer.parentElement.tagName === 'A')) ||
6689
+ (target.tagName === 'IMG') || (target.tagName === 'VIDEO') || (target.tagName === 'AUDIO') || (target.childNodes[0].nodeType === 1 && target.childNodes[0].classList.contains('e-rte-audio')) ||
6690
+ (this.parent.getRange().startOffset === this.parent.getRange().endOffset)) {
6691
+ return;
6692
+ }
6693
+ this.target = target;
6694
+ this.textQTBar.showPopup(this.offsetX, this.offsetY, target, 'text');
6695
+ }
6620
6696
  }
6621
6697
  keyDownHandler() {
6622
6698
  if ((this.parent.inlineMode.enable && (!Browser.isDevice || isIDevice()))
@@ -6629,6 +6705,11 @@ class QuickToolbar {
6629
6705
  && !isNullOrUndefined(select('.' + CLS_INLINE_POP, document))) {
6630
6706
  this.hideInlineQTBar();
6631
6707
  }
6708
+ if (!isNullOrUndefined(this.parent.quickToolbarSettings.text)) {
6709
+ if (this.textQTBar && !hasClass(this.textQTBar.element, 'e-popup-close') && document.body.contains(this.textQTBar.element)) {
6710
+ this.textQTBar.hidePopup();
6711
+ }
6712
+ }
6632
6713
  }
6633
6714
  keyUpHandler(e) {
6634
6715
  if (this.parent.inlineMode.enable && !Browser.isDevice) {
@@ -6786,6 +6867,7 @@ class QuickToolbar {
6786
6867
  this.parent.on(keyDown, this.onKeyDown, this);
6787
6868
  this.parent.on(rtlMode, this.setRtl, this);
6788
6869
  this.parent.on(bindCssClass, this.setCssClass, this);
6870
+ this.parent.on(hidePopup, this.hideQuickToolbars, this);
6789
6871
  }
6790
6872
  onKeyDown(e) {
6791
6873
  const args = e.args;
@@ -6839,6 +6921,9 @@ class QuickToolbar {
6839
6921
  if (this.linkQTBar) {
6840
6922
  this.linkQTBar.quickTBarObj.toolbarObj.setProperties({ enableRtl: args.enableRtl });
6841
6923
  }
6924
+ if (this.textQTBar) {
6925
+ this.textQTBar.quickTBarObj.toolbarObj.setProperties({ enableRtl: args.enableRtl });
6926
+ }
6842
6927
  }
6843
6928
  /**
6844
6929
  * removeEventListener
@@ -6867,6 +6952,7 @@ class QuickToolbar {
6867
6952
  this.parent.off(keyDown, this.onKeyDown);
6868
6953
  this.parent.off(rtlMode, this.setRtl);
6869
6954
  this.parent.off(bindCssClass, this.setCssClass);
6955
+ this.parent.off(hidePopup, this.hideQuickToolbars);
6870
6956
  }
6871
6957
  /**
6872
6958
  * Called internally if any of the property value changed.
@@ -11150,11 +11236,12 @@ class DOMNode {
11150
11236
  let startTextNode;
11151
11237
  let endTextNode;
11152
11238
  if (start.textContent === '' && isNullOrUndefined(end) && action !== 'tab') {
11153
- if (isNullOrUndefined(action) && save.range.startContainer.nodeType === 1 &&
11154
- save.range.startContainer.querySelectorAll('audio,video,image').length === 0) {
11155
- start.innerHTML = '<br>';
11156
- }
11157
- else if (start.childNodes.length === 1 && start.childNodes[0].nodeName === 'BR') {
11239
+ // To Do Apply Heading and Back space press in empty content.
11240
+ // if (isNOU(action) && save.range.startContainer.nodeType === 1 &&
11241
+ // (save.range.startContainer as HTMLElement).querySelectorAll('audio,video,image').length === 0) {
11242
+ // start.innerHTML = '<br>';
11243
+ // }
11244
+ if (start.childNodes.length === 1 && start.childNodes[0].nodeName === 'BR') {
11158
11245
  start.innerHTML = '&#65279;&#65279;<br>';
11159
11246
  }
11160
11247
  else {
@@ -14887,7 +14974,7 @@ class TableCommand {
14887
14974
  calculateStyleValue(value) {
14888
14975
  let styleValue;
14889
14976
  if (typeof (value) === 'string') {
14890
- if (value.indexOf('px') || value.indexOf('%') || value.indexOf('auto')) {
14977
+ if (value.indexOf('px') >= 0 || value.indexOf('%') >= 0 || value.indexOf('auto') >= 0) {
14891
14978
  styleValue = value;
14892
14979
  }
14893
14980
  else {
@@ -17371,6 +17458,7 @@ class MsWordPaste {
17371
17458
  'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω'];
17372
17459
  this.removableElements = ['o:p', 'style'];
17373
17460
  this.listContents = [];
17461
+ this.cropImageDimensions = [];
17374
17462
  this.parent = parent;
17375
17463
  this.addEventListener();
17376
17464
  }
@@ -17420,20 +17508,20 @@ class MsWordPaste {
17420
17508
  }
17421
17509
  }
17422
17510
  }
17423
- e.callBack(elm.innerHTML);
17511
+ e.callBack(elm.innerHTML, this.cropImageDimensions);
17424
17512
  }
17425
17513
  else {
17426
17514
  e.callBack(elm.innerHTML);
17427
17515
  }
17428
17516
  }
17429
17517
  cleanList(elm, listTag) {
17430
- let replacableElem = elm.querySelectorAll(listTag + ' div');
17518
+ const replacableElem = elm.querySelectorAll(listTag + ' div');
17431
17519
  for (let j = replacableElem.length - 1; j >= 0; j--) {
17432
17520
  const parentElem = replacableElem[j].parentNode;
17433
17521
  while (replacableElem[j].firstChild) {
17434
17522
  parentElem.insertBefore(replacableElem[j].firstChild, replacableElem[j]);
17435
17523
  }
17436
- let closestListElem = this.findClosestListElem(replacableElem[j]);
17524
+ const closestListElem = this.findClosestListElem(replacableElem[j]);
17437
17525
  if (closestListElem) {
17438
17526
  this.insertAfter(replacableElem[j], closestListElem);
17439
17527
  }
@@ -17488,7 +17576,8 @@ class MsWordPaste {
17488
17576
  imgElem[i].getAttribute('v:shapes').indexOf('Grafik') < 0 &&
17489
17577
  imgElem[i].getAttribute('v:shapes').toLowerCase().indexOf('image') < 0 &&
17490
17578
  imgElem[i].getAttribute('v:shapes').indexOf('Graphic') < 0 &&
17491
- imgElem[i].getAttribute('v:shapes').indexOf('_x0000_s') < 0) {
17579
+ imgElem[i].getAttribute('v:shapes').indexOf('_x0000_s') < 0 &&
17580
+ imgElem[i].getAttribute('v:shapes').indexOf('_x0000_i') < 0) {
17492
17581
  detach(imgElem[i]);
17493
17582
  }
17494
17583
  }
@@ -17505,14 +17594,36 @@ class MsWordPaste {
17505
17594
  }
17506
17595
  const hexValue = this.hexConversion(rtfData);
17507
17596
  for (let i = 0; i < hexValue.length; i++) {
17508
- base64Src.push(this.convertToBase64(hexValue[i]));
17597
+ base64Src.push({
17598
+ base64Data: !isNullOrUndefined(hexValue[i].hex) ? this.convertToBase64(hexValue[i]) : null,
17599
+ isCroppedImage: hexValue[i].isCroppedImage
17600
+ });
17601
+ if (hexValue[i].isCroppedImage) {
17602
+ this.cropImageDimensions.push({
17603
+ goalWidth: hexValue[i].goalWidth,
17604
+ goalHeight: hexValue[i].goalHeight,
17605
+ cropLength: hexValue[i].cropLength,
17606
+ cropTop: hexValue[i].cropTop,
17607
+ cropR: hexValue[i].cropR,
17608
+ cropB: hexValue[i].cropB
17609
+ });
17610
+ }
17509
17611
  }
17510
17612
  for (let i = 0; i < imgElem.length; i++) {
17511
17613
  if (imgSrc[i].match(linkRegex)) {
17512
17614
  imgElem[i].setAttribute('src', imgSrc[i]);
17513
17615
  }
17514
17616
  else {
17515
- imgElem[i].setAttribute('src', base64Src[i]);
17617
+ if (!isNullOrUndefined(base64Src[i]) && !isNullOrUndefined(base64Src[i].base64Data)) {
17618
+ imgElem[i].setAttribute('src', base64Src[i].base64Data);
17619
+ }
17620
+ else {
17621
+ imgElem[i].removeAttribute('src');
17622
+ imgElem[i].setAttribute('alt', 'Unsupported file format');
17623
+ }
17624
+ if (!isNullOrUndefined(base64Src[i]) && base64Src[i].isCroppedImage) {
17625
+ imgElem[i].classList.add('e-img-cropped');
17626
+ }
17516
17627
  }
17517
17628
  imgElem[i].setAttribute('id', 'msWordImg-' + imgName[i]);
17518
17629
  }
@@ -17589,6 +17700,13 @@ class MsWordPaste {
17589
17700
  const result = [];
17590
17701
  if (!isNullOrUndefined(fullImg)) {
17591
17702
  for (let i = 0; i < fullImg.length; i++) {
17703
+ let isCroppedImage = false;
17704
+ let goalWidth = 0;
17705
+ let goalHeight = 0;
17706
+ let cropLength = 0;
17707
+ let cropTop = 0;
17708
+ let cropR = 0;
17709
+ let cropB = 0;
17592
17710
  if (picHead.test(fullImg[i])) {
17593
17711
  if (fullImg[i].indexOf('\\pngblip') !== -1) {
17594
17712
  imgType = 'image/png';
@@ -17596,20 +17714,45 @@ class MsWordPaste {
17596
17714
  else if (fullImg[i].indexOf('\\jpegblip') !== -1) {
17597
17715
  imgType = 'image/jpeg';
17598
17716
  }
17717
+ else if (fullImg[i].indexOf('\\picprop') !== -1) {
17718
+ imgType = null;
17719
+ }
17599
17720
  else {
17600
17721
  continue;
17601
17722
  }
17723
+ isCroppedImage = this.extractCropValue('cropl', fullImg[i]) > 0 &&
17724
+ this.extractCropValue('cropt', fullImg[i]) > 0 ? true : false;
17725
+ if (isCroppedImage) {
17726
+ goalWidth = this.extractCropValue('wgoal', fullImg[i]);
17727
+ goalHeight = this.extractCropValue('hgoal', fullImg[i]);
17728
+ cropLength = this.extractCropValue('cropl', fullImg[i]);
17729
+ cropTop = this.extractCropValue('cropt', fullImg[i]);
17730
+ cropR = this.extractCropValue('cropr', fullImg[i]);
17731
+ cropB = this.extractCropValue('cropb', fullImg[i]);
17732
+ }
17602
17733
  result.push({
17603
17734
  hex: imgType ? fullImg[i].replace(picHead, '').replace(/[^\da-fA-F]/g, '') : null,
17604
- type: imgType
17735
+ type: imgType,
17736
+ isCroppedImage: isCroppedImage,
17737
+ goalWidth: goalWidth,
17738
+ goalHeight: goalHeight,
17739
+ cropLength: cropLength,
17740
+ cropTop: cropTop,
17741
+ cropR: cropR,
17742
+ cropB: cropB
17605
17743
  });
17606
17744
  }
17607
17745
  }
17608
17746
  }
17609
17747
  return result;
17610
17748
  }
17749
+ extractCropValue(crop, rtfData) {
17750
+ // eslint-disable-next-line security/detect-non-literal-regexp
17751
+ const result = new RegExp('\\\\pic' + crop + '(\\-?\\d+)\\\\').exec(rtfData.replace('\r\n\\', '\\'))[1];
17752
+ return parseInt(result, 10);
17753
+ }
17611
17754
  removeClassName(elm) {
17612
- const elmWithClass = elm.querySelectorAll('*[class]');
17755
+ const elmWithClass = elm.querySelectorAll('*[class]:not(.e-img-cropped)');
17613
17756
  for (let i = 0; i < elmWithClass.length; i++) {
17614
17757
  elmWithClass[i].removeAttribute('class');
17615
17758
  }
@@ -17946,8 +18089,10 @@ class MsWordPaste {
17946
18089
  currentListStyle = listNodes[i].getAttribute('style');
17947
18090
  }
17948
18091
  }
17949
- collection.push({ listType: type, content: tempNode, nestedLevel: level, class: currentClassName,
17950
- listStyle: currentListStyle, listStyleTypeName: listStyleType, start: startAttr, styleMarginLeft: styleMarginLeft });
18092
+ collection.push({
18093
+ listType: type, content: tempNode, nestedLevel: level, class: currentClassName,
18094
+ listStyle: currentListStyle, listStyleTypeName: listStyleType, start: startAttr, styleMarginLeft: styleMarginLeft
18095
+ });
17951
18096
  }
17952
18097
  }
17953
18098
  stNode = listNodes.shift();
@@ -18075,8 +18220,7 @@ class MsWordPaste {
18075
18220
  }
18076
18221
  else {
18077
18222
  if (collection[index].nestedLevel > pLevel && isNormalList) {
18078
- let initialNode;
18079
- initialNode = createElement(collection[index].listType);
18223
+ const initialNode = createElement(collection[index].listType);
18080
18224
  prevList = createElement('li');
18081
18225
  initialNode.appendChild(prevList);
18082
18226
  initialNode.style.listStyleType = 'none';
@@ -18163,11 +18307,11 @@ class MsWordPaste {
18163
18307
  else {
18164
18308
  //Add to support separate list which looks like same list and also to add all tags as it is inside list
18165
18309
  if (firstChild.childNodes.length > 0) {
18166
- let listIgnoreTag = firstChild.querySelectorAll('[style*="mso-list"]');
18310
+ const listIgnoreTag = firstChild.querySelectorAll('[style*="mso-list"]');
18167
18311
  for (let i = 0; i < listIgnoreTag.length; i++) {
18168
- listIgnoreTag[i].setAttribute('style', listIgnoreTag[i].getAttribute('style').replace(/\n/g, ""));
18312
+ listIgnoreTag[i].setAttribute('style', listIgnoreTag[i].getAttribute('style').replace(/\n/g, ''));
18169
18313
  }
18170
- let listOrder = firstChild.querySelector('span[style="mso-list:Ignore"]');
18314
+ const listOrder = firstChild.querySelector('span[style="mso-list:Ignore"]');
18171
18315
  if (!isNullOrUndefined(listOrder)) {
18172
18316
  this.listContents.push(listOrder.textContent.trim());
18173
18317
  detach(listOrder);
@@ -19829,7 +19973,7 @@ class XhtmlValidation {
19829
19973
  */
19830
19974
  selfEncloseValidation(currentValue, valueLength) {
19831
19975
  if (valueLength === 0 && currentValue.indexOf('table') < 0 && currentValue.indexOf('img') < 0 &&
19832
- currentValue !== '<p><br></p>' && currentValue !== '<div><br></div>' && currentValue !== '<br>') {
19976
+ currentValue.includes('&nbsp;')) {
19833
19977
  const arrayValue = currentValue.split('&nbsp;');
19834
19978
  arrayValue[arrayValue.length - 1] = '&#8203;' + arrayValue[arrayValue.length - 1];
19835
19979
  currentValue = arrayValue.join('');
@@ -20070,11 +20214,24 @@ class HtmlEditor {
20070
20214
  const currentLength = this.parent.inputElement.innerHTML.replace(regEx, '').length;
20071
20215
  let focusNode = range.startContainer;
20072
20216
  if (previousLength > currentLength && !isRootParent) {
20217
+ if (focusNode.textContent.trim().length !== 0 && focusNode.previousSibling) {
20218
+ const tempSpan = document.createElement('span');
20219
+ tempSpan.className = 'tempSpan';
20220
+ range.insertNode(tempSpan);
20221
+ }
20073
20222
  let currentChild = this.parent.inputElement.firstChild;
20074
20223
  while (!isNullOrUndefined(currentChild) && currentChild.textContent.replace(regEx, '').trim().length > 0) {
20075
20224
  currentChild.innerHTML = currentChild.innerHTML.replace(regEx, '');
20076
20225
  currentChild = currentChild.nextElementSibling;
20077
20226
  }
20227
+ let tempSpanToRemove = this.parent.inputElement.querySelector('.tempSpan');
20228
+ if (tempSpanToRemove && tempSpanToRemove.previousSibling && focusNode.textContent.trim().length !== 0) {
20229
+ focusNode = tempSpanToRemove.previousSibling;
20230
+ pointer = tempSpanToRemove.previousSibling.textContent.length;
20231
+ const parentElement = tempSpanToRemove.parentNode;
20232
+ parentElement.removeChild(tempSpanToRemove);
20233
+ tempSpanToRemove = null;
20234
+ }
20078
20235
  const currentChildNode = this.parent.inputElement.querySelector('.currentStartMark').childNodes;
20079
20236
  if (currentChildNode.length > 1) {
20080
20237
  for (let i = 0; i < currentChildNode.length; i++) {
@@ -20527,7 +20684,7 @@ class HtmlEditor {
20527
20684
  const item = args.item;
20528
20685
  const closestElement = closest(args.originalEvent.target, '.e-rte-quick-popup');
20529
20686
  if (item.command !== 'FormatPainter') {
20530
- if (closestElement && !closestElement.classList.contains('e-rte-inline-popup')) {
20687
+ if (closestElement && !closestElement.classList.contains('e-rte-inline-popup') && !closestElement.classList.contains('e-rte-text-popup')) {
20531
20688
  if (!(item.subCommand === 'SourceCode' || item.subCommand === 'Preview' ||
20532
20689
  item.subCommand === 'FontColor' || item.subCommand === 'BackgroundColor')) {
20533
20690
  if (isIDevice$1() && item.command === 'Images') {
@@ -20798,6 +20955,7 @@ class PasteCleanup {
20798
20955
  'header', 'article', 'nav', 'footer', 'section', 'aside', 'main', 'figure', 'figcaption'];
20799
20956
  this.isNotFromHtml = false;
20800
20957
  this.containsHtml = false;
20958
+ this.cropImageData = [];
20801
20959
  this.parent = parent;
20802
20960
  this.locator = serviceLocator;
20803
20961
  this.renderFactory = this.locator.getService('rendererFactory');
@@ -20877,8 +21035,9 @@ class PasteCleanup {
20877
21035
  args: e.args,
20878
21036
  text: e.text,
20879
21037
  allowedStylePropertiesArray: this.parent.pasteCleanupSettings.allowedStyleProps,
20880
- callBack: (a) => {
21038
+ callBack: (a, cropImageData) => {
20881
21039
  value = a.trim();
21040
+ this.cropImageData = cropImageData;
20882
21041
  }
20883
21042
  });
20884
21043
  }
@@ -20926,7 +21085,9 @@ class PasteCleanup {
20926
21085
  currentFocusNode = currentFocusNode.childNodes[this.nodeSelectionObj.getRange(this.contentRenderer.getDocument()).startOffset];
20927
21086
  }
20928
21087
  if (currentFocusNode.previousSibling.nodeName === 'IMG') {
20929
- currentFocusNode.previousSibling.classList.add('pasteContent_Img');
21088
+ if (!isNullOrUndefined(currentFocusNode.previousSibling.getAttribute('src'))) {
21089
+ currentFocusNode.previousSibling.classList.add('pasteContent_Img');
21090
+ }
20930
21091
  currentFocusNode.previousSibling.classList.add(CLS_RTE_IMAGE);
20931
21092
  if (this.parent.insertImageSettings.display === 'inline') {
20932
21093
  currentFocusNode.previousSibling.classList.add(CLS_IMGINLINE);
@@ -20958,6 +21119,7 @@ class PasteCleanup {
20958
21119
  makeSpace(enterSplitText) {
20959
21120
  let contentWithSpace = '';
20960
21121
  let spaceBetweenContent = true;
21122
+ enterSplitText = enterSplitText.replace(/\t/g, '&nbsp;&nbsp;&nbsp;&nbsp;');
20961
21123
  const spaceSplit = enterSplitText.split(' ');
20962
21124
  for (let j = 0; j < spaceSplit.length; j++) {
20963
21125
  if (spaceSplit[j].trim() === '') {
@@ -20977,7 +21139,8 @@ class PasteCleanup {
20977
21139
  const imgName = [];
20978
21140
  const uploadImg = [];
20979
21141
  for (let i = 0; i < allImgElm.length; i++) {
20980
- if (allImgElm[i].getAttribute('src').split(',')[0].indexOf('base64') >= 0) {
21142
+ if (!isNullOrUndefined(allImgElm[i].getAttribute('src')) &&
21143
+ allImgElm[i].getAttribute('src').split(',')[0].indexOf('base64') >= 0) {
20981
21144
  base64Src.push(allImgElm[i].getAttribute('src'));
20982
21145
  imgName.push(getUniqueID('rte_image'));
20983
21146
  uploadImg.push(allImgElm[i]);
@@ -21057,8 +21220,6 @@ class PasteCleanup {
21057
21220
  setTimeout(() => {
21058
21221
  this.refreshPopup(imgElem, this.popupObj);
21059
21222
  }, timeOut);
21060
- let rawFile;
21061
- let beforeUploadArgs;
21062
21223
  this.uploadObj = new Uploader({
21063
21224
  asyncSettings: {
21064
21225
  saveUrl: this.parent.insertImageSettings.saveUrl,
@@ -21090,28 +21251,8 @@ class PasteCleanup {
21090
21251
  }
21091
21252
  },
21092
21253
  beforeUpload: (args) => {
21093
- if (this.parent.isServerRendered) {
21094
- beforeUploadArgs = JSON.parse(JSON.stringify(args));
21095
- beforeUploadArgs.filesData = rawFile;
21096
- args.cancel = true;
21097
- this.parent.trigger(imageUploading, beforeUploadArgs, (beforeUploadArgs) => {
21098
- if (beforeUploadArgs.cancel) {
21099
- return;
21100
- }
21101
- this.toolbarEnableDisable(true);
21102
- /* eslint-disable */
21103
- this.uploadObj.currentRequestHeader = beforeUploadArgs.currentRequest ?
21104
- beforeUploadArgs.currentRequest : this.uploadObj.currentRequestHeader;
21105
- this.uploadObj.customFormDatas = beforeUploadArgs.customFormData && beforeUploadArgs.customFormData.length > 0 ?
21106
- beforeUploadArgs.customFormData : this.uploadObj.customFormDatas;
21107
- this.uploadObj.uploadFiles(rawFile, null);
21108
- /* eslint-enable */
21109
- });
21110
- }
21111
- else {
21112
- this.parent.trigger(beforeImageUpload, args);
21113
- this.toolbarEnableDisable(true);
21114
- }
21254
+ this.parent.trigger(beforeImageUpload, args);
21255
+ this.toolbarEnableDisable(true);
21115
21256
  },
21116
21257
  // eslint-disable-next-line
21117
21258
  failure: (e) => {
@@ -21129,9 +21270,6 @@ class PasteCleanup {
21129
21270
  },
21130
21271
  selected: (e) => {
21131
21272
  e.cancel = true;
21132
- if (this.parent.isServerRendered) {
21133
- rawFile = e.filesData;
21134
- }
21135
21273
  },
21136
21274
  removing: () => {
21137
21275
  this.parent.inputElement.contentEditable = 'true';
@@ -21153,8 +21291,6 @@ class PasteCleanup {
21153
21291
  statusCode: '1'
21154
21292
  }];
21155
21293
  this.uploadObj.createFileList(fileData);
21156
- /* eslint-enable */
21157
- rawFile = fileData;
21158
21294
  this.uploadObj.upload(fileData);
21159
21295
  this.popupObj.element.getElementsByClassName('e-file-select-wrap')[0].style.display = 'none';
21160
21296
  detach(this.popupObj.element.querySelector('.e-rte-dialog-upload .e-file-select-wrap'));
@@ -21228,7 +21364,9 @@ class PasteCleanup {
21228
21364
  * @deprecated
21229
21365
  */
21230
21366
  imageFormatting(pasteArgs, imgElement) {
21231
- imgElement.elements[0].classList.add('pasteContent_Img');
21367
+ if (!isNullOrUndefined(imgElement.elements[0].getAttribute('src'))) {
21368
+ imgElement.elements[0].classList.add('pasteContent_Img');
21369
+ }
21232
21370
  const imageElement = this.parent.createElement('span');
21233
21371
  imageElement.appendChild(imgElement.elements[0]);
21234
21372
  const imageValue = imageElement.innerHTML;
@@ -21419,7 +21557,9 @@ class PasteCleanup {
21419
21557
  clipBoardElem.innerHTML = this.sanitizeHelper(clipBoardElem.innerHTML);
21420
21558
  const allImg = clipBoardElem.querySelectorAll('img');
21421
21559
  for (let i = 0; i < allImg.length; i++) {
21422
- allImg[i].classList.add('pasteContent_Img');
21560
+ if (!isNullOrUndefined(allImg[i].getAttribute('src'))) {
21561
+ allImg[i].classList.add('pasteContent_Img');
21562
+ }
21423
21563
  this.setImageProperties(allImg[i]);
21424
21564
  }
21425
21565
  this.addTempClass(clipBoardElem);
@@ -21462,6 +21602,47 @@ class PasteCleanup {
21462
21602
  }, clipBoardElem, null, null, this.parent.enterKey);
21463
21603
  this.removeTempClass();
21464
21604
  this.parent.notify(toolbarRefresh, {});
21605
+ this.cropImageHandler(this.parent.inputElement);
21606
+ }
21607
+ }
21608
+ cropImageHandler(element) {
21609
+ const allImgElm = element.querySelectorAll('.e-img-cropped');
21610
+ if (allImgElm.length > 0) {
21611
+ for (let i = 0; i < allImgElm.length; i++) {
21612
+ if (allImgElm[i].getAttribute('src').split(',')[0].indexOf('base64') >= 0) {
21613
+ const image = new Image();
21614
+ image.src = allImgElm[i].getAttribute('src');
21615
+ const canvas = document.createElement('canvas');
21616
+ const ctx = canvas.getContext('2d');
21617
+ image.onload = () => {
21618
+ const wGoalWidth = this.cropImageData[i].goalWidth / image.naturalWidth;
21619
+ const hGoalHeight = this.cropImageData[i].goalHeight / image.naturalHeight;
21620
+ const cropLength = this.cropImageData[i].cropLength / wGoalWidth;
21621
+ const cropTop = this.cropImageData[i].cropTop / hGoalHeight;
21622
+ const cropWidth = (this.cropImageData[i].goalWidth -
21623
+ this.cropImageData[i].cropLength -
21624
+ this.cropImageData[i].cropR) / wGoalWidth;
21625
+ const cropHeight = (this.cropImageData[i].goalHeight -
21626
+ this.cropImageData[i].cropTop -
21627
+ this.cropImageData[i].cropB) / hGoalHeight;
21628
+ canvas.width = cropWidth;
21629
+ canvas.height = cropHeight;
21630
+ // Draw the cropped portion of the image onto the canvas
21631
+ ctx.drawImage(image, cropLength, cropTop, cropWidth, cropHeight, 0, 0, cropWidth, cropHeight);
21632
+ // Convert the cropped canvas to a base64 encoded image
21633
+ const croppedBase64 = canvas.toDataURL('image/png');
21634
+ // Call the provided callback with the cropped base64 data
21635
+ allImgElm[i].setAttribute('src', croppedBase64);
21636
+ allImgElm[i].classList.remove('e-img-cropped');
21637
+ this.imgUploading(this.parent.inputElement);
21638
+ if (this.parent.iframeSettings.enable) {
21639
+ this.parent.updateValue();
21640
+ }
21641
+ };
21642
+ }
21643
+ }
21644
+ }
21645
+ else {
21465
21646
  this.imgUploading(this.parent.inputElement);
21466
21647
  if (this.parent.iframeSettings.enable) {
21467
21648
  this.parent.updateValue();
@@ -22403,6 +22584,10 @@ class FormatPainter {
22403
22584
  clickargs.args.action = 'escape';
22404
22585
  this.actionHandler(clickargs, 'keyBoard');
22405
22586
  }
22587
+ if (this.parent.quickToolbarModule && !isNullOrUndefined(this.parent.quickToolbarSettings.text) &&
22588
+ this.parent.element.ownerDocument.contains(this.parent.quickToolbarModule.textQTBar.element)) {
22589
+ this.parent.quickToolbarModule.textQTBar.hidePopup();
22590
+ }
22406
22591
  }
22407
22592
  toolbarDoubleClick(args) {
22408
22593
  this.isActive = true;
@@ -22481,12 +22666,14 @@ class FormatPainter {
22481
22666
  }
22482
22667
  }
22483
22668
  updateToolbarBtn(enable) {
22484
- const toolbarBtn = this.parent.element.querySelector('.e-rte-format-painter').parentElement.parentElement;
22485
- if (enable) {
22486
- addClass([toolbarBtn], 'e-active');
22487
- }
22488
- else if (!this.isSticky) {
22489
- removeClass([toolbarBtn], 'e-active');
22669
+ if (!isNullOrUndefined(this.parent.element.querySelector('.e-rte-format-painter'))) {
22670
+ const toolbarBtn = this.parent.element.querySelector('.e-rte-format-painter').parentElement.parentElement;
22671
+ if (enable) {
22672
+ addClass([toolbarBtn], 'e-active');
22673
+ }
22674
+ else if (!this.isSticky) {
22675
+ removeClass([toolbarBtn], 'e-active');
22676
+ }
22490
22677
  }
22491
22678
  }
22492
22679
  editAreaClick(args) {
@@ -22556,7 +22743,13 @@ class EmojiPicker {
22556
22743
  }
22557
22744
  // eslint-disable-next-line
22558
22745
  toolbarClick(args) {
22559
- const spanElement = this.parent.element.querySelector('.e-emoji');
22746
+ let spanElement;
22747
+ if (!isNullOrUndefined(this.parent.element.querySelector('.e-emoji'))) {
22748
+ spanElement = this.parent.element.querySelector('.e-emoji');
22749
+ }
22750
+ else if (this.parent.inlineMode.enable) {
22751
+ spanElement = this.parent.element.ownerDocument.querySelector('.e-emoji');
22752
+ }
22560
22753
  this.divElement = spanElement.closest('div');
22561
22754
  const range = this.parent.formatter.editorManager.nodeSelection.getRange(this.parent.contentModule.getDocument());
22562
22755
  this.save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument());
@@ -22571,7 +22764,12 @@ class EmojiPicker {
22571
22764
  this.popupObj.hide();
22572
22765
  }
22573
22766
  this.popDiv = this.parent.createElement('div', { className: 'e-rte-emojipicker-popup', id: this.parent.getID() + '_emojiPicker' });
22574
- this.parent.getToolbar().appendChild(this.popDiv);
22767
+ if (!isNullOrUndefined(this.parent.getToolbar()) && !this.parent.inlineMode.enable) {
22768
+ this.parent.getToolbar().appendChild(this.popDiv);
22769
+ }
22770
+ else if (this.parent.inlineMode.enable) {
22771
+ this.parent.inputElement.appendChild(this.popDiv);
22772
+ }
22575
22773
  EventHandler.add(this.popDiv, 'keydown', this.onKeyDown, this);
22576
22774
  EventHandler.add(this.popDiv, 'keyup', this.searchFilter, this);
22577
22775
  const extendEle = this.parent.element.querySelector('.e-toolbar-extended');
@@ -22586,13 +22784,14 @@ class EmojiPicker {
22586
22784
  let target;
22587
22785
  let xValue;
22588
22786
  let yValue;
22589
- if (!isNullOrUndefined(args.args)) {
22787
+ if (!isNullOrUndefined(args.args) && !this.parent.inlineMode.enable &&
22788
+ isNullOrUndefined(this.parent.quickToolbarSettings.text)) {
22590
22789
  target = args.args.originalEvent.target;
22591
22790
  target = target.classList.contains('e-toolbar-item') ? target.firstChild : target.parentElement;
22592
22791
  xValue = 'left';
22593
22792
  yValue = 'bottom';
22594
22793
  }
22595
- else if (isNullOrUndefined(args.x) && isNullOrUndefined(args.y)) {
22794
+ else if (isNullOrUndefined(args.x) && isNullOrUndefined(args.y) && !this.parent.inlineMode.enable && isNullOrUndefined(this.parent.quickToolbarSettings.text)) {
22596
22795
  target = this.parent.inputElement;
22597
22796
  if (window.getSelection().rangeCount > 0) {
22598
22797
  const coordinates = this.getCoordinates();
@@ -22600,6 +22799,14 @@ class EmojiPicker {
22600
22799
  yValue = coordinates.top;
22601
22800
  }
22602
22801
  }
22802
+ else if (isNullOrUndefined(args.x) && isNullOrUndefined(args.y) && (this.parent.inlineMode.enable || !isNullOrUndefined(this.parent.quickToolbarSettings.text))) {
22803
+ this.parent.notify(hidePopup, {});
22804
+ if (window.getSelection().rangeCount > 0) {
22805
+ const coordinates = this.getCoordinates();
22806
+ xValue = coordinates.left;
22807
+ yValue = coordinates.top;
22808
+ }
22809
+ }
22603
22810
  else {
22604
22811
  target = this.parent.inputElement;
22605
22812
  xValue = args.x;
@@ -22626,7 +22833,8 @@ class EmojiPicker {
22626
22833
  addClass([this.popupObj.element], 'e-popup-open');
22627
22834
  this.popupObj.refreshPosition(target);
22628
22835
  // header search element
22629
- if ((!isNullOrUndefined(args.args) || (isNullOrUndefined(args.x) && isNullOrUndefined(args.y))) && this.parent.emojiPickerSettings.showSearchBox) {
22836
+ if ((!isNullOrUndefined(args.args) || (isNullOrUndefined(args.x) && isNullOrUndefined(args.y))) &&
22837
+ this.parent.emojiPickerSettings.showSearchBox) {
22630
22838
  const inputEle = createElement('input', { id: 'e-rte-emoji-search', className: 'e-rte-emoji-search' });
22631
22839
  this.popDiv.append(inputEle);
22632
22840
  const inputobj = new TextBox({
@@ -22662,7 +22870,8 @@ class EmojiPicker {
22662
22870
  this.popDiv.appendChild(emojiBtnDiv);
22663
22871
  let height;
22664
22872
  const popupBorder = window.getComputedStyle(this.popDiv);
22665
- if ((isNullOrUndefined(args.args) && !(isNullOrUndefined(args.x) && isNullOrUndefined(args.y))) || !this.parent.emojiPickerSettings.showSearchBox) {
22873
+ if ((isNullOrUndefined(args.args) && !(isNullOrUndefined(args.x) && isNullOrUndefined(args.y))) ||
22874
+ !this.parent.emojiPickerSettings.showSearchBox) {
22666
22875
  height = (this.popDiv.getBoundingClientRect().height - emojiToolBar.getBoundingClientRect().height - (2 * parseFloat(popupBorder.borderWidth))) + 'px';
22667
22876
  emojiBtnDiv.style.setProperty('height', height, 'important');
22668
22877
  }
@@ -22708,13 +22917,6 @@ class EmojiPicker {
22708
22917
  if (!isNullOrUndefined(popup)) {
22709
22918
  scrollTop = Math.round(popup.scrollTop);
22710
22919
  }
22711
- for (let i = 0; i < toolbarName.length; i++) {
22712
- /* eslint-disable */
22713
- if (toolbarName[i].classList.contains('e-selected')) {
22714
- removeClass([toolbarName[i]], 'e-selected');
22715
- }
22716
- /* eslint-enable */
22717
- }
22718
22920
  if (scrollTop < toolbarName[0].offsetHeight) {
22719
22921
  addClass([toolbarName[0]], 'e-selected');
22720
22922
  }
@@ -23169,7 +23371,7 @@ class EmojiPicker {
23169
23371
  const startOffset = this.save.startOffset;
23170
23372
  const textContent = this.save.range.startContainer.textContent;
23171
23373
  const previousText = textContent.substring(startOffset, startOffset + 1);
23172
- // When toolbar action is clicked then only restore the range.
23374
+ // When toolbar action is clicked then only restore the range.
23173
23375
  if (!isNullOrUndefined(this.clickEvent) || previousText !== ':') {
23174
23376
  this.save.restore();
23175
23377
  }
@@ -23747,6 +23949,9 @@ class Link {
23747
23949
  if (this.quickToolObj.inlineQTBar && document.body.contains(this.quickToolObj.inlineQTBar.element)) {
23748
23950
  this.quickToolObj.inlineQTBar.hidePopup();
23749
23951
  }
23952
+ if (this.quickToolObj.textQTBar && this.parent.element.ownerDocument.body.contains(this.quickToolObj.textQTBar.element)) {
23953
+ this.quickToolObj.textQTBar.hidePopup();
23954
+ }
23750
23955
  }
23751
23956
  }
23752
23957
  // eslint-disable-next-line
@@ -23938,7 +24143,7 @@ class Link {
23938
24143
  /**
23939
24144
  * `Image` module is used to handle image actions.
23940
24145
  */
23941
- class Image {
24146
+ class Image$1 {
23942
24147
  constructor(parent, serviceLocator) {
23943
24148
  this.isImgUploaded = false;
23944
24149
  this.isAllowedTypes = true;
@@ -24021,6 +24226,7 @@ class Image {
24021
24226
  EventHandler.remove(this.parent.contentModule.getEditPanel(), Browser.touchStartEvent, this.resizeStart);
24022
24227
  EventHandler.remove(this.parent.element.ownerDocument, 'mousedown', this.onDocumentClick);
24023
24228
  EventHandler.remove(this.contentModule.getEditPanel(), 'cut', this.onCutHandler);
24229
+ EventHandler.remove(this.contentModule.getDocument(), Browser.touchMoveEvent, this.resizing);
24024
24230
  }
24025
24231
  }
24026
24232
  }
@@ -25343,6 +25549,9 @@ class Image {
25343
25549
  if (this.quickToolObj.inlineQTBar && document.body.contains(this.quickToolObj.inlineQTBar.element)) {
25344
25550
  this.quickToolObj.inlineQTBar.hidePopup();
25345
25551
  }
25552
+ if (this.quickToolObj.textQTBar && this.parent.element.ownerDocument.body.contains(this.quickToolObj.textQTBar.element)) {
25553
+ this.quickToolObj.textQTBar.hidePopup();
25554
+ }
25346
25555
  }
25347
25556
  }
25348
25557
  // eslint-disable-next-line
@@ -25608,10 +25817,8 @@ class Image {
25608
25817
  });
25609
25818
  uploadParentEle.appendChild(uploadEle);
25610
25819
  let altText;
25611
- let rawFile;
25612
25820
  let selectArgs;
25613
25821
  let filesData;
25614
- let beforeUploadArgs;
25615
25822
  this.uploadObj = new Uploader({
25616
25823
  asyncSettings: { saveUrl: this.parent.insertImageSettings.saveUrl, removeUrl: this.parent.insertImageSettings.removeUrl },
25617
25824
  dropArea: span, multiple: false, enableRtl: this.parent.enableRtl, cssClass: this.parent.cssClass,
@@ -25619,13 +25826,8 @@ class Image {
25619
25826
  selected: (e) => {
25620
25827
  proxy.isImgUploaded = true;
25621
25828
  selectArgs = e;
25829
+ // eslint-disable-next-line
25622
25830
  filesData = e.filesData;
25623
- if (this.parent.isServerRendered) {
25624
- selectArgs = JSON.parse(JSON.stringify(e));
25625
- e.cancel = true;
25626
- rawFile = e.filesData;
25627
- selectArgs.filesData = rawFile;
25628
- }
25629
25831
  this.parent.trigger(imageSelected, selectArgs, (selectArgs) => {
25630
25832
  if (!selectArgs.cancel) {
25631
25833
  this.checkExtension(selectArgs.filesData[0]);
@@ -25656,35 +25858,11 @@ class Image {
25656
25858
  });
25657
25859
  reader.readAsDataURL(selectArgs.filesData[0].rawFile);
25658
25860
  }
25659
- if (this.parent.isServerRendered) {
25660
- /* eslint-disable */
25661
- this.uploadObj._internalRenderSelect(selectArgs, rawFile);
25662
- /* eslint-enable */
25663
- }
25664
25861
  }
25665
25862
  });
25666
25863
  },
25667
25864
  beforeUpload: (args) => {
25668
- if (this.parent.isServerRendered) {
25669
- beforeUploadArgs = JSON.parse(JSON.stringify(args));
25670
- beforeUploadArgs.filesData = filesData;
25671
- args.cancel = true;
25672
- this.parent.trigger(imageUploading, beforeUploadArgs, (beforeUploadArgs) => {
25673
- if (beforeUploadArgs.cancel) {
25674
- return;
25675
- }
25676
- /* eslint-disable */
25677
- this.uploadObj.currentRequestHeader = beforeUploadArgs.currentRequest ?
25678
- beforeUploadArgs.currentRequest : this.uploadObj.currentRequestHeader;
25679
- this.uploadObj.customFormDatas = beforeUploadArgs.customFormData && beforeUploadArgs.customFormData.length > 0 ?
25680
- beforeUploadArgs.customFormData : this.uploadObj.customFormDatas;
25681
- this.uploadObj.uploadFiles(rawFile, null);
25682
- /* eslint-enable */
25683
- });
25684
- }
25685
- else {
25686
- this.parent.trigger(beforeImageUpload, args);
25687
- }
25865
+ this.parent.trigger(beforeImageUpload, args);
25688
25866
  },
25689
25867
  uploading: (e) => {
25690
25868
  if (!this.parent.isServerRendered) {
@@ -25998,8 +26176,6 @@ class Image {
25998
26176
  setTimeout(() => {
25999
26177
  proxy.refreshPopup(imageElement);
26000
26178
  }, timeOut);
26001
- let rawFile;
26002
- let beforeUploadArgs;
26003
26179
  this.uploadObj = new Uploader({
26004
26180
  asyncSettings: {
26005
26181
  saveUrl: this.parent.insertImageSettings.saveUrl,
@@ -26025,33 +26201,9 @@ class Image {
26025
26201
  }, 900);
26026
26202
  },
26027
26203
  beforeUpload: (args) => {
26028
- if (this.parent.isServerRendered) {
26029
- beforeUploadArgs = JSON.parse(JSON.stringify(args));
26030
- beforeUploadArgs.filesData = rawFile;
26031
- isUploading = true;
26032
- args.cancel = true;
26033
- this.parent.trigger(imageUploading, beforeUploadArgs, (beforeUploadArgs) => {
26034
- if (beforeUploadArgs.cancel) {
26035
- return;
26036
- }
26037
- if (!this.parent.inlineMode.enable) {
26038
- this.parent.toolbarModule.baseToolbar.toolbarObj.disable(true);
26039
- }
26040
- /* eslint-disable */
26041
- this.uploadObj.currentRequestHeader = beforeUploadArgs.currentRequest ?
26042
- beforeUploadArgs.currentRequest : this.uploadObj.currentRequestHeader;
26043
- this.uploadObj.customFormDatas = beforeUploadArgs.customFormData && beforeUploadArgs.customFormData.length > 0 ?
26044
- beforeUploadArgs.customFormData : this.uploadObj.customFormDatas;
26045
- this.uploadObj.uploadFiles(rawFile, null);
26046
- this.parent.inputElement.contentEditable = 'false';
26047
- /* eslint-enable */
26048
- });
26049
- }
26050
- else {
26051
- this.parent.trigger(beforeImageUpload, args);
26052
- if (!this.parent.inlineMode.enable) {
26053
- this.parent.toolbarModule.baseToolbar.toolbarObj.disable(true);
26054
- }
26204
+ this.parent.trigger(beforeImageUpload, args);
26205
+ if (!this.parent.inlineMode.enable) {
26206
+ this.parent.toolbarModule.baseToolbar.toolbarObj.disable(true);
26055
26207
  }
26056
26208
  },
26057
26209
  uploading: (e) => {
@@ -26076,9 +26228,6 @@ class Image {
26076
26228
  if (isUploading) {
26077
26229
  e.cancel = true;
26078
26230
  }
26079
- if (this.parent.isServerRendered) {
26080
- rawFile = e.filesData;
26081
- }
26082
26231
  },
26083
26232
  failure: (e) => {
26084
26233
  isUploading = false;
@@ -26859,6 +27008,9 @@ class Audio {
26859
27008
  if (this.quickToolObj.inlineQTBar && document.body.contains(this.quickToolObj.inlineQTBar.element)) {
26860
27009
  this.quickToolObj.inlineQTBar.hidePopup();
26861
27010
  }
27011
+ if (this.quickToolObj.textQTBar && this.parent.element.ownerDocument.body.contains(this.quickToolObj.textQTBar.element)) {
27012
+ this.quickToolObj.textQTBar.hidePopup();
27013
+ }
26862
27014
  }
26863
27015
  }
26864
27016
  // eslint-disable-next-line
@@ -26926,10 +27078,8 @@ class Audio {
26926
27078
  });
26927
27079
  uploadParentEle.appendChild(uploadEle);
26928
27080
  let fileName;
26929
- let rawFile;
26930
27081
  let selectArgs;
26931
27082
  let filesData;
26932
- let beforeUploadArgs;
26933
27083
  this.uploadObj = new Uploader({
26934
27084
  asyncSettings: { saveUrl: this.parent.insertAudioSettings.saveUrl, removeUrl: this.parent.insertAudioSettings.removeUrl },
26935
27085
  dropArea: span, multiple: false, enableRtl: this.parent.enableRtl,
@@ -26937,13 +27087,8 @@ class Audio {
26937
27087
  selected: (e) => {
26938
27088
  proxy.isAudioUploaded = true;
26939
27089
  selectArgs = e;
27090
+ // eslint-disable-next-line
26940
27091
  filesData = e.filesData;
26941
- if (this.parent.isServerRendered) {
26942
- selectArgs = JSON.parse(JSON.stringify(e));
26943
- e.cancel = true;
26944
- rawFile = e.filesData;
26945
- selectArgs.filesData = rawFile;
26946
- }
26947
27092
  this.parent.trigger(fileSelected, selectArgs, (selectArgs) => {
26948
27093
  if (!selectArgs.cancel) {
26949
27094
  this.checkExtension(selectArgs.filesData[0]);
@@ -26966,35 +27111,11 @@ class Audio {
26966
27111
  });
26967
27112
  reader.readAsDataURL(selectArgs.filesData[0].rawFile);
26968
27113
  }
26969
- if (this.parent.isServerRendered) {
26970
- /* eslint-disable */
26971
- this.uploadObj._internalRenderSelect(selectArgs, rawFile);
26972
- /* eslint-enable */
26973
- }
26974
27114
  }
26975
27115
  });
26976
27116
  },
26977
27117
  beforeUpload: (args) => {
26978
- if (this.parent.isServerRendered) {
26979
- beforeUploadArgs = JSON.parse(JSON.stringify(args));
26980
- beforeUploadArgs.filesData = filesData;
26981
- args.cancel = true;
26982
- this.parent.trigger(fileUploading, beforeUploadArgs, (beforeUploadArgs) => {
26983
- if (beforeUploadArgs.cancel) {
26984
- return;
26985
- }
26986
- /* eslint-disable */
26987
- this.uploadObj.currentRequestHeader = beforeUploadArgs.currentRequest ?
26988
- beforeUploadArgs.currentRequest : this.uploadObj.currentRequestHeader;
26989
- this.uploadObj.customFormDatas = beforeUploadArgs.customFormData && beforeUploadArgs.customFormData.length > 0 ?
26990
- beforeUploadArgs.customFormData : this.uploadObj.customFormDatas;
26991
- this.uploadObj.uploadFiles(rawFile, null);
26992
- /* eslint-enable */
26993
- });
26994
- }
26995
- else {
26996
- this.parent.trigger(beforeFileUpload, args);
26997
- }
27118
+ this.parent.trigger(beforeFileUpload, args);
26998
27119
  },
26999
27120
  uploading: (e) => {
27000
27121
  if (!this.parent.isServerRendered) {
@@ -27183,6 +27304,7 @@ class Video {
27183
27304
  EventHandler.remove(this.parent.contentModule.getEditPanel(), Browser.touchStartEvent, this.resizeStart);
27184
27305
  EventHandler.remove(this.parent.element.ownerDocument, 'mousedown', this.onDocumentClick);
27185
27306
  EventHandler.remove(this.contentModule.getEditPanel(), 'cut', this.onCutHandler);
27307
+ EventHandler.remove(this.contentModule.getDocument(), Browser.touchMoveEvent, this.resizing);
27186
27308
  }
27187
27309
  }
27188
27310
  }
@@ -28221,6 +28343,9 @@ class Video {
28221
28343
  if (this.quickToolObj.inlineQTBar && document.body.contains(this.quickToolObj.inlineQTBar.element)) {
28222
28344
  this.quickToolObj.inlineQTBar.hidePopup();
28223
28345
  }
28346
+ if (this.quickToolObj.textQTBar && this.parent.element.ownerDocument.body.contains(this.quickToolObj.textQTBar.element)) {
28347
+ this.quickToolObj.textQTBar.hidePopup();
28348
+ }
28224
28349
  }
28225
28350
  }
28226
28351
  // eslint-disable-next-line
@@ -28330,10 +28455,8 @@ class Video {
28330
28455
  });
28331
28456
  uploadParentEle.appendChild(uploadEle);
28332
28457
  let fileName;
28333
- let rawFile;
28334
28458
  let selectArgs;
28335
28459
  let filesData;
28336
- let beforeUploadArgs;
28337
28460
  this.uploadObj = new Uploader({
28338
28461
  asyncSettings: { saveUrl: this.parent.insertVideoSettings.saveUrl, removeUrl: this.parent.insertVideoSettings.removeUrl },
28339
28462
  dropArea: span, multiple: false, enableRtl: this.parent.enableRtl,
@@ -28341,13 +28464,8 @@ class Video {
28341
28464
  selected: (e) => {
28342
28465
  proxy.isVideoUploaded = true;
28343
28466
  selectArgs = e;
28467
+ // eslint-disable-next-line
28344
28468
  filesData = e.filesData;
28345
- if (this.parent.isServerRendered) {
28346
- selectArgs = JSON.parse(JSON.stringify(e));
28347
- e.cancel = true;
28348
- rawFile = e.filesData;
28349
- selectArgs.filesData = rawFile;
28350
- }
28351
28469
  this.parent.trigger(fileSelected, selectArgs, (selectArgs) => {
28352
28470
  if (!selectArgs.cancel) {
28353
28471
  this.checkExtension(selectArgs.filesData[0]);
@@ -28371,35 +28489,11 @@ class Video {
28371
28489
  });
28372
28490
  reader.readAsDataURL(selectArgs.filesData[0].rawFile);
28373
28491
  }
28374
- if (this.parent.isServerRendered) {
28375
- /* eslint-disable */
28376
- this.uploadObj._internalRenderSelect(selectArgs, rawFile);
28377
- /* eslint-enable */
28378
- }
28379
28492
  }
28380
28493
  });
28381
28494
  },
28382
28495
  beforeUpload: (args) => {
28383
- if (this.parent.isServerRendered) {
28384
- beforeUploadArgs = JSON.parse(JSON.stringify(args));
28385
- beforeUploadArgs.filesData = filesData;
28386
- args.cancel = true;
28387
- this.parent.trigger(fileUploading, beforeUploadArgs, (beforeUploadArgs) => {
28388
- if (beforeUploadArgs.cancel) {
28389
- return;
28390
- }
28391
- /* eslint-disable */
28392
- this.uploadObj.currentRequestHeader = beforeUploadArgs.currentRequest ?
28393
- beforeUploadArgs.currentRequest : this.uploadObj.currentRequestHeader;
28394
- this.uploadObj.customFormDatas = beforeUploadArgs.customFormData && beforeUploadArgs.customFormData.length > 0 ?
28395
- beforeUploadArgs.customFormData : this.uploadObj.customFormDatas;
28396
- this.uploadObj.uploadFiles(rawFile, null);
28397
- /* eslint-enable */
28398
- });
28399
- }
28400
- else {
28401
- this.parent.trigger(beforeFileUpload, args);
28402
- }
28496
+ this.parent.trigger(beforeFileUpload, args);
28403
28497
  },
28404
28498
  uploading: (e) => {
28405
28499
  if (!this.parent.isServerRendered) {
@@ -28645,6 +28739,7 @@ class ViewSource {
28645
28739
  * @deprecated
28646
28740
  */
28647
28741
  sourceCode(args) {
28742
+ this.parent.notify(hidePopup, {});
28648
28743
  this.parent.isBlur = false;
28649
28744
  this.parent.trigger(actionBegin, { requestType: 'SourceCode', targetItem: 'SourceCode', args: args });
28650
28745
  const tbItems = selectAll('.' + CLS_TB_ITEM, this.parent.element);
@@ -29276,14 +29371,17 @@ class Table {
29276
29371
  let pageX;
29277
29372
  let pageY;
29278
29373
  if (Browser.isDevice && e.args.touches) {
29279
- pageX = e.args.changedTouches[0].pageX;
29280
- pageY = e.args.changedTouches[0].pageY;
29374
+ pageX = (this.parent.iframeSettings.enable) ? window.pageXOffset + this.parent.element.getBoundingClientRect().left +
29375
+ e.args.changedTouches[0].clientX : e.args.changedTouches[0].pageX;
29376
+ pageY = (this.parent.iframeSettings.enable) ? window.pageYOffset + this.parent.element.getBoundingClientRect().top +
29377
+ (!this.parent.inlineMode.enable ? this.parent.toolbarModule.getToolbarHeight() : 0)
29378
+ + e.args.changedTouches[0].clientY : e.args.changedTouches[0].pageY;
29281
29379
  }
29282
29380
  else {
29283
29381
  pageX = (this.parent.iframeSettings.enable) ? window.pageXOffset
29284
29382
  + this.parent.element.getBoundingClientRect().left + args.clientX : args.pageX;
29285
- pageY = (this.parent.iframeSettings.enable) ? window.pageYOffset +
29286
- this.parent.element.getBoundingClientRect().top + args.clientY : args.pageY;
29383
+ pageY = (this.parent.iframeSettings.enable) ? window.pageYOffset + this.parent.element.getBoundingClientRect().top +
29384
+ this.parent.toolbarModule.getToolbarHeight() + args.clientY : args.pageY;
29287
29385
  }
29288
29386
  this.quickToolObj.tableQTBar.showPopup(pageX, pageY, target);
29289
29387
  this.parent.formatter.editorManager.nodeSelection.restore();
@@ -29682,7 +29780,7 @@ class Table {
29682
29780
  const width = parseFloat(this.columnEle.offsetWidth.toString());
29683
29781
  const cellRow = this.curTable.rows[0].cells[0].nodeName === 'TH' ? 1 : 0;
29684
29782
  let currentTableWidth;
29685
- if (this.curTable.style.width != '') {
29783
+ if (this.curTable.style.width !== '') {
29686
29784
  currentTableWidth = parseFloat(this.curTable.style.width.split('%')[0]);
29687
29785
  }
29688
29786
  else {
@@ -29745,6 +29843,7 @@ class Table {
29745
29843
  let isMergedEleResize = false;
29746
29844
  let leftTableCell;
29747
29845
  let rightTableCell;
29846
+ /* eslint-disable */
29748
29847
  for (let j = 0; j < currentRow.cells.length; j++) {
29749
29848
  if (currentRow.cells[j].hasAttribute('rowspan') && j <= this.colIndex) {
29750
29849
  isRowCellsMerged = true;
@@ -29803,6 +29902,7 @@ class Table {
29803
29902
  this.convertPixelToPercentage(rightColWidth, tableWidth) + '%';
29804
29903
  }
29805
29904
  }
29905
+ /* eslint-enable */
29806
29906
  }
29807
29907
  }
29808
29908
  }
@@ -29937,7 +30037,8 @@ class Table {
29937
30037
  this.hideTableQuickToolbar();
29938
30038
  }
29939
30039
  renderDlgContent(args) {
29940
- if (Browser.isDevice || this.parent.inlineMode.enable) {
30040
+ const argsTarget = args.args.originalEvent.target;
30041
+ if (Browser.isDevice || this.parent.inlineMode.enable || !isNullOrUndefined(closest(argsTarget, '.e-rte-text-popup'))) {
29941
30042
  this.insertTableDialog(args);
29942
30043
  return;
29943
30044
  }
@@ -30191,6 +30292,10 @@ class Table {
30191
30292
  if (this.quickToolObj && this.quickToolObj.inlineQTBar && document.body.contains(this.quickToolObj.inlineQTBar.element)) {
30192
30293
  this.quickToolObj.inlineQTBar.hidePopup();
30193
30294
  }
30295
+ if (this.quickToolObj && this.quickToolObj.textQTBar &&
30296
+ this.parent.element.ownerDocument.body.contains(this.quickToolObj.textQTBar.element)) {
30297
+ this.quickToolObj.textQTBar.hidePopup();
30298
+ }
30194
30299
  }
30195
30300
  customTable(args, e) {
30196
30301
  const proxy = (this.self) ? this.self : this;
@@ -30198,7 +30303,8 @@ class Table {
30198
30303
  const argument = ((Browser.isDevice || (!isNullOrUndefined(args.args)
30199
30304
  && !isNullOrUndefined(args.args.originalEvent) &&
30200
30305
  args.args.originalEvent.action === 'insert-table')
30201
- || proxy.parent.inlineMode.enable) ? args : this);
30306
+ || proxy.parent.inlineMode.enable || !isNullOrUndefined(proxy.parent.quickToolbarSettings.text)) ? args :
30307
+ this);
30202
30308
  proxy.tableInsert(proxy.rowTextBox.value, proxy.columnTextBox.value, e, argument);
30203
30309
  }
30204
30310
  }
@@ -30353,8 +30459,20 @@ class DialogRenderer {
30353
30459
  return dlgObj;
30354
30460
  }
30355
30461
  beforeOpen(args) {
30462
+ if (args.element.classList.contains('e-dialog')) {
30463
+ const formEle = closest(args.target, 'form');
30464
+ if (!isNullOrUndefined(formEle)) {
30465
+ this.dialogEle = args.element;
30466
+ this.dialogEle.addEventListener('keydown', this.handleEnterKeyDown);
30467
+ }
30468
+ }
30356
30469
  this.parent.trigger(beforeDialogOpen, args, this.beforeOpenCallback.bind(this, args));
30357
30470
  }
30471
+ handleEnterKeyDown(args) {
30472
+ if (args.code === 'Enter') {
30473
+ args.preventDefault();
30474
+ }
30475
+ }
30358
30476
  beforeOpenCallback(args) {
30359
30477
  if (args.cancel) {
30360
30478
  this.parent.notify(clearDialogObj, null);
@@ -30364,6 +30482,9 @@ class DialogRenderer {
30364
30482
  this.parent.trigger(dialogOpen, args);
30365
30483
  }
30366
30484
  beforeClose(args) {
30485
+ if (this.dialogEle) {
30486
+ this.dialogEle.removeEventListener('keydown', this.handleEnterKeyDown);
30487
+ }
30367
30488
  this.parent.trigger(beforeDialogClose, args, (closeArgs) => {
30368
30489
  if (!closeArgs.cancel) {
30369
30490
  if (closeArgs.container.classList.contains('e-popup-close')) {
@@ -30828,7 +30949,7 @@ __decorate$2([
30828
30949
  Property(['VideoReplace', 'VideoAlign', 'VideoRemove', 'VideoLayoutOption', 'VideoDimension'])
30829
30950
  ], QuickToolbarSettings.prototype, "video", void 0);
30830
30951
  __decorate$2([
30831
- Property(['Cut', 'Copy', 'Paste'])
30952
+ Property(null)
30832
30953
  ], QuickToolbarSettings.prototype, "text", void 0);
30833
30954
  __decorate$2([
30834
30955
  Property(['TableHeader', 'TableRows', 'TableColumns', 'BackgroundColor', '-', 'TableRemove', 'Alignments', 'TableCellVerticalAlign', 'Styles'])
@@ -31199,8 +31320,12 @@ class EnterKeyAction {
31199
31320
  (this.range.startContainer.previousSibling.nodeName === 'IMG' || this.range.startContainer.previousSibling.nodeName === 'BR'))) {
31200
31321
  let isNearBlockLengthZero;
31201
31322
  let newElem;
31202
- if (!isNullOrUndefined(this.range.startContainer.childNodes) && this.range.startContainer.textContent.length === 0
31203
- && (this.range.startContainer.querySelectorAll('img, audio, video').length > 0 ||
31323
+ if (!isNullOrUndefined(this.range.startContainer.childNodes) &&
31324
+ (this.range.startContainer.textContent.length === 0 ||
31325
+ (this.range.startContainer.nodeName !== '#text' && !isNullOrUndefined(this.range.startContainer.querySelector('.e-video-clickelem')) &&
31326
+ this.range.startContainer.querySelector('.e-video-clickelem').textContent.length === 0)) &&
31327
+ (this.range.startContainer.querySelectorAll('img, audio, video').length > 0 ||
31328
+ !isNullOrUndefined(this.range.startContainer.querySelector('.e-video-clickelem')) ||
31204
31329
  this.range.startContainer.nodeName === 'IMG' || this.range.startContainer.nodeName === 'TABLE')) {
31205
31330
  newElem = this.createInsertElement(shiftKey);
31206
31331
  isMediaNode = true;
@@ -32557,9 +32682,6 @@ let RichTextEditor = class RichTextEditor extends Component {
32557
32682
  this.removeAttributes();
32558
32683
  super.destroy();
32559
32684
  this.isRendered = false;
32560
- if (this.enablePersistence) {
32561
- window.localStorage.removeItem(this.getModuleName() + this.element.id);
32562
- }
32563
32685
  }
32564
32686
  removeHtmlAttributes() {
32565
32687
  if (this.htmlAttributes) {
@@ -32688,9 +32810,10 @@ let RichTextEditor = class RichTextEditor extends Component {
32688
32810
  else {
32689
32811
  nVal = newProp[prop];
32690
32812
  }
32813
+ nVal = this.serializeValue(nVal);
32691
32814
  const val = this.editorMode === 'HTML' ? getEditValue(nVal, this) : nVal;
32692
32815
  if ((!isNullOrUndefined(nVal) && nVal !== '') || prop === 'enterKey') {
32693
- this.value = this.serializeValue(((this.enableHtmlEncode) ? this.encode(decode(val)) : val));
32816
+ this.setProperties({ value: ((this.enableHtmlEncode) ? this.encode(decode(val)) : val) }, true);
32694
32817
  }
32695
32818
  this.updatePanelValue();
32696
32819
  if (this.inputElement) {
@@ -33236,10 +33359,6 @@ let RichTextEditor = class RichTextEditor extends Component {
33236
33359
  // eslint-disable-next-line
33237
33360
  const imgPadding = 12;
33238
33361
  const imgResizeBorder = 2;
33239
- if (isNullOrUndefined(this.contentModule) || isNullOrUndefined(this.contentModule.getEditPanel())) {
33240
- EventHandler.remove(this.contentModule.getDocument(), Browser.touchMoveEvent, this.imageModule.resizing);
33241
- return maxWidth;
33242
- }
33243
33362
  const editEle = this.contentModule.getEditPanel();
33244
33363
  const eleStyle = window.getComputedStyle(editEle);
33245
33364
  const editEleMaxWidth = editEle.offsetWidth - (imgPadding + imgResizeBorder +
@@ -34236,5 +34355,5 @@ RichTextEditor = __decorate$1([
34236
34355
  * Rich Text Editor component exported items
34237
34356
  */
34238
34357
 
34239
- export { Toolbar$2 as Toolbar, KeyboardEvents$1 as KeyboardEvents, BaseToolbar, BaseQuickToolbar, QuickToolbar, Count, ColorPickerInput, MarkdownToolbarStatus, ExecCommandCallBack, ToolbarAction, MarkdownEditor, HtmlEditor, PasteCleanup, Resize, DropDownButtons, FileManager$1 as FileManager, FullScreen, setAttributes, HtmlToolbarStatus, XhtmlValidation, FormatPainter, EmojiPicker, HTMLFormatter, Formatter, MarkdownFormatter, ContentRender, Render, ToolbarRenderer, Link, Image, Audio, Video, ViewSource, Table, DialogRenderer, IframeContentRender, MarkdownRender, PopupRenderer, RichTextEditor, RenderType, ToolbarType, DialogType, executeGroup, created, destroyed, tableclass, load, initialLoad, contentChanged, initialEnd, iframeMouseDown, destroy, toolbarClick, toolbarRefresh, refreshBegin, toolbarUpdated, bindOnEnd, renderColorPicker, htmlToolbarClick, markdownToolbarClick, destroyColorPicker, modelChanged, tableModulekeyUp, keyUp, keyDown, mouseUp, toolbarCreated, toolbarRenderComplete, enableFullScreen, disableFullScreen, dropDownSelect, beforeDropDownItemRender, execCommandCallBack, imageToolbarAction, audioToolbarAction, videoToolbarAction, linkToolbarAction, windowResize, resizeStart, onResize, resizeStop, undo, redo, insertLink, unLink, editLink, openLink, actionBegin, actionComplete, updatedToolbarStatus, actionSuccess, updateToolbarItem, insertImage, insertAudio, insertVideo, insertCompleted, imageLeft, imageRight, imageCenter, imageBreak, imageInline, imageLink, imageAlt, imageDelete, audioDelete, videoDelete, imageCaption, imageSize, videoSize, sourceCode, updateSource, toolbarOpen, beforeDropDownOpen, selectionSave, selectionRestore, expandPopupClick, count, contentFocus, contentBlur, mouseDown, sourceCodeMouseDown, editAreaClick, scroll, contentscroll, colorPickerChanged, tableColorPickerChanged, focusChange, selectAll$1 as selectAll, selectRange, getSelectedHtml, renderInlineToolbar, paste, imgModule, rtlMode, createTable, docClick, tableToolbarAction, checkUndo, readOnlyMode, moduleDestroy, pasteClean, enterHandler, beforeDialogOpen, clearDialogObj, dialogOpen, beforeDialogClose, dialogClose, beforeQuickToolbarOpen, quickToolbarOpen, quickToolbarClose, popupHide, imageSelected, imageUploading, imageUploadSuccess, imageUploadFailed, imageRemoving, fileSelected, fileUploading, fileUploadSuccess, fileUploadFailed, fileRemoving, afterImageDelete, afterMediaDelete, drop, xhtmlValidation, beforeImageUpload, beforeFileUpload, resizeInitialized, renderFileManager, beforeImageDrop, dynamicModule, beforePasteCleanup, afterPasteCleanup, updateTbItemsStatus, showLinkDialog, closeLinkDialog, showImageDialog, showAudioDialog, showVideoDialog, closeImageDialog, closeAudioDialog, closeVideoDialog, showTableDialog, closeTableDialog, bindCssClass, formatPainterClick, formatPainterDoubleClick, emojiPicker, maximizeMinimizeClick, blockEmptyNodes, inlineEmptyNodes, CLS_RTE, CLS_RTL, CLS_CONTENT, CLS_DISABLED, CLS_SCRIPT_SHEET, CLS_STYLE_SHEET, CLS_TOOLBAR, CLS_TB_FIXED, CLS_TB_FLOAT, CLS_TB_ABS_FLOAT, CLS_INLINE, CLS_TB_INLINE, CLS_RTE_EXPAND_TB, CLS_FULL_SCREEN, CLS_QUICK_TB, CLS_POP, CLS_TB_STATIC, CLS_QUICK_POP, CLS_QUICK_DROPDOWN, CLS_IMAGE_POP, CLS_INLINE_POP, CLS_INLINE_DROPDOWN, CLS_DROPDOWN_POPUP, CLS_DROPDOWN_ICONS, CLS_DROPDOWN_ITEMS, CLS_DROPDOWN_BTN, CLS_RTE_CONTENT, CLS_TB_ITEM, CLS_TB_EXTENDED, CLS_TB_WRAP, CLS_POPUP, CLS_SEPARATOR, CLS_MINIMIZE, CLS_MAXIMIZE, CLS_BACK, CLS_SHOW, CLS_HIDE, CLS_VISIBLE, CLS_FOCUS, CLS_RM_WHITE_SPACE, CLS_IMGRIGHT, CLS_IMGLEFT, CLS_IMGCENTER, CLS_IMGBREAK, CLS_AUDIOBREAK, CLS_CLICKELEM, CLS_VID_CLICK_ELEM, CLS_AUDIOWRAP, CLS_VIDEOWRAP, CLS_VIDEOBREAK, CLS_CAPTION, CLS_RTE_CAPTION, CLS_CAPINLINE, CLS_IMGINLINE, CLS_AUDIOINLINE, CLS_VIDEOINLINE, CLS_COUNT, CLS_WARNING, CLS_ERROR, CLS_ICONS, CLS_ACTIVE, CLS_EXPAND_OPEN, CLS_RTE_ELEMENTS, CLS_TB_BTN, CLS_HR_SEPARATOR, CLS_TB_IOS_FIX, CLS_LIST_PRIMARY_CONTENT, CLS_NUMBERFORMATLIST_TB_BTN, CLS_BULLETFORMATLIST_TB_BTN, CLS_FORMATS_TB_BTN, CLS_FONT_NAME_TB_BTN, CLS_FONT_SIZE_TB_BTN, CLS_ALIGN_TB_BTN, CLS_FONT_COLOR_TARGET, CLS_BACKGROUND_COLOR_TARGET, CLS_COLOR_CONTENT, CLS_FONT_COLOR_DROPDOWN, CLS_BACKGROUND_COLOR_DROPDOWN, CLS_COLOR_PALETTE, CLS_FONT_COLOR_PICKER, CLS_BACKGROUND_COLOR_PICKER, CLS_RTE_READONLY, CLS_TABLE_SEL, CLS_TB_DASH_BOR, CLS_TB_ALT_BOR, CLS_TB_COL_RES, CLS_TB_ROW_RES, CLS_TB_BOX_RES, CLS_RTE_HIDDEN, CLS_RTE_PASTE_KEEP_FORMAT, CLS_RTE_PASTE_REMOVE_FORMAT, CLS_RTE_PASTE_PLAIN_FORMAT, CLS_RTE_PASTE_OK, CLS_RTE_PASTE_CANCEL, CLS_RTE_DIALOG_MIN_HEIGHT, CLS_RTE_RES_HANDLE, CLS_RTE_RES_EAST, CLS_RTE_IMAGE, CLS_RESIZE, CLS_IMG_FOCUS, CLS_AUD_FOCUS, CLS_VID_FOCUS, CLS_RTE_DRAG_IMAGE, CLS_RTE_UPLOAD_POPUP, CLS_POPUP_OPEN, CLS_IMG_RESIZE, CLS_DROPAREA, CLS_IMG_INNER, CLS_UPLOAD_FILES, CLS_RTE_DIALOG_UPLOAD, CLS_RTE_RES_CNT, CLS_CUSTOM_TILE, CLS_NOCOLOR_ITEM, CLS_TABLE, CLS_TABLE_BORDER, CLS_RTE_TABLE_RESIZE, CLS_RTE_FIXED_TB_EXPAND, CLS_RTE_TB_ENABLED, CLS_RTE_RES_WEST, getIndex, hasClass, getDropDownValue, isIDevice, getFormattedFontSize, pageYOffset, getTooltipText, setToolbarStatus, getCollection, getTBarItemsIndex, updateUndoRedoStatus, dispatchEvent, parseHtml, getTextNodesUnder, toObjectLowerCase, getEditValue, updateTextNode, getDefaultValue, isEditableValueEmpty, decode, sanitizeHelper, convertToBlob, getLocaleFontFormat, updateDropDownFontFormatLocale, ServiceLocator, RendererFactory, EditorManager, IMAGE, AUDIO, VIDEO, TABLE, LINK, INSERT_ROW, INSERT_COLUMN, DELETEROW, DELETECOLUMN, REMOVETABLE, TABLEHEADER, TABLE_VERTICAL_ALIGN, TABLE_MERGE, TABLE_VERTICAL_SPLIT, TABLE_HORIZONTAL_SPLIT, TABLE_MOVE, ALIGNMENT_TYPE, INDENT_TYPE, DEFAULT_TAG, BLOCK_TAGS, IGNORE_BLOCK_TAGS, TABLE_BLOCK_TAGS, SELECTION_TYPE, INSERTHTML_TYPE, INSERT_TEXT_TYPE, CLEAR_TYPE, SELF_CLOSING_TAGS, CLASS_IMAGE_RIGHT, CLASS_IMAGE_LEFT, CLASS_IMAGE_CENTER, CLASS_VIDEO_RIGHT, CLASS_VIDEO_LEFT, CLASS_VIDEO_CENTER, CLASS_IMAGE_BREAK, CLASS_AUDIO_BREAK, CLASS_VIDEO_BREAK, CLASS_CAPTION, CLASS_RTE_CAPTION, CLASS_CAPTION_INLINE, CLASS_IMAGE_INLINE, CLASS_AUDIO_INLINE, CLASS_CLICK_ELEM, CLASS_VIDEO_CLICK_ELEM, CLASS_AUDIO, CLASS_VIDEO, CLASS_AUDIO_WRAP, CLASS_VIDEO_WRAP, CLASS_EMBED_VIDEO_WRAP, CLASS_AUDIO_FOCUS, CLASS_VIDEO_FOCUS, CLASS_VIDEO_INLINE, Lists, markerClassName, DOMNode, Alignments, Indents, Formats, LinkCommand, InsertMethods, InsertTextExec, InsertHtmlExec, InsertHtml, IsFormatted, MsWordPaste, NodeCutter, ImageCommand, AudioCommand, VideoCommand, SelectionCommands, SelectionBasedExec, ClearFormatExec, UndoRedoManager, TableCommand, statusCollection, ToolbarStatus, FormatPainterActions, EmojiPickerAction, NodeSelection, MarkdownParser, LISTS_COMMAND, selectionCommand, LINK_COMMAND, CLEAR_COMMAND, MD_TABLE, INSERT_TEXT_COMMAND, ClearFormat, MDLists, MDFormats, MarkdownSelection, UndoRedoCommands, MDSelectionFormats, MDLink, MDTable, markdownFormatTags, markdownSelectionTags, markdownListsTags, htmlKeyConfig, markdownKeyConfig, pasteCleanupGroupingTags, listConversionFilters, selfClosingTags, KEY_DOWN, ACTION, FORMAT_TYPE, KEY_DOWN_HANDLER, LIST_TYPE, KEY_UP_HANDLER, KEY_UP, MODEL_CHANGED_PLUGIN, MODEL_CHANGED, MS_WORD_CLEANUP_PLUGIN, MS_WORD_CLEANUP, ON_BEGIN, SPACE_ACTION, FORMAT_PAINTER_ACTIONS, EMOJI_PICKER_ACTIONS };
34358
+ export { Toolbar$2 as Toolbar, KeyboardEvents$1 as KeyboardEvents, BaseToolbar, BaseQuickToolbar, QuickToolbar, Count, ColorPickerInput, MarkdownToolbarStatus, ExecCommandCallBack, ToolbarAction, MarkdownEditor, HtmlEditor, PasteCleanup, Resize, DropDownButtons, FileManager$1 as FileManager, FullScreen, setAttributes, HtmlToolbarStatus, XhtmlValidation, FormatPainter, EmojiPicker, HTMLFormatter, Formatter, MarkdownFormatter, ContentRender, Render, ToolbarRenderer, Link, Image$1 as Image, Audio, Video, ViewSource, Table, DialogRenderer, IframeContentRender, MarkdownRender, PopupRenderer, RichTextEditor, RenderType, ToolbarType, DialogType, executeGroup, created, destroyed, tableclass, load, initialLoad, contentChanged, initialEnd, iframeMouseDown, destroy, toolbarClick, toolbarRefresh, refreshBegin, toolbarUpdated, bindOnEnd, renderColorPicker, htmlToolbarClick, markdownToolbarClick, destroyColorPicker, modelChanged, tableModulekeyUp, keyUp, keyDown, mouseUp, toolbarCreated, toolbarRenderComplete, enableFullScreen, disableFullScreen, dropDownSelect, beforeDropDownItemRender, execCommandCallBack, imageToolbarAction, audioToolbarAction, videoToolbarAction, linkToolbarAction, windowResize, resizeStart, onResize, resizeStop, undo, redo, insertLink, unLink, editLink, openLink, actionBegin, actionComplete, updatedToolbarStatus, actionSuccess, updateToolbarItem, insertImage, insertAudio, insertVideo, insertCompleted, imageLeft, imageRight, imageCenter, imageBreak, imageInline, imageLink, imageAlt, imageDelete, audioDelete, videoDelete, imageCaption, imageSize, videoSize, sourceCode, updateSource, toolbarOpen, beforeDropDownOpen, selectionSave, selectionRestore, expandPopupClick, count, contentFocus, contentBlur, mouseDown, sourceCodeMouseDown, editAreaClick, scroll, contentscroll, colorPickerChanged, tableColorPickerChanged, focusChange, selectAll$1 as selectAll, selectRange, getSelectedHtml, renderInlineToolbar, paste, imgModule, rtlMode, createTable, docClick, tableToolbarAction, checkUndo, readOnlyMode, moduleDestroy, pasteClean, enterHandler, beforeDialogOpen, clearDialogObj, dialogOpen, beforeDialogClose, dialogClose, beforeQuickToolbarOpen, quickToolbarOpen, quickToolbarClose, popupHide, imageSelected, imageUploading, imageUploadSuccess, imageUploadFailed, imageRemoving, fileSelected, fileUploading, fileUploadSuccess, fileUploadFailed, fileRemoving, afterImageDelete, afterMediaDelete, drop, xhtmlValidation, beforeImageUpload, beforeFileUpload, resizeInitialized, renderFileManager, beforeImageDrop, dynamicModule, beforePasteCleanup, afterPasteCleanup, updateTbItemsStatus, showLinkDialog, closeLinkDialog, showImageDialog, showAudioDialog, showVideoDialog, closeImageDialog, closeAudioDialog, closeVideoDialog, showTableDialog, closeTableDialog, bindCssClass, formatPainterClick, formatPainterDoubleClick, emojiPicker, maximizeMinimizeClick, hidePopup, blockEmptyNodes, inlineEmptyNodes, CLS_RTE, CLS_RTL, CLS_CONTENT, CLS_DISABLED, CLS_SCRIPT_SHEET, CLS_STYLE_SHEET, CLS_TOOLBAR, CLS_TB_FIXED, CLS_TB_FLOAT, CLS_TB_ABS_FLOAT, CLS_INLINE, CLS_TB_INLINE, CLS_RTE_EXPAND_TB, CLS_FULL_SCREEN, CLS_QUICK_TB, CLS_POP, CLS_TB_STATIC, CLS_QUICK_POP, CLS_QUICK_DROPDOWN, CLS_IMAGE_POP, CLS_TEXT_POP, CLS_INLINE_POP, CLS_INLINE_DROPDOWN, CLS_DROPDOWN_POPUP, CLS_DROPDOWN_ICONS, CLS_DROPDOWN_ITEMS, CLS_DROPDOWN_BTN, CLS_RTE_CONTENT, CLS_TB_ITEM, CLS_TB_EXTENDED, CLS_TB_WRAP, CLS_POPUP, CLS_SEPARATOR, CLS_MINIMIZE, CLS_MAXIMIZE, CLS_BACK, CLS_SHOW, CLS_HIDE, CLS_VISIBLE, CLS_FOCUS, CLS_RM_WHITE_SPACE, CLS_IMGRIGHT, CLS_IMGLEFT, CLS_IMGCENTER, CLS_IMGBREAK, CLS_AUDIOBREAK, CLS_CLICKELEM, CLS_VID_CLICK_ELEM, CLS_AUDIOWRAP, CLS_VIDEOWRAP, CLS_VIDEOBREAK, CLS_CAPTION, CLS_RTE_CAPTION, CLS_CAPINLINE, CLS_IMGINLINE, CLS_AUDIOINLINE, CLS_VIDEOINLINE, CLS_COUNT, CLS_WARNING, CLS_ERROR, CLS_ICONS, CLS_ACTIVE, CLS_EXPAND_OPEN, CLS_RTE_ELEMENTS, CLS_TB_BTN, CLS_HR_SEPARATOR, CLS_TB_IOS_FIX, CLS_LIST_PRIMARY_CONTENT, CLS_NUMBERFORMATLIST_TB_BTN, CLS_BULLETFORMATLIST_TB_BTN, CLS_FORMATS_TB_BTN, CLS_FONT_NAME_TB_BTN, CLS_FONT_SIZE_TB_BTN, CLS_ALIGN_TB_BTN, CLS_FONT_COLOR_TARGET, CLS_BACKGROUND_COLOR_TARGET, CLS_COLOR_CONTENT, CLS_FONT_COLOR_DROPDOWN, CLS_BACKGROUND_COLOR_DROPDOWN, CLS_COLOR_PALETTE, CLS_FONT_COLOR_PICKER, CLS_BACKGROUND_COLOR_PICKER, CLS_RTE_READONLY, CLS_TABLE_SEL, CLS_TB_DASH_BOR, CLS_TB_ALT_BOR, CLS_TB_COL_RES, CLS_TB_ROW_RES, CLS_TB_BOX_RES, CLS_RTE_HIDDEN, CLS_RTE_PASTE_KEEP_FORMAT, CLS_RTE_PASTE_REMOVE_FORMAT, CLS_RTE_PASTE_PLAIN_FORMAT, CLS_RTE_PASTE_OK, CLS_RTE_PASTE_CANCEL, CLS_RTE_DIALOG_MIN_HEIGHT, CLS_RTE_RES_HANDLE, CLS_RTE_RES_EAST, CLS_RTE_IMAGE, CLS_RESIZE, CLS_IMG_FOCUS, CLS_AUD_FOCUS, CLS_VID_FOCUS, CLS_RTE_DRAG_IMAGE, CLS_RTE_UPLOAD_POPUP, CLS_POPUP_OPEN, CLS_IMG_RESIZE, CLS_DROPAREA, CLS_IMG_INNER, CLS_UPLOAD_FILES, CLS_RTE_DIALOG_UPLOAD, CLS_RTE_RES_CNT, CLS_CUSTOM_TILE, CLS_NOCOLOR_ITEM, CLS_TABLE, CLS_TABLE_BORDER, CLS_RTE_TABLE_RESIZE, CLS_RTE_FIXED_TB_EXPAND, CLS_RTE_TB_ENABLED, CLS_RTE_RES_WEST, getIndex, hasClass, getDropDownValue, isIDevice, getFormattedFontSize, pageYOffset, getTooltipText, setToolbarStatus, getCollection, getTBarItemsIndex, updateUndoRedoStatus, dispatchEvent, parseHtml, getTextNodesUnder, toObjectLowerCase, getEditValue, updateTextNode, getDefaultValue, isEditableValueEmpty, decode, sanitizeHelper, convertToBlob, getLocaleFontFormat, updateDropDownFontFormatLocale, ServiceLocator, RendererFactory, EditorManager, IMAGE, AUDIO, VIDEO, TABLE, LINK, INSERT_ROW, INSERT_COLUMN, DELETEROW, DELETECOLUMN, REMOVETABLE, TABLEHEADER, TABLE_VERTICAL_ALIGN, TABLE_MERGE, TABLE_VERTICAL_SPLIT, TABLE_HORIZONTAL_SPLIT, TABLE_MOVE, ALIGNMENT_TYPE, INDENT_TYPE, DEFAULT_TAG, BLOCK_TAGS, IGNORE_BLOCK_TAGS, TABLE_BLOCK_TAGS, SELECTION_TYPE, INSERTHTML_TYPE, INSERT_TEXT_TYPE, CLEAR_TYPE, SELF_CLOSING_TAGS, CLASS_IMAGE_RIGHT, CLASS_IMAGE_LEFT, CLASS_IMAGE_CENTER, CLASS_VIDEO_RIGHT, CLASS_VIDEO_LEFT, CLASS_VIDEO_CENTER, CLASS_IMAGE_BREAK, CLASS_AUDIO_BREAK, CLASS_VIDEO_BREAK, CLASS_CAPTION, CLASS_RTE_CAPTION, CLASS_CAPTION_INLINE, CLASS_IMAGE_INLINE, CLASS_AUDIO_INLINE, CLASS_CLICK_ELEM, CLASS_VIDEO_CLICK_ELEM, CLASS_AUDIO, CLASS_VIDEO, CLASS_AUDIO_WRAP, CLASS_VIDEO_WRAP, CLASS_EMBED_VIDEO_WRAP, CLASS_AUDIO_FOCUS, CLASS_VIDEO_FOCUS, CLASS_VIDEO_INLINE, Lists, markerClassName, DOMNode, Alignments, Indents, Formats, LinkCommand, InsertMethods, InsertTextExec, InsertHtmlExec, InsertHtml, IsFormatted, MsWordPaste, NodeCutter, ImageCommand, AudioCommand, VideoCommand, SelectionCommands, SelectionBasedExec, ClearFormatExec, UndoRedoManager, TableCommand, statusCollection, ToolbarStatus, FormatPainterActions, EmojiPickerAction, NodeSelection, MarkdownParser, LISTS_COMMAND, selectionCommand, LINK_COMMAND, CLEAR_COMMAND, MD_TABLE, INSERT_TEXT_COMMAND, ClearFormat, MDLists, MDFormats, MarkdownSelection, UndoRedoCommands, MDSelectionFormats, MDLink, MDTable, markdownFormatTags, markdownSelectionTags, markdownListsTags, htmlKeyConfig, markdownKeyConfig, pasteCleanupGroupingTags, listConversionFilters, selfClosingTags, KEY_DOWN, ACTION, FORMAT_TYPE, KEY_DOWN_HANDLER, LIST_TYPE, KEY_UP_HANDLER, KEY_UP, MODEL_CHANGED_PLUGIN, MODEL_CHANGED, MS_WORD_CLEANUP_PLUGIN, MS_WORD_CLEANUP, ON_BEGIN, SPACE_ACTION, FORMAT_PAINTER_ACTIONS, EMOJI_PICKER_ACTIONS };
34240
34359
  //# sourceMappingURL=ej2-richtexteditor.es2015.js.map