Skip to content

Commit

Permalink
Merge branch 'main' into bug/WP-418--community-file-listing-ssh-error…
Browse files Browse the repository at this point in the history
…-ignore
  • Loading branch information
jalowe13 authored Nov 27, 2024
2 parents 24bba91 + 16ed8e2 commit a505da3
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 39 deletions.
22 changes: 21 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [3.10.0]

### Added

- deps/react-18: Update React to v18 (#979)
- WP-50: Fix sizing of buttons "as-link" (#986)
- WP-509: Handle file/folder download feature with large number of files (#981)
- WP-520: AppTray should use versionEnabled for list of apps instead of enabled (#991)
- WP-24: Disabling Google Drive Integration (#988)
- WP-730: Refactor useRename to use react-query (#993)
- WP-728: Mutation hook: Copy file (#1000)
- WP-78: V3 Shared Workspaces Tests (#987)

### Fixed

- WP-419 Public Data Header Left Margin (#1003)
- WP-765: Fix job status button to show background (#1015)


## [3.9.0]

### Fixed
Expand Down Expand Up @@ -1115,7 +1134,8 @@ WP-306: Fix target path regression (#871)
## [1.0.0] - 2020-02-28
v1.0.0 Production release as of Feb 28, 2020.

[unreleased]: https://github.com/TACC/Core-Portal/compare/v3.9.0...HEAD
[unreleased]: https://github.com/TACC/Core-Portal/compare/v3.10.0...HEAD
[3.10.0]: https://github.com/TACC/Core-Portal/releases/tag/v3.10.0
[3.9.0]: https://github.com/TACC/Core-Portal/releases/tag/v3.9.0
[3.8.2]: https://github.com/TACC/Core-Portal/releases/tag/v3.8.2
[3.8.1]: https://github.com/TACC/Core-Portal/releases/tag/v3.8.1
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/Jobs/JobsStatus/JobsStatus.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ function JobsStatus({ status, fancy, jobUuid }) {
return (
<div className={styles.root}>
{fancy && color ? (
<Badge clasName={`badge-${color}`} color={null}>
<Badge className={`badge-${color}`} color={null}>
{userStatus}
</Badge>
) : (
Expand Down
37 changes: 0 additions & 37 deletions client/src/hooks/datafiles/mutations/useCopy.js

This file was deleted.

157 changes: 157 additions & 0 deletions client/src/hooks/datafiles/mutations/useCopy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
import { useDispatch, useSelector, shallowEqual } from 'react-redux';
import { useSelectedFiles } from 'hooks/datafiles';
import Cookies from 'js-cookie';
import { apiClient } from 'utils/apiClient';
import { useMutation } from '@tanstack/react-query';
import truncateMiddle from 'utils/truncateMiddle';

export async function copyFileUtil({
api,
scheme,
system,
path,
filename,
filetype,
destApi,
destSystem,
destPath,
destPathName,
}: {
api: string;
scheme: string;
system: string;
path: string;
filename: string;
filetype: string;
destApi: string;
destSystem: string;
destPath: string;
destPathName: string;
}) {
let url: string, body: any;
if (api === destApi) {
url = `/api/datafiles/${api}/copy/${scheme}/${system}/${path}/`;
url = url.replace(/\/{2,}/g, '/');
body = {
dest_system: destSystem,
dest_path: destPath,
file_name: filename,
filetype,
dest_path_name: destPathName,
};
} else {
url = `/api/datafiles/transfer/${filetype}/`;
url = url.replace(/\/{2,}/g, '/');
body = {
src_api: api,
dest_api: destApi,
src_system: system,
dest_system: destSystem,
src_path: path,
dest_path: destPath,
dest_path_name: destPathName,
dirname: filename,
};
}

const response = await apiClient.put(url, body, {
headers: { 'X-CSRFToken': Cookies.get('csrftoken') || '' },
withCredentials: true,
});
return response.data;
}

function useCopy() {
const dispatch = useDispatch();

const { selectedFiles: selected } = useSelectedFiles();

const status = useSelector(
(state: any) => state.files.operationStatus.copy,
shallowEqual
);

const { scheme } = useSelector(
(state: any) => state.files.params.FilesListing
);
const setStatus = (newStatus: string) =>
dispatch({
type: 'DATA_FILES_SET_OPERATION_STATUS',
payload: { operation: 'copy', status: newStatus },
});

const { mutateAsync } = useMutation({ mutationFn: copyFileUtil });
const copy = ({
srcApi,
destApi,
destSystem,
destPath,
name,
callback,
}: {
srcApi: string;
destApi: string;
destSystem: string;
destPath: string;
name: string;
callback: any;
}) => {
const filteredSelected = selected
.filter((f: any) => status[f.id] !== 'SUCCESS')
.map((f: any) => ({ ...f, api: srcApi }));
const copyCalls: Promise<any>[] = filteredSelected.map((file: any) => {
// Copy File
dispatch({
type: 'DATA_FILES_SET_OPERATION_STATUS_BY_KEY',
payload: { status: 'RUNNING', key: file.id, operation: 'copy' },
});
return mutateAsync(
{
api: file.api,
scheme: scheme,
system: file.system,
path: file.path,
filename: file.name,
filetype: file.type,
destApi,
destSystem,
destPath,
destPathName: name,
},
{
onSuccess: () => {
dispatch({
type: 'DATA_FILES_SET_OPERATION_STATUS_BY_KEY',
payload: { status: 'SUCCESS', key: file.id, operation: 'copy' },
});
},
onError: (error: any) => {
dispatch({
type: 'DATA_FILES_SET_OPERATION_STATUS_BY_KEY',
payload: { status: 'ERROR', key: file.id, operation: 'copy' },
});
},
}
);
});
// Result
Promise.all(copyCalls).then(() => {
dispatch({
type: 'DATA_FILES_TOGGLE_MODAL',
payload: { operation: 'copy', props: {} },
});
dispatch({
type: 'ADD_TOAST',
payload: {
message: `${
copyCalls.length > 1 ? `${copyCalls.length} files` : 'File'
} copied to ${truncateMiddle(`${destPath}`, 20) || '/'}`,
},
});
callback();
});
};
return { copy, status, setStatus };
}

export default useCopy;

0 comments on commit a505da3

Please sign in to comment.