1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-19 05:09:43 +02:00

Add phone and organization fields to user

This commit is contained in:
Maksim Eltyshev 2020-04-09 18:27:28 +05:00
parent c4acb3eb24
commit f3e0cadca6
11 changed files with 102 additions and 13 deletions

View file

@ -18,6 +18,8 @@ const AccountPane = React.memo(
name,
username,
avatar,
phone,
organization,
isAvatarUploading,
usernameUpdateForm,
emailUpdateForm,
@ -53,6 +55,8 @@ const AccountPane = React.memo(
<EditInformation
defaultData={{
name,
phone,
organization,
}}
onUpdate={onUpdate}
/>
@ -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;

View file

@ -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 (
<Form onSubmit={handleSubmit}>
@ -43,7 +51,23 @@ const EditInformation = React.memo(({ defaultData, onUpdate }) => {
className={styles.field}
onChange={handleFieldChange}
/>
<Button positive disabled={dequal(data, defaultData)} content={t('action.save')} />
<div className={styles.text}>{t('common.phone')}</div>
<Input
fluid
name="phone"
value={data.phone}
className={styles.field}
onChange={handleFieldChange}
/>
<div className={styles.text}>{t('common.organization')}</div>
<Input
fluid
name="organization"
value={data.organization}
className={styles.field}
onChange={handleFieldChange}
/>
<Button positive disabled={dequal(cleanData, defaultData)} content={t('action.save')} />
</Form>
);
});

View file

@ -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;

View file

@ -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,

View file

@ -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 page</0> to load last data<br />and receive updates',

View file

@ -88,6 +88,8 @@ export default {
noUnreadNotifications: 'Уведомлений нет',
openBoard: 'Откройте доску',
optional_inline: 'необязательно',
organization: 'Организация',
phone: 'Телефон',
projectNotFound: 'Доска не найдена',
refreshPageToLoadLastDataAndReceiveUpdates:
'<0>Обновите страницу</0>, чтобы загрузить<br />актуальные данные и получать обновления',

View file

@ -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,