mirror of
https://github.com/plankanban/planka.git
synced 2025-08-10 16:05:35 +02:00
Fixed copying of cards from list and from card modal. Both ways of copying works.
This commit is contained in:
parent
50c7f4a490
commit
982a196ee2
9 changed files with 115 additions and 37 deletions
|
@ -84,7 +84,6 @@ const Filters = React.memo(
|
|||
onUpdate={onLabelUpdate}
|
||||
onMove={onLabelMove}
|
||||
onDelete={onLabelDelete}
|
||||
// onCopyCard={onCopyCard}
|
||||
>
|
||||
<button type="button" className={styles.filterButton}>
|
||||
<span className={styles.filterTitle}>{`${t('common.labels')}:`}</span>
|
||||
|
|
|
@ -53,6 +53,23 @@ const ActionsStep = React.memo(
|
|||
}) => {
|
||||
const [t] = useTranslation();
|
||||
const [step, openStep, handleBack] = useSteps();
|
||||
// prepare defaultPath data for copying card
|
||||
const defaultPath = {};
|
||||
defaultPath.id = card.id;
|
||||
defaultPath.boardId = card.boardId;
|
||||
defaultPath.projectId = card.projectId;
|
||||
defaultPath.listId = card.listId;
|
||||
defaultPath.cardId = card.id;
|
||||
defaultPath.name = card.name;
|
||||
defaultPath.dueDate = card.dueDate;
|
||||
defaultPath.stopwatch = card.stopwatch;
|
||||
defaultPath.labels = card.labels;
|
||||
defaultPath.boardMemberships = boardMemberships;
|
||||
defaultPath.currentLabelIds = currentLabelIds;
|
||||
defaultPath.currentUserIds = currentUserIds;
|
||||
defaultPath.tasks = card.tasks;
|
||||
defaultPath.users = card.users;
|
||||
defaultPath.description = card.description;
|
||||
|
||||
const handleEditNameClick = useCallback(() => {
|
||||
onNameEdit();
|
||||
|
@ -181,13 +198,12 @@ const ActionsStep = React.memo(
|
|||
return (
|
||||
<CardCopyStep
|
||||
projectsToLists={projectsToLists}
|
||||
defaultPath={pick(card, ['projectId', 'boardId', 'listId'])}
|
||||
defaultPath={defaultPath}
|
||||
onCopyCard={onCopyCard}
|
||||
onTransfer={onTransfer}
|
||||
onBoardFetch={onBoardFetch}
|
||||
onBack={handleBack}
|
||||
onClose={onClose}
|
||||
onConfirm={onCopyCard}
|
||||
/>
|
||||
);
|
||||
default:
|
||||
|
|
|
@ -21,6 +21,7 @@ import styles from './Card.module.scss';
|
|||
const Card = React.memo(
|
||||
({
|
||||
id,
|
||||
description,
|
||||
index,
|
||||
name,
|
||||
dueDate,
|
||||
|
@ -171,6 +172,13 @@ const Card = React.memo(
|
|||
{canEdit && (
|
||||
<ActionsPopup
|
||||
card={{
|
||||
id,
|
||||
description,
|
||||
index,
|
||||
name,
|
||||
tasks,
|
||||
labels,
|
||||
users,
|
||||
dueDate,
|
||||
stopwatch,
|
||||
boardId,
|
||||
|
@ -218,6 +226,7 @@ const Card = React.memo(
|
|||
|
||||
Card.propTypes = {
|
||||
id: PropTypes.string.isRequired,
|
||||
description: PropTypes.string,
|
||||
index: PropTypes.number.isRequired,
|
||||
name: PropTypes.string.isRequired,
|
||||
dueDate: PropTypes.instanceOf(Date),
|
||||
|
@ -259,6 +268,7 @@ Card.defaultProps = {
|
|||
dueDate: undefined,
|
||||
stopwatch: undefined,
|
||||
coverUrl: undefined,
|
||||
description: undefined,
|
||||
};
|
||||
|
||||
export default Card;
|
||||
|
|
|
@ -7,21 +7,35 @@ import { Popup } from '../../lib/custom-ui';
|
|||
import { useForm } from '../../hooks';
|
||||
|
||||
import styles from './CardCopyStep.module.scss';
|
||||
import store from '../../store';
|
||||
|
||||
const CardCopyStep = React.memo(
|
||||
({ projectsToLists, defaultPath, onBoardFetch, onBack, onClose, onCopyCard }) => {
|
||||
const [t] = useTranslation();
|
||||
// Get store to get value for description string
|
||||
const st = store.getState();
|
||||
|
||||
const keys = Object.keys(st.orm.Card.itemsById);
|
||||
if (defaultPath.description === undefined) {
|
||||
keys.forEach((key) => {
|
||||
if (key === defaultPath.id) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
defaultPath.description = st.orm.Card.itemsById[key].description;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const [path, handleFieldChange] = useForm(() => ({
|
||||
projectId: null,
|
||||
boardId: null,
|
||||
listId: null,
|
||||
name: null,
|
||||
description: null,
|
||||
tasks: [],
|
||||
attachments: [],
|
||||
labels: [],
|
||||
users: [],
|
||||
name: defaultPath.name,
|
||||
description: defaultPath.description,
|
||||
tasks: defaultPath.tasks,
|
||||
attachments: defaultPath.attachments,
|
||||
labels: defaultPath.labels,
|
||||
users: defaultPath.users,
|
||||
dueDate: defaultPath.dueDate,
|
||||
...defaultPath,
|
||||
}));
|
||||
|
||||
|
@ -144,6 +158,9 @@ const CardCopyStep = React.memo(
|
|||
);
|
||||
|
||||
CardCopyStep.propTypes = {
|
||||
id: PropTypes.string,
|
||||
// eslint-disable-next-line react/forbid-prop-types
|
||||
description: PropTypes.string,
|
||||
/* eslint-disable react/forbid-prop-types */
|
||||
projectsToLists: PropTypes.array.isRequired,
|
||||
defaultPath: PropTypes.object.isRequired,
|
||||
|
@ -158,6 +175,8 @@ CardCopyStep.propTypes = {
|
|||
|
||||
CardCopyStep.defaultProps = {
|
||||
onBack: undefined,
|
||||
description: undefined,
|
||||
id: undefined,
|
||||
};
|
||||
|
||||
export default CardCopyStep;
|
||||
|
|
|
@ -24,13 +24,14 @@ import DueDateEditStep from '../DueDateEditStep';
|
|||
import StopwatchEditStep from '../StopwatchEditStep';
|
||||
import CardMoveStep from '../CardMoveStep';
|
||||
import DeleteStep from '../DeleteStep';
|
||||
// import CardCopyStep from '../CardCopyStep';
|
||||
|
||||
import CardCopyPopup from '../CardCopyPopup';
|
||||
|
||||
import styles from './CardModal.module.scss';
|
||||
|
||||
const CardModal = React.memo(
|
||||
({
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
dueDate,
|
||||
|
@ -84,6 +85,59 @@ const CardModal = React.memo(
|
|||
}) => {
|
||||
const [t] = useTranslation();
|
||||
|
||||
const card = {};
|
||||
card.id = id;
|
||||
card.name = name;
|
||||
card.description = description;
|
||||
card.dueDate = dueDate;
|
||||
card.stopwatch = stopwatch;
|
||||
card.isSubscribed = isSubscribed;
|
||||
card.isActivitiesFetching = isActivitiesFetching;
|
||||
card.isAllActivitiesFetched = isAllActivitiesFetched;
|
||||
card.isActivitiesDetailsVisible = isActivitiesDetailsVisible;
|
||||
card.isActivitiesDetailsFetching = isActivitiesDetailsFetching;
|
||||
card.listId = listId;
|
||||
card.boardId = boardId;
|
||||
card.projectId = projectId;
|
||||
card.users = users;
|
||||
card.labels = labels;
|
||||
card.tasks = tasks;
|
||||
card.attachments = attachments;
|
||||
card.activities = activities;
|
||||
card.allProjectsToLists = allProjectsToLists;
|
||||
card.allBoardMemberships = allBoardMemberships;
|
||||
card.allLabels = allLabels;
|
||||
card.canEdit = canEdit;
|
||||
card.canEditCommentActivities = canEditCommentActivities;
|
||||
card.canEditAllCommentActivities = canEditAllCommentActivities;
|
||||
card.onUpdate = onUpdate;
|
||||
card.onMove = onMove;
|
||||
card.onTransfer = onTransfer;
|
||||
card.onDelete = onDelete;
|
||||
card.onUserAdd = onUserAdd;
|
||||
card.onUserRemove = onUserRemove;
|
||||
card.onBoardFetch = onBoardFetch;
|
||||
card.onLabelAdd = onLabelAdd;
|
||||
card.onLabelRemove = onLabelRemove;
|
||||
card.onLabelCreate = onLabelCreate;
|
||||
card.onLabelUpdate = onLabelUpdate;
|
||||
card.onLabelMove = onLabelMove;
|
||||
card.onLabelDelete = onLabelDelete;
|
||||
card.onTaskCreate = onTaskCreate;
|
||||
card.onTaskUpdate = onTaskUpdate;
|
||||
card.onTaskMove = onTaskMove;
|
||||
card.onTaskDelete = onTaskDelete;
|
||||
card.onAttachmentCreate = onAttachmentCreate;
|
||||
card.onAttachmentUpdate = onAttachmentUpdate;
|
||||
card.onAttachmentDelete = onAttachmentDelete;
|
||||
card.onActivitiesFetch = onActivitiesFetch;
|
||||
card.onActivitiesDetailsToggle = onActivitiesDetailsToggle;
|
||||
card.onCommentActivityCreate = onCommentActivityCreate;
|
||||
card.onCommentActivityUpdate = onCommentActivityUpdate;
|
||||
card.onCommentActivityDelete = onCommentActivityDelete;
|
||||
card.onClose = onClose;
|
||||
card.onCopyCard = onCopyCard;
|
||||
|
||||
const isGalleryOpened = useRef(false);
|
||||
|
||||
const handleToggleStopwatchClick = useCallback(() => {
|
||||
|
@ -532,17 +586,7 @@ const CardModal = React.memo(
|
|||
</CardMovePopup>
|
||||
<CardCopyPopup
|
||||
projectsToLists={allProjectsToLists}
|
||||
defaultPath={{
|
||||
name,
|
||||
description,
|
||||
users,
|
||||
labels,
|
||||
tasks,
|
||||
attachments,
|
||||
projectId,
|
||||
boardId,
|
||||
listId,
|
||||
}}
|
||||
defaultPath={card}
|
||||
onMove={onMove}
|
||||
onTransfer={onTransfer}
|
||||
onBoardFetch={onBoardFetch}
|
||||
|
@ -588,6 +632,7 @@ const CardModal = React.memo(
|
|||
);
|
||||
|
||||
CardModal.propTypes = {
|
||||
id: PropTypes.string,
|
||||
name: PropTypes.string.isRequired,
|
||||
description: PropTypes.string,
|
||||
dueDate: PropTypes.instanceOf(Date),
|
||||
|
@ -646,6 +691,7 @@ CardModal.defaultProps = {
|
|||
description: undefined,
|
||||
dueDate: undefined,
|
||||
stopwatch: undefined,
|
||||
id: undefined,
|
||||
};
|
||||
|
||||
export default CardModal;
|
||||
|
|
|
@ -9,18 +9,8 @@ import { useForm } from '../../hooks';
|
|||
import styles from './CardMoveStep.module.scss';
|
||||
|
||||
const CardMoveStep = React.memo(
|
||||
({
|
||||
projectsToLists,
|
||||
defaultPath,
|
||||
onMove,
|
||||
onTransfer,
|
||||
onBoardFetch,
|
||||
onBack,
|
||||
onClose,
|
||||
onCopyCard,
|
||||
}) => {
|
||||
({ projectsToLists, defaultPath, onMove, onTransfer, onBoardFetch, onBack, onClose }) => {
|
||||
const [t] = useTranslation();
|
||||
|
||||
const [path, handleFieldChange] = useForm(() => ({
|
||||
projectId: null,
|
||||
boardId: null,
|
||||
|
@ -112,7 +102,6 @@ const CardMoveStep = React.memo(
|
|||
disabled={selectedProject.boards.length === 0}
|
||||
className={styles.field}
|
||||
onChange={handleBoardIdChange}
|
||||
onCopyCard={onCopyCard}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
|
@ -137,7 +126,6 @@ const CardMoveStep = React.memo(
|
|||
disabled={selectedBoard.isFetching !== false || selectedBoard.lists.length === 0}
|
||||
className={styles.field}
|
||||
onChange={handleFieldChange}
|
||||
onCopyCard={onCopyCard}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
|
@ -163,7 +151,6 @@ CardMoveStep.propTypes = {
|
|||
onBoardFetch: PropTypes.func.isRequired,
|
||||
onBack: PropTypes.func,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
onCopyCard: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
CardMoveStep.defaultProps = {
|
||||
|
|
|
@ -12,7 +12,6 @@ import NameEdit from './NameEdit';
|
|||
import CardAdd from './CardAdd';
|
||||
import ActionsStep from './ActionsStep';
|
||||
import { ReactComponent as PlusMathIcon } from '../../assets/images/plus-math-icon.svg';
|
||||
// import CardCopyStep from '../CardCopyStep';
|
||||
|
||||
import styles from './List.module.scss';
|
||||
|
||||
|
@ -136,6 +135,7 @@ const List = React.memo(
|
|||
selectedOption={selectedOption}
|
||||
setSelectedOption={setSelectedOption}
|
||||
onCopyCard={onCopyCard}
|
||||
id={id}
|
||||
>
|
||||
<Button className={classNames(styles.headerButton, styles.target)}>
|
||||
<Icon fitted name="pencil" size="small" />
|
||||
|
|
|
@ -18,6 +18,7 @@ const mapStateToProps = (state) => {
|
|||
const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state);
|
||||
|
||||
const {
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
dueDate,
|
||||
|
@ -46,6 +47,7 @@ const mapStateToProps = (state) => {
|
|||
}
|
||||
|
||||
return {
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
dueDate,
|
||||
|
|
|
@ -36,7 +36,6 @@ const mapDispatchToProps = (dispatch, { id }) =>
|
|||
onDelete: () => entryActions.deleteList(id),
|
||||
onCardCreate: (data, autoOpen) => entryActions.createCard(id, data, autoOpen),
|
||||
onSort: (data) => entryActions.sortList(id, data),
|
||||
onCardCopy: (data, autoOpen) => entryActions.copyCard(id, data, autoOpen),
|
||||
},
|
||||
dispatch,
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue