@primer/view-components 0.15.0-rc.2eb37d37 → 0.15.0-rc.4cde6a2d
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/app/assets/javascripts/app/components/primer/alpha/action_menu/action_menu_element.d.ts +20 -0
- package/app/assets/javascripts/primer_view_components.js +1 -1
- package/app/assets/javascripts/primer_view_components.js.map +1 -1
- package/app/components/primer/alpha/action_menu/action_menu_element.d.ts +20 -0
- package/app/components/primer/alpha/action_menu/action_menu_element.js +85 -11
- package/package.json +2 -2
@@ -6,6 +6,15 @@ type SelectedItem = {
|
|
6
6
|
value: string | null | undefined;
|
7
7
|
element: Element;
|
8
8
|
};
|
9
|
+
export type ItemActivatedEvent = {
|
10
|
+
item: Element;
|
11
|
+
checked: boolean;
|
12
|
+
};
|
13
|
+
declare global {
|
14
|
+
interface HTMLElementEventMap {
|
15
|
+
itemActivated: CustomEvent<ItemActivatedEvent>;
|
16
|
+
}
|
17
|
+
}
|
9
18
|
export declare class ActionMenuElement extends HTMLElement {
|
10
19
|
#private;
|
11
20
|
includeFragment: IncludeFragmentElement;
|
@@ -22,6 +31,17 @@ export declare class ActionMenuElement extends HTMLElement {
|
|
22
31
|
connectedCallback(): void;
|
23
32
|
disconnectedCallback(): void;
|
24
33
|
handleEvent(event: Event): void;
|
34
|
+
get items(): HTMLElement[];
|
35
|
+
getItemById(itemId: string): HTMLElement | null;
|
36
|
+
isItemDisabled(item: Element | null): boolean;
|
37
|
+
disableItem(item: Element | null): void;
|
38
|
+
enableItem(item: Element | null): void;
|
39
|
+
isItemHidden(item: Element | null): boolean;
|
40
|
+
hideItem(item: Element | null): void;
|
41
|
+
showItem(item: Element | null): void;
|
42
|
+
isItemChecked(item: Element | null): boolean;
|
43
|
+
checkItem(item: Element | null): void;
|
44
|
+
uncheckItem(item: Element | null): void;
|
25
45
|
}
|
26
46
|
declare global {
|
27
47
|
interface Window {
|
@@ -15,7 +15,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
15
15
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
16
16
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
17
17
|
};
|
18
|
-
var _ActionMenuElement_instances, _ActionMenuElement_abortController, _ActionMenuElement_originalLabel, _ActionMenuElement_inputName, _ActionMenuElement_invokerBeingClicked, _ActionMenuElement_softDisableItems, _ActionMenuElement_potentiallyDisallowActivation, _ActionMenuElement_isKeyboardActivation, _ActionMenuElement_isKeyboardActivationViaEnter, _ActionMenuElement_isKeyboardActivationViaSpace, _ActionMenuElement_isMouseActivation, _ActionMenuElement_isActivation, _ActionMenuElement_handleInvokerActivated, _ActionMenuElement_handleDialogItemActivated, _ActionMenuElement_handleItemActivated, _ActionMenuElement_activateItem, _ActionMenuElement_handleIncludeFragmentReplaced, _ActionMenuElement_handleFocusOut, _ActionMenuElement_show, _ActionMenuElement_hide, _ActionMenuElement_isOpen, _ActionMenuElement_setDynamicLabel, _ActionMenuElement_updateInput, _ActionMenuElement_firstItem_get
|
18
|
+
var _ActionMenuElement_instances, _ActionMenuElement_abortController, _ActionMenuElement_originalLabel, _ActionMenuElement_inputName, _ActionMenuElement_invokerBeingClicked, _ActionMenuElement_softDisableItems, _ActionMenuElement_potentiallyDisallowActivation, _ActionMenuElement_isKeyboardActivation, _ActionMenuElement_isKeyboardActivationViaEnter, _ActionMenuElement_isKeyboardActivationViaSpace, _ActionMenuElement_isMouseActivation, _ActionMenuElement_isActivation, _ActionMenuElement_handleInvokerActivated, _ActionMenuElement_handleDialogItemActivated, _ActionMenuElement_handleItemActivated, _ActionMenuElement_activateItem, _ActionMenuElement_handleIncludeFragmentReplaced, _ActionMenuElement_handleFocusOut, _ActionMenuElement_show, _ActionMenuElement_hide, _ActionMenuElement_isOpen, _ActionMenuElement_setDynamicLabel, _ActionMenuElement_updateInput, _ActionMenuElement_firstItem_get;
|
19
19
|
import { controller, target } from '@github/catalyst';
|
20
20
|
import '@oddbird/popover-polyfill';
|
21
21
|
const validSelectors = ['[role="menuitem"]', '[role="menuitemcheckbox"]', '[role="menuitemradio"]'];
|
@@ -84,7 +84,7 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
|
|
84
84
|
results.push({
|
85
85
|
label: labelEl === null || labelEl === void 0 ? void 0 : labelEl.textContent,
|
86
86
|
value: selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.getAttribute('data-value'),
|
87
|
-
element: selectedItem
|
87
|
+
element: selectedItem,
|
88
88
|
});
|
89
89
|
}
|
90
90
|
return results;
|
@@ -101,7 +101,7 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
|
|
101
101
|
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_softDisableItems).call(this);
|
102
102
|
if (this.includeFragment) {
|
103
103
|
this.includeFragment.addEventListener('include-fragment-replaced', this, {
|
104
|
-
signal
|
104
|
+
signal,
|
105
105
|
});
|
106
106
|
}
|
107
107
|
}
|
@@ -141,6 +141,8 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
|
|
141
141
|
const item = event.target.closest(menuItemSelectors.join(','));
|
142
142
|
const targetIsItem = item !== null;
|
143
143
|
if (targetIsItem && eventIsActivation) {
|
144
|
+
if (__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_potentiallyDisallowActivation).call(this, event))
|
145
|
+
return;
|
144
146
|
const dialogInvoker = item.closest('[data-show-dialog-id]');
|
145
147
|
if (dialogInvoker) {
|
146
148
|
const dialog = this.ownerDocument.getElementById(dialogInvoker.getAttribute('data-show-dialog-id') || '');
|
@@ -150,7 +152,7 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
|
|
150
152
|
}
|
151
153
|
}
|
152
154
|
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_activateItem).call(this, event, item);
|
153
|
-
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this,
|
155
|
+
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this, item);
|
154
156
|
// Pressing the space key on a button or link will cause the page to scroll unless preventDefault()
|
155
157
|
// is called. While calling preventDefault() appears to have no effect on link navigation, it skips
|
156
158
|
// form submission. The code below therefore only calls preventDefault() if the button has been
|
@@ -167,6 +169,76 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
|
|
167
169
|
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleIncludeFragmentReplaced).call(this);
|
168
170
|
}
|
169
171
|
}
|
172
|
+
get items() {
|
173
|
+
return Array.from(this.querySelectorAll(menuItemSelectors.join(',')));
|
174
|
+
}
|
175
|
+
getItemById(itemId) {
|
176
|
+
return this.querySelector(`li[data-item-id="${itemId}"`);
|
177
|
+
}
|
178
|
+
isItemDisabled(item) {
|
179
|
+
if (item) {
|
180
|
+
return item.classList.contains('ActionListItem--disabled');
|
181
|
+
}
|
182
|
+
else {
|
183
|
+
return false;
|
184
|
+
}
|
185
|
+
}
|
186
|
+
disableItem(item) {
|
187
|
+
if (item) {
|
188
|
+
item.classList.add('ActionListItem--disabled');
|
189
|
+
item.querySelector('.ActionListContent').setAttribute('aria-disabled', 'true');
|
190
|
+
}
|
191
|
+
}
|
192
|
+
enableItem(item) {
|
193
|
+
if (item) {
|
194
|
+
item.classList.remove('ActionListItem--disabled');
|
195
|
+
item.querySelector('.ActionListContent').removeAttribute('aria-disabled');
|
196
|
+
}
|
197
|
+
}
|
198
|
+
isItemHidden(item) {
|
199
|
+
if (item) {
|
200
|
+
return item.hasAttribute('hidden');
|
201
|
+
}
|
202
|
+
else {
|
203
|
+
return false;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
hideItem(item) {
|
207
|
+
if (item) {
|
208
|
+
item.setAttribute('hidden', 'hidden');
|
209
|
+
}
|
210
|
+
}
|
211
|
+
showItem(item) {
|
212
|
+
if (item) {
|
213
|
+
item.removeAttribute('hidden');
|
214
|
+
}
|
215
|
+
}
|
216
|
+
isItemChecked(item) {
|
217
|
+
if (item) {
|
218
|
+
return item.querySelector('.ActionListContent').getAttribute('aria-checked') === 'true';
|
219
|
+
}
|
220
|
+
else {
|
221
|
+
return false;
|
222
|
+
}
|
223
|
+
}
|
224
|
+
checkItem(item) {
|
225
|
+
if (item && (this.selectVariant === 'single' || this.selectVariant === 'multiple')) {
|
226
|
+
const itemContent = item.querySelector('.ActionListContent');
|
227
|
+
const ariaChecked = itemContent.getAttribute('aria-checked') === 'true';
|
228
|
+
if (!ariaChecked) {
|
229
|
+
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this, itemContent);
|
230
|
+
}
|
231
|
+
}
|
232
|
+
}
|
233
|
+
uncheckItem(item) {
|
234
|
+
if (item && (this.selectVariant === 'single' || this.selectVariant === 'multiple')) {
|
235
|
+
const itemContent = item.querySelector('.ActionListContent');
|
236
|
+
const ariaChecked = itemContent.getAttribute('aria-checked') === 'true';
|
237
|
+
if (ariaChecked) {
|
238
|
+
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this, itemContent);
|
239
|
+
}
|
240
|
+
}
|
241
|
+
}
|
170
242
|
};
|
171
243
|
_ActionMenuElement_abortController = new WeakMap();
|
172
244
|
_ActionMenuElement_originalLabel = new WeakMap();
|
@@ -175,22 +247,24 @@ _ActionMenuElement_invokerBeingClicked = new WeakMap();
|
|
175
247
|
_ActionMenuElement_instances = new WeakSet();
|
176
248
|
_ActionMenuElement_softDisableItems = function _ActionMenuElement_softDisableItems() {
|
177
249
|
const { signal } = __classPrivateFieldGet(this, _ActionMenuElement_abortController, "f");
|
178
|
-
for (const item of
|
250
|
+
for (const item of this.querySelectorAll(validSelectors.join(','))) {
|
179
251
|
item.addEventListener('click', __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_potentiallyDisallowActivation).bind(this), { signal });
|
180
252
|
item.addEventListener('keydown', __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_potentiallyDisallowActivation).bind(this), { signal });
|
181
253
|
}
|
182
254
|
};
|
183
255
|
_ActionMenuElement_potentiallyDisallowActivation = function _ActionMenuElement_potentiallyDisallowActivation(event) {
|
184
256
|
if (!__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_isActivation).call(this, event))
|
185
|
-
return;
|
257
|
+
return false;
|
186
258
|
const item = event.target.closest(menuItemSelectors.join(','));
|
187
259
|
if (!item)
|
188
|
-
return;
|
260
|
+
return false;
|
189
261
|
if (item.getAttribute('aria-disabled')) {
|
190
262
|
event.preventDefault();
|
191
263
|
event.stopPropagation();
|
192
264
|
event.stopImmediatePropagation();
|
265
|
+
return true;
|
193
266
|
}
|
267
|
+
return false;
|
194
268
|
};
|
195
269
|
_ActionMenuElement_isKeyboardActivation = function _ActionMenuElement_isKeyboardActivation(event) {
|
196
270
|
return __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_isKeyboardActivationViaEnter).call(this, event) || __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_isKeyboardActivationViaSpace).call(this, event);
|
@@ -239,7 +313,7 @@ _ActionMenuElement_handleDialogItemActivated = function _ActionMenuElement_handl
|
|
239
313
|
dialog.addEventListener('close', handleDialogClose, { signal });
|
240
314
|
dialog.addEventListener('cancel', handleDialogClose, { signal });
|
241
315
|
};
|
242
|
-
_ActionMenuElement_handleItemActivated = function _ActionMenuElement_handleItemActivated(
|
316
|
+
_ActionMenuElement_handleItemActivated = function _ActionMenuElement_handleItemActivated(item) {
|
243
317
|
// Hide popover after current event loop to prevent changes in focus from
|
244
318
|
// altering the target of the event. Not doing this specifically affects
|
245
319
|
// <a> tags. It causes the event to be sent to the currently focused element
|
@@ -276,6 +350,9 @@ _ActionMenuElement_handleItemActivated = function _ActionMenuElement_handleItemA
|
|
276
350
|
item.setAttribute('aria-checked', `${checked}`);
|
277
351
|
}
|
278
352
|
__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_updateInput).call(this);
|
353
|
+
this.dispatchEvent(new CustomEvent('itemActivated', {
|
354
|
+
detail: { item: item.parentElement, checked: this.isItemChecked(item.parentElement) },
|
355
|
+
}));
|
279
356
|
};
|
280
357
|
_ActionMenuElement_activateItem = function _ActionMenuElement_activateItem(event, item) {
|
281
358
|
const eventWillActivateByDefault = (event instanceof MouseEvent && event.type === 'click') ||
|
@@ -373,9 +450,6 @@ _ActionMenuElement_updateInput = function _ActionMenuElement_updateInput() {
|
|
373
450
|
_ActionMenuElement_firstItem_get = function _ActionMenuElement_firstItem_get() {
|
374
451
|
return this.querySelector(menuItemSelectors.join(','));
|
375
452
|
};
|
376
|
-
_ActionMenuElement_items_get = function _ActionMenuElement_items_get() {
|
377
|
-
return Array.from(this.querySelectorAll(menuItemSelectors.join(',')));
|
378
|
-
};
|
379
453
|
__decorate([
|
380
454
|
target
|
381
455
|
], ActionMenuElement.prototype, "includeFragment", void 0);
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@primer/view-components",
|
3
|
-
"version": "0.15.0-rc.
|
3
|
+
"version": "0.15.0-rc.4cde6a2d",
|
4
4
|
"description": "ViewComponents for the Primer Design System",
|
5
5
|
"main": "app/assets/javascripts/primer_view_components.js",
|
6
6
|
"module": "app/components/primer/primer.js",
|
@@ -75,7 +75,7 @@
|
|
75
75
|
"eslint": "^8.23.1",
|
76
76
|
"eslint-plugin-custom-elements": "^0.0.6",
|
77
77
|
"eslint-plugin-github": "^4.9.2",
|
78
|
-
"eslint-plugin-prettier": "^
|
78
|
+
"eslint-plugin-prettier": "^5.0.0",
|
79
79
|
"markdownlint-cli2": "^0.10.0",
|
80
80
|
"mocha": "^10.0.0",
|
81
81
|
"playwright": "^1.35.1",
|