@spectrum-web-components/picker 0.30.0 → 0.30.1-overlay.30
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 +27 -40
- package/src/Picker.dev.js +124 -170
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +30 -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 +125 -142
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +10 -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/custom-elements.json +0 -1730
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/picker",
|
|
3
|
-
"version": "0.30.
|
|
3
|
+
"version": "0.30.1-overlay.30+1df211c75",
|
|
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.30.
|
|
69
|
-
"@spectrum-web-components/button": "^0.30.
|
|
70
|
-
"@spectrum-web-components/icon": "^0.30.
|
|
71
|
-
"@spectrum-web-components/icons-ui": "^0.30.
|
|
72
|
-
"@spectrum-web-components/icons-workflow": "^0.30.
|
|
73
|
-
"@spectrum-web-components/menu": "^0.30.
|
|
74
|
-
"@spectrum-web-components/overlay": "^0.30.
|
|
75
|
-
"@spectrum-web-components/popover": "^0.30.
|
|
76
|
-
"@spectrum-web-components/reactive-controllers": "^0.30.
|
|
77
|
-
"@spectrum-web-components/shared": "^0.30.
|
|
78
|
-
"@spectrum-web-components/tray": "^0.30.
|
|
68
|
+
"@spectrum-web-components/base": "^0.30.1-overlay.30+1df211c75",
|
|
69
|
+
"@spectrum-web-components/button": "^0.30.1-overlay.30+1df211c75",
|
|
70
|
+
"@spectrum-web-components/icon": "^0.30.1-overlay.30+1df211c75",
|
|
71
|
+
"@spectrum-web-components/icons-ui": "^0.30.1-overlay.30+1df211c75",
|
|
72
|
+
"@spectrum-web-components/icons-workflow": "^0.30.1-overlay.30+1df211c75",
|
|
73
|
+
"@spectrum-web-components/menu": "^0.30.1-overlay.30+1df211c75",
|
|
74
|
+
"@spectrum-web-components/overlay": "^0.30.1-overlay.30+1df211c75",
|
|
75
|
+
"@spectrum-web-components/popover": "^0.30.1-overlay.30+1df211c75",
|
|
76
|
+
"@spectrum-web-components/reactive-controllers": "^0.30.1-overlay.30+1df211c75",
|
|
77
|
+
"@spectrum-web-components/shared": "^0.30.1-overlay.30+1df211c75",
|
|
78
|
+
"@spectrum-web-components/tray": "^0.30.1-overlay.30+1df211c75"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@spectrum-css/picker": "^2.0.11"
|
|
@@ -88,5 +88,5 @@
|
|
|
88
88
|
"./sync/index.js",
|
|
89
89
|
"./sync/sp-*.js"
|
|
90
90
|
],
|
|
91
|
-
"gitHead": "
|
|
91
|
+
"gitHead": "1df211c7581b6fd6ec624cf2b09bc81aeec29c26"
|
|
92
92
|
}
|
package/src/Picker.d.ts
CHANGED
|
@@ -1,31 +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
|
-
/**
|
|
16
|
-
* @element sp-picker
|
|
17
|
-
*
|
|
18
|
-
* @slot label - The placeholder content for the Picker
|
|
19
|
-
* @slot - menu items to be listed in the Picker
|
|
20
|
-
* @fires change - Announces that the `value` of the element has changed
|
|
21
|
-
* @fires sp-opened - Announces that the overlay has been opened
|
|
22
|
-
* @fires sp-closed - Announces that the overlay has been closed
|
|
23
|
-
*/
|
|
24
17
|
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
18
|
protected isMobile: MatchMediaController;
|
|
30
19
|
button: HTMLButtonElement;
|
|
31
20
|
get target(): HTMLButtonElement | this;
|
|
@@ -37,8 +26,7 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
37
26
|
open: boolean;
|
|
38
27
|
readonly: boolean;
|
|
39
28
|
selects: undefined | 'single';
|
|
40
|
-
menuItems: MenuItem[];
|
|
41
|
-
private restoreChildren?;
|
|
29
|
+
get menuItems(): MenuItem[];
|
|
42
30
|
optionsMenu: Menu;
|
|
43
31
|
/**
|
|
44
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"}
|
|
@@ -47,9 +35,9 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
47
35
|
placement: Placement;
|
|
48
36
|
quiet: boolean;
|
|
49
37
|
value: string;
|
|
50
|
-
selectedItem
|
|
51
|
-
|
|
52
|
-
|
|
38
|
+
get selectedItem(): MenuItem | undefined;
|
|
39
|
+
set selectedItem(selectedItem: MenuItem | undefined);
|
|
40
|
+
_selectedItem?: MenuItem;
|
|
53
41
|
protected listRole: 'listbox' | 'menu';
|
|
54
42
|
protected itemRole: string;
|
|
55
43
|
constructor();
|
|
@@ -64,42 +52,41 @@ export declare class PickerBase extends PickerBase_base {
|
|
|
64
52
|
protected onKeydown: (event: KeyboardEvent) => void;
|
|
65
53
|
setValueFromItem(item: MenuItem, menuChangeEvent?: Event): Promise<void>;
|
|
66
54
|
protected setMenuItemSelected(item: MenuItem, value: boolean): void;
|
|
55
|
+
private preventToggle;
|
|
67
56
|
toggle(target?: boolean): void;
|
|
68
57
|
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;
|
|
58
|
+
protected get containerStyles(): StyleInfo;
|
|
76
59
|
protected get selectedItemContent(): MenuItemChildren;
|
|
60
|
+
protected set selectedItemContent(selectedItemContent: MenuItemChildren | undefined);
|
|
61
|
+
_selectedItemContent?: MenuItemChildren;
|
|
77
62
|
protected renderLabelContent(content: Node[]): TemplateResult | Node[];
|
|
78
63
|
protected get buttonContent(): TemplateResult[];
|
|
64
|
+
protected get renderOverlay(): TemplateResult;
|
|
79
65
|
protected render(): TemplateResult;
|
|
80
66
|
protected update(changes: PropertyValues<this>): void;
|
|
81
67
|
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;
|
|
68
|
+
protected get renderContainer(): TemplateResult;
|
|
69
|
+
private willManageSelection;
|
|
70
|
+
protected shouldScheduleManageSelection(event?: Event): void;
|
|
71
|
+
protected shouldManageSelection(): void;
|
|
91
72
|
protected manageSelection(): Promise<void>;
|
|
92
|
-
private menuStatePromise;
|
|
93
|
-
private menuStateResolver;
|
|
94
73
|
private selectionPromise;
|
|
95
74
|
private selectionResolver;
|
|
96
75
|
protected getUpdateComplete(): Promise<boolean>;
|
|
97
|
-
connectedCallback(): void;
|
|
98
76
|
disconnectedCallback(): void;
|
|
99
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* @element sp-picker
|
|
80
|
+
*
|
|
81
|
+
* @slot label - The placeholder content for the Picker
|
|
82
|
+
* @slot - menu items to be listed in the Picker
|
|
83
|
+
* @fires change - Announces that the `value` of the element has changed
|
|
84
|
+
* @fires sp-opened - Announces that the overlay has been opened
|
|
85
|
+
* @fires sp-closed - Announces that the overlay has been closed
|
|
86
|
+
*/
|
|
100
87
|
export declare class Picker extends PickerBase {
|
|
101
88
|
static get styles(): CSSResultArray;
|
|
102
|
-
protected
|
|
89
|
+
protected get containerStyles(): StyleInfo;
|
|
103
90
|
protected onKeydown: (event: KeyboardEvent) => void;
|
|
104
91
|
}
|
|
105
92
|
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,74 +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
|
-
}
|
|
243
|
-
async closeMenu() {
|
|
244
|
-
if (this.closeOverlay) {
|
|
245
|
-
const closeOverlay = this.closeOverlay;
|
|
246
|
-
delete this.closeOverlay;
|
|
247
|
-
(await closeOverlay)();
|
|
196
|
+
return {
|
|
197
|
+
"--swc-menu-width": "100%"
|
|
198
|
+
};
|
|
248
199
|
}
|
|
200
|
+
return {};
|
|
249
201
|
}
|
|
250
202
|
get selectedItemContent() {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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);
|
|
255
211
|
}
|
|
256
212
|
renderLabelContent(content) {
|
|
257
213
|
if (this.value && this.selectedItem) {
|
|
@@ -285,13 +241,41 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
285
241
|
`
|
|
286
242
|
];
|
|
287
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
|
+
.receivesFocus=${"true"}
|
|
253
|
+
@beforetoggle=${(event) => {
|
|
254
|
+
if (event.composedPath()[0] !== event.target) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
this.open = event.target.open;
|
|
258
|
+
if (!this.open) {
|
|
259
|
+
this.preventToggle = true;
|
|
260
|
+
requestAnimationFrame(
|
|
261
|
+
() => this.preventToggle = false
|
|
262
|
+
);
|
|
263
|
+
this.optionsMenu.updateSelectedItemIndex();
|
|
264
|
+
this.optionsMenu.closeDescendentOverlays();
|
|
265
|
+
}
|
|
266
|
+
}}
|
|
267
|
+
>
|
|
268
|
+
${this.renderContainer}
|
|
269
|
+
</sp-overlay>
|
|
270
|
+
`;
|
|
271
|
+
}
|
|
288
272
|
// a helper to throw focus to the button is needed because Safari
|
|
289
273
|
// won't include buttons in the tab order even with tabindex="0"
|
|
290
274
|
render() {
|
|
291
275
|
return html`
|
|
292
276
|
<span
|
|
293
277
|
id="focus-helper"
|
|
294
|
-
tabindex="${this.focused ? "-1" : "0"}"
|
|
278
|
+
tabindex="${this.focused || this.open ? "-1" : "0"}"
|
|
295
279
|
@focus=${this.onHelperFocus}
|
|
296
280
|
></span>
|
|
297
281
|
<button
|
|
@@ -308,6 +292,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
308
292
|
>
|
|
309
293
|
${this.buttonContent}
|
|
310
294
|
</button>
|
|
295
|
+
${this.renderOverlay}
|
|
311
296
|
`;
|
|
312
297
|
}
|
|
313
298
|
update(changes) {
|
|
@@ -317,21 +302,15 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
317
302
|
if (changes.has("disabled") && this.disabled) {
|
|
318
303
|
this.open = false;
|
|
319
304
|
}
|
|
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
|
-
}
|
|
305
|
+
if (changes.has("value")) {
|
|
306
|
+
this.shouldScheduleManageSelection();
|
|
329
307
|
}
|
|
330
|
-
if (
|
|
331
|
-
this.
|
|
308
|
+
if (!this.hasUpdated) {
|
|
309
|
+
const deprecatedMenu = this.querySelector(":scope > sp-menu");
|
|
310
|
+
deprecatedMenu == null ? void 0 : deprecatedMenu.setAttribute("selects", "inherit");
|
|
332
311
|
}
|
|
333
312
|
if (true) {
|
|
334
|
-
if (!this.hasUpdated && this.querySelector("sp-menu")) {
|
|
313
|
+
if (!this.hasUpdated && this.querySelector(":scope > sp-menu")) {
|
|
335
314
|
const { localName } = this;
|
|
336
315
|
window.__swc.warn(
|
|
337
316
|
this,
|
|
@@ -354,7 +333,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
354
333
|
</div>
|
|
355
334
|
`;
|
|
356
335
|
}
|
|
357
|
-
get
|
|
336
|
+
get renderContainer() {
|
|
358
337
|
const content = html`
|
|
359
338
|
${this.dismissHelper}
|
|
360
339
|
<sp-menu
|
|
@@ -362,7 +341,11 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
362
341
|
role="${this.listRole}"
|
|
363
342
|
@change=${this.handleChange}
|
|
364
343
|
.selects=${this.selects}
|
|
365
|
-
|
|
344
|
+
.selected=${this.value ? [this.value] : []}
|
|
345
|
+
@sp-menu-item-added-or-updated=${this.shouldManageSelection}
|
|
346
|
+
>
|
|
347
|
+
<slot @slotchange=${this.shouldScheduleManageSelection}></slot>
|
|
348
|
+
</sp-menu>
|
|
366
349
|
${this.dismissHelper}
|
|
367
350
|
`;
|
|
368
351
|
if (this.isMobile.matches) {
|
|
@@ -370,9 +353,7 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
370
353
|
<sp-tray
|
|
371
354
|
id="popover"
|
|
372
355
|
role="dialog"
|
|
373
|
-
|
|
374
|
-
.overlayOpenCallback=${this.overlayOpenCallback}
|
|
375
|
-
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
356
|
+
style=${styleMap(this.containerStyles)}
|
|
376
357
|
>
|
|
377
358
|
${content}
|
|
378
359
|
</sp-tray>
|
|
@@ -382,56 +363,38 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
382
363
|
<sp-popover
|
|
383
364
|
id="popover"
|
|
384
365
|
role="dialog"
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
.overlayCloseCallback=${this.overlayCloseCallback}
|
|
366
|
+
style=${styleMap(this.containerStyles)}
|
|
367
|
+
placement=${this.placement}
|
|
388
368
|
>
|
|
389
369
|
${content}
|
|
390
370
|
</sp-popover>
|
|
391
371
|
`;
|
|
392
372
|
}
|
|
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();
|
|
373
|
+
shouldScheduleManageSelection(event) {
|
|
374
|
+
if (!this.willManageSelection && (!event || event.target.getRootNode().host === this)) {
|
|
375
|
+
this.willManageSelection = true;
|
|
376
|
+
requestAnimationFrame(() => {
|
|
377
|
+
requestAnimationFrame(() => {
|
|
378
|
+
this.manageSelection();
|
|
379
|
+
});
|
|
380
|
+
});
|
|
406
381
|
}
|
|
407
|
-
|
|
382
|
+
}
|
|
383
|
+
shouldManageSelection() {
|
|
384
|
+
if (this.willManageSelection) {
|
|
408
385
|
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
|
-
});
|
|
386
|
+
}
|
|
387
|
+
this.willManageSelection = true;
|
|
388
|
+
this.manageSelection();
|
|
426
389
|
}
|
|
427
390
|
async manageSelection() {
|
|
428
391
|
if (this.selects == null)
|
|
429
392
|
return;
|
|
430
|
-
await this.menuStatePromise;
|
|
431
393
|
this.selectionPromise = new Promise(
|
|
432
394
|
(res) => this.selectionResolver = res
|
|
433
395
|
);
|
|
434
396
|
let selectedItem;
|
|
397
|
+
await this.optionsMenu.updateComplete;
|
|
435
398
|
this.menuItems.forEach((item) => {
|
|
436
399
|
if (this.value === item.value && !item.disabled) {
|
|
437
400
|
selectedItem = item;
|
|
@@ -451,34 +414,18 @@ export class PickerBase extends SizedMixin(Focusable) {
|
|
|
451
414
|
this.optionsMenu.updateSelectedItemIndex();
|
|
452
415
|
}
|
|
453
416
|
this.selectionResolver();
|
|
417
|
+
this.willManageSelection = false;
|
|
454
418
|
}
|
|
455
419
|
async getUpdateComplete() {
|
|
456
420
|
const complete = await super.getUpdateComplete();
|
|
457
|
-
await this.menuStatePromise;
|
|
458
|
-
await this.itemsUpdated;
|
|
459
421
|
await this.selectionPromise;
|
|
460
422
|
return complete;
|
|
461
423
|
}
|
|
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);
|
|
469
|
-
super.connectedCallback();
|
|
470
|
-
}
|
|
471
424
|
disconnectedCallback() {
|
|
472
425
|
this.close();
|
|
473
426
|
super.disconnectedCallback();
|
|
474
427
|
}
|
|
475
428
|
}
|
|
476
|
-
/**
|
|
477
|
-
* @private
|
|
478
|
-
*/
|
|
479
|
-
PickerBase.openOverlay = async (target, interaction, content, options) => {
|
|
480
|
-
return await openOverlay(target, interaction, content, options);
|
|
481
|
-
};
|
|
482
429
|
__decorateClass([
|
|
483
430
|
query("#button")
|
|
484
431
|
], PickerBase.prototype, "button", 2);
|
|
@@ -503,6 +450,9 @@ __decorateClass([
|
|
|
503
450
|
__decorateClass([
|
|
504
451
|
property({ type: Boolean, reflect: true })
|
|
505
452
|
], PickerBase.prototype, "readonly", 2);
|
|
453
|
+
__decorateClass([
|
|
454
|
+
query("sp-menu")
|
|
455
|
+
], PickerBase.prototype, "optionsMenu", 2);
|
|
506
456
|
__decorateClass([
|
|
507
457
|
property()
|
|
508
458
|
], PickerBase.prototype, "placement", 2);
|
|
@@ -514,7 +464,10 @@ __decorateClass([
|
|
|
514
464
|
], PickerBase.prototype, "value", 2);
|
|
515
465
|
__decorateClass([
|
|
516
466
|
property({ attribute: false })
|
|
517
|
-
], PickerBase.prototype, "selectedItem",
|
|
467
|
+
], PickerBase.prototype, "selectedItem", 1);
|
|
468
|
+
__decorateClass([
|
|
469
|
+
property({ attribute: false })
|
|
470
|
+
], PickerBase.prototype, "selectedItemContent", 1);
|
|
518
471
|
export class Picker extends PickerBase {
|
|
519
472
|
constructor() {
|
|
520
473
|
super(...arguments);
|
|
@@ -546,11 +499,12 @@ export class Picker extends PickerBase {
|
|
|
546
499
|
static get styles() {
|
|
547
500
|
return [pickerStyles, chevronStyles];
|
|
548
501
|
}
|
|
549
|
-
|
|
550
|
-
super.
|
|
551
|
-
if (this.quiet)
|
|
552
|
-
|
|
553
|
-
|
|
502
|
+
get containerStyles() {
|
|
503
|
+
const styles = super.containerStyles;
|
|
504
|
+
if (!this.quiet) {
|
|
505
|
+
styles["min-width"] = `${this.offsetWidth}px`;
|
|
506
|
+
}
|
|
507
|
+
return styles;
|
|
554
508
|
}
|
|
555
509
|
}
|
|
556
510
|
//# sourceMappingURL=Picker.dev.js.map
|