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

Initial commit

This commit is contained in:
Maksim Eltyshev 2019-08-31 04:07:25 +05:00
commit 36fe34e8e1
583 changed files with 91539 additions and 0 deletions

View file

@ -0,0 +1,60 @@
import React, { useCallback } from 'react';
import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next';
import { withPopup } from '../../../lib/popup';
import { Popup } from '../../../lib/custom-ui';
import UserItem from './UserItem';
import styles from './AddMembershipPopup.module.css';
const AddMembershipStep = React.memo(({
users, currentUserIds, onCreate, onClose,
}) => {
const [t] = useTranslation();
const handleUserSelect = useCallback(
(id) => {
onCreate({
userId: id,
});
onClose();
},
[onCreate, onClose],
);
return (
<>
<Popup.Header>
{t('common.addMember', {
context: 'title',
})}
</Popup.Header>
<Popup.Content>
<div className={styles.menu}>
{users.map((user) => (
<UserItem
key={user.id}
name={user.name}
avatar={user.avatar}
isActive={currentUserIds.includes(user.id)}
onSelect={() => handleUserSelect(user.id)}
/>
))}
</div>
</Popup.Content>
</>
);
});
AddMembershipStep.propTypes = {
/* eslint-disable react/forbid-prop-types */
users: PropTypes.array.isRequired,
currentUserIds: PropTypes.array.isRequired,
/* eslint-disable react/forbid-prop-types */
onCreate: PropTypes.func.isRequired,
onClose: PropTypes.func.isRequired,
};
export default withPopup(AddMembershipStep);

View file

@ -0,0 +1,5 @@
.menu {
border: none;
margin: -7px auto -5px;
width: 100%;
}

View file

@ -0,0 +1,38 @@
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import User from '../../User';
import styles from './UserItem.module.css';
const UserItem = React.memo(({
name, avatar, isActive, onSelect,
}) => (
<button
type="button"
disabled={isActive}
className={classNames(styles.menuItem, isActive && styles.menuItemActive)}
onClick={onSelect}
>
<span className={styles.user}>
<User name={name} avatar={avatar} />
</span>
<div className={classNames(styles.menuItemText, isActive && styles.menuItemTextActive)}>
{name}
</div>
</button>
));
UserItem.propTypes = {
name: PropTypes.string.isRequired,
avatar: PropTypes.string,
isActive: PropTypes.bool.isRequired,
onSelect: PropTypes.func.isRequired,
};
UserItem.defaultProps = {
avatar: undefined,
};
export default UserItem;

View file

@ -0,0 +1,51 @@
.menuItem {
border: none;
display: block;
margin: 0;
outline: 0;
padding: 4px;
text-align: left;
width: 100%;
}
.menuItem:hover {
background: rgba(0, 0, 0, 0.05);
}
.menuItemActive {
background: transparent;
border-width: 0;
}
.menuItemActive:hover {
background: rgba(0, 0, 0, 0.05);
}
.menuItemText {
display: inline-block;
line-height: 32px;
position: relative;
width: calc(100% - 40px);
}
.menuItemTextActive:before {
bottom: 2px;
color: #798d99;
content: "Г";
font-size: 18px;
font-weight: normal;
line-height: 36px;
position: absolute;
right: 2px;
text-align: center;
text-shadow: -1px 1px 0 rgba(0, 0, 0, 0.2);
transform: rotate(-135deg);
width: 36px;
}
.user {
display: inline-block;
line-height: 32px;
padding-right: 8px;
width: 40px;
}

View file

@ -0,0 +1,3 @@
import AddMembershipPopup from './AddMembershipPopup';
export default AddMembershipPopup;