mirror of
https://github.com/plankanban/planka.git
synced 2025-07-18 20:59:44 +02:00
Small UI improvements, update dependencies
This commit is contained in:
parent
3b9241e298
commit
9e99b89907
17 changed files with 99 additions and 103 deletions
6
client/package-lock.json
generated
6
client/package-lock.json
generated
|
@ -4197,9 +4197,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"date-fns": {
|
"date-fns": {
|
||||||
"version": "2.4.1",
|
"version": "2.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.5.0.tgz",
|
||||||
"integrity": "sha512-2RhmH/sjDSCYW2F3ZQxOUx/I7PvzXpi89aQL2d3OAxSTwLx6NilATeUbe0menFE3Lu5lFkOFci36ivimwYHHxw=="
|
"integrity": "sha512-I6Tkis01//nRcmvMQw/MRE1HAtcuA5Ie6jGPb8bJZJub7494LGOObqkV3ParnsSVviAjk5C8mNKDqYVBzCopWg=="
|
||||||
},
|
},
|
||||||
"date-now": {
|
"date-now": {
|
||||||
"version": "0.1.4",
|
"version": "0.1.4",
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"axios": "^0.19.0",
|
"axios": "^0.19.0",
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
"connected-react-router": "^6.5.2",
|
"connected-react-router": "^6.5.2",
|
||||||
"date-fns": "^2.4.1",
|
"date-fns": "^2.5.0",
|
||||||
"dequal": "^1.0.0",
|
"dequal": "^1.0.0",
|
||||||
"history": "^4.10.1",
|
"history": "^4.10.1",
|
||||||
"i18next": "^17.2.0",
|
"i18next": "^17.2.0",
|
||||||
|
|
|
@ -78,6 +78,7 @@ const EditStep = React.memo(({
|
||||||
</Popup.Header>
|
</Popup.Header>
|
||||||
<Popup.Content>
|
<Popup.Content>
|
||||||
<Form onSubmit={handleSubmit}>
|
<Form onSubmit={handleSubmit}>
|
||||||
|
<div className={styles.text}>{t('common.title')}</div>
|
||||||
<Input
|
<Input
|
||||||
fluid
|
fluid
|
||||||
ref={nameField}
|
ref={nameField}
|
||||||
|
|
|
@ -8,3 +8,10 @@
|
||||||
.field {
|
.field {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
color: #444444;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
|
@ -105,13 +105,7 @@ const CardModal = React.memo(
|
||||||
const labelIds = labels.map((label) => label.id);
|
const labelIds = labels.map((label) => label.id);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal open closeIcon size="small" centered={false} onClose={onClose}>
|
||||||
open
|
|
||||||
closeIcon
|
|
||||||
size="small"
|
|
||||||
centered={false}
|
|
||||||
onClose={onClose}
|
|
||||||
>
|
|
||||||
<Grid className={styles.grid}>
|
<Grid className={styles.grid}>
|
||||||
<Grid.Row className={styles.headerPadding}>
|
<Grid.Row className={styles.headerPadding}>
|
||||||
<Grid.Column width={16} className={styles.headerPadding}>
|
<Grid.Column width={16} className={styles.headerPadding}>
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { Icon, Menu } from 'semantic-ui-react';
|
import { Icon, Menu } from 'semantic-ui-react';
|
||||||
|
|
||||||
|
@ -20,46 +19,40 @@ const Header = React.memo(
|
||||||
onNotificationDelete,
|
onNotificationDelete,
|
||||||
onUsers,
|
onUsers,
|
||||||
onLogout,
|
onLogout,
|
||||||
}) => {
|
}) => (
|
||||||
const [t] = useTranslation();
|
<div className={styles.wrapper}>
|
||||||
|
<Link to={Paths.ROOT} className={styles.logo}>
|
||||||
return (
|
Planka
|
||||||
<div className={styles.wrapper}>
|
</Link>
|
||||||
<Link to={Paths.ROOT} className={styles.logo}>
|
<Menu inverted size="large" className={styles.menu}>
|
||||||
Planka
|
<Menu.Menu position="right">
|
||||||
</Link>
|
|
||||||
<Menu inverted size="large" className={styles.menu}>
|
|
||||||
{isEditable && (
|
{isEditable && (
|
||||||
<Menu.Item className={styles.item} onClick={onUsers}>
|
<Menu.Item className={styles.item} onClick={onUsers}>
|
||||||
{t('common.users', {
|
<Icon fitted name="users" />
|
||||||
context: 'title',
|
|
||||||
})}
|
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
)}
|
)}
|
||||||
<Menu.Menu position="right">
|
<NotificationsPopup items={notifications} onDelete={onNotificationDelete}>
|
||||||
<NotificationsPopup items={notifications} onDelete={onNotificationDelete}>
|
<Menu.Item className={styles.item}>
|
||||||
<Menu.Item className={styles.item}>
|
<Icon fitted name="bell" />
|
||||||
<Icon name="bell" className={styles.icon} />
|
{notifications.length > 0 && (
|
||||||
{notifications.length > 0 && (
|
<span className={styles.notification}>{notifications.length}</span>
|
||||||
<span className={styles.notification}>{notifications.length}</span>
|
)}
|
||||||
)}
|
</Menu.Item>
|
||||||
</Menu.Item>
|
</NotificationsPopup>
|
||||||
</NotificationsPopup>
|
<UserPopup
|
||||||
<UserPopup
|
name={user.name}
|
||||||
name={user.name}
|
avatar={user.avatar}
|
||||||
avatar={user.avatar}
|
isAvatarUploading={user.isAvatarUploading}
|
||||||
isAvatarUploading={user.isAvatarUploading}
|
onUpdate={onUserUpdate}
|
||||||
onUpdate={onUserUpdate}
|
onAvatarUpload={onUserAvatarUpload}
|
||||||
onAvatarUpload={onUserAvatarUpload}
|
onLogout={onLogout}
|
||||||
onLogout={onLogout}
|
>
|
||||||
>
|
<Menu.Item className={styles.item}>{user.name}</Menu.Item>
|
||||||
<Menu.Item className={styles.item}>{user.name}</Menu.Item>
|
</UserPopup>
|
||||||
</UserPopup>
|
</Menu.Menu>
|
||||||
</Menu.Menu>
|
</Menu>
|
||||||
</Menu>
|
</div>
|
||||||
</div>
|
),
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
|
||||||
Header.propTypes = {
|
Header.propTypes = {
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
.icon {
|
|
||||||
margin: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item:before {
|
.item:before {
|
||||||
background: none !important;
|
background: none !important;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ const EditNameStep = React.memo(({
|
||||||
</Popup.Header>
|
</Popup.Header>
|
||||||
<Popup.Content>
|
<Popup.Content>
|
||||||
<Form onSubmit={handleSubmit}>
|
<Form onSubmit={handleSubmit}>
|
||||||
|
<div className={styles.text}>{t('common.name')}</div>
|
||||||
<Input
|
<Input
|
||||||
fluid
|
fluid
|
||||||
ref={field}
|
ref={field}
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
.field {
|
.field {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
color: #444444;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
|
@ -78,6 +78,7 @@ const EditStep = React.memo(({
|
||||||
</Popup.Header>
|
</Popup.Header>
|
||||||
<Popup.Content>
|
<Popup.Content>
|
||||||
<Form onSubmit={handleSubmit}>
|
<Form onSubmit={handleSubmit}>
|
||||||
|
<div className={styles.text}>{t('common.title')}</div>
|
||||||
<Input
|
<Input
|
||||||
fluid
|
fluid
|
||||||
ref={nameField}
|
ref={nameField}
|
||||||
|
|
|
@ -8,3 +8,10 @@
|
||||||
.field {
|
.field {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
color: #444444;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
|
@ -33,15 +33,19 @@ const Project = React.memo(
|
||||||
<Grid className={styles.header}>
|
<Grid className={styles.header}>
|
||||||
<Grid.Row>
|
<Grid.Row>
|
||||||
<Grid.Column>
|
<Grid.Column>
|
||||||
<EditPopup
|
{isEditable ? (
|
||||||
defaultData={{
|
<EditPopup
|
||||||
name,
|
defaultData={{
|
||||||
}}
|
name,
|
||||||
onUpdate={onUpdate}
|
}}
|
||||||
onDelete={onDelete}
|
onUpdate={onUpdate}
|
||||||
>
|
onDelete={onDelete}
|
||||||
<Button content={name} disabled={!isEditable} className={styles.name} />
|
>
|
||||||
</EditPopup>
|
<Button content={name} disabled={!isEditable} className={styles.name} />
|
||||||
|
</EditPopup>
|
||||||
|
) : (
|
||||||
|
<span className={styles.name}>{name}</span>
|
||||||
|
)}
|
||||||
<span className={styles.users}>
|
<span className={styles.users}>
|
||||||
{memberships.map((membership) => (
|
{memberships.map((membership) => (
|
||||||
<span key={membership.id} className={styles.user}>
|
<span key={membership.id} className={styles.user}>
|
||||||
|
|
|
@ -22,9 +22,11 @@
|
||||||
.name {
|
.name {
|
||||||
background: transparent !important;
|
background: transparent !important;
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
|
display: inline-block !important;
|
||||||
font-size: 32px !important;
|
font-size: 32px !important;
|
||||||
font-weight: bold !important;
|
font-weight: bold !important;
|
||||||
line-height: 36px !important;
|
line-height: 36px !important;
|
||||||
|
margin-right: 8px !important;
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,12 @@ import React, { useCallback } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import {
|
import {
|
||||||
Button, Header, Modal, Table,
|
Button, Modal, Table,
|
||||||
} from 'semantic-ui-react';
|
} from 'semantic-ui-react';
|
||||||
|
|
||||||
import AddUserPopupContainer from '../../containers/AddUserPopupContainer';
|
import AddUserPopupContainer from '../../containers/AddUserPopupContainer';
|
||||||
import Item from './Item';
|
import Item from './Item';
|
||||||
|
|
||||||
import styles from './UsersModal.module.css';
|
|
||||||
|
|
||||||
const UsersModal = React.memo(({
|
const UsersModal = React.memo(({
|
||||||
items, onUpdate, onDelete, onClose,
|
items, onUpdate, onDelete, onClose,
|
||||||
}) => {
|
}) => {
|
||||||
|
@ -30,13 +28,13 @@ const UsersModal = React.memo(({
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal open closeIcon size="large" onClose={onClose}>
|
<Modal open closeIcon size="large" centered={false} onClose={onClose}>
|
||||||
|
<Modal.Header>
|
||||||
|
{t('common.users', {
|
||||||
|
context: 'title',
|
||||||
|
})}
|
||||||
|
</Modal.Header>
|
||||||
<Modal.Content>
|
<Modal.Content>
|
||||||
<Header size="huge" className={styles.title}>
|
|
||||||
{t('common.users', {
|
|
||||||
context: 'title',
|
|
||||||
})}
|
|
||||||
</Header>
|
|
||||||
<Table basic="very">
|
<Table basic="very">
|
||||||
<Table.Header>
|
<Table.Header>
|
||||||
<Table.Row>
|
<Table.Row>
|
||||||
|
@ -58,17 +56,13 @@ const UsersModal = React.memo(({
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</Table.Body>
|
</Table.Body>
|
||||||
<Table.Footer>
|
|
||||||
<Table.Row>
|
|
||||||
<Table.HeaderCell colSpan="4">
|
|
||||||
<AddUserPopupContainer>
|
|
||||||
<Button positive content={t('action.addUser')} className={styles.button} />
|
|
||||||
</AddUserPopupContainer>
|
|
||||||
</Table.HeaderCell>
|
|
||||||
</Table.Row>
|
|
||||||
</Table.Footer>
|
|
||||||
</Table>
|
</Table>
|
||||||
</Modal.Content>
|
</Modal.Content>
|
||||||
|
<Modal.Actions>
|
||||||
|
<AddUserPopupContainer>
|
||||||
|
<Button positive content={t('action.addUser')} />
|
||||||
|
</AddUserPopupContainer>
|
||||||
|
</Modal.Actions>
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
.button {
|
|
||||||
float: right;
|
|
||||||
height: 32px;
|
|
||||||
line-height: 20px;
|
|
||||||
margin-top: -2px;
|
|
||||||
padding: 6px 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
22
server/package-lock.json
generated
22
server/package-lock.json
generated
|
@ -1186,9 +1186,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dotenv": {
|
"dotenv": {
|
||||||
"version": "8.1.0",
|
"version": "8.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
|
||||||
"integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA=="
|
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
|
||||||
},
|
},
|
||||||
"dotenv-cli": {
|
"dotenv-cli": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
|
@ -4125,18 +4125,18 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nodemon": {
|
"nodemon": {
|
||||||
"version": "1.19.3",
|
"version": "1.19.4",
|
||||||
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.3.tgz",
|
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz",
|
||||||
"integrity": "sha512-TBNKRmJykEbxpTniZBusqRrUTHIEqa2fpecbTQDQj1Gxjth7kKAPP296ztR0o5gPUWsiYbuEbt73/+XMYab1+w==",
|
"integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"chokidar": "^2.1.5",
|
"chokidar": "^2.1.8",
|
||||||
"debug": "^3.1.0",
|
"debug": "^3.2.6",
|
||||||
"ignore-by-default": "^1.0.1",
|
"ignore-by-default": "^1.0.1",
|
||||||
"minimatch": "^3.0.4",
|
"minimatch": "^3.0.4",
|
||||||
"pstree.remy": "^1.1.6",
|
"pstree.remy": "^1.1.7",
|
||||||
"semver": "^5.5.0",
|
"semver": "^5.7.1",
|
||||||
"supports-color": "^5.2.0",
|
"supports-color": "^5.5.0",
|
||||||
"touch": "^3.1.0",
|
"touch": "^3.1.0",
|
||||||
"undefsafe": "^2.0.2",
|
"undefsafe": "^2.0.2",
|
||||||
"update-notifier": "^2.5.0"
|
"update-notifier": "^2.5.0"
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bcrypt": "^3.0.6",
|
"bcrypt": "^3.0.6",
|
||||||
"dotenv": "^8.1.0",
|
"dotenv": "^8.2.0",
|
||||||
"dotenv-cli": "^3.0.0",
|
"dotenv-cli": "^3.0.0",
|
||||||
"jsonwebtoken": "^8.5.1",
|
"jsonwebtoken": "^8.5.1",
|
||||||
"knex": "^0.19.5",
|
"knex": "^0.19.5",
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "5.16.0",
|
"eslint": "5.16.0",
|
||||||
"nodemon": "^1.19.3"
|
"nodemon": "^1.19.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.10"
|
"node": "^12.10"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue