Skip to content

Commit 1f67e10

Browse files
WestbrookWestbrook Johnson
authored andcommitted
refactor(overlay): leverage "reparentChildren" helper
1 parent b50d683 commit 1f67e10

File tree

3 files changed

+24
-59
lines changed

3 files changed

+24
-59
lines changed

packages/overlay/src/ActiveOverlay.ts

Lines changed: 10 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
SpectrumElement,
2020
TemplateResult,
2121
} from '@spectrum-web-components/base';
22+
import { reparentChildren } from '@spectrum-web-components/shared';
2223
import { Color, Scale } from '@spectrum-web-components/theme';
2324
import styles from './active-overlay.css.js';
2425
import {
@@ -115,9 +116,7 @@ export class ActiveOverlay extends SpectrumElement {
115116
public overlayContentTip?: HTMLElement;
116117
public trigger!: HTMLElement;
117118

118-
private placeholder?: Comment;
119119
private popper?: Instance;
120-
private originalSlot?: string;
121120

122121
@property()
123122
public _state = stateTransition();
@@ -155,6 +154,7 @@ export class ActiveOverlay extends SpectrumElement {
155154

156155
public tabbingAway = false;
157156
private originalPlacement?: Placement;
157+
private restoreContent?: () => Element[];
158158

159159
/**
160160
* @prop Used by the popper library to indicate where the overlay was
@@ -361,68 +361,25 @@ export class ActiveOverlay extends SpectrumElement {
361361
}
362362

363363
private stealOverlayContent(element: HTMLElement): void {
364-
/* c8 ignore next */
365-
if (this.placeholder || !element) return;
366-
if (!this.placeholder) {
367-
this.placeholder = document.createComment(
368-
'placeholder for ' + element.nodeName
369-
);
370-
}
371-
372-
const parentElement = element.parentElement || element.getRootNode();
373-
374-
if (parentElement) {
375-
parentElement.replaceChild(this.placeholder, element);
376-
}
377-
378-
this.overlayContent = element;
379-
this.originalSlot =
380-
this.overlayContent.getAttribute('slot') || undefined;
381-
this.overlayContent.setAttribute('slot', 'overlay');
382-
this.appendChild(this.overlayContent);
383-
384-
this.originalPlacement = this.overlayContent.getAttribute(
385-
'placement'
386-
) as Placement;
387-
364+
this.originalPlacement = element.getAttribute('placement') as Placement;
365+
this.restoreContent = reparentChildren([element], this);
388366
this.stealOverlayContentResolver();
389367
}
390368

391369
private willNotifyClosed = false;
392370

393371
private returnOverlayContent(): void {
394372
/* c8 ignore next */
395-
if (!this.overlayContent) return;
373+
if (!this.restoreContent) return;
396374

397-
if (this.originalSlot) {
398-
this.overlayContent.setAttribute('slot', this.originalSlot);
399-
delete this.originalSlot;
400-
} else {
401-
this.overlayContent.removeAttribute('slot');
402-
}
403-
404-
if (this.placeholder) {
405-
const parentElement =
406-
this.placeholder.parentElement ||
407-
this.placeholder.getRootNode();
408-
if (parentElement) {
409-
parentElement.replaceChild(
410-
this.overlayContent,
411-
this.placeholder
412-
);
413-
this.willNotifyClosed = true;
414-
}
415-
}
375+
const [element] = this.restoreContent();
376+
this.restoreContent = undefined;
377+
this.willNotifyClosed = true;
416378

417379
if (this.originalPlacement) {
418-
this.overlayContent.setAttribute(
419-
'placement',
420-
this.originalPlacement
421-
);
380+
element.setAttribute('placement', this.originalPlacement);
422381
delete this.originalPlacement;
423382
}
424-
425-
delete this.placeholder;
426383
}
427384

428385
public async updateOverlayPosition(): Promise<void> {
@@ -506,7 +463,7 @@ export class ActiveOverlay extends SpectrumElement {
506463
public render(): TemplateResult {
507464
const content = html`
508465
<div id="contents">
509-
<slot @slotchange=${this.onSlotChange} name="overlay"></slot>
466+
<slot @slotchange=${this.onSlotChange}></slot>
510467
</div>
511468
`;
512469
return this.hasTheme ? this.renderTheme(content) : content;

packages/picker/src/Picker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export class PickerBase extends SizedMixin(Focusable) {
9595
public open = false;
9696

9797
public menuItems: MenuItem[] = [];
98-
private restoreChildren?: Function;
98+
private restoreChildren?: () => void;
9999

100100
public optionsMenu!: Menu;
101101

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
function restoreChildren(
22
placeholderItems: Comment[],
3-
srcElements: Element[]
4-
): void {
3+
srcElements: Element[],
4+
slotNames: string[]
5+
): Element[] {
56
for (let index = 0; index < srcElements.length; ++index) {
67
const srcElement = srcElements[index];
78
const placeholderItem = placeholderItems[index];
89
const parentElement =
910
placeholderItem.parentElement || placeholderItem.getRootNode();
11+
if (slotNames[index]) {
12+
srcElement.slot = slotNames[index];
13+
}
1014
parentElement.replaceChild(srcElement, placeholderItem);
1115
delete placeholderItems[index];
1216
}
17+
return srcElements;
1318
}
1419

1520
export const reparentChildren = (
1621
srcElements: Element[],
1722
newParent: Element
18-
): Function => {
23+
): (() => Element[]) => {
1924
let placeholderItems: Comment[] = [];
25+
let slotNames: string[] = [];
2026

2127
for (let index = 0; index < srcElements.length; ++index) {
2228
const placeholderItem: Comment = document.createComment(
@@ -25,13 +31,15 @@ export const reparentChildren = (
2531
placeholderItems.push(placeholderItem);
2632

2733
const srcElement = srcElements[index];
34+
slotNames.push(srcElement.slot);
35+
srcElement.removeAttribute('slot');
2836
const parentElement =
2937
srcElement.parentElement || srcElement.getRootNode();
3038
parentElement.replaceChild(placeholderItem, srcElement);
3139
newParent.append(srcElement);
3240
}
3341

34-
return function () {
35-
restoreChildren(placeholderItems, srcElements);
42+
return function (): Element[] {
43+
return restoreChildren(placeholderItems, srcElements, slotNames);
3644
};
3745
};

0 commit comments

Comments
 (0)