summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Rohlfs <brohlfs@google.com>2022-10-14 13:12:16 +0200
committerLuca Milanesio <luca.milanesio@gmail.com>2022-10-14 17:35:06 +0100
commit76f5ff5c2492003cbd18be5ddae2d93b3af76f3b (patch)
tree5e2b13f75c1a912dd672c9d4353c159c477f83d5
parent77ebd9d3f8823a23e380bfc77700b522c9ee37ed (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.ts53
-rw-r--r--polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts2
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,
})