@@ -34,4 +71,7 @@ function UsersView(props) {
);
}
-export default UsersView;
\ No newline at end of file
+export default connect(state => ({
+ account: state.getIn([ 'user', 'account' ]),
+ isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee',
+}))(UsersView);
\ No newline at end of file
diff --git a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx
index b47a38d50..489f27881 100644
--- a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx
+++ b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx
@@ -1,9 +1,10 @@
import React from 'react';
-import { Input, CopyButton, Button, Select } from 'UI'
+import { Input, CopyButton, Button } from 'UI'
import cn from 'classnames';
import { useStore } from 'App/mstore';
import { useObserver } from 'mobx-react-lite';
import { useModal } from 'App/components/Modal';
+import Select from 'Shared/Select';
interface Props {
isSmtp?: boolean;
@@ -16,18 +17,21 @@ function UserForm(props: Props) {
const { userStore, roleStore } = useStore();
const user: any = useObserver(() => userStore.instance);
const roles = useObserver(() => roleStore.list.map(r => ({ label: r.name, value: r.roleId })));
- console.log('roles', roles)
const onChangeCheckbox = (e: any) => {
user.updateKey('isAdmin', !user.isAdmin);
}
const onSave = () => {
+ userStore.saveUser(user).then(() => {
+ hideModal();
+ });
}
const write = ({ target: { name, value } }) => {
user.updateKey(name, value);
}
+
return useObserver(() => (
@@ -87,8 +91,8 @@ function UserForm(props: Props) {
selection
options={ roles }
name="roleId"
- value={ user.roleId }
- onChange={ write }
+ defaultValue={ user.roleId }
+ onChange={({ value }) => user.updateKey('roleId', value)}
className="block"
/>
@@ -111,7 +115,7 @@ function UserForm(props: Props) {
onClick={ hideModal }
outline
>
- { 'Cancel' }
+ { 'Cancel' }
{ !user.isJoined && user.invitationLink &&
diff --git a/frontend/app/components/Client/Users/components/UserSearch/UserSearch.tsx b/frontend/app/components/Client/Users/components/UserSearch/UserSearch.tsx
index 3b2f5d754..cc78476d8 100644
--- a/frontend/app/components/Client/Users/components/UserSearch/UserSearch.tsx
+++ b/frontend/app/components/Client/Users/components/UserSearch/UserSearch.tsx
@@ -25,7 +25,7 @@ function UserSearch(props) {
value={query}
name="searchQuery"
className="bg-white p-2 border border-gray-light rounded w-full pl-10"
- placeholder="Filter by Name, Project"
+ placeholder="Filter by Name, Role"
onChange={write}
/>
diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx
index e7af914d4..efb91fed9 100644
--- a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx
+++ b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx
@@ -16,7 +16,6 @@ function DefaultTimezone(props) {
const { settingsStore } = useStore();
const [timezone, setTimezone] = React.useState(settingsStore.sessionSettings.timezone);
const sessionSettings = useObserver(() => settingsStore.sessionSettings)
- console.log('timezone', timezone)
return (
<>
diff --git a/frontend/app/mstore/types/role.ts b/frontend/app/mstore/types/role.ts
index 189984e0f..e8204ef22 100644
--- a/frontend/app/mstore/types/role.ts
+++ b/frontend/app/mstore/types/role.ts
@@ -25,7 +25,7 @@ export default class Role implements IRole {
fromJson(json: any) {
runInAction(() => {
- this.roleId = json.id;
+ this.roleId = json.roleId;
this.name = json.name;
this.description = json.description;
})
diff --git a/frontend/app/mstore/types/user.ts b/frontend/app/mstore/types/user.ts
index 557beb794..c8b9dcdd6 100644
--- a/frontend/app/mstore/types/user.ts
+++ b/frontend/app/mstore/types/user.ts
@@ -1,6 +1,6 @@
import { runInAction, makeAutoObservable, observable } from 'mobx'
import { DateTime } from 'luxon';
-import { validateEmail } from 'App/validate';
+import { validateEmail, validateName } from 'App/validate';
export interface IUser {
userId: string
@@ -16,6 +16,7 @@ export interface IUser {
fromJson(json: any): IUser
toJson(): any
+ toSave(): any
}
export default class User implements IUser {
@@ -55,7 +56,7 @@ export default class User implements IUser {
fromJson(json: any) {
runInAction(() => {
- this.userId = json.id;
+ this.userId = json.userId || json.id; // TODO api returning id
this.name = json.name;
this.email = json.email;
this.createdAt = json.createdAt && DateTime.fromISO(json.createdAt || 0)
@@ -72,15 +73,26 @@ export default class User implements IUser {
toJson() {
return {
+ userId: this.userId,
+ name: this.name,
email: this.email,
- isAdmin: this.isAdmin,
+ admin: this.isAdmin,
isSuperAdmin: this.isSuperAdmin,
roleId: this.roleId,
}
}
+ toSave() {
+ return {
+ name: this.name,
+ email: this.email,
+ admin: this.isAdmin,
+ roleId: this.roleId,
+ }
+ }
+
valid() {
- return validateEmail(this.email) && !!this.roleId;
+ return validateName(this.name, { empty: false }) && validateEmail(this.email) && !!this.roleId;
}
exists() {
diff --git a/frontend/app/mstore/userStore.ts b/frontend/app/mstore/userStore.ts
index 33e2e9754..640c8910b 100644
--- a/frontend/app/mstore/userStore.ts
+++ b/frontend/app/mstore/userStore.ts
@@ -1,15 +1,18 @@
import { makeAutoObservable, observable, action } from "mobx"
import User, { IUser } from "./types/user";
import { userService } from "App/services";
+import { toast } from 'react-toastify';
export default class UserStore {
list: IUser[] = [];
instance: IUser|null = null;
- loading: boolean = false;
page: number = 1;
pageSize: number = 10;
searchQuery: string = "";
+ loading: boolean = false;
+ saving: boolean = false;
+
constructor() {
makeAutoObservable(this, {
instance: observable,
@@ -22,7 +25,7 @@ export default class UserStore {
initUser(user?: any ): Promise