From f9ddfb48c9767f60b6691b2a173dc758c8306b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 22 Apr 2024 14:37:29 +0200 Subject: [PATCH] MOBILE-4565 rte: Fix rte focus and blur problems --- ...-forum-activity-in-app-reply-a-post_14.png | Bin 22278 -> 22945 bytes .../core-editor-rich-text-editor.html | 3 +- .../rich-text-editor/rich-text-editor.scss | 15 ++- .../rich-text-editor/rich-text-editor.ts | 88 +++++++++++------- src/core/features/login/pages/site/site.ts | 2 +- src/theme/theme.base.scss | 2 +- 6 files changed, 72 insertions(+), 38 deletions(-) diff --git a/src/addons/mod/forum/tests/behat/snapshots/test-basic-usage-of-forum-activity-in-app-reply-a-post_14.png b/src/addons/mod/forum/tests/behat/snapshots/test-basic-usage-of-forum-activity-in-app-reply-a-post_14.png index c09abb97e00174132b7f4c3ef0869000f52527ce..2c3a9cfe55c0f0fae921c13587e53c5fb5edc5d3 100644 GIT binary patch literal 22945 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 i|Iu~-4FWI8oc$?6z
+ (blur)="hideToolbar($event)" (keydown)="onKeyDown($event)">
Promise; - protected selectionChangeFunction?: () => void; + protected selectionChangeFunction = (): void => this.updateToolbarStyles(); protected languageChangedSubscription?: Subscription; protected resizeListener?: CoreEventObserver; protected domPromise?: CoreCancellablePromise; @@ -226,6 +227,15 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, } ionItem.classList.add('item-rte'); + if (this.editorElement) { + const debounceMutation = CoreUtils.debounce(() => { + this.onChange(); + }, 20); + + this.contentObserver = new MutationObserver(debounceMutation); + this.contentObserver.observe(this.editorElement, { childList: true, subtree: true, characterData: true }); + } + const label = ionItem.querySelector('ion-label'); if (!label) { @@ -253,7 +263,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, protected setListeners(): void { // Listen for changes on the control to update the editor (if it is updated from outside of this component). this.valueChangeSubscription = this.control?.valueChanges.subscribe((newValue) => { - if (this.draftWasRestored && this.originalContent == newValue) { + if (this.draftWasRestored && this.originalContent === newValue) { // A draft was restored and the content hasn't changed in the site. Use the draft value instead of this one. this.control?.setValue(this.lastDraft, { emitEvent: false }); @@ -282,7 +292,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, this.windowResized(); }, 50); - document.addEventListener('selectionchange', this.selectionChangeFunction = () => this.updateToolbarStyles()); + document.addEventListener('selectionchange', this.selectionChangeFunction); this.keyboardObserver = CoreEvents.on(CoreEvents.KEYBOARD_CHANGE, () => { // Opening or closing the keyboard also calls the resize function, but sometimes the resize is called too soon. @@ -304,8 +314,6 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * @param event Event */ onKeyDown(event: KeyboardEvent): void { - this.onChange(); - const shortcutId = this.getShortcutId(event); const commands = this.getShortcutCommands(); const command = commands[shortcutId]; @@ -364,7 +372,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, // Get first children with content, not fixed. let scrollContentHeight = 0; - while (scrollContentHeight == 0 && content?.children) { + while (scrollContentHeight === 0 && content?.children) { const children = Array.from(content.children) .filter((element) => element.slot !== 'fixed' && !element.classList.contains('core-loading-container')); @@ -489,7 +497,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * @param event The event. */ async toggleEditor(event: Event): Promise { - if (event.type == 'keyup' && !this.isValidKeyboardKey(event)) { + if (event.type === 'keyup' && !this.isValidKeyboardKey(event)) { return; } @@ -581,7 +589,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * @returns If value is null only a white space. */ protected isNullOrWhiteSpace(value: string | null | undefined): boolean { - if (value == null || value === undefined) { + if (value === null || value === undefined) { return true; } @@ -602,10 +610,17 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, } if (this.isNullOrWhiteSpace(value)) { - this.editorElement.innerHTML = '

'; + // Avoid loops. + if (this.editorElement.innerHTML !== '

') { + this.editorElement.innerHTML = '

'; + } this.textarea.value = ''; } else { - this.editorElement.innerHTML = value || ''; + value = value || ''; + // Avoid loops. + if (this.editorElement.innerHTML !== value) { + this.editorElement.innerHTML = value; + } this.textarea.value = value; this.treatExternalContent(); } @@ -637,7 +652,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * toolbar styles button when set. */ buttonAction(event: Event, command: string, parameters?: string): void { - if (event.type == 'keyup' && !this.isValidKeyboardKey(event)) { + if (event.type === 'keyup' && !this.isValidKeyboardKey(event)) { return; } @@ -659,7 +674,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * @param command.parameters Command parameters. */ protected executeCommand({ name: command, parameters }: EditorCommand): void { - if (parameters == 'block') { + if (parameters === 'block') { // eslint-disable-next-line deprecation/deprecation document.execCommand('formatBlock', false, '<' + command + '>'); @@ -676,7 +691,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, // Modern browsers are using non a11y tags, so replace them. if (command === 'bold') { this.replaceTags(['b'], ['strong']); - } else if (command == 'italic') { + } else if (command === 'italic') { this.replaceTags(['i'], ['em']); } } @@ -715,14 +730,14 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * @param event Event. * @param force If true it will not check the target of the event. */ - hideToolbar(event: Event, force = false): void { + hideToolbar(event: FocusEvent | KeyboardEvent | MouseEvent, force = false): void { if (!force && event.target && this.element.contains(event.target as HTMLElement)) { // Do not hide if clicked inside the editor area, except forced. return; } - if (event.type == 'keyup' && !this.isValidKeyboardKey(event)) { + if (event.type === 'keyup' && !this.isValidKeyboardKey(event)) { return; } @@ -748,7 +763,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, /** * Show the toolbar. */ - showToolbar(event: Event): void { + showToolbar(event: FocusEvent): void { this.updateToolbarButtons(); this.element.classList.add('ion-touched'); @@ -779,14 +794,14 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * @param event Event. */ downAction(event: Event): void { - if (event.type == 'keydown' && !this.isValidKeyboardKey(event)) { + if (event.type === 'keydown' && !this.isValidKeyboardKey(event)) { return; } const selection = window.getSelection()?.toString(); // When RTE is focused with a whole paragraph in desktop the stopBubble will not fire click. - if (CorePlatform.isMobile() || !this.rteEnabled || document.activeElement != this.editorElement || selection == '') { + if (CorePlatform.isMobile() || !this.rteEnabled || document.activeElement != this.editorElement || selection === '') { this.stopBubble(event); } } @@ -795,7 +810,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * Method that shows the next toolbar buttons. */ async toolbarNext(event: Event): Promise { - if (event.type == 'keyup' && !this.isValidKeyboardKey(event)) { + if (event.type === 'keyup' && !this.isValidKeyboardKey(event)) { return; } @@ -813,7 +828,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * Method that shows the previous toolbar buttons. */ async toolbarPrev(event: Event): Promise { - if (event.type == 'keyup' && !this.isValidKeyboardKey(event)) { + if (event.type === 'keyup' && !this.isValidKeyboardKey(event)) { return; } @@ -831,7 +846,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * Update the number of toolbar buttons displayed. */ async updateToolbarButtons(): Promise { - if (!this.isCurrentView || !this.toolbar || !this.toolbarSlides || this.element.offsetParent == null) { + if (!this.isCurrentView || !this.toolbar || !this.toolbarSlides || this.element.offsetParent === null) { // Don't calculate if component isn't in current view, the calculations are wrong. return; } @@ -879,15 +894,18 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, */ updateToolbarStyles(): void { const node = window.getSelection()?.focusNode; - if (!node) { + + if (!node || !this.element.contains(node)) { return; } - let element = node.nodeType == 1 ? node as HTMLElement : node.parentElement; + let element = node.nodeType === 1 ? node as HTMLElement : node.parentElement; + const styles = {}; - while (element != null && element !== this.editorElement) { + while (element !== null && element !== this.editorElement) { const tagName = element.tagName.toLowerCase(); + if (this.toolbarStyles[tagName]) { styles[tagName] = 'true'; } @@ -906,7 +924,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, /** * Check if should auto save drafts. * - * @returns {boolean} Whether it should auto save drafts. + * @returns Whether it should auto save drafts. */ protected shouldAutoSaveDrafts(): boolean { return !!CoreSites.getCurrentSite() && @@ -943,8 +961,8 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, let draftText = entry.drafttext || ''; // Revert untouched editor contents to an empty string. - if (draftText == '

' || draftText == '


' || draftText == '
' || - draftText == '

 

' || draftText == '


 

') { + if (draftText === '

' || draftText === '


' || draftText === '
' || + draftText === '

 

' || draftText === '


 

') { draftText = ''; } @@ -977,7 +995,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, const newText = this.control.value ?? ''; - if (this.lastDraft == newText) { + if (this.lastDraft === newText) { // Text hasn't changed, nothing to save. return; } @@ -1009,7 +1027,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, this.resetObserver = CoreEvents.on(CoreEvents.FORM_ACTION, async (data: CoreEventFormActionData) => { const form = this.element.closest('form'); - if (data.form && form && data.form == form) { + if (data.form && form && data.form === form) { try { await CoreEditorOffline.deleteDraft( this.contextLevel || ContextLevel.SYSTEM, @@ -1048,7 +1066,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, * @returns Promise resolved when done. */ async scanQR(event: Event): Promise { - if (event.type == 'keyup' && !this.isValidKeyboardKey(event)) { + if (event.type === 'keyup' && !this.isValidKeyboardKey(event)) { return; } @@ -1097,14 +1115,20 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, ngOnDestroy(): void { this.valueChangeSubscription?.unsubscribe(); this.languageChangedSubscription?.unsubscribe(); - this.selectionChangeFunction && document.removeEventListener('selectionchange', this.selectionChangeFunction); + + document.removeEventListener('selectionchange', this.selectionChangeFunction); + clearInterval(this.initHeightInterval); clearInterval(this.autoSaveInterval); clearTimeout(this.hideMessageTimeout); + this.resetObserver?.off(); this.keyboardObserver?.off(); - this.labelObserver?.disconnect(); this.resizeListener?.off(); + + this.labelObserver?.disconnect(); + this.contentObserver?.disconnect(); + this.domPromise?.cancel(); this.buttonsDomPromise?.cancel(); } diff --git a/src/core/features/login/pages/site/site.ts b/src/core/features/login/pages/site/site.ts index 64f6eaa9d..3e93bc137 100644 --- a/src/core/features/login/pages/site/site.ts +++ b/src/core/features/login/pages/site/site.ts @@ -235,7 +235,7 @@ export class CoreLoginSitePage implements OnInit { /** * Validate Url. * - * @returns {ValidatorFn} Validation results. + * @returns Validation results. */ protected moodleUrlValidator(): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { diff --git a/src/theme/theme.base.scss b/src/theme/theme.base.scss index d5c4c72df..8de6cf26d 100644 --- a/src/theme/theme.base.scss +++ b/src/theme/theme.base.scss @@ -1129,7 +1129,7 @@ td { @include core-focus-background(); } -:not(.hydrated):not(.native-input) { // Not an ionic component. +:not(.hydrated):not(.native-input):not(.native-textarea) { // Not an ionic component. @include core-focus-outline(); }