diff --git a/client/src/components/CardCopyPopup.jsx b/client/src/components/CardCopyPopup.jsx
new file mode 100644
index 0000000..548e231
--- /dev/null
+++ b/client/src/components/CardCopyPopup.jsx
@@ -0,0 +1,5 @@
+import { withPopup } from '../lib/popup';
+
+import CardCopyStep from './CardCopyStep';
+
+export default withPopup(CardCopyStep);
diff --git a/client/src/components/CardCopyStep/CardCopyStep.jsx b/client/src/components/CardCopyStep/CardCopyStep.jsx
new file mode 100644
index 0000000..e115812
--- /dev/null
+++ b/client/src/components/CardCopyStep/CardCopyStep.jsx
@@ -0,0 +1,167 @@
+import React, { useMemo, useCallback } from 'react';
+import PropTypes from 'prop-types';
+import { useTranslation } from 'react-i18next';
+import { Button, Dropdown, Form, TextArea, Checkbox } from 'semantic-ui-react';
+import { Popup } from '../../lib/custom-ui';
+
+import { useForm } from '../../hooks';
+
+import styles from './CardCopyStep.module.scss';
+
+const CardCopyStep = React.memo(
+ ({ projectsToLists, defaultPath, onMove, onTransfer, onBoardFetch, onBack, onClose }) => {
+ const [t] = useTranslation();
+
+ const [path, handleFieldChange] = useForm(() => ({
+ projectId: null,
+ boardId: null,
+ listId: null,
+ name: null,
+ description: null,
+ tasks: [],
+ attachments: [],
+ labels: [],
+ users: [],
+ ...defaultPath,
+ }));
+
+ const selectedProject = useMemo(
+ () => projectsToLists.find((project) => project.id === path.projectId) || null,
+ [projectsToLists, path.projectId],
+ );
+
+ const selectedBoard = useMemo(
+ () =>
+ (selectedProject && selectedProject.boards.find((board) => board.id === path.boardId)) ||
+ null,
+ [selectedProject, path.boardId],
+ );
+
+ const selectedList = useMemo(
+ () => (selectedBoard && selectedBoard.lists.find((list) => list.id === path.listId)) || null,
+ [selectedBoard, path.listId],
+ );
+
+ const handleBoardIdChange = useCallback(
+ (event, data) => {
+ if (selectedProject.boards.find((board) => board.id === data.value).isFetching === null) {
+ onBoardFetch(data.value);
+ }
+
+ handleFieldChange(event, data);
+ },
+ [onBoardFetch, handleFieldChange, selectedProject],
+ );
+
+ const handleSubmit = useCallback(() => {
+ if (selectedBoard.id !== defaultPath.boardId) {
+ onTransfer(selectedBoard.id, selectedList.id);
+ } else if (selectedList.id !== defaultPath.listId) {
+ onMove(selectedList.id);
+ }
+
+ onClose();
+ }, [defaultPath, onMove, onTransfer, onClose, selectedBoard, selectedList]);
+
+ return (
+ <>
+
+ {t('Copy Card', {
+ context: 'title',
+ })}
+
+
+
+
+ >
+ );
+ },
+);
+
+CardCopyStep.propTypes = {
+ /* eslint-disable react/forbid-prop-types */
+ projectsToLists: PropTypes.array.isRequired,
+ defaultPath: PropTypes.object.isRequired,
+ /* eslint-enable react/forbid-prop-types */
+ onMove: PropTypes.func.isRequired,
+ onTransfer: PropTypes.func.isRequired,
+ onBoardFetch: PropTypes.func.isRequired,
+ onBack: PropTypes.func,
+ onClose: PropTypes.func.isRequired,
+};
+
+CardCopyStep.defaultProps = {
+ onBack: undefined,
+};
+
+export default CardCopyStep;
diff --git a/client/src/components/CardCopyStep/CardCopyStep.module.scss b/client/src/components/CardCopyStep/CardCopyStep.module.scss
new file mode 100644
index 0000000..8246167
--- /dev/null
+++ b/client/src/components/CardCopyStep/CardCopyStep.module.scss
@@ -0,0 +1,12 @@
+:global(#app) {
+ .field {
+ margin-bottom: 8px;
+ }
+
+ .text {
+ color: #444444;
+ font-size: 12px;
+ font-weight: bold;
+ padding-bottom: 6px;
+ }
+}
diff --git a/client/src/components/CardCopyStep/index.js b/client/src/components/CardCopyStep/index.js
new file mode 100644
index 0000000..5309f55
--- /dev/null
+++ b/client/src/components/CardCopyStep/index.js
@@ -0,0 +1,3 @@
+import CardCopyStep from './CardCopyStep';
+
+export default CardCopyStep;
diff --git a/client/src/components/CardModal/CardModal.jsx b/client/src/components/CardModal/CardModal.jsx
index b2bd884..7c43509 100755
--- a/client/src/components/CardModal/CardModal.jsx
+++ b/client/src/components/CardModal/CardModal.jsx
@@ -23,7 +23,7 @@ import DueDateEditPopup from '../DueDateEditPopup';
import TimerEditPopup from '../TimerEditPopup';
import CardMovePopup from '../CardMovePopup';
import DeletePopup from '../DeletePopup';
-
+import CardCopyPopup from '../CardCopyPopup';
import styles from './CardModal.module.scss';
const CardModal = React.memo(
@@ -477,6 +477,32 @@ const CardModal = React.memo(
{t('action.move')}
+
+
+