@spectrum-web-components/picker 0.14.2 → 0.15.1-overlay.22
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/package.json +13 -13
- package/src/Picker.d.ts +18 -29
- package/src/Picker.dev.js +119 -165
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +33 -20
- package/src/Picker.js.map +3 -3
- package/src/picker.css.dev.js +14 -35
- package/src/picker.css.dev.js.map +2 -2
- package/src/picker.css.js +14 -35
- package/src/picker.css.js.map +2 -2
- package/src/spectrum-config.js +71 -81
- package/src/spectrum-picker.css.dev.js +13 -34
- package/src/spectrum-picker.css.dev.js.map +2 -2
- package/src/spectrum-picker.css.js +13 -34
- package/src/spectrum-picker.css.js.map +2 -2
- 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 +117 -75
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +16 -2
- 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/custom-elements.json +0 -1741
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/picker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1-overlay.22+e296a22f1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -65,17 +65,17 @@
|
|
|
65
65
|
"lit-html"
|
|
66
66
|
],
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@spectrum-web-components/base": "^0.7.
|
|
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.
|
|
76
|
-
"@spectrum-web-components/reactive-controllers": "^0.3.
|
|
77
|
-
"@spectrum-web-components/shared": "^0.15.
|
|
78
|
-
"@spectrum-web-components/tray": "^0.5.
|
|
68
|
+
"@spectrum-web-components/base": "^0.7.5-overlay.250+e296a22f1",
|
|
69
|
+
"@spectrum-web-components/button": "^0.20.4-overlay.22+e296a22f1",
|
|
70
|
+
"@spectrum-web-components/icon": "^0.12.10-overlay.22+e296a22f1",
|
|
71
|
+
"@spectrum-web-components/icons-ui": "^0.9.11-overlay.22+e296a22f1",
|
|
72
|
+
"@spectrum-web-components/icons-workflow": "^0.9.11-overlay.22+e296a22f1",
|
|
73
|
+
"@spectrum-web-components/menu": "^0.16.16-overlay.22+e296a22f1",
|
|
74
|
+
"@spectrum-web-components/overlay": "^0.19.4-overlay.22+e296a22f1",
|
|
75
|
+
"@spectrum-web-components/popover": "^0.12.16-overlay.22+e296a22f1",
|
|
76
|
+
"@spectrum-web-components/reactive-controllers": "^0.3.6-overlay.280+e296a22f1",
|
|
77
|
+
"@spectrum-web-components/shared": "^0.15.6-overlay.250+e296a22f1",
|
|
78
|
+
"@spectrum-web-components/tray": "^0.5.2-overlay.22+e296a22f1"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@spectrum-css/picker": "^2.0.5"
|
|
@@ -88,5 +88,5 @@
|
|
|
88
88
|
"./sync/index.js",
|
|
89
89
|
"./sync/sp-*.js"
|
|
90
90
|
],
|
|
91
|
-
"gitHead": "
|
|
91
|
+
"gitHead": "e296a22f1eeff7d62753caf21d2bae4ba406cbbd"
|
|
92
92
|
}
|
package/src/Picker.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
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;
|
|
@@ -22,10 +24,6 @@ declare const PickerBase_base: typeof Focusable & {
|
|
|
22
24
|
* @fires sp-closed - Announces that the overlay has been closed
|
|
23
25
|
*/
|
|
24
26
|
export declare class PickerBase extends PickerBase_base {
|
|
25
|
-
/**
|
|
26
|
-
* @private
|
|
27
|
-
*/
|
|
28
|
-
static openOverlay: (target: HTMLElement, interaction: TriggerInteractions, content: HTMLElement, options: OverlayOptions) => Promise<() => void>;
|
|
29
27
|
protected isMobile: MatchMediaController;
|
|
30
28
|
button: HTMLButtonElement;
|
|
31
29
|
get target(): HTMLButtonElement | this;
|
|
@@ -37,8 +35,7 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
37
35
|
open: boolean;
|
|
38
36
|
readonly: boolean;
|
|
39
37
|
selects: undefined | 'single';
|
|
40
|
-
menuItems: MenuItem[];
|
|
41
|
-
private restoreChildren?;
|
|
38
|
+
get menuItems(): MenuItem[];
|
|
42
39
|
optionsMenu: Menu;
|
|
43
40
|
/**
|
|
44
41
|
* @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"}
|
|
@@ -47,9 +44,9 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
47
44
|
placement: Placement;
|
|
48
45
|
quiet: boolean;
|
|
49
46
|
value: string;
|
|
50
|
-
selectedItem
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
get selectedItem(): MenuItem | undefined;
|
|
48
|
+
set selectedItem(selectedItem: MenuItem | undefined);
|
|
49
|
+
_selectedItem?: MenuItem;
|
|
53
50
|
protected listRole: 'listbox' | 'menu';
|
|
54
51
|
protected itemRole: string;
|
|
55
52
|
constructor();
|
|
@@ -64,33 +61,24 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
64
61
|
protected onKeydown: (event: KeyboardEvent) => void;
|
|
65
62
|
setValueFromItem(item: MenuItem, menuChangeEvent?: Event): Promise<void>;
|
|
66
63
|
protected setMenuItemSelected(item: MenuItem, value: boolean): void;
|
|
64
|
+
private preventToggle;
|
|
67
65
|
toggle(target?: boolean): void;
|
|
68
66
|
close(): void;
|
|
69
|
-
|
|
70
|
-
overlayCloseCallback: () => Promise<void>;
|
|
71
|
-
private popoverFragment;
|
|
72
|
-
private generatePopover;
|
|
73
|
-
private openMenu;
|
|
74
|
-
protected sizePopover(popover: HTMLElement): void;
|
|
75
|
-
private closeMenu;
|
|
67
|
+
protected get containerStyles(): StyleInfo;
|
|
76
68
|
protected get selectedItemContent(): MenuItemChildren;
|
|
69
|
+
protected set selectedItemContent(selectedItemContent: MenuItemChildren | undefined);
|
|
70
|
+
_selectedItemContent?: MenuItemChildren;
|
|
77
71
|
protected renderLabelContent(content: Node[]): TemplateResult | Node[];
|
|
78
72
|
protected get buttonContent(): TemplateResult[];
|
|
73
|
+
protected get renderOverlay(): TemplateResult;
|
|
79
74
|
protected render(): TemplateResult;
|
|
80
75
|
protected update(changes: PropertyValues<this>): void;
|
|
81
76
|
protected get dismissHelper(): TemplateResult;
|
|
82
|
-
protected get
|
|
83
|
-
private
|
|
84
|
-
protected
|
|
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;
|
|
77
|
+
protected get renderContainer(): TemplateResult;
|
|
78
|
+
private willManageSelection;
|
|
79
|
+
protected shouldScheduleManageSelection(event?: Event): void;
|
|
80
|
+
protected shouldManageSelection(): void;
|
|
91
81
|
protected manageSelection(): Promise<void>;
|
|
92
|
-
private menuStatePromise;
|
|
93
|
-
private menuStateResolver;
|
|
94
82
|
private selectionPromise;
|
|
95
83
|
private selectionResolver;
|
|
96
84
|
protected getUpdateComplete(): Promise<boolean>;
|
|
@@ -99,6 +87,7 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
99
87
|
}
|
|
100
88
|
export declare class Picker extends PickerBase {
|
|
101
89
|
static get styles(): CSSResultArray;
|
|
90
|
+
protected get containerStyles(): StyleInfo;
|
|
102
91
|
protected onKeydown: (event: KeyboardEvent) => void;
|
|
103
92
|
}
|
|
104
93
|
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,7 +52,6 @@ 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 = "";
|
|
@@ -67,29 +65,34 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
67
65
|
event.preventDefault();
|
|
68
66
|
this.toggle(true);
|
|
69
67
|
};
|
|
70
|
-
this.
|
|
71
|
-
|
|
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();
|
|
68
|
+
this.preventToggle = false;
|
|
69
|
+
this.willManageSelection = false;
|
|
87
70
|
this.selectionPromise = Promise.resolve();
|
|
88
71
|
this.onKeydown = this.onKeydown.bind(this);
|
|
72
|
+
this.addEventListener("focusout", (event) => {
|
|
73
|
+
if (event.relatedTarget && this.contains(event.relatedTarget) || event.target !== this) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.open = false;
|
|
77
|
+
});
|
|
89
78
|
}
|
|
90
79
|
get target() {
|
|
91
80
|
return this.button;
|
|
92
81
|
}
|
|
82
|
+
get menuItems() {
|
|
83
|
+
return this.optionsMenu.childItems;
|
|
84
|
+
}
|
|
85
|
+
get selectedItem() {
|
|
86
|
+
return this._selectedItem;
|
|
87
|
+
}
|
|
88
|
+
set selectedItem(selectedItem) {
|
|
89
|
+
this.selectedItemContent = selectedItem ? selectedItem.itemChildren : void 0;
|
|
90
|
+
if (selectedItem === this.selectedItem)
|
|
91
|
+
return;
|
|
92
|
+
const oldSelectedItem = this.selectedItem;
|
|
93
|
+
this._selectedItem = selectedItem;
|
|
94
|
+
this.requestUpdate("selectedItem", oldSelectedItem);
|
|
95
|
+
}
|
|
93
96
|
get focusElement() {
|
|
94
97
|
if (this.open) {
|
|
95
98
|
return this.optionsMenu;
|
|
@@ -128,20 +131,22 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
128
131
|
handleChange(event) {
|
|
129
132
|
const target = event.target;
|
|
130
133
|
const [selected] = target.selectedItems;
|
|
134
|
+
event.stopPropagation();
|
|
131
135
|
if (event.cancelable) {
|
|
132
|
-
event.stopPropagation();
|
|
133
136
|
this.setValueFromItem(selected, event);
|
|
134
137
|
} else {
|
|
135
138
|
this.open = false;
|
|
136
139
|
}
|
|
137
140
|
}
|
|
138
141
|
async setValueFromItem(item, menuChangeEvent) {
|
|
142
|
+
this.open = false;
|
|
139
143
|
const oldSelectedItem = this.selectedItem;
|
|
140
144
|
const oldValue = this.value;
|
|
141
|
-
this.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
+
if (this.selects) {
|
|
146
|
+
this.selectedItem = item;
|
|
147
|
+
this.value = item.value;
|
|
148
|
+
await this.updateComplete;
|
|
149
|
+
}
|
|
145
150
|
const applyDefault = this.dispatchEvent(
|
|
146
151
|
new Event("change", {
|
|
147
152
|
bubbles: true,
|
|
@@ -149,7 +154,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
149
154
|
composed: true
|
|
150
155
|
})
|
|
151
156
|
);
|
|
152
|
-
if (!applyDefault) {
|
|
157
|
+
if (!applyDefault && this.selects) {
|
|
153
158
|
if (menuChangeEvent) {
|
|
154
159
|
menuChangeEvent.preventDefault();
|
|
155
160
|
}
|
|
@@ -173,6 +178,8 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
173
178
|
item.selected = value;
|
|
174
179
|
}
|
|
175
180
|
toggle(target) {
|
|
181
|
+
if (this.preventToggle)
|
|
182
|
+
return;
|
|
176
183
|
if (this.readonly) {
|
|
177
184
|
return;
|
|
178
185
|
}
|
|
@@ -184,77 +191,23 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
184
191
|
}
|
|
185
192
|
this.open = false;
|
|
186
193
|
}
|
|
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) {
|
|
194
|
+
get containerStyles() {
|
|
238
195
|
if (this.isMobile.matches) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
if (this.quiet)
|
|
243
|
-
return;
|
|
244
|
-
popover.style.setProperty("min-width", `${this.offsetWidth}px`);
|
|
245
|
-
}
|
|
246
|
-
async closeMenu() {
|
|
247
|
-
if (this.closeOverlay) {
|
|
248
|
-
const closeOverlay = this.closeOverlay;
|
|
249
|
-
delete this.closeOverlay;
|
|
250
|
-
(await closeOverlay)();
|
|
196
|
+
return {
|
|
197
|
+
"--swc-menu-width": "100%"
|
|
198
|
+
};
|
|
251
199
|
}
|
|
200
|
+
return {};
|
|
252
201
|
}
|
|
253
202
|
get selectedItemContent() {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
203
|
+
return this._selectedItemContent || { icon: [], content: [] };
|
|
204
|
+
}
|
|
205
|
+
set selectedItemContent(selectedItemContent) {
|
|
206
|
+
if (selectedItemContent === this.selectedItemContent)
|
|
207
|
+
return;
|
|
208
|
+
const oldContent = this.selectedItemContent;
|
|
209
|
+
this._selectedItemContent = selectedItemContent;
|
|
210
|
+
this.requestUpdate("selectedItemContent", oldContent);
|
|
258
211
|
}
|
|
259
212
|
renderLabelContent(content) {
|
|
260
213
|
if (this.value && this.selectedItem) {
|
|
@@ -288,13 +241,39 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
288
241
|
`
|
|
289
242
|
];
|
|
290
243
|
}
|
|
244
|
+
get renderOverlay() {
|
|
245
|
+
return html`
|
|
246
|
+
<sp-overlay
|
|
247
|
+
.triggerElement=${this}
|
|
248
|
+
.offset=${0}
|
|
249
|
+
?open=${this.open}
|
|
250
|
+
.placement=${this.placement}
|
|
251
|
+
type="auto"
|
|
252
|
+
@beforetoggle=${(event) => {
|
|
253
|
+
this.open = event.target.open;
|
|
254
|
+
if (!this.open) {
|
|
255
|
+
this.preventToggle = true;
|
|
256
|
+
requestAnimationFrame(
|
|
257
|
+
() => this.preventToggle = false
|
|
258
|
+
);
|
|
259
|
+
this.optionsMenu.updateSelectedItemIndex();
|
|
260
|
+
this.optionsMenu.closeDescendentOverlays();
|
|
261
|
+
} else {
|
|
262
|
+
this.optionsMenu.focus();
|
|
263
|
+
}
|
|
264
|
+
}}
|
|
265
|
+
>
|
|
266
|
+
${this.renderContainer}
|
|
267
|
+
</sp-overlay>
|
|
268
|
+
`;
|
|
269
|
+
}
|
|
291
270
|
// a helper to throw focus to the button is needed because Safari
|
|
292
271
|
// won't include buttons in the tab order even with tabindex="0"
|
|
293
272
|
render() {
|
|
294
273
|
return html`
|
|
295
274
|
<span
|
|
296
275
|
id="focus-helper"
|
|
297
|
-
tabindex="${this.focused ? "-1" : "0"}"
|
|
276
|
+
tabindex="${this.focused || this.open ? "-1" : "0"}"
|
|
298
277
|
@focus=${this.onHelperFocus}
|
|
299
278
|
></span>
|
|
300
279
|
<button
|
|
@@ -311,6 +290,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
311
290
|
>
|
|
312
291
|
${this.buttonContent}
|
|
313
292
|
</button>
|
|
293
|
+
${this.renderOverlay}
|
|
314
294
|
`;
|
|
315
295
|
}
|
|
316
296
|
update(changes) {
|
|
@@ -320,18 +300,8 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
320
300
|
if (changes.has("disabled") && this.disabled) {
|
|
321
301
|
this.open = false;
|
|
322
302
|
}
|
|
323
|
-
if (changes.has("
|
|
324
|
-
this.
|
|
325
|
-
(res) => this.menuStateResolver = res
|
|
326
|
-
);
|
|
327
|
-
if (this.open) {
|
|
328
|
-
this.openMenu();
|
|
329
|
-
} else {
|
|
330
|
-
this.closeMenu();
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
if (changes.has("value") && !changes.has("selectedItem")) {
|
|
334
|
-
this.updateMenuItems();
|
|
303
|
+
if (changes.has("value")) {
|
|
304
|
+
this.shouldScheduleManageSelection();
|
|
335
305
|
}
|
|
336
306
|
if (true) {
|
|
337
307
|
if (!this.hasUpdated && this.querySelector("sp-menu")) {
|
|
@@ -357,7 +327,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
357
327
|
</div>
|
|
358
328
|
`;
|
|
359
329
|
}
|
|
360
|
-
get
|
|
330
|
+
get renderContainer() {
|
|
361
331
|
const content = html`
|
|
362
332
|
${this.dismissHelper}
|
|
363
333
|
<sp-menu
|
|
@@ -365,7 +335,11 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
365
335
|
role="${this.listRole}"
|
|
366
336
|
@change=${this.handleChange}
|
|
367
337
|
.selects=${this.selects}
|
|
368
|
-
|
|
338
|
+
.selected=${this.value ? [this.value] : []}
|
|
339
|
+
@sp-menu-item-added-or-updated=${this.shouldManageSelection}
|
|
340
|
+
>
|
|
341
|
+
<slot @slotchange=${this.shouldScheduleManageSelection}></slot>
|
|
342
|
+
</sp-menu>
|
|
369
343
|
${this.dismissHelper}
|
|
370
344
|
`;
|
|
371
345
|
if (this.isMobile.matches) {
|
|
@@ -373,9 +347,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
373
347
|
<sp-tray
|
|
374
348
|
id="popover"
|
|
375
349
|
role="dialog"
|
|
376
|
-
|
|
377
|
-
.overlayOpenCallback=${this.overlayOpenCallback}
|
|
378
|
-
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
350
|
+
style=${styleMap(this.containerStyles)}
|
|
379
351
|
>
|
|
380
352
|
${content}
|
|
381
353
|
</sp-tray>
|
|
@@ -385,56 +357,38 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
385
357
|
<sp-popover
|
|
386
358
|
id="popover"
|
|
387
359
|
role="dialog"
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
360
|
+
style=${styleMap(this.containerStyles)}
|
|
361
|
+
placement=${this.placement}
|
|
391
362
|
>
|
|
392
363
|
${content}
|
|
393
364
|
</sp-popover>
|
|
394
365
|
`;
|
|
395
366
|
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
if (this._willUpdateItems)
|
|
405
|
-
return;
|
|
406
|
-
this._willUpdateItems = true;
|
|
407
|
-
if ((event == null ? void 0 : event.item) === this.selectedItem) {
|
|
408
|
-
this.requestUpdate();
|
|
367
|
+
shouldScheduleManageSelection(event) {
|
|
368
|
+
if (!this.willManageSelection && (!event || event.target.getRootNode().host === this)) {
|
|
369
|
+
this.willManageSelection = true;
|
|
370
|
+
requestAnimationFrame(() => {
|
|
371
|
+
requestAnimationFrame(() => {
|
|
372
|
+
this.manageSelection();
|
|
373
|
+
});
|
|
374
|
+
});
|
|
409
375
|
}
|
|
410
|
-
|
|
376
|
+
}
|
|
377
|
+
shouldManageSelection() {
|
|
378
|
+
if (this.willManageSelection) {
|
|
411
379
|
return;
|
|
412
|
-
}
|
|
413
|
-
this.
|
|
414
|
-
|
|
415
|
-
if (this.open) {
|
|
416
|
-
await this.optionsMenu.updateComplete;
|
|
417
|
-
this.menuItems = this.optionsMenu.childItems;
|
|
418
|
-
} else {
|
|
419
|
-
this.menuItems = [
|
|
420
|
-
...this.querySelectorAll(
|
|
421
|
-
'sp-menu-item:not([slot="submenu"] *)'
|
|
422
|
-
)
|
|
423
|
-
];
|
|
424
|
-
}
|
|
425
|
-
this.manageSelection();
|
|
426
|
-
resolve();
|
|
427
|
-
this._willUpdateItems = false;
|
|
428
|
-
});
|
|
380
|
+
}
|
|
381
|
+
this.willManageSelection = true;
|
|
382
|
+
this.manageSelection();
|
|
429
383
|
}
|
|
430
384
|
async manageSelection() {
|
|
431
385
|
if (this.selects == null)
|
|
432
386
|
return;
|
|
433
|
-
await this.menuStatePromise;
|
|
434
387
|
this.selectionPromise = new Promise(
|
|
435
388
|
(res) => this.selectionResolver = res
|
|
436
389
|
);
|
|
437
390
|
let selectedItem;
|
|
391
|
+
await this.optionsMenu.updateComplete;
|
|
438
392
|
this.menuItems.forEach((item) => {
|
|
439
393
|
if (this.value === item.value && !item.disabled) {
|
|
440
394
|
selectedItem = item;
|
|
@@ -454,21 +408,14 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
454
408
|
this.optionsMenu.updateSelectedItemIndex();
|
|
455
409
|
}
|
|
456
410
|
this.selectionResolver();
|
|
411
|
+
this.willManageSelection = false;
|
|
457
412
|
}
|
|
458
413
|
async getUpdateComplete() {
|
|
459
414
|
const complete = await super.getUpdateComplete();
|
|
460
|
-
await this.menuStatePromise;
|
|
461
|
-
await this.itemsUpdated;
|
|
462
415
|
await this.selectionPromise;
|
|
463
416
|
return complete;
|
|
464
417
|
}
|
|
465
418
|
connectedCallback() {
|
|
466
|
-
this.updateMenuItems();
|
|
467
|
-
this.addEventListener(
|
|
468
|
-
"sp-menu-item-added-or-updated",
|
|
469
|
-
this.updateMenuItems
|
|
470
|
-
);
|
|
471
|
-
this.addEventListener("sp-menu-item-removed", this.updateMenuItems);
|
|
472
419
|
super.connectedCallback();
|
|
473
420
|
}
|
|
474
421
|
disconnectedCallback() {
|
|
@@ -476,12 +423,6 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
476
423
|
super.disconnectedCallback();
|
|
477
424
|
}
|
|
478
425
|
}
|
|
479
|
-
/**
|
|
480
|
-
* @private
|
|
481
|
-
*/
|
|
482
|
-
PickerBase.openOverlay = async (target, interaction, content, options) => {
|
|
483
|
-
return await openOverlay(target, interaction, content, options);
|
|
484
|
-
};
|
|
485
426
|
__decorateClass([
|
|
486
427
|
query("#button")
|
|
487
428
|
], PickerBase.prototype, "button", 2);
|
|
@@ -506,6 +447,9 @@ __decorateClass([
|
|
|
506
447
|
__decorateClass([
|
|
507
448
|
property({ type: Boolean, reflect: true })
|
|
508
449
|
], PickerBase.prototype, "readonly", 2);
|
|
450
|
+
__decorateClass([
|
|
451
|
+
query("sp-menu")
|
|
452
|
+
], PickerBase.prototype, "optionsMenu", 2);
|
|
509
453
|
__decorateClass([
|
|
510
454
|
property()
|
|
511
455
|
], PickerBase.prototype, "placement", 2);
|
|
@@ -517,7 +461,10 @@ __decorateClass([
|
|
|
517
461
|
], PickerBase.prototype, "value", 2);
|
|
518
462
|
__decorateClass([
|
|
519
463
|
property({ attribute: false })
|
|
520
|
-
], PickerBase.prototype, "selectedItem",
|
|
464
|
+
], PickerBase.prototype, "selectedItem", 1);
|
|
465
|
+
__decorateClass([
|
|
466
|
+
property({ attribute: false })
|
|
467
|
+
], PickerBase.prototype, "selectedItemContent", 1);
|
|
521
468
|
export class Picker extends PickerBase {
|
|
522
469
|
constructor() {
|
|
523
470
|
super(...arguments);
|
|
@@ -549,5 +496,12 @@ export class Picker extends PickerBase {
|
|
|
549
496
|
static get styles() {
|
|
550
497
|
return [pickerStyles, chevronStyles];
|
|
551
498
|
}
|
|
499
|
+
get containerStyles() {
|
|
500
|
+
const styles = super.containerStyles;
|
|
501
|
+
if (!this.quiet) {
|
|
502
|
+
styles["min-width"] = `${this.offsetWidth}px`;
|
|
503
|
+
}
|
|
504
|
+
return styles;
|
|
505
|
+
}
|
|
552
506
|
}
|
|
553
507
|
//# sourceMappingURL=Picker.dev.js.map
|