fix(popover): popover opens on chrome 109 (#26672)

resolves #26643
This commit is contained in:
Liam DeBeasi
2023-01-30 11:55:20 -05:00
committed by GitHub
parent 95a3c69bbb
commit 69d89eae94
6 changed files with 57 additions and 27 deletions

View File

@ -30,9 +30,17 @@ export class AngularDelegate {
create( create(
resolverOrInjector: ComponentFactoryResolver, resolverOrInjector: ComponentFactoryResolver,
injector: Injector, injector: Injector,
location?: ViewContainerRef location?: ViewContainerRef,
elementReferenceKey?: string
): AngularFrameworkDelegate { ): AngularFrameworkDelegate {
return new AngularFrameworkDelegate(resolverOrInjector, injector, location, this.appRef, this.zone); return new AngularFrameworkDelegate(
resolverOrInjector,
injector,
location,
this.appRef,
this.zone,
elementReferenceKey
);
} }
} }
@ -45,12 +53,29 @@ export class AngularFrameworkDelegate implements FrameworkDelegate {
private injector: Injector, private injector: Injector,
private location: ViewContainerRef | undefined, private location: ViewContainerRef | undefined,
private appRef: ApplicationRef, private appRef: ApplicationRef,
private zone: NgZone private zone: NgZone,
private elementReferenceKey?: string
) {} ) {}
attachViewToDom(container: any, component: any, params?: any, cssClasses?: string[]): Promise<any> { attachViewToDom(container: any, component: any, params?: any, cssClasses?: string[]): Promise<any> {
return this.zone.run(() => { return this.zone.run(() => {
return new Promise((resolve) => { return new Promise((resolve) => {
const componentProps = {
...params,
};
/**
* Ionic Angular passes a reference to a modal
* or popover that can be accessed using a
* variable in the overlay component. If
* elementReferenceKey is defined, then we should
* pass a reference to the component using
* elementReferenceKey as the key.
*/
if (this.elementReferenceKey !== undefined) {
componentProps[this.elementReferenceKey] = container;
}
const el = attachView( const el = attachView(
this.zone, this.zone,
this.resolverOrInjector, this.resolverOrInjector,
@ -61,7 +86,7 @@ export class AngularFrameworkDelegate implements FrameworkDelegate {
this.elEventsMap, this.elEventsMap,
container, container,
component, component,
params, componentProps,
cssClasses cssClasses
); );
resolve(el); resolve(el);

View File

@ -21,7 +21,12 @@ export class ModalController extends OverlayBaseController<ModalOptions, HTMLIon
create(opts: ModalOptions): Promise<HTMLIonModalElement> { create(opts: ModalOptions): Promise<HTMLIonModalElement> {
return super.create({ return super.create({
...opts, ...opts,
delegate: this.angularDelegate.create(this.resolver ?? this.environmentInjector, this.injector), delegate: this.angularDelegate.create(
this.resolver ?? this.environmentInjector,
this.injector,
undefined,
'modal'
),
}); });
} }
} }

View File

@ -21,7 +21,12 @@ export class PopoverController extends OverlayBaseController<PopoverOptions, HTM
create(opts: PopoverOptions): Promise<HTMLIonPopoverElement> { create(opts: PopoverOptions): Promise<HTMLIonPopoverElement> {
return super.create({ return super.create({
...opts, ...opts,
delegate: this.angularDelegate.create(this.resolver ?? this.environmentInjector, this.injector), delegate: this.angularDelegate.create(
this.resolver ?? this.environmentInjector,
this.injector,
undefined,
'popover'
),
}); });
} }
} }

View File

@ -512,13 +512,15 @@ export class Modal implements ComponentInterface, OverlayInterface {
*/ */
this.currentBreakpoint = this.initialBreakpoint; this.currentBreakpoint = this.initialBreakpoint;
const data = {
...this.componentProps,
modal: this.el,
};
const { inline, delegate } = this.getDelegate(true); const { inline, delegate } = this.getDelegate(true);
this.usersElement = await attachComponent(delegate, this.el, this.component, ['ion-page'], data, inline); this.usersElement = await attachComponent(
delegate,
this.el,
this.component,
['ion-page'],
this.componentProps,
inline
);
await deepReady(this.usersElement); await deepReady(this.usersElement);

View File

@ -448,13 +448,15 @@ export class Popover implements ComponentInterface, PopoverInterface {
await this.currentTransition; await this.currentTransition;
} }
const data = {
...this.componentProps,
popover: this.el,
};
const { inline, delegate } = this.getDelegate(true); const { inline, delegate } = this.getDelegate(true);
this.usersElement = await attachComponent(delegate, this.el, this.component, ['popover-viewport'], data, inline); this.usersElement = await attachComponent(
delegate,
this.el,
this.component,
['popover-viewport'],
this.componentProps,
inline
);
await deepReady(this.usersElement); await deepReady(this.usersElement);
if (!this.keyboardEvents) { if (!this.keyboardEvents) {

View File

@ -21,15 +21,6 @@ export const VueDelegate = (
componentProps: any = {}, componentProps: any = {},
classes?: string[] classes?: string[]
) => { ) => {
/**
* Ionic Framework passes in modal and popover element
* refs as props, but if these are not defined
* on the Vue component instance as props, Vue will
* warn the user.
*/
delete componentProps["modal"];
delete componentProps["popover"];
const div = document.createElement("div"); const div = document.createElement("div");
classes && div.classList.add(...classes); classes && div.classList.add(...classes);
parentElement.appendChild(div); parentElement.appendChild(div);