@syncfusion/ej2-richtexteditor 20.4.52 → 21.1.35

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 (140) hide show
  1. package/CHANGELOG.md +32 -2
  2. package/dist/ej2-richtexteditor.min.js +2 -2
  3. package/dist/ej2-richtexteditor.umd.min.js +2 -2
  4. package/dist/ej2-richtexteditor.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-richtexteditor.es2015.js +1623 -639
  6. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  7. package/dist/es6/ej2-richtexteditor.es5.js +1638 -646
  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/common/config.js +3 -1
  14. package/src/common/constant.d.ts +6 -0
  15. package/src/common/constant.js +6 -0
  16. package/src/common/util.d.ts +2 -1
  17. package/src/common/util.js +15 -6
  18. package/src/editor-manager/base/editor-manager.d.ts +2 -0
  19. package/src/editor-manager/base/editor-manager.js +6 -1
  20. package/src/editor-manager/base/enum.d.ts +14 -0
  21. package/src/editor-manager/base/interface.d.ts +34 -0
  22. package/src/editor-manager/plugin/clearformat.js +13 -4
  23. package/src/editor-manager/plugin/format-painter-actions.d.ts +63 -0
  24. package/src/editor-manager/plugin/format-painter-actions.js +474 -0
  25. package/src/editor-manager/plugin/image.js +0 -1
  26. package/src/editor-manager/plugin/inserthtml-exec.js +1 -1
  27. package/src/editor-manager/plugin/inserthtml.d.ts +1 -1
  28. package/src/editor-manager/plugin/inserthtml.js +18 -10
  29. package/src/editor-manager/plugin/isformatted.js +1 -0
  30. package/src/editor-manager/plugin/link.js +0 -1
  31. package/src/editor-manager/plugin/lists.js +1 -1
  32. package/src/editor-manager/plugin/ms-word-clean-up.js +57 -19
  33. package/src/editor-manager/plugin/selection-commands.d.ts +4 -1
  34. package/src/editor-manager/plugin/selection-commands.js +70 -9
  35. package/src/editor-manager/plugin/video.js +2 -0
  36. package/src/editor-manager/plugin.d.ts +1 -0
  37. package/src/editor-manager/plugin.js +1 -0
  38. package/src/global.js +1 -1
  39. package/src/rich-text-editor/actions/base-quick-toolbar.d.ts +1 -0
  40. package/src/rich-text-editor/actions/base-quick-toolbar.js +21 -1
  41. package/src/rich-text-editor/actions/base-toolbar.js +33 -10
  42. package/src/rich-text-editor/actions/enter-key.js +23 -16
  43. package/src/rich-text-editor/actions/format-painter.d.ts +24 -0
  44. package/src/rich-text-editor/actions/format-painter.js +142 -0
  45. package/src/rich-text-editor/actions/full-screen.js +0 -1
  46. package/src/rich-text-editor/actions/html-editor.d.ts +1 -0
  47. package/src/rich-text-editor/actions/html-editor.js +117 -97
  48. package/src/rich-text-editor/actions/paste-clean-up.js +2 -2
  49. package/src/rich-text-editor/actions/quick-toolbar.js +8 -1
  50. package/src/rich-text-editor/actions/toolbar.js +10 -0
  51. package/src/rich-text-editor/actions.d.ts +1 -0
  52. package/src/rich-text-editor/actions.js +1 -0
  53. package/src/rich-text-editor/base/constant.d.ts +10 -0
  54. package/src/rich-text-editor/base/constant.js +10 -0
  55. package/src/rich-text-editor/base/enum.d.ts +4 -0
  56. package/src/rich-text-editor/base/interface.d.ts +30 -3
  57. package/src/rich-text-editor/base/interface.js +12 -0
  58. package/src/rich-text-editor/base/rich-text-editor-model.d.ts +30 -4
  59. package/src/rich-text-editor/base/rich-text-editor.d.ts +35 -5
  60. package/src/rich-text-editor/base/rich-text-editor.js +46 -10
  61. package/src/rich-text-editor/base/util.js +2 -0
  62. package/src/rich-text-editor/formatter/formatter.js +22 -13
  63. package/src/rich-text-editor/formatter/html-formatter.d.ts +5 -3
  64. package/src/rich-text-editor/formatter/html-formatter.js +7 -5
  65. package/src/rich-text-editor/models/default-locale.js +4 -2
  66. package/src/rich-text-editor/models/items.d.ts +3 -0
  67. package/src/rich-text-editor/models/items.js +32 -0
  68. package/src/rich-text-editor/models/toolbar-settings-model.d.ts +29 -1
  69. package/src/rich-text-editor/models/toolbar-settings.d.ts +24 -1
  70. package/src/rich-text-editor/models/toolbar-settings.js +20 -0
  71. package/src/rich-text-editor/renderer/audio-module.js +6 -3
  72. package/src/rich-text-editor/renderer/image-module.js +11 -6
  73. package/src/rich-text-editor/renderer/link-module.js +2 -1
  74. package/src/rich-text-editor/renderer/table-module.js +18 -6
  75. package/src/rich-text-editor/renderer/toolbar-renderer.js +10 -1
  76. package/src/rich-text-editor/renderer/video-module.js +8 -5
  77. package/src/rich-text-editor/renderer/view-source.js +1 -1
  78. package/styles/bootstrap-dark.css +31 -1
  79. package/styles/bootstrap.css +31 -1
  80. package/styles/bootstrap4.css +31 -1
  81. package/styles/bootstrap5-dark.css +32 -2
  82. package/styles/bootstrap5.css +32 -2
  83. package/styles/fabric-dark.css +31 -1
  84. package/styles/fabric.css +31 -1
  85. package/styles/fluent-dark.css +34 -4
  86. package/styles/fluent.css +34 -4
  87. package/styles/highcontrast-light.css +31 -1
  88. package/styles/highcontrast.css +31 -1
  89. package/styles/material-dark.css +31 -1
  90. package/styles/material.css +31 -1
  91. package/styles/rich-text-editor/_bootstrap-dark-definition.scss +25 -1
  92. package/styles/rich-text-editor/_bootstrap-definition.scss +25 -1
  93. package/styles/rich-text-editor/_bootstrap4-definition.scss +25 -1
  94. package/styles/rich-text-editor/_bootstrap5-definition.scss +28 -5
  95. package/styles/rich-text-editor/_fabric-dark-definition.scss +25 -1
  96. package/styles/rich-text-editor/_fabric-definition.scss +25 -1
  97. package/styles/rich-text-editor/_fluent-definition.scss +30 -7
  98. package/styles/rich-text-editor/_fusionnew-definition.scss +26 -3
  99. package/styles/rich-text-editor/_highcontrast-definition.scss +25 -1
  100. package/styles/rich-text-editor/_highcontrast-light-definition.scss +25 -1
  101. package/styles/rich-text-editor/_layout.scss +47 -15
  102. package/styles/rich-text-editor/_material-dark-definition.scss +26 -1
  103. package/styles/rich-text-editor/_material-definition.scss +25 -1
  104. package/styles/rich-text-editor/_tailwind-definition.scss +28 -5
  105. package/styles/rich-text-editor/_theme.scss +54 -6
  106. package/styles/rich-text-editor/bootstrap-dark.css +31 -1
  107. package/styles/rich-text-editor/bootstrap.css +31 -1
  108. package/styles/rich-text-editor/bootstrap4.css +31 -1
  109. package/styles/rich-text-editor/bootstrap5-dark.css +32 -2
  110. package/styles/rich-text-editor/bootstrap5.css +32 -2
  111. package/styles/rich-text-editor/fabric-dark.css +31 -1
  112. package/styles/rich-text-editor/fabric.css +31 -1
  113. package/styles/rich-text-editor/fluent-dark.css +34 -4
  114. package/styles/rich-text-editor/fluent.css +34 -4
  115. package/styles/rich-text-editor/highcontrast-light.css +31 -1
  116. package/styles/rich-text-editor/highcontrast.css +31 -1
  117. package/styles/rich-text-editor/icons/_bootstrap-dark.scss +8 -0
  118. package/styles/rich-text-editor/icons/_bootstrap.scss +8 -0
  119. package/styles/rich-text-editor/icons/_bootstrap4.scss +8 -0
  120. package/styles/rich-text-editor/icons/_bootstrap5.scss +8 -0
  121. package/styles/rich-text-editor/icons/_fabric-dark.scss +8 -0
  122. package/styles/rich-text-editor/icons/_fabric.scss +8 -0
  123. package/styles/rich-text-editor/icons/_fluent.scss +8 -0
  124. package/styles/rich-text-editor/icons/_fusionnew.scss +8 -0
  125. package/styles/rich-text-editor/icons/_highcontrast-light.scss +8 -0
  126. package/styles/rich-text-editor/icons/_highcontrast.scss +8 -0
  127. package/styles/rich-text-editor/icons/_material-dark.scss +8 -0
  128. package/styles/rich-text-editor/icons/_material.scss +8 -0
  129. package/styles/rich-text-editor/icons/_material3.scss +8 -0
  130. package/styles/rich-text-editor/icons/_tailwind.scss +8 -0
  131. package/styles/rich-text-editor/material-dark.css +31 -1
  132. package/styles/rich-text-editor/material.css +31 -1
  133. package/styles/rich-text-editor/tailwind-dark.css +31 -1
  134. package/styles/rich-text-editor/tailwind.css +31 -1
  135. package/styles/tailwind-dark.css +31 -1
  136. package/styles/tailwind.css +31 -1
  137. package/GitLeaksReport.json +0 -1
  138. package/gitleaks-ci/gitleaks +0 -0
  139. package/gitleaks-ci.tar.gz +0 -0
  140. package/styles/rich-text-editor/_material3-definition.scss +0 -196
@@ -0,0 +1,142 @@
1
+ import { addClass, isNullOrUndefined as isNOU, removeClass } from '@syncfusion/ej2-base';
2
+ import * as events from '../base/constant';
3
+ var FormatPainter = /** @class */ (function () {
4
+ function FormatPainter(parent) {
5
+ this.isSticky = false;
6
+ this.isActive = false;
7
+ this.parent = parent;
8
+ this.addEventListener();
9
+ }
10
+ FormatPainter.prototype.addEventListener = function () {
11
+ this.parent.on(events.formatPainterClick, this.toolbarClick, this);
12
+ this.parent.on(events.formatPainterDoubleClick, this.toolbarDoubleClick, this);
13
+ this.parent.on(events.editAreaClick, this.editAreaClick, this);
14
+ this.parent.on(events.keyDown, this.onKeyDown, this);
15
+ this.parent.on(events.destroy, this.destroy, this);
16
+ };
17
+ FormatPainter.prototype.toolbarClick = function (args) {
18
+ this.isActive = true;
19
+ this.parent.focusIn();
20
+ this.actionHandler(args, 'click');
21
+ };
22
+ FormatPainter.prototype.toolbarDoubleClick = function (args) {
23
+ this.isActive = true;
24
+ this.isSticky = true;
25
+ this.parent.focusIn();
26
+ this.actionHandler(args, 'dbClick');
27
+ };
28
+ FormatPainter.prototype.onKeyDown = function (event) {
29
+ var originalEvent = event.args;
30
+ if ((originalEvent.ctrlKey && originalEvent.shiftKey && (originalEvent.action === 'format-copy' || originalEvent.action === 'format-paste'))
31
+ || (originalEvent.action === 'escape' && (this.previousAction === 'format-copy' || this.previousAction === 'format-paste'))) {
32
+ if (!isNOU(originalEvent.key) && originalEvent.key.toLowerCase() === 'c') {
33
+ originalEvent.preventDefault();
34
+ }
35
+ if (!isNOU(originalEvent.key) && originalEvent.key.toLowerCase() === 'v' &&
36
+ this.previousAction === 'format-copy' || this.previousAction === 'format-paste' || this.isSticky) {
37
+ originalEvent.preventDefault();
38
+ }
39
+ this.actionHandler(event, 'keyBoard');
40
+ }
41
+ };
42
+ FormatPainter.prototype.actionHandler = function (event, type) {
43
+ var action;
44
+ var isKeyboard = false;
45
+ var originalEvent;
46
+ var args;
47
+ var item;
48
+ switch (type) {
49
+ case 'dbClick':
50
+ args = event.args;
51
+ item = args.item;
52
+ originalEvent = event.args.originalEvent;
53
+ action = 'format-copy';
54
+ break;
55
+ case 'keyBoard':
56
+ args = null;
57
+ originalEvent = event.args;
58
+ isKeyboard = true;
59
+ action = event.args.action;
60
+ if (action === 'escape') {
61
+ this.isSticky = false;
62
+ this.isActive = false;
63
+ }
64
+ break;
65
+ case 'click':
66
+ args = event.args;
67
+ item = args.item;
68
+ originalEvent = event.args.originalEvent;
69
+ action = 'format-copy';
70
+ break;
71
+ case 'docClick':
72
+ originalEvent = event;
73
+ action = 'format-paste';
74
+ break;
75
+ }
76
+ this.updateCursor(isKeyboard);
77
+ var enable = type === 'docClick' || action === 'escape' ? false : true;
78
+ this.updateToolbarBtn(enable);
79
+ if (isNOU(item)) {
80
+ item = {
81
+ command: 'FormatPainter',
82
+ subCommand: 'FormatPainter'
83
+ };
84
+ }
85
+ var actionBeginArgs = {
86
+ requestType: 'FormatPainter', originalEvent: originalEvent, name: action, item: item
87
+ };
88
+ var value = {
89
+ formatPainterAction: action
90
+ };
91
+ this.parent.formatter.process(this.parent, actionBeginArgs, originalEvent, value);
92
+ this.previousAction = action;
93
+ };
94
+ FormatPainter.prototype.updateCursor = function (isKeyboard) {
95
+ if (!this.parent.inputElement.classList.contains('e-rte-cursor-brush') && !isKeyboard) {
96
+ addClass([this.parent.inputElement], 'e-rte-cursor-brush');
97
+ }
98
+ else if (!this.isSticky) {
99
+ removeClass([this.parent.inputElement], 'e-rte-cursor-brush');
100
+ }
101
+ };
102
+ FormatPainter.prototype.updateToolbarBtn = function (enable) {
103
+ var toolbarBtn = this.parent.element.querySelector('.e-rte-format-painter').parentElement.parentElement;
104
+ if (enable) {
105
+ addClass([toolbarBtn], 'e-active');
106
+ }
107
+ else if (!this.isSticky) {
108
+ removeClass([toolbarBtn], 'e-active');
109
+ }
110
+ };
111
+ FormatPainter.prototype.editAreaClick = function (args) {
112
+ if (this.isActive) {
113
+ if (!this.isSticky) {
114
+ this.isActive = false;
115
+ }
116
+ this.actionHandler(args, 'docClick');
117
+ this.updateToolbarBtn(false);
118
+ }
119
+ };
120
+ FormatPainter.prototype.destroy = function () {
121
+ /**Removeeventlistener */
122
+ if (this.parent.isDestroyed) {
123
+ return;
124
+ }
125
+ this.parent.off(events.formatPainterClick, this.toolbarClick);
126
+ this.parent.off(events.editAreaClick, this.editAreaClick);
127
+ this.parent.off(events.formatPainterDoubleClick, this.toolbarDoubleClick);
128
+ this.parent.off(events.keyDown, this.onKeyDown);
129
+ this.parent.off(events.destroy, this.destroy);
130
+ };
131
+ /**
132
+ * For internal use only - Get the module name.
133
+ *
134
+ * @returns {void}
135
+ * @hidden
136
+ */
137
+ FormatPainter.prototype.getModuleName = function () {
138
+ return 'formatPainter';
139
+ };
140
+ return FormatPainter;
141
+ }());
142
+ export { FormatPainter };
@@ -106,7 +106,6 @@ var FullScreen = /** @class */ (function () {
106
106
  _this.parent.toolbarModule.addFixedTBarClass();
107
107
  }
108
108
  }
109
- _this.parent.refreshUI();
110
109
  _this.parent.trigger(events.actionComplete, { requestType: 'Minimize', targetItem: 'Minimize', args: event });
111
110
  }
112
111
  });
@@ -21,6 +21,7 @@ export declare class HtmlEditor {
21
21
  private isImageDelete;
22
22
  private saveSelection;
23
23
  xhtmlValidation: XhtmlValidation;
24
+ private clickTimeout;
24
25
  constructor(parent?: IRichTextEditor, serviceLocator?: ServiceLocator);
25
26
  /**
26
27
  * Destroys the Markdown.
@@ -561,117 +561,136 @@ var HtmlEditor = /** @class */ (function () {
561
561
  }
562
562
  };
563
563
  HtmlEditor.prototype.onToolbarClick = function (args) {
564
+ var _this = this;
564
565
  var save;
565
566
  var selectNodeEle;
566
567
  var selectParentEle;
567
568
  var item = args.item;
568
569
  var closestElement = closest(args.originalEvent.target, '.e-rte-quick-popup');
569
- if (closestElement && !closestElement.classList.contains('e-rte-inline-popup')) {
570
- if (!(item.subCommand === 'SourceCode' || item.subCommand === 'Preview' ||
571
- item.subCommand === 'FontColor' || item.subCommand === 'BackgroundColor')) {
572
- if (isIDevice() && item.command === 'Images') {
573
- this.nodeSelectionObj.restore();
574
- }
575
- var range = this.nodeSelectionObj.getRange(this.parent.contentModule.getDocument());
576
- save = this.nodeSelectionObj.save(range, this.parent.contentModule.getDocument());
577
- selectNodeEle = this.nodeSelectionObj.getNodeCollection(range);
578
- selectParentEle = this.nodeSelectionObj.getParentNodeCollection(range);
579
- }
580
- if (item.command === 'Images') {
581
- this.parent.notify(events.imageToolbarAction, {
582
- member: 'image', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
583
- });
584
- }
585
- if (item.command === 'Audios') {
586
- this.parent.notify(events.audioToolbarAction, {
587
- member: 'audio', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
588
- });
589
- }
590
- if (item.command === 'Videos') {
591
- this.parent.notify(events.videoToolbarAction, {
592
- member: 'video', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
593
- });
594
- }
595
- if (item.command === 'Links') {
596
- this.parent.notify(events.linkToolbarAction, {
597
- member: 'link', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
598
- });
599
- }
600
- if (item.command === 'Table') {
601
- this.parent.notify(events.tableToolbarAction, {
602
- member: 'table', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
603
- });
604
- }
605
- }
606
- else {
607
- var linkDialog = document.getElementById(this.parent.getID() + '_rtelink');
608
- var imageDialog = document.getElementById(this.parent.getID() + '_image');
609
- if (!(item.subCommand === 'SourceCode' || item.subCommand === 'Preview' ||
610
- item.subCommand === 'FontColor' || item.subCommand === 'BackgroundColor')) {
611
- var range = this.nodeSelectionObj.getRange(this.parent.contentModule.getDocument());
612
- if (isNullOrUndefined(linkDialog) && isNullOrUndefined(imageDialog)) {
570
+ if (item.command !== 'FormatPainter') {
571
+ if (closestElement && !closestElement.classList.contains('e-rte-inline-popup')) {
572
+ if (!(item.subCommand === 'SourceCode' || item.subCommand === 'Preview' ||
573
+ item.subCommand === 'FontColor' || item.subCommand === 'BackgroundColor')) {
574
+ if (isIDevice() && item.command === 'Images') {
575
+ this.nodeSelectionObj.restore();
576
+ }
577
+ var range = this.nodeSelectionObj.getRange(this.parent.contentModule.getDocument());
613
578
  save = this.nodeSelectionObj.save(range, this.parent.contentModule.getDocument());
579
+ selectNodeEle = this.nodeSelectionObj.getNodeCollection(range);
580
+ selectParentEle = this.nodeSelectionObj.getParentNodeCollection(range);
614
581
  }
615
- selectNodeEle = this.nodeSelectionObj.getNodeCollection(range);
616
- selectParentEle = this.nodeSelectionObj.getParentNodeCollection(range);
617
- }
618
- switch (item.subCommand) {
619
- case 'Maximize':
620
- this.parent.notify(events.enableFullScreen, { args: args });
621
- break;
622
- case 'Minimize':
623
- this.parent.notify(events.disableFullScreen, { args: args });
624
- break;
625
- case 'CreateLink':
626
- this.parent.notify(events.insertLink, {
627
- member: 'link', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
628
- });
629
- break;
630
- case 'RemoveLink':
631
- this.parent.notify(events.unLink, {
632
- member: 'link', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
633
- });
634
- break;
635
- case 'Print':
636
- this.parent.print();
637
- break;
638
- case 'Image':
639
- this.parent.notify(events.insertImage, {
582
+ if (item.command === 'Images') {
583
+ this.parent.notify(events.imageToolbarAction, {
640
584
  member: 'image', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
641
585
  });
642
- break;
643
- case 'Audio':
644
- this.parent.notify(events.insertAudio, {
586
+ }
587
+ if (item.command === 'Audios') {
588
+ this.parent.notify(events.audioToolbarAction, {
645
589
  member: 'audio', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
646
590
  });
647
- break;
648
- case 'Video':
649
- this.parent.notify(events.insertVideo, {
591
+ }
592
+ if (item.command === 'Videos') {
593
+ this.parent.notify(events.videoToolbarAction, {
650
594
  member: 'video', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
651
595
  });
652
- break;
653
- case 'CreateTable':
654
- this.parent.notify(events.createTable, {
655
- member: 'table', args: args, selection: save
596
+ }
597
+ if (item.command === 'Links') {
598
+ this.parent.notify(events.linkToolbarAction, {
599
+ member: 'link', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
600
+ });
601
+ }
602
+ if (item.command === 'Table') {
603
+ this.parent.notify(events.tableToolbarAction, {
604
+ member: 'table', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
656
605
  });
657
- break;
658
- case 'SourceCode':
659
- this.parent.notify(events.sourceCode, { member: 'viewSource', args: args });
660
- break;
661
- case 'Preview':
662
- this.parent.notify(events.updateSource, { member: 'updateSource', args: args });
663
- break;
664
- case 'FontColor':
665
- case 'BackgroundColor':
666
- break;
667
- case 'File':
668
- this.parent.notify(events.renderFileManager, {
669
- member: 'fileManager', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
606
+ }
607
+ }
608
+ else {
609
+ var linkDialog = document.getElementById(this.parent.getID() + '_rtelink');
610
+ var imageDialog = document.getElementById(this.parent.getID() + '_image');
611
+ if (!(item.subCommand === 'SourceCode' || item.subCommand === 'Preview' ||
612
+ item.subCommand === 'FontColor' || item.subCommand === 'BackgroundColor')) {
613
+ var range = this.nodeSelectionObj.getRange(this.parent.contentModule.getDocument());
614
+ if (isNullOrUndefined(linkDialog) && isNullOrUndefined(imageDialog)) {
615
+ save = this.nodeSelectionObj.save(range, this.parent.contentModule.getDocument());
616
+ }
617
+ selectNodeEle = this.nodeSelectionObj.getNodeCollection(range);
618
+ selectParentEle = this.nodeSelectionObj.getParentNodeCollection(range);
619
+ }
620
+ switch (item.subCommand) {
621
+ case 'Maximize':
622
+ this.parent.notify(events.enableFullScreen, { args: args });
623
+ break;
624
+ case 'Minimize':
625
+ this.parent.notify(events.disableFullScreen, { args: args });
626
+ break;
627
+ case 'CreateLink':
628
+ this.parent.notify(events.insertLink, {
629
+ member: 'link', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
630
+ });
631
+ break;
632
+ case 'RemoveLink':
633
+ this.parent.notify(events.unLink, {
634
+ member: 'link', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
635
+ });
636
+ break;
637
+ case 'Print':
638
+ this.parent.print();
639
+ break;
640
+ case 'Image':
641
+ this.parent.notify(events.insertImage, {
642
+ member: 'image', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
643
+ });
644
+ break;
645
+ case 'Audio':
646
+ this.parent.notify(events.insertAudio, {
647
+ member: 'audio', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
648
+ });
649
+ break;
650
+ case 'Video':
651
+ this.parent.notify(events.insertVideo, {
652
+ member: 'video', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
653
+ });
654
+ break;
655
+ case 'CreateTable':
656
+ this.parent.notify(events.createTable, {
657
+ member: 'table', args: args, selection: save
658
+ });
659
+ break;
660
+ case 'SourceCode':
661
+ this.parent.notify(events.sourceCode, { member: 'viewSource', args: args });
662
+ break;
663
+ case 'Preview':
664
+ this.parent.notify(events.updateSource, { member: 'updateSource', args: args });
665
+ break;
666
+ case 'FontColor':
667
+ case 'BackgroundColor':
668
+ break;
669
+ case 'File':
670
+ this.parent.notify(events.renderFileManager, {
671
+ member: 'fileManager', args: args, selectNode: selectNodeEle, selection: save, selectParent: selectParentEle
672
+ });
673
+ break;
674
+ default:
675
+ this.parent.formatter.process(this.parent, args, args.originalEvent, null);
676
+ break;
677
+ }
678
+ }
679
+ }
680
+ else {
681
+ if (args.originalEvent.detail === 1) {
682
+ clearTimeout(this.clickTimeout);
683
+ this.clickTimeout = setTimeout(function () {
684
+ _this.parent.notify(events.formatPainterClick, {
685
+ member: 'formatPainter', args: args
670
686
  });
671
- break;
672
- default:
673
- this.parent.formatter.process(this.parent, args, args.originalEvent, null);
674
- break;
687
+ }, 200);
688
+ }
689
+ else {
690
+ clearTimeout(this.clickTimeout);
691
+ this.parent.notify(events.formatPainterDoubleClick, {
692
+ member: 'formatPainter', args: args
693
+ });
675
694
  }
676
695
  }
677
696
  };
@@ -714,7 +733,8 @@ var HtmlEditor = /** @class */ (function () {
714
733
  var formatterClass = new HTMLFormatter({
715
734
  currentDocument: this.contentRenderer.getDocument(),
716
735
  element: editElement,
717
- options: option
736
+ options: option,
737
+ formatPainterSettings: this.parent.formatPainterSettings
718
738
  });
719
739
  this.parent.setProperties({ formatter: formatterClass }, true);
720
740
  }
@@ -651,7 +651,7 @@ var PasteCleanup = /** @class */ (function () {
651
651
  this.parent.formatter.editorManager.execCommand('inserthtml', 'pasteCleanup', args, function (returnArgs) {
652
652
  extend(args, { elements: returnArgs.elements, imageElements: returnArgs.imgElem }, true);
653
653
  _this.parent.formatter.onSuccess(_this.parent, args);
654
- }, clipBoardElem);
654
+ }, clipBoardElem, null, null, this.parent.enterKey);
655
655
  this.removeTempClass();
656
656
  this.parent.notify(events.toolbarRefresh, {});
657
657
  this.imgUploading(this.parent.inputElement);
@@ -721,7 +721,7 @@ var PasteCleanup = /** @class */ (function () {
721
721
  this.parent.formatter.editorManager.execCommand('inserthtml', 'pasteCleanup', args, function (returnArgs) {
722
722
  extend(args, { elements: returnArgs.elements, imageElements: returnArgs.imgElem }, true);
723
723
  _this.parent.formatter.onSuccess(_this.parent, args);
724
- }, clipBoardElem);
724
+ }, clipBoardElem, null, null, this.parent.enterKey);
725
725
  this.removeTempClass();
726
726
  }
727
727
  else {
@@ -250,10 +250,17 @@ var QuickToolbar = /** @class */ (function () {
250
250
  };
251
251
  QuickToolbar.prototype.keyUpHandler = function (e) {
252
252
  if (this.parent.inlineMode.enable && !Browser.isDevice) {
253
+ var args = e.args;
253
254
  if (this.parent.inlineMode.onSelection) {
255
+ if (this.parent.getSelection().length > 0) {
256
+ if ((args.ctrlKey && args.keyCode === 65) || (args.shiftKey && (args.keyCode === 33 || args.keyCode === 34 ||
257
+ args.keyCode === 35 || args.keyCode === 36 || args.keyCode === 37 || args.keyCode === 38 ||
258
+ args.keyCode === 39 || args.keyCode === 40))) {
259
+ this.showInlineQTBar(this.offsetX, this.offsetY, args.target);
260
+ }
261
+ }
254
262
  return;
255
263
  }
256
- var args = e.args;
257
264
  this.deBounce(this.offsetX, this.offsetY, args.target);
258
265
  }
259
266
  };
@@ -318,6 +318,7 @@ var Toolbar = /** @class */ (function () {
318
318
  args.baseToolbar.toolbarObj.items[index].tooltipText = item.tooltip;
319
319
  args.baseToolbar.toolbarObj.items[index].subCommand = item.subCommand;
320
320
  args.baseToolbar.toolbarObj.dataBind();
321
+ args.baseToolbar.toolbarObj.refreshOverflow();
321
322
  }
322
323
  else {
323
324
  this.addTBarItem(args, 0);
@@ -458,7 +459,11 @@ var Toolbar = /** @class */ (function () {
458
459
 
459
460
  */
460
461
  Toolbar.prototype.refreshToolbarOverflow = function () {
462
+ this.parent.element.classList.remove(classes.CLS_RTL);
461
463
  this.baseToolbar.toolbarObj.refreshOverflow();
464
+ if (this.parent.enableRtl) {
465
+ this.parent.element.classList.add(classes.CLS_RTL);
466
+ }
462
467
  };
463
468
  Toolbar.prototype.isToolbarDestroyed = function () {
464
469
  return this.baseToolbar.toolbarObj && !this.baseToolbar.toolbarObj.isDestroyed;
@@ -557,6 +562,11 @@ var Toolbar = /** @class */ (function () {
557
562
  Toolbar.prototype.toolbarClickHandler = function (e) {
558
563
  var trg = closest(e.originalEvent.target, '.e-hor-nav');
559
564
  if (trg && this.parent.toolbarSettings.type === ToolbarType.Expand && !isNOU(trg)) {
565
+ var extendedTbar = this.tbElement.querySelector('.e-toolbar-extended');
566
+ if (!isNOU(extendedTbar)) {
567
+ setStyleAttribute(extendedTbar, { maxHeight: '', display: 'block' });
568
+ setStyleAttribute(extendedTbar, { maxHeight: extendedTbar.offsetHeight + 'px', display: '' });
569
+ }
560
570
  if (!trg.classList.contains('e-nav-active')) {
561
571
  removeClass([this.tbElement], [classes.CLS_EXPAND_OPEN]);
562
572
  this.parent.setContentHeight('toolbar', false);
@@ -21,3 +21,4 @@ export * from './actions/full-screen';
21
21
  export * from './actions/html-attributes';
22
22
  export * from './actions/html-toolbar-status';
23
23
  export * from './actions/xhtml-validation';
24
+ export * from './actions/format-painter';
@@ -21,3 +21,4 @@ export * from './actions/full-screen';
21
21
  export * from './actions/html-attributes';
22
22
  export * from './actions/html-toolbar-status';
23
23
  export * from './actions/xhtml-validation';
24
+ export * from './actions/format-painter';
@@ -714,6 +714,16 @@ export declare const bindCssClass: string;
714
714
  /**
715
715
  * @hidden
716
716
 
717
+ */
718
+ export declare const formatPainterClick: string;
719
+ /**
720
+ * @hidden
721
+
722
+ */
723
+ export declare const formatPainterDoubleClick: string;
724
+ /**
725
+ * @hidden
726
+
717
727
  */
718
728
  export declare const blockEmptyNodes: string;
719
729
  /**
@@ -714,6 +714,16 @@ export var bindCssClass = 'closeTableDialog';
714
714
  /**
715
715
  * @hidden
716
716
 
717
+ */
718
+ export var formatPainterClick = 'formatPainterClick';
719
+ /**
720
+ * @hidden
721
+
722
+ */
723
+ export var formatPainterDoubleClick = 'formatPainterDoubleClick';
724
+ /**
725
+ * @hidden
726
+
717
727
  */
718
728
  export var blockEmptyNodes = "address:empty, article:empty, aside:empty, blockquote:empty,\n details:empty, dd:empty, div:empty, dl:empty, dt:empty, fieldset:empty, footer:empty,form:empty, h1:empty,\n h2:empty, h3:empty, h4:empty, h5:empty, h6:empty, header:empty, hgroup:empty, li:empty, main:empty, nav:empty,\n noscript:empty, output:empty, p:empty, pre:empty, section:empty, td:empty, th:empty";
719
729
  /**
@@ -60,3 +60,7 @@ export declare enum DialogType {
60
60
  * Defines types to be used to configure the toolbar items.
61
61
  */
62
62
  export declare type ToolbarItems = 'alignments' | 'justifyLeft' | 'justifyCenter' | 'justifyRight' | 'justifyFull' | 'fontName' | 'fontSize' | 'fontColor' | 'backgroundColor' | 'bold' | 'italic' | 'underline' | 'strikeThrough' | 'clearFormat' | 'clearAll' | 'cut' | 'copy' | 'paste' | 'unorderedList' | 'orderedList' | 'indent' | 'outdent' | 'undo' | 'redo' | 'superScript' | 'subScript' | 'createLink' | 'openLink' | 'editLink' | 'image' | 'createTable' | 'removeTable' | 'replace' | 'align' | 'caption' | 'remove' | 'openImageLink' | 'editImageLink' | 'removeImageLink' | 'insertLink' | 'display' | 'altText' | 'dimension' | 'fullScreen' | 'maximize' | 'minimize' | 'lowerCase' | 'upperCase' | 'print' | 'formats' | 'sourceCode' | 'preview' | 'viewSide' | 'insertCode' | 'tableHeader' | 'tableRemove' | 'tableRows' | 'tableColumns' | 'tableCellBackground' | 'tableCellHorizontalAlign' | 'tableCellVerticalAlign' | 'tableEditProperties' | 'styles' | 'removeLink' | 'merge';
63
+ /**
64
+ * Defines the context or contexts in which styles will be copied
65
+ */
66
+ export declare type FormatPainterContext = 'Text' | 'List' | 'Table';
@@ -10,7 +10,7 @@ import { BaseQuickToolbar } from '../actions/base-quick-toolbar';
10
10
  import { NodeSelection } from '../../selection/selection';
11
11
  import { EditorMode, EnterKey, ShiftEnterKey } from './../../common/types';
12
12
  import { MarkdownSelection } from './../../markdown-parser/plugin/markdown-selection';
13
- import { ToolbarSettingsModel, IFrameSettingsModel, ImageSettingsModel, AudioSettingsModel, VideoSettingsModel, TableSettingsModel } from '../models/models';
13
+ import { ToolbarSettingsModel, IFrameSettingsModel, ImageSettingsModel, AudioSettingsModel, VideoSettingsModel, TableSettingsModel, FormatPainterSettingsModel } from '../models/models';
14
14
  import { QuickToolbarSettingsModel, InlineModeModel, PasteCleanupSettingsModel, FileManagerSettingsModel } from '../models/models';
15
15
  import { Count } from '../actions/count';
16
16
  import { ColorPicker, ColorPickerEventArgs, ColorPickerModel, FileInfo } from '@syncfusion/ej2-inputs';
@@ -36,6 +36,7 @@ import { Resize } from '../actions/resize';
36
36
  import { FileManager } from '../actions/file-manager';
37
37
  import { NodeCutter, DOMNode } from '../../editor-manager';
38
38
  import { EnterKeyAction } from '../actions/enter-key';
39
+ import { FormatPainter } from '../actions/format-painter';
39
40
  /**
40
41
  * Specifies Rich Text Editor interfaces.
41
42
  *
@@ -82,6 +83,17 @@ export interface IRichTextEditor extends Component<HTMLElement> {
82
83
  fileManagerSettings: FileManagerSettingsModel;
83
84
  tableSettings: TableSettingsModel;
84
85
  pasteCleanupSettings: PasteCleanupSettingsModel;
86
+ /**
87
+ * Configure the format painter settings of the RTE.
88
+ *
89
+ * @default
90
+ * {
91
+ * allowedContext: ['Text', 'List', 'Table'],
92
+ * allowedFormats: 'b; em; font; sub; sup; kbd; i; s; u; code; strong; span; p; div; h1; h2; h3; h4; h5; h6; blockquote; table; thead; tbody; tr; td; th; ol; ul; li; pre;',
93
+ * deniedFormats: null
94
+ * }
95
+ */
96
+ formatPainterSettings: FormatPainterSettingsModel;
85
97
  floatingToolbarOffset?: number;
86
98
  showCharCount?: boolean;
87
99
  enableTabKey?: boolean;
@@ -98,6 +110,7 @@ export interface IRichTextEditor extends Component<HTMLElement> {
98
110
  format?: IFormatProperties;
99
111
  value?: string;
100
112
  saveInterval?: number;
113
+ showTooltip?: boolean;
101
114
  isBlur?: boolean;
102
115
  isRTE?: boolean;
103
116
  contentModule?: IRenderer;
@@ -130,6 +143,7 @@ export interface IRichTextEditor extends Component<HTMLElement> {
130
143
  markdownEditorModule: MarkdownEditor;
131
144
  htmlEditorModule: HtmlEditor;
132
145
  countModule?: Count;
146
+ formatPainterModule?: FormatPainter;
133
147
  serviceLocator?: ServiceLocator;
134
148
  setEnable?(): void;
135
149
  setReadOnly?(isInit?: boolean): void;
@@ -178,6 +192,7 @@ export interface IRichTextEditor extends Component<HTMLElement> {
178
192
  getInsertVidMaxWidth?(): string | number;
179
193
  getSelection(): string;
180
194
  currentTarget: HTMLElement;
195
+ focusIn(): void;
181
196
  }
182
197
  /**
183
198
 
@@ -237,6 +252,7 @@ export interface NotifyArgs {
237
252
  insertElement?: Element;
238
253
  touchData?: ITouchData;
239
254
  allowedStylePropertiesArray?: string[];
255
+ formatPainterSettings?: FormatPainterSettingsModel;
240
256
  }
241
257
  /**
242
258
  * Provides information about the current and previous cssClass property .
@@ -475,6 +491,16 @@ export interface ITableCommandsArgs {
475
491
  /** Defines the instance of the current selection */
476
492
  selection?: NodeSelection;
477
493
  }
494
+ /**
495
+
496
+ */
497
+ export interface IFormatPainterArgs {
498
+ /**
499
+ * Defines the action to be performed.
500
+ * Allowed values are 'format-copy', 'format-paste', 'escape'.
501
+ */
502
+ formatPainterAction: string;
503
+ }
478
504
  /**
479
505
 
480
506
  */
@@ -496,7 +522,7 @@ export interface ITableArgs {
496
522
  */
497
523
  export interface ITableNotifyArgs {
498
524
  module?: string;
499
- args?: ClickEventArgs | MouseEvent | KeyboardEventArgs;
525
+ args?: ClickEventArgs | MouseEvent | KeyboardEventArgs | TouchEvent;
500
526
  selection?: NodeSelection;
501
527
  selectNode?: Node[];
502
528
  selectParent?: Node[];
@@ -843,6 +869,7 @@ export interface IHtmlFormatterModel {
843
869
  options?: {
844
870
  [key: string]: number;
845
871
  };
872
+ formatPainterSettings?: FormatPainterSettingsModel;
846
873
  }
847
874
  /**
848
875
 
@@ -1275,7 +1302,7 @@ export declare const executeGroup: {
1275
1302
  /**
1276
1303
  * Defines types to be used as CommandName.
1277
1304
  */
1278
- export declare type CommandName = 'bold' | 'italic' | 'underline' | 'strikeThrough' | 'superscript' | 'subscript' | 'uppercase' | 'lowercase' | 'fontColor' | 'fontName' | 'fontSize' | 'backColor' | 'justifyCenter' | 'justifyFull' | 'justifyLeft' | 'justifyRight' | 'undo' | 'createLink' | 'formatBlock' | 'heading' | 'indent' | 'insertHTML' | 'insertOrderedList' | 'insertUnorderedList' | 'insertParagraph' | 'outdent' | 'redo' | 'removeFormat' | 'insertText' | 'insertImage' | 'insertAudio' | 'insertVideo' | 'insertHorizontalRule' | 'insertBrOnReturn' | 'insertCode' | 'insertTable' | 'editImage' | 'editLink';
1305
+ export declare type CommandName = 'bold' | 'italic' | 'underline' | 'strikeThrough' | 'superscript' | 'subscript' | 'uppercase' | 'lowercase' | 'fontColor' | 'fontName' | 'fontSize' | 'backColor' | 'justifyCenter' | 'justifyFull' | 'justifyLeft' | 'justifyRight' | 'undo' | 'createLink' | 'formatBlock' | 'heading' | 'indent' | 'insertHTML' | 'insertOrderedList' | 'insertUnorderedList' | 'insertParagraph' | 'outdent' | 'redo' | 'removeFormat' | 'insertText' | 'insertImage' | 'insertAudio' | 'insertVideo' | 'insertHorizontalRule' | 'insertBrOnReturn' | 'insertCode' | 'insertTable' | 'editImage' | 'editLink' | 'applyFormatPainter' | 'copyFormatPainter' | 'escapeFormatPainter';
1279
1306
  /**
1280
1307
  * @hidden
1281
1308