@sapudex/web-components 2.63.0 → 2.63.1
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/cypress/specs/FilterMenu.cy.tsx +43 -22
- package/cypress/specs/FilterMenuAccessibility.cy.tsx +1017 -0
- package/cypress/specs/ListItem.cy.tsx +234 -6
- package/cypress/specs/SelectBox.cy.tsx +7 -2
- package/cypress/specs/SelectBoxAccessibility.cy.tsx +5 -5
- package/dist/FilterMenu.d.ts +2 -2
- package/dist/FilterMenu.js +6 -4
- package/dist/FilterMenu.js.map +1 -1
- package/dist/FilterMenuTemplate.js +2 -2
- package/dist/FilterMenuTemplate.js.map +1 -1
- package/dist/List.d.ts +1 -8
- package/dist/List.js +4 -12
- package/dist/List.js.map +1 -1
- package/dist/ListGroupHeaderTemplate.js +8 -7
- package/dist/ListGroupHeaderTemplate.js.map +1 -1
- package/dist/ListItem.js +12 -1
- package/dist/ListItem.js.map +1 -1
- package/dist/ListItemBase.d.ts +5 -0
- package/dist/ListItemBase.js +3 -0
- package/dist/ListItemBase.js.map +1 -1
- package/dist/ListItemTemplate.js +2 -2
- package/dist/ListItemTemplate.js.map +1 -1
- package/dist/ListSelectAllTemplate.js +1 -1
- package/dist/ListSelectAllTemplate.js.map +1 -1
- package/dist/SearchableListBaseTemplate.js +7 -9
- package/dist/SearchableListBaseTemplate.js.map +1 -1
- package/dist/assets/{InputSuggestions-6S5UueXO.js → InputSuggestions-DSPGFWZq.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-OidrwM_d.js → ListItemStandardExpandableTextTemplate-hSNo3Xyr.js} +1 -1
- package/dist/assets/{bundle.esm-DaFsZANO.js → bundle.esm-qSu0eWiH.js} +21 -21
- package/dist/css/themes/MastheadShell.css +1 -1
- package/dist/css/themes/PromoTile.css +1 -1
- package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
- package/dist/generated/themes/MastheadShell.css.js +1 -1
- package/dist/generated/themes/MastheadShell.css.js.map +1 -1
- package/dist/generated/themes/PromoTile.css.d.ts +1 -1
- package/dist/generated/themes/PromoTile.css.js +1 -1
- package/dist/generated/themes/PromoTile.css.js.map +1 -1
- package/dist/web-types.json +1 -1
- package/package.json +1 -1
- package/src/FilterMenu.ts +6 -4
- package/src/FilterMenuTemplate.tsx +12 -8
- package/src/List.ts +4 -12
- package/src/ListGroupHeaderTemplate.tsx +9 -3
- package/src/ListItem.ts +12 -1
- package/src/ListItemBase.ts +7 -0
- package/src/ListItemTemplate.tsx +6 -1
- package/src/ListSelectAllTemplate.tsx +11 -12
- package/src/SearchableListBaseTemplate.tsx +9 -9
- package/src/generated/themes/MastheadShell.css.ts +1 -1
- package/src/generated/themes/PromoTile.css.ts +1 -1
- package/src/themes/MastheadShell.css +1 -1
- package/src/themes/PromoTile.css +5 -0
|
@@ -223,7 +223,8 @@ describe("ListItem", () => {
|
|
|
223
223
|
});
|
|
224
224
|
|
|
225
225
|
describe("Standalone rated MultiSelect preservation", () => {
|
|
226
|
-
|
|
226
|
+
// Updated: decorative checkboxes are unnamed in every mode; the real-focus row owns the complete rating name.
|
|
227
|
+
it("keeps real focus and native selection on the fully named inner option with an unnamed decorative checkbox", () => {
|
|
227
228
|
cy.mount(
|
|
228
229
|
<div>
|
|
229
230
|
<button id="before-rated-list-item">Previous</button>
|
|
@@ -238,6 +239,7 @@ describe("ListItem", () => {
|
|
|
238
239
|
expect($row).to.have.attr("role", "option");
|
|
239
240
|
expect($row).to.have.attr("tabindex", "0");
|
|
240
241
|
expect($row).to.have.attr("aria-selected", String(UDExSelected));
|
|
242
|
+
expect($row).to.have.attr("aria-label", "Rated choice Rating 4.0, Total 20, Rating Indicator 4 of 5");
|
|
241
243
|
expect($row).not.to.have.attr("aria-checked");
|
|
242
244
|
});
|
|
243
245
|
UDExItem().should($host => {
|
|
@@ -249,12 +251,12 @@ describe("ListItem", () => {
|
|
|
249
251
|
expect($checkbox).to.have.attr("aria-hidden", "true");
|
|
250
252
|
expect($checkbox).to.have.attr("tabindex", "-1");
|
|
251
253
|
expect($checkbox[0]).to.have.property("checked", UDExSelected);
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
expect($checkbox[0]).to.
|
|
255
|
-
expect($checkbox).to.have.attr("accessible-name", UDExName);
|
|
254
|
+
expect($checkbox).not.to.have.attr("accessible-name");
|
|
255
|
+
expect($checkbox).not.to.have.attr("aria-label");
|
|
256
|
+
expect(($checkbox[0] as HTMLElement & { accessibleName?: string }).accessibleName || "").to.equal("");
|
|
256
257
|
});
|
|
257
|
-
UDExItem().shadow().find(".udex-list__content-wrap")
|
|
258
|
+
UDExItem().shadow().find(".udex-list__content-wrap")
|
|
259
|
+
.should("have.attr", "aria-label", "Rated choice Rating 4.0, Total 20, Rating Indicator 4 of 5");
|
|
258
260
|
UDExItem().shadow().find("[udex-rating-indicator]").should($rating => {
|
|
259
261
|
expect($rating).to.have.attr("aria-label", "Rating 4.0, Total 20, Rating Indicator 4 of 5");
|
|
260
262
|
expect($rating).to.have.attr("disabled");
|
|
@@ -272,6 +274,232 @@ describe("ListItem", () => {
|
|
|
272
274
|
});
|
|
273
275
|
});
|
|
274
276
|
|
|
277
|
+
describe("Accessible row name ownership", () => {
|
|
278
|
+
const normalizeText = (text: string | null) => (text || "").replace(/\s+/g, " ").trim();
|
|
279
|
+
|
|
280
|
+
function flattenedTextContent(node: Node): string {
|
|
281
|
+
if (node.nodeType === Node.ELEMENT_NODE && (node as Element).localName === "slot") {
|
|
282
|
+
const assigned = (node as HTMLSlotElement).assignedNodes({ flatten: true });
|
|
283
|
+
const nodes = assigned.length ? assigned : Array.from(node.childNodes);
|
|
284
|
+
return nodes.map(flattenedTextContent).join("");
|
|
285
|
+
}
|
|
286
|
+
if (!node.hasChildNodes()) {
|
|
287
|
+
return node.textContent || "";
|
|
288
|
+
}
|
|
289
|
+
// Preserve the raw text-node sequence, including adjacent inline elements, without adding separators.
|
|
290
|
+
return Array.from(node.childNodes).map(flattenedTextContent).join("");
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function assertVisibleName(item: Cypress.Chainable<JQuery<HTMLElement>>, expected: string,
|
|
294
|
+
{ owner = "row", name = expected, slotted = false }:
|
|
295
|
+
{ owner?: "row" | "content" | "host"; name?: string; slotted?: boolean } = {}) {
|
|
296
|
+
item.shadow().find(".udex-list__content-wrap").should($wrapper => {
|
|
297
|
+
const wrapper = $wrapper[0];
|
|
298
|
+
const root = wrapper.getRootNode() as ShadowRoot;
|
|
299
|
+
const row = root.querySelector('[part="item"]')!;
|
|
300
|
+
const content = wrapper.querySelector(".udex-list__content")!;
|
|
301
|
+
const visibleText = normalizeText(slotted ? flattenedTextContent(content) : content.textContent);
|
|
302
|
+
expect(visibleText, "raw shared-container text retains literal word boundaries").to.equal(expected);
|
|
303
|
+
expect(wrapper).to.have.attr("aria-label", name);
|
|
304
|
+
const nameId = wrapper.getAttribute("aria-labelledby")!;
|
|
305
|
+
expect(nameId).to.equal(`${wrapper.getAttribute("_id")}-invisibleText`);
|
|
306
|
+
const source = root.getElementById(nameId);
|
|
307
|
+
expect(source, "hidden name source resolves in the row's own shadow root").not.to.equal(null);
|
|
308
|
+
expect(source!.getRootNode()).to.equal(root);
|
|
309
|
+
expect(source).to.have.class("hidden");
|
|
310
|
+
expect(normalizeText(source!.textContent)).to.equal(name);
|
|
311
|
+
if (owner === "row") {
|
|
312
|
+
expect(row).to.have.attr("aria-label", name);
|
|
313
|
+
} else {
|
|
314
|
+
expect(row).not.to.have.attr("aria-label");
|
|
315
|
+
if (owner === "host") {
|
|
316
|
+
expect(root.host).to.have.attr("aria-label", name);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (name === expected) {
|
|
320
|
+
expect(normalizeText(source!.textContent)).to.equal(visibleText);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
[UDExListMode.SingleSelect, UDExListMode.MultiSelect, UDExListMode.SingleContent].forEach(mode => {
|
|
326
|
+
it(`preserves raw label/support/additional boundaries and local name ownership in ${mode}`, () => {
|
|
327
|
+
cy.mount(
|
|
328
|
+
<div>
|
|
329
|
+
<button id="before-boundary-item">Previous</button>
|
|
330
|
+
<UDExListItem id="boundary-item" mode={mode} label="<b>Java</b>Script"
|
|
331
|
+
supportingText="Frontend web development" additionalText="Code JS" />
|
|
332
|
+
</div>
|
|
333
|
+
);
|
|
334
|
+
const item = () => cy.get("#boundary-item");
|
|
335
|
+
const row = () => item().shadow().find('[part="item"]');
|
|
336
|
+
const singleContent = mode === UDExListMode.SingleContent;
|
|
337
|
+
if (!singleContent) {
|
|
338
|
+
cy.get("#before-boundary-item").realClick();
|
|
339
|
+
cy.realPress("Tab");
|
|
340
|
+
row().should("be.focused");
|
|
341
|
+
row().should("have.attr", "aria-selected", "false");
|
|
342
|
+
}
|
|
343
|
+
row().should("have.attr", "role", singleContent ? "listitem" : "option");
|
|
344
|
+
assertVisibleName(item(), "JavaScript Frontend web development Code JS",
|
|
345
|
+
{ owner: singleContent ? "content" : "row" });
|
|
346
|
+
item().shadow().find(".udex-list__text-holder").should($holder => {
|
|
347
|
+
expect(normalizeText($holder[0].textContent)).to.equal("JavaScript Frontend web development");
|
|
348
|
+
});
|
|
349
|
+
item().shadow().find('[part="title"]').should("have.text", "JavaScript");
|
|
350
|
+
item().shadow().find('[part="title"] b').should("have.text", "Java");
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it("preserves raw label/support/additional boundaries with a host-owned name and presentational native row", () => {
|
|
355
|
+
const expected = "JavaScript Frontend web development Code JS";
|
|
356
|
+
cy.mount(<UDExListItem id="host-boundary-item" mode={UDExListMode.MultiSelect}
|
|
357
|
+
_useHostAriaRole={true} role="option" aria-label={expected} aria-selected="false"
|
|
358
|
+
label="<b>Java</b>Script" supportingText="Frontend web development" additionalText="Code JS" />);
|
|
359
|
+
const item = () => cy.get("#host-boundary-item");
|
|
360
|
+
assertVisibleName(item(), expected, { owner: "host" });
|
|
361
|
+
item().shadow().find('[part="title"]').should("have.text", "JavaScript");
|
|
362
|
+
item().shadow().find('[part="item"]').should($row => {
|
|
363
|
+
expect($row).to.have.attr("role", "presentation");
|
|
364
|
+
["aria-label", "aria-selected", "aria-checked", "tabindex"].forEach(attribute => {
|
|
365
|
+
expect($row).not.to.have.attr(attribute);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it("preserves literal boundaries with supporting-only or additional-only secondary text", () => {
|
|
371
|
+
cy.wrap([
|
|
372
|
+
{ supportingText: "Frontend web development", additionalText: "", expected: "JavaScript Frontend web development" },
|
|
373
|
+
{ supportingText: "", additionalText: "Code JS", expected: "JavaScript Code JS" },
|
|
374
|
+
]).each(testCase => {
|
|
375
|
+
cy.mount(<UDExListItem id="partial-boundary-item" mode={UDExListMode.SingleSelect}
|
|
376
|
+
label="<b>Java</b>Script" supportingText={testCase.supportingText} additionalText={testCase.additionalText} />);
|
|
377
|
+
const item = () => cy.get("#partial-boundary-item");
|
|
378
|
+
assertVisibleName(item(), testCase.expected);
|
|
379
|
+
item().shadow().find('[part="title"]').should("have.text", "JavaScript");
|
|
380
|
+
item().shadow().find(testCase.supportingText ? '[part="additional-text"]' : '[part="supporting"]')
|
|
381
|
+
.should("not.exist");
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
it("removes and restores supporting text without concatenating label and additional text while focused", () => {
|
|
386
|
+
cy.mount(
|
|
387
|
+
<div>
|
|
388
|
+
<button id="before-reactive-boundary-item">Previous</button>
|
|
389
|
+
<UDExListItem id="reactive-boundary-item" mode={UDExListMode.MultiSelect}
|
|
390
|
+
label="<b>Java</b>Script" supportingText="Frontend web development" additionalText="Code JS" />
|
|
391
|
+
</div>
|
|
392
|
+
);
|
|
393
|
+
const item = () => cy.get("#reactive-boundary-item");
|
|
394
|
+
const row = () => item().shadow().find('[part="item"]');
|
|
395
|
+
cy.get("#before-reactive-boundary-item").realClick();
|
|
396
|
+
cy.realPress("Tab");
|
|
397
|
+
row().should("be.focused");
|
|
398
|
+
assertVisibleName(item(), "JavaScript Frontend web development Code JS");
|
|
399
|
+
item().invoke("prop", "supportingText", "");
|
|
400
|
+
assertVisibleName(item(), "JavaScript Code JS");
|
|
401
|
+
item().shadow().find('[part="supporting"]').should("not.exist");
|
|
402
|
+
row().should("be.focused");
|
|
403
|
+
item().invoke("prop", "supportingText", "Digital Builders");
|
|
404
|
+
assertVisibleName(item(), "JavaScript Digital Builders Code JS");
|
|
405
|
+
item().shadow().find('[part="title"]').should("have.text", "JavaScript");
|
|
406
|
+
row().should("be.focused");
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// Updated: flatten the shared slot container without inserting whitespace, checking hidden names even during overrides.
|
|
410
|
+
it("names a real-focus row from default slotted text before support and additional text, restoring it after an explicit override", () => {
|
|
411
|
+
cy.mount(
|
|
412
|
+
<div>
|
|
413
|
+
<button id="before-slotted-list-item">Previous</button>
|
|
414
|
+
<UDExListItem id="slotted-name-item" mode={UDExListMode.MultiSelect}
|
|
415
|
+
supportingText="Choice support" additionalText="Code A">
|
|
416
|
+
{" Slotted \n "}<span id="slotted-choice-label"><b>choice</b>{" label"}</span>{" \t text"}
|
|
417
|
+
</UDExListItem>
|
|
418
|
+
</div>
|
|
419
|
+
);
|
|
420
|
+
const UDExItem = () => cy.get("#slotted-name-item");
|
|
421
|
+
const UDExRow = () => UDExItem().shadow().find('[part="item"]');
|
|
422
|
+
const UDExFullName = "Slotted choice label text Choice support Code A";
|
|
423
|
+
const UDExAssertSlottedName = (UDExName: string) => {
|
|
424
|
+
assertVisibleName(UDExItem(), UDExFullName, { name: UDExName, slotted: true });
|
|
425
|
+
UDExItem().should($item => {
|
|
426
|
+
expect($item).not.to.have.attr("label");
|
|
427
|
+
expect(($item[0] as UDExListItem).label || "").to.equal("");
|
|
428
|
+
});
|
|
429
|
+
UDExRow().should("be.focused").should($row => {
|
|
430
|
+
expect($row).to.have.attr("role", "option");
|
|
431
|
+
expect($row).to.have.attr("aria-label", UDExName);
|
|
432
|
+
expect($row).to.have.attr("aria-selected", "false");
|
|
433
|
+
expect($row).not.to.have.attr("aria-checked");
|
|
434
|
+
});
|
|
435
|
+
UDExItem().shadow().find('slot[part="content"]').should($slot => {
|
|
436
|
+
expect(normalizeText(flattenedTextContent($slot[0]))).to.equal("Slotted choice label text");
|
|
437
|
+
});
|
|
438
|
+
UDExItem().find("#slotted-choice-label").should("be.visible").and("have.text", "choice label");
|
|
439
|
+
UDExItem().find("#slotted-choice-label b").should("be.visible").and("have.text", "choice");
|
|
440
|
+
UDExItem().shadow().find('[part="supporting"]').should("have.text", "Choice support");
|
|
441
|
+
UDExItem().shadow().find('[part="additional-text"]').should("have.text", "Code A");
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
cy.get("#before-slotted-list-item").realClick();
|
|
445
|
+
cy.realPress("Tab");
|
|
446
|
+
UDExAssertSlottedName(UDExFullName);
|
|
447
|
+
UDExItem().invoke("prop", "accessibleName", "Explicit slotted choice");
|
|
448
|
+
UDExAssertSlottedName("Explicit slotted choice");
|
|
449
|
+
UDExItem().invoke("prop", "accessibleName", "");
|
|
450
|
+
UDExAssertSlottedName(UDExFullName);
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
// Updated: verify the referenced hidden source independently without equating visible text to an override.
|
|
454
|
+
it("keeps an explicit row name instead of appending visible support, additional text or rating metadata", () => {
|
|
455
|
+
cy.mount(<UDExListItem id="explicit-name-item" mode={UDExListMode.MultiSelect}
|
|
456
|
+
accessibleName="Explicit choice" label="<b>Rated</b> choice" supportingText="Choice support"
|
|
457
|
+
additionalText="Code A" rating="4" ratingCount="4.0" totalCount="20" />);
|
|
458
|
+
const UDExRow = () => cy.get("#explicit-name-item").shadow().find('[part="item"]');
|
|
459
|
+
const assertNameSource = (expected: string) => {
|
|
460
|
+
UDExRow().should("have.attr", "aria-label", expected);
|
|
461
|
+
cy.get("#explicit-name-item").shadow().find(".udex-list__content-wrap").should($wrapper => {
|
|
462
|
+
const root = $wrapper[0].getRootNode() as ShadowRoot;
|
|
463
|
+
expect($wrapper).to.have.attr("aria-label", expected);
|
|
464
|
+
const source = root.getElementById($wrapper[0].getAttribute("aria-labelledby")!);
|
|
465
|
+
expect(source, "explicit name source resolves in the native row's shadow root").not.to.equal(null);
|
|
466
|
+
expect(source!.getRootNode()).to.equal(root);
|
|
467
|
+
expect(source).to.have.class("hidden");
|
|
468
|
+
expect(normalizeText(source!.textContent)).to.equal(expected);
|
|
469
|
+
});
|
|
470
|
+
cy.get("#explicit-name-item").shadow().find('[part="title"]').should("have.text", "Rated choice");
|
|
471
|
+
};
|
|
472
|
+
assertNameSource("Explicit choice");
|
|
473
|
+
cy.get("#explicit-name-item").invoke("prop", "accessibleName", "");
|
|
474
|
+
assertNameSource("Rated choice Choice support Code A Rating 4.0, Total 20, Rating Indicator 4 of 5");
|
|
475
|
+
cy.get("#explicit-name-item").invoke("prop", "accessibleName", "Restored override");
|
|
476
|
+
assertNameSource("Restored override");
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
it("does not duplicate the host-owned name or state on a presentational inner row", () => {
|
|
480
|
+
cy.mount(<UDExListItem id="host-named-item" mode={UDExListMode.MultiSelect}
|
|
481
|
+
_useHostAriaRole={true} role="option" aria-label="Host-owned choice" aria-selected="true"
|
|
482
|
+
selected accessibleName="Explicit inner name" label="Visible choice" supportingText="Choice support" />);
|
|
483
|
+
cy.get("#host-named-item").should($host => {
|
|
484
|
+
expect($host).to.have.attr("role", "option");
|
|
485
|
+
expect($host).to.have.attr("aria-label", "Host-owned choice");
|
|
486
|
+
expect($host).to.have.attr("aria-selected", "true");
|
|
487
|
+
});
|
|
488
|
+
cy.get("#host-named-item").shadow().find('[part="item"]').should($row => {
|
|
489
|
+
expect($row).to.have.attr("role", "presentation");
|
|
490
|
+
["aria-label", "aria-selected", "aria-checked", "tabindex"].forEach(UDExAttribute => {
|
|
491
|
+
expect($row).not.to.have.attr(UDExAttribute);
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
cy.get("#host-named-item").shadow().find("[udex-checkbox]").should($checkbox => {
|
|
495
|
+
expect($checkbox).to.have.attr("aria-hidden", "true");
|
|
496
|
+
expect($checkbox).to.have.attr("tabindex", "-1");
|
|
497
|
+
expect($checkbox).not.to.have.attr("accessible-name");
|
|
498
|
+
expect($checkbox[0]).to.have.property("checked", true);
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
|
|
275
503
|
// Added: unit-level coverage for the WCAG 4.1.2 Treeview Checkbox pattern getter
|
|
276
504
|
// (ariaCheckedValue). It only activates when the item's accessible-role ===
|
|
277
505
|
// "treeitem" (set by SearchableListBase in the tree pattern). The inner checkbox
|
|
@@ -3020,10 +3020,15 @@ describe("SelectBox", () => {
|
|
|
3020
3020
|
.to.deep.equal([$host[0]]);
|
|
3021
3021
|
});
|
|
3022
3022
|
});
|
|
3023
|
-
//
|
|
3023
|
+
// Updated: the full accessible name includes metadata; the visible title is only the primary label.
|
|
3024
3024
|
UDExActiveHost().then($host => {
|
|
3025
3025
|
if ($host.is("[udex-list-item]")) {
|
|
3026
|
-
cy.wrap($host).shadow().find(".udex-list__content-wrap").should(
|
|
3026
|
+
cy.wrap($host).shadow().find(".udex-list__content-wrap").should($content => {
|
|
3027
|
+
expect($content).to.have.attr("aria-label", UDExAccessibleName);
|
|
3028
|
+
const labelId = $content.attr("aria-labelledby")!;
|
|
3029
|
+
const root = $content[0].getRootNode() as ShadowRoot;
|
|
3030
|
+
expect(root.getElementById(labelId)?.textContent).to.equal(UDExAccessibleName);
|
|
3031
|
+
});
|
|
3027
3032
|
cy.wrap($host).shadow().find('[part="title"]').should("have.text", UDExLabel);
|
|
3028
3033
|
}
|
|
3029
3034
|
});
|
|
@@ -260,14 +260,14 @@ function UDExAssertNativeHostStates() {
|
|
|
260
260
|
}
|
|
261
261
|
|
|
262
262
|
function UDExAssertLeafName(UDExHost: Cypress.Chainable<JQuery<HTMLElement>>, UDExLabel: string, UDExSupportingText = "", UDExAdditionalText = "") {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
263
|
+
const accessibleName = [UDExLabel, UDExSupportingText, UDExAdditionalText].filter(Boolean).join(" ");
|
|
264
|
+
// Updated: hosts and both wrapper name sources expose the full name, not just the visible title.
|
|
265
|
+
UDExHost.should("have.attr", "aria-label", accessibleName);
|
|
266
266
|
UDExHost.shadow().find(".udex-list__content-wrap").should($content => {
|
|
267
|
-
expect($content).to.have.attr("aria-label",
|
|
267
|
+
expect($content).to.have.attr("aria-label", accessibleName);
|
|
268
268
|
const UDExLabelId = $content.attr("aria-labelledby")!;
|
|
269
269
|
const UDExRoot = $content[0].getRootNode() as ShadowRoot;
|
|
270
|
-
expect(UDExRoot.getElementById(UDExLabelId)?.textContent).to.equal(
|
|
270
|
+
expect(UDExRoot.getElementById(UDExLabelId)?.textContent).to.equal(accessibleName);
|
|
271
271
|
expect($content.find('[part="title"]').text()).to.equal(UDExLabel);
|
|
272
272
|
});
|
|
273
273
|
}
|
package/dist/FilterMenu.d.ts
CHANGED
|
@@ -236,8 +236,8 @@ declare class UDExFilterMenu extends UDExSearchableListBase {
|
|
|
236
236
|
* - SingleSelect mode with at least one collapsible group
|
|
237
237
|
* (headers expose aria-expanded, items expose aria-selected).
|
|
238
238
|
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
239
|
+
* MultiSelect Select All is a parent of its controlled items, not an extra
|
|
240
|
+
* option in their sibling count. It therefore uses the same tree hierarchy.
|
|
241
241
|
*/
|
|
242
242
|
get isTreeStructure(): boolean;
|
|
243
243
|
get triggerButtonAccessibleName(): string;
|
package/dist/FilterMenu.js
CHANGED
|
@@ -368,11 +368,11 @@ let UDExFilterMenu = UDExFilterMenu_1 = class UDExFilterMenu extends UDExSearcha
|
|
|
368
368
|
* - SingleSelect mode with at least one collapsible group
|
|
369
369
|
* (headers expose aria-expanded, items expose aria-selected).
|
|
370
370
|
*
|
|
371
|
-
*
|
|
372
|
-
*
|
|
371
|
+
* MultiSelect Select All is a parent of its controlled items, not an extra
|
|
372
|
+
* option in their sibling count. It therefore uses the same tree hierarchy.
|
|
373
373
|
*/
|
|
374
374
|
get isTreeStructure() {
|
|
375
|
-
const groups = this._filteredItems.filter(e => e.isGroup
|
|
375
|
+
const groups = this._filteredItems.filter(e => e.isGroup);
|
|
376
376
|
if (!groups.length) {
|
|
377
377
|
return false;
|
|
378
378
|
}
|
|
@@ -383,7 +383,9 @@ let UDExFilterMenu = UDExFilterMenu_1 = class UDExFilterMenu extends UDExSearcha
|
|
|
383
383
|
&& groups.some(e => e.item.collapsible);
|
|
384
384
|
}
|
|
385
385
|
get triggerButtonAccessibleName() {
|
|
386
|
-
|
|
386
|
+
const visibleLabel = [this.filterNamePrefix, this.filterName, this.badgeValue || undefined]
|
|
387
|
+
.filter(Boolean).join(" ").trim();
|
|
388
|
+
return this.accessibleName || visibleLabel || translate(UDExFilterMenu_1, SELECT_OPTIONS);
|
|
387
389
|
}
|
|
388
390
|
get searchableList() {
|
|
389
391
|
return SearchableListBaseTemplate.call(this);
|
package/dist/FilterMenu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterMenu.js","sourceRoot":"","sources":["../src/FilterMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport {\n isTabPrevious, isTabNext, isEscape, isSpace, isEnter,\n} from \"@ui5/webcomponents-base/dist/Keys.js\";\nimport { renderFinished } from \"@ui5/webcomponents-base/dist/Render.js\";\nimport PopupAccessibleRole from \"@ui5/webcomponents/dist/types/PopupAccessibleRole.js\";\nimport Popover from \"@ui5/webcomponents/dist/Popover.js\";\nimport UDExBusyIndicator from \"./BusyIndicator.js\";\nimport Icon from \"@ui5/webcomponents/dist/Icon.js\";\nimport IllustratedMessage from \"@ui5/webcomponents-fiori/dist/IllustratedMessage.js\";\nimport \"@ui5/webcomponents-fiori/dist/illustrations/NoSearchResults.js\";\nimport UDExList from \"./List.js\";\nimport UDExListItem from \"./ListItem.js\";\nimport UDExListGroupHeader from \"./ListGroupHeader.js\";\nimport UDExFilterMenuItem from \"./FilterMenuItem.js\";\nimport UDExFilterMenuGroupHeader from \"./FilterMenuGroupHeader.js\";\nimport type { UDExSearchKeydownEventDetail } from \"./Search.js\";\nimport UDExSearch from \"./Search.js\";\nimport UDExButton from \"./Button.js\";\nimport type { UDExSearchableListBaseEvents } from \"./SearchableListBase.js\";\nimport UDExSearchableListBase from \"./SearchableListBase.js\";\nimport { UDExPopoverPart } from \"./types/SearchableListBase.js\";\nimport { Placement, HorizontalAlign } from \"./types/Dropdown.js\";\nimport { UDExListMode } from \"./types/List.js\";\nimport UDExFilterMenuSelectAll from \"./FilterMenuSelectAll.js\";\nimport UDExListSelectAll from \"./ListSelectAll.js\";\nimport UDExBadge from \"./Badge.js\";\nimport type UDExListItemBase from \"./ListItemBase.js\";\nimport { RESET, SHOW_RESULTS, SELECT_OPTIONS } from \"./generated/i18n/i18n-defaults.js\";\nimport \"@ui5/webcomponents-icons/dist/navigation-down-arrow.js\";\nimport FilterMenuTemplate from \"./FilterMenuTemplate.js\";\nimport SearchableListBaseTemplate from \"./SearchableListBaseTemplate.js\";\nimport type UDExListGroupHeaderBase from \"./ListGroupHeaderBase.js\";\nimport translate from \"./utils/translate.js\";\n\n// Styles\nimport FilterMenuCss from \"./generated/themes/FilterMenu.css.js\";\nimport SearchableListCss from \"./generated/themes/SearchableList.css.js\";\nimport getEffectiveScrollbarStyle from \"./utils/getEffectiveScrollbarStyle.js\";\n\nexport type initialItemState = {\n id: string,\n selected: boolean,\n indeterminate?: boolean,\n collapsed?: boolean,\n _filtered?: boolean,\n}\n\ntype UDExFilterMenuResultClickEventDetail = {\n selectedItems: Array<UDExListItemBase>,\n}\n\ntype UDExFilterMenuResetClickEventDetail = {\n restoredItems: Array<UDExListItemBase>,\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-filter-menu</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/UDExFilterMenu.js\";</code>\n *\n * @constructor\n * @extends UDExSearchableListBase\n * @tagname udex-filter-menu\n * @public\n */\n@customElement({\n tag: \"udex-filter-menu\",\n renderer: jsxRenderer,\n styles: [FilterMenuCss, SearchableListCss, getEffectiveScrollbarStyle()],\n template: FilterMenuTemplate,\n dependencies: [\n IllustratedMessage,\n Popover,\n Icon,\n UDExBusyIndicator,\n UDExFilterMenuItem,\n UDExFilterMenuGroupHeader,\n UDExFilterMenuSelectAll,\n UDExList,\n UDExListSelectAll,\n UDExListItem,\n UDExListGroupHeader,\n UDExBadge,\n UDExSearch,\n UDExButton,\n ],\n})\n\n/**\n * Fired event when the user click on a reset button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} restoredItems\n */\n@event(\"reset-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on a result button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} selectedItems\n */\n@event(\"result-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on Select All header item.\n *\n * @public\n */\n@event(\"select-all\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is opened.\n *\n * @public\n */\n@event(\"before-open\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is opened.\n *\n * @public\n */\n@event(\"after-open\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is closed.\n *\n * @public\n */\n@event(\"before-close\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is closed.\n *\n * @public\n */\n@event(\"after-close\", { bubbles: true })\n\nclass UDExFilterMenu extends UDExSearchableListBase {\n eventDetails!: {\n \"result-click\": UDExFilterMenuResultClickEventDetail,\n \"reset-click\": UDExFilterMenuResetClickEventDetail,\n \"before-open\": void,\n \"after-open\": void,\n \"before-close\": void,\n \"after-close\": void,\n } & UDExSearchableListBaseEvents;\n /**\n * Determines the value of the badge.\n *\n * @public\n */\n @property({ type: Number })\n badgeValue?: number;\n\n /**\n * Determines if there is no enough space, the component can be placed\n * over the target.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disableTargetOverlap?: boolean;\n\n /**\n * Determines on which side the component is placed at.\n *\n * @default \"Bottom\"\n * @public\n */\n @property()\n placement: `${Placement}` = Placement.Bottom;\n\n /**\n * Determines the horizontal alignment of the component.\n *\n * @default \"Left\"\n * @public\n */\n @property()\n horizontalAlign: `${HorizontalAlign}` = HorizontalAlign.Start;\n\n /**\n * Defines the mode of the component.\n *\n * @default \"SingleSelect\"\n * @public\n */\n @property()\n mode: `${UDExListMode}` = UDExListMode.SingleSelect;\n\n /**\n * Defines the label of the button reset in the footer.\n *\n * @default \"Reset\"\n * @public\n */\n @property()\n resetBtnLabel?: string;\n\n /**\n * Defines the label of the button result in the footer.\n *\n * @default \"Show Result\"\n * @public\n */\n @property()\n resultBtnLabel?: string;\n\n /**\n * Defines the filter name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterName!: string;\n\n /**\n * Defines the filter name prefix of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterNamePrefix!: string;\n\n /**\n * Defines whether the component is in disabled state.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disabled: boolean = false;\n\n /**\n * Defines whether the dropdown is open or not.\n *\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _open: boolean = false;\n\n /**\n * Hides the result button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResultBtn: boolean = false;\n\n /**\n * Hides the reset button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResetBtn: boolean = false;\n\n /**\n * Defines the accessible ARIA name of the component.\n *\n * @default undefined\n * @public\n */\n @property()\n accessibleName?: string;\n\n /**\n * Defines id (or many ids) of the elements that contain the ARIA name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n accessibleNameRef!: string;\n /**\n * Allows setting a custom role.\n * @default \"None\"\n * @public\n */\n @property()\n accessibleRole: `${PopupAccessibleRole}` = PopupAccessibleRole.None;\n\n /**\n * Allows setting a custom role for dropdown trigger.\n * @default \"button\"\n * @public\n */\n @property({ type: String })\n triggerAccessibleRole: string = \"button\";\n\n /**\n * Determines whether the filter should be applied.\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _shouldApplyFilter: boolean = false;\n\n /**\n * Determines whether the component should be re-rendered.\n * @default false\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _requestRender = false;\n\n _trigger!: UDExButton;\n _search!: UDExSearch | HTMLInputElement;\n _popover!: Popover;\n _breakpointSizeXS = 640;\n _initialState: Array<initialItemState> = [];\n _list!: UDExList;\n\n onEnterDOM(): void {\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n }\n\n onBeforeRendering() {\n super.onBeforeRendering();\n }\n\n onAfterRendering() {\n this._search = this.getSearch();\n this._popover = this.getPopover();\n this._trigger = this.getTriggerButton();\n this._list = this.getList();\n }\n\n handleSelectAll(e:CustomEvent): void {\n this.onSelectAllHeaderPress(e);\n }\n\n handleItemPress(e:CustomEvent): void {\n this.onItemPress(e);\n\n if (this.modeSingleSelect) {\n this.onDropdownClose();\n }\n }\n\n handleHeaderPress(e:CustomEvent): void {\n this.onHeaderPress(e);\n }\n\n handleValueSearch(e:CustomEvent<{ value: string }>): void {\n this.onSearch(e.detail.value);\n }\n\n handleSubmitSearch(): void {\n this.onDropdownClose();\n this.onSubmitSearch();\n }\n\n handleResetSearch(): void {\n this.onResetSearch();\n }\n\n handleReset(): void {\n this.onDropdownClose();\n this.fireDecoratorEvent(\"reset-click\", {\n restoredItems: this.selectedItems,\n });\n this.onReset();\n }\n\n handleResult(): void {\n this._shouldApplyFilter = true;\n this.onDropdownClose();\n this.fireDecoratorEvent(\"result-click\", {\n selectedItems: this.selectedItems,\n });\n }\n\n handleKeyDownList(e: KeyboardEvent): void {\n const isTabNextPress = isTabNext(e) && !this.hasFooterButtons;\n const isTabPrevPress = isTabPrevious(e) && !this._search;\n const target = e.target as HTMLElement;\n const isSearchResetTrigger = target === this._search;\n if ((isTabNextPress && (!isSearchResetTrigger || this.isListEmpty)) || isTabPrevPress) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownSearch(keyEvent: CustomEvent<UDExSearchKeydownEventDetail>): void {\n const { detail: { e } } = keyEvent;\n if (isTabPrevious(e) || isEscape(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResultBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || (isTabNext(e) && !this.hasResetBtn)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResetBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || isTabNext(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleTriggerClick(): void {\n this.toggleDropdown();\n }\n\n handleTriggerKeydown(e: KeyboardEvent): void {\n if (isSpace(e) || isEnter(e)) {\n e.preventDefault();\n this.toggleDropdown();\n }\n }\n\n toggleDropdown(): void {\n this._open = !this._open;\n\n if (this._open) {\n this._trigger.classList.add(\"udex-filter-menu__trigger-active\");\n this._popover.opener = this._trigger;\n this._popover.open = true;\n } else {\n this.onDropdownClose();\n }\n }\n\n onDropdownClose(e?: KeyboardEvent): void {\n if (this._popover.open) {\n if (e && (isTabPrevious(e) || isEscape(e))) {\n e.preventDefault();\n this._popover.open = false;\n } else {\n this._popover.open = false;\n }\n }\n }\n\n _dropdownBeforeOpen(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"addEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"addEventListener\");\n }\n\n if (this.height) {\n this._setContentHeight();\n }\n\n this._initialState = this._getInitialState(this.items);\n this.fireDecoratorEvent(\"before-open\");\n }\n\n _dropdownAfterOpen(): void {\n const popoverLeftOffset = +this._popover.style.left.split(\"px\")[0];\n if (this._popover.offsetWidth + popoverLeftOffset < this._breakpointSizeXS) {\n this.style.setProperty(\"--udex-filter-menu-popover-left-offset\", `${this._popover.style.left}`);\n }\n if (this.modeMultiSelect) {\n this._focusFirstInteractiveElement();\n }\n if (this.modeSingleSelect && !this._search) {\n this.activeItem?.focus();\n }\n this._expandCollapsedGroupsWithSelection();\n renderFinished().then(() => {\n this._handleDropdownScroll();\n }).catch(() => {});\n this.fireDecoratorEvent(\"after-open\");\n }\n\n _focusFirstInteractiveElement(): void {\n if (this.showSearch && this._search) {\n this._focusSearchInput();\n return;\n }\n\n this.focusFirstItem();\n }\n\n _focusSearchInput(): void {\n const input = this._search.shadowRoot?.querySelector(\"[id='search-input']\") as HTMLInputElement;\n input.focus();\n }\n\n _getInitialState(items: Array<UDExListItemBase | UDExListGroupHeaderBase>): Array<initialItemState> {\n return items.flatMap(item => {\n if (item.isGroup) {\n const groupState: initialItemState = {\n id: item._id,\n selected: item.selected,\n indeterminate: item.indeterminate,\n collapsed: item.collapsed,\n _filtered: item._filtered,\n };\n const subItemsState = (item as UDExListGroupHeaderBase).getItems().map(subItem => ({\n id: subItem._id,\n selected: subItem.selected,\n }));\n return [groupState, ...subItemsState];\n }\n return {\n id: item._id,\n selected: item.selected,\n };\n });\n }\n\n _setInitialListState(): void {\n this.getSlottedItems(this.items).forEach((item, index) => {\n const initialState = this._initialState[index];\n if (item._id === initialState?.id) {\n item.selected = initialState.selected;\n if (item.isGroup) {\n item.indeterminate = initialState.indeterminate;\n }\n }\n });\n }\n\n _setInitialState(): void {\n this._setInitialListState();\n this._requestRender = true;\n }\n\n _dropdownBeforeClose(): void {\n this.fireDecoratorEvent(\"before-close\");\n }\n\n _dropdownAfterClose(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"removeEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"removeEventListener\");\n }\n\n if (!this._shouldApplyFilter && this.modeMultiSelect && !this.modeSelectAll) {\n this._setInitialState();\n }\n\n this._shouldApplyFilter = false;\n this._open = false;\n this._trigger.classList.remove(\"udex-filter-menu__trigger-active\");\n this.fireDecoratorEvent(\"after-close\");\n }\n\n /**\n * Close the dropdown.\n * @public\n */\n close(): void {\n this.onDropdownClose();\n }\n\n get disableAllowTargetOverlap(): boolean {\n return !this.disableTargetOverlap;\n }\n\n get hasFilterNamePrefix(): boolean {\n return !!this.filterNamePrefix?.length;\n }\n\n get getResultLabelText(): string {\n return this.resultBtnLabel !== undefined && this.resultBtnLabel.length > 0 && this.resultBtnLabel ? this.resultBtnLabel : translate(UDExFilterMenu, SHOW_RESULTS);\n }\n\n get getResetLabelText(): string {\n return this.resetBtnLabel !== undefined && this.resetBtnLabel.length > 0 ? this.resetBtnLabel : translate(UDExFilterMenu, RESET);\n }\n\n get _iconAccessibleNameText(): string {\n return translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n /**\n * FilterMenu uses the ARIA tree pattern for genuinely grouped items when:\n * - MultiSelect mode (headers/items expose aria-checked), or\n * - SingleSelect mode with at least one collapsible group\n * (headers expose aria-expanded, items expose aria-selected).\n *\n * A \"Select All\" header is NOT a hierarchical group — it is a bulk-select\n * affordance for a flat list — so it must not trigger the tree pattern.\n */\n override get isTreeStructure(): boolean {\n const groups = this._filteredItems.filter(e => e.isGroup && !(e.item as UDExListGroupHeaderBase).isSelectAllHeader);\n if (!groups.length) {\n return false;\n }\n if (this.modeMultiSelect) {\n return true;\n }\n return this.modeSingleSelect\n && groups.some(e => (e.item as UDExListGroupHeaderBase).collapsible);\n }\n\n get triggerButtonAccessibleName(): string {\n return this.accessibleName || translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n get searchableList() {\n return SearchableListBaseTemplate.call(this);\n }\n\n static get searchableListBaseTemplate() {\n return SearchableListBaseTemplate;\n }\n\n get hideActionBar(): boolean {\n return this.hideResultBtn && this.hideResetBtn;\n }\n\n get hasFooterButtons(): boolean {\n return !!this.shadowRoot!.querySelector(\"[udex-button]\");\n }\n\n get hasResetBtn(): boolean {\n return !this.hideResetBtn;\n }\n\n get modeSelectAll(): boolean {\n return !!this.querySelector<UDExFilterMenuSelectAll>(\"[udex-filter-menu-select-all]\");\n }\n\n getTriggerButton(): UDExButton {\n return this.shadowRoot!.querySelector<UDExButton>(\"#filterMenuTrigger\")!;\n }\n\n getItems(): Array<UDExListItemBase> {\n return this.getSlottedNodes<UDExListItemBase>(\"items\");\n }\n}\n\nUDExFilterMenu.define();\n\nexport default UDExFilterMenu;\nexport type { UDExFilterMenuResetClickEventDetail, UDExFilterMenuResultClickEventDetail };\n"]}
|
|
1
|
+
{"version":3,"file":"FilterMenu.js","sourceRoot":"","sources":["../src/FilterMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport {\n isTabPrevious, isTabNext, isEscape, isSpace, isEnter,\n} from \"@ui5/webcomponents-base/dist/Keys.js\";\nimport { renderFinished } from \"@ui5/webcomponents-base/dist/Render.js\";\nimport PopupAccessibleRole from \"@ui5/webcomponents/dist/types/PopupAccessibleRole.js\";\nimport Popover from \"@ui5/webcomponents/dist/Popover.js\";\nimport UDExBusyIndicator from \"./BusyIndicator.js\";\nimport Icon from \"@ui5/webcomponents/dist/Icon.js\";\nimport IllustratedMessage from \"@ui5/webcomponents-fiori/dist/IllustratedMessage.js\";\nimport \"@ui5/webcomponents-fiori/dist/illustrations/NoSearchResults.js\";\nimport UDExList from \"./List.js\";\nimport UDExListItem from \"./ListItem.js\";\nimport UDExListGroupHeader from \"./ListGroupHeader.js\";\nimport UDExFilterMenuItem from \"./FilterMenuItem.js\";\nimport UDExFilterMenuGroupHeader from \"./FilterMenuGroupHeader.js\";\nimport type { UDExSearchKeydownEventDetail } from \"./Search.js\";\nimport UDExSearch from \"./Search.js\";\nimport UDExButton from \"./Button.js\";\nimport type { UDExSearchableListBaseEvents } from \"./SearchableListBase.js\";\nimport UDExSearchableListBase from \"./SearchableListBase.js\";\nimport { UDExPopoverPart } from \"./types/SearchableListBase.js\";\nimport { Placement, HorizontalAlign } from \"./types/Dropdown.js\";\nimport { UDExListMode } from \"./types/List.js\";\nimport UDExFilterMenuSelectAll from \"./FilterMenuSelectAll.js\";\nimport UDExListSelectAll from \"./ListSelectAll.js\";\nimport UDExBadge from \"./Badge.js\";\nimport type UDExListItemBase from \"./ListItemBase.js\";\nimport { RESET, SHOW_RESULTS, SELECT_OPTIONS } from \"./generated/i18n/i18n-defaults.js\";\nimport \"@ui5/webcomponents-icons/dist/navigation-down-arrow.js\";\nimport FilterMenuTemplate from \"./FilterMenuTemplate.js\";\nimport SearchableListBaseTemplate from \"./SearchableListBaseTemplate.js\";\nimport type UDExListGroupHeaderBase from \"./ListGroupHeaderBase.js\";\nimport translate from \"./utils/translate.js\";\n\n// Styles\nimport FilterMenuCss from \"./generated/themes/FilterMenu.css.js\";\nimport SearchableListCss from \"./generated/themes/SearchableList.css.js\";\nimport getEffectiveScrollbarStyle from \"./utils/getEffectiveScrollbarStyle.js\";\n\nexport type initialItemState = {\n id: string,\n selected: boolean,\n indeterminate?: boolean,\n collapsed?: boolean,\n _filtered?: boolean,\n}\n\ntype UDExFilterMenuResultClickEventDetail = {\n selectedItems: Array<UDExListItemBase>,\n}\n\ntype UDExFilterMenuResetClickEventDetail = {\n restoredItems: Array<UDExListItemBase>,\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-filter-menu</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/UDExFilterMenu.js\";</code>\n *\n * @constructor\n * @extends UDExSearchableListBase\n * @tagname udex-filter-menu\n * @public\n */\n@customElement({\n tag: \"udex-filter-menu\",\n renderer: jsxRenderer,\n styles: [FilterMenuCss, SearchableListCss, getEffectiveScrollbarStyle()],\n template: FilterMenuTemplate,\n dependencies: [\n IllustratedMessage,\n Popover,\n Icon,\n UDExBusyIndicator,\n UDExFilterMenuItem,\n UDExFilterMenuGroupHeader,\n UDExFilterMenuSelectAll,\n UDExList,\n UDExListSelectAll,\n UDExListItem,\n UDExListGroupHeader,\n UDExBadge,\n UDExSearch,\n UDExButton,\n ],\n})\n\n/**\n * Fired event when the user click on a reset button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} restoredItems\n */\n@event(\"reset-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on a result button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} selectedItems\n */\n@event(\"result-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on Select All header item.\n *\n * @public\n */\n@event(\"select-all\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is opened.\n *\n * @public\n */\n@event(\"before-open\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is opened.\n *\n * @public\n */\n@event(\"after-open\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is closed.\n *\n * @public\n */\n@event(\"before-close\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is closed.\n *\n * @public\n */\n@event(\"after-close\", { bubbles: true })\n\nclass UDExFilterMenu extends UDExSearchableListBase {\n eventDetails!: {\n \"result-click\": UDExFilterMenuResultClickEventDetail,\n \"reset-click\": UDExFilterMenuResetClickEventDetail,\n \"before-open\": void,\n \"after-open\": void,\n \"before-close\": void,\n \"after-close\": void,\n } & UDExSearchableListBaseEvents;\n /**\n * Determines the value of the badge.\n *\n * @public\n */\n @property({ type: Number })\n badgeValue?: number;\n\n /**\n * Determines if there is no enough space, the component can be placed\n * over the target.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disableTargetOverlap?: boolean;\n\n /**\n * Determines on which side the component is placed at.\n *\n * @default \"Bottom\"\n * @public\n */\n @property()\n placement: `${Placement}` = Placement.Bottom;\n\n /**\n * Determines the horizontal alignment of the component.\n *\n * @default \"Left\"\n * @public\n */\n @property()\n horizontalAlign: `${HorizontalAlign}` = HorizontalAlign.Start;\n\n /**\n * Defines the mode of the component.\n *\n * @default \"SingleSelect\"\n * @public\n */\n @property()\n mode: `${UDExListMode}` = UDExListMode.SingleSelect;\n\n /**\n * Defines the label of the button reset in the footer.\n *\n * @default \"Reset\"\n * @public\n */\n @property()\n resetBtnLabel?: string;\n\n /**\n * Defines the label of the button result in the footer.\n *\n * @default \"Show Result\"\n * @public\n */\n @property()\n resultBtnLabel?: string;\n\n /**\n * Defines the filter name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterName!: string;\n\n /**\n * Defines the filter name prefix of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterNamePrefix!: string;\n\n /**\n * Defines whether the component is in disabled state.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disabled: boolean = false;\n\n /**\n * Defines whether the dropdown is open or not.\n *\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _open: boolean = false;\n\n /**\n * Hides the result button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResultBtn: boolean = false;\n\n /**\n * Hides the reset button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResetBtn: boolean = false;\n\n /**\n * Defines the accessible ARIA name of the component.\n *\n * @default undefined\n * @public\n */\n @property()\n accessibleName?: string;\n\n /**\n * Defines id (or many ids) of the elements that contain the ARIA name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n accessibleNameRef!: string;\n /**\n * Allows setting a custom role.\n * @default \"None\"\n * @public\n */\n @property()\n accessibleRole: `${PopupAccessibleRole}` = PopupAccessibleRole.None;\n\n /**\n * Allows setting a custom role for dropdown trigger.\n * @default \"button\"\n * @public\n */\n @property({ type: String })\n triggerAccessibleRole: string = \"button\";\n\n /**\n * Determines whether the filter should be applied.\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _shouldApplyFilter: boolean = false;\n\n /**\n * Determines whether the component should be re-rendered.\n * @default false\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _requestRender = false;\n\n _trigger!: UDExButton;\n _search!: UDExSearch | HTMLInputElement;\n _popover!: Popover;\n _breakpointSizeXS = 640;\n _initialState: Array<initialItemState> = [];\n _list!: UDExList;\n\n onEnterDOM(): void {\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n }\n\n onBeforeRendering() {\n super.onBeforeRendering();\n }\n\n onAfterRendering() {\n this._search = this.getSearch();\n this._popover = this.getPopover();\n this._trigger = this.getTriggerButton();\n this._list = this.getList();\n }\n\n handleSelectAll(e:CustomEvent): void {\n this.onSelectAllHeaderPress(e);\n }\n\n handleItemPress(e:CustomEvent): void {\n this.onItemPress(e);\n\n if (this.modeSingleSelect) {\n this.onDropdownClose();\n }\n }\n\n handleHeaderPress(e:CustomEvent): void {\n this.onHeaderPress(e);\n }\n\n handleValueSearch(e:CustomEvent<{ value: string }>): void {\n this.onSearch(e.detail.value);\n }\n\n handleSubmitSearch(): void {\n this.onDropdownClose();\n this.onSubmitSearch();\n }\n\n handleResetSearch(): void {\n this.onResetSearch();\n }\n\n handleReset(): void {\n this.onDropdownClose();\n this.fireDecoratorEvent(\"reset-click\", {\n restoredItems: this.selectedItems,\n });\n this.onReset();\n }\n\n handleResult(): void {\n this._shouldApplyFilter = true;\n this.onDropdownClose();\n this.fireDecoratorEvent(\"result-click\", {\n selectedItems: this.selectedItems,\n });\n }\n\n handleKeyDownList(e: KeyboardEvent): void {\n const isTabNextPress = isTabNext(e) && !this.hasFooterButtons;\n const isTabPrevPress = isTabPrevious(e) && !this._search;\n const target = e.target as HTMLElement;\n const isSearchResetTrigger = target === this._search;\n if ((isTabNextPress && (!isSearchResetTrigger || this.isListEmpty)) || isTabPrevPress) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownSearch(keyEvent: CustomEvent<UDExSearchKeydownEventDetail>): void {\n const { detail: { e } } = keyEvent;\n if (isTabPrevious(e) || isEscape(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResultBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || (isTabNext(e) && !this.hasResetBtn)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResetBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || isTabNext(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleTriggerClick(): void {\n this.toggleDropdown();\n }\n\n handleTriggerKeydown(e: KeyboardEvent): void {\n if (isSpace(e) || isEnter(e)) {\n e.preventDefault();\n this.toggleDropdown();\n }\n }\n\n toggleDropdown(): void {\n this._open = !this._open;\n\n if (this._open) {\n this._trigger.classList.add(\"udex-filter-menu__trigger-active\");\n this._popover.opener = this._trigger;\n this._popover.open = true;\n } else {\n this.onDropdownClose();\n }\n }\n\n onDropdownClose(e?: KeyboardEvent): void {\n if (this._popover.open) {\n if (e && (isTabPrevious(e) || isEscape(e))) {\n e.preventDefault();\n this._popover.open = false;\n } else {\n this._popover.open = false;\n }\n }\n }\n\n _dropdownBeforeOpen(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"addEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"addEventListener\");\n }\n\n if (this.height) {\n this._setContentHeight();\n }\n\n this._initialState = this._getInitialState(this.items);\n this.fireDecoratorEvent(\"before-open\");\n }\n\n _dropdownAfterOpen(): void {\n const popoverLeftOffset = +this._popover.style.left.split(\"px\")[0];\n if (this._popover.offsetWidth + popoverLeftOffset < this._breakpointSizeXS) {\n this.style.setProperty(\"--udex-filter-menu-popover-left-offset\", `${this._popover.style.left}`);\n }\n if (this.modeMultiSelect) {\n this._focusFirstInteractiveElement();\n }\n if (this.modeSingleSelect && !this._search) {\n this.activeItem?.focus();\n }\n this._expandCollapsedGroupsWithSelection();\n renderFinished().then(() => {\n this._handleDropdownScroll();\n }).catch(() => {});\n this.fireDecoratorEvent(\"after-open\");\n }\n\n _focusFirstInteractiveElement(): void {\n if (this.showSearch && this._search) {\n this._focusSearchInput();\n return;\n }\n\n this.focusFirstItem();\n }\n\n _focusSearchInput(): void {\n const input = this._search.shadowRoot?.querySelector(\"[id='search-input']\") as HTMLInputElement;\n input.focus();\n }\n\n _getInitialState(items: Array<UDExListItemBase | UDExListGroupHeaderBase>): Array<initialItemState> {\n return items.flatMap(item => {\n if (item.isGroup) {\n const groupState: initialItemState = {\n id: item._id,\n selected: item.selected,\n indeterminate: item.indeterminate,\n collapsed: item.collapsed,\n _filtered: item._filtered,\n };\n const subItemsState = (item as UDExListGroupHeaderBase).getItems().map(subItem => ({\n id: subItem._id,\n selected: subItem.selected,\n }));\n return [groupState, ...subItemsState];\n }\n return {\n id: item._id,\n selected: item.selected,\n };\n });\n }\n\n _setInitialListState(): void {\n this.getSlottedItems(this.items).forEach((item, index) => {\n const initialState = this._initialState[index];\n if (item._id === initialState?.id) {\n item.selected = initialState.selected;\n if (item.isGroup) {\n item.indeterminate = initialState.indeterminate;\n }\n }\n });\n }\n\n _setInitialState(): void {\n this._setInitialListState();\n this._requestRender = true;\n }\n\n _dropdownBeforeClose(): void {\n this.fireDecoratorEvent(\"before-close\");\n }\n\n _dropdownAfterClose(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"removeEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"removeEventListener\");\n }\n\n if (!this._shouldApplyFilter && this.modeMultiSelect && !this.modeSelectAll) {\n this._setInitialState();\n }\n\n this._shouldApplyFilter = false;\n this._open = false;\n this._trigger.classList.remove(\"udex-filter-menu__trigger-active\");\n this.fireDecoratorEvent(\"after-close\");\n }\n\n /**\n * Close the dropdown.\n * @public\n */\n close(): void {\n this.onDropdownClose();\n }\n\n get disableAllowTargetOverlap(): boolean {\n return !this.disableTargetOverlap;\n }\n\n get hasFilterNamePrefix(): boolean {\n return !!this.filterNamePrefix?.length;\n }\n\n get getResultLabelText(): string {\n return this.resultBtnLabel !== undefined && this.resultBtnLabel.length > 0 && this.resultBtnLabel ? this.resultBtnLabel : translate(UDExFilterMenu, SHOW_RESULTS);\n }\n\n get getResetLabelText(): string {\n return this.resetBtnLabel !== undefined && this.resetBtnLabel.length > 0 ? this.resetBtnLabel : translate(UDExFilterMenu, RESET);\n }\n\n get _iconAccessibleNameText(): string {\n return translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n /**\n * FilterMenu uses the ARIA tree pattern for genuinely grouped items when:\n * - MultiSelect mode (headers/items expose aria-checked), or\n * - SingleSelect mode with at least one collapsible group\n * (headers expose aria-expanded, items expose aria-selected).\n *\n * MultiSelect Select All is a parent of its controlled items, not an extra\n * option in their sibling count. It therefore uses the same tree hierarchy.\n */\n override get isTreeStructure(): boolean {\n const groups = this._filteredItems.filter(e => e.isGroup);\n if (!groups.length) {\n return false;\n }\n if (this.modeMultiSelect) {\n return true;\n }\n return this.modeSingleSelect\n && groups.some(e => (e.item as UDExListGroupHeaderBase).collapsible);\n }\n\n get triggerButtonAccessibleName(): string {\n const visibleLabel = [this.filterNamePrefix, this.filterName, this.badgeValue || undefined]\n .filter(Boolean).join(\" \").trim();\n return this.accessibleName || visibleLabel || translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n get searchableList() {\n return SearchableListBaseTemplate.call(this);\n }\n\n static get searchableListBaseTemplate() {\n return SearchableListBaseTemplate;\n }\n\n get hideActionBar(): boolean {\n return this.hideResultBtn && this.hideResetBtn;\n }\n\n get hasFooterButtons(): boolean {\n return !!this.shadowRoot!.querySelector(\"[udex-button]\");\n }\n\n get hasResetBtn(): boolean {\n return !this.hideResetBtn;\n }\n\n get modeSelectAll(): boolean {\n return !!this.querySelector<UDExFilterMenuSelectAll>(\"[udex-filter-menu-select-all]\");\n }\n\n getTriggerButton(): UDExButton {\n return this.shadowRoot!.querySelector<UDExButton>(\"#filterMenuTrigger\")!;\n }\n\n getItems(): Array<UDExListItemBase> {\n return this.getSlottedNodes<UDExListItemBase>(\"items\");\n }\n}\n\nUDExFilterMenu.define();\n\nexport default UDExFilterMenu;\nexport type { UDExFilterMenuResetClickEventDetail, UDExFilterMenuResultClickEventDetail };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@ui5/webcomponents-base/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@ui5/webcomponents-base/jsx-runtime";
|
|
2
2
|
import UDExBadge from "./Badge.js";
|
|
3
3
|
import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
|
|
4
4
|
import UI5Popover from "@ui5/webcomponents/dist/Popover.js";
|
|
@@ -8,7 +8,7 @@ import UDExButtonSize from "./types/ButtonSize.js";
|
|
|
8
8
|
import SearchableListBaseTemplate from "./SearchableListBaseTemplate.js";
|
|
9
9
|
import { UDExTextBadgeDesign, UDExTypeBadgeDesign } from "./types/BadgeDesign.js";
|
|
10
10
|
export default function FilterMenuTemplate() {
|
|
11
|
-
return (_jsxs("div", { children: [_jsxs("button", { id: "filterMenuTrigger", onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeydown, "aria-label": this.triggerButtonAccessibleName, "aria-labelledby": this.accessibleNameRef, "aria-expanded": this._open, "aria-haspopup": "dialog", role: this.triggerAccessibleRole, "aria-controls": `${this._id}_udex-filter-menu-dropdown`, disabled: this.disabled, class: "udex-filter-menu__trigger", tabindex: 0, children: [this.hasFilterNamePrefix && (_jsx("span", { class: "udex-filter-menu__trigger-prefix", children: this.filterNamePrefix })), _jsxs("span", { class: "udex-filter-menu__trigger-wrap", ...(this.disabled ? { disabled: "" } : {}), children: [_jsx("span", { class: "udex-filter-menu__trigger-name", children: this.filterName }), !!this.badgeValue && (_jsx(UDExBadge, { class: "udex-filter-menu__badge", type: UDExTypeBadgeDesign.Number, design: UDExTextBadgeDesign.Information, size: "Small", children: this.badgeValue })), _jsx(UI5Icon, { class: "udex-filter-menu__trigger-icon", name: "navigation-down-arrow", mode: "Decorative", "accessible-name": this._iconAccessibleNameText })] })] }), _jsxs(UI5Popover, { id: `${this._id}_udex-filter-menu-dropdown`, "hide-arrow": true, "allow-target-overlap": this.disableAllowTargetOverlap, "accessible-role": this.accessibleRole, placement: this.placement, "horizontal-align": this.horizontalAlign, onKeyDown: this.handleKeyDownList, onBeforeOpen: this._dropdownBeforeOpen, onOpen: this._dropdownAfterOpen, onBeforeClose: this._dropdownBeforeClose, onClose: this._dropdownAfterClose, ...{
|
|
11
|
+
return (_jsxs("div", { children: [_jsxs("button", { id: "filterMenuTrigger", onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeydown, "aria-label": this.triggerButtonAccessibleName, "aria-labelledby": this.accessibleNameRef, "aria-expanded": this._open, "aria-haspopup": "dialog", role: this.triggerAccessibleRole, "aria-controls": `${this._id}_udex-filter-menu-dropdown`, disabled: this.disabled, class: "udex-filter-menu__trigger", tabindex: 0, children: [this.hasFilterNamePrefix && (_jsxs(_Fragment, { children: [_jsx("span", { class: "udex-filter-menu__trigger-prefix", children: this.filterNamePrefix }), " "] })), _jsxs("span", { class: "udex-filter-menu__trigger-wrap", ...(this.disabled ? { disabled: "" } : {}), children: [_jsx("span", { class: "udex-filter-menu__trigger-name", children: this.filterName }), !!this.badgeValue && (_jsxs(_Fragment, { children: [" ", _jsx(UDExBadge, { class: "udex-filter-menu__badge", type: UDExTypeBadgeDesign.Number, design: UDExTextBadgeDesign.Information, size: "Small", children: this.badgeValue })] })), _jsx(UI5Icon, { class: "udex-filter-menu__trigger-icon", name: "navigation-down-arrow", mode: "Decorative", "accessible-name": this._iconAccessibleNameText })] })] }), _jsxs(UI5Popover, { id: `${this._id}_udex-filter-menu-dropdown`, "hide-arrow": true, "allow-target-overlap": this.disableAllowTargetOverlap, "accessible-role": this.accessibleRole, placement: this.placement, "horizontal-align": this.horizontalAlign, onKeyDown: this.handleKeyDownList, onBeforeOpen: this._dropdownBeforeOpen, onOpen: this._dropdownAfterOpen, onBeforeClose: this._dropdownBeforeClose, onClose: this._dropdownAfterClose, ...{
|
|
12
12
|
onItemPress: this.handleItemPress,
|
|
13
13
|
onHeaderPress: this.handleHeaderPress,
|
|
14
14
|
onSelectAll: this.handleSelectAll,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterMenuTemplate.js","sourceRoot":"","sources":["../src/FilterMenuTemplate.tsx"],"names":[],"mappings":";AACA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,OAAO,MAAM,iCAAiC,CAAC;AACtD,OAAO,UAAU,MAAM,oCAAoC,CAAC;AAC5D,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AACvD,OAAO,cAAc,MAAM,uBAAuB,CAAC;AACnD,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElF,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACxC,OAAO,CACL,0BACE,kBACE,EAAE,EAAC,mBAAmB,EACtB,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAChC,SAAS,EAAE,IAAI,CAAC,oBAAoB,gBACxB,IAAI,CAAC,2BAA2B,qBAC3B,IAAI,CAAC,iBAAiB,mBACxB,IAAI,CAAC,KAAK,mBACX,QAAQ,EACtB,IAAI,EAAE,IAAI,CAAC,qBAAiC,mBAC7B,GAAG,IAAI,CAAC,GAAG,4BAA4B,EACtD,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,KAAK,EAAC,2BAA2B,EACjC,QAAQ,EAAE,CAAC,aACV,IAAI,CAAC,mBAAmB,IAAI,CAC3B,eAAM,KAAK,EAAC,kCAAkC,YAAE,IAAI,CAAC,gBAAgB,GAAQ,
|
|
1
|
+
{"version":3,"file":"FilterMenuTemplate.js","sourceRoot":"","sources":["../src/FilterMenuTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import type UDExFilterMenu from \"./FilterMenu.js\";\nimport UDExBadge from \"./Badge.js\";\nimport UI5Icon from \"@ui5/webcomponents/dist/Icon.js\";\nimport UI5Popover from \"@ui5/webcomponents/dist/Popover.js\";\nimport UDExButton from \"./Button.js\";\nimport UDExButtonDesign from \"./types/ButtonDesign.js\";\nimport UDExButtonSize from \"./types/ButtonSize.js\";\nimport SearchableListBaseTemplate from \"./SearchableListBaseTemplate.js\";\nimport type { AriaRole } from \"@ui5/webcomponents-base/dist/types.js\";\nimport { UDExTextBadgeDesign, UDExTypeBadgeDesign } from \"./types/BadgeDesign.js\";\n\nexport default function FilterMenuTemplate(this: UDExFilterMenu) {\n return (\n <div>\n <button\n id=\"filterMenuTrigger\"\n onClick={this.handleTriggerClick}\n onKeyDown={this.handleTriggerKeydown}\n aria-label={this.triggerButtonAccessibleName}\n aria-labelledby={this.accessibleNameRef}\n aria-expanded={this._open}\n aria-haspopup=\"dialog\"\n role={this.triggerAccessibleRole as AriaRole}\n aria-controls={`${this._id}_udex-filter-menu-dropdown`}\n disabled={this.disabled}\n class=\"udex-filter-menu__trigger\"\n tabindex={0}>\n {this.hasFilterNamePrefix && (\n <>\n <span class=\"udex-filter-menu__trigger-prefix\">{this.filterNamePrefix}</span>{\" \"}\n </>\n )}\n <span class=\"udex-filter-menu__trigger-wrap\" {...(this.disabled ? { disabled: \"\" } : {})}>\n <span class=\"udex-filter-menu__trigger-name\">{this.filterName}</span>\n {!!this.badgeValue && (\n <>\n {\" \"}<UDExBadge\n class=\"udex-filter-menu__badge\"\n type={UDExTypeBadgeDesign.Number}\n design={UDExTextBadgeDesign.Information}\n size=\"Small\">\n {this.badgeValue}\n </UDExBadge>\n </>\n )}\n <UI5Icon\n class=\"udex-filter-menu__trigger-icon\"\n name=\"navigation-down-arrow\"\n mode=\"Decorative\"\n accessible-name={this._iconAccessibleNameText}>\n </UI5Icon>\n </span>\n </button>\n <UI5Popover\n id={`${this._id}_udex-filter-menu-dropdown`}\n hide-arrow\n allow-target-overlap={this.disableAllowTargetOverlap}\n accessible-role={this.accessibleRole}\n placement={this.placement}\n horizontal-align={this.horizontalAlign}\n onKeyDown={this.handleKeyDownList}\n onBeforeOpen={this._dropdownBeforeOpen}\n onOpen={this._dropdownAfterOpen}\n onBeforeClose={this._dropdownBeforeClose}\n onClose={this._dropdownAfterClose}\n {...({\n onItemPress: this.handleItemPress,\n onHeaderPress: this.handleHeaderPress,\n onSelectAll: this.handleSelectAll,\n onSearchKeydown: this.handleKeyDownSearch,\n onSubmitSearchValue: this.handleSubmitSearch,\n onHandleValueSearch: this.handleValueSearch,\n onHandleValueReset: this.handleResetSearch,\n } as any)}>\n {SearchableListBaseTemplate.call(this)}\n {this.modeMultiSelect && renderButtons.call(this)}\n </UI5Popover>\n </div>\n );\n}\n\nfunction renderButtons(this: UDExFilterMenu) {\n if (this.hideActionBar) { return null; }\n return (\n <div class=\"udex-filter-menu__footer\" slot=\"footer\" {...({ name: \"footer\" } as any)}>\n {!this.hideResultBtn && (\n <UDExButton\n class=\"udex-filter-menu__result-btn\"\n size={UDExButtonSize.Medium}\n design={UDExButtonDesign.Primary}\n onKeyDown={this.handleKeyDownResultBtn}\n onClick={this.handleResult}>\n {this.getResultLabelText}\n </UDExButton>\n )}\n {!this.hideResetBtn && (\n <UDExButton\n class=\"udex-filter-menu__reset-btn\"\n size={UDExButtonSize.Medium}\n design={UDExButtonDesign.Tertiary}\n onKeyDown={this.handleKeyDownResetBtn}\n onClick={this.handleReset}>\n {this.getResetLabelText}\n </UDExButton>\n )}\n </div>\n );\n}\n"]}
|
package/dist/List.d.ts
CHANGED
|
@@ -113,14 +113,7 @@ declare class UDExList extends UI5Element {
|
|
|
113
113
|
handleKeyDown(e: KeyboardEvent): void;
|
|
114
114
|
handleArrowRight(e: KeyboardEvent): void;
|
|
115
115
|
handleArrowLeft(e: KeyboardEvent): void;
|
|
116
|
-
/**
|
|
117
|
-
* Arrow-key expand/collapse toggles `collapsed` directly here (multi-select
|
|
118
|
-
* headers deliver Left/Right to the List, not to the header's own key handler),
|
|
119
|
-
* so the `accordion-icon-click` event that drives the collapse/expand live-region
|
|
120
|
-
* announcement is never fired on this path. Re-emit it from the header so
|
|
121
|
-
* SearchableListBase announces the new state to screen readers, matching the
|
|
122
|
-
* chevron/pointer and single-select paths.
|
|
123
|
-
*/
|
|
116
|
+
/** Synchronize arrow-key expansion with the source without selection or focus changes. */
|
|
124
117
|
fireAccordionToggle(target: UDExListItemBase): void;
|
|
125
118
|
handleUpArrow(e: KeyboardEvent): void;
|
|
126
119
|
handleDownArrow(e: KeyboardEvent): void;
|
package/dist/List.js
CHANGED
|
@@ -125,6 +125,7 @@ let UDExList = UDExList_1 = class UDExList extends UI5Element {
|
|
|
125
125
|
handleArrowRight(e) {
|
|
126
126
|
const target = e.target;
|
|
127
127
|
if (target.isGroup && target.hasAttribute("collapsible") && target.collapsed) {
|
|
128
|
+
e.preventDefault();
|
|
128
129
|
target.collapsed = false;
|
|
129
130
|
this.setCollapsedItems(false, target);
|
|
130
131
|
this.fireAccordionToggle(target);
|
|
@@ -133,24 +134,15 @@ let UDExList = UDExList_1 = class UDExList extends UI5Element {
|
|
|
133
134
|
handleArrowLeft(e) {
|
|
134
135
|
const target = e.target;
|
|
135
136
|
if (target.isGroup && target.hasAttribute("collapsible") && !target.collapsed) {
|
|
137
|
+
e.preventDefault();
|
|
136
138
|
target.collapsed = true;
|
|
137
139
|
this.setCollapsedItems(true, target);
|
|
138
140
|
this.fireAccordionToggle(target);
|
|
139
141
|
}
|
|
140
142
|
}
|
|
141
|
-
/**
|
|
142
|
-
* Arrow-key expand/collapse toggles `collapsed` directly here (multi-select
|
|
143
|
-
* headers deliver Left/Right to the List, not to the header's own key handler),
|
|
144
|
-
* so the `accordion-icon-click` event that drives the collapse/expand live-region
|
|
145
|
-
* announcement is never fired on this path. Re-emit it from the header so
|
|
146
|
-
* SearchableListBase announces the new state to screen readers, matching the
|
|
147
|
-
* chevron/pointer and single-select paths.
|
|
148
|
-
*/
|
|
143
|
+
/** Synchronize arrow-key expansion with the source without selection or focus changes. */
|
|
149
144
|
fireAccordionToggle(target) {
|
|
150
|
-
target.
|
|
151
|
-
bubbles: true,
|
|
152
|
-
detail: { collapsed: target.collapsed },
|
|
153
|
-
}));
|
|
145
|
+
target.fireDecoratorEvent("accordion-icon-click", { collapsed: target.collapsed });
|
|
154
146
|
}
|
|
155
147
|
handleUpArrow(e) {
|
|
156
148
|
e.preventDefault();
|