diff --git a/client/src/components/cards/CardModal/MoreActionsStep.jsx b/client/src/components/cards/CardModal/MoreActionsStep.jsx new file mode 100644 index 00000000..099815d3 --- /dev/null +++ b/client/src/components/cards/CardModal/MoreActionsStep.jsx @@ -0,0 +1,153 @@ +/*! + * Copyright (c) 2024 PLANKA Software GmbH + * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md + */ + +import React, { useCallback, useMemo } from 'react'; +import PropTypes from 'prop-types'; +import { shallowEqual, useDispatch, useSelector } from 'react-redux'; +import { useTranslation } from 'react-i18next'; +import { Icon, Menu } from 'semantic-ui-react'; +import { Popup } from '../../../lib/custom-ui'; + +import selectors from '../../../selectors'; +import entryActions from '../../../entry-actions'; +import { useSteps } from '../../../hooks'; +import { isListArchiveOrTrash } from '../../../utils/record-helpers'; +import { BoardMembershipRoles } from '../../../constants/Enums'; +import SelectCardTypeStep from '../SelectCardTypeStep'; +import MoveCardStep from '../MoveCardStep'; + +import styles from './MoreActionsStep.module.scss'; + +const StepTypes = { + EDIT_TYPE: 'EDIT_TYPE', + MOVE: 'MOVE', +}; + +const MoreActionsStep = React.memo(({ onClose }) => { + const selectListById = useMemo(() => selectors.makeSelectListById(), []); + + const card = useSelector(selectors.selectCurrentCard); + const board = useSelector(selectors.selectCurrentBoard); + + const { canEditType, canDuplicate, canMove } = useSelector((state) => { + const list = selectListById(state, card.listId); + + if (isListArchiveOrTrash(list)) { + return { + canEditType: false, + canDuplicate: false, + canMove: false, + }; + } + + const boardMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state); + const isEditor = !!boardMembership && boardMembership.role === BoardMembershipRoles.EDITOR; + + return { + canEditType: isEditor, + canDuplicate: isEditor, + canMove: isEditor, + }; + }, shallowEqual); + + const dispatch = useDispatch(); + const [t] = useTranslation(); + const [step, openStep, handleBack] = useSteps(); + + const handleTypeSelect = useCallback( + (type) => { + dispatch( + entryActions.updateCurrentCard({ + type, + }), + ); + }, + [dispatch], + ); + + const handleDuplicateClick = useCallback(() => { + dispatch( + entryActions.duplicateCurrentCard({ + name: `${card.name} (${t('common.copy', { + context: 'inline', + })})`, + }), + ); + + onClose(); + }, [onClose, card.name, dispatch, t]); + + const handleEditTypeClick = useCallback(() => { + openStep(StepTypes.EDIT_TYPE); + }, [openStep]); + + const handleMoveClick = useCallback(() => { + openStep(StepTypes.MOVE); + }, [openStep]); + + if (step) { + switch (step.type) { + case StepTypes.EDIT_TYPE: + return ( + + ); + case StepTypes.MOVE: + return ; + default: + } + } + + return ( + <> + + {t('common.moreActions', { + context: 'title', + })} + + + + {!board.limitCardTypesToDefaultOne && canEditType && ( + + + {t('action.editType', { + context: 'title', + })} + + )} + {canDuplicate && ( + + + {t('action.duplicateCard', { + context: 'title', + })} + + )} + {canMove && ( + + + {t('action.moveCard', { + context: 'title', + })} + + )} + + + + ); +}); + +MoreActionsStep.propTypes = { + onClose: PropTypes.func.isRequired, +}; + +export default MoreActionsStep; diff --git a/client/src/components/cards/CardModal/MoreActionsStep.module.scss b/client/src/components/cards/CardModal/MoreActionsStep.module.scss new file mode 100644 index 00000000..6c554199 --- /dev/null +++ b/client/src/components/cards/CardModal/MoreActionsStep.module.scss @@ -0,0 +1,21 @@ +/*! + * Copyright (c) 2024 PLANKA Software GmbH + * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md + */ + +:global(#app) { + .menu { + margin: -7px -12px -5px; + width: calc(100% + 24px); + } + + .menuItem { + margin: 0; + padding-left: 14px; + } + + .menuItemIcon { + float: left; + margin: 0 0.5em 0 0; + } +} diff --git a/client/src/components/cards/CardModal/ProjectContent.jsx b/client/src/components/cards/CardModal/ProjectContent.jsx index 158e5671..1fd7024e 100644 --- a/client/src/components/cards/CardModal/ProjectContent.jsx +++ b/client/src/components/cards/CardModal/ProjectContent.jsx @@ -4,7 +4,6 @@ */ import React, { useCallback, useContext, useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; @@ -24,12 +23,11 @@ import TaskLists from './TaskLists'; import CustomFieldGroups from './CustomFieldGroups'; import Communication from './Communication'; import CreationDetailsStep from './CreationDetailsStep'; +import MoreActionsStep from './MoreActionsStep'; import DueDateChip from '../DueDateChip'; import StopwatchChip from '../StopwatchChip'; -import SelectCardTypeStep from '../SelectCardTypeStep'; import EditDueDateStep from '../EditDueDateStep'; import EditStopwatchStep from '../EditStopwatchStep'; -import MoveCardStep from '../MoveCardStep'; import ExpandableMarkdown from '../../common/ExpandableMarkdown'; import EditMarkdown from '../../common/EditMarkdown'; import ConfirmationStep from '../../common/ConfirmationStep'; @@ -45,7 +43,7 @@ import AddCustomFieldGroupStep from '../../custom-field-groups/AddCustomFieldGro import styles from './ProjectContent.module.scss'; -const ProjectContent = React.memo(({ onClose }) => { +const ProjectContent = React.memo(() => { const selectListById = useMemo(() => selectors.makeSelectListById(), []); const selectPrevListById = useMemo(() => selectors.makeSelectListById(), []); @@ -155,17 +153,6 @@ const ProjectContent = React.memo(({ onClose }) => { [dispatch], ); - const handleTypeSelect = useCallback( - (type) => { - dispatch( - entryActions.updateCurrentCard({ - type, - }), - ); - }, - [dispatch], - ); - const handleNameUpdate = useCallback( (name) => { dispatch( @@ -198,18 +185,6 @@ const ProjectContent = React.memo(({ onClose }) => { ); }, [card.stopwatch, dispatch]); - const handleDuplicateClick = useCallback(() => { - dispatch( - entryActions.duplicateCurrentCard({ - name: `${card.name} (${t('common.copy', { - context: 'inline', - })})`, - }), - ); - - onClose(); - }, [onClose, card.name, dispatch, t]); - const handleRestoreClick = useCallback(() => { dispatch(entryActions.moveCurrentCard(card.prevListId, undefined, true)); }, [card.prevListId, dispatch]); @@ -304,13 +279,12 @@ const ProjectContent = React.memo(({ onClose }) => { const BoardMembershipsPopup = usePopupInClosableContext(BoardMembershipsStep); const LabelsPopup = usePopupInClosableContext(LabelsStep); const ListsPopup = usePopupInClosableContext(ListsStep); - const SelectCardTypePopup = usePopupInClosableContext(SelectCardTypeStep); const EditDueDatePopup = usePopupInClosableContext(EditDueDateStep); const EditStopwatchPopup = usePopupInClosableContext(EditStopwatchStep); const AddTaskListPopup = usePopupInClosableContext(AddTaskListStep); const AddAttachmentPopup = usePopupInClosableContext(AddAttachmentStep); const AddCustomFieldGroupPopup = usePopupInClosableContext(AddCustomFieldGroupStep); - const MoveCardPopup = usePopupInClosableContext(MoveCardStep); + const MoreActionsPopup = usePopupInClosableContext(MoreActionsStep); const ConfirmationPopup = usePopupInClosableContext(ConfirmationStep); return ( @@ -706,40 +680,6 @@ const ProjectContent = React.memo(({ onClose }) => { )} )} - {!board.limitCardTypesToDefaultOne && canEditType && ( - - - - )} - {canDuplicate && ( - - )} - {canMove && ( - - - - )} {canRestore && (isInArchiveList || isInTrashList) && ( )} + {((!board.limitCardTypesToDefaultOne && canEditType) || + canDuplicate || + canMove) && ( + + + + )} )} @@ -798,8 +748,4 @@ const ProjectContent = React.memo(({ onClose }) => { ); }); -ProjectContent.propTypes = { - onClose: PropTypes.func.isRequired, -}; - export default ProjectContent; diff --git a/client/src/components/cards/CardModal/ProjectContent.module.scss b/client/src/components/cards/CardModal/ProjectContent.module.scss index 6fbc75eb..63d442b9 100644 --- a/client/src/components/cards/CardModal/ProjectContent.module.scss +++ b/client/src/components/cards/CardModal/ProjectContent.module.scss @@ -260,6 +260,28 @@ position: relative; } + .moreActionsButton { + background: transparent; + box-shadow: none; + color: #6b808c; + font-weight: normal; + margin-top: 8px; + padding: 6px 8px 6px 18px; + text-align: left; + text-decoration: underline; + transition: none; + + &:hover { + background: rgba(9, 30, 66, 0.08); + color: #092d42; + } + } + + .moreActionsButtonIcon { + margin-right: 8px; + text-decoration: none; + } + .sidebarPadding { padding: 8px 16px 8px 8px; diff --git a/client/src/components/cards/CardModal/StoryContent/StoryContent.jsx b/client/src/components/cards/CardModal/StoryContent/StoryContent.jsx index 50f84d6d..1665c588 100644 --- a/client/src/components/cards/CardModal/StoryContent/StoryContent.jsx +++ b/client/src/components/cards/CardModal/StoryContent/StoryContent.jsx @@ -4,7 +4,6 @@ */ import React, { useCallback, useContext, useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; @@ -24,8 +23,7 @@ import NameField from '../NameField'; import CustomFieldGroups from '../CustomFieldGroups'; import Communication from '../Communication'; import CreationDetailsStep from '../CreationDetailsStep'; -import SelectCardTypeStep from '../../SelectCardTypeStep'; -import MoveCardStep from '../../MoveCardStep'; +import MoreActionsStep from '../MoreActionsStep'; import Markdown from '../../../common/Markdown'; import EditMarkdown from '../../../common/EditMarkdown'; import ConfirmationStep from '../../../common/ConfirmationStep'; @@ -40,7 +38,7 @@ import AddCustomFieldGroupStep from '../../../custom-field-groups/AddCustomField import styles from './StoryContent.module.scss'; -const StoryContent = React.memo(({ onClose }) => { +const StoryContent = React.memo(() => { const selectListById = useMemo(() => selectors.makeSelectListById(), []); const selectPrevListById = useMemo(() => selectors.makeSelectListById(), []); const selectAttachmentById = useMemo(() => selectors.makeSelectAttachmentById(), []); @@ -150,17 +148,6 @@ const StoryContent = React.memo(({ onClose }) => { [dispatch], ); - const handleTypeSelect = useCallback( - (type) => { - dispatch( - entryActions.updateCurrentCard({ - type, - }), - ); - }, - [dispatch], - ); - const handleNameUpdate = useCallback( (name) => { dispatch( @@ -183,18 +170,6 @@ const StoryContent = React.memo(({ onClose }) => { [dispatch], ); - const handleDuplicateClick = useCallback(() => { - dispatch( - entryActions.duplicateCurrentCard({ - name: `${card.name} (${t('common.copy', { - context: 'inline', - })})`, - }), - ); - - onClose(); - }, [onClose, card.name, dispatch, t]); - const handleRestoreClick = useCallback(() => { dispatch(entryActions.moveCurrentCard(card.prevListId, undefined, true)); }, [card.prevListId, dispatch]); @@ -300,10 +275,9 @@ const StoryContent = React.memo(({ onClose }) => { const BoardMembershipsPopup = usePopupInClosableContext(BoardMembershipsStep); const LabelsPopup = usePopupInClosableContext(LabelsStep); const ListsPopup = usePopupInClosableContext(ListsStep); - const SelectCardTypePopup = usePopupInClosableContext(SelectCardTypeStep); const AddAttachmentPopup = usePopupInClosableContext(AddAttachmentStep); const AddCustomFieldGroupPopup = usePopupInClosableContext(AddCustomFieldGroupStep); - const MoveCardPopup = usePopupInClosableContext(MoveCardStep); + const MoreActionsPopup = usePopupInClosableContext(MoreActionsStep); const ConfirmationPopup = usePopupInClosableContext(ConfirmationStep); return ( @@ -614,40 +588,6 @@ const StoryContent = React.memo(({ onClose }) => { )} )} - {!board.limitCardTypesToDefaultOne && canEditType && ( - - - - )} - {canDuplicate && ( - - )} - {canMove && ( - - - - )} {canRestore && (isInArchiveList || isInTrashList) && ( )} + {((!board.limitCardTypesToDefaultOne && canEditType) || + canDuplicate || + canMove) && ( + + + + )} )} @@ -706,8 +656,4 @@ const StoryContent = React.memo(({ onClose }) => { ); }); -StoryContent.propTypes = { - onClose: PropTypes.func.isRequired, -}; - export default StoryContent; diff --git a/client/src/components/cards/CardModal/StoryContent/StoryContent.module.scss b/client/src/components/cards/CardModal/StoryContent/StoryContent.module.scss index be0685aa..4aed88f1 100644 --- a/client/src/components/cards/CardModal/StoryContent/StoryContent.module.scss +++ b/client/src/components/cards/CardModal/StoryContent/StoryContent.module.scss @@ -286,6 +286,28 @@ margin-bottom: 20px; } + .moreActionsButton { + background: transparent; + box-shadow: none; + color: #6b808c; + font-weight: normal; + margin-top: 8px; + padding: 6px 8px 6px 18px; + text-align: left; + text-decoration: underline; + transition: none; + + &:hover { + background: rgba(9, 30, 66, 0.08); + color: #092d42; + } + } + + .moreActionsButtonIcon { + margin-right: 8px; + text-decoration: none; + } + .sidebarPadding { padding: 8px 16px 8px 8px; diff --git a/client/src/locales/ar-YE/core.js b/client/src/locales/ar-YE/core.js index 560742a3..6093be56 100644 --- a/client/src/locales/ar-YE/core.js +++ b/client/src/locales/ar-YE/core.js @@ -197,7 +197,6 @@ export default { deleteTask: 'حذف المهمة', deleteTask_title: 'حذف المهمة', deleteUser: 'حذف المستخدم', - duplicate: 'تكرار', duplicateCard_title: 'تكرار البطاقة', edit: 'تعديل', editDescription_title: 'تعديل الوصف', diff --git a/client/src/locales/bg-BG/core.js b/client/src/locales/bg-BG/core.js index 1b23293a..69479283 100644 --- a/client/src/locales/bg-BG/core.js +++ b/client/src/locales/bg-BG/core.js @@ -202,7 +202,6 @@ export default { deleteTask: 'Изтриване на задача', deleteTask_title: 'Изтриване на задача', deleteUser: 'Изтриване на потребител', - duplicate: 'Направи дубликат', duplicateCard_title: 'Дублирана карта', edit: 'Редактиране', editDescription_title: 'Редактиране на описание', diff --git a/client/src/locales/cs-CZ/core.js b/client/src/locales/cs-CZ/core.js index 4461ac75..43421b00 100644 --- a/client/src/locales/cs-CZ/core.js +++ b/client/src/locales/cs-CZ/core.js @@ -354,7 +354,6 @@ export default { deleteUser: 'Smazat uživatele', deleteUser_title: 'Smazat uživatele', dismissAll: 'Vše přečteno', - duplicate: 'Duplikovat', duplicateCard_title: 'Duplikovat kartu', edit: 'Upravit', editColor_title: 'Upravit barvu', diff --git a/client/src/locales/da-DK/core.js b/client/src/locales/da-DK/core.js index 3e7c5c2c..0bbbe38c 100644 --- a/client/src/locales/da-DK/core.js +++ b/client/src/locales/da-DK/core.js @@ -382,7 +382,6 @@ export default { deleteUser: 'Slet bruger', deleteUser_title: 'Slet bruger', dismissAll: 'Afvis alle', - duplicate: 'Duplikér', duplicateCard_title: 'Duplikér kort', edit: 'Rediger', editColor_title: 'Rediger farve', diff --git a/client/src/locales/de-DE/core.js b/client/src/locales/de-DE/core.js index 43bf1cd5..34c1f56b 100644 --- a/client/src/locales/de-DE/core.js +++ b/client/src/locales/de-DE/core.js @@ -371,7 +371,6 @@ export default { deleteUser: 'Benutzer löschen', deleteUser_title: 'Benutzer löschen', dismissAll: 'Alle verwerfen', - duplicate: 'Duplizieren', duplicateCard_title: 'Karte duplizieren', edit: 'Bearbeiten', editColor_title: 'Farbe bearbeiten', diff --git a/client/src/locales/el-GR/core.js b/client/src/locales/el-GR/core.js index 58e45276..dfbd0dae 100644 --- a/client/src/locales/el-GR/core.js +++ b/client/src/locales/el-GR/core.js @@ -398,7 +398,6 @@ export default { deleteUser: 'Διαγραφή χρήστη', deleteUser_title: 'Διαγραφή χρήστη', dismissAll: 'Απόρριψη όλων', - duplicate: 'Διπλασιασμός', duplicateCard_title: 'Διπλασιασμός κάρτας', edit: 'Επεξεργασία', editColor_title: 'Επεξεργασία χρώματος', diff --git a/client/src/locales/en-GB/core.js b/client/src/locales/en-GB/core.js index 7564578b..f7b19de1 100644 --- a/client/src/locales/en-GB/core.js +++ b/client/src/locales/en-GB/core.js @@ -216,6 +216,8 @@ export default { memberActions_title: 'Member Actions', members: 'Members', minutes: 'Minutes', + moreActions: 'More actions', + moreActions_title: 'More Actions', moveCard_title: 'Move Card', myOwn_title: 'My Own', name: 'Name', @@ -391,7 +393,6 @@ export default { deleteUser_title: 'Delete User', deleteWebhook: 'Delete webhook', dismissAll: 'Dismiss all', - duplicate: 'Duplicate', duplicateCard_title: 'Duplicate Card', edit: 'Edit', editColor_title: 'Edit Color', diff --git a/client/src/locales/en-US/core.js b/client/src/locales/en-US/core.js index fb804d73..c8189b4a 100644 --- a/client/src/locales/en-US/core.js +++ b/client/src/locales/en-US/core.js @@ -211,6 +211,8 @@ export default { memberActions_title: 'Member Actions', members: 'Members', minutes: 'Minutes', + moreActions: 'More actions', + moreActions_title: 'More Actions', moveCard_title: 'Move Card', myOwn_title: 'My Own', name: 'Name', @@ -386,7 +388,6 @@ export default { deleteUser_title: 'Delete User', deleteWebhook: 'Delete webhook', dismissAll: 'Dismiss all', - duplicate: 'Duplicate', duplicateCard_title: 'Duplicate Card', edit: 'Edit', editColor_title: 'Edit Color', diff --git a/client/src/locales/es-ES/core.js b/client/src/locales/es-ES/core.js index 84206466..773c77ff 100644 --- a/client/src/locales/es-ES/core.js +++ b/client/src/locales/es-ES/core.js @@ -374,7 +374,6 @@ export default { deleteUser: 'Borrar usuario', deleteUser_title: 'Borrar Usuario', dismissAll: 'Descartar todo', - duplicate: 'Duplicar', duplicateCard_title: 'Duplicar tarjeta', edit: 'Editar', editColor_title: 'Editar color', diff --git a/client/src/locales/et-EE/core.js b/client/src/locales/et-EE/core.js index 9d05bd5c..bc8f359a 100644 --- a/client/src/locales/et-EE/core.js +++ b/client/src/locales/et-EE/core.js @@ -380,7 +380,6 @@ export default { deleteUser: 'Kustuta kasutaja', deleteUser_title: 'Kustuta kasutaja', dismissAll: 'Eemalda kõik', - duplicate: 'Dubleeri', duplicateCard_title: 'Duplikaardi loomine', edit: 'Muuda', editColor_title: 'Muuda värvi', diff --git a/client/src/locales/fa-IR/core.js b/client/src/locales/fa-IR/core.js index f01aa0cf..313046fe 100644 --- a/client/src/locales/fa-IR/core.js +++ b/client/src/locales/fa-IR/core.js @@ -199,7 +199,6 @@ export default { deleteTask: 'حذف وظیفه', deleteTask_title: 'حذف وظیفه', deleteUser: 'حذف کاربر', - duplicate: 'تکرار', duplicateCard_title: 'تکرار کارت', edit: 'ویرایش', editDescription_title: 'ویرایش توضیحات', diff --git a/client/src/locales/fi-FI/core.js b/client/src/locales/fi-FI/core.js index 945ce70a..5b6d00d9 100644 --- a/client/src/locales/fi-FI/core.js +++ b/client/src/locales/fi-FI/core.js @@ -380,7 +380,6 @@ export default { deleteUser: 'Poista käyttäjä', deleteUser_title: 'Poista käyttäjä', dismissAll: 'Sulje kaikki', - duplicate: 'Monista', duplicateCard_title: 'Monista kortti', edit: 'Muokkaa', editColor_title: 'Muokkaa väriä', diff --git a/client/src/locales/fr-FR/core.js b/client/src/locales/fr-FR/core.js index a88c67b0..9d0fd0d1 100644 --- a/client/src/locales/fr-FR/core.js +++ b/client/src/locales/fr-FR/core.js @@ -393,7 +393,6 @@ export default { deleteUser_title: 'Supprimer l’utilisateur', deleteWebhook: 'Supprimer le webhook', dismissAll: 'Tout rejeter', - duplicate: 'Dupliquer', duplicateCard_title: 'Dupliquer la carte', edit: 'Modifier', editColor_title: 'Modifier la couleur', diff --git a/client/src/locales/hu-HU/core.js b/client/src/locales/hu-HU/core.js index fb5a778f..21c29d06 100644 --- a/client/src/locales/hu-HU/core.js +++ b/client/src/locales/hu-HU/core.js @@ -200,7 +200,6 @@ export default { deleteTask: 'Feladat törlése', deleteTask_title: 'Feladat törlése', deleteUser: 'Felhasználó törlése', - duplicate: 'Másolás', duplicateCard_title: 'Kártya másolása', edit: 'Szerkesztés', editDescription_title: 'Leírás szerkesztése', diff --git a/client/src/locales/it-IT/core.js b/client/src/locales/it-IT/core.js index 493cff49..8d83aeaa 100644 --- a/client/src/locales/it-IT/core.js +++ b/client/src/locales/it-IT/core.js @@ -377,7 +377,6 @@ export default { deleteUser: 'Elimina utente', deleteUser_title: 'Elimina utente', dismissAll: 'Ignora tutto', - duplicate: 'Duplica', duplicateCard_title: 'Duplica scheda', edit: 'Modifica', editColor_title: 'Modifica colore', diff --git a/client/src/locales/ko-KR/core.js b/client/src/locales/ko-KR/core.js index a52e4a05..a535c89c 100644 --- a/client/src/locales/ko-KR/core.js +++ b/client/src/locales/ko-KR/core.js @@ -201,7 +201,6 @@ export default { deleteTask_title: '작업 삭제', deleteUser: '사용자 삭제', dismissAll: '모두 해제', - duplicate: '복제', duplicateCard_title: '카드 복제', edit: '편집', editColor_title: '색상 편집', diff --git a/client/src/locales/pl-PL/core.js b/client/src/locales/pl-PL/core.js index a26656ec..d773f938 100644 --- a/client/src/locales/pl-PL/core.js +++ b/client/src/locales/pl-PL/core.js @@ -354,7 +354,6 @@ export default { deleteUser: 'Usuń użytkownika', deleteUser_title: 'Usuń Użytkownika', dismissAll: 'Odrzuć wszystkie', - duplicate: 'Duplikuj', duplicateCard_title: 'Duplikuj Kartę', edit: 'Edytuj', editColor_title: 'Edytuj Kolor', diff --git a/client/src/locales/ru-RU/core.js b/client/src/locales/ru-RU/core.js index d15d76a5..d65e55f3 100644 --- a/client/src/locales/ru-RU/core.js +++ b/client/src/locales/ru-RU/core.js @@ -360,7 +360,6 @@ export default { deleteUser: 'Удалить пользователя', deleteUser_title: 'Удалить пользователя', dismissAll: 'Отклонить все', - duplicate: 'Дублировать', duplicateCard_title: 'Дублировать карточку', edit: 'Изменить', editColor_title: 'Изменить цвет', diff --git a/client/src/locales/sr-Cyrl-RS/core.js b/client/src/locales/sr-Cyrl-RS/core.js index e6802980..deadf25e 100644 --- a/client/src/locales/sr-Cyrl-RS/core.js +++ b/client/src/locales/sr-Cyrl-RS/core.js @@ -201,7 +201,6 @@ export default { deleteTask: 'Обриши задатак', deleteTask_title: 'Обриши задатак', deleteUser: 'Обриши корисника', - duplicate: 'Клонирај', duplicateCard_title: 'Клонирај картицу', edit: 'Измени', editDescription_title: 'Измени опис', diff --git a/client/src/locales/sr-Latn-RS/core.js b/client/src/locales/sr-Latn-RS/core.js index 519dbfba..7a2eaf13 100644 --- a/client/src/locales/sr-Latn-RS/core.js +++ b/client/src/locales/sr-Latn-RS/core.js @@ -198,7 +198,6 @@ export default { deleteTask: 'Obriši zadatak', deleteTask_title: 'Obriši zadatak', deleteUser: 'Obriši korisnika', - duplicate: 'Kloniraj', duplicateCard_title: 'Kloniraj karticu', edit: 'Izmeni', editDescription_title: 'Izmeni opis', diff --git a/client/src/locales/uk-UA/core.js b/client/src/locales/uk-UA/core.js index 32392c3c..922669e7 100644 --- a/client/src/locales/uk-UA/core.js +++ b/client/src/locales/uk-UA/core.js @@ -356,7 +356,6 @@ export default { deleteUser: 'Видалити користувача', deleteUser_title: 'Видалити Користувача', dismissAll: 'Скасувати всі', - duplicate: 'Дублювати', duplicateCard_title: 'Дублювати Картку', edit: 'Редагувати', editColor_title: 'Редагувати колір', diff --git a/client/src/locales/zh-CN/core.js b/client/src/locales/zh-CN/core.js index f7003fb0..3835bd9c 100644 --- a/client/src/locales/zh-CN/core.js +++ b/client/src/locales/zh-CN/core.js @@ -368,7 +368,6 @@ export default { deleteUser_title: '删除用户', deleteWebhook: '删除Webhook', dismissAll: '全部忽略', - duplicate: '复制卡片', duplicateCard_title: '复制卡片', edit: '编辑', editColor_title: '编辑颜色', diff --git a/client/src/sagas/core/services/cards.js b/client/src/sagas/core/services/cards.js index 3e4c7f36..30553dd4 100644 --- a/client/src/sagas/core/services/cards.js +++ b/client/src/sagas/core/services/cards.js @@ -430,6 +430,7 @@ export function* transferCurrentCard(boardId, listId, index) { export function* duplicateCard(id, data) { const localId = yield call(createLocalId); + const { cardId: currentCardId } = yield select(selectors.selectPath); const { boardId, listId } = yield select(selectors.selectCardById, id); const index = yield select(selectors.selectCardIndexById, id); @@ -450,6 +451,10 @@ export function* duplicateCard(id, data) { }), ); + if (id === currentCardId) { + yield call(goToBoard, boardId); + } + let card; let cardMemberships; let cardLabels;