21224: merge stable Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa.knox@curii.com>
authorLisa Knox <lisaknox83@gmail.com>
Mon, 22 Apr 2024 14:55:12 +0000 (10:55 -0400)
committerLisa Knox <lisaknox83@gmail.com>
Mon, 22 Apr 2024 14:55:12 +0000 (10:55 -0400)
services/workbench2/src/components/data-explorer/data-explorer.tsx
services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
services/workbench2/src/views-components/context-menu/context-menu-action-set.ts
services/workbench2/src/views-components/context-menu/menu-item-sort.ts
services/workbench2/src/views-components/data-explorer/data-explorer.tsx
services/workbench2/src/views-components/data-explorer/renderers.tsx
services/workbench2/src/views-components/multiselect-toolbar/ms-user-details-action-set.ts
services/workbench2/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx
services/workbench2/src/views/project-panel/project-panel.tsx

index 4737ed06dc6e124eb9efabd931c1f95603e4f854..b596683fad39b01a7e33f78f5ababcd0f0ee5de3 100644 (file)
@@ -130,6 +130,9 @@ type DataExplorerProps<T> = DataExplorerDataProps<T> & DataExplorerActionProps<T
 
 export const DataExplorer = withStyles(styles)(
     class DataExplorerGeneric<T> extends React.Component<DataExplorerProps<T>> {
+        state = {
+            msToolbarInDetailsCard: true,
+        };
 
         multiSelectToolbarInTitle = !this.props.title && !this.props.progressBar;
 
@@ -139,6 +142,15 @@ export const DataExplorer = withStyles(styles)(
             }
         }
 
+        componentDidUpdate( prevProps: Readonly<DataExplorerProps<T>>, prevState: Readonly<{}>, snapshot?: any ): void {
+            const { selectedResourceUuid, currentRouteUuid } = this.props;
+            if(selectedResourceUuid !== prevProps.selectedResourceUuid || currentRouteUuid !== prevProps.currentRouteUuid) {
+                this.setState({
+                    multiSelectToolbarInTitle: selectedResourceUuid === this.props.currentRouteUuid,
+                })
+            }
+        }
+
         render() {
             const {
                 columns,
@@ -204,7 +216,7 @@ export const DataExplorer = withStyles(styles)(
                                 </Grid>
                             )}
                             {!!progressBar && progressBar}
-                            {this.multiSelectToolbarInTitle && <MultiselectToolbar injectedStyles={classes.msToolbarStyles} />}
+                            {this.multiSelectToolbarInTitle && !this.state.msToolbarInDetailsCard && <MultiselectToolbar injectedStyles={classes.msToolbarStyles} />}
                             {(!hideColumnSelector || !hideSearchInput || !!actions) && (
                                 <Grid
                                     className={classes.headerMenu}
index 0d74b6b38ba40750d847134d55b4d7b252a5f946..449bd2dcd53819a54c7bbe08024445badf0acea5 100644 (file)
@@ -126,7 +126,7 @@ export const MultiselectToolbar = connect(
         return (
             <React.Fragment>
                 <Toolbar
-                    className={classes.root}
+                    className={classNames(classes.root, injectedStyles)}
                     style={{ width: `${(actions.length * 2.5) + 6}rem`}}
                     data-cy='multiselect-toolbar'
                     >
@@ -349,12 +349,12 @@ function mapDispatchToProps(dispatch: Dispatch) {
             switch (selectedAction.name) {
                 case ContextMenuActionNames.MOVE_TO:
                 case ContextMenuActionNames.REMOVE:
-                    const firstResource = getResource(selectedToArray(checkedList)[0])(resources) as ContainerRequestResource | Resource;
+                    const firstResource = getResource(currentList[0])(resources) as ContainerRequestResource | Resource;
                     const action = findActionByName(selectedAction.name as string, kindToActionSet[firstResource.kind]);
                     if (action) action.execute(dispatch, kindGroups[firstResource.kind]);
                     break;
                 case ContextMenuActionNames.COPY_LINK_TO_CLIPBOARD:
-                    const selectedResources = selectedToArray(checkedList).map(uuid => getResource(uuid)(resources));
+                    const selectedResources = currentList.map(uuid => getResource(uuid)(resources));
                     dispatch<any>(copyToClipboardAction(selectedResources));
                     break;
                 default:
index 38de735e29779f4e1f3f54bcdba0cabe1e87df92..fc1028aa680212a7f1cd1c274bbc7b549f40b92b 100644 (file)
@@ -57,6 +57,7 @@ export enum ContextMenuActionNames {
     SETUP_USER = 'Setup user',
     SHARE = 'Share',
     UNSELECT_ALL = 'Unselect all',
+    USER_ACCOUNT = 'User account',
     VIEW_DETAILS = 'View details',
     WRITE = 'Write',
 }
index f331c602479ba15d59ad65bd166afb5935e2f611..0e06be1685aef6b8bf3e3d707aca51d4eab45e74 100644 (file)
@@ -11,6 +11,7 @@ import { MultiSelectMenuAction } from 'views-components/multiselect-toolbar/ms-m
 export enum ContextMenuKind {
     API_CLIENT_AUTHORIZATION = "ApiClientAuthorization",
     ROOT_PROJECT = "RootProject",
+    ROOT_PROJECT_ADMIN = "RootProjectAdmin",
     PROJECT = "Project",
     FILTER_GROUP = "FilterGroup",
     READONLY_PROJECT = "ReadOnlyProject",
@@ -47,6 +48,7 @@ export enum ContextMenuKind {
     VIRTUAL_MACHINE = "VirtualMachine",
     KEEP_SERVICE = "KeepService",
     USER = "User",
+    USER_DETAILS = "UserDetails",
     GROUPS = "Group",
     GROUP_MEMBER = "GroupMember",
     PERMISSION_EDIT = "PermissionEdit",
index 034399b124765d9c1af4bb3aa7410a128a699829..37a15bcf77031cb78a0ab47e12fd4f57c4fb5d7e 100644 (file)
@@ -23,7 +23,7 @@ interface Props {
     working?: boolean;
 }
 
-const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect, detailsPanel, properties}: RootState, { id }: Props) => {
+const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect, selectedResourceUuid, properties}: RootState, { id }: Props) => {
     const working = !!progressIndicator.some(p => p.id === id && p.working);
     const dataExplorerState = getDataExplorer(dataExplorer, id);
     const currentRoute = router.location ? router.location.pathname : "";
@@ -34,6 +34,7 @@ const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect,
         paperKey: currentRoute,
         currentRouteUuid: properties.currentRouteUuid,
         isMSToolbarVisible,
+        selectedResourceUuid,
         checkedList: multiselect.checkedList,
         working,
     };
index bb49b6cf42e5cc25b9a06647d301a8562e92d7dc..853fd8c0e3eb9656f4ccf2547cac6702f3c0a8d2 100644 (file)
@@ -55,6 +55,7 @@ import { ProjectResource } from "models/project";
 import { ProcessResource } from "models/process";
 import { ServiceRepository } from "services/services";
 import { loadUsersPanel } from "store/users/users-actions";
+import { InlinePulser } from "components/loading/inline-pulser";
 
 export const toggleIsAdmin = (uuid: string) =>
     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
@@ -65,7 +66,6 @@ export const toggleIsAdmin = (uuid: string) =>
         dispatch<any>(loadUsersPanel());
         return newActivity;
     };
-import { InlinePulser } from "components/loading/inline-pulser";
 
 const renderName = (dispatch: Dispatch, item: GroupContentsResource) => {
     const navFunc = "groupClass" in item && item.groupClass === GroupClass.ROLE ? navigateToGroupDetails : navigateTo;
index 33698259c1b89f90a94a9580ac1973e5c0f7de98..d9ef110741c4ca0213f3771e263c48e2ce38e5aa 100644 (file)
@@ -6,12 +6,13 @@ import { AdvancedIcon, AttributesIcon, UserPanelIcon } from 'components/icon/ico
 import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab';
 import { openUserAttributes } from 'store/users/users-actions';
 import { navigateToUserProfile } from 'store/navigation/navigation-action';
-import { MultiSelectMenuActionSet, MultiSelectMenuActionNames } from './ms-menu-actions';
+import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set";
+import { MultiSelectMenuActionSet } from './ms-menu-actions';
 
 export const UserDetailsActionSet: MultiSelectMenuActionSet= [
     [
         {
-            name: MultiSelectMenuActionNames.ATTRIBUTES,
+            name: ContextMenuActionNames.ATTRIBUTES,
             icon: AttributesIcon,
             hasAlts: false,
             isForMulti: false,
@@ -20,7 +21,7 @@ export const UserDetailsActionSet: MultiSelectMenuActionSet= [
             },
         },
         {
-            name: MultiSelectMenuActionNames.API_DETAILS,
+            name: ContextMenuActionNames.API_DETAILS,
             icon: AdvancedIcon,
             hasAlts: false,
             isForMulti: false,
@@ -29,7 +30,7 @@ export const UserDetailsActionSet: MultiSelectMenuActionSet= [
             },
         },
         {
-            name: MultiSelectMenuActionNames.USER_ACCOUNT,
+            name: ContextMenuActionNames.USER_ACCOUNT,
             icon: UserPanelIcon,
             hasAlts: false,
             isForMulti: false,
index 19fcf588499717b0c8623370270e3078a51d4fbc..cf463fa76a46382573d969b7fb18efa51cc0e66b 100644 (file)
@@ -4,7 +4,7 @@
 
 import React from 'react';
 import { Field, WrappedFieldProps, FieldArray, WrappedFieldArrayProps } from 'redux-form';
-import { Grid, FormControl, InputLabel, StyleRulesCallback, Divider } from '@material-ui/core';
+import { Grid, FormControl, InputLabel, StyleRulesCallback } from '@material-ui/core';
 import { PermissionSelect, parsePermissionLevel, formatPermissionLevel } from './permission-select';
 import { ParticipantSelect, Participant } from './participant-select';
 import { WithStyles } from '@material-ui/core/styles';
index 0425335e4212b5b9942ed8f337ea60b2c7ad5f83..433cb112094057253552284ff57d30b4869ac2f3 100644 (file)
@@ -278,7 +278,6 @@ export const ProjectPanel = withStyles(styles)(
                         contextMenuColumn={true}
                         defaultViewIcon={ProjectIcon}
                         defaultViewMessages={DEFAULT_VIEW_MESSAGES}
-                        selectedResourceUuid={this.props.currentItemId}
                     />
                 </div>
             }