X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/082c1782d96a4b1c897df64d9b325d102a5c1144..63a5dc75ae9b68b3570e3bee1662155572cf5d1f:/src/views-components/data-explorer/renderers.tsx
diff --git a/src/views-components/data-explorer/renderers.tsx b/src/views-components/data-explorer/renderers.tsx
index cd9f972e..cbe815c0 100644
--- a/src/views-components/data-explorer/renderers.tsx
+++ b/src/views-components/data-explorer/renderers.tsx
@@ -15,6 +15,7 @@ import {
import { FavoriteStar, PublicFavoriteStar } from '../favorite-star/favorite-star';
import { Resource, ResourceKind, TrashableResource } from 'models/resource';
import {
+ FreezeIcon,
ProjectIcon,
FilterGroupIcon,
CollectionIcon,
@@ -35,7 +36,7 @@ import { connect, DispatchProp } from 'react-redux';
import { RootState } from 'store/store';
import { getResource, filterResources } from 'store/resources/resources';
import { GroupContentsResource } from 'services/groups-service/groups-service';
-import { getProcess, Process, getProcessStatus, getProcessStatusColor, getProcessRuntime } from 'store/processes/process';
+import { getProcess, Process, getProcessStatus, getProcessStatusStyles, getProcessRuntime } from 'store/processes/process';
import { ArvadosTheme } from 'common/custom-theme';
import { compose, Dispatch } from 'redux';
import { WorkflowResource } from 'models/workflow';
@@ -59,6 +60,7 @@ import { openPermissionEditContextMenu } from 'store/context-menu/context-menu-a
import { getUserUuid } from 'common/getuser';
import { VirtualMachinesResource } from 'models/virtual-machines';
import { CopyToClipboardSnackbar } from 'components/copy-to-clipboard-snackbar/copy-to-clipboard-snackbar';
+import { ProjectResource } from 'models/project';
const renderName = (dispatch: Dispatch, item: GroupContentsResource) => {
@@ -79,11 +81,32 @@ const renderName = (dispatch: Dispatch, item: GroupContentsResource) => {
+ {
+ item.kind === ResourceKind.PROJECT &&
+ }
;
};
+const FrozenProject = (props: {item: ProjectResource}) => {
+ const [fullUsername, setFullusername] = React.useState(null);
+ const getFullName = React.useCallback(() => {
+ if (props.item.frozenByUuid) {
+ setFullusername();
+ }
+ }, [props.item, setFullusername])
+
+ if (props.item.frozenByUuid) {
+
+ return Project was frozen by {fullUsername}}>
+
+ ;
+ } else {
+ return null;
+ }
+}
+
export const ResourceName = connect(
(state: RootState, props: { uuid: string }) => {
const resource = getResource(props.uuid)(state.resources);
@@ -184,22 +207,22 @@ export const ResourceLastName = connect(
return resource || { lastName: '' };
})(renderLastName);
-const renderFullName = (dispatch: Dispatch ,item: { uuid: string, firstName: string, lastName: string }, link?: boolean) => {
+const renderFullName = (dispatch: Dispatch, item: { uuid: string, firstName: string, lastName: string }, link?: boolean) => {
const displayName = (item.firstName + " " + item.lastName).trim() || item.uuid;
return link ? dispatch(navigateToUserProfile(item.uuid))}>
- {displayName}
+ {displayName}
:
- {displayName};
+ {displayName};
}
export const UserResourceFullName = connect(
(state: RootState, props: { uuid: string, link?: boolean }) => {
const resource = getResource(props.uuid)(state.resources);
- return {item: resource || { uuid: '', firstName: '', lastName: '' }, link: props.link};
- })((props: {item: {uuid: string, firstName: string, lastName: string}, link?: boolean} & DispatchProp) => renderFullName(props.dispatch, props.item, props.link));
+ return { item: resource || { uuid: '', firstName: '', lastName: '' }, link: props.link };
+ })((props: { item: { uuid: string, firstName: string, lastName: string }, link?: boolean } & DispatchProp) => renderFullName(props.dispatch, props.item, props.link));
const renderUuid = (item: { uuid: string }) =>
@@ -208,8 +231,8 @@ const renderUuid = (item: { uuid: string }) =>
;
export const ResourceUuid = connect((state: RootState, props: { uuid: string }) => (
- getResource(props.uuid)(state.resources) || { uuid: '' }
- ))(renderUuid);
+ getResource(props.uuid)(state.resources) || { uuid: '' }
+))(renderUuid);
const renderEmail = (item: { email: string }) =>
{item.email};
@@ -227,17 +250,17 @@ enum UserAccountStatus {
UNKNOWN = ''
}
-const renderAccountStatus = (props: {status: UserAccountStatus}) =>
+const renderAccountStatus = (props: { status: UserAccountStatus }) =>
{(() => {
- switch(props.status) {
+ switch (props.status) {
case UserAccountStatus.ACTIVE:
- return ;
+ return ;
case UserAccountStatus.SETUP:
- return ;
+ return ;
case UserAccountStatus.INACTIVE:
- return ;
+ return ;
default:
return <>>;
}
@@ -262,37 +285,37 @@ const getUserAccountStatus = (state: RootState, props: { uuid: string }) => {
)(state.resources);
if (user) {
- return user.isActive ? {status: UserAccountStatus.ACTIVE} : permissions.length > 0 ? {status: UserAccountStatus.SETUP} : {status: UserAccountStatus.INACTIVE};
+ return user.isActive ? { status: UserAccountStatus.ACTIVE } : permissions.length > 0 ? { status: UserAccountStatus.SETUP } : { status: UserAccountStatus.INACTIVE };
} else {
- return {status: UserAccountStatus.UNKNOWN};
+ return { status: UserAccountStatus.UNKNOWN };
}
}
export const ResourceLinkTailAccountStatus = connect(
(state: RootState, props: { uuid: string }) => {
const link = getResource(props.uuid)(state.resources);
- return link && link.tailKind === ResourceKind.USER ? getUserAccountStatus(state, {uuid: link.tailUuid}) : {status: UserAccountStatus.UNKNOWN};
+ return link && link.tailKind === ResourceKind.USER ? getUserAccountStatus(state, { uuid: link.tailUuid }) : { status: UserAccountStatus.UNKNOWN };
})(renderAccountStatus);
export const UserResourceAccountStatus = connect(getUserAccountStatus)(renderAccountStatus);
const renderIsHidden = (props: {
- memberLinkUuid: string,
- permissionLinkUuid: string,
- visible: boolean,
- canManage: boolean,
- setMemberIsHidden: (memberLinkUuid: string, permissionLinkUuid: string, hide: boolean) => void
- }) => {
+ memberLinkUuid: string,
+ permissionLinkUuid: string,
+ visible: boolean,
+ canManage: boolean,
+ setMemberIsHidden: (memberLinkUuid: string, permissionLinkUuid: string, hide: boolean) => void
+}) => {
if (props.memberLinkUuid) {
return {
- e.stopPropagation();
- props.setMemberIsHidden(props.memberLinkUuid, props.permissionLinkUuid, !props.visible);
- }} />;
+ data-cy="user-visible-checkbox"
+ color="primary"
+ checked={props.visible}
+ disabled={!props.canManage}
+ onClick={(e) => {
+ e.stopPropagation();
+ props.setMemberIsHidden(props.memberLinkUuid, props.permissionLinkUuid, !props.visible);
+ }} />;
} else {
return ;
}
@@ -357,7 +380,7 @@ export const VirtualMachineHostname = connect(
return resource || { hostname: '' };
})(renderHostname);
-const renderVirtualMachineLogin = (login: {user: string}) =>
+const renderVirtualMachineLogin = (login: { user: string }) =>
{login.user}
export const VirtualMachineLogin = connect(
@@ -365,7 +388,7 @@ export const VirtualMachineLogin = connect(
const permission = getResource(props.linkUuid)(state.resources);
const user = getResource(permission?.tailUuid || '')(state.resources);
- return {user: user?.username || permission?.tailUuid || ''};
+ return { user: user?.username || permission?.tailUuid || '' };
})(renderVirtualMachineLogin);
// Common methods
@@ -442,7 +465,7 @@ export const ResourceLinkClass = connect(
const getResourceDisplayName = (resource: Resource): string => {
if ((resource as UserResource).kind === ResourceKind.USER
- && typeof (resource as UserResource).firstName !== 'undefined') {
+ && typeof (resource as UserResource).firstName !== 'undefined') {
// We can be sure the resource is UserResource
return getUserDisplayName(resource as UserResource);
} else {
@@ -516,7 +539,7 @@ const renderLinkDelete = (dispatch: Dispatch, item: LinkResource, canManage: boo
;
} else {
- return ;
+ return ;
}
}
@@ -530,7 +553,7 @@ export const ResourceLinkDelete = connect(
canManage: link && getResourceLinkCanManage(state, link) && !isBuiltin,
};
})((props: { item: LinkResource, canManage: boolean } & DispatchProp) =>
- renderLinkDelete(props.dispatch, props.item, props.canManage));
+ renderLinkDelete(props.dispatch, props.item, props.canManage));
export const ResourceLinkTailEmail = connect(
(state: RootState, props: { uuid: string }) => {
@@ -713,10 +736,17 @@ const userFromID =
return { uuid: props.uuid, userFullname };
});
-export const ResourceOwnerWithName =
+const ownerFromResourceId =
compose(
- userFromID,
- withStyles({}, { withTheme: true }))
+ connect((state: RootState, props: { uuid: string }) => {
+ const childResource = getResource(props.uuid)(state.resources);
+ return { uuid: childResource ? (childResource as Resource).ownerUuid : '' };
+ }),
+ userFromID
+ );
+
+const _resourceWithName =
+ withStyles({}, { withTheme: true })
((props: { uuid: string, userFullname: string, dispatch: Dispatch, theme: ArvadosTheme }) => {
const { uuid, userFullname, dispatch, theme } = props;
@@ -732,9 +762,13 @@ export const ResourceOwnerWithName =
;
});
+export const ResourceOwnerWithName = ownerFromResourceId(_resourceWithName);
+
+export const ResourceWithName = userFromID(_resourceWithName);
+
export const UserNameFromID =
compose(userFromID)(
- (props: { uuid: string, userFullname: string, dispatch: Dispatch }) => {
+ (props: { uuid: string, displayAsText?: string, userFullname: string, dispatch: Dispatch }) => {
const { uuid, userFullname, dispatch } = props;
if (userFullname === '') {
@@ -798,7 +832,7 @@ export const ResponsiblePerson =
return
{responsiblePersonName} ({uuid})
- ;
+ ;
});
const renderType = (type: string, subtype: string) =>
@@ -828,6 +862,16 @@ export const CollectionStatus = connect((state: RootState, props: { uuid: string
: head version
);
+export const CollectionName = connect((state: RootState, props: { uuid: string, className?: string }) => {
+ return {
+ collection: getResource(props.uuid)(state.resources),
+ uuid: props.uuid,
+ className: props.className,
+ };
+})((props: { collection: CollectionResource, uuid: string, className?: string }) =>
+ {props.collection?.name || props.uuid}
+);
+
export const ProcessStatus = compose(
connect((state: RootState, props: { uuid: string }) => {
return { process: getProcess(props.uuid)(state.resources) };
@@ -835,19 +879,18 @@ export const ProcessStatus = compose(
withStyles({}, { withTheme: true }))
((props: { process?: Process, theme: ArvadosTheme }) =>
props.process
- ?
- : -
- );
+ ?
+ : -
+ );
export const ProcessStartDate = connect(
(state: RootState, props: { uuid: string }) => {