Skip to content

Commit 2530197

Browse files
feat: duplicate spreadsheet column (#3034)
Signed-off-by: Abdelsalem <[email protected]> Co-authored-by: achour94 <[email protected]>
1 parent d855bfd commit 2530197

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

src/components/spreadsheet-view/columns/column-menu.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ import { UUID } from 'crypto';
1717
import { SpreadsheetTabDefinition } from 'components/spreadsheet-view/types/spreadsheet.type';
1818
import ColumnCreationDialog from './column-creation-dialog';
1919
import { AppState } from 'redux/reducer';
20-
import { deleteSpreadsheetColumn } from 'services/study/study-config';
20+
import { deleteSpreadsheetColumn, duplicateSpreadsheetColumn } from 'services/study/study-config';
2121

2222
const UPDATE = 'UPDATE';
2323
const DELETE = 'DELETE';
24+
const DUPLICATE = 'DUPLICATE';
2425

2526
const CUSTOM_COLUMNS_MENU_DEFINITION = [
2627
{
@@ -31,6 +32,10 @@ const CUSTOM_COLUMNS_MENU_DEFINITION = [
3132
id: DELETE,
3233
label: 'spreadsheet/custom_column/delete_custom_column',
3334
},
35+
{
36+
id: DUPLICATE,
37+
label: 'spreadsheet/custom_column/duplicate_custom_column',
38+
},
3439
];
3540

3641
export interface ColumnMenuProps extends DialogMenuProps {
@@ -59,6 +64,19 @@ export const ColumnMenu: FunctionComponent<ColumnMenuProps> = ({
5964
const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);
6065
const dispatch = useDispatch<AppDispatch>();
6166

67+
const handleDuplicate = useCallback(() => {
68+
if (studyUuid && columnDefinition?.id) {
69+
duplicateSpreadsheetColumn(studyUuid, spreadsheetConfigUuid, columnDefinition.uuid)
70+
.then()
71+
.catch((error) => {
72+
snackError({
73+
messageTxt: error.message,
74+
headerId: 'spreadsheet/custom_column/duplicate_column_error',
75+
});
76+
});
77+
}
78+
}, [columnDefinition, studyUuid, spreadsheetConfigUuid, snackError]);
79+
6280
const handleMenuItemClick = useCallback(
6381
(option: { id: string; label: string }) => {
6482
onClose();
@@ -69,9 +87,12 @@ export const ColumnMenu: FunctionComponent<ColumnMenuProps> = ({
6987
case DELETE:
7088
setConfirmationDialogOpen(true);
7189
break;
90+
case DUPLICATE:
91+
handleDuplicate();
92+
break;
7293
}
7394
},
74-
[dialogOpen, onClose]
95+
[dialogOpen, onClose, handleDuplicate]
7596
);
7697

7798
const handleValidate = useCallback(() => {
@@ -89,7 +110,7 @@ export const ColumnMenu: FunctionComponent<ColumnMenuProps> = ({
89110
.catch((error) => {
90111
snackError({
91112
messageTxt: error.message,
92-
headerTxt: 'spreadsheet/custom_column/delete_column_error',
113+
headerId: 'spreadsheet/custom_column/delete_column_error',
93114
});
94115
});
95116
}

src/services/study/study-config.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ export function deleteSpreadsheetColumn(studyUuid: UUID, spreadsheetModelUuid: U
105105
});
106106
}
107107

108+
export function duplicateSpreadsheetColumn(studyUuid: UUID, spreadsheetModelUuid: UUID, columnUuid: UUID) {
109+
const url = `${getStudyUrl(studyUuid)}/spreadsheet-config/${spreadsheetModelUuid}/columns/${columnUuid}/duplicate`;
110+
return backendFetchJson(url, {
111+
method: 'POST',
112+
headers: {
113+
'Content-Type': 'application/json',
114+
},
115+
});
116+
}
117+
108118
export function createSpreadsheetColumn(studyUuid: UUID, spreadsheetModelUuid: UUID, column: any) {
109119
const url = `${getStudyUrl(studyUuid)}/spreadsheet-config/${spreadsheetModelUuid}/columns`;
110120
return backendFetchJson(url, {

src/translations/spreadsheet-en.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ const spreadsheetEn = {
2424
'Column ID must not contain spaces, special characters or start with a number',
2525
'spreadsheet/custom_column/error/id_le_60': 'Column ID must be at most 60 characters',
2626
'spreadsheet/custom_column/error/name_le_60': 'Column name must be at most 60 characters',
27-
'spreadsheet/custom_column/update_custom_column': 'Update column',
28-
'spreadsheet/custom_column/delete_custom_column': 'Delete column',
27+
'spreadsheet/custom_column/update_custom_column': 'Update',
28+
'spreadsheet/custom_column/delete_custom_column': 'Delete',
29+
'spreadsheet/custom_column/duplicate_custom_column': 'Duplicate',
30+
'spreadsheet/custom_column/duplicate_column_error': 'Error while duplicating column',
2931
'spreadsheet/custom_column/delete_custom_column_confirmation':
3032
'Are you sure you want to delete the column "{columnName}"?',
3133
'spreadsheet/custom_column/delete_column_error': 'Error while deleting column',

src/translations/spreadsheet-fr.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ const spreadsheetFr = {
2424
'Un ID de colonne ne doit contenir ni espace ni caractère spécial et ne doit pas commencer par un chiffre',
2525
'spreadsheet/custom_column/error/id_le_60': 'Un ID de colonne ne peut dépasser 60 caractères',
2626
'spreadsheet/custom_column/error/name_le_60': 'Un nom de colonne ne peut dépasser 60 caractères',
27-
'spreadsheet/custom_column/update_custom_column': 'Modifier colonne',
28-
'spreadsheet/custom_column/delete_custom_column': 'Supprimer colonne',
27+
'spreadsheet/custom_column/update_custom_column': 'Modifier',
28+
'spreadsheet/custom_column/delete_custom_column': 'Supprimer',
29+
'spreadsheet/custom_column/duplicate_custom_column': 'Dupliquer',
30+
'spreadsheet/custom_column/duplicate_column_error': 'Error lors de la duplication de la colonne',
2931
'spreadsheet/custom_column/delete_custom_column_confirmation':
3032
'Êtes-vous sûr de vouloir supprimer la colonne "{columnName}" ?',
3133
'spreadsheet/custom_column/delete_column_error': 'Erreur lors de la suppression de la colonne',

0 commit comments

Comments
 (0)