Skip to content

Commit

Permalink
fix(overlay): persist hover overlay when there is not click content
Browse files Browse the repository at this point in the history
  • Loading branch information
Westbrook committed Mar 19, 2021
1 parent d635d72 commit 27111a9
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 6 deletions.
10 changes: 8 additions & 2 deletions packages/overlay/src/OverlayTrigger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
Placement,
TriggerInteractions,
OverlayOptions,
OverlayOpenCloseDetail,
} from './overlay-types';
import { openOverlay } from './loader.js';
import overlayTriggerStyles from './overlay-trigger.css.js';
Expand Down Expand Up @@ -75,8 +76,10 @@ export class OverlayTrigger extends LitElement {
private hoverContent?: HTMLElement;
private targetContent?: HTMLElement;

private handleClose(): void {
this.removeAttribute('open');
private handleClose(event?: CustomEvent<OverlayOpenCloseDetail>): void {
if (!event || this.open === event.detail.interaction) {
this.removeAttribute('open');
}
}

protected render(): TemplateResult {
Expand Down Expand Up @@ -145,6 +148,7 @@ export class OverlayTrigger extends LitElement {
case 'longpress':
if (!this.closeLongpressOverlay) {
this.onTriggerLongpress();
this.onTriggerMouseLeave();
}
break;
default:
Expand Down Expand Up @@ -209,6 +213,8 @@ export class OverlayTrigger extends LitElement {
case 'click':
if (this.clickContent) {
this.open = event.type;
} else if (this.closeHoverOverlay) {
event.preventDefault();
}
return;
case 'longpress':
Expand Down
7 changes: 4 additions & 3 deletions packages/overlay/src/overlay-stack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -411,14 +411,15 @@ export class OverlayStack {

private initialLongpressClick = false;

private handleMouse = (): void => {
private handleMouse = (event: Event): void => {
if (this.initialLongpressClick) {
this.initialLongpressClick = false;
return;
}
if (!this.preventMouseRootClose) {
this.closeTopOverlay();
if (this.preventMouseRootClose || event.defaultPrevented) {
return;
}
this.closeTopOverlay();
};

private handleKeyUp = (event: KeyboardEvent): void => {
Expand Down
1 change: 1 addition & 0 deletions packages/overlay/stories/overlay.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,7 @@ export const longpress = (): TemplateResult => {
<sp-action-button slot="trigger" hold-affordance>
<sp-icon-magnify slot="icon"></sp-icon-magnify>
</sp-action-button>
<sp-tooltip slot="hover-content">Search real hard...</sp-tooltip>
<sp-popover slot="longpress-content" tip>
<sp-action-group
@change=${(event: Event & { target: HTMLElement }) =>
Expand Down
78 changes: 77 additions & 1 deletion packages/overlay/test/overlay-trigger-hover.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,20 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA
OF ANY KIND, either express or implied. See the License for the specific language
governing permissions and limitations under the License.
*/
import { fixture, elementUpdated, waitUntil, html } from '@open-wc/testing';
import {
fixture,
elementUpdated,
waitUntil,
html,
expect,
} from '@open-wc/testing';
import '@spectrum-web-components/popover/sp-popover.js';
import '@spectrum-web-components/action-button/sp-action-button.js';
import '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';
import { OverlayTrigger } from '..';
import '@spectrum-web-components/overlay/overlay-trigger.js';
import { spy } from 'sinon';
import { ActionButton } from '@spectrum-web-components/action-button';

describe('Overlay Trigger - Hover', () => {
it('displays `hover` declaratively', async () => {
Expand Down Expand Up @@ -50,4 +57,73 @@ describe('Overlay Trigger - Hover', () => {
timeout: 2000,
});
});
it('persists hover content', async () => {
const el = await fixture<OverlayTrigger>(
(() => html`
<overlay-trigger placement="right-start">
<sp-action-button slot="trigger">
<sp-icon-magnify slot="icon"></sp-icon-magnify>
</sp-action-button>
<sp-popover slot="hover-content" tip></sp-popover>
</overlay-trigger>
`)()
);
await elementUpdated(el);

expect(el.open).to.be.undefined;

const trigger = el.querySelector('[slot="trigger"]') as ActionButton;
trigger.dispatchEvent(
new Event('mouseenter', {
bubbles: true,
})
);

await elementUpdated(el);

expect(el.open).to.equal('hover');

trigger.click();

await elementUpdated(el);

expect(el.open).to.equal('hover');
});
it('closes persistent hover content on `longpress`', async () => {
const el = await fixture<OverlayTrigger>(
(() => html`
<overlay-trigger placement="right-start">
<sp-action-button slot="trigger">
<sp-icon-magnify slot="icon"></sp-icon-magnify>
</sp-action-button>
<sp-popover slot="hover-content" tip></sp-popover>
<sp-popover slot="longpress-content" tip></sp-popover>
</overlay-trigger>
`)()
);
await elementUpdated(el);

expect(el.open).to.be.undefined;

const trigger = el.querySelector('[slot="trigger"]') as ActionButton;
trigger.dispatchEvent(
new Event('mouseenter', {
bubbles: true,
})
);

await elementUpdated(el);

expect(el.open).to.equal('hover');

trigger.dispatchEvent(
new Event('longpress', {
bubbles: true,
})
);

await elementUpdated(el);

expect(el.open).to.equal('longpress');
});
});
1 change: 1 addition & 0 deletions packages/overlay/test/overlay-trigger.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,7 @@ describe('Overlay Trigger', () => {
'open'
);

await nextFrame();
document.body.click();
await elementUpdated(overlayTriggers[1]);
await waitUntil(() => {
Expand Down

0 comments on commit 27111a9

Please # to comment.