X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6182baa054abdd54389c91aca9ac710bd3869f08..5f7299e677a453c3fa9b278d29a132e74c9aca6d:/services/workbench2/src/components/data-table/data-table.tsx diff --git a/services/workbench2/src/components/data-table/data-table.tsx b/services/workbench2/src/components/data-table/data-table.tsx index de3e272d1e..1335bdf398 100644 --- a/services/workbench2/src/components/data-table/data-table.tsx +++ b/services/workbench2/src/components/data-table/data-table.tsx @@ -29,6 +29,7 @@ import { SvgIconProps } from "@material-ui/core/SvgIcon"; import ArrowDownwardIcon from "@material-ui/icons/ArrowDownward"; import { createTree } from "models/tree"; import { DataTableMultiselectOption } from "../data-table-multiselect-popover/data-table-multiselect-popover"; +import { isExactlyOneSelected } from "store/multiselect/multiselect-actions"; export type DataColumns = Array>; @@ -49,11 +50,13 @@ export interface DataTableDataProps { working?: boolean; defaultViewIcon?: IconType; defaultViewMessages?: string[]; - currentItemUuid?: string; - currentRoute?: string; toggleMSToolbar: (isVisible: boolean) => void; setCheckedListOnStore: (checkedList: TCheckedList) => void; + currentRoute?: string; + currentRouteUuid: string; checkedList: TCheckedList; + selectedResourceUuid: string; + setSelectedUuid: (uuid: string) => void; } type CssRules = @@ -63,6 +66,7 @@ type CssRules = | "noItemsInfo" | "checkBoxHead" | "checkBoxCell" + | "clickBox" | "checkBox" | "firstTableCell" | "tableCell" @@ -94,10 +98,22 @@ const styles: StyleRulesCallback = (theme: Theme) => ({ checkBoxHead: { padding: "0", display: "flex", + width: '2rem', + height: "1.5rem", + paddingLeft: '0.9rem', + marginRight: '0.5rem' }, checkBoxCell: { padding: "0", - paddingLeft: "10px", + }, + clickBox: { + display: 'flex', + width: '1.6rem', + height: "1.5rem", + paddingLeft: '0.35rem', + paddingTop: '0.1rem', + marginLeft: '0.5rem', + cursor: "pointer", }, checkBox: { cursor: "pointer", @@ -148,8 +164,9 @@ export const DataTable = withStyles(styles)( } componentDidUpdate(prevProps: Readonly>, prevState: DataTableState) { - const { items, setCheckedListOnStore } = this.props; + const { items, currentRouteUuid, setCheckedListOnStore } = this.props; const { isSelected } = this.state; + const singleSelected = isExactlyOneSelected(this.props.checkedList); if (prevProps.items !== items) { if (isSelected === true) this.setState({ isSelected: false }); if (items.length) this.initializeCheckedList(items); @@ -158,6 +175,12 @@ export const DataTable = withStyles(styles)( if (prevProps.currentRoute !== this.props.currentRoute) { this.initializeCheckedList([]) } + if (singleSelected && singleSelected !== isExactlyOneSelected(prevProps.checkedList)) { + this.props.setSelectedUuid(singleSelected); + } + if (!singleSelected && !!currentRouteUuid) { + this.props.setSelectedUuid(currentRouteUuid); + } } componentWillUnmount(): void { @@ -172,14 +195,24 @@ export const DataTable = withStyles(styles)( render: uuid => { const { classes, checkedList } = this.props; return ( - this.handleSelectOne(uuid)} - onDoubleClick={ev => ev.stopPropagation()}> +
{ + ev.stopPropagation() + this.handleSelectOne(uuid) + }} + onDoubleClick={(ev) => ev.stopPropagation()} + > + this.handleSelectOne(uuid)} + onDoubleClick={(ev) => ev.stopPropagation()} + > +
); }, }; @@ -193,11 +226,12 @@ export const DataTable = withStyles(styles)( initializeCheckedList = (uuids: any[]): void => { const newCheckedList = { ...this.props.checkedList }; - uuids.forEach(uuid => { - if (!newCheckedList.hasOwnProperty(uuid)) { - newCheckedList[uuid] = false; + if(Object.keys(newCheckedList).length === 0){ + for(const uuid of uuids){ + newCheckedList[uuid] = false } - }); + } + for (const key in newCheckedList) { if (!uuids.includes(key)) { delete newCheckedList[key]; @@ -372,7 +406,7 @@ export const DataTable = withStyles(styles)( ); renderBodyRow = (item: any, index: number) => { - const { onRowClick, onRowDoubleClick, extractKey, classes, currentItemUuid, currentRoute } = this.props; + const { onRowClick, onRowDoubleClick, extractKey, classes, selectedResourceUuid, currentRoute } = this.props; return ( onRowClick && onRowClick(event, item)} onContextMenu={this.handleRowContextMenu(item)} onDoubleClick={event => onRowDoubleClick && onRowDoubleClick(event, item)} - selected={item === currentItemUuid}> + selected={item === selectedResourceUuid}> {this.mapVisibleColumns((column, index) => (