@spectrum-web-components/picker 0.14.2-overlay.33 → 0.15.0
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 +1741 -0
- package/package.json +12 -12
- package/src/Picker.d.ts +30 -14
- package/src/Picker.dev.js +166 -95
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +16 -29
- package/src/Picker.js.map +3 -3
- package/src/picker.css.dev.js +51 -93
- package/src/picker.css.dev.js.map +2 -2
- package/src/picker.css.js +51 -93
- package/src/picker.css.js.map +2 -2
- package/src/spectrum-config.js +71 -81
- package/src/spectrum-picker.css.dev.js +50 -92
- package/src/spectrum-picker.css.dev.js.map +2 -2
- package/src/spectrum-picker.css.js +50 -92
- package/src/spectrum-picker.css.js.map +2 -2
- package/sync/index.d.ts +1 -4
- package/sync/index.dev.js +3 -1
- 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 +57 -72
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +2 -10
- package/test/picker-reparenting.test.js.map +2 -2
- package/test/picker-responsive.test.js +2 -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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/picker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -66,19 +66,19 @@
|
|
|
66
66
|
],
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"@spectrum-web-components/base": "^0.7.4",
|
|
69
|
-
"@spectrum-web-components/button": "^0.20.
|
|
70
|
-
"@spectrum-web-components/icon": "^0.12.
|
|
71
|
-
"@spectrum-web-components/icons-ui": "^0.9.
|
|
72
|
-
"@spectrum-web-components/icons-workflow": "^0.9.
|
|
73
|
-
"@spectrum-web-components/menu": "^0.16.
|
|
74
|
-
"@spectrum-web-components/overlay": "^0.19.
|
|
75
|
-
"@spectrum-web-components/popover": "^0.12.
|
|
69
|
+
"@spectrum-web-components/button": "^0.20.3",
|
|
70
|
+
"@spectrum-web-components/icon": "^0.12.9",
|
|
71
|
+
"@spectrum-web-components/icons-ui": "^0.9.10",
|
|
72
|
+
"@spectrum-web-components/icons-workflow": "^0.9.10",
|
|
73
|
+
"@spectrum-web-components/menu": "^0.16.15",
|
|
74
|
+
"@spectrum-web-components/overlay": "^0.19.3",
|
|
75
|
+
"@spectrum-web-components/popover": "^0.12.15",
|
|
76
76
|
"@spectrum-web-components/reactive-controllers": "^0.3.5",
|
|
77
|
-
"@spectrum-web-components/shared": "^0.15.
|
|
78
|
-
"@spectrum-web-components/tray": "^0.5.1
|
|
77
|
+
"@spectrum-web-components/shared": "^0.15.5",
|
|
78
|
+
"@spectrum-web-components/tray": "^0.5.1"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@spectrum-css/picker": "^2.0.
|
|
81
|
+
"@spectrum-css/picker": "^2.0.5"
|
|
82
82
|
},
|
|
83
83
|
"types": "./src/index.d.ts",
|
|
84
84
|
"customElements": "custom-elements.json",
|
|
@@ -88,5 +88,5 @@
|
|
|
88
88
|
"./sync/index.js",
|
|
89
89
|
"./sync/sp-*.js"
|
|
90
90
|
],
|
|
91
|
-
"gitHead": "
|
|
91
|
+
"gitHead": "1e25ee121f3bc838dbb99bac62f3c95857570f7a"
|
|
92
92
|
}
|
package/src/Picker.d.ts
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { CSSResultArray, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
|
|
2
|
-
import { StyleInfo } from '@spectrum-web-components/base/src/directives.js';
|
|
3
2
|
import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
|
|
4
3
|
import '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';
|
|
5
4
|
import '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';
|
|
6
|
-
import '@spectrum-web-components/overlay/sp-overlay.js';
|
|
7
5
|
import '@spectrum-web-components/menu/sp-menu.js';
|
|
8
|
-
import type { Menu, MenuItem, MenuItemChildren } from '@spectrum-web-components/menu';
|
|
6
|
+
import type { Menu, MenuItem, MenuItemAddedOrUpdatedEvent, MenuItemChildren, MenuItemRemovedEvent } from '@spectrum-web-components/menu';
|
|
9
7
|
import '@spectrum-web-components/tray/sp-tray.js';
|
|
10
8
|
import '@spectrum-web-components/popover/sp-popover.js';
|
|
11
|
-
import { Placement } from '@spectrum-web-components/overlay';
|
|
9
|
+
import { OverlayOptions, Placement, TriggerInteractions } from '@spectrum-web-components/overlay';
|
|
12
10
|
import { MatchMediaController } from '@spectrum-web-components/reactive-controllers/src/MatchMedia.js';
|
|
13
11
|
declare const PickerBase_base: typeof Focusable & {
|
|
14
12
|
new (...args: any[]): import("@spectrum-web-components/base").SizedElementInterface;
|
|
@@ -24,6 +22,10 @@ declare const PickerBase_base: typeof Focusable & {
|
|
|
24
22
|
* @fires sp-closed - Announces that the overlay has been closed
|
|
25
23
|
*/
|
|
26
24
|
export declare class PickerBase extends PickerBase_base {
|
|
25
|
+
/**
|
|
26
|
+
* @private
|
|
27
|
+
*/
|
|
28
|
+
static openOverlay: (target: HTMLElement, interaction: TriggerInteractions, content: HTMLElement, options: OverlayOptions) => Promise<() => void>;
|
|
27
29
|
protected isMobile: MatchMediaController;
|
|
28
30
|
button: HTMLButtonElement;
|
|
29
31
|
get target(): HTMLButtonElement | this;
|
|
@@ -35,7 +37,8 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
35
37
|
open: boolean;
|
|
36
38
|
readonly: boolean;
|
|
37
39
|
selects: undefined | 'single';
|
|
38
|
-
|
|
40
|
+
menuItems: MenuItem[];
|
|
41
|
+
private restoreChildren?;
|
|
39
42
|
optionsMenu: Menu;
|
|
40
43
|
/**
|
|
41
44
|
* @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"}
|
|
@@ -44,9 +47,9 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
44
47
|
placement: Placement;
|
|
45
48
|
quiet: boolean;
|
|
46
49
|
value: string;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
selectedItem?: MenuItem;
|
|
51
|
+
private closeOverlay?;
|
|
52
|
+
private popoverEl;
|
|
50
53
|
protected listRole: 'listbox' | 'menu';
|
|
51
54
|
protected itemRole: string;
|
|
52
55
|
constructor();
|
|
@@ -61,21 +64,33 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
61
64
|
protected onKeydown: (event: KeyboardEvent) => void;
|
|
62
65
|
setValueFromItem(item: MenuItem, menuChangeEvent?: Event): Promise<void>;
|
|
63
66
|
protected setMenuItemSelected(item: MenuItem, value: boolean): void;
|
|
64
|
-
private preventToggle;
|
|
65
67
|
toggle(target?: boolean): void;
|
|
66
68
|
close(): void;
|
|
67
|
-
|
|
69
|
+
overlayOpenCallback: () => Promise<void>;
|
|
70
|
+
overlayCloseCallback: () => Promise<void>;
|
|
71
|
+
private popoverFragment;
|
|
72
|
+
private generatePopover;
|
|
73
|
+
private openMenu;
|
|
74
|
+
protected sizePopover(popover: HTMLElement): void;
|
|
75
|
+
private closeMenu;
|
|
68
76
|
protected get selectedItemContent(): MenuItemChildren;
|
|
69
|
-
protected set selectedItemContent(selectedItemContent: MenuItemChildren | undefined);
|
|
70
|
-
_selectedItemContent?: MenuItemChildren;
|
|
71
77
|
protected renderLabelContent(content: Node[]): TemplateResult | Node[];
|
|
72
78
|
protected get buttonContent(): TemplateResult[];
|
|
73
|
-
protected get renderOverlay(): TemplateResult;
|
|
74
79
|
protected render(): TemplateResult;
|
|
75
80
|
protected update(changes: PropertyValues<this>): void;
|
|
76
81
|
protected get dismissHelper(): TemplateResult;
|
|
77
|
-
protected get
|
|
82
|
+
protected get renderPopover(): TemplateResult;
|
|
83
|
+
private _willUpdateItems;
|
|
84
|
+
protected itemsUpdated: Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Acquire the available MenuItems in the Picker by
|
|
87
|
+
* direct element query or by assuming the list managed
|
|
88
|
+
* by the Menu within the open options overlay.
|
|
89
|
+
*/
|
|
90
|
+
protected updateMenuItems(event?: MenuItemAddedOrUpdatedEvent | MenuItemRemovedEvent): void;
|
|
78
91
|
protected manageSelection(): Promise<void>;
|
|
92
|
+
private menuStatePromise;
|
|
93
|
+
private menuStateResolver;
|
|
79
94
|
private selectionPromise;
|
|
80
95
|
private selectionResolver;
|
|
81
96
|
protected getUpdateComplete(): Promise<boolean>;
|
|
@@ -84,6 +99,7 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
84
99
|
}
|
|
85
100
|
export declare class Picker extends PickerBase {
|
|
86
101
|
static get styles(): CSSResultArray;
|
|
102
|
+
protected sizePopover(popover: HTMLElement): void;
|
|
87
103
|
protected onKeydown: (event: KeyboardEvent) => void;
|
|
88
104
|
}
|
|
89
105
|
export {};
|
package/src/Picker.dev.js
CHANGED
|
@@ -13,12 +13,10 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
13
13
|
import {
|
|
14
14
|
html,
|
|
15
15
|
nothing,
|
|
16
|
+
render,
|
|
16
17
|
SizedMixin
|
|
17
18
|
} from "@spectrum-web-components/base";
|
|
18
|
-
import {
|
|
19
|
-
classMap,
|
|
20
|
-
styleMap
|
|
21
|
-
} from "@spectrum-web-components/base/src/directives.js";
|
|
19
|
+
import { classMap } from "@spectrum-web-components/base/src/directives.js";
|
|
22
20
|
import {
|
|
23
21
|
property,
|
|
24
22
|
query
|
|
@@ -26,12 +24,15 @@ import {
|
|
|
26
24
|
import pickerStyles from "./picker.css.js";
|
|
27
25
|
import chevronStyles from "@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js";
|
|
28
26
|
import { Focusable } from "@spectrum-web-components/shared/src/focusable.js";
|
|
27
|
+
import { reparentChildren } from "@spectrum-web-components/shared/src/reparent-children.js";
|
|
29
28
|
import "@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js";
|
|
30
29
|
import "@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";
|
|
31
|
-
import "@spectrum-web-components/overlay/sp-overlay.js";
|
|
32
30
|
import "@spectrum-web-components/menu/sp-menu.js";
|
|
33
31
|
import "@spectrum-web-components/tray/sp-tray.js";
|
|
34
32
|
import "@spectrum-web-components/popover/sp-popover.js";
|
|
33
|
+
import {
|
|
34
|
+
openOverlay
|
|
35
|
+
} from "@spectrum-web-components/overlay";
|
|
35
36
|
import {
|
|
36
37
|
IS_MOBILE,
|
|
37
38
|
MatchMediaController
|
|
@@ -52,6 +53,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
52
53
|
this.open = false;
|
|
53
54
|
this.readonly = false;
|
|
54
55
|
this.selects = "single";
|
|
56
|
+
this.menuItems = [];
|
|
55
57
|
this.placement = "bottom-start";
|
|
56
58
|
this.quiet = false;
|
|
57
59
|
this.value = "";
|
|
@@ -65,33 +67,29 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
65
67
|
event.preventDefault();
|
|
66
68
|
this.toggle(true);
|
|
67
69
|
};
|
|
68
|
-
this.
|
|
70
|
+
this.overlayOpenCallback = async () => {
|
|
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
87
|
this.selectionPromise = Promise.resolve();
|
|
70
88
|
this.onKeydown = this.onKeydown.bind(this);
|
|
71
|
-
this.addEventListener("focusout", (event) => {
|
|
72
|
-
if (event.relatedTarget && this.contains(event.relatedTarget) || event.target !== this) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
this.open = false;
|
|
76
|
-
});
|
|
77
89
|
}
|
|
78
90
|
get target() {
|
|
79
91
|
return this.button;
|
|
80
92
|
}
|
|
81
|
-
get menuItems() {
|
|
82
|
-
return this.optionsMenu.childItems;
|
|
83
|
-
}
|
|
84
|
-
get selectedItem() {
|
|
85
|
-
return this._selectedItem;
|
|
86
|
-
}
|
|
87
|
-
set selectedItem(selectedItem) {
|
|
88
|
-
this.selectedItemContent = selectedItem ? selectedItem.itemChildren : void 0;
|
|
89
|
-
if (selectedItem === this.selectedItem)
|
|
90
|
-
return;
|
|
91
|
-
const oldSelectedItem = this.selectedItem;
|
|
92
|
-
this._selectedItem = selectedItem;
|
|
93
|
-
this.requestUpdate("selectedItem", oldSelectedItem);
|
|
94
|
-
}
|
|
95
93
|
get focusElement() {
|
|
96
94
|
if (this.open) {
|
|
97
95
|
return this.optionsMenu;
|
|
@@ -130,8 +128,8 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
130
128
|
handleChange(event) {
|
|
131
129
|
const target = event.target;
|
|
132
130
|
const [selected] = target.selectedItems;
|
|
133
|
-
event.stopPropagation();
|
|
134
131
|
if (event.cancelable) {
|
|
132
|
+
event.stopPropagation();
|
|
135
133
|
this.setValueFromItem(selected, event);
|
|
136
134
|
} else {
|
|
137
135
|
this.open = false;
|
|
@@ -175,8 +173,6 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
175
173
|
item.selected = value;
|
|
176
174
|
}
|
|
177
175
|
toggle(target) {
|
|
178
|
-
if (this.preventToggle)
|
|
179
|
-
return;
|
|
180
176
|
if (this.readonly) {
|
|
181
177
|
return;
|
|
182
178
|
}
|
|
@@ -188,27 +184,74 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
188
184
|
}
|
|
189
185
|
this.open = false;
|
|
190
186
|
}
|
|
191
|
-
|
|
187
|
+
async generatePopover() {
|
|
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) {
|
|
192
238
|
if (this.isMobile.matches) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
};
|
|
239
|
+
popover.style.setProperty("--swc-menu-width", `100%`);
|
|
240
|
+
return;
|
|
196
241
|
}
|
|
197
|
-
if (this.quiet)
|
|
198
|
-
return {};
|
|
199
|
-
return {
|
|
200
|
-
"min-width": `${this.offsetWidth}px`
|
|
201
|
-
};
|
|
202
242
|
}
|
|
203
|
-
|
|
204
|
-
|
|
243
|
+
async closeMenu() {
|
|
244
|
+
if (this.closeOverlay) {
|
|
245
|
+
const closeOverlay = this.closeOverlay;
|
|
246
|
+
delete this.closeOverlay;
|
|
247
|
+
(await closeOverlay)();
|
|
248
|
+
}
|
|
205
249
|
}
|
|
206
|
-
|
|
207
|
-
if (
|
|
208
|
-
return;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
this.requestUpdate("selectedItemContent", oldContent);
|
|
250
|
+
get selectedItemContent() {
|
|
251
|
+
if (this.selectedItem) {
|
|
252
|
+
return this.selectedItem.itemChildren;
|
|
253
|
+
}
|
|
254
|
+
return { icon: [], content: [] };
|
|
212
255
|
}
|
|
213
256
|
renderLabelContent(content) {
|
|
214
257
|
if (this.value && this.selectedItem) {
|
|
@@ -242,40 +285,13 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
242
285
|
`
|
|
243
286
|
];
|
|
244
287
|
}
|
|
245
|
-
get renderOverlay() {
|
|
246
|
-
return html`
|
|
247
|
-
<sp-overlay
|
|
248
|
-
.triggerElement=${this}
|
|
249
|
-
.offset=${0}
|
|
250
|
-
?open=${this.open}
|
|
251
|
-
.placement=${this.placement}
|
|
252
|
-
type="auto"
|
|
253
|
-
@sp-menu-item-added-or-updated=${this.manageSelection}
|
|
254
|
-
@beforetoggle=${(event) => {
|
|
255
|
-
this.open = event.target.open;
|
|
256
|
-
if (!this.open) {
|
|
257
|
-
this.preventToggle = true;
|
|
258
|
-
requestAnimationFrame(
|
|
259
|
-
() => this.preventToggle = false
|
|
260
|
-
);
|
|
261
|
-
this.optionsMenu.updateSelectedItemIndex();
|
|
262
|
-
this.optionsMenu.closeDescendentOverlays();
|
|
263
|
-
} else {
|
|
264
|
-
this.optionsMenu.focus();
|
|
265
|
-
}
|
|
266
|
-
}}
|
|
267
|
-
>
|
|
268
|
-
${this.renderContainer}
|
|
269
|
-
</sp-overlay>
|
|
270
|
-
`;
|
|
271
|
-
}
|
|
272
288
|
// a helper to throw focus to the button is needed because Safari
|
|
273
289
|
// won't include buttons in the tab order even with tabindex="0"
|
|
274
290
|
render() {
|
|
275
291
|
return html`
|
|
276
292
|
<span
|
|
277
293
|
id="focus-helper"
|
|
278
|
-
tabindex="${this.focused
|
|
294
|
+
tabindex="${this.focused ? "-1" : "0"}"
|
|
279
295
|
@focus=${this.onHelperFocus}
|
|
280
296
|
></span>
|
|
281
297
|
<button
|
|
@@ -292,7 +308,6 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
292
308
|
>
|
|
293
309
|
${this.buttonContent}
|
|
294
310
|
</button>
|
|
295
|
-
${this.renderOverlay}
|
|
296
311
|
`;
|
|
297
312
|
}
|
|
298
313
|
update(changes) {
|
|
@@ -302,10 +317,18 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
302
317
|
if (changes.has("disabled") && this.disabled) {
|
|
303
318
|
this.open = false;
|
|
304
319
|
}
|
|
305
|
-
if (changes.has("
|
|
306
|
-
|
|
307
|
-
this.
|
|
308
|
-
|
|
320
|
+
if (changes.has("open") && (this.open || typeof changes.get("open") !== "undefined")) {
|
|
321
|
+
this.menuStatePromise = new Promise(
|
|
322
|
+
(res) => this.menuStateResolver = res
|
|
323
|
+
);
|
|
324
|
+
if (this.open) {
|
|
325
|
+
this.openMenu();
|
|
326
|
+
} else {
|
|
327
|
+
this.closeMenu();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (changes.has("value") && !changes.has("selectedItem")) {
|
|
331
|
+
this.updateMenuItems();
|
|
309
332
|
}
|
|
310
333
|
if (true) {
|
|
311
334
|
if (!this.hasUpdated && this.querySelector("sp-menu")) {
|
|
@@ -331,7 +354,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
331
354
|
</div>
|
|
332
355
|
`;
|
|
333
356
|
}
|
|
334
|
-
get
|
|
357
|
+
get renderPopover() {
|
|
335
358
|
const content = html`
|
|
336
359
|
${this.dismissHelper}
|
|
337
360
|
<sp-menu
|
|
@@ -339,10 +362,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
339
362
|
role="${this.listRole}"
|
|
340
363
|
@change=${this.handleChange}
|
|
341
364
|
.selects=${this.selects}
|
|
342
|
-
|
|
343
|
-
>
|
|
344
|
-
<slot></slot>
|
|
345
|
-
</sp-menu>
|
|
365
|
+
></sp-menu>
|
|
346
366
|
${this.dismissHelper}
|
|
347
367
|
`;
|
|
348
368
|
if (this.isMobile.matches) {
|
|
@@ -350,7 +370,9 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
350
370
|
<sp-tray
|
|
351
371
|
id="popover"
|
|
352
372
|
role="dialog"
|
|
353
|
-
|
|
373
|
+
@sp-menu-item-added-or-updated=${this.updateMenuItems}
|
|
374
|
+
.overlayOpenCallback=${this.overlayOpenCallback}
|
|
375
|
+
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
354
376
|
>
|
|
355
377
|
${content}
|
|
356
378
|
</sp-tray>
|
|
@@ -360,21 +382,56 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
360
382
|
<sp-popover
|
|
361
383
|
id="popover"
|
|
362
384
|
role="dialog"
|
|
363
|
-
|
|
364
|
-
|
|
385
|
+
@sp-menu-item-added-or-updated=${this.updateMenuItems}
|
|
386
|
+
.overlayOpenCallback=${this.overlayOpenCallback}
|
|
387
|
+
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
365
388
|
>
|
|
366
389
|
${content}
|
|
367
390
|
</sp-popover>
|
|
368
391
|
`;
|
|
369
392
|
}
|
|
393
|
+
/**
|
|
394
|
+
* Acquire the available MenuItems in the Picker by
|
|
395
|
+
* direct element query or by assuming the list managed
|
|
396
|
+
* by the Menu within the open options overlay.
|
|
397
|
+
*/
|
|
398
|
+
updateMenuItems(event) {
|
|
399
|
+
if (this.open && (event == null ? void 0 : event.type) === "sp-menu-item-removed")
|
|
400
|
+
return;
|
|
401
|
+
if (this._willUpdateItems)
|
|
402
|
+
return;
|
|
403
|
+
this._willUpdateItems = true;
|
|
404
|
+
if ((event == null ? void 0 : event.item) === this.selectedItem) {
|
|
405
|
+
this.requestUpdate();
|
|
406
|
+
}
|
|
407
|
+
let resolve = () => {
|
|
408
|
+
return;
|
|
409
|
+
};
|
|
410
|
+
this.itemsUpdated = new Promise((res) => resolve = res);
|
|
411
|
+
window.requestAnimationFrame(async () => {
|
|
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
|
+
});
|
|
426
|
+
}
|
|
370
427
|
async manageSelection() {
|
|
371
428
|
if (this.selects == null)
|
|
372
429
|
return;
|
|
430
|
+
await this.menuStatePromise;
|
|
373
431
|
this.selectionPromise = new Promise(
|
|
374
432
|
(res) => this.selectionResolver = res
|
|
375
433
|
);
|
|
376
434
|
let selectedItem;
|
|
377
|
-
await this.optionsMenu.updateComplete;
|
|
378
435
|
this.menuItems.forEach((item) => {
|
|
379
436
|
if (this.value === item.value && !item.disabled) {
|
|
380
437
|
selectedItem = item;
|
|
@@ -397,10 +454,18 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
397
454
|
}
|
|
398
455
|
async getUpdateComplete() {
|
|
399
456
|
const complete = await super.getUpdateComplete();
|
|
457
|
+
await this.menuStatePromise;
|
|
458
|
+
await this.itemsUpdated;
|
|
400
459
|
await this.selectionPromise;
|
|
401
460
|
return complete;
|
|
402
461
|
}
|
|
403
462
|
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);
|
|
404
469
|
super.connectedCallback();
|
|
405
470
|
}
|
|
406
471
|
disconnectedCallback() {
|
|
@@ -408,6 +473,12 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
408
473
|
super.disconnectedCallback();
|
|
409
474
|
}
|
|
410
475
|
}
|
|
476
|
+
/**
|
|
477
|
+
* @private
|
|
478
|
+
*/
|
|
479
|
+
PickerBase.openOverlay = async (target, interaction, content, options) => {
|
|
480
|
+
return await openOverlay(target, interaction, content, options);
|
|
481
|
+
};
|
|
411
482
|
__decorateClass([
|
|
412
483
|
query("#button")
|
|
413
484
|
], PickerBase.prototype, "button", 2);
|
|
@@ -432,9 +503,6 @@ __decorateClass([
|
|
|
432
503
|
__decorateClass([
|
|
433
504
|
property({ type: Boolean, reflect: true })
|
|
434
505
|
], PickerBase.prototype, "readonly", 2);
|
|
435
|
-
__decorateClass([
|
|
436
|
-
query("sp-menu")
|
|
437
|
-
], PickerBase.prototype, "optionsMenu", 2);
|
|
438
506
|
__decorateClass([
|
|
439
507
|
property()
|
|
440
508
|
], PickerBase.prototype, "placement", 2);
|
|
@@ -446,10 +514,7 @@ __decorateClass([
|
|
|
446
514
|
], PickerBase.prototype, "value", 2);
|
|
447
515
|
__decorateClass([
|
|
448
516
|
property({ attribute: false })
|
|
449
|
-
], PickerBase.prototype, "selectedItem",
|
|
450
|
-
__decorateClass([
|
|
451
|
-
property({ attribute: false })
|
|
452
|
-
], PickerBase.prototype, "selectedItemContent", 1);
|
|
517
|
+
], PickerBase.prototype, "selectedItem", 2);
|
|
453
518
|
export class Picker extends PickerBase {
|
|
454
519
|
constructor() {
|
|
455
520
|
super(...arguments);
|
|
@@ -481,5 +546,11 @@ export class Picker extends PickerBase {
|
|
|
481
546
|
static get styles() {
|
|
482
547
|
return [pickerStyles, chevronStyles];
|
|
483
548
|
}
|
|
549
|
+
sizePopover(popover) {
|
|
550
|
+
super.sizePopover(popover);
|
|
551
|
+
if (this.quiet)
|
|
552
|
+
return;
|
|
553
|
+
popover.style.setProperty("min-width", `${this.offsetWidth}px`);
|
|
554
|
+
}
|
|
484
555
|
}
|
|
485
556
|
//# sourceMappingURL=Picker.dev.js.map
|