X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/9fdaf676b641f794c73e8604e498b7d803fd1110..10ce16c28de952f6533ca3cc9df909269e3d2a53:/src/components/data-table-filters/data-table-filters.tsx diff --git a/src/components/data-table-filters/data-table-filters.tsx b/src/components/data-table-filters/data-table-filters.tsx index bede5aea..d288a5a3 100644 --- a/src/components/data-table-filters/data-table-filters.tsx +++ b/src/components/data-table-filters/data-table-filters.tsx @@ -23,133 +23,6 @@ import { import * as classnames from "classnames"; import { DefaultTransformOrigin } from "../popover/helpers"; -export interface DataTableFilterItem { - name: string; - selected: boolean; -} - -export interface DataTableFilterProps { - name: string; - filters: DataTableFilterItem[]; - onChange?: (filters: DataTableFilterItem[]) => void; -} - -interface DataTableFilterState { - anchorEl?: HTMLElement; - filters: DataTableFilterItem[]; - prevFilters: DataTableFilterItem[]; -} - -class DataTableFilter extends React.Component, DataTableFilterState> { - state: DataTableFilterState = { - anchorEl: undefined, - filters: [], - prevFilters: [] - }; - icon = React.createRef(); - - render() { - const { name, classes, children } = this.props; - const isActive = this.state.filters.some(f => f.selected); - return <> - - {children} - - - - - - - {name} - - - - {this.state.filters.map((filter, index) => - - - - {filter.name} - - - )} - - - - - - - - ; - } - - static getDerivedStateFromProps(props: DataTableFilterProps, state: DataTableFilterState): DataTableFilterState { - return props.filters !== state.prevFilters - ? { ...state, filters: props.filters, prevFilters: props.filters } - : state; - } - - open = () => { - this.setState({ anchorEl: this.icon.current || undefined }); - } - - submit = () => { - const { onChange } = this.props; - if (onChange) { - onChange(this.state.filters); - } - this.setState({ anchorEl: undefined }); - } - - cancel = () => { - this.setState(prev => ({ - ...prev, - filters: prev.prevFilters, - anchorEl: undefined - })); - } - - toggleFilter = (toggledFilter: DataTableFilterItem) => () => { - this.setState(prev => ({ - ...prev, - filters: prev.filters.map(filter => - filter === toggledFilter - ? { ...filter, selected: !filter.selected } - : filter) - })); - } -} - - export type CssRules = "root" | "icon" | "active" | "checkbox"; const styles: StyleRulesCallback = (theme: Theme) => ({ @@ -185,4 +58,130 @@ const styles: StyleRulesCallback = (theme: Theme) => ({ } }); -export default withStyles(styles)(DataTableFilter); +export interface DataTableFilterItem { + name: string; + selected: boolean; +} + +export interface DataTableFilterProps { + name: string; + filters: DataTableFilterItem[]; + onChange?: (filters: DataTableFilterItem[]) => void; +} + +interface DataTableFilterState { + anchorEl?: HTMLElement; + filters: DataTableFilterItem[]; + prevFilters: DataTableFilterItem[]; +} + +export const DataTableFilters = withStyles(styles)( + class extends React.Component, DataTableFilterState> { + state: DataTableFilterState = { + anchorEl: undefined, + filters: [], + prevFilters: [] + }; + icon = React.createRef(); + + render() { + const { name, classes, children } = this.props; + const isActive = this.state.filters.some(f => f.selected); + return <> + + {children} + + + + + + + {name} + + + + {this.state.filters.map((filter, index) => + + + + {filter.name} + + + )} + + + + + + + + ; + } + + static getDerivedStateFromProps(props: DataTableFilterProps, state: DataTableFilterState): DataTableFilterState { + return props.filters !== state.prevFilters + ? { ...state, filters: props.filters, prevFilters: props.filters } + : state; + } + + open = () => { + this.setState({ anchorEl: this.icon.current || undefined }); + } + + submit = () => { + const { onChange } = this.props; + if (onChange) { + onChange(this.state.filters); + } + this.setState({ anchorEl: undefined }); + } + + cancel = () => { + this.setState(prev => ({ + ...prev, + filters: prev.prevFilters, + anchorEl: undefined + })); + } + + toggleFilter = (toggledFilter: DataTableFilterItem) => () => { + this.setState(prev => ({ + ...prev, + filters: prev.filters.map(filter => + filter === toggledFilter + ? { ...filter, selected: !filter.selected } + : filter) + })); + } + } +);