diff --git a/client/src/components/UserSettingsModal/AccountPane/AccountPane.jsx b/client/src/components/UserSettingsModal/AccountPane/AccountPane.jsx
index ba5026a0..47e0acd1 100644
--- a/client/src/components/UserSettingsModal/AccountPane/AccountPane.jsx
+++ b/client/src/components/UserSettingsModal/AccountPane/AccountPane.jsx
@@ -18,6 +18,8 @@ const AccountPane = React.memo(
name,
username,
avatar,
+ phone,
+ organization,
isAvatarUploading,
usernameUpdateForm,
emailUpdateForm,
@@ -53,6 +55,8 @@ const AccountPane = React.memo(
@@ -120,6 +124,8 @@ AccountPane.propTypes = {
name: PropTypes.string.isRequired,
username: PropTypes.string,
avatar: PropTypes.string,
+ phone: PropTypes.string,
+ organization: PropTypes.string,
isAvatarUploading: PropTypes.bool.isRequired,
/* eslint-disable react/forbid-prop-types */
usernameUpdateForm: PropTypes.object.isRequired,
@@ -139,6 +145,8 @@ AccountPane.propTypes = {
AccountPane.defaultProps = {
username: undefined,
avatar: undefined,
+ phone: undefined,
+ organization: undefined,
};
export default AccountPane;
diff --git a/client/src/components/UserSettingsModal/AccountPane/EditInformation.jsx b/client/src/components/UserSettingsModal/AccountPane/EditInformation.jsx
index c1062ff1..bfde6409 100644
--- a/client/src/components/UserSettingsModal/AccountPane/EditInformation.jsx
+++ b/client/src/components/UserSettingsModal/AccountPane/EditInformation.jsx
@@ -1,5 +1,6 @@
import dequal from 'dequal';
-import React, { useCallback, useRef } from 'react';
+import pickBy from 'lodash/pickBy';
+import React, { useCallback, useMemo, useRef } from 'react';
import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next';
import { Button, Form, Input } from 'semantic-ui-react';
@@ -11,26 +12,33 @@ import styles from './EditInformation.module.css';
const EditInformation = React.memo(({ defaultData, onUpdate }) => {
const [t] = useTranslation();
- const [data, handleFieldChange] = useForm({
+ const [data, handleFieldChange] = useForm(() => ({
name: '',
- ...defaultData,
- });
+ phone: '',
+ organization: '',
+ ...pickBy(defaultData),
+ }));
+
+ const cleanData = useMemo(
+ () => ({
+ ...data,
+ name: data.name.trim(),
+ phone: data.phone.trim() || null,
+ organization: data.organization.trim() || null,
+ }),
+ [data],
+ );
const nameField = useRef(null);
const handleSubmit = useCallback(() => {
- const cleanData = {
- ...data,
- name: data.name.trim(),
- };
-
if (!cleanData.name) {
nameField.current.select();
return;
}
onUpdate(cleanData);
- }, [onUpdate, data]);
+ }, [onUpdate, cleanData]);
return (
);
});
diff --git a/client/src/components/UserSettingsModal/UserSettingsModal.jsx b/client/src/components/UserSettingsModal/UserSettingsModal.jsx
index e90cb582..eb1d5ec0 100644
--- a/client/src/components/UserSettingsModal/UserSettingsModal.jsx
+++ b/client/src/components/UserSettingsModal/UserSettingsModal.jsx
@@ -11,6 +11,8 @@ const UserSettingsModal = React.memo(
name,
username,
avatar,
+ phone,
+ organization,
isAvatarUploading,
usernameUpdateForm,
emailUpdateForm,
@@ -38,6 +40,8 @@ const UserSettingsModal = React.memo(
name={name}
username={username}
avatar={avatar}
+ phone={phone}
+ organization={organization}
isAvatarUploading={isAvatarUploading}
usernameUpdateForm={usernameUpdateForm}
emailUpdateForm={emailUpdateForm}
@@ -70,6 +74,8 @@ UserSettingsModal.propTypes = {
name: PropTypes.string.isRequired,
username: PropTypes.string,
avatar: PropTypes.string,
+ phone: PropTypes.string,
+ organization: PropTypes.string,
isAvatarUploading: PropTypes.bool.isRequired,
/* eslint-disable react/forbid-prop-types */
usernameUpdateForm: PropTypes.object.isRequired,
@@ -90,6 +96,8 @@ UserSettingsModal.propTypes = {
UserSettingsModal.defaultProps = {
username: undefined,
avatar: undefined,
+ phone: undefined,
+ organization: undefined,
};
export default UserSettingsModal;
diff --git a/client/src/containers/UserSettingsModalContainer.js b/client/src/containers/UserSettingsModalContainer.js
index 95320969..38ebae7b 100644
--- a/client/src/containers/UserSettingsModalContainer.js
+++ b/client/src/containers/UserSettingsModalContainer.js
@@ -21,6 +21,8 @@ const mapStateToProps = (state) => {
name,
username,
avatar,
+ phone,
+ organization,
isAvatarUploading,
emailUpdateForm,
passwordUpdateForm,
@@ -32,6 +34,8 @@ const mapStateToProps = (state) => {
name,
username,
avatar,
+ phone,
+ organization,
isAvatarUploading,
emailUpdateForm,
passwordUpdateForm,
diff --git a/client/src/locales/en-US/app.js b/client/src/locales/en-US/app.js
index c9e4d992..14d39522 100644
--- a/client/src/locales/en-US/app.js
+++ b/client/src/locales/en-US/app.js
@@ -84,6 +84,8 @@ export default {
noUnreadNotifications: 'No unread notifications',
openBoard_title: 'Open Board',
optional_inline: 'optional',
+ organization: 'Organization',
+ phone: 'Phone',
projectNotFound_title: 'Project Not Found',
refreshPageToLoadLastDataAndReceiveUpdates:
'<0>Refresh the page0> to load last data
and receive updates',
diff --git a/client/src/locales/ru-RU/app.js b/client/src/locales/ru-RU/app.js
index f97bf42a..a2c1258a 100644
--- a/client/src/locales/ru-RU/app.js
+++ b/client/src/locales/ru-RU/app.js
@@ -88,6 +88,8 @@ export default {
noUnreadNotifications: 'Уведомлений нет',
openBoard: 'Откройте доску',
optional_inline: 'необязательно',
+ organization: 'Организация',
+ phone: 'Телефон',
projectNotFound: 'Доска не найдена',
refreshPageToLoadLastDataAndReceiveUpdates:
'<0>Обновите страницу0>, чтобы загрузить
актуальные данные и получать обновления',
diff --git a/client/src/models/User.js b/client/src/models/User.js
index 9c0f154e..8a73a289 100755
--- a/client/src/models/User.js
+++ b/client/src/models/User.js
@@ -37,6 +37,8 @@ export default class extends Model {
email: attr(),
name: attr(),
avatar: attr(),
+ phone: attr(),
+ organization: attr(),
deletedAt: attr(),
isAdmin: attr({
getDefault: () => false,
diff --git a/server/api/controllers/users/create.js b/server/api/controllers/users/create.js
index 2f8fba7a..f7cd9876 100755
--- a/server/api/controllers/users/create.js
+++ b/server/api/controllers/users/create.js
@@ -30,6 +30,16 @@ module.exports = {
regex: /^[a-zA-Z0-9]+(_?[a-zA-Z0-9])*$/,
allowNull: true,
},
+ phone: {
+ type: 'string',
+ isNotEmptyString: true,
+ allowNull: true,
+ },
+ organization: {
+ type: 'string',
+ isNotEmptyString: true,
+ allowNull: true,
+ },
},
exits: {
@@ -42,7 +52,14 @@ module.exports = {
},
async fn(inputs, exits) {
- const values = _.pick(inputs, ['email', 'password', 'name', 'username']);
+ const values = _.pick(inputs, [
+ 'email',
+ 'password',
+ 'name',
+ 'username',
+ 'phone',
+ 'organization',
+ ]);
const user = await sails.helpers
.createUser(values, this.req)
diff --git a/server/api/controllers/users/update.js b/server/api/controllers/users/update.js
index d8e4cf9d..d6099f24 100755
--- a/server/api/controllers/users/update.js
+++ b/server/api/controllers/users/update.js
@@ -22,6 +22,16 @@ module.exports = {
type: 'json',
custom: (value) => _.isNull(value),
},
+ phone: {
+ type: 'string',
+ isNotEmptyString: true,
+ allowNull: true,
+ },
+ organization: {
+ type: 'string',
+ isNotEmptyString: true,
+ allowNull: true,
+ },
},
exits: {
@@ -47,7 +57,7 @@ module.exports = {
throw Errors.USER_NOT_FOUND;
}
- const values = _.pick(inputs, ['isAdmin', 'name', 'avatar']);
+ const values = _.pick(inputs, ['isAdmin', 'name', 'avatar', 'phone', 'organization']);
user = await sails.helpers.updateUser(user, values, this.req);
diff --git a/server/api/models/User.js b/server/api/models/User.js
index e4f929e7..ae16ba29 100755
--- a/server/api/models/User.js
+++ b/server/api/models/User.js
@@ -42,6 +42,16 @@ module.exports = {
isNotEmptyString: true,
allowNull: true,
},
+ phone: {
+ type: 'string',
+ isNotEmptyString: true,
+ allowNull: true,
+ },
+ organization: {
+ type: 'string',
+ isNotEmptyString: true,
+ allowNull: true,
+ },
deletedAt: {
type: 'ref',
columnName: 'deleted_at',
diff --git a/server/db/migrations/20180721220409_create_user_account_table.js b/server/db/migrations/20180721220409_create_user_account_table.js
index 1fd26b36..57ee757e 100755
--- a/server/db/migrations/20180721220409_create_user_account_table.js
+++ b/server/db/migrations/20180721220409_create_user_account_table.js
@@ -11,6 +11,8 @@ module.exports.up = (knex) =>
table.text('name').notNullable();
table.text('username');
table.text('avatar');
+ table.text('phone');
+ table.text('organization');
table.timestamp('created_at', true);
table.timestamp('updated_at', true);