X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/f093cf66138faec359a95777a91b6a2904469d7d..5bf94d55b564bfbd052a61ab8219aa063b2a80c6:/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx diff --git a/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx b/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx index ff4e6072fb..194950b134 100644 --- a/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx +++ b/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: AGPL-3.0 -import React, { useEffect, useState } from "react"; +import React from "react"; import { connect } from "react-redux"; import { StyleRulesCallback, withStyles, WithStyles, Toolbar, Tooltip, IconButton } from "@material-ui/core"; import { ArvadosTheme } from "common/custom-theme"; @@ -34,11 +34,9 @@ import { Process } from "store/processes/process"; import { PublicFavoritesState } from "store/public-favorites/public-favorites-reducer"; import { isExactlyOneSelected } from "store/multiselect/multiselect-actions"; import { IntersectionObserverWrapper } from "./ms-toolbar-overflow-wrapper"; -import { ContextMenuKind } from 'views-components/context-menu/menu-item-sort'; +import { ContextMenuKind, sortMenuItems, menuDirection } from 'views-components/context-menu/menu-item-sort'; -const WIDTH_TRANSITION = 150 - -type CssRules = "root" | "transition" | "button" | "iconContainer" | "icon"; +type CssRules = "root" | "button" | "iconContainer" | "icon" | "divider"; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ root: { @@ -48,17 +46,7 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ height: '2.7rem', padding: 0, margin: "1rem auto auto 0.3rem", - transition: `width ${WIDTH_TRANSITION}ms`, - overflow: 'hidden', - }, - transition: { - display: "flex", - flexDirection: "row", - height: '2.7rem', - padding: 0, - margin: "1rem auto auto 0.3rem", overflow: 'hidden', - transition: `width ${WIDTH_TRANSITION}ms`, }, button: { width: "2.5rem", @@ -71,7 +59,11 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ }, icon: { marginLeft: '-0.5rem', - } + }, + divider: { + display: "flex", + alignItems: "center", + }, }); export type MultiselectToolbarProps = { @@ -98,30 +90,24 @@ export const MultiselectToolbar = connect( const singleResourceKind = singleSelectedUuid ? [resourceToMsResourceKind(singleSelectedUuid, iconProps.resources, user)] : null const currentResourceKinds = singleResourceKind ? singleResourceKind : Array.from(selectedToKindSet(checkedList)); const currentPathIsTrash = window.location.pathname === "/trash"; - const [isTransitioning, setIsTransitioning] = useState(false); - - const handleTransition = () => { - setIsTransitioning(true) - setTimeout(() => { - setIsTransitioning(false) - }, WIDTH_TRANSITION); - } - - useEffect(()=>{ - handleTransition() - }, [checkedList]) - const actions = + const rawActions = currentPathIsTrash && selectedToKindSet(checkedList).size ? [msToggleTrashAction] : selectActionsByKind(currentResourceKinds as string[], multiselectActionsFilters).filter((action) => singleSelectedUuid === null ? action.isForMulti : true ); + + const actions: ContextMenuAction[] | MultiSelectMenuAction[] = sortMenuItems( + singleResourceKind && singleResourceKind.length ? (singleResourceKind[0] as ContextMenuKind) : ContextMenuKind.MULTI, + rawActions, + menuDirection.HORIZONTAL + ); return ( @@ -129,14 +115,24 @@ export const MultiselectToolbar = connect( {actions.map((action, i) =>{ const { hasAlts, useAlts, name, altName, icon, altIcon } = action; - return hasAlts ? ( + return action.name === ContextMenuActionNames.DIVIDER ? ( + action.component && ( +
+ +
+ ) + ) : hasAlts ? ( + > + > , filterSet: TMultiselectActionsFilters) { +function selectActionsByKind(currentResourceKinds: Array, filterSet: TMultiselectActionsFilters): MultiSelectMenuAction[] { const rawResult: Set = new Set(); const resultNames = new Set(); const allFiltersArray: MultiSelectMenuAction[][] = [] @@ -303,17 +299,7 @@ function selectActionsByKind(currentResourceKinds: Array, filterSet: TMu return true; }); - return filteredResult.sort((a, b) => { - const nameA = a.name || ""; - const nameB = b.name || ""; - if (nameA < nameB) { - return -1; - } - if (nameA > nameB) { - return 1; - } - return 0; - }); + return filteredResult; } @@ -344,7 +330,7 @@ function mapDispatchToProps(dispatch: Dispatch) { const action = findActionByName(selectedAction.name as string, kindToActionSet[firstResource.kind]); if (action) action.execute(dispatch, kindGroups[firstResource.kind]); break; - case ContextMenuActionNames.COPY_TO_CLIPBOARD: + case ContextMenuActionNames.COPY_LINK_TO_CLIPBOARD: const selectedResources = selectedToArray(checkedList).map(uuid => getResource(uuid)(resources)); dispatch(copyToClipboardAction(selectedResources)); break;