diff --git a/packages/calcite-components/src/components/list-item/list-item.e2e.ts b/packages/calcite-components/src/components/list-item/list-item.e2e.ts index 863e74b65ac..a28772fa82e 100755 --- a/packages/calcite-components/src/components/list-item/list-item.e2e.ts +++ b/packages/calcite-components/src/components/list-item/list-item.e2e.ts @@ -45,6 +45,18 @@ describe("calcite-list-item", () => { propertyName: "open", defaultValue: false, }, + { + propertyName: "expanded", + defaultValue: false, + }, + { + propertyName: "closed", + defaultValue: false, + }, + { + propertyName: "closable", + defaultValue: false, + }, { propertyName: "dragHandle", defaultValue: false, @@ -90,6 +102,22 @@ describe("calcite-list-item", () => { propertyName: "sortHandleOpen", value: true, }, + { + propertyName: "open", + value: true, + }, + { + propertyName: "expanded", + value: true, + }, + { + propertyName: "closed", + value: true, + }, + { + propertyName: "closable", + value: true, + }, ]); }); @@ -370,50 +398,69 @@ describe("calcite-list-item", () => { expect(calciteListItemClose).toHaveReceivedEventTimes(1); }); - it("should fire calciteListItemToggle event when opened and closed", async () => { - const page = await newE2EPage({ - html: html``, + describe("calciteListItemToggle event", () => { + it("should fire calciteListItemToggle event when expanded and collapsed", async () => { + const page = await newE2EPage({ + html: html``, + }); + + const listItem = await page.find("#test"); + const calciteListItemToggle = await page.spyOnEvent("calciteListItemToggle", "window"); + + expect(await listItem.getProperty("expanded")).toBe(false); + + const expandedButton = await page.find(`#test >>> .${CSS.expandedContainer}`); + + await expandedButton.click(); + expect(await listItem.getProperty("expanded")).toBe(true); + expect(calciteListItemToggle).toHaveReceivedEventTimes(1); + + await expandedButton.click(); + expect(await listItem.getProperty("expanded")).toBe(false); + expect(calciteListItemToggle).toHaveReceivedEventTimes(2); }); - const listItem = await page.find("#test"); - const calciteListItemToggle = await page.spyOnEvent("calciteListItemToggle", "window"); + it("should not fire calciteListItemToggle event without nested items", async () => { + const page = await newE2EPage({ + html: html``, + }); - expect(await listItem.getProperty("open")).toBe(false); + const listItem = await page.find("calcite-list-item"); + const calciteListItemToggle = await page.spyOnEvent("calciteListItemToggle", "window"); - const openButton = await page.find(`#test >>> .${CSS.openContainer}`); + expect(await listItem.getProperty("expanded")).toBe(false); - await openButton.click(); - expect(await listItem.getProperty("open")).toBe(true); - expect(calciteListItemToggle).toHaveReceivedEventTimes(1); + const expandedButton = await page.find(`calcite-list-item >>> .${CSS.expandedContainer}`); - await openButton.click(); - expect(await listItem.getProperty("open")).toBe(false); - expect(calciteListItemToggle).toHaveReceivedEventTimes(2); + expect(expandedButton.getAttribute("title")).toBe(null); + + await expandedButton.click(); + expect(await listItem.getProperty("expanded")).toBe(false); + expect(calciteListItemToggle).toHaveReceivedEventTimes(0); + + await expandedButton.click(); + expect(await listItem.getProperty("expanded")).toBe(false); + expect(calciteListItemToggle).toHaveReceivedEventTimes(0); + }); }); - it("should not fire calciteListItemToggle event without nested items", async () => { + // Broader functionality related to the 'expanded' prop is covered in the `expanded` tests. + it("should map deprecated 'open' prop to 'expanded' prop", async () => { const page = await newE2EPage({ - html: html``, + html: html``, }); - const listItem = await page.find("calcite-list-item"); - const calciteListItemToggle = await page.spyOnEvent("calciteListItemToggle", "window"); - - expect(await listItem.getProperty("open")).toBe(false); + expect(await listItem.getProperty("expanded")).toBe(false); - const openButton = await page.find(`calcite-list-item >>> .${CSS.openContainer}`); - - expect(openButton.getAttribute("title")).toBe(null); - - await openButton.click(); - expect(await listItem.getProperty("open")).toBe(false); - expect(calciteListItemToggle).toHaveReceivedEventTimes(0); + listItem.setProperty("open", true); + await page.waitForChanges(); + expect(await listItem.getProperty("expanded")).toBe(true); - await openButton.click(); - expect(await listItem.getProperty("open")).toBe(false); - expect(calciteListItemToggle).toHaveReceivedEventTimes(0); + listItem.setProperty("open", false); + await page.waitForChanges(); + expect(await listItem.getProperty("expanded")).toBe(false); }); it("should set displayMode on slotted list", async () => { @@ -438,16 +485,16 @@ describe("calcite-list-item", () => { expect(await list.getProperty("displayMode")).toBe("flat"); }); - it("flat list should not render open container", async () => { + it("flat list should not render expanded container", async () => { const page = await newE2EPage({ html: html``, }); - const openButton = await page.find(`calcite-list-item >>> .${CSS.openContainer}`); + const expandedButton = await page.find(`calcite-list-item >>> .${CSS.expandedContainer}`); - expect(openButton).toBe(null); + expect(expandedButton).toBe(null); }); it("renders with iconStart", async () => { @@ -526,6 +573,7 @@ describe("calcite-list-item", () => { }, ); }); + describe(`selection-appearance="border"`, () => { themed( html`): void { event.stopPropagation(); - this.handleOpenableChange(this.defaultSlotEl.value); + this.handleExpandableChange(this.defaultSlotEl.value); } private setSortHandleEl(el: SortHandle["el"]): void { @@ -511,7 +531,7 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab } } - private handleOpenableChange(slotEl: HTMLSlotElement): void { + private handleExpandableChange(slotEl: HTMLSlotElement): void { if (!slotEl) { return; } @@ -522,20 +542,20 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab list.displayMode = this.displayMode; }); - this.openable = + this.expandable = this.displayMode === "nested" && (children.lists.length > 0 || children.items.length > 0); } private handleDefaultSlotChange(event: Event): void { - this.handleOpenableChange(event.target as HTMLSlotElement); + this.handleExpandableChange(event.target as HTMLSlotElement); } private handleToggleClick(): void { this.toggle(); } - private toggle(value = !this.open): void { - this.open = value; + private toggle(value = !this.expanded): void { + this.expanded = value; this.calciteListItemToggle.emit(); } @@ -588,8 +608,8 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab containerEl: { value: containerEl }, actionsStartEl: { value: actionsStartEl }, actionsEndEl: { value: actionsEndEl }, - open, - openable, + expanded, + expandable, } = this; const cells = this.getGridCells(); @@ -606,7 +626,7 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab event.preventDefault(); const nextIndex = currentIndex + 1; if (currentIndex === -1) { - if (!open && openable) { + if (!expanded && expandable) { this.toggle(true); this.focusCell(null); } else if (cells[0]) { @@ -620,7 +640,7 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab const prevIndex = currentIndex - 1; if (currentIndex === -1) { this.focusCell(null); - if (open && openable) { + if (expanded && expandable) { this.toggle(false); } else { this.calciteInternalFocusPreviousItem.emit(); @@ -745,8 +765,8 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab ) : null; } - private renderOpen(): JsxNode { - const { el, open, openable, messages, displayMode, scale } = this; + private renderExpanded(): JsxNode { + const { el, expanded, expandable, messages, displayMode, scale } = this; if (displayMode !== "nested") { return null; @@ -754,25 +774,25 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab const dir = getElementDir(el); - const icon = openable - ? open + const icon = expandable + ? expanded ? ICONS.open : dir === "rtl" - ? ICONS.closedRTL - : ICONS.closedLTR + ? ICONS.collapsedRTL + : ICONS.collapsedLTR : ICONS.blank; const iconScale = getIconScale(scale); - const tooltip = openable ? (open ? messages.collapse : messages.expand) : undefined; + const tooltip = expandable ? (expanded ? messages.collapse : messages.expand) : undefined; - const openClickHandler = openable ? this.handleToggleClick : undefined; + const expandedClickHandler = expandable ? this.handleToggleClick : undefined; return (
@@ -893,7 +913,7 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab
@@ -954,8 +974,8 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab override render(): JsxNode { const { - openable, - open, + expandable, + expanded, level, active, label, @@ -987,7 +1007,7 @@ export class ListItem extends LitElement implements InteractiveComponent, Sortab
{this.renderDragHandle()} {this.renderSelected()} - {this.renderOpen()} + {this.renderExpanded()}
html` export const nestedItems = (): string => html` @@ -4083,19 +4083,17 @@ export const groupedItems = (): string => html` html` - + - + @@ -4185,10 +4183,10 @@ export const contentBottomSlots = (): string => export const contentBottomSlotsNested = (): string => html` - + Some value or something and a thing. + > Some value or something and a thing. @@ -4503,7 +4501,7 @@ export const filteredChildListItems_TestOnly = (): string => - + - + export const sortableNestedList_TestOnly = (): string => html` - + - + - + selection-mode="multiple" > - + - + - - + + `; -export const emptyOpenLists_TestOnly = (): string => +export const emptyExpandedLists_TestOnly = (): string => html` - + - + - + @@ -4826,7 +4824,7 @@ export const emptyOpenLists_TestOnly = (): string => selection-mode="multiple" > - + - + - + selection-mode="multiple" > - + export const listWithEmptyChildList_TestOnly = (): string => html` - + export const nestingLists_TestOnly = (): string => html`

Nesting List Items

- + @@ -4943,7 +4941,7 @@ export const nestingLists_TestOnly = (): string => html`

Nesting List Items

Nesting Lists

- + @@ -5018,9 +5016,9 @@ export const closedItems_TestOnly = (): string => export const dragEnabledNestedLists = (): string => html` - + - + @@ -5038,10 +5036,10 @@ export const dragEnabledNestedLists = (): string => export const dragEnabledNestedListsIndirectChildren = (): string => html`
- +
- +
diff --git a/packages/calcite-components/src/components/list/list.tsx b/packages/calcite-components/src/components/list/list.tsx index 589cde7b859..42457e1ed82 100755 --- a/packages/calcite-components/src/components/list/list.tsx +++ b/packages/calcite-components/src/components/list/list.tsx @@ -17,7 +17,7 @@ import { listItemGroupSelector, listItemSelector, listSelector, - openAncestors, + expandedAncestors, updateListItemChildren, } from "../list-item/utils"; import { @@ -617,7 +617,7 @@ export class List extends LitElement implements InteractiveComponent, SortableCo } onDragMove({ relatedEl }: ListMoveDetail): void { - relatedEl.open = true; + relatedEl.expanded = true; } onDragStart(detail: ListDragDetail): void { @@ -708,21 +708,21 @@ export class List extends LitElement implements InteractiveComponent, SortableCo }); } - private allParentListItemsOpen(item: ListItem["el"]): boolean { + private allParentListItemsExpanded(item: ListItem["el"]): boolean { const parentItem = item.parentElement?.closest(listItemSelector); if (!parentItem) { return true; - } else if (!parentItem.open) { + } else if (!parentItem.expanded) { return false; } - return this.allParentListItemsOpen(parentItem); + return this.allParentListItemsExpanded(parentItem); } private borderItems(): void { const visibleItems = this.visibleItems.filter( - (item) => !item.filterHidden && this.allParentListItemsOpen(item), + (item) => !item.filterHidden && this.allParentListItemsExpanded(item), ); visibleItems.forEach( @@ -870,7 +870,7 @@ export class List extends LitElement implements InteractiveComponent, SortableCo return true; } - return parentListItemEl.open && this.isNavigable(parentListItemEl); + return parentListItemEl.expanded && this.isNavigable(parentListItemEl); } private handleListKeydown(event: KeyboardEvent): void { @@ -947,7 +947,7 @@ export class List extends LitElement implements InteractiveComponent, SortableCo this.disconnectObserver(); toEl.prepend(dragEl); - openAncestors(dragEl); + expandedAncestors(dragEl); const toElItems = Array.from(toEl.children).filter(isListItem); const newIndex = toElItems.indexOf(dragEl); diff --git a/packages/calcite-components/src/demos/list.html b/packages/calcite-components/src/demos/list.html index 362607e1ff8..895f81d0056 100644 --- a/packages/calcite-components/src/demos/list.html +++ b/packages/calcite-components/src/demos/list.html @@ -5334,7 +5334,7 @@

List

- + @@ -5450,9 +5450,9 @@

List