X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/8cdb226fa1c32cceccc10955ed340c7a7dd7f10d..38fecec459a6ed195c771540bab9367835f968c8:/src/components/data-table-filters/data-table-filters-tree.tsx diff --git a/src/components/data-table-filters/data-table-filters-tree.tsx b/src/components/data-table-filters/data-table-filters-tree.tsx index 0870497e..6514078d 100644 --- a/src/components/data-table-filters/data-table-filters-tree.tsx +++ b/src/components/data-table-filters/data-table-filters-tree.tsx @@ -2,11 +2,12 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from "react"; -import { Tree, toggleNodeSelection, getNode, initTreeNode, getNodeChildrenIds } from '~/models/tree'; -import { Tree as TreeComponent, TreeItem, TreeItemStatus } from '~/components/tree/tree'; +import React from "react"; +import { Tree, toggleNodeSelection, getNode, initTreeNode, getNodeChildrenIds, selectNode, deselectNodes } from 'models/tree'; +import { Tree as TreeComponent, TreeItem, TreeItemStatus } from 'components/tree/tree'; import { noop, map } from "lodash/fp"; -import { toggleNodeCollapse } from '~/models/tree'; +import { toggleNodeCollapse } from 'models/tree'; +import { countNodes, countChildren } from 'models/tree'; export interface DataTableFilterItem { name: string; @@ -17,22 +18,52 @@ export type DataTableFilters = Tree; export interface DataTableFilterProps { filters: DataTableFilters; onChange?: (filters: DataTableFilters) => void; + + /** + * When set to true, only one filter can be selected at a time. + */ + mutuallyExclusive?: boolean; } export class DataTableFiltersTree extends React.Component { render() { + const { filters } = this.props; + const hasSubfilters = countNodes(filters) !== countChildren('')(filters); return ; } + /** + * Handler for when a tree item is toggled via a radio button. + * Ensures mutual exclusivity among filter tree items. + */ + toggleRadioButtonFilter = (_: any, item: TreeItem) => { + const { onChange = noop } = this.props; + + // If the filter is already selected, do nothing. + if (item.selected) { return; } + + // Otherwise select this node and deselect the others + const filters = selectNode(item.id)(this.props.filters); + const toDeselect = Object.keys(this.props.filters).filter((id) => (id !== item.id)); + onChange(deselectNodes(toDeselect)(filters)); + } + toggleFilter = (_: React.MouseEvent, item: TreeItem) => { const { onChange = noop } = this.props; onChange(toggleNodeSelection(item.id)(this.props.filters));