diff options
author | Ben Rohlfs <brohlfs@google.com> | 2022-10-14 13:12:16 +0200 |
---|---|---|
committer | Luca Milanesio <luca.milanesio@gmail.com> | 2022-10-14 17:35:06 +0100 |
commit | 76f5ff5c2492003cbd18be5ddae2d93b3af76f3b (patch) | |
tree | 5e2b13f75c1a912dd672c9d4353c159c477f83d5 | |
parent | 77ebd9d3f8823a23e380bfc77700b522c9ee37ed (diff) |
Reliably repositiong apply fix dialog using a ResizeObserver
Apparently just listening for the diff events was not enough. So simply
let the browser tell us when the dialog content resizes. That is the
most reliable way of knowing when to resize/reposition the overlay.
Release-Notes: skip
Google-Bug-Id: b/253250475
Change-Id: I874f71067056114f3ec51081f7dc9336c411112a
-rw-r--r-- | polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts | 53 | ||||
-rw-r--r-- | polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts | 2 |
2 files changed, 46 insertions, 9 deletions
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts index 262f1fdd8b..17d7516afb 100644 --- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts +++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts @@ -22,7 +22,7 @@ import {GrOverlay} from '../../shared/gr-overlay/gr-overlay'; import {PROVIDED_FIX_ID} from '../../../utils/comment-util'; import {OpenFixPreviewEvent} from '../../../types/events'; import {getAppContext} from '../../../services/app-context'; -import {fireCloseFixPreview, fireEvent} from '../../../utils/event-util'; +import {fireCloseFixPreview} from '../../../utils/event-util'; import {DiffLayer, ParsedChangeInfo} from '../../../types/types'; import {GrButton} from '../../shared/gr-button/gr-button'; import {TokenHighlightLayer} from '../../../embed/diff/gr-diff-builder/token-highlight-layer'; @@ -33,6 +33,7 @@ import {subscribe} from '../../lit/subscription-controller'; import {assert} from '../../../utils/common-util'; import {resolve} from '../../../models/dependency'; import {createChangeUrl} from '../../../models/views/change'; +import {GrDialog} from '../../shared/gr-dialog/gr-dialog'; interface FilePreview { filepath: string; @@ -44,6 +45,15 @@ export class GrApplyFixDialog extends LitElement { @query('#applyFixOverlay') applyFixOverlay?: GrOverlay; + @query('#applyFixDialog') + applyFixDialog?: GrDialog; + + /** The currently observed dialog by `dialogOberserver`. */ + observedDialog?: GrDialog; + + /** The current observer observing the `observedDialog`. */ + dialogObserver?: ResizeObserver; + @query('#nextFix') nextFix?: GrButton; @@ -102,9 +112,6 @@ export class GrApplyFixDialog extends LitElement { this.diffPrefs = diffPreferences; } ); - this.addEventListener('diff-context-expanded', () => { - if (this.applyFixOverlay) fireEvent(this.applyFixOverlay, 'iron-resize'); - }); } static override styles = [ @@ -148,6 +155,39 @@ export class GrApplyFixDialog extends LitElement { `; } + override updated() { + this.updateDialogObserver(); + } + + override disconnectedCallback() { + this.removeDialogObserver(); + super.disconnectedCallback(); + } + + private removeDialogObserver() { + this.dialogObserver?.disconnect(); + this.dialogObserver = undefined; + this.observedDialog = undefined; + } + + private updateDialogObserver() { + if ( + this.applyFixDialog === this.observedDialog && + this.dialogObserver !== undefined + ) { + return; + } + + this.removeDialogObserver(); + if (!this.applyFixDialog) return; + + this.observedDialog = this.applyFixDialog; + this.dialogObserver = new ResizeObserver(() => { + this.applyFixOverlay?.refit(); + }); + this.dialogObserver.observe(this.observedDialog); + } + private renderHeader() { return html` <div slot="header">${this.currentFix?.description ?? ''}</div> @@ -202,7 +242,7 @@ export class GrApplyFixDialog extends LitElement { * Given event with fixSuggestions, fetch diffs associated with first * suggested fix and open dialog. */ - async open(e: OpenFixPreviewEvent) { + open(e: OpenFixPreviewEvent) { this.patchNum = e.detail.patchNum; this.fixSuggestions = e.detail.fixSuggestions; assert(this.fixSuggestions.length > 0, 'no fix in the event'); @@ -212,9 +252,6 @@ export class GrApplyFixDialog extends LitElement { this.showSelectedFixSuggestion(this.fixSuggestions[0]), this.applyFixOverlay?.open() ); - return Promise.all(promises).then(() => { - if (this.applyFixOverlay) fireEvent(this.applyFixOverlay, 'iron-resize'); - }); } private async showSelectedFixSuggestion(fixSuggestion: FixSuggestionInfo) { diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts index b6e4a954d5..4d2d4543e5 100644 --- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts +++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts @@ -52,7 +52,7 @@ suite('gr-apply-fix-dialog tests', () => { } async function open(detail: OpenFixPreviewEventDetail) { - await element.open( + element.open( new CustomEvent<OpenFixPreviewEventDetail>(EventType.OPEN_FIX_PREVIEW, { detail, }) |