import { getResourceWithEditableStatus } from "store/resources/resources";
import { GroupResource } from "models/group";
import { EditableResource } from "models/resource";
-import { User } from "models/user";
+import { User, UserResource } from "models/user";
import { GroupClass } from "models/group";
import { isProcessCancelable } from "store/processes/process";
import { CollectionResource } from "models/collection";
import { Process } from "store/processes/process";
import { PublicFavoritesState } from "store/public-favorites/public-favorites-reducer";
import { isExactlyOneSelected } from "store/multiselect/multiselect-actions";
+import { AuthState } from "store/auth/auth-reducer";
+import { BuiltinGroups, getBuiltinGroupUuid } from "models/group";
+import { LinkResource, LinkClass } from "models/link";
+import { filterResources } from "store/resources/resources";
+import { UserAccountStatus } from "store/users/users-actions";
const WIDTH_TRANSITION = 150
iconProps: IconProps
user: User | null
disabledButtons: Set<string>
- executeMulti: (action: ContextMenuAction, inputSelectedUuid: string | undefined, checkedList: TCheckedList, resources: ResourcesState) => void;
+ auth: AuthState;
+ executeMulti: (action: ContextMenuAction | MultiSelectMenuAction, inputSelectedUuid: string | undefined, checkedList: TCheckedList, resources: ResourcesState) => void;
};
type IconProps = {
mapDispatchToProps
)(
withStyles(styles)((props: MultiselectToolbarProps & WithStyles<CssRules>) => {
- const { classes, checkedList, inputSelectedUuid, iconProps, user, disabledButtons } = props;
+ const { classes, checkedList, inputSelectedUuid, iconProps, user, disabledButtons, auth } = props;
const singleSelectedUuid = inputSelectedUuid ?? props.singleSelectedUuid
const singleResourceKind = singleSelectedUuid ? [resourceToMsResourceKind(singleSelectedUuid, iconProps.resources, user)] : null
const currentResourceKinds = singleResourceKind ? singleResourceKind : Array.from(selectedToKindSet(checkedList));
// eslint-disable-next-line
}, [checkedList])
+ const getAccountStatus = (auth: AuthState, resources: ResourcesState) => {
+ const user = getResource<UserResource>(singleSelectedUuid as string)(resources);
+ if (!user) return;
+ const allUsersGroupUuid = getBuiltinGroupUuid(auth.localCluster, BuiltinGroups.ALL);
+ const permissions = filterResources(
+ (resource: LinkResource) =>
+ resource.kind === ResourceKind.LINK &&
+ resource.linkClass === LinkClass.PERMISSION &&
+ resource.headUuid === allUsersGroupUuid &&
+ resource.tailUuid === singleSelectedUuid
+ )(resources);
+
+ return user && user.isActive ? UserAccountStatus.ACTIVE : permissions.length > 0 ? UserAccountStatus.SETUP : UserAccountStatus.INACTIVE;
+ };
+
const actions =
currentPathIsTrash && selectedToKindSet(checkedList).size
? [msToggleTrashAction]
- : selectActionsByKind(currentResourceKinds as string[], multiselectActionsFilters).filter((action) =>
- singleSelectedUuid === null ? action.isForMulti : true
- );
+ : selectActionsByKind(currentResourceKinds as string[], multiselectActionsFilters)
+ .filter((action) => (singleSelectedUuid === null ? action.isForMulti : true))
+ .filter((action) => {
+ if (action.filters && action.filters.length) {
+ if (action.filters[0] === UserAccountStatus.OTHER && singleSelectedUuid !== auth.user?.uuid) return true;
+ const accountStatus = getAccountStatus(auth, iconProps.resources);
+ return accountStatus && action.filters.includes(accountStatus);
+ }
+ return true;
+ });
return (
<React.Fragment>
singleSelectedUuid: isExactlyOneSelected(multiselect.checkedList),
user: auth && auth.user ? auth.user : null,
disabledButtons: new Set<string>(multiselect.disabledButtons),
+ auth,
iconProps: {
resources,
favorites,
import { MultiSelectMenuAction, MultiSelectMenuActionSet, MultiSelectMenuActionNames } from './ms-menu-actions';
import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab';
import { openActivateDialog, openDeactivateDialog, openSetupDialog } from 'store/user-profile/user-profile-actions';
-import { openUserAttributes } from 'store/users/users-actions';
+import { UserAccountStatus, openUserAttributes } from 'store/users/users-actions';
import { loginAs } from 'store/users/users-actions';
const { ATTRIBUTES, API_DETAILS, SETUP_USER, ACTIVATE_USER, DEACTIVATE_USER, LOGIN_AS_USER } = MultiSelectMenuActionNames;
-export const USER_ATTRIBUTES_DIALOG = 'userAttributesDialog';
-
const msUserAttributes: MultiSelectMenuAction = {
name: ATTRIBUTES,
icon: AttributesIcon,
execute: (dispatch, resources) => {
dispatch<any>(openActivateDialog(resources[0].uuid));
},
+ filters: [UserAccountStatus.INACTIVE, UserAccountStatus.SETUP],
};
const msSetupUser: MultiSelectMenuAction = {
execute: (dispatch, resources) => {
dispatch<any>(openSetupDialog(resources[0].uuid));
},
+ filters: [UserAccountStatus.INACTIVE],
};
const msDeactivateUser: MultiSelectMenuAction = {
execute: (dispatch, resources) => {
dispatch<any>(openDeactivateDialog(resources[0].uuid));
},
+ filters: [UserAccountStatus.ACTIVE, UserAccountStatus.SETUP],
};
const msLoginAsUser: MultiSelectMenuAction = {
execute: (dispatch, resources) => {
dispatch<any>(loginAs(resources[0].uuid));
},
+ filters: [UserAccountStatus.OTHER]
};
export const msUserActionSet: MultiSelectMenuActionSet = [[msAdvancedAction, msUserAttributes, msSetupUser, msActivateUser, msDeactivateUser, msLoginAsUser]];