dataExplorerToListParams,
getDataExplorerColumnFilters,
listResultsToDataExplorerItemsMeta
-} from '../data-explorer/data-explorer-middleware-service';
-import { ProjectPanelColumnNames, ProjectPanelFilter } from "~/views/project-panel/project-panel";
-import { RootState } from "../store";
+} from '~/store/data-explorer/data-explorer-middleware-service';
+import { ProjectPanelColumnNames } from "~/views/project-panel/project-panel";
+import { RootState } from "~/store/store";
import { DataColumns } from "~/components/data-table/data-table";
import { ServiceRepository } from "~/services/services";
import { SortDirection } from "~/components/data-table/data-column";
import { OrderBuilder, OrderDirection } from "~/services/api/order-builder";
import { FilterBuilder, joinFilters } from "~/services/api/filter-builder";
import { GroupContentsResource, GroupContentsResourcePrefix } from "~/services/groups-service/groups-service";
-import { updateFavorites } from "../favorites/favorites-actions";
-import { PROJECT_PANEL_CURRENT_UUID, IS_PROJECT_PANEL_TRASHED, projectPanelActions } from './project-panel-action';
+import { updateFavorites } from "~/store/favorites/favorites-actions";
+import { PROJECT_PANEL_CURRENT_UUID, IS_PROJECT_PANEL_TRASHED, projectPanelActions } from '~/store/project-panel/project-panel-action';
import { Dispatch, MiddlewareAPI } from "redux";
import { ProjectResource } from "~/models/project";
import { updateResources } from "~/store/resources/resources-actions";
import { getProperty } from "~/store/properties/properties";
-import { snackbarActions, SnackbarKind } from '../snackbar/snackbar-actions';
+import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions.ts';
-import { DataExplorer, getDataExplorer } from '../data-explorer/data-explorer-reducer';
+import { DataExplorer, getDataExplorer } from '~/store/data-explorer/data-explorer-reducer';
import { ListResults } from '~/services/common-service/common-resource-service';
-import { loadContainers } from '../processes/processes-actions';
+import { loadContainers } from '~/store/processes/processes-actions';
import { ResourceKind } from '~/models/resource';
import { getResource } from "~/store/resources/resources";
import { CollectionResource } from "~/models/collection";
import { resourcesDataActions } from "~/store/resources-data/resources-data-actions";
import { getSortColumn } from "~/store/data-explorer/data-explorer-reducer";
-import { serializeResourceTypeFilters } from '../resource-type-filters/resource-type-filters';
+import { serializeResourceTypeFilters } from '~/store/resource-type-filters/resource-type-filters';
export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService {
constructor(private services: ServiceRepository, id: string) {
export const getFilters = (dataExplorer: DataExplorer) => {
const filters = new FilterBuilder()
- .addILike("firstName", dataExplorer.searchValue)
+ .addILike("username", dataExplorer.searchValue)
.getFilters();
return filters;
};
import { bindDataExplorerActions } from '~/store/data-explorer/data-explorer-action';
import { RootState } from '~/store/store';
import { ServiceRepository } from "~/services/services";
-import { navigateToUsers } from "~/store/navigation/navigation-action";
-import { unionize, ofType, UnionOf } from "~/common/unionize";
import { dialogActions } from '~/store/dialog/dialog-actions';
import { startSubmit, reset, stopSubmit } from "redux-form";
import { getCommonResourceServiceError, CommonResourceServiceError } from "~/services/common-service/common-resource-service";
import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
import { UserResource } from "~/models/user";
import { getResource } from '~/store/resources/resources';
-
-export const usersPanelActions = unionize({
- SET_USERS: ofType<any>(),
-});
-
-export type UsersActions = UnionOf<typeof usersPanelActions>;
+import { navigateToProject } from "~/store/navigation/navigation-action";
export const USERS_PANEL_ID = 'usersPanel';
export const USER_ATTRIBUTES_DIALOG = 'userAttributesDialog';
async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
const userUuid = await services.authService.getUuid();
const user = await services.userService.get(userUuid!);
+ const virtualMachines = await services.virtualMachineService.list();
dispatch(reset(USER_CREATE_FORM_NAME));
- dispatch(dialogActions.OPEN_DIALOG({ id: USER_CREATE_FORM_NAME, data: { user } }));
+ dispatch(dialogActions.OPEN_DIALOG({ id: USER_CREATE_FORM_NAME, data: { user, ...virtualMachines } }));
+ };
+
+export const openUserProjects = (uuid: string) =>
+ async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ dispatch<any>(navigateToProject(uuid));
};
+
export const createUser = (user: UserCreateFormDialogData) =>
async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
dispatch(startSubmit(USER_CREATE_FORM_NAME));
dispatch(dialogActions.CLOSE_DIALOG({ id: USER_CREATE_FORM_NAME }));
dispatch(reset(USER_CREATE_FORM_NAME));
dispatch(snackbarActions.OPEN_SNACKBAR({ message: "User has been successfully created.", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
- dispatch<any>(loadUsersData());
+ dispatch<any>(loadUsersPanel());
dispatch(userBindedActions.REQUEST_ITEMS());
return newUser;
} catch (e) {
}
};
-export const userBindedActions = bindDataExplorerActions(USERS_PANEL_ID);
+export const toggleIsActive = (uuid: string) =>
+ async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const { resources } = getState();
+ const data = getResource<UserResource>(uuid)(resources);
+ const isActive = data!.isActive;
+ const newActivity = await services.userService.update(uuid, { ...data, isActive: !isActive });
+ dispatch<any>(loadUsersPanel());
+ return newActivity;
+ };
-export const openUsersPanel = () =>
- (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
- dispatch<any>(navigateToUsers);
+export const toggleIsAdmin = (uuid: string) =>
+ async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const { resources } = getState();
+ const data = getResource<UserResource>(uuid)(resources);
+ const isAdmin = data!.isAdmin;
+ const newActivity = await services.userService.update(uuid, { ...data, isAdmin: !isAdmin });
+ dispatch<any>(loadUsersPanel());
+ return newActivity;
};
+export const userBindedActions = bindDataExplorerActions(USERS_PANEL_ID);
+
export const loadUsersData = () =>
async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
- const users = await services.userService.list();
- dispatch(usersPanelActions.SET_USERS(users.items));
+ await services.userService.list();
};
export const loadUsersPanel = () =>
const userUuid = services.authService.getUuid();
dispatch(setIsProjectPanelTrashed(false));
if (userUuid) {
- if (userUuid !== uuid) {
+ if (extractUuidKind(uuid) === ResourceKind.USER && userUuid!==uuid) {
+ // Load another users home projects
+ dispatch(finishLoadingProject(uuid));
+ } else if (userUuid !== uuid) {
const match = await loadGroupContentsResource({ uuid, userUuid, services });
match({
OWNED: async project => {
import { ContextMenuActionSet } from "~/views-components/context-menu/context-menu-action-set";
import { AdvancedIcon, ProjectIcon, AttributesIcon, UserPanelIcon } from "~/components/icon/icon";
import { openAdvancedTabDialog } from '~/store/advanced-tab/advanced-tab';
-import { openUserAttributes } from "~/store/users/users-actions";
+import { openUserAttributes, openUserProjects } from "~/store/users/users-actions";
export const userActionSet: ContextMenuActionSet = [[{
name: "Attributes",
name: "Project",
icon: ProjectIcon,
execute: (dispatch, { uuid }) => {
- dispatch<any>(openAdvancedTabDialog(uuid));
+ dispatch<any>(openUserProjects(uuid));
}
}, {
name: "Advanced",
import { getResourceData } from "~/store/resources-data/resources-data";
import { openSharingDialog } from '~/store/sharing-dialog/sharing-dialog-actions';
import { UserResource } from '~/models/user';
+import { toggleIsActive, toggleIsAdmin } from '~/store/users/users-actions';
const renderName = (item: { name: string; uuid: string, kind: string }) =>
<Grid container alignItems="center" wrap="nowrap" spacing={16}>
return resource || { email: '' };
})(renderEmail);
-const renderIsActive = (item: { isActive: boolean }) =>
+const renderIsActive = (props: { uuid: string, isActive: boolean, toggleIsActive: (uuid: string) => void }) =>
<Checkbox
- disableRipple
color="primary"
- checked={item.isActive} />;
+ checked={props.isActive}
+ onClick={() => props.toggleIsActive(props.uuid)} />;
export const ResourceIsActive = connect(
(state: RootState, props: { uuid: string }) => {
const resource = getResource<UserResource>(props.uuid)(state.resources);
return resource || { isActive: false };
- })(renderIsActive);
+ }, { toggleIsActive }
+)(renderIsActive);
-const renderIsAdmin = (item: { isAdmin: boolean }) =>
+const renderIsAdmin = (props: { uuid: string, isAdmin: boolean, toggleIsAdmin: (uuid: string) => void }) =>
<Checkbox
- disableRipple
color="primary"
- checked={item.isAdmin} />;
+ checked={props.isAdmin}
+ onClick={() => props.toggleIsAdmin(props.uuid)} />;
export const ResourceIsAdmin = connect(
(state: RootState, props: { uuid: string }) => {
const resource = getResource<UserResource>(props.uuid)(state.resources);
return resource || { isAdmin: false };
- })(renderIsAdmin);
+ }, { toggleIsAdmin }
+)(renderIsAdmin);
const renderUsername = (item: { username: string }) =>
<Typography noWrap>{item.username}</Typography>;
import { FormDialog } from '~/components/form-dialog/form-dialog';
import { UserFirstNameField, UserLastNameField, UserEmailField, UserIdentityUrlField, UserVirtualMachineField, UserGroupsVirtualMachineField } from '~/views-components/form-fields/user-form-fields';
-type DialogUserProps = WithDialogProps<{}> & InjectedFormProps<any>;
+export type DialogUserProps = WithDialogProps<{}> & InjectedFormProps<any>;
export const UserRepositoryCreate = (props: DialogUserProps) =>
<FormDialog
{...props}
/>;
-const UserAddFields = () => <span>
+const UserAddFields = (props: DialogUserProps) => <span>
<UserFirstNameField />
<UserLastNameField />
<UserEmailField />
<UserIdentityUrlField />
- <UserVirtualMachineField />
+ <UserVirtualMachineField data={props.data}/>
<UserGroupsVirtualMachineField />
</span>;
import { TextField } from "~/components/text-field/text-field";
import { USER_EMAIL_VALIDATION, USER_LENGTH_VALIDATION } from "~/validators/validators";
import { NativeSelectField } from "~/components/select-field/select-field";
+import { InputLabel } from "@material-ui/core";
+import { VirtualMachinesResource } from "~/models/virtual-machines";
export const UserFirstNameField = () =>
<Field
validate={USER_LENGTH_VALIDATION}
label="Identity URL Prefix" />;
-export const UserVirtualMachineField = () =>
- <Field
- name='virtualMachine'
- component={NativeSelectField}
- validate={USER_LENGTH_VALIDATION}
- items={['shell']} />;
+export const UserVirtualMachineField = ({ data }: any) =>
+ <div style={{ marginBottom: '21px' }}>
+ <InputLabel>Virtual Machine</InputLabel>
+ <Field
+ name='virtualMachine'
+ component={NativeSelectField}
+ validate={USER_LENGTH_VALIDATION}
+ items={getVirtualMachinesList(data.items)} />
+ </div>;
export const UserGroupsVirtualMachineField = () =>
<Field
- name='virtualMachine'
+ name='groups'
component={TextField}
validate={USER_LENGTH_VALIDATION}
- label="Groups for virtual machine (comma separated list)" />;
\ No newline at end of file
+ label="Groups for virtual machine (comma separated list)" />;
+
+const getVirtualMachinesList = (virtualMachines: VirtualMachinesResource[]) => {
+ const mappedVirtualMachines = virtualMachines.map(it => ({ key: it.hostname, value: it.hostname }));
+ return mappedVirtualMachines;
+};
return <Paper>
<Tabs value={value} onChange={this.handleChange} fullWidth>
<Tab label="USERS" />
- <Tab label="ACTIVITY" />
+ <Tab label="ACTIVITY" disabled />
</Tabs>
{value === 0 &&
<span>