-
Notifications
You must be signed in to change notification settings - Fork 80
fix(list): changing filterText property will now update filtered items #7133
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
4f794d5
c8a2518
63c510b
4d1f1c0
17527cc
07aeeea
9620145
9f54ead
8b4d8a8
8bc9322
3a515e7
55669b7
48d23bd
4592095
9414f6b
1ca7937
fa0a54a
aa0fe22
fd4f7e2
77c7609
42ff266
96ec73d
04e92c9
67a2aff
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -92,6 +92,11 @@ export class List implements InteractiveComponent, LoadableComponent { | |
*/ | ||
@Prop({ reflect: true, mutable: true }) filterText: string; | ||
|
||
@Watch("filterText") | ||
async handleFilterTextChange(): Promise<void> { | ||
this.performFilter(); | ||
} | ||
|
||
/** | ||
* Specifies an accessible name for the component. | ||
*/ | ||
|
@@ -224,14 +229,6 @@ export class List implements InteractiveComponent, LoadableComponent { | |
|
||
componentDidLoad(): void { | ||
setComponentLoaded(this); | ||
const { filterEl } = this; | ||
const filteredItems = filterEl?.filteredItems as ItemData; | ||
|
||
if (filteredItems) { | ||
this.filteredData = filteredItems; | ||
} | ||
|
||
this.updateListItems(); | ||
} | ||
|
||
// -------------------------------------------------------------------------- | ||
|
@@ -299,11 +296,11 @@ export class List implements InteractiveComponent, LoadableComponent { | |
aria-label={filterPlaceholder} | ||
disabled={loading || disabled} | ||
items={dataForFilter} | ||
onCalciteFilterChange={this.handleFilter} | ||
onCalciteFilterChange={this.handleFilterChange} | ||
placeholder={filterPlaceholder} | ||
value={filterText} | ||
// eslint-disable-next-line react/jsx-sort-props | ||
ref={(el) => (this.filterEl = el)} | ||
ref={this.setFilterEl} | ||
/> | ||
</th> | ||
</tr> | ||
|
@@ -323,11 +320,11 @@ export class List implements InteractiveComponent, LoadableComponent { | |
// | ||
// -------------------------------------------------------------------------- | ||
|
||
handleDefaultSlotChange = (event: Event): void => { | ||
private handleDefaultSlotChange = (event: Event): void => { | ||
updateListItemChildren(getListItemChildren(event)); | ||
}; | ||
|
||
setActiveListItem = (): void => { | ||
private setActiveListItem = (): void => { | ||
const { enabledListItems } = this; | ||
|
||
if (!enabledListItems.some((item) => item.active)) { | ||
|
@@ -402,15 +399,45 @@ export class List implements InteractiveComponent, LoadableComponent { | |
} | ||
}; | ||
|
||
handleFilter = (event: CustomEvent): void => { | ||
private updateFilteredData(emit = false): void { | ||
const { filterEl } = this; | ||
|
||
if (!filterEl) { | ||
return; | ||
} | ||
|
||
if (filterEl.filteredItems) { | ||
this.filteredData = filterEl.filteredItems as ItemData; | ||
} | ||
|
||
this.updateListItems(emit); | ||
} | ||
|
||
private async performFilter(): Promise<void> { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Some naming suggestions: |
||
const { filterEl, filterText } = this; | ||
|
||
if (!filterEl) { | ||
return; | ||
} | ||
|
||
filterEl.value = filterText; | ||
await filterEl.filter(filterText); | ||
this.updateFilteredData(); | ||
} | ||
|
||
private setFilterEl = (el: HTMLCalciteFilterElement): void => { | ||
this.filterEl = el; | ||
this.performFilter(); | ||
}; | ||
|
||
private handleFilterChange = (event: CustomEvent): void => { | ||
event.stopPropagation(); | ||
const { filteredItems, value } = event.currentTarget as HTMLCalciteFilterElement; | ||
this.filteredData = filteredItems as ItemData; | ||
const { value } = event.currentTarget as HTMLCalciteFilterElement; | ||
this.filterText = value; | ||
this.updateListItems(true); | ||
this.updateFilteredData(true); | ||
}; | ||
|
||
getItemData = (): ItemData => { | ||
private getItemData = (): ItemData => { | ||
return this.listItems.map((item) => ({ | ||
label: item.label, | ||
description: item.description, | ||
|
@@ -439,11 +466,11 @@ export class List implements InteractiveComponent, LoadableComponent { | |
this.updateSelectedItems(emit); | ||
}, debounceTimeout); | ||
|
||
queryListItems = (): HTMLCalciteListItemElement[] => { | ||
private queryListItems = (): HTMLCalciteListItemElement[] => { | ||
return Array.from(this.el.querySelectorAll(listItemSelector)); | ||
}; | ||
|
||
focusRow = (focusEl: HTMLCalciteListItemElement): void => { | ||
private focusRow = (focusEl: HTMLCalciteListItemElement): void => { | ||
const { enabledListItems } = this; | ||
|
||
if (!focusEl) { | ||
|
@@ -455,7 +482,7 @@ export class List implements InteractiveComponent, LoadableComponent { | |
focusEl.setFocus(); | ||
}; | ||
|
||
isNavigable = (listItem: HTMLCalciteListItemElement): boolean => { | ||
private isNavigable = (listItem: HTMLCalciteListItemElement): boolean => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for making these private. This reminds me to look for a rule to help enforce access modifiers on class members (these can affect whether they are exposed in Stencil's generated interfaces 🕵️). |
||
const parentListItemEl = listItem.parentElement?.closest(listItemSelector); | ||
|
||
if (!parentListItemEl) { | ||
|
@@ -465,7 +492,7 @@ export class List implements InteractiveComponent, LoadableComponent { | |
return parentListItemEl.open && this.isNavigable(parentListItemEl); | ||
}; | ||
|
||
handleListKeydown = (event: KeyboardEvent): void => { | ||
private handleListKeydown = (event: KeyboardEvent): void => { | ||
if (event.defaultPrevented) { | ||
return; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
✨🧹✨🏆