1
0
Fork 0
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:
Jens Frost 2023-05-30 17:38:00 +02:00
parent 50c7f4a490
commit 982a196ee2
9 changed files with 115 additions and 37 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 = {

View file

@ -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" />

View file

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

View file

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