@spectrum-web-components/picker 0.33.2 → 0.33.3-overlay.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +141 -263
- package/package.json +14 -14
- package/src/Picker.d.ts +20 -30
- package/src/Picker.dev.js +132 -168
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +31 -16
- package/src/Picker.js.map +3 -3
- package/src/picker.css.dev.js +1 -1
- package/src/picker.css.dev.js.map +1 -1
- package/src/picker.css.js +1 -1
- package/src/picker.css.js.map +1 -1
- package/sync/index.d.ts +4 -1
- package/sync/index.dev.js +1 -6
- package/sync/index.dev.js.map +2 -2
- package/sync/index.js +1 -1
- package/sync/index.js.map +3 -3
- package/test/index.js +185 -146
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +11 -17
- package/test/picker-reparenting.test.js.map +2 -2
- package/test/picker-responsive.test.js +3 -2
- package/test/picker-responsive.test.js.map +2 -2
- package/test/picker.test.js +1 -1
- package/test/picker.test.js.map +2 -2
package/src/Picker.d.ts
CHANGED
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
import { CSSResultArray, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
|
|
2
|
+
import { StyleInfo } from '@spectrum-web-components/base/src/directives.js';
|
|
2
3
|
import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
|
|
3
4
|
import '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';
|
|
4
5
|
import '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';
|
|
6
|
+
import '@spectrum-web-components/overlay/sp-overlay.js';
|
|
5
7
|
import '@spectrum-web-components/menu/sp-menu.js';
|
|
6
|
-
import type { Menu, MenuItem,
|
|
8
|
+
import type { Menu, MenuItem, MenuItemChildren } from '@spectrum-web-components/menu';
|
|
7
9
|
import '@spectrum-web-components/tray/sp-tray.js';
|
|
8
10
|
import '@spectrum-web-components/popover/sp-popover.js';
|
|
9
|
-
import {
|
|
11
|
+
import { Placement } from '@spectrum-web-components/overlay';
|
|
10
12
|
import { MatchMediaController } from '@spectrum-web-components/reactive-controllers/src/MatchMedia.js';
|
|
11
13
|
declare const PickerBase_base: typeof Focusable & {
|
|
12
14
|
new (...args: any[]): import("@spectrum-web-components/base").SizedElementInterface;
|
|
13
15
|
prototype: import("@spectrum-web-components/base").SizedElementInterface;
|
|
14
16
|
};
|
|
15
17
|
export declare class PickerBase extends PickerBase_base {
|
|
16
|
-
/**
|
|
17
|
-
* @private
|
|
18
|
-
*/
|
|
19
|
-
static openOverlay: (target: HTMLElement, interaction: TriggerInteractions, content: HTMLElement, options: OverlayOptions) => Promise<() => void>;
|
|
20
18
|
protected isMobile: MatchMediaController;
|
|
21
19
|
button: HTMLButtonElement;
|
|
22
20
|
get target(): HTMLButtonElement | this;
|
|
@@ -28,8 +26,7 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
28
26
|
open: boolean;
|
|
29
27
|
readonly: boolean;
|
|
30
28
|
selects: undefined | 'single';
|
|
31
|
-
menuItems: MenuItem[];
|
|
32
|
-
private restoreChildren?;
|
|
29
|
+
get menuItems(): MenuItem[];
|
|
33
30
|
optionsMenu: Menu;
|
|
34
31
|
/**
|
|
35
32
|
* @type {"auto" | "auto-start" | "auto-end" | "top" | "bottom" | "right" | "left" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end" | "none"}
|
|
@@ -38,15 +35,17 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
38
35
|
placement: Placement;
|
|
39
36
|
quiet: boolean;
|
|
40
37
|
value: string;
|
|
41
|
-
selectedItem
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
get selectedItem(): MenuItem | undefined;
|
|
39
|
+
set selectedItem(selectedItem: MenuItem | undefined);
|
|
40
|
+
_selectedItem?: MenuItem;
|
|
44
41
|
protected listRole: 'listbox' | 'menu';
|
|
45
42
|
protected itemRole: string;
|
|
46
43
|
constructor();
|
|
47
44
|
get focusElement(): HTMLElement;
|
|
48
45
|
forceFocusVisible(): void;
|
|
49
46
|
onButtonBlur(): void;
|
|
47
|
+
private preventNextToggle;
|
|
48
|
+
protected handlePointerdown(): void;
|
|
50
49
|
protected onButtonClick(): void;
|
|
51
50
|
focus(options?: FocusOptions): void;
|
|
52
51
|
onHelperFocus(): void;
|
|
@@ -57,34 +56,25 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
57
56
|
protected setMenuItemSelected(item: MenuItem, value: boolean): void;
|
|
58
57
|
toggle(target?: boolean): void;
|
|
59
58
|
close(): void;
|
|
60
|
-
|
|
61
|
-
overlayCloseCallback: () => Promise<void>;
|
|
62
|
-
private popoverFragment;
|
|
63
|
-
private generatePopover;
|
|
64
|
-
private openMenu;
|
|
65
|
-
protected sizePopover(popover: HTMLElement): void;
|
|
66
|
-
private closeMenu;
|
|
59
|
+
protected get containerStyles(): StyleInfo;
|
|
67
60
|
protected get selectedItemContent(): MenuItemChildren;
|
|
61
|
+
protected set selectedItemContent(selectedItemContent: MenuItemChildren | undefined);
|
|
62
|
+
_selectedItemContent?: MenuItemChildren;
|
|
68
63
|
protected renderLabelContent(content: Node[]): TemplateResult | Node[];
|
|
69
64
|
protected get buttonContent(): TemplateResult[];
|
|
65
|
+
protected get renderOverlay(): TemplateResult;
|
|
70
66
|
protected render(): TemplateResult;
|
|
71
67
|
protected update(changes: PropertyValues<this>): void;
|
|
72
68
|
protected get dismissHelper(): TemplateResult;
|
|
73
|
-
protected get
|
|
74
|
-
private
|
|
75
|
-
protected
|
|
76
|
-
|
|
77
|
-
* Acquire the available MenuItems in the Picker by
|
|
78
|
-
* direct element query or by assuming the list managed
|
|
79
|
-
* by the Menu within the open options overlay.
|
|
80
|
-
*/
|
|
81
|
-
protected updateMenuItems(event?: MenuItemAddedOrUpdatedEvent | MenuItemRemovedEvent): void;
|
|
69
|
+
protected get renderContainer(): TemplateResult;
|
|
70
|
+
private willManageSelection;
|
|
71
|
+
protected shouldScheduleManageSelection(event?: Event): void;
|
|
72
|
+
protected shouldManageSelection(): void;
|
|
82
73
|
protected manageSelection(): Promise<void>;
|
|
83
|
-
private menuStatePromise;
|
|
84
|
-
private menuStateResolver;
|
|
85
74
|
private selectionPromise;
|
|
86
75
|
private selectionResolver;
|
|
87
76
|
protected getUpdateComplete(): Promise<boolean>;
|
|
77
|
+
private recentlyConnected;
|
|
88
78
|
connectedCallback(): void;
|
|
89
79
|
disconnectedCallback(): void;
|
|
90
80
|
}
|
|
@@ -99,7 +89,7 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
99
89
|
*/
|
|
100
90
|
export declare class Picker extends PickerBase {
|
|
101
91
|
static get styles(): CSSResultArray;
|
|
102
|
-
protected
|
|
92
|
+
protected get containerStyles(): StyleInfo;
|
|
103
93
|
protected onKeydown: (event: KeyboardEvent) => void;
|
|
104
94
|
}
|
|
105
95
|
export {};
|
package/src/Picker.dev.js
CHANGED
|
@@ -13,10 +13,12 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
13
13
|
import {
|
|
14
14
|
html,
|
|
15
15
|
nothing,
|
|
16
|
-
render,
|
|
17
16
|
SizedMixin
|
|
18
17
|
} from "@spectrum-web-components/base";
|
|
19
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
classMap,
|
|
20
|
+
styleMap
|
|
21
|
+
} from "@spectrum-web-components/base/src/directives.js";
|
|
20
22
|
import {
|
|
21
23
|
property,
|
|
22
24
|
query
|
|
@@ -24,15 +26,12 @@ import {
|
|
|
24
26
|
import pickerStyles from "./picker.css.js";
|
|
25
27
|
import chevronStyles from "@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js";
|
|
26
28
|
import { Focusable } from "@spectrum-web-components/shared/src/focusable.js";
|
|
27
|
-
import { reparentChildren } from "@spectrum-web-components/shared/src/reparent-children.js";
|
|
28
29
|
import "@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js";
|
|
29
30
|
import "@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";
|
|
31
|
+
import "@spectrum-web-components/overlay/sp-overlay.js";
|
|
30
32
|
import "@spectrum-web-components/menu/sp-menu.js";
|
|
31
33
|
import "@spectrum-web-components/tray/sp-tray.js";
|
|
32
34
|
import "@spectrum-web-components/popover/sp-popover.js";
|
|
33
|
-
import {
|
|
34
|
-
openOverlay
|
|
35
|
-
} from "@spectrum-web-components/overlay";
|
|
36
35
|
import {
|
|
37
36
|
IS_MOBILE,
|
|
38
37
|
MatchMediaController
|
|
@@ -53,12 +52,12 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
53
52
|
this.open = false;
|
|
54
53
|
this.readonly = false;
|
|
55
54
|
this.selects = "single";
|
|
56
|
-
this.menuItems = [];
|
|
57
55
|
this.placement = "bottom-start";
|
|
58
56
|
this.quiet = false;
|
|
59
57
|
this.value = "";
|
|
60
58
|
this.listRole = "listbox";
|
|
61
59
|
this.itemRole = "option";
|
|
60
|
+
this.preventNextToggle = false;
|
|
62
61
|
this.onKeydown = (event) => {
|
|
63
62
|
this.focused = true;
|
|
64
63
|
if (event.code !== "ArrowDown" && event.code !== "ArrowUp") {
|
|
@@ -67,29 +66,34 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
67
66
|
event.preventDefault();
|
|
68
67
|
this.toggle(true);
|
|
69
68
|
};
|
|
70
|
-
this.
|
|
71
|
-
this.updateMenuItems();
|
|
72
|
-
await this.itemsUpdated;
|
|
73
|
-
await this.optionsMenu.updateComplete;
|
|
74
|
-
requestAnimationFrame(() => this.menuStateResolver());
|
|
75
|
-
};
|
|
76
|
-
this.overlayCloseCallback = async () => {
|
|
77
|
-
if (this.restoreChildren) {
|
|
78
|
-
this.restoreChildren();
|
|
79
|
-
this.restoreChildren = void 0;
|
|
80
|
-
}
|
|
81
|
-
this.close();
|
|
82
|
-
requestAnimationFrame(() => this.menuStateResolver());
|
|
83
|
-
};
|
|
84
|
-
this._willUpdateItems = false;
|
|
85
|
-
this.itemsUpdated = Promise.resolve();
|
|
86
|
-
this.menuStatePromise = Promise.resolve();
|
|
69
|
+
this.willManageSelection = false;
|
|
87
70
|
this.selectionPromise = Promise.resolve();
|
|
71
|
+
this.recentlyConnected = false;
|
|
88
72
|
this.onKeydown = this.onKeydown.bind(this);
|
|
73
|
+
this.addEventListener("focusout", (event) => {
|
|
74
|
+
if (event.relatedTarget && this.contains(event.relatedTarget) || event.target !== this) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this.open = false;
|
|
78
|
+
});
|
|
89
79
|
}
|
|
90
80
|
get target() {
|
|
91
81
|
return this.button;
|
|
92
82
|
}
|
|
83
|
+
get menuItems() {
|
|
84
|
+
return this.optionsMenu.childItems;
|
|
85
|
+
}
|
|
86
|
+
get selectedItem() {
|
|
87
|
+
return this._selectedItem;
|
|
88
|
+
}
|
|
89
|
+
set selectedItem(selectedItem) {
|
|
90
|
+
this.selectedItemContent = selectedItem ? selectedItem.itemChildren : void 0;
|
|
91
|
+
if (selectedItem === this.selectedItem)
|
|
92
|
+
return;
|
|
93
|
+
const oldSelectedItem = this.selectedItem;
|
|
94
|
+
this._selectedItem = selectedItem;
|
|
95
|
+
this.requestUpdate("selectedItem", oldSelectedItem);
|
|
96
|
+
}
|
|
93
97
|
get focusElement() {
|
|
94
98
|
if (this.open) {
|
|
95
99
|
return this.optionsMenu;
|
|
@@ -106,8 +110,14 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
106
110
|
this.onKeydown
|
|
107
111
|
);
|
|
108
112
|
}
|
|
113
|
+
handlePointerdown() {
|
|
114
|
+
this.preventNextToggle = this.open;
|
|
115
|
+
}
|
|
109
116
|
onButtonClick() {
|
|
110
|
-
this.
|
|
117
|
+
if (!this.preventNextToggle) {
|
|
118
|
+
this.toggle();
|
|
119
|
+
}
|
|
120
|
+
this.preventNextToggle = false;
|
|
111
121
|
}
|
|
112
122
|
focus(options) {
|
|
113
123
|
super.focus(options);
|
|
@@ -128,20 +138,22 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
128
138
|
handleChange(event) {
|
|
129
139
|
const target = event.target;
|
|
130
140
|
const [selected] = target.selectedItems;
|
|
141
|
+
event.stopPropagation();
|
|
131
142
|
if (event.cancelable) {
|
|
132
|
-
event.stopPropagation();
|
|
133
143
|
this.setValueFromItem(selected, event);
|
|
134
144
|
} else {
|
|
135
145
|
this.open = false;
|
|
136
146
|
}
|
|
137
147
|
}
|
|
138
148
|
async setValueFromItem(item, menuChangeEvent) {
|
|
149
|
+
this.open = false;
|
|
139
150
|
const oldSelectedItem = this.selectedItem;
|
|
140
151
|
const oldValue = this.value;
|
|
141
|
-
this.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
152
|
+
if (this.selects) {
|
|
153
|
+
this.selectedItem = item;
|
|
154
|
+
this.value = item.value;
|
|
155
|
+
await this.updateComplete;
|
|
156
|
+
}
|
|
145
157
|
const applyDefault = this.dispatchEvent(
|
|
146
158
|
new Event("change", {
|
|
147
159
|
bubbles: true,
|
|
@@ -149,7 +161,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
149
161
|
composed: true
|
|
150
162
|
})
|
|
151
163
|
);
|
|
152
|
-
if (!applyDefault) {
|
|
164
|
+
if (!applyDefault && this.selects) {
|
|
153
165
|
if (menuChangeEvent) {
|
|
154
166
|
menuChangeEvent.preventDefault();
|
|
155
167
|
}
|
|
@@ -184,74 +196,23 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
184
196
|
}
|
|
185
197
|
this.open = false;
|
|
186
198
|
}
|
|
187
|
-
|
|
188
|
-
if (!this.popoverFragment) {
|
|
189
|
-
this.popoverFragment = document.createDocumentFragment();
|
|
190
|
-
}
|
|
191
|
-
render(this.renderPopover, this.popoverFragment, { host: this });
|
|
192
|
-
this.popoverEl = this.popoverFragment.children[0];
|
|
193
|
-
this.optionsMenu = this.popoverEl.children[1];
|
|
194
|
-
}
|
|
195
|
-
async openMenu() {
|
|
196
|
-
let reparentableChildren = [];
|
|
197
|
-
const deprecatedMenu = this.querySelector(":scope > sp-menu");
|
|
198
|
-
await this.generatePopover();
|
|
199
|
-
if (deprecatedMenu) {
|
|
200
|
-
reparentableChildren = Array.from(deprecatedMenu.children);
|
|
201
|
-
} else {
|
|
202
|
-
reparentableChildren = Array.from(this.children).filter(
|
|
203
|
-
(element) => {
|
|
204
|
-
return !element.hasAttribute("slot");
|
|
205
|
-
}
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
if (reparentableChildren.length === 0) {
|
|
209
|
-
this.menuStateResolver();
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
this.restoreChildren = reparentChildren(reparentableChildren, this.optionsMenu, {
|
|
213
|
-
position: "beforeend",
|
|
214
|
-
prepareCallback: (el) => {
|
|
215
|
-
if (this.value === el.value) {
|
|
216
|
-
this.setMenuItemSelected(el, true);
|
|
217
|
-
}
|
|
218
|
-
return (el2) => {
|
|
219
|
-
if (typeof el2.focused !== "undefined") {
|
|
220
|
-
el2.focused = false;
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
this.sizePopover(this.popoverEl);
|
|
226
|
-
if (true) {
|
|
227
|
-
window.__swc.ignoreWarningLevels.deprecation = true;
|
|
228
|
-
}
|
|
229
|
-
this.closeOverlay = Picker.openOverlay(this, "modal", this.popoverEl, {
|
|
230
|
-
placement: this.isMobile.matches ? "none" : this.placement,
|
|
231
|
-
receivesFocus: "auto"
|
|
232
|
-
});
|
|
233
|
-
if (true) {
|
|
234
|
-
window.__swc.ignoreWarningLevels.deprecation = false;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
sizePopover(popover) {
|
|
199
|
+
get containerStyles() {
|
|
238
200
|
if (this.isMobile.matches) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
async closeMenu() {
|
|
244
|
-
if (this.closeOverlay) {
|
|
245
|
-
const closeOverlay = this.closeOverlay;
|
|
246
|
-
delete this.closeOverlay;
|
|
247
|
-
(await closeOverlay)();
|
|
201
|
+
return {
|
|
202
|
+
"--swc-menu-width": "100%"
|
|
203
|
+
};
|
|
248
204
|
}
|
|
205
|
+
return {};
|
|
249
206
|
}
|
|
250
207
|
get selectedItemContent() {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
208
|
+
return this._selectedItemContent || { icon: [], content: [] };
|
|
209
|
+
}
|
|
210
|
+
set selectedItemContent(selectedItemContent) {
|
|
211
|
+
if (selectedItemContent === this.selectedItemContent)
|
|
212
|
+
return;
|
|
213
|
+
const oldContent = this.selectedItemContent;
|
|
214
|
+
this._selectedItemContent = selectedItemContent;
|
|
215
|
+
this.requestUpdate("selectedItemContent", oldContent);
|
|
255
216
|
}
|
|
256
217
|
renderLabelContent(content) {
|
|
257
218
|
if (this.value && this.selectedItem) {
|
|
@@ -285,13 +246,37 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
285
246
|
`
|
|
286
247
|
];
|
|
287
248
|
}
|
|
249
|
+
get renderOverlay() {
|
|
250
|
+
return html`
|
|
251
|
+
<sp-overlay
|
|
252
|
+
.triggerElement=${this}
|
|
253
|
+
.offset=${0}
|
|
254
|
+
?open=${this.open}
|
|
255
|
+
.placement=${this.placement}
|
|
256
|
+
type="auto"
|
|
257
|
+
.receivesFocus=${"true"}
|
|
258
|
+
@beforetoggle=${(event) => {
|
|
259
|
+
if (event.composedPath()[0] !== event.target) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
this.open = event.newState === "open";
|
|
263
|
+
if (!this.open) {
|
|
264
|
+
this.optionsMenu.updateSelectedItemIndex();
|
|
265
|
+
this.optionsMenu.closeDescendentOverlays();
|
|
266
|
+
}
|
|
267
|
+
}}
|
|
268
|
+
>
|
|
269
|
+
${this.renderContainer}
|
|
270
|
+
</sp-overlay>
|
|
271
|
+
`;
|
|
272
|
+
}
|
|
288
273
|
// a helper to throw focus to the button is needed because Safari
|
|
289
274
|
// won't include buttons in the tab order even with tabindex="0"
|
|
290
275
|
render() {
|
|
291
276
|
return html`
|
|
292
277
|
<span
|
|
293
278
|
id="focus-helper"
|
|
294
|
-
tabindex="${this.focused ? "-1" : "0"}"
|
|
279
|
+
tabindex="${this.focused || this.open ? "-1" : "0"}"
|
|
295
280
|
@focus=${this.onHelperFocus}
|
|
296
281
|
></span>
|
|
297
282
|
<button
|
|
@@ -303,11 +288,13 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
303
288
|
@blur=${this.onButtonBlur}
|
|
304
289
|
@click=${this.onButtonClick}
|
|
305
290
|
@focus=${this.onButtonFocus}
|
|
291
|
+
@pointerdown=${this.handlePointerdown}
|
|
306
292
|
?disabled=${this.disabled}
|
|
307
293
|
tabindex="-1"
|
|
308
294
|
>
|
|
309
295
|
${this.buttonContent}
|
|
310
296
|
</button>
|
|
297
|
+
${this.renderOverlay}
|
|
311
298
|
`;
|
|
312
299
|
}
|
|
313
300
|
update(changes) {
|
|
@@ -317,21 +304,15 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
317
304
|
if (changes.has("disabled") && this.disabled) {
|
|
318
305
|
this.open = false;
|
|
319
306
|
}
|
|
320
|
-
if (changes.has("
|
|
321
|
-
this.
|
|
322
|
-
(res) => this.menuStateResolver = res
|
|
323
|
-
);
|
|
324
|
-
if (this.open) {
|
|
325
|
-
this.openMenu();
|
|
326
|
-
} else {
|
|
327
|
-
this.closeMenu();
|
|
328
|
-
}
|
|
307
|
+
if (changes.has("value")) {
|
|
308
|
+
this.shouldScheduleManageSelection();
|
|
329
309
|
}
|
|
330
|
-
if (
|
|
331
|
-
this.
|
|
310
|
+
if (!this.hasUpdated) {
|
|
311
|
+
const deprecatedMenu = this.querySelector(":scope > sp-menu");
|
|
312
|
+
deprecatedMenu == null ? void 0 : deprecatedMenu.setAttribute("selects", "inherit");
|
|
332
313
|
}
|
|
333
314
|
if (true) {
|
|
334
|
-
if (!this.hasUpdated && this.querySelector("sp-menu")) {
|
|
315
|
+
if (!this.hasUpdated && this.querySelector(":scope > sp-menu")) {
|
|
335
316
|
const { localName } = this;
|
|
336
317
|
window.__swc.warn(
|
|
337
318
|
this,
|
|
@@ -354,7 +335,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
354
335
|
</div>
|
|
355
336
|
`;
|
|
356
337
|
}
|
|
357
|
-
get
|
|
338
|
+
get renderContainer() {
|
|
358
339
|
const content = html`
|
|
359
340
|
${this.dismissHelper}
|
|
360
341
|
<sp-menu
|
|
@@ -362,7 +343,11 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
362
343
|
role="${this.listRole}"
|
|
363
344
|
@change=${this.handleChange}
|
|
364
345
|
.selects=${this.selects}
|
|
365
|
-
|
|
346
|
+
.selected=${this.value ? [this.value] : []}
|
|
347
|
+
@sp-menu-item-added-or-updated=${this.shouldManageSelection}
|
|
348
|
+
>
|
|
349
|
+
<slot @slotchange=${this.shouldScheduleManageSelection}></slot>
|
|
350
|
+
</sp-menu>
|
|
366
351
|
${this.dismissHelper}
|
|
367
352
|
`;
|
|
368
353
|
if (this.isMobile.matches) {
|
|
@@ -370,9 +355,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
370
355
|
<sp-tray
|
|
371
356
|
id="popover"
|
|
372
357
|
role="dialog"
|
|
373
|
-
|
|
374
|
-
.overlayOpenCallback=${this.overlayOpenCallback}
|
|
375
|
-
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
358
|
+
style=${styleMap(this.containerStyles)}
|
|
376
359
|
>
|
|
377
360
|
${content}
|
|
378
361
|
</sp-tray>
|
|
@@ -382,56 +365,42 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
382
365
|
<sp-popover
|
|
383
366
|
id="popover"
|
|
384
367
|
role="dialog"
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
368
|
+
style=${styleMap(this.containerStyles)}
|
|
369
|
+
placement=${this.placement}
|
|
388
370
|
>
|
|
389
371
|
${content}
|
|
390
372
|
</sp-popover>
|
|
391
373
|
`;
|
|
392
374
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
if (this._willUpdateItems)
|
|
402
|
-
return;
|
|
403
|
-
this._willUpdateItems = true;
|
|
404
|
-
if ((event == null ? void 0 : event.item) === this.selectedItem) {
|
|
405
|
-
this.requestUpdate();
|
|
375
|
+
shouldScheduleManageSelection(event) {
|
|
376
|
+
if (!this.willManageSelection && (!event || event.target.getRootNode().host === this)) {
|
|
377
|
+
this.willManageSelection = true;
|
|
378
|
+
requestAnimationFrame(() => {
|
|
379
|
+
requestAnimationFrame(() => {
|
|
380
|
+
this.manageSelection();
|
|
381
|
+
});
|
|
382
|
+
});
|
|
406
383
|
}
|
|
407
|
-
|
|
384
|
+
}
|
|
385
|
+
shouldManageSelection() {
|
|
386
|
+
if (this.willManageSelection) {
|
|
408
387
|
return;
|
|
409
|
-
}
|
|
410
|
-
this.
|
|
411
|
-
|
|
412
|
-
if (this.open) {
|
|
413
|
-
await this.optionsMenu.updateComplete;
|
|
414
|
-
this.menuItems = this.optionsMenu.childItems;
|
|
415
|
-
} else {
|
|
416
|
-
this.menuItems = [
|
|
417
|
-
...this.querySelectorAll(
|
|
418
|
-
'sp-menu-item:not([slot="submenu"] *)'
|
|
419
|
-
)
|
|
420
|
-
];
|
|
421
|
-
}
|
|
422
|
-
this.manageSelection();
|
|
423
|
-
resolve();
|
|
424
|
-
this._willUpdateItems = false;
|
|
425
|
-
});
|
|
388
|
+
}
|
|
389
|
+
this.willManageSelection = true;
|
|
390
|
+
this.manageSelection();
|
|
426
391
|
}
|
|
427
392
|
async manageSelection() {
|
|
428
393
|
if (this.selects == null)
|
|
429
394
|
return;
|
|
430
|
-
await this.menuStatePromise;
|
|
431
395
|
this.selectionPromise = new Promise(
|
|
432
396
|
(res) => this.selectionResolver = res
|
|
433
397
|
);
|
|
434
398
|
let selectedItem;
|
|
399
|
+
await this.optionsMenu.updateComplete;
|
|
400
|
+
if (this.recentlyConnected) {
|
|
401
|
+
await new Promise((res) => requestAnimationFrame(() => res(true)));
|
|
402
|
+
this.recentlyConnected = false;
|
|
403
|
+
}
|
|
435
404
|
this.menuItems.forEach((item) => {
|
|
436
405
|
if (this.value === item.value && !item.disabled) {
|
|
437
406
|
selectedItem = item;
|
|
@@ -451,34 +420,22 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
451
420
|
this.optionsMenu.updateSelectedItemIndex();
|
|
452
421
|
}
|
|
453
422
|
this.selectionResolver();
|
|
423
|
+
this.willManageSelection = false;
|
|
454
424
|
}
|
|
455
425
|
async getUpdateComplete() {
|
|
456
426
|
const complete = await super.getUpdateComplete();
|
|
457
|
-
await this.menuStatePromise;
|
|
458
|
-
await this.itemsUpdated;
|
|
459
427
|
await this.selectionPromise;
|
|
460
428
|
return complete;
|
|
461
429
|
}
|
|
462
430
|
connectedCallback() {
|
|
463
|
-
this.updateMenuItems();
|
|
464
|
-
this.addEventListener(
|
|
465
|
-
"sp-menu-item-added-or-updated",
|
|
466
|
-
this.updateMenuItems
|
|
467
|
-
);
|
|
468
|
-
this.addEventListener("sp-menu-item-removed", this.updateMenuItems);
|
|
469
431
|
super.connectedCallback();
|
|
432
|
+
this.recentlyConnected = this.hasUpdated;
|
|
470
433
|
}
|
|
471
434
|
disconnectedCallback() {
|
|
472
435
|
this.close();
|
|
473
436
|
super.disconnectedCallback();
|
|
474
437
|
}
|
|
475
438
|
}
|
|
476
|
-
/**
|
|
477
|
-
* @private
|
|
478
|
-
*/
|
|
479
|
-
PickerBase.openOverlay = async (target, interaction, content, options) => {
|
|
480
|
-
return await openOverlay(target, interaction, content, options);
|
|
481
|
-
};
|
|
482
439
|
__decorateClass([
|
|
483
440
|
query("#button")
|
|
484
441
|
], PickerBase.prototype, "button", 2);
|
|
@@ -503,6 +460,9 @@ __decorateClass([
|
|
|
503
460
|
__decorateClass([
|
|
504
461
|
property({ type: Boolean, reflect: true })
|
|
505
462
|
], PickerBase.prototype, "readonly", 2);
|
|
463
|
+
__decorateClass([
|
|
464
|
+
query("sp-menu")
|
|
465
|
+
], PickerBase.prototype, "optionsMenu", 2);
|
|
506
466
|
__decorateClass([
|
|
507
467
|
property()
|
|
508
468
|
], PickerBase.prototype, "placement", 2);
|
|
@@ -514,7 +474,10 @@ __decorateClass([
|
|
|
514
474
|
], PickerBase.prototype, "value", 2);
|
|
515
475
|
__decorateClass([
|
|
516
476
|
property({ attribute: false })
|
|
517
|
-
], PickerBase.prototype, "selectedItem",
|
|
477
|
+
], PickerBase.prototype, "selectedItem", 1);
|
|
478
|
+
__decorateClass([
|
|
479
|
+
property({ attribute: false })
|
|
480
|
+
], PickerBase.prototype, "selectedItemContent", 1);
|
|
518
481
|
export class Picker extends PickerBase {
|
|
519
482
|
constructor() {
|
|
520
483
|
super(...arguments);
|
|
@@ -546,11 +509,12 @@ export class Picker extends PickerBase {
|
|
|
546
509
|
static get styles() {
|
|
547
510
|
return [pickerStyles, chevronStyles];
|
|
548
511
|
}
|
|
549
|
-
|
|
550
|
-
super.
|
|
551
|
-
if (this.quiet)
|
|
552
|
-
|
|
553
|
-
|
|
512
|
+
get containerStyles() {
|
|
513
|
+
const styles = super.containerStyles;
|
|
514
|
+
if (!this.quiet) {
|
|
515
|
+
styles["min-width"] = `${this.offsetWidth}px`;
|
|
516
|
+
}
|
|
517
|
+
return styles;
|
|
554
518
|
}
|
|
555
519
|
}
|
|
556
520
|
//# sourceMappingURL=Picker.dev.js.map
|