1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from "react";
6 import { Tree, toggleNodeSelection, getNode, initTreeNode, getNodeChildrenIds } from '~/models/tree';
7 import { Tree as TreeComponent, TreeItem, TreeItemStatus } from '~/components/tree/tree';
8 import { noop, map } from "lodash/fp";
9 import { toggleNodeCollapse } from '~/models/tree';
11 export interface DataTableFilterItem {
15 export type DataTableFilters = Tree<DataTableFilterItem>;
17 export interface DataTableFilterProps {
18 filters: DataTableFilters;
19 onChange?: (filters: DataTableFilters) => void;
22 export class DataTableFiltersTree extends React.Component<DataTableFilterProps> {
26 items={filtersToTree(this.props.filters)}
30 toggleItemActive={noop}
31 toggleItemOpen={this.toggleOpen}
32 toggleItemSelection={this.toggleFilter}
36 renderItem(item: TreeItem<DataTableFilterItem>) {
37 return <span>{item.data.name}</span>;
40 toggleFilter = (_: React.MouseEvent, item: TreeItem<DataTableFilterItem>) => {
41 const { onChange = noop } = this.props;
42 onChange(toggleNodeSelection(item.id)(this.props.filters));
45 toggleOpen = (_: React.MouseEvent, item: TreeItem<DataTableFilterItem>) => {
46 const { onChange = noop } = this.props;
47 onChange(toggleNodeCollapse(item.id)(this.props.filters));
51 const renderItem = (item: TreeItem<DataTableFilterItem>) =>
52 <span>{item.data.name}</span>;
54 const filterToTreeItem = (filters: DataTableFilters) =>
55 (id: string): TreeItem<any> => {
56 const node = getNode(id)(filters) || initTreeNode({ id: '', value: 'InvalidNode' });
57 const items = getNodeChildrenIds(node.id)(filters)
58 .map(filterToTreeItem(filters));
64 items: items.length > 0 ? items : undefined,
66 selected: node.selected,
67 status: TreeItemStatus.LOADED,
71 const filtersToTree = (filters: DataTableFilters): TreeItem<DataTableFilterItem>[] =>
72 map(filterToTreeItem(filters), getNodeChildrenIds('')(filters));