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',
+ })}
+
+
+
+
+ >
+ );
+});
+
+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;